summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Chevalier-Boisvert <maxime.chevalierboisvert@shopify.com>2022-06-16 11:20:54 -0400
committerTakashi Kokubun <takashikkbn@gmail.com>2022-08-29 08:46:57 -0700
commit4932a6ef755ae4cc473666c8757f7c51ac8c2902 (patch)
treebadeb5765b0f74156ea942891087747266738dbb
parentb8fc9909bfa18677d5ad2cb2535ca1f0537216e5 (diff)
Fix small bug in x86_split
-rw-r--r--yjit/src/backend/tests.rs19
-rw-r--r--yjit/src/backend/x86_64/mod.rs10
2 files changed, 27 insertions, 2 deletions
diff --git a/yjit/src/backend/tests.rs b/yjit/src/backend/tests.rs
index 7b2f357455..902d9eeebc 100644
--- a/yjit/src/backend/tests.rs
+++ b/yjit/src/backend/tests.rs
@@ -223,3 +223,22 @@ fn test_jcc_label()
asm.compile_with_num_regs(&mut cb, 1);
}
+
+#[test]
+fn test_jcc_ptr()
+{
+ let (mut asm, mut cb) = setup_asm();
+
+ // FIXME
+ /*
+ let side_exit = Target::CodePtr((5 as *mut u8).into());
+ let not_mask = asm.not(Opnd::mem(32, EC, RUBY_OFFSET_EC_INTERRUPT_MASK));
+ asm.test(
+ Opnd::mem(32, EC, RUBY_OFFSET_EC_INTERRUPT_FLAG),
+ not_mask,
+ );
+ asm.jnz(side_exit);
+ */
+
+ asm.compile_with_num_regs(&mut cb, 1);
+}
diff --git a/yjit/src/backend/x86_64/mod.rs b/yjit/src/backend/x86_64/mod.rs
index e4f8745583..819dad1209 100644
--- a/yjit/src/backend/x86_64/mod.rs
+++ b/yjit/src/backend/x86_64/mod.rs
@@ -88,7 +88,9 @@ impl Assembler
Opnd::InsnOut(out_idx) => {
if live_ranges[out_idx] > index {
let opnd0 = asm.load(opnds[0]);
- asm.push_insn(op, vec![opnd0, opnds[1]], None);
+ let mut new_opnds = vec![opnd0];
+ new_opnds.extend_from_slice(&opnds[1..]);
+ asm.push_insn(op, new_opnds, None);
return;
}
},
@@ -96,7 +98,9 @@ impl Assembler
// We have to load memory and register operands to avoid corrupting them
Opnd::Mem(_) | Opnd::Reg(_) => {
let opnd0 = asm.load(opnds[0]);
- asm.push_insn(op, vec![opnd0, opnds[1]], None);
+ let mut new_opnds = vec![opnd0];
+ new_opnds.extend_from_slice(&opnds[1..]);
+ asm.push_insn(op, new_opnds, None);
return;
},
@@ -113,6 +117,8 @@ impl Assembler
/// Emit platform-specific machine code
pub fn x86_emit(&mut self, cb: &mut CodeBlock) -> Vec<u32>
{
+ //dbg!(&self.insns);
+
// List of GC offsets
let mut gc_offsets: Vec<u32> = Vec::new();