URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [gcc.target/] [spu/] [intrinsics-2.c] - Rev 801
Go to most recent revision | Compare with Previous | Blame | View Log
/* { dg-do run } */ /* { dg-options "-std=c99" } */ #include <vec_types.h> extern void abort (void); extern void exit (int); typedef union { vec_ullong2 vull; vec_double2 vd; unsigned int ui[4]; unsigned long long ull[2]; double d[2]; } v128; static v128 a, b, c, d, a0, b0, a1, b1; static int samples = 10; unsigned int seed = 0; unsigned int rand_local() { seed = seed * 69607 + 54329; return (seed); } double rand_double(double min, double max) { union { unsigned int ui[2]; double d; } x; x.ui[0] = (rand_local() & 0x000FFFFF) | 0x3FF00000; x.ui[1] = rand_local(); x.d -= 1.0; x.d *= max - min; x.d += min; return (x.d); } vec_double2 rand_vd(double min, double max) { int i; static v128 val; for (i=0; i<2; i++) val.d[i] = rand_double(min, max); return (val.vd); } int test_spu_cmpeq() { int i, j; unsigned long long exp; /* double */ for (i=0; i<samples; i++) { a.vd = rand_vd(-4.0, 4.0); b.vd = rand_vd(-4.0, 4.0); d.vull = spu_cmpeq(a.vd, b.vd); for (j=0; j<2; j++) { exp = (a.d[j] == b.d[j]) ? (((unsigned long long)(0xFFFFFFFF) << 32) | (unsigned long long)(0xFFFFFFFF)) : 0; if (exp != d.ull[j]) abort(); } } /* compare zeros */ d.vull = spu_cmpeq(a0.vd, b0.vd); for (j=0; j<2; j++) { exp = (a0.d[j] == b0.d[j]) ? (((unsigned long long)(0xFFFFFFFF) << 32) | (unsigned long long)(0xFFFFFFFF)) : 0; if (exp != d.ull[j]) abort(); } /* compare NaNs */ d.vull = spu_cmpeq(a1.vd, b1.vd); for (j=0; j<2; j++) { exp = (a1.d[j] == b1.d[j]) ? (((unsigned long long)(0xFFFFFFFF) << 32) | (unsigned long long)(0xFFFFFFFF)) : 0; if (exp != d.ull[j]) abort(); } return 0; } int test_spu_cmpgt() { int i, j; unsigned long long exp; /* double */ for (i=0; i<samples; i++) { a.vd = rand_vd(-4.0, 4.0); b.vd = rand_vd(-4.0, 4.0); d.vull = spu_cmpgt(a.vd, b.vd); for (j=0; j<2; j++) { exp = (a.d[j] > b.d[j]) ? (((unsigned long long)(0xFFFFFFFF) << 32) | (unsigned long long)(0xFFFFFFFF)) : 0; if (exp != d.ull[j]) abort(); } } /* compare zeros */ d.vull = spu_cmpgt(a0.vd, b0.vd); for (j=0; j<2; j++) { exp = (a0.d[j] > b0.d[j]) ? (((unsigned long long)(0xFFFFFFFF) << 32) | (unsigned long long)(0xFFFFFFFF)) : 0; if (exp != d.ull[j]) abort(); } /* compare NaNs */ d.vull = spu_cmpgt(a1.vd, b1.vd); for (j=0; j<2; j++) { exp = (a1.d[j] > b1.d[j]) ? (((unsigned long long)(0xFFFFFFFF) << 32) | (unsigned long long)(0xFFFFFFFF)) : 0; if (exp != d.ull[j]) abort(); } return 0; } int test_spu_cmpabseq() { int i, j; unsigned long long exp; /* double */ for (i=0; i<samples; i++) { a.vd = rand_vd(-4.0, 4.0); b.vd = rand_vd(-4.0, 4.0); d.vull = spu_cmpabseq(a.vd, b.vd); for (j=0; j<2; j++) { exp = ((a.d[j] == b.d[j]) || (-a.d[j] == b.d[j]) || (a.d[j] == -b.d[j])) ? (((unsigned long long)(0xFFFFFFFF) << 32) | (unsigned long long)(0xFFFFFFFF)) : 0; if (exp != d.ull[j]) abort(); } } /* compare zeros */ d.vull = spu_cmpabseq(a0.vd, b0.vd); for (j=0; j<2; j++) { exp = ((a0.d[j] == b0.d[j]) || (-a0.d[j] == b0.d[j]) || (a0.d[j] == -b0.d[j])) ? (((unsigned long long)(0xFFFFFFFF) << 32) | (unsigned long long)(0xFFFFFFFF)) : 0; if (exp != d.ull[j]) abort(); } /* compare NaNs */ d.vull = spu_cmpabseq(a1.vd, b1.vd); for (j=0; j<2; j++) { exp = ((a1.d[j] == b1.d[j]) || (-a1.d[j] == b1.d[j]) || (a1.d[j] == -b1.d[j])) ? (((unsigned long long)(0xFFFFFFFF) << 32) | (unsigned long long)(0xFFFFFFFF)) : 0; if (exp != d.ull[j]) abort(); } return 0; } int test_spu_cmpabsgt() { int i, j; unsigned long long exp; double abs_a, abs_b; /* double */ for (i=0; i<samples; i++) { a.vd = rand_vd(-4.0, 4.0); b.vd = rand_vd(-4.0, 4.0); d.vull = spu_cmpabsgt(a.vd, b.vd); for (j=0; j<2; j++) { double abs_a = (a.d[j] < 0.0) ? -a.d[j] : a.d[j]; double abs_b = (b.d[j] < 0.0) ? -b.d[j] : b.d[j]; exp = (abs_a > abs_b) ? (((unsigned long long)(0xFFFFFFFF) << 32) | (unsigned long long)(0xFFFFFFFF)) : 0; if (exp != d.ull[j]) abort(); } } /* compare zeros */ d.vull = spu_cmpabsgt(a0.vd, b0.vd); for (j=0; j<2; j++) { abs_a = (a0.d[j] < 0.0) ? -a0.d[j] : a0.d[j]; abs_b = (b0.d[j] < 0.0) ? -b0.d[j] : b0.d[j]; exp = (abs_a > abs_b) ? (((unsigned long long)(0xFFFFFFFF) << 32) | (unsigned long long)(0xFFFFFFFF)) : 0; if (exp != d.ull[j]) abort(); } /* compare NaNs */ d.vull = spu_cmpabsgt(a1.vd, b1.vd); for (j=0; j<2; j++) { abs_a = (a1.d[j] < 0.0) ? -a1.d[j] : a1.d[j]; abs_b = (b1.d[j] < 0.0) ? -b1.d[j] : b1.d[j]; exp = (abs_a > abs_b) ? (((unsigned long long)(0xFFFFFFFF) << 32) | (unsigned long long)(0xFFFFFFFF)) : 0; if (exp != d.ull[j]) abort(); } return 0; } int test_spu_testsv() { int i, j; unsigned long long exp; struct _samples { unsigned long long v; unsigned int sv; } samples[] = { {0x0000000000000000ULL, SPU_SV_POS_ZERO}, {0x8000000000000000ULL, SPU_SV_NEG_ZERO}, {0x0000000000000001ULL, SPU_SV_POS_DENORM}, {0x0000000080000000ULL, SPU_SV_POS_DENORM}, {0x0000000100000000ULL, SPU_SV_POS_DENORM}, {0x0008000000000000ULL, SPU_SV_POS_DENORM}, {0x000FFFFFFFFFFFFFULL, SPU_SV_POS_DENORM}, {0x00000000FFF00000ULL, SPU_SV_POS_DENORM}, {0x8000000000000001ULL, SPU_SV_NEG_DENORM}, {0x8000000080000000ULL, SPU_SV_NEG_DENORM}, {0x8000000100000000ULL, SPU_SV_NEG_DENORM}, {0x8008000000000000ULL, SPU_SV_NEG_DENORM}, {0x800FFFFFFFFFFFFFULL, SPU_SV_NEG_DENORM}, {0x80000000FFF00000ULL, SPU_SV_NEG_DENORM}, {0x0010000000000000ULL, 0}, {0x0010000000000001ULL, 0}, {0x3FF0000000000000ULL, 0}, {0x3FF00000FFF00000ULL, 0}, {0xBFF0000000000000ULL, 0}, {0xBFF00000FFF00000ULL, 0}, {0x7FE0000000000000ULL, 0}, {0x7FEFFFFFFFFFFFFFULL, 0}, {0x8010000000000000ULL, 0}, {0x8010000000000001ULL, 0}, {0xFFE0000000000000ULL, 0}, {0xFFEFFFFFFFFFFFFFULL, 0}, {0x7FF0000000000000ULL, SPU_SV_POS_INFINITY}, {0xFFF0000000000000ULL, SPU_SV_NEG_INFINITY}, {0x7FF0000000000001ULL, SPU_SV_NAN}, {0x7FF0000080000000ULL, SPU_SV_NAN}, {0x7FF0000100000000ULL, SPU_SV_NAN}, {0x7FFFFFFFFFFFFFFFULL, SPU_SV_NAN}, {0xFFF0000000000001ULL, SPU_SV_NAN}, {0xFFF0000080000000ULL, SPU_SV_NAN}, {0xFFF0000100000000ULL, SPU_SV_NAN}, {0xFFFFFFFFFFFFFFFFULL, SPU_SV_NAN} }; unsigned char cnt = sizeof(samples)/sizeof(struct _samples); int e0; for (e0=0; e0<cnt; e0++) { a.ull[0] = samples[e0].v; a.d[1] = rand_double(-1, -4); d.vull = spu_testsv(a.vd, SPU_SV_NEG_DENORM); exp = (SPU_SV_NEG_DENORM & samples[e0].sv) ? 0xFFFFFFFFFFFFFFFFULL : 0ULL; if (exp != d.ull[0] || d.ull[1] != 0) abort(); d.vull = spu_testsv(a.vd, SPU_SV_POS_DENORM); exp = (SPU_SV_POS_DENORM & samples[e0].sv) ? 0xFFFFFFFFFFFFFFFFULL : 0ULL; if (exp != d.ull[0] || d.ull[1] != 0) abort(); d.vull = spu_testsv(a.vd, SPU_SV_NEG_ZERO); exp = (SPU_SV_NEG_ZERO & samples[e0].sv) ? 0xFFFFFFFFFFFFFFFFULL : 0ULL; if (exp != d.ull[0] || d.ull[1] != 0) abort(); d.vull = spu_testsv(a.vd, SPU_SV_POS_ZERO); exp = (SPU_SV_POS_ZERO & samples[e0].sv) ? 0xFFFFFFFFFFFFFFFFULL : 0ULL; if (exp != d.ull[0] || d.ull[1] != 0) abort(); d.vull = spu_testsv(a.vd, SPU_SV_NEG_INFINITY); exp = (SPU_SV_NEG_INFINITY & samples[e0].sv) ? 0xFFFFFFFFFFFFFFFFULL : 0ULL; if (exp != d.ull[0] || d.ull[1] != 0) abort(); d.vull = spu_testsv(a.vd, SPU_SV_POS_INFINITY); exp = (SPU_SV_POS_INFINITY & samples[e0].sv) ? 0xFFFFFFFFFFFFFFFFULL : 0ULL; if (exp != d.ull[0] || d.ull[1] != 0) abort(); d.vull = spu_testsv(a.vd, SPU_SV_NAN); exp = (SPU_SV_NAN & samples[e0].sv) ? 0xFFFFFFFFFFFFFFFFULL : 0ULL; if (exp != d.ull[0] || d.ull[1] != 0) abort(); } return 0; } int main() { /* +0.0 and -0.0 */ a0.d[0] = 0.0; a0.d[1] = -0.0; b0.d[0] = -0.0; b0.d[1] = 0.0; /* NaN */ a1.d[0] = 0.0/0.0; a1.d[1] = 0.0/-0.0; b1.d[0] = -0.0/0.0; b1.d[1] = -0.0/-0.0; test_spu_cmpeq(); test_spu_cmpabseq(); test_spu_cmpgt(); test_spu_cmpabsgt(); test_spu_testsv(); return 0; }
Go to most recent revision | Compare with Previous | Blame | View Log