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
>  }

Reply via email to