mirror of
https://github.com/holub/mame
synced 2025-10-06 09:00:04 +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;
|
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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user