2 /* { dg-options "-std=c99" } */
4 extern void abort (void);
5 extern void exit (int);
11 unsigned long long ull
[2];
15 static v128 a
, b
, c
, d
, a0
, b0
, a1
, b1
;
16 static int samples
= 10;
17 unsigned int seed
= 0;
19 unsigned int rand_local()
21 seed
= seed
* 69607 + 54329;
25 double rand_double(double min
, double max
)
32 x
.ui
[0] = (rand_local() & 0x000FFFFF) | 0x3FF00000;
33 x
.ui
[1] = rand_local();
40 vec_double2
rand_vd(double min
, double max
)
45 for (i
=0; i
<2; i
++) val
.d
[i
] = rand_double(min
, max
);
52 unsigned long long exp
;
55 for (i
=0; i
<samples
; i
++) {
56 a
.vd
= rand_vd(-4.0, 4.0);
57 b
.vd
= rand_vd(-4.0, 4.0);
58 d
.vull
= spu_cmpeq(a
.vd
, b
.vd
);
60 exp
= (a
.d
[j
] == b
.d
[j
]) ?
61 (((unsigned long long)(0xFFFFFFFF) << 32)
62 | (unsigned long long)(0xFFFFFFFF)) : 0;
63 if (exp
!= d
.ull
[j
]) abort();
68 d
.vull
= spu_cmpeq(a0
.vd
, b0
.vd
);
70 exp
= (a0
.d
[j
] == b0
.d
[j
]) ?
71 (((unsigned long long)(0xFFFFFFFF) << 32)
72 | (unsigned long long)(0xFFFFFFFF)) : 0;
73 if (exp
!= d
.ull
[j
]) abort();
77 d
.vull
= spu_cmpeq(a1
.vd
, b1
.vd
);
79 exp
= (a1
.d
[j
] == b1
.d
[j
]) ?
80 (((unsigned long long)(0xFFFFFFFF) << 32)
81 | (unsigned long long)(0xFFFFFFFF)) : 0;
82 if (exp
!= d
.ull
[j
]) abort();
90 unsigned long long exp
;
93 for (i
=0; i
<samples
; i
++) {
94 a
.vd
= rand_vd(-4.0, 4.0);
95 b
.vd
= rand_vd(-4.0, 4.0);
96 d
.vull
= spu_cmpgt(a
.vd
, b
.vd
);
98 exp
= (a
.d
[j
] > b
.d
[j
]) ?
99 (((unsigned long long)(0xFFFFFFFF) << 32)
100 | (unsigned long long)(0xFFFFFFFF)) : 0;
101 if (exp
!= d
.ull
[j
]) abort();
106 d
.vull
= spu_cmpgt(a0
.vd
, b0
.vd
);
107 for (j
=0; j
<2; j
++) {
108 exp
= (a0
.d
[j
] > b0
.d
[j
]) ?
109 (((unsigned long long)(0xFFFFFFFF) << 32)
110 | (unsigned long long)(0xFFFFFFFF)) : 0;
111 if (exp
!= d
.ull
[j
]) abort();
114 d
.vull
= spu_cmpgt(a1
.vd
, b1
.vd
);
115 for (j
=0; j
<2; j
++) {
116 exp
= (a1
.d
[j
] > b1
.d
[j
]) ?
117 (((unsigned long long)(0xFFFFFFFF) << 32)
118 | (unsigned long long)(0xFFFFFFFF)) : 0;
119 if (exp
!= d
.ull
[j
]) abort();
124 int test_spu_cmpabseq()
127 unsigned long long exp
;
130 for (i
=0; i
<samples
; i
++) {
131 a
.vd
= rand_vd(-4.0, 4.0);
132 b
.vd
= rand_vd(-4.0, 4.0);
133 d
.vull
= spu_cmpabseq(a
.vd
, b
.vd
);
134 for (j
=0; j
<2; j
++) {
135 exp
= ((a
.d
[j
] == b
.d
[j
]) || (-a
.d
[j
] == b
.d
[j
]) || (a
.d
[j
] == -b
.d
[j
])) ?
136 (((unsigned long long)(0xFFFFFFFF) << 32)
137 | (unsigned long long)(0xFFFFFFFF)) : 0;
138 if (exp
!= d
.ull
[j
]) abort();
143 d
.vull
= spu_cmpabseq(a0
.vd
, b0
.vd
);
144 for (j
=0; j
<2; j
++) {
145 exp
= ((a0
.d
[j
] == b0
.d
[j
]) || (-a0
.d
[j
] == b0
.d
[j
]) || (a0
.d
[j
] == -b0
.d
[j
])) ?
146 (((unsigned long long)(0xFFFFFFFF) << 32)
147 | (unsigned long long)(0xFFFFFFFF)) : 0;
148 if (exp
!= d
.ull
[j
]) abort();
152 d
.vull
= spu_cmpabseq(a1
.vd
, b1
.vd
);
153 for (j
=0; j
<2; j
++) {
154 exp
= ((a1
.d
[j
] == b1
.d
[j
]) || (-a1
.d
[j
] == b1
.d
[j
]) || (a1
.d
[j
] == -b1
.d
[j
])) ?
155 (((unsigned long long)(0xFFFFFFFF) << 32)
156 | (unsigned long long)(0xFFFFFFFF)) : 0;
157 if (exp
!= d
.ull
[j
]) abort();
162 int test_spu_cmpabsgt()
165 unsigned long long exp
;
169 for (i
=0; i
<samples
; i
++) {
170 a
.vd
= rand_vd(-4.0, 4.0);
171 b
.vd
= rand_vd(-4.0, 4.0);
172 d
.vull
= spu_cmpabsgt(a
.vd
, b
.vd
);
173 for (j
=0; j
<2; j
++) {
174 double abs_a
= (a
.d
[j
] < 0.0) ? -a
.d
[j
] : a
.d
[j
];
175 double abs_b
= (b
.d
[j
] < 0.0) ? -b
.d
[j
] : b
.d
[j
];
176 exp
= (abs_a
> abs_b
) ?
177 (((unsigned long long)(0xFFFFFFFF) << 32)
178 | (unsigned long long)(0xFFFFFFFF)) : 0;
179 if (exp
!= d
.ull
[j
]) abort();
184 d
.vull
= spu_cmpabsgt(a0
.vd
, b0
.vd
);
185 for (j
=0; j
<2; j
++) {
186 abs_a
= (a0
.d
[j
] < 0.0) ? -a0
.d
[j
] : a0
.d
[j
];
187 abs_b
= (b0
.d
[j
] < 0.0) ? -b0
.d
[j
] : b0
.d
[j
];
188 exp
= (abs_a
> abs_b
) ?
189 (((unsigned long long)(0xFFFFFFFF) << 32)
190 | (unsigned long long)(0xFFFFFFFF)) : 0;
191 if (exp
!= d
.ull
[j
]) abort();
194 d
.vull
= spu_cmpabsgt(a1
.vd
, b1
.vd
);
195 for (j
=0; j
<2; j
++) {
196 abs_a
= (a1
.d
[j
] < 0.0) ? -a1
.d
[j
] : a1
.d
[j
];
197 abs_b
= (b1
.d
[j
] < 0.0) ? -b1
.d
[j
] : b1
.d
[j
];
198 exp
= (abs_a
> abs_b
) ?
199 (((unsigned long long)(0xFFFFFFFF) << 32)
200 | (unsigned long long)(0xFFFFFFFF)) : 0;
201 if (exp
!= d
.ull
[j
]) abort();
206 int test_spu_testsv()
209 unsigned long long exp
;
211 unsigned long long v
;
214 {0x0000000000000000ULL
, SPU_SV_POS_ZERO
},
215 {0x8000000000000000ULL
, SPU_SV_NEG_ZERO
},
216 {0x0000000000000001ULL
, SPU_SV_POS_DENORM
},
217 {0x0000000080000000ULL
, SPU_SV_POS_DENORM
},
218 {0x0000000100000000ULL
, SPU_SV_POS_DENORM
},
219 {0x0008000000000000ULL
, SPU_SV_POS_DENORM
},
220 {0x000FFFFFFFFFFFFFULL
, SPU_SV_POS_DENORM
},
221 {0x00000000FFF00000ULL
, SPU_SV_POS_DENORM
},
222 {0x8000000000000001ULL
, SPU_SV_NEG_DENORM
},
223 {0x8000000080000000ULL
, SPU_SV_NEG_DENORM
},
224 {0x8000000100000000ULL
, SPU_SV_NEG_DENORM
},
225 {0x8008000000000000ULL
, SPU_SV_NEG_DENORM
},
226 {0x800FFFFFFFFFFFFFULL
, SPU_SV_NEG_DENORM
},
227 {0x80000000FFF00000ULL
, SPU_SV_NEG_DENORM
},
228 {0x0010000000000000ULL
, 0},
229 {0x0010000000000001ULL
, 0},
230 {0x3FF0000000000000ULL
, 0},
231 {0x3FF00000FFF00000ULL
, 0},
232 {0xBFF0000000000000ULL
, 0},
233 {0xBFF00000FFF00000ULL
, 0},
234 {0x7FE0000000000000ULL
, 0},
235 {0x7FEFFFFFFFFFFFFFULL
, 0},
236 {0x8010000000000000ULL
, 0},
237 {0x8010000000000001ULL
, 0},
238 {0xFFE0000000000000ULL
, 0},
239 {0xFFEFFFFFFFFFFFFFULL
, 0},
240 {0x7FF0000000000000ULL
, SPU_SV_POS_INFINITY
},
241 {0xFFF0000000000000ULL
, SPU_SV_NEG_INFINITY
},
242 {0x7FF0000000000001ULL
, SPU_SV_NAN
},
243 {0x7FF0000080000000ULL
, SPU_SV_NAN
},
244 {0x7FF0000100000000ULL
, SPU_SV_NAN
},
245 {0x7FFFFFFFFFFFFFFFULL
, SPU_SV_NAN
},
246 {0xFFF0000000000001ULL
, SPU_SV_NAN
},
247 {0xFFF0000080000000ULL
, SPU_SV_NAN
},
248 {0xFFF0000100000000ULL
, SPU_SV_NAN
},
249 {0xFFFFFFFFFFFFFFFFULL
, SPU_SV_NAN
}
252 unsigned char cnt
= sizeof(samples
)/sizeof(struct _samples
);
254 for (e0
=0; e0
<cnt
; e0
++)
256 a
.ull
[0] = samples
[e0
].v
;
257 a
.d
[1] = rand_double(-1, -4);
259 d
.vull
= spu_testsv(a
.vd
, SPU_SV_NEG_DENORM
);
260 exp
= (SPU_SV_NEG_DENORM
& samples
[e0
].sv
) ? 0xFFFFFFFFFFFFFFFFULL
: 0ULL;
261 if (exp
!= d
.ull
[0] || d
.ull
[1] != 0) abort();
263 d
.vull
= spu_testsv(a
.vd
, SPU_SV_POS_DENORM
);
264 exp
= (SPU_SV_POS_DENORM
& samples
[e0
].sv
) ? 0xFFFFFFFFFFFFFFFFULL
: 0ULL;
265 if (exp
!= d
.ull
[0] || d
.ull
[1] != 0) abort();
267 d
.vull
= spu_testsv(a
.vd
, SPU_SV_NEG_ZERO
);
268 exp
= (SPU_SV_NEG_ZERO
& samples
[e0
].sv
) ? 0xFFFFFFFFFFFFFFFFULL
: 0ULL;
269 if (exp
!= d
.ull
[0] || d
.ull
[1] != 0) abort();
271 d
.vull
= spu_testsv(a
.vd
, SPU_SV_POS_ZERO
);
272 exp
= (SPU_SV_POS_ZERO
& samples
[e0
].sv
) ? 0xFFFFFFFFFFFFFFFFULL
: 0ULL;
273 if (exp
!= d
.ull
[0] || d
.ull
[1] != 0) abort();
275 d
.vull
= spu_testsv(a
.vd
, SPU_SV_NEG_INFINITY
);
276 exp
= (SPU_SV_NEG_INFINITY
& samples
[e0
].sv
) ? 0xFFFFFFFFFFFFFFFFULL
: 0ULL;
277 if (exp
!= d
.ull
[0] || d
.ull
[1] != 0) abort();
279 d
.vull
= spu_testsv(a
.vd
, SPU_SV_POS_INFINITY
);
280 exp
= (SPU_SV_POS_INFINITY
& samples
[e0
].sv
) ? 0xFFFFFFFFFFFFFFFFULL
: 0ULL;
281 if (exp
!= d
.ull
[0] || d
.ull
[1] != 0) abort();
283 d
.vull
= spu_testsv(a
.vd
, SPU_SV_NAN
);
284 exp
= (SPU_SV_NAN
& samples
[e0
].sv
) ? 0xFFFFFFFFFFFFFFFFULL
: 0ULL;
285 if (exp
!= d
.ull
[0] || d
.ull
[1] != 0) abort();
293 a0
.d
[0] = 0.0; a0
.d
[1] = -0.0; b0
.d
[0] = -0.0; b0
.d
[1] = 0.0;
295 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;