ref: 633d3d10ac6dcdb283c831cd98b4aefe61d1ef4f
parent: acd1d15d178a2875f182f4449626d2e0419a5267
author: Lennart Augustsson <lennart@augustsson.net>
date: Thu Sep 12 13:42:15 EDT 2024
More Bits stuff
--- a/TODO
+++ b/TODO
@@ -38,3 +38,4 @@
* Check for escaping skolemized variables
* Type checking Data.Data
* Class export with list does nt export $dflt
+* import M(method) doesn't work
--- a/lib/Data/Bits.hs
+++ b/lib/Data/Bits.hs
@@ -4,7 +4,7 @@
import Control.Error
import Data.Bool
import Data.Eq
-import Data.Int()
+import Data.Int
import Data.Maybe
import Data.Ord
import Data.Num
@@ -92,3 +92,18 @@
| otherwise = go (i + 1)
w = finiteBitSize x
+
+instance Bits Int where
+ (.&.) = primIntAnd
+ (.|.) = primIntOr
+ xor = primIntXor
+ complement = primIntInv
+ shiftL = primIntShl
+ shiftR = primIntShr
+ bitSizeMaybe _ = Just _wordSize
+ bitSize _ = _wordSize
+ bit n = primIntShl 1 n
+ zeroBits = 0
+
+instance FiniteBits Int where
+ finiteBitSize _ = _wordSize
--- a/lib/Data/Word.hs
+++ b/lib/Data/Word.hs
@@ -93,7 +93,11 @@
bit n = primWordShl 1 n
zeroBits = 0
---------------------------------------------------------------------------------
+
+instance FiniteBits Word where
+ finiteBitSize _ = _wordSize
+
+--------------------------------------------------------------------------------
---- Word8
newtype Word8 = W8 Word
@@ -179,7 +183,10 @@
bit n = w8 (primWordShl 1 n)
zeroBits = 0
---------------------------------------------------------------------------------
+instance FiniteBits Word8 where
+ finiteBitSize _ = 8
+
+--------------------------------------------------------------------------------
---- Word16
newtype Word16 = W16 Word
@@ -265,7 +272,10 @@
bit n = w16 (primWordShl 1 n)
zeroBits = 0
---------------------------------------------------------------------------------
+instance FiniteBits Word16 where
+ finiteBitSize _ = 16
+
+--------------------------------------------------------------------------------
---- Word32
newtype Word32 = W32 Word
@@ -351,7 +361,10 @@
bit n = w32 (primWordShl 1 n)
zeroBits = 0
---------------------------------------------------------------------------------
+instance FiniteBits Word32 where
+ finiteBitSize _ = 32
+
+--------------------------------------------------------------------------------
---- Word64
newtype Word64 = W64 Word
@@ -436,3 +449,6 @@
bitSize _ = 64
bit n = w64 (primWordShl 1 n)
zeroBits = 0
+
+instance FiniteBits Word64 where
+ finiteBitSize _ = 64
--- a/lib/Primitives.hs
+++ b/lib/Primitives.hs
@@ -123,10 +123,19 @@
primWordToFloatWRaw = primitive "toDbl"
primWordFromFloatWRaw :: FloatW -> Word
primWordFromFloatWRaw = primitive "toInt"
+
+primIntAnd :: Int -> Int -> Int
+primIntAnd = primitive "and"
+primIntOr :: Int -> Int -> Int
+primIntOr = primitive "or"
+primIntXor :: Int -> Int -> Int
+primIntXor = primitive "xor"
primIntShl :: Int -> Int -> Int
primIntShl = primitive "shl"
primIntShr :: Int -> Int -> Int
primIntShr = primitive "ashr"
+primIntInv :: Int -> Int
+primIntInv = primitive "inv"
primWordEQ :: Word -> Word -> Bool
primWordEQ = primitive "=="
--
⑨