Revision 03bfca94

b/tests/test-i386.c
9 9
#include <sys/mman.h>
10 10
#include <asm/vm86.h>
11 11

  
12
#define TEST_CMOV 0
12
#define TEST_CMOV  0
13
#define TEST_FCOMI 0
13 14

  
14 15
#define xglue(x, y) x ## y
15 16
#define glue(x, y) xglue(x, y)
......
510 511
           a, b, a > b);
511 512
    printf("(%f<=%f)=%d\n",
512 513
           a, b, a >= b);
514
    if (TEST_FCOMI) {
515
        unsigned int eflags;
516
        /* test f(u)comi instruction */
517
        asm("fcomi %2, %1\n"
518
            "pushf\n"
519
            "pop %0\n"
520
            : "=r" (eflags)
521
            : "t" (a), "u" (b));
522
        printf("fcomi(%f %f)=%08x\n", a, b, eflags & (CC_Z | CC_P | CC_C));
523
    }
513 524
}
514 525

  
515 526
void test_fcvt(double a)
......
556 567
           a, bcd[4], bcd[3], bcd[2], bcd[1], bcd[0], b);
557 568
}
558 569

  
570
#define TEST_ENV(env, prefix)\
571
{\
572
    memset((env), 0xaa, sizeof(*(env)));\
573
    asm("fld1\n"\
574
        prefix "fnstenv %1\n"\
575
        prefix "fldenv %1\n"\
576
        : "=t" (res) : "m" (*(env)) : "st");\
577
    printf("res=%f\n", res);\
578
    printf("fpuc=%04x fpus=%04x fptag=%04x\n",\
579
           (env)->fpuc,\
580
           (env)->fpus & 0xff00,\
581
           (env)->fptag);\
582
    memset((env), 0xaa, sizeof(*(env)));\
583
    asm("fld1\n"\
584
        prefix "fnsave %1\n"\
585
        prefix "frstor %1\n"\
586
        : "=t" (res) : "m" (*(env)) : "st");\
587
    printf("res=%f\n", res);\
588
    printf("fpuc=%04x fpus=%04x fptag=%04x\n",\
589
           (env)->fpuc,\
590
           (env)->fpus & 0xff00,\
591
           (env)->fptag);\
592
    printf("ST(0) = %Lf\n",\
593
           (env)->fpregs[0]);\
594
}
595

  
596
void test_fenv(void)
597
{
598
    struct __attribute__((packed)) {
599
        uint16_t fpuc;
600
        uint16_t dummy1;
601
        uint16_t fpus;
602
        uint16_t dummy2;
603
        uint16_t fptag;
604
        uint16_t dummy3;
605
        uint32_t ignored[4];
606
        long double fpregs[8];
607
    } float_env32;
608
    struct __attribute__((packed)) {
609
        uint16_t fpuc;
610
        uint16_t fpus;
611
        uint16_t fptag;
612
        uint16_t ignored[4];
613
        long double fpregs[8];
614
    } float_env16;
615
    double res;
616

  
617
    TEST_ENV(&float_env16, "data16 ");
618
    TEST_ENV(&float_env32, "");
619
}
620

  
559 621
void test_floats(void)
560 622
{
561 623
    test_fops(2, 3);
......
569 631
    test_fconst();
570 632
    test_fbcd(1234567890123456);
571 633
    test_fbcd(-123451234567890);
634
    test_fenv();
572 635
}
573 636

  
574 637
/**********************************************/

Also available in: Unified diff