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

ruby-changes:68595

From: Maxime <ko1@a...>
Date: Thu, 21 Oct 2021 08:10:20 +0900 (JST)
Subject: [ruby-changes:68595] 851ea46351 (master): Added member_opnd() convenience macro

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

From 851ea463512529390133e656540bb3e287ca6fdd Mon Sep 17 00:00:00 2001
From: Maxime Chevalier-Boisvert <maxime.chevalierboisvert@s...>
Date: Wed, 30 Sep 2020 16:57:54 -0400
Subject: Added member_opnd() convenience macro

---
 ujit_asm.h     |  7 +++++++
 ujit_compile.c | 26 +++++++++++---------------
 2 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/ujit_asm.h b/ujit_asm.h
index 8bb408f9f1..810b4d35b7 100644
--- a/ujit_asm.h
+++ b/ujit_asm.h
@@ -218,6 +218,13 @@ x86opnd_t imm_opnd(int64_t val); https://github.com/ruby/ruby/blob/trunk/ujit_asm.h#L218
 // Constant pointer operand
 x86opnd_t const_ptr_opnd(void* ptr);
 
+// Struct member operand
+#define member_opnd(base_reg, struct_type, member_name) mem_opnd( \
+    8 * sizeof(((struct_type*)0)->member_name), \
+    base_reg,                                   \
+    offsetof(struct_type, member_name)          \
+)
+
 // Code block methods
 uint8_t* alloc_exec_mem(size_t mem_size);
 void cb_init(codeblock_t* cb, uint8_t* mem_block, size_t mem_size);
diff --git a/ujit_compile.c b/ujit_compile.c
index b142200016..9ed6624efc 100644
--- a/ujit_compile.c
+++ b/ujit_compile.c
@@ -335,7 +335,7 @@ void gen_putself(codeblock_t* cb, codeblock_t* ocb, ctx_t* ctx) https://github.com/ruby/ruby/blob/trunk/ujit_compile.c#L335
 void gen_getlocal_wc0(codeblock_t* cb, codeblock_t* ocb, ctx_t* ctx)
 {
     // Load environment pointer EP from CFP
-    mov(cb, RDX, mem_opnd(64, RDI, 32));
+    mov(cb, RDX, member_opnd(RDI, rb_control_frame_t, ep));
 
     // Compute the offset from BP to the local
     int32_t local_idx = (int32_t)ctx_get_arg(ctx, 0);
@@ -365,7 +365,7 @@ void gen_setlocal_wc0(codeblock_t* cb, codeblock_t* ocb, ctx_t* ctx) https://github.com/ruby/ruby/blob/trunk/ujit_compile.c#L365
     */
 
     // Load environment pointer EP from CFP
-    mov(cb, RDX, mem_opnd(64, RDI, 32));
+    mov(cb, RDX, member_opnd(RDI, rb_control_frame_t, ep));
 
     // flags & VM_ENV_FLAG_WB_REQUIRED
     x86opnd_t flags_opnd = mem_opnd(64, RDX, 8 * VM_ENV_DATA_INDEX_FLAGS);
@@ -397,32 +397,28 @@ void gen_opt_send_without_block(codeblock_t* cb, codeblock_t* ocb, ctx_t* ctx) https://github.com/ruby/ruby/blob/trunk/ujit_compile.c#L397
     const struct rb_callcache *cc = cd->cc;
 
     ID mid = vm_ci_mid(cd->ci);
-    fprintf(stderr, "jitting method name %s argc: %lu\n", rb_id2name(mid), argc);
+    //fprintf(stderr, "jitting call to \"%s\", argc: %lu\n", rb_id2name(mid), argc);
 
-    if (vm_ci_flag(cd->ci) & VM_CALL_ARGS_SIMPLE) {
-        fprintf(stderr, "its simple!\n");
+    // TODO: don't jit calls that aren't simple
+    // have this codegen function return false, make codegen stop?
+    if (vm_ci_flag(cd->ci) & VM_CALL_ARGS_SIMPLE)
+    {
+        //fprintf(stderr, "simple call\n");
     }
 
 
 
 
     mov(cb, RAX, const_ptr_opnd(cd));
-    x86opnd_t ptr_to_cc = mem_opnd(64, RAX, offsetof(struct rb_call_data, cc));
+    x86opnd_t ptr_to_cc = member_opnd(RAX, struct rb_call_data, cc);
     mov(cb, RAX, ptr_to_cc);
 
+    /*
     x86opnd_t ptr_to_klass = mem_opnd(64, RAX, offsetof(struct rb_callcache, klass));
     x86opnd_t ptr_to_cme_ = mem_opnd(64, RAX, offsetof(struct rb_callcache, cme_));
     mov(cb, RBX, ptr_to_klass);
     mov(cb, RCX, ptr_to_cme_);
 
-
-
-    //print_str(cb, rb_id2name(mid));
-    //print_int(cb, RAX);
-
-
-
-
     // Points to the receiver operand on the stack
     x86opnd_t recv = ctx_stack_opnd(ctx, argc);
     mov(cb, RDX, recv);
@@ -442,7 +438,7 @@ void gen_opt_send_without_block(codeblock_t* cb, codeblock_t* ocb, ctx_t* ctx) https://github.com/ruby/ruby/blob/trunk/ujit_compile.c#L438
     jnz_ptr(cb, side_exit);
 
     print_str(cb, "method entry not invalidated!!!1");
-
+    */
 
 
 
-- 
cgit v1.2.1


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

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