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