module Ivory.Language.IIntegral where
import Ivory.Language.Sint
import Ivory.Language.Type
import Ivory.Language.Uint
import qualified Ivory.Language.Syntax.AST as I
class (IvoryExpr a, Num a) => IvoryIntegral a where
iDiv :: a -> a -> a
iDiv l r = wrapExpr (iDivE (unwrapExpr l) (unwrapExpr r))
(.%) :: a -> a -> a
l .% r = wrapExpr (iModE (unwrapExpr l) (unwrapExpr r))
iDivE :: I.Expr -> I.Expr -> I.Expr
iDivE l r = I.ExpOp I.ExpDiv [l,r]
iModE :: I.Expr -> I.Expr -> I.Expr
iModE l r = I.ExpOp I.ExpMod [l,r]
instance IvoryIntegral Sint8
instance IvoryIntegral Sint16
instance IvoryIntegral Sint32
instance IvoryIntegral Sint64
instance IvoryIntegral Uint8
instance IvoryIntegral Uint16
instance IvoryIntegral Uint32
instance IvoryIntegral Uint64