[project @ 2004-08-13 10:45:16 by simonmar]
[ghc-hetmet.git] / ghc / compiler / absCSyn / MachOp.hs
index e17cde4..087a403 100644 (file)
@@ -3,14 +3,13 @@ module MachOp         ( MachOp(..), pprMachOp,
                  isDefinitelyInlineMachOp, 
                  isCommutableMachOp,
                  isComparisonMachOp,
-                  resultRepsOfMachOp
+                  resultRepOfMachOp
                  )
 where
 
 #include "HsVersions.h"
 
 import PrimRep         ( PrimRep(..) )
-import Maybes          ( Maybe012(..) )
 import Outputable
 
 
@@ -20,10 +19,10 @@ 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,
@@ -49,19 +48,16 @@ data MachOp
   | 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
@@ -163,12 +159,9 @@ data MachOp
   | 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
 
 
@@ -192,6 +185,7 @@ pprMachOp MO_NatU_Gt       = text "MO_NatU_Gt"
 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"
@@ -200,10 +194,6 @@ pprMachOp MO_NatU_Mul      = text "MO_NatU_Mul"
 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"
@@ -301,10 +291,8 @@ pprMachOp MO_8U_to_NatU    = text "MO_8U_to_NatU"
 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"
 
 
 
@@ -339,140 +327,134 @@ isCommutableMachOp mop = comm `elem` snd (machOpProps mop)
 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])