45 lines
1.8 KiB
Diff
45 lines
1.8 KiB
Diff
diff --git a/compiler/cmm/PprC.hs b/compiler/cmm/PprC.hs
|
|
index 76e4d4c..ab94f2c 100644
|
|
--- a/compiler/cmm/PprC.hs
|
|
+++ b/compiler/cmm/PprC.hs
|
|
@@ -516,9 +516,12 @@ pprLit1 other = pprLit other
|
|
pprStatics :: DynFlags -> [CmmStatic] -> [SDoc]
|
|
pprStatics _ [] = []
|
|
pprStatics dflags (CmmStaticLit (CmmFloat f W32) : rest)
|
|
- -- floats are padded to a word by padLitToWord, see #1852
|
|
+ -- odd numbers of floats are padded to a word by mkVirtHeapOffsetsWithPadding
|
|
| wORD_SIZE dflags == 8, CmmStaticLit (CmmInt 0 W32) : rest' <- rest
|
|
= pprLit1 (floatToWord dflags f) : pprStatics dflags rest'
|
|
+ -- adjacent floats aren't padded but combined into a single word
|
|
+ | wORD_SIZE dflags == 8, CmmStaticLit (CmmFloat g W32) : rest' <- rest
|
|
+ = pprLit1 (floatPairToWord dflags f g) : pprStatics dflags rest'
|
|
| wORD_SIZE dflags == 4
|
|
= pprLit1 (floatToWord dflags f) : pprStatics dflags rest
|
|
| otherwise
|
|
@@ -1248,6 +1251,25 @@ floatToWord dflags r
|
|
, wORDS_BIGENDIAN dflags = 32
|
|
| otherwise = 0
|
|
|
|
+floatPairToWord :: DynFlags -> Rational -> Rational -> CmmLit
|
|
+floatPairToWord dflags r1 r2
|
|
+ = runST (do
|
|
+ arr <- newArray_ ((0::Int),1)
|
|
+ writeArray arr 0 (fromRational r1)
|
|
+ writeArray arr 1 (fromRational r2)
|
|
+ arr' <- castFloatToWord32Array arr
|
|
+ w32_1 <- readArray arr' 0
|
|
+ w32_2 <- readArray arr' 1
|
|
+ return (pprWord32Pair w32_1 w32_2)
|
|
+ )
|
|
+ where pprWord32Pair w32_1 w32_2
|
|
+ | wORDS_BIGENDIAN dflags =
|
|
+ CmmInt ((shiftL i1 32) .|. i2) W64
|
|
+ | otherwise =
|
|
+ CmmInt ((shiftL i2 32) .|. i1) W64
|
|
+ where i1 = toInteger w32_1
|
|
+ i2 = toInteger w32_2
|
|
+
|
|
doubleToWords :: DynFlags -> Rational -> [CmmLit]
|
|
doubleToWords dflags r
|
|
= runST (do
|