Skip to content

Commit 5f82649

Browse files
authored
Merge pull request #178 from Ericson2314/wip/no-extend-narrow-primop-names
Use unsafe shifts from base rather than hand-rolling
2 parents f9b1c92 + 1c07fd5 commit 5f82649

File tree

1 file changed

+22
-52
lines changed

1 file changed

+22
-52
lines changed

src/Data/Binary/Get.hs

Lines changed: 22 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -231,12 +231,6 @@ import qualified Data.ByteString.Lazy.Internal as L
231231
import Data.Binary.Get.Internal hiding ( Decoder(..), runGetIncremental )
232232
import qualified Data.Binary.Get.Internal as I
233233

234-
#if defined(__GLASGOW_HASKELL__) && !defined(__HADDOCK__)
235-
-- needed for (# unboxing #) with magic hash
236-
import GHC.Base
237-
import GHC.Word
238-
#endif
239-
240234
-- needed for casting words to float/double
241235
import Data.Binary.FloatCast (wordToFloat, wordToDouble)
242236

@@ -463,7 +457,7 @@ getWord16be = readN 2 word16be
463457

464458
word16be :: B.ByteString -> Word16
465459
word16be = \s ->
466-
(fromIntegral (s `B.unsafeIndex` 0) `shiftl_w16` 8) .|.
460+
(fromIntegral (s `B.unsafeIndex` 0) `unsafeShiftL` 8) .|.
467461
(fromIntegral (s `B.unsafeIndex` 1))
468462
{-# INLINE[2] getWord16be #-}
469463
{-# INLINE word16be #-}
@@ -474,7 +468,7 @@ getWord16le = readN 2 word16le
474468

475469
word16le :: B.ByteString -> Word16
476470
word16le = \s ->
477-
(fromIntegral (s `B.unsafeIndex` 1) `shiftl_w16` 8) .|.
471+
(fromIntegral (s `B.unsafeIndex` 1) `unsafeShiftL` 8) .|.
478472
(fromIntegral (s `B.unsafeIndex` 0) )
479473
{-# INLINE[2] getWord16le #-}
480474
{-# INLINE word16le #-}
@@ -485,9 +479,9 @@ getWord32be = readN 4 word32be
485479

486480
word32be :: B.ByteString -> Word32
487481
word32be = \s ->
488-
(fromIntegral (s `B.unsafeIndex` 0) `shiftl_w32` 24) .|.
489-
(fromIntegral (s `B.unsafeIndex` 1) `shiftl_w32` 16) .|.
490-
(fromIntegral (s `B.unsafeIndex` 2) `shiftl_w32` 8) .|.
482+
(fromIntegral (s `B.unsafeIndex` 0) `unsafeShiftL` 24) .|.
483+
(fromIntegral (s `B.unsafeIndex` 1) `unsafeShiftL` 16) .|.
484+
(fromIntegral (s `B.unsafeIndex` 2) `unsafeShiftL` 8) .|.
491485
(fromIntegral (s `B.unsafeIndex` 3) )
492486
{-# INLINE[2] getWord32be #-}
493487
{-# INLINE word32be #-}
@@ -498,9 +492,9 @@ getWord32le = readN 4 word32le
498492

499493
word32le :: B.ByteString -> Word32
500494
word32le = \s ->
501-
(fromIntegral (s `B.unsafeIndex` 3) `shiftl_w32` 24) .|.
502-
(fromIntegral (s `B.unsafeIndex` 2) `shiftl_w32` 16) .|.
503-
(fromIntegral (s `B.unsafeIndex` 1) `shiftl_w32` 8) .|.
495+
(fromIntegral (s `B.unsafeIndex` 3) `unsafeShiftL` 24) .|.
496+
(fromIntegral (s `B.unsafeIndex` 2) `unsafeShiftL` 16) .|.
497+
(fromIntegral (s `B.unsafeIndex` 1) `unsafeShiftL` 8) .|.
504498
(fromIntegral (s `B.unsafeIndex` 0) )
505499
{-# INLINE[2] getWord32le #-}
506500
{-# INLINE word32le #-}
@@ -511,13 +505,13 @@ getWord64be = readN 8 word64be
511505

512506
word64be :: B.ByteString -> Word64
513507
word64be = \s ->
514-
(fromIntegral (s `B.unsafeIndex` 0) `shiftl_w64` 56) .|.
515-
(fromIntegral (s `B.unsafeIndex` 1) `shiftl_w64` 48) .|.
516-
(fromIntegral (s `B.unsafeIndex` 2) `shiftl_w64` 40) .|.
517-
(fromIntegral (s `B.unsafeIndex` 3) `shiftl_w64` 32) .|.
518-
(fromIntegral (s `B.unsafeIndex` 4) `shiftl_w64` 24) .|.
519-
(fromIntegral (s `B.unsafeIndex` 5) `shiftl_w64` 16) .|.
520-
(fromIntegral (s `B.unsafeIndex` 6) `shiftl_w64` 8) .|.
508+
(fromIntegral (s `B.unsafeIndex` 0) `unsafeShiftL` 56) .|.
509+
(fromIntegral (s `B.unsafeIndex` 1) `unsafeShiftL` 48) .|.
510+
(fromIntegral (s `B.unsafeIndex` 2) `unsafeShiftL` 40) .|.
511+
(fromIntegral (s `B.unsafeIndex` 3) `unsafeShiftL` 32) .|.
512+
(fromIntegral (s `B.unsafeIndex` 4) `unsafeShiftL` 24) .|.
513+
(fromIntegral (s `B.unsafeIndex` 5) `unsafeShiftL` 16) .|.
514+
(fromIntegral (s `B.unsafeIndex` 6) `unsafeShiftL` 8) .|.
521515
(fromIntegral (s `B.unsafeIndex` 7) )
522516
{-# INLINE[2] getWord64be #-}
523517
{-# INLINE word64be #-}
@@ -528,13 +522,13 @@ getWord64le = readN 8 word64le
528522

529523
word64le :: B.ByteString -> Word64
530524
word64le = \s ->
531-
(fromIntegral (s `B.unsafeIndex` 7) `shiftl_w64` 56) .|.
532-
(fromIntegral (s `B.unsafeIndex` 6) `shiftl_w64` 48) .|.
533-
(fromIntegral (s `B.unsafeIndex` 5) `shiftl_w64` 40) .|.
534-
(fromIntegral (s `B.unsafeIndex` 4) `shiftl_w64` 32) .|.
535-
(fromIntegral (s `B.unsafeIndex` 3) `shiftl_w64` 24) .|.
536-
(fromIntegral (s `B.unsafeIndex` 2) `shiftl_w64` 16) .|.
537-
(fromIntegral (s `B.unsafeIndex` 1) `shiftl_w64` 8) .|.
525+
(fromIntegral (s `B.unsafeIndex` 7) `unsafeShiftL` 56) .|.
526+
(fromIntegral (s `B.unsafeIndex` 6) `unsafeShiftL` 48) .|.
527+
(fromIntegral (s `B.unsafeIndex` 5) `unsafeShiftL` 40) .|.
528+
(fromIntegral (s `B.unsafeIndex` 4) `unsafeShiftL` 32) .|.
529+
(fromIntegral (s `B.unsafeIndex` 3) `unsafeShiftL` 24) .|.
530+
(fromIntegral (s `B.unsafeIndex` 2) `unsafeShiftL` 16) .|.
531+
(fromIntegral (s `B.unsafeIndex` 1) `unsafeShiftL` 8) .|.
538532
(fromIntegral (s `B.unsafeIndex` 0) )
539533
{-# INLINE[2] getWord64le #-}
540534
{-# INLINE word64le #-}
@@ -651,27 +645,3 @@ getDoublele = wordToDouble <$> getWord64le
651645
getDoublehost :: Get Double
652646
getDoublehost = wordToDouble <$> getWord64host
653647
{-# INLINE getDoublehost #-}
654-
655-
------------------------------------------------------------------------
656-
-- Unchecked shifts
657-
658-
shiftl_w16 :: Word16 -> Int -> Word16
659-
shiftl_w32 :: Word32 -> Int -> Word32
660-
shiftl_w64 :: Word64 -> Int -> Word64
661-
662-
#if defined(__GLASGOW_HASKELL__) && !defined(__HADDOCK__)
663-
shiftl_w16 (W16# w) (I# i) = W16# (w `uncheckedShiftL#` i)
664-
shiftl_w32 (W32# w) (I# i) = W32# (w `uncheckedShiftL#` i)
665-
666-
#if WORD_SIZE_IN_BITS < 64
667-
shiftl_w64 (W64# w) (I# i) = W64# (w `uncheckedShiftL64#` i)
668-
669-
#else
670-
shiftl_w64 (W64# w) (I# i) = W64# (w `uncheckedShiftL#` i)
671-
#endif
672-
673-
#else
674-
shiftl_w16 = shiftL
675-
shiftl_w32 = shiftL
676-
shiftl_w64 = shiftL
677-
#endif

0 commit comments

Comments
 (0)