static inline void restore_fpcr(void) { unsigned int offset; vector unsigned int fpcr; /* Restore, Step 13: * Restore the floating-point status and control * register from the LSCSA. */ offset = LSCSA_QW_OFFSET(fpcr); fpcr = regs_spill[offset].v; spu_mtfpscr(fpcr); }
int main() { TestVec64_Ldexp test_a[] = { { // zero {0x0000000000000000ULL,0x8000000000000000ULL}, {0x0000000000000400ULL,0xFFFFFFFFFFFFFC00ULL}, {0x0000000000000000ULL,0x8000000000000000ULL}, {0x0000000000000000ULL,0x8000000000000000ULL}, {0x0000000000000000ULL,0x8000000000000000ULL}, {0x0000000000000000ULL,0x8000000000000000ULL} },{ // MIN , MAX {0xFFEFFFFFFFFFFFFFULL,0x7FEFFFFFFFFFFFFFULL}, {0x0000000000000001ULL,0x0000000000000001ULL}, {0xFFEFFFFFFFFFFFFFULL,0x7FEFFFFFFFFFFFFFULL}, {0xFFEFFFFFFFFFFFFFULL,0x7FEFFFFFFFFFFFFFULL}, {0xFFEFFFFFFFFFFFFFULL,0x7FEFFFFFFFFFFFFFULL}, {0xFFEFFFFFFFFFFFFFULL,0x7FEFFFFFFFFFFFFFULL} },{ // Inf , -Inf {0x7FF0000000000000ULL,0xFFF0000000000000ULL}, {0x0000000000000001ULL,0x0000000000000001ULL}, {0x7FF0000000000000ULL,0xFFF0000000000000ULL}, {0x7FF0000000000000ULL,0xFFF0000000000000ULL}, {0x7FF0000000000000ULL,0xFFF0000000000000ULL}, {0x7FF0000000000000ULL,0xFFF0000000000000ULL} },{ #ifdef LDEXPD2_ROUND // denotmalized {0x8000000000000003ULL,0x0000000000000003ULL}, {0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL}, {0x8000000000000002ULL,0x0000000000000001ULL}, {0x8000000000000001ULL,0x0000000000000002ULL}, {0x8000000000000001ULL,0x0000000000000001ULL}, {0x8000000000000002ULL,0x0000000000000002ULL} },{ // denotmalized -54 {0x0010000000000001ULL,0x8010000000000001ULL}, {0xFFFFFFFFFFFFFFCAULL,0xFFFFFFFFFFFFFFCAULL}, {0x0000000000000000ULL,0x8000000000000000ULL}, {0x0000000000000000ULL,0x8000000000000000ULL}, {0x0000000000000001ULL,0x8000000000000001ULL}, {0x0000000000000000ULL,0x8000000000000000ULL} },{ // max -> ! {0x7FEFFFFFFFFFFFFFULL,0xFFEFFFFFFFFFFFFFULL}, {0xFFFFFFFFFFFFF7CEULL,0xFFFFFFFFFFFFF7CEULL}, {0x0000000000000001ULL,0x8000000000000000ULL}, {0x0000000000000000ULL,0x8000000000000000ULL}, {0x0000000000000001ULL,0x8000000000000001ULL}, {0x0000000000000000ULL,0x8000000000000001ULL} },{ // max -> ! {0x7FEFFFFFFFFFFFFFULL,0xFFEFFFFFFFFFFFFFULL}, {0xFFFFFFFFFFFFF7CDULL,0xFFFFFFFFFFFFF7CDULL}, {0x0000000000000000ULL,0x8000000000000000ULL}, {0x0000000000000000ULL,0x8000000000000000ULL}, {0x0000000000000001ULL,0x8000000000000001ULL}, {0x0000000000000000ULL,0x8000000000000000ULL} },{ #else // LDEXPD2_ROUND // denotmalized {0x8000000000000003ULL,0x0000000000000003ULL}, {0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL}, {0x8000000000000001ULL,0x0000000000000001ULL}, {0x8000000000000001ULL,0x0000000000000001ULL}, {0x8000000000000001ULL,0x0000000000000001ULL}, {0x8000000000000001ULL,0x0000000000000001ULL} },{ #endif // LDEXPD2_ROUND // denotmalized {0x0010000000000000ULL,0x8010000000000000ULL}, {0xFFFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL}, {0x0008000000000000ULL,0x8008000000000000ULL}, {0x0008000000000000ULL,0x8008000000000000ULL}, {0x0008000000000000ULL,0x8008000000000000ULL}, {0x0008000000000000ULL,0x8008000000000000ULL} },{ // denotmalized {0x0008000000000000ULL,0x8008000000000000ULL}, {0x0000000000000001ULL,0x0000000000000001ULL}, {0x0010000000000000ULL,0x8010000000000000ULL}, {0x0010000000000000ULL,0x8010000000000000ULL}, {0x0010000000000000ULL,0x8010000000000000ULL}, {0x0010000000000000ULL,0x8010000000000000ULL} },{ // 1.0 {0x3ff0000000000000ULL,0xbff0000000000000ULL}, {0x00000000000003ffULL,0x00000000000003ffULL}, {0x7FE0000000000000ULL,0xFFE0000000000000ULL}, {0x7FE0000000000000ULL,0xFFE0000000000000ULL}, {0x7FE0000000000000ULL,0xFFE0000000000000ULL}, {0x7FE0000000000000ULL,0xFFE0000000000000ULL} },{ // 1.0 -> max {0x3ff0000000000000ULL,0xbff0000000000000ULL}, {0x0000000000000400ULL,0x0000000000000400ULL}, {0x7FEFFFFFFFFFFFFFULL,0xFFEFFFFFFFFFFFFFULL}, {0x7FEFFFFFFFFFFFFFULL,0xFFEFFFFFFFFFFFFFULL}, {0x7FEFFFFFFFFFFFFFULL,0xFFEFFFFFFFFFFFFFULL}, {0x7FEFFFFFFFFFFFFFULL,0xFFEFFFFFFFFFFFFFULL} },{ // max -> ! {0x7FEFFFFFFFFFFFFFULL,0xFFEFFFFFFFFFFFFFULL}, {0xFFFFFFFF00000000ULL,0xFFFFFFFF00000000ULL}, {0x0000000000000000ULL,0x8000000000000000ULL}, {0x0000000000000000ULL,0x8000000000000000ULL}, {0x0000000000000000ULL,0x8000000000000000ULL}, {0x0000000000000000ULL,0x8000000000000000ULL} },{ // min-> {0x0000000000000001ULL,0x8000000000000001ULL}, {0x0FFFFFFFFFFFFFFFULL,0x0FFFFFFFFFFFFFFFULL}, {0x7FEFFFFFFFFFFFFFULL,0xFFEFFFFFFFFFFFFFULL}, {0x7FEFFFFFFFFFFFFFULL,0xFFEFFFFFFFFFFFFFULL}, {0x7FEFFFFFFFFFFFFFULL,0xFFEFFFFFFFFFFFFFULL}, {0x7FEFFFFFFFFFFFFFULL,0xFFEFFFFFFFFFFFFFULL} },{ // NaN , -NaN {0x7FFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL}, {0x0000000000000001ULL,0x0000000000000001ULL}, {0x7FFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL}, {0x7FFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL}, {0x7FFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL}, {0x7FFFFFFFFFFFFFFFULL,0xFFFFFFFFFFFFFFFFULL} },{ {0ULL,0ULL}, {0ULL,0ULL}, {0ULL,0ULL}, {0ULL,0ULL}, {0ULL,0ULL}, {0ULL,0ULL} } }; int ii, test_ctr = 1; char msg[80]; vec_double2 res_v; TEST_SET_START("20060905160000NM","NM", "ldexpd2"); TEST_START("ldexpd2"); for (ii=0; ; ii++) { if ( (test_a[ii].xxx[0] == 0) && (test_a[ii].xxx[1] == 0) ) break; // set Floating point round mode spu_mtfpscr(((vec_uint4){0x0100,0,0,0})); res_v = ldexpd2 (*((vec_double2 *)&test_a[ii].xxx[0]), *((vec_llong2 *)&test_a[ii].exp[0])); sprintf(msg,"2006090516%04dNM", test_ctr++); TEST_CHECK(msg, allequal_llong2( (vec_llong2)res_v, *((vec_llong2 *)&test_a[ii].ans0[0])), 0); #ifdef LDEXPD2_ROUND spu_mtfpscr(((vec_uint4){0x0600,0,0,0})); res_v = ldexpd2 (*((vec_double2 *)&test_a[ii].xxx[0]), *((vec_llong2 *)&test_a[ii].exp[0])); sprintf(msg,"2006090516%04dNM", test_ctr++); TEST_CHECK(msg, allequal_llong2( (vec_llong2)res_v, *((vec_llong2 *)&test_a[ii].ans1[0])), 0); spu_mtfpscr(((vec_uint4){0x0b00,0,0,0})); res_v = ldexpd2 (*((vec_double2 *)&test_a[ii].xxx[0]), *((vec_llong2 *)&test_a[ii].exp[0])); sprintf(msg,"2006090516%04dNM", test_ctr++); TEST_CHECK(msg, allequal_llong2( (vec_llong2)res_v, *((vec_llong2 *)&test_a[ii].ans2[0])), 0); spu_mtfpscr(((vec_uint4){0x0c00,0,0,0})); res_v = ldexpd2 (*((vec_double2 *)&test_a[ii].xxx[0]), *((vec_llong2 *)&test_a[ii].exp[0])); sprintf(msg,"2006090516%04dNM", test_ctr++); TEST_CHECK(msg, allequal_llong2( (vec_llong2)res_v, *((vec_llong2 *)&test_a[ii].ans3[0])), 0); #endif // LDEXPD2_ROUND } TEST_SET_DONE(); TEST_EXIT(); }
int main() { TestVec64_NerI test_a[] = { { // zero {0x0000000000000000ULL,0x8000000000000000ULL}, {0x0000000000000000ULL,0x8000000000000000ULL}, {0x0000000000000000ULL,0x8000000000000000ULL}, {0x0000000000000000ULL,0x8000000000000000ULL}, {0x0000000000000000ULL,0x8000000000000000ULL} },{ // border {0xc330000000000000ULL,0x4330000000000000ULL}, {0xc330000000000000ULL,0x4330000000000000ULL}, {0xc330000000000000ULL,0x4330000000000000ULL}, {0xc330000000000000ULL,0x4330000000000000ULL}, {0xc330000000000000ULL,0x4330000000000000ULL} },{ // MIN , MAX {0xFFEFFFFFFFFFFFFFULL,0x7FEFFFFFFFFFFFFFULL}, {0xFFEFFFFFFFFFFFFFULL,0x7FEFFFFFFFFFFFFFULL}, {0xFFEFFFFFFFFFFFFFULL,0x7FEFFFFFFFFFFFFFULL}, {0xFFEFFFFFFFFFFFFFULL,0x7FEFFFFFFFFFFFFFULL}, {0xFFEFFFFFFFFFFFFFULL,0x7FEFFFFFFFFFFFFFULL} },{ // Inf , -Inf {0x7FF0000000000000ULL,0xFFF0000000000000ULL}, {0x7FF0000000000000ULL,0xFFF0000000000000ULL}, {0x7FF0000000000000ULL,0xFFF0000000000000ULL}, {0x7FF0000000000000ULL,0xFFF0000000000000ULL}, {0x7FF0000000000000ULL,0xFFF0000000000000ULL} },{ // denotmalized {0x8000000000000001ULL,0x0000000000000001ULL}, {0x8000000000000000ULL,0x0000000000000000ULL}, {0x8000000000000000ULL,0x0000000000000000ULL}, {0x8000000000000000ULL,0x3ff0000000000000ULL}, {0xbff0000000000000ULL,0x0000000000000000ULL} },{ // denotmalized {0x0008000000000000ULL,0x8008000000000000ULL}, {0x0000000000000000ULL,0x8000000000000000ULL}, {0x0000000000000000ULL,0x8000000000000000ULL}, {0x3ff0000000000000ULL,0x8000000000000000ULL}, {0x0000000000000000ULL,0xbff0000000000000ULL} },{ // 1.0 {0x3ff0000000000000ULL,0xbff0000000000000ULL}, {0x3ff0000000000000ULL,0xbff0000000000000ULL}, {0x3ff0000000000000ULL,0xbff0000000000000ULL}, {0x3ff0000000000000ULL,0xbff0000000000000ULL}, {0x3ff0000000000000ULL,0xbff0000000000000ULL} },{ // 1.5 {0x3ff8000000000000ULL,0xbff8000000000000ULL}, {0x4000000000000000ULL,0xc000000000000000ULL}, {0x3ff0000000000000ULL,0xbff0000000000000ULL}, {0x4000000000000000ULL,0xbff0000000000000ULL}, {0x3ff0000000000000ULL,0xc000000000000000ULL} },{ // 2.5 {0x4004000000000000ULL,0xc004000000000000ULL}, {0x4000000000000000ULL,0xc000000000000000ULL}, {0x4000000000000000ULL,0xc000000000000000ULL}, {0x4008000000000000ULL,0xc000000000000000ULL}, {0x4000000000000000ULL,0xc008000000000000ULL} },{ {0ULL,0ULL}, {0ULL,0ULL}, {0ULL,0ULL}, {0ULL,0ULL}, {0ULL,0ULL} } }; int ii, test_ctr = 1; char msg[80]; vec_double2 res_v; TEST_SET_START("20060831210000NM","NM", "rintd2"); TEST_START("rintd2"); for (ii=0; ; ii++) { if ( (test_a[ii].xxx[0] == 0) && (test_a[ii].xxx[1] == 0) ) break; // set Floating point round mode spu_mtfpscr(((vec_uint4) { 0x0000,0,0,0 })); res_v = rintd2 (*((vec_double2 *)&test_a[ii].xxx[0])); sprintf(msg,"2006083121%04dNM", test_ctr++); TEST_CHECK(msg, allequal_llong2( (vec_llong2)res_v, *((vec_llong2 *)&test_a[ii].ans0[0])), 0); spu_mtfpscr(((vec_uint4) { 0x0500,0,0,0 })); res_v = rintd2 (*((vec_double2 *)&test_a[ii].xxx[0])); sprintf(msg,"2006083121%04dNM", test_ctr++); TEST_CHECK(msg, allequal_llong2( (vec_llong2)res_v, *((vec_llong2 *)&test_a[ii].ans1[0])), 0); spu_mtfpscr(((vec_uint4) { 0x0a00,0,0,0 })); res_v = rintd2 (*((vec_double2 *)&test_a[ii].xxx[0])); sprintf(msg,"2006083121%04dNM", test_ctr++); TEST_CHECK(msg, allequal_llong2( (vec_llong2)res_v, *((vec_llong2 *)&test_a[ii].ans2[0])), 0); spu_mtfpscr(((vec_uint4) { 0x0f00,0,0,0 })); res_v = rintd2 (*((vec_double2 *)&test_a[ii].xxx[0])); sprintf(msg,"2006083121%04dNM", test_ctr++); TEST_CHECK(msg, allequal_llong2( (vec_llong2)res_v, *((vec_llong2 *)&test_a[ii].ans3[0])), 0); } TEST_SET_DONE(); TEST_EXIT(); }