diff options
Diffstat (limited to 'CodeGen.hs')
-rw-r--r-- | CodeGen.hs | 14 |
1 files changed, 11 insertions, 3 deletions
@@ -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) |