Hi Alfie, > On 7 Jul 2025, at 10:46, Alfie Richards <alfie.richa...@arm.com> wrote: > > Hello all, > > This patch implements the couple of amin/amax instructions that are part of > SME2 + faminmax. > > Regression testsed and bootstrapped for Aarch64. > > Thanks, > Alfie > > -- >8 -- > > Implements the sme2+faminmax svamin and svamax intrinsics. > > gcc/ChangeLog: > > * config/aarch64/aarch64-sme.md (@aarch64_sme_<faminmax_uns_op><mode>): > New patterns. > * config/aarch64/aarch64-sve-builtins-sme.def (svamin): New intrinsics. > (svamax): New intrinsics. > * config/aarch64/aarch64-sve-builtins-sve2.cc (class faminmaximpl): New > class. > (svamin): New function. > (svamax): New function. > > gcc/testsuite/ChangeLog: > > * gcc.target/aarch64/sme2/acle-asm/amax_f16_x2.c: New test. > * gcc.target/aarch64/sme2/acle-asm/amax_f16_x4.c: New test. > * gcc.target/aarch64/sme2/acle-asm/amax_f32_x2.c: New test. > * gcc.target/aarch64/sme2/acle-asm/amax_f32_x4.c: New test. > * gcc.target/aarch64/sme2/acle-asm/amax_f64_x2.c: New test. > * gcc.target/aarch64/sme2/acle-asm/amax_f64_x4.c: New test. > * gcc.target/aarch64/sme2/acle-asm/amin_f16_x2.c: New test. > * gcc.target/aarch64/sme2/acle-asm/amin_f16_x4.c: New test. > * gcc.target/aarch64/sme2/acle-asm/amin_f32_x2.c: New test. > * gcc.target/aarch64/sme2/acle-asm/amin_f32_x4.c: New test. > * gcc.target/aarch64/sme2/acle-asm/amin_f64_x2.c: New test. > * gcc.target/aarch64/sme2/acle-asm/amin_f64_x4.c: New test. > --- > gcc/config/aarch64/aarch64-sme.md | 18 +++ > .../aarch64/aarch64-sve-builtins-sme.def | 5 + > .../aarch64/aarch64-sve-builtins-sve2.cc | 44 +++++- > .../aarch64/sme2/acle-asm/amax_f16_x2.c | 97 +++++++++++++ > .../aarch64/sme2/acle-asm/amax_f16_x4.c | 128 +++++++++++++++++ > .../aarch64/sme2/acle-asm/amax_f32_x2.c | 96 +++++++++++++ > .../aarch64/sme2/acle-asm/amax_f32_x4.c | 129 ++++++++++++++++++ > .../aarch64/sme2/acle-asm/amax_f64_x2.c | 96 +++++++++++++ > .../aarch64/sme2/acle-asm/amax_f64_x4.c | 128 +++++++++++++++++ > .../aarch64/sme2/acle-asm/amin_f16_x2.c | 96 +++++++++++++ > .../aarch64/sme2/acle-asm/amin_f16_x4.c | 128 +++++++++++++++++ > .../aarch64/sme2/acle-asm/amin_f32_x2.c | 96 +++++++++++++ > .../aarch64/sme2/acle-asm/amin_f32_x4.c | 128 +++++++++++++++++ > .../aarch64/sme2/acle-asm/amin_f64_x2.c | 96 +++++++++++++ > .../aarch64/sme2/acle-asm/amin_f64_x4.c | 128 +++++++++++++++++ > 15 files changed, 1409 insertions(+), 4 deletions(-) > create mode 100644 > gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f16_x2.c > create mode 100644 > gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f16_x4.c > create mode 100644 > gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f32_x2.c > create mode 100644 > gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f32_x4.c > create mode 100644 > gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f64_x2.c > create mode 100644 > gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f64_x4.c > create mode 100644 > gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f16_x2.c > create mode 100644 > gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f16_x4.c > create mode 100644 > gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f32_x2.c > create mode 100644 > gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f32_x4.c > create mode 100644 > gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f64_x2.c > create mode 100644 > gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f64_x4.c > > diff --git a/gcc/config/aarch64/aarch64-sme.md > b/gcc/config/aarch64/aarch64-sme.md > index b8bb4cc14b6..bfe368e80b5 100644 > --- a/gcc/config/aarch64/aarch64-sme.md > +++ b/gcc/config/aarch64/aarch64-sme.md > @@ -38,6 +38,7 @@ > ;; ---- Binary arithmetic on ZA tile > ;; ---- Binary arithmetic on ZA slice > ;; ---- Binary arithmetic, writing to ZA slice > +;; ---- Absolute minimum/maximum > ;; > ;; == Ternary arithmetic > ;; ---- [INT] Dot product > @@ -1264,6 +1265,23 @@ (define_insn "*aarch64_sme_single_<optab><mode>_plus" > "<sme_int_op>\tza.<Vetype>[%w0, %1, vgx<vector_count>], %2, %3.<Vetype>" > ) > > +;; ------------------------------------------------------------------------- > +;; ---- Absolute minimum/maximum > +;; ------------------------------------------------------------------------- > +;; Includes: > +;; - svamin (SME2+faminmax) > +;; - svamin (SME2+faminmax) > +;; ------------------------------------------------------------------------- > + > +(define_insn "@aarch64_sme_<faminmax_uns_op><mode>" > + [(set (match_operand:SVE_Fx24 0 "register_operand" "=Uw<vector_count>") > + (unspec:SVE_Fx24 [(match_operand:SVE_Fx24 1 "register_operand" "%0") > + (match_operand:SVE_Fx24 2 "register_operand" "Uw<vector_count>")] > + FAMINMAX_UNS))] > + "TARGET_SME2 && TARGET_FAMINMAX" > + "<faminmax_uns_op>\t%0, %1, %2" > +) > + > ;; ========================================================================= > ;; == Ternary arithmetic > ;; ========================================================================= > diff --git a/gcc/config/aarch64/aarch64-sve-builtins-sme.def > b/gcc/config/aarch64/aarch64-sve-builtins-sme.def > index f75c0a5b8b1..c324fce7f33 100644 > --- a/gcc/config/aarch64/aarch64-sve-builtins-sme.def > +++ b/gcc/config/aarch64/aarch64-sve-builtins-sme.def > @@ -92,6 +92,11 @@ DEF_SME_FUNCTION (svstr_zt, str_zt, none, none) > DEF_SME_FUNCTION (svzero_zt, inherent_zt, none, none) > #undef REQUIRED_EXTENSIONS > > +#define REQUIRED_EXTENSIONS streaming_only (AARCH64_FL_SME2)
Do these also need an FAMINMAX guard? Looks ok to me otherwise. Thanks, Kyrill > +DEF_SME_FUNCTION_GS (svamin, binary_opt_single_n, all_float, x24, none) > +DEF_SME_FUNCTION_GS (svamax, binary_opt_single_n, all_float, x24, none) > +#undef REQUIRED_EXTENSIONS > + > /* The d_za entries in this section just declare C _za64 overloads, > which will then be resolved to either an integer function or a > floating-point function. They are needed because the integer and > diff --git a/gcc/config/aarch64/aarch64-sve-builtins-sve2.cc > b/gcc/config/aarch64/aarch64-sve-builtins-sve2.cc > index d9922de7ca5..c41cdef1158 100644 > --- a/gcc/config/aarch64/aarch64-sve-builtins-sve2.cc > +++ b/gcc/config/aarch64/aarch64-sve-builtins-sve2.cc > @@ -929,6 +929,44 @@ public: > unsigned int m_bits; > }; > > +/* The same as cond_or_uncond_unspec_function but the intrinsics with vector > + modes are SME2 extensions instead of SVE. */ > +class faminmaximpl : public function_base > +{ > +public: > + CONSTEXPR faminmaximpl (int cond_unspec, int uncond_unspec) > + : m_cond_unspec (cond_unspec), m_uncond_unspec (uncond_unspec) > + {} > + > + rtx > + expand (function_expander &e) const override > + { > + if (e.group_suffix ().vectors_per_tuple > 1) > + { > + /* SME2+faminmax intrinsics. */ > + gcc_assert (e.pred == PRED_none); > + auto mode = e.tuple_mode (0); > + auto icode = (code_for_aarch64_sme (m_uncond_unspec, mode)); > + return e.use_exact_insn (icode); > + } > + /* SVE+faminmax intrinsics. */ > + else if (e.pred == PRED_none) > + { > + auto mode = e.tuple_mode (0); > + auto icode = (e.mode_suffix_id == MODE_single > + ? code_for_aarch64_sve_single (m_uncond_unspec, mode) > + : code_for_aarch64_sve (m_uncond_unspec, mode)); > + return e.use_exact_insn (icode); > + } > + return e.map_to_unspecs (m_cond_unspec, m_cond_unspec, m_cond_unspec); > + } > + > + /* The unspecs for the conditional and unconditional instructions, > + respectively. */ > + int m_cond_unspec; > + int m_uncond_unspec; > +}; > + > } /* end anonymous namespace */ > > namespace aarch64_sve { > @@ -957,10 +995,8 @@ FUNCTION (svaesd, fixed_insn_function, > (CODE_FOR_aarch64_sve2_aesd)) > FUNCTION (svaese, fixed_insn_function, (CODE_FOR_aarch64_sve2_aese)) > FUNCTION (svaesimc, fixed_insn_function, (CODE_FOR_aarch64_sve2_aesimc)) > FUNCTION (svaesmc, fixed_insn_function, (CODE_FOR_aarch64_sve2_aesmc)) > -FUNCTION (svamax, cond_or_uncond_unspec_function, > - (UNSPEC_COND_FAMAX, UNSPEC_FAMAX)) > -FUNCTION (svamin, cond_or_uncond_unspec_function, > - (UNSPEC_COND_FAMIN, UNSPEC_FAMIN)) > +FUNCTION (svamax, faminmaximpl, (UNSPEC_COND_FAMAX, UNSPEC_FAMAX)) > +FUNCTION (svamin, faminmaximpl, (UNSPEC_COND_FAMIN, UNSPEC_FAMIN)) > FUNCTION (svandqv, reduction, (UNSPEC_ANDQV, UNSPEC_ANDQV, -1)) > FUNCTION (svbcax, CODE_FOR_MODE0 (aarch64_sve2_bcax),) > FUNCTION (svbdep, unspec_based_function, (UNSPEC_BDEP, UNSPEC_BDEP, -1)) > diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f16_x2.c > b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f16_x2.c > new file mode 100644 > index 00000000000..90b5438e173 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f16_x2.c > @@ -0,0 +1,97 @@ > +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ > + > +#include "test_sme2_acle.h" > +#pragma GCC target "+faminmax" > + > +/* > +** amax_z0_z0_z4: > +** famax {z0\.h - z1\.h}, {z0\.h - z1\.h}, {z4\.h - z5\.h} > +** ret > +*/ > +TEST_XN (amax_z0_z0_z4, svfloat16x2_t, z0, > + svamax_f16_x2 (z0, z4), > + svamax (z0, z4)) > + > +/* > +** amax_z0_z4_z0: > +** famax {z0\.h - z1\.h}, {z0\.h - z1\.h}, {z4\.h - z5\.h} > +** ret > +*/ > +TEST_XN (amax_z0_z4_z0, svfloat16x2_t, z0, > + svamax_f16_x2 (z4, z0), > + svamax (z4, z0)) > + > +/* > +** amax_z0_z4_z28: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** famax [^\n]+, {z28\.h - z29\.h} > +** | > +** famax [^\n]+, {z28\.h - z29\.h} > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amax_z0_z4_z28, svfloat16x2_t, z0, > + svamax_f16_x2 (z4, z28), > + svamax (z4, z28)) > + > +/* > +** amax_z18_z18_z4: > +** famax {z18\.h - z19\.h}, {z18\.h - z19\.h}, {z4\.h - z5\.h} > +** ret > +*/ > +TEST_XN (amax_z18_z18_z4, svfloat16x2_t, z18, > + svamax_f16_x2 (z18, z4), > + svamax (z18, z4)) > + > +/* > +** amax_z23_z23_z18: > +** mov [^\n]+ > +** mov [^\n]+ > +** famax [^\n]+, {z18\.h - z19\.h} > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amax_z23_z23_z18, svfloat16x2_t, z23, > + svamax_f16_x2 (z23, z18), > + svamax (z23, z18)) > + > +/* > +** amax_z28_z28_z0: > +** famax {z28\.h - z29\.h}, {z28\.h - z29\.h}, {z0\.h - z1\.h} > +** ret > +*/ > +TEST_XN (amax_z28_z28_z0, svfloat16x2_t, z28, > + svamax_f16_x2 (z28, z0), > + svamax (z28, z0)) > + > +/* > +** amax_z0_z0_z18: > +** famax {z0\.h - z1\.h}, {z0\.h - z1\.h}, {z18\.h - z19\.h} > +** ret > +*/ > +TEST_XN (amax_z0_z0_z18, svfloat16x2_t, z0, > + svamax_f16_x2 (z0, z18), > + svamax (z0, z18)) > + > +/* > +** amax_z4_z4_z23: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** famax {z4\.h - z5\.h}, {z4\.h - z5\.h}, [^\n]+ > +** | > +** famax {z4\.h - z5\.h}, {z4\.h - z5\.h}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amax_z4_z4_z23, svfloat16x2_t, z4, > + svamax_f16_x2 (z4, z23), > + svamax (z4, z23)) > + > diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f16_x4.c > b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f16_x4.c > new file mode 100644 > index 00000000000..d168ad7ee8e > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f16_x4.c > @@ -0,0 +1,128 @@ > +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ > + > +#include "test_sme2_acle.h" > +#pragma GCC target "+faminmax" > + > +/* > +** amax_z0_z0_z4: > +** famax {z0\.h - z3\.h}, {z0\.h - z3\.h}, {z4\.h - z7\.h} > +** ret > +*/ > +TEST_XN (amax_z0_z0_z4, svfloat16x4_t, z0, > + svamax_f16_x4 (z0, z4), > + svamax (z0, z4)) > + > +/* > +** amax_z0_z4_z0: > +** famax {z0\.h - z3\.h}, {z0\.h - z3\.h}, {z4\.h - z7\.h} > +** ret > +*/ > +TEST_XN (amax_z0_z4_z0, svfloat16x4_t, z0, > + svamax_f16_x4 (z4, z0), > + svamax (z4, z0)) > + > +/* > +** amax_z0_z4_z28: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famax [^\n]+, {z28\.h - z31\.h} > +** | > +** famax [^\n]+, {z28\.h - z31\.h} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amax_z0_z4_z28, svfloat16x4_t, z0, > + svamax_f16_x4 (z4, z28), > + svamax (z4, z28)) > + > +/* > +** amax_z18_z18_z4: > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famax [^\n]+, {z4\.h - z7\.h} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amax_z18_z18_z4, svfloat16x4_t, z18, > + svamax_f16_x4 (z18, z4), > + svamax (z18, z4)) > + > +/* > +** amax_z23_z23_z28: > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famax [^\n]+, {z28\.h - z31\.h} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amax_z23_z23_z28, svfloat16x4_t, z23, > + svamax_f16_x4 (z23, z28), > + svamax (z23, z28)) > + > +/* > +** amax_z28_z28_z0: > +** famax {z28\.h - z31\.h}, {z28\.h - z31\.h}, {z0\.h - z3\.h} > +** ret > +*/ > +TEST_XN (amax_z28_z28_z0, svfloat16x4_t, z28, > + svamax_f16_x4 (z28, z0), > + svamax (z28, z0)) > + > +/* > +** amax_z0_z0_z18: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famax {z0\.h - z3\.h}, {z0\.h - z3\.h}, [^\n]+ > +** | > +** famax {z0\.h - z3\.h}, {z0\.h - z3\.h}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amax_z0_z0_z18, svfloat16x4_t, z0, > + svamax_f16_x4 (z0, z18), > + svamax (z0, z18)) > + > +/* > +** amax_z4_z4_z23: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famax {z4\.h - z7\.h}, {z4\.h - z7\.h}, [^\n]+ > +** | > +** famax {z4\.h - z7\.h}, {z4\.h - z7\.h}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amax_z4_z4_z23, svfloat16x4_t, z4, > + svamax_f16_x4 (z4, z23), > + svamax (z4, z23)) > diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f32_x2.c > b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f32_x2.c > new file mode 100644 > index 00000000000..618d50b9b61 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f32_x2.c > @@ -0,0 +1,96 @@ > +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ > + > +#include "test_sme2_acle.h" > +#pragma GCC target "+faminmax" > + > +/* > +** amax_z0_z0_z4: > +** famax {z0\.s - z1\.s}, {z0\.s - z1\.s}, {z4\.s - z5\.s} > +** ret > +*/ > +TEST_XN (amax_z0_z0_z4, svfloat32x2_t, z0, > + svamax_f32_x2 (z0, z4), > + svamax (z0, z4)) > + > +/* > +** amax_z0_z4_z0: > +** famax {z0\.s - z1\.s}, {z0\.s - z1\.s}, {z4\.s - z5\.s} > +** ret > +*/ > +TEST_XN (amax_z0_z4_z0, svfloat32x2_t, z0, > + svamax_f32_x2 (z4, z0), > + svamax (z4, z0)) > + > +/* > +** amax_z0_z4_z28: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** famax [^\n]+, {z28\.s - z29\.s} > +** | > +** famax [^\n]+, {z28\.s - z29\.s} > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amax_z0_z4_z28, svfloat32x2_t, z0, > + svamax_f32_x2 (z4, z28), > + svamax (z4, z28)) > + > +/* > +** amax_z18_z18_z4: > +** famax {z18\.s - z19\.s}, {z18\.s - z19\.s}, {z4\.s - z5\.s} > +** ret > +*/ > +TEST_XN (amax_z18_z18_z4, svfloat32x2_t, z18, > + svamax_f32_x2 (z18, z4), > + svamax (z18, z4)) > + > +/* > +** amax_z23_z23_z18: > +** mov [^\n]+ > +** mov [^\n]+ > +** famax [^\n]+, {z18\.s - z19\.s} > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amax_z23_z23_z18, svfloat32x2_t, z23, > + svamax_f32_x2 (z23, z18), > + svamax (z23, z18)) > + > +/* > +** amax_z28_z28_z0: > +** famax {z28\.s - z29\.s}, {z28\.s - z29\.s}, {z0\.s - z1\.s} > +** ret > +*/ > +TEST_XN (amax_z28_z28_z0, svfloat32x2_t, z28, > + svamax_f32_x2 (z28, z0), > + svamax (z28, z0)) > + > +/* > +** amax_z0_z0_z18: > +** famax {z0\.s - z1\.s}, {z0\.s - z1\.s}, {z18\.s - z19\.s} > +** ret > +*/ > +TEST_XN (amax_z0_z0_z18, svfloat32x2_t, z0, > + svamax_f32_x2 (z0, z18), > + svamax (z0, z18)) > + > +/* > +** amax_z4_z4_z23: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** famax {z4\.s - z5\.s}, {z4\.s - z5\.s}, [^\n]+ > +** | > +** famax {z4\.s - z5\.s}, {z4\.s - z5\.s}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amax_z4_z4_z23, svfloat32x2_t, z4, > + svamax_f32_x2 (z4, z23), > + svamax (z4, z23)) > diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f32_x4.c > b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f32_x4.c > new file mode 100644 > index 00000000000..981e78c1b5c > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f32_x4.c > @@ -0,0 +1,129 @@ > +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ > + > +#include "test_sme2_acle.h" > +#pragma GCC target "+faminmax" > + > +/* > +** amax_z0_z0_z4: > +** famax {z0\.s - z3\.s}, {z0\.s - z3\.s}, {z4\.s - z7\.s} > +** ret > +*/ > +TEST_XN (amax_z0_z0_z4, svfloat32x4_t, z0, > + svamax_f32_x4 (z0, z4), > + svamax (z0, z4)) > + > +/* > +** amax_z0_z4_z0: > +** famax {z0\.s - z3\.s}, {z0\.s - z3\.s}, {z4\.s - z7\.s} > +** ret > +*/ > +TEST_XN (amax_z0_z4_z0, svfloat32x4_t, z0, > + svamax_f32_x4 (z4, z0), > + svamax (z4, z0)) > + > +/* > +** amax_z0_z4_z28: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famax [^\n]+, {z28\.s - z31\.s} > +** | > +** famax [^\n]+, {z28\.s - z31\.s} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amax_z0_z4_z28, svfloat32x4_t, z0, > + svamax_f32_x4 (z4, z28), > + svamax (z4, z28)) > + > +/* > +** amax_z18_z18_z4: > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famax [^\n]+, {z4\.s - z7\.s} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amax_z18_z18_z4, svfloat32x4_t, z18, > + svamax_f32_x4 (z18, z4), > + svamax (z18, z4)) > + > +/* > +** amax_z23_z23_z28: > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famax [^\n]+, {z28\.s - z31\.s} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amax_z23_z23_z28, svfloat32x4_t, z23, > + svamax_f32_x4 (z23, z28), > + svamax (z23, z28)) > + > +/* > +** amax_z28_z28_z0: > +** famax {z28\.s - z31\.s}, {z28\.s - z31\.s}, {z0\.s - z3\.s} > +** ret > +*/ > +TEST_XN (amax_z28_z28_z0, svfloat32x4_t, z28, > + svamax_f32_x4 (z28, z0), > + svamax (z28, z0)) > + > +/* > +** amax_z0_z0_z18: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famax {z0\.s - z3\.s}, {z0\.s - z3\.s}, [^\n]+ > +** | > +** famax {z0\.s - z3\.s}, {z0\.s - z3\.s}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amax_z0_z0_z18, svfloat32x4_t, z0, > + svamax_f32_x4 (z0, z18), > + svamax (z0, z18)) > + > +/* > +** amax_z4_z4_z23: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famax {z4\.s - z7\.s}, {z4\.s - z7\.s}, [^\n]+ > +** | > +** famax {z4\.s - z7\.s}, {z4\.s - z7\.s}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amax_z4_z4_z23, svfloat32x4_t, z4, > + svamax_f32_x4 (z4, z23), > + svamax (z4, z23)) > + > diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f64_x2.c > b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f64_x2.c > new file mode 100644 > index 00000000000..e93a409475e > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f64_x2.c > @@ -0,0 +1,96 @@ > +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ > + > +#include "test_sme2_acle.h" > +#pragma GCC target "+faminmax" > + > +/* > +** amax_z0_z0_z4: > +** famax {z0\.d - z1\.d}, {z0\.d - z1\.d}, {z4\.d - z5\.d} > +** ret > +*/ > +TEST_XN (amax_z0_z0_z4, svfloat64x2_t, z0, > + svamax_f64_x2 (z0, z4), > + svamax (z0, z4)) > + > +/* > +** amax_z0_z4_z0: > +** famax {z0\.d - z1\.d}, {z0\.d - z1\.d}, {z4\.d - z5\.d} > +** ret > +*/ > +TEST_XN (amax_z0_z4_z0, svfloat64x2_t, z0, > + svamax_f64_x2 (z4, z0), > + svamax (z4, z0)) > + > +/* > +** amax_z0_z4_z28: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** famax [^\n]+, {z28\.d - z29\.d} > +** | > +** famax [^\n]+, {z28\.d - z29\.d} > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amax_z0_z4_z28, svfloat64x2_t, z0, > + svamax_f64_x2 (z4, z28), > + svamax (z4, z28)) > + > +/* > +** amax_z18_z18_z4: > +** famax {z18\.d - z19\.d}, {z18\.d - z19\.d}, {z4\.d - z5\.d} > +** ret > +*/ > +TEST_XN (amax_z18_z18_z4, svfloat64x2_t, z18, > + svamax_f64_x2 (z18, z4), > + svamax (z18, z4)) > + > +/* > +** amax_z23_z23_z18: > +** mov [^\n]+ > +** mov [^\n]+ > +** famax [^\n]+, {z18\.d - z19\.d} > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amax_z23_z23_z18, svfloat64x2_t, z23, > + svamax_f64_x2 (z23, z18), > + svamax (z23, z18)) > + > +/* > +** amax_z28_z28_z0: > +** famax {z28\.d - z29\.d}, {z28\.d - z29\.d}, {z0\.d - z1\.d} > +** ret > +*/ > +TEST_XN (amax_z28_z28_z0, svfloat64x2_t, z28, > + svamax_f64_x2 (z28, z0), > + svamax (z28, z0)) > + > +/* > +** amax_z0_z0_z18: > +** famax {z0\.d - z1\.d}, {z0\.d - z1\.d}, {z18\.d - z19\.d} > +** ret > +*/ > +TEST_XN (amax_z0_z0_z18, svfloat64x2_t, z0, > + svamax_f64_x2 (z0, z18), > + svamax (z0, z18)) > + > +/* > +** amax_z4_z4_z23: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** famax {z4\.d - z5\.d}, {z4\.d - z5\.d}, [^\n]+ > +** | > +** famax {z4\.d - z5\.d}, {z4\.d - z5\.d}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amax_z4_z4_z23, svfloat64x2_t, z4, > + svamax_f64_x2 (z4, z23), > + svamax (z4, z23)) > diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f64_x4.c > b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f64_x4.c > new file mode 100644 > index 00000000000..2db629e147c > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amax_f64_x4.c > @@ -0,0 +1,128 @@ > +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ > + > +#include "test_sme2_acle.h" > +#pragma GCC target "+faminmax" > + > +/* > +** amax_z0_z0_z4: > +** famax {z0\.d - z3\.d}, {z0\.d - z3\.d}, {z4\.d - z7\.d} > +** ret > +*/ > +TEST_XN (amax_z0_z0_z4, svfloat64x4_t, z0, > + svamax_f64_x4 (z0, z4), > + svamax (z0, z4)) > + > +/* > +** amax_z0_z4_z0: > +** famax {z0\.d - z3\.d}, {z0\.d - z3\.d}, {z4\.d - z7\.d} > +** ret > +*/ > +TEST_XN (amax_z0_z4_z0, svfloat64x4_t, z0, > + svamax_f64_x4 (z4, z0), > + svamax (z4, z0)) > + > +/* > +** amax_z0_z4_z28: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famax [^\n]+, {z28\.d - z31\.d} > +** | > +** famax [^\n]+, {z28\.d - z31\.d} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amax_z0_z4_z28, svfloat64x4_t, z0, > + svamax_f64_x4 (z4, z28), > + svamax (z4, z28)) > + > +/* > +** amax_z18_z18_z4: > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famax [^\n]+, {z4\.d - z7\.d} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amax_z18_z18_z4, svfloat64x4_t, z18, > + svamax_f64_x4 (z18, z4), > + svamax (z18, z4)) > + > +/* > +** amax_z23_z23_z28: > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famax [^\n]+, {z28\.d - z31\.d} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amax_z23_z23_z28, svfloat64x4_t, z23, > + svamax_f64_x4 (z23, z28), > + svamax (z23, z28)) > + > +/* > +** amax_z28_z28_z0: > +** famax {z28\.d - z31\.d}, {z28\.d - z31\.d}, {z0\.d - z3\.d} > +** ret > +*/ > +TEST_XN (amax_z28_z28_z0, svfloat64x4_t, z28, > + svamax_f64_x4 (z28, z0), > + svamax (z28, z0)) > + > +/* > +** amax_z0_z0_z18: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famax {z0\.d - z3\.d}, {z0\.d - z3\.d}, [^\n]+ > +** | > +** famax {z0\.d - z3\.d}, {z0\.d - z3\.d}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amax_z0_z0_z18, svfloat64x4_t, z0, > + svamax_f64_x4 (z0, z18), > + svamax (z0, z18)) > + > +/* > +** amax_z4_z4_z23: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famax {z4\.d - z7\.d}, {z4\.d - z7\.d}, [^\n]+ > +** | > +** famax {z4\.d - z7\.d}, {z4\.d - z7\.d}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amax_z4_z4_z23, svfloat64x4_t, z4, > + svamax_f64_x4 (z4, z23), > + svamax (z4, z23)) > diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f16_x2.c > b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f16_x2.c > new file mode 100644 > index 00000000000..74604e14f01 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f16_x2.c > @@ -0,0 +1,96 @@ > +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ > + > +#include "test_sme2_acle.h" > +#pragma GCC target "+faminmax" > + > +/* > +** amin_z0_z0_z4: > +** famin {z0\.h - z1\.h}, {z0\.h - z1\.h}, {z4\.h - z5\.h} > +** ret > +*/ > +TEST_XN (amin_z0_z0_z4, svfloat16x2_t, z0, > + svamin_f16_x2 (z0, z4), > + svamin (z0, z4)) > + > +/* > +** amin_z0_z4_z0: > +** famin {z0\.h - z1\.h}, {z0\.h - z1\.h}, {z4\.h - z5\.h} > +** ret > +*/ > +TEST_XN (amin_z0_z4_z0, svfloat16x2_t, z0, > + svamin_f16_x2 (z4, z0), > + svamin (z4, z0)) > + > +/* > +** amin_z0_z4_z28: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** famin [^\n]+, {z28\.h - z29\.h} > +** | > +** famin [^\n]+, {z28\.h - z29\.h} > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amin_z0_z4_z28, svfloat16x2_t, z0, > + svamin_f16_x2 (z4, z28), > + svamin (z4, z28)) > + > +/* > +** amin_z18_z18_z4: > +** famin {z18\.h - z19\.h}, {z18\.h - z19\.h}, {z4\.h - z5\.h} > +** ret > +*/ > +TEST_XN (amin_z18_z18_z4, svfloat16x2_t, z18, > + svamin_f16_x2 (z18, z4), > + svamin (z18, z4)) > + > +/* > +** amin_z23_z23_z18: > +** mov [^\n]+ > +** mov [^\n]+ > +** famin [^\n]+, {z18\.h - z19\.h} > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amin_z23_z23_z18, svfloat16x2_t, z23, > + svamin_f16_x2 (z23, z18), > + svamin (z23, z18)) > + > +/* > +** amin_z28_z28_z0: > +** famin {z28\.h - z29\.h}, {z28\.h - z29\.h}, {z0\.h - z1\.h} > +** ret > +*/ > +TEST_XN (amin_z28_z28_z0, svfloat16x2_t, z28, > + svamin_f16_x2 (z28, z0), > + svamin (z28, z0)) > + > +/* > +** amin_z0_z0_z18: > +** famin {z0\.h - z1\.h}, {z0\.h - z1\.h}, {z18\.h - z19\.h} > +** ret > +*/ > +TEST_XN (amin_z0_z0_z18, svfloat16x2_t, z0, > + svamin_f16_x2 (z0, z18), > + svamin (z0, z18)) > + > +/* > +** amin_z4_z4_z23: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** famin {z4\.h - z5\.h}, {z4\.h - z5\.h}, [^\n]+ > +** | > +** famin {z4\.h - z5\.h}, {z4\.h - z5\.h}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amin_z4_z4_z23, svfloat16x2_t, z4, > + svamin_f16_x2 (z4, z23), > + svamin (z4, z23)) > diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f16_x4.c > b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f16_x4.c > new file mode 100644 > index 00000000000..bc3779bca6c > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f16_x4.c > @@ -0,0 +1,128 @@ > +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ > + > +#include "test_sme2_acle.h" > +#pragma GCC target "+faminmax" > + > +/* > +** amin_z0_z0_z4: > +** famin {z0\.h - z3\.h}, {z0\.h - z3\.h}, {z4\.h - z7\.h} > +** ret > +*/ > +TEST_XN (amin_z0_z0_z4, svfloat16x4_t, z0, > + svamin_f16_x4 (z0, z4), > + svamin (z0, z4)) > + > +/* > +** amin_z0_z4_z0: > +** famin {z0\.h - z3\.h}, {z0\.h - z3\.h}, {z4\.h - z7\.h} > +** ret > +*/ > +TEST_XN (amin_z0_z4_z0, svfloat16x4_t, z0, > + svamin_f16_x4 (z4, z0), > + svamin (z4, z0)) > + > +/* > +** amin_z0_z4_z28: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famin [^\n]+, {z28\.h - z31\.h} > +** | > +** famin [^\n]+, {z28\.h - z31\.h} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amin_z0_z4_z28, svfloat16x4_t, z0, > + svamin_f16_x4 (z4, z28), > + svamin (z4, z28)) > + > +/* > +** amin_z18_z18_z4: > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famin [^\n]+, {z4\.h - z7\.h} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amin_z18_z18_z4, svfloat16x4_t, z18, > + svamin_f16_x4 (z18, z4), > + svamin (z18, z4)) > + > +/* > +** amin_z23_z23_z28: > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famin [^\n]+, {z28\.h - z31\.h} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amin_z23_z23_z28, svfloat16x4_t, z23, > + svamin_f16_x4 (z23, z28), > + svamin (z23, z28)) > + > +/* > +** amin_z28_z28_z0: > +** famin {z28\.h - z31\.h}, {z28\.h - z31\.h}, {z0\.h - z3\.h} > +** ret > +*/ > +TEST_XN (amin_z28_z28_z0, svfloat16x4_t, z28, > + svamin_f16_x4 (z28, z0), > + svamin (z28, z0)) > + > +/* > +** amin_z0_z0_z18: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famin {z0\.h - z3\.h}, {z0\.h - z3\.h}, [^\n]+ > +** | > +** famin {z0\.h - z3\.h}, {z0\.h - z3\.h}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amin_z0_z0_z18, svfloat16x4_t, z0, > + svamin_f16_x4 (z0, z18), > + svamin (z0, z18)) > + > +/* > +** amin_z4_z4_z23: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famin {z4\.h - z7\.h}, {z4\.h - z7\.h}, [^\n]+ > +** | > +** famin {z4\.h - z7\.h}, {z4\.h - z7\.h}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amin_z4_z4_z23, svfloat16x4_t, z4, > + svamin_f16_x4 (z4, z23), > + svamin (z4, z23)) > diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f32_x2.c > b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f32_x2.c > new file mode 100644 > index 00000000000..43e3075d40f > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f32_x2.c > @@ -0,0 +1,96 @@ > +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ > + > +#include "test_sme2_acle.h" > +#pragma GCC target "+faminmax" > + > +/* > +** amin_z0_z0_z4: > +** famin {z0\.s - z1\.s}, {z0\.s - z1\.s}, {z4\.s - z5\.s} > +** ret > +*/ > +TEST_XN (amin_z0_z0_z4, svfloat32x2_t, z0, > + svamin_f32_x2 (z0, z4), > + svamin (z0, z4)) > + > +/* > +** amin_z0_z4_z0: > +** famin {z0\.s - z1\.s}, {z0\.s - z1\.s}, {z4\.s - z5\.s} > +** ret > +*/ > +TEST_XN (amin_z0_z4_z0, svfloat32x2_t, z0, > + svamin_f32_x2 (z4, z0), > + svamin (z4, z0)) > + > +/* > +** amin_z0_z4_z28: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** famin [^\n]+, {z28\.s - z29\.s} > +** | > +** famin [^\n]+, {z28\.s - z29\.s} > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amin_z0_z4_z28, svfloat32x2_t, z0, > + svamin_f32_x2 (z4, z28), > + svamin (z4, z28)) > + > +/* > +** amin_z18_z18_z4: > +** famin {z18\.s - z19\.s}, {z18\.s - z19\.s}, {z4\.s - z5\.s} > +** ret > +*/ > +TEST_XN (amin_z18_z18_z4, svfloat32x2_t, z18, > + svamin_f32_x2 (z18, z4), > + svamin (z18, z4)) > + > +/* > +** amin_z23_z23_z18: > +** mov [^\n]+ > +** mov [^\n]+ > +** famin [^\n]+, {z18\.s - z19\.s} > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amin_z23_z23_z18, svfloat32x2_t, z23, > + svamin_f32_x2 (z23, z18), > + svamin (z23, z18)) > + > +/* > +** amin_z28_z28_z0: > +** famin {z28\.s - z29\.s}, {z28\.s - z29\.s}, {z0\.s - z1\.s} > +** ret > +*/ > +TEST_XN (amin_z28_z28_z0, svfloat32x2_t, z28, > + svamin_f32_x2 (z28, z0), > + svamin (z28, z0)) > + > +/* > +** amin_z0_z0_z18: > +** famin {z0\.s - z1\.s}, {z0\.s - z1\.s}, {z18\.s - z19\.s} > +** ret > +*/ > +TEST_XN (amin_z0_z0_z18, svfloat32x2_t, z0, > + svamin_f32_x2 (z0, z18), > + svamin (z0, z18)) > + > +/* > +** amin_z4_z4_z23: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** famin {z4\.s - z5\.s}, {z4\.s - z5\.s}, [^\n]+ > +** | > +** famin {z4\.s - z5\.s}, {z4\.s - z5\.s}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amin_z4_z4_z23, svfloat32x2_t, z4, > + svamin_f32_x2 (z4, z23), > + svamin (z4, z23)) > diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f32_x4.c > b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f32_x4.c > new file mode 100644 > index 00000000000..6bd20f8fdd9 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f32_x4.c > @@ -0,0 +1,128 @@ > +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ > + > +#include "test_sme2_acle.h" > +#pragma GCC target "+faminmax" > + > +/* > +** amin_z0_z0_z4: > +** famin {z0\.s - z3\.s}, {z0\.s - z3\.s}, {z4\.s - z7\.s} > +** ret > +*/ > +TEST_XN (amin_z0_z0_z4, svfloat32x4_t, z0, > + svamin_f32_x4 (z0, z4), > + svamin (z0, z4)) > + > +/* > +** amin_z0_z4_z0: > +** famin {z0\.s - z3\.s}, {z0\.s - z3\.s}, {z4\.s - z7\.s} > +** ret > +*/ > +TEST_XN (amin_z0_z4_z0, svfloat32x4_t, z0, > + svamin_f32_x4 (z4, z0), > + svamin (z4, z0)) > + > +/* > +** amin_z0_z4_z28: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famin [^\n]+, {z28\.s - z31\.s} > +** | > +** famin [^\n]+, {z28\.s - z31\.s} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amin_z0_z4_z28, svfloat32x4_t, z0, > + svamin_f32_x4 (z4, z28), > + svamin (z4, z28)) > + > +/* > +** amin_z18_z18_z4: > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famin [^\n]+, {z4\.s - z7\.s} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amin_z18_z18_z4, svfloat32x4_t, z18, > + svamin_f32_x4 (z18, z4), > + svamin (z18, z4)) > + > +/* > +** amin_z23_z23_z28: > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famin [^\n]+, {z28\.s - z31\.s} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amin_z23_z23_z28, svfloat32x4_t, z23, > + svamin_f32_x4 (z23, z28), > + svamin (z23, z28)) > + > +/* > +** amin_z28_z28_z0: > +** famin {z28\.s - z31\.s}, {z28\.s - z31\.s}, {z0\.s - z3\.s} > +** ret > +*/ > +TEST_XN (amin_z28_z28_z0, svfloat32x4_t, z28, > + svamin_f32_x4 (z28, z0), > + svamin (z28, z0)) > + > +/* > +** amin_z0_z0_z18: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famin {z0\.s - z3\.s}, {z0\.s - z3\.s}, [^\n]+ > +** | > +** famin {z0\.s - z3\.s}, {z0\.s - z3\.s}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amin_z0_z0_z18, svfloat32x4_t, z0, > + svamin_f32_x4 (z0, z18), > + svamin (z0, z18)) > + > +/* > +** amin_z4_z4_z23: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famin {z4\.s - z7\.s}, {z4\.s - z7\.s}, [^\n]+ > +** | > +** famin {z4\.s - z7\.s}, {z4\.s - z7\.s}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amin_z4_z4_z23, svfloat32x4_t, z4, > + svamin_f32_x4 (z4, z23), > + svamin (z4, z23)) > diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f64_x2.c > b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f64_x2.c > new file mode 100644 > index 00000000000..3bbef3f27cd > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f64_x2.c > @@ -0,0 +1,96 @@ > +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ > + > +#include "test_sme2_acle.h" > +#pragma GCC target "+faminmax" > + > +/* > +** amin_z0_z0_z4: > +** famin {z0\.d - z1\.d}, {z0\.d - z1\.d}, {z4\.d - z5\.d} > +** ret > +*/ > +TEST_XN (amin_z0_z0_z4, svfloat64x2_t, z0, > + svamin_f64_x2 (z0, z4), > + svamin (z0, z4)) > + > +/* > +** amin_z0_z4_z0: > +** famin {z0\.d - z1\.d}, {z0\.d - z1\.d}, {z4\.d - z5\.d} > +** ret > +*/ > +TEST_XN (amin_z0_z4_z0, svfloat64x2_t, z0, > + svamin_f64_x2 (z4, z0), > + svamin (z4, z0)) > + > +/* > +** amin_z0_z4_z28: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** famin [^\n]+, {z28\.d - z29\.d} > +** | > +** famin [^\n]+, {z28\.d - z29\.d} > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amin_z0_z4_z28, svfloat64x2_t, z0, > + svamin_f64_x2 (z4, z28), > + svamin (z4, z28)) > + > +/* > +** amin_z18_z18_z4: > +** famin {z18\.d - z19\.d}, {z18\.d - z19\.d}, {z4\.d - z5\.d} > +** ret > +*/ > +TEST_XN (amin_z18_z18_z4, svfloat64x2_t, z18, > + svamin_f64_x2 (z18, z4), > + svamin (z18, z4)) > + > +/* > +** amin_z23_z23_z18: > +** mov [^\n]+ > +** mov [^\n]+ > +** famin [^\n]+, {z18\.d - z19\.d} > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amin_z23_z23_z18, svfloat64x2_t, z23, > + svamin_f64_x2 (z23, z18), > + svamin (z23, z18)) > + > +/* > +** amin_z28_z28_z0: > +** famin {z28\.d - z29\.d}, {z28\.d - z29\.d}, {z0\.d - z1\.d} > +** ret > +*/ > +TEST_XN (amin_z28_z28_z0, svfloat64x2_t, z28, > + svamin_f64_x2 (z28, z0), > + svamin (z28, z0)) > + > +/* > +** amin_z0_z0_z18: > +** famin {z0\.d - z1\.d}, {z0\.d - z1\.d}, {z18\.d - z19\.d} > +** ret > +*/ > +TEST_XN (amin_z0_z0_z18, svfloat64x2_t, z0, > + svamin_f64_x2 (z0, z18), > + svamin (z0, z18)) > + > +/* > +** amin_z4_z4_z23: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** famin {z4\.d - z5\.d}, {z4\.d - z5\.d}, [^\n]+ > +** | > +** famin {z4\.d - z5\.d}, {z4\.d - z5\.d}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amin_z4_z4_z23, svfloat64x2_t, z4, > + svamin_f64_x2 (z4, z23), > + svamin (z4, z23)) > diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f64_x4.c > b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f64_x4.c > new file mode 100644 > index 00000000000..6f4c9b7787a > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/amin_f64_x4.c > @@ -0,0 +1,128 @@ > +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ > + > +#include "test_sme2_acle.h" > +#pragma GCC target "+faminmax" > + > +/* > +** amin_z0_z0_z4: > +** famin {z0\.d - z3\.d}, {z0\.d - z3\.d}, {z4\.d - z7\.d} > +** ret > +*/ > +TEST_XN (amin_z0_z0_z4, svfloat64x4_t, z0, > + svamin_f64_x4 (z0, z4), > + svamin (z0, z4)) > + > +/* > +** amin_z0_z4_z0: > +** famin {z0\.d - z3\.d}, {z0\.d - z3\.d}, {z4\.d - z7\.d} > +** ret > +*/ > +TEST_XN (amin_z0_z4_z0, svfloat64x4_t, z0, > + svamin_f64_x4 (z4, z0), > + svamin (z4, z0)) > + > +/* > +** amin_z0_z4_z28: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famin [^\n]+, {z28\.d - z31\.d} > +** | > +** famin [^\n]+, {z28\.d - z31\.d} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amin_z0_z4_z28, svfloat64x4_t, z0, > + svamin_f64_x4 (z4, z28), > + svamin (z4, z28)) > + > +/* > +** amin_z18_z18_z4: > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famin [^\n]+, {z4\.d - z7\.d} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amin_z18_z18_z4, svfloat64x4_t, z18, > + svamin_f64_x4 (z18, z4), > + svamin (z18, z4)) > + > +/* > +** amin_z23_z23_z28: > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famin [^\n]+, {z28\.d - z31\.d} > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ret > +*/ > +TEST_XN (amin_z23_z23_z28, svfloat64x4_t, z23, > + svamin_f64_x4 (z23, z28), > + svamin (z23, z28)) > + > +/* > +** amin_z28_z28_z0: > +** famin {z28\.d - z31\.d}, {z28\.d - z31\.d}, {z0\.d - z3\.d} > +** ret > +*/ > +TEST_XN (amin_z28_z28_z0, svfloat64x4_t, z28, > + svamin_f64_x4 (z28, z0), > + svamin (z28, z0)) > + > +/* > +** amin_z0_z0_z18: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famin {z0\.d - z3\.d}, {z0\.d - z3\.d}, [^\n]+ > +** | > +** famin {z0\.d - z3\.d}, {z0\.d - z3\.d}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amin_z0_z0_z18, svfloat64x4_t, z0, > + svamin_f64_x4 (z0, z18), > + svamin (z0, z18)) > + > +/* > +** amin_z4_z4_z23: > +** ( > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** famin {z4\.d - z7\.d}, {z4\.d - z7\.d}, [^\n]+ > +** | > +** famin {z4\.d - z7\.d}, {z4\.d - z7\.d}, [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** mov [^\n]+ > +** ) > +** ret > +*/ > +TEST_XN (amin_z4_z4_z23, svfloat64x4_t, z4, > + svamin_f64_x4 (z4, z23), > + svamin (z4, z23)) > -- > 2.34.1 >