diff options
| author | Maxime Chevalier-Boisvert <maxime.chevalierboisvert@shopify.com> | 2022-07-22 12:01:24 -0400 |
|---|---|---|
| committer | Takashi Kokubun <takashikkbn@gmail.com> | 2022-08-29 08:47:03 -0700 |
| commit | e9f9b8f43b2afdc437ab1b8ab883bab0525a3f43 (patch) | |
| tree | cf30e94d1afea0367ba213abc79c00d3381366f8 /yjit/src | |
| parent | 477c2df3fad22271958b92bdfafbae7155fbebb4 (diff) | |
Fix bug with opt_lt, csel on x86
Diffstat (limited to 'yjit/src')
| -rw-r--r-- | yjit/src/backend/x86_64/mod.rs | 32 | ||||
| -rw-r--r-- | yjit/src/codegen.rs | 2 |
2 files changed, 17 insertions, 17 deletions
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<InsnGenFn> { 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), |
