{-
(index|read|write)<ty>OffAddr# primops fail when unaligned on platforms not
supporting unaligned accesses. GHC 9.10 introduces new primops that handle
cases where platforms need aligned accesses. This module imitates that for
older GHCs, but without the safety. So we still fail when unaligned, but it's
easier to upgrade when GHC 9.10 is out.

Note that GC-managed addresses already have these primops. This is for 'Addr#',
non-GC-managed.

Import this module unqualified along with 'GHC.Exts' .
-}

{-# LANGUAGE CPP #-}
{-# LANGUAGE UnboxedTuples #-}

module Raehik.Compat.GHC.Exts.GHC910UnalignedAddrPrimops where

#if MIN_VERSION_base(4,20,0)

-- These should be in base-4.20.0.0.

#else

import GHC.Exts

indexWord8OffAddrAsWord16# :: Addr# -> Int# -> Word16#
indexWord8OffAddrAsWord16# :: Addr# -> Int# -> Word16#
indexWord8OffAddrAsWord16# Addr#
addr# Int#
os# =
    Addr# -> Int# -> Word16#
indexWord16OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0#

readWord8OffAddrAsWord16#
    :: Addr# -> Int# -> State# d -> (# State# d, Word16# #)
readWord8OffAddrAsWord16# :: forall d. Addr# -> Int# -> State# d -> (# State# d, Word16# #)
readWord8OffAddrAsWord16# Addr#
addr# Int#
os# = \State# d
s0 ->
    Addr# -> Int# -> State# d -> (# State# d, Word16# #)
forall d. Addr# -> Int# -> State# d -> (# State# d, Word16# #)
readWord16OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0# State# d
s0

writeWord8OffAddrAsWord16# :: Addr# -> Int# -> Word16# -> State# d -> State# d
writeWord8OffAddrAsWord16# :: forall d. Addr# -> Int# -> Word16# -> State# d -> State# d
writeWord8OffAddrAsWord16# Addr#
addr# Int#
os# Word16#
i# State# d
s# =
    Addr# -> Int# -> Word16# -> State# d -> State# d
forall d. Addr# -> Int# -> Word16# -> State# d -> State# d
writeWord16OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0# Word16#
i# State# d
s#

indexWord8OffAddrAsWord32# :: Addr# -> Int# -> Word32#
indexWord8OffAddrAsWord32# :: Addr# -> Int# -> Word32#
indexWord8OffAddrAsWord32# Addr#
addr# Int#
os# =
    Addr# -> Int# -> Word32#
indexWord32OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0#

readWord8OffAddrAsWord32#
    :: Addr# -> Int# -> State# d -> (# State# d, Word32# #)
readWord8OffAddrAsWord32# :: forall d. Addr# -> Int# -> State# d -> (# State# d, Word32# #)
readWord8OffAddrAsWord32# Addr#
addr# Int#
os# = \State# d
s0 ->
    Addr# -> Int# -> State# d -> (# State# d, Word32# #)
forall d. Addr# -> Int# -> State# d -> (# State# d, Word32# #)
readWord32OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0# State# d
s0

writeWord8OffAddrAsWord32# :: Addr# -> Int# -> Word32# -> State# d -> State# d
writeWord8OffAddrAsWord32# :: forall d. Addr# -> Int# -> Word32# -> State# d -> State# d
writeWord8OffAddrAsWord32# Addr#
addr# Int#
os# Word32#
i# State# d
s# =
    Addr# -> Int# -> Word32# -> State# d -> State# d
forall d. Addr# -> Int# -> Word32# -> State# d -> State# d
writeWord32OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0# Word32#
i# State# d
s#

indexWord8OffAddrAsWord64# :: Addr# -> Int# -> Word64#
indexWord8OffAddrAsWord64# :: Addr# -> Int# -> Word64#
indexWord8OffAddrAsWord64# Addr#
addr# Int#
os# =
    Addr# -> Int# -> Word64#
indexWord64OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0#

readWord8OffAddrAsWord64#
    :: Addr# -> Int# -> State# d -> (# State# d, Word64# #)
readWord8OffAddrAsWord64# :: forall d. Addr# -> Int# -> State# d -> (# State# d, Word64# #)
readWord8OffAddrAsWord64# Addr#
addr# Int#
os# = \State# d
s0 ->
    Addr# -> Int# -> State# d -> (# State# d, Word64# #)
forall d. Addr# -> Int# -> State# d -> (# State# d, Word64# #)
readWord64OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0# State# d
s0

writeWord8OffAddrAsWord64# :: Addr# -> Int# -> Word64# -> State# d -> State# d
writeWord8OffAddrAsWord64# :: forall d. Addr# -> Int# -> Word64# -> State# d -> State# d
writeWord8OffAddrAsWord64# Addr#
addr# Int#
os# Word64#
i# State# d
s# =
    Addr# -> Int# -> Word64# -> State# d -> State# d
forall d. Addr# -> Int# -> Word64# -> State# d -> State# d
writeWord64OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0# Word64#
i# State# d
s#

indexWord8OffAddrAsWord# :: Addr# -> Int# -> Word#
indexWord8OffAddrAsWord# :: Addr# -> Int# -> Word#
indexWord8OffAddrAsWord# Addr#
addr# Int#
os# =
    Addr# -> Int# -> Word#
indexWordOffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0#

readWord8OffAddrAsWord#
    :: Addr# -> Int# -> State# d -> (# State# d, Word# #)
readWord8OffAddrAsWord# :: forall d. Addr# -> Int# -> State# d -> (# State# d, Word# #)
readWord8OffAddrAsWord# Addr#
addr# Int#
os# = \State# d
s0 ->
    Addr# -> Int# -> State# d -> (# State# d, Word# #)
forall d. Addr# -> Int# -> State# d -> (# State# d, Word# #)
readWordOffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0# State# d
s0

writeWord8OffAddrAsWord# :: Addr# -> Int# -> Word# -> State# d -> State# d
writeWord8OffAddrAsWord# :: forall d. Addr# -> Int# -> Word# -> State# d -> State# d
writeWord8OffAddrAsWord# Addr#
addr# Int#
os# Word#
i# State# d
s# =
    Addr# -> Int# -> Word# -> State# d -> State# d
forall d. Addr# -> Int# -> Word# -> State# d -> State# d
writeWordOffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0# Word#
i# State# d
s#

indexWord8OffAddrAsInt16# :: Addr# -> Int# -> Int16#
indexWord8OffAddrAsInt16# :: Addr# -> Int# -> Int16#
indexWord8OffAddrAsInt16# Addr#
addr# Int#
os# =
    Addr# -> Int# -> Int16#
indexInt16OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0#

readWord8OffAddrAsInt16#
    :: Addr# -> Int# -> State# d -> (# State# d, Int16# #)
readWord8OffAddrAsInt16# :: forall d. Addr# -> Int# -> State# d -> (# State# d, Int16# #)
readWord8OffAddrAsInt16# Addr#
addr# Int#
os# = \State# d
s0 ->
    Addr# -> Int# -> State# d -> (# State# d, Int16# #)
forall d. Addr# -> Int# -> State# d -> (# State# d, Int16# #)
readInt16OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0# State# d
s0

writeWord8OffAddrAsInt16# :: Addr# -> Int# -> Int16# -> State# d -> State# d
writeWord8OffAddrAsInt16# :: forall d. Addr# -> Int# -> Int16# -> State# d -> State# d
writeWord8OffAddrAsInt16# Addr#
addr# Int#
os# Int16#
i# State# d
s# =
    Addr# -> Int# -> Int16# -> State# d -> State# d
forall d. Addr# -> Int# -> Int16# -> State# d -> State# d
writeInt16OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0# Int16#
i# State# d
s#

indexWord8OffAddrAsInt32# :: Addr# -> Int# -> Int32#
indexWord8OffAddrAsInt32# :: Addr# -> Int# -> Int32#
indexWord8OffAddrAsInt32# Addr#
addr# Int#
os# =
    Addr# -> Int# -> Int32#
indexInt32OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0#

readWord8OffAddrAsInt32#
    :: Addr# -> Int# -> State# d -> (# State# d, Int32# #)
readWord8OffAddrAsInt32# :: forall d. Addr# -> Int# -> State# d -> (# State# d, Int32# #)
readWord8OffAddrAsInt32# Addr#
addr# Int#
os# = \State# d
s0 ->
    Addr# -> Int# -> State# d -> (# State# d, Int32# #)
forall d. Addr# -> Int# -> State# d -> (# State# d, Int32# #)
readInt32OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0# State# d
s0

writeWord8OffAddrAsInt32# :: Addr# -> Int# -> Int32# -> State# d -> State# d
writeWord8OffAddrAsInt32# :: forall d. Addr# -> Int# -> Int32# -> State# d -> State# d
writeWord8OffAddrAsInt32# Addr#
addr# Int#
os# Int32#
i# State# d
s# =
    Addr# -> Int# -> Int32# -> State# d -> State# d
forall d. Addr# -> Int# -> Int32# -> State# d -> State# d
writeInt32OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0# Int32#
i# State# d
s#

indexWord8OffAddrAsInt64# :: Addr# -> Int# -> Int64#
indexWord8OffAddrAsInt64# :: Addr# -> Int# -> Int64#
indexWord8OffAddrAsInt64# Addr#
addr# Int#
os# =
    Addr# -> Int# -> Int64#
indexInt64OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0#

readWord8OffAddrAsInt64#
    :: Addr# -> Int# -> State# d -> (# State# d, Int64# #)
readWord8OffAddrAsInt64# :: forall d. Addr# -> Int# -> State# d -> (# State# d, Int64# #)
readWord8OffAddrAsInt64# Addr#
addr# Int#
os# = \State# d
s0 ->
    Addr# -> Int# -> State# d -> (# State# d, Int64# #)
forall d. Addr# -> Int# -> State# d -> (# State# d, Int64# #)
readInt64OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0# State# d
s0

writeWord8OffAddrAsInt64# :: Addr# -> Int# -> Int64# -> State# d -> State# d
writeWord8OffAddrAsInt64# :: forall d. Addr# -> Int# -> Int64# -> State# d -> State# d
writeWord8OffAddrAsInt64# Addr#
addr# Int#
os# Int64#
i# State# d
s# =
    Addr# -> Int# -> Int64# -> State# d -> State# d
forall d. Addr# -> Int# -> Int64# -> State# d -> State# d
writeInt64OffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0# Int64#
i# State# d
s#

indexWord8OffAddrAsInt# :: Addr# -> Int# -> Int#
indexWord8OffAddrAsInt# :: Addr# -> Int# -> Int#
indexWord8OffAddrAsInt# Addr#
addr# Int#
os# =
    Addr# -> Int# -> Int#
indexIntOffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0#

readWord8OffAddrAsInt#
    :: Addr# -> Int# -> State# d -> (# State# d, Int# #)
readWord8OffAddrAsInt# :: forall d. Addr# -> Int# -> State# d -> (# State# d, Int# #)
readWord8OffAddrAsInt# Addr#
addr# Int#
os# = \State# d
s0 ->
    Addr# -> Int# -> State# d -> (# State# d, Int# #)
forall d. Addr# -> Int# -> State# d -> (# State# d, Int# #)
readIntOffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0# State# d
s0

writeWord8OffAddrAsInt# :: Addr# -> Int# -> Int# -> State# d -> State# d
writeWord8OffAddrAsInt# :: forall d. Addr# -> Int# -> Int# -> State# d -> State# d
writeWord8OffAddrAsInt# Addr#
addr# Int#
os# Int#
i# State# d
s# =
    Addr# -> Int# -> Int# -> State# d -> State# d
forall d. Addr# -> Int# -> Int# -> State# d -> State# d
writeIntOffAddr# (Addr#
addr# Addr# -> Int# -> Addr#
`plusAddr#` Int#
os#) Int#
0# Int#
i# State# d
s#

#endif