Bootstrapped and regtested on s390x with and without a patched gas. Ok for master?
gcc/ChangeLog: * config.in: Regenerate. * config/s390/s390.c (print_operand): Emit vector alignment hints for target z13, if AS accepts them. For other targets the logic stays the same. * config/s390/s390.h (TARGET_VECTOR_LOADSTORE_ALIGNMENT_HINTS): Define macro. * configure: Regenerate. * configure.ac: Check HAVE_AS_VECTOR_LOADSTORE_ALIGNMENT_HINTS_ON_Z13. gcc/testsuite/ChangeLog: * gcc.target/s390/vector/align-1.c: Change target architecture to z13. * gcc.target/s390/vector/align-2.c: Change target architecture to z13. (cherry picked from commit 929fd91ba975eebf9e57f7f092041271dcaf0c34) (squashed with commit 87cb9423add08743d8bb3368f0af61ddc9572837) --- gcc/config.in | 7 +++++ gcc/config/s390/s390.c | 4 +-- gcc/config/s390/s390.h | 7 +++++ gcc/configure | 31 +++++++++++++++++++ gcc/configure.ac | 5 +++ .../gcc.target/s390/vector/align-1.c | 2 +- .../gcc.target/s390/vector/align-2.c | 2 +- 7 files changed, 53 insertions(+), 5 deletions(-) diff --git a/gcc/config.in b/gcc/config.in index a718ceaf3da..bfef2340339 100644 --- a/gcc/config.in +++ b/gcc/config.in @@ -676,6 +676,13 @@ #endif +/* Define if your assembler supports vl/vst/vlm/vstm with an optional + alignment hint argument on z13. */ +#ifndef USED_FOR_TARGET +#undef HAVE_AS_VECTOR_LOADSTORE_ALIGNMENT_HINTS_ON_Z13 +#endif + + /* Define if your assembler supports VSX instructions. */ #ifndef USED_FOR_TARGET #undef HAVE_AS_VSX diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index db3f94978ec..fb0ef44c196 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -7766,15 +7766,13 @@ print_operand (FILE *file, rtx x, int code) switch (code) { case 'A': -#ifdef HAVE_AS_VECTOR_LOADSTORE_ALIGNMENT_HINTS - if (TARGET_Z14 && MEM_P (x)) + if (TARGET_VECTOR_LOADSTORE_ALIGNMENT_HINTS && MEM_P (x)) { if (MEM_ALIGN (x) >= 128) fprintf (file, ",4"); else if (MEM_ALIGN (x) == 64) fprintf (file, ",3"); } -#endif return; case 'C': fprintf (file, s390_branch_condition_mnemonic (x, FALSE)); diff --git a/gcc/config/s390/s390.h b/gcc/config/s390/s390.h index f7023d985f1..bd5316ffe94 100644 --- a/gcc/config/s390/s390.h +++ b/gcc/config/s390/s390.h @@ -167,6 +167,13 @@ enum processor_flags (TARGET_VX && TARGET_CPU_VXE2) #define TARGET_VXE2_P(opts) \ (TARGET_VX_P (opts) && TARGET_CPU_VXE2_P (opts)) +#if defined(HAVE_AS_VECTOR_LOADSTORE_ALIGNMENT_HINTS_ON_Z13) +#define TARGET_VECTOR_LOADSTORE_ALIGNMENT_HINTS TARGET_Z13 +#elif defined(HAVE_AS_VECTOR_LOADSTORE_ALIGNMENT_HINTS) +#define TARGET_VECTOR_LOADSTORE_ALIGNMENT_HINTS TARGET_Z14 +#else +#define TARGET_VECTOR_LOADSTORE_ALIGNMENT_HINTS 0 +#endif #ifdef HAVE_AS_MACHINE_MACHINEMODE #define S390_USE_TARGET_ATTRIBUTE 1 diff --git a/gcc/configure b/gcc/configure index a065ba23728..35f5a87983b 100755 --- a/gcc/configure +++ b/gcc/configure @@ -27779,6 +27779,37 @@ if test $gcc_cv_as_s390_vector_loadstore_alignment_hints = yes; then $as_echo "#define HAVE_AS_VECTOR_LOADSTORE_ALIGNMENT_HINTS 1" >>confdefs.h +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for vector load/store alignment hints on z13" >&5 +$as_echo_n "checking assembler for vector load/store alignment hints on z13... " >&6; } +if ${gcc_cv_as_s390_vector_loadstore_alignment_hints_on_z13+:} false; then : + $as_echo_n "(cached) " >&6 +else + gcc_cv_as_s390_vector_loadstore_alignment_hints_on_z13=no + if test x$gcc_cv_as != x; then + $as_echo ' vl %v24,0(%r15),3 ' > conftest.s + if { ac_try='$gcc_cv_as $gcc_cv_as_flags -mzarch -march=z13 -o conftest.o conftest.s >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } + then + gcc_cv_as_s390_vector_loadstore_alignment_hints_on_z13=yes + else + echo "configure: failed program was" >&5 + cat conftest.s >&5 + fi + rm -f conftest.o conftest.s + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_s390_vector_loadstore_alignment_hints_on_z13" >&5 +$as_echo "$gcc_cv_as_s390_vector_loadstore_alignment_hints_on_z13" >&6; } +if test $gcc_cv_as_s390_vector_loadstore_alignment_hints_on_z13 = yes; then + +$as_echo "#define HAVE_AS_VECTOR_LOADSTORE_ALIGNMENT_HINTS_ON_Z13 1" >>confdefs.h + fi diff --git a/gcc/configure.ac b/gcc/configure.ac index 3a7251102ef..eef4f1acd01 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -4908,6 +4908,11 @@ pointers into PC-relative form.]) [ vl %v24,0(%r15),3 ],, [AC_DEFINE(HAVE_AS_VECTOR_LOADSTORE_ALIGNMENT_HINTS, 1, [Define if your assembler supports vl/vst/vlm/vstm with an optional alignment hint argument.])]) + gcc_GAS_CHECK_FEATURE([vector load/store alignment hints on z13], + gcc_cv_as_s390_vector_loadstore_alignment_hints_on_z13,, [-mzarch -march=z13], + [ vl %v24,0(%r15),3 ],, + [AC_DEFINE(HAVE_AS_VECTOR_LOADSTORE_ALIGNMENT_HINTS_ON_Z13, 1, + [Define if your assembler supports vl/vst/vlm/vstm with an optional alignment hint argument on z13.])]) ;; esac diff --git a/gcc/testsuite/gcc.target/s390/vector/align-1.c b/gcc/testsuite/gcc.target/s390/vector/align-1.c index cc7777ad22a..6997af2ddcd 100644 --- a/gcc/testsuite/gcc.target/s390/vector/align-1.c +++ b/gcc/testsuite/gcc.target/s390/vector/align-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -mzarch -march=z14" } */ +/* { dg-options "-O3 -mzarch -march=z13" } */ /* The user alignment ends up in DECL_ALIGN of the VAR_DECL and is currently ignored if it is smaller than the alignment of the type. diff --git a/gcc/testsuite/gcc.target/s390/vector/align-2.c b/gcc/testsuite/gcc.target/s390/vector/align-2.c index e4e2fba6a58..00e09d3eadb 100644 --- a/gcc/testsuite/gcc.target/s390/vector/align-2.c +++ b/gcc/testsuite/gcc.target/s390/vector/align-2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -mzarch -march=z14" } */ +/* { dg-options "-O3 -mzarch -march=z13" } */ /* The user alignment ends up in TYPE_ALIGN of the type of the VAR_DECL. */ -- 2.26.2