diff options
author | Nick Clifton <nickc@redhat.com> | 2011-08-12 16:26:11 +0000 |
---|---|---|
committer | Nick Clifton <nickc@gcc.gnu.org> | 2011-08-12 16:26:11 +0000 |
commit | 9b0f6f5e511ca512e4faeabc81d2fd3abad9b02f (patch) | |
tree | a50ea2c82520d1f93b27686bceb3419f587bb2c8 /gcc/builtins.c | |
parent | c49b1a299e4be73819e3f12394eeb2681057e8fc (diff) | |
download | gcc-9b0f6f5e511ca512e4faeabc81d2fd3abad9b02f.zip gcc-9b0f6f5e511ca512e4faeabc81d2fd3abad9b02f.tar.gz gcc-9b0f6f5e511ca512e4faeabc81d2fd3abad9b02f.tar.bz2 |
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.
From-SVN: r177701
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 28 |
1 files changed, 8 insertions, 20 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index fec9322..e0afc90 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -3635,9 +3635,9 @@ expand_builtin_bzero (tree exp) } /* Expand expression EXP, which is a call to the memcmp built-in function. - Return NULL_RTX if we failed and the - caller should emit a normal call, otherwise try to get the result in - TARGET, if convenient (and in mode MODE, if that's convenient). */ + Return NULL_RTX if we failed and the caller should emit a normal call, + otherwise try to get the result in TARGET, if convenient (and in mode + MODE, if that's convenient). */ static rtx expand_builtin_memcmp (tree exp, ATTRIBUTE_UNUSED rtx target, @@ -3649,7 +3649,10 @@ expand_builtin_memcmp (tree exp, ATTRIBUTE_UNUSED rtx target, POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE)) return NULL_RTX; -#if defined HAVE_cmpmemsi || defined HAVE_cmpstrnsi + /* Note: The cmpstrnsi pattern, if it exists, is not suitable for + implementing memcmp because it will stop if it encounters two + zero bytes. */ +#if defined HAVE_cmpmemsi { rtx arg1_rtx, arg2_rtx, arg3_rtx; rtx result; @@ -3662,16 +3665,9 @@ expand_builtin_memcmp (tree exp, ATTRIBUTE_UNUSED rtx target, unsigned int arg2_align = get_pointer_alignment (arg2) / BITS_PER_UNIT; enum machine_mode insn_mode; -#ifdef HAVE_cmpmemsi if (HAVE_cmpmemsi) insn_mode = insn_data[(int) CODE_FOR_cmpmemsi].operand[0].mode; else -#endif -#ifdef HAVE_cmpstrnsi - if (HAVE_cmpstrnsi) - insn_mode = insn_data[(int) CODE_FOR_cmpstrnsi].operand[0].mode; - else -#endif return NULL_RTX; /* If we don't have POINTER_TYPE, call the function. */ @@ -3696,18 +3692,10 @@ expand_builtin_memcmp (tree exp, ATTRIBUTE_UNUSED rtx target, set_mem_size (arg2_rtx, INTVAL (arg3_rtx)); } -#ifdef HAVE_cmpmemsi if (HAVE_cmpmemsi) insn = gen_cmpmemsi (result, arg1_rtx, arg2_rtx, arg3_rtx, GEN_INT (MIN (arg1_align, arg2_align))); else -#endif -#ifdef HAVE_cmpstrnsi - if (HAVE_cmpstrnsi) - insn = gen_cmpstrnsi (result, arg1_rtx, arg2_rtx, arg3_rtx, - GEN_INT (MIN (arg1_align, arg2_align))); - else -#endif gcc_unreachable (); if (insn) @@ -3733,7 +3721,7 @@ expand_builtin_memcmp (tree exp, ATTRIBUTE_UNUSED rtx target, else return convert_to_mode (mode, result, 0); } -#endif +#endif /* HAVE_cmpmemsi. */ return NULL_RTX; } |