module Prim where
import Machine
data PrimOp = OpWord | OpFloat | OpDouble deriving (Eq,Show,Ord)
data Prim =
ADD PrimOp
| SUB PrimOp
| MUL PrimOp
| ABS PrimOp
| SIGNUM PrimOp
| EXP PrimOp
| POW PrimOp
| LOG PrimOp
| SQRT PrimOp
| SIN PrimOp
| COS PrimOp
| TAN PrimOp
| ASIN PrimOp
| ACOS PrimOp
| ATAN PrimOp
| SLASH PrimOp
| CMP_EQ PrimOp -- EQ is used by 1.3 in in Ordering
| CMP_NE PrimOp
| CMP_LT PrimOp -- LT is used by 1.3 in in Ordering
| CMP_LE PrimOp
| CMP_GT PrimOp -- GT is used by 1.3 in in Ordering
| CMP_GE PrimOp
| NEG PrimOp
| QUOT
| REM
| AND
| OR
| NOT
| ORD
| CHR
| SEQ
| STRING -- NR
| CATCH
| HGETS -- MW
| HGETC -- NR
| HPUTC -- NR
-- -- | QUOTREM -- WITHDRAWN
-- -- | DIVMOD -- WITHDRAWN
-- -- | DIV -- WITHDRAWN
-- -- | MOD -- WITHDRAWN
deriving (Eq)
strPrim :: Prim -> String
strPrim (ADD op) = strPrimOp "ADD" op
strPrim (SUB op) = strPrimOp "SUB" op
strPrim (MUL op) = strPrimOp "MUL" op
strPrim (ABS op) = strPrimOp "ABS" op
strPrim (SIGNUM op) = strPrimOp "SIGNUM" op
strPrim (EXP op) = strPrimOp "EXP" op
strPrim (POW op) = strPrimOp "POW" op
strPrim (LOG op) = strPrimOp "LOG" op
strPrim (SQRT op) = strPrimOp "SQRT" op
strPrim (SIN op) = strPrimOp "SIN" op
strPrim (COS op) = strPrimOp "COS" op
strPrim (TAN op) = strPrimOp "TAN" op
strPrim (ASIN op) = strPrimOp "ASIN" op
strPrim (ACOS op) = strPrimOp "ACOS" op
strPrim (ATAN op) = strPrimOp "ATAN" op
strPrim (SLASH op) = strPrimOp "SLASH" op
strPrim (CMP_EQ op) = strPrimOp "EQ" op
strPrim (CMP_NE op) = strPrimOp "NE" op
strPrim (CMP_LT op) = strPrimOp "LT" op
strPrim (CMP_LE op) = strPrimOp "LE" op
strPrim (CMP_GT op) = strPrimOp "GT" op
strPrim (CMP_GE op) = strPrimOp "GE" op
strPrim (NEG op) = strPrimOp "NEG" op
strPrim QUOT = "QUOT"
strPrim REM = "REM"
strPrim AND = "AND"
strPrim OR = "OR"
strPrim NOT = "NOT"
strPrim ORD = "ORD"
strPrim CHR = "CHR"
strPrim SEQ = "SEQ"
strPrim STRING = "STRING"
strPrim CATCH = "CATCH"
strPrim HGETS = "HGETS"
strPrim HGETC = "HGETC"
strPrim HPUTC = "HPUTC"
strPrimOp :: String -> PrimOp -> String
strPrimOp mnem OpWord = mnem ++ "_W"
strPrimOp mnem OpFloat = if floatIsDouble
then mnem ++ "_D"
else mnem ++ "_F"
strPrimOp mnem OpDouble = mnem ++ "_D"
|