mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
target-i386: implement lzcnt emulation
lzcnt is a AMD Phenom/Barcelona added instruction returning the number of leading zero bits in a word. As this is similar to the "bsr" instruction, reuse the existing code. There need to be some more changes, though, as lzcnt always returns a valid value (in opposite to bsr, which has a special case when the operand is 0). lzcnt is guarded by the ABM CPUID bit (Fn8000_0001:ECX_5). Signed-off-by: Andre Przywara <andre.przywara@amd.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
cb2dbfc351
commit
31501a714b
3 changed files with 38 additions and 14 deletions
|
@ -5479,11 +5479,14 @@ target_ulong helper_bsf(target_ulong t0)
|
|||
return count;
|
||||
}
|
||||
|
||||
target_ulong helper_bsr(target_ulong t0)
|
||||
target_ulong helper_lzcnt(target_ulong t0, int wordsize)
|
||||
{
|
||||
int count;
|
||||
target_ulong res, mask;
|
||||
|
||||
|
||||
if (wordsize > 0 && t0 == 0) {
|
||||
return wordsize;
|
||||
}
|
||||
res = t0;
|
||||
count = TARGET_LONG_BITS - 1;
|
||||
mask = (target_ulong)1 << (TARGET_LONG_BITS - 1);
|
||||
|
@ -5491,9 +5494,16 @@ target_ulong helper_bsr(target_ulong t0)
|
|||
count--;
|
||||
res <<= 1;
|
||||
}
|
||||
if (wordsize > 0) {
|
||||
return wordsize - 1 - count;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
target_ulong helper_bsr(target_ulong t0)
|
||||
{
|
||||
return helper_lzcnt(t0, 0);
|
||||
}
|
||||
|
||||
static int compute_all_eflags(void)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue