Commit 9d8e9c09932455a21c57559925def82361b23a09

Authored by bellard
1 parent d57c4e01

bsx/float tests


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@21 c046a42c-6fe2-441c-8c8c-71466251a162
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 }
... ...