individual operations.
\begin{code}
+{-# OPTIONS -fno-implicit-prelude #-}
#include "MachDeps.h"
module PrelBits where
-import Prelude -- To generate the dependency
#ifdef __GLASGOW_HASKELL__
import PrelGHC
import PrelBase
(I# x#) `xor` (I# y#) = I# (word2Int# (int2Word# x# `xor#` int2Word# y#))
complement (I# x#) = I# (word2Int# (int2Word# x# `xor#` int2Word# (-1#)))
(I# x#) `shift` (I# i#)
- | i# >=# 0# = I# (x# `iShiftL#` i#)
- | otherwise = I# (x# `iShiftRA#` negateInt# i#)
+ | i# ==# 0# = I# x#
+ | i# >=# wsib = 0
+ | i# ># 0# = I# (x# `uncheckedIShiftL#` i#)
+ | i# <=# nwsib = I# (if x# <# 0# then -1# else 0#)
+ | otherwise = I# (x# `uncheckedIShiftRA#` negateInt# i#)
+ where
+ wsib = WORD_SIZE_IN_BITS# {- work around preprocessor problem (??) -}
+ nwsib = negateInt# wsib
(I# x#) `rotate` (I# i#) =
-#if WORD_SIZE_IN_BYTES == 4
- I# (word2Int# ((x'# `shiftL#` i'#) `or#`
- (x'# `shiftRL#` (32# -# i'#))))
+ I# (word2Int# ((x'# `uncheckedShiftL#` i'#) `or#`
+ (x'# `uncheckedShiftRL#` (wsib -# i'#))))
where
- x'# = int2Word# x#
- i'# = word2Int# (int2Word# i# `and#` int2Word# 31#)
-#else
- I# (word2Int# ((x'# `shiftL#` i'#) `or#`
- (x'# `shiftRL#` (64# -# i'#))))
- where
- x'# = int2Word# x#
- i'# = word2Int# (int2Word# i# `and#` int2Word# 63#)
-#endif
- bitSize _ = WORD_SIZE_IN_BYTES * 8
+ x'# = int2Word# x#
+ i'# = word2Int# (int2Word# i# `and#` int2Word# (wsib -# 1#))
+ wsib = WORD_SIZE_IN_BITS#
+ bitSize _ = WORD_SIZE_IN_BITS
isSigned _ = True
\end{code}