summaryrefslogtreecommitdiff
path: root/emit.fun
diff options
context:
space:
mode:
authorVladimir Azarov <avm@intermediate-node.net>2025-08-11 02:30:01 +0200
committerVladimir Azarov <avm@intermediate-node.net>2025-08-11 02:30:01 +0200
commit69cf1be454c7caae026107e645c5343365b1be19 (patch)
tree661a89ab76a730d651a464735fb654ef099e55ca /emit.fun
parent512985277bf70e425ab6e96b3aea69ba91426afc (diff)
Xor idiom
Diffstat (limited to 'emit.fun')
-rw-r--r--emit.fun18
1 files changed, 12 insertions, 6 deletions
diff --git a/emit.fun b/emit.fun
index d42a085..215c335 100644
--- a/emit.fun
+++ b/emit.fun
@@ -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]