1 /* { dg-do run { target mmap } } */
2 /* { dg-options "-O2 -fno-strict-aliasing -msse2" } */
3 /* { dg-additional-options "-mno-mmx" { target { ! ia32 } } } */
4 
5 #include <unistd.h>
6 #include <sys/mman.h>
7 #ifndef MAP_ANONYMOUS
8 #define MAP_ANONYMOUS MAP_ANON
9 #endif
10 #include "sse2-check.h"
11 #include "mmx-vals.h"
12 
13 __attribute__((noinline, noclone))
14 static void
test_maskmovq(long long * ll1,long long * ll2,long long * r)15 test_maskmovq  (long long *ll1, long long *ll2, long long *r)
16 {
17   __m64 t1 = *(__m64 *) ll1;
18   __m64 t2 = *(__m64 *) ll2;
19    _m_maskmovq (t1, t2, (char *) r);
20 }
21 
22 /* Routine to manually compute the results */
23 static void
compute_correct_result(long long * dst_p,long long * src_p,long long * res_p)24 compute_correct_result (long long *dst_p, long long *src_p,
25 			long long *res_p)
26 {
27   char *dst = (char *) dst_p;
28   char *src = (char *) src_p;
29   char *res = (char *) res_p;
30   int i;
31   for (i = 0; i < 8; i++)
32     if ((src[i] & 0x80) != 0)
33       res[i] = dst[i];
34 }
35 
36 static void
do_maskmovq_test(long long * r)37 do_maskmovq_test (long long *r)
38 {
39   int i;
40   long long ck;
41   int fail = 0;
42 
43   /* Run the MMX tests */
44   for (i = 0; i < MMX_num_ops; i++)
45     {
46       r[0] = -1LL;
47       ck = -1LL;
48       test_maskmovq (&MMXops[i], &MMXops[i], r);
49       compute_correct_result (&MMXops[i], &MMXops[i], &ck);
50       if (*r != ck)
51 	fail++;
52     }
53 
54   if (fail != 0)
55     abort ();
56 }
57 
58 static void
sse2_test(void)59 sse2_test (void)
60 {
61   char *buf;
62   long long *r;
63   size_t page_size = sysconf(_SC_PAGESIZE);
64 
65   buf = mmap (0, 3 * page_size, PROT_READ | PROT_WRITE,
66 	      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
67   if (buf == MAP_FAILED)
68     {
69       perror ("mmap");
70       abort ();
71     }
72 
73   if (mprotect (buf, page_size, PROT_NONE))
74     {
75       perror ("mprotect");
76       abort ();
77     }
78 
79   if (mprotect (buf + 2 * page_size, page_size, PROT_NONE))
80     {
81       perror ("mprotect");
82       abort ();
83     }
84 
85   r = (long long *) (buf + page_size);
86   do_maskmovq_test (r);
87 
88   r = (long long *) (buf + page_size + 3);
89   do_maskmovq_test (r);
90 
91   r = (long long *) (buf + page_size + 11);
92   do_maskmovq_test (r);
93 
94   r = (long long *) (buf + 2 * page_size - 16);
95   do_maskmovq_test (r);
96 
97   r = (long long *) (buf + 2 * page_size - 16 + 3);
98   do_maskmovq_test (r);
99 
100   r = (long long *) (buf + 2 * page_size - 16 + 8);
101   do_maskmovq_test (r);
102 }
103