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

ruby-changes:72305

From: Jean <ko1@a...>
Date: Sat, 25 Jun 2022 07:05:09 +0900 (JST)
Subject: [ruby-changes:72305] d7cc380666 (master): iseq.c: Use ntz_intptr for faster bitmap scan

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

From d7cc380666058dab967a8b4f96782967ce3efc0d Mon Sep 17 00:00:00 2001
From: Jean Boussier <jean.boussier@g...>
Date: Fri, 24 Jun 2022 11:30:59 +0200
Subject: iseq.c: Use ntz_intptr for faster bitmap scan

---
 iseq.c | 28 ++++++++++++----------------
 1 file changed, 12 insertions(+), 16 deletions(-)

diff --git a/iseq.c b/iseq.c
index 12a1b80bf3..7f02e1b9e5 100644
--- a/iseq.c
+++ b/iseq.c
@@ -316,21 +316,17 @@ iseq_extract_values(VALUE *code, size_t pos, iseq_value_itr_t * func, void *data https://github.com/ruby/ruby/blob/trunk/iseq.c#L316
 }
 
 static inline void
-iseq_scan_bits(unsigned int i, iseq_bits_t bits, VALUE *code, iseq_value_itr_t *func, void *data)
-{
-    unsigned int count = 0;
-
-    while(bits) {
-        if (bits & 0x1) {
-            unsigned int index = (i * ISEQ_MBITS_BITLENGTH) + count;
-            VALUE op = code[index];
-            VALUE newop = func(data, op);
-            if (newop != op) {
-                code[index] = newop;
-            }
+iseq_scan_bits(iseq_bits_t bits, VALUE *code, iseq_value_itr_t *func, void *data)
+{
+    unsigned int offset;
+    while (bits) {
+        offset = ntz_intptr(bits);
+        VALUE op = code[offset];
+        VALUE newop = func(data, op);
+        if (newop != op) {
+            code[offset] = newop;
         }
-        bits >>= 1;
-        count++;
+        bits ^= bits & -bits; // Reset Lowest Set Bit (BLSR)
     }
 }
 
@@ -385,13 +381,13 @@ rb_iseq_each_value(const rb_iseq_t *iseq, iseq_value_itr_t * func, void *data) https://github.com/ruby/ruby/blob/trunk/iseq.c#L381
 
     // Embedded VALUEs
     if (ISEQ_MBITS_BUFLEN(size) == 1) {
-        iseq_scan_bits(0, body->mark_bits.single, code, func, data);
+        iseq_scan_bits(body->mark_bits.single, code, func, data);
     }
     else {
         if (body->mark_bits.list) {
             for (unsigned int i = 0; i < ISEQ_MBITS_BUFLEN(size); i++) {
                 iseq_bits_t bits = body->mark_bits.list[i];
-                iseq_scan_bits(i, bits, code, func, data);
+                iseq_scan_bits(bits, &code[i * ISEQ_MBITS_BITLENGTH], func, data);
             }
         }
     }
-- 
cgit v1.2.1


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

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