module Language.QBE.Simulator.Expression
(
ValueRepr (..),
fromString,
toString,
boolToValue,
compareIntExpr,
compareFloatExpr,
)
where
import Data.Char qualified as C
import Data.Word (Word64)
import Language.QBE.Types qualified as QBE
class ValueRepr v where
fromLit :: QBE.ExtType -> Word64 -> v
fromFloat :: Float -> v
fromDouble :: Double -> v
toWord64 :: v -> Word64
getType :: v -> QBE.ExtType
floatToInt :: QBE.ExtType -> Bool -> v -> Maybe v
intToFloat :: QBE.ExtType -> Bool -> v -> Maybe v
extendFloat :: v -> Maybe v
truncFloat :: v -> Maybe v
extend :: QBE.ExtType -> Bool -> v -> Maybe v
:: QBE.ExtType -> v -> Maybe v
add :: v -> v -> Maybe v
sub :: v -> v -> Maybe v
mul :: v -> v -> Maybe v
div :: v -> v -> Maybe v
urem :: v -> v -> Maybe v
srem :: v -> v -> Maybe v
udiv :: v -> v -> Maybe v
or :: v -> v -> Maybe v
xor :: v -> v -> Maybe v
and :: v -> v -> Maybe v
neg :: v -> Maybe v
sar :: v -> v -> Maybe v
shr :: v -> v -> Maybe v
shl :: v -> v -> Maybe v
eq :: v -> v -> Maybe v
ne :: v -> v -> Maybe v
sle :: v -> v -> Maybe v
slt :: v -> v -> Maybe v
sge :: v -> v -> Maybe v
sgt :: v -> v -> Maybe v
ule :: v -> v -> Maybe v
ult :: v -> v -> Maybe v
uge :: v -> v -> Maybe v
ugt :: v -> v -> Maybe v
ord :: v -> v -> Maybe v
unord :: v -> v -> Maybe v
unord v
lhs v
rhs = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
ord v
lhs v
rhs Maybe v -> (v -> Maybe v) -> Maybe v
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= v -> Maybe v
forall v. ValueRepr v => v -> Maybe v
neg
fromString :: (ValueRepr v) => String -> [v]
fromString :: forall v. ValueRepr v => String -> [v]
fromString = (Char -> v) -> String -> [v]
forall a b. (a -> b) -> [a] -> [b]
map (\Char
c -> ExtType -> Word64 -> v
forall v. ValueRepr v => ExtType -> Word64 -> v
fromLit ExtType
QBE.Byte (Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word64) -> Int -> Word64
forall a b. (a -> b) -> a -> b
$ Char -> Int
C.ord Char
c))
toString :: (ValueRepr v) => [v] -> String
toString :: forall v. ValueRepr v => [v] -> String
toString = (v -> Char) -> [v] -> String
forall a b. (a -> b) -> [a] -> [b]
map (\v
b -> Int -> Char
C.chr (Word64 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Int) -> Word64 -> Int
forall a b. (a -> b) -> a -> b
$ v -> Word64
forall v. ValueRepr v => v -> Word64
toWord64 v
b))
boolToValue :: (ValueRepr v) => Bool -> v
boolToValue :: forall v. ValueRepr v => Bool -> v
boolToValue Bool
True = ExtType -> Word64 -> v
forall v. ValueRepr v => ExtType -> Word64 -> v
fromLit (BaseType -> ExtType
QBE.Base BaseType
QBE.Long) Word64
1
boolToValue Bool
False = ExtType -> Word64 -> v
forall v. ValueRepr v => ExtType -> Word64 -> v
fromLit (BaseType -> ExtType
QBE.Base BaseType
QBE.Long) Word64
0
compareIntExpr :: (ValueRepr v) => QBE.IntCmpOp -> (v -> v -> Maybe v)
compareIntExpr :: forall v. ValueRepr v => IntCmpOp -> v -> v -> Maybe v
compareIntExpr IntCmpOp
QBE.IEq = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
eq
compareIntExpr IntCmpOp
QBE.INe = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
ne
compareIntExpr IntCmpOp
QBE.ISle = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
sle
compareIntExpr IntCmpOp
QBE.ISlt = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
slt
compareIntExpr IntCmpOp
QBE.ISge = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
sge
compareIntExpr IntCmpOp
QBE.ISgt = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
sgt
compareIntExpr IntCmpOp
QBE.IUle = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
ule
compareIntExpr IntCmpOp
QBE.IUlt = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
ult
compareIntExpr IntCmpOp
QBE.IUge = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
uge
compareIntExpr IntCmpOp
QBE.IUgt = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
ugt
{-# INLINE compareIntExpr #-}
compareFloatExpr :: (ValueRepr v) => QBE.FloatCmpOp -> (v -> v -> Maybe v)
compareFloatExpr :: forall v. ValueRepr v => FloatCmpOp -> v -> v -> Maybe v
compareFloatExpr FloatCmpOp
QBE.FEq = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
eq
compareFloatExpr FloatCmpOp
QBE.FNe = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
ne
compareFloatExpr FloatCmpOp
QBE.FLe = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
sle
compareFloatExpr FloatCmpOp
QBE.FLt = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
slt
compareFloatExpr FloatCmpOp
QBE.FGe = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
sge
compareFloatExpr FloatCmpOp
QBE.FGt = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
sgt
compareFloatExpr FloatCmpOp
QBE.FOrd = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
ord
compareFloatExpr FloatCmpOp
QBE.FUnord = v -> v -> Maybe v
forall v. ValueRepr v => v -> v -> Maybe v
unord
{-# INLINE compareFloatExpr #-}