byteSwap16/32: Narrow the result to 16/32 bits
authorReid Barton <rwbarton@gmail.com>
Sun, 8 Sep 2013 01:07:30 +0000 (21:07 -0400)
committerAustin Seipp <austin@well-typed.com>
Sun, 15 Sep 2013 18:01:12 +0000 (13:01 -0500)
According to primops.txt.pp, the BSwap16Op and BSwap32Op primops
leave the higher bytes of their results undefined. We must clear
those higher bytes here before storing the result in a Word16/32.

Signed-off-by: Austin Seipp <austin@well-typed.com>
GHC/Word.hs

index 3419a24..4771011 100644 (file)
@@ -304,7 +304,7 @@ instance FiniteBits Word16 where
     finiteBitSize _ = 16
 
 byteSwap16 :: Word16 -> Word16
-byteSwap16 (W16# w#) = W16# (byteSwap16# w#)
+byteSwap16 (W16# w#) = W16# (narrow16Word# (byteSwap16# w#))
 
 {-# RULES
 "fromIntegral/Word8->Word16"   fromIntegral = \(W8# x#) -> W16# x#
@@ -531,7 +531,7 @@ instance Read Word32 where
 #endif
 
 byteSwap32 :: Word32 -> Word32
-byteSwap32 (W32# w#) = W32# (byteSwap32# w#)
+byteSwap32 (W32# w#) = W32# (narrow32Word# (byteSwap32# w#))
 
 ------------------------------------------------------------------------
 -- type Word64