summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/eigccx86.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/eigccx86.h')
-rw-r--r--src/osd/eigccx86.h30
1 files changed, 14 insertions, 16 deletions
diff --git a/src/osd/eigccx86.h b/src/osd/eigccx86.h
index 363daba5f5f..b67b646451e 100644
--- a/src/osd/eigccx86.h
+++ b/src/osd/eigccx86.h
@@ -472,13 +472,13 @@ _count_leading_zeros(uint32_t value)
{
uint32_t result;
__asm__ (
- " bsrl %[value], %[result] ;"
- " jnz 1f ;"
- " movl $63, %[result] ;"
- "1: xorl $31, %[result] ;"
- : [result] "=r" (result) // result can be in any register
- : [value] "rm" (value) // 'value' can be register or memory
- : "cc" // clobbers condition codes
+ " bsrl %[value], %[result] ;"
+ " cmovzl %[bias], %[result] ;"
+ " xorl $31, %[result] ;"
+ : [result] "=&r" (result) // result can be in any register
+ : [value] "rm" (value) // 'value' can be register or memory
+ , [bias] "rm" (uint32_t(63)) // 'bias' can be register or memory
+ : "cc" // clobbers condition codes
);
return result;
}
@@ -495,15 +495,13 @@ _count_leading_ones(uint32_t value)
{
uint32_t result;
__asm__ (
- " movl %[value], %[result] ;"
- " notl %[result] ;"
- " bsrl %[result], %[result] ;"
- " jnz 1f ;"
- " movl $63, %[result] ;"
- "1: xorl $31, %[result] ;"
- : [result] "=r" (result) // result can be in any register
- : [value] "rmi" (value) // 'value' can be register, memory or immediate
- : "cc" // clobbers condition codes
+ " bsrl %[value], %[result] ;"
+ " cmovzl %[bias], %[result] ;"
+ " xorl $31, %[result] ;"
+ : [result] "=&r" (result) // result can be in any register
+ : [value] "rm" (~value) // 'value' can be register or memory
+ , [bias] "rm" (uint32_t(63)) // 'bias' can be register or memory
+ : "cc" // clobbers condition codes
);
return result;
}