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