[project @ 2002-03-12 16:48:52 by simonmar]
authorsimonmar <unknown>
Tue, 12 Mar 2002 16:48:52 +0000 (16:48 +0000)
committersimonmar <unknown>
Tue, 12 Mar 2002 16:48:52 +0000 (16:48 +0000)
Fix a bug in the native code generator's handling of floating-point
arguments to ccalls: it wasn't correctly promoting float arguments to
doubles.  Amazingly this has gone undetected for quite a while.

Fixes bug #523996.

ghc/compiler/nativeGen/MachCode.lhs

index 1806565..3c89799 100644 (file)
@@ -2752,6 +2752,10 @@ genCCall fn cconv ret_rep args
        | cconv == StdCallConv = '@':show tot_arg_size
        | otherwise            = ""
 
+    -- floats are always promoted to doubles when passed to a ccall
+    promote_size F  = DF
+    promote_size sz = sz
+
     arg_size DF = 8
     arg_size F  = 4
     arg_size _  = 4
@@ -2775,14 +2779,17 @@ genCCall fn cconv ret_rep args
       | otherwise
       = get_op arg                     `thenNat` \ (code, reg, sz) ->
         getDeltaNat                    `thenNat` \ delta ->
-        arg_size sz                    `bind`    \ size ->
+       let 
+               real_sz = promote_size sz
+               size    = arg_size real_sz
+       in
         setDeltaNat (delta-size)       `thenNat` \ _ ->
-        if   (case sz of DF -> True; F -> True; _ -> False)
+        if   (case real_sz of DF -> True; _ -> False)
         then returnNat (size,
                         code `appOL`
                         toOL [SUB L (OpImm (ImmInt size)) (OpReg esp),
                               DELTA (delta-size),
-                              GST sz reg (AddrBaseIndex (Just esp) 
+                              GST DF reg (AddrBaseIndex (Just esp) 
                                                         Nothing 
                                                         (ImmInt 0))]
                        )