| # Copyright (C) 2007-2021 Free Software Foundation, Inc. |
| |
| # This program is free software; you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation; either version 3 of the License, or |
| # (at your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with GCC; see the file COPYING3. If not see |
| # <http://www.gnu.org/licenses/>. |
| |
| # 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 |
| } |
| |
| # Load support procs. |
| load_lib gcc-dg.exp |
| load_lib target-supports.exp |
| load_lib gfortran-dg.exp |
| load_lib atomic-dg.exp |
| |
| # Return 1 if the the assembler understands .machine and .machinemode. The |
| # target attribute needs that feature to work. |
| proc check_effective_target_target_attribute { } { |
| if { ![check_runtime s390_check_machine_machinemode [subst { |
| int main (void) |
| { |
| asm (".machine push" : : ); |
| asm (".machine pop" : : ); |
| asm (".machinemode push" : : ); |
| asm (".machinemode pop" : : ); |
| return 0; |
| } |
| }] "" ] } { return 0 } else { return 1 } |
| } |
| |
| # Return 1 if htm (etnd - extract nesting depth) instructions are |
| # understood by the assembler and can be executed. |
| proc check_effective_target_htm { } { |
| if { ![check_runtime s390_check_htm [subst { |
| int main (void) |
| { |
| unsigned int nd; |
| asm ("etnd %0" : "=d" (nd)); |
| return nd; |
| } |
| }] "-march=zEC12 -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 __ARCH__ >= 13 |
| asm ("ncrk %%r2,%%r2,%%r2" : : : "r2"); |
| #elif __ARCH__ >= 12 |
| asm ("agh %%r2,0(%%r15)" : : : "r2"); |
| #elif __ARCH__ >= 11 |
| asm ("lochiz %%r2,42" : : : "r2"); |
| #elif __ARCH__ >= 10 |
| asm ("risbgn %%r2,%%r2,0,0,0" : : : "r2"); |
| #elif __ARCH__ >= 9 |
| asm ("sgrk %%r2,%%r2,%%r2" : : : "r2"); |
| #elif __ARCH__ >= 8 |
| asm ("rosbg %%r2,%%r2,0,0,0" : : : "r2"); |
| #elif __ARCH__ >= 7 |
| asm ("nilf %%r2,0" : : : "r2"); |
| #elif __ARCH__ >= 6 |
| asm ("lay %%r2,0(%%r15)" : : : "r2"); |
| #elif __ARCH__ >= 5 |
| asm ("tam" : : ); |
| #endif |
| #ifdef __HTM__ |
| { |
| unsigned int nd; |
| asm ("etnd %0" : "=d" (nd)); |
| } |
| #endif |
| #if defined (__VX__) && defined (__zarch__) |
| asm ("vzero %%v0" : : : "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 } |
| } |
| proc check_effective_target_s390_z14_hw { } { |
| if { ![check_runtime s390_check_s390_z14_hw [subst { |
| int main (void) |
| { |
| int x = 0; |
| asm ("msgrkc %0,%0,%0" : "+r" (x) : ); |
| return x; |
| } |
| }] "-march=z14 -m64 -mzarch" ] } { return 0 } else { return 1 } |
| } |
| # Return 1 if the default compiler options enable z/Architecture mode |
| proc check_effective_target_s390_zarch { } { |
| return [check_no_compiler_messages s390_zarch object { |
| int dummy[sizeof (int __attribute__((__mode__(__word__)))) == 8 |
| ? 1 : -1]; |
| }] |
| } |
| |
| # If a testcase doesn't have special options, use these. |
| global DEFAULT_CFLAGS |
| if ![info exists DEFAULT_CFLAGS] then { |
| set DEFAULT_CFLAGS " -ansi -pedantic-errors" |
| } |
| global DEFAULT_FFLAGS |
| if ![info exists DEFAULT_FFLAGS] then { |
| set DEFAULT_FFLAGS " -pedantic-errors" |
| } |
| |
| # Initialize `dg'. |
| dg-init |
| |
| set md_tests $srcdir/$subdir/md/*.c |
| |
| # C++ tests belong into g++.dg with a target check. Do NOT add C to |
| # these regexps! |
| |
| # Main loop. |
| dg-runtest [lsort [prune [glob -nocomplain $srcdir/$subdir/*.{c,S}] \ |
| $md_tests]] "" $DEFAULT_CFLAGS |
| |
| dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*vector*/*.{c,S}]] \ |
| "" $DEFAULT_CFLAGS |
| |
| gfortran-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*vector*/*.F90]] \ |
| "" $DEFAULT_FFLAGS |
| |
| dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/target-attribute/*.{c,S}]] \ |
| "" $DEFAULT_CFLAGS |
| |
| dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/arch12/*.{c,S}]] \ |
| "" "-O3 -march=arch12 -mzarch" |
| |
| dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/arch13/*.{c,S}]] \ |
| "" "-O3 -march=arch13 -mzarch" |
| |
| dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/vxe/*.{c,S}]] \ |
| "" "-O3 -march=arch12 -mzarch" |
| |
| # Some md tests require libatomic |
| atomic_init |
| dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/md/*.{c,S}]] \ |
| "" $DEFAULT_CFLAGS |
| |
| # Additional hotpatch torture tests. |
| torture-init |
| set-torture-options [list -Os -O1 -O2 -O3] |
| gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/hotpatch-\[0-9\]*.c]] \ |
| "" $DEFAULT_CFLAGS |
| 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} {-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" |
| 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 |
| |
| # Tests that should pass on all optimization levels. |
| foreach t [list $srcdir/$subdir/pr80080-3.c] { |
| torture-init |
| set-torture-options [list -O1 -O2 -O3 -O0 -Os -Ofast -Og] |
| gcc-dg-runtest [list $t] \ |
| "" $DEFAULT_CFLAGS |
| torture-finish |
| } |
| |
| # All done. |
| atomic_finish |
| dg-finish |