From dc6bcf52ebcc487d78060c22df62367732370881 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Tue, 30 Jun 2015 10:26:57 +0200 Subject: [PATCH] lex.c (search_line_sse42): New main loop using asm flag outputs. * lex.c (search_line_sse42) [__GCC_ASM_FLAG_OUTPUTS__]: New main loop using asm flag outputs. From-SVN: r225160 --- libcpp/ChangeLog | 5 +++++ libcpp/lex.c | 28 +++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index f373dad5130..c7ac1e3aec0 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,8 @@ +2015-06-30 Uros Bizjak + + * lex.c (search_line_sse42) [__GCC_ASM_FLAG_OUTPUTS__]: New main + loop using asm flag outputs. + 2015-06-08 Marek Polacek PR c/66415 diff --git a/libcpp/lex.c b/libcpp/lex.c index c7296a110b6..5758e580c2b 100644 --- a/libcpp/lex.c +++ b/libcpp/lex.c @@ -450,15 +450,33 @@ search_line_sse42 (const uchar *s, const uchar *end) s = (const uchar *)((si + 16) & -16); } - /* Main loop, processing 16 bytes at a time. By doing the whole loop - in inline assembly, we can make proper use of the flags set. */ - __asm ( "sub $16, %1\n" - " .balign 16\n" + /* Main loop, processing 16 bytes at a time. */ +#ifdef __GCC_ASM_FLAG_OUTPUTS__ + while (1) + { + char f; + + /* By using inline assembly instead of the builtin, + we can use the result, as well as the flags set. */ + __asm ("%vpcmpestri\t$0, %2, %3" + : "=c"(index), "=@ccc"(f) + : "m"(*s), "x"(search), "a"(4), "d"(16)); + if (f) + break; + + s += 16; + } +#else + s -= 16; + /* By doing the whole loop in inline assembly, + we can make proper use of the flags set. */ + __asm ( ".balign 16\n" "0: add $16, %1\n" - " %vpcmpestri $0, (%1), %2\n" + " %vpcmpestri\t$0, (%1), %2\n" " jnc 0b" : "=&c"(index), "+r"(s) : "x"(search), "a"(4), "d"(16)); +#endif found: return s + index;