@@ -2798,19 +2798,19 @@ void CodeGen::genCodeForLclVar(GenTreeLclVar* tree)
27982798void CodeGen::genCodeForStoreLclFld(GenTreeLclFld* tree)
27992799{
28002800 var_types targetType = tree->TypeGet();
2801- regNumber targetReg = tree->GetRegNum();
2802- emitter* emit = GetEmitter();
2803- noway_assert(targetType != TYP_STRUCT);
28042801
28052802#ifdef FEATURE_SIMD
2806- // storing of TYP_SIMD12 (i.e. Vector3) field
2807- if (tree->TypeGet() == TYP_SIMD12)
2803+ if (targetType == TYP_SIMD12)
28082804 {
2809- genStoreLclTypeSIMD12 (tree);
2805+ genStoreLclTypeSimd12 (tree);
28102806 return;
28112807 }
28122808#endif // FEATURE_SIMD
28132809
2810+ regNumber targetReg = tree->GetRegNum();
2811+ emitter* emit = GetEmitter();
2812+ noway_assert(targetType != TYP_STRUCT);
2813+
28142814 // record the offset
28152815 unsigned offset = tree->GetLclOffs();
28162816
@@ -2909,7 +2909,7 @@ void CodeGen::genCodeForStoreLclVar(GenTreeLclVar* lclNode)
29092909 // storing of TYP_SIMD12 (i.e. Vector3) field
29102910 if (targetType == TYP_SIMD12)
29112911 {
2912- genStoreLclTypeSIMD12 (lclNode);
2912+ genStoreLclTypeSimd12 (lclNode);
29132913 return;
29142914 }
29152915#endif // FEATURE_SIMD
@@ -4172,7 +4172,7 @@ void CodeGen::genCodeForStoreInd(GenTreeStoreInd* tree)
41724172 // Storing Vector3 of size 12 bytes through indirection
41734173 if (tree->TypeGet() == TYP_SIMD12)
41744174 {
4175- genStoreIndTypeSIMD12 (tree);
4175+ genStoreIndTypeSimd12 (tree);
41764176 return;
41774177 }
41784178#endif // FEATURE_SIMD
@@ -5160,7 +5160,7 @@ void CodeGen::genSimdUpperRestore(GenTreeIntrinsic* node)
51605160}
51615161
51625162//-----------------------------------------------------------------------------
5163- // genStoreIndTypeSIMD12 : store indirect a TYP_SIMD12 (i.e. Vector3) to memory.
5163+ // genStoreIndTypeSimd12 : store indirect a TYP_SIMD12 (i.e. Vector3) to memory.
51645164// Since Vector3 is not a hardware supported write size, it is performed
51655165// as two writes: 8 byte followed by 4-byte.
51665166//
@@ -5171,41 +5171,39 @@ void CodeGen::genSimdUpperRestore(GenTreeIntrinsic* node)
51715171// Return Value:
51725172// None.
51735173//
5174- void CodeGen::genStoreIndTypeSIMD12(GenTree * treeNode)
5174+ void CodeGen::genStoreIndTypeSimd12(GenTreeStoreInd * treeNode)
51755175{
5176- assert(treeNode->OperGet() == GT_STOREIND);
5176+ assert(treeNode->OperIs( GT_STOREIND) );
51775177
5178- GenTree* addr = treeNode->AsOp()->gtOp1;
5179- GenTree* data = treeNode->AsOp()->gtOp2 ;
5178+ // Should not require a write barrier
5179+ assert(gcInfo.gcIsWriteBarrierCandidate(treeNode) == GCInfo::WBF_NoBarrier) ;
51805180
51815181 // addr and data should not be contained.
5182- assert(!data->isContained());
5182+
5183+ GenTree* addr = treeNode->Addr();
51835184 assert(!addr->isContained());
51845185
5185- #ifdef DEBUG
5186- // Should not require a write barrier
5187- GCInfo::WriteBarrierForm writeBarrierForm = gcInfo.gcIsWriteBarrierCandidate(treeNode->AsStoreInd());
5188- assert(writeBarrierForm == GCInfo::WBF_NoBarrier);
5189- #endif
5186+ GenTree* data = treeNode->Data();
5187+ assert(!data->isContained());
51905188
5191- genConsumeOperands(treeNode->AsOp());
5189+ regNumber addrReg = genConsumeReg(addr);
5190+ regNumber dataReg = genConsumeReg(data);
51925191
51935192 // Need an additional integer register to extract upper 4 bytes from data.
51945193 regNumber tmpReg = treeNode->GetSingleTempReg();
5195- assert(tmpReg != addr->GetRegNum());
51965194
51975195 // 8-byte write
5198- GetEmitter()->emitIns_R_R(INS_str, EA_8BYTE, data->GetRegNum(), addr->GetRegNum() );
5196+ GetEmitter()->emitIns_R_R(INS_str, EA_8BYTE, dataReg, addrReg );
51995197
52005198 // Extract upper 4-bytes from data
5201- GetEmitter()->emitIns_R_R_I(INS_mov, EA_4BYTE, tmpReg, data->GetRegNum() , 2);
5199+ GetEmitter()->emitIns_R_R_I(INS_mov, EA_4BYTE, tmpReg, dataReg , 2);
52025200
52035201 // 4-byte write
5204- GetEmitter()->emitIns_R_R_I(INS_str, EA_4BYTE, tmpReg, addr->GetRegNum() , 8);
5202+ GetEmitter()->emitIns_R_R_I(INS_str, EA_4BYTE, tmpReg, addrReg , 8);
52055203}
52065204
52075205//-----------------------------------------------------------------------------
5208- // genLoadIndTypeSIMD12 : load indirect a TYP_SIMD12 (i.e. Vector3) value.
5206+ // genLoadIndTypeSimd12 : load indirect a TYP_SIMD12 (i.e. Vector3) value.
52095207// Since Vector3 is not a hardware supported write size, it is performed
52105208// as two loads: 8 byte followed by 4-byte.
52115209//
@@ -5216,34 +5214,33 @@ void CodeGen::genStoreIndTypeSIMD12(GenTree* treeNode)
52165214// Return Value:
52175215// None.
52185216//
5219- void CodeGen::genLoadIndTypeSIMD12(GenTree * treeNode)
5217+ void CodeGen::genLoadIndTypeSimd12(GenTreeIndir * treeNode)
52205218{
5221- assert(treeNode->OperGet() == GT_IND);
5222-
5223- GenTree* addr = treeNode->AsOp()->gtOp1;
5224- regNumber targetReg = treeNode->GetRegNum();
5219+ assert(treeNode->OperIs(GT_IND));
52255220
5221+ GenTree* addr = treeNode->Addr();
52265222 assert(!addr->isContained());
52275223
5228- regNumber operandReg = genConsumeReg(addr);
5224+ regNumber tgtReg = treeNode->GetRegNum();
5225+ regNumber addrReg = genConsumeReg(addr);
52295226
52305227 // Need an additional int register to read upper 4 bytes, which is different from targetReg
52315228 regNumber tmpReg = treeNode->GetSingleTempReg();
52325229
52335230 // 8-byte read
5234- GetEmitter()->emitIns_R_R(INS_ldr, EA_8BYTE, targetReg, addr->GetRegNum() );
5231+ GetEmitter()->emitIns_R_R(INS_ldr, EA_8BYTE, tgtReg, addrReg );
52355232
52365233 // 4-byte read
5237- GetEmitter()->emitIns_R_R_I(INS_ldr, EA_4BYTE, tmpReg, addr->GetRegNum() , 8);
5234+ GetEmitter()->emitIns_R_R_I(INS_ldr, EA_4BYTE, tmpReg, addrReg , 8);
52385235
52395236 // Insert upper 4-bytes into data
5240- GetEmitter()->emitIns_R_R_I(INS_mov, EA_4BYTE, targetReg , tmpReg, 2);
5237+ GetEmitter()->emitIns_R_R_I(INS_mov, EA_4BYTE, tgtReg , tmpReg, 2);
52415238
52425239 genProduceReg(treeNode);
52435240}
52445241
52455242//-----------------------------------------------------------------------------
5246- // genStoreLclTypeSIMD12 : store a TYP_SIMD12 (i.e. Vector3) type field.
5243+ // genStoreLclTypeSimd12 : store a TYP_SIMD12 (i.e. Vector3) type field.
52475244// Since Vector3 is not a hardware supported write size, it is performed
52485245// as two stores: 8 byte followed by 4-byte.
52495246//
@@ -5253,23 +5250,20 @@ void CodeGen::genLoadIndTypeSIMD12(GenTree* treeNode)
52535250// Return Value:
52545251// None.
52555252//
5256- void CodeGen::genStoreLclTypeSIMD12(GenTree * treeNode)
5253+ void CodeGen::genStoreLclTypeSimd12(GenTreeLclVarCommon * treeNode)
52575254{
52585255 assert(treeNode->OperIs(GT_STORE_LCL_FLD, GT_STORE_LCL_VAR));
52595256
5260- GenTreeLclVarCommon* lclVar = treeNode->AsLclVarCommon();
5261-
5262- unsigned offs = lclVar->GetLclOffs();
5263- unsigned varNum = lclVar->GetLclNum();
5264- LclVarDsc* varDsc = compiler->lvaGetDesc(varNum);
5257+ unsigned offs = treeNode->GetLclOffs();
5258+ unsigned varNum = treeNode->GetLclNum();
52655259 assert(varNum < compiler->lvaCount);
52665260
5267- GenTree* op1 = lclVar ->gtGetOp1();
5261+ GenTree* data = treeNode ->gtGetOp1();
52685262
5269- if (op1 ->isContained())
5263+ if (data ->isContained())
52705264 {
52715265 // This is only possible for a zero-init.
5272- assert(op1 ->IsIntegralConst(0) || op1 ->IsVectorZero());
5266+ assert(data ->IsIntegralConst(0) || data ->IsVectorZero());
52735267
52745268 // store lower 8 bytes
52755269 GetEmitter()->emitIns_S_R(ins_Store(TYP_DOUBLE), EA_8BYTE, REG_ZR, varNum, offs);
@@ -5279,30 +5273,34 @@ void CodeGen::genStoreLclTypeSIMD12(GenTree* treeNode)
52795273
52805274 // Update life after instruction emitted
52815275 genUpdateLife(treeNode);
5276+
5277+ LclVarDsc* varDsc = compiler->lvaGetDesc(varNum);
52825278 varDsc->SetRegNum(REG_STK);
52835279
52845280 return;
52855281 }
52865282
5287- regNumber targetReg = treeNode->GetRegNum();
5288- regNumber operandReg = genConsumeReg(op1 );
5283+ regNumber tgtReg = treeNode->GetRegNum();
5284+ regNumber dataReg = genConsumeReg(data );
52895285
5290- if (targetReg != REG_NA)
5286+ if (tgtReg != REG_NA)
52915287 {
5292- assert(GetEmitter()->isVectorRegister(targetReg));
5293-
52945288 // Simply use mov if we move a SIMD12 reg to another SIMD12 reg
5295- inst_Mov(treeNode->TypeGet(), targetReg, operandReg, /* canSkip */ true);
5289+ assert(GetEmitter()->isVectorRegister(tgtReg));
5290+
5291+ inst_Mov(treeNode->TypeGet(), tgtReg, dataReg, /* canSkip */ true);
52965292 genProduceReg(treeNode);
52975293 }
52985294 else
52995295 {
53005296 // Need an additional integer register to extract upper 4 bytes from data.
5301- regNumber tmpReg = lclVar ->GetSingleTempReg();
5302- GetEmitter()->emitStoreSIMD12ToLclOffset (varNum, offs, operandReg , tmpReg);
5297+ regNumber tmpReg = treeNode ->GetSingleTempReg();
5298+ GetEmitter()->emitStoreSimd12ToLclOffset (varNum, offs, dataReg , tmpReg);
53035299
53045300 // Update life after instruction emitted
53055301 genUpdateLife(treeNode);
5302+
5303+ LclVarDsc* varDsc = compiler->lvaGetDesc(varNum);
53065304 varDsc->SetRegNum(REG_STK);
53075305 }
53085306}
0 commit comments