allow compiler a little more optimisation leeway in x86 count_leading_* (nw)

This commit is contained in:
Vas Crabb 2017-12-02 23:41:43 +11:00
parent 51c06e670f
commit 843cf2982e
3 changed files with 10 additions and 8 deletions

View File

@ -514,9 +514,13 @@ void validity_checker::validate_inlines()
testi32a = (testi32a & 0x0000ffff) | 0x400000; testi32a = (testi32a & 0x0000ffff) | 0x400000;
if (count_leading_zeros(testi32a) != 9) if (count_leading_zeros(testi32a) != 9)
osd_printf_error("Error testing count_leading_zeros\n"); osd_printf_error("Error testing count_leading_zeros\n");
if (count_leading_zeros(0) != 32)
osd_printf_error("Error testing count_leading_zeros\n");
testi32a = (testi32a | 0xffff0000) & ~0x400000; testi32a = (testi32a | 0xffff0000) & ~0x400000;
if (count_leading_ones(testi32a) != 9) if (count_leading_ones(testi32a) != 9)
osd_printf_error("Error testing count_leading_ones\n"); osd_printf_error("Error testing count_leading_ones\n");
if (count_leading_ones(0xffffffff) != 32)
osd_printf_error("Error testing count_leading_ones\n");
} }

View File

@ -474,13 +474,12 @@ _count_leading_zeros(uint32_t value)
__asm__ ( __asm__ (
" bsrl %[value], %[result] ;" " bsrl %[value], %[result] ;"
" cmovzl %[bias], %[result] ;" " cmovzl %[bias], %[result] ;"
" xorl $31, %[result] ;"
: [result] "=&r" (result) // result can be in any register : [result] "=&r" (result) // result can be in any register
: [value] "rm" (value) // 'value' can be register or memory : [value] "rm" (value) // 'value' can be register or memory
, [bias] "rm" (uint32_t(63)) // 'bias' can be register or memory , [bias] "rm" (~uint32_t(0)) // 'bias' can be register or memory
: "cc" // clobbers condition codes : "cc" // clobbers condition codes
); );
return result; return 31U - result;
} }
@ -497,13 +496,12 @@ _count_leading_ones(uint32_t value)
__asm__ ( __asm__ (
" bsrl %[value], %[result] ;" " bsrl %[value], %[result] ;"
" cmovzl %[bias], %[result] ;" " cmovzl %[bias], %[result] ;"
" xorl $31, %[result] ;"
: [result] "=&r" (result) // result can be in any register : [result] "=&r" (result) // result can be in any register
: [value] "rm" (~value) // 'value' can be register or memory : [value] "rm" (~value) // 'value' can be register or memory
, [bias] "rm" (uint32_t(63)) // 'bias' can be register or memory , [bias] "rm" (~uint32_t(0)) // 'bias' can be register or memory
: "cc" // clobbers condition codes : "cc" // clobbers condition codes
); );
return result; return 31U - result;
} }
#endif // MAME_OSD_EIGCCX86_H #endif // MAME_OSD_EIGCCX86_H

View File

@ -31,7 +31,7 @@
inline uint8_t _count_leading_zeros(uint32_t value) inline uint8_t _count_leading_zeros(uint32_t value)
{ {
unsigned long index; unsigned long index;
return _BitScanReverse(&index, value) ? (index ^ 31) : 32; return _BitScanReverse(&index, value) ? (31U - index) : 32U;
} }
#endif #endif
@ -46,7 +46,7 @@ inline uint8_t _count_leading_zeros(uint32_t value)
inline uint8_t _count_leading_ones(uint32_t value) inline uint8_t _count_leading_ones(uint32_t value)
{ {
unsigned long index; unsigned long index;
return _BitScanReverse(&index, ~value) ? (index ^ 31) : 32; return _BitScanReverse(&index, ~value) ? (31U - index) : 32U;
} }
#endif #endif