summaryrefslogtreecommitdiff
path: root/crates/parser
diff options
context:
space:
mode:
authorHenry <mail@henrygressmann.de>2026-07-23 11:37:20 +0200
committerHenry <mail@henrygressmann.de>2026-07-23 11:37:20 +0200
commita4e700158aa62bcfcb70e15d614485a2122eef4f (patch)
tree026023029a9e592a66de14c1a71da5fa60dabfaa /crates/parser
parent1dc86cd5e68f754a03bd38268d7d4a693bbdea47 (diff)
chore: add more memory superinstructions
Signed-off-by: Henry <mail@henrygressmann.de>
Diffstat (limited to 'crates/parser')
-rw-r--r--crates/parser/src/optimize.rs94
1 files changed, 94 insertions, 0 deletions
diff --git a/crates/parser/src/optimize.rs b/crates/parser/src/optimize.rs
index a26142c..80dfa0d 100644
--- a/crates/parser/src/optimize.rs
+++ b/crates/parser/src/optimize.rs
@@ -164,6 +164,16 @@ fn rewrite(
rewrite!(instrs, i, [LocalGet128(local), Const128(c)] => BinOpLocalConst128(BinOp128::AndNot, local, c));
}
I32Store(memarg) | F32Store(memarg) => {
+ rewrite!(instrs, i,
+ [LocalGet32(addr), LoadLocal32(load_memarg, load_addr), AddConst32(1)] if
+ (load_memarg == memarg && addr == u16::from(load_addr)) =>
+ IncMemoryLocal32(memarg, load_addr)
+ );
+ rewrite!(instrs, i,
+ [LocalGet64(addr), LoadLocal32(load_memarg, load_addr), AddConst32(1)] if
+ (load_memarg == memarg && addr == u16::from(load_addr)) =>
+ IncMemoryLocal32(memarg, load_addr)
+ );
rewrite!(instrs, i, [F32Mul, F32Add] => FMaStoreF32(memarg));
rewrite!(instrs, i,
[LocalGet32(addr_local), LocalGet32(value_local)] if
@@ -172,6 +182,16 @@ fn rewrite(
);
}
I64Store(memarg) | F64Store(memarg) => {
+ rewrite!(instrs, i,
+ [LocalGet32(addr), LoadLocal64(load_memarg, load_addr), AddConst64(1)] if
+ (load_memarg == memarg && addr == u16::from(load_addr)) =>
+ IncMemoryLocal64(memarg, load_addr)
+ );
+ rewrite!(instrs, i,
+ [LocalGet64(addr), LoadLocal64(load_memarg, load_addr), AddConst64(1)] if
+ (load_memarg == memarg && addr == u16::from(load_addr)) =>
+ IncMemoryLocal64(memarg, load_addr)
+ );
rewrite!(instrs, i, [F64Mul, F64Add] => FMaStoreF64(memarg));
rewrite!(instrs, i,
[LocalGet32(addr_local), LocalGet64(value_local)] if
@@ -191,6 +211,60 @@ fn rewrite(
[LocalGet32(addr_local)] if (let Ok(addr_local) = u8::try_from(addr_local)) =>
LoadLocal32(memarg, addr_local)
);
+ rewrite!(instrs, i,
+ [LocalGet64(addr_local)] if (let Ok(addr_local) = u8::try_from(addr_local)) =>
+ LoadLocal32(memarg, addr_local)
+ );
+ }
+ I64Load(memarg) | F64Load(memarg) => {
+ rewrite!(instrs, i,
+ [LocalGet32(addr_local)] if (let Ok(addr_local) = u8::try_from(addr_local)) =>
+ LoadLocal64(memarg, addr_local)
+ );
+ rewrite!(instrs, i,
+ [LocalGet64(addr_local)] if (let Ok(addr_local) = u8::try_from(addr_local)) =>
+ LoadLocal64(memarg, addr_local)
+ );
+ }
+ I32Load8S(memarg) => {
+ rewrite!(instrs, i,
+ [LocalGet32(addr_local)] if (let Ok(addr_local) = u8::try_from(addr_local)) =>
+ LoadLocal8S32(memarg, addr_local)
+ );
+ rewrite!(instrs, i,
+ [LocalGet64(addr_local)] if (let Ok(addr_local) = u8::try_from(addr_local)) =>
+ LoadLocal8S32(memarg, addr_local)
+ );
+ }
+ I32Load8U(memarg) => {
+ rewrite!(instrs, i,
+ [LocalGet32(addr_local)] if (let Ok(addr_local) = u8::try_from(addr_local)) =>
+ LoadLocal8U32(memarg, addr_local)
+ );
+ rewrite!(instrs, i,
+ [LocalGet64(addr_local)] if (let Ok(addr_local) = u8::try_from(addr_local)) =>
+ LoadLocal8U32(memarg, addr_local)
+ );
+ }
+ I32Load16S(memarg) => {
+ rewrite!(instrs, i,
+ [LocalGet32(addr_local)] if (let Ok(addr_local) = u8::try_from(addr_local)) =>
+ LoadLocal16S32(memarg, addr_local)
+ );
+ rewrite!(instrs, i,
+ [LocalGet64(addr_local)] if (let Ok(addr_local) = u8::try_from(addr_local)) =>
+ LoadLocal16S32(memarg, addr_local)
+ );
+ }
+ I32Load16U(memarg) => {
+ rewrite!(instrs, i,
+ [LocalGet32(addr_local)] if (let Ok(addr_local) = u8::try_from(addr_local)) =>
+ LoadLocal16U32(memarg, addr_local)
+ );
+ rewrite!(instrs, i,
+ [LocalGet64(addr_local)] if (let Ok(addr_local) = u8::try_from(addr_local)) =>
+ LoadLocal16U32(memarg, addr_local)
+ );
}
MemoryFill(mem) => {
rewrite!(instrs, i, [Const32(val), Const32(size)] => MemoryFillImm(mem, val as u8, size))
@@ -231,6 +305,10 @@ fn rewrite(
set_local_const = SetLocalConst32
);
rewrite!(instrs, i, [LoadLocal32(memarg, addr)] if (let Ok(dst) = u8::try_from(dst)) => LoadLocalSet32(memarg, addr, dst));
+ rewrite!(instrs, i, [LoadLocal8S32(memarg, addr)] if (let Ok(dst) = u8::try_from(dst)) => LoadLocalSet8S32(memarg, addr, dst));
+ rewrite!(instrs, i, [LoadLocal8U32(memarg, addr)] if (let Ok(dst) = u8::try_from(dst)) => LoadLocalSet8U32(memarg, addr, dst));
+ rewrite!(instrs, i, [LoadLocal16S32(memarg, addr)] if (let Ok(dst) = u8::try_from(dst)) => LoadLocalSet16S32(memarg, addr, dst));
+ rewrite!(instrs, i, [LoadLocal16U32(memarg, addr)] if (let Ok(dst) = u8::try_from(dst)) => LoadLocalSet16U32(memarg, addr, dst));
rewrite!(instrs, i,
[LocalGet32(addr), I32Load(memarg)] if
(let (Ok(addr), Ok(dst)) = (u8::try_from(addr), u8::try_from(dst))) =>
@@ -333,6 +411,22 @@ fn rewrite(
[LoadLocal32(memarg, addr)] if (let Ok(dst) = u8::try_from(dst)) =>
LoadLocalTee32(memarg, addr, dst)
);
+ rewrite!(instrs, i,
+ [LoadLocal8S32(memarg, addr)] if (let Ok(dst) = u8::try_from(dst)) =>
+ LoadLocalTee8S32(memarg, addr, dst)
+ );
+ rewrite!(instrs, i,
+ [LoadLocal8U32(memarg, addr)] if (let Ok(dst) = u8::try_from(dst)) =>
+ LoadLocalTee8U32(memarg, addr, dst)
+ );
+ rewrite!(instrs, i,
+ [LoadLocal16S32(memarg, addr)] if (let Ok(dst) = u8::try_from(dst)) =>
+ LoadLocalTee16S32(memarg, addr, dst)
+ );
+ rewrite!(instrs, i,
+ [LoadLocal16U32(memarg, addr)] if (let Ok(dst) = u8::try_from(dst)) =>
+ LoadLocalTee16U32(memarg, addr, dst)
+ );
}
LocalTee64(dst) => {
fold_local_binop!(