Revision 55480af8

b/tests/test-i386.c
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 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 630
    test_jcc();
558 631
    test_lea();
559 632
    test_floats();
633
    test_bcd();
560 634
    return 0;
561 635
}

Also available in: Unified diff