diff options
-rw-r--r-- | emit.fun | 18 | ||||
-rw-r--r-- | parser.fun | 2 |
2 files changed, 13 insertions, 7 deletions
@@ -1165,7 +1165,16 @@ functor Emit(I: IL) = struct fun movRM is8 r off = sprintf `"mov " A2 pr is8 r `", " A2 pm is8 off % fun movMR is8 off r = sprintf `"mov " A2 pm is8 off `", " A2 pr is8 r % - fun movRV is8 r c = sprintf `"mov " A2 pr is8 r `", " A2 pc is8 c % + fun isZeroConst (VConst 0w0) = true + | isZeroConst _ = false + + fun xorIdiom r = sprintf `"xor " A2 pr false r `", " A2 pr false r % + + fun movRV is8 r c = + if isZeroConst c then + xorIdiom r + else + sprintf `"mov " A2 pr is8 r `", " A2 pc is8 c % fun movMV is8 off c = let val () = if not $ fitsInNsx 32 c then raise Unreachable else () @@ -1392,9 +1401,6 @@ functor Emit(I: IL) = struct else CbvUnsure (id, off) - fun isZeroConst (VConst 0w0) = true - | isZeroConst _ = false - fun emitSub I triple = let val (is8, tmp) = getTripleTemplate I triple false true @@ -1761,8 +1767,8 @@ functor Emit(I: IL) = struct [movRR true r1 r2] | (true, VtReg r1, false, VtReg r2) => [movRR false r1 r2] - | (_, VtReg r1, _, VtConst c) => [movRV true r1 c] - | (_, VtReg r1, _, VtStack off) => [movRM true r1 off] + | (_, VtReg r, _, VtConst c) => [movRV true r c] + | (_, VtReg r, _, VtStack off) => [movRM true r off] | (_, VtStack off, _, VtReg r) => [movMR true off r] | (_, VtStack off1, _, VtStack off2) => [movRM true Rax off2, movMR true off1 Rax] @@ -3389,7 +3389,7 @@ functor Parser(structure Tree: TREE; structure P: PPC; val offset = case ctx of Ctx v => length $ #localScopes v in - printf R offset + dprintf R offset `"local var " P.?nid `"(" I varId `"): " Pctype t `"\n" %; (SOME $ LocalId (varId, ini), ctx) |