diff --git a/tests/fpu/fpu.c b/tests/fpu/fpu.c index 059d83b..79ba7fa 100644 --- a/tests/fpu/fpu.c +++ b/tests/fpu/fpu.c @@ -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; } diff --git a/tests/test_fpu.bin b/tests/test_fpu.bin index e4e2116..cc6c1cc 100755 Binary files a/tests/test_fpu.bin and b/tests/test_fpu.bin differ diff --git a/tests/test_fpu.console_out b/tests/test_fpu.console_out index 3ec9480..987a633 100644 --- a/tests/test_fpu.console_out +++ b/tests/test_fpu.console_out @@ -23,3 +23,4 @@ test 22:PASS test 23:PASS test 24:PASS test 25:PASS +test 26:PASS