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_psrawi(long long * ll1,unsigned int imm,long long * r)10 test_psrawi (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_psrawi (t1, 0);
17 break;
18 case 1:
19 *(__m64 *) r = _m_psrawi (t1, 1);
20 break;
21 case 2:
22 *(__m64 *) r = _m_psrawi (t1, 2);
23 break;
24 case 3:
25 *(__m64 *) r = _m_psrawi (t1, 3);
26 break;
27 case 4:
28 *(__m64 *) r = _m_psrawi (t1, 4);
29 break;
30 case 5:
31 *(__m64 *) r = _m_psrawi (t1, 5);
32 break;
33 case 6:
34 *(__m64 *) r = _m_psrawi (t1, 6);
35 break;
36 case 7:
37 *(__m64 *) r = _m_psrawi (t1, 7);
38 break;
39 case 8:
40 *(__m64 *) r = _m_psrawi (t1, 8);
41 break;
42 case 9:
43 *(__m64 *) r = _m_psrawi (t1, 9);
44 break;
45 case 10:
46 *(__m64 *) r = _m_psrawi (t1, 10);
47 break;
48 case 11:
49 *(__m64 *) r = _m_psrawi (t1, 11);
50 break;
51 case 12:
52 *(__m64 *) r = _m_psrawi (t1, 12);
53 break;
54 case 13:
55 *(__m64 *) r = _m_psrawi (t1, 13);
56 break;
57 case 14:
58 *(__m64 *) r = _m_psrawi (t1, 14);
59 break;
60 case 15:
61 *(__m64 *) r = _m_psrawi (t1, 15);
62 break;
63 default:
64 *(__m64 *) r = _m_psrawi (t1, 16);
65 break;
66 }
67 }
68
69 /* Routine to manually compute the results */
70 static void
compute_correct_result(long long * src_p,unsigned int imm,long long * res_p)71 compute_correct_result (long long *src_p, unsigned int imm,
72 long long *res_p)
73 {
74 short *src = (short *) src_p;
75 short *res = (short *) res_p;
76 int i;
77 if (imm > 15)
78 for (i = 0; i < 4; i++)
79 res[i] = src[i] < 0 ? -1 : 0;
80 else
81 for (i = 0; i < 4; i++)
82 res[i] = src[i] >> imm;
83 }
84
85 static void
sse2_test(void)86 sse2_test (void)
87 {
88 int i;
89 unsigned int count;
90 long long r, ck;
91 int fail = 0;
92
93 /* Run the MMX tests */
94 for (i = 0; i < MMX_num_ops; i++)
95 {
96 count = MMXops[i];
97 test_psrawi (&MMXops[i], count, &r);
98 compute_correct_result (&MMXops[i], count, &ck);
99 if (ck != r)
100 fail++;
101 }
102
103 if (fail != 0)
104 abort ();
105 }
106