From d7cc380666058dab967a8b4f96782967ce3efc0d Mon Sep 17 00:00:00 2001 From: Jean Boussier 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(-) (limited to 'iseq.c') 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 } 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) // 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