x64: fix miscompilation of select.i128 (#4017)

Issue #3963 identified a miscompilation with select in which the second
in the pair of `CMOV`s (one pair per `i128` register) used the wrong
flag. This change fixes the error in the x64 ISLE helper function
emitting these `CMOV` instructions.
This commit is contained in:
Andrew Brown
2022-04-12 09:56:57 -07:00
committed by GitHub
parent 54aa720506
commit 7a55779c6b
5 changed files with 42 additions and 6 deletions

View File

@@ -1780,9 +1780,9 @@
(tmp2 WritableGpr (temp_writable_gpr))
(size OperandSize (OperandSize.Size64))
(cmove1 MInst (MInst.Cmove size cc1 (value_regs_get_gpr cons 0) (value_regs_get_gpr alt 0) tmp1))
(cmove2 MInst (MInst.Cmove size cc1 (value_regs_get_gpr cons 0) tmp1 dst1))
(cmove2 MInst (MInst.Cmove size cc2 (value_regs_get_gpr cons 0) tmp1 dst1))
(cmove3 MInst (MInst.Cmove size cc1 (value_regs_get_gpr cons 1) (value_regs_get_gpr alt 1) tmp2))
(cmove4 MInst (MInst.Cmove size cc1 (value_regs_get_gpr cons 1) tmp2 dst2)))
(cmove4 MInst (MInst.Cmove size cc2 (value_regs_get_gpr cons 1) tmp2 dst2)))
(ConsumesFlags.ConsumesFlagsFourTimesReturnsValueRegs
cmove1
cmove2

View File

@@ -1,4 +1,4 @@
src/clif.isle 443b34b797fc8ace
src/prelude.isle c0751050a11e2686
src/isa/x64/inst.isle c4729db7808ba0b5
src/isa/x64/inst.isle 1a4206dba9fcf9d8
src/isa/x64/lower.isle 7e839e6b667bfe77

View File

@@ -2636,7 +2636,7 @@ pub fn constructor_cmove_or_from_values<C: Context>(
let expr16_0 = C::writable_gpr_to_gpr(ctx, expr4_0);
let expr17_0 = MInst::Cmove {
size: expr6_0,
cc: pattern2_0.clone(),
cc: pattern3_0.clone(),
consequent: expr15_0,
alternative: expr16_0,
dst: expr2_0,
@@ -2659,7 +2659,7 @@ pub fn constructor_cmove_or_from_values<C: Context>(
let expr27_0 = C::writable_gpr_to_gpr(ctx, expr5_0);
let expr28_0 = MInst::Cmove {
size: expr6_0,
cc: pattern2_0.clone(),
cc: pattern3_0.clone(),
consequent: expr26_0,
alternative: expr27_0,
dst: expr3_0,