Patchwork [v8] Vectorized _cpp_clean_line

login
register
mail settings
Submitter Richard Henderson
Date Aug. 23, 2010, 5:31 p.m.
Message ID <4C72B05C.4050401@redhat.com>
Download mbox | patch
Permalink /patch/62500/
State New
Headers show

Comments

Richard Henderson - Aug. 23, 2010, 5:31 p.m.
On 08/23/2010 10:22 AM, Richard Henderson wrote:
> On 08/23/2010 10:07 AM, Joseph S. Myers wrote:
>> On Mon, 23 Aug 2010, Richard Henderson wrote:
>>
>>> +case $target in
>>> +  i.86-* | x86_64-*)
>>
>> I think you mean i?86, not i.86.
> 
> Whoops, yes.

... and looking at the linux log files after the build compileted
showed that the test program failed there.  The "$0" in the assembler
managed to get shell-expanded.

Here's a new version with both problems fixed.


r~
Gerald Pfeifer - Aug. 24, 2010, 6:47 p.m.
On Mon, 23 Aug 2010, Richard Henderson wrote:
>> Whoops, yes.
> ... and looking at the linux log files after the build compileted
> showed that the test program failed there.  The "$0" in the assembler
> managed to get shell-expanded.
> 
> Here's a new version with both problems fixed.

Thanks, Richard!  Bootstrap on i386-unknown-freebsd7.3 is now
passing again.
 
(The testsuite is running, but that's going to take a while.)

Gerald
Andrew Pinski - Aug. 24, 2010, 7:13 p.m.
On Mon, Aug 23, 2010 at 10:31 AM, Richard Henderson <rth@redhat.com> wrote:
>> Whoops, yes.
>
> ... and looking at the linux log files after the build compileted
> showed that the test program failed there.  The "$0" in the assembler
> managed to get shell-expanded.
>
> Here's a new version with both problems fixed.

Note this issue was recorded as PR 45376.

Thanks,
Andrew Pinski

Patch

diff --git a/libcpp/config.in b/libcpp/config.in
index 95606c1..29d4501 100644
--- a/libcpp/config.in
+++ b/libcpp/config.in
@@ -185,6 +185,9 @@ 
 /* Define to 1 if you have the `putc_unlocked' function. */
 #undef HAVE_PUTC_UNLOCKED
 
+/* Define to 1 if you can assemble SSE4 insns. */
+#undef HAVE_SSE4
+
 /* Define to 1 if you have the <stddef.h> header file. */
 #undef HAVE_STDDEF_H
 
diff --git a/libcpp/configure b/libcpp/configure
index a2ce1c3..012ee41 100755
--- a/libcpp/configure
+++ b/libcpp/configure
@@ -7209,6 +7209,27 @@  cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
+case $target in
+  i?86-* | x86_64-*)
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+asm ("pcmpestri %0, %%xmm0, %%xmm1" : : "i"(0))
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+$as_echo "#define HAVE_SSE4 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+esac
+
 # Output.
 
 ac_config_headers="$ac_config_headers config.h:config.in"
diff --git a/libcpp/configure.ac b/libcpp/configure.ac
index 1250f49..8082117 100644
--- a/libcpp/configure.ac
+++ b/libcpp/configure.ac
@@ -184,6 +184,13 @@  AC_DEFINE_UNQUOTED(HOST_WIDE_INT, $host_wide_int,
 [Define to the widest efficient host integer type at least
    as wide as the target's size_t type.])
 
+case $target in
+  i?86-* | x86_64-*)
+    AC_TRY_COMPILE([], [asm ("pcmpestri %0, %%xmm0, %%xmm1" : : "i"(0))],
+      [AC_DEFINE([HAVE_SSE4], [1],
+		 [Define to 1 if you can assemble SSE4 insns.])])
+esac
+
 # Output.
 
 AC_CONFIG_HEADERS(config.h:config.in, [echo timestamp > stamp-h1])
diff --git a/libcpp/lex.c b/libcpp/lex.c
index bc0086d..147ed96 100644
--- a/libcpp/lex.c
+++ b/libcpp/lex.c
@@ -400,6 +400,7 @@  search_line_sse2 (const uchar *s, const uchar *end ATTRIBUTE_UNUSED)
   return (const uchar *)p + found;
 }
 
+#ifdef HAVE_SSE4
 /* A version of the fast scanner using SSE 4.2 vectorized string insns.  */
 
 static const uchar *
@@ -454,6 +455,11 @@  search_line_sse42 (const uchar *s, const uchar *end)
   return s + index;
 }
 
+#else
+/* Work around out-dated assemblers without sse4 support.  */
+#define search_line_sse42 search_line_sse2
+#endif
+
 /* Check the CPU capabilities.  */
 
 #include "../gcc/config/i386/cpuid.h"