1 /* https://bugs.kde.org/show_bug.cgi?id=309921 */
3 #define _XOPEN_SOURCE 600 /* for posix_memalign() */
5 #include "../../memcheck.h"
12 /* Exercise pcmpistri instruction in a realistic way. */
13 int aligned_strlen(const char *const s
)
15 assert(((unsigned long)s
& 0x0F) == 0);
19 /* volatile asm and "memory" clobber are needed here, since we
20 access memory in ways we cannot describe to GCC. */
21 __asm__
__volatile__ ("\n1:\n"
22 "\tmovdqa (%0),%%xmm6\n"
23 "\tpcmpistri $0x3a,%%xmm6,%%xmm6\n"
29 : "=p" (p
) : "0" (p
) : "xmm6", "rcx", "cc", "memory");
34 /* Compute strlen(s). Arrange for result to be valid or invalid
35 according to second argument. */
36 int test_strlen(const char *const s
, int valid
)
38 /* len = length of string including trailing null */
39 const size_t len
= strlen(s
) + 1;
40 const size_t roundup
= ((len
+15)/16)*16;
44 posix_memalign(&space
, 16, roundup
);
45 memset(space
, 'x', roundup
);
46 memcpy(space
, s
, len
);
48 const char *const s_copy
= space
;
49 const unsigned char ff
= 0xFF;
51 /* Mark all bytes beyond the null as invalid. */
53 for (i
=len
; i
< roundup
; ++i
)
54 (void)VALGRIND_SET_VBITS(&s_copy
[i
], &ff
, 1);
57 /* Mark the null byte itself as invalid. */
59 (void)VALGRIND_SET_VBITS(&s_copy
[len
-1], &ff
, 1);
62 result
= aligned_strlen(s_copy
);
69 void doit(const char *const s
)
71 printf("strlen(\"%s\")=%d\n", s
, test_strlen(s
, 1));
73 fprintf(stderr
, "strlen(\"%s\")=%s\n", s
,
74 test_strlen(s
, 0) ? "true" : "false");
77 int main(int argc
, char *argv
[])
93 doit("abcdefghijklm");
94 doit("abcdefghijklmn");
95 doit("abcdefghijklmno");
97 doit("abcdefghijklmnop");
98 doit("abcdefghijklmnopq");
99 doit("abcdefghijklmnopqr");
100 doit("abcdefghijklmnopqrs");
101 doit("abcdefghijklmnopqrst");
102 doit("abcdefghijklmnopqrstu");
103 doit("abcdefghijklmnopqrstuv");
104 doit("abcdefghijklmnopqrstuvw");
105 doit("abcdefghijklmnopqrstuwvx");
106 doit("abcdefghijklmnopqrstuwvxy");
107 doit("abcdefghijklmnopqrstuwvxyz");
109 doit("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
110 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
111 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
112 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
114 doit("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
115 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
116 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
117 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");