Skip to content
Snippets Groups Projects
Commit bfefed6c authored by Saurabh Jha's avatar Saurabh Jha
Browse files

aarch64: Add AdvSIMD faminmax intrinsics

The AArch64 FEAT_FAMINMAX extension is optional from Armv9.2-a and
mandatory from Armv9.5-a. It introduces instructions for computing the
floating point absolute maximum and minimum of the two vectors element-wise.

This patch introduces AdvSIMD faminmax intrinsics. The intrinsics of
this extension are implemented as the following builtin functions:
* vamax_f16
* vamaxq_f16
* vamax_f32
* vamaxq_f32
* vamaxq_f64
* vamin_f16
* vaminq_f16
* vamin_f32
* vaminq_f32
* vaminq_f64

We are defining a new way to add AArch64 AdvSIMD intrinsics by listing
all the intrinsics in a .def file and then using that .def file to
initialise various data structures. This would lead to more concise code
and easier addition of the new AdvSIMD intrinsics in future.

The faminmax intrinsics are defined using the new approach.

gcc/ChangeLog:

	* config/aarch64/aarch64-builtins.cc
	(ENTRY): Macro to parse the contents of
	aarch64-simd-pragma-builtins.def.
	(ENTRY_VHSDF): Macro to parse the contents of
	aarch64-simd-pragma-builtins.def.
	(enum aarch64_builtins): New enum values for faminmax builtins
	via aarch64-simd-pragma-builtins.def.
	(enum class aarch64_builtin_signatures): Enum class to specify
	the number of operands a builtin will take.
	(struct aarch64_pragma_builtins_data): Struct to hold data from
	aarch64-simd-pragma-builtins.def.
	(aarch64_fntype): New function to define function types of
	intrinsics given an object of type aarch64_pragma_builtins_data.
	(aarch64_init_pragma_builtins): New function to define pragma
	builtins.
	(aarch64_get_pragma_builtin): New function to get a row of
	aarch64_pragma_builtins, given code.
	(handle_arm_neon_h): Modify to call
	aarch64_init_pragma_builtins.
	(aarch64_general_check_builtin_call): Modify to check whether
	required flag is being used for pragma builtins.
	(aarch64_expand_pragma_builtin): New function to emit
	instructions of pragma_builtin.
	(aarch64_general_expand_builtin): Modify to call
	aarch64_expand_pragma_builtin.
	* config/aarch64/aarch64-option-extensions.def
	(AARCH64_OPT_EXTENSION): Introduce new flag for this extension.
	* config/aarch64/aarch64-simd.md
	(@aarch64_<faminmax_uns_op><mode>): Instruction pattern for
	faminmax intrinsics.
	* config/aarch64/aarch64.h
	(TARGET_FAMINMAX): Introduce new flag for this extension.
	* config/aarch64/iterators.md: New iterators and unspecs.
	* doc/invoke.texi: Document extension in AArch64 Options.
	* config/aarch64/aarch64-simd-pragma-builtins.def: New file to
	list pragma builtins.

gcc/testsuite/ChangeLog:

	* gcc.target/aarch64/simd/faminmax-builtins-no-flag.c: New test.
	* gcc.target/aarch64/simd/faminmax-builtins.c: New test.
parent 6141d0c9
No related branches found
No related tags found
No related merge requests found
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment