Add "cc" clobbers to inline asm that modifies flags.

As far as we know, the lack of "cc" in the clobbers hasn't caused
problems yet, but it could.  This change is to improve correctness,
and is also almost certainly performance neutral.

PiperOrigin-RevId: 487133620
This commit is contained in:
Snappy Team 2022-11-09 05:32:52 +00:00 committed by Victor Costan
parent 8881ba172a
commit 15e2a0e13d
2 changed files with 6 additions and 3 deletions

View File

@ -246,7 +246,8 @@ static inline std::pair<size_t, bool> FindMatchLength(const char* s1,
asm("testl %k2, %k2\n\t" asm("testl %k2, %k2\n\t"
"cmovzq %1, %0\n\t" "cmovzq %1, %0\n\t"
: "+r"(a2) : "+r"(a2)
: "r"(a3), "r"(xorval)); : "r"(a3), "r"(xorval)
: "cc");
#endif #endif
*data = a2 >> (shift & (3 * 8)); *data = a2 >> (shift & (3 * 8));
return std::pair<size_t, bool>(matched_bytes, true); return std::pair<size_t, bool>(matched_bytes, true);
@ -277,7 +278,8 @@ static inline std::pair<size_t, bool> FindMatchLength(const char* s1,
asm("testl %k2, %k2\n\t" asm("testl %k2, %k2\n\t"
"cmovzq %1, %0\n\t" "cmovzq %1, %0\n\t"
: "+r"(a2) : "+r"(a2)
: "r"(a3), "r"(xorval)); : "r"(a3), "r"(xorval)
: "cc");
#endif #endif
*data = a2 >> (shift & (3 * 8)); *data = a2 >> (shift & (3 * 8));
matched += matched_bytes; matched += matched_bytes;

View File

@ -1107,7 +1107,8 @@ inline size_t AdvanceToNextTagX86Optimized(const uint8_t** ip_p, size_t* tag) {
// TODO clang misses the fact that the (c & 3) already correctly // TODO clang misses the fact that the (c & 3) already correctly
// sets the zero flag. // sets the zero flag.
asm("and $3, %k[tag_type]\n\t" asm("and $3, %k[tag_type]\n\t"
: [tag_type] "+r"(tag_type), "=@ccz"(is_literal)); : [tag_type] "+r"(tag_type), "=@ccz"(is_literal)
:: "cc");
#else #else
tag_type &= 3; tag_type &= 3;
is_literal = (tag_type == 0); is_literal = (tag_type == 0);