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);