Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit da79c0d

Browse files
committed
[Arm64] SIMD12 genCodeForStoreLcl*
1 parent a16fdf0 commit da79c0d

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

src/jit/codegenarm64.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
/*****************************************************************************

src/jit/lsraarmarch.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,17 @@ void LinearScan::TreeNodeInfoInitStoreLoc(GenTreeLclVarCommon* storeLoc)
7777
{
7878
info->srcCount = 1;
7979
}
80+
81+
#ifdef FEATURE_SIMD
82+
if (varTypeIsSIMD(storeLoc))
83+
{
84+
if (storeLoc->TypeGet() == TYP_SIMD12)
85+
{
86+
// Need an additional register to extract upper 4 bytes of Vector3.
87+
info->internalIntCount = 1;
88+
}
89+
}
90+
#endif // FEATURE_SIMD
8091
}
8192

8293
//------------------------------------------------------------------------

0 commit comments

Comments
 (0)