diff -r 748345bc6714 gcc/config.gcc
--- a/gcc/config.gcc	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/config.gcc	Fri Jul 09 12:16:17 2010 +0200
@@ -1253,13 +1253,10 @@
 	# 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 -r 748345bc6714 gcc/doc/install.texi
--- a/gcc/doc/install.texi	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/doc/install.texi	Fri Jul 09 12:16:17 2010 +0200
@@ -2898,6 +2898,8 @@
 @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}
@@ -3473,6 +3475,26 @@
 @html
 <hr />
 @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
+<hr />
+@end html
 @heading @anchor{ix86-x-solaris210}i?86-*-solaris2.10
 Use this for Solaris 10 or later on x86 and x86-64 systems.  This
 configuration is supported by GCC 4.0 and later versions only.  Unlike
diff -r 748345bc6714 gcc/doc/sourcebuild.texi
--- a/gcc/doc/sourcebuild.texi	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/doc/sourcebuild.texi	Fri Jul 09 12:16:17 2010 +0200
@@ -1604,9 +1604,18 @@
 @item hard_float
 Target supports FPU instructions.
 
+@item sse
+Target supports compiling @code{sse} instructions.
+
+@item sse_runtime
+Target supports the execution of @code{sse} instructions.
+
 @item sse2
 Target supports compiling @code{sse2} instructions.
 
+@item sse2_runtime
+Target supports the execution of @code{sse2} instructions.
+
 @item sync_char_short
 Target supports atomic operations on @code{char} and @code{short}.
 
diff -r 748345bc6714 gcc/testsuite/g++.dg/debug/dwarf2/const2b.C
--- a/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/g++.dg/ext/vector14.C
--- a/gcc/testsuite/g++.dg/ext/vector14.C	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/g++.dg/ext/vector14.C	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/g++.dg/other/i386-1.C
--- a/gcc/testsuite/g++.dg/other/i386-1.C	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/g++.dg/other/i386-1.C	Fri Jul 09 12:16:17 2010 +0200
@@ -1,6 +1,7 @@
 /* { dg-do run { target i?86-*-* x86_64-*-* } } */
 /* { dg-options "-msse2" } */
 /* { dg-require-effective-target sse2 } */
+/* { dg-require-effective-target sse2_runtime } */
 
 #include <xmmintrin.h>
 
diff -r 748345bc6714 gcc/testsuite/g++.dg/other/mmintrin.C
--- a/gcc/testsuite/g++.dg/other/mmintrin.C	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/g++.dg/other/mmintrin.C	Fri Jul 09 12:16:17 2010 +0200
@@ -1,4 +1,5 @@
 // { dg-do compile { target i?86-*-* x86_64-*-* } }
 // { dg-options "-msse" }
+// { dg-require-effective-target sse }
 
 #include <xmmintrin.h>
diff -r 748345bc6714 gcc/testsuite/g++.dg/other/pr40446.C
--- a/gcc/testsuite/g++.dg/other/pr40446.C	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/g++.dg/other/pr40446.C	Fri Jul 09 12:16:17 2010 +0200
@@ -2,6 +2,7 @@
 // { dg-do run { target i?86-*-* x86_64-*-* } }
 // { dg-options "-O1 -msse2" }
 // { dg-require-effective-target sse2 }
+// { dg-require-effective-target sse2_runtime }
 
 #include <emmintrin.h>
 #include "cpuid.h"
diff -r 748345bc6714 gcc/testsuite/gcc.dg/20020418-1.c
--- a/gcc/testsuite/gcc.dg/20020418-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/20020418-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.dg/compat/union-m128-1_main.c
--- a/gcc/testsuite/gcc.dg/compat/union-m128-1_main.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/compat/union-m128-1_main.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,6 +1,7 @@
 /* { dg-skip-if "test SSE2 support" { ! { i?86-*-* x86_64-*-* } } } */
 /* { dg-options "-O" } */
 /* { dg-require-effective-target sse2 } */
+/* { dg-require-effective-target sse2_runtime } */
 
 #include "cpuid.h"
 
diff -r 748345bc6714 gcc/testsuite/gcc.dg/compat/vector-1a_main.c
--- a/gcc/testsuite/gcc.dg/compat/vector-1a_main.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/compat/vector-1a_main.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,5 +1,6 @@
 /* { dg-skip-if "test SSE2 vector" { ! { i?86-*-* x86_64-*-* } } } */
 /* { dg-require-effective-target sse2 } */
+/* { dg-require-effective-target sse2_runtime } */
 
 /* Test compatibility of vector types: layout between separately-compiled
    modules, parameter passing, and function return.  This test uses
diff -r 748345bc6714 gcc/testsuite/gcc.dg/compat/vector-2a_main.c
--- a/gcc/testsuite/gcc.dg/compat/vector-2a_main.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/compat/vector-2a_main.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,5 +1,6 @@
 /* { dg-skip-if "test SSE2 support" { ! { i?86-*-* x86_64-*-* } } } */
 /* { dg-require-effective-target sse2 } */
+/* { dg-require-effective-target sse2_runtime } */
 
 /* Test compatibility of vector types: layout between separately-compiled
    modules, parameter passing, and function return.  This test uses
diff -r 748345bc6714 gcc/testsuite/gcc.dg/debug/dwarf2/const-2b.c
--- a/gcc/testsuite/gcc.dg/debug/dwarf2/const-2b.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/debug/dwarf2/const-2b.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.dg/format/ms_unnamed-1.c
--- a/gcc/testsuite/gcc.dg/format/ms_unnamed-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/format/ms_unnamed-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.dg/format/unnamed-1.c
--- a/gcc/testsuite/gcc.dg/format/unnamed-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/format/unnamed-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 @@
 {
   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 -r 748345bc6714 gcc/testsuite/gcc.dg/graphite/pr40281.c
--- a/gcc/testsuite/gcc.dg/graphite/pr40281.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/graphite/pr40281.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.dg/pr32176.c
--- a/gcc/testsuite/gcc.dg/pr32176.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/pr32176.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.dg/pr36584.c
--- a/gcc/testsuite/gcc.dg/pr36584.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/pr36584.c	Fri Jul 09 12:16:17 2010 +0200
@@ -2,6 +2,7 @@
 /* { dg-options "-O2 -lm" } */
 /* { dg-options "-O2 -msse2 -mfpmath=sse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
 /* { dg-require-effective-target sse2 { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
+/* { dg-require-effective-target sse2_runtime { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
 
 #ifdef __i386__
 #include "cpuid.h"
diff -r 748345bc6714 gcc/testsuite/gcc.dg/pr37544.c
--- a/gcc/testsuite/gcc.dg/pr37544.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/pr37544.c	Fri Jul 09 12:16:17 2010 +0200
@@ -2,6 +2,7 @@
 /* { dg-options "-O2" } */
 /* { dg-options "-O2 -msse2 -mtune=core2 -mfpmath=387" { target { i?86-*-* x86_64-*-* } } } */
 /* { dg-require-effective-target sse2 { target { i?86-*-* x86_64-*-* } } } */
+/* { dg-require-effective-target sse2_runtime { target { i?86-*-* x86_64-*-* } } } */
 
 #ifdef __i386__
 #include "cpuid.h"
diff -r 748345bc6714 gcc/testsuite/gcc.dg/pr40550.c
--- a/gcc/testsuite/gcc.dg/pr40550.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/pr40550.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.dg/prefetch-loop-arrays-1.c
--- a/gcc/testsuite/gcc.dg/prefetch-loop-arrays-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/prefetch-loop-arrays-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.dg/torture/pr16104-1.c
--- a/gcc/testsuite/gcc.dg/torture/pr16104-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/torture/pr16104-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -2,6 +2,7 @@
 /* { dg-do run { target i?86-*-* x86_64-*-* } } */
 /* { dg-options "-msse2" } */
 /* { dg-require-effective-target sse2 } */
+/* { dg-require-effective-target sse2_runtime } */
 
 #include "cpuid.h"
 
diff -r 748345bc6714 gcc/testsuite/gcc.dg/torture/pr35771-1.c
--- a/gcc/testsuite/gcc.dg/torture/pr35771-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/torture/pr35771-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,6 +1,7 @@
 /* { dg-do run { target i?86-*-* x86_64-*-* } } */
 /* { dg-options "-msse2" } */
 /* { dg-require-effective-target sse2 } */
+/* { dg-require-effective-target sse2_runtime } */
 
 typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));
 
diff -r 748345bc6714 gcc/testsuite/gcc.dg/torture/pr35771-2.c
--- a/gcc/testsuite/gcc.dg/torture/pr35771-2.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/torture/pr35771-2.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,6 +1,7 @@
 /* { dg-do run { target i?86-*-* x86_64-*-* } } */
 /* { dg-options "-msse2" } */
 /* { dg-require-effective-target sse2 } */
+/* { dg-require-effective-target sse2_runtime } */
 
 typedef double __m128d __attribute__ ((__vector_size__ (16), __may_alias__));
 
diff -r 748345bc6714 gcc/testsuite/gcc.dg/torture/pr35771-3.c
--- a/gcc/testsuite/gcc.dg/torture/pr35771-3.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/torture/pr35771-3.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,6 +1,7 @@
 /* { dg-do run { target i?86-*-* x86_64-*-* } } */
 /* { dg-options "-msse2" } */
 /* { dg-require-effective-target sse2 } */
+/* { dg-require-effective-target sse2_runtime } */
 
 typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));
 
diff -r 748345bc6714 gcc/testsuite/gcc.dg/torture/pr36891.c
--- a/gcc/testsuite/gcc.dg/torture/pr36891.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/torture/pr36891.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.dg/torture/stackalign/alloca-2.c
--- a/gcc/testsuite/gcc.dg/torture/stackalign/alloca-2.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/torture/stackalign/alloca-2.c	Fri Jul 09 12:16:17 2010 +0200
@@ -2,6 +2,7 @@
 /* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
 /* { dg-options "-msse2" } */
 /* { dg-require-effective-target sse2 } */
+/* { dg-require-effective-target sse2_runtime } */
 
 #include <emmintrin.h>
 #include "cpuid.h"
diff -r 748345bc6714 gcc/testsuite/gcc.dg/torture/stackalign/alloca-3.c
--- a/gcc/testsuite/gcc.dg/torture/stackalign/alloca-3.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/torture/stackalign/alloca-3.c	Fri Jul 09 12:16:17 2010 +0200
@@ -2,6 +2,7 @@
 /* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
 /* { dg-options "-msse2" } */
 /* { dg-require-effective-target sse2 } */
+/* { dg-require-effective-target sse2_runtime } */
 
 #include <emmintrin.h>
 #include "cpuid.h"
diff -r 748345bc6714 gcc/testsuite/gcc.dg/torture/stackalign/push-1.c
--- a/gcc/testsuite/gcc.dg/torture/stackalign/push-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/torture/stackalign/push-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -2,6 +2,7 @@
 /* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
 /* { dg-options "-msse2 -mpreferred-stack-boundary=2" } */
 /* { dg-require-effective-target sse2 } */
+/* { dg-require-effective-target sse2_runtime } */
 
 #include <emmintrin.h>
 #include "cpuid.h"
diff -r 748345bc6714 gcc/testsuite/gcc.dg/torture/stackalign/vararg-3.c
--- a/gcc/testsuite/gcc.dg/torture/stackalign/vararg-3.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/torture/stackalign/vararg-3.c	Fri Jul 09 12:16:17 2010 +0200
@@ -2,6 +2,7 @@
 /* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
 /* { dg-options "-msse2" } */
 /* { dg-require-effective-target sse2 } */
+/* { dg-require-effective-target sse2_runtime } */
 
 #include <stdarg.h>
 #include <emmintrin.h>
diff -r 748345bc6714 gcc/testsuite/gcc.dg/vect/tree-vect.h
--- a/gcc/testsuite/gcc.dg/vect/tree-vect.h	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.dg/vect/tree-vect.h	Fri Jul 09 12:16:17 2010 +0200
@@ -41,6 +41,11 @@
     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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/20020218-1.c
--- a/gcc/testsuite/gcc.target/i386/20020218-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/20020218-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/20020523.c
--- a/gcc/testsuite/gcc.target/i386/20020523.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/20020523.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/abi-1.c
--- a/gcc/testsuite/gcc.target/i386/abi-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/abi-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/brokensqrt.c
--- a/gcc/testsuite/gcc.target/i386/brokensqrt.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/brokensqrt.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/fastcall-sseregparm.c
--- a/gcc/testsuite/gcc.target/i386/fastcall-sseregparm.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/fastcall-sseregparm.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/math-torture/math-torture.exp
--- a/gcc/testsuite/gcc.target/i386/math-torture/math-torture.exp	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/math-torture/math-torture.exp	Fri Jul 09 12:16:17 2010 +0200
@@ -28,19 +28,23 @@
 set MATH_TORTURE_OPTIONS [list \
         { -O0 } \
         { -O0 -mfpmath=387 } \
+        { -O0 -mfpmath=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 -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 -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/pr13366.c
--- a/gcc/testsuite/gcc.target/i386/pr13366.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/pr13366.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O -msse" } */
+/* { dg-require-effective-target sse } */
 
 #include <xmmintrin.h>
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/pr13685.c
--- a/gcc/testsuite/gcc.target/i386/pr13685.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/pr13685.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,6 +1,7 @@
 /* PR target/13685 */
 /* { dg-do run } */
 /* { dg-options "-Os -msse" } */
+/* { dg-require-effective-target sse } */
 
 #include "sse-check.h"
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/pr24306.c
--- a/gcc/testsuite/gcc.target/i386/pr24306.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/pr24306.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,5 +1,6 @@
 /* { dg-do run } */
 /* { dg-options "-msse" } */
+/* { dg-require-effective-target sse } */
 
 #include "sse-check.h"
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/pr31486.c
--- a/gcc/testsuite/gcc.target/i386/pr31486.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/pr31486.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/pr32065-1.c
--- a/gcc/testsuite/gcc.target/i386/pr32065-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/pr32065-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/pr32065-2.c
--- a/gcc/testsuite/gcc.target/i386/pr32065-2.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/pr32065-2.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/pr32389.c
--- a/gcc/testsuite/gcc.target/i386/pr32389.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/pr32389.c	Fri Jul 09 12:16:17 2010 +0200
@@ -2,6 +2,7 @@
 
 /* { dg-do compile } */
 /* { dg-require-effective-target ilp32 } */
+/* { dg-require-effective-target sse } */
 /* { dg-options "-msse" } */
 
 double f1();
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/pr38824.c
--- a/gcc/testsuite/gcc.target/i386/pr38824.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/pr38824.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -msse" } */
+/* { dg-require-effective-target sse } */
 
 typedef float v4sf __attribute__ ((__vector_size__ (16)));
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/pr38931.c
--- a/gcc/testsuite/gcc.target/i386/pr38931.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/pr38931.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -msse" } */
+/* { dg-require-effective-target sse } */
 
 typedef int __m64 __attribute__ ((__vector_size__ (8)));
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/pr39315-2.c
--- a/gcc/testsuite/gcc.target/i386/pr39315-2.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/pr39315-2.c	Fri Jul 09 12:16:17 2010 +0200
@@ -2,6 +2,7 @@
 /* { dg-do run } */
 /* { dg-options "-O -msse2 -mtune=generic" } */
 /* { dg-require-effective-target sse2 } */
+/* { dg-require-effective-target sse2_runtime } */
 /* { dg-additional-sources pr39315-check.c } */
 
 typedef float __m128 __attribute__ ((__vector_size__ (16)));
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/pr39315-4.c
--- a/gcc/testsuite/gcc.target/i386/pr39315-4.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/pr39315-4.c	Fri Jul 09 12:16:17 2010 +0200
@@ -2,6 +2,7 @@
 /* { dg-do run } */
 /* { dg-options "-O -msse2 -mtune=generic" } */
 /* { dg-require-effective-target sse2 } */
+/* { dg-require-effective-target sse2_runtime } */
 /* { dg-additional-sources pr39315-check.c } */
 
 typedef float __m128 __attribute__ ((__vector_size__ (16)));
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/pr39592-1.c
--- a/gcc/testsuite/gcc.target/i386/pr39592-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/pr39592-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -2,6 +2,7 @@
    39592.  */
 /* { dg-do compile } */
 /* { dg-options "-ansi -msse" } */
+/* { dg-require-effective-target sse } */
 
 double
 foo (unsigned long var)
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/pr43766.c
--- a/gcc/testsuite/gcc.target/i386/pr43766.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/pr43766.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/recip-divf.c
--- a/gcc/testsuite/gcc.target/i386/recip-divf.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/recip-divf.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/recip-sqrtf.c
--- a/gcc/testsuite/gcc.target/i386/recip-sqrtf.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/recip-sqrtf.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/recip-vec-divf.c
--- a/gcc/testsuite/gcc.target/i386/recip-vec-divf.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/recip-vec-divf.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/recip-vec-sqrtf.c
--- a/gcc/testsuite/gcc.target/i386/recip-vec-sqrtf.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/recip-vec-sqrtf.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sol2-check.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gcc/testsuite/gcc.target/i386/sol2-check.h	Fri Jul 09 12:16:17 2010 +0200
@@ -0,0 +1,48 @@
+#if defined(__sun__) && defined(__svr4__)
+/* Make sure sigaction() is declared even with -std=c99.  */
+#define __EXTENSIONS__
+#include <signal.h>
+#include <ucontext.h>
+
+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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,6 +1,7 @@
 /* PR 12902 */
 /* { dg-do compile } */
 /* { dg-options "-O1 -msse" } */
+/* { dg-require-effective-target sse } */
 
 #include <xmmintrin.h>
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-16.c
--- a/gcc/testsuite/gcc.target/i386/sse-16.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-16.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O0 -msse" } */
+/* { dg-require-effective-target sse } */
 
 typedef float __vr __attribute__ ((vector_size (16)));
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-2.c
--- a/gcc/testsuite/gcc.target/i386/sse-2.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-2.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O3 -msse" } */
+/* { dg-require-effective-target sse } */
 #include <xmmintrin.h>
 static const __m128 v_sign = {-.0f, -.0f, -.0f, -.0f};
 static const __m128 v_half = {0.5f, 0.5f, 0.5f, 0.5f};
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-20.c
--- a/gcc/testsuite/gcc.target/i386/sse-20.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-20.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-3.c
--- a/gcc/testsuite/gcc.target/i386/sse-3.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-3.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,6 +1,7 @@
 /* PR target/21149 */
 /* { dg-do run } */
 /* { dg-options "-O2 -msse" } */
+/* { dg-require-effective-target sse } */
 
 #include "sse-check.h"
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-7.c
--- a/gcc/testsuite/gcc.target/i386/sse-7.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-7.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,5 +1,6 @@
 /* { dg-do run } */
 /* { dg-options "-O2 -msse" } */
+/* { dg-require-effective-target sse } */
 
 #include "sse-check.h"
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-9.c
--- a/gcc/testsuite/gcc.target/i386/sse-9.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-9.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,5 +1,6 @@
 /* { dg-do run } */
 /* { dg-options "-O2 -msse" } */
+/* { dg-require-effective-target sse } */
 
 #include "sse-check.h"
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-addps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-addps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-addps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-addss-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-addss-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-addss-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-andnps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-andnps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-andnps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-andps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-andps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-andps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-check.h
--- a/gcc/testsuite/gcc.target/i386/sse-check.h	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-check.h	Fri Jul 09 12:16:17 2010 +0200
@@ -1,9 +1,14 @@
-#include <stdio.h>
 #include <stdlib.h>
 #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 @@
     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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-cmpss-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-cmpss-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-cmpss-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-comiss-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-comiss-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-comiss-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-comiss-2.c
--- a/gcc/testsuite/gcc.target/i386/sse-comiss-2.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-comiss-2.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-comiss-3.c
--- a/gcc/testsuite/gcc.target/i386/sse-comiss-3.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-comiss-3.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-comiss-4.c
--- a/gcc/testsuite/gcc.target/i386/sse-comiss-4.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-comiss-4.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-comiss-5.c
--- a/gcc/testsuite/gcc.target/i386/sse-comiss-5.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-comiss-5.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-comiss-6.c
--- a/gcc/testsuite/gcc.target/i386/sse-comiss-6.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-comiss-6.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-copysignf-vec.c
--- a/gcc/testsuite/gcc.target/i386/sse-copysignf-vec.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-copysignf-vec.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,5 +1,6 @@
 /* { dg-do run } */
 /* { dg-options "-O2 -ftree-vectorize -msse" } */
+/* { dg-require-effective-target sse } */
 
 #include "sse-check.h"
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-2.c
--- a/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-2.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-2.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-cvtss2si-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-cvtss2si-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-cvtss2si-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-cvtss2si-2.c
--- a/gcc/testsuite/gcc.target/i386/sse-cvtss2si-2.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-cvtss2si-2.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-cvttss2si-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-cvttss2si-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-cvttss2si-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-cvttss2si-2.c
--- a/gcc/testsuite/gcc.target/i386/sse-cvttss2si-2.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-cvttss2si-2.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-divps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-divps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-divps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-divss-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-divss-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-divss-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-init-v4hi-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-init-v4hi-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-init-v4hi-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,5 +1,6 @@
 /* { dg-do run } */
 /* { dg-options "-O2 -msse" } */
+/* { dg-require-effective-target sse } */
 
 #include "sse-check.h"
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-init-v4sf-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-init-v4sf-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-init-v4sf-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,5 +1,6 @@
 /* { dg-do run } */
 /* { dg-options "-O2 -msse" } */
+/* { dg-require-effective-target sse } */
 
 #include "sse-check.h"
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-maxps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-maxps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-maxps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-maxss-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-maxss-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-maxss-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-minps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-minps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-minps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-minss-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-minss-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-minss-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-movaps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-movaps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-movaps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-movaps-2.c
--- a/gcc/testsuite/gcc.target/i386/sse-movaps-2.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-movaps-2.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-movhlps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-movhlps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-movhlps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-movhps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-movhps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-movhps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-movhps-2.c
--- a/gcc/testsuite/gcc.target/i386/sse-movhps-2.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-movhps-2.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-movlhps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-movlhps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-movlhps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-movmskps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-movmskps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-movmskps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-movntps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-movntps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-movntps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-movss-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-movss-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-movss-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-movss-2.c
--- a/gcc/testsuite/gcc.target/i386/sse-movss-2.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-movss-2.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-movss-3.c
--- a/gcc/testsuite/gcc.target/i386/sse-movss-3.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-movss-3.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-movups-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-movups-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-movups-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-movups-2.c
--- a/gcc/testsuite/gcc.target/i386/sse-movups-2.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-movups-2.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-mulps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-mulps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-mulps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-mulss-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-mulss-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-mulss-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-orps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-orps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-orps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-rcpps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-rcpps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-rcpps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-recip-vec.c
--- a/gcc/testsuite/gcc.target/i386/sse-recip-vec.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-recip-vec.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-recip.c
--- a/gcc/testsuite/gcc.target/i386/sse-recip.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-recip.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-rsqrtps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-rsqrtps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-rsqrtps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-set-ps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-set-ps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-set-ps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,5 +1,6 @@
 /* { dg-do run } */
 /* { dg-options "-O2 -msse" } */
+/* { dg-require-effective-target sse } */
 
 #include "sse-check.h"
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-sqrtps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-sqrtps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-sqrtps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-subps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-subps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-subps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-subss-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-subss-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-subss-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-ucomiss-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-ucomiss-2.c
--- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-2.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-2.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-ucomiss-3.c
--- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-3.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-3.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-ucomiss-4.c
--- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-4.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-4.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-ucomiss-5.c
--- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-5.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-5.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-ucomiss-6.c
--- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-6.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-6.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-unpckhps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-unpckhps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-unpckhps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-unpcklps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-unpcklps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-unpcklps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse-xorps-1.c
--- a/gcc/testsuite/gcc.target/i386/sse-xorps-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse-xorps-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse2-check.h
--- a/gcc/testsuite/gcc.target/i386/sse2-check.h	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse2-check.h	Fri Jul 09 12:16:17 2010 +0200
@@ -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 @@
     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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/sse3-check.h
--- a/gcc/testsuite/gcc.target/i386/sse3-check.h	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sse3-check.h	Fri Jul 09 12:16:17 2010 +0200
@@ -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 @@
     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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/ssefn-1.c
--- a/gcc/testsuite/gcc.target/i386/ssefn-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/ssefn-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/ssefn-3.c
--- a/gcc/testsuite/gcc.target/i386/ssefn-3.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/ssefn-3.c	Fri Jul 09 12:16:17 2010 +0200
@@ -3,6 +3,7 @@
 
 /* { dg-do run } */
 /* { dg-options "-O2 -msse -mfpmath=sse" } */
+/* { dg-require-effective-target sse } */
 
 #include "sse-check.h"
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/sseregparm-1.c
--- a/gcc/testsuite/gcc.target/i386/sseregparm-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/sseregparm-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/stackalign/return-3.c
--- a/gcc/testsuite/gcc.target/i386/stackalign/return-3.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/stackalign/return-3.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/vectorize1.c
--- a/gcc/testsuite/gcc.target/i386/vectorize1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/vectorize1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gcc.target/i386/vperm-v2df.c
--- a/gcc/testsuite/gcc.target/i386/vperm-v2df.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/vperm-v2df.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,6 +1,7 @@
 /* { dg-do run } */
 /* { dg-options "-O -msse2" } */
 /* { dg-require-effective-target sse2 } */
+/* { dg-require-effective-target sse2_runtime } */
 
 #include "isa-check.h"
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/vperm-v2di.c
--- a/gcc/testsuite/gcc.target/i386/vperm-v2di.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/vperm-v2di.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,6 +1,7 @@
 /* { dg-do run } */
 /* { dg-options "-O -msse2" } */
 /* { dg-require-effective-target sse2 } */
+/* { dg-require-effective-target sse2_runtime } */
 
 #include "isa-check.h"
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/vperm-v4sf-1.c
--- a/gcc/testsuite/gcc.target/i386/vperm-v4sf-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/vperm-v4sf-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,5 +1,7 @@
 /* { dg-do run } */
 /* { dg-options "-O -msse" } */
+/* { dg-require-effective-target sse } */
+/* { dg-require-effective-target sse_runtime } */
 
 #include "isa-check.h"
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/vperm-v4si-1.c
--- a/gcc/testsuite/gcc.target/i386/vperm-v4si-1.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/vperm-v4si-1.c	Fri Jul 09 12:16:17 2010 +0200
@@ -1,6 +1,7 @@
 /* { dg-do run } */
 /* { dg-options "-O -msse2" } */
 /* { dg-require-effective-target sse2 } */
+/* { dg-require-effective-target sse2_runtime } */
 
 #include "isa-check.h"
 
diff -r 748345bc6714 gcc/testsuite/gcc.target/i386/xorps-sse.c
--- a/gcc/testsuite/gcc.target/i386/xorps-sse.c	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gcc.target/i386/xorps-sse.c	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gfortran.dg/pr28158.f90
--- a/gcc/testsuite/gfortran.dg/pr28158.f90	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gfortran.dg/pr28158.f90	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gfortran.dg/pr30667.f
--- a/gcc/testsuite/gfortran.dg/pr30667.f	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gfortran.dg/pr30667.f	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gfortran.dg/vect/vect.exp
--- a/gcc/testsuite/gfortran.dg/vect/vect.exp	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gfortran.dg/vect/vect.exp	Fri Jul 09 12:16:17 2010 +0200
@@ -68,7 +68,8 @@
 } elseif { [istarget  "spu-*-*"] } {
    set dg-do-what-default run
 } elseif { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } {
-    if { ![check_effective_target_sse2] } then {
+    if { ![check_effective_target_sse2]
+	 || ![check_effective_target_sse2_runtime]} then {
 	return
     }
     lappend DEFAULT_VECTCFLAGS "-msse2"
diff -r 748345bc6714 gcc/testsuite/gnat.dg/loop_optimization7.adb
--- a/gcc/testsuite/gnat.dg/loop_optimization7.adb	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gnat.dg/loop_optimization7.adb	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/gnat.dg/sse_nolib.adb
--- a/gcc/testsuite/gnat.dg/sse_nolib.adb	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/gnat.dg/sse_nolib.adb	Fri Jul 09 12:16:17 2010 +0200
@@ -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 -r 748345bc6714 gcc/testsuite/lib/fortran-torture.exp
--- a/gcc/testsuite/lib/fortran-torture.exp	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/lib/fortran-torture.exp	Fri Jul 09 12:16:17 2010 +0200
@@ -46,7 +46,8 @@
 	set test_tree_vectorize 1
     } elseif { ( [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] )
 	       && [check_effective_target_sse2]
-	       && [check_sse2_hw_available] } {
+	       && [check_sse2_hw_available]
+	       && [check_effective_target_sse2_runtime] } {
 	lappend vectorizer_options "-msse2"
 	set test_tree_vectorize 1
     } elseif { [istarget "mips*-*-*"]
diff -r 748345bc6714 gcc/testsuite/lib/target-supports.exp
--- a/gcc/testsuite/lib/target-supports.exp	Fri Jul 09 12:08:21 2010 +0200
+++ b/gcc/testsuite/lib/target-supports.exp	Fri Jul 09 12:16:17 2010 +0200
@@ -910,6 +910,42 @@
     }]
 }
 
+# Return 1 if the target supports running SSE executables, 0 otherwise.
+
+proc check_effective_target_sse_runtime { } {
+    # The Solaris 2 kernel doesn't save and restore SSE registers before
+    # Solaris 9 4/04.  Before that, executables die with SIGILL.
+    if { [istarget i?86-*-solaris2*] } {
+	check_runtime sse_execute {
+	    int main ()
+	    {
+		__asm__ volatile ("movss %xmm2,%xmm1");
+		return 0;
+	    }
+	} "-msse"
+    } else {
+	return 1
+    }
+}
+
+# Return 1 if the target supports running SSE2 executables, 0 otherwise.
+
+proc check_effective_target_sse2_runtime { } {
+    # The Solaris 2 kernel doesn't save and restore SSE2 registers before
+    # Solaris 9 4/04.  Before that, executables die with SIGILL.
+    if { [istarget i?86-*-solaris2*] } {
+	check_runtime sse2_execute {
+	    int main ()
+	    {
+		__asm__ volatile ("unpcklpd %xmm0,%xmm2");
+		return 0;
+	    }
+	} "-msse2"
+    } else {
+	return 1
+    }
+}
+
 # Return 1 if the target supports executing SSE2 instructions, 0
 # otherwise.  Cache the result.
 
@@ -3261,6 +3297,17 @@
     } "-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 -r 748345bc6714 libgfortran/config/fpu-387.h
--- a/libgfortran/config/fpu-387.h	Fri Jul 09 12:08:21 2010 +0200
+++ b/libgfortran/config/fpu-387.h	Fri Jul 09 12:16:17 2010 +0200
@@ -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 <coudert@clipper.ens.fr>
 
 This file is part of the GNU Fortran 95 runtime library (libgfortran).
@@ -27,6 +27,26 @@
 #include "cpuid.h"
 #endif
 
+#if defined(__sun__) && defined(__svr4__)
+#include <signal.h>
+#include <ucontext.h>
+
+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 @@
   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;
