test: add test for bsf/bsr instruction
PATCH 1/1 test: add test for bsf/bsr instruction
This patch add test for bsf/bsr instruction.
Signed-off-by Wei Yongjun<[email protected]>
--- x86/emulator.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 64 insertions(+), 0 deletions(-)
x86/emulator.c +64 -0
@@ -462,6 +462,69 @@ void test_setcc(void *mem)report ("setnle r/m8" , *memb ==0 ); } +void test_bsfbsr (void *mem) +{ +unsigned long *memq = mem, rax; + + asmvolatile ("movw $0xC000, (%[memq])\n\t" +"bsfw (%[memq]), %%ax\n\t" + ::[memq]"r" (memq)); + asm ("mov %%rax, %[rax]" : [rax]"=m" (rax)); +report ("bsfw r/m, reg" , rax ==14 ); + + asmvolatile ("movl $0xC0000000, (%[memq])\n\t" +"bsfl (%[memq]), %%eax\n\t" + ::[memq]"r" (memq)); + asm ("mov %%rax, %[rax]" : [rax]"=m" (rax)); +report ("bsfl r/m, reg" , rax ==30 ); + + asmvolatile ("movq $0xC00000000000, %%rax\n\t" +"movq %%rax, (%[memq])\n\t" +"bsfq (%[memq]), %%rax\n\t" + ::[memq]"r" (memq)); + asm ("mov %%rax, %[rax]" : [rax]"=m" (rax)); +report ("bsfq r/m, reg" , rax ==46 ); + + asmvolatile ("movq $0, %%rax\n\t" +"movq %%rax, (%[memq])\n\t" +"bsfq (%[memq]), %%rax\n\t" +"jnz 1f\n\t" +"movl $1, %[rax]\n\t" +"1:\n\t" + :[rax]"=m" (rax) + :[memq]"r" (memq)); +report ("bsfq r/m, reg" , rax ==1 ); + + asmvolatile ("movw $0xC000, (%[memq])\n\t" +"bsrw (%[memq]), %%ax\n\t" + ::[memq]"r" (memq)); + asm ("mov %%rax, %[rax]" : [rax]"=m" (rax)); +report ("bsrw r/m, reg" , rax ==15 ); + + asmvolatile ("movl $0xC0000000, (%[memq])\n\t" +"bsrl (%[memq]), %%eax\n\t" + ::[memq]"r" (memq)); + asm ("mov %%rax, %[rax]" : [rax]"=m" (rax)); +report ("bsrl r/m, reg" , rax ==31 ); + + asmvolatile ("movq $0xC00000000000, %%rax\n\t" +"movq %%rax, (%[memq])\n\t" +"bsrq (%[memq]), %%rax\n\t" + ::[memq]"r" (memq)); + asm ("mov %%rax, %[rax]" : [rax]"=m" (rax)); +report ("bsrq r/m, reg" , rax ==47 ); + + asmvolatile ("movq $0, %%rax\n\t" +"movq %%rax, (%[memq])\n\t" +"bsrq (%[memq]), %%rax\n\t" +"jnz 1f\n\t" +"movl $1, %[rax]\n\t" +"1:\n\t" + :[rax]"=m" (rax) + :[memq]"r" (memq)); +report ("bsrq r/m, reg" , rax ==1 ); +} +int main () {void *mem;
@@ -495,6 +558,7 @@ int main()test_incdecnotneg (mem);test_btc (mem);test_setcc (mem); +test_bsfbsr (mem);printf ("\nSUMMARY: %d tests, %d failures\n" , tests, fails);return fails ?1 :0 ;
Signature · 1 line
1.7.0.4
Avi Kivity
AppliedQuoted 2 lines · Wei Yongjun
This patch add test for bsf/bsr instruction.
Applied, thanks.
Signature · 1 line
error compiling committee.c: too many arguments to function