@@ -1633,6 +1633,15 @@ void CodeGen::genCodeForStoreLclFld(GenTreeLclFld* tree)
16331633 emitter* emit = getEmitter ();
16341634 noway_assert (targetType != TYP_STRUCT);
16351635
1636+ #ifdef FEATURE_SIMD
1637+ // storing of TYP_SIMD12 (i.e. Vector3) field
1638+ if (tree->TypeGet () == TYP_SIMD12)
1639+ {
1640+ genStoreLclTypeSIMD12 (tree);
1641+ return ;
1642+ }
1643+ #endif // FEATURE_SIMD
1644+
16361645 // record the offset
16371646 unsigned offset = tree->gtLclOffs ;
16381647
@@ -1704,6 +1713,15 @@ void CodeGen::genCodeForStoreLclVar(GenTreeLclVar* tree)
17041713 }
17051714 else
17061715 {
1716+ #ifdef FEATURE_SIMD
1717+ // storing of TYP_SIMD12 (i.e. Vector3) field
1718+ if (tree->TypeGet () == TYP_SIMD12)
1719+ {
1720+ genStoreLclTypeSIMD12 (tree);
1721+ return ;
1722+ }
1723+ #endif // FEATURE_SIMD
1724+
17071725 genConsumeRegs (data);
17081726
17091727 regNumber dataReg = REG_NA;
@@ -4840,6 +4858,47 @@ void CodeGen::genLoadIndTypeSIMD12(GenTree* treeNode)
48404858 genProduceReg (treeNode);
48414859}
48424860
4861+ // -----------------------------------------------------------------------------
4862+ // genStoreLclTypeSIMD12: store a TYP_SIMD12 (i.e. Vector3) type field.
4863+ // Since Vector3 is not a hardware supported write size, it is performed
4864+ // as two stores: 8 byte followed by 4-byte.
4865+ //
4866+ // Arguments:
4867+ // treeNode - tree node that is attempting to store TYP_SIMD12 field
4868+ //
4869+ // Return Value:
4870+ // None.
4871+ //
4872+ void CodeGen::genStoreLclTypeSIMD12 (GenTree* treeNode)
4873+ {
4874+ assert ((treeNode->OperGet () == GT_STORE_LCL_FLD) || (treeNode->OperGet () == GT_STORE_LCL_VAR));
4875+
4876+ unsigned offs = 0 ;
4877+ unsigned varNum = treeNode->gtLclVarCommon .gtLclNum ;
4878+ assert (varNum < compiler->lvaCount );
4879+
4880+ if (treeNode->OperGet () == GT_LCL_FLD)
4881+ {
4882+ offs = treeNode->gtLclFld .gtLclOffs ;
4883+ }
4884+
4885+ GenTreePtr op1 = treeNode->gtOp .gtOp1 ;
4886+ assert (!op1->isContained ());
4887+ regNumber operandReg = genConsumeReg (op1);
4888+
4889+ // Need an addtional integer register to extract upper 4 bytes from data.
4890+ regNumber tmpReg = treeNode->GetSingleTempReg ();
4891+
4892+ // store lower 8 bytes
4893+ getEmitter ()->emitIns_S_R (ins_Store (TYP_DOUBLE), EA_8BYTE, operandReg, varNum, offs);
4894+
4895+ // Extract upper 4-bytes from data
4896+ getEmitter ()->emitIns_R_R_I (INS_mov, EA_4BYTE, tmpReg, operandReg, 2 );
4897+
4898+ // 4-byte write
4899+ getEmitter ()->emitIns_S_R (INS_str, EA_4BYTE, tmpReg, varNum, offs + 8 );
4900+ }
4901+
48434902#endif // FEATURE_SIMD
48444903
48454904/* ****************************************************************************
0 commit comments