diff options
author | tomsmeding <tom.smeding@gmail.com> | 2017-08-26 23:16:00 +0200 |
---|---|---|
committer | tomsmeding <tom.smeding@gmail.com> | 2017-08-26 23:16:15 +0200 |
commit | aa049227c17f15ad22092f1fcab4410bbf3521ba (patch) | |
tree | 7046e62ff530746754e19d07d4e8bc7d7a42ea22 /Intermediate.hs | |
parent | b2c5ef755bc7a2c736c5f52c4753dde66c04c3aa (diff) |
Cleanup and features
debugger, bitwise ops, bounds checking, hex literals,
better typing of some optimisations, makefile fix, exit function.
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 |