aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaxime Chevalier-Boisvert <maxime.chevalierboisvert@shopify.com>2022-07-20 15:00:42 -0400
committerTakashi Kokubun <takashikkbn@gmail.com>2022-08-29 08:47:00 -0700
commit86606e01ee984cd9aebdcc68c0b5025604fb5184 (patch)
tree9e3224a9000f1927133569342ec035bde9ebef74
parentb45b29fdbf43ea6043c1df041372842a07f5b3a8 (diff)
downloadruby-86606e01ee984cd9aebdcc68c0b5025604fb5184.tar.gz
Port over setlocal_wc0
-rw-r--r--yjit/src/backend/ir.rs8
-rw-r--r--yjit/src/codegen.rs23
2 files changed, 18 insertions, 13 deletions
diff --git a/yjit/src/backend/ir.rs b/yjit/src/backend/ir.rs
index cd88ec560b..5758d72d43 100644
--- a/yjit/src/backend/ir.rs
+++ b/yjit/src/backend/ir.rs
@@ -253,7 +253,7 @@ impl From<u64> for Opnd {
impl From<i64> for Opnd {
fn from(value: i64) -> Self {
- Opnd::Imm(value.try_into().unwrap())
+ Opnd::Imm(value)
}
}
@@ -263,6 +263,12 @@ impl From<i32> for Opnd {
}
}
+impl From<u32> for Opnd {
+ fn from(value: u32) -> Self {
+ Opnd::UImm(value as u64)
+ }
+}
+
impl From<VALUE> for Opnd {
fn from(value: VALUE) -> Self {
let VALUE(uimm) = value;
diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs
index e78463ce5e..1b05dc36c6 100644
--- a/yjit/src/codegen.rs
+++ b/yjit/src/codegen.rs
@@ -1584,11 +1584,10 @@ fn gen_getlocal_wc1(
gen_getlocal_generic(ctx, asm, idx.as_u32(), 1)
}
-/*
fn gen_setlocal_wc0(
jit: &mut JITState,
ctx: &mut Context,
- cb: &mut CodeBlock,
+ asm: &mut Assembler,
ocb: &mut OutlinedCb,
) -> CodegenStatus {
/*
@@ -1609,25 +1608,25 @@ fn gen_setlocal_wc0(
let value_type = ctx.get_opnd_type(StackOpnd(0));
// Load environment pointer EP (level 0) from CFP
- gen_get_ep(cb, REG0, 0);
+ let ep_opnd = gen_get_ep(asm, 0);
// Write barriers may be required when VM_ENV_FLAG_WB_REQUIRED is set, however write barriers
// only affect heap objects being written. If we know an immediate value is being written we
// can skip this check.
if !value_type.is_imm() {
// flags & VM_ENV_FLAG_WB_REQUIRED
- let flags_opnd = mem_opnd(
+ let flags_opnd = Opnd::mem(
64,
- REG0,
+ ep_opnd,
SIZEOF_VALUE as i32 * VM_ENV_DATA_INDEX_FLAGS as i32,
);
- test(cb, flags_opnd, imm_opnd(VM_ENV_FLAG_WB_REQUIRED as i64));
+ asm.test(flags_opnd, VM_ENV_FLAG_WB_REQUIRED.into());
// Create a side-exit to fall back to the interpreter
let side_exit = get_side_exit(jit, ocb, ctx);
// if (flags & VM_ENV_FLAG_WB_REQUIRED) != 0
- jnz_ptr(cb, side_exit);
+ asm.jnz(side_exit.into());
}
// Set the type of the local variable in the context
@@ -1635,15 +1634,15 @@ fn gen_setlocal_wc0(
// Pop the value to write from the stack
let stack_top = ctx.stack_pop(1);
- mov(cb, REG1, stack_top);
// Write the value at the environment pointer
let offs: i32 = -8 * slot_idx;
- mov(cb, mem_opnd(64, REG0, offs), REG1);
+ asm.mov(Opnd::mem(64, ep_opnd, offs), stack_top);
KeepCompiling
}
+/*
fn gen_setlocal_generic(
jit: &mut JITState,
ctx: &mut Context,
@@ -5992,11 +5991,11 @@ fn get_gen_fn(opcode: VALUE) -> Option<InsnGenFn> {
YARVINSN_topn => Some(gen_topn),
YARVINSN_adjuststack => Some(gen_adjuststack),
- //YARVINSN_getlocal => Some(gen_getlocal),
+ YARVINSN_getlocal => Some(gen_getlocal),
YARVINSN_getlocal_WC_0 => Some(gen_getlocal_wc0),
- //YARVINSN_getlocal_WC_1 => Some(gen_getlocal_wc1),
+ YARVINSN_getlocal_WC_1 => Some(gen_getlocal_wc1),
//YARVINSN_setlocal => Some(gen_setlocal),
- //YARVINSN_setlocal_WC_0 => Some(gen_setlocal_wc0),
+ YARVINSN_setlocal_WC_0 => Some(gen_setlocal_wc0),
//YARVINSN_setlocal_WC_1 => Some(gen_setlocal_wc1),
YARVINSN_opt_plus => Some(gen_opt_plus),
/*