Add missing Luau memory operations
This commit is contained in:
parent
96482310c5
commit
5bdbb9c396
@ -502,6 +502,20 @@ do
|
||||
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)
|
||||
local data = memory.data
|
||||
|
||||
@ -519,6 +533,94 @@ do
|
||||
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
|
||||
|
||||
function load.i64(memory, addr)
|
||||
|
@ -28,14 +28,14 @@ do
|
||||
load_checked("i32_i8", 1)
|
||||
load_checked("i32_u8", 1)
|
||||
load_checked("i32_i16", 2)
|
||||
-- load_checked("i32_u16", 2)
|
||||
load_checked("i32_u16", 2)
|
||||
load_checked("i32", 4)
|
||||
-- load_checked("i64_i8", 1)
|
||||
-- load_checked("i64_u8", 1)
|
||||
-- load_checked("i64_i16", 2)
|
||||
-- load_checked("i64_u16", 2)
|
||||
-- load_checked("i64_i32", 4)
|
||||
-- load_checked("i64_u32", 4)
|
||||
load_checked("i64_i8", 1)
|
||||
load_checked("i64_u8", 1)
|
||||
load_checked("i64_i16", 2)
|
||||
load_checked("i64_u16", 2)
|
||||
load_checked("i64_i32", 4)
|
||||
load_checked("i64_u32", 4)
|
||||
load_checked("i64", 8)
|
||||
load_checked("f32", 4)
|
||||
load_checked("f64", 8)
|
||||
@ -43,12 +43,12 @@ do
|
||||
store_checked("i32_n8", 1)
|
||||
store_checked("i32_n16", 2)
|
||||
store_checked("i32", 4)
|
||||
-- store_checked("i64_n8", 1)
|
||||
-- store_checked("i64_n16", 2)
|
||||
-- store_checked("i64_n32", 4)
|
||||
store_checked("i64_n8", 1)
|
||||
store_checked("i64_n16", 2)
|
||||
store_checked("i64_n32", 4)
|
||||
store_checked("i64", 8)
|
||||
-- store_checked("f32", 4)
|
||||
-- store_checked("f64", 8)
|
||||
store_checked("f32", 4)
|
||||
store_checked("f64", 8)
|
||||
end
|
||||
|
||||
local loaded = {}
|
||||
|
Loading…
x
Reference in New Issue
Block a user