ruby-changes:73177
From: Maxime <ko1@a...>
Date: Tue, 30 Aug 2022 00:58:00 +0900 (JST)
Subject: [ruby-changes:73177] 86606e01ee (master): Port over setlocal_wc0
https://git.ruby-lang.org/ruby.git/commit/?id=86606e01ee From 86606e01ee984cd9aebdcc68c0b5025604fb5184 Mon Sep 17 00:00:00 2001 From: Maxime Chevalier-Boisvert <maxime.chevalierboisvert@s...> Date: Wed, 20 Jul 2022 15:00:42 -0400 Subject: Port over setlocal_wc0 --- yjit/src/backend/ir.rs | 8 +++++++- yjit/src/codegen.rs | 23 +++++++++++------------ 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 { https://github.com/ruby/ruby/blob/trunk/yjit/src/backend/ir.rs#L253 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 { https://github.com/ruby/ruby/blob/trunk/yjit/src/backend/ir.rs#L263 } } +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( https://github.com/ruby/ruby/blob/trunk/yjit/src/codegen.rs#L1584 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( https://github.com/ruby/ruby/blob/trunk/yjit/src/codegen.rs#L1608 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( https://github.com/ruby/ruby/blob/trunk/yjit/src/codegen.rs#L1634 // 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> { https://github.com/ruby/ruby/blob/trunk/yjit/src/codegen.rs#L5991 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), /* -- cgit v1.2.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/