Fix bulk memory stores

This commit is contained in:
Rerumu
2023-06-23 15:16:34 -04:00
parent 32f5197b88
commit 4bd5fb8d43
7 changed files with 140 additions and 73 deletions
+30 -18
View File
@@ -849,8 +849,6 @@ do
store_byte(memory.data, addr, value)
end
local store_i8 = store.i32_n8
function store.i32_n16(memory, addr, value)
store_byte(memory.data, addr, value)
store_byte(memory.data, addr + 1, bit_rshift(value, 8))
@@ -911,7 +909,7 @@ do
end
function store.string(memory, addr, data, len)
len = len or #data
len = if len then len else #data
local rem = len % 4
@@ -924,7 +922,35 @@ do
for i = len - rem + 1, len do
local v = string_byte(data, i)
store_i8(memory, addr + i - 1, v)
store_i32_n8(memory, addr + i - 1, v)
end
end
-- FIXME: `store.copy` and `store.fill` should be ideally using the same batched store as `store.string`
function store.copy(memory_1, addr_1, memory_2, addr_2, len)
local data_1 = memory_1.data
local data_2 = memory_2.data
if addr_1 <= addr_2 then
for i = 1, len do
local v = load_byte(data_2, addr_2 + i - 1)
store_byte(data_1, addr_1 + i - 1, v)
end
else
for i = len, 1, -1 do
local v = load_byte(data_2, addr_2 + i - 1)
store_byte(data_1, addr_1 + i - 1, v)
end
end
end
function store.fill(memory, addr, len, value)
local data = memory.data
for i = 1, len do
store_byte(data, addr + i - 1, value)
end
end
@@ -944,20 +970,6 @@ do
return old
end
end
function allocator.copy(memory, destination, source, length)
for i = 1, length do
local v = load_byte(memory, source + i - 1)
store_byte(memory, destination + i - 1, v)
end
end
function allocator.fill(memory, destination, value, length)
for i = 1, length do
store_byte(memory, destination + i - 1, value)
end
end
module.load = load
module.store = store
+14 -11
View File
@@ -307,26 +307,29 @@ impl DriverNoContext for MemoryGrow {
impl DriverNoContext for MemoryCopy {
fn write(&self, w: &mut dyn Write) -> Result<()> {
let dst = self.dst();
let src = self.src();
let size = self.size();
let memory_1 = self.destination().memory();
let memory_2 = self.source().memory();
write!(w, "rt.store.copy(memory_at_0, {dst}, {src}, ")?;
size.write(w)?;
write!(w, "rt.store.copy(memory_at_{memory_1}, ")?;
self.destination().pointer().write(w)?;
write!(w, ", memory_at_{memory_2}, ")?;
self.source().pointer().write(w)?;
write!(w, ", ")?;
self.size().write(w)?;
write!(w, ")")
}
}
impl DriverNoContext for MemoryFill {
fn write(&self, w: &mut dyn Write) -> Result<()> {
let mem = self.mem();
let value = self.value();
let n = self.n();
let memory = self.destination().memory();
write!(w, "rt.store.copy(memory_at_0, {mem}, ")?;
value.write(w)?;
write!(w, "rt.store.fill(memory_at_{memory}, ")?;
self.destination().pointer().write(w)?;
write!(w, ", ")?;
n.write(w)?;
self.size().write(w)?;
write!(w, ", ")?;
self.value().write(w)?;
write!(w, ")")
}
}