Hello!

Following the patch that allows unaligned operands in pcmpestri [1],
we can substitute x86 asm in lex.c with equivalent builtin functions.

2011-06-18  Uros Bizjak  <ubiz...@gmail.com>

        * lex.c (search_line_sse42): Use __builtin_ia32_loaddqu and
        __builtin_ia32_pcmpestri128 instead of asm.

Bootstrapped and regression tested on x86_64-pc-linux-gnu SSE4.2
target. Also, I have checked that the same code is generated for
changed function.

OK for mainline?

[1] http://gcc.gnu.org/ml/gcc-patches/2012-06/msg01189.html

Uros.
Index: lex.c
===================================================================
--- lex.c       (revision 188750)
+++ lex.c       (working copy)
@@ -420,6 +420,7 @@ search_line_sse42 (const uchar *s, const uchar *en
 {
   typedef char v16qi __attribute__ ((__vector_size__ (16)));
   static const v16qi search = { '\n', '\r', '?', '\\' };
+  v16qi sv;
 
   uintptr_t si = (uintptr_t)s;
   uintptr_t index;
@@ -439,8 +440,9 @@ search_line_sse42 (const uchar *s, const uchar *en
 
       /* ??? The builtin doesn't understand that the PCMPESTRI read from
         memory need not be aligned.  */
-      __asm ("%vpcmpestri $0, (%1), %2"
-            : "=c"(index) : "r"(s), "x"(search), "a"(4), "d"(16));
+      sv = __builtin_ia32_loaddqu ((const char *) s);
+      index = __builtin_ia32_pcmpestri128 (search, 4, sv, 16, 0);
+
       if (__builtin_expect (index < 16, 0))
        goto found;
 

Reply via email to