isDefinitelyInlineMachOp,
isCommutableMachOp,
isComparisonMachOp,
- resultRepsOfMachOp
+ resultRepOfMachOp
)
where
#include "HsVersions.h"
import PrimRep ( PrimRep(..) )
-import Maybes ( Maybe012(..) )
import Outputable
Nomenclature: all ops indicate width and signedness, where
appropriate. Widths: 8/16/32/64 means the given size, obviously.
- Nat means the native word size. Signedness: S means signed, U
- means unsigned. For operations where signedness is irrelevant or
- makes no difference (for example integer add), the signedness
- component is omitted.
+ Nat means the operation works on STG word sized objects.
+ Signedness: S means signed, U means unsigned. For operations where
+ signedness is irrelevant or makes no difference (for example
+ integer add), the signedness component is omitted.
An exception: NatP is a ptr-typed native word. From the point of
view of the native code generators this distinction is irrelevant,
| MO_NatU_Gt
| MO_NatU_Lt
- | MO_NatS_Mul -- signed *
+ | MO_NatS_Mul -- low word of signed *
+ | MO_NatS_MulMayOflo -- nonzero if high word of signed * might contain useful info
| MO_NatS_Quot -- signed / (same semantics as IntQuotOp)
| MO_NatS_Rem -- signed % (same semantics as IntRemOp)
| MO_NatS_Neg -- unary -
- | MO_NatU_Mul -- unsigned *
+ | MO_NatU_Mul -- low word of unsigned *
| MO_NatU_Quot -- unsigned / (same semantics as WordQuotOp)
| MO_NatU_Rem -- unsigned % (same semantics as WordRemOp)
- | MO_NatS_AddC -- signed +, first result sum, second result carry
- | MO_NatS_SubC -- signed -, first result sum, second result borrow
- | MO_NatS_MulC -- signed *, first result sum, second result carry
-
| MO_Nat_And
| MO_Nat_Or
| MO_Nat_Xor
| MO_16U_to_NatU
| MO_32U_to_NatU
- -- Reading/writing arrays
- | MO_ReadOSBI Int PrimRep -- [base_ptr, index_value]
- | MO_WriteOSBI Int PrimRep -- [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
+ | MO_8U_to_32U -- zero extend
+ | MO_32U_to_8U -- mask out all but lowest byte
+
deriving Eq
pprMachOp MO_NatU_Lt = text "MO_NatU_Lt"
pprMachOp MO_NatS_Mul = text "MO_NatS_Mul"
+pprMachOp MO_NatS_MulMayOflo = text "MO_NatS_MulMayOflo"
pprMachOp MO_NatS_Quot = text "MO_NatS_Quot"
pprMachOp MO_NatS_Rem = text "MO_NatS_Rem"
pprMachOp MO_NatS_Neg = text "MO_NatS_Neg"
pprMachOp MO_NatU_Quot = text "MO_NatU_Quot"
pprMachOp MO_NatU_Rem = text "MO_NatU_Rem"
-pprMachOp MO_NatS_AddC = text "MO_NatS_AddC"
-pprMachOp MO_NatS_SubC = text "MO_NatS_SubC"
-pprMachOp MO_NatS_MulC = text "MO_NatS_MulC"
-
pprMachOp MO_Nat_And = text "MO_Nat_And"
pprMachOp MO_Nat_Or = text "MO_Nat_Or"
pprMachOp MO_Nat_Xor = text "MO_Nat_Xor"
pprMachOp MO_16U_to_NatU = text "MO_16U_to_NatU"
pprMachOp MO_32U_to_NatU = text "MO_32U_to_NatU"
-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)
+pprMachOp MO_8U_to_32U = text "MO_8U_to_32U"
+pprMachOp MO_32U_to_8U = text "MO_32U_to_8U"
isComparisonMachOp :: MachOp -> Bool
isComparisonMachOp mop = comp `elem` snd (machOpProps mop)
--- Find the PrimReps for the returned value(s) of the MachOp.
-resultRepsOfMachOp :: MachOp -> Maybe012 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 -> (Maybe012 PrimRep, [MO_Prop])
-
-machOpProps MO_Nat_Add = (Just1 IntRep, [inline, comm])
-machOpProps MO_Nat_Sub = (Just1 IntRep, [inline])
-machOpProps MO_Nat_Eq = (Just1 IntRep, [inline, comp, comm])
-machOpProps MO_Nat_Ne = (Just1 IntRep, [inline, comp, comm])
-
-machOpProps MO_NatS_Ge = (Just1 IntRep, [inline, comp])
-machOpProps MO_NatS_Le = (Just1 IntRep, [inline, comp])
-machOpProps MO_NatS_Gt = (Just1 IntRep, [inline, comp])
-machOpProps MO_NatS_Lt = (Just1 IntRep, [inline, comp])
-
-machOpProps MO_NatU_Ge = (Just1 IntRep, [inline, comp])
-machOpProps MO_NatU_Le = (Just1 IntRep, [inline, comp])
-machOpProps MO_NatU_Gt = (Just1 IntRep, [inline, comp])
-machOpProps MO_NatU_Lt = (Just1 IntRep, [inline, comp])
-
-machOpProps MO_NatS_Mul = (Just1 IntRep, [inline, comm])
-machOpProps MO_NatS_Quot = (Just1 IntRep, [inline])
-machOpProps MO_NatS_Rem = (Just1 IntRep, [inline])
-machOpProps MO_NatS_Neg = (Just1 IntRep, [inline])
-
-machOpProps MO_NatU_Mul = (Just1 WordRep, [inline, comm])
-machOpProps MO_NatU_Quot = (Just1 WordRep, [inline])
-machOpProps MO_NatU_Rem = (Just1 WordRep, [inline])
-
-machOpProps MO_NatS_AddC = (Just2 IntRep IntRep, [])
-machOpProps MO_NatS_SubC = (Just2 IntRep IntRep, [])
-machOpProps MO_NatS_MulC = (Just2 IntRep IntRep, [])
-
-machOpProps MO_Nat_And = (Just1 IntRep, [inline, comm])
-machOpProps MO_Nat_Or = (Just1 IntRep, [inline, comm])
-machOpProps MO_Nat_Xor = (Just1 IntRep, [inline, comm])
-machOpProps MO_Nat_Not = (Just1 IntRep, [inline])
-machOpProps MO_Nat_Shl = (Just1 IntRep, [inline])
-machOpProps MO_Nat_Shr = (Just1 IntRep, [inline])
-machOpProps MO_Nat_Sar = (Just1 IntRep, [inline])
-
-machOpProps MO_32U_Eq = (Just1 IntRep, [inline, comp, comm])
-machOpProps MO_32U_Ne = (Just1 IntRep, [inline, comp, comm])
-machOpProps MO_32U_Ge = (Just1 IntRep, [inline, comp])
-machOpProps MO_32U_Le = (Just1 IntRep, [inline, comp])
-machOpProps MO_32U_Gt = (Just1 IntRep, [inline, comp])
-machOpProps MO_32U_Lt = (Just1 IntRep, [inline, comp])
-
-machOpProps MO_Dbl_Eq = (Just1 IntRep, [inline, comp, comm])
-machOpProps MO_Dbl_Ne = (Just1 IntRep, [inline, comp, comm])
-machOpProps MO_Dbl_Ge = (Just1 IntRep, [inline, comp])
-machOpProps MO_Dbl_Le = (Just1 IntRep, [inline, comp])
-machOpProps MO_Dbl_Gt = (Just1 IntRep, [inline, comp])
-machOpProps MO_Dbl_Lt = (Just1 IntRep, [inline, comp])
-
-machOpProps MO_Dbl_Add = (Just1 DoubleRep, [inline, comm])
-machOpProps MO_Dbl_Sub = (Just1 DoubleRep, [inline])
-machOpProps MO_Dbl_Mul = (Just1 DoubleRep, [inline, comm])
-machOpProps MO_Dbl_Div = (Just1 DoubleRep, [inline])
-machOpProps MO_Dbl_Pwr = (Just1 DoubleRep, [])
-
-machOpProps MO_Dbl_Sin = (Just1 DoubleRep, [])
-machOpProps MO_Dbl_Cos = (Just1 DoubleRep, [])
-machOpProps MO_Dbl_Tan = (Just1 DoubleRep, [])
-machOpProps MO_Dbl_Sinh = (Just1 DoubleRep, [])
-machOpProps MO_Dbl_Cosh = (Just1 DoubleRep, [])
-machOpProps MO_Dbl_Tanh = (Just1 DoubleRep, [])
-machOpProps MO_Dbl_Asin = (Just1 DoubleRep, [])
-machOpProps MO_Dbl_Acos = (Just1 DoubleRep, [])
-machOpProps MO_Dbl_Atan = (Just1 DoubleRep, [])
-machOpProps MO_Dbl_Log = (Just1 DoubleRep, [])
-machOpProps MO_Dbl_Exp = (Just1 DoubleRep, [])
-machOpProps MO_Dbl_Sqrt = (Just1 DoubleRep, [])
-machOpProps MO_Dbl_Neg = (Just1 DoubleRep, [inline])
-
-machOpProps MO_Flt_Add = (Just1 FloatRep, [inline, comm])
-machOpProps MO_Flt_Sub = (Just1 FloatRep, [inline])
-machOpProps MO_Flt_Mul = (Just1 FloatRep, [inline, comm])
-machOpProps MO_Flt_Div = (Just1 FloatRep, [inline])
-machOpProps MO_Flt_Pwr = (Just1 FloatRep, [])
-
-machOpProps MO_Flt_Eq = (Just1 IntRep, [inline, comp, comm])
-machOpProps MO_Flt_Ne = (Just1 IntRep, [inline, comp, comm])
-machOpProps MO_Flt_Ge = (Just1 IntRep, [inline, comp])
-machOpProps MO_Flt_Le = (Just1 IntRep, [inline, comp])
-machOpProps MO_Flt_Gt = (Just1 IntRep, [inline, comp])
-machOpProps MO_Flt_Lt = (Just1 IntRep, [inline, comp])
-
-machOpProps MO_Flt_Sin = (Just1 FloatRep, [])
-machOpProps MO_Flt_Cos = (Just1 FloatRep, [])
-machOpProps MO_Flt_Tan = (Just1 FloatRep, [])
-machOpProps MO_Flt_Sinh = (Just1 FloatRep, [])
-machOpProps MO_Flt_Cosh = (Just1 FloatRep, [])
-machOpProps MO_Flt_Tanh = (Just1 FloatRep, [])
-machOpProps MO_Flt_Asin = (Just1 FloatRep, [])
-machOpProps MO_Flt_Acos = (Just1 FloatRep, [])
-machOpProps MO_Flt_Atan = (Just1 FloatRep, [])
-machOpProps MO_Flt_Log = (Just1 FloatRep, [])
-machOpProps MO_Flt_Exp = (Just1 FloatRep, [])
-machOpProps MO_Flt_Sqrt = (Just1 FloatRep, [])
-machOpProps MO_Flt_Neg = (Just1 FloatRep, [inline])
-
-machOpProps MO_32U_to_NatS = (Just1 IntRep, [inline])
-machOpProps MO_NatS_to_32U = (Just1 WordRep, [inline])
-
-machOpProps MO_NatS_to_Dbl = (Just1 DoubleRep, [inline])
-machOpProps MO_Dbl_to_NatS = (Just1 IntRep, [inline])
-
-machOpProps MO_NatS_to_Flt = (Just1 FloatRep, [inline])
-machOpProps MO_Flt_to_NatS = (Just1 IntRep, [inline])
-
-machOpProps MO_NatS_to_NatU = (Just1 WordRep, [inline])
-machOpProps MO_NatU_to_NatS = (Just1 IntRep, [inline])
-
-machOpProps MO_NatS_to_NatP = (Just1 PtrRep, [inline])
-machOpProps MO_NatP_to_NatS = (Just1 IntRep, [inline])
-machOpProps MO_NatU_to_NatP = (Just1 PtrRep, [inline])
-machOpProps MO_NatP_to_NatU = (Just1 WordRep, [inline])
-
-machOpProps MO_Dbl_to_Flt = (Just1 FloatRep, [inline])
-machOpProps MO_Flt_to_Dbl = (Just1 DoubleRep, [inline])
-
-machOpProps MO_8S_to_NatS = (Just1 IntRep, [inline])
-machOpProps MO_16S_to_NatS = (Just1 IntRep, [inline])
-machOpProps MO_32S_to_NatS = (Just1 IntRep, [inline])
-
-machOpProps MO_8U_to_NatU = (Just1 WordRep, [inline])
-machOpProps MO_16U_to_NatU = (Just1 WordRep, [inline])
-machOpProps MO_32U_to_NatU = (Just1 WordRep, [inline])
-
-machOpProps (MO_ReadOSBI offset rep) = (Just1 rep, [inline])
-machOpProps (MO_WriteOSBI offset rep) = (Just0, [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])