Add missing Luau memory operations

This commit is contained in:
Rerumu 2022-06-25 21:43:41 -04:00
parent 96482310c5
commit 5bdbb9c396
2 changed files with 114 additions and 12 deletions

View File

@ -502,6 +502,20 @@ do
end end
end end
function load.i32_u16(memory, addr)
local data = memory.data
local num
if addr % 4 == 0 then
return bit_band(data[addr / 4] or 0, 0xFFFF)
else
local b1 = load_byte(data, addr)
local b2 = bit_lshift(load_byte(data, addr + 1), 8)
return bit_bor(b1, b2)
end
end
function load.i32(memory, addr) function load.i32(memory, addr)
local data = memory.data local data = memory.data
@ -519,6 +533,94 @@ do
end end
end end
function load.i64_i8(memory, addr)
local b = load_byte(memory.data, addr)
if b >= 0x80 then
b = to_u32(b - 0x100)
end
return num_from_u32(b, 0)
end
function load.i64_u8(memory, addr)
local temp = load_byte(memory.data, addr)
return num_from_u32(temp, 0)
end
function load.i64_i16(memory, addr)
local data = memory.data
local num
if addr % 4 == 0 then
num = bit_band(data[addr / 4] or 0, 0xFFFF)
else
local b1 = load_byte(data, addr)
local b2 = bit_lshift(load_byte(data, addr + 1), 8)
num = bit_bor(b1, b2)
end
if num >= 0x8000 then
num = to_u32(num - 0x10000)
end
return num_from_u32(num, 0)
end
function load.i64_u16(memory, addr)
local data = memory.data
local num
if addr % 4 == 0 then
num = bit_band(data[addr / 4] or 0, 0xFFFF)
else
local b1 = load_byte(data, addr)
local b2 = bit_lshift(load_byte(data, addr + 1), 8)
num = bit_bor(b1, b2)
end
return num_from_u32(num, 0)
end
function load.i64_i32(memory, addr)
local data = memory.data
local num
if addr % 4 == 0 then
num = data[addr / 4] or 0
else
local b1 = load_byte(data, addr)
local b2 = bit_lshift(load_byte(data, addr + 1), 8)
local b3 = bit_lshift(load_byte(data, addr + 2), 16)
local b4 = bit_lshift(load_byte(data, addr + 3), 24)
num = bit_bor(b1, b2, b3, b4)
end
return num_from_u32(num, 0)
end
function load.i64_u32(memory, addr)
local data = memory.data
local num
if addr % 4 == 0 then
num = data[addr / 4] or 0
else
local b1 = load_byte(data, addr)
local b2 = bit_lshift(load_byte(data, addr + 1), 8)
local b3 = bit_lshift(load_byte(data, addr + 2), 16)
local b4 = bit_lshift(load_byte(data, addr + 3), 24)
num = bit_bor(b1, b2, b3, b4)
end
return num_from_u32(num, 0)
end
local load_i32 = load.i32 local load_i32 = load.i32
function load.i64(memory, addr) function load.i64(memory, addr)

View File

@ -28,14 +28,14 @@ do
load_checked("i32_i8", 1) load_checked("i32_i8", 1)
load_checked("i32_u8", 1) load_checked("i32_u8", 1)
load_checked("i32_i16", 2) load_checked("i32_i16", 2)
-- load_checked("i32_u16", 2) load_checked("i32_u16", 2)
load_checked("i32", 4) load_checked("i32", 4)
-- load_checked("i64_i8", 1) load_checked("i64_i8", 1)
-- load_checked("i64_u8", 1) load_checked("i64_u8", 1)
-- load_checked("i64_i16", 2) load_checked("i64_i16", 2)
-- load_checked("i64_u16", 2) load_checked("i64_u16", 2)
-- load_checked("i64_i32", 4) load_checked("i64_i32", 4)
-- load_checked("i64_u32", 4) load_checked("i64_u32", 4)
load_checked("i64", 8) load_checked("i64", 8)
load_checked("f32", 4) load_checked("f32", 4)
load_checked("f64", 8) load_checked("f64", 8)
@ -43,12 +43,12 @@ do
store_checked("i32_n8", 1) store_checked("i32_n8", 1)
store_checked("i32_n16", 2) store_checked("i32_n16", 2)
store_checked("i32", 4) store_checked("i32", 4)
-- store_checked("i64_n8", 1) store_checked("i64_n8", 1)
-- store_checked("i64_n16", 2) store_checked("i64_n16", 2)
-- store_checked("i64_n32", 4) store_checked("i64_n32", 4)
store_checked("i64", 8) store_checked("i64", 8)
-- store_checked("f32", 4) store_checked("f32", 4)
-- store_checked("f64", 8) store_checked("f64", 8)
end end
local loaded = {} local loaded = {}