Skip to content

Commit 23ec9ee

Browse files
authored
[X86][AVX10.2] Lower fmininum/fmaximum to VMINMAX* (#121373)
1 parent 1a0d0ae commit 23ec9ee

File tree

4 files changed

+255
-28
lines changed

4 files changed

+255
-28
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2442,6 +2442,8 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
24422442
setOperationAction(ISD::FSQRT, VT, Legal);
24432443
setOperationAction(ISD::FMA, VT, Legal);
24442444
setOperationAction(ISD::SETCC, VT, Custom);
2445+
setOperationAction(ISD::FMINIMUM, VT, Custom);
2446+
setOperationAction(ISD::FMAXIMUM, VT, Custom);
24452447
}
24462448
if (Subtarget.hasAVX10_2_512()) {
24472449
setOperationAction(ISD::FADD, MVT::v32bf16, Legal);
@@ -2451,6 +2453,8 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
24512453
setOperationAction(ISD::FSQRT, MVT::v32bf16, Legal);
24522454
setOperationAction(ISD::FMA, MVT::v32bf16, Legal);
24532455
setOperationAction(ISD::SETCC, MVT::v32bf16, Custom);
2456+
setOperationAction(ISD::FMINIMUM, MVT::v32bf16, Custom);
2457+
setOperationAction(ISD::FMAXIMUM, MVT::v32bf16, Custom);
24542458
}
24552459
for (auto VT : {MVT::f16, MVT::f32, MVT::f64}) {
24562460
setCondCodeAction(ISD::SETOEQ, VT, Custom);
@@ -28842,6 +28846,20 @@ static SDValue LowerFMINIMUM_FMAXIMUM(SDValue Op, const X86Subtarget &Subtarget,
2884228846
SDValue X = Op.getOperand(0);
2884328847
SDValue Y = Op.getOperand(1);
2884428848
SDLoc DL(Op);
28849+
if (Subtarget.hasAVX10_2() && TLI.isTypeLegal(VT)) {
28850+
unsigned Opc = 0;
28851+
if (VT.isVector())
28852+
Opc = X86ISD::VMINMAX;
28853+
else if (VT == MVT::f16 || VT == MVT::f32 || VT == MVT::f64)
28854+
Opc = X86ISD::VMINMAXS;
28855+
28856+
if (Opc) {
28857+
SDValue Imm =
28858+
DAG.getTargetConstant(Op.getOpcode() == ISD::FMAXIMUM, DL, MVT::i32);
28859+
return DAG.getNode(Opc, DL, VT, X, Y, Imm, Op->getFlags());
28860+
}
28861+
}
28862+
2884528863
uint64_t SizeInBits = VT.getScalarSizeInBits();
2884628864
APInt PreferredZero = APInt::getZero(SizeInBits);
2884728865
APInt OppositeZero = PreferredZero;

llvm/lib/Target/X86/X86InstrAVX10.td

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -403,28 +403,42 @@ multiclass avx10_minmax_scalar<string OpStr, X86VectorVTInfo _, SDNode OpNode,
403403
SDNode OpNodeSAE> {
404404
let ExeDomain = _.ExeDomain, Predicates = [HasAVX10_2] in {
405405
let mayRaiseFPException = 1 in {
406-
defm rri : AVX512_maskable<0x53, MRMSrcReg, _, (outs VR128X:$dst),
407-
(ins VR128X:$src1, VR128X:$src2, i32u8imm:$src3),
408-
OpStr, "$src3, $src2, $src1", "$src1, $src2, $src3",
409-
(_.VT (OpNode (_.VT _.RC:$src1), (_.VT _.RC:$src2),
410-
(i32 timm:$src3)))>,
411-
Sched<[WriteFMAX]>;
412-
413-
defm rmi : AVX512_maskable<0x53, MRMSrcMem, _, (outs VR128X:$dst),
414-
(ins VR128X:$src1, _.ScalarMemOp:$src2, i32u8imm:$src3),
415-
OpStr, "$src3, $src2, $src1", "$src1, $src2, $src3",
416-
(_.VT (OpNode (_.VT _.RC:$src1), (_.ScalarIntMemFrags addr:$src2),
417-
(i32 timm:$src3)))>,
406+
let isCodeGenOnly = 1 in {
407+
def rri : AVX512Ii8<0x53, MRMSrcReg, (outs _.FRC:$dst),
408+
(ins _.FRC:$src1, _.FRC:$src2, i32u8imm:$src3),
409+
!strconcat(OpStr, "\t{$src3, $src2, $src1|$src1, $src2, $src3}"),
410+
[(set _.FRC:$dst, (OpNode _.FRC:$src1, _.FRC:$src2, (i32 timm:$src3)))]>,
411+
Sched<[WriteFMAX]>;
412+
413+
def rmi : AVX512Ii8<0x53, MRMSrcMem, (outs _.FRC:$dst),
414+
(ins _.FRC:$src1, _.ScalarMemOp:$src2, i32u8imm:$src3),
415+
!strconcat(OpStr, "\t{$src3, $src2, $src1|$src1, $src2, $src3}"),
416+
[(set _.FRC:$dst, (OpNode _.FRC:$src1, (_.ScalarLdFrag addr:$src2),
417+
(i32 timm:$src3)))]>,
418+
Sched<[WriteFMAX.Folded, WriteFMAX.ReadAfterFold]>;
419+
}
420+
defm rri_Int : AVX512_maskable<0x53, MRMSrcReg, _, (outs VR128X:$dst),
421+
(ins VR128X:$src1, VR128X:$src2, i32u8imm:$src3),
422+
OpStr, "$src3, $src2, $src1", "$src1, $src2, $src3",
423+
(_.VT (OpNode (_.VT _.RC:$src1), (_.VT _.RC:$src2),
424+
(i32 timm:$src3)))>,
425+
Sched<[WriteFMAX]>;
426+
427+
defm rmi_Int : AVX512_maskable<0x53, MRMSrcMem, _, (outs VR128X:$dst),
428+
(ins VR128X:$src1, _.ScalarMemOp:$src2, i32u8imm:$src3),
429+
OpStr, "$src3, $src2, $src1", "$src1, $src2, $src3",
430+
(_.VT (OpNode (_.VT _.RC:$src1), (_.ScalarIntMemFrags addr:$src2),
431+
(i32 timm:$src3)))>,
418432
Sched<[WriteFMAX.Folded, WriteFMAX.ReadAfterFold]>;
419433
}
420434
let Uses = []<Register>, mayRaiseFPException = 0 in
421-
defm rrib : AVX512_maskable<0x53, MRMSrcReg, _, (outs VR128X:$dst),
422-
(ins VR128X:$src1, VR128X:$src2, i32u8imm:$src3),
423-
OpStr, "$src3, {sae}, $src2, $src1",
424-
"$src1, $src2, {sae}, $src3",
425-
(_.VT (OpNodeSAE (_.VT _.RC:$src1), (_.VT _.RC:$src2),
426-
(i32 timm:$src3)))>,
427-
Sched<[WriteFMAX]>, EVEX_B;
435+
defm rrib_Int : AVX512_maskable<0x53, MRMSrcReg, _, (outs VR128X:$dst),
436+
(ins VR128X:$src1, VR128X:$src2, i32u8imm:$src3),
437+
OpStr, "$src3, {sae}, $src2, $src1",
438+
"$src1, $src2, {sae}, $src3",
439+
(_.VT (OpNodeSAE (_.VT _.RC:$src1), (_.VT _.RC:$src2),
440+
(i32 timm:$src3)))>,
441+
Sched<[WriteFMAX]>, EVEX_B;
428442
}
429443
}
430444

0 commit comments

Comments
 (0)