[commit: ghc] master: Primitive bitwise operations on Int# (Fixes #7689) (29e86f9)

Simon Marlow marlowsd at gmail.com
Mon Feb 18 11:43:42 CET 2013


Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/29e86f9b178d3cf436629641ec1f2502c67f0347

>---------------------------------------------------------------

commit 29e86f9b178d3cf436629641ec1f2502c67f0347
Author: Jan Stolarek <jan.stolarek at p.lodz.pl>
Date:   Fri Feb 15 13:10:36 2013 +0100

    Primitive bitwise operations on Int# (Fixes #7689)

>---------------------------------------------------------------

 compiler/codeGen/StgCmmPrim.hs  |    4 ++++
 compiler/prelude/PrelRules.lhs  |    9 +++++++++
 compiler/prelude/primops.txt.pp |   11 +++++++++++
 3 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/compiler/codeGen/StgCmmPrim.hs b/compiler/codeGen/StgCmmPrim.hs
index 4005f6d..05ef2b2 100644
--- a/compiler/codeGen/StgCmmPrim.hs
+++ b/compiler/codeGen/StgCmmPrim.hs
@@ -880,6 +880,10 @@ translateOp dflags IntLeOp        = Just (mo_wordSLe dflags)
 translateOp dflags IntGtOp        = Just (mo_wordSGt dflags)
 translateOp dflags IntLtOp        = Just (mo_wordSLt dflags)
 
+translateOp dflags AndIOp         = Just (mo_wordAnd dflags)
+translateOp dflags OrIOp          = Just (mo_wordOr dflags)
+translateOp dflags XorIOp         = Just (mo_wordXor dflags)
+translateOp dflags NotIOp         = Just (mo_wordNot dflags)
 translateOp dflags ISllOp         = Just (mo_wordShl dflags)
 translateOp dflags ISraOp         = Just (mo_wordSShr dflags)
 translateOp dflags ISrlOp         = Just (mo_wordUShr dflags)
diff --git a/compiler/prelude/PrelRules.lhs b/compiler/prelude/PrelRules.lhs
index 2e55e49..079ab0c 100644
--- a/compiler/prelude/PrelRules.lhs
+++ b/compiler/prelude/PrelRules.lhs
@@ -100,6 +100,15 @@ primOpRules nm IntRemOp    = mkPrimOpRule nm 2 [ nonZeroLit 1 >> binaryLit (intO
                                                     retLit zeroi
                                                , equalArgs >> retLit zeroi
                                                , equalArgs >> retLit zeroi ]
+primOpRules nm AndIOp      = mkPrimOpRule nm 2 [ binaryLit (intOp2 (.&.))
+                                               , idempotent
+                                               , zeroElem zeroi ]
+primOpRules nm OrIOp       = mkPrimOpRule nm 2 [ binaryLit (intOp2 (.|.))
+                                               , idempotent
+                                               , identityDynFlags zeroi ]
+primOpRules nm XorIOp      = mkPrimOpRule nm 2 [ binaryLit (intOp2 xor)
+                                               , identityDynFlags zeroi
+                                               , equalArgs >> retLit zeroi ]
 primOpRules nm IntNegOp    = mkPrimOpRule nm 1 [ unaryLit negOp
                                                , inversePrimOp IntNegOp ]
 primOpRules nm ISllOp      = mkPrimOpRule nm 2 [ binaryLit (intOp2 Bits.shiftL)
diff --git a/compiler/prelude/primops.txt.pp b/compiler/prelude/primops.txt.pp
index a5b0fec..4547281 100644
--- a/compiler/prelude/primops.txt.pp
+++ b/compiler/prelude/primops.txt.pp
@@ -217,6 +217,17 @@ primop   IntQuotRemOp "quotRemInt#"    GenPrimOp
    {Rounds towards zero.}
    with can_fail = True
 
+primop   AndIOp   "andI#"   Dyadic    Int# -> Int# -> Int#
+   with commutable = True
+
+primop   OrIOp   "orI#"     Dyadic    Int# -> Int# -> Int#
+   with commutable = True
+
+primop   XorIOp   "xorI#"   Dyadic    Int# -> Int# -> Int#
+   with commutable = True
+
+primop   NotIOp   "notI#"   Monadic   Int# -> Int#
+
 primop   IntNegOp    "negateInt#"    Monadic   Int# -> Int#
 primop   IntAddCOp   "addIntC#"    GenPrimOp   Int# -> Int# -> (# Int#, Int# #)
 	 {Add with carry.  First member of result is (wrapped) sum; 





More information about the ghc-commits mailing list