[AArch64] Handle HFAs of float16 types properly
commit1b62ed4f2638c59f30ff9480789b4cdeb740ddbe
authorJames Greenhalgh <james.greenhalgh@arm.com>
Fri, 5 Aug 2016 16:08:24 +0000 (5 16:08 +0000)
committerJames Greenhalgh <jgreenhalgh@gcc.gnu.org>
Fri, 5 Aug 2016 16:08:24 +0000 (5 16:08 +0000)
tree2c24bacdc5d05c67a303b1d38c65b5b037488e77
parenta0b1bf2181019d813855fe3eb832a6c907b45d5c
[AArch64] Handle HFAs of float16 types properly

Fix PR Target/72819.

gcc/

PR Target/72819
* config/aarch64/aarch64.h (aarch64_fp16_type_node): Declare.
(aarch64_fp16_ptr_type_node): Likewise.
* config/aarch64/aarch64-simd-builtins.c
(aarch64_fp16_ptr_type_node): Define.
(aarch64_init_fp16_types): New, refactored out of...
(aarch64_init_builtins): ...here, update to call
aarch64_init_fp16_types.
* config/aarch64/aarch64.c (aarch64_gimplify_va_arg_expr): Handle
HFmode.
(aapcs_vfp_sub_candidate): Likewise.

gcc/testsuite/

PR Target/72819
* gcc.target/aarch64/aapcs64/abitest-common.h: Define half-precision
registers.
* gcc.target/aarch64/aapcs64/abitest.S (dumpregs): Add assembly for
saving the half-precision registers.
* gcc.target/aarch64/aapcs64/func-ret-1.c: Test that an __fp16
value is returned in h0.
* gcc.target/aarch64/aapcs64/test_2.c: Check that __FP16 arguments
are passed in FP/SIMD registers.
* gcc.target/aarch64/aapcs64/test_27.c: New, test that __fp16 HFA
passing works corrcetly.
* gcc.target/aarch64/aapcs64/type-def.h (hfa_f16x1_t): New.
(hfa_f16x2_t): Likewise.
(hfa_f16x3_t): Likewise.
* gcc.target/aarch64/aapcs64/va_arg-1.c: Check that __fp16 values
are promoted to double and passed in a double register.
* gcc.target/aarch64/aapcs64/va_arg-2.c: Check that __fp16 values
are promoted to double and stacked.
* gcc.target/aarch64/aapcs64/va_arg-4.c: Check stacking of HFA of
__fp16 data types.
* gcc.target/aarch64/aapcs64/va_arg-5.c: Likewise.
* gcc.target/aarch64/aapcs64/va_arg-16.c: New, check HFAs of
__fp16 first get passed in FP/SIMD registers, then stacked.

From-SVN: r239173
16 files changed:
gcc/ChangeLog
gcc/config/aarch64/aarch64-builtins.c
gcc/config/aarch64/aarch64.c
gcc/config/aarch64/aarch64.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/aapcs64/abitest-common.h
gcc/testsuite/gcc.target/aarch64/aapcs64/abitest.S
gcc/testsuite/gcc.target/aarch64/aapcs64/func-ret-1.c
gcc/testsuite/gcc.target/aarch64/aapcs64/test_2.c
gcc/testsuite/gcc.target/aarch64/aapcs64/test_27.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/aapcs64/type-def.h
gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-1.c
gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-2.c
gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-4.c
gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-5.c