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;
if (count_leading_zeros(testi32a) != 9)
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;
if (count_leading_ones(testi32a) != 9)
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__ (
" 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
, [bias] "rm" (~uint32_t(0)) // 'bias' can be register or memory
: "cc" // clobbers condition codes
);
return result;
return 31U - result;
}
@ -497,13 +496,12 @@ _count_leading_ones(uint32_t value)
__asm__ (
" 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
, [bias] "rm" (~uint32_t(0)) // 'bias' can be register or memory
: "cc" // clobbers condition codes
);
return result;
return 31U - result;
}
#endif // MAME_OSD_EIGCCX86_H

View File

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