summaryrefslogtreecommitdiff
path: root/0020-simdmath-Enable-simdmath-on-kunpeng.patch
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2025-02-28 10:03:49 +0000
committerCoprDistGit <infra@openeuler.org>2025-02-28 10:03:49 +0000
commit73127104a245052cd5cf29cdaaca3e5c32c70348 (patch)
tree8e28b63e478c43c252f18b49836dff7313affe54 /0020-simdmath-Enable-simdmath-on-kunpeng.patch
parent49d3feaf4665cdb07576fc1a2382a4d82a612d35 (diff)
automatic import of gccopeneuler24.03_LTS_SP1
Diffstat (limited to '0020-simdmath-Enable-simdmath-on-kunpeng.patch')
-rw-r--r--0020-simdmath-Enable-simdmath-on-kunpeng.patch317
1 files changed, 317 insertions, 0 deletions
diff --git a/0020-simdmath-Enable-simdmath-on-kunpeng.patch b/0020-simdmath-Enable-simdmath-on-kunpeng.patch
new file mode 100644
index 0000000..f6b7a48
--- /dev/null
+++ b/0020-simdmath-Enable-simdmath-on-kunpeng.patch
@@ -0,0 +1,317 @@
+From 49ad10199dbdda2c36850a2617f5c985977939c5 Mon Sep 17 00:00:00 2001
+From: bule <bule1@huawei.com>
+Date: Sun, 27 Aug 2023 16:49:42 +0800
+Subject: [PATCH 20/22] [simdmath] Enable simdmath on kunpeng
+
+This enable simd math function supported by libmathlib on fortran/c/c++.
+Use -fsimdmath to turn on the generation of simdmath function. The
+supported functions can be found in simdmath.h. Add more simd declaration
+if you need more kinds of math functions. -msimdmath-64 is used to turn
+on 64-bit simd math functions which is not supported by libmathlib.
+Therefore, this option is default to off.
+---
+ gcc/c-family/c-opts.cc | 4 ++
+ gcc/common.opt | 4 ++
+ gcc/config/aarch64/aarch64.cc | 9 ++++-
+ gcc/config/aarch64/aarch64.opt | 6 +++
+ gcc/fortran/scanner.cc | 3 ++
+ gcc/opts.cc | 17 ++++++++
+ .../gcc.target/aarch64/simd_pcs_attribute-3.c | 2 +-
+ libgomp/Makefile.am | 4 +-
+ libgomp/Makefile.in | 10 +++--
+ libgomp/configure | 4 +-
+ libgomp/configure.ac | 2 +-
+ libgomp/simdmath.h.in | 40 +++++++++++++++++++
+ libgomp/simdmath_f.h.in | 11 +++++
+ 13 files changed, 106 insertions(+), 10 deletions(-)
+ create mode 100644 libgomp/simdmath.h.in
+ create mode 100644 libgomp/simdmath_f.h.in
+
+diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc
+index a341a0617..5134f6128 100644
+--- a/gcc/c-family/c-opts.cc
++++ b/gcc/c-family/c-opts.cc
+@@ -801,6 +801,10 @@ c_common_post_options (const char **pfilename)
+ if (cpp_opts->deps.style == DEPS_NONE)
+ check_deps_environment_vars ();
+
++ if (flag_simdmath)
++ {
++ defer_opt (OPT_include, "simdmath.h");
++ }
+ handle_deferred_opts ();
+
+ sanitize_cpp_opts ();
+diff --git a/gcc/common.opt b/gcc/common.opt
+index f5eef8a45..e9d580957 100644
+--- a/gcc/common.opt
++++ b/gcc/common.opt
+@@ -2125,6 +2125,10 @@ fmath-errno
+ Common Var(flag_errno_math) Init(1) Optimization SetByCombined
+ Set errno after built-in math functions.
+
++fsimdmath
++Common Var(flag_simdmath) Init(0) Optimization
++Enable auto-vectorize math functions for mathlib. This option will turn on -fno-math-errno and -fopenmp-simd.
++
+ fmax-errors=
+ Common Joined RejectNegative UInteger Var(flag_max_errors)
+ -fmax-errors=<number> Maximum number of errors to report.
+diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
+index 226dc9dff..a3da4ca30 100644
+--- a/gcc/config/aarch64/aarch64.cc
++++ b/gcc/config/aarch64/aarch64.cc
+@@ -26904,8 +26904,13 @@ aarch64_simd_clone_compute_vecsize_and_simdlen (struct cgraph_node *node,
+ elt_bits = GET_MODE_BITSIZE (SCALAR_TYPE_MODE (base_type));
+ if (known_eq (clonei->simdlen, 0U))
+ {
+- count = 2;
+- vec_bits = (num == 0 ? 64 : 128);
++ /* Currently mathlib or sleef hasn't provide function for V2SF mode
++ simdclone of single precision functions. (e.g._ZCVnN2v_expf)
++ Therefore this mode is disabled by default to avoid link error.
++ Use -msimdmath-64 option to enable this mode. */
++ count = flag_simdmath_64 ? 2 : 1;
++ vec_bits = ((num == 0 && flag_simdmath_64) ? 64 : 128);
++
+ clonei->simdlen = exact_div (vec_bits, elt_bits);
+ }
+ else
+diff --git a/gcc/config/aarch64/aarch64.opt b/gcc/config/aarch64/aarch64.opt
+index 92220b26e..a64b927e9 100644
+--- a/gcc/config/aarch64/aarch64.opt
++++ b/gcc/config/aarch64/aarch64.opt
+@@ -190,6 +190,12 @@ precision of square root results to about 16 bits for
+ single precision and to 32 bits for double precision.
+ If enabled, it implies -mlow-precision-recip-sqrt.
+
++msimdmath-64
++Target Var(flag_simdmath_64) Optimization
++Allow compiler to generate V2SF 64 bits simdclone of math functions,
++which is not currently supported in mathlib or sleef.
++Therefore this option is disabled by default.
++
+ mlow-precision-div
+ Target Var(flag_mlow_precision_div) Optimization
+ Enable the division approximation. Enabling this reduces
+diff --git a/gcc/fortran/scanner.cc b/gcc/fortran/scanner.cc
+index 2dff25147..63e262f51 100644
+--- a/gcc/fortran/scanner.cc
++++ b/gcc/fortran/scanner.cc
+@@ -2769,6 +2769,9 @@ gfc_new_file (void)
+ if (flag_pre_include != NULL)
+ load_file (flag_pre_include, NULL, false);
+
++ if (flag_simdmath)
++ load_file ("simdmath_f.h", NULL, false);
++
+ if (gfc_cpp_enabled ())
+ {
+ gfc_cpp_preprocess (gfc_source_file);
+diff --git a/gcc/opts.cc b/gcc/opts.cc
+index b522ed7e2..c3cc2c169 100644
+--- a/gcc/opts.cc
++++ b/gcc/opts.cc
+@@ -322,6 +322,7 @@ static const char undocumented_msg[] = N_("This option lacks documentation.");
+ static const char use_diagnosed_msg[] = N_("Uses of this option are diagnosed.");
+
+ typedef char *char_p; /* For DEF_VEC_P. */
++static void set_simdmath_flags (struct gcc_options *opts, int set);
+
+ static void set_debug_level (uint32_t dinfo, int extended,
+ const char *arg, struct gcc_options *opts,
+@@ -2850,6 +2851,10 @@ common_handle_option (struct gcc_options *opts,
+ dc->min_margin_width = value;
+ break;
+
++ case OPT_fsimdmath:
++ set_simdmath_flags (opts, value);
++ break;
++
+ case OPT_fdump_:
+ /* Deferred. */
+ break;
+@@ -3227,6 +3232,18 @@ common_handle_option (struct gcc_options *opts,
+ return true;
+ }
+
++/* The following routines are used to set -fno-math-errno and -fopenmp-simd
++ to enable vector mathlib. */
++static void
++set_simdmath_flags (struct gcc_options *opts, int set)
++{
++ if (set)
++ {
++ opts->x_flag_errno_math = 0;
++ opts->x_flag_openmp_simd = 1;
++ }
++}
++
+ /* Used to set the level of strict aliasing warnings in OPTS,
+ when no level is specified (i.e., when -Wstrict-aliasing, and not
+ -Wstrict-aliasing=level was given).
+diff --git a/gcc/testsuite/gcc.target/aarch64/simd_pcs_attribute-3.c b/gcc/testsuite/gcc.target/aarch64/simd_pcs_attribute-3.c
+index 95f6a6803..e0e0efa9d 100644
+--- a/gcc/testsuite/gcc.target/aarch64/simd_pcs_attribute-3.c
++++ b/gcc/testsuite/gcc.target/aarch64/simd_pcs_attribute-3.c
+@@ -1,5 +1,5 @@
+ /* { dg-do compile } */
+-/* { dg-options "-Ofast" } */
++/* { dg-options "-Ofast -msimdmath-64" } */
+
+ __attribute__ ((__simd__))
+ __attribute__ ((__nothrow__ , __leaf__ , __const__))
+diff --git a/libgomp/Makefile.am b/libgomp/Makefile.am
+index f8b2a06d6..8dfa160d6 100644
+--- a/libgomp/Makefile.am
++++ b/libgomp/Makefile.am
+@@ -75,10 +75,10 @@ libgomp_la_SOURCES += openacc.f90
+ endif
+
+ nodist_noinst_HEADERS = libgomp_f.h
+-nodist_libsubinclude_HEADERS = omp.h openacc.h acc_prof.h
++nodist_libsubinclude_HEADERS = omp.h openacc.h acc_prof.h simdmath.h
+ if USE_FORTRAN
+ nodist_finclude_HEADERS = omp_lib.h omp_lib.f90 omp_lib.mod omp_lib_kinds.mod \
+- openacc_lib.h openacc.f90 openacc.mod openacc_kinds.mod
++ openacc_lib.h openacc.f90 openacc.mod openacc_kinds.mod simdmath_f.h
+ endif
+
+ LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS))
+diff --git a/libgomp/Makefile.in b/libgomp/Makefile.in
+index 6f0cb7161..90fc326f0 100644
+--- a/libgomp/Makefile.in
++++ b/libgomp/Makefile.in
+@@ -147,7 +147,7 @@ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+ mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
+ CONFIG_HEADER = config.h
+-CONFIG_CLEAN_FILES = omp.h omp_lib.h omp_lib.f90 libgomp_f.h \
++CONFIG_CLEAN_FILES = omp.h omp_lib.h simdmath.h simdmath_f.h omp_lib.f90 libgomp_f.h \
+ libgomp.spec
+ CONFIG_CLEAN_VPATH_FILES =
+ am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+@@ -583,9 +583,9 @@ libgomp_la_SOURCES = alloc.c atomic.c barrier.c critical.c env.c \
+ @PLUGIN_GCN_TRUE@libgomp_plugin_gcn_la_LIBADD = libgomp.la $(PLUGIN_GCN_LIBS)
+ @PLUGIN_GCN_TRUE@libgomp_plugin_gcn_la_LIBTOOLFLAGS = --tag=disable-static
+ nodist_noinst_HEADERS = libgomp_f.h
+-nodist_libsubinclude_HEADERS = omp.h openacc.h acc_prof.h
++nodist_libsubinclude_HEADERS = omp.h openacc.h acc_prof.h simdmath.h
+ @USE_FORTRAN_TRUE@nodist_finclude_HEADERS = omp_lib.h omp_lib.f90 omp_lib.mod omp_lib_kinds.mod \
+-@USE_FORTRAN_TRUE@ openacc_lib.h openacc.f90 openacc.mod openacc_kinds.mod
++@USE_FORTRAN_TRUE@ openacc_lib.h openacc.f90 openacc.mod openacc_kinds.mod simdmath_f.h
+
+ LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS))
+ LINK = $(LIBTOOL) --tag CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+@@ -676,6 +676,10 @@ omp.h: $(top_builddir)/config.status $(srcdir)/omp.h.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+ omp_lib.h: $(top_builddir)/config.status $(srcdir)/omp_lib.h.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
++simdmath_f.h: $(top_builddir)/config.status $(srcdir)/simdmath_f.h.in
++ cd $(top_builddir) && $(SHELL) ./config.status $@
++simdmath.h: $(top_builddir)/config.status $(srcdir)/simdmath.h.in
++ cd $(top_builddir) && $(SHELL) ./config.status $@
+ omp_lib.f90: $(top_builddir)/config.status $(srcdir)/omp_lib.f90.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+ libgomp_f.h: $(top_builddir)/config.status $(srcdir)/libgomp_f.h.in
+diff --git a/libgomp/configure b/libgomp/configure
+index 85fdb4d3f..471c957b7 100755
+--- a/libgomp/configure
++++ b/libgomp/configure
+@@ -17064,7 +17064,7 @@ fi
+
+
+
+-ac_config_files="$ac_config_files omp.h omp_lib.h omp_lib.f90 libgomp_f.h"
++ac_config_files="$ac_config_files omp.h omp_lib.h simdmath.h simdmath_f.h omp_lib.f90 libgomp_f.h"
+
+ ac_config_files="$ac_config_files Makefile testsuite/Makefile libgomp.spec"
+
+@@ -18215,6 +18215,8 @@ do
+ "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+ "omp.h") CONFIG_FILES="$CONFIG_FILES omp.h" ;;
+ "omp_lib.h") CONFIG_FILES="$CONFIG_FILES omp_lib.h" ;;
++ "simdmath.h") CONFIG_FILES="$CONFIG_FILES simdmath.h" ;;
++ "simdmath_f.h") CONFIG_FILES="$CONFIG_FILES simdmath_f.h" ;;
+ "omp_lib.f90") CONFIG_FILES="$CONFIG_FILES omp_lib.f90" ;;
+ "libgomp_f.h") CONFIG_FILES="$CONFIG_FILES libgomp_f.h" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+diff --git a/libgomp/configure.ac b/libgomp/configure.ac
+index a9b1f3973..1f81a0d30 100644
+--- a/libgomp/configure.ac
++++ b/libgomp/configure.ac
+@@ -472,7 +472,7 @@ CFLAGS="$save_CFLAGS"
+ # Determine what GCC version number to use in filesystem paths.
+ GCC_BASE_VER
+
+-AC_CONFIG_FILES(omp.h omp_lib.h omp_lib.f90 libgomp_f.h)
++AC_CONFIG_FILES(omp.h omp_lib.h simdmath.h simdmath_f.h omp_lib.f90 libgomp_f.h)
+ AC_CONFIG_FILES(Makefile testsuite/Makefile libgomp.spec)
+ AC_CONFIG_FILES([testsuite/libgomp-test-support.pt.exp:testsuite/libgomp-test-support.exp.in])
+ AC_CONFIG_FILES([testsuite/libgomp-site-extra.exp])
+diff --git a/libgomp/simdmath.h.in b/libgomp/simdmath.h.in
+new file mode 100644
+index 000000000..ab91a4ec3
+--- /dev/null
++++ b/libgomp/simdmath.h.in
+@@ -0,0 +1,40 @@
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#pragma omp declare simd simdlen(2) notinbranch
++double cos (double x);
++
++#pragma omp declare simd simdlen(4) notinbranch
++float cosf (float x);
++
++#pragma omp declare simd simdlen(2) notinbranch
++double sin (double x);
++
++#pragma omp declare simd simdlen(4) notinbranch
++float sinf (float x);
++
++#pragma omp declare simd simdlen(2) notinbranch
++double exp (double x);
++
++#pragma omp declare simd simdlen(4) notinbranch
++float expf (float x);
++
++#pragma omp declare simd simdlen(2) notinbranch
++double log (double x);
++
++#pragma omp declare simd simdlen(4) notinbranch
++float logf (float x);
++
++#pragma omp declare simd simdlen(2) notinbranch
++double pow (double x, double y);
++
++#pragma omp declare simd simdlen(4) notinbranch
++float powf (float x, float y);
++
++#pragma omp declare simd simdlen(4) notinbranch
++float exp2f (float x);
++
++#ifdef __cplusplus
++} // extern "C"
++#endif
+diff --git a/libgomp/simdmath_f.h.in b/libgomp/simdmath_f.h.in
+new file mode 100644
+index 000000000..550595015
+--- /dev/null
++++ b/libgomp/simdmath_f.h.in
+@@ -0,0 +1,11 @@
++!GCC$ builtin (cos) attributes simd (notinbranch)
++!GCC$ builtin (cosf) attributes simd (notinbranch)
++!GCC$ builtin (sin) attributes simd (notinbranch)
++!GCC$ builtin (sinf) attributes simd (notinbranch)
++!GCC$ builtin (exp) attributes simd (notinbranch)
++!GCC$ builtin (expf) attributes simd (notinbranch)
++!GCC$ builtin (exp2f) attributes simd (notinbranch)
++!GCC$ builtin (log) attributes simd (notinbranch)
++!GCC$ builtin (logf) attributes simd (notinbranch)
++!GCC$ builtin (pow) attributes simd (notinbranch)
++!GCC$ builtin (powf) attributes simd (notinbranch)
+--
+2.33.0
+