getAmodeRep (CLit lit) = literalPrimRep lit
getAmodeRep (CMacroExpr kind _ _) = kind
getAmodeRep (CJoinPoint _) = panic "getAmodeRep:CJoinPoint"
-getAmodeRep (CMem rep addr) = rep
\end{code}
@mixedTypeLocn@ tells whether an amode identifies an ``StgWord''
mkTemp WordRep `thenFlt` \ t_hw_mask1 ->
mkTemp WordRep `thenFlt` \ t_hw_mask2 ->
let a_hw_shift
- = CMachOpStmt (Just t_hw_shift)
+ = CMachOpStmt t_hw_shift
MO_Nat_Shl [CBytesPerWord, CLit (mkMachInt 2)] Nothing
a_hw_mask1
- = CMachOpStmt (Just t_hw_mask1)
+ = CMachOpStmt t_hw_mask1
MO_Nat_Shl [CLit (mkMachWord 1), t_hw_shift] Nothing
a_hw_mask2
- = CMachOpStmt (Just t_hw_mask2)
+ = CMachOpStmt t_hw_mask2
MO_Nat_Sub [t_hw_mask1, CLit (mkMachWord 1)] Nothing
final
# if WORDS_BIGENDIAN
= CSequential [ a_hw_shift, a_hw_mask1, a_hw_mask2,
- CMachOpStmt (Just res) MO_Nat_And [arg, t_hw_mask2] Nothing
+ CMachOpStmt res MO_Nat_And [arg, t_hw_mask2] Nothing
]
# else
= CSequential [ a_hw_shift,
- CMachOpStmt (Just res) MO_Nat_Shr [arg, t_hw_shift] Nothing
+ CMachOpStmt res MO_Nat_Shr [arg, t_hw_shift] Nothing
]
# endif
in
mkTemps = mapFlt mkTemp
-mkDerefOff :: PrimRep -> CAddrMode -> Int -> CAddrMode
-mkDerefOff rep base off
- | off == 0 -- optimisation
- = CMem rep base
- | otherwise
- = CMem rep (CAddr (CIndex base (CLit (mkMachInt (toInteger off))) rep))
-
-mkNoDerefOff :: PrimRep -> CAddrMode -> Int -> CAddrMode
-mkNoDerefOff rep base off
- = CAddr (CIndex base (CLit (mkMachInt (toInteger off))) rep)
-
-- Sigh. This is done in 3 seperate places. Should be
-- commoned up (here, in pprAbsC of COpStmt, and presumably
-- somewhere in the NCG).
-- Helpers for translating various minor variants of array indexing.
+mkDerefOff :: PrimRep -> CAddrMode -> Int -> CAddrMode
+mkDerefOff rep base off
+ = CVal (CIndex base (CLit (mkMachInt (toInteger off))) rep) rep
+
+mkNoDerefOff :: PrimRep -> CAddrMode -> Int -> CAddrMode
+mkNoDerefOff rep base off
+ = CAddr (CIndex base (CLit (mkMachInt (toInteger off))) rep)
+
+
+-- Generates an address as follows
+-- base + sizeof(machine_word)*offw + sizeof(rep)*idx
+mk_OSBI_addr :: Int -> PrimRep -> CAddrMode -> CAddrMode -> RegRelative
+mk_OSBI_addr offw rep base idx
+ = CIndex (CAddr (CIndex base idx rep))
+ (CLit (mkMachWord (fromIntegral offw)))
+ PtrRep
+
+mk_OSBI_ref :: Int -> PrimRep -> CAddrMode -> CAddrMode -> CAddrMode
+mk_OSBI_ref offw rep base idx
+ = CVal (mk_OSBI_addr offw rep base idx) rep
+
+
doIndexOffForeignObjOp maybe_post_read_cast rep res addr idx
= mkBasicIndexedRead fixedHdrSize maybe_post_read_cast rep res addr idx
mkBasicIndexedRead offw Nothing read_rep res base idx
= returnFlt (
- CMachOpStmt (Just res) (MO_ReadOSBI offw read_rep) [base,idx] Nothing
+ CAssign res (mk_OSBI_ref offw read_rep base idx)
)
mkBasicIndexedRead offw (Just cast_to_mop) read_rep res base idx
= mkTemp read_rep `thenFlt` \ tmp ->
(returnFlt . CSequential) [
- CMachOpStmt (Just tmp) (MO_ReadOSBI offw read_rep) [base,idx] Nothing,
- CMachOpStmt (Just res) cast_to_mop [tmp] Nothing
+ CAssign tmp (mk_OSBI_ref offw read_rep base idx),
+ CMachOpStmt res cast_to_mop [tmp] Nothing
]
mkBasicIndexedWrite offw Nothing write_rep base idx val
= returnFlt (
- CMachOpStmt Nothing (MO_WriteOSBI offw write_rep) [base,idx,val] Nothing
+ CAssign (mk_OSBI_ref offw write_rep base idx) val
)
mkBasicIndexedWrite offw (Just cast_to_mop) write_rep base idx val
= mkTemp write_rep `thenFlt` \ tmp ->
(returnFlt . CSequential) [
- CMachOpStmt (Just tmp) cast_to_mop [val] Nothing,
- CMachOpStmt Nothing (MO_WriteOSBI offw write_rep) [base,idx,tmp] Nothing
+ CMachOpStmt tmp cast_to_mop [val] Nothing,
+ CAssign (mk_OSBI_ref offw write_rep base idx) tmp
]
= mkTemp cast_arg1_to `thenFlt` \ arg1casted ->
(returnFlt . CSequential) [
CAssign arg1casted arg1,
- CMachOpStmt (Just res) mop [arg1casted,arg2]
+ CMachOpStmt res mop [arg1casted,arg2]
(if isDefinitelyInlineMachOp mop then Nothing else Just vols)
]
= mkTemps [IntRep, IntRep] `thenFlt` \ [t1,t2] ->
returnFlt (
CSequential [
- CMachOpStmt (Just t1) MO_Nat_Shl
+ CMachOpStmt t1 MO_Nat_Shl
[CBytesPerWord, CLit (mkMachInt 3)] Nothing,
- CMachOpStmt (Just t2) MO_Nat_Sub
+ CMachOpStmt t2 MO_Nat_Sub
[t1, CLit (mkMachInt 1)] Nothing
],
t2
= mkTemps [IntRep,IntRep,IntRep,IntRep] `thenFlt` \ [t1,t2,t3,t4] ->
getBitsPerWordMinus1 `thenFlt` \ (bpw1_code,bpw1_t) ->
(returnFlt . CSequential) [
- CMachOpStmt (Just res_r) MO_Nat_Add [aa,bb] Nothing,
- CMachOpStmt (Just t1) MO_Nat_Xor [aa,bb] Nothing,
- CMachOpStmt (Just t2) MO_Nat_Not [t1] Nothing,
- CMachOpStmt (Just t3) MO_Nat_Xor [aa,res_r] Nothing,
- CMachOpStmt (Just t4) MO_Nat_And [t2,t3] Nothing,
+ CMachOpStmt res_r MO_Nat_Add [aa,bb] Nothing,
+ CMachOpStmt t1 MO_Nat_Xor [aa,bb] Nothing,
+ CMachOpStmt t2 MO_Nat_Not [t1] Nothing,
+ CMachOpStmt t3 MO_Nat_Xor [aa,res_r] Nothing,
+ CMachOpStmt t4 MO_Nat_And [t2,t3] Nothing,
bpw1_code,
- CMachOpStmt (Just res_c) MO_Nat_Shr [t4, bpw1_t] Nothing
+ CMachOpStmt res_c MO_Nat_Shr [t4, bpw1_t] Nothing
]
= mkTemps [IntRep,IntRep,IntRep] `thenFlt` \ [t1,t2,t3] ->
getBitsPerWordMinus1 `thenFlt` \ (bpw1_code,bpw1_t) ->
(returnFlt . CSequential) [
- CMachOpStmt (Just res_r) MO_Nat_Sub [aa,bb] Nothing,
- CMachOpStmt (Just t1) MO_Nat_Xor [aa,bb] Nothing,
- CMachOpStmt (Just t2) MO_Nat_Xor [aa,res_r] Nothing,
- CMachOpStmt (Just t3) MO_Nat_And [t1,t2] Nothing,
+ CMachOpStmt res_r MO_Nat_Sub [aa,bb] Nothing,
+ CMachOpStmt t1 MO_Nat_Xor [aa,bb] Nothing,
+ CMachOpStmt t2 MO_Nat_Xor [aa,res_r] Nothing,
+ CMachOpStmt t3 MO_Nat_And [t1,t2] Nothing,
bpw1_code,
- CMachOpStmt (Just res_c) MO_Nat_Shr [t3, bpw1_t] Nothing
+ CMachOpStmt res_c MO_Nat_Shr [t3, bpw1_t] Nothing
]
= mkTemp WordRep `thenFlt` \ w ->
(returnFlt . CSequential) [
CAssign w (mkDerefOff WordRep arg fixedHdrSize),
- CMachOpStmt (Just w)
- MO_NatU_Mul [w, CBytesPerWord] (Just vols),
+ CMachOpStmt w MO_NatU_Mul [w, CBytesPerWord] (Just vols),
CAssign res w
]
dscCOpStmt [res] ByteArrayContents_Char [arg] vols
= mkTemp PtrRep `thenFlt` \ ptr ->
(returnFlt . CSequential) [
- CMachOpStmt (Just ptr) MO_NatU_to_NatP [arg] Nothing,
+ CMachOpStmt ptr MO_NatU_to_NatP [arg] Nothing,
CAssign ptr (mkNoDerefOff WordRep ptr arrWordsHdrSize),
CAssign res ptr
]
(returnFlt . CSequential) [
CAssign sn1 (mkDerefOff WordRep arg1 fixedHdrSize),
CAssign sn2 (mkDerefOff WordRep arg2 fixedHdrSize),
- CMachOpStmt (Just res) MO_Nat_Eq [sn1,sn2] Nothing
+ CMachOpStmt res MO_Nat_Eq [sn1,sn2] Nothing
]
-- #define addrToHValuezh(r,a) r=(P_)a
dscCOpStmt [r] AddrRemOp [a1,a2] vols
= mkTemp WordRep `thenFlt` \ a1casted ->
(returnFlt . CSequential) [
- CMachOpStmt (Just a1casted) MO_NatP_to_NatU [a1] Nothing,
- CMachOpStmt (Just r) MO_NatU_Rem [a1casted,a2] Nothing
+ CMachOpStmt a1casted MO_NatP_to_NatU [a1] Nothing,
+ CMachOpStmt r MO_NatU_Rem [a1casted,a2] Nothing
]
-- not handled by translateOp because they need casts
-- Native word signless ops
-translateOp [r] IntAddOp [a1,a2] = Just (Just r, MO_Nat_Add, [a1,a2])
-translateOp [r] IntSubOp [a1,a2] = Just (Just r, MO_Nat_Sub, [a1,a2])
-translateOp [r] WordAddOp [a1,a2] = Just (Just r, MO_Nat_Add, [a1,a2])
-translateOp [r] WordSubOp [a1,a2] = Just (Just r, MO_Nat_Sub, [a1,a2])
-translateOp [r] AddrAddOp [a1,a2] = Just (Just r, MO_Nat_Add, [a1,a2])
-translateOp [r] AddrSubOp [a1,a2] = Just (Just r, MO_Nat_Sub, [a1,a2])
-
-translateOp [r] IntEqOp [a1,a2] = Just (Just r, MO_Nat_Eq, [a1,a2])
-translateOp [r] IntNeOp [a1,a2] = Just (Just r, MO_Nat_Ne, [a1,a2])
-translateOp [r] WordEqOp [a1,a2] = Just (Just r, MO_Nat_Eq, [a1,a2])
-translateOp [r] WordNeOp [a1,a2] = Just (Just r, MO_Nat_Ne, [a1,a2])
-translateOp [r] AddrEqOp [a1,a2] = Just (Just r, MO_Nat_Eq, [a1,a2])
-translateOp [r] AddrNeOp [a1,a2] = Just (Just r, MO_Nat_Ne, [a1,a2])
-
-translateOp [r] AndOp [a1,a2] = Just (Just r, MO_Nat_And, [a1,a2])
-translateOp [r] OrOp [a1,a2] = Just (Just r, MO_Nat_Or, [a1,a2])
-translateOp [r] XorOp [a1,a2] = Just (Just r, MO_Nat_Xor, [a1,a2])
-translateOp [r] NotOp [a1] = Just (Just r, MO_Nat_Not, [a1])
+translateOp [r] IntAddOp [a1,a2] = Just (r, MO_Nat_Add, [a1,a2])
+translateOp [r] IntSubOp [a1,a2] = Just (r, MO_Nat_Sub, [a1,a2])
+translateOp [r] WordAddOp [a1,a2] = Just (r, MO_Nat_Add, [a1,a2])
+translateOp [r] WordSubOp [a1,a2] = Just (r, MO_Nat_Sub, [a1,a2])
+translateOp [r] AddrAddOp [a1,a2] = Just (r, MO_Nat_Add, [a1,a2])
+translateOp [r] AddrSubOp [a1,a2] = Just (r, MO_Nat_Sub, [a1,a2])
+
+translateOp [r] IntEqOp [a1,a2] = Just (r, MO_Nat_Eq, [a1,a2])
+translateOp [r] IntNeOp [a1,a2] = Just (r, MO_Nat_Ne, [a1,a2])
+translateOp [r] WordEqOp [a1,a2] = Just (r, MO_Nat_Eq, [a1,a2])
+translateOp [r] WordNeOp [a1,a2] = Just (r, MO_Nat_Ne, [a1,a2])
+translateOp [r] AddrEqOp [a1,a2] = Just (r, MO_Nat_Eq, [a1,a2])
+translateOp [r] AddrNeOp [a1,a2] = Just (r, MO_Nat_Ne, [a1,a2])
+
+translateOp [r] AndOp [a1,a2] = Just (r, MO_Nat_And, [a1,a2])
+translateOp [r] OrOp [a1,a2] = Just (r, MO_Nat_Or, [a1,a2])
+translateOp [r] XorOp [a1,a2] = Just (r, MO_Nat_Xor, [a1,a2])
+translateOp [r] NotOp [a1] = Just (r, MO_Nat_Not, [a1])
-- Native word signed ops
-translateOp [r] IntMulOp [a1,a2] = Just (Just r, MO_NatS_Mul, [a1,a2])
-translateOp [r] IntMulMayOfloOp [a1,a2] = Just (Just r, MO_NatS_MulMayOflo, [a1,a2])
-translateOp [r] IntQuotOp [a1,a2] = Just (Just r, MO_NatS_Quot, [a1,a2])
-translateOp [r] IntRemOp [a1,a2] = Just (Just r, MO_NatS_Rem, [a1,a2])
-translateOp [r] IntNegOp [a1] = Just (Just r, MO_NatS_Neg, [a1])
+translateOp [r] IntMulOp [a1,a2] = Just (r, MO_NatS_Mul, [a1,a2])
+translateOp [r] IntMulMayOfloOp [a1,a2] = Just (r, MO_NatS_MulMayOflo, [a1,a2])
+translateOp [r] IntQuotOp [a1,a2] = Just (r, MO_NatS_Quot, [a1,a2])
+translateOp [r] IntRemOp [a1,a2] = Just (r, MO_NatS_Rem, [a1,a2])
+translateOp [r] IntNegOp [a1] = Just (r, MO_NatS_Neg, [a1])
-translateOp [r] IntGeOp [a1,a2] = Just (Just r, MO_NatS_Ge, [a1,a2])
-translateOp [r] IntLeOp [a1,a2] = Just (Just r, MO_NatS_Le, [a1,a2])
-translateOp [r] IntGtOp [a1,a2] = Just (Just r, MO_NatS_Gt, [a1,a2])
-translateOp [r] IntLtOp [a1,a2] = Just (Just r, MO_NatS_Lt, [a1,a2])
+translateOp [r] IntGeOp [a1,a2] = Just (r, MO_NatS_Ge, [a1,a2])
+translateOp [r] IntLeOp [a1,a2] = Just (r, MO_NatS_Le, [a1,a2])
+translateOp [r] IntGtOp [a1,a2] = Just (r, MO_NatS_Gt, [a1,a2])
+translateOp [r] IntLtOp [a1,a2] = Just (r, MO_NatS_Lt, [a1,a2])
-- Native word unsigned ops
-translateOp [r] WordGeOp [a1,a2] = Just (Just r, MO_NatU_Ge, [a1,a2])
-translateOp [r] WordLeOp [a1,a2] = Just (Just r, MO_NatU_Le, [a1,a2])
-translateOp [r] WordGtOp [a1,a2] = Just (Just r, MO_NatU_Gt, [a1,a2])
-translateOp [r] WordLtOp [a1,a2] = Just (Just r, MO_NatU_Lt, [a1,a2])
+translateOp [r] WordGeOp [a1,a2] = Just (r, MO_NatU_Ge, [a1,a2])
+translateOp [r] WordLeOp [a1,a2] = Just (r, MO_NatU_Le, [a1,a2])
+translateOp [r] WordGtOp [a1,a2] = Just (r, MO_NatU_Gt, [a1,a2])
+translateOp [r] WordLtOp [a1,a2] = Just (r, MO_NatU_Lt, [a1,a2])
-translateOp [r] WordMulOp [a1,a2] = Just (Just r, MO_NatU_Mul, [a1,a2])
-translateOp [r] WordQuotOp [a1,a2] = Just (Just r, MO_NatU_Quot, [a1,a2])
-translateOp [r] WordRemOp [a1,a2] = Just (Just r, MO_NatU_Rem, [a1,a2])
+translateOp [r] WordMulOp [a1,a2] = Just (r, MO_NatU_Mul, [a1,a2])
+translateOp [r] WordQuotOp [a1,a2] = Just (r, MO_NatU_Quot, [a1,a2])
+translateOp [r] WordRemOp [a1,a2] = Just (r, MO_NatU_Rem, [a1,a2])
-translateOp [r] AddrGeOp [a1,a2] = Just (Just r, MO_NatU_Ge, [a1,a2])
-translateOp [r] AddrLeOp [a1,a2] = Just (Just r, MO_NatU_Le, [a1,a2])
-translateOp [r] AddrGtOp [a1,a2] = Just (Just r, MO_NatU_Gt, [a1,a2])
-translateOp [r] AddrLtOp [a1,a2] = Just (Just r, MO_NatU_Lt, [a1,a2])
+translateOp [r] AddrGeOp [a1,a2] = Just (r, MO_NatU_Ge, [a1,a2])
+translateOp [r] AddrLeOp [a1,a2] = Just (r, MO_NatU_Le, [a1,a2])
+translateOp [r] AddrGtOp [a1,a2] = Just (r, MO_NatU_Gt, [a1,a2])
+translateOp [r] AddrLtOp [a1,a2] = Just (r, MO_NatU_Lt, [a1,a2])
-- 32-bit unsigned ops
-translateOp [r] CharEqOp [a1,a2] = Just (Just r, MO_32U_Eq, [a1,a2])
-translateOp [r] CharNeOp [a1,a2] = Just (Just r, MO_32U_Ne, [a1,a2])
-translateOp [r] CharGeOp [a1,a2] = Just (Just r, MO_32U_Ge, [a1,a2])
-translateOp [r] CharLeOp [a1,a2] = Just (Just r, MO_32U_Le, [a1,a2])
-translateOp [r] CharGtOp [a1,a2] = Just (Just r, MO_32U_Gt, [a1,a2])
-translateOp [r] CharLtOp [a1,a2] = Just (Just r, MO_32U_Lt, [a1,a2])
+translateOp [r] CharEqOp [a1,a2] = Just (r, MO_32U_Eq, [a1,a2])
+translateOp [r] CharNeOp [a1,a2] = Just (r, MO_32U_Ne, [a1,a2])
+translateOp [r] CharGeOp [a1,a2] = Just (r, MO_32U_Ge, [a1,a2])
+translateOp [r] CharLeOp [a1,a2] = Just (r, MO_32U_Le, [a1,a2])
+translateOp [r] CharGtOp [a1,a2] = Just (r, MO_32U_Gt, [a1,a2])
+translateOp [r] CharLtOp [a1,a2] = Just (r, MO_32U_Lt, [a1,a2])
-- Double ops
-translateOp [r] DoubleEqOp [a1,a2] = Just (Just r, MO_Dbl_Eq, [a1,a2])
-translateOp [r] DoubleNeOp [a1,a2] = Just (Just r, MO_Dbl_Ne, [a1,a2])
-translateOp [r] DoubleGeOp [a1,a2] = Just (Just r, MO_Dbl_Ge, [a1,a2])
-translateOp [r] DoubleLeOp [a1,a2] = Just (Just r, MO_Dbl_Le, [a1,a2])
-translateOp [r] DoubleGtOp [a1,a2] = Just (Just r, MO_Dbl_Gt, [a1,a2])
-translateOp [r] DoubleLtOp [a1,a2] = Just (Just r, MO_Dbl_Lt, [a1,a2])
-
-translateOp [r] DoubleAddOp [a1,a2] = Just (Just r, MO_Dbl_Add, [a1,a2])
-translateOp [r] DoubleSubOp [a1,a2] = Just (Just r, MO_Dbl_Sub, [a1,a2])
-translateOp [r] DoubleMulOp [a1,a2] = Just (Just r, MO_Dbl_Mul, [a1,a2])
-translateOp [r] DoubleDivOp [a1,a2] = Just (Just r, MO_Dbl_Div, [a1,a2])
-translateOp [r] DoublePowerOp [a1,a2] = Just (Just r, MO_Dbl_Pwr, [a1,a2])
-
-translateOp [r] DoubleSinOp [a1] = Just (Just r, MO_Dbl_Sin, [a1])
-translateOp [r] DoubleCosOp [a1] = Just (Just r, MO_Dbl_Cos, [a1])
-translateOp [r] DoubleTanOp [a1] = Just (Just r, MO_Dbl_Tan, [a1])
-translateOp [r] DoubleSinhOp [a1] = Just (Just r, MO_Dbl_Sinh, [a1])
-translateOp [r] DoubleCoshOp [a1] = Just (Just r, MO_Dbl_Cosh, [a1])
-translateOp [r] DoubleTanhOp [a1] = Just (Just r, MO_Dbl_Tanh, [a1])
-translateOp [r] DoubleAsinOp [a1] = Just (Just r, MO_Dbl_Asin, [a1])
-translateOp [r] DoubleAcosOp [a1] = Just (Just r, MO_Dbl_Acos, [a1])
-translateOp [r] DoubleAtanOp [a1] = Just (Just r, MO_Dbl_Atan, [a1])
-translateOp [r] DoubleLogOp [a1] = Just (Just r, MO_Dbl_Log, [a1])
-translateOp [r] DoubleExpOp [a1] = Just (Just r, MO_Dbl_Exp, [a1])
-translateOp [r] DoubleSqrtOp [a1] = Just (Just r, MO_Dbl_Sqrt, [a1])
-translateOp [r] DoubleNegOp [a1] = Just (Just r, MO_Dbl_Neg, [a1])
+translateOp [r] DoubleEqOp [a1,a2] = Just (r, MO_Dbl_Eq, [a1,a2])
+translateOp [r] DoubleNeOp [a1,a2] = Just (r, MO_Dbl_Ne, [a1,a2])
+translateOp [r] DoubleGeOp [a1,a2] = Just (r, MO_Dbl_Ge, [a1,a2])
+translateOp [r] DoubleLeOp [a1,a2] = Just (r, MO_Dbl_Le, [a1,a2])
+translateOp [r] DoubleGtOp [a1,a2] = Just (r, MO_Dbl_Gt, [a1,a2])
+translateOp [r] DoubleLtOp [a1,a2] = Just (r, MO_Dbl_Lt, [a1,a2])
+
+translateOp [r] DoubleAddOp [a1,a2] = Just (r, MO_Dbl_Add, [a1,a2])
+translateOp [r] DoubleSubOp [a1,a2] = Just (r, MO_Dbl_Sub, [a1,a2])
+translateOp [r] DoubleMulOp [a1,a2] = Just (r, MO_Dbl_Mul, [a1,a2])
+translateOp [r] DoubleDivOp [a1,a2] = Just (r, MO_Dbl_Div, [a1,a2])
+translateOp [r] DoublePowerOp [a1,a2] = Just (r, MO_Dbl_Pwr, [a1,a2])
+
+translateOp [r] DoubleSinOp [a1] = Just (r, MO_Dbl_Sin, [a1])
+translateOp [r] DoubleCosOp [a1] = Just (r, MO_Dbl_Cos, [a1])
+translateOp [r] DoubleTanOp [a1] = Just (r, MO_Dbl_Tan, [a1])
+translateOp [r] DoubleSinhOp [a1] = Just (r, MO_Dbl_Sinh, [a1])
+translateOp [r] DoubleCoshOp [a1] = Just (r, MO_Dbl_Cosh, [a1])
+translateOp [r] DoubleTanhOp [a1] = Just (r, MO_Dbl_Tanh, [a1])
+translateOp [r] DoubleAsinOp [a1] = Just (r, MO_Dbl_Asin, [a1])
+translateOp [r] DoubleAcosOp [a1] = Just (r, MO_Dbl_Acos, [a1])
+translateOp [r] DoubleAtanOp [a1] = Just (r, MO_Dbl_Atan, [a1])
+translateOp [r] DoubleLogOp [a1] = Just (r, MO_Dbl_Log, [a1])
+translateOp [r] DoubleExpOp [a1] = Just (r, MO_Dbl_Exp, [a1])
+translateOp [r] DoubleSqrtOp [a1] = Just (r, MO_Dbl_Sqrt, [a1])
+translateOp [r] DoubleNegOp [a1] = Just (r, MO_Dbl_Neg, [a1])
-- Float ops
-translateOp [r] FloatEqOp [a1,a2] = Just (Just r, MO_Flt_Eq, [a1,a2])
-translateOp [r] FloatNeOp [a1,a2] = Just (Just r, MO_Flt_Ne, [a1,a2])
-translateOp [r] FloatGeOp [a1,a2] = Just (Just r, MO_Flt_Ge, [a1,a2])
-translateOp [r] FloatLeOp [a1,a2] = Just (Just r, MO_Flt_Le, [a1,a2])
-translateOp [r] FloatGtOp [a1,a2] = Just (Just r, MO_Flt_Gt, [a1,a2])
-translateOp [r] FloatLtOp [a1,a2] = Just (Just r, MO_Flt_Lt, [a1,a2])
-
-translateOp [r] FloatAddOp [a1,a2] = Just (Just r, MO_Flt_Add, [a1,a2])
-translateOp [r] FloatSubOp [a1,a2] = Just (Just r, MO_Flt_Sub, [a1,a2])
-translateOp [r] FloatMulOp [a1,a2] = Just (Just r, MO_Flt_Mul, [a1,a2])
-translateOp [r] FloatDivOp [a1,a2] = Just (Just r, MO_Flt_Div, [a1,a2])
-translateOp [r] FloatPowerOp [a1,a2] = Just (Just r, MO_Flt_Pwr, [a1,a2])
-
-translateOp [r] FloatSinOp [a1] = Just (Just r, MO_Flt_Sin, [a1])
-translateOp [r] FloatCosOp [a1] = Just (Just r, MO_Flt_Cos, [a1])
-translateOp [r] FloatTanOp [a1] = Just (Just r, MO_Flt_Tan, [a1])
-translateOp [r] FloatSinhOp [a1] = Just (Just r, MO_Flt_Sinh, [a1])
-translateOp [r] FloatCoshOp [a1] = Just (Just r, MO_Flt_Cosh, [a1])
-translateOp [r] FloatTanhOp [a1] = Just (Just r, MO_Flt_Tanh, [a1])
-translateOp [r] FloatAsinOp [a1] = Just (Just r, MO_Flt_Asin, [a1])
-translateOp [r] FloatAcosOp [a1] = Just (Just r, MO_Flt_Acos, [a1])
-translateOp [r] FloatAtanOp [a1] = Just (Just r, MO_Flt_Atan, [a1])
-translateOp [r] FloatLogOp [a1] = Just (Just r, MO_Flt_Log, [a1])
-translateOp [r] FloatExpOp [a1] = Just (Just r, MO_Flt_Exp, [a1])
-translateOp [r] FloatSqrtOp [a1] = Just (Just r, MO_Flt_Sqrt, [a1])
-translateOp [r] FloatNegOp [a1] = Just (Just r, MO_Flt_Neg, [a1])
+translateOp [r] FloatEqOp [a1,a2] = Just (r, MO_Flt_Eq, [a1,a2])
+translateOp [r] FloatNeOp [a1,a2] = Just (r, MO_Flt_Ne, [a1,a2])
+translateOp [r] FloatGeOp [a1,a2] = Just (r, MO_Flt_Ge, [a1,a2])
+translateOp [r] FloatLeOp [a1,a2] = Just (r, MO_Flt_Le, [a1,a2])
+translateOp [r] FloatGtOp [a1,a2] = Just (r, MO_Flt_Gt, [a1,a2])
+translateOp [r] FloatLtOp [a1,a2] = Just (r, MO_Flt_Lt, [a1,a2])
+
+translateOp [r] FloatAddOp [a1,a2] = Just (r, MO_Flt_Add, [a1,a2])
+translateOp [r] FloatSubOp [a1,a2] = Just (r, MO_Flt_Sub, [a1,a2])
+translateOp [r] FloatMulOp [a1,a2] = Just (r, MO_Flt_Mul, [a1,a2])
+translateOp [r] FloatDivOp [a1,a2] = Just (r, MO_Flt_Div, [a1,a2])
+translateOp [r] FloatPowerOp [a1,a2] = Just (r, MO_Flt_Pwr, [a1,a2])
+
+translateOp [r] FloatSinOp [a1] = Just (r, MO_Flt_Sin, [a1])
+translateOp [r] FloatCosOp [a1] = Just (r, MO_Flt_Cos, [a1])
+translateOp [r] FloatTanOp [a1] = Just (r, MO_Flt_Tan, [a1])
+translateOp [r] FloatSinhOp [a1] = Just (r, MO_Flt_Sinh, [a1])
+translateOp [r] FloatCoshOp [a1] = Just (r, MO_Flt_Cosh, [a1])
+translateOp [r] FloatTanhOp [a1] = Just (r, MO_Flt_Tanh, [a1])
+translateOp [r] FloatAsinOp [a1] = Just (r, MO_Flt_Asin, [a1])
+translateOp [r] FloatAcosOp [a1] = Just (r, MO_Flt_Acos, [a1])
+translateOp [r] FloatAtanOp [a1] = Just (r, MO_Flt_Atan, [a1])
+translateOp [r] FloatLogOp [a1] = Just (r, MO_Flt_Log, [a1])
+translateOp [r] FloatExpOp [a1] = Just (r, MO_Flt_Exp, [a1])
+translateOp [r] FloatSqrtOp [a1] = Just (r, MO_Flt_Sqrt, [a1])
+translateOp [r] FloatNegOp [a1] = Just (r, MO_Flt_Neg, [a1])
-- Conversions
-translateOp [r] Int2DoubleOp [a1] = Just (Just r, MO_NatS_to_Dbl, [a1])
-translateOp [r] Double2IntOp [a1] = Just (Just r, MO_Dbl_to_NatS, [a1])
+translateOp [r] Int2DoubleOp [a1] = Just (r, MO_NatS_to_Dbl, [a1])
+translateOp [r] Double2IntOp [a1] = Just (r, MO_Dbl_to_NatS, [a1])
-translateOp [r] Int2FloatOp [a1] = Just (Just r, MO_NatS_to_Flt, [a1])
-translateOp [r] Float2IntOp [a1] = Just (Just r, MO_Flt_to_NatS, [a1])
+translateOp [r] Int2FloatOp [a1] = Just (r, MO_NatS_to_Flt, [a1])
+translateOp [r] Float2IntOp [a1] = Just (r, MO_Flt_to_NatS, [a1])
-translateOp [r] Float2DoubleOp [a1] = Just (Just r, MO_Flt_to_Dbl, [a1])
-translateOp [r] Double2FloatOp [a1] = Just (Just r, MO_Dbl_to_Flt, [a1])
+translateOp [r] Float2DoubleOp [a1] = Just (r, MO_Flt_to_Dbl, [a1])
+translateOp [r] Double2FloatOp [a1] = Just (r, MO_Dbl_to_Flt, [a1])
-translateOp [r] Int2WordOp [a1] = Just (Just r, MO_NatS_to_NatU, [a1])
-translateOp [r] Word2IntOp [a1] = Just (Just r, MO_NatU_to_NatS, [a1])
+translateOp [r] Int2WordOp [a1] = Just (r, MO_NatS_to_NatU, [a1])
+translateOp [r] Word2IntOp [a1] = Just (r, MO_NatU_to_NatS, [a1])
-translateOp [r] Int2AddrOp [a1] = Just (Just r, MO_NatS_to_NatP, [a1])
-translateOp [r] Addr2IntOp [a1] = Just (Just r, MO_NatP_to_NatS, [a1])
+translateOp [r] Int2AddrOp [a1] = Just (r, MO_NatS_to_NatP, [a1])
+translateOp [r] Addr2IntOp [a1] = Just (r, MO_NatP_to_NatS, [a1])
-translateOp [r] OrdOp [a1] = Just (Just r, MO_32U_to_NatS, [a1])
-translateOp [r] ChrOp [a1] = Just (Just r, MO_NatS_to_32U, [a1])
+translateOp [r] OrdOp [a1] = Just (r, MO_32U_to_NatS, [a1])
+translateOp [r] ChrOp [a1] = Just (r, MO_NatS_to_32U, [a1])
-translateOp [r] Narrow8IntOp [a1] = Just (Just r, MO_8S_to_NatS, [a1])
-translateOp [r] Narrow16IntOp [a1] = Just (Just r, MO_16S_to_NatS, [a1])
-translateOp [r] Narrow32IntOp [a1] = Just (Just r, MO_32S_to_NatS, [a1])
+translateOp [r] Narrow8IntOp [a1] = Just (r, MO_8S_to_NatS, [a1])
+translateOp [r] Narrow16IntOp [a1] = Just (r, MO_16S_to_NatS, [a1])
+translateOp [r] Narrow32IntOp [a1] = Just (r, MO_32S_to_NatS, [a1])
-translateOp [r] Narrow8WordOp [a1] = Just (Just r, MO_8U_to_NatU, [a1])
-translateOp [r] Narrow16WordOp [a1] = Just (Just r, MO_16U_to_NatU, [a1])
-translateOp [r] Narrow32WordOp [a1] = Just (Just r, MO_32U_to_NatU, [a1])
+translateOp [r] Narrow8WordOp [a1] = Just (r, MO_8U_to_NatU, [a1])
+translateOp [r] Narrow16WordOp [a1] = Just (r, MO_16U_to_NatU, [a1])
+translateOp [r] Narrow32WordOp [a1] = Just (r, MO_32U_to_NatU, [a1])
-- Word comparisons masquerading as more exotic things.
-translateOp [r] SameMutVarOp [a1,a2] = Just (Just r, MO_Nat_Eq, [a1,a2])
-translateOp [r] SameMVarOp [a1,a2] = Just (Just r, MO_Nat_Eq, [a1,a2])
-translateOp [r] SameMutableArrayOp [a1,a2] = Just (Just r, MO_Nat_Eq, [a1,a2])
-translateOp [r] SameMutableByteArrayOp [a1,a2] = Just (Just r, MO_Nat_Eq, [a1,a2])
-translateOp [r] EqForeignObj [a1,a2] = Just (Just r, MO_Nat_Eq, [a1,a2])
-translateOp [r] EqStablePtrOp [a1,a2] = Just (Just r, MO_Nat_Eq, [a1,a2])
+translateOp [r] SameMutVarOp [a1,a2] = Just (r, MO_Nat_Eq, [a1,a2])
+translateOp [r] SameMVarOp [a1,a2] = Just (r, MO_Nat_Eq, [a1,a2])
+translateOp [r] SameMutableArrayOp [a1,a2] = Just (r, MO_Nat_Eq, [a1,a2])
+translateOp [r] SameMutableByteArrayOp [a1,a2] = Just (r, MO_Nat_Eq, [a1,a2])
+translateOp [r] EqForeignObj [a1,a2] = Just (r, MO_Nat_Eq, [a1,a2])
+translateOp [r] EqStablePtrOp [a1,a2] = Just (r, MO_Nat_Eq, [a1,a2])
translateOp _ _ _ = Nothing
isDefinitelyInlineMachOp,
isCommutableMachOp,
isComparisonMachOp,
- resultRepsOfMachOp
+ resultRepOfMachOp
)
where
| MO_8U_to_32U -- zero extend
| MO_32U_to_8U -- mask out all but lowest byte
- -- Reading/writing arrays
- | MO_ReadOSBI Int PrimRep -- args: [base_ptr, index_value]
- | MO_WriteOSBI Int PrimRep -- args: [base_ptr, index_value, value_to_write]
- -- Read/write a value :: the PrimRep
- -- at byte address
- -- sizeof(machine_word)*Int + base_ptr + sizeof(PrimRep)*index_value
deriving Eq
pprMachOp MO_8U_to_32U = text "MO_8U_to_32U"
pprMachOp MO_32U_to_8U = text "MO_32U_to_8U"
-pprMachOp (MO_ReadOSBI offset rep)
- = text "MO_ReadOSBI" <> parens (int offset <> comma <> ppr rep)
-pprMachOp (MO_WriteOSBI offset rep)
- = text "MO_WriteOSBI" <> parens (int offset <> comma <> ppr rep)
-
-- Non-exported helper enumeration:
isComparisonMachOp :: MachOp -> Bool
isComparisonMachOp mop = comp `elem` snd (machOpProps mop)
--- Find the PrimReps for the returned value(s) of the MachOp.
-resultRepsOfMachOp :: MachOp -> Maybe PrimRep
-resultRepsOfMachOp mop = fst (machOpProps mop)
+-- Find the PrimRep for the returned value of the MachOp.
+resultRepOfMachOp :: MachOp -> PrimRep
+resultRepOfMachOp mop = fst (machOpProps mop)
-- This bit does the real work.
-machOpProps :: MachOp -> (Maybe PrimRep, [MO_Prop])
-
-machOpProps MO_Nat_Add = (Just IntRep, [inline, comm])
-machOpProps MO_Nat_Sub = (Just IntRep, [inline])
-machOpProps MO_Nat_Eq = (Just IntRep, [inline, comp, comm])
-machOpProps MO_Nat_Ne = (Just IntRep, [inline, comp, comm])
-
-machOpProps MO_NatS_Ge = (Just IntRep, [inline, comp])
-machOpProps MO_NatS_Le = (Just IntRep, [inline, comp])
-machOpProps MO_NatS_Gt = (Just IntRep, [inline, comp])
-machOpProps MO_NatS_Lt = (Just IntRep, [inline, comp])
-
-machOpProps MO_NatU_Ge = (Just IntRep, [inline, comp])
-machOpProps MO_NatU_Le = (Just IntRep, [inline, comp])
-machOpProps MO_NatU_Gt = (Just IntRep, [inline, comp])
-machOpProps MO_NatU_Lt = (Just IntRep, [inline, comp])
-
-machOpProps MO_NatS_Mul = (Just IntRep, [inline, comm])
-machOpProps MO_NatS_MulMayOflo = (Just IntRep, [inline, comm])
-machOpProps MO_NatS_Quot = (Just IntRep, [inline])
-machOpProps MO_NatS_Rem = (Just IntRep, [inline])
-machOpProps MO_NatS_Neg = (Just IntRep, [inline])
-
-machOpProps MO_NatU_Mul = (Just WordRep, [inline, comm])
-machOpProps MO_NatU_Quot = (Just WordRep, [inline])
-machOpProps MO_NatU_Rem = (Just WordRep, [inline])
-
-machOpProps MO_Nat_And = (Just IntRep, [inline, comm])
-machOpProps MO_Nat_Or = (Just IntRep, [inline, comm])
-machOpProps MO_Nat_Xor = (Just IntRep, [inline, comm])
-machOpProps MO_Nat_Not = (Just IntRep, [inline])
-machOpProps MO_Nat_Shl = (Just IntRep, [inline])
-machOpProps MO_Nat_Shr = (Just IntRep, [inline])
-machOpProps MO_Nat_Sar = (Just IntRep, [inline])
-
-machOpProps MO_32U_Eq = (Just IntRep, [inline, comp, comm])
-machOpProps MO_32U_Ne = (Just IntRep, [inline, comp, comm])
-machOpProps MO_32U_Ge = (Just IntRep, [inline, comp])
-machOpProps MO_32U_Le = (Just IntRep, [inline, comp])
-machOpProps MO_32U_Gt = (Just IntRep, [inline, comp])
-machOpProps MO_32U_Lt = (Just IntRep, [inline, comp])
-
-machOpProps MO_Dbl_Eq = (Just IntRep, [inline, comp, comm])
-machOpProps MO_Dbl_Ne = (Just IntRep, [inline, comp, comm])
-machOpProps MO_Dbl_Ge = (Just IntRep, [inline, comp])
-machOpProps MO_Dbl_Le = (Just IntRep, [inline, comp])
-machOpProps MO_Dbl_Gt = (Just IntRep, [inline, comp])
-machOpProps MO_Dbl_Lt = (Just IntRep, [inline, comp])
-
-machOpProps MO_Dbl_Add = (Just DoubleRep, [inline, comm])
-machOpProps MO_Dbl_Sub = (Just DoubleRep, [inline])
-machOpProps MO_Dbl_Mul = (Just DoubleRep, [inline, comm])
-machOpProps MO_Dbl_Div = (Just DoubleRep, [inline])
-machOpProps MO_Dbl_Pwr = (Just DoubleRep, [])
-
-machOpProps MO_Dbl_Sin = (Just DoubleRep, [])
-machOpProps MO_Dbl_Cos = (Just DoubleRep, [])
-machOpProps MO_Dbl_Tan = (Just DoubleRep, [])
-machOpProps MO_Dbl_Sinh = (Just DoubleRep, [])
-machOpProps MO_Dbl_Cosh = (Just DoubleRep, [])
-machOpProps MO_Dbl_Tanh = (Just DoubleRep, [])
-machOpProps MO_Dbl_Asin = (Just DoubleRep, [])
-machOpProps MO_Dbl_Acos = (Just DoubleRep, [])
-machOpProps MO_Dbl_Atan = (Just DoubleRep, [])
-machOpProps MO_Dbl_Log = (Just DoubleRep, [])
-machOpProps MO_Dbl_Exp = (Just DoubleRep, [])
-machOpProps MO_Dbl_Sqrt = (Just DoubleRep, [])
-machOpProps MO_Dbl_Neg = (Just DoubleRep, [inline])
-
-machOpProps MO_Flt_Add = (Just FloatRep, [inline, comm])
-machOpProps MO_Flt_Sub = (Just FloatRep, [inline])
-machOpProps MO_Flt_Mul = (Just FloatRep, [inline, comm])
-machOpProps MO_Flt_Div = (Just FloatRep, [inline])
-machOpProps MO_Flt_Pwr = (Just FloatRep, [])
-
-machOpProps MO_Flt_Eq = (Just IntRep, [inline, comp, comm])
-machOpProps MO_Flt_Ne = (Just IntRep, [inline, comp, comm])
-machOpProps MO_Flt_Ge = (Just IntRep, [inline, comp])
-machOpProps MO_Flt_Le = (Just IntRep, [inline, comp])
-machOpProps MO_Flt_Gt = (Just IntRep, [inline, comp])
-machOpProps MO_Flt_Lt = (Just IntRep, [inline, comp])
-
-machOpProps MO_Flt_Sin = (Just FloatRep, [])
-machOpProps MO_Flt_Cos = (Just FloatRep, [])
-machOpProps MO_Flt_Tan = (Just FloatRep, [])
-machOpProps MO_Flt_Sinh = (Just FloatRep, [])
-machOpProps MO_Flt_Cosh = (Just FloatRep, [])
-machOpProps MO_Flt_Tanh = (Just FloatRep, [])
-machOpProps MO_Flt_Asin = (Just FloatRep, [])
-machOpProps MO_Flt_Acos = (Just FloatRep, [])
-machOpProps MO_Flt_Atan = (Just FloatRep, [])
-machOpProps MO_Flt_Log = (Just FloatRep, [])
-machOpProps MO_Flt_Exp = (Just FloatRep, [])
-machOpProps MO_Flt_Sqrt = (Just FloatRep, [])
-machOpProps MO_Flt_Neg = (Just FloatRep, [inline])
-
-machOpProps MO_32U_to_NatS = (Just IntRep, [inline])
-machOpProps MO_NatS_to_32U = (Just Word32Rep, [inline])
-
-machOpProps MO_NatS_to_Dbl = (Just DoubleRep, [inline])
-machOpProps MO_Dbl_to_NatS = (Just IntRep, [inline])
-
-machOpProps MO_NatS_to_Flt = (Just FloatRep, [inline])
-machOpProps MO_Flt_to_NatS = (Just IntRep, [inline])
-
-machOpProps MO_NatS_to_NatU = (Just WordRep, [inline])
-machOpProps MO_NatU_to_NatS = (Just IntRep, [inline])
-
-machOpProps MO_NatS_to_NatP = (Just PtrRep, [inline])
-machOpProps MO_NatP_to_NatS = (Just IntRep, [inline])
-machOpProps MO_NatU_to_NatP = (Just PtrRep, [inline])
-machOpProps MO_NatP_to_NatU = (Just WordRep, [inline])
-
-machOpProps MO_Dbl_to_Flt = (Just FloatRep, [inline])
-machOpProps MO_Flt_to_Dbl = (Just DoubleRep, [inline])
-
-machOpProps MO_8S_to_NatS = (Just IntRep, [inline])
-machOpProps MO_16S_to_NatS = (Just IntRep, [inline])
-machOpProps MO_32S_to_NatS = (Just IntRep, [inline])
-
-machOpProps MO_8U_to_NatU = (Just WordRep, [inline])
-machOpProps MO_16U_to_NatU = (Just WordRep, [inline])
-machOpProps MO_32U_to_NatU = (Just WordRep, [inline])
-
-machOpProps MO_8U_to_32U = (Just Word32Rep, [inline])
-machOpProps MO_32U_to_8U = (Just Word8Rep, [inline])
-
-machOpProps (MO_ReadOSBI offset rep) = (Just rep, [inline])
-machOpProps (MO_WriteOSBI offset rep) = (Nothing, [inline])
+machOpProps :: MachOp -> (PrimRep, [MO_Prop])
+
+machOpProps MO_Nat_Add = (IntRep, [inline, comm])
+machOpProps MO_Nat_Sub = (IntRep, [inline])
+machOpProps MO_Nat_Eq = (IntRep, [inline, comp, comm])
+machOpProps MO_Nat_Ne = (IntRep, [inline, comp, comm])
+
+machOpProps MO_NatS_Ge = (IntRep, [inline, comp])
+machOpProps MO_NatS_Le = (IntRep, [inline, comp])
+machOpProps MO_NatS_Gt = (IntRep, [inline, comp])
+machOpProps MO_NatS_Lt = (IntRep, [inline, comp])
+
+machOpProps MO_NatU_Ge = (IntRep, [inline, comp])
+machOpProps MO_NatU_Le = (IntRep, [inline, comp])
+machOpProps MO_NatU_Gt = (IntRep, [inline, comp])
+machOpProps MO_NatU_Lt = (IntRep, [inline, comp])
+
+machOpProps MO_NatS_Mul = (IntRep, [inline, comm])
+machOpProps MO_NatS_MulMayOflo = (IntRep, [inline, comm])
+machOpProps MO_NatS_Quot = (IntRep, [inline])
+machOpProps MO_NatS_Rem = (IntRep, [inline])
+machOpProps MO_NatS_Neg = (IntRep, [inline])
+
+machOpProps MO_NatU_Mul = (WordRep, [inline, comm])
+machOpProps MO_NatU_Quot = (WordRep, [inline])
+machOpProps MO_NatU_Rem = (WordRep, [inline])
+
+machOpProps MO_Nat_And = (IntRep, [inline, comm])
+machOpProps MO_Nat_Or = (IntRep, [inline, comm])
+machOpProps MO_Nat_Xor = (IntRep, [inline, comm])
+machOpProps MO_Nat_Not = (IntRep, [inline])
+machOpProps MO_Nat_Shl = (IntRep, [inline])
+machOpProps MO_Nat_Shr = (IntRep, [inline])
+machOpProps MO_Nat_Sar = (IntRep, [inline])
+
+machOpProps MO_32U_Eq = (IntRep, [inline, comp, comm])
+machOpProps MO_32U_Ne = (IntRep, [inline, comp, comm])
+machOpProps MO_32U_Ge = (IntRep, [inline, comp])
+machOpProps MO_32U_Le = (IntRep, [inline, comp])
+machOpProps MO_32U_Gt = (IntRep, [inline, comp])
+machOpProps MO_32U_Lt = (IntRep, [inline, comp])
+
+machOpProps MO_Dbl_Eq = (IntRep, [inline, comp, comm])
+machOpProps MO_Dbl_Ne = (IntRep, [inline, comp, comm])
+machOpProps MO_Dbl_Ge = (IntRep, [inline, comp])
+machOpProps MO_Dbl_Le = (IntRep, [inline, comp])
+machOpProps MO_Dbl_Gt = (IntRep, [inline, comp])
+machOpProps MO_Dbl_Lt = (IntRep, [inline, comp])
+
+machOpProps MO_Dbl_Add = (DoubleRep, [inline, comm])
+machOpProps MO_Dbl_Sub = (DoubleRep, [inline])
+machOpProps MO_Dbl_Mul = (DoubleRep, [inline, comm])
+machOpProps MO_Dbl_Div = (DoubleRep, [inline])
+machOpProps MO_Dbl_Pwr = (DoubleRep, [])
+
+machOpProps MO_Dbl_Sin = (DoubleRep, [])
+machOpProps MO_Dbl_Cos = (DoubleRep, [])
+machOpProps MO_Dbl_Tan = (DoubleRep, [])
+machOpProps MO_Dbl_Sinh = (DoubleRep, [])
+machOpProps MO_Dbl_Cosh = (DoubleRep, [])
+machOpProps MO_Dbl_Tanh = (DoubleRep, [])
+machOpProps MO_Dbl_Asin = (DoubleRep, [])
+machOpProps MO_Dbl_Acos = (DoubleRep, [])
+machOpProps MO_Dbl_Atan = (DoubleRep, [])
+machOpProps MO_Dbl_Log = (DoubleRep, [])
+machOpProps MO_Dbl_Exp = (DoubleRep, [])
+machOpProps MO_Dbl_Sqrt = (DoubleRep, [])
+machOpProps MO_Dbl_Neg = (DoubleRep, [inline])
+
+machOpProps MO_Flt_Add = (FloatRep, [inline, comm])
+machOpProps MO_Flt_Sub = (FloatRep, [inline])
+machOpProps MO_Flt_Mul = (FloatRep, [inline, comm])
+machOpProps MO_Flt_Div = (FloatRep, [inline])
+machOpProps MO_Flt_Pwr = (FloatRep, [])
+
+machOpProps MO_Flt_Eq = (IntRep, [inline, comp, comm])
+machOpProps MO_Flt_Ne = (IntRep, [inline, comp, comm])
+machOpProps MO_Flt_Ge = (IntRep, [inline, comp])
+machOpProps MO_Flt_Le = (IntRep, [inline, comp])
+machOpProps MO_Flt_Gt = (IntRep, [inline, comp])
+machOpProps MO_Flt_Lt = (IntRep, [inline, comp])
+
+machOpProps MO_Flt_Sin = (FloatRep, [])
+machOpProps MO_Flt_Cos = (FloatRep, [])
+machOpProps MO_Flt_Tan = (FloatRep, [])
+machOpProps MO_Flt_Sinh = (FloatRep, [])
+machOpProps MO_Flt_Cosh = (FloatRep, [])
+machOpProps MO_Flt_Tanh = (FloatRep, [])
+machOpProps MO_Flt_Asin = (FloatRep, [])
+machOpProps MO_Flt_Acos = (FloatRep, [])
+machOpProps MO_Flt_Atan = (FloatRep, [])
+machOpProps MO_Flt_Log = (FloatRep, [])
+machOpProps MO_Flt_Exp = (FloatRep, [])
+machOpProps MO_Flt_Sqrt = (FloatRep, [])
+machOpProps MO_Flt_Neg = (FloatRep, [inline])
+
+machOpProps MO_32U_to_NatS = (IntRep, [inline])
+machOpProps MO_NatS_to_32U = (Word32Rep, [inline])
+
+machOpProps MO_NatS_to_Dbl = (DoubleRep, [inline])
+machOpProps MO_Dbl_to_NatS = (IntRep, [inline])
+
+machOpProps MO_NatS_to_Flt = (FloatRep, [inline])
+machOpProps MO_Flt_to_NatS = (IntRep, [inline])
+
+machOpProps MO_NatS_to_NatU = (WordRep, [inline])
+machOpProps MO_NatU_to_NatS = (IntRep, [inline])
+
+machOpProps MO_NatS_to_NatP = (PtrRep, [inline])
+machOpProps MO_NatP_to_NatS = (IntRep, [inline])
+machOpProps MO_NatU_to_NatP = (PtrRep, [inline])
+machOpProps MO_NatP_to_NatU = (WordRep, [inline])
+
+machOpProps MO_Dbl_to_Flt = (FloatRep, [inline])
+machOpProps MO_Flt_to_Dbl = (DoubleRep, [inline])
+
+machOpProps MO_8S_to_NatS = (IntRep, [inline])
+machOpProps MO_16S_to_NatS = (IntRep, [inline])
+machOpProps MO_32S_to_NatS = (IntRep, [inline])
+
+machOpProps MO_8U_to_NatU = (WordRep, [inline])
+machOpProps MO_16U_to_NatU = (WordRep, [inline])
+machOpProps MO_32U_to_NatU = (WordRep, [inline])
+
+machOpProps MO_8U_to_32U = (Word32Rep, [inline])
+machOpProps MO_32U_to_8U = (Word8Rep, [inline])