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
This commit is contained in:
Uros Bizjak 2015-06-30 10:26:57 +02:00 committed by Uros Bizjak
parent 7e6a6f0d6e
commit dc6bcf52eb
2 changed files with 28 additions and 5 deletions

View File

@ -1,3 +1,8 @@
2015-06-30 Uros Bizjak <ubizjak@gmail.com>
* lex.c (search_line_sse42) [__GCC_ASM_FLAG_OUTPUTS__]: New main
loop using asm flag outputs.
2015-06-08 Marek Polacek <polacek@redhat.com>
PR c/66415

View File

@ -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;