diff --git a/CHANGELOG.md b/CHANGELOG.md index e6341a0..e8b684c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## Changes in 3.5.2.0 + +* Use `byteSwap16#` and `byteSwap32#` on big-endian architectures instead of + handrolling the implementation. + ## Changes in 3.5.1.0 * Drop generating output for GHC < 6.4. diff --git a/data/AlexTemplate.hs b/data/AlexTemplate.hs index 01f7ac9..8ca8c0a 100644 --- a/data/AlexTemplate.hs +++ b/data/AlexTemplate.hs @@ -44,18 +44,15 @@ data AlexAddr = AlexA# Addr# {-# INLINE alexIndexInt16OffAddr #-} alexIndexInt16OffAddr :: AlexAddr -> Int# -> Int# alexIndexInt16OffAddr (AlexA# arr) off = -#ifdef WORDS_BIGENDIAN - narrow16Int# i - where - i = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low) - high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#))) - low = int2Word# (ord# (indexCharOffAddr# arr off')) - off' = off *# 2# -#else #if __GLASGOW_HASKELL__ >= 901 - GHC.Exts.int16ToInt# + GHC.Exts.int16ToInt# -- qualified import because it doesn't exist on older GHC's #endif - (indexInt16OffAddr# arr off) +#ifdef WORDS_BIGENDIAN + (GHC.Exts.word16ToInt16# (GHC.Exts.wordToWord16# (GHC.Exts.byteSwap16# (GHC.Exts.word16ToWord# (GHC.Exts.int16ToWord16# +#endif + (indexInt16OffAddr# arr off) +#ifdef WORDS_BIGENDIAN + ))))) #endif #else alexIndexInt16OffAddr = (Data.Array.!) @@ -65,22 +62,15 @@ alexIndexInt16OffAddr = (Data.Array.!) {-# INLINE alexIndexInt32OffAddr #-} alexIndexInt32OffAddr :: AlexAddr -> Int# -> Int# alexIndexInt32OffAddr (AlexA# arr) off = -#ifdef WORDS_BIGENDIAN - narrow32Int# i - where - i = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#` - (b2 `uncheckedShiftL#` 16#) `or#` - (b1 `uncheckedShiftL#` 8#) `or#` b0) - b3 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#))) - b2 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#))) - b1 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#))) - b0 = int2Word# (ord# (indexCharOffAddr# arr off')) - off' = off *# 4# -#else #if __GLASGOW_HASKELL__ >= 901 - GHC.Exts.int32ToInt# + GHC.Exts.int32ToInt# -- qualified import because it doesn't exist on older GHC's #endif - (indexInt32OffAddr# arr off) +#ifdef WORDS_BIGENDIAN + (GHC.Exts.word32ToInt32# (GHC.Exts.wordToWord32# (GHC.Exts.byteSwap32# (GHC.Exts.word32ToWord# (GHC.Exts.int32ToWord32# +#endif + (indexInt32OffAddr# arr off) +#ifdef WORDS_BIGENDIAN + ))))) #endif #else alexIndexInt32OffAddr = (Data.Array.!)