Skip to content

Commit 7746c0b

Browse files
jthackrayGeorgeARM
authored andcommitted
[AArch64][llvm] Codegen for 16/32/64-bit floating-point atomicrmw fminimum/faximum (llvm#137703)
Codegen for AArch64 16/32/64-bit floating-point atomic read-modify-write operations (`atomicrmw {fmaximum,fminimum}`) using LD{B}FMAX and LD{B}FMIN atomic instructions.
1 parent 9a95cc5 commit 7746c0b

File tree

4 files changed

+244
-1191
lines changed

4 files changed

+244
-1191
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1001,6 +1001,16 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
10011001
setOperationAction(ISD::ATOMIC_LOAD_FMIN, MVT::f32, LibCall);
10021002
setOperationAction(ISD::ATOMIC_LOAD_FMIN, MVT::f64, LibCall);
10031003
setOperationAction(ISD::ATOMIC_LOAD_FMIN, MVT::bf16, LibCall);
1004+
1005+
setOperationAction(ISD::ATOMIC_LOAD_FMAXIMUM, MVT::f16, LibCall);
1006+
setOperationAction(ISD::ATOMIC_LOAD_FMAXIMUM, MVT::f32, LibCall);
1007+
setOperationAction(ISD::ATOMIC_LOAD_FMAXIMUM, MVT::f64, LibCall);
1008+
setOperationAction(ISD::ATOMIC_LOAD_FMAXIMUM, MVT::bf16, LibCall);
1009+
1010+
setOperationAction(ISD::ATOMIC_LOAD_FMINIMUM, MVT::f16, LibCall);
1011+
setOperationAction(ISD::ATOMIC_LOAD_FMINIMUM, MVT::f32, LibCall);
1012+
setOperationAction(ISD::ATOMIC_LOAD_FMINIMUM, MVT::f64, LibCall);
1013+
setOperationAction(ISD::ATOMIC_LOAD_FMINIMUM, MVT::bf16, LibCall);
10041014
}
10051015

10061016
if (Subtarget->hasLSE128()) {
@@ -27991,7 +28001,9 @@ AArch64TargetLowering::shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const {
2799128001
// If LSFE available, use atomic FP instructions in preference to expansion
2799228002
if (Subtarget->hasLSFE() && (AI->getOperation() == AtomicRMWInst::FAdd ||
2799328003
AI->getOperation() == AtomicRMWInst::FMax ||
27994-
AI->getOperation() == AtomicRMWInst::FMin))
28004+
AI->getOperation() == AtomicRMWInst::FMin ||
28005+
AI->getOperation() == AtomicRMWInst::FMaximum ||
28006+
AI->getOperation() == AtomicRMWInst::FMinimum))
2799528007
return AtomicExpansionKind::None;
2799628008

2799728009
// Nand is not supported in LSE.

llvm/lib/Target/AArch64/AArch64InstrAtomics.td

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,14 +551,21 @@ defm atomic_load_fadd : binary_atomic_op_fp<atomic_load_fadd>;
551551
defm atomic_load_fmin : binary_atomic_op_fp<atomic_load_fmin>;
552552
defm atomic_load_fmax : binary_atomic_op_fp<atomic_load_fmax>;
553553

554+
defm atomic_load_fminimum : binary_atomic_op_fp<atomic_load_fminimum>;
555+
defm atomic_load_fmaximum : binary_atomic_op_fp<atomic_load_fmaximum>;
556+
554557
let Predicates = [HasLSFE] in {
555558
defm : LDFPOPregister_patterns<"LDFADD", "atomic_load_fadd">;
556559
defm : LDFPOPregister_patterns<"LDFMAXNM", "atomic_load_fmax">;
557560
defm : LDFPOPregister_patterns<"LDFMINNM", "atomic_load_fmin">;
561+
defm : LDFPOPregister_patterns<"LDFMAX", "atomic_load_fmaximum">;
562+
defm : LDFPOPregister_patterns<"LDFMIN", "atomic_load_fminimum">;
558563

559564
defm : LDBFPOPregister_patterns<"LDBFADD", "atomic_load_fadd">;
560565
defm : LDBFPOPregister_patterns<"LDBFMAXNM", "atomic_load_fmax">;
561566
defm : LDBFPOPregister_patterns<"LDBFMINNM", "atomic_load_fmin">;
567+
defm : LDBFPOPregister_patterns<"LDBFMAX", "atomic_load_fmaximum">;
568+
defm : LDBFPOPregister_patterns<"LDBFMIN", "atomic_load_fminimum">;
562569
}
563570

564571
// v8.9a/v9.4a FEAT_LRCPC patterns

0 commit comments

Comments
 (0)