ddc-core-salt-0.4.1.1: DDC/Core/Salt/Name/PrimArith.hs
module DDC.Core.Salt.Name.PrimArith
( PrimArith (..)
, readPrimArith)
where
import DDC.Base.Pretty
import Control.DeepSeq
import Data.List
-- | Primitive arithmetic, logic, and comparison opretors.
-- We expect the backend/machine to be able to implement these directly.
--
-- For the Shift Right operator, the type that it is used at determines
-- whether it is an arithmetic (with sign-extension) or logical
-- (no sign-extension) shift.
data PrimArith
-- numeric
= PrimArithNeg -- ^ Negation
| PrimArithAdd -- ^ Addition
| PrimArithSub -- ^ Subtraction
| PrimArithMul -- ^ Multiplication
| PrimArithDiv -- ^ Division
| PrimArithMod -- ^ Modulus
| PrimArithRem -- ^ Remainder
-- comparison
| PrimArithEq -- ^ Equality
| PrimArithNeq -- ^ Negated Equality
| PrimArithGt -- ^ Greater Than
| PrimArithGe -- ^ Greater Than or Equal
| PrimArithLt -- ^ Less Than
| PrimArithLe -- ^ Less Than or Equal
-- boolean
| PrimArithAnd -- ^ Boolean And
| PrimArithOr -- ^ Boolean Or
-- bitwise
| PrimArithShl -- ^ Shift Left
| PrimArithShr -- ^ Shift Right
| PrimArithBAnd -- ^ Bit-wise And
| PrimArithBOr -- ^ Bit-wise Or
| PrimArithBXOr -- ^ Bit-wise eXclusive Or
deriving (Eq, Ord, Show)
instance NFData PrimArith
instance Pretty PrimArith where
ppr op
= let Just (_, n) = find (\(p, _) -> op == p) primArithNames
in (text n)
-- | Read a primitive operator.
readPrimArith :: String -> Maybe PrimArith
readPrimArith str
= case find (\(_, n) -> str == n) primArithNames of
Just (p, _) -> Just p
_ -> Nothing
-- | Names of primitve operators.
primArithNames :: [(PrimArith, String)]
primArithNames
= [ (PrimArithNeg, "neg#")
, (PrimArithAdd, "add#")
, (PrimArithSub, "sub#")
, (PrimArithMul, "mul#")
, (PrimArithDiv, "div#")
, (PrimArithRem, "rem#")
, (PrimArithMod, "mod#")
, (PrimArithEq , "eq#" )
, (PrimArithNeq, "neq#")
, (PrimArithGt , "gt#" )
, (PrimArithGe , "ge#" )
, (PrimArithLt , "lt#" )
, (PrimArithLe , "le#" )
, (PrimArithAnd, "and#")
, (PrimArithOr , "or#" )
, (PrimArithShl, "shl#")
, (PrimArithShr, "shr#")
, (PrimArithBAnd, "band#")
, (PrimArithBOr, "bor#")
, (PrimArithBXOr, "bxor#") ]