aboutsummaryrefslogtreecommitdiff
path: root/Intermediate.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Intermediate.hs')
-rw-r--r--Intermediate.hs15
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