Hi, Gentle ping this: https://gcc.gnu.org/pipermail/gcc-patches/2022-June/597158.html Thanks.
On 1/8/2022 上午 10:03, HAO CHEN GUI wrote: > Hi, > Gentle ping this: > https://gcc.gnu.org/pipermail/gcc-patches/2022-June/597158.html > Thanks. > > > On 4/7/2022 下午 2:32, HAO CHEN GUI wrote: >> Hi, >> Gentle ping this: >> https://gcc.gnu.org/pipermail/gcc-patches/2022-June/597158.html >> Thanks. >> >> On 24/6/2022 上午 10:02, HAO CHEN GUI wrote: >>> Hi, >>> This patch implements optab f[min/max]_optab by xs[min/max]dp on rs6000. >>> Tests show that outputs of xs[min/max]dp are consistent with the standard >>> of C99 fmin/max. >>> >>> This patch also binds __builtin_vsx_xs[min/max]dp to fmin/max instead >>> of smin/max. So the builtins always generate xs[min/max]dp on all >>> platforms. >>> >>> Bootstrapped and tested on ppc64 Linux BE and LE with no regressions. >>> Is this okay for trunk? Any recommendations? Thanks a lot. >>> >>> ChangeLog >>> 2022-06-24 Haochen Gui <guih...@linux.ibm.com> >>> >>> gcc/ >>> PR target/103605 >>> * config/rs6000/rs6000.md (FMINMAX): New. >>> (minmax_op): New. >>> (f<minmax_op><mode>3): New pattern by UNSPEC_FMAX and UNSPEC_FMIN. >>> * config/rs6000/rs6000-builtins.def (__builtin_vsx_xsmaxdp): Set >>> pattern to fmaxdf3. >>> (__builtin_vsx_xsmindp): Set pattern to fmindf3. >>> >>> gcc/testsuite/ >>> PR target/103605 >>> * gcc.dg/powerpc/pr103605.c: New. >>> >>> >>> patch.diff >>> diff --git a/gcc/config/rs6000/rs6000-builtins.def >>> b/gcc/config/rs6000/rs6000-builtins.def >>> index f4a9f24bcc5..8b735493b40 100644 >>> --- a/gcc/config/rs6000/rs6000-builtins.def >>> +++ b/gcc/config/rs6000/rs6000-builtins.def >>> @@ -1613,10 +1613,10 @@ >>> XSCVSPDP vsx_xscvspdp {} >>> >>> const double __builtin_vsx_xsmaxdp (double, double); >>> - XSMAXDP smaxdf3 {} >>> + XSMAXDP fmaxdf3 {} >>> >>> const double __builtin_vsx_xsmindp (double, double); >>> - XSMINDP smindf3 {} >>> + XSMINDP fmindf3 {} >>> >>> const double __builtin_vsx_xsrdpi (double); >>> XSRDPI vsx_xsrdpi {} >>> diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md >>> index bf85baa5370..ae0dd98f0f9 100644 >>> --- a/gcc/config/rs6000/rs6000.md >>> +++ b/gcc/config/rs6000/rs6000.md >>> @@ -158,6 +158,8 @@ (define_c_enum "unspec" >>> UNSPEC_HASHCHK >>> UNSPEC_XXSPLTIDP_CONST >>> UNSPEC_XXSPLTIW_CONST >>> + UNSPEC_FMAX >>> + UNSPEC_FMIN >>> ]) >>> >>> ;; >>> @@ -5341,6 +5343,22 @@ (define_insn_and_split "*s<minmax><mode>3_fpr" >>> DONE; >>> }) >>> >>> + >>> +(define_int_iterator FMINMAX [UNSPEC_FMAX UNSPEC_FMIN]) >>> + >>> +(define_int_attr minmax_op [(UNSPEC_FMAX "max") >>> + (UNSPEC_FMIN "min")]) >>> + >>> +(define_insn "f<minmax_op><mode>3" >>> + [(set (match_operand:SFDF 0 "vsx_register_operand" "=wa") >>> + (unspec:SFDF [(match_operand:SFDF 1 "vsx_register_operand" "wa") >>> + (match_operand:SFDF 2 "vsx_register_operand" "wa")] >>> + FMINMAX))] >>> + "TARGET_VSX && !flag_finite_math_only" >>> + "xs<minmax_op>dp %x0,%x1,%x2" >>> + [(set_attr "type" "fp")] >>> +) >>> + >>> (define_expand "mov<mode>cc" >>> [(set (match_operand:GPR 0 "gpc_reg_operand") >>> (if_then_else:GPR (match_operand 1 "comparison_operator") >>> diff --git a/gcc/testsuite/gcc.target/powerpc/pr103605.c >>> b/gcc/testsuite/gcc.target/powerpc/pr103605.c >>> new file mode 100644 >>> index 00000000000..1c938d40e61 >>> --- /dev/null >>> +++ b/gcc/testsuite/gcc.target/powerpc/pr103605.c >>> @@ -0,0 +1,37 @@ >>> +/* { dg-do compile } */ >>> +/* { dg-require-effective-target powerpc_vsx_ok } */ >>> +/* { dg-options "-O2 -mvsx" } */ >>> +/* { dg-final { scan-assembler-times {\mxsmaxdp\M} 3 } } */ >>> +/* { dg-final { scan-assembler-times {\mxsmindp\M} 3 } } */ >>> + >>> +#include <math.h> >>> + >>> +double test1 (double d0, double d1) >>> +{ >>> + return fmin (d0, d1); >>> +} >>> + >>> +float test2 (float d0, float d1) >>> +{ >>> + return fmin (d0, d1); >>> +} >>> + >>> +double test3 (double d0, double d1) >>> +{ >>> + return fmax (d0, d1); >>> +} >>> + >>> +float test4 (float d0, float d1) >>> +{ >>> + return fmax (d0, d1); >>> +} >>> + >>> +double test5 (double d0, double d1) >>> +{ >>> + return __builtin_vsx_xsmindp (d0, d1); >>> +} >>> + >>> +double test6 (double d0, double d1) >>> +{ >>> + return __builtin_vsx_xsmaxdp (d0, d1); >>> +}