{-# LANGUAGE MagicHash #-} {-# LANGUAGE UnliftedFFITypes #-} {-# LANGUAGE Unsafe #-} module PrimOps ( compareByteArrays# ) where import Foreign.C.Types (CInt (..), CSize (..)) import GHC.Exts (Int (I#)) import GHC.Exts (ByteArray#, Int#) import System.IO.Unsafe (unsafeDupablePerformIO) -- | Emulate GHC 8.4's 'GHC.Prim.compareByteArrays#' compareByteArrays# :: ByteArray# -> Int# -> ByteArray# -> Int# -> Int# -> Int# compareByteArrays# ba1# ofs1# ba2# ofs2# n# = unI (fromIntegral (unsafeDupablePerformIO (c_memcmp ba1# ofs1 ba2# ofs2 n))) where unI (I# i#) = i# ofs1 = fromIntegral (I# ofs1#) ofs2 = fromIntegral (I# ofs2#) n = fromIntegral (I# n#) foreign import ccall unsafe "hs_text_short_memcmp" c_memcmp :: ByteArray# -> CSize -> ByteArray# -> CSize -> CSize -> IO CInt