From 5751fc08a779339284148e0716f3134401542dcb Mon Sep 17 00:00:00 2001 From: Bruce Forstall Date: Mon, 1 May 2017 17:06:55 -0700 Subject: [PATCH] Refactor GT_STORE_LCL_FLD Commit migrated from https://github.com/dotnet/coreclr/commit/5a8bec34ae8b8679ce03134cfed4ee35d120dead --- src/coreclr/src/jit/codegenarm.cpp | 86 ++++++++++++++++------------ src/coreclr/src/jit/codegenarm64.cpp | 106 +++++++++++++++++++---------------- src/coreclr/src/jit/codegenlinear.h | 2 + 3 files changed, 110 insertions(+), 84 deletions(-) diff --git a/src/coreclr/src/jit/codegenarm.cpp b/src/coreclr/src/jit/codegenarm.cpp index e8ef591..1ccf06f 100644 --- a/src/coreclr/src/jit/codegenarm.cpp +++ b/src/coreclr/src/jit/codegenarm.cpp @@ -486,43 +486,8 @@ void CodeGen::genCodeForTreeNode(GenTreePtr treeNode) break; case GT_STORE_LCL_FLD: - { - noway_assert(targetType != TYP_STRUCT); - - // record the offset - unsigned offset = treeNode->gtLclFld.gtLclOffs; - - // We must have a stack store with GT_STORE_LCL_FLD - noway_assert(!treeNode->InReg()); - noway_assert(targetReg == REG_NA); - - GenTreeLclVarCommon* varNode = treeNode->AsLclVarCommon(); - unsigned varNum = varNode->gtLclNum; - assert(varNum < compiler->lvaCount); - LclVarDsc* varDsc = &(compiler->lvaTable[varNum]); - - // Ensure that lclVar nodes are typed correctly. - assert(!varDsc->lvNormalizeOnStore() || targetType == genActualType(varDsc->TypeGet())); - - GenTreePtr data = treeNode->gtOp.gtOp1->gtEffectiveVal(); - instruction ins = ins_Store(targetType); - emitAttr attr = emitTypeSize(targetType); - if (data->isContainedIntOrIImmed()) - { - assert(data->IsIntegralConst(0)); - NYI_ARM("st.lclFld contained operand"); - } - else - { - assert(!data->isContained()); - genConsumeReg(data); - emit->emitIns_S_R(ins, attr, data->gtRegNum, varNum, offset); - } - - genUpdateLife(varNode); - varDsc->lvRegNum = REG_STK; - } - break; + genCodeForStoreLclFld(treeNode->AsLclFld()); + break; case GT_STORE_LCL_VAR: { @@ -1589,6 +1554,53 @@ void CodeGen::genCodeForShiftLong(GenTreePtr tree) } //------------------------------------------------------------------------ +// genCodeForStoreLclFld: Produce code for a GT_STORE_LCL_FLD node. +// +// Arguments: +// tree - the GT_STORE_LCL_FLD node +// +void CodeGen::genCodeForStoreLclFld(GenTreeLclFld* tree) +{ + var_types targetType = tree->TypeGet(); + regNumber targetReg = tree->gtRegNum; + emitter* emit = getEmitter(); + + noway_assert(targetType != TYP_STRUCT); + + // record the offset + unsigned offset = tree->gtLclOffs; + + // We must have a stack store with GT_STORE_LCL_FLD + noway_assert(!tree->InReg()); + noway_assert(targetReg == REG_NA); + + unsigned varNum = tree->gtLclNum; + assert(varNum < compiler->lvaCount); + LclVarDsc* varDsc = &(compiler->lvaTable[varNum]); + + // Ensure that lclVar nodes are typed correctly. + assert(!varDsc->lvNormalizeOnStore() || targetType == genActualType(varDsc->TypeGet())); + + GenTreePtr data = tree->gtOp1->gtEffectiveVal(); + instruction ins = ins_Store(targetType); + emitAttr attr = emitTypeSize(targetType); + if (data->isContainedIntOrIImmed()) + { + assert(data->IsIntegralConst(0)); + NYI_ARM("st.lclFld contained operand"); + } + else + { + assert(!data->isContained()); + genConsumeReg(data); + emit->emitIns_S_R(ins, attr, data->gtRegNum, varNum, offset); + } + + genUpdateLife(tree); + varDsc->lvRegNum = REG_STK; +} + +//------------------------------------------------------------------------ // genLeaInstruction: Produce code for a GT_LEA subnode. // void CodeGen::genLeaInstruction(GenTreeAddrMode* lea) diff --git a/src/coreclr/src/jit/codegenarm64.cpp b/src/coreclr/src/jit/codegenarm64.cpp index a99a666..9872684 100644 --- a/src/coreclr/src/jit/codegenarm64.cpp +++ b/src/coreclr/src/jit/codegenarm64.cpp @@ -1541,6 +1541,63 @@ void CodeGen::genCodeForBinary(GenTree* treeNode) } //------------------------------------------------------------------------ +// genCodeForStoreLclFld: Produce code for a GT_STORE_LCL_FLD node. +// +// Arguments: +// tree - the GT_STORE_LCL_FLD node +// +void CodeGen::genCodeForStoreLclFld(GenTreeLclFld* tree) +{ + var_types targetType = tree->TypeGet(); + regNumber targetReg = tree->gtRegNum; + emitter* emit = getEmitter(); + + noway_assert(targetType != TYP_STRUCT); + + // record the offset + unsigned offset = tree->gtLclOffs; + + // We must have a stack store with GT_STORE_LCL_FLD + noway_assert(!tree->InReg()); + noway_assert(targetReg == REG_NA); + + unsigned varNum = tree->gtLclNum; + assert(varNum < compiler->lvaCount); + LclVarDsc* varDsc = &(compiler->lvaTable[varNum]); + + // Ensure that lclVar nodes are typed correctly. + assert(!varDsc->lvNormalizeOnStore() || targetType == genActualType(varDsc->TypeGet())); + + GenTreePtr data = tree->gtOp1->gtEffectiveVal(); + genConsumeRegs(data); + + regNumber dataReg = REG_NA; + if (data->isContainedIntOrIImmed()) + { + assert(data->IsIntegralConst(0)); + dataReg = REG_ZR; + } + else + { + assert(!data->isContained()); + dataReg = data->gtRegNum; + } + assert(dataReg != REG_NA); + + instruction ins = ins_Store(targetType); + + emitAttr attr = emitTypeSize(targetType); + + attr = emit->emitInsAdjustLoadStoreAttr(ins, attr); + + emit->emitIns_S_R(ins, attr, dataReg, varNum, offset); + + genUpdateLife(tree); + + varDsc->lvRegNum = REG_STK; +} + +//------------------------------------------------------------------------ // isStructReturn: Returns whether the 'treeNode' is returning a struct. // // Arguments: @@ -2136,53 +2193,8 @@ void CodeGen::genCodeForTreeNode(GenTreePtr treeNode) break; case GT_STORE_LCL_FLD: - { - noway_assert(targetType != TYP_STRUCT); - - // record the offset - unsigned offset = treeNode->gtLclFld.gtLclOffs; - - // We must have a stack store with GT_STORE_LCL_FLD - noway_assert(!treeNode->InReg()); - noway_assert(targetReg == REG_NA); - - GenTreeLclVarCommon* varNode = treeNode->AsLclVarCommon(); - unsigned varNum = varNode->gtLclNum; - assert(varNum < compiler->lvaCount); - LclVarDsc* varDsc = &(compiler->lvaTable[varNum]); - - // Ensure that lclVar nodes are typed correctly. - assert(!varDsc->lvNormalizeOnStore() || targetType == genActualType(varDsc->TypeGet())); - - GenTreePtr data = treeNode->gtOp.gtOp1->gtEffectiveVal(); - genConsumeRegs(data); - - regNumber dataReg = REG_NA; - if (data->isContainedIntOrIImmed()) - { - assert(data->IsIntegralConst(0)); - dataReg = REG_ZR; - } - else - { - assert(!data->isContained()); - dataReg = data->gtRegNum; - } - assert(dataReg != REG_NA); - - instruction ins = ins_Store(targetType); - - emitAttr attr = emitTypeSize(targetType); - - attr = emit->emitInsAdjustLoadStoreAttr(ins, attr); - - emit->emitIns_S_R(ins, attr, dataReg, varNum, offset); - - genUpdateLife(varNode); - - varDsc->lvRegNum = REG_STK; - } - break; + genCodeForStoreLclFld(treeNode->AsLclFld()); + break; case GT_STORE_LCL_VAR: { diff --git a/src/coreclr/src/jit/codegenlinear.h b/src/coreclr/src/jit/codegenlinear.h index 281de50..3f8a108 100644 --- a/src/coreclr/src/jit/codegenlinear.h +++ b/src/coreclr/src/jit/codegenlinear.h @@ -168,6 +168,8 @@ void genCodeForShiftRMW(GenTreeStoreInd* storeInd); void genCodeForLclFld(GenTreeLclFld* tree); +void genCodeForStoreLclFld(GenTreeLclFld* tree); + void genCodeForCpObj(GenTreeObj* cpObjNode); void genCodeForCpBlk(GenTreeBlk* cpBlkNode); -- 2.7.4