From 7b776fed2957ee064e859bde551f6465d6b7e57f Mon Sep 17 00:00:00 2001 From: Bruce Forstall Date: Mon, 1 May 2017 18:19:46 -0700 Subject: [PATCH] Refactor GT_PUTARG_REG Commit migrated from https://github.com/dotnet/coreclr/commit/eb7ba2c82eebf6f2d3326b1e95acd6b2e1bd64f8 --- src/coreclr/src/jit/codegenarm.cpp | 14 +------------- src/coreclr/src/jit/codegenarm64.cpp | 14 +------------- src/coreclr/src/jit/codegenarmarch.cpp | 31 +++++++++++++++++++++++++++++++ src/coreclr/src/jit/codegenlinear.h | 5 +++++ 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/src/coreclr/src/jit/codegenarm.cpp b/src/coreclr/src/jit/codegenarm.cpp index b22cd14..ea88429 100644 --- a/src/coreclr/src/jit/codegenarm.cpp +++ b/src/coreclr/src/jit/codegenarm.cpp @@ -669,19 +669,7 @@ void CodeGen::genCodeForTreeNode(GenTreePtr treeNode) break; case GT_PUTARG_REG: - assert(targetType != TYP_STRUCT); // Any TYP_STRUCT register args should have been removed by - // fgMorphMultiregStructArg - // We have a normal non-Struct targetType - { - GenTree* op1 = treeNode->gtOp.gtOp1; - // If child node is not already in the register we need, move it - genConsumeReg(op1); - if (targetReg != op1->gtRegNum) - { - inst_RV_RV(ins_Copy(targetType), targetReg, op1->gtRegNum, targetType); - } - } - genProduceReg(treeNode); + genPutArgReg(treeNode->AsOp()); break; case GT_CALL: diff --git a/src/coreclr/src/jit/codegenarm64.cpp b/src/coreclr/src/jit/codegenarm64.cpp index 88f60f5..cf3cae8 100644 --- a/src/coreclr/src/jit/codegenarm64.cpp +++ b/src/coreclr/src/jit/codegenarm64.cpp @@ -2466,19 +2466,7 @@ void CodeGen::genCodeForTreeNode(GenTreePtr treeNode) break; case GT_PUTARG_REG: - assert(targetType != TYP_STRUCT); // Any TYP_STRUCT register args should have been removed by - // fgMorphMultiregStructArg - // We have a normal non-Struct targetType - { - GenTree* op1 = treeNode->gtOp.gtOp1; - // If child node is not already in the register we need, move it - genConsumeReg(op1); - if (targetReg != op1->gtRegNum) - { - inst_RV_RV(ins_Copy(targetType), targetReg, op1->gtRegNum, targetType); - } - } - genProduceReg(treeNode); + genPutArgReg(treeNode->AsOp()); break; case GT_CALL: diff --git a/src/coreclr/src/jit/codegenarmarch.cpp b/src/coreclr/src/jit/codegenarmarch.cpp index 0e1da53..4c9e676 100644 --- a/src/coreclr/src/jit/codegenarmarch.cpp +++ b/src/coreclr/src/jit/codegenarmarch.cpp @@ -526,6 +526,37 @@ void CodeGen::genPutArgStk(GenTreePutArgStk* treeNode) } } +//--------------------------------------------------------------------- +// genPutArgReg - generate code for a GT_PUTARG_REG node +// +// Arguments +// treeNode - the GT_PUTARG_REG node +// +// Return value: +// None +// +void CodeGen::genPutArgReg(GenTreeOp* tree) +{ + assert(tree->OperGet() == GT_PUTARG_STK); + var_types targetType = tree->TypeGet(); + regNumber targetReg = tree->gtRegNum; + + assert(targetType != TYP_STRUCT); // Any TYP_STRUCT register args should have been removed by fgMorphMultiregStructArg + + // We have a normal non-Struct targetType + + GenTree* op1 = tree->gtOp1; + genConsumeReg(op1); + + // If child node is not already in the register we need, move it + if (targetReg != op1->gtRegNum) + { + inst_RV_RV(ins_Copy(targetType), targetReg, op1->gtRegNum, targetType); + } + + genProduceReg(tree); +} + //---------------------------------------------------------------------------------- // genMultiRegCallStoreToLocal: store multi-reg return value of a call node to a local // diff --git a/src/coreclr/src/jit/codegenlinear.h b/src/coreclr/src/jit/codegenlinear.h index 3564daf..3b56a9f 100644 --- a/src/coreclr/src/jit/codegenlinear.h +++ b/src/coreclr/src/jit/codegenlinear.h @@ -45,7 +45,12 @@ void genCkfinite(GenTreePtr treeNode); void genIntrinsic(GenTreePtr treeNode); void genPutArgStk(GenTreePutArgStk* treeNode); + +void genPutArgReg(GenTreeOp* tree); + +#if defined(_TARGET_XARCH_) unsigned getBaseVarForPutArgStk(GenTreePtr treeNode); +#endif // _TARGET_XARCH_ #if defined(_TARGET_XARCH_) || defined(_TARGET_ARM64_) unsigned getFirstArgWithStackSlot(); -- 2.7.4