From eb9920549e9e77ad824810dd641735e78f8a27d8 Mon Sep 17 00:00:00 2001 From: wschmidt Date: Mon, 18 Nov 2013 16:21:42 +0000 Subject: [PATCH] 2013-11-18 Bill Schmidt * 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 | 4 ++++ libcpp/lex.c | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 5e38c4b..c3391b4 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,7 @@ +2013-11-18 Bill Schmidt + + * lex.c (search_line_fast): Correct for little endian. + 2013-11-15 Joseph Myers * ucnid.tab: Add C11 and C11NOSTART data. diff --git a/libcpp/lex.c b/libcpp/lex.c index 99c2140..80829d6 100644 --- a/libcpp/lex.c +++ b/libcpp/lex.c @@ -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 -- 2.7.4