From 2fceb336fd4868062a3e7dbac169a571ffd2a0b3 Mon Sep 17 00:00:00 2001 From: andreatp Date: Tue, 22 Sep 2026 18:01:17 +0100 Subject: [PATCH] Fix v128 local.set and local.tee word order in the interpreter --- .../run/endive/runtime/InterpreterMachine.java | 10 +++++----- .../java/run/endive/simd/BasicSimdTest.java | 15 +++++++++++++++ .../resources/compiled/simd-locals.wat.wasm | Bin 0 -> 217 bytes .../src/main/resources/wat/simd-locals.wat | 16 ++++++++++++++++ 4 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 wasm-corpus/src/main/resources/compiled/simd-locals.wat.wasm create mode 100644 wasm-corpus/src/main/resources/wat/simd-locals.wat diff --git a/runtime/src/main/java/run/endive/runtime/InterpreterMachine.java b/runtime/src/main/java/run/endive/runtime/InterpreterMachine.java index e686c7fef..ebefdb4d1 100644 --- a/runtime/src/main/java/run/endive/runtime/InterpreterMachine.java +++ b/runtime/src/main/java/run/endive/runtime/InterpreterMachine.java @@ -2457,8 +2457,8 @@ private static void LOCAL_SET(MStack stack, Operands operands, StackFrame curren if (localType.isObjectRef()) { currentStackFrame.setLocalRef(i, stack.popRef()); } else if (localType.equals(ValType.V128)) { - currentStackFrame.setLocal(i, stack.pop()); currentStackFrame.setLocal(i + 1, stack.pop()); + currentStackFrame.setLocal(i, stack.pop()); } else { currentStackFrame.setLocal(i, stack.pop()); } @@ -2472,10 +2472,10 @@ private static void LOCAL_TEE(MStack stack, Operands operands, StackFrame curren if (localType.isObjectRef()) { currentStackFrame.setLocalRef(i, stack.peekRef()); } else if (localType.equals(ValType.V128)) { - var tmp = stack.pop(); - currentStackFrame.setLocal(i, tmp); - currentStackFrame.setLocal(i + 1, stack.peek()); - stack.push(tmp); + var high = stack.pop(); + currentStackFrame.setLocal(i + 1, high); + currentStackFrame.setLocal(i, stack.peek()); + stack.push(high); } else { currentStackFrame.setLocal(i, stack.peek()); } diff --git a/simd/src/test/java/run/endive/simd/BasicSimdTest.java b/simd/src/test/java/run/endive/simd/BasicSimdTest.java index f4168bddb..8a069943f 100644 --- a/simd/src/test/java/run/endive/simd/BasicSimdTest.java +++ b/simd/src/test/java/run/endive/simd/BasicSimdTest.java @@ -23,4 +23,19 @@ public void shouldRunBasicExample() { var result = main.apply()[0]; assertEquals(6L, result); } + + @Test + public void shouldRoundTripV128Locals() { + var instance = + Instance.builder( + Parser.parse( + CorpusResources.getResource( + "compiled/simd-locals.wat.wasm"))) + .withMachineFactory(SimdInterpreterMachine::new) + .build(); + assertEquals(10L, instance.export("local_roundtrip").apply()[0]); + assertEquals(7L, instance.export("local_roundtrip_lane0").apply()[0]); + assertEquals(10L, instance.export("local_tee").apply()[0]); + assertEquals(7L, instance.export("local_tee_get").apply()[0]); + } } diff --git a/wasm-corpus/src/main/resources/compiled/simd-locals.wat.wasm b/wasm-corpus/src/main/resources/compiled/simd-locals.wat.wasm new file mode 100644 index 0000000000000000000000000000000000000000..db52c63277cd324f8055b97446adb755a8fafd2f GIT binary patch literal 217 zcmZQbEY4+QU|?WmWlUgTtY>Cr0dg4F-C6i^@{<#D;*0W2^HNHRG7A_OMA1aza}x7X z4Hy_XA>t*esSHfKaCUrpY6$}~R|ShKBV+Yn9(JIq96-zo#9TnE$e_URSDKj{pDY8n TG*-PzV4ZR}