|
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
|