Add missing Luau memory operations
This commit is contained in:
parent
96482310c5
commit
5bdbb9c396
@ -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)
|
||||||
|
@ -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 = {}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user