Commit 55480af80e9ed58b11e9a99da25602468b17ff45
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 | } | ... | ... |