2 /* A program to test that SSE/SSE2 insns do not read memory they
3 should not. Covers insns of the form OP %xmm, %xmm and OP memory,
9 #include "tests/malloc.h"
12 typedef unsigned char V128
[16];
13 typedef unsigned int UInt
;
14 typedef signed int Int
;
15 typedef unsigned char UChar
;
32 static UChar
randUChar ( void )
34 static UInt seed
= 80021;
35 seed
= 1103515245 * seed
+ 12345;
36 return (seed
>> 17) & 0xFF;
39 static void randomise ( UChar
* p
, Int n
)
42 for (i
= 0; i
< n
; i
++)
46 static void randV128 ( V128
* v
)
49 for (i
= 0; i
< 16; i
++)
50 (*v
)[i
] = randUChar();
53 static void randRRArgs ( RRArgs
* rra
)
60 static void randRMArgs ( RMArgs
* rra
)
66 static void showV128 ( V128
* v
)
69 for (i
= 0; i
< 16; i
++)
70 printf("%02x", (Int
)(*v
)[i
]);
73 static void showMaskedV128 ( V128
* v
, V128
* mask
)
76 for (i
= 0; i
< 16; i
++)
77 printf("%02x", (Int
)( ((*v
)[i
]) & ((*mask
)[i
]) ));
80 static void showRR ( char* op
, RRArgs
* rra
, V128
* rmask
)
82 printf("r %10s ", op
);
87 showMaskedV128(&rra
->res
, rmask
);
91 static void showRM ( char* op
, RMArgs
* rra
, UChar
* mem
, Int nMem
, V128
* rmask
)
94 assert(nMem
== 4 || nMem
== 8 || nMem
== 16 || nMem
==0);
95 printf("m %10s ", op
);
96 for (i
= 0; i
< nMem
; i
++)
97 printf("%02x", (Int
)mem
[i
]);
101 showMaskedV128(&rra
->res
, rmask
);
105 #define Wrapper_RegReg(OP) \
106 void r_r_##OP ( RRArgs* p ) \
108 __asm__ __volatile__("\n" \
109 "\tmovups 0(%0), %%xmm6\n" \
110 "\tmovups 16(%0), %%xmm7\n" \
111 "\t" #OP " %%xmm6, %%xmm7\n" \
112 "\tmovups %%xmm7, 32(%0)\n" \
115 : "memory", "xmm6", "xmm7", "cc" \
119 #define Wrapper_RegMem(OP) \
120 void r_m_##OP ( RMArgs* p, void* mem ) \
122 __asm__ __volatile__("\n" \
123 "\tmovups 0(%0), %%xmm7\n" \
124 "\t" #OP " 0(%1), %%xmm7\n" \
125 "\tmovups %%xmm7, 16(%0)\n" \
127 : "r" (p), "r" (mem) \
128 : "memory", "xmm7", "cc" \
133 #define TEST_INSN(res_mask,mem_size,insn) \
135 Wrapper_RegReg(insn) \
136 Wrapper_RegMem(insn) \
138 void do_##insn ( void ) \
142 RRArgs rargs __attribute__((aligned(16))); \
143 RMArgs margs __attribute__((aligned(16))); \
144 for (i = 0; i < 5; i++) { \
145 randRRArgs(&rargs); \
146 r_r_##insn(&rargs); \
147 showRR(#insn, &rargs, res_mask); \
149 for (i = 0; i < 5; i++) { \
150 randRMArgs(&margs); \
151 buf = memalign16(mem_size); \
152 randomise(buf,mem_size); \
153 r_m_##insn(&margs,buf); \
154 showRM(#insn, &margs, buf, mem_size, res_mask);\
159 /* Note: these are little endian. Hence first byte is the least
160 significant byte of lane zero. */
162 /* Mask for insns where all result bits are non-approximated. */
163 static V128 AllMask
= { 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,
164 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF };
166 /* Mark for insns which produce approximated vector short results. */
167 static V128 ApproxPS
= { 0x00,0x00,0x80,0xFF, 0x00,0x00,0x80,0xFF,
168 0x00,0x00,0x80,0xFF, 0x00,0x00,0x80,0xFF };
170 /* Mark for insns which produce approximated scalar short results. */
171 static V128 ApproxSS
= { 0x00,0x00,0x80,0xFF, 0xFF,0xFF,0xFF,0xFF,
172 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF };
179 /* ------------------------ SSE1 ------------------------ */
180 TEST_INSN( &AllMask
, PS
,addps
)
181 TEST_INSN( &AllMask
, SS
,addss
)
182 TEST_INSN( &AllMask
, PS
,andnps
)
183 TEST_INSN( &AllMask
, PS
,andps
)
184 TEST_INSN( &AllMask
, PS
,cmpeqps
)
185 TEST_INSN( &AllMask
, SS
,cmpeqss
)
186 TEST_INSN( &AllMask
, PS
,cmpleps
)
187 TEST_INSN( &AllMask
, SS
,cmpless
)
188 TEST_INSN( &AllMask
, PS
,cmpltps
)
189 TEST_INSN( &AllMask
, SS
,cmpltss
)
190 TEST_INSN( &AllMask
, PS
,cmpneqps
)
191 TEST_INSN( &AllMask
, SS
,cmpneqss
)
192 TEST_INSN( &AllMask
, PS
,cmpnleps
)
193 TEST_INSN( &AllMask
, SS
,cmpnless
)
194 TEST_INSN( &AllMask
, PS
,cmpnltps
)
195 TEST_INSN( &AllMask
, SS
,cmpnltss
)
196 TEST_INSN( &AllMask
, PS
,cmpordps
)
197 TEST_INSN( &AllMask
, SS
,cmpordss
)
198 TEST_INSN( &AllMask
, PS
,cmpunordps
)
199 TEST_INSN( &AllMask
, SS
,cmpunordss
)
200 TEST_INSN( &AllMask
, SS
,comiss
)
201 //TEST_INSN( &AllMask, 0,cvtpi2ps)
202 //TEST_INSN( &AllMask, 0,cvtps2pi)
203 //TEST_INSN( &AllMask, 0,cvtsi2ss)
204 //TEST_INSN( &AllMask, 0,cvtss2si)
205 //TEST_INSN( &AllMask, 0,cvttps2pi)
206 //TEST_INSN( &AllMask, 0,cvttss2si)
207 TEST_INSN( &AllMask
, PS
,divps
)
208 TEST_INSN( &AllMask
, SS
,divss
)
209 TEST_INSN( &AllMask
, PS
,maxps
)
210 TEST_INSN( &AllMask
, SS
,maxss
)
211 TEST_INSN( &AllMask
, PS
,minps
)
212 TEST_INSN( &AllMask
, SS
,minss
)
213 TEST_INSN( &AllMask
, 16,movaps
)
214 //TEST_INSN( &AllMask, 0,movhlps)
215 //TEST_INSN( &AllMask, 0,movhps)
216 //TEST_INSN( &AllMask, 0,movlhps)
217 //TEST_INSN( &AllMask, 0,movlps)
218 //TEST_INSN( &AllMask, 0,movmskps)
219 //TEST_INSN( &AllMask, 0,movntps)
220 //TEST_INSN( &AllMask, 0,movntq)
221 TEST_INSN( &AllMask
, 4,movss
)
222 TEST_INSN( &AllMask
, 16,movups
)
223 TEST_INSN( &AllMask
, PS
,mulps
)
224 TEST_INSN( &AllMask
, SS
,mulss
)
225 TEST_INSN( &AllMask
, PS
,orps
)
226 //TEST_INSN( &AllMask, 0,pavgb) -- dup with sse2?
227 //TEST_INSN( &AllMask, 0,pavgw) -- dup with sse2?
228 //TEST_INSN( &AllMask, 0,pextrw)
229 //TEST_INSN( &AllMask, 0,pinsrw)
230 //TEST_INSN( &AllMask, 0,pmaxsw) -- dup with sse2?
231 //TEST_INSN( &AllMask, 0,pmaxub) -- dup with sse2?
232 //TEST_INSN( &AllMask, 0,pminsw) -- dup with sse2?
233 //TEST_INSN( &AllMask, 0,pminub) -- dup with sse2?
234 //TEST_INSN( &AllMask, 0,pmovmskb)
235 //TEST_INSN( &AllMask, 0,pmulhuw) -- dup with sse2?
236 TEST_INSN( &AllMask
, 16,psadbw
) // -- XXXXXXXXXXXXXXXX sse2 (xmm variant) not implemented!
237 //TEST_INSN( &AllMask, 0,pshufw)
238 TEST_INSN(&ApproxPS
, PS
,rcpps
)
239 TEST_INSN(&ApproxSS
, SS
,rcpss
)
240 TEST_INSN(&ApproxPS
, PS
,rsqrtps
)
241 TEST_INSN(&ApproxSS
, SS
,rsqrtss
)
242 //TEST_INSN( &AllMask, PS,shufps)
243 TEST_INSN( &AllMask
, PS
,sqrtps
)
244 TEST_INSN( &AllMask
, SS
,sqrtss
)
245 TEST_INSN( &AllMask
, PS
,subps
)
246 TEST_INSN( &AllMask
, SS
,subss
)
247 TEST_INSN( &AllMask
, SS
,ucomiss
)
248 TEST_INSN( &AllMask
, PS
,unpckhps
)
249 TEST_INSN( &AllMask
, PS
,unpcklps
)
250 TEST_INSN( &AllMask
, PS
,xorps
)
253 /* ------------------------ SSE2 ------------------------ */
254 TEST_INSN( &AllMask
, PD
,addpd
)
255 TEST_INSN( &AllMask
, SD
,addsd
)
256 TEST_INSN( &AllMask
, PD
,andnpd
)
257 TEST_INSN( &AllMask
, PD
,andpd
)
258 TEST_INSN( &AllMask
, PD
,cmpeqpd
)
259 TEST_INSN( &AllMask
, SD
,cmpeqsd
)
260 TEST_INSN( &AllMask
, PD
,cmplepd
)
261 TEST_INSN( &AllMask
, SD
,cmplesd
)
262 TEST_INSN( &AllMask
, PD
,cmpltpd
)
263 TEST_INSN( &AllMask
, SD
,cmpltsd
)
264 TEST_INSN( &AllMask
, PD
,cmpneqpd
)
265 TEST_INSN( &AllMask
, SD
,cmpneqsd
)
266 TEST_INSN( &AllMask
, PD
,cmpnlepd
)
267 TEST_INSN( &AllMask
, SD
,cmpnlesd
)
268 TEST_INSN( &AllMask
, PD
,cmpnltpd
)
269 TEST_INSN( &AllMask
, SD
,cmpnltsd
)
270 TEST_INSN( &AllMask
, PD
,cmpordpd
)
271 TEST_INSN( &AllMask
, SD
,cmpordsd
)
272 TEST_INSN( &AllMask
, PD
,cmpunordpd
)
273 TEST_INSN( &AllMask
, SD
,cmpunordsd
)
274 TEST_INSN( &AllMask
, SD
,comisd
)
275 TEST_INSN( &AllMask
, 8,cvtdq2pd
)
276 TEST_INSN( &AllMask
, 16,cvtdq2ps
)
277 TEST_INSN( &AllMask
, 16,cvtpd2dq
)
278 //TEST_INSN( &AllMask, 0,cvtpd2pi)
279 TEST_INSN( &AllMask
, 16,cvtpd2ps
) /* reads 16 */
280 //TEST_INSN( &AllMask, 0,cvtpi2pd)
281 TEST_INSN( &AllMask
, 16,cvtps2dq
) /* reads 16 */
282 TEST_INSN( &AllMask
, 8,cvtps2pd
) /* reads 8 */
283 //TEST_INSN( &AllMask, 0,cvtsd2si)
284 TEST_INSN( &AllMask
, SD
,cvtsd2ss
) /* reads SD */
285 //TEST_INSN( &AllMask, 0,cvtsi2sd)
286 TEST_INSN( &AllMask
, SS
,cvtss2sd
) /* reads SS */
287 TEST_INSN( &AllMask
, 16,cvttpd2dq
)
288 //TEST_INSN( &AllMask, 0,cvttpd2pi)
289 TEST_INSN( &AllMask
, 16,cvttps2dq
)
290 //TEST_INSN( &AllMask, 0,cvttsd2si)
291 TEST_INSN( &AllMask
, PD
,divpd
)
292 TEST_INSN( &AllMask
, SD
,divsd
)
293 TEST_INSN( &AllMask
, PD
,maxpd
)
294 TEST_INSN( &AllMask
, SD
,maxsd
)
295 TEST_INSN( &AllMask
, PD
,minpd
)
296 TEST_INSN( &AllMask
, SD
,minsd
)
297 TEST_INSN( &AllMask
, PD
,movapd
)
298 //TEST_INSN( &AllMask, 8,movd)
299 //TEST_INSN( &AllMask, 0,movdq2q)
300 TEST_INSN( &AllMask
, 16,movdqa
)
301 TEST_INSN( &AllMask
, 16,movdqu
)
302 //TEST_INSN( &AllMask, 16,movhpd)
303 //TEST_INSN( &AllMask, 16,movlpd)
304 //TEST_INSN( &AllMask, 0,movmskpd)
305 //TEST_INSN( &AllMask, 0,movntdq)
306 //TEST_INSN( &AllMask, 0,movnti)
307 //TEST_INSN( &AllMask, 0,movntpd)
308 TEST_INSN( &AllMask
, 8,movq
)
309 //TEST_INSN( &AllMask, 0,movq2dq)
310 TEST_INSN( &AllMask
, 8,movsd
)
311 TEST_INSN( &AllMask
, 16,movupd
)
312 TEST_INSN( &AllMask
, PD
,mulpd
)
313 TEST_INSN( &AllMask
, SD
,mulsd
)
314 TEST_INSN( &AllMask
, PD
,orpd
)
315 TEST_INSN( &AllMask
, 16,packssdw
)
316 TEST_INSN( &AllMask
, 16,packsswb
)
317 TEST_INSN( &AllMask
, 16,packuswb
)
318 TEST_INSN( &AllMask
, 16,paddb
)
319 TEST_INSN( &AllMask
, 16,paddd
)
320 TEST_INSN( &AllMask
, 16,paddq
)
321 TEST_INSN( &AllMask
, 16,paddsb
)
322 TEST_INSN( &AllMask
, 16,paddsw
)
323 TEST_INSN( &AllMask
, 16,paddusb
)
324 TEST_INSN( &AllMask
, 16,paddusw
)
325 TEST_INSN( &AllMask
, 16,paddw
)
326 TEST_INSN( &AllMask
, 16,pand
)
327 TEST_INSN( &AllMask
, 16,pandn
)
328 TEST_INSN( &AllMask
, 16,pavgb
)
329 TEST_INSN( &AllMask
, 16,pavgw
)
330 TEST_INSN( &AllMask
, 16,pcmpeqb
)
331 TEST_INSN( &AllMask
, 16,pcmpeqd
)
332 TEST_INSN( &AllMask
, 16,pcmpeqw
)
333 TEST_INSN( &AllMask
, 16,pcmpgtb
)
334 TEST_INSN( &AllMask
, 16,pcmpgtd
)
335 TEST_INSN( &AllMask
, 16,pcmpgtw
)
336 //TEST_INSN( &AllMask, 16,pextrw)
337 //TEST_INSN( &AllMask, 16,pinsrw)
338 TEST_INSN( &AllMask
, 16,pmaxsw
)
339 TEST_INSN( &AllMask
, 16,pmaxub
)
340 TEST_INSN( &AllMask
, 16,pminsw
)
341 TEST_INSN( &AllMask
, 16,pminub
)
342 //TEST_INSN( &AllMask, 0,pmovmskb)
343 TEST_INSN( &AllMask
, 16,pmulhuw
)
344 TEST_INSN( &AllMask
, 16,pmulhw
)
345 TEST_INSN( &AllMask
, 16,pmullw
)
346 TEST_INSN( &AllMask
, 16,pmuludq
)
347 TEST_INSN( &AllMask
, 16,por
)
348 //TEST_INSN( &AllMask, 16,pshufd)
349 //TEST_INSN( &AllMask, 16,pshufhw)
350 //TEST_INSN( &AllMask, 16,pshuflw)
351 TEST_INSN( &AllMask
, 16,pslld
)
352 //TEST_INSN( &AllMask, 16,pslldq)
353 TEST_INSN( &AllMask
, 16,psllq
)
354 TEST_INSN( &AllMask
, 16,psllw
)
355 TEST_INSN( &AllMask
, 16,psrad
)
356 TEST_INSN( &AllMask
, 16,psraw
)
357 TEST_INSN( &AllMask
, 16,psrld
)
358 //TEST_INSN( &AllMask, 16,psrldq)
359 TEST_INSN( &AllMask
, 16,psrlq
)
360 TEST_INSN( &AllMask
, 16,psrlw
)
361 TEST_INSN( &AllMask
, 16,psubb
)
362 TEST_INSN( &AllMask
, 16,psubd
)
363 TEST_INSN( &AllMask
, 16,psubq
)
364 TEST_INSN( &AllMask
, 16,psubsb
)
365 TEST_INSN( &AllMask
, 16,psubsw
)
366 TEST_INSN( &AllMask
, 16,psubusb
)
367 TEST_INSN( &AllMask
, 16,psubusw
)
368 TEST_INSN( &AllMask
, 16,psubw
)
369 TEST_INSN( &AllMask
, 16,punpckhbw
)
370 TEST_INSN( &AllMask
, 16,punpckhdq
)
371 TEST_INSN( &AllMask
, 16,punpckhqdq
)
372 TEST_INSN( &AllMask
, 16,punpckhwd
)
373 TEST_INSN( &AllMask
, 16,punpcklbw
)
374 TEST_INSN( &AllMask
, 16,punpckldq
)
375 TEST_INSN( &AllMask
, 16,punpcklqdq
)
376 TEST_INSN( &AllMask
, 16,punpcklwd
)
377 TEST_INSN( &AllMask
, 16,pxor
)
378 //TEST_INSN( &AllMask, PD,shufpd)
379 TEST_INSN( &AllMask
, PD
,sqrtpd
)
380 TEST_INSN( &AllMask
, SD
,sqrtsd
)
381 TEST_INSN( &AllMask
, PD
,subpd
)
382 TEST_INSN( &AllMask
, SD
,subsd
)
383 TEST_INSN( &AllMask
, SD
,ucomisd
)
384 TEST_INSN( &AllMask
, PD
,unpckhpd
)
385 TEST_INSN( &AllMask
, PD
,unpcklpd
)
386 TEST_INSN( &AllMask
, PD
,xorpd
)
389 int main ( int argc
, char** argv
)
391 Int sse1
= 0, sse2
= 0;
393 if (argc
== 2 && 0==strcmp(argv
[1], "sse1")) {
397 if (argc
== 2 && 0==strcmp(argv
[1], "sse2")) {
401 if (argc
== 2 && 0==strcmp(argv
[1], "all")) {
405 fprintf(stderr
, "usage: sse_memory [sse1|sse2|all]\n");
409 /* ------------------------ SSE1 ------------------------ */
432 //TEST_INSN( &AllMask, 0,cvtpi2ps)
433 //TEST_INSN( &AllMask, 0,cvtps2pi)
434 //TEST_INSN( &AllMask, 0,cvtsi2ss)
435 //TEST_INSN( &AllMask, 0,cvtss2si)
436 //TEST_INSN( &AllMask, 0,cvttps2pi)
437 //TEST_INSN( &AllMask, 0,cvttss2si)
445 //TEST_INSN( &AllMask, 0,movhlps)
446 //TEST_INSN( &AllMask, 0,movhps)
447 //TEST_INSN( &AllMask, 0,movlhps)
448 //TEST_INSN( &AllMask, 0,movlps)
449 //TEST_INSN( &AllMask, 0,movmskps)
450 //TEST_INSN( &AllMask, 0,movntps)
451 //TEST_INSN( &AllMask, 0,movntq)
457 //TEST_INSN( &AllMask, 0,pavgb) -- dup with sse2?
458 //TEST_INSN( &AllMask, 0,pavgw) -- dup with sse2?
459 //TEST_INSN( &AllMask, 0,pextrw)
460 //TEST_INSN( &AllMask, 0,pinsrw)
461 //TEST_INSN( &AllMask, 0,pmaxsw) -- dup with sse2?
462 //TEST_INSN( &AllMask, 0,pmaxub) -- dup with sse2?
463 //TEST_INSN( &AllMask, 0,pminsw) -- dup with sse2?
464 //TEST_INSN( &AllMask, 0,pminub) -- dup with sse2?
465 //TEST_INSN( &AllMask, 0,pmovmskb)
466 //TEST_INSN( &AllMask, 0,pmulhuw) -- dup with sse2?
467 //do_psadbw(); -- XXXXXXXXXXXXXXXX sse2 (xmm variant) not implemented!
468 //TEST_INSN( &AllMask, 0,pshufw)
473 //TEST_INSN( &AllMask, PS,shufps)
484 /* ------------------------ SSE2 ------------------------ */
510 //TEST_INSN( &AllMask, 0,cvtpd2pi)
512 //TEST_INSN( &AllMask, 0,cvtpi2pd)
515 //TEST_INSN( &AllMask, 0,cvtsd2si)
517 //TEST_INSN( &AllMask, 0,cvtsi2sd)
520 //TEST_INSN( &AllMask, 0,cvttpd2pi)
522 //TEST_INSN( &AllMask, 0,cvttsd2si)
530 //TEST_INSN( &AllMask, 8,movd)
531 //TEST_INSN( &AllMask, 0,movdq2q)
534 //TEST_INSN( &AllMask, 16,movhpd)
535 //TEST_INSN( &AllMask, 16,movlpd)
536 //TEST_INSN( &AllMask, 0,movmskpd)
537 //TEST_INSN( &AllMask, 0,movntdq)
538 //TEST_INSN( &AllMask, 0,movnti)
539 //TEST_INSN( &AllMask, 0,movntpd)
541 //TEST_INSN( &AllMask, 0,movq2dq)
568 //TEST_INSN( &AllMask, 16,pextrw)
569 //TEST_INSN( &AllMask, 16,pinsrw)
574 //TEST_INSN( &AllMask, 0,pmovmskb)
580 //TEST_INSN( &AllMask, 16,pshufd)
581 //TEST_INSN( &AllMask, 16,pshufhw)
582 //TEST_INSN( &AllMask, 16,pshuflw)
584 //TEST_INSN( &AllMask, 16,pslldq)
590 //TEST_INSN( &AllMask, 16,psrldq)
610 //TEST_INSN( &AllMask, PD,shufpd)