ruby-changes:73162
From: Maxime <ko1@a...>
Date: Tue, 30 Aug 2022 00:57:43 +0900 (JST)
Subject: [ruby-changes:73162] 8bb7421d8e (master): Port topn, adjuststack, most of opt_plus
https://git.ruby-lang.org/ruby.git/commit/?id=8bb7421d8e From 8bb7421d8e222fdae6b51049993efc46cf494f15 Mon Sep 17 00:00:00 2001 From: Maxime Chevalier-Boisvert <maxime.chevalierboisvert@s...> Date: Mon, 20 Jun 2022 15:34:14 -0400 Subject: Port topn, adjuststack, most of opt_plus --- yjit/src/codegen.rs | 47 ++++++++++++++++++++++++----------------------- yjit/src/cruby.rs | 9 ++++++++- 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index 61a2bc627b..879323dfa1 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -1067,23 +1067,21 @@ fn gen_setn( https://github.com/ruby/ruby/blob/trunk/yjit/src/codegen.rs#L1067 KeepCompiling } +*/ // get nth stack value, then push it fn gen_topn( jit: &mut JITState, ctx: &mut Context, - cb: &mut CodeBlock, + asm: &mut Assembler, _ocb: &mut OutlinedCb, ) -> CodegenStatus { - let nval: VALUE = jit_get_arg(jit, 0); - let VALUE(n) = nval; - - let top_n_val = ctx.stack_opnd(n.try_into().unwrap()); - let mapping = ctx.get_opnd_mapping(StackOpnd(n.try_into().unwrap())); + let nval = jit_get_arg(jit, 0); + let top_n_val = ctx.stack_opnd(nval.into()); + let mapping = ctx.get_opnd_mapping(StackOpnd(nval.into())); let loc0 = ctx.stack_push_mapping(mapping); - mov(cb, REG0, top_n_val); - mov(cb, loc0, REG0); + asm.mov(loc0, top_n_val); KeepCompiling } @@ -1092,7 +1090,7 @@ fn gen_topn( https://github.com/ruby/ruby/blob/trunk/yjit/src/codegen.rs#L1090 fn gen_adjuststack( jit: &mut JITState, ctx: &mut Context, - _cb: &mut CodeBlock, + _cb: &mut Assembler, _ocb: &mut OutlinedCb, ) -> CodegenStatus { let nval: VALUE = jit_get_arg(jit, 0); @@ -1102,10 +1100,11 @@ fn gen_adjuststack( https://github.com/ruby/ruby/blob/trunk/yjit/src/codegen.rs#L1100 KeepCompiling } +/* fn gen_opt_plus( jit: &mut JITState, ctx: &mut Context, - cb: &mut CodeBlock, + asm: &mut Assembler, ocb: &mut OutlinedCb, ) -> CodegenStatus { if !jit_at_current_insn(jit) { @@ -1126,28 +1125,30 @@ fn gen_opt_plus( https://github.com/ruby/ruby/blob/trunk/yjit/src/codegen.rs#L1125 } // Check that both operands are fixnums - guard_two_fixnums(ctx, cb, side_exit); + guard_two_fixnums(ctx, asm, side_exit); // Get the operands and destination from the stack let arg1 = ctx.stack_pop(1); let arg0 = ctx.stack_pop(1); // Add arg0 + arg1 and test for overflow - mov(cb, REG0, arg0); - sub(cb, REG0, imm_opnd(1)); - add(cb, REG0, arg1); - jo_ptr(cb, side_exit); + let arg0_untag = asm.sub(arg0, Opnd::Imm(1)); + let out_val = asm.add(arg0_untag, arg1); + asm.jo(side_exit); // Push the output on the stack let dst = ctx.stack_push(Type::Fixnum); - mov(cb, dst, REG0); + asm.mov(dst, out_val); KeepCompiling } else { - gen_opt_send_without_block(jit, ctx, cb, ocb) + todo!(); + //gen_opt_send_without_block(jit, ctx, cb, ocb) } } +*/ +/* // new array initialized from top N values fn gen_newarray( jit: &mut JITState, @@ -5968,17 +5969,17 @@ fn get_gen_fn(opcode: VALUE) -> Option<InsnGenFn> { https://github.com/ruby/ruby/blob/trunk/yjit/src/codegen.rs#L5969 YARVINSN_putself => Some(gen_putself), YARVINSN_putspecialobject => Some(gen_putspecialobject), //YARVINSN_setn => Some(gen_setn), - //YARVINSN_topn => Some(gen_topn), - //YARVINSN_adjuststack => Some(gen_adjuststack), + YARVINSN_topn => Some(gen_topn), + YARVINSN_adjuststack => Some(gen_adjuststack), //YARVINSN_getlocal => Some(gen_getlocal), YARVINSN_getlocal_WC_0 => Some(gen_getlocal_wc0), //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), + //YARVINSN_opt_plus => Some(gen_opt_plus), /* - YARVINSN_setlocal => Some(gen_setlocal), - YARVINSN_setlocal_WC_0 => Some(gen_setlocal_wc0), - YARVINSN_setlocal_WC_1 => Some(gen_setlocal_wc1), - YARVINSN_opt_plus => Some(gen_opt_plus), YARVINSN_opt_minus => Some(gen_opt_minus), YARVINSN_opt_and => Some(gen_opt_and), YARVINSN_opt_or => Some(gen_opt_or), diff --git a/yjit/src/cruby.rs b/yjit/src/cruby.rs index 9195578172..8543b6d971 100644 --- a/yjit/src/cruby.rs +++ b/yjit/src/cruby.rs @@ -596,7 +596,14 @@ impl From<VALUE> for i32 { https://github.com/ruby/ruby/blob/trunk/yjit/src/cruby.rs#L596 fn from(value: VALUE) -> Self { let VALUE(uimm) = value; assert!(uimm <= (i32::MAX as usize)); - uimm as i32 + uimm.try_into().unwrap() + } +} + +impl From<VALUE> for u16 { + fn from(value: VALUE) -> Self { + let VALUE(uimm) = value; + uimm.try_into().unwrap() } } -- cgit v1.2.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/