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