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:
parent
7e6a6f0d6e
commit
dc6bcf52eb
@ -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
|
||||
|
28
libcpp/lex.c
28
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;
|
||||
|
Loading…
Reference in New Issue
Block a user