{-# LANGUAGE ScopedTypeVariables #-}
module Z.Data.Array.Unaligned where
import Control.Monad.Primitive
import Data.Primitive.ByteArray
import Data.Primitive.PrimArray
import GHC.Int
import GHC.Exts
import GHC.Word
import GHC.Float (stgFloatToWord32, stgWord32ToFloat, stgWord64ToDouble, stgDoubleToWord64)
import Foreign.C.Types
#include "MachDeps.h"
#define USE_BSWAP
class Unaligned a where
{-# MINIMAL unalignedSize, indexWord8ArrayAs#, writeWord8ArrayAs#, readWord8ArrayAs# |
unalignedSize, indexBA, peekMBA, pokeMBA #-}
unalignedSize :: a -> Int
indexWord8ArrayAs# :: ByteArray# -> Int# -> a
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = indexBA ba# (I# i#)
readWord8ArrayAs# :: MutableByteArray# s -> Int# -> State# s -> (# State# s, a #)
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s# =
(unsafeCoerce# (peekMBA (unsafeCoerce# mba#) (I# i#) :: IO a)) s#
writeWord8ArrayAs# :: MutableByteArray# s -> Int# -> a -> State# s -> State# s
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# x s# =
unsafeCoerce# (pokeMBA (unsafeCoerce# mba#) (I# i#) x) s#
peekMBA :: MutableByteArray# RealWorld -> Int -> IO a
{-# INLINE peekMBA #-}
peekMBA mba# (I# i#) = primitive (readWord8ArrayAs# mba# i#)
pokeMBA :: MutableByteArray# RealWorld -> Int -> a -> IO ()
{-# INLINE pokeMBA #-}
pokeMBA mba# (I# i#) x = primitive_ (writeWord8ArrayAs# mba# i# x)
indexBA :: ByteArray# -> Int -> a
{-# INLINE indexBA #-}
indexBA ba# (I# i#) = indexWord8ArrayAs# ba# i#
writeWord8ArrayAs :: (PrimMonad m, Unaligned a) => MutableByteArray (PrimState m) -> Int -> a -> m ()
{-# INLINE writeWord8ArrayAs #-}
writeWord8ArrayAs (MutableByteArray mba#) (I# i#) x = primitive_ (writeWord8ArrayAs# mba# i# x)
readWord8ArrayAs :: (PrimMonad m, Unaligned a) => MutableByteArray (PrimState m) -> Int -> m a
{-# INLINE readWord8ArrayAs #-}
readWord8ArrayAs (MutableByteArray mba#) (I# i#) = primitive (readWord8ArrayAs# mba# i#)
indexWord8ArrayAs :: Unaligned a => ByteArray -> Int -> a
{-# INLINE indexWord8ArrayAs #-}
indexWord8ArrayAs (ByteArray ba#) (I# i#) = indexWord8ArrayAs# ba# i#
writePrimWord8ArrayAs :: (PrimMonad m, Unaligned a) => MutablePrimArray (PrimState m) Word8 -> Int -> a -> m ()
{-# INLINE writePrimWord8ArrayAs #-}
writePrimWord8ArrayAs (MutablePrimArray mba#) (I# i#) x = primitive_ (writeWord8ArrayAs# mba# i# x)
readPrimWord8ArrayAs :: (PrimMonad m, Unaligned a) => MutablePrimArray (PrimState m) Word8 -> Int -> m a
{-# INLINE readPrimWord8ArrayAs #-}
readPrimWord8ArrayAs (MutablePrimArray mba#) (I# i#) = primitive (readWord8ArrayAs# mba# i#)
indexPrimWord8ArrayAs :: Unaligned a => PrimArray Word8 -> Int -> a
{-# INLINE indexPrimWord8ArrayAs #-}
indexPrimWord8ArrayAs (PrimArray ba#) (I# i#) = indexWord8ArrayAs# ba# i#
instance Unaligned Word8 where
{-# INLINE unalignedSize #-}
unalignedSize _ = 1
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (W8# x#) = writeWord8Array# mba# i# x#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, x# #) = readWord8Array# mba# i# s0 in (# s1, W8# x# #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = W8# (indexWord8Array# ba# i#)
instance Unaligned Int8 where
{-# INLINE unalignedSize #-}
unalignedSize _ = 1
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (I8# x#) = writeInt8Array# mba# i# x#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, x# #) = readInt8Array# mba# i# s0 in (# s1, I8# x# #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = I8# (indexInt8Array# ba# i#)
newtype LE a = LE { getLE :: a } deriving (Show, Eq)
newtype BE a = BE { getBE :: a } deriving (Show, Eq)
#define USE_HOST_IMPL(END) \
{-# INLINE writeWord8ArrayAs# #-}; \
writeWord8ArrayAs# mba# i# (END x) = writeWord8ArrayAs# mba# i# x; \
{-# INLINE readWord8ArrayAs# #-}; \
readWord8ArrayAs# mba# i# s0 = \
let !(# s1, x #) = readWord8ArrayAs# mba# i# s0 in (# s1, END x #); \
{-# INLINE indexWord8ArrayAs# #-}; \
indexWord8ArrayAs# ba# i# = END (indexWord8ArrayAs# ba# i#);
instance Unaligned Word16 where
{-# INLINE unalignedSize #-}
unalignedSize _ = 2
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (W16# x#) = writeWord8ArrayAsWord16# mba# i# x#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, x# #) = readWord8ArrayAsWord16# mba# i# s0 in (# s1, W16# x# #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = W16# (indexWord8ArrayAsWord16# ba# i#)
instance Unaligned (LE Word16) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 2
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (LE (W16# x#)) s0# =
let s1# = writeWord8Array# mba# i# x# s0#
in writeWord8Array# mba# (i# +# 1#) (uncheckedShiftRL# x# 8#) s1#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, w1# #) = readWord8Array# mba# i# s0
!(# s2, w2# #) = readWord8Array# mba# (i# +# 1#) s1
in (# s2, LE (W16# (uncheckedShiftL# w2# 8# `or#` w1#)) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let w1# = indexWord8Array# ba# i#
w2# = indexWord8Array# ba# (i# +# 1#)
in LE (W16# (uncheckedShiftL# w2# 8# `or#` w1#))
#else
USE_HOST_IMPL(LE)
#endif
instance Unaligned (BE Word16) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 2
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
USE_HOST_IMPL(BE)
#else
#if (defined(i386_HOST_ARCH) || defined(x86_64_HOST_ARCH)) && defined(USE_BSWAP)
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (BE (W16# x#)) = writeWord8ArrayAsWord16# mba# i# (byteSwap16# x#)
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, x# #) = readWord8ArrayAsWord16# mba# i# s0
in (# s1, BE (W16# (byteSwap16# x#)) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = BE (W16# (byteSwap16# (indexWord8ArrayAsWord16# ba# i#)))
#else
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (BE (W16# x#)) s0# =
let s1# = writeWord8Array# mba# i# (uncheckedShiftRL# x# 8#) s0#
in writeWord8Array# mba# (i# +# 1#) x# s1#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, w2# #) = readWord8Array# mba# i# s0
!(# s2, w1# #) = readWord8Array# mba# (i# +# 1#) s1
in (# s2, BE (W16# (uncheckedShiftL# w2# 8# `or#` w1#)) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let w2# = indexWord8Array# ba# i#
w1# = indexWord8Array# ba# (i# +# 1#)
in BE (W16# (uncheckedShiftL# w2# 8# `or#` w1#))
#endif
#endif
instance Unaligned Word32 where
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (W32# x#) = writeWord8ArrayAsWord32# mba# i# x#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, x# #) = readWord8ArrayAsWord32# mba# i# s0 in (# s1, W32# x# #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = W32# (indexWord8ArrayAsWord32# ba# i#)
instance Unaligned (LE Word32) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (LE (W32# x#)) s0# =
let s1# = writeWord8Array# mba# i# x# s0#
s2# = writeWord8Array# mba# (i# +# 1#) (uncheckedShiftRL# x# 8#) s1#
s3# = writeWord8Array# mba# (i# +# 2#) (uncheckedShiftRL# x# 16#) s2#
in writeWord8Array# mba# (i# +# 3#) (uncheckedShiftRL# x# 24#) s3#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, w1# #) = readWord8Array# mba# i# s0
!(# s2, w2# #) = readWord8Array# mba# (i# +# 1#) s1
!(# s3, w3# #) = readWord8Array# mba# (i# +# 2#) s2
!(# s4, w4# #) = readWord8Array# mba# (i# +# 3#) s3
in (# s4, LE (W32# ((uncheckedShiftL# w4# 24#) `or#`
(uncheckedShiftL# w3# 16#) `or#`
(uncheckedShiftL# w2# 8#) `or#` w1#)) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let w1# = indexWord8Array# ba# i#
w2# = indexWord8Array# ba# (i# +# 1#)
w3# = indexWord8Array# ba# (i# +# 2#)
w4# = indexWord8Array# ba# (i# +# 3#)
in LE (W32# ((uncheckedShiftL# w4# 24#) `or#`
(uncheckedShiftL# w3# 16#) `or#`
(uncheckedShiftL# w2# 8#) `or#` w1#))
#else
USE_HOST_IMPL(LE)
#endif
instance Unaligned (BE Word32) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
USE_HOST_IMPL(BE)
#else
#if (defined(i386_HOST_ARCH) || defined(x86_64_HOST_ARCH)) && defined(USE_BSWAP)
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (BE (W32# x#)) = writeWord8ArrayAsWord32# mba# i# (byteSwap32# x#)
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, x# #) = readWord8ArrayAsWord32# mba# i# s0
in (# s1, BE (W32# (byteSwap32# x#)) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = BE (W32# (byteSwap32# (indexWord8ArrayAsWord32# ba# i#)))
#else
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (BE (W32# x#)) s0# =
let s1# = writeWord8Array# mba# i# (uncheckedShiftRL# x# 24#) s0#
s2# = writeWord8Array# mba# (i# +# 1#) (uncheckedShiftRL# x# 16#) s1#
s3# = writeWord8Array# mba# (i# +# 2#) (uncheckedShiftRL# x# 8#) s2#
in writeWord8Array# mba# (i# +# 3#) x# s3#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, w4# #) = readWord8Array# mba# i# s0
!(# s2, w3# #) = readWord8Array# mba# (i# +# 1#) s1
!(# s3, w2# #) = readWord8Array# mba# (i# +# 2#) s2
!(# s4, w1# #) = readWord8Array# mba# (i# +# 3#) s3
in (# s4, BE (W32# ((uncheckedShiftL# w4# 24#) `or#`
(uncheckedShiftL# w3# 16#) `or#`
(uncheckedShiftL# w2# 8#) `or#` w1#)) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let w4# = indexWord8Array# ba# i#
w3# = indexWord8Array# ba# (i# +# 1#)
w2# = indexWord8Array# ba# (i# +# 2#)
w1# = indexWord8Array# ba# (i# +# 3#)
in BE (W32# ((uncheckedShiftL# w4# 24#) `or#`
(uncheckedShiftL# w3# 16#) `or#`
(uncheckedShiftL# w2# 8#) `or#` w1#))
#endif
#endif
instance Unaligned Word64 where
{-# INLINE unalignedSize #-}
unalignedSize _ = 8
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (W64# x#) = writeWord8ArrayAsWord64# mba# i# x#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, x# #) = readWord8ArrayAsWord64# mba# i# s0 in (# s1, W64# x# #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = W64# (indexWord8ArrayAsWord64# ba# i#)
instance Unaligned (LE Word64) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 8
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (LE (W64# x#)) s0# =
let s1# = writeWord8Array# mba# i# x# s0#
s2# = writeWord8Array# mba# (i# +# 1#) (uncheckedShiftRL# x# 8#) s1#
s3# = writeWord8Array# mba# (i# +# 2#) (uncheckedShiftRL# x# 16#) s2#
s4# = writeWord8Array# mba# (i# +# 3#) (uncheckedShiftRL# x# 24#) s3#
s5# = writeWord8Array# mba# (i# +# 4#) (uncheckedShiftRL# x# 32#) s4#
s6# = writeWord8Array# mba# (i# +# 5#) (uncheckedShiftRL# x# 40#) s5#
s7# = writeWord8Array# mba# (i# +# 6#) (uncheckedShiftRL# x# 48#) s6#
in writeWord8Array# mba# (i# +# 7#) (uncheckedShiftRL# x# 56#) s7#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, w1# #) = readWord8Array# mba# i# s0
!(# s2, w2# #) = readWord8Array# mba# (i# +# 1#) s1
!(# s3, w3# #) = readWord8Array# mba# (i# +# 2#) s2
!(# s4, w4# #) = readWord8Array# mba# (i# +# 3#) s3
!(# s5, w5# #) = readWord8Array# mba# (i# +# 4#) s4
!(# s6, w6# #) = readWord8Array# mba# (i# +# 5#) s5
!(# s7, w7# #) = readWord8Array# mba# (i# +# 6#) s6
!(# s8, w8# #) = readWord8Array# mba# (i# +# 7#) s7
in (# s8, LE (W64# ((uncheckedShiftL# w8# 56#) `or#`
(uncheckedShiftL# w7# 48#) `or#`
(uncheckedShiftL# w6# 40#) `or#`
(uncheckedShiftL# w5# 32#) `or#`
(uncheckedShiftL# w4# 24#) `or#`
(uncheckedShiftL# w3# 16#) `or#`
(uncheckedShiftL# w2# 8#) `or#` w1#)) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let w1# = indexWord8Array# ba# i#
w2# = indexWord8Array# ba# (i# +# 1#)
w3# = indexWord8Array# ba# (i# +# 2#)
w4# = indexWord8Array# ba# (i# +# 3#)
w5# = indexWord8Array# ba# (i# +# 4#)
w6# = indexWord8Array# ba# (i# +# 5#)
w7# = indexWord8Array# ba# (i# +# 6#)
w8# = indexWord8Array# ba# (i# +# 7#)
in LE (W64# ((uncheckedShiftL# w8# 56#) `or#`
(uncheckedShiftL# w7# 48#) `or#`
(uncheckedShiftL# w6# 40#) `or#`
(uncheckedShiftL# w5# 32#) `or#`
(uncheckedShiftL# w4# 24#) `or#`
(uncheckedShiftL# w3# 16#) `or#`
(uncheckedShiftL# w2# 8#) `or#` w1#))
#else
USE_HOST_IMPL(LE)
#endif
instance Unaligned (BE Word64) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 8
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
USE_HOST_IMPL(BE)
#else
#if (defined(i386_HOST_ARCH) || defined(x86_64_HOST_ARCH)) && defined(USE_BSWAP)
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (BE (W64# x#)) = writeWord8ArrayAsWord64# mba# i# (byteSwap64# x#)
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, x# #) = readWord8ArrayAsWord64# mba# i# s0
in (# s1, BE (W64# (byteSwap64# x#)) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = BE (W64# (byteSwap64# (indexWord8ArrayAsWord64# ba# i#)))
#else
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (BE (W64# x#)) s0# =
let s1# = writeWord8Array# mba# i# (uncheckedShiftRL# x# 56#) s0#
s2# = writeWord8Array# mba# (i# +# 1#) (uncheckedShiftRL# x# 48#) s1#
s3# = writeWord8Array# mba# (i# +# 2#) (uncheckedShiftRL# x# 40#) s2#
s4# = writeWord8Array# mba# (i# +# 3#) (uncheckedShiftRL# x# 32#) s3#
s5# = writeWord8Array# mba# (i# +# 4#) (uncheckedShiftRL# x# 24#) s4#
s6# = writeWord8Array# mba# (i# +# 5#) (uncheckedShiftRL# x# 16#) s5#
s7# = writeWord8Array# mba# (i# +# 6#) (uncheckedShiftRL# x# 8#) s6#
in writeWord8Array# mba# (i# +# 7#) x# s7#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, w8# #) = readWord8Array# mba# i# s0
!(# s2, w7# #) = readWord8Array# mba# (i# +# 1#) s1
!(# s3, w6# #) = readWord8Array# mba# (i# +# 2#) s2
!(# s4, w5# #) = readWord8Array# mba# (i# +# 3#) s3
!(# s5, w4# #) = readWord8Array# mba# (i# +# 4#) s4
!(# s6, w3# #) = readWord8Array# mba# (i# +# 5#) s5
!(# s7, w2# #) = readWord8Array# mba# (i# +# 6#) s6
!(# s8, w1# #) = readWord8Array# mba# (i# +# 7#) s7
in (# s8, BE (W64# ((uncheckedShiftL# w8# 56#) `or#`
(uncheckedShiftL# w7# 48#) `or#`
(uncheckedShiftL# w6# 40#) `or#`
(uncheckedShiftL# w5# 32#) `or#`
(uncheckedShiftL# w4# 24#) `or#`
(uncheckedShiftL# w3# 16#) `or#`
(uncheckedShiftL# w2# 8#) `or#` w1#)) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let w8# = indexWord8Array# ba# i#
w7# = indexWord8Array# ba# (i# +# 1#)
w6# = indexWord8Array# ba# (i# +# 2#)
w5# = indexWord8Array# ba# (i# +# 3#)
w4# = indexWord8Array# ba# (i# +# 4#)
w3# = indexWord8Array# ba# (i# +# 5#)
w2# = indexWord8Array# ba# (i# +# 6#)
w1# = indexWord8Array# ba# (i# +# 7#)
in BE (W64# ((uncheckedShiftL# w8# 56#) `or#`
(uncheckedShiftL# w7# 48#) `or#`
(uncheckedShiftL# w6# 40#) `or#`
(uncheckedShiftL# w5# 32#) `or#`
(uncheckedShiftL# w4# 24#) `or#`
(uncheckedShiftL# w3# 16#) `or#`
(uncheckedShiftL# w2# 8#) `or#` w1#))
#endif
#endif
instance Unaligned Word where
#if SIZEOF_HSWORD == 4
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
#else
{-# INLINE unalignedSize #-}
unalignedSize _ = 8
#endif
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (W# x#) = writeWord8ArrayAsWord# mba# i# x#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, x# #) = readWord8ArrayAsWord# mba# i# s0 in (# s1, W# x# #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = W# (indexWord8ArrayAsWord# ba# i#)
instance Unaligned (LE Word) where
#if SIZEOF_HSWORD == 4
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (LE (W# x#)) = writeWord8ArrayAs# mba# i# (LE (W32# x#))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, LE (W32# x#) #) = readWord8ArrayAs# mba# i# s0 in (# s1, LE (W# x#) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = case (indexWord8ArrayAs# ba# i#) of (LE (W32# x#)) -> LE (W# x#)
#else
{-# INLINE unalignedSize #-}
unalignedSize _ = 8
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (LE (W# x#)) = writeWord8ArrayAs# mba# i# (LE (W64# x#))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, LE (W64# x#) #) = readWord8ArrayAs# mba# i# s0 in (# s1, LE (W# x#) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = case (indexWord8ArrayAs# ba# i#) of (LE (W64# x#)) -> LE (W# x#)
#endif
instance Unaligned (BE Word) where
#if SIZEOF_HSWORD == 4
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (BE (W# x#)) = writeWord8ArrayAs# mba# i# (BE (W32# x#))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, BE (W32# x#) #) = readWord8ArrayAs# mba# i# s0 in (# s1, BE (W# x#) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = case (indexWord8ArrayAs# ba# i#) of (BE (W32# x#)) -> BE (W# x#)
#else
{-# INLINE unalignedSize #-}
unalignedSize _ = 8
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (BE (W# x#)) = writeWord8ArrayAs# mba# i# (BE (W64# x#))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, BE (W64# x#) #) = readWord8ArrayAs# mba# i# s0 in (# s1, BE (W# x#) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = case (indexWord8ArrayAs# ba# i#) of (BE (W64# x#)) -> BE (W# x#)
#endif
instance Unaligned Int16 where
{-# INLINE unalignedSize #-}
unalignedSize _ = 2
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (I16# x#) = writeWord8ArrayAsInt16# mba# i# x#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, x# #) = readWord8ArrayAsInt16# mba# i# s0 in (# s1, I16# x# #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = I16# (indexWord8ArrayAsInt16# ba# i#)
instance Unaligned (LE Int16) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 2
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (LE (I16# x#)) =
writeWord8ArrayAs# mba# i# (LE (W16# (int2Word# x#)))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, LE (W16# x#) #) = readWord8ArrayAs# mba# i# s0
in (# s1, LE (I16# (narrow16Int# (word2Int# x#))) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let LE (W16# x#) = indexWord8ArrayAs# ba# i#
in LE (I16# (narrow16Int# (word2Int# x#)))
#else
USE_HOST_IMPL(LE)
#endif
instance Unaligned (BE Int16) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 2
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
USE_HOST_IMPL(BE)
#else
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (BE (I16# x#)) =
writeWord8ArrayAs# mba# i# (BE (W16# (int2Word# x#)))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, BE (W16# x#) #) = readWord8ArrayAs# mba# i# s0
in (# s1, BE (I16# (narrow16Int# (word2Int# x#))) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let !(BE (W16# x#)) = indexWord8ArrayAs# ba# i#
in BE (I16# (narrow16Int# (word2Int# x#)))
#endif
instance Unaligned Int32 where
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (I32# x#) = writeWord8ArrayAsInt32# mba# i# x#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, x# #) = readWord8ArrayAsInt32# mba# i# s0 in (# s1, I32# x# #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = I32# (indexWord8ArrayAsInt32# ba# i#)
instance Unaligned (LE Int32) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (LE (I32# x#)) =
writeWord8ArrayAs# mba# i# (LE (W32# (int2Word# x#)))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, LE (W32# x#) #) = readWord8ArrayAs# mba# i# s0
in (# s1, LE (I32# (narrow32Int# (word2Int# x#))) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let LE (W32# x#) = indexWord8ArrayAs# ba# i#
in LE (I32# (narrow32Int# (word2Int# x#)))
#else
USE_HOST_IMPL(LE)
#endif
instance Unaligned (BE Int32) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
USE_HOST_IMPL(BE)
#else
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (BE (I32# x#)) =
writeWord8ArrayAs# mba# i# (BE (W32# (int2Word# x#)))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, BE (W32# x#) #) = readWord8ArrayAs# mba# i# s0
in (# s1, BE (I32# (narrow32Int# (word2Int# x#))) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let !(BE (W32# x#)) = indexWord8ArrayAs# ba# i#
in BE (I32# (narrow32Int# (word2Int# x#)))
#endif
instance Unaligned Int64 where
{-# INLINE unalignedSize #-}
unalignedSize _ = 8
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (I64# x#) = writeWord8ArrayAsInt64# mba# i# x#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, x# #) = readWord8ArrayAsInt64# mba# i# s0 in (# s1, I64# x# #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = I64# (indexWord8ArrayAsInt64# ba# i#)
instance Unaligned (LE Int64) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 8
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (LE (I64# x#)) =
writeWord8ArrayAs# mba# i# (LE (W64# (int2Word# x#)))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, LE (W64# x#) #) = readWord8ArrayAs# mba# i# s0
in (# s1, LE (I64# (word2Int# x#)) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let LE (W64# x#) = indexWord8ArrayAs# ba# i#
in LE (I64# (word2Int# x#))
#else
USE_HOST_IMPL(LE)
#endif
instance Unaligned (BE Int64) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 8
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
USE_HOST_IMPL(BE)
#else
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (BE (I64# x#)) =
writeWord8ArrayAs# mba# i# (BE (W64# (int2Word# x#)))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, BE (W64# x#) #) = readWord8ArrayAs# mba# i# s0
in (# s1, BE (I64# (word2Int# x#)) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let !(BE (W64# x#)) = indexWord8ArrayAs# ba# i#
in BE (I64# (word2Int# x#))
#endif
instance Unaligned Int where
#if SIZEOF_HSWORD == 4
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
#else
{-# INLINE unalignedSize #-}
unalignedSize _ = 8
#endif
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (I# x#) = writeWord8ArrayAsInt# mba# i# x#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, x# #) = readWord8ArrayAsInt# mba# i# s0 in (# s1, I# x# #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = I# (indexWord8ArrayAsInt# ba# i#)
instance Unaligned (LE Int) where
#if SIZEOF_HSWORD == 4
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (LE (I# x#)) = writeWord8ArrayAs# mba# i# (LE (I32# x#))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, LE (I32# x#) #) = readWord8ArrayAs# mba# i# s0 in (# s1, LE (I# x#) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = case (indexWord8ArrayAs# ba# i#) of (LE (I32# x#)) -> LE (I# x#)
#else
{-# INLINE unalignedSize #-}
unalignedSize _ = 8
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (LE (I# x#)) = writeWord8ArrayAs# mba# i# (LE (I64# x#))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, LE (I64# x#) #) = readWord8ArrayAs# mba# i# s0 in (# s1, LE (I# x#) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = case (indexWord8ArrayAs# ba# i#) of (LE (I64# x#)) -> LE (I# x#)
#endif
instance Unaligned (BE Int) where
#if SIZEOF_HSWORD == 4
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (BE (I# x#)) = writeWord8ArrayAs# mba# i# (BE (I32# x#))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, BE (I32# x#) #) = readWord8ArrayAs# mba# i# s0 in (# s1, BE (I# x#) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = case (indexWord8ArrayAs# ba# i#) of (BE (I32# x#)) -> BE (I# x#)
#else
{-# INLINE unalignedSize #-}
unalignedSize _ = 8
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (BE (I# x#)) = writeWord8ArrayAs# mba# i# (BE (I64# x#))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, BE (I64# x#) #) = readWord8ArrayAs# mba# i# s0 in (# s1, BE (I# x#) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = case (indexWord8ArrayAs# ba# i#) of (BE (I64# x#)) -> BE (I# x#)
#endif
instance Unaligned (Ptr a) where
{-# INLINE unalignedSize #-}
unalignedSize _ = SIZEOF_HSPTR
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (Ptr x#) = writeWord8ArrayAsAddr# mba# i# x#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, x# #) = readWord8ArrayAsAddr# mba# i# s0 in (# s1, Ptr x# #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = Ptr (indexWord8ArrayAsAddr# ba# i#)
instance Unaligned Float where
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (F# x#) = writeWord8ArrayAsFloat# mba# i# x#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, x# #) = readWord8ArrayAsFloat# mba# i# s0 in (# s1, F# x# #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = F# (indexWord8ArrayAsFloat# ba# i#)
instance Unaligned (LE Float) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (LE (F# x#)) =
writeWord8ArrayAs# mba# i# (LE (W32# (stgFloatToWord32 x#)))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, LE (W32# x#) #) = readWord8ArrayAs# mba# i# s0
in (# s1, LE (F# (stgWord32ToFloat x#)) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let LE (W32# x#) = indexWord8ArrayAs# ba# i#
in LE (F# (stgWord32ToFloat x#))
#else
USE_HOST_IMPL(LE)
#endif
instance Unaligned (BE Float) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
USE_HOST_IMPL(BE)
#else
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (BE (F# x#)) =
writeWord8ArrayAs# mba# i# (BE (W32# (stgFloatToWord32 x#)))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, BE (W32# x#) #) = readWord8ArrayAs# mba# i# s0
in (# s1, BE (F# (stgWord32ToFloat x#)) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let !(BE (W32# x#)) = indexWord8ArrayAs# ba# i#
in BE (F# (stgWord32ToFloat x#))
#endif
instance Unaligned Double where
{-# INLINE unalignedSize #-}
unalignedSize _ = 8
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (D# x#) = writeWord8ArrayAsDouble# mba# i# x#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, x# #) = readWord8ArrayAsDouble# mba# i# s0 in (# s1, D# x# #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = D# (indexWord8ArrayAsDouble# ba# i#)
instance Unaligned (LE Double) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 8
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (LE (D# x#)) =
writeWord8ArrayAs# mba# i# (LE (W64# (stgDoubleToWord64 x#)))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, LE (W64# x#) #) = readWord8ArrayAs# mba# i# s0
in (# s1, LE (D# (stgWord64ToDouble x#)) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let LE (W64# x#) = indexWord8ArrayAs# ba# i#
in LE (D# (stgWord64ToDouble x#))
#else
USE_HOST_IMPL(LE)
#endif
instance Unaligned (BE Double) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
USE_HOST_IMPL(BE)
#else
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (BE (D# x#)) =
writeWord8ArrayAs# mba# i# (BE (W64# (stgDoubleToWord64 x#)))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, BE (W64# x#) #) = readWord8ArrayAs# mba# i# s0
in (# s1, BE (D# (stgWord64ToDouble x#)) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let !(BE (W64# x#)) = indexWord8ArrayAs# ba# i#
in BE (D# (stgWord64ToDouble x#))
#endif
instance Unaligned Char where
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (C# x#) = writeWord8ArrayAsWideChar# mba# i# x#
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, x# #) = readWord8ArrayAsWideChar# mba# i# s0 in (# s1, C# x# #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# = C# (indexWord8ArrayAsWideChar# ba# i#)
instance Unaligned (LE Char) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (LE (C# x#)) =
writeWord8ArrayAs# mba# i# (LE (I32# (ord# x#)))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, LE (I32# x#) #) = readWord8ArrayAs# mba# i# s0
in (# s1, LE (C# (chr# x#)) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let LE (I32# x#) = indexWord8ArrayAs# ba# i#
in LE (C# (chr# x#))
#else
USE_HOST_IMPL(LE)
#endif
instance Unaligned (BE Char) where
{-# INLINE unalignedSize #-}
unalignedSize _ = 4
#if defined(WORDS_BIGENDIAN) || defined(USE_SHIFT)
USE_HOST_IMPL(BE)
#else
{-# INLINE writeWord8ArrayAs# #-}
writeWord8ArrayAs# mba# i# (BE (C# x#)) =
writeWord8ArrayAs# mba# i# (BE (I32# (ord# x#)))
{-# INLINE readWord8ArrayAs# #-}
readWord8ArrayAs# mba# i# s0 =
let !(# s1, BE (I32# x#) #) = readWord8ArrayAs# mba# i# s0
in (# s1, BE (C# (chr# x#)) #)
{-# INLINE indexWord8ArrayAs# #-}
indexWord8ArrayAs# ba# i# =
let !(BE (I32# x#)) = indexWord8ArrayAs# ba# i#
in BE (C# (chr# x#))
#endif
deriving newtype instance Unaligned CChar
deriving newtype instance Unaligned CSChar
deriving newtype instance Unaligned CUChar
deriving newtype instance Unaligned CShort
deriving newtype instance Unaligned CUShort
deriving newtype instance Unaligned CInt
deriving newtype instance Unaligned CUInt
deriving newtype instance Unaligned CLong
deriving newtype instance Unaligned CULong
deriving newtype instance Unaligned CPtrdiff
deriving newtype instance Unaligned CSize
deriving newtype instance Unaligned CWchar
deriving newtype instance Unaligned CSigAtomic
deriving newtype instance Unaligned CLLong
deriving newtype instance Unaligned CULLong
deriving newtype instance Unaligned CBool
deriving newtype instance Unaligned CIntPtr
deriving newtype instance Unaligned CUIntPtr
deriving newtype instance Unaligned CIntMax
deriving newtype instance Unaligned CUIntMax
deriving newtype instance Unaligned CClock
deriving newtype instance Unaligned CTime
deriving newtype instance Unaligned CUSeconds
deriving newtype instance Unaligned CSUSeconds
deriving newtype instance Unaligned CFloat
deriving newtype instance Unaligned CDouble