Blame Data/Memory/Internal/CompatPrim64.hs

Packit c1c4f9
-- |
Packit c1c4f9
-- Module      : Data.Memory.Internal.CompatPrim
Packit c1c4f9
-- License     : BSD-style
Packit c1c4f9
-- Maintainer  : Vincent Hanquez <vincent@snarc.org>
Packit c1c4f9
-- Stability   : stable
Packit c1c4f9
-- Portability : Compat
Packit c1c4f9
--
Packit c1c4f9
-- This module try to keep all the difference between versions of ghc primitive
Packit c1c4f9
-- or other needed packages, so that modules don't need to use CPP.
Packit c1c4f9
--
Packit c1c4f9
-- Note that MagicHash and CPP conflicts in places, making it "more interesting"
Packit c1c4f9
-- to write compat code for primitives
Packit c1c4f9
--
Packit c1c4f9
{-# LANGUAGE CPP #-}
Packit c1c4f9
{-# LANGUAGE BangPatterns #-}
Packit c1c4f9
{-# LANGUAGE MagicHash #-}
Packit c1c4f9
{-# LANGUAGE UnboxedTuples #-}
Packit c1c4f9
#include "MachDeps.h"
Packit c1c4f9
module Data.Memory.Internal.CompatPrim64
Packit c1c4f9
    ( Word64#
Packit c1c4f9
    , Int64#
Packit c1c4f9
    , eqInt64#
Packit c1c4f9
    , neInt64#
Packit c1c4f9
    , ltInt64#
Packit c1c4f9
    , leInt64#
Packit c1c4f9
    , gtInt64#
Packit c1c4f9
    , geInt64#
Packit c1c4f9
    , quotInt64#
Packit c1c4f9
    , remInt64#
Packit c1c4f9
    , eqWord64#
Packit c1c4f9
    , neWord64#
Packit c1c4f9
    , ltWord64#
Packit c1c4f9
    , leWord64#
Packit c1c4f9
    , gtWord64#
Packit c1c4f9
    , geWord64#
Packit c1c4f9
    , and64#
Packit c1c4f9
    , or64#
Packit c1c4f9
    , xor64#
Packit c1c4f9
    , not64#
Packit c1c4f9
    , timesWord64#
Packit c1c4f9
    , uncheckedShiftL64#
Packit c1c4f9
    , uncheckedShiftRL64#
Packit c1c4f9
Packit c1c4f9
    , int64ToWord64#
Packit c1c4f9
    , word64ToInt64#
Packit c1c4f9
    , intToInt64#
Packit c1c4f9
    , int64ToInt#
Packit c1c4f9
    , wordToWord64#
Packit c1c4f9
    , word64ToWord#
Packit c1c4f9
    , w64#
Packit c1c4f9
    ) where
Packit c1c4f9
Packit c1c4f9
Packit c1c4f9
#if WORD_SIZE_IN_BITS == 64
Packit c1c4f9
import GHC.Prim hiding (Word64#, Int64#)
Packit c1c4f9
Packit c1c4f9
#if __GLASGOW_HASKELL__ >= 708
Packit c1c4f9
type OutBool = Int#
Packit c1c4f9
#else
Packit c1c4f9
type OutBool = Bool
Packit c1c4f9
#endif
Packit c1c4f9
Packit c1c4f9
type Word64# = Word#
Packit c1c4f9
type Int64# = Int#
Packit c1c4f9
Packit c1c4f9
eqWord64# :: Word64# -> Word64# -> OutBool
Packit c1c4f9
eqWord64# = eqWord#
Packit c1c4f9
Packit c1c4f9
neWord64# :: Word64# -> Word64# -> OutBool
Packit c1c4f9
neWord64# = neWord#
Packit c1c4f9
Packit c1c4f9
ltWord64# :: Word64# -> Word64# -> OutBool
Packit c1c4f9
ltWord64# = ltWord#
Packit c1c4f9
Packit c1c4f9
leWord64# :: Word64# -> Word64# -> OutBool
Packit c1c4f9
leWord64# = leWord#
Packit c1c4f9
Packit c1c4f9
gtWord64# :: Word64# -> Word64# -> OutBool
Packit c1c4f9
gtWord64# = gtWord#
Packit c1c4f9
Packit c1c4f9
geWord64# :: Word64# -> Word64# -> OutBool
Packit c1c4f9
geWord64# = geWord#
Packit c1c4f9
Packit c1c4f9
eqInt64# :: Int64# -> Int64# -> OutBool
Packit c1c4f9
eqInt64# = (==#)
Packit c1c4f9
Packit c1c4f9
neInt64# :: Int64# -> Int64# -> OutBool
Packit c1c4f9
neInt64# = (/=#)
Packit c1c4f9
Packit c1c4f9
ltInt64# :: Int64# -> Int64# -> OutBool
Packit c1c4f9
ltInt64# = (<#)
Packit c1c4f9
Packit c1c4f9
leInt64# :: Int64# -> Int64# -> OutBool
Packit c1c4f9
leInt64# = (<=#)
Packit c1c4f9
Packit c1c4f9
gtInt64# :: Int64# -> Int64# -> OutBool
Packit c1c4f9
gtInt64# = (>#)
Packit c1c4f9
Packit c1c4f9
geInt64# :: Int64# -> Int64# -> OutBool
Packit c1c4f9
geInt64# = (<=#)
Packit c1c4f9
Packit c1c4f9
quotInt64# :: Int64# -> Int64# -> Int64#
Packit c1c4f9
quotInt64# = quotInt#
Packit c1c4f9
Packit c1c4f9
remInt64# :: Int64# -> Int64# -> Int64#
Packit c1c4f9
remInt64# = remInt#
Packit c1c4f9
Packit c1c4f9
and64# :: Word64# -> Word64# -> Word64#
Packit c1c4f9
and64# = and#
Packit c1c4f9
Packit c1c4f9
or64# :: Word64# -> Word64# -> Word64#
Packit c1c4f9
or64# = or#
Packit c1c4f9
Packit c1c4f9
xor64# :: Word64# -> Word64# -> Word64#
Packit c1c4f9
xor64# = xor#
Packit c1c4f9
Packit c1c4f9
not64# :: Word64# -> Word64#
Packit c1c4f9
not64# = not#
Packit c1c4f9
Packit c1c4f9
uncheckedShiftL64# :: Word64# -> Int# -> Word64#
Packit c1c4f9
uncheckedShiftL64# = uncheckedShiftL#
Packit c1c4f9
Packit c1c4f9
uncheckedShiftRL64#  :: Word64# -> Int# -> Word64#
Packit c1c4f9
uncheckedShiftRL64# = uncheckedShiftL#
Packit c1c4f9
Packit c1c4f9
int64ToWord64# :: Int64# -> Word64#
Packit c1c4f9
int64ToWord64# = int2Word#
Packit c1c4f9
Packit c1c4f9
word64ToInt64# :: Word64# -> Int64#
Packit c1c4f9
word64ToInt64# = word2Int#
Packit c1c4f9
Packit c1c4f9
intToInt64# :: Int# -> Int64#
Packit c1c4f9
intToInt64# w = w
Packit c1c4f9
Packit c1c4f9
int64ToInt# :: Int64# -> Int#
Packit c1c4f9
int64ToInt# w = w
Packit c1c4f9
Packit c1c4f9
wordToWord64# :: Word# -> Word64#
Packit c1c4f9
wordToWord64# w = w
Packit c1c4f9
Packit c1c4f9
word64ToWord# :: Word64# -> Word#
Packit c1c4f9
word64ToWord# w = w
Packit c1c4f9
Packit c1c4f9
timesWord64# :: Word64# -> Word64# -> Word64#
Packit c1c4f9
timesWord64# = timesWord#
Packit c1c4f9
Packit c1c4f9
w64# :: Word# -> Word# -> Word# -> Word64#
Packit c1c4f9
w64# w _ _ = w
Packit c1c4f9
Packit c1c4f9
#elif WORD_SIZE_IN_BITS == 32
Packit c1c4f9
import GHC.IntWord64
Packit c1c4f9
import GHC.Prim (Word#)
Packit c1c4f9
Packit c1c4f9
timesWord64# :: Word64# -> Word64# -> Word64#
Packit c1c4f9
timesWord64# a b =
Packit c1c4f9
    let !ai = word64ToInt64# a
Packit c1c4f9
        !bi = word64ToInt64# b
Packit c1c4f9
     in int64ToWord64# (timesInt64# ai bi)
Packit c1c4f9
Packit c1c4f9
w64# :: Word# -> Word# -> Word# -> Word64#
Packit c1c4f9
w64# _ hw lw =
Packit c1c4f9
    let !h = wordToWord64# hw
Packit c1c4f9
        !l = wordToWord64# lw
Packit c1c4f9
     in or64# (uncheckedShiftL64# h 32#) l
Packit c1c4f9
#else
Packit c1c4f9
#error "not a supported architecture. supported WORD_SIZE_IN_BITS is 32 bits or 64 bits"
Packit c1c4f9
#endif