mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
allow compiler a little more optimisation leeway in x86 count_leading_* (nw)
This commit is contained in:
parent
51c06e670f
commit
843cf2982e
@ -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");
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user