2013-11-18 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
authorwschmidt <wschmidt@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Nov 2013 16:21:42 +0000 (16:21 +0000)
committerwschmidt <wschmidt@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Nov 2013 16:21:42 +0000 (16:21 +0000)
* lex.c (search_line_fast): Correct for little endian.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204970 138bc75d-0d04-0410-961f-82ee72b054a4

libcpp/ChangeLog
libcpp/lex.c

index 5e38c4b..c3391b4 100644 (file)
@@ -1,3 +1,7 @@
+2013-11-18  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       * lex.c (search_line_fast): Correct for little endian.
+
 2013-11-15  Joseph Myers  <joseph@codesourcery.com>
 
        * ucnid.tab: Add C11 and C11NOSTART data.
index 99c2140..80829d6 100644 (file)
@@ -559,8 +559,13 @@ search_line_fast (const uchar *s, const uchar *end ATTRIBUTE_UNUSED)
      beginning with all ones and shifting in zeros according to the
      mis-alignment.  The LVSR instruction pulls the exact shift we
      want from the address.  */
+#ifdef __BIG_ENDIAN__
   mask = __builtin_vec_lvsr(0, s);
   mask = __builtin_vec_perm(zero, ones, mask);
+#else
+  mask = __builtin_vec_lvsl(0, s);
+  mask = __builtin_vec_perm(ones, zero, mask);
+#endif
   data &= mask;
 
   /* While altivec loads mask addresses, we still need to align S so
@@ -624,7 +629,11 @@ search_line_fast (const uchar *s, const uchar *end ATTRIBUTE_UNUSED)
     /* L now contains 0xff in bytes for which we matched one of the
        relevant characters.  We can find the byte index by finding
        its bit index and dividing by 8.  */
+#ifdef __BIG_ENDIAN__
     l = __builtin_clzl(l) >> 3;
+#else
+    l = __builtin_ctzl(l) >> 3;
+#endif
     return s + l;
 
 #undef N