Skip to content

Commit

Permalink
Merge pull request #305 from obsidiansystems/wip/no-extend-narrow-pri…
Browse files Browse the repository at this point in the history
…mop-names

Use new primops names for converting numbers to and from the native size
  • Loading branch information
phadej authored Feb 17, 2021
2 parents 2f88390 + 2db29ea commit c3be2ad
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 16 deletions.
1 change: 1 addition & 0 deletions benchmarks/text-benchmarks.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ executable text-benchmarks
Data.Text.Internal.Builder.Int.Digits
Data.Text.Internal.Builder.RealFloat.Functions
Data.Text.Internal.ByteStringCompat
Data.Text.Internal.PrimCompat
Data.Text.Internal.Encoding.Fusion
Data.Text.Internal.Encoding.Fusion.Common
Data.Text.Internal.Encoding.Utf16
Expand Down
13 changes: 10 additions & 3 deletions src/Data/Text/Internal/Encoding/Utf16.hs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
{-# LANGUAGE MagicHash, BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE BangPatterns #-}

-- |
-- Module : Data.Text.Internal.Encoding.Utf16
Expand Down Expand Up @@ -26,11 +28,16 @@ module Data.Text.Internal.Encoding.Utf16
import GHC.Exts
import GHC.Word (Word16(..))

#if !MIN_VERSION_base(4,16,0)
-- harmless to import, except for warnings that it is unused.
import Data.Text.Internal.PrimCompat ( word16ToWord# )
#endif

chr2 :: Word16 -> Word16 -> Char
chr2 (W16# a#) (W16# b#) = C# (chr# (upper# +# lower# +# 0x10000#))
where
!x# = word2Int# a#
!y# = word2Int# b#
!x# = word2Int# (word16ToWord# a#)
!y# = word2Int# (word16ToWord# b#)
!upper# = uncheckedIShiftL# (x# -# 0xD800#) 10#
!lower# = y# -# 0xDC00#
{-# INLINE chr2 #-}
Expand Down
23 changes: 14 additions & 9 deletions src/Data/Text/Internal/Encoding/Utf8.hs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ import Data.Text.Internal.Unsafe.Shift (shiftR)
import GHC.Exts
import GHC.Word (Word8(..))

#if !MIN_VERSION_base(4,16,0)
-- harmless to import, except for warnings that it is unused.
import Data.Text.Internal.PrimCompat (word8ToWord#)
#endif

default(Int)

between :: Word8 -- ^ byte to check
Expand Down Expand Up @@ -94,18 +99,18 @@ ord4 c =
chr2 :: Word8 -> Word8 -> Char
chr2 (W8# x1#) (W8# x2#) = C# (chr# (z1# +# z2#))
where
!y1# = word2Int# x1#
!y2# = word2Int# x2#
!y1# = word2Int# (word8ToWord# x1#)
!y2# = word2Int# (word8ToWord# x2#)
!z1# = uncheckedIShiftL# (y1# -# 0xC0#) 6#
!z2# = y2# -# 0x80#
{-# INLINE chr2 #-}

chr3 :: Word8 -> Word8 -> Word8 -> Char
chr3 (W8# x1#) (W8# x2#) (W8# x3#) = C# (chr# (z1# +# z2# +# z3#))
where
!y1# = word2Int# x1#
!y2# = word2Int# x2#
!y3# = word2Int# x3#
!y1# = word2Int# (word8ToWord# x1#)
!y2# = word2Int# (word8ToWord# x2#)
!y3# = word2Int# (word8ToWord# x3#)
!z1# = uncheckedIShiftL# (y1# -# 0xE0#) 12#
!z2# = uncheckedIShiftL# (y2# -# 0x80#) 6#
!z3# = y3# -# 0x80#
Expand All @@ -115,10 +120,10 @@ chr4 :: Word8 -> Word8 -> Word8 -> Word8 -> Char
chr4 (W8# x1#) (W8# x2#) (W8# x3#) (W8# x4#) =
C# (chr# (z1# +# z2# +# z3# +# z4#))
where
!y1# = word2Int# x1#
!y2# = word2Int# x2#
!y3# = word2Int# x3#
!y4# = word2Int# x4#
!y1# = word2Int# (word8ToWord# x1#)
!y2# = word2Int# (word8ToWord# x2#)
!y3# = word2Int# (word8ToWord# x3#)
!y4# = word2Int# (word8ToWord# x4#)
!z1# = uncheckedIShiftL# (y1# -# 0xF0#) 18#
!z2# = uncheckedIShiftL# (y2# -# 0x80#) 12#
!z3# = uncheckedIShiftL# (y3# -# 0x80#) 6#
Expand Down
37 changes: 37 additions & 0 deletions src/Data/Text/Internal/PrimCompat.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{-# LANGUAGE CPP #-}
{-# LANGUAGE MagicHash #-}

module Data.Text.Internal.PrimCompat
( word8ToWord#
, wordToWord8#

, word16ToWord#
, wordToWord16#

, wordToWord32#
, word32ToWord#
) where

#if MIN_VERSION_base(4,16,0)

import GHC.Base

#else

import GHC.Prim (Word#)

wordToWord8#, word8ToWord# :: Word# -> Word#
wordToWord16#, word16ToWord# :: Word# -> Word#
wordToWord32#, word32ToWord# :: Word# -> Word#
word8ToWord# w = w
word16ToWord# w = w
word32ToWord# w = w
wordToWord8# w = w
wordToWord16# w = w
wordToWord32# w = w
{-# INLINE wordToWord16# #-}
{-# INLINE word16ToWord# #-}
{-# INLINE wordToWord32# #-}
{-# INLINE word32ToWord# #-}

#endif
7 changes: 4 additions & 3 deletions src/Data/Text/Internal/Unsafe/Char.hs
Original file line number Diff line number Diff line change
Expand Up @@ -35,21 +35,22 @@ import Data.Text.Internal.Unsafe.Shift (shiftR)
import GHC.Exts (Char(..), Int(..), chr#, ord#, word2Int#)
import GHC.Word (Word8(..), Word16(..), Word32(..))
import qualified Data.Text.Array as A
import Data.Text.Internal.PrimCompat ( word8ToWord#, word16ToWord#, word32ToWord# )

ord :: Char -> Int
ord (C# c#) = I# (ord# c#)
{-# INLINE ord #-}

unsafeChr :: Word16 -> Char
unsafeChr (W16# w#) = C# (chr# (word2Int# w#))
unsafeChr (W16# w#) = C# (chr# (word2Int# (word16ToWord# w#)))
{-# INLINE unsafeChr #-}

unsafeChr8 :: Word8 -> Char
unsafeChr8 (W8# w#) = C# (chr# (word2Int# w#))
unsafeChr8 (W8# w#) = C# (chr# (word2Int# (word8ToWord# w#)))
{-# INLINE unsafeChr8 #-}

unsafeChr32 :: Word32 -> Char
unsafeChr32 (W32# w#) = C# (chr# (word2Int# w#))
unsafeChr32 (W32# w#) = C# (chr# (word2Int# (word32ToWord# w#)))
{-# INLINE unsafeChr32 #-}

-- | Write a character into the array at the given offset. Returns
Expand Down
1 change: 1 addition & 0 deletions tests/text-tests.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ test-suite tests
Data.Text.Internal.Builder.Int.Digits
Data.Text.Internal.Builder.RealFloat.Functions
Data.Text.Internal.ByteStringCompat
Data.Text.Internal.PrimCompat
Data.Text.Internal.Encoding.Fusion
Data.Text.Internal.Encoding.Fusion.Common
Data.Text.Internal.Encoding.Utf16
Expand Down
3 changes: 2 additions & 1 deletion text.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ library
Data.Text.Internal.Builder.Int.Digits
Data.Text.Internal.Builder.RealFloat.Functions
Data.Text.Internal.ByteStringCompat
Data.Text.Internal.PrimCompat
Data.Text.Internal.Encoding.Fusion
Data.Text.Internal.Encoding.Fusion.Common
Data.Text.Internal.Encoding.Utf16
Expand Down Expand Up @@ -162,7 +163,7 @@ library
base >= 4.3 && < 5,
binary >= 0.5 && < 0.9,
deepseq >= 1.1 && < 1.5,
ghc-prim >= 0.2 && < 0.8,
ghc-prim >= 0.2 && < 0.9,
template-haskell >= 2.5 && < 2.18

if flag(bytestring-builder)
Expand Down

0 comments on commit c3be2ad

Please sign in to comment.