On Tue, 2019-02-26 at 10:17 +0000, Richard Sandiford wrote: > > I'm torn about about whether we should proactively add the ILP32 and > big-endian conditions now or wait until there's a specific need. > Unless anyone strongly objects, let's keep them for now. > > Thanks, > Richard
OK, here is a new patch with the ILP32 and big-endian conditions still in place but the sve stuff removed. Retested on aarch64 with no regressions. OK for checkin? Steve Ellcey sell...@marvell.com 2018-02-26 Steve Ellcey <sell...@marvell.com> * config/aarch64/aarch64.c (aarch64_get_multilib_abi_name): New function. (TARGET_GET_MULTILIB_ABI_NAME): New macro. 2018-02-26 Steve Ellcey <sell...@marvell.com> * gfortran.dg/simd-builtins-1.f90: Update for aarch64*-*-*. * gfortran.dg/simd-builtins-2.f90: Ditto. * gfortran.dg/simd-builtins-6.f90: Ditto. * gfortran.dg/simd-builtins-8.f90: New test. * gfortran.dg/simd-builtins-8.h: New header file.
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 91e79d3..b8125d5 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -18722,6 +18722,17 @@ aarch64_comp_type_attributes (const_tree type1, const_tree type2) return 1; } +/* Implement TARGET_GET_MULTILIB_ABI_NAME */ + +static const char * +aarch64_get_multilib_abi_name (void) +{ + if (TARGET_BIG_END) + return TARGET_ILP32 ? "aarch64_be_ilp32" : "aarch64_be"; + return TARGET_ILP32 ? "aarch64_ilp32" : "aarch64"; +} + + /* Implement TARGET_STACK_PROTECT_GUARD. In case of a global variable based guard use the default else return a null tree. */ @@ -19244,6 +19255,9 @@ aarch64_libgcc_floating_mode_supported_p #undef TARGET_COMP_TYPE_ATTRIBUTES #define TARGET_COMP_TYPE_ATTRIBUTES aarch64_comp_type_attributes +#undef TARGET_GET_MULTILIB_ABI_NAME +#define TARGET_GET_MULTILIB_ABI_NAME aarch64_get_multilib_abi_name + #if CHECKING_P #undef TARGET_RUN_TARGET_SELFTESTS #define TARGET_RUN_TARGET_SELFTESTS selftest::aarch64_run_selftests
diff --git a/gcc/testsuite/gfortran.dg/simd-builtins-1.f90 b/gcc/testsuite/gfortran.dg/simd-builtins-1.f90 index 6d79ef8..5cb3eb5 100644 --- a/gcc/testsuite/gfortran.dg/simd-builtins-1.f90 +++ b/gcc/testsuite/gfortran.dg/simd-builtins-1.f90 @@ -1,5 +1,6 @@ -! { dg-do compile { target { i?86-*-linux* x86_64-*-linux* } } } -! { dg-additional-options "-msse2 -mno-avx -nostdinc -Ofast -fpre-include=simd-builtins-1.h -fdump-tree-optimized" } +! { dg-do compile { target i?86-*-linux* x86_64-*-linux* aarch64*-*-linux* } } +! { dg-additional-options "-nostdinc -Ofast -fpre-include=simd-builtins-1.h -fdump-tree-optimized" } +! { dg-additional-options "-msse2 -mno-avx" { target i?86-*-linux* x86_64-*-linux* } } program test_overloaded_intrinsic real(4) :: x4(3200), y4(3200) @@ -14,6 +15,7 @@ program test_overloaded_intrinsic print *, y8 end -! { dg-final { scan-tree-dump "sinf.simdclone" "optimized" } } */ -! { dg-final { scan-tree-dump "__builtin_sin" "optimized" } } */ -! { dg-final { scan-assembler "call.*_ZGVbN4v_sinf" } } +! { dg-final { scan-tree-dump "sinf.simdclone" "optimized" } } +! { dg-final { scan-tree-dump "__builtin_sin" "optimized" } } +! { dg-final { scan-assembler "call.*_ZGVbN4v_sinf" { target i?86-*-linux* x86_64-*-* } } } +! { dg-final { scan-assembler "bl.*_ZGVnN4v_sinf" { target aarch64*-*-* } } } diff --git a/gcc/testsuite/gfortran.dg/simd-builtins-2.f90 b/gcc/testsuite/gfortran.dg/simd-builtins-2.f90 index f0e6bc1..2e5bc22 100644 --- a/gcc/testsuite/gfortran.dg/simd-builtins-2.f90 +++ b/gcc/testsuite/gfortran.dg/simd-builtins-2.f90 @@ -1,11 +1,12 @@ -! { dg-do compile { target { i?86-*-linux* x86_64-*-linux* } } } -! { dg-additional-options "-msse2 -nostdinc -Ofast -fdump-tree-optimized" } +! { dg-do compile { target { i?86-*-linux* x86_64-*-linux* aarch64*-*-linux* } } } +! { dg-additional-options "-nostdinc -Ofast -fdump-tree-optimized" } +! { dg-additional-options "-msse2" { target i?86-*-linux* x86_64-*-linux* } } program test_overloaded_intrinsic real(4) :: x4(3200), y4(3200) real(8) :: x8(3200), y8(3200) - ! this should be using simd clone + ! this should not be using simd clone y4 = sin(x4) print *, y4 @@ -18,3 +19,4 @@ end ! { dg-final { scan-tree-dump "__builtin_sin" "optimized" } } */ ! { dg-final { scan-tree-dump-not "simdclone" "optimized" } } */ ! { dg-final { scan-assembler-not "call.*_ZGVbN4v_sinf" } } +! { dg-final { scan-assembler-not "bl.*_ZGVnN4v_sinf" } } diff --git a/gcc/testsuite/gfortran.dg/simd-builtins-6.f90 b/gcc/testsuite/gfortran.dg/simd-builtins-6.f90 index 2ffa807..60bcac7 100644 --- a/gcc/testsuite/gfortran.dg/simd-builtins-6.f90 +++ b/gcc/testsuite/gfortran.dg/simd-builtins-6.f90 @@ -1,5 +1,6 @@ -! { dg-do compile { target { i?86-*-linux* x86_64-*-linux* } } } -! { dg-additional-options "-msse2 -mno-avx -nostdinc -Ofast -fdump-tree-optimized" } +! { dg-do compile { target { i?86-*-linux* x86_64-*-linux* aarch64*-*-linux* } } } +! { dg-additional-options "-nostdinc -Ofast -fdump-tree-optimized" } +! { dg-additional-options "-msse2 -mno-avx" { target i?86-*-linux* x86_64-*-linux* } } !GCC$ builtin (sin) attributes simd (inbranch) !GCC$ builtin (sinf) attributes simd (notinbranch) @@ -21,4 +22,5 @@ end ! { dg-final { scan-tree-dump "sinf.simdclone" "optimized" } } */ ! { dg-final { scan-tree-dump "__builtin_sin" "optimized" } } */ -! { dg-final { scan-assembler "call.*_ZGVbN4v_sinf" } } +! { dg-final { scan-assembler "call.*_ZGVbN4v_sinf" { target i?86-*-linux* x86_64-*-* } } } +! { dg-final { scan-assembler "bl.*_ZGVnN4v_sinf" { target aarch64*-*-* } } } diff --git a/gcc/testsuite/gfortran.dg/simd-builtins-8.f90 b/gcc/testsuite/gfortran.dg/simd-builtins-8.f90 index e69de29..0237235 100644 --- a/gcc/testsuite/gfortran.dg/simd-builtins-8.f90 +++ b/gcc/testsuite/gfortran.dg/simd-builtins-8.f90 @@ -0,0 +1,19 @@ +! { dg-do compile { target { aarch64*-*-linux* } } } +! { dg-additional-options "-nostdinc -Ofast -fpre-include=simd-builtins-8.h -fdump-tree-optimized" } + +program test_overloaded_intrinsic + real(4) :: x4(3200), y4(3200) + real(8) :: x8(3200), y8(3200) + + y4 = sin(x4) + print *, y4 + + y4 = sin(x8) + print *, y8 +end + +! { dg-final { scan-tree-dump "sinf.simdclone" "optimized" { target ilp32 } } } */ +! { dg-final { scan-tree-dump-not "sin.simdclone" "optimized" { target ilp32 } } } */ + +! { dg-final { scan-tree-dump "sin.simdclone" "optimized" { target lp64 } } } */ +! { dg-final { scan-tree-dump-not "sinf.simdclone" "optimized" { target lp64 } } } */ diff --git a/gcc/testsuite/gfortran.dg/simd-builtins-8.h b/gcc/testsuite/gfortran.dg/simd-builtins-8.h index e69de29..2eade39 100644 --- a/gcc/testsuite/gfortran.dg/simd-builtins-8.h +++ b/gcc/testsuite/gfortran.dg/simd-builtins-8.h @@ -0,0 +1,4 @@ +!GCC$ builtin (sin) attributes simd (notinbranch) if('aarch64') +!GCC$ builtin (sin) attributes simd (notinbranch) if('aarch64_be') +!GCC$ builtin (sinf) attributes simd (notinbranch) if('aarch64_ilp32') +!GCC$ builtin (sinf) attributes simd (notinbranch) if('aarch64_be_ilp32')