From 64ae35c658ed2b3f36a8a16109e2939988533b19 Mon Sep 17 00:00:00 2001 From: Rerumu Date: Wed, 29 Jun 2022 22:08:34 -0400 Subject: [PATCH] Add `i64` bit counting --- codegen/luau/runtime/runtime.lua | 44 +++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/codegen/luau/runtime/runtime.lua b/codegen/luau/runtime/runtime.lua index 585af16..b64820b 100644 --- a/codegen/luau/runtime/runtime.lua +++ b/codegen/luau/runtime/runtime.lua @@ -172,9 +172,14 @@ do end do + local clz = {} + local ctz = {} local popcnt = {} - function popcnt.i32(num) + local bit_countlz = bit32.countlz + local bit_countrz = bit32.countrz + + local function popcnt_i32(num) local count = 0 while num ~= 0 do @@ -185,6 +190,43 @@ do return count end + popcnt.i32 = popcnt_i32 + + function clz.i64(num) + local data_1, data_2 = num_into_u32(num) + local temp + + if data_2 == 0 then + temp = bit_countlz(data_1) + 32 + else + temp = bit_countlz(data_2) + end + + return num_from_u32(temp, 0) + end + + function ctz.i64(num) + local data_1, data_2 = num_into_u32(num) + local temp + + if data_1 == 0 then + temp = bit_countrz(data_2) + 32 + else + temp = bit_countrz(data_1) + end + + return num_from_u32(temp, 0) + end + + function popcnt.i64(num) + local data_1, data_2 = num_into_u32(num) + local temp = popcnt_i32(data_1) + popcnt_i32(data_2) + + return num_from_u32(temp, 0) + end + + module.clz = clz + module.ctz = ctz module.popcnt = popcnt end