On 08/01/18 19:37, Aaron Sawdey wrote: > On Tue, 2017-12-12 at 10:13 -0600, Segher Boessenkool wrote: >> > Please fix those trivialities, and it's okay for trunk (after the >> > rtlanal patch is approved too). Thanks! > Here's the final version of this, which is committed as 256351. > > > 2018-01-08 Aaron Sawdey <acsaw...@linux.vnet.ibm.com> > > * config/rs6000/rs6000-string.c (do_load_for_compare_from_addr): New > function. > (do_ifelse): New function. > (do_isel): New function. > (do_sub3): New function. > (do_add3): New function. > (do_load_mask_compare): New function. > (do_overlap_load_compare): New function. > (expand_compare_loop): New function. > (expand_block_compare): Call expand_compare_loop() when appropriate. > * config/rs6000/rs6000.opt (-mblock-compare-inline-limit): Change > option description. > (-mblock-compare-inline-loop-limit): New option. > ... > Index: gcc/testsuite/gcc.dg/memcmp-1.c > =================================================================== > --- gcc/testsuite/gcc.dg/memcmp-1.c (revision 256350) > +++ gcc/testsuite/gcc.dg/memcmp-1.c (working copy) > @@ -14,11 +14,80 @@ > #ifndef NRAND > #define NRAND 10000 > #endif > -#define MAX_SZ 200 > +#define MAX_SZ 600 >
i see timeouts when running aarch64-none-elf tests in some emulator environments: WARNING: program timed out. FAIL: gcc.dg/memcmp-1.c execution test if there is a way to reduce the iteration count or the tested variants that would help slow targets. > +#define DEF_RS(ALIGN) \ > +static void test_memcmp_runtime_size_ ## ALIGN (const char *str1, \ > + const char *str2, \ > + size_t sz, int expect) \ > +{ \ > + char three[8192] __attribute__ ((aligned (4096))); \ > + char four[8192] __attribute__ ((aligned (4096))); \ > + char *a, *b; > \ > + int i,j,a1,a2,r; \ > + for (j = 0; j < 2; j++) \ > + { > \ > + for (i = 0; i < 2; i++) > \ > + { \ > + a = three+i*ALIGN+j*(4096-2*i*ALIGN); \ > + b = four+i*ALIGN+j*(4096-2*i*ALIGN); \ > + memcpy(a,str1,sz); \ > + memcpy(b,str2,sz); \ > + asm(" "); \ > + r = memcmp(a,b,sz); \ > + asm(" "); \ > + if ( r < 0 && !(expect < 0) ) abort(); \ > + if ( r > 0 && !(expect > 0) ) abort(); \ > + if ( r == 0 && !(expect == 0) ) abort(); \ > + } \ > + } > \ > +} > + > +DEF_RS(1) > +DEF_RS(2) > +DEF_RS(4) > +DEF_RS(8) > +DEF_RS(16) > + > +static void test_memcmp_runtime_size (const char *str1, const char *str2, > + size_t sz, int expect) > +{ > + char three[8192] __attribute__ ((aligned (4096))); > + char four[8192] __attribute__ ((aligned (4096))); > + char *a, *b; > + int i,j,a1,a2,r; > + test_memcmp_runtime_size_1 (str1,str2,sz,expect); > + test_memcmp_runtime_size_2 (str1,str2,sz,expect); > + test_memcmp_runtime_size_4 (str1,str2,sz,expect); > + test_memcmp_runtime_size_8 (str1,str2,sz,expect); > + test_memcmp_runtime_size_16 (str1,str2,sz,expect); > + for (j = 0; j < 2; j++) > + { > + for (i = 0; i < 2; i++) > + { > + for (a1=0; a1 < 2*sizeof(void *); a1++) > + { > + for (a2=0; a2 < 2*sizeof(void *); a2++) > + { > + a = three+i*a1+j*(4096-2*i*a1); > + b = four+i*a2+j*(4096-2*i*a2); > + memcpy(a,str1,sz); > + memcpy(b,str2,sz); > + asm(" "); > + r = memcmp(a,b,sz); > + asm(" "); > + if ( r < 0 && !(expect < 0) ) abort(); > + if ( r > 0 && !(expect > 0) ) abort(); > + if ( r == 0 && !(expect == 0) ) abort(); > + } > + } > + } > + } > +} > + > static void test_driver_memcmp (void (test_memcmp)(const char *, const char > *, int), > void (test_strncmp)(const char *, const char *, > int), > - size_t sz, int align) > + size_t sz, int align) > { > char buf1[MAX_SZ*2+10],buf2[MAX_SZ*2+10]; > size_t test_sz = (sz<MAX_SZ)?sz:MAX_SZ; > @@ -35,11 +104,12 @@ > buf1[j] = rand() & 0xff; > buf2[j] = rand() & 0xff; > } > + e = lib_memcmp(buf1,buf2,sz); > + (*test_memcmp)(buf1,buf2,e); > + test_memcmp_runtime_size (buf1, buf2, sz, e); > + e = lib_strncmp(buf1,buf2,sz); > + (*test_strncmp)(buf1,buf2,e); > } > - e = lib_memcmp(buf1,buf2,sz); > - (*test_memcmp)(buf1,buf2,e); > - e = lib_strncmp(buf1,buf2,sz); > - (*test_strncmp)(buf1,buf2,e); > } > for(diff_pos = ((test_sz>10)?(test_sz-10):0); diff_pos < test_sz+10; > diff_pos++) > for(zero_pos = ((test_sz>10)?(test_sz-10):0); zero_pos < test_sz+10; > zero_pos++) > @@ -53,6 +123,9 @@ > (*test_memcmp)(buf1,buf2,e); > (*test_memcmp)(buf2,buf1,-e); > (*test_memcmp)(buf2,buf2,0); > + test_memcmp_runtime_size (buf1, buf2, sz, e); > + test_memcmp_runtime_size (buf2, buf1, sz, -e); > + test_memcmp_runtime_size (buf2, buf2, sz, 0); > e = lib_strncmp(buf1,buf2,sz); > (*test_strncmp)(buf1,buf2,e); > (*test_strncmp)(buf2,buf1,-e); > @@ -61,6 +134,7 @@ > buf2[diff_pos] = 0; > e = lib_memcmp(buf1,buf2,sz); > (*test_memcmp)(buf1,buf2,e); > + test_memcmp_runtime_size (buf1, buf2, sz, e); > e = lib_strncmp(buf1,buf2,sz); > (*test_strncmp)(buf1,buf2,e); > memset(buf2+diff_pos,'B',sizeof(buf2)-diff_pos); > @@ -68,6 +142,8 @@ > e = lib_memcmp(buf1,buf2,sz); > (*test_memcmp)(buf1,buf2,e); > (*test_memcmp)(buf2,buf1,-e); > + test_memcmp_runtime_size (buf1, buf2, sz, e); > + test_memcmp_runtime_size (buf2, buf1, sz, -e); > e = lib_strncmp(buf1,buf2,sz); > (*test_strncmp)(buf1,buf2,e); > (*test_strncmp)(buf2,buf1,-e); > @@ -371,7 +447,14 @@ > DEF_TEST(100,4) > DEF_TEST(100,8) > DEF_TEST(100,16) > +DEF_TEST(191,1) > +DEF_TEST(192,1) > +DEF_TEST(193,1) > +DEF_TEST(200,1) > +DEF_TEST(400,1) > #else > +DEF_TEST(1,1) > +DEF_TEST(2,1) > DEF_TEST(3,1) > DEF_TEST(4,1) > DEF_TEST(5,1) > @@ -389,6 +472,8 @@ > DEF_TEST(32,1) > DEF_TEST(100,1) > DEF_TEST(100,8) > +DEF_TEST(180,1) > +DEF_TEST(180,8) > #endif > > int > @@ -395,7 +480,7 @@ > main(int argc, char **argv) > { > #ifdef TEST_ALL > - RUN_TEST(1,1) > + RUN_TEST(1,1) > RUN_TEST(1,2) > RUN_TEST(1,4) > RUN_TEST(1,8) > @@ -645,7 +730,14 @@ > RUN_TEST(100,4) > RUN_TEST(100,8) > RUN_TEST(100,16) > + RUN_TEST(191,1) > + RUN_TEST(192,1) > + RUN_TEST(193,1) > + RUN_TEST(200,1) > + RUN_TEST(400,1) > #else > + RUN_TEST(1,1) > + RUN_TEST(2,1) > RUN_TEST(3,1) > RUN_TEST(4,1) > RUN_TEST(5,1) > @@ -663,5 +755,7 @@ > RUN_TEST(32,1) > RUN_TEST(100,1) > RUN_TEST(100,8) > + RUN_TEST(180,1) > + RUN_TEST(180,8) > #endif > }