Message ID | 1382175042.2445.84.camel@yam-132-YW-E178-FTW |
---|---|
State | New |
Headers | show |
Hi Oleg, On 10/19/2013 11:30 AM, Oleg Endo wrote: > > > I've attached two test cases, tested with > make -k check-gcc RUNTESTFLAGS="sh.exp=strcmp* --target_board=sh-sim > \{-m2/-ml,-m2/-mb,-m2a/-mb,-m4/-ml,-m4/-mb,-m4a/-ml,-m4a/-mb}" > > Could you please include them? > > Cheers, > Oleg > > thanks for having retested this, The tests are still not complete for RTL generated functions, there are cases where no str/cmp wil be emitted, because we can predict than the size is less than 4 and so have a direct fallthru into the byte at a byte loop copying. Also I will consider a size optimized implementation, so we don't jump to the library I will post examples for this shortly (and add them as a testcase) with a strncmp implementation helper, that pertains to strcmp with constant strings by the way. Please allow me some time to complete by benchmarking. thanks for the hints about removing empty "" is the expanders Kaz, before proceeding with the next patch, was your approval for 1/2 only or 2/2 with the expander cleanup ? Many thanks, Christian
Christian Bruel <christian.bruel@st.com> wrote: > thanks for having retested this, The tests are still not complete for > RTL generated functions, there are cases where no str/cmp wil be > emitted, because we can predict than the size is less than 4 and so have > a direct fallthru into the byte at a byte loop copying. > > Also I will consider a size optimized implementation, so we don't jump > to the library > > I will post examples for this shortly (and add them as a testcase) with > a strncmp implementation helper, that pertains to strcmp with constant > strings by the way. Please allow me some time to complete by benchmarking. > > thanks for the hints about removing empty "" is the expanders > > Kaz, before proceeding with the next patch, was your approval for 1/2 > only or 2/2 with the expander cleanup ? Only for 1/2. The revised 2/2 patch is pre-approved if the usual tests are Ok, though. One minor formatting problem: >+ if (! optimize_insn_for_size_p () && sh4_expand_cmpstr(operands)) >+ DONE; A space is needed just before (operands). Regards, kaz
Index: gcc/testsuite/gcc.target/sh/strcmp-2.c =================================================================== --- gcc/testsuite/gcc.target/sh/strcmp-2.c (revision 0) +++ gcc/testsuite/gcc.target/sh/strcmp-2.c (revision 0) @@ -0,0 +1,13 @@ +/* Check that the __builtin_strcmp function is not inlined when optimizing + for size. */ +/* { dg-do compile { target "sh*-*-*" } } */ +/* { dg-options "-Os" } */ +/* { dg-skip-if "" { "sh*-*-*" } { "-m5*" } { "" } } */ +/* { dg-final { scan-assembler-not "cmp/str" } } */ +/* { dg-final { scan-assembler "jsr|jmp|bsr|bra" } } */ + +int +test00 (const char* a, const char* b) +{ + return __builtin_strcmp (a, b); +} Index: gcc/testsuite/gcc.target/sh/strcmp-1.c =================================================================== --- gcc/testsuite/gcc.target/sh/strcmp-1.c (revision 0) +++ gcc/testsuite/gcc.target/sh/strcmp-1.c (revision 0) @@ -0,0 +1,12 @@ +/* Check that the __builtin_strcmp function is inlined utilizing cmp/str insn + when optimizing for speed. */ +/* { dg-do compile { target "sh*-*-*" } } */ +/* { dg-options "-O2" } */ +/* { dg-skip-if "" { "sh*-*-*" } { "-m5*" } { "" } } */ +/* { dg-final { scan-assembler "cmp/str" } } */ + +int +test00 (const char* a, const char* b) +{ + return __builtin_strcmp (a, b); +}