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 /CodeGen.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 'CodeGen.hs')
-rw-r--r-- | CodeGen.hs | 12 |
1 files changed, 11 insertions, 1 deletions
@@ -65,7 +65,7 @@ codegen (IRProgram vars funcs) = do X64.verify x64 varcg <- liftM unlines $ mapM codegenVar vars x64opt <- x64Optimise x64 - return $ "extern putc, putint, getc, _builtin_malloc\n" ++ + return $ "extern putc, putint, getc, exit, _builtin_malloc, _builtin_outofbounds\n" ++ "global main\ndefault rel\nsection .text\n" ++ X64.stringify x64opt ++ "\nsection .data\n" ++ varcg @@ -317,6 +317,8 @@ codegenIns m fullins@(IResize d s) = do addIns $ mkmov dm (XReg dsz RAX) else do addIns $ mkmov dm (X64.xrefSetSize dsz sm) +codegenIns _ IDebugger = do + addIns $ INT3 codegenIns _ INop = return () arithTypeToCondCode :: ArithType -> Maybe X64.CondCode @@ -335,6 +337,10 @@ cmpTypeToCondCode CGt = CCG cmpTypeToCondCode CLt = CCL cmpTypeToCondCode CGeq = CCGE cmpTypeToCondCode CLeq = CCLE +cmpTypeToCondCode CUGt = CCA +cmpTypeToCondCode CULt = CCB +cmpTypeToCondCode CUGeq = CCAE +cmpTypeToCondCode CULeq = CCBE arithTypeToIns :: ArithType -> Maybe (XRef -> XRef -> X64.Ins) arithTypeToIns AAdd = Just $ \a b -> ADD (xref a) (xref b) @@ -375,6 +381,7 @@ codegenTerm m (IRetr r) = do addIns $ mkmov (XReg 8 RSP) (XReg 8 RBP) addIns $ POP (xref $ XReg 8 RBP) addIns RET +codegenTerm _ IUnreachable = return () codegenTerm _ ITermNone = undefined @@ -396,6 +403,7 @@ collectTempRefs bbs = listRefsIns (ICall _ l) = [map LA.Read l] listRefsIns (ICallr a _ l) = [LA.Write a : map LA.Read l] listRefsIns (IResize a b) = [[LA.Read b], [LA.Write a]] + listRefsIns IDebugger = [[]] listRefsIns INop = [[]] listRefsTerm :: IRTerm -> [[LA.Access Ref]] @@ -403,6 +411,7 @@ collectTempRefs bbs = listRefsTerm (IJmp _) = [[]] listRefsTerm IRet = [[]] listRefsTerm (IRetr a) = [[LA.Read a]] + listRefsTerm IUnreachable = [] listRefsTerm ITermNone = undefined listNextIds :: IRTerm -> [Id] @@ -410,6 +419,7 @@ collectTempRefs bbs = listNextIds (IJmp a) = [a] listNextIds IRet = [] listNextIds (IRetr _) = [] + listNextIds IUnreachable = [] listNextIds ITermNone = undefined isTemp :: Ref -> Bool |