Hi Claudio, > On 25 Jul 2024, at 16:25, Claudio Bantaloukas <claudio.bantalou...@arm.com> > wrote: > > External email: Use caution opening links or attachments > > > The ACLE declares several helper types and functions to > facilitate construction of `fpm` arguments. > > gcc/ChangeLog: > > * config/aarch64/arm_acle.h (fpm_t): New type representing fpmr values. > (enum __ARM_FPM_FORMAT): New enum representing valid fp8 formats. > (enum __ARM_FPM_OVERFLOW): New enum representing how some fp8 > calculations work. > (arm_fpm_init): New. > (arm_set_fpm_src1_format): Likewise. > (arm_set_fpm_src2_format): Likewise. > (arm_set_fpm_dst_format): Likewise. > (arm_set_fpm_overflow_cvt): Likewise. > (arm_set_fpm_overflow_mul): Likewise. > (arm_set_fpm_lscale): Likewise. > (arm_set_fpm_lscale2): Likewise. > (arm_set_fpm_nscale): Likewise. >
Thanks for the updates, these ChangeLog entries should now be updated to reflect the names. One question I just asked on the ACLE PR for FP8, are these helpers supposed to be defined in arm_acle.h? I think it’s reasonable, but I didn’t see explicit wording for it in ACLE so I’d like to clarify. Thanks, Kyrill > gcc/testsuite/ChangeLog: > > * gcc.target/aarch64/acle/fp8-helpers.c: New test of fpmr helper > functions. > --- > gcc/config/aarch64/arm_acle.h | 33 ++++++++++++ > .../gcc.target/aarch64/acle/fp8-helpers.c | 52 +++++++++++++++++++ > 2 files changed, 85 insertions(+) > create mode 100644 gcc/testsuite/gcc.target/aarch64/acle/fp8-helpers.c > > diff --git a/gcc/config/aarch64/arm_acle.h b/gcc/config/aarch64/arm_acle.h > index 2aa681090fa..fd4fa855b90 100644 > --- a/gcc/config/aarch64/arm_acle.h > +++ b/gcc/config/aarch64/arm_acle.h > @@ -385,6 +385,39 @@ __rndrrs (uint64_t *__res) > > #pragma GCC pop_options > > +typedef uint64_t fpm_t; > + > +enum __ARM_FPM_FORMAT > +{ > + __ARM_FPM_E5M2, > + __ARM_FPM_E4M3, > +}; > + > +enum __ARM_FPM_OVERFLOW > +{ > + __ARM_FPM_INFNAN, > + __ARM_FPM_SATURATE, > +}; > + > +#define __arm_fpm_init() (0) > + > +#define __arm_set_fpm_src1_format(__fpm, __format) \ > + ((__fpm & ~(uint64_t)0x7) | (__format & (uint64_t)0x7)) > +#define __arm_set_fpm_src2_format(__fpm, __format) \ > + ((__fpm & ~((uint64_t)0x7 << 3)) | ((__format & (uint64_t)0x7) << 3)) > +#define __arm_set_fpm_dst_format(__fpm, __format) \ > + ((__fpm & ~((uint64_t)0x7 << 6)) | ((__format & (uint64_t)0x7) << 6)) > +#define __arm_set_fpm_overflow_cvt(__fpm, __behaviour) \ > + ((__fpm & ~((uint64_t)0x1 << 15)) | ((__behaviour & (uint64_t)0x1) << 15)) > +#define __arm_set_fpm_overflow_mul(__fpm, __behaviour) \ > + ((__fpm & ~((uint64_t)0x1 << 14)) | ((__behaviour & (uint64_t)0x1) << 14)) > +#define __arm_set_fpm_lscale(__fpm, __scale) \ > + ((__fpm & ~((uint64_t)0x7f << 16)) | ((__scale & (uint64_t)0x7f) << 16)) > +#define __arm_set_fpm_lscale2(__fpm, __scale) \ > + ((__fpm & ~((uint64_t)0x3f << 32)) | ((__scale & (uint64_t)0x3f) << 32)) > +#define __arm_set_fpm_nscale(__fpm, __scale) \ > + ((__fpm & ~((uint64_t)0xff << 24)) | ((__scale & (uint64_t)0xff) << 24)) > + > #ifdef __cplusplus > } > #endif > diff --git a/gcc/testsuite/gcc.target/aarch64/acle/fp8-helpers.c > b/gcc/testsuite/gcc.target/aarch64/acle/fp8-helpers.c > new file mode 100644 > index 00000000000..e235c3621d1 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/acle/fp8-helpers.c > @@ -0,0 +1,52 @@ > +/* Test the fp8 ACLE helper functions. */ > +/* { dg-do compile } */ > +/* { dg-options "-std=c90 -pedantic-errors -O1 -march=armv9.4-a+fp8" } */ > + > +#include <arm_acle.h> > + > +void > +test_prepare_fpmr_sysreg () > +{ > + > +#define _S_EQ(expr, expected) > \ > + _Static_assert (expr == expected, #expr " == " #expected) > + > + _S_EQ (__arm_fpm_init (), 0); > + > + /* Bits [2:0] */ > + _S_EQ (__arm_set_fpm_src1_format (__arm_fpm_init (), __ARM_FPM_E5M2), 0); > + _S_EQ (__arm_set_fpm_src1_format (__arm_fpm_init (), __ARM_FPM_E4M3), 0x1); > + > + /* Bits [5:3] */ > + _S_EQ (__arm_set_fpm_src2_format (__arm_fpm_init (), __ARM_FPM_E5M2), 0); > + _S_EQ (__arm_set_fpm_src2_format (__arm_fpm_init (), __ARM_FPM_E4M3), 0x8); > + > + /* Bits [8:6] */ > + _S_EQ (__arm_set_fpm_dst_format (__arm_fpm_init (), __ARM_FPM_E5M2), 0); > + _S_EQ (__arm_set_fpm_dst_format (__arm_fpm_init (), __ARM_FPM_E4M3), 0x40); > + > + /* Bit 14 */ > + _S_EQ (__arm_set_fpm_overflow_mul (__arm_fpm_init (), __ARM_FPM_INFNAN), > 0); > + _S_EQ (__arm_set_fpm_overflow_mul (__arm_fpm_init (), __ARM_FPM_SATURATE), > + 0x4000); > + > + /* Bit 15 */ > + _S_EQ (__arm_set_fpm_overflow_cvt (__arm_fpm_init (), __ARM_FPM_INFNAN), > 0); > + _S_EQ (__arm_set_fpm_overflow_cvt (__arm_fpm_init (), __ARM_FPM_SATURATE), > + 0x8000); > + > + /* Bits [22:16] */ > + _S_EQ (__arm_set_fpm_lscale (__arm_fpm_init (), 0), 0); > + _S_EQ (__arm_set_fpm_lscale (__arm_fpm_init (), 127), 0x7F0000); > + > + /* Bits [37:32] */ > + _S_EQ (__arm_set_fpm_lscale2 (__arm_fpm_init (), 0), 0); > + _S_EQ (__arm_set_fpm_lscale2 (__arm_fpm_init (), 63), 0x3F00000000); > + > + /* Bits [31:24] */ > + _S_EQ (__arm_set_fpm_nscale (__arm_fpm_init (), 0), 0); > + _S_EQ (__arm_set_fpm_nscale (__arm_fpm_init (), 127), 0x7F000000); > + _S_EQ (__arm_set_fpm_nscale (__arm_fpm_init (), -128), 0x80000000); > + > +#undef _S_EQ > +}