Primitive bitwise operations on Int# (Fixes #7689)
authorJan Stolarek <jan.stolarek@p.lodz.pl>
Fri, 15 Feb 2013 12:10:36 +0000 (13:10 +0100)
committerSimon Marlow <marlowsd@gmail.com>
Mon, 18 Feb 2013 09:37:49 +0000 (09:37 +0000)
compiler/codeGen/StgCmmPrim.hs
compiler/prelude/PrelRules.lhs
compiler/prelude/primops.txt.pp

index 4005f6d..05ef2b2 100644 (file)
@@ -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)
index 2e55e49..079ab0c 100644 (file)
@@ -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)
index a5b0fec..4547281 100644 (file)
@@ -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;