x86: Add gcc.target/i386/strncmp-1.c
Add a strncmp test for the cmpstrn pattern with neither of the strings is a constant string. We can expand the cmpstrn pattern to "repz cmpsb" only if one of the strings is a constant so that expand_builtin_strncmp() can write the length argument to be the minimum of the const string length and the actual length argument. Otherwise, "repz cmpsb" may pass the 0 byte. * gcc.target/i386/strncmp-1.c: New test.
This commit is contained in:
parent
e7e785dfec
commit
cc558e2801
|
@ -1,3 +1,7 @@
|
|||
2020-05-17 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* gcc.target/i386/strncmp-1.c: New test.
|
||||
|
||||
2020-05-16 Iain Sandoe <iain@sandoe.co.uk>
|
||||
|
||||
* g++.dg/coroutines/co-return-syntax-10-movable.C: New test.
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
/* { dg-do run { target mmap } } */
|
||||
/* { dg-options "-O2" } */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#ifndef MAP_ANONYMOUS
|
||||
#define MAP_ANONYMOUS MAP_ANON
|
||||
#endif
|
||||
|
||||
int
|
||||
__attribute__ ((noclone, noinline))
|
||||
compare (char *d, char *s, unsigned int l)
|
||||
{
|
||||
return __builtin_strncmp (d, s, l);
|
||||
}
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
size_t page_size = sysconf(_SC_PAGESIZE);
|
||||
char *buf = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
if (buf == MAP_FAILED)
|
||||
{
|
||||
perror ("mmap");
|
||||
abort ();
|
||||
}
|
||||
|
||||
if (mprotect (buf + page_size, page_size, PROT_NONE))
|
||||
{
|
||||
perror ("mprotect");
|
||||
abort ();
|
||||
}
|
||||
|
||||
char *src1 = buf + page_size - sizeof ("foo");
|
||||
char *src2 = buf;
|
||||
memcpy (src1, "foo", sizeof ("foo"));
|
||||
memcpy (src2, "foo", sizeof ("foo"));
|
||||
int result = compare (src1, src2, sizeof ("foo") + 16);
|
||||
if (result != 0)
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue