diff --git a/src/coreclr/jit/codegenwasm.cpp b/src/coreclr/jit/codegenwasm.cpp index cc10f56f0c8a96..67b60e64d15304 100644 --- a/src/coreclr/jit/codegenwasm.cpp +++ b/src/coreclr/jit/codegenwasm.cpp @@ -3098,7 +3098,34 @@ void CodeGen::genEHCatchRet(BasicBlock* block) void CodeGen::genStructReturn(GenTree* treeNode) { - NYI_WASM("genStructReturn"); + assert(treeNode->OperIs(GT_RETURN)); + + GenTree* op1 = treeNode->AsOp()->GetReturnValue(); + GenTree* actualOp1 = op1->gtSkipReloadOrCopy(); + + const ReturnTypeDesc& retTypeDesc = m_compiler->compRetTypeDesc; + const unsigned regCount = retTypeDesc.GetReturnRegCount(); + + assert(regCount <= MAX_RET_REG_COUNT); + + if (actualOp1->OperIsFieldList()) + { + // Go through and consume the fields in the field list so liveness is correct. + unsigned regIndex = 0; + for (GenTreeFieldList::Use& use : actualOp1->AsFieldList()->Uses()) + { + genConsumeReg(use.GetNode()); + regIndex++; + } + + // We should only have one field in the field list, and MAX_RET_REG_COUNT is 1 on Wasm. + assert(regIndex == regCount); + assert(regIndex == 1); + + return; + } + + NYI_WASM("genStructReturn non-fieldlist cases"); } void CodeGen::genEmitGSCookieCheck(bool tailCall)