Commit 9d8e9c09932455a21c57559925def82361b23a09
1 parent
d57c4e01
bsx/float tests
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@21 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
103 additions
and
2 deletions
tests/Makefile
| ... | ... | @@ -13,14 +13,14 @@ hello: hello.c |
| 13 | 13 | $(CC) -nostdlib $(CFLAGS) -static $(LDFLAGS) -o $@ $< |
| 14 | 14 | |
| 15 | 15 | test1: test1.c |
| 16 | - $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< | |
| 16 | + $(CC) $(CFLAGS) -static $(LDFLAGS) -o $@ $< | |
| 17 | 17 | |
| 18 | 18 | test2: test2.c |
| 19 | 19 | $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< |
| 20 | 20 | |
| 21 | 21 | # i386 emulation test (dump various opcodes) */ |
| 22 | 22 | test-i386: test-i386.c test-i386.h test-i386-shift.h test-i386-muldiv.h |
| 23 | - $(CC) $(CFLAGS) $(LDFLAGS) -static -o $@ $< | |
| 23 | + $(CC) $(CFLAGS) $(LDFLAGS) -static -o $@ $< -lm | |
| 24 | 24 | |
| 25 | 25 | test: test-i386 |
| 26 | 26 | ./test-i386 > test-i386.ref | ... | ... |
tests/test-i386.c
| ... | ... | @@ -424,6 +424,105 @@ void test_mul(void) |
| 424 | 424 | test_divl(0x12343, 0x12345678, 0x81234567); |
| 425 | 425 | } |
| 426 | 426 | |
| 427 | +#define TEST_BSX(op, size, op0)\ | |
| 428 | +{\ | |
| 429 | + int res, val, resz;\ | |
| 430 | + val = op0;\ | |
| 431 | + asm("xorl %1, %1 ; " #op " %" size "2, %" size "0 ; setz %b1" \ | |
| 432 | + : "=r" (res), "=q" (resz)\ | |
| 433 | + : "g" (val));\ | |
| 434 | + printf("%-10s A=%08x R=%08x %d\n", #op, val, resz ? 0 : res, resz);\ | |
| 435 | +} | |
| 436 | + | |
| 437 | +void test_bsx(void) | |
| 438 | +{ | |
| 439 | + TEST_BSX(bsrw, "w", 0); | |
| 440 | + TEST_BSX(bsrw, "w", 0x12340128); | |
| 441 | + TEST_BSX(bsrl, "", 0); | |
| 442 | + TEST_BSX(bsrl, "", 0x00340128); | |
| 443 | + TEST_BSX(bsfw, "w", 0); | |
| 444 | + TEST_BSX(bsfw, "w", 0x12340128); | |
| 445 | + TEST_BSX(bsfl, "", 0); | |
| 446 | + TEST_BSX(bsfl, "", 0x00340128); | |
| 447 | +} | |
| 448 | + | |
| 449 | +void test_fops(double a, double b) | |
| 450 | +{ | |
| 451 | + printf("a=%f b=%f a+b=%f\n", a, b, a + b); | |
| 452 | + printf("a=%f b=%f a-b=%f\n", a, b, a - b); | |
| 453 | + printf("a=%f b=%f a*b=%f\n", a, b, a * b); | |
| 454 | + printf("a=%f b=%f a/b=%f\n", a, b, a / b); | |
| 455 | + printf("a=%f b=%f fmod(a, b)=%f\n", a, b, fmod(a, b)); | |
| 456 | + printf("a=%f sqrt(a)=%f\n", a, sqrt(a)); | |
| 457 | + printf("a=%f sin(a)=%f\n", a, sin(a)); | |
| 458 | + printf("a=%f cos(a)=%f\n", a, cos(a)); | |
| 459 | + printf("a=%f tan(a)=%f\n", a, tan(a)); | |
| 460 | + printf("a=%f log(a)=%f\n", a, log(a)); | |
| 461 | + printf("a=%f exp(a)=%f\n", a, exp(a)); | |
| 462 | + printf("a=%f b=%f atan2(a, b)=%f\n", a, b, atan2(a, b)); | |
| 463 | + /* just to test some op combining */ | |
| 464 | + printf("a=%f asin(sin(a))=%f\n", a, asin(sin(a))); | |
| 465 | + printf("a=%f acos(cos(a))=%f\n", a, acos(cos(a))); | |
| 466 | + printf("a=%f atan(tan(a))=%f\n", a, atan(tan(a))); | |
| 467 | + | |
| 468 | +} | |
| 469 | + | |
| 470 | +void test_fcmp(double a, double b) | |
| 471 | +{ | |
| 472 | + printf("(%f<%f)=%d\n", | |
| 473 | + a, b, a < b); | |
| 474 | + printf("(%f<=%f)=%d\n", | |
| 475 | + a, b, a <= b); | |
| 476 | + printf("(%f==%f)=%d\n", | |
| 477 | + a, b, a == b); | |
| 478 | + printf("(%f>%f)=%d\n", | |
| 479 | + a, b, a > b); | |
| 480 | + printf("(%f<=%f)=%d\n", | |
| 481 | + a, b, a >= b); | |
| 482 | +} | |
| 483 | + | |
| 484 | +void test_fcvt(double a) | |
| 485 | +{ | |
| 486 | + float fa; | |
| 487 | + long double la; | |
| 488 | + | |
| 489 | + fa = a; | |
| 490 | + la = a; | |
| 491 | + printf("(float)%f = %f\n", a, fa); | |
| 492 | + printf("(long double)%f = %Lf\n", a, la); | |
| 493 | + printf("a=%f floor(a)=%f\n", a, floor(a)); | |
| 494 | + printf("a=%f ceil(a)=%f\n", a, ceil(a)); | |
| 495 | + printf("a=%f rint(a)=%f\n", a, rint(a)); | |
| 496 | +} | |
| 497 | + | |
| 498 | +#define TEST(N) \ | |
| 499 | + asm("fld" #N : "=t" (a)); \ | |
| 500 | + printf("fld" #N "= %f\n", a); | |
| 501 | + | |
| 502 | +void test_fconst(void) | |
| 503 | +{ | |
| 504 | + double a; | |
| 505 | + TEST(1); | |
| 506 | + TEST(l2t); | |
| 507 | + TEST(l2e); | |
| 508 | + TEST(pi); | |
| 509 | + TEST(lg2); | |
| 510 | + TEST(ln2); | |
| 511 | + TEST(z); | |
| 512 | +} | |
| 513 | + | |
| 514 | +void test_floats(void) | |
| 515 | +{ | |
| 516 | + test_fops(2, 3); | |
| 517 | + test_fops(1.4, -5); | |
| 518 | + test_fcmp(2, -1); | |
| 519 | + test_fcmp(2, 2); | |
| 520 | + test_fcmp(2, 3); | |
| 521 | + test_fcvt(1.0/7.0); | |
| 522 | + test_fcvt(-1.0/9.0); | |
| 523 | + test_fcvt(1e30); | |
| 524 | + test_fconst(); | |
| 525 | +} | |
| 427 | 526 | |
| 428 | 527 | static void *call_end __init_call = NULL; |
| 429 | 528 | |
| ... | ... | @@ -437,8 +536,10 @@ int main(int argc, char **argv) |
| 437 | 536 | func = *ptr++; |
| 438 | 537 | func(); |
| 439 | 538 | } |
| 539 | + test_bsx(); | |
| 440 | 540 | test_mul(); |
| 441 | 541 | test_jcc(); |
| 442 | 542 | test_lea(); |
| 543 | + test_floats(); | |
| 443 | 544 | return 0; |
| 444 | 545 | } | ... | ... |