- -- Int2WordOp -- SIGH: these two cause trouble in unfoldery
- -- Int2AddrOp -- as we can't distinguish unsigned literals in interfaces (ToDo?)
-
- primop_rule SeqOp = seqRule
- primop_rule TagToEnumOp = tagToEnumRule
- primop_rule DataToTagOp = dataToTagRule
-
- -- Char operations
- primop_rule OrdOp = oneLit (litCoerce char2IntLit op_name)
-
- -- Int/Word operations
- primop_rule IntAddOp = twoLits (intOp2 (+) op_name)
- primop_rule IntSubOp = twoLits (intOp2 (-) op_name)
- primop_rule IntMulOp = twoLits (intOp2 (*) op_name)
- primop_rule IntQuotOp = twoLits (intOp2Z quot op_name)
- primop_rule IntRemOp = twoLits (intOp2Z rem op_name)
- primop_rule IntNegOp = oneLit (negOp op_name)
-
- primop_rule ChrOp = oneLit (litCoerce int2CharLit op_name)
- primop_rule Int2FloatOp = oneLit (litCoerce int2FloatLit op_name)
- primop_rule Int2DoubleOp = oneLit (litCoerce int2DoubleLit op_name)
- primop_rule Word2IntOp = oneLit (litCoerce word2IntLit op_name)
- primop_rule Int2WordOp = oneLit (litCoerce int2WordLit op_name)
+
+ primop_rule AddrNullOp = Just nullAddrRule
+ primop_rule SeqOp = Just seqRule
+ primop_rule TagToEnumOp = Just tagToEnumRule
+ primop_rule DataToTagOp = Just dataToTagRule
+
+ -- Int operations
+ primop_rule IntAddOp = Just (twoLits (intOp2 (+) op_name))
+ primop_rule IntSubOp = Just (twoLits (intOp2 (-) op_name))
+ primop_rule IntMulOp = Just (twoLits (intOp2 (*) op_name))
+ primop_rule IntQuotOp = Just (twoLits (intOp2Z quot op_name))
+ primop_rule IntRemOp = Just (twoLits (intOp2Z rem op_name))
+ primop_rule IntNegOp = Just (oneLit (negOp op_name))
+
+ -- Word operations
+#if __GLASGOW_HASKELL__ >= 500
+ primop_rule WordAddOp = Just (twoLits (wordOp2 (+) op_name))
+ primop_rule WordSubOp = Just (twoLits (wordOp2 (-) op_name))
+ primop_rule WordMulOp = Just (twoLits (wordOp2 (*) op_name))
+#endif
+ primop_rule WordQuotOp = Just (twoLits (wordOp2Z quot op_name))
+ primop_rule WordRemOp = Just (twoLits (wordOp2Z rem op_name))
+#if __GLASGOW_HASKELL__ >= 407
+ primop_rule AndOp = Just (twoLits (wordBitOp2 (.&.) op_name))
+ primop_rule OrOp = Just (twoLits (wordBitOp2 (.|.) op_name))
+ primop_rule XorOp = Just (twoLits (wordBitOp2 xor op_name))
+#endif
+
+ -- coercions
+ primop_rule Word2IntOp = Just (oneLit (litCoerce word2IntLit op_name))
+ primop_rule Int2WordOp = Just (oneLit (litCoerce int2WordLit op_name))
+ primop_rule Narrow8IntOp = Just (oneLit (litCoerce narrow8IntLit op_name))
+ primop_rule Narrow16IntOp = Just (oneLit (litCoerce narrow16IntLit op_name))
+ primop_rule Narrow32IntOp = Just (oneLit (litCoerce narrow32IntLit op_name))
+ primop_rule Narrow8WordOp = Just (oneLit (litCoerce narrow8WordLit op_name))
+ primop_rule Narrow16WordOp = Just (oneLit (litCoerce narrow16WordLit op_name))
+ primop_rule Narrow32WordOp = Just (oneLit (litCoerce narrow32WordLit op_name))
+ primop_rule OrdOp = Just (oneLit (litCoerce char2IntLit op_name))
+ primop_rule ChrOp = Just (oneLit (litCoerce int2CharLit op_name))
+ primop_rule Float2IntOp = Just (oneLit (litCoerce float2IntLit op_name))
+ primop_rule Int2FloatOp = Just (oneLit (litCoerce int2FloatLit op_name))
+ primop_rule Double2IntOp = Just (oneLit (litCoerce double2IntLit op_name))
+ primop_rule Int2DoubleOp = Just (oneLit (litCoerce int2DoubleLit op_name))
+ -- SUP: Not sure what the standard says about precision in the following 2 cases
+ primop_rule Float2DoubleOp = Just (oneLit (litCoerce float2DoubleLit op_name))
+ primop_rule Double2FloatOp = Just (oneLit (litCoerce double2FloatLit op_name))