aboutsummaryrefslogtreecommitdiff
path: root/CodeGen.hs
diff options
context:
space:
mode:
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)