diff --git a/yjit/src/backend/x86_64/mod.rs b/yjit/src/backend/x86_64/mod.rs index 3140c86b2e..7b84e62134 100644 --- a/yjit/src/backend/x86_64/mod.rs +++ b/yjit/src/backend/x86_64/mod.rs @@ -418,36 +418,36 @@ impl Assembler Op::Breakpoint => int3(cb), Op::CSelZ => { - mov(cb, insn.out.into(), insn.opnds[1].into()); - cmovz(cb, insn.out.into(), insn.opnds[0].into()); + mov(cb, insn.out.into(), insn.opnds[0].into()); + cmovnz(cb, insn.out.into(), insn.opnds[1].into()); }, Op::CSelNZ => { - mov(cb, insn.out.into(), insn.opnds[1].into()); - cmovnz(cb, insn.out.into(), insn.opnds[0].into()); + mov(cb, insn.out.into(), insn.opnds[0].into()); + cmovz(cb, insn.out.into(), insn.opnds[1].into()); }, Op::CSelE => { - mov(cb, insn.out.into(), insn.opnds[1].into()); - cmove(cb, insn.out.into(), insn.opnds[0].into()); + mov(cb, insn.out.into(), insn.opnds[0].into()); + cmovne(cb, insn.out.into(), insn.opnds[1].into()); }, Op::CSelNE => { - mov(cb, insn.out.into(), insn.opnds[1].into()); - cmovne(cb, insn.out.into(), insn.opnds[0].into()); + mov(cb, insn.out.into(), insn.opnds[0].into()); + cmove(cb, insn.out.into(), insn.opnds[1].into()); }, Op::CSelL => { - mov(cb, insn.out.into(), insn.opnds[1].into()); - cmovl(cb, insn.out.into(), insn.opnds[0].into()); + mov(cb, insn.out.into(), insn.opnds[0].into()); + cmovge(cb, insn.out.into(), insn.opnds[1].into()); }, Op::CSelLE => { - mov(cb, insn.out.into(), insn.opnds[1].into()); - cmovle(cb, insn.out.into(), insn.opnds[0].into()); + mov(cb, insn.out.into(), insn.opnds[0].into()); + cmovg(cb, insn.out.into(), insn.opnds[1].into()); }, Op::CSelG => { - mov(cb, insn.out.into(), insn.opnds[1].into()); - cmovg(cb, insn.out.into(), insn.opnds[0].into()); + mov(cb, insn.out.into(), insn.opnds[0].into()); + cmovle(cb, insn.out.into(), insn.opnds[1].into()); }, Op::CSelGE => { - mov(cb, insn.out.into(), insn.opnds[1].into()); - cmovge(cb, insn.out.into(), insn.opnds[0].into()); + mov(cb, insn.out.into(), insn.opnds[0].into()); + cmovl(cb, insn.out.into(), insn.opnds[1].into()); }, // We want to keep the panic here because some instructions that diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index a1fd4df35d..9f39c77bb6 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -5990,7 +5990,7 @@ fn get_gen_fn(opcode: VALUE) -> Option { YARVINSN_newarray => Some(gen_newarray), //YARVINSN_duparray => Some(gen_duparray), //YARVINSN_checktype => Some(gen_checktype), - //YARVINSN_opt_lt => Some(gen_opt_lt), + YARVINSN_opt_lt => Some(gen_opt_lt), /* YARVINSN_opt_le => Some(gen_opt_le), YARVINSN_opt_gt => Some(gen_opt_gt),