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