|
|
|
@ -1665,6 +1665,65 @@ int fpu_test_25(void)
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct ftvals {
|
|
|
|
|
unsigned long val_a;
|
|
|
|
|
unsigned long val_b;
|
|
|
|
|
int cr_ftdiv;
|
|
|
|
|
int cr_ftsqrt;
|
|
|
|
|
} ftvals[] = {
|
|
|
|
|
{ 0x3ff0000000000000, 0x3ff0000000000000, 0, 0 },
|
|
|
|
|
{ 0x0000000000000000, 0x3ff0000000000000, 0, 6 },
|
|
|
|
|
{ 0xfff0000000000000, 0x3ff0000000000000, 6, 6 },
|
|
|
|
|
{ 0x7ff1234560000000, 0x3ff0000000000000, 2, 2 },
|
|
|
|
|
{ 0x3ff0000000000000, 0xfff0000000000000, 6, 0 },
|
|
|
|
|
{ 0x3ff0000000000000, 0x8000000000000000, 6, 0 },
|
|
|
|
|
{ 0x3ff0000000000000, 0x7ff9234560000000, 2, 0 },
|
|
|
|
|
{ 0x3ff0000000000000, 0x0020000000000000, 0, 0 },
|
|
|
|
|
{ 0x3ff0000000000000, 0x0010000000000000, 2, 0 },
|
|
|
|
|
{ 0x3ff0000000000000, 0x0001000000000000, 6, 0 },
|
|
|
|
|
{ 0x3ff0000000000000, 0x7fb1234500000000, 0, 0 },
|
|
|
|
|
{ 0x3ff0000000000000, 0x7fc1234500000000, 2, 0 },
|
|
|
|
|
{ 0x3ff0000000000000, 0x7fd1234500000000, 2, 0 },
|
|
|
|
|
{ 0x3ff0000000000000, 0x7fe1234500000000, 2, 0 },
|
|
|
|
|
{ 0x6000000000000000, 0x2000000000000000, 2, 0 },
|
|
|
|
|
{ 0x5ff0000000000000, 0x2000000000000000, 2, 0 },
|
|
|
|
|
{ 0x5fe0000000000000, 0x2000000000000000, 0, 0 },
|
|
|
|
|
{ 0x2000000000000000, 0x5fc0000000000000, 0, 0 },
|
|
|
|
|
{ 0x2000000000000000, 0x5fd0000000000000, 2, 0 },
|
|
|
|
|
{ 0x0360000000000000, 0x4320000000000000, 0, 0 },
|
|
|
|
|
{ 0x0350000000000000, 0x4310000000000000, 2, 2 },
|
|
|
|
|
{ 0x0010000000000000, 0x3fd0000000000000, 2, 2 },
|
|
|
|
|
{ 0x0001000000000000, 0x3fd0000000000000, 2, 6 },
|
|
|
|
|
{ 0xbff0000000000000, 0x3ff0000000000000, 0, 2 },
|
|
|
|
|
{ 0x3fd0000000000000, 0x0001000000000000, 6, 0 },
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
int test26(long arg)
|
|
|
|
|
{
|
|
|
|
|
long i;
|
|
|
|
|
int cr;
|
|
|
|
|
struct ftvals *vp = ftvals;
|
|
|
|
|
|
|
|
|
|
set_fpscr(FPS_RN_NEAR);
|
|
|
|
|
for (i = 0; i < sizeof(ftvals) / sizeof(ftvals[0]); ++i, ++vp) {
|
|
|
|
|
asm("lfd 5,0(%1); lfd 6,8(%1); ftdiv 5,5,6; ftsqrt 4,5; mfcr %0" :
|
|
|
|
|
"=r" (cr) : "b" (&vp->val_a) : "cr4", "cr5");
|
|
|
|
|
if (((cr >> 8) & 0xf) != vp->cr_ftdiv ||
|
|
|
|
|
((cr >> 12) & 0x1f) != vp->cr_ftsqrt) {
|
|
|
|
|
print_hex(i, 2, " ");
|
|
|
|
|
print_hex(cr, 8, " ");
|
|
|
|
|
return i + 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int fpu_test_26(void)
|
|
|
|
|
{
|
|
|
|
|
enable_fp();
|
|
|
|
|
return trapit(0, test26);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int fail = 0;
|
|
|
|
|
|
|
|
|
|
void do_test(int num, int (*test)(void))
|
|
|
|
@ -1715,6 +1774,7 @@ int main(void)
|
|
|
|
|
do_test(23, fpu_test_23);
|
|
|
|
|
do_test(24, fpu_test_24);
|
|
|
|
|
do_test(25, fpu_test_25);
|
|
|
|
|
do_test(26, fpu_test_26);
|
|
|
|
|
|
|
|
|
|
return fail;
|
|
|
|
|
}
|
|
|
|
|