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