Commit 55480af80e9ed58b11e9a99da25602468b17ff45

Authored by bellard
1 parent 7d13299d

added bcd test


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@26 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 74 additions and 0 deletions
tests/test-i386.c
... ... @@ -446,6 +446,8 @@ void test_bsx(void)
446 446 TEST_BSX(bsfl, "", 0x00340128);
447 447 }
448 448  
  449 +/**********************************************/
  450 +
449 451 void test_fops(double a, double b)
450 452 {
451 453 printf("a=%f b=%f a+b=%f\n", a, b, a + b);
... ... @@ -540,6 +542,77 @@ void test_floats(void)
540 542 test_fbcd(-123451234567890);
541 543 }
542 544  
  545 +/**********************************************/
  546 +
  547 +#define TEST_BCD(op, op0, cc_in, cc_mask)\
  548 +{\
  549 + int res, flags;\
  550 + res = op0;\
  551 + flags = cc_in;\
  552 + asm ("push %3\n\t"\
  553 + "popf\n\t"\
  554 + #op "\n\t"\
  555 + "pushf\n\t"\
  556 + "popl %1\n\t"\
  557 + : "=a" (res), "=g" (flags)\
  558 + : "0" (res), "1" (flags));\
  559 + printf("%-10s A=%08x R=%08x CCIN=%04x CC=%04x\n",\
  560 + #op, op0, res, cc_in, flags & cc_mask);\
  561 +}
  562 +
  563 +void test_bcd(void)
  564 +{
  565 + TEST_BCD(daa, 0x12340503, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  566 + TEST_BCD(daa, 0x12340506, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  567 + TEST_BCD(daa, 0x12340507, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  568 + TEST_BCD(daa, 0x12340559, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  569 + TEST_BCD(daa, 0x12340560, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  570 + TEST_BCD(daa, 0x1234059f, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  571 + TEST_BCD(daa, 0x123405a0, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  572 + TEST_BCD(daa, 0x12340503, 0, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  573 + TEST_BCD(daa, 0x12340506, 0, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  574 + TEST_BCD(daa, 0x12340503, CC_C, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  575 + TEST_BCD(daa, 0x12340506, CC_C, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  576 + TEST_BCD(daa, 0x12340503, CC_C | CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  577 + TEST_BCD(daa, 0x12340506, CC_C | CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  578 +
  579 + TEST_BCD(das, 0x12340503, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  580 + TEST_BCD(das, 0x12340506, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  581 + TEST_BCD(das, 0x12340507, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  582 + TEST_BCD(das, 0x12340559, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  583 + TEST_BCD(das, 0x12340560, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  584 + TEST_BCD(das, 0x1234059f, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  585 + TEST_BCD(das, 0x123405a0, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  586 + TEST_BCD(das, 0x12340503, 0, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  587 + TEST_BCD(das, 0x12340506, 0, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  588 + TEST_BCD(das, 0x12340503, CC_C, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  589 + TEST_BCD(das, 0x12340506, CC_C, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  590 + TEST_BCD(das, 0x12340503, CC_C | CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  591 + TEST_BCD(das, 0x12340506, CC_C | CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A));
  592 +
  593 + TEST_BCD(aaa, 0x12340205, CC_A, (CC_C | CC_A));
  594 + TEST_BCD(aaa, 0x12340306, CC_A, (CC_C | CC_A));
  595 + TEST_BCD(aaa, 0x1234040a, CC_A, (CC_C | CC_A));
  596 + TEST_BCD(aaa, 0x123405fa, CC_A, (CC_C | CC_A));
  597 + TEST_BCD(aaa, 0x12340205, 0, (CC_C | CC_A));
  598 + TEST_BCD(aaa, 0x12340306, 0, (CC_C | CC_A));
  599 + TEST_BCD(aaa, 0x1234040a, 0, (CC_C | CC_A));
  600 + TEST_BCD(aaa, 0x123405fa, 0, (CC_C | CC_A));
  601 +
  602 + TEST_BCD(aas, 0x12340205, CC_A, (CC_C | CC_A));
  603 + TEST_BCD(aas, 0x12340306, CC_A, (CC_C | CC_A));
  604 + TEST_BCD(aas, 0x1234040a, CC_A, (CC_C | CC_A));
  605 + TEST_BCD(aas, 0x123405fa, CC_A, (CC_C | CC_A));
  606 + TEST_BCD(aas, 0x12340205, 0, (CC_C | CC_A));
  607 + TEST_BCD(aas, 0x12340306, 0, (CC_C | CC_A));
  608 + TEST_BCD(aas, 0x1234040a, 0, (CC_C | CC_A));
  609 + TEST_BCD(aas, 0x123405fa, 0, (CC_C | CC_A));
  610 +
  611 + TEST_BCD(aam, 0x12340547, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_O | CC_A));
  612 + TEST_BCD(aad, 0x12340407, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_O | CC_A));
  613 +}
  614 +
  615 +
543 616 static void *call_end __init_call = NULL;
544 617  
545 618 int main(int argc, char **argv)
... ... @@ -557,5 +630,6 @@ int main(int argc, char **argv)
557 630 test_jcc();
558 631 test_lea();
559 632 test_floats();
  633 + test_bcd();
560 634 return 0;
561 635 }
... ...