[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]