diff options
| author | gingerBill <gingerBill@users.noreply.github.com> | 2026-02-02 14:28:16 +0000 |
|---|---|---|
| committer | gingerBill <gingerBill@users.noreply.github.com> | 2026-02-02 14:28:16 +0000 |
| commit | bb7496a2fcc58238a4e3abcc431313385a15183f (patch) | |
| tree | 1bced935d1c3ad3b74dc530cc60d95a103b0db28 /src/check_builtin.cpp | |
| parent | 80c948277455eb9deaf79ac910fdc8957038fb75 (diff) | |
Add `intrinsics.count_trailing_ones` and `intrinsics.count_leading_ones`
Diffstat (limited to 'src/check_builtin.cpp')
| -rw-r--r-- | src/check_builtin.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index e2428576e..1a094c1f0 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -5204,6 +5204,8 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As case BuiltinProc_count_zeros: case BuiltinProc_count_trailing_zeros: case BuiltinProc_count_leading_zeros: + case BuiltinProc_count_trailing_ones: + case BuiltinProc_count_leading_ones: case BuiltinProc_reverse_bits: { Operand x = {}; @@ -5301,6 +5303,27 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As v += 1; } break; + + case BuiltinProc_count_trailing_ones: + for (u64 i = 0; i < bit_size; i++) { + u8 b = cast(u8)(i & 7); + u8 j = cast(u8)(i >> 3); + if ((rop[j] & (1 << b)) == 0) { + break; + } + v += 1; + } + break; + case BuiltinProc_count_leading_ones: + for (u64 i = bit_size-1; i < bit_size; i--) { + u8 b = cast(u8)(i & 7); + u8 j = cast(u8)(i >> 3); + if ((rop[j] & (1 << b)) == 0) { + break; + } + v += 1; + } + break; } |