1 /* { dg-do run } */
2 /* { dg-options "-O2 -fno-strict-aliasing -msse2" } */
3 /* { dg-additional-options "-mno-mmx" { target { ! ia32 } } } */
4 
5 #include "sse2-check.h"
6 #include "mmx-vals.h"
7 
8 __attribute__((noinline, noclone))
9 static void
test_psllwi(long long * ll1,unsigned int imm,long long * r)10 test_psllwi  (long long *ll1, unsigned int imm, long long *r)
11 {
12   __m64 t1 = *(__m64 *) ll1;
13   switch (imm)
14     {
15     case 0:
16       *(__m64 *) r = _m_pslldi (t1, 0);
17       break;
18     case 1:
19       *(__m64 *) r = _m_pslldi (t1, 1);
20       break;
21     case 2:
22       *(__m64 *) r = _m_pslldi (t1, 2);
23       break;
24     case 3:
25       *(__m64 *) r = _m_pslldi (t1, 3);
26       break;
27     case 4:
28       *(__m64 *) r = _m_pslldi (t1, 4);
29       break;
30     case 5:
31       *(__m64 *) r = _m_pslldi (t1, 5);
32       break;
33     case 6:
34       *(__m64 *) r = _m_pslldi (t1, 6);
35       break;
36     case 7:
37       *(__m64 *) r = _m_pslldi (t1, 7);
38       break;
39     case 8:
40       *(__m64 *) r = _m_pslldi (t1, 8);
41       break;
42     case 9:
43       *(__m64 *) r = _m_pslldi (t1, 9);
44       break;
45     case 10:
46       *(__m64 *) r = _m_pslldi (t1, 10);
47       break;
48     case 11:
49       *(__m64 *) r = _m_pslldi (t1, 11);
50       break;
51     case 12:
52       *(__m64 *) r = _m_pslldi (t1, 12);
53       break;
54     case 13:
55       *(__m64 *) r = _m_pslldi (t1, 13);
56       break;
57     case 14:
58       *(__m64 *) r = _m_pslldi (t1, 14);
59       break;
60     case 15:
61       *(__m64 *) r = _m_pslldi (t1, 15);
62       break;
63     case 16:
64       *(__m64 *) r = _m_pslldi (t1, 16);
65       break;
66     case 17:
67       *(__m64 *) r = _m_pslldi (t1, 17);
68       break;
69     case 18:
70       *(__m64 *) r = _m_pslldi (t1, 18);
71       break;
72     case 19:
73       *(__m64 *) r = _m_pslldi (t1, 19);
74       break;
75     case 20:
76       *(__m64 *) r = _m_pslldi (t1, 20);
77       break;
78     case 21:
79       *(__m64 *) r = _m_pslldi (t1, 21);
80       break;
81     case 22:
82       *(__m64 *) r = _m_pslldi (t1, 22);
83       break;
84     case 23:
85       *(__m64 *) r = _m_pslldi (t1, 23);
86       break;
87     case 24:
88       *(__m64 *) r = _m_pslldi (t1, 24);
89       break;
90     case 25:
91       *(__m64 *) r = _m_pslldi (t1, 25);
92       break;
93     case 26:
94       *(__m64 *) r = _m_pslldi (t1, 26);
95       break;
96     case 27:
97       *(__m64 *) r = _m_pslldi (t1, 27);
98       break;
99     case 28:
100       *(__m64 *) r = _m_pslldi (t1, 28);
101       break;
102     case 29:
103       *(__m64 *) r = _m_pslldi (t1, 29);
104       break;
105     case 30:
106       *(__m64 *) r = _m_pslldi (t1, 30);
107       break;
108     case 31:
109       *(__m64 *) r = _m_pslldi (t1, 31);
110       break;
111     default:
112       *(__m64 *) r = _m_pslldi (t1, 32);
113       break;
114     }
115 }
116 
117 /* Routine to manually compute the results */
118 static void
compute_correct_result(long long * src_p,unsigned int imm,long long * res_p)119 compute_correct_result (long long *src_p, unsigned int imm,
120 			long long *res_p)
121 {
122   unsigned int *src = (unsigned int *) src_p;
123   unsigned int *res = (unsigned int *) res_p;
124   int i;
125   if (imm > 31)
126     for (i = 0; i < 2; i++)
127       res[i] = 0;
128   else
129     for (i = 0; i < 2; i++)
130       res[i] = src[i] << imm;
131 }
132 
133 static void
sse2_test(void)134 sse2_test (void)
135 {
136   int i;
137   unsigned int count;
138   long long r, ck;
139   int fail = 0;
140 
141   /* Run the MMX tests */
142   for (i = 0; i < MMX_num_ops; i++)
143     {
144       count = MMXops[i];
145       test_psllwi (&MMXops[i], count, &r);
146       compute_correct_result (&MMXops[i], count, &ck);
147       if (ck != r)
148 	  fail++;
149       }
150 
151   if (fail != 0)
152     abort ();
153 }
154