Fix signed i64
memory
This commit is contained in:
parent
34dbd6b018
commit
4e10ed9d93
@ -1,5 +1,6 @@
|
|||||||
local module = {}
|
local module = {}
|
||||||
|
|
||||||
|
local MAX_UNSIGNED = 0xffffffff
|
||||||
local MAX_SIGNED = 0x7fffffff
|
local MAX_SIGNED = 0x7fffffff
|
||||||
local BIT_SET_27 = 0x8000000
|
local BIT_SET_27 = 0x8000000
|
||||||
local BIT_SET_32 = 0x100000000
|
local BIT_SET_32 = 0x100000000
|
||||||
@ -551,13 +552,17 @@ do
|
|||||||
end
|
end
|
||||||
|
|
||||||
function load.i64_i8(memory, addr)
|
function load.i64_i8(memory, addr)
|
||||||
local temp = load_byte(memory.data, addr)
|
local data_1 = load_byte(memory.data, addr)
|
||||||
|
local data_2
|
||||||
|
|
||||||
if temp >= 0x80 then
|
if data_1 >= 0x80 then
|
||||||
temp = to_u32(temp - 0x100)
|
data_1 = to_u32(data_1 - 0x100)
|
||||||
|
data_2 = MAX_UNSIGNED
|
||||||
|
else
|
||||||
|
data_2 = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
return num_from_u32(temp, 0)
|
return num_from_u32(data_1, data_2)
|
||||||
end
|
end
|
||||||
|
|
||||||
function load.i64_u8(memory, addr)
|
function load.i64_u8(memory, addr)
|
||||||
@ -568,22 +573,25 @@ do
|
|||||||
|
|
||||||
function load.i64_i16(memory, addr)
|
function load.i64_i16(memory, addr)
|
||||||
local data = memory.data
|
local data = memory.data
|
||||||
local temp
|
local data_1, data_2
|
||||||
|
|
||||||
if addr % 4 == 0 then
|
if addr % 4 == 0 then
|
||||||
temp = bit_and(data[addr / 4] or 0, 0xFFFF)
|
data_1 = bit_and(data[addr / 4] or 0, 0xFFFF)
|
||||||
else
|
else
|
||||||
local b1 = load_byte(data, addr)
|
local b1 = load_byte(data, addr)
|
||||||
local b2 = bit_lshift(load_byte(data, addr + 1), 8)
|
local b2 = bit_lshift(load_byte(data, addr + 1), 8)
|
||||||
|
|
||||||
temp = bit_or(b1, b2)
|
data_1 = bit_or(b1, b2)
|
||||||
end
|
end
|
||||||
|
|
||||||
if temp >= 0x8000 then
|
if data_1 >= 0x8000 then
|
||||||
temp = to_u32(temp - 0x10000)
|
data_1 = to_u32(data_1 - 0x10000)
|
||||||
|
data_2 = MAX_UNSIGNED
|
||||||
|
else
|
||||||
|
data_2 = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
return num_from_u32(temp, 0)
|
return num_from_u32(data_1, data_2)
|
||||||
end
|
end
|
||||||
|
|
||||||
function load.i64_u16(memory, addr)
|
function load.i64_u16(memory, addr)
|
||||||
@ -604,20 +612,27 @@ do
|
|||||||
|
|
||||||
function load.i64_i32(memory, addr)
|
function load.i64_i32(memory, addr)
|
||||||
local data = memory.data
|
local data = memory.data
|
||||||
local temp
|
local data_1, data_2
|
||||||
|
|
||||||
if addr % 4 == 0 then
|
if addr % 4 == 0 then
|
||||||
temp = data[addr / 4] or 0
|
data_1 = data[addr / 4] or 0
|
||||||
else
|
else
|
||||||
local b1 = load_byte(data, addr)
|
local b1 = load_byte(data, addr)
|
||||||
local b2 = bit_lshift(load_byte(data, addr + 1), 8)
|
local b2 = bit_lshift(load_byte(data, addr + 1), 8)
|
||||||
local b3 = bit_lshift(load_byte(data, addr + 2), 16)
|
local b3 = bit_lshift(load_byte(data, addr + 2), 16)
|
||||||
local b4 = bit_lshift(load_byte(data, addr + 3), 24)
|
local b4 = bit_lshift(load_byte(data, addr + 3), 24)
|
||||||
|
|
||||||
temp = bit_or(b1, b2, b3, b4)
|
data_1 = bit_or(b1, b2, b3, b4)
|
||||||
end
|
end
|
||||||
|
|
||||||
return num_from_u32(temp, 0)
|
if data_1 >= 0x80000000 then
|
||||||
|
data_1 = to_u32(data_1 - 0x100000000)
|
||||||
|
data_2 = MAX_UNSIGNED
|
||||||
|
else
|
||||||
|
data_2 = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
return num_from_u32(data_1, data_2)
|
||||||
end
|
end
|
||||||
|
|
||||||
function load.i64_u32(memory, addr)
|
function load.i64_u32(memory, addr)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user