From 0c7790869bb32ea89bb3eb83ffc039c9b87b8dc2 Mon Sep 17 00:00:00 2001 From: Larry Ewing Date: Wed, 22 Jul 2026 16:40:03 -0500 Subject: [PATCH] JIT: Fix WASM scalar extraction from SIMD parameters Extract scalar fields directly from SIMD parameter-register locals on WASM so v128 values are not retyped as scalar locals. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e48939ab-dc73-4630-a8ca-72c3b926133a --- src/coreclr/jit/lower.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/coreclr/jit/lower.cpp b/src/coreclr/jit/lower.cpp index 82680153e98589..54bca2b4a8995c 100644 --- a/src/coreclr/jit/lower.cpp +++ b/src/coreclr/jit/lower.cpp @@ -9289,7 +9289,23 @@ void Lowering::FindInducedParameterRegisterLocals() GenTree* value = m_compiler->gtNewLclVarNode(remappedLclNum); +#ifdef TARGET_WASM + if (varTypeIsSIMD(value) && !varTypeIsSIMD(fld)) + { + // Unlike native targets, wasm cannot reinterpret a v128 local access as a scalar. + const unsigned laneOffset = fld->GetLclOffs() - regSegment->Offset; + const unsigned scalarSize = genTypeSize(fld); + assert((laneOffset % scalarSize) == 0); + + const unsigned laneIndex = laneOffset / scalarSize; + value = m_compiler->gtNewSimdGetElementNode(fld->TypeGet(), value, + m_compiler->gtNewIconNode(static_cast(laneIndex)), + fld->TypeGet(), genTypeSize(value)); + } + else if (varTypeUsesFloatReg(value)) +#else if (varTypeUsesFloatReg(value)) +#endif // TARGET_WASM { assert(fld->GetLclOffs() == regSegment->Offset);