From 5bdbb9c3961b74869958b4f90b24b82b28f22167 Mon Sep 17 00:00:00 2001 From: Rerumu Date: Sat, 25 Jun 2022 21:43:41 -0400 Subject: [PATCH] Add missing Luau memory operations --- codegen/luau/runtime/runtime.lua | 102 +++++++++++++++++++++++++++++++ dev-test/tests/luau_assert.lua | 24 ++++---- 2 files changed, 114 insertions(+), 12 deletions(-) diff --git a/codegen/luau/runtime/runtime.lua b/codegen/luau/runtime/runtime.lua index 4706e21..6d137e9 100644 --- a/codegen/luau/runtime/runtime.lua +++ b/codegen/luau/runtime/runtime.lua @@ -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) diff --git a/dev-test/tests/luau_assert.lua b/dev-test/tests/luau_assert.lua index ee542b3..1c21041 100644 --- a/dev-test/tests/luau_assert.lua +++ b/dev-test/tests/luau_assert.lua @@ -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 = {}