From ae6a0535822d2ca38d3347f3ef6e890bd7039f75 Mon Sep 17 00:00:00 2001 From: Rainer Orth Date: Mon, 12 Jul 2010 11:32:42 +0000 Subject: [PATCH] config.gcc (i[34567]86-*-solaris2*): Default with_arch_32 to pentiumpro on Solaris 8 and 9/x86. gcc: * config.gcc (i[34567]86-*-solaris2*): Default with_arch_32 to pentiumpro on Solaris 8 and 9/x86. * doc/install.texi (Specific, i?86-*-solaris2.[89]): Recommend GNU as. Document SSE/SSE2 support. * doc/sourcebuild.texi (Effective-Target Keywords): Document sse. gcc/testsuite: * lib/target-supports.exp (check_effective_target_sse): New proc. * gcc.target/i386/sol2-check.h: New file. * gcc.target/i386/sse-check.h (ILL_INSN, ILL_INSN_LEN): Define. Include sol2-check.h. (main) Only run do_test () if sol2_check (). * gcc.target/i386/sse2-check.h: Likewise. * gcc.target/i386/sse3-check.h: Likewise. * gcc.dg/vect/tree-vect.h (check_vect) [__i386__ || __x86_64__] [__sun__ && __svr4__]: Execute SSE2 instruction. * gcc.target/i386/math-torture/math-torture.exp: Only add options with -msse to MATH_TORTURE_OPTIONS if check_effective_target_sse. * g++.dg/debug/dwarf2/const2b.C: Use dg-require-effective-target sse. * g++.dg/ext/vector14.C: Likewise. * g++.dg/other/mmintrin.C: Likewise. * gcc.dg/20020418-1.c: Likewise. * gcc.dg/debug/dwarf2/const-2b.c: Likewise. * gcc.dg/format/ms_unnamed-1.c: Likewise. * gcc.dg/format/unnamed-1.c: Likewise. Adapt dg-warning line number. * gcc.dg/graphite/pr40281.c: Likewise. * gcc.dg/pr32176.c: Likewise. * gcc.dg/pr40550.c: Likewise. * gcc.dg/prefetch-loop-arrays-1.c: Likewise. * gcc.dg/torture/pr36891.c: Likewise. * gcc.target/i386/20020218-1.c: Likewise. * gcc.target/i386/20020523.c: Likewise. * gcc.target/i386/abi-1.c: Likewise. * gcc.target/i386/brokensqrt.c: Likewise. * gcc.target/i386/fastcall-sseregparm.c: Likewise. * gcc.target/i386/pr13366.c: Likewise. * gcc.target/i386/pr13685.c: Likewise. * gcc.target/i386/pr24306.c: Likewise. * gcc.target/i386/pr31486.c: Likewise. * gcc.target/i386/pr32065-1.c: Likewise. * gcc.target/i386/pr32065-2.c: Likewise. * gcc.target/i386/pr32389.c: Likewise. * gcc.target/i386/pr38824.c: Likewise. * gcc.target/i386/pr38931.c: Likewise. * gcc.target/i386/pr39592-1.c: Likewise. * gcc.target/i386/pr43766.c: Likewise. * gcc.target/i386/recip-divf.c: Likewise. * gcc.target/i386/recip-sqrtf.c: Likewise. * gcc.target/i386/recip-vec-divf.c: Likewise. * gcc.target/i386/recip-vec-sqrtf.c: Likewise. * gcc.target/i386/sse-1.c: Likewise. * gcc.target/i386/sse-16.c: Likewise. * gcc.target/i386/sse-2.c: Likewise. * gcc.target/i386/sse-20.c: Likewise. * gcc.target/i386/sse-3.c: Likewise. * gcc.target/i386/sse-7.c: Likewise. * gcc.target/i386/sse-9.c: Likewise. * gcc.target/i386/sse-addps-1.c: Likewise. * gcc.target/i386/sse-addss-1.c: Likewise. * gcc.target/i386/sse-andnps-1.c: Likewise. * gcc.target/i386/sse-andps-1.c: Likewise. * gcc.target/i386/sse-cmpss-1.c: Likewise. * gcc.target/i386/sse-comiss-1.c: Likewise. * gcc.target/i386/sse-comiss-2.c: Likewise. * gcc.target/i386/sse-comiss-3.c: Likewise. * gcc.target/i386/sse-comiss-4.c: Likewise. * gcc.target/i386/sse-comiss-5.c: Likewise. * gcc.target/i386/sse-comiss-6.c: Likewise. * gcc.target/i386/sse-copysignf-vec.c: Likewise. * gcc.target/i386/sse-cvtsi2ss-1.c: Likewise. * gcc.target/i386/sse-cvtsi2ss-2.c: Likewise. * gcc.target/i386/sse-cvtss2si-1.c: Likewise. * gcc.target/i386/sse-cvtss2si-2.c: Likewise. * gcc.target/i386/sse-cvttss2si-1.c: Likewise. * gcc.target/i386/sse-cvttss2si-2.c: Likewise. * gcc.target/i386/sse-divps-1.c: Likewise. * gcc.target/i386/sse-divss-1.c: Likewise. * gcc.target/i386/sse-init-v4hi-1.c: Likewise. * gcc.target/i386/sse-init-v4sf-1.c: Likewise. * gcc.target/i386/sse-maxps-1.c: Likewise. * gcc.target/i386/sse-maxss-1.c: Likewise. * gcc.target/i386/sse-minps-1.c: Likewise. * gcc.target/i386/sse-minss-1.c: Likewise. * gcc.target/i386/sse-movaps-1.c: Likewise. * gcc.target/i386/sse-movaps-2.c: Likewise. * gcc.target/i386/sse-movhlps-1.c: Likewise. * gcc.target/i386/sse-movhps-1.c: Likewise. * gcc.target/i386/sse-movhps-2.c: Likewise. * gcc.target/i386/sse-movlhps-1.c: Likewise. * gcc.target/i386/sse-movmskps-1.c: Likewise. * gcc.target/i386/sse-movntps-1.c: Likewise. * gcc.target/i386/sse-movss-1.c: Likewise. * gcc.target/i386/sse-movss-2.c: Likewise. * gcc.target/i386/sse-movss-3.c: Likewise. * gcc.target/i386/sse-movups-1.c: Likewise. * gcc.target/i386/sse-movups-2.c: Likewise. * gcc.target/i386/sse-mulps-1.c: Likewise. * gcc.target/i386/sse-mulss-1.c: Likewise. * gcc.target/i386/sse-orps-1.c: Likewise. * gcc.target/i386/sse-rcpps-1.c: Likewise. * gcc.target/i386/sse-recip-vec.c: Likewise. * gcc.target/i386/sse-recip.c: Likewise. * gcc.target/i386/sse-rsqrtps-1.c: Likewise. * gcc.target/i386/sse-set-ps-1.c: Likewise. * gcc.target/i386/sse-sqrtps-1.c: Likewise. * gcc.target/i386/sse-subps-1.c: Likewise. * gcc.target/i386/sse-subss-1.c: Likewise. * gcc.target/i386/sse-ucomiss-1.c: Likewise. * gcc.target/i386/sse-ucomiss-2.c: Likewise. * gcc.target/i386/sse-ucomiss-3.c: Likewise. * gcc.target/i386/sse-ucomiss-4.c: Likewise. * gcc.target/i386/sse-ucomiss-5.c: Likewise. * gcc.target/i386/sse-ucomiss-6.c: Likewise. * gcc.target/i386/sse-unpckhps-1.c: Likewise. * gcc.target/i386/sse-unpcklps-1.c: Likewise. * gcc.target/i386/sse-xorps-1.c: Likewise. * gcc.target/i386/ssefn-1.c: Likewise. * gcc.target/i386/ssefn-3.c: Likewise. * gcc.target/i386/sseregparm-1.c: Likewise. * gcc.target/i386/stackalign/return-3.c: Likewise. * gcc.target/i386/vectorize1.c: Likewise. * gcc.target/i386/vperm-v4sf-1.c: Likewise. * gcc.target/i386/xorps-sse.c: Likewise. * gfortran.dg/pr28158.f90: Likewise. * gfortran.dg/pr30667.f: Likewise. * gnat.dg/loop_optimization7.adb: Likewise. * gnat.dg/sse_nolib.adb: Likewise. libgfortran: * config/fpu-387.h [__sun__ && __svr4__] Include , . (sigill_caught): New. (sigill_hdlr): New function (has_sse) [__sun__ && __svr4__]: Check if SSE instruction causes SIGILL. From-SVN: r162073 --- gcc/ChangeLog | 8 ++ gcc/config.gcc | 11 +- gcc/doc/install.texi | 22 ++++ gcc/doc/sourcebuild.texi | 3 + gcc/testsuite/ChangeLog | 124 ++++++++++++++++++ gcc/testsuite/g++.dg/debug/dwarf2/const2b.C | 1 + gcc/testsuite/g++.dg/ext/vector14.C | 3 +- gcc/testsuite/g++.dg/other/mmintrin.C | 1 + gcc/testsuite/gcc.dg/20020418-1.c | 1 + gcc/testsuite/gcc.dg/debug/dwarf2/const-2b.c | 1 + gcc/testsuite/gcc.dg/format/ms_unnamed-1.c | 1 + gcc/testsuite/gcc.dg/format/unnamed-1.c | 3 +- gcc/testsuite/gcc.dg/graphite/pr40281.c | 1 + gcc/testsuite/gcc.dg/pr32176.c | 1 + gcc/testsuite/gcc.dg/pr40550.c | 1 + gcc/testsuite/gcc.dg/prefetch-loop-arrays-1.c | 1 + gcc/testsuite/gcc.dg/torture/pr36891.c | 1 + gcc/testsuite/gcc.dg/vect/tree-vect.h | 5 + gcc/testsuite/gcc.target/i386/20020218-1.c | 1 + gcc/testsuite/gcc.target/i386/20020523.c | 1 + gcc/testsuite/gcc.target/i386/abi-1.c | 1 + gcc/testsuite/gcc.target/i386/brokensqrt.c | 1 + .../gcc.target/i386/fastcall-sseregparm.c | 1 + .../i386/math-torture/math-torture.exp | 16 ++- gcc/testsuite/gcc.target/i386/pr13366.c | 1 + gcc/testsuite/gcc.target/i386/pr13685.c | 1 + gcc/testsuite/gcc.target/i386/pr24306.c | 1 + gcc/testsuite/gcc.target/i386/pr31486.c | 1 + gcc/testsuite/gcc.target/i386/pr32065-1.c | 1 + gcc/testsuite/gcc.target/i386/pr32065-2.c | 1 + gcc/testsuite/gcc.target/i386/pr32389.c | 1 + gcc/testsuite/gcc.target/i386/pr38824.c | 1 + gcc/testsuite/gcc.target/i386/pr38931.c | 1 + gcc/testsuite/gcc.target/i386/pr39592-1.c | 1 + gcc/testsuite/gcc.target/i386/pr43766.c | 1 + gcc/testsuite/gcc.target/i386/recip-divf.c | 1 + gcc/testsuite/gcc.target/i386/recip-sqrtf.c | 1 + .../gcc.target/i386/recip-vec-divf.c | 1 + .../gcc.target/i386/recip-vec-sqrtf.c | 1 + gcc/testsuite/gcc.target/i386/sol2-check.h | 48 +++++++ gcc/testsuite/gcc.target/i386/sse-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-16.c | 1 + gcc/testsuite/gcc.target/i386/sse-2.c | 1 + gcc/testsuite/gcc.target/i386/sse-20.c | 1 + gcc/testsuite/gcc.target/i386/sse-3.c | 1 + gcc/testsuite/gcc.target/i386/sse-7.c | 1 + gcc/testsuite/gcc.target/i386/sse-9.c | 1 + gcc/testsuite/gcc.target/i386/sse-addps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-addss-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-andnps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-andps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-check.h | 9 +- gcc/testsuite/gcc.target/i386/sse-cmpss-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-comiss-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-comiss-2.c | 1 + gcc/testsuite/gcc.target/i386/sse-comiss-3.c | 1 + gcc/testsuite/gcc.target/i386/sse-comiss-4.c | 1 + gcc/testsuite/gcc.target/i386/sse-comiss-5.c | 1 + gcc/testsuite/gcc.target/i386/sse-comiss-6.c | 1 + .../gcc.target/i386/sse-copysignf-vec.c | 1 + .../gcc.target/i386/sse-cvtsi2ss-1.c | 1 + .../gcc.target/i386/sse-cvtsi2ss-2.c | 1 + .../gcc.target/i386/sse-cvtss2si-1.c | 1 + .../gcc.target/i386/sse-cvtss2si-2.c | 1 + .../gcc.target/i386/sse-cvttss2si-1.c | 1 + .../gcc.target/i386/sse-cvttss2si-2.c | 1 + gcc/testsuite/gcc.target/i386/sse-divps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-divss-1.c | 1 + .../gcc.target/i386/sse-init-v4hi-1.c | 1 + .../gcc.target/i386/sse-init-v4sf-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-maxps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-maxss-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-minps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-minss-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-movaps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-movaps-2.c | 1 + gcc/testsuite/gcc.target/i386/sse-movhlps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-movhps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-movhps-2.c | 1 + gcc/testsuite/gcc.target/i386/sse-movlhps-1.c | 1 + .../gcc.target/i386/sse-movmskps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-movntps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-movss-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-movss-2.c | 1 + gcc/testsuite/gcc.target/i386/sse-movss-3.c | 1 + gcc/testsuite/gcc.target/i386/sse-movups-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-movups-2.c | 1 + gcc/testsuite/gcc.target/i386/sse-mulps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-mulss-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-orps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-rcpps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-recip-vec.c | 1 + gcc/testsuite/gcc.target/i386/sse-recip.c | 1 + gcc/testsuite/gcc.target/i386/sse-rsqrtps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-set-ps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-sqrtps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-subps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-subss-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-ucomiss-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-ucomiss-2.c | 1 + gcc/testsuite/gcc.target/i386/sse-ucomiss-3.c | 1 + gcc/testsuite/gcc.target/i386/sse-ucomiss-4.c | 1 + gcc/testsuite/gcc.target/i386/sse-ucomiss-5.c | 1 + gcc/testsuite/gcc.target/i386/sse-ucomiss-6.c | 1 + .../gcc.target/i386/sse-unpckhps-1.c | 1 + .../gcc.target/i386/sse-unpcklps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse-xorps-1.c | 1 + gcc/testsuite/gcc.target/i386/sse2-check.h | 8 +- gcc/testsuite/gcc.target/i386/sse3-check.h | 8 +- gcc/testsuite/gcc.target/i386/ssefn-1.c | 1 + gcc/testsuite/gcc.target/i386/ssefn-3.c | 1 + gcc/testsuite/gcc.target/i386/sseregparm-1.c | 1 + .../gcc.target/i386/stackalign/return-3.c | 1 + gcc/testsuite/gcc.target/i386/vectorize1.c | 1 + gcc/testsuite/gcc.target/i386/xorps-sse.c | 1 + gcc/testsuite/gfortran.dg/pr28158.f90 | 1 + gcc/testsuite/gfortran.dg/pr30667.f | 1 + gcc/testsuite/gnat.dg/loop_optimization7.adb | 1 + gcc/testsuite/gnat.dg/sse_nolib.adb | 1 + gcc/testsuite/lib/target-supports.exp | 11 ++ libgfortran/ChangeLog | 9 ++ libgfortran/config/fpu-387.h | 47 ++++++- 122 files changed, 421 insertions(+), 20 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/sol2-check.h diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e1322b191169..571551ac232b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-07-12 Rainer Orth + + * config.gcc (i[34567]86-*-solaris2*): Default with_arch_32 to + pentiumpro on Solaris 8 and 9/x86. + * doc/install.texi (Specific, i?86-*-solaris2.[89]): Recommend GNU as. + Document SSE/SSE2 support. + * doc/sourcebuild.texi (Effective-Target Keywords): Document sse. + 2010-07-12 Andi Kleen * lto-symtab.c (lto_symtab_merge_decls_1): Use fatal_error diff --git a/gcc/config.gcc b/gcc/config.gcc index c39b990f379e..31ea32e56f0d 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -1253,13 +1253,10 @@ i[34567]86-*-solaris2*) # Set default arch_32 to pentium4, tune_32 to generic like the other # i386 targets, although config.guess defaults to i386-pc-solaris2*. case ${target} in - *-*-solaris2.8*) - if test x$gas = xyes; then - with_arch_32=${with_arch_32:-pentium4} - else - # Solaris 8/x86 as cannot handle sse2. - with_arch_32=${with_arch_32:-pentiumpro} - fi + *-*-solaris2.[89]*) + # Solaris 8 and 9/x86 cannot execute SSE/SSE2 instructions by + # default. + with_arch_32=${with_arch_32:-pentiumpro} ;; *) with_arch_32=${with_arch_32:-pentium4} diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi index 6b1e6a329e0f..7580dee4ec14 100644 --- a/gcc/doc/install.texi +++ b/gcc/doc/install.texi @@ -2898,6 +2898,8 @@ information are. @item @uref{#ix86-x-linux,,i?86-*-linux*} @item +@uref{#ix86-x-solaris289,,i?86-*-solaris2.[89]} +@item @uref{#ix86-x-solaris210,,i?86-*-solaris2.10} @item @uref{#ia64-x-linux,,ia64-*-linux} @@ -3470,6 +3472,26 @@ If you receive Signal 11 errors when building on GNU/Linux, then it is possible you have a hardware problem. Further information on this can be found on @uref{http://www.bitwizard.nl/sig11/,,www.bitwizard.nl}. +@html +
+@end html +@heading @anchor{ix86-x-solaris289}i?86-*-solaris2.[89] +The Sun assembler in Solaris 8 and 9 has several bugs and limitations. +While GCC works around them, several features are missing, so it is +@c FIXME: which ones? +recommended to use the GNU assembler instead. There is no bundled +version, but the current version, from GNU binutils 2.20.1, is known to +work. + +Solaris~2/x86 doesn't support the execution of SSE/SSE2 instructions +before Solaris~9 4/04, even if the CPU supports them. Programs will +receive @code{SIGILL} if they try. The fix is available both in +Solaris~9 Update~6 and kernel patch 112234-12 or newer. There is no +corresponding patch for Solaris 8. To avoid this problem, +@option{-march} defaults to @samp{pentiumpro} on Solaris 8 and 9. If +you have the patch installed, you can configure GCC with an appropriate +@option{--with-arch} option, but need GNU @command{as} for SSE2 support. + @html
@end html diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi index cb116a93f572..191e42526864 100644 --- a/gcc/doc/sourcebuild.texi +++ b/gcc/doc/sourcebuild.texi @@ -1604,6 +1604,9 @@ Target uses a ColdFire FPU. @item hard_float Target supports FPU instructions. +@item sse +Target supports compiling @code{sse} instructions. + @item sse2 Target supports compiling @code{sse2} instructions. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1182677f4daf..9bc54504a9e6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,127 @@ +2010-07-12 Rainer Orth + + * lib/target-supports.exp (check_effective_target_sse): New proc. + * gcc.target/i386/sol2-check.h: New file. + * gcc.target/i386/sse-check.h (ILL_INSN, ILL_INSN_LEN): Define. + Include sol2-check.h. + (main) Only run do_test () if sol2_check (). + * gcc.target/i386/sse2-check.h: Likewise. + * gcc.target/i386/sse3-check.h: Likewise. + * gcc.dg/vect/tree-vect.h (check_vect) [__i386__ || __x86_64__] + [__sun__ && __svr4__]: Execute SSE2 instruction. + * gcc.target/i386/math-torture/math-torture.exp: Only add options + with -msse to MATH_TORTURE_OPTIONS if check_effective_target_sse. + * g++.dg/debug/dwarf2/const2b.C: Use dg-require-effective-target sse. + * g++.dg/ext/vector14.C: Likewise. + * g++.dg/other/mmintrin.C: Likewise. + * gcc.dg/20020418-1.c: Likewise. + * gcc.dg/debug/dwarf2/const-2b.c: Likewise. + * gcc.dg/format/ms_unnamed-1.c: Likewise. + * gcc.dg/format/unnamed-1.c: Likewise. + Adapt dg-warning line number. + * gcc.dg/graphite/pr40281.c: Likewise. + * gcc.dg/pr32176.c: Likewise. + * gcc.dg/pr40550.c: Likewise. + * gcc.dg/prefetch-loop-arrays-1.c: Likewise. + * gcc.dg/torture/pr36891.c: Likewise. + * gcc.target/i386/20020218-1.c: Likewise. + * gcc.target/i386/20020523.c: Likewise. + * gcc.target/i386/abi-1.c: Likewise. + * gcc.target/i386/brokensqrt.c: Likewise. + * gcc.target/i386/fastcall-sseregparm.c: Likewise. + * gcc.target/i386/pr13366.c: Likewise. + * gcc.target/i386/pr13685.c: Likewise. + * gcc.target/i386/pr24306.c: Likewise. + * gcc.target/i386/pr31486.c: Likewise. + * gcc.target/i386/pr32065-1.c: Likewise. + * gcc.target/i386/pr32065-2.c: Likewise. + * gcc.target/i386/pr32389.c: Likewise. + * gcc.target/i386/pr38824.c: Likewise. + * gcc.target/i386/pr38931.c: Likewise. + * gcc.target/i386/pr39592-1.c: Likewise. + * gcc.target/i386/pr43766.c: Likewise. + * gcc.target/i386/recip-divf.c: Likewise. + * gcc.target/i386/recip-sqrtf.c: Likewise. + * gcc.target/i386/recip-vec-divf.c: Likewise. + * gcc.target/i386/recip-vec-sqrtf.c: Likewise. + * gcc.target/i386/sse-1.c: Likewise. + * gcc.target/i386/sse-16.c: Likewise. + * gcc.target/i386/sse-2.c: Likewise. + * gcc.target/i386/sse-20.c: Likewise. + * gcc.target/i386/sse-3.c: Likewise. + * gcc.target/i386/sse-7.c: Likewise. + * gcc.target/i386/sse-9.c: Likewise. + * gcc.target/i386/sse-addps-1.c: Likewise. + * gcc.target/i386/sse-addss-1.c: Likewise. + * gcc.target/i386/sse-andnps-1.c: Likewise. + * gcc.target/i386/sse-andps-1.c: Likewise. + * gcc.target/i386/sse-cmpss-1.c: Likewise. + * gcc.target/i386/sse-comiss-1.c: Likewise. + * gcc.target/i386/sse-comiss-2.c: Likewise. + * gcc.target/i386/sse-comiss-3.c: Likewise. + * gcc.target/i386/sse-comiss-4.c: Likewise. + * gcc.target/i386/sse-comiss-5.c: Likewise. + * gcc.target/i386/sse-comiss-6.c: Likewise. + * gcc.target/i386/sse-copysignf-vec.c: Likewise. + * gcc.target/i386/sse-cvtsi2ss-1.c: Likewise. + * gcc.target/i386/sse-cvtsi2ss-2.c: Likewise. + * gcc.target/i386/sse-cvtss2si-1.c: Likewise. + * gcc.target/i386/sse-cvtss2si-2.c: Likewise. + * gcc.target/i386/sse-cvttss2si-1.c: Likewise. + * gcc.target/i386/sse-cvttss2si-2.c: Likewise. + * gcc.target/i386/sse-divps-1.c: Likewise. + * gcc.target/i386/sse-divss-1.c: Likewise. + * gcc.target/i386/sse-init-v4hi-1.c: Likewise. + * gcc.target/i386/sse-init-v4sf-1.c: Likewise. + * gcc.target/i386/sse-maxps-1.c: Likewise. + * gcc.target/i386/sse-maxss-1.c: Likewise. + * gcc.target/i386/sse-minps-1.c: Likewise. + * gcc.target/i386/sse-minss-1.c: Likewise. + * gcc.target/i386/sse-movaps-1.c: Likewise. + * gcc.target/i386/sse-movaps-2.c: Likewise. + * gcc.target/i386/sse-movhlps-1.c: Likewise. + * gcc.target/i386/sse-movhps-1.c: Likewise. + * gcc.target/i386/sse-movhps-2.c: Likewise. + * gcc.target/i386/sse-movlhps-1.c: Likewise. + * gcc.target/i386/sse-movmskps-1.c: Likewise. + * gcc.target/i386/sse-movntps-1.c: Likewise. + * gcc.target/i386/sse-movss-1.c: Likewise. + * gcc.target/i386/sse-movss-2.c: Likewise. + * gcc.target/i386/sse-movss-3.c: Likewise. + * gcc.target/i386/sse-movups-1.c: Likewise. + * gcc.target/i386/sse-movups-2.c: Likewise. + * gcc.target/i386/sse-mulps-1.c: Likewise. + * gcc.target/i386/sse-mulss-1.c: Likewise. + * gcc.target/i386/sse-orps-1.c: Likewise. + * gcc.target/i386/sse-rcpps-1.c: Likewise. + * gcc.target/i386/sse-recip-vec.c: Likewise. + * gcc.target/i386/sse-recip.c: Likewise. + * gcc.target/i386/sse-rsqrtps-1.c: Likewise. + * gcc.target/i386/sse-set-ps-1.c: Likewise. + * gcc.target/i386/sse-sqrtps-1.c: Likewise. + * gcc.target/i386/sse-subps-1.c: Likewise. + * gcc.target/i386/sse-subss-1.c: Likewise. + * gcc.target/i386/sse-ucomiss-1.c: Likewise. + * gcc.target/i386/sse-ucomiss-2.c: Likewise. + * gcc.target/i386/sse-ucomiss-3.c: Likewise. + * gcc.target/i386/sse-ucomiss-4.c: Likewise. + * gcc.target/i386/sse-ucomiss-5.c: Likewise. + * gcc.target/i386/sse-ucomiss-6.c: Likewise. + * gcc.target/i386/sse-unpckhps-1.c: Likewise. + * gcc.target/i386/sse-unpcklps-1.c: Likewise. + * gcc.target/i386/sse-xorps-1.c: Likewise. + * gcc.target/i386/ssefn-1.c: Likewise. + * gcc.target/i386/ssefn-3.c: Likewise. + * gcc.target/i386/sseregparm-1.c: Likewise. + * gcc.target/i386/stackalign/return-3.c: Likewise. + * gcc.target/i386/vectorize1.c: Likewise. + * gcc.target/i386/vperm-v4sf-1.c: Likewise. + * gcc.target/i386/xorps-sse.c: Likewise. + * gfortran.dg/pr28158.f90: Likewise. + * gfortran.dg/pr30667.f: Likewise. + * gnat.dg/loop_optimization7.adb: Likewise. + * gnat.dg/sse_nolib.adb: Likewise. + 2010-07-11 Tobias Burnus PR fortran/44702 diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C b/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C index 593e080ac694..81360c2439fa 100644 --- a/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C +++ b/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C @@ -1,5 +1,6 @@ /* { dg-do compile { target i386*-*-* } } */ /* { dg-options "-O -gdwarf-2 -dA -msse" } */ +/* { dg-require-effective-target sse } */ /* { dg-final { scan-assembler "DW_AT_const_value" } } */ typedef float FloatVect __attribute__((__vector_size__(16))); diff --git a/gcc/testsuite/g++.dg/ext/vector14.C b/gcc/testsuite/g++.dg/ext/vector14.C index 78109c1a676f..8e792108fb86 100644 --- a/gcc/testsuite/g++.dg/ext/vector14.C +++ b/gcc/testsuite/g++.dg/ext/vector14.C @@ -1,6 +1,7 @@ // PR c++/35758 // { dg-do compile } -// { dg-options "-msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ +// { dg-options "-msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } +// { dg-require-effective-target sse } // Ignore warning on some powerpc-linux configurations. // { dg-prune-output "non-standard ABI extension" } // { dg-prune-output "mangled name" } diff --git a/gcc/testsuite/g++.dg/other/mmintrin.C b/gcc/testsuite/g++.dg/other/mmintrin.C index 417a1acc6de1..8315f93d355f 100644 --- a/gcc/testsuite/g++.dg/other/mmintrin.C +++ b/gcc/testsuite/g++.dg/other/mmintrin.C @@ -1,4 +1,5 @@ // { dg-do compile { target i?86-*-* x86_64-*-* } } // { dg-options "-msse" } +// { dg-require-effective-target sse } #include diff --git a/gcc/testsuite/gcc.dg/20020418-1.c b/gcc/testsuite/gcc.dg/20020418-1.c index 7314ec000ef2..285af2bc4859 100644 --- a/gcc/testsuite/gcc.dg/20020418-1.c +++ b/gcc/testsuite/gcc.dg/20020418-1.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-O2" } */ /* { dg-options "-O2 -msse -ffast-math" { target i?86-*-* x86_64-*-* } } */ +/* { dg-require-effective-target sse { target i?86-*-* x86_64-*-* } } */ void bar (float *a, float *b); diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/const-2b.c b/gcc/testsuite/gcc.dg/debug/dwarf2/const-2b.c index 9d577ea77718..6cbdc85b3d5d 100644 --- a/gcc/testsuite/gcc.dg/debug/dwarf2/const-2b.c +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/const-2b.c @@ -1,5 +1,6 @@ /* { dg-do compile { target i386*-*-* } } */ /* { dg-options "-O -gdwarf-2 -dA -msse" } */ +/* { dg-require-effective-target sse } */ /* { dg-final { scan-assembler "DW_AT_const_value" } } */ typedef float FloatVect __attribute__((__vector_size__(16))); diff --git a/gcc/testsuite/gcc.dg/format/ms_unnamed-1.c b/gcc/testsuite/gcc.dg/format/ms_unnamed-1.c index aa4f6cb5f3d5..4b837e50675c 100644 --- a/gcc/testsuite/gcc.dg/format/ms_unnamed-1.c +++ b/gcc/testsuite/gcc.dg/format/ms_unnamed-1.c @@ -3,6 +3,7 @@ /* { dg-do compile { target { *-*-mingw* } } } */ /* { dg-options "-Wformat" } */ /* { dg-options "-Wformat -msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ +/* { dg-require-effective-target sse { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ #define USE_SYSTEM_FORMATS #include "format.h" diff --git a/gcc/testsuite/gcc.dg/format/unnamed-1.c b/gcc/testsuite/gcc.dg/format/unnamed-1.c index 2d4f77cc3152..b3efdcbf68f7 100644 --- a/gcc/testsuite/gcc.dg/format/unnamed-1.c +++ b/gcc/testsuite/gcc.dg/format/unnamed-1.c @@ -3,6 +3,7 @@ /* { dg-do compile } */ /* { dg-options "-Wformat" } */ /* { dg-options "-Wformat -msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ +/* { dg-require-effective-target sse { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ #include "format.h" @@ -20,5 +21,5 @@ f (TItype x) { printf("%d", x); /* { dg-warning "expects type" } */ printf("%d", 141592653589793238462643383279502884197169399375105820974944); /* { dg-warning "expects type" } */ - /* { dg-warning "unsigned only|too large" "constant" { target *-*-* } 22 } */ + /* { dg-warning "unsigned only|too large" "constant" { target *-*-* } 23 } */ } diff --git a/gcc/testsuite/gcc.dg/graphite/pr40281.c b/gcc/testsuite/gcc.dg/graphite/pr40281.c index a09147a9fb04..437f3434e4b8 100644 --- a/gcc/testsuite/gcc.dg/graphite/pr40281.c +++ b/gcc/testsuite/gcc.dg/graphite/pr40281.c @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-options "-O -fprefetch-loop-arrays -w" } */ /* { dg-options "-O -fprefetch-loop-arrays -march=i686 -msse -w" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ +/* { dg-require-effective-target sse { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ void foo(int); void bar(int n) diff --git a/gcc/testsuite/gcc.dg/pr32176.c b/gcc/testsuite/gcc.dg/pr32176.c index 6646db04f4f5..e0e63a3f9622 100644 --- a/gcc/testsuite/gcc.dg/pr32176.c +++ b/gcc/testsuite/gcc.dg/pr32176.c @@ -3,6 +3,7 @@ /* { dg-do compile } */ /* { dg-options "-O2 -fprefetch-loop-arrays -w" } */ /* { dg-options "-O2 -fprefetch-loop-arrays -march=i686 -msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ +/* { dg-require-effective-target sse { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ void foo (void) { diff --git a/gcc/testsuite/gcc.dg/pr40550.c b/gcc/testsuite/gcc.dg/pr40550.c index 27935ab005a9..3dd11eb6c714 100644 --- a/gcc/testsuite/gcc.dg/pr40550.c +++ b/gcc/testsuite/gcc.dg/pr40550.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ +/* { dg-require-effective-target sse { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ #ifdef __i386__ #include "cpuid.h" diff --git a/gcc/testsuite/gcc.dg/prefetch-loop-arrays-1.c b/gcc/testsuite/gcc.dg/prefetch-loop-arrays-1.c index 59cebc52e967..6c6f0b367422 100644 --- a/gcc/testsuite/gcc.dg/prefetch-loop-arrays-1.c +++ b/gcc/testsuite/gcc.dg/prefetch-loop-arrays-1.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-options "-O2 -fprefetch-loop-arrays -w" } */ /* { dg-options "-O2 -fprefetch-loop-arrays -march=i686 -msse -w" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ +/* { dg-require-effective-target sse { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ __extension__ typedef __SIZE_TYPE__ size_t; diff --git a/gcc/testsuite/gcc.dg/torture/pr36891.c b/gcc/testsuite/gcc.dg/torture/pr36891.c index 31f7e1731420..53e6163de14a 100644 --- a/gcc/testsuite/gcc.dg/torture/pr36891.c +++ b/gcc/testsuite/gcc.dg/torture/pr36891.c @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-options "-ffast-math" } */ /* { dg-options "-ffast-math -msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ +/* { dg-require-effective-target sse { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ #define __vector __attribute__((vector_size(16) )) __vector float f(void); diff --git a/gcc/testsuite/gcc.dg/vect/tree-vect.h b/gcc/testsuite/gcc.dg/vect/tree-vect.h index 2f21c2b16735..ed59d7976b92 100644 --- a/gcc/testsuite/gcc.dg/vect/tree-vect.h +++ b/gcc/testsuite/gcc.dg/vect/tree-vect.h @@ -41,6 +41,11 @@ check_vect (void) want_level = 1, want_c = bit_SSSE3, want_d = 0; # else want_level = 1, want_c = 0, want_d = bit_SSE2; +# if defined(__sun__) && defined(__svr4__) + /* Before Solaris 9 4/04, trying to execute an SSE2 instruction gives + SIGILL even if the CPU can handle them. */ + asm volatile ("unpcklpd %xmm0,%xmm2"); +# endif # endif if (!__get_cpuid (want_level, &a, &b, &c, &d) diff --git a/gcc/testsuite/gcc.target/i386/20020218-1.c b/gcc/testsuite/gcc.target/i386/20020218-1.c index 13a835ed0877..cbba71421327 100644 --- a/gcc/testsuite/gcc.target/i386/20020218-1.c +++ b/gcc/testsuite/gcc.target/i386/20020218-1.c @@ -1,6 +1,7 @@ /* Verify that X86-64 only SSE registers aren't restored on IA-32. */ /* { dg-do compile } */ /* { dg-require-effective-target ilp32 } */ +/* { dg-require-effective-target sse } */ /* { dg-options "-O2 -msse" } */ /* { dg-final { scan-assembler-not "xmm8" } } */ diff --git a/gcc/testsuite/gcc.target/i386/20020523.c b/gcc/testsuite/gcc.target/i386/20020523.c index 7c3490f780b6..0684d5feb422 100644 --- a/gcc/testsuite/gcc.target/i386/20020523.c +++ b/gcc/testsuite/gcc.target/i386/20020523.c @@ -4,6 +4,7 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse -mfpmath=sse -ffast-math" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/abi-1.c b/gcc/testsuite/gcc.target/i386/abi-1.c index 62b80ef4062c..8a84ca140e16 100644 --- a/gcc/testsuite/gcc.target/i386/abi-1.c +++ b/gcc/testsuite/gcc.target/i386/abi-1.c @@ -1,6 +1,7 @@ /* Make certain that we pass V2DF in the correct register for SSE1. */ /* { dg-do compile } */ /* { dg-options "-O1 -msse -mno-sse2" } */ +/* { dg-require-effective-target sse } */ typedef double v2df __attribute__((vector_size (16))); v2df foo (void) { return (v2df){ 1.0, 2.0 }; } diff --git a/gcc/testsuite/gcc.target/i386/brokensqrt.c b/gcc/testsuite/gcc.target/i386/brokensqrt.c index 19a59d822e6c..836d3b37d4ca 100644 --- a/gcc/testsuite/gcc.target/i386/brokensqrt.c +++ b/gcc/testsuite/gcc.target/i386/brokensqrt.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -ffast-math -msse -mfpmath=sse -mrecip" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" extern float sqrtf (float); diff --git a/gcc/testsuite/gcc.target/i386/fastcall-sseregparm.c b/gcc/testsuite/gcc.target/i386/fastcall-sseregparm.c index bdfae5b3b7b6..1a55a3d60eb3 100644 --- a/gcc/testsuite/gcc.target/i386/fastcall-sseregparm.c +++ b/gcc/testsuite/gcc.target/i386/fastcall-sseregparm.c @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-mpreferred-stack-boundary=4 -msse" } */ /* { dg-require-effective-target ilp32 } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/math-torture/math-torture.exp b/gcc/testsuite/gcc.target/i386/math-torture/math-torture.exp index a0e7b8d1eaa0..2b1d63de17ad 100644 --- a/gcc/testsuite/gcc.target/i386/math-torture/math-torture.exp +++ b/gcc/testsuite/gcc.target/i386/math-torture/math-torture.exp @@ -28,19 +28,23 @@ if { ![istarget i?86*-*-*] && ![istarget x86_64-*-*] } then { set MATH_TORTURE_OPTIONS [list \ { -O0 } \ { -O0 -mfpmath=387 } \ - { -O0 -msse -mno-sse2 -mfpmath=sse } \ - { -O0 -msse -mno-sse2 -mfpmath=sse,387 } \ { -O0 -mfpmath=387 -ffast-math } \ - { -O0 -msse -mno-sse2 -mfpmath=sse -ffast-math } \ - { -O0 -msse -mno-sse2 -mfpmath=sse,387 -ffast-math } \ { -O2 } \ { -O2 -mfpmath=387 } \ + { -O2 -mfpmath=387 -ffast-math } \ +] + +if { [check_effective_target_sse] } { + lappend MATH_TORTURE_OPTIONS \ + { -O0 -msse -mno-sse2 -mfpmath=sse } \ + { -O0 -msse -mno-sse2 -mfpmath=sse,387 } \ + { -O0 -msse -mno-sse2 -mfpmath=sse -ffast-math } \ + { -O0 -msse -mno-sse2 -mfpmath=sse,387 -ffast-math } \ { -O2 -msse -mno-sse2 -mfpmath=sse } \ { -O2 -msse -mno-sse2 -mfpmath=sse,387 } \ - { -O2 -mfpmath=387 -ffast-math } \ { -O2 -msse -mno-sse2 -mfpmath=sse -ffast-math } \ { -O2 -msse -mno-sse2 -mfpmath=sse,387 -ffast-math } \ -] +} if { [check_effective_target_sse2] } { lappend MATH_TORTURE_OPTIONS \ diff --git a/gcc/testsuite/gcc.target/i386/pr13366.c b/gcc/testsuite/gcc.target/i386/pr13366.c index f0dce0b24020..569f1ad8e795 100644 --- a/gcc/testsuite/gcc.target/i386/pr13366.c +++ b/gcc/testsuite/gcc.target/i386/pr13366.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O -msse" } */ +/* { dg-require-effective-target sse } */ #include diff --git a/gcc/testsuite/gcc.target/i386/pr13685.c b/gcc/testsuite/gcc.target/i386/pr13685.c index 159112d16668..a50681bea268 100644 --- a/gcc/testsuite/gcc.target/i386/pr13685.c +++ b/gcc/testsuite/gcc.target/i386/pr13685.c @@ -1,6 +1,7 @@ /* PR target/13685 */ /* { dg-do run } */ /* { dg-options "-Os -msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/pr24306.c b/gcc/testsuite/gcc.target/i386/pr24306.c index c578475bbeaf..1319918c3501 100644 --- a/gcc/testsuite/gcc.target/i386/pr24306.c +++ b/gcc/testsuite/gcc.target/i386/pr24306.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/pr31486.c b/gcc/testsuite/gcc.target/i386/pr31486.c index 7082d3de98b6..d9f251f31702 100644 --- a/gcc/testsuite/gcc.target/i386/pr31486.c +++ b/gcc/testsuite/gcc.target/i386/pr31486.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-msse -mno-sse2" } */ +/* { dg-require-effective-target sse } */ typedef double __v2df __attribute__ ((vector_size (16))); diff --git a/gcc/testsuite/gcc.target/i386/pr32065-1.c b/gcc/testsuite/gcc.target/i386/pr32065-1.c index eefea27f16ae..951f252083bb 100644 --- a/gcc/testsuite/gcc.target/i386/pr32065-1.c +++ b/gcc/testsuite/gcc.target/i386/pr32065-1.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-require-effective-target dfp } */ +/* { dg-require-effective-target sse } */ /* { dg-options "-msse -std=gnu99" } */ _Decimal128 test (void) diff --git a/gcc/testsuite/gcc.target/i386/pr32065-2.c b/gcc/testsuite/gcc.target/i386/pr32065-2.c index e1a88592d3c1..5f055b59c3a0 100644 --- a/gcc/testsuite/gcc.target/i386/pr32065-2.c +++ b/gcc/testsuite/gcc.target/i386/pr32065-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target dfp } */ +/* { dg-require-effective-target sse } */ /* { dg-options "-Os -msse -std=gnu99" } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/pr32389.c b/gcc/testsuite/gcc.target/i386/pr32389.c index 24c27674ccab..511f0ca72923 100644 --- a/gcc/testsuite/gcc.target/i386/pr32389.c +++ b/gcc/testsuite/gcc.target/i386/pr32389.c @@ -2,6 +2,7 @@ /* { dg-do compile } */ /* { dg-require-effective-target ilp32 } */ +/* { dg-require-effective-target sse } */ /* { dg-options "-msse" } */ double f1(); diff --git a/gcc/testsuite/gcc.target/i386/pr38824.c b/gcc/testsuite/gcc.target/i386/pr38824.c index 637abfde888c..11102f29ee24 100644 --- a/gcc/testsuite/gcc.target/i386/pr38824.c +++ b/gcc/testsuite/gcc.target/i386/pr38824.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ typedef float v4sf __attribute__ ((__vector_size__ (16))); diff --git a/gcc/testsuite/gcc.target/i386/pr38931.c b/gcc/testsuite/gcc.target/i386/pr38931.c index dd35dec75205..96f9559686ee 100644 --- a/gcc/testsuite/gcc.target/i386/pr38931.c +++ b/gcc/testsuite/gcc.target/i386/pr38931.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ typedef int __m64 __attribute__ ((__vector_size__ (8))); diff --git a/gcc/testsuite/gcc.target/i386/pr39592-1.c b/gcc/testsuite/gcc.target/i386/pr39592-1.c index a7f37043bc51..65f3417854d2 100644 --- a/gcc/testsuite/gcc.target/i386/pr39592-1.c +++ b/gcc/testsuite/gcc.target/i386/pr39592-1.c @@ -2,6 +2,7 @@ 39592. */ /* { dg-do compile } */ /* { dg-options "-ansi -msse" } */ +/* { dg-require-effective-target sse } */ double foo (unsigned long var) diff --git a/gcc/testsuite/gcc.target/i386/pr43766.c b/gcc/testsuite/gcc.target/i386/pr43766.c index 731b780ba6d0..b9735a98b091 100644 --- a/gcc/testsuite/gcc.target/i386/pr43766.c +++ b/gcc/testsuite/gcc.target/i386/pr43766.c @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-options "-O2" } */ /* { dg-options "-O2 -msse -mregparm=3" { target ilp32 } } */ +/* { dg-require-effective-target sse } */ void p (int *a, int i) { diff --git a/gcc/testsuite/gcc.target/i386/recip-divf.c b/gcc/testsuite/gcc.target/i386/recip-divf.c index b4447d33ac56..5d2f1bedba92 100644 --- a/gcc/testsuite/gcc.target/i386/recip-divf.c +++ b/gcc/testsuite/gcc.target/i386/recip-divf.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -ffast-math -msse -mfpmath=sse -mrecip" } */ +/* { dg-require-effective-target sse } */ float t1(float a, float b) { diff --git a/gcc/testsuite/gcc.target/i386/recip-sqrtf.c b/gcc/testsuite/gcc.target/i386/recip-sqrtf.c index 859d2180a39a..a288cab17fe1 100644 --- a/gcc/testsuite/gcc.target/i386/recip-sqrtf.c +++ b/gcc/testsuite/gcc.target/i386/recip-sqrtf.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -ffast-math -msse -mfpmath=sse -mrecip" } */ +/* { dg-require-effective-target sse } */ extern float sqrtf (float); diff --git a/gcc/testsuite/gcc.target/i386/recip-vec-divf.c b/gcc/testsuite/gcc.target/i386/recip-vec-divf.c index 4bdbba79f342..5cce7a631ebf 100644 --- a/gcc/testsuite/gcc.target/i386/recip-vec-divf.c +++ b/gcc/testsuite/gcc.target/i386/recip-vec-divf.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -ffast-math -ftree-vectorize -msse -mfpmath=sse -mrecip" } */ +/* { dg-require-effective-target sse } */ float a[16]; float b[16]; diff --git a/gcc/testsuite/gcc.target/i386/recip-vec-sqrtf.c b/gcc/testsuite/gcc.target/i386/recip-vec-sqrtf.c index bcef700ec607..d70cb7058773 100644 --- a/gcc/testsuite/gcc.target/i386/recip-vec-sqrtf.c +++ b/gcc/testsuite/gcc.target/i386/recip-vec-sqrtf.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -ffast-math -ftree-vectorize -msse -mfpmath=sse -mrecip" } */ +/* { dg-require-effective-target sse } */ float a[16]; float b[16]; diff --git a/gcc/testsuite/gcc.target/i386/sol2-check.h b/gcc/testsuite/gcc.target/i386/sol2-check.h new file mode 100644 index 000000000000..25a915e17d13 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/sol2-check.h @@ -0,0 +1,48 @@ +#if defined(__sun__) && defined(__svr4__) +/* Make sure sigaction() is declared even with -std=c99. */ +#define __EXTENSIONS__ +#include +#include + +static volatile sig_atomic_t sigill_caught; + +static void +sigill_hdlr (int sig __attribute((unused)), + siginfo_t *sip __attribute__((unused)), + ucontext_t *ucp) +{ + sigill_caught = 1; + /* Set PC to the instruction after the faulting one to skip over it, + otherwise we enter an infinite loop. */ + ucp->uc_mcontext.gregs[EIP] += ILL_INSN_LEN; + setcontext (ucp); +} +#endif + +/* Solaris 2 before Solaris 9 4/04 cannot execute SSE/SSE2 instructions + even if the CPU supports them. Programs receive SIGILL instead, so + check for that at runtime. */ +static int +sol2_check (void) +{ +#if defined(__sun__) && defined(__svr4__) + struct sigaction act, oact; + + act.sa_handler = sigill_hdlr; + sigemptyset (&act.sa_mask); + /* Need to set SA_SIGINFO so a ucontext_t * is passed to the handler. */ + act.sa_flags = SA_SIGINFO; + sigaction (SIGILL, &act, &oact); + + ILL_INSN; + + sigaction (SIGILL, &oact, NULL); + + if (sigill_caught) + exit (0); + else + return 1; +#else + return 1; +#endif /* __sun__ && __svr4__ */ +} diff --git a/gcc/testsuite/gcc.target/i386/sse-1.c b/gcc/testsuite/gcc.target/i386/sse-1.c index afae22d37054..c313a1f23074 100644 --- a/gcc/testsuite/gcc.target/i386/sse-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-1.c @@ -1,6 +1,7 @@ /* PR 12902 */ /* { dg-do compile } */ /* { dg-options "-O1 -msse" } */ +/* { dg-require-effective-target sse } */ #include diff --git a/gcc/testsuite/gcc.target/i386/sse-16.c b/gcc/testsuite/gcc.target/i386/sse-16.c index e429630cbfb9..c07df665d4ca 100644 --- a/gcc/testsuite/gcc.target/i386/sse-16.c +++ b/gcc/testsuite/gcc.target/i386/sse-16.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O0 -msse" } */ +/* { dg-require-effective-target sse } */ typedef float __vr __attribute__ ((vector_size (16))); diff --git a/gcc/testsuite/gcc.target/i386/sse-2.c b/gcc/testsuite/gcc.target/i386/sse-2.c index cbaa5e6a30d9..4dbc886c3d0f 100644 --- a/gcc/testsuite/gcc.target/i386/sse-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-2.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O3 -msse" } */ +/* { dg-require-effective-target sse } */ #include static const __m128 v_sign = {-.0f, -.0f, -.0f, -.0f}; static const __m128 v_half = {0.5f, 0.5f, 0.5f, 0.5f}; diff --git a/gcc/testsuite/gcc.target/i386/sse-20.c b/gcc/testsuite/gcc.target/i386/sse-20.c index 5aa8f7a28129..fc0744f25543 100644 --- a/gcc/testsuite/gcc.target/i386/sse-20.c +++ b/gcc/testsuite/gcc.target/i386/sse-20.c @@ -1,5 +1,6 @@ /* PR target/13685 */ /* { dg-options "-Os -msse" } */ +/* { dg-require-effective-target sse } */ typedef float __m128 __attribute__ ((vector_size (16))); typedef int __m64 __attribute__ ((vector_size (8))); diff --git a/gcc/testsuite/gcc.target/i386/sse-3.c b/gcc/testsuite/gcc.target/i386/sse-3.c index 338b7c60ba75..1be1d1aa223d 100644 --- a/gcc/testsuite/gcc.target/i386/sse-3.c +++ b/gcc/testsuite/gcc.target/i386/sse-3.c @@ -1,6 +1,7 @@ /* PR target/21149 */ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-7.c b/gcc/testsuite/gcc.target/i386/sse-7.c index 12b88ca53f3c..30e2c13ba045 100644 --- a/gcc/testsuite/gcc.target/i386/sse-7.c +++ b/gcc/testsuite/gcc.target/i386/sse-7.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-9.c b/gcc/testsuite/gcc.target/i386/sse-9.c index 0106cb52f63f..e1a0a2270cb0 100644 --- a/gcc/testsuite/gcc.target/i386/sse-9.c +++ b/gcc/testsuite/gcc.target/i386/sse-9.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-addps-1.c b/gcc/testsuite/gcc.target/i386/sse-addps-1.c index 2aa1cfa411ad..b280667b5d03 100644 --- a/gcc/testsuite/gcc.target/i386/sse-addps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-addps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-addss-1.c b/gcc/testsuite/gcc.target/i386/sse-addss-1.c index 911a6cd91921..43aa2d53efd7 100644 --- a/gcc/testsuite/gcc.target/i386/sse-addss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-addss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-andnps-1.c b/gcc/testsuite/gcc.target/i386/sse-andnps-1.c index 06d1e07dd40d..eeeec020a7d4 100644 --- a/gcc/testsuite/gcc.target/i386/sse-andnps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-andnps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-andps-1.c b/gcc/testsuite/gcc.target/i386/sse-andps-1.c index aa46b8a28b71..6094dba7d345 100644 --- a/gcc/testsuite/gcc.target/i386/sse-andps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-andps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-check.h b/gcc/testsuite/gcc.target/i386/sse-check.h index 85629cc71b95..d6c92a35a447 100644 --- a/gcc/testsuite/gcc.target/i386/sse-check.h +++ b/gcc/testsuite/gcc.target/i386/sse-check.h @@ -1,9 +1,14 @@ -#include #include #include "m128-check.h" #include "cpuid.h" +/* We need a single SSE instruction here so the handler can safely skip + over it. */ +#define ILL_INSN __asm__ volatile ("movss %xmm2,%xmm1") +#define ILL_INSN_LEN 4 +#include "sol2-check.h" + static void sse_test (void); static void @@ -22,7 +27,7 @@ main () return 0; /* Run SSE test only if host has SSE support. */ - if (edx & bit_SSE) + if ((edx & bit_SSE) && sol2_check ()) do_test (); return 0; diff --git a/gcc/testsuite/gcc.target/i386/sse-cmpss-1.c b/gcc/testsuite/gcc.target/i386/sse-cmpss-1.c index e4be7318e068..2c9e9fe697c3 100644 --- a/gcc/testsuite/gcc.target/i386/sse-cmpss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-cmpss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse -std=c99" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-comiss-1.c b/gcc/testsuite/gcc.target/i386/sse-comiss-1.c index 2892a70a67ba..ff623aa8bed0 100644 --- a/gcc/testsuite/gcc.target/i386/sse-comiss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-comiss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-comiss-2.c b/gcc/testsuite/gcc.target/i386/sse-comiss-2.c index 63b6d6d113fd..d674bed002b2 100644 --- a/gcc/testsuite/gcc.target/i386/sse-comiss-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-comiss-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-comiss-3.c b/gcc/testsuite/gcc.target/i386/sse-comiss-3.c index 75ac4e4faaf7..d2301ad8e512 100644 --- a/gcc/testsuite/gcc.target/i386/sse-comiss-3.c +++ b/gcc/testsuite/gcc.target/i386/sse-comiss-3.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-comiss-4.c b/gcc/testsuite/gcc.target/i386/sse-comiss-4.c index ceeeca79472f..7f372e249b96 100644 --- a/gcc/testsuite/gcc.target/i386/sse-comiss-4.c +++ b/gcc/testsuite/gcc.target/i386/sse-comiss-4.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-comiss-5.c b/gcc/testsuite/gcc.target/i386/sse-comiss-5.c index 8f503512ffae..104fdd701f73 100644 --- a/gcc/testsuite/gcc.target/i386/sse-comiss-5.c +++ b/gcc/testsuite/gcc.target/i386/sse-comiss-5.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-comiss-6.c b/gcc/testsuite/gcc.target/i386/sse-comiss-6.c index 38df9b8e47b0..8229b7d55d77 100644 --- a/gcc/testsuite/gcc.target/i386/sse-comiss-6.c +++ b/gcc/testsuite/gcc.target/i386/sse-comiss-6.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-copysignf-vec.c b/gcc/testsuite/gcc.target/i386/sse-copysignf-vec.c index 9342e2c7187e..bd85889503d3 100644 --- a/gcc/testsuite/gcc.target/i386/sse-copysignf-vec.c +++ b/gcc/testsuite/gcc.target/i386/sse-copysignf-vec.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -ftree-vectorize -msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-1.c b/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-1.c index e5435b6b7336..740227feef46 100644 --- a/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-2.c b/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-2.c index aa74e11ec552..6abc4d5afeda 100644 --- a/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target sse } */ /* { dg-options "-O2 -msse" } */ #ifndef CHECK_H diff --git a/gcc/testsuite/gcc.target/i386/sse-cvtss2si-1.c b/gcc/testsuite/gcc.target/i386/sse-cvtss2si-1.c index 5740626659a8..3f8c549c9622 100644 --- a/gcc/testsuite/gcc.target/i386/sse-cvtss2si-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-cvtss2si-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-cvtss2si-2.c b/gcc/testsuite/gcc.target/i386/sse-cvtss2si-2.c index e136b7198a09..44a5fafc31b9 100644 --- a/gcc/testsuite/gcc.target/i386/sse-cvtss2si-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-cvtss2si-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target sse } */ /* { dg-options "-O2 -msse" } */ #ifndef CHECK_H diff --git a/gcc/testsuite/gcc.target/i386/sse-cvttss2si-1.c b/gcc/testsuite/gcc.target/i386/sse-cvttss2si-1.c index 8edc197eafdf..667806d970f6 100644 --- a/gcc/testsuite/gcc.target/i386/sse-cvttss2si-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-cvttss2si-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-cvttss2si-2.c b/gcc/testsuite/gcc.target/i386/sse-cvttss2si-2.c index 94e831e782f8..eb85223450dc 100644 --- a/gcc/testsuite/gcc.target/i386/sse-cvttss2si-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-cvttss2si-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target sse } */ /* { dg-options "-O2 -msse" } */ #ifndef CHECK_H diff --git a/gcc/testsuite/gcc.target/i386/sse-divps-1.c b/gcc/testsuite/gcc.target/i386/sse-divps-1.c index d4d441aeb1f0..321bb5ac7c62 100644 --- a/gcc/testsuite/gcc.target/i386/sse-divps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-divps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-divss-1.c b/gcc/testsuite/gcc.target/i386/sse-divss-1.c index e7449496e0a2..1427e4f1a447 100644 --- a/gcc/testsuite/gcc.target/i386/sse-divss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-divss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-init-v4hi-1.c b/gcc/testsuite/gcc.target/i386/sse-init-v4hi-1.c index 5c2547727098..f25131547881 100644 --- a/gcc/testsuite/gcc.target/i386/sse-init-v4hi-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-init-v4hi-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-init-v4sf-1.c b/gcc/testsuite/gcc.target/i386/sse-init-v4sf-1.c index 4cb1f337e2ac..eea03ecadea3 100644 --- a/gcc/testsuite/gcc.target/i386/sse-init-v4sf-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-init-v4sf-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-maxps-1.c b/gcc/testsuite/gcc.target/i386/sse-maxps-1.c index 5e6fcd654ef3..9a82f665a4be 100644 --- a/gcc/testsuite/gcc.target/i386/sse-maxps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-maxps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-maxss-1.c b/gcc/testsuite/gcc.target/i386/sse-maxss-1.c index 5b5215a5772d..7b88dfce7105 100644 --- a/gcc/testsuite/gcc.target/i386/sse-maxss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-maxss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-minps-1.c b/gcc/testsuite/gcc.target/i386/sse-minps-1.c index a41139f8b96e..452df8318aba 100644 --- a/gcc/testsuite/gcc.target/i386/sse-minps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-minps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-minss-1.c b/gcc/testsuite/gcc.target/i386/sse-minss-1.c index 9280b07052d4..b7288f859157 100644 --- a/gcc/testsuite/gcc.target/i386/sse-minss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-minss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movaps-1.c b/gcc/testsuite/gcc.target/i386/sse-movaps-1.c index 3677ac442881..ed3562ba53a6 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movaps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-movaps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movaps-2.c b/gcc/testsuite/gcc.target/i386/sse-movaps-2.c index 46b971a9d9c1..fcfa80bebbc9 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movaps-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-movaps-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movhlps-1.c b/gcc/testsuite/gcc.target/i386/sse-movhlps-1.c index 7023bf95d1e7..4d7b3edc2ace 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movhlps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-movhlps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movhps-1.c b/gcc/testsuite/gcc.target/i386/sse-movhps-1.c index 9f28927a8811..44b885927015 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movhps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-movhps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movhps-2.c b/gcc/testsuite/gcc.target/i386/sse-movhps-2.c index 023937b6633d..11ab383977c3 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movhps-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-movhps-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movlhps-1.c b/gcc/testsuite/gcc.target/i386/sse-movlhps-1.c index aba9a9aa413e..4ce3edf59e74 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movlhps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-movlhps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movmskps-1.c b/gcc/testsuite/gcc.target/i386/sse-movmskps-1.c index f1f0d7ed5a4b..8557a30214bd 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movmskps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-movmskps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movntps-1.c b/gcc/testsuite/gcc.target/i386/sse-movntps-1.c index 8c45da31dde1..067f29616e14 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movntps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-movntps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movss-1.c b/gcc/testsuite/gcc.target/i386/sse-movss-1.c index eccdf5af907b..ee53d5faf113 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-movss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movss-2.c b/gcc/testsuite/gcc.target/i386/sse-movss-2.c index f64fa4db6986..638666594c90 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movss-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-movss-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movss-3.c b/gcc/testsuite/gcc.target/i386/sse-movss-3.c index 1212622b7ead..a090aada7f51 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movss-3.c +++ b/gcc/testsuite/gcc.target/i386/sse-movss-3.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movups-1.c b/gcc/testsuite/gcc.target/i386/sse-movups-1.c index 222da79d9406..7ea9122897af 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movups-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-movups-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movups-2.c b/gcc/testsuite/gcc.target/i386/sse-movups-2.c index 41657239c322..188967a2a378 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movups-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-movups-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-mulps-1.c b/gcc/testsuite/gcc.target/i386/sse-mulps-1.c index a07b5abf6102..de66a28e142f 100644 --- a/gcc/testsuite/gcc.target/i386/sse-mulps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-mulps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-mulss-1.c b/gcc/testsuite/gcc.target/i386/sse-mulss-1.c index 7b45063508d2..99161a811a14 100644 --- a/gcc/testsuite/gcc.target/i386/sse-mulss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-mulss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-orps-1.c b/gcc/testsuite/gcc.target/i386/sse-orps-1.c index 6c8dac5cc5c6..605603726c09 100644 --- a/gcc/testsuite/gcc.target/i386/sse-orps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-orps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-rcpps-1.c b/gcc/testsuite/gcc.target/i386/sse-rcpps-1.c index 7a1a8fa7370f..4d0783515e6c 100644 --- a/gcc/testsuite/gcc.target/i386/sse-rcpps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-rcpps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-recip-vec.c b/gcc/testsuite/gcc.target/i386/sse-recip-vec.c index 202351dc987f..bb1e458f92db 100644 --- a/gcc/testsuite/gcc.target/i386/sse-recip-vec.c +++ b/gcc/testsuite/gcc.target/i386/sse-recip-vec.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -ffast-math -ftree-vectorize -msse -mfpmath=sse -mrecip" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-recip.c b/gcc/testsuite/gcc.target/i386/sse-recip.c index d88eb7f007ba..4f7d3bf3d549 100644 --- a/gcc/testsuite/gcc.target/i386/sse-recip.c +++ b/gcc/testsuite/gcc.target/i386/sse-recip.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -ffast-math -msse -mfpmath=sse -mrecip" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-rsqrtps-1.c b/gcc/testsuite/gcc.target/i386/sse-rsqrtps-1.c index 4052c21f0103..c2db72549577 100644 --- a/gcc/testsuite/gcc.target/i386/sse-rsqrtps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-rsqrtps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-set-ps-1.c b/gcc/testsuite/gcc.target/i386/sse-set-ps-1.c index 8232c7229c5c..5a0c9b95d662 100644 --- a/gcc/testsuite/gcc.target/i386/sse-set-ps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-set-ps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-sqrtps-1.c b/gcc/testsuite/gcc.target/i386/sse-sqrtps-1.c index 9f0658d0e27f..1dbd260e515a 100644 --- a/gcc/testsuite/gcc.target/i386/sse-sqrtps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-sqrtps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-subps-1.c b/gcc/testsuite/gcc.target/i386/sse-subps-1.c index 2e7e8d50231b..e63e4784a111 100644 --- a/gcc/testsuite/gcc.target/i386/sse-subps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-subps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-subss-1.c b/gcc/testsuite/gcc.target/i386/sse-subss-1.c index 5b3ef26bd9f6..5d9a5f504f99 100644 --- a/gcc/testsuite/gcc.target/i386/sse-subss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-subss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-ucomiss-1.c b/gcc/testsuite/gcc.target/i386/sse-ucomiss-1.c index b38b1fd424a0..4d72b01873ec 100644 --- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-ucomiss-2.c b/gcc/testsuite/gcc.target/i386/sse-ucomiss-2.c index e0212a4e3dfa..dc4ba8045b39 100644 --- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-ucomiss-3.c b/gcc/testsuite/gcc.target/i386/sse-ucomiss-3.c index dc728fb503ba..042898bf6d2b 100644 --- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-3.c +++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-3.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-ucomiss-4.c b/gcc/testsuite/gcc.target/i386/sse-ucomiss-4.c index 3251c0b8fb03..a3f32bb3576b 100644 --- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-4.c +++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-4.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-ucomiss-5.c b/gcc/testsuite/gcc.target/i386/sse-ucomiss-5.c index ad34f01d9791..821dd772640c 100644 --- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-5.c +++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-5.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-ucomiss-6.c b/gcc/testsuite/gcc.target/i386/sse-ucomiss-6.c index b9b2f4b28926..602a923a0a55 100644 --- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-6.c +++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-6.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-unpckhps-1.c b/gcc/testsuite/gcc.target/i386/sse-unpckhps-1.c index be4ab3659cbe..005924b5b6c9 100644 --- a/gcc/testsuite/gcc.target/i386/sse-unpckhps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-unpckhps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-unpcklps-1.c b/gcc/testsuite/gcc.target/i386/sse-unpcklps-1.c index 5a5da2064a1b..456ef201bcaf 100644 --- a/gcc/testsuite/gcc.target/i386/sse-unpcklps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-unpcklps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-xorps-1.c b/gcc/testsuite/gcc.target/i386/sse-xorps-1.c index 6f96e6910643..8ec500838ae6 100644 --- a/gcc/testsuite/gcc.target/i386/sse-xorps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-xorps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse2-check.h b/gcc/testsuite/gcc.target/i386/sse2-check.h index e9f17f04079e..7e91192f8c3a 100644 --- a/gcc/testsuite/gcc.target/i386/sse2-check.h +++ b/gcc/testsuite/gcc.target/i386/sse2-check.h @@ -2,6 +2,12 @@ #include "cpuid.h" #include "m128-check.h" +/* We need a single SSE2 instruction here so the handler can safely skip + over it. */ +#define ILL_INSN __asm__ volatile ("unpcklpd %xmm0,%xmm2") +#define ILL_INSN_LEN 4 +#include "sol2-check.h" + static void sse2_test (void); static void @@ -20,7 +26,7 @@ main () return 0; /* Run SSE2 test only if host has SSE2 support. */ - if (edx & bit_SSE2) + if ((edx & bit_SSE2) && sol2_check ()) do_test (); return 0; diff --git a/gcc/testsuite/gcc.target/i386/sse3-check.h b/gcc/testsuite/gcc.target/i386/sse3-check.h index df0e63a45750..c7b1896cf12d 100644 --- a/gcc/testsuite/gcc.target/i386/sse3-check.h +++ b/gcc/testsuite/gcc.target/i386/sse3-check.h @@ -3,6 +3,12 @@ #include "cpuid.h" +/* We need a single SSE3 instruction here so the handler can safely skip + over it. */ +#define ILL_INSN __asm__ volatile ("movddup %xmm1,%xmm2") +#define ILL_INSN_LEN 4 +#include "sol2-check.h" + static void sse3_test (void); static void @@ -21,7 +27,7 @@ main () return 0; /* Run SSE3 test only if host has SSE3 support. */ - if (ecx & bit_SSE3) + if ((ecx & bit_SSE3) && sol2_check ()) do_test (); return 0; diff --git a/gcc/testsuite/gcc.target/i386/ssefn-1.c b/gcc/testsuite/gcc.target/i386/ssefn-1.c index bea6cb2bf0be..37bbf6f5eac9 100644 --- a/gcc/testsuite/gcc.target/i386/ssefn-1.c +++ b/gcc/testsuite/gcc.target/i386/ssefn-1.c @@ -3,6 +3,7 @@ /* { dg-do compile } */ /* { dg-require-effective-target ilp32 } */ +/* { dg-require-effective-target sse } */ /* { dg-final { scan-assembler "movss" } } */ /* { dg-final { scan-assembler "mulss" } } */ /* { dg-final { scan-assembler-not "movsd" } } */ diff --git a/gcc/testsuite/gcc.target/i386/ssefn-3.c b/gcc/testsuite/gcc.target/i386/ssefn-3.c index adf72cce18aa..b96b21179dc8 100644 --- a/gcc/testsuite/gcc.target/i386/ssefn-3.c +++ b/gcc/testsuite/gcc.target/i386/ssefn-3.c @@ -3,6 +3,7 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse -mfpmath=sse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sseregparm-1.c b/gcc/testsuite/gcc.target/i386/sseregparm-1.c index 9d426b84276b..946a24d210fd 100644 --- a/gcc/testsuite/gcc.target/i386/sseregparm-1.c +++ b/gcc/testsuite/gcc.target/i386/sseregparm-1.c @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse" } */ /* { dg-require-effective-target ilp32 } */ +/* { dg-require-effective-target sse } */ float essef(float) __attribute__((sseregparm)); double essed(double) __attribute__((sseregparm)); diff --git a/gcc/testsuite/gcc.target/i386/stackalign/return-3.c b/gcc/testsuite/gcc.target/i386/stackalign/return-3.c index 87210d817a8e..dd2c2e8b452c 100644 --- a/gcc/testsuite/gcc.target/i386/stackalign/return-3.c +++ b/gcc/testsuite/gcc.target/i386/stackalign/return-3.c @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-skip-if "" { ! { ilp32 && dfp } } { "*" } { "" } } */ /* { dg-options "-msse -std=gnu99 -mpreferred-stack-boundary=2" } */ +/* { dg-require-effective-target sse } */ /* This compile only test is to detect an assertion failure in stack branch development. */ diff --git a/gcc/testsuite/gcc.target/i386/vectorize1.c b/gcc/testsuite/gcc.target/i386/vectorize1.c index 7a5023aa9058..f673e44c9639 100644 --- a/gcc/testsuite/gcc.target/i386/vectorize1.c +++ b/gcc/testsuite/gcc.target/i386/vectorize1.c @@ -1,5 +1,6 @@ /* PR middle-end/28915 */ /* { dg-options "-msse -O2 -ftree-vectorize -fdump-tree-vect" } */ +/* { dg-require-effective-target sse } */ extern char lanip[3][40]; typedef struct diff --git a/gcc/testsuite/gcc.target/i386/xorps-sse.c b/gcc/testsuite/gcc.target/i386/xorps-sse.c index e9c0a2e7395f..ab43ab713a33 100644 --- a/gcc/testsuite/gcc.target/i386/xorps-sse.c +++ b/gcc/testsuite/gcc.target/i386/xorps-sse.c @@ -1,6 +1,7 @@ /* Test that we generate xorps instruction when pxor is not available. */ /* { dg-do compile } */ /* { dg-options "-O -msse -mno-sse2" } */ +/* { dg-require-effective-target sse } */ /* { dg-final { scan-assembler "xorps\[ \t\]" } } */ #define vector __attribute__ ((vector_size (16))) diff --git a/gcc/testsuite/gfortran.dg/pr28158.f90 b/gcc/testsuite/gfortran.dg/pr28158.f90 index 4556ecd76edd..d1cb9a43546b 100644 --- a/gcc/testsuite/gfortran.dg/pr28158.f90 +++ b/gcc/testsuite/gfortran.dg/pr28158.f90 @@ -1,6 +1,7 @@ ! { dg-do compile { target i?86-*-* x86_64-*-* } } ! { dg-require-effective-target ilp32 } ! { dg-options "-O -msse -mfpmath=sse" } +! { dg-require-effective-target sse } subroutine yhalf(z) complex cdexpj,z z=cdexpj((0.d0,1.d0)*z) diff --git a/gcc/testsuite/gfortran.dg/pr30667.f b/gcc/testsuite/gfortran.dg/pr30667.f index 0f1af29d1f95..99e536b42b5b 100644 --- a/gcc/testsuite/gfortran.dg/pr30667.f +++ b/gcc/testsuite/gfortran.dg/pr30667.f @@ -1,6 +1,7 @@ ! { dg-do compile { target i?86-*-* x86_64-*-* } } ! { dg-require-effective-target ilp32 } ! { dg-options "-O2 -msse -ftree-vectorize" } +! { dg-require-effective-target sse } subroutine cblank_cvb(a,ndim) character*(*) a character*1 blank diff --git a/gcc/testsuite/gnat.dg/loop_optimization7.adb b/gcc/testsuite/gnat.dg/loop_optimization7.adb index 166839494658..c6a5dc98900d 100644 --- a/gcc/testsuite/gnat.dg/loop_optimization7.adb +++ b/gcc/testsuite/gnat.dg/loop_optimization7.adb @@ -1,6 +1,7 @@ -- { dg-do compile } -- { dg-options "-O3" } -- { dg-options "-O3 -msse" { target i?86-*-* x86_64-*-* } } +-- { dg-require-effective-target sse } package body Loop_Optimization7 is diff --git a/gcc/testsuite/gnat.dg/sse_nolib.adb b/gcc/testsuite/gnat.dg/sse_nolib.adb index b024a216e941..d678b9a868b2 100644 --- a/gcc/testsuite/gnat.dg/sse_nolib.adb +++ b/gcc/testsuite/gnat.dg/sse_nolib.adb @@ -1,5 +1,6 @@ -- { dg-do run { target i?86-*-* x86_64-*-* } } -- { dg-options "-O1 -msse" } +-- { dg-require-effective-target sse } with Ada.Unchecked_Conversion; diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index 798a27d73dc0..bb28a7707480 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -3261,6 +3261,17 @@ proc check_effective_target_avx { } { } "-O2 -mavx" ] } +# Return 1 if sse instructions can be compiled. +proc check_effective_target_sse { } { + return [check_no_compiler_messages sse object { + int main () + { + __builtin_ia32_stmxcsr (); + return 0; + } + } "-O2 -msse" ] +} + # Return 1 if sse2 instructions can be compiled. proc check_effective_target_sse2 { } { return [check_no_compiler_messages sse2 object { diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 943e8e1db516..0a69beba5904 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,12 @@ +2010-07-12 Rainer Orth + + * config/fpu-387.h [__sun__ && __svr4__] Include , + . + (sigill_caught): New. + (sigill_hdlr): New function + (has_sse) [__sun__ && __svr4__]: Check if SSE instruction causes + SIGILL. + 2010-07-11 Kai Tietz PR libfortran/44698 diff --git a/libgfortran/config/fpu-387.h b/libgfortran/config/fpu-387.h index 573fabcac6de..5fe51b2d2095 100644 --- a/libgfortran/config/fpu-387.h +++ b/libgfortran/config/fpu-387.h @@ -1,5 +1,5 @@ /* FPU-related code for x86 and x86_64 processors. - Copyright 2005, 2007, 2009 Free Software Foundation, Inc. + Copyright 2005, 2007, 2009, 2010 Free Software Foundation, Inc. Contributed by Francois-Xavier Coudert This file is part of the GNU Fortran 95 runtime library (libgfortran). @@ -27,6 +27,26 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "cpuid.h" #endif +#if defined(__sun__) && defined(__svr4__) +#include +#include + +static volatile sig_atomic_t sigill_caught; + +static void +sigill_hdlr (int sig __attribute((unused)), + siginfo_t *sip __attribute__((unused)), + ucontext_t *ucp) +{ + sigill_caught = 1; + /* Set PC to the instruction after the faulting one to skip over it, + otherwise we enter an infinite loop. 4 is the size of the stmxcsr + instruction. */ + ucp->uc_mcontext.gregs[EIP] += 4; + setcontext (ucp); +} +#endif + static int has_sse (void) { @@ -36,6 +56,31 @@ has_sse (void) if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) return 0; +#if defined(__sun__) && defined(__svr4__) + /* Solaris 2 before Solaris 9 4/04 cannot execute SSE instructions even + if the CPU supports them. Programs receive SIGILL instead, so check + for that at runtime. */ + + if (edx & bit_SSE) + { + struct sigaction act, oact; + unsigned int cw_sse; + + act.sa_handler = sigill_hdlr; + sigemptyset (&act.sa_mask); + /* Need to set SA_SIGINFO so a ucontext_t * is passed to the handler. */ + act.sa_flags = SA_SIGINFO; + sigaction (SIGILL, &act, &oact); + + asm volatile ("stmxcsr %0" : "=m" (cw_sse)); + + sigaction (SIGILL, &oact, NULL); + + if (sigill_caught) + return 0; + } +#endif /* __sun__ && __svr4__ */ + return edx & bit_SSE; #else return 1;