-
Notifications
You must be signed in to change notification settings - Fork 4.8k
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
Arm64/Sve: Implement AbsoluteCompare* and Compare* APIs #104464
Changes from 9 commits
2cb7632
07c1b56
7b01c17
91526ba
f595681
e99d57b
d71da40
82e75a8
6616814
4762e3c
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 |
---|---|---|
|
@@ -1981,30 +1981,7 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou | |
getLowVectorOperandAndCandidates(intrin, &lowVectorOperandNum, &lowVectorCandidates); | ||
} | ||
|
||
if ((intrin.id == NI_Sve_ConditionalSelect) && (intrin.op2->IsEmbMaskOp()) && | ||
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. This was dead code 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. Yeah, looks like we handle embedded masks just above this snippet, right here. |
||
(intrin.op2->isRMWHWIntrinsic(compiler))) | ||
{ | ||
// For ConditionalSelect, if there is an embedded operation, and the operation has RMW semantics | ||
// then record delay-free for them. | ||
GenTreeHWIntrinsic* intrinEmbOp2 = intrin.op2->AsHWIntrinsic(); | ||
size_t numArgs = intrinEmbOp2->GetOperandCount(); | ||
assert((numArgs == 1) || (numArgs == 2)); | ||
const HWIntrinsic intrinEmb(intrinEmbOp2); | ||
if (HWIntrinsicInfo::IsLowVectorOperation(intrinEmb.id)) | ||
{ | ||
getLowVectorOperandAndCandidates(intrinEmb, &lowVectorOperandNum, &lowVectorCandidates); | ||
} | ||
|
||
tgtPrefUse = BuildUse(intrinEmbOp2->Op(1)); | ||
srcCount += 1; | ||
|
||
for (size_t argNum = 2; argNum <= numArgs; argNum++) | ||
{ | ||
srcCount += BuildDelayFreeUses(intrinEmbOp2->Op(argNum), intrinEmbOp2->Op(1), | ||
(argNum == lowVectorOperandNum) ? lowVectorCandidates : RBM_NONE); | ||
} | ||
} | ||
else if (tgtPrefOp2) | ||
if (tgtPrefOp2) | ||
{ | ||
if (!intrin.op2->isContained()) | ||
{ | ||
|
@@ -2059,7 +2036,7 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou | |
{ | ||
SingleTypeRegSet candidates = lowVectorOperandNum == 2 ? lowVectorCandidates : RBM_NONE; | ||
|
||
if (intrin.op2->gtType == TYP_MASK) | ||
if (intrin.op2->OperIsHWIntrinsic(NI_Sve_ConvertVectorToMask)) | ||
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. Why does this change the register set to MASK but regular TYP_MASK nodes do not? 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. Its the same reason I mentioned in #102611 (comment) |
||
{ | ||
assert(lowVectorOperandNum != 2); | ||
candidates = RBM_ALLMASK.GetPredicateRegSet(); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldn't this just be
node->TypeGet()
100% of the time?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yes, will change it in follow-up PRs.