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

ruby-changes:68722

From: Maxime <ko1@a...>
Date: Thu, 21 Oct 2021 08:12:35 +0900 (JST)
Subject: [ruby-changes:68722] c61238a276 (master): Optimize putobject codegen

https://git.ruby-lang.org/ruby.git/commit/?id=c61238a276

From c61238a2761ca8d9bbe56dc3b06aa07da5784c96 Mon Sep 17 00:00:00 2001
From: Maxime Chevalier-Boisvert <maxime.chevalierboisvert@s...>
Date: Mon, 25 Jan 2021 17:11:10 -0500
Subject: Optimize putobject codegen

---
 ujit_codegen.c | 32 ++++++++++++++++++++++++--------
 1 file changed, 24 insertions(+), 8 deletions(-)

diff --git a/ujit_codegen.c b/ujit_codegen.c
index e10e276fe2..c3e7f912d0 100644
--- a/ujit_codegen.c
+++ b/ujit_codegen.c
@@ -265,15 +265,31 @@ gen_putnil(jitstate_t* jit, ctx_t* ctx) https://github.com/ruby/ruby/blob/trunk/ujit_codegen.c#L265
 static bool
 gen_putobject(jitstate_t* jit, ctx_t* ctx)
 {
-    // Load the argument from the bytecode sequence.
-    // We need to do this as the argument can change due to GC compaction.
-    x86opnd_t pc_imm = const_ptr_opnd((void*)jit->pc);
-    mov(cb, RAX, pc_imm);
-    mov(cb, RAX, mem_opnd(64, RAX, 8)); // One after the opcode
+    VALUE arg = jit_get_arg(jit, 0);
 
-    // Write argument at SP
-    x86opnd_t stack_top = ctx_stack_push(ctx, T_NONE);
-    mov(cb, stack_top, RAX);
+    if (FIXNUM_P(arg))
+    {
+        // Keep track of the fixnum type tag
+        x86opnd_t stack_top = ctx_stack_push(ctx, T_FIXNUM);
+        mov(cb, stack_top, imm_opnd((int64_t)arg));
+    }
+    else if (arg == Qtrue || arg == Qfalse)
+    {
+        x86opnd_t stack_top = ctx_stack_push(ctx, T_NONE);
+        mov(cb, stack_top, imm_opnd((int64_t)arg));
+    }
+    else
+    {
+        // Load the argument from the bytecode sequence.
+        // We need to do this as the argument can change due to GC compaction.
+        x86opnd_t pc_plus_one = const_ptr_opnd((void*)(jit->pc + 1));
+        mov(cb, RAX, pc_plus_one);
+        mov(cb, RAX, mem_opnd(64, RAX, 0));
+
+        // Write argument at SP
+        x86opnd_t stack_top = ctx_stack_push(ctx, T_NONE);
+        mov(cb, stack_top, RAX);
+    }
 
     return true;
 }
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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