Commit b5075d29a88017705c252a0695f279f982f59a6f
1 parent
91caaa61
more imul tests
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@737 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
31 additions
and
0 deletions
tests/Makefile
| @@ -38,6 +38,10 @@ test: | @@ -38,6 +38,10 @@ test: | ||
| 38 | endif | 38 | endif |
| 39 | $(QEMU) test-i386 > test-i386.out | 39 | $(QEMU) test-i386 > test-i386.out |
| 40 | @if diff -u test-i386.ref test-i386.out ; then echo "Auto Test OK"; fi | 40 | @if diff -u test-i386.ref test-i386.out ; then echo "Auto Test OK"; fi |
| 41 | +ifeq ($(ARCH),i386) | ||
| 42 | + $(QEMU) -no-code-copy test-i386 > test-i386.out | ||
| 43 | + @if diff -u test-i386.ref test-i386.out ; then echo "Auto Test OK (no code copy)"; fi | ||
| 44 | +endif | ||
| 41 | 45 | ||
| 42 | # generic Linux and CPU test | 46 | # generic Linux and CPU test |
| 43 | linux-test: linux-test.c | 47 | linux-test: linux-test.c |
tests/test-i386.c
| @@ -401,6 +401,23 @@ void test_imull2(int op0, int op1) | @@ -401,6 +401,23 @@ void test_imull2(int op0, int op1) | ||
| 401 | "imull", s0, s1, res, flags & CC_MASK); | 401 | "imull", s0, s1, res, flags & CC_MASK); |
| 402 | } | 402 | } |
| 403 | 403 | ||
| 404 | +#define TEST_IMUL_IM(size, size1, op0, op1)\ | ||
| 405 | +{\ | ||
| 406 | + int res, flags;\ | ||
| 407 | + flags = 0;\ | ||
| 408 | + res = 0;\ | ||
| 409 | + asm ("push %3\n\t"\ | ||
| 410 | + "popf\n\t"\ | ||
| 411 | + "imul" size " $" #op0 ", %" size1 "2, %" size1 "0\n\t" \ | ||
| 412 | + "pushf\n\t"\ | ||
| 413 | + "popl %1\n\t"\ | ||
| 414 | + : "=r" (res), "=g" (flags)\ | ||
| 415 | + : "r" (op1), "1" (flags), "0" (res));\ | ||
| 416 | + printf("%-10s A=%08x B=%08x R=%08x CC=%04x\n",\ | ||
| 417 | + "imul" size, op0, op1, res, flags & CC_MASK);\ | ||
| 418 | +} | ||
| 419 | + | ||
| 420 | + | ||
| 404 | #undef CC_MASK | 421 | #undef CC_MASK |
| 405 | #define CC_MASK (0) | 422 | #define CC_MASK (0) |
| 406 | 423 | ||
| @@ -452,6 +469,16 @@ void test_mul(void) | @@ -452,6 +469,16 @@ void test_mul(void) | ||
| 452 | test_imull2(0x80000000, 0x80000000); | 469 | test_imull2(0x80000000, 0x80000000); |
| 453 | test_imull2(0x10000, 0x10000); | 470 | test_imull2(0x10000, 0x10000); |
| 454 | 471 | ||
| 472 | + TEST_IMUL_IM("w", "w", 45, 0x1234); | ||
| 473 | + TEST_IMUL_IM("w", "w", -45, 23); | ||
| 474 | + TEST_IMUL_IM("w", "w", 0x8000, 0x80000000); | ||
| 475 | + TEST_IMUL_IM("w", "w", 0x7fff, 0x1000); | ||
| 476 | + | ||
| 477 | + TEST_IMUL_IM("l", "", 45, 0x1234); | ||
| 478 | + TEST_IMUL_IM("l", "", -45, 23); | ||
| 479 | + TEST_IMUL_IM("l", "", 0x8000, 0x80000000); | ||
| 480 | + TEST_IMUL_IM("l", "", 0x7fff, 0x1000); | ||
| 481 | + | ||
| 455 | test_idivb(0x12341678, 0x127e); | 482 | test_idivb(0x12341678, 0x127e); |
| 456 | test_idivb(0x43210123, -5); | 483 | test_idivb(0x43210123, -5); |
| 457 | test_idivb(0x12340004, -1); | 484 | test_idivb(0x12340004, -1); |