ruby-changes:73154
From: Maxime <ko1@a...>
Date: Tue, 30 Aug 2022 00:57:22 +0900 (JST)
Subject: [ruby-changes:73154] b89d878ea6 (master): Port getlocal_WC0
https://git.ruby-lang.org/ruby.git/commit/?id=b89d878ea6 From b89d878ea61d2883838fdd466c6f432134ae1860 Mon Sep 17 00:00:00 2001 From: Maxime Chevalier-Boisvert <maxime.chevalierboisvert@s...> Date: Mon, 20 Jun 2022 14:50:29 -0400 Subject: Port getlocal_WC0 --- yjit/src/codegen.rs | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index ba080113f4..c3b4b84841 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -1466,11 +1466,12 @@ fn gen_expandarray( https://github.com/ruby/ruby/blob/trunk/yjit/src/codegen.rs#L1466 KeepCompiling } +*/ fn gen_getlocal_wc0( jit: &mut JITState, ctx: &mut Context, - cb: &mut CodeBlock, + asm: &mut Assembler, _ocb: &mut OutlinedCb, ) -> CodegenStatus { // Compute the offset from BP to the local @@ -1479,14 +1480,14 @@ fn gen_getlocal_wc0( https://github.com/ruby/ruby/blob/trunk/yjit/src/codegen.rs#L1480 let local_idx = slot_to_local_idx(jit.get_iseq(), slot_idx); // Load environment pointer EP (level 0) from CFP - gen_get_ep(cb, REG0, 0); + let ep_opnd = gen_get_ep(asm, 0); // Load the local from the EP - mov(cb, REG0, mem_opnd(64, REG0, offs)); + let local_opnd = Opnd::mem(64, ep_opnd, offs); // Write the local at SP let stack_top = ctx.stack_push_local(local_idx.as_usize()); - mov(cb, stack_top, REG0); + asm.mov(stack_top, local_opnd); KeepCompiling } @@ -1518,21 +1519,24 @@ fn slot_to_local_idx(iseq: IseqPtr, slot_idx: i32) -> u32 { https://github.com/ruby/ruby/blob/trunk/yjit/src/codegen.rs#L1519 } // Get EP at level from CFP -fn gen_get_ep(cb: &mut CodeBlock, reg: X86Opnd, level: u32) { - // Load environment pointer EP from CFP - let ep_opnd = mem_opnd(64, REG_CFP, RUBY_OFFSET_CFP_EP); - mov(cb, reg, ep_opnd); +fn gen_get_ep(asm: &mut Assembler, level: u32) -> Opnd { + // Load environment pointer EP from CFP into a register + let ep_opnd = Opnd::mem(64, CFP, RUBY_OFFSET_CFP_EP); + let mut ep_opnd = asm.load(ep_opnd); for _ in (0..level).rev() { // Get the previous EP from the current EP // See GET_PREV_EP(ep) macro // VALUE *prev_ep = ((VALUE *)((ep)[VM_ENV_DATA_INDEX_SPECVAL] & ~0x03)) let offs = (SIZEOF_VALUE as i32) * (VM_ENV_DATA_INDEX_SPECVAL as i32); - mov(cb, reg, mem_opnd(64, reg, offs)); - and(cb, reg, imm_opnd(!0x03)); + ep_opnd = asm.load(Opnd::mem(64, ep_opnd, offs)); + ep_opnd = asm.and(ep_opnd, Opnd::Imm(!0x03)); } + + ep_opnd } +/* fn gen_getlocal_generic( ctx: &mut Context, cb: &mut CodeBlock, @@ -5966,10 +5970,10 @@ fn get_gen_fn(opcode: VALUE) -> Option<InsnGenFn> { https://github.com/ruby/ruby/blob/trunk/yjit/src/codegen.rs#L5970 //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_1 => Some(gen_setlocal_wc1), -- cgit v1.2.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/