Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -975,6 +975,23 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
#undef LCALLNAME5
}

if (Subtarget->outlineAtomics() && !Subtarget->hasLSFE()) {
setOperationAction(ISD::ATOMIC_LOAD_FADD, MVT::f16, LibCall);
setOperationAction(ISD::ATOMIC_LOAD_FADD, MVT::f32, LibCall);
setOperationAction(ISD::ATOMIC_LOAD_FADD, MVT::f64, LibCall);
setOperationAction(ISD::ATOMIC_LOAD_FADD, MVT::bf16, LibCall);

setOperationAction(ISD::ATOMIC_LOAD_FMAX, MVT::f16, LibCall);
setOperationAction(ISD::ATOMIC_LOAD_FMAX, MVT::f32, LibCall);
setOperationAction(ISD::ATOMIC_LOAD_FMAX, MVT::f64, LibCall);
setOperationAction(ISD::ATOMIC_LOAD_FMAX, MVT::bf16, LibCall);

setOperationAction(ISD::ATOMIC_LOAD_FMIN, MVT::f16, LibCall);
setOperationAction(ISD::ATOMIC_LOAD_FMIN, MVT::f32, LibCall);
setOperationAction(ISD::ATOMIC_LOAD_FMIN, MVT::f64, LibCall);
setOperationAction(ISD::ATOMIC_LOAD_FMIN, MVT::bf16, LibCall);
}

if (Subtarget->hasLSE128()) {
// Custom lowering because i128 is not legal. Must be replaced by 2x64
// values. ATOMIC_LOAD_AND also needs op legalisation to emit LDCLRP.
Expand Down Expand Up @@ -27831,6 +27848,12 @@ AArch64TargetLowering::shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const {
if (CanUseLSE128)
return AtomicExpansionKind::None;

// If LSFE available, use atomic FP instructions in preference to expansion
if (Subtarget->hasLSFE() && (AI->getOperation() == AtomicRMWInst::FAdd ||
AI->getOperation() == AtomicRMWInst::FMax ||
AI->getOperation() == AtomicRMWInst::FMin))
return AtomicExpansionKind::None;

// Nand is not supported in LSE.
// Leave 128 bits to LLSC or CmpXChg.
if (AI->getOperation() != AtomicRMWInst::Nand && Size < 128 &&
Expand Down
14 changes: 14 additions & 0 deletions llvm/lib/Target/AArch64/AArch64InstrAtomics.td
Original file line number Diff line number Diff line change
Expand Up @@ -543,6 +543,20 @@ let Predicates = [HasLSE] in {
defm : LDOPregister_patterns_mod<"LDCLR", "atomic_load_and", "ORN">;
}

defm atomic_load_fadd : binary_atomic_op_fp<atomic_load_fadd>;
defm atomic_load_fmin : binary_atomic_op_fp<atomic_load_fmin>;
defm atomic_load_fmax : binary_atomic_op_fp<atomic_load_fmax>;

let Predicates = [HasLSFE] in {
defm : LDFPOPregister_patterns<"LDFADD", "atomic_load_fadd">;
defm : LDFPOPregister_patterns<"LDFMAXNM", "atomic_load_fmax">;
defm : LDFPOPregister_patterns<"LDFMINNM", "atomic_load_fmin">;

defm : LDBFPOPregister_patterns<"LDBFADD", "atomic_load_fadd">;
defm : LDBFPOPregister_patterns<"LDBFMAXNM", "atomic_load_fmax">;
defm : LDBFPOPregister_patterns<"LDBFMINNM", "atomic_load_fmin">;
}

// v8.9a/v9.4a FEAT_LRCPC patterns
let Predicates = [HasRCPC3, HasNEON] in {
// LDAP1 loads
Expand Down
30 changes: 30 additions & 0 deletions llvm/lib/Target/AArch64/AArch64InstrFormats.td
Original file line number Diff line number Diff line change
Expand Up @@ -12483,6 +12483,36 @@ multiclass LDOPregister_patterns_mod<string inst, string op, string mod> {
(i32 (!cast<Instruction>(mod#Wrr) WZR, GPR32:$Rm))>;
}

let Predicates = [HasLSFE] in
multiclass LDFPOPregister_patterns_ord_dag<string inst, string suffix, string op,
ValueType vt, dag data> {
def : Pat<(!cast<PatFrag>(op#"_"#vt#"_monotonic") FPR64:$Rn, data),
(!cast<Instruction>(inst # suffix) data, FPR64:$Rn)>;
def : Pat<(!cast<PatFrag>(op#"_"#vt#"_acquire") FPR64:$Rn, data),
(!cast<Instruction>(inst # "A" # suffix) data, FPR64:$Rn)>;
def : Pat<(!cast<PatFrag>(op#"_"#vt#"_release") FPR64:$Rn, data),
(!cast<Instruction>(inst # "L" # suffix) data, FPR64:$Rn)>;
def : Pat<(!cast<PatFrag>(op#"_"#vt#"_acq_rel") FPR64:$Rn, data),
(!cast<Instruction>(inst # "AL" # suffix) data, FPR64:$Rn)>;
def : Pat<(!cast<PatFrag>(op#"_"#vt#"_seq_cst") FPR64:$Rn, data),
(!cast<Instruction>(inst # "AL" # suffix) data, FPR64:$Rn)>;
}

multiclass LDFPOPregister_patterns_ord<string inst, string suffix, string op,
ValueType vt, dag RHS> {
defm : LDFPOPregister_patterns_ord_dag<inst, suffix, op, vt, RHS>;
}

multiclass LDFPOPregister_patterns<string inst, string op> {
defm : LDFPOPregister_patterns_ord<inst, "H", op, f16, (f16 FPR16:$Rm)>;
defm : LDFPOPregister_patterns_ord<inst, "S", op, f32, (f32 FPR32:$Rm)>;
defm : LDFPOPregister_patterns_ord<inst, "D", op, f64, (f64 FPR64:$Rm)>;
}

multiclass LDBFPOPregister_patterns<string inst, string op> {
defm : LDFPOPregister_patterns_ord<inst, "", op, bf16, (bf16 FPR16:$Rm)>;
}

let Predicates = [HasLSE] in
multiclass CASregister_patterns_ord_dag<string inst, string suffix, string op,
ValueType vt, dag OLD, dag NEW> {
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Target/AArch64/AArch64InstrInfo.td
Original file line number Diff line number Diff line change
Expand Up @@ -10546,7 +10546,7 @@ let Predicates = [HasLSFE] in {
defm LDFMAXNML : AtomicFPLoad<0b01, 0b110, "ldfmaxnml">;
defm LDFMINNMA : AtomicFPLoad<0b10, 0b111, "ldfminnma">;
defm LDFMINNMAL : AtomicFPLoad<0b11, 0b111, "ldfminnmal">;
defm LDFMINMN : AtomicFPLoad<0b00, 0b111, "ldfminnm">;
defm LDFMINNM : AtomicFPLoad<0b00, 0b111, "ldfminnm">;
defm LDFMINNML : AtomicFPLoad<0b01, 0b111, "ldfminnml">;
// BFloat16
def LDBFADDA : BaseAtomicFPLoad<FPR16, 0b00, 0b10, 0b000, "ldbfadda">;
Expand Down
Loading