@@ -5338,6 +5338,9 @@ static bool hasFPCMov(unsigned X86CC) {
5338
5338
}
5339
5339
}
5340
5340
5341
+ static bool useVPTERNLOG(const X86Subtarget &Subtarget, MVT VT) {
5342
+ return Subtarget.hasVLX() || (Subtarget.hasAVX512() && VT.is512BitVector());
5343
+ }
5341
5344
5342
5345
bool X86TargetLowering::getTgtMemIntrinsic(IntrinsicInfo &Info,
5343
5346
const CallInst &I,
@@ -46112,9 +46115,7 @@ static SDValue canonicalizeBitSelect(SDNode *N, SelectionDAG &DAG,
46112
46115
46113
46116
// On XOP we'll lower to PCMOV so accept one use. With AVX512, we can use
46114
46117
// VPTERNLOG. Otherwise only do this if either mask has multiple uses already.
46115
- bool UseVPTERNLOG = (Subtarget.hasAVX512() && VT.is512BitVector()) ||
46116
- Subtarget.hasVLX();
46117
- if (!(Subtarget.hasXOP() || UseVPTERNLOG ||
46118
+ if (!(Subtarget.hasXOP() || useVPTERNLOG(Subtarget, VT) ||
46118
46119
!N0.getOperand(1).hasOneUse() || !N1.getOperand(1).hasOneUse()))
46119
46120
return SDValue();
46120
46121
@@ -46138,8 +46139,8 @@ static SDValue canonicalizeBitSelect(SDNode *N, SelectionDAG &DAG,
46138
46139
46139
46140
SDLoc DL(N);
46140
46141
46141
- if (UseVPTERNLOG ) {
46142
- // Emit a VPTERNLOG node directly.
46142
+ if (useVPTERNLOG(Subtarget, VT) ) {
46143
+ // Emit a VPTERNLOG node directly - 0xCA is the imm code for A?B:C .
46143
46144
SDValue A = DAG.getBitcast(VT, N0.getOperand(1));
46144
46145
SDValue B = DAG.getBitcast(VT, N0.getOperand(0));
46145
46146
SDValue C = DAG.getBitcast(VT, N1.getOperand(0));
0 commit comments