-
Notifications
You must be signed in to change notification settings - Fork 5.1k
Rename StoreVectorMxNAndZip to StoreVectorAndZip #103638
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
a1850bd
92a7b53
c7ce1bd
757196c
7985186
5b0aeff
9e9804b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1225,37 +1225,52 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) | |
GetEmitter()->emitIns_R_R_R(ins, emitTypeSize(intrin.baseType), op2Reg, op3Reg, op1Reg); | ||
break; | ||
|
||
case NI_AdvSimd_StoreSelectedScalarVector64x2: | ||
case NI_AdvSimd_StoreSelectedScalarVector64x3: | ||
case NI_AdvSimd_StoreSelectedScalarVector64x4: | ||
case NI_AdvSimd_Arm64_StoreSelectedScalarVector128x2: | ||
case NI_AdvSimd_Arm64_StoreSelectedScalarVector128x3: | ||
case NI_AdvSimd_Arm64_StoreSelectedScalarVector128x4: | ||
case NI_AdvSimd_StoreSelectedScalar: | ||
case NI_AdvSimd_Arm64_StoreSelectedScalar: | ||
{ | ||
assert(intrin.op2->OperIsFieldList()); | ||
GenTreeFieldList* fieldList = intrin.op2->AsFieldList(); | ||
GenTree* firstField = fieldList->Uses().GetHead()->GetNode(); | ||
op2Reg = firstField->GetRegNum(); | ||
unsigned regCount = 0; | ||
if (intrin.op2->OperIsFieldList()) | ||
{ | ||
GenTreeFieldList* fieldList = intrin.op2->AsFieldList(); | ||
GenTree* firstField = fieldList->Uses().GetHead()->GetNode(); | ||
op2Reg = firstField->GetRegNum(); | ||
|
||
regNumber argReg = op2Reg; | ||
for (GenTreeFieldList::Use& use : fieldList->Uses()) | ||
{ | ||
regCount++; | ||
#ifdef DEBUG | ||
unsigned regCount = 0; | ||
regNumber argReg = op2Reg; | ||
for (GenTreeFieldList::Use& use : fieldList->Uses()) | ||
GenTree* argNode = use.GetNode(); | ||
assert(argReg == argNode->GetRegNum()); | ||
argReg = getNextSIMDRegWithWraparound(argReg); | ||
#endif | ||
} | ||
} | ||
else | ||
{ | ||
regCount++; | ||
regCount = 1; | ||
} | ||
|
||
GenTree* argNode = use.GetNode(); | ||
assert(argReg == argNode->GetRegNum()); | ||
argReg = getNextSIMDRegWithWraparound(argReg); | ||
switch (regCount) | ||
{ | ||
case 2: | ||
ins = INS_st2; | ||
break; | ||
|
||
case 3: | ||
ins = INS_st3; | ||
break; | ||
|
||
case 4: | ||
ins = INS_st4; | ||
break; | ||
|
||
default: | ||
assert(regCount == 1); | ||
ins = INS_st1; | ||
break; | ||
} | ||
assert((ins == INS_st2 && regCount == 2) || (ins == INS_st3 && regCount == 3) || | ||
(ins == INS_st4 && regCount == 4)); | ||
#endif | ||
FALLTHROUGH; | ||
} | ||
case NI_AdvSimd_StoreSelectedScalar: | ||
case NI_AdvSimd_Arm64_StoreSelectedScalar: | ||
{ | ||
|
||
HWIntrinsicImmOpHelper helper(this, intrin.op3, node); | ||
|
||
for (helper.EmitBegin(); !helper.Done(); helper.EmitCaseEnd()) | ||
|
@@ -1267,12 +1282,6 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) | |
break; | ||
} | ||
|
||
case NI_AdvSimd_StoreVector64x2AndZip: | ||
case NI_AdvSimd_StoreVector64x3AndZip: | ||
case NI_AdvSimd_StoreVector64x4AndZip: | ||
case NI_AdvSimd_Arm64_StoreVector128x2AndZip: | ||
case NI_AdvSimd_Arm64_StoreVector128x3AndZip: | ||
case NI_AdvSimd_Arm64_StoreVector128x4AndZip: | ||
case NI_AdvSimd_StoreVector64x2: | ||
case NI_AdvSimd_StoreVector64x3: | ||
case NI_AdvSimd_StoreVector64x4: | ||
|
@@ -1307,6 +1316,50 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) | |
break; | ||
} | ||
|
||
case NI_AdvSimd_StoreVectorAndZip: | ||
case NI_AdvSimd_Arm64_StoreVectorAndZip: | ||
{ | ||
unsigned regCount = 0; | ||
|
||
assert(intrin.op2->OperIsFieldList()); | ||
|
||
GenTreeFieldList* fieldList = intrin.op2->AsFieldList(); | ||
GenTree* firstField = fieldList->Uses().GetHead()->GetNode(); | ||
op2Reg = firstField->GetRegNum(); | ||
|
||
regNumber argReg = op2Reg; | ||
for (GenTreeFieldList::Use& use : fieldList->Uses()) | ||
{ | ||
regCount++; | ||
#ifdef DEBUG | ||
GenTree* argNode = use.GetNode(); | ||
assert(argReg == argNode->GetRegNum()); | ||
argReg = getNextSIMDRegWithWraparound(argReg); | ||
#endif | ||
} | ||
|
||
switch (regCount) | ||
{ | ||
case 2: | ||
ins = INS_st2; | ||
break; | ||
|
||
case 3: | ||
ins = INS_st3; | ||
break; | ||
|
||
case 4: | ||
ins = INS_st4; | ||
break; | ||
|
||
default: | ||
unreached(); | ||
} | ||
|
||
GetEmitter()->emitIns_R_R(ins, emitSize, op2Reg, op1Reg, opt); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. can you make sure There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure, it's asserted in There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yes, that's fine. |
||
break; | ||
} | ||
|
||
case NI_Vector64_CreateScalarUnsafe: | ||
case NI_Vector128_CreateScalarUnsafe: | ||
if (intrin.op1->isContainedFltOrDblImmed()) | ||
|
Uh oh!
There was an error while loading. Please reload this page.