Skip to content

Commit 72ef585

Browse files
committed
Properly reserve space in xnor codegen
1 parent 0105d1e commit 72ef585

File tree

1 file changed

+18
-3
lines changed

1 file changed

+18
-3
lines changed

crates/polkavm/src/compiler/amd64.rs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,9 +1036,24 @@ where
10361036
#[inline(always)]
10371037
pub fn xnor(&mut self, d: RawReg, s1: RawReg, s2: RawReg) {
10381038
let reg_size = self.reg_size();
1039-
self.xor(d, s1, s2);
1040-
let asm = self.asm.reserve::<U1>();
1041-
asm.push(not(reg_size, conv_reg(d))).assert_reserved_exactly_as_needed();
1039+
let d = conv_reg(d);
1040+
let s1 = conv_reg(s1);
1041+
let s2 = conv_reg(s2);
1042+
1043+
let asm = self.asm.reserve::<U3>();
1044+
match (d, s1, s2) {
1045+
// d = ~(d ^ s2)
1046+
(_, _, _) if d == s1 => asm.push(xor((reg_size, d, s2))).push_none(),
1047+
// d = ~(s1 ^ d)
1048+
(_, _, _) if d == s2 => asm.push(xor((reg_size, d, s1))).push_none(),
1049+
// d = ~(s1 ^ s2)
1050+
_ => {
1051+
let asm = asm.push(mov(reg_size, d, s1));
1052+
asm.push(xor((reg_size, d, s2)))
1053+
}
1054+
}
1055+
.push(not(reg_size, d))
1056+
.assert_reserved_exactly_as_needed();
10421057
}
10431058

10441059
#[inline(always)]

0 commit comments

Comments
 (0)