1{-# LANGUAGE CPP #-} 2{-# LANGUAGE MagicHash #-} 3module Basement.Numerical.Conversion 4 ( intToInt64 5 , int64ToInt 6 , intToWord 7 , wordToWord64 8 , word64ToWord 9 , Word32x2(..) 10 , word64ToWord32s 11 , wordToChar 12 , wordToInt 13 , word64ToWord# 14 , charToInt 15 , int64ToWord64 16 , word64ToInt64 17 ) where 18 19#include "MachDeps.h" 20 21import GHC.Types 22import GHC.Prim 23import GHC.Int 24import GHC.Word 25 26#if WORD_SIZE_IN_BITS < 64 27import GHC.IntWord64 28#endif 29 30intToInt64 :: Int -> Int64 31#if WORD_SIZE_IN_BITS == 64 32intToInt64 (I# i) = I64# i 33#else 34intToInt64 (I# i) = I64# (intToInt64# i) 35#endif 36 37int64ToInt :: Int64 -> Int 38#if WORD_SIZE_IN_BITS == 64 39int64ToInt (I64# i) = I# i 40#else 41int64ToInt (I64# i) = I# (int64ToInt# i) 42#endif 43 44wordToWord64 :: Word -> Word64 45#if WORD_SIZE_IN_BITS == 64 46wordToWord64 (W# i) = W64# i 47#else 48wordToWord64 (W# i) = W64# (wordToWord64# i) 49#endif 50 51word64ToWord :: Word64 -> Word 52#if WORD_SIZE_IN_BITS == 64 53word64ToWord (W64# i) = W# i 54#else 55word64ToWord (W64# i) = W# (word64ToWord# i) 56#endif 57 58word64ToInt64 :: Word64 -> Int64 59#if WORD_SIZE_IN_BITS == 64 60word64ToInt64 (W64# i) = I64# (word2Int# i) 61#else 62word64ToInt64 (W64# i) = I64# (word64ToInt64# i) 63#endif 64 65int64ToWord64 :: Int64 -> Word64 66#if WORD_SIZE_IN_BITS == 64 67int64ToWord64 (I64# i) = W64# (int2Word# i) 68#else 69int64ToWord64 (I64# i) = W64# (int64ToWord64# i) 70#endif 71 72#if WORD_SIZE_IN_BITS == 64 73word64ToWord# :: Word# -> Word# 74word64ToWord# i = i 75{-# INLINE word64ToWord# #-} 76#endif 77 78-- | 2 Word32s 79data Word32x2 = Word32x2 {-# UNPACK #-} !Word32 80 {-# UNPACK #-} !Word32 81 82#if WORD_SIZE_IN_BITS == 64 83word64ToWord32s :: Word64 -> Word32x2 84word64ToWord32s (W64# w64) = Word32x2 (W32# (uncheckedShiftRL# w64 32#)) (W32# (narrow32Word# w64)) 85#else 86word64ToWord32s :: Word64 -> Word32x2 87word64ToWord32s (W64# w64) = Word32x2 (W32# (word64ToWord# (uncheckedShiftRL64# w64 32#))) (W32# (word64ToWord# w64)) 88#endif 89 90wordToChar :: Word -> Char 91wordToChar (W# word) = C# (chr# (word2Int# word)) 92 93wordToInt :: Word -> Int 94wordToInt (W# word) = I# (word2Int# word) 95 96intToWord :: Int -> Word 97intToWord (I# i) = W# (int2Word# i) 98 99charToInt :: Char -> Int 100charToInt (C# x) = I# (ord# x) 101