1 /* PR target/pr65105 */
2 /* { dg-do run { target ia32 } } */
3 /* { dg-options "-O2 -msse2 -mtune=slm -mno-stackrealign -save-temps" } */
4 /* { dg-require-effective-target sse2 } */
5 /* { dg-final { scan-assembler "por" } } */
6 /* { dg-final { scan-assembler "pand" } } */
7 
8 #include "sse2-check.h"
9 
10 #include "stdlib.h"
11 
12 static int count = 0;
13 
14 void __attribute__((noinline))
counter(long long l)15 counter (long long l)
16 {
17   count++;
18   if (!l || count > 5)
19     exit (1);
20 }
21 
22 void __attribute__((noinline))
test(long long * arr)23 test (long long *arr)
24 {
25   register unsigned long long tmp;
26 
27   tmp = arr[0] | arr[1] & arr[2];
28   while (tmp)
29     {
30       counter (tmp);
31       tmp = *(arr++) & tmp;
32     }
33 }
34 
35 void  __attribute__((noinline))
fill_data(long long * arr)36 fill_data (long long *arr)
37 {
38   arr[0] = 0x00ffffffL;
39   arr[1] = 0xffffff00L;
40   arr[2] = 0x00ffffffL;
41   arr[3] = 0x0000ff00L;
42   arr[4] = 0x00ff0000L;
43   arr[5] = 0xff000000L;
44 }
45 
46 static void
sse2_test(void)47 sse2_test (void)
48 {
49   long long arr[6];
50   fill_data (arr);
51   test (arr);
52 
53   if (count != 5)
54     __builtin_abort ();
55 }
56