Refactor GT_STORE_LCL_FLD
authorBruce Forstall <brucefo@microsoft.com>
Tue, 2 May 2017 00:06:55 +0000 (17:06 -0700)
committerBruce Forstall <brucefo@microsoft.com>
Tue, 2 May 2017 00:06:55 +0000 (17:06 -0700)
Commit migrated from https://github.com/dotnet/coreclr/commit/5a8bec34ae8b8679ce03134cfed4ee35d120dead

src/coreclr/src/jit/codegenarm.cpp
src/coreclr/src/jit/codegenarm64.cpp
src/coreclr/src/jit/codegenlinear.h

index e8ef591..1ccf06f 100644 (file)
@@ -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)
index a99a666..9872684 100644 (file)
@@ -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:
         {
index 281de50..3f8a108 100644 (file)
@@ -168,6 +168,8 @@ void genCodeForShiftRMW(GenTreeStoreInd* storeInd);
 
 void genCodeForLclFld(GenTreeLclFld* tree);
 
+void genCodeForStoreLclFld(GenTreeLclFld* tree);
+
 void genCodeForCpObj(GenTreeObj* cpObjNode);
 
 void genCodeForCpBlk(GenTreeBlk* cpBlkNode);