[llvm] [AArch64] Match indexed forms of fmul/fmla/fmls (PR #144892)
Paul Walker via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 25 06:18:26 PDT 2025
================
@@ -872,11 +887,25 @@ let Predicates = [HasSVE] in {
} // End HasSVE
let Predicates = [HasSVE_or_SME] in {
- defm FMLA_ZZZI : sve_fp_fma_by_indexed_elem<0b00, "fmla", int_aarch64_sve_fmla_lane>;
- defm FMLS_ZZZI : sve_fp_fma_by_indexed_elem<0b01, "fmls", int_aarch64_sve_fmls_lane>;
+ defm FMLA_ZZZI : sve_fp_fma_by_indexed_elem<0b00, "fmla", AArch64fmlaidx>;
+ defm FMLS_ZZZI : sve_fp_fma_by_indexed_elem<0b01, "fmls", AArch64fmlsidx>;
defm FCMLA_ZZZI : sve_fp_fcmla_by_indexed_elem<"fcmla", int_aarch64_sve_fcmla_lane>;
- defm FMUL_ZZZI : sve_fp_fmul_by_indexed_elem<"fmul", int_aarch64_sve_fmul_lane>;
+ defm FMUL_ZZZI : sve_fp_fmul_by_indexed_elem<"fmul", AArch64fmulidx>;
+
+ // 64B segmented lane splats currently end up as trn instructions instead.
+ def : Pat<(nxv2f64 (AArch64fmul nxv2f64:$L, (AArch64trn1 nxv2f64:$R, nxv2f64:$R))),
+ (FMUL_ZZZI_D $L, $R, 0)>;
+ def : Pat<(nxv2f64 (AArch64fmul nxv2f64:$L, (AArch64trn2 nxv2f64:$R, nxv2f64:$R))),
+ (FMUL_ZZZI_D $L, $R, 1)>;
+ def : Pat<(nxv2f64 (AArch64fmla_p (SVEAllActive), nxv2f64:$Acc, nxv2f64:$L, (AArch64trn1 nxv2f64:$R, nxv2f64:$R))),
+ (FMLA_ZZZI_D $Acc, $L, $R, 0)>;
+ def : Pat<(nxv2f64 (AArch64fmla_p (SVEAllActive), nxv2f64:$Acc, nxv2f64:$L, (AArch64trn2 nxv2f64:$R, nxv2f64:$R))),
+ (FMLA_ZZZI_D $Acc, $L, $R, 1)>;
+ def : Pat<(nxv2f64 (AArch64fmla_p (SVEAllActive), nxv2f64:$Acc, (AArch64fneg_mt (SVEAllActive), nxv2f64:$L, (undef)), (AArch64trn1 nxv2f64:$R, nxv2f64:$R))),
+ (FMLS_ZZZI_D $Acc, $L, $R, 0)>;
+ def : Pat<(nxv2f64 (AArch64fmla_p (SVEAllActive), nxv2f64:$Acc, (AArch64fneg_mt (SVEAllActive), nxv2f64:$L, (undef)), (AArch64trn2 nxv2f64:$R, nxv2f64:$R))),
+ (FMLS_ZZZI_D $Acc, $L, $R, 1)>;
----------------
paulwalker-arm wrote:
Can you use `AArch64fmls_p` here?
https://github.com/llvm/llvm-project/pull/144892
More information about the llvm-commits
mailing list