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

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/

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