Extend Luau runtime

This commit is contained in:
Rerumu 2021-11-22 21:08:12 -05:00
parent 2160ad2130
commit 3e3f3c813d

View File

@ -14,6 +14,30 @@ do
end end
end end
do
local clz = {}
local ctz = {}
local popcnt = {}
module.clz = clz
module.ctz = ctz
module.popcnt = popcnt
clz.i32 = bit32.countlz
ctz.i32 = bit32.countrz
function popcnt.i32(num)
local count = 0
while num ~= 0 do
num = bit.band(num, num - 1)
count = count + 1
end
return count
end
end
do do
local eqz = {} local eqz = {}
local eq = {} local eq = {}
@ -43,16 +67,24 @@ do
return x return x
end end
function eqz.i32(lhs) return lhs == 0 and 1 or 0 end
function eqz.i64(lhs) return lhs == 0 and 1 or 0 end
function eq.i32(lhs, rhs) return lhs == rhs and 1 or 0 end function eq.i32(lhs, rhs) return lhs == rhs and 1 or 0 end
function eq.i64(lhs, rhs) return lhs == rhs and 1 or 0 end function eq.i64(lhs, rhs) return lhs == rhs and 1 or 0 end
function eqz.i32(lhs) return lhs == 0 and 1 or 0 end
function eqz.i64(lhs) return lhs == 0 and 1 or 0 end
function ge.i32(lhs, rhs) return lhs >= rhs and 1 or 0 end
function ge.i64(lhs, rhs) return lhs >= rhs and 1 or 0 end
function ge.u32(lhs, rhs) return unsign_i32(lhs) >= unsign_i32(rhs) and 1 or 0 end function ge.u32(lhs, rhs) return unsign_i32(lhs) >= unsign_i32(rhs) and 1 or 0 end
function ge.u64(lhs, rhs) return unsign_i64(lhs) >= unsign_i64(rhs) and 1 or 0 end function ge.u64(lhs, rhs) return unsign_i64(lhs) >= unsign_i64(rhs) and 1 or 0 end
function gt.i32(lhs, rhs) return lhs > rhs and 1 or 0 end
function gt.i64(lhs, rhs) return lhs > rhs and 1 or 0 end
function gt.u32(lhs, rhs) return unsign_i32(lhs) > unsign_i32(rhs) and 1 or 0 end function gt.u32(lhs, rhs) return unsign_i32(lhs) > unsign_i32(rhs) and 1 or 0 end
function gt.u64(lhs, rhs) return unsign_i64(lhs) > unsign_i64(rhs) and 1 or 0 end function gt.u64(lhs, rhs) return unsign_i64(lhs) > unsign_i64(rhs) and 1 or 0 end
function le.i32(lhs, rhs) return lhs <= rhs and 1 or 0 end
function le.i64(lhs, rhs) return lhs <= rhs and 1 or 0 end
function le.u32(lhs, rhs) return unsign_i32(lhs) <= unsign_i32(rhs) and 1 or 0 end function le.u32(lhs, rhs) return unsign_i32(lhs) <= unsign_i32(rhs) and 1 or 0 end
function le.u64(lhs, rhs) return unsign_i64(lhs) <= unsign_i64(rhs) and 1 or 0 end function le.u64(lhs, rhs) return unsign_i64(lhs) <= unsign_i64(rhs) and 1 or 0 end
function lt.i32(lhs, rhs) return lhs < rhs and 1 or 0 end
function lt.i64(lhs, rhs) return lhs < rhs and 1 or 0 end
function lt.u32(lhs, rhs) return unsign_i32(lhs) < unsign_i32(rhs) and 1 or 0 end function lt.u32(lhs, rhs) return unsign_i32(lhs) < unsign_i32(rhs) and 1 or 0 end
function lt.u64(lhs, rhs) return unsign_i64(lhs) < unsign_i64(rhs) and 1 or 0 end function lt.u64(lhs, rhs) return unsign_i64(lhs) < unsign_i64(rhs) and 1 or 0 end
function ne.i32(lhs, rhs) return lhs ~= rhs and 1 or 0 end function ne.i32(lhs, rhs) return lhs ~= rhs and 1 or 0 end
@ -83,10 +115,16 @@ end
do do
local shl = {} local shl = {}
local shr = {} local shr = {}
local rotl = {}
local rotr = {}
module.shl = shl module.shl = shl
module.shr = shr module.shr = shr
module.rotl = rotl
module.rotr = rotr
rotl.i32 = bit32.lrotate
rotr.i32 = bit32.rrotate
shl.i32 = bit32.lshift shl.i32 = bit32.lshift
shl.i64 = bit32.lshift shl.i64 = bit32.lshift
shl.u32 = bit32.lshift shl.u32 = bit32.lshift
@ -128,7 +166,7 @@ do
local function load_byte(memory, addr) local function load_byte(memory, addr)
local offset = addr % 4 local offset = addr % 4
local value = memory.data[(addr - offset) / 4] local value = memory.data[(addr - offset) / 4] or 0
return bit32.band(bit32.rshift(value, offset * 8), 0xFF) return bit32.band(bit32.rshift(value, offset * 8), 0xFF)
end end