diff options
Diffstat (limited to 'Intermediate.hs')
-rw-r--r-- | Intermediate.hs | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/Intermediate.hs b/Intermediate.hs index c395f55..6cbccda 100644 --- a/Intermediate.hs +++ b/Intermediate.hs @@ -2,6 +2,7 @@ module Intermediate where import Data.Bits import Data.List +import Data.Word import AST import Defs @@ -28,6 +29,7 @@ data IRIns | ICall Name [Ref] | ICallr Ref Name [Ref] | IResize Ref Ref + | IDebugger | INop deriving (Show, Eq) @@ -36,6 +38,7 @@ data IRTerm | IJmp Id | IRet | IRetr Ref + | IUnreachable | ITermNone deriving (Show, Eq) @@ -46,7 +49,7 @@ data ArithType deriving (Show, Eq) data CmpType - = CEq | CNeq | CGt | CLt | CGeq | CLeq + = CEq | CNeq | CGt | CLt | CGeq | CLeq | CUGt | CULt | CUGeq | CULeq deriving (Show, Eq) @@ -105,6 +108,7 @@ instance Pretty IRIns where prettyI _ (ICallr d n al) = "call " ++ pretty d ++ " <- " ++ n ++ " (" ++ intercalate ", " (map pretty al) ++ ")" prettyI _ (IResize d s) = "resize " ++ pretty d ++ " <- " ++ pretty s + prettyI _ IDebugger = "debugger" prettyI _ INop = "nop" instance Pretty IRTerm where @@ -113,6 +117,7 @@ instance Pretty IRTerm where prettyI _ (IJmp did) = "jmp " ++ show did prettyI _ IRet = "ret" prettyI _ (IRetr ref) = "retr " ++ pretty ref + prettyI _ IUnreachable = "unreachable" prettyI _ ITermNone = "?NONE?" instance Pretty ArithType where @@ -138,6 +143,10 @@ instance Pretty CmpType where prettyI _ CLt = "jl" prettyI _ CGeq = "jge" prettyI _ CLeq = "jle" + prettyI _ CUGt = "jug" + prettyI _ CULt = "jul" + prettyI _ CUGeq = "juge" + prettyI _ CULeq = "jule" blockIdOf :: BB -> Id @@ -179,6 +188,10 @@ evaluateCmp ct a b = case ct of CLt -> a < b CGeq -> a >= b CLeq -> a <= b + CUGt -> (fromIntegral a :: Word64) > (fromIntegral b :: Word64) + CULt -> (fromIntegral a :: Word64) < (fromIntegral b :: Word64) + CUGeq -> (fromIntegral a :: Word64) >= (fromIntegral b :: Word64) + CULeq -> (fromIntegral a :: Word64) <= (fromIntegral b :: Word64) isCommutative :: ArithType -> Bool isCommutative AAdd = True |