aboutsummaryrefslogtreecommitdiff
path: root/CodeGen.hs
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2017-09-02 15:46:42 +0200
committertomsmeding <tom.smeding@gmail.com>2017-09-02 15:51:07 +0200
commit45e9991a1f83974c3459037f4791d865f5b342f1 (patch)
tree0ca233c3e9a8c8e38472ea0b6bc8b115e39c9c86 /CodeGen.hs
parent35b17357b5b55e73c6bbc59e7dae094412b7b02a (diff)
Proper struct assignment and optimisations
Diffstat (limited to 'CodeGen.hs')
-rw-r--r--CodeGen.hs14
1 files changed, 11 insertions, 3 deletions
diff --git a/CodeGen.hs b/CodeGen.hs
index bcc49a0..41f37b2 100644
--- a/CodeGen.hs
+++ b/CodeGen.hs
@@ -255,8 +255,7 @@ codegenIns :: AllocMap -> IRIns -> CGMonad ()
codegenIns m (IMov d s)
| dm == sm = return ()
| X64.isXMem dm && X64.isXMem sm = do
- addIns $ mkmov (XReg (fromIntegral $ refSize s) RAX) sm
- addIns $ mkmov dm (XReg (fromIntegral $ refSize d) RAX)
+ emitmemcpy dm sm
| otherwise = addIns $ mkmov dm sm
where dm = mkxref d m
sm = mkxref s m
@@ -320,9 +319,17 @@ codegenIns m (IGet d s off)
codegenIns m (IAri AMul d s1 s2)
| X64.isXImm s1m && X64.isXImm s2m = undefined
| X64.isXImm s1m = codegenIns m (IAri AMul d s2 s1)
+ | dm == s2m =
+ if dm == s1m
+ then if X64.isXMem dm
+ then do
+ addIns $ mkmov (XReg sz RAX) dm
+ addIns $ IMUL (xref $ XReg sz RAX) (xref $ XReg sz RAX)
+ addIns $ mkmov dm (XReg sz RAX)
+ else addIns $ IMUL (xref dm) (xref dm)
+ else codegenIns m (IAri AMul d s2 s1)
| otherwise = do
-- regmem dm, regmem s1m, regmemimm s2m
- let sz = fromIntegral $ refSize d
if X64.isXImm s2m
then if X64.isXMem dm
then do -- mem dm, regmem s1m, imm s2m
@@ -344,6 +351,7 @@ codegenIns m (IAri AMul d s1 s2)
where dm = mkxref d m
s1m = mkxref s1 m
s2m = mkxref s2 m
+ sz = fromIntegral $ refSize d
codegenIns m (IAri ADiv d s1 s2) = do
let sz = fromIntegral $ refSize d
addIns $ XOR (xref $ XReg 4 RDX) (xref $ XReg 4 RDX)