mirror of git://gcc.gnu.org/git/gcc.git
Run tests only if the machine supports the instruction set.
gcc/ChangeLog: 2016-12-22 Dominik Vogt <vogt@linux.vnet.ibm.com> * config/s390/s390-c.c (s390_cpu_cpp_builtins_internal): Define __S390_ARCH_LEVEL__. gcc/testsuite/ChangeLog: 2016-12-22 Dominik Vogt <vogt@linux.vnet.ibm.com> * gcc.target/s390/md/setmem_long-1.c: Use "s390_useable_hw". * gcc.target/s390/md/rXsbg_mode_sXl.c: Likewise. * gcc.target/s390/md/andc-splitter-1.c: Likewise. * gcc.target/s390/md/andc-splitter-2.c: Likewise. * lib/gcc-dg.exp (gcc-dg-runtest): Export torture_current_flags. * gcc.target/s390/s390.exp: Import torture_current_flags. (check_effective_target_s390_useable_hw): New. (check_effective_target_s390_z900_hw): New. (check_effective_target_s390_z990_hw): New. (check_effective_target_s390_z9_ec_hw): New. (check_effective_target_s390_z10_hw): New. (check_effective_target_s390_z196_hw): New. (check_effective_target_s390_zEC12_hw): New. (check_effective_target_s390_z13_hw): New. (check_effective_target_z10_instructions): Removed. (torture tests): Add optimization level without -march=. Reorder torture tests for good cache usage. From-SVN: r243887
This commit is contained in:
parent
a71dcca81e
commit
cbbb9dabbb
|
@ -1,3 +1,8 @@
|
|||
2016-12-22 Dominik Vogt <vogt@linux.vnet.ibm.com>
|
||||
|
||||
* config/s390/s390-c.c (s390_cpu_cpp_builtins_internal): Define
|
||||
__S390_ARCH_LEVEL__.
|
||||
|
||||
2016-12-22 Martin Liska <mliska@suse.cz>
|
||||
|
||||
PR tree-optimization/78886
|
||||
|
|
|
@ -320,6 +320,8 @@ s390_cpu_cpp_builtins_internal (cpp_reader *pfile,
|
|||
{
|
||||
s390_def_or_undef_macro (pfile, MASK_OPT_HTM, old_opts, opts,
|
||||
"__HTM__", "__HTM__");
|
||||
s390_def_or_undef_macro (pfile, MASK_OPT_VX, old_opts, opts,
|
||||
"__S390_VX__", "__S390_VX__");
|
||||
s390_def_or_undef_macro (pfile, MASK_ZVECTOR, old_opts, opts,
|
||||
"__VEC__=10301", "__VEC__");
|
||||
s390_def_or_undef_macro (pfile, MASK_ZVECTOR, old_opts, opts,
|
||||
|
@ -328,6 +330,21 @@ s390_cpu_cpp_builtins_internal (cpp_reader *pfile,
|
|||
s390_def_or_undef_macro (pfile, MASK_ZVECTOR, old_opts, opts,
|
||||
"__bool=__attribute__((s390_vector_bool)) unsigned",
|
||||
"__bool");
|
||||
{
|
||||
char macro_def[64];
|
||||
int arch_level;
|
||||
gcc_assert (s390_arch != PROCESSOR_NATIVE);
|
||||
arch_level = (int)s390_arch + 3;
|
||||
if (s390_arch >= PROCESSOR_2094_Z9_EC)
|
||||
/* Z9_EC has the same level as Z9_109. */
|
||||
arch_level--;
|
||||
/* Review when a new arch is added and increase the value. */
|
||||
char dummy[23 - 2 * PROCESSOR_max] __attribute__((unused));
|
||||
sprintf (macro_def, "__S390_ARCH_LEVEL__=%d", arch_level);
|
||||
cpp_undef (pfile, "__S390_ARCH_LEVEL__");
|
||||
cpp_define (pfile, macro_def);
|
||||
}
|
||||
|
||||
if (!flag_iso)
|
||||
{
|
||||
s390_def_or_undef_macro (pfile, MASK_ZVECTOR, old_opts, opts,
|
||||
|
|
|
@ -1,3 +1,23 @@
|
|||
2016-12-22 Dominik Vogt <vogt@linux.vnet.ibm.com>
|
||||
|
||||
* gcc.target/s390/md/setmem_long-1.c: Use "s390_useable_hw".
|
||||
* gcc.target/s390/md/rXsbg_mode_sXl.c: Likewise.
|
||||
* gcc.target/s390/md/andc-splitter-1.c: Likewise.
|
||||
* gcc.target/s390/md/andc-splitter-2.c: Likewise.
|
||||
* lib/gcc-dg.exp (gcc-dg-runtest): Export torture_current_flags.
|
||||
* gcc.target/s390/s390.exp: Import torture_current_flags.
|
||||
(check_effective_target_s390_useable_hw): New.
|
||||
(check_effective_target_s390_z900_hw): New.
|
||||
(check_effective_target_s390_z990_hw): New.
|
||||
(check_effective_target_s390_z9_ec_hw): New.
|
||||
(check_effective_target_s390_z10_hw): New.
|
||||
(check_effective_target_s390_z196_hw): New.
|
||||
(check_effective_target_s390_zEC12_hw): New.
|
||||
(check_effective_target_s390_z13_hw): New.
|
||||
(check_effective_target_z10_instructions): Removed.
|
||||
(torture tests): Add optimization level without -march=.
|
||||
Reorder torture tests for good cache usage.
|
||||
|
||||
2016-12-22 Martin Liska <mliska@suse.cz>
|
||||
|
||||
PR tree-optimization/78886
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
/* Machine description pattern tests. */
|
||||
|
||||
/* { dg-do run { target { lp64 } } } */
|
||||
/* { dg-do compile { target { lp64 } } } */
|
||||
/* { dg-options "-mzarch -save-temps -dP" } */
|
||||
/* { dg-do run { target { lp64 && s390_useable_hw } } } */
|
||||
/* Skip test if -O0 is present on the command line:
|
||||
|
||||
{ dg-skip-if "" { *-*-* } { "-O0" } { "" } }
|
||||
|
@ -13,26 +14,26 @@
|
|||
__attribute__ ((noinline))
|
||||
unsigned long andc_vv(unsigned long a, unsigned long b)
|
||||
{ return ~b & a; }
|
||||
/* { dg-final { scan-assembler ":15 .\* \{\\*anddi3\}" } } */
|
||||
/* { dg-final { scan-assembler ":15 .\* \{\\*xordi3\}" } } */
|
||||
/* { dg-final { scan-assembler ":16 .\* \{\\*anddi3\}" } } */
|
||||
/* { dg-final { scan-assembler ":16 .\* \{\\*xordi3\}" } } */
|
||||
|
||||
__attribute__ ((noinline))
|
||||
unsigned long andc_pv(unsigned long *a, unsigned long b)
|
||||
{ return ~b & *a; }
|
||||
/* { dg-final { scan-assembler ":21 .\* \{\\*anddi3\}" } } */
|
||||
/* { dg-final { scan-assembler ":21 .\* \{\\*xordi3\}" } } */
|
||||
/* { dg-final { scan-assembler ":22 .\* \{\\*anddi3\}" } } */
|
||||
/* { dg-final { scan-assembler ":22 .\* \{\\*xordi3\}" } } */
|
||||
|
||||
__attribute__ ((noinline))
|
||||
unsigned long andc_vp(unsigned long a, unsigned long *b)
|
||||
{ return ~*b & a; }
|
||||
/* { dg-final { scan-assembler ":27 .\* \{\\*anddi3\}" } } */
|
||||
/* { dg-final { scan-assembler ":27 .\* \{\\*xordi3\}" } } */
|
||||
/* { dg-final { scan-assembler ":28 .\* \{\\*anddi3\}" } } */
|
||||
/* { dg-final { scan-assembler ":28 .\* \{\\*xordi3\}" } } */
|
||||
|
||||
__attribute__ ((noinline))
|
||||
unsigned long andc_pp(unsigned long *a, unsigned long *b)
|
||||
{ return ~*b & *a; }
|
||||
/* { dg-final { scan-assembler ":33 .\* \{\\*anddi3\}" } } */
|
||||
/* { dg-final { scan-assembler ":33 .\* \{\\*xordi3\}" } } */
|
||||
/* { dg-final { scan-assembler ":34 .\* \{\\*anddi3\}" } } */
|
||||
/* { dg-final { scan-assembler ":34 .\* \{\\*xordi3\}" } } */
|
||||
|
||||
/* { dg-final { scan-assembler-times "\tngr\?k\?\t" 4 } } */
|
||||
/* { dg-final { scan-assembler-times "\txgr\?\t" 4 } } */
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
/* Machine description pattern tests. */
|
||||
|
||||
/* { dg-do run } */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-save-temps -dP" } */
|
||||
/* { dg-do run { target { s390_useable_hw } } } */
|
||||
/* Skip test if -O0 is present on the command line:
|
||||
|
||||
{ dg-skip-if "" { *-*-* } { "-O0" } { "" } }
|
||||
|
@ -13,26 +14,26 @@
|
|||
__attribute__ ((noinline))
|
||||
unsigned int andc_vv(unsigned int a, unsigned int b)
|
||||
{ return ~b & a; }
|
||||
/* { dg-final { scan-assembler ":15 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */
|
||||
/* { dg-final { scan-assembler ":15 .\* \{\\*xorsi3\}" } } */
|
||||
/* { dg-final { scan-assembler ":16 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */
|
||||
/* { dg-final { scan-assembler ":16 .\* \{\\*xorsi3\}" } } */
|
||||
|
||||
__attribute__ ((noinline))
|
||||
unsigned int andc_pv(unsigned int *a, unsigned int b)
|
||||
{ return ~b & *a; }
|
||||
/* { dg-final { scan-assembler ":21 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */
|
||||
/* { dg-final { scan-assembler ":21 .\* \{\\*xorsi3\}" } } */
|
||||
/* { dg-final { scan-assembler ":22 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */
|
||||
/* { dg-final { scan-assembler ":22 .\* \{\\*xorsi3\}" } } */
|
||||
|
||||
__attribute__ ((noinline))
|
||||
unsigned int andc_vp(unsigned int a, unsigned int *b)
|
||||
{ return ~*b & a; }
|
||||
/* { dg-final { scan-assembler ":27 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */
|
||||
/* { dg-final { scan-assembler ":27 .\* \{\\*xorsi3\}" } } */
|
||||
/* { dg-final { scan-assembler ":28 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */
|
||||
/* { dg-final { scan-assembler ":28 .\* \{\\*xorsi3\}" } } */
|
||||
|
||||
__attribute__ ((noinline))
|
||||
unsigned int andc_pp(unsigned int *a, unsigned int *b)
|
||||
{ return ~*b & *a; }
|
||||
/* { dg-final { scan-assembler ":33 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */
|
||||
/* { dg-final { scan-assembler ":33 .\* \{\\*xorsi3\}" } } */
|
||||
/* { dg-final { scan-assembler ":34 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */
|
||||
/* { dg-final { scan-assembler ":34 .\* \{\\*xorsi3\}" } } */
|
||||
|
||||
/* { dg-final { scan-assembler-times "\tnr\?k\?\t" 4 } } */
|
||||
/* { dg-final { scan-assembler-times "\txr\?k\?\t" 4 } } */
|
||||
|
|
|
@ -7,8 +7,8 @@
|
|||
always wins, even if the condition is false. If this test is run on hardware
|
||||
older than z10 with a buggy dejagnu release, the execution part will fail.
|
||||
|
||||
{ dg-do assemble { target { ! z10_instructions } } }
|
||||
{ dg-do run { target { z10_instructions } } }
|
||||
{ dg-do assemble }
|
||||
{ dg-do run { target { s390_useable_hw } } }
|
||||
|
||||
Skip test if -O0, -march=z900, -march=z9-109 or -march=z9-ec is present on
|
||||
the command line:
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
/* Machine description pattern tests. */
|
||||
|
||||
/* { dg-do run } */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-mmvcle -dP -save-temps" } */
|
||||
/* { dg-do run { target { s390_useable_hw } } } */
|
||||
|
||||
__attribute__ ((noinline))
|
||||
void test(char *p, char c, int len)
|
||||
|
@ -16,8 +17,8 @@ void test2(char *p, int c, int len)
|
|||
}
|
||||
|
||||
/* Check that the right patterns are used. */
|
||||
/* { dg-final { scan-assembler-times {c"?:9 .*{[*]setmem_long_?3?1?z?}} 1 } } */
|
||||
/* { dg-final { scan-assembler-times {c"?:15 .*{[*]setmem_long_and_?3?1?z?}} 1 { xfail *-*-* } } } */
|
||||
/* { dg-final { scan-assembler-times {c"?:10 .*{[*]setmem_long_?3?1?z?}} 1 } } */
|
||||
/* { dg-final { scan-assembler-times {c"?:16 .*{[*]setmem_long_and_?3?1?z?}} 1 { xfail *-*-* } } } */
|
||||
|
||||
#define LEN 500
|
||||
char buf[LEN + 2];
|
||||
|
|
|
@ -16,6 +16,9 @@
|
|||
|
||||
# GCC testsuite that uses the `dg.exp' driver.
|
||||
|
||||
global torture_current_flags
|
||||
set torture_current_flags ""
|
||||
|
||||
# Exit immediately if this isn't a s390 target.
|
||||
if ![istarget s390*-*-*] then {
|
||||
return
|
||||
|
@ -24,17 +27,6 @@ if ![istarget s390*-*-*] then {
|
|||
# Load support procs.
|
||||
load_lib gcc-dg.exp
|
||||
|
||||
# Return 1 if z10 instructions work.
|
||||
proc check_effective_target_z10_instructions { } {
|
||||
if { ![check_runtime s390_check_z10_instructions [subst {
|
||||
int main (void)
|
||||
{
|
||||
asm ("rosbg %%r2,%%r2,0,0,0" : : );
|
||||
return 0;
|
||||
}
|
||||
}] "-march=z10 -mzarch" ] } { return 0 } else { return 1 }
|
||||
}
|
||||
|
||||
# Return 1 if the the assembler understands .machine and .machinemode. The
|
||||
# target attribute needs that feature to work.
|
||||
proc check_effective_target_target_attribute { } {
|
||||
|
@ -78,6 +70,138 @@ proc check_effective_target_vector { } {
|
|||
}] "-march=z13 -mzarch" ] } { return 0 } else { return 1 }
|
||||
}
|
||||
|
||||
global s390_cached_flags
|
||||
set s390_cached_flags ""
|
||||
global s390_cached_value
|
||||
set s390_cached_value ""
|
||||
global s390_cached_value_noflags
|
||||
set s390_cached_value_noflags ""
|
||||
|
||||
# Return 1 if a program using the full instruction set allowed by
|
||||
# the compiler option can be executed.
|
||||
proc check_effective_target_s390_useable_hw { } {
|
||||
global torture_current_flags
|
||||
global s390_cached_flags
|
||||
global s390_cached_value
|
||||
global s390_cached_value_noflags
|
||||
|
||||
# Remove -Ox options and whitespace.
|
||||
set flags [regsub -all {[-]O[0-9s]} "$torture_current_flags" ""]
|
||||
set flags [regsub -all {[ \\t\\n]+} "$flags" " "]
|
||||
set flags [regsub -all {(^ )|( $)} "$flags" ""]
|
||||
if { "$s390_cached_flags" != "" && "$flags" == "$s390_cached_flags" } {
|
||||
return $s390_cached_value
|
||||
}
|
||||
# Extra cache for (frequent) calls with empty torture_current_flags.
|
||||
if { "$flags" == "" && $s390_cached_value_noflags != "" } {
|
||||
return $s390_cached_value_noflags
|
||||
}
|
||||
if { ![check_runtime_nocache s390_check_useable_hw [subst {
|
||||
int main (void)
|
||||
{
|
||||
asm (".machinemode zarch" : : );
|
||||
#if __S390_ARCH_LEVEL__ >= 11
|
||||
asm ("lcbb %%r2,0(%%r15),0" : : );
|
||||
#elif __S390_ARCH_LEVEL__ >= 10
|
||||
asm ("risbgn %%r2,%%r2,0,0,0" : : );
|
||||
#elif __S390_ARCH_LEVEL__ >= 9
|
||||
asm ("sgrk %%r2,%%r2,%%r2" : : );
|
||||
#elif __S390_ARCH_LEVEL__ >= 8
|
||||
asm ("rosbg %%r2,%%r2,0,0,0" : : );
|
||||
#elif __S390_ARCH_LEVEL__ >= 7
|
||||
asm ("nilf %%r2,0" : : );
|
||||
#elif __S390_ARCH_LEVEL__ >= 6
|
||||
asm ("lay %%r2,0(%%r15)" : : );
|
||||
#elif __S390_ARCH_LEVEL__ >= 5
|
||||
asm ("tam" : : );
|
||||
#endif
|
||||
#ifdef __HTM__
|
||||
{
|
||||
unsigned int nd;
|
||||
asm ("etnd %0" : "=d" (nd));
|
||||
}
|
||||
#endif
|
||||
#ifdef __S390_VX__
|
||||
asm ("vzero %%v0" : : );
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
}] "$flags" ] } { set result 0 } else { set result 1 }
|
||||
if { "$flags" == "" } {
|
||||
set s390_cached_value_noflags "$result"
|
||||
} else {
|
||||
set s390_cached_flags "$flags"
|
||||
set s390_cached_value "$result"
|
||||
}
|
||||
return $result
|
||||
}
|
||||
|
||||
# Return 1 if -march=... specific instructions are understood by
|
||||
# the assembler and can be executed.
|
||||
proc check_effective_target_s390_z900_hw { } {
|
||||
if { ![check_runtime s390_check_s390_z900_hw [subst {
|
||||
int main (void)
|
||||
{
|
||||
asm ("tam" : : );
|
||||
return 0;
|
||||
}
|
||||
}] "-march=z900 -m64 -mzarch" ] } { return 0 } else { return 1 }
|
||||
}
|
||||
proc check_effective_target_s390_z990_hw { } {
|
||||
if { ![check_runtime s390_check_s390_z990_hw [subst {
|
||||
int main (void)
|
||||
{
|
||||
asm ("lay %%r2,0(%%r15)" : : );
|
||||
return 0;
|
||||
}
|
||||
}] "-march=z990 -m64 -mzarch" ] } { return 0 } else { return 1 }
|
||||
}
|
||||
proc check_effective_target_s390_z9_ec_hw { } {
|
||||
if { ![check_runtime s390_check_s390_z9_ec_hw [subst {
|
||||
int main (void)
|
||||
{
|
||||
asm ("nilf %%r2,0" : : );
|
||||
return 0;
|
||||
}
|
||||
}] "-march=z9-ec -m64 -mzarch" ] } { return 0 } else { return 1 }
|
||||
}
|
||||
proc check_effective_target_s390_z10_hw { } {
|
||||
if { ![check_runtime s390_check_s390_z10_hw [subst {
|
||||
int main (void)
|
||||
{
|
||||
asm ("rosbg %%r2,%%r2,0,0,0" : : );
|
||||
return 0;
|
||||
}
|
||||
}] "-march=z10 -m64 -mzarch" ] } { return 0 } else { return 1 }
|
||||
}
|
||||
proc check_effective_target_s390_z196_hw { } {
|
||||
if { ![check_runtime s390_check_s390_z196_hw [subst {
|
||||
int main (void)
|
||||
{
|
||||
asm ("sgrk %%r2,%%r2,%%r2" : : );
|
||||
return 0;
|
||||
}
|
||||
}] "-march=z196 -m64 -mzarch" ] } { return 0 } else { return 1 }
|
||||
}
|
||||
proc check_effective_target_s390_zEC12_hw { } {
|
||||
if { ![check_runtime s390_check_s390_zEC12_hw [subst {
|
||||
int main (void)
|
||||
{
|
||||
asm ("risbgn %%r2,%%r2,0,0,0" : : );
|
||||
return 0;
|
||||
}
|
||||
}] "-march=zEC12 -m64 -mzarch" ] } { return 0 } else { return 1 }
|
||||
}
|
||||
proc check_effective_target_s390_z13_hw { } {
|
||||
if { ![check_runtime s390_check_s390_z13_hw [subst {
|
||||
int main (void)
|
||||
{
|
||||
asm ("lcbb %%r2,0(%%r15),0" : : );
|
||||
return 0;
|
||||
}
|
||||
}] "-march=z13 -m64 -mzarch" ] } { return 0 } else { return 1 }
|
||||
}
|
||||
|
||||
# If a testcase doesn't have special options, use these.
|
||||
global DEFAULT_CFLAGS
|
||||
if ![info exists DEFAULT_CFLAGS] then {
|
||||
|
@ -110,15 +234,27 @@ gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/hotpatch-\[0-9\]*.c]] \
|
|||
torture-finish
|
||||
|
||||
# Additional md torture tests.
|
||||
# (Note: Split into a separate torture test for each -march= option to improve
|
||||
# cacheability.)
|
||||
torture-init
|
||||
set MD_TEST_OPTS [list \
|
||||
{-Os -march=z900} {-Os -march=z13} \
|
||||
{-O0 -march=z900} {-O0 -march=z13} \
|
||||
{-O1 -march=z900} {-O1 -march=z13} \
|
||||
{-O2 -march=z900} {-O2 -march=z13} \
|
||||
{-O3 -march=z900} {-O3 -march=z13}]
|
||||
{-Os} {-Os -march=z900} \
|
||||
{-O0} {-O0 -march=z900} \
|
||||
{-O1} {-O1 -march=z900} \
|
||||
{-O2} {-O2 -march=z900} \
|
||||
{-O3} {-O3 -march=z900} ]
|
||||
set-torture-options $MD_TEST_OPTS
|
||||
gcc-dg-runtest [lsort [glob -nocomplain $md_tests]] "" $DEFAULT_CFLAGS
|
||||
gcc-dg-runtest [lsort [glob -nocomplain $md_tests]] "" "$DEFAULT_CFLAGS"
|
||||
torture-finish
|
||||
torture-init
|
||||
set MD_TEST_OPTS [list \
|
||||
{-Os -march=z13} \
|
||||
{-O0 -march=z13} \
|
||||
{-O1 -march=z13} \
|
||||
{-O2 -march=z13} \
|
||||
{-O3 -march=z13} ]
|
||||
set-torture-options $MD_TEST_OPTS
|
||||
gcc-dg-runtest [lsort [glob -nocomplain $md_tests]] "" "$DEFAULT_CFLAGS"
|
||||
torture-finish
|
||||
|
||||
# All done.
|
||||
|
|
|
@ -533,6 +533,8 @@ proc gcc-dg-runtest { testcases flags default-extra-flags } {
|
|||
set nshort [file tail [file dirname $test]]/[file tail $test]
|
||||
|
||||
foreach flags_t $option_list {
|
||||
global torture_current_flags
|
||||
set torture_current_flags "$flags_t"
|
||||
verbose "Testing $nshort, $flags $flags_t" 1
|
||||
dg-test $test "$flags $flags_t" ${default-extra-flags}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue