658 |
TEST_ENV(&float_env32, ""); |
TEST_ENV(&float_env32, ""); |
659 |
} |
} |
660 |
|
|
661 |
|
|
662 |
|
#define TEST_FCMOV(a, b, eflags, CC)\ |
663 |
|
{\ |
664 |
|
double res;\ |
665 |
|
asm("push %3\n"\ |
666 |
|
"popf\n"\ |
667 |
|
"fcmov" CC " %2, %0\n"\ |
668 |
|
: "=t" (res)\ |
669 |
|
: "0" (a), "u" (b), "g" (eflags));\ |
670 |
|
printf("fcmov%s eflags=0x%04x-> %f\n", \ |
671 |
|
CC, eflags, res);\ |
672 |
|
} |
673 |
|
|
674 |
|
void test_fcmov(void) |
675 |
|
{ |
676 |
|
double a, b; |
677 |
|
int eflags, i; |
678 |
|
|
679 |
|
a = 1.0; |
680 |
|
b = 2.0; |
681 |
|
for(i = 0; i < 4; i++) { |
682 |
|
eflags = 0; |
683 |
|
if (i & 1) |
684 |
|
eflags |= CC_C; |
685 |
|
if (i & 2) |
686 |
|
eflags |= CC_Z; |
687 |
|
TEST_FCMOV(a, b, eflags, "b"); |
688 |
|
TEST_FCMOV(a, b, eflags, "e"); |
689 |
|
TEST_FCMOV(a, b, eflags, "be"); |
690 |
|
TEST_FCMOV(a, b, eflags, "nb"); |
691 |
|
TEST_FCMOV(a, b, eflags, "ne"); |
692 |
|
TEST_FCMOV(a, b, eflags, "nbe"); |
693 |
|
} |
694 |
|
TEST_FCMOV(a, b, 0, "u"); |
695 |
|
TEST_FCMOV(a, b, CC_P, "nu"); |
696 |
|
} |
697 |
|
|
698 |
void test_floats(void) |
void test_floats(void) |
699 |
{ |
{ |
700 |
test_fops(2, 3); |
test_fops(2, 3); |
712 |
test_fbcd(1234567890123456); |
test_fbcd(1234567890123456); |
713 |
test_fbcd(-123451234567890); |
test_fbcd(-123451234567890); |
714 |
test_fenv(); |
test_fenv(); |
715 |
|
if (TEST_CMOV) { |
716 |
|
test_fcmov(); |
717 |
|
} |
718 |
} |
} |
719 |
|
|
720 |
/**********************************************/ |
/**********************************************/ |