We used to expand memcmp to "repz cmpsb" via cmpstrnsi. It was changed by
commit 9b0f6f5e511ca512e4faeabc81d2fd3abad9b02f Author: Nick Clifton <ni...@redhat.com> Date: Fri Aug 12 16:26:11 2011 +0000 builtins.c (expand_builtin_memcmp): Do not use cmpstrnsi pattern. * builtins.c (expand_builtin_memcmp): Do not use cmpstrnsi pattern. * doc/md.texi (cmpstrn): Note that the comparison stops if both fetched bytes are zero. (cmpstr): Likewise. (cmpmem): Note that the comparison does not stop if both of the fetched bytes are zero. Duplicate the cmpstrn pattern for cmpmem and expand cmpmem to "repz cmpsb" for -minline-all-stringops. The only difference is that the length argument of cmpmem is guaranteed to be less than or equal to lengths of 2 memory areas. Since cmpmem expander may pass the actual string length directly to cmpstrnqi patterns. Pass a copy of the string length to cmpstrnqi patterns to avoid changing the actual string length by cmpstrnqi patterns. Tested on Linux/x86 and Linux/x86-64. OK for master? H.J. Lu (2): x86: Pass a copy of the string length to cmpstrnqi x86: Add cmpmemsi for -minline-all-stringops gcc/config/i386/i386-expand.c | 84 ++++++++++++++ gcc/config/i386/i386-protos.h | 1 + gcc/config/i386/i386.md | 80 ++++--------- gcc/testsuite/gcc.target/i386/pr95151-1.c | 17 +++ gcc/testsuite/gcc.target/i386/pr95151-2.c | 10 ++ gcc/testsuite/gcc.target/i386/pr95151-3.c | 18 +++ gcc/testsuite/gcc.target/i386/pr95151-4.c | 11 ++ gcc/testsuite/gcc.target/i386/pr95443-1.c | 130 ++++++++++++++++++++++ gcc/testsuite/gcc.target/i386/pr95443-2.c | 79 +++++++++++++ 9 files changed, 371 insertions(+), 59 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr95151-1.c create mode 100644 gcc/testsuite/gcc.target/i386/pr95151-2.c create mode 100644 gcc/testsuite/gcc.target/i386/pr95151-3.c create mode 100644 gcc/testsuite/gcc.target/i386/pr95151-4.c create mode 100644 gcc/testsuite/gcc.target/i386/pr95443-1.c create mode 100644 gcc/testsuite/gcc.target/i386/pr95443-2.c -- 2.26.2