diff options
author | Joe Ramsay <Joe.Ramsay@arm.com> | 2023-04-12 14:37:49 +0100 |
---|---|---|
committer | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2023-05-03 12:09:49 +0100 |
commit | cd94326a1326c4e3f1ee7a8d0a161cc0bdcaf07e (patch) | |
tree | ac23e68944f7b02293b052910aaa45604d5761c0 /sysdeps/aarch64/fpu/Makefile | |
parent | cd87e368439ce97d2a2c95894e1851f4c0ff4443 (diff) | |
download | glibc-cd94326a1326c4e3f1ee7a8d0a161cc0bdcaf07e.tar.gz glibc-cd94326a1326c4e3f1ee7a8d0a161cc0bdcaf07e.tar.xz glibc-cd94326a1326c4e3f1ee7a8d0a161cc0bdcaf07e.zip |
Enable libmvec support for AArch64
This patch enables libmvec on AArch64. The proposed change is mainly implementing build infrastructure to add the new routines to ABI, tests and benchmarks. I have demonstrated how this all fits together by adding implementations for vector cos, in both single and double precision, targeting both Advanced SIMD and SVE. The implementations of the routines themselves are just loops over the scalar routine from libm for now, as we are more concerned with getting the plumbing right at this point. We plan to contribute vector routines from the Arm Optimized Routines repo that are compliant with requirements described in the libmvec wiki. Building libmvec requires minimum GCC 10 for SVE ACLE. To avoid raising the minimum GCC by such a big jump, we allow users to disable libmvec if their compiler is too old. Note that at this point users have to manually call the vector math functions. This seems to be acceptable to some downstream users. Reviewed-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
Diffstat (limited to 'sysdeps/aarch64/fpu/Makefile')
-rw-r--r-- | sysdeps/aarch64/fpu/Makefile | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/sysdeps/aarch64/fpu/Makefile b/sysdeps/aarch64/fpu/Makefile new file mode 100644 index 0000000000..850cfb9012 --- /dev/null +++ b/sysdeps/aarch64/fpu/Makefile @@ -0,0 +1,61 @@ +float-advsimd-funcs = cos + +double-advsimd-funcs = cos + +float-sve-funcs = cos + +double-sve-funcs = cos + +ifeq ($(subdir),mathvec) +libmvec-support = $(addsuffix f_advsimd,$(float-advsimd-funcs)) \ + $(addsuffix _advsimd,$(double-advsimd-funcs)) \ + $(addsuffix f_sve,$(float-sve-funcs)) \ + $(addsuffix _sve,$(double-sve-funcs)) +endif + +sve-cflags = -march=armv8-a+sve + + +ifeq ($(build-mathvec),yes) +bench-libmvec = $(addprefix float-advsimd-,$(float-advsimd-funcs)) \ + $(addprefix double-advsimd-,$(double-advsimd-funcs)) \ + $(addprefix float-sve-,$(float-sve-funcs)) \ + $(addprefix double-sve-,$(double-sve-funcs)) +endif + +$(objpfx)bench-float-advsimd-%.c: + $(PYTHON) $(..)sysdeps/aarch64/fpu/scripts/bench_libmvec_advsimd.py $(basename $(@F)) > $@ +$(objpfx)bench-double-advsimd-%.c: + $(PYTHON) $(..)sysdeps/aarch64/fpu/scripts/bench_libmvec_advsimd.py $(basename $(@F)) > $@ +$(objpfx)bench-float-sve-%.c: + $(PYTHON) $(..)sysdeps/aarch64/fpu/scripts/bench_libmvec_sve.py $(basename $(@F)) > $@ +$(objpfx)bench-double-sve-%.c: + $(PYTHON) $(..)sysdeps/aarch64/fpu/scripts/bench_libmvec_sve.py $(basename $(@F)) > $@ + +ifeq (${STATIC-BENCHTESTS},yes) +libmvec-benchtests = $(common-objpfx)mathvec/libmvec.a $(common-objpfx)math/libm.a +else +libmvec-benchtests = $(libmvec) $(libm) +endif + +$(addprefix $(objpfx)bench-,$(bench-libmvec)): $(libmvec-benchtests) + +ifeq ($(build-mathvec),yes) +libmvec-tests += float-advsimd double-advsimd float-sve double-sve +endif + +define sve-float-cflags-template +CFLAGS-$(1)f_sve.c += $(sve-cflags) +CFLAGS-bench-float-sve-$(1).c += $(sve-cflags) +endef + +define sve-double-cflags-template +CFLAGS-$(1)_sve.c += $(sve-cflags) +CFLAGS-bench-double-sve-$(1).c += $(sve-cflags) +endef + +$(foreach f,$(float-sve-funcs), $(eval $(call sve-float-cflags-template,$(f)))) +$(foreach f,$(double-sve-funcs), $(eval $(call sve-double-cflags-template,$(f)))) + +CFLAGS-test-float-sve-wrappers.c = $(sve-cflags) +CFLAGS-test-double-sve-wrappers.c = $(sve-cflags) |