Refactored unaligned access and fixed small issue

This commit is contained in:
Rerumu 2021-10-21 22:15:16 -04:00
parent e2c0b9c9ef
commit 85efc46201

View File

@ -38,21 +38,26 @@ local function rip_u64(x) return math.floor(x / 0x100000000), x % 0x100000000 en
local function merge_u64(hi, lo) return hi * 0x100000000 + lo end local function merge_u64(hi, lo) return hi * 0x100000000 + lo end
local function clear_byte(value, offset) local function black_mask_byte(value, offset)
offset *= 8 local mask = bit32.lshift(0xFF, offset * 8)
return bit32.band(value, bit32.bnot(bit32.lshift(0xFF, offset)))
return bit32.band(value, bit32.bnot(mask))
end end
local function load_byte(memory, addr) local function load_byte(memory, addr)
local offset = addr % 4 local offset = addr % 4
return bit32.rshift(memory.data[(addr - offset) / 4] or 0, 8 * offset) local value = memory.data[(addr - offset) / 4]
return bit.band(bit.rshift(value, offset * 8), 0xFF)
end end
local function store_byte(memory, addr, value) local function store_byte(memory, addr, value)
local offset = addr % 4 local offset = addr % 4
local base = (addr - offset) / 4 local adjust = (addr - offset) / 4
local old = clear_byte(memory.data[base] or 0, offset) local lhs = bit32.lshift(value, offset * 8)
memory.data[base] = bit32.bor(old, bit32.lshift(value, 8 * offset)) local rhs = black_mask_byte(memory.data[adjust] or 0, offset)
memory.data[adjust] = bit32.bor(lhs, rhs)
end end
-- Runtime functions -- Runtime functions
@ -119,12 +124,12 @@ function load.i32(memory, addr)
return memory.data[addr / 4] or 0 return memory.data[addr / 4] or 0
else else
-- unaligned read -- unaligned read
return bit32.bor( local b1 = load_byte(memory, addr)
load_byte(memory, addr), local b2 = bit32.lshift(load_byte(memory, addr + 1), 8)
bit32.lshift(load_byte(memory, addr + 1), 8), local b3 = bit32.lshift(load_byte(memory, addr + 2), 16)
bit32.lshift(load_byte(memory, addr + 2), 16), local b4 = bit32.lshift(load_byte(memory, addr + 3), 24)
bit32.lshift(load_byte(memory, addr + 3), 24)
) return bit32.bor(b1, b2, b3, b4)
end end
end end
@ -135,8 +140,8 @@ function load.i32_u8(memory, addr)
end end
function load.i64(memory, addr) function load.i64(memory, addr)
local hi = load.i32(memory, addr) local hi = load.i32(memory, addr + 4)
local lo = load.i32(memory, addr + 4) local lo = load.i32(memory, addr)
return merge_u64(hi, lo) return merge_u64(hi, lo)
end end
@ -154,9 +159,7 @@ function store.i32(memory, addr, value)
end end
end end
function store.i32_n8(memory, addr, value) function store.i32_n8(memory, addr, value) store_byte(memory, addr, bit32.band(value, 0xFF)) end
store_byte(memory, addr, bit32.band(value, 0xFF))
end
function store.i64(memory, addr, value) function store.i64(memory, addr, value)
local hi, lo = rip_u64(value) local hi, lo = rip_u64(value)