Skip to content

Commit f1a2e14

Browse files
committed
[CmmSized] adjust
1 parent 80cb9ee commit f1a2e14

File tree

6 files changed

+83
-26
lines changed

6 files changed

+83
-26
lines changed

Data/Text/Array.hs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,17 @@ import GHC.ST (ST(..), runST)
7878
import GHC.Word (Word16(..))
7979
import Prelude hiding (length, read)
8080

81+
#if MIN_VERSION_base(4,16,0)
82+
import GHC.Base ( extendWord16#, narrowWord16# )
83+
#else
84+
import GHC.Prim (Word#)
85+
extendWord16#, narrowWord16# :: Word# -> Word#
86+
extendWord16# w = w
87+
narrowWord16# w = w
88+
{-# INLINE narrowWord16# #-}
89+
{-# INLINE extendWord16# #-}
90+
#endif
91+
8192
-- | Immutable array type.
8293
--
8394
-- The 'Array' constructor is exposed since @text-1.1.1.3@
@@ -153,15 +164,15 @@ bytesInArray n = n `shiftL` 1
153164
unsafeIndex :: Array -> Int -> Word16
154165
unsafeIndex Array{..} i@(I# i#) =
155166
CHECK_BOUNDS("unsafeIndex",aLen,i)
156-
case indexWord16Array# aBA i# of r# -> (W16# r#)
167+
case indexWord16Array# aBA i# of r# -> (W16# (narrowWord16# r#))
157168
{-# INLINE unsafeIndex #-}
158169

159170
-- | Unchecked write of a mutable array. May return garbage or crash
160171
-- on an out-of-bounds access.
161172
unsafeWrite :: MArray s -> Int -> Word16 -> ST s ()
162173
unsafeWrite MArray{..} i@(I# i#) (W16# e#) = ST $ \s1# ->
163174
CHECK_BOUNDS("unsafeWrite",maLen,i)
164-
case writeWord16Array# maBA i# e# s1# of
175+
case writeWord16Array# maBA i# (extendWord16# e#) s1# of
165176
s2# -> (# s2#, () #)
166177
{-# INLINE unsafeWrite #-}
167178

Data/Text/Internal/Encoding/Utf16.hs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{-# LANGUAGE MagicHash, BangPatterns #-}
1+
{-# LANGUAGE MagicHash, BangPatterns, CPP #-}
22

33
-- |
44
-- Module : Data.Text.Internal.Encoding.Utf16
@@ -23,14 +23,22 @@ module Data.Text.Internal.Encoding.Utf16
2323
, validate2
2424
) where
2525

26-
import GHC.Exts
2726
import GHC.Word (Word16(..))
27+
#if MIN_VERSION_base(4,16,0)
28+
import GHC.Exts
29+
#else
30+
import GHC.Exts hiding (extendWord16#)
31+
import GHC.Prim (Word#)
32+
extendWord16# :: Word# -> Word#
33+
extendWord16# w = w
34+
{-# INLINE extendWord16# #-}
35+
#endif
2836

2937
chr2 :: Word16 -> Word16 -> Char
3038
chr2 (W16# a#) (W16# b#) = C# (chr# (upper# +# lower# +# 0x10000#))
3139
where
32-
!x# = word2Int# a#
33-
!y# = word2Int# b#
40+
!x# = word2Int# (extendWord16# a#)
41+
!y# = word2Int# (extendWord16# b#)
3442
!upper# = uncheckedIShiftL# (x# -# 0xD800#) 10#
3543
!lower# = y# -# 0xDC00#
3644
{-# INLINE chr2 #-}

Data/Text/Internal/Encoding/Utf8.hs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,18 @@ import Control.Exception (assert)
4343
import Data.Bits ((.&.))
4444
import Data.Text.Internal.Unsafe.Char (ord)
4545
import Data.Text.Internal.Unsafe.Shift (shiftR)
46-
import GHC.Exts
4746
import GHC.Word (Word8(..))
4847

48+
#if MIN_VERSION_base(4,16,0)
49+
import GHC.Exts
50+
#else
51+
import GHC.Exts hiding ( extendWord8# )
52+
import GHC.Prim (Word#)
53+
extendWord8# :: Word# -> Word#
54+
extendWord8# w = w
55+
{-# INLINE extendWord8# #-}
56+
#endif
57+
4958
default(Int)
5059

5160
between :: Word8 -- ^ byte to check
@@ -94,18 +103,18 @@ ord4 c =
94103
chr2 :: Word8 -> Word8 -> Char
95104
chr2 (W8# x1#) (W8# x2#) = C# (chr# (z1# +# z2#))
96105
where
97-
!y1# = word2Int# x1#
98-
!y2# = word2Int# x2#
106+
!y1# = word2Int# (extendWord8# x1#)
107+
!y2# = word2Int# (extendWord8# x2#)
99108
!z1# = uncheckedIShiftL# (y1# -# 0xC0#) 6#
100109
!z2# = y2# -# 0x80#
101110
{-# INLINE chr2 #-}
102111

103112
chr3 :: Word8 -> Word8 -> Word8 -> Char
104113
chr3 (W8# x1#) (W8# x2#) (W8# x3#) = C# (chr# (z1# +# z2# +# z3#))
105114
where
106-
!y1# = word2Int# x1#
107-
!y2# = word2Int# x2#
108-
!y3# = word2Int# x3#
115+
!y1# = word2Int# (extendWord8# x1#)
116+
!y2# = word2Int# (extendWord8# x2#)
117+
!y3# = word2Int# (extendWord8# x3#)
109118
!z1# = uncheckedIShiftL# (y1# -# 0xE0#) 12#
110119
!z2# = uncheckedIShiftL# (y2# -# 0x80#) 6#
111120
!z3# = y3# -# 0x80#
@@ -115,10 +124,10 @@ chr4 :: Word8 -> Word8 -> Word8 -> Word8 -> Char
115124
chr4 (W8# x1#) (W8# x2#) (W8# x3#) (W8# x4#) =
116125
C# (chr# (z1# +# z2# +# z3# +# z4#))
117126
where
118-
!y1# = word2Int# x1#
119-
!y2# = word2Int# x2#
120-
!y3# = word2Int# x3#
121-
!y4# = word2Int# x4#
127+
!y1# = word2Int# (extendWord8# x1#)
128+
!y2# = word2Int# (extendWord8# x2#)
129+
!y3# = word2Int# (extendWord8# x3#)
130+
!y4# = word2Int# (extendWord8# x4#)
122131
!z1# = uncheckedIShiftL# (y1# -# 0xF0#) 18#
123132
!z2# = uncheckedIShiftL# (y2# -# 0x80#) 12#
124133
!z3# = uncheckedIShiftL# (y3# -# 0x80#) 6#

Data/Text/Internal/Unsafe/Char.hs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,33 @@ import GHC.Exts (Char(..), Int(..), chr#, ord#, word2Int#)
3636
import GHC.Word (Word8(..), Word16(..), Word32(..))
3737
import qualified Data.Text.Array as A
3838

39+
#if MIN_VERSION_base(4,16,0)
40+
import GHC.Exts ( extendWord8#, extendWord16#, extendWord32# )
41+
#else
42+
import GHC.Prim (Word#)
43+
extendWord8#, extendWord16#, extendWord32# :: Word# -> Word#
44+
extendWord8# w = w
45+
extendWord16# w = w
46+
extendWord32# w = w
47+
{-# INLINE extendWord8# #-}
48+
{-# INLINE extendWord16# #-}
49+
{-# INLINE extendWord32# #-}
50+
#endif
51+
3952
ord :: Char -> Int
4053
ord (C# c#) = I# (ord# c#)
4154
{-# INLINE ord #-}
4255

4356
unsafeChr :: Word16 -> Char
44-
unsafeChr (W16# w#) = C# (chr# (word2Int# w#))
57+
unsafeChr (W16# w#) = C# (chr# (word2Int# (extendWord16# w#)))
4558
{-# INLINE unsafeChr #-}
4659

4760
unsafeChr8 :: Word8 -> Char
48-
unsafeChr8 (W8# w#) = C# (chr# (word2Int# w#))
61+
unsafeChr8 (W8# w#) = C# (chr# (word2Int# (extendWord8# w#)))
4962
{-# INLINE unsafeChr8 #-}
5063

5164
unsafeChr32 :: Word32 -> Char
52-
unsafeChr32 (W32# w#) = C# (chr# (word2Int# w#))
65+
unsafeChr32 (W32# w#) = C# (chr# (word2Int# (extendWord32# w#)))
5366
{-# INLINE unsafeChr32 #-}
5467

5568
-- | Write a character into the array at the given offset. Returns

Data/Text/Internal/Unsafe/Shift.hs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{-# LANGUAGE MagicHash #-}
1+
{-# LANGUAGE MagicHash, CPP #-}
22

33
-- |
44
-- Module : Data.Text.Internal.Unsafe.Shift
@@ -21,9 +21,25 @@ module Data.Text.Internal.Unsafe.Shift
2121
) where
2222

2323
-- import qualified Data.Bits as Bits
24-
import GHC.Base
2524
import GHC.Word
2625

26+
#if MIN_VERSION_base(4,16,0)
27+
import GHC.Base
28+
#else
29+
import GHC.Base hiding (extendWord16#, narrowWord16#)
30+
import GHC.Prim (Word#)
31+
extendWord16#, extendWord32# :: Word# -> Word#
32+
narrowWord16#, narrowWord32# :: Word# -> Word#
33+
extendWord16# w = w
34+
extendWord32# w = w
35+
narrowWord16# w = w
36+
narrowWord32# w = w
37+
{-# INLINE narrowWord16# #-}
38+
{-# INLINE extendWord16# #-}
39+
{-# INLINE narrowWord32# #-}
40+
{-# INLINE extendWord32# #-}
41+
#endif
42+
2743
-- | This is a workaround for poor optimisation in GHC 6.8.2. It
2844
-- fails to notice constant-width shifts, and adds a test and branch
2945
-- to every shift. This imposes about a 10% performance hit.
@@ -36,17 +52,17 @@ class UnsafeShift a where
3652

3753
instance UnsafeShift Word16 where
3854
{-# INLINE shiftL #-}
39-
shiftL (W16# x#) (I# i#) = W16# (narrow16Word# (x# `uncheckedShiftL#` i#))
55+
shiftL (W16# x#) (I# i#) = W16# (narrowWord16# ((extendWord16# x#) `uncheckedShiftL#` i#))
4056

4157
{-# INLINE shiftR #-}
42-
shiftR (W16# x#) (I# i#) = W16# (x# `uncheckedShiftRL#` i#)
58+
shiftR (W16# x#) (I# i#) = W16# (narrowWord16# ((extendWord16# x#) `uncheckedShiftRL#` i#))
4359

4460
instance UnsafeShift Word32 where
4561
{-# INLINE shiftL #-}
46-
shiftL (W32# x#) (I# i#) = W32# (narrow32Word# (x# `uncheckedShiftL#` i#))
62+
shiftL (W32# x#) (I# i#) = W32# (narrowWord32# ((extendWord32# x#) `uncheckedShiftL#` i#))
4763

4864
{-# INLINE shiftR #-}
49-
shiftR (W32# x#) (I# i#) = W32# (x# `uncheckedShiftRL#` i#)
65+
shiftR (W32# x#) (I# i#) = W32# (narrowWord32# ((extendWord32# x#) `uncheckedShiftRL#` i#))
5066

5167
instance UnsafeShift Word64 where
5268
{-# INLINE shiftL #-}

text.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ library
160160
base >= 4.3 && < 5,
161161
binary >= 0.5 && < 0.9,
162162
deepseq >= 1.1 && < 1.5,
163-
ghc-prim >= 0.2 && < 0.8,
163+
ghc-prim >= 0.2 && < 0.9,
164164
template-haskell >= 2.5 && < 2.18
165165

166166
if flag(bytestring-builder)

0 commit comments

Comments
 (0)