On Mon, 2021-04-26 at 14:00 -0500, acsaw...@linux.ibm.com wrote:
> From: Aaron Sawdey <acsaw...@linux.ibm.com>
> 
> This adds some test cases to make sure that the combine patterns for p10
> fusion are working.
> 
> OK for trunk?
> 
> gcc/testsuite/ChangeLog:
>       * gcc.target/powerpc/fusion-p10-ldcmpi.c: New file.
>       * gcc.target/powerpc/fusion-p10-2logical.c: New file.
> ---
>  .../gcc.target/powerpc/fusion-p10-2logical.c  | 205 ++++++++++++++++++
>  .../gcc.target/powerpc/fusion-p10-ldcmpi.c    |  66 ++++++
>  2 files changed, 271 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/fusion-p10-2logical.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/fusion-p10-ldcmpi.c

ok


> 
> diff --git a/gcc/testsuite/gcc.target/powerpc/fusion-p10-2logical.c 
> b/gcc/testsuite/gcc.target/powerpc/fusion-p10-2logical.c
> new file mode 100644
> index 00000000000..9a205373505
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/fusion-p10-2logical.c
> @@ -0,0 +1,205 @@
> +/* { dg-do compile { target { powerpc*-*-* } } } */
> +/* { dg-skip-if "" { powerpc*-*-darwin* } } */
> +/* { dg-options "-mdejagnu-cpu=power10 -O3 -dp" } */
> +
> +#include <altivec.h>
> +#include <stdint.h>
> +
> +/* and/andc/eqv/nand/nor/or/orc/xor */
> +#define AND(a,b) ((a)&(b))
> +#define ANDC1(a,b) ((a)&((~b)))
> +#define ANDC2(a,b) ((~(a))&(b))
> +#define EQV(a,b) (~((a)^(b)))
> +#define NAND(a,b) (~((a)&(b)))
> +#define NOR(a,b) (~((a)|(b)))
> +#define OR(a,b) ((a)|(b))
> +#define ORC1(a,b) ((a)|((~b)))
> +#define ORC2(a,b) ((~(a))|(b))
> +#define XOR(a,b) ((a)^(b))
> +#define TEST1(type, func)                                                    
> \
> +  type func ## _and_T_     ## type (type a, type b, type c) { return 
> AND(func(a,b),c); } \
> +  type func ## _andc1_T_   ## type (type a, type b, type c) { return 
> ANDC1(func(a,b),c); } \
> +  type func ## _andc2_T_   ## type (type a, type b, type c) { return 
> ANDC2(func(a,b),c); } \
> +  type func ## _eqv_T_     ## type (type a, type b, type c) { return 
> EQV(func(a,b),c); } \
> +  type func ## _nand_T_    ## type (type a, type b, type c) { return 
> NAND(func(a,b),c); } \
> +  type func ## _nor_T_     ## type (type a, type b, type c) { return 
> NOR(func(a,b),c); } \
> +  type func ## _or_T_      ## type (type a, type b, type c) { return 
> OR(func(a,b),c); } \
> +  type func ## _orc1_T_    ## type (type a, type b, type c) { return 
> ORC1(func(a,b),c); } \
> +  type func ## _orc2_T_    ## type (type a, type b, type c) { return 
> ORC2(func(a,b),c); } \
> +  type func ## _xor_T_     ## type (type a, type b, type c) { return 
> XOR(func(a,b),c); } \
> +  type func ## _rev_and_T_     ## type (type a, type b, type c) { return 
> AND(c,func(a,b)); } \
> +  type func ## _rev_andc1_T_   ## type (type a, type b, type c) { return 
> ANDC1(c,func(a,b)); } \
> +  type func ## _rev_andc2_T_   ## type (type a, type b, type c) { return 
> ANDC2(c,func(a,b)); } \
> +  type func ## _rev_eqv_T_     ## type (type a, type b, type c) { return 
> EQV(c,func(a,b)); } \
> +  type func ## _rev_nand_T_    ## type (type a, type b, type c) { return 
> NAND(c,func(a,b)); } \
> +  type func ## _rev_nor_T_     ## type (type a, type b, type c) { return 
> NOR(c,func(a,b)); } \
> +  type func ## _rev_or_T_      ## type (type a, type b, type c) { return 
> OR(c,func(a,b)); } \
> +  type func ## _rev_orc1_T_    ## type (type a, type b, type c) { return 
> ORC1(c,func(a,b)); } \
> +  type func ## _rev_orc2_T_    ## type (type a, type b, type c) { return 
> ORC2(c,func(a,b)); } \
> +  type func ## _rev_xor_T_     ## type (type a, type b, type c) { return 
> XOR(c,func(a,b)); }
> +#define TEST(type)    \
> +  TEST1(type,AND)     \
> +  TEST1(type,ANDC1)   \
> +  TEST1(type,ANDC2)   \
> +  TEST1(type,EQV)     \
> +  TEST1(type,NAND)    \
> +  TEST1(type,NOR)     \
> +  TEST1(type,OR)      \
> +  TEST1(type,ORC1)    \
> +  TEST1(type,ORC2)    \
> +  TEST1(type,XOR)
> +
> +typedef vector bool char vboolchar_t;
> +typedef vector unsigned int vuint_t;
> +
> +TEST(uint8_t);
> +TEST(int8_t);
> +TEST(uint16_t);
> +TEST(int16_t);
> +TEST(uint32_t);
> +TEST(int32_t);
> +TEST(uint64_t);
> +TEST(int64_t);
> +TEST(vboolchar_t);
> +TEST(vuint_t);

ok

> +
> +/* Recreate with:
> +   grep ' \*fuse_' fusion-p10-2logical.s|sed -e 's,^.*\*,,' |sort -k 7,7 
> |uniq -c|awk '{l=30-length($2); printf("/%s* { %s { scan-assembler-times 
> \"%s\"%-*s        %4d } } *%s/\n","","dg-final",$2,l,"",$1,"");}'
> + */

nice, ok.


> +  
> +/* { dg-final { scan-assembler-times "fuse_and_and/1"                        
>   16 } } */
> +/* { dg-final { scan-assembler-times "fuse_and_and/2"                        
>   16 } } */
> +/* { dg-final { scan-assembler-times "fuse_andc_and/0"                       
>   16 } } */
> +/* { dg-final { scan-assembler-times "fuse_andc_and/1"                       
>   26 } } */


<snip>


> diff --git a/gcc/testsuite/gcc.target/powerpc/fusion-p10-ldcmpi.c 
> b/gcc/testsuite/gcc.target/powerpc/fusion-p10-ldcmpi.c
> new file mode 100644
> index 00000000000..99f9e92eeaf
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/fusion-p10-ldcmpi.c
> @@ -0,0 +1,66 @@
> +/* { dg-do compile { target { powerpc*-*-* } } } */
> +/* { dg-skip-if "" { powerpc*-*-darwin* } } */
> +/* { dg-options "-mdejagnu-cpu=power10 -O3 -dp" } */
> +
> +#include <stdint.h>
> +
> +#define TEST(type) \
> +  struct t ## type { type x[128],a,b,c; };           \
> +  struct s ## type { struct t ## type *p; int d,e,f; uint64_t g,h,i; };      
> \
> +int \
> +t ## type (struct s ## type *p) \
> +{ \
> +  struct t ## type *tp = p->p; \
> +  if(!tp || tp->a > ((type)0)) { return p->d; }      \
> +  if(!tp || tp->b > ((type)1)) { return p->e; }      \
> +  if(!tp || ( ((type)(-1) < 0) && tp->c < ((type)-1))) { return p->f; }      
> \
> +  return 0; \
> +} \
> +type \
> +t ## type ## _ret (struct s ## type *p) \
> +{ \
> +  struct t ## type *tp = p->p; \
> +  if(!tp || tp->a > ((type)0)) { return tp->a; }     \
> +  if(!tp || tp->b > ((type)1)) { return tp->b; }     \
> +  if(!tp || ( ((type)(-1) < 0) && tp->c < ((type)-1))) { return tp->c; }     
> \
> +  return 0; \
> +}\
> +int \
> +t ## type ## _x (struct s ## type *p) \
> +{ \
> +  struct t ## type *tp = p->p; \
> +  if(!tp || tp->x[p->g] > ((type)0)) { return p->d; }        \
> +  if(!tp || tp->x[p->h] > ((type)1)) { return p->e; }        \
> +  if(!tp || ( ((type)(-1) < 0) && tp->x[p->i] < ((type)-1))) { return p->f; 
> }        \
> +  return 0; \
> +} \
> +type \
> +t ## type ## _x_ret (struct s ## type *p) \
> +{ \
> +  struct t ## type *tp = p->p; \
> +  if(!tp || tp->x[p->g] > ((type)0)) { return tp->x[p->g]; } \
> +  if(!tp || tp->x[p->h] > ((type)1)) { return tp->x[p->h]; } \
> +  if(!tp || ( ((type)(-1) < 0) && tp->x[p->i] < ((type)-1))) { return 
> tp->x[p->i]; } \
> +  return 0; \
> +}
> +
> +TEST(uint64_t)
> +TEST(int64_t)
> +TEST(uint32_t)
> +TEST(int32_t)
> +TEST(uint16_t)
> +TEST(int16_t)
> +TEST(uint8_t)
> +TEST(int8_t)
> +
> +/* { dg-final { scan-assembler-times "lbz_cmpldi_cr0_QI_clobber_CCUNS_zero"  
>  2 } } */
> +/* { dg-final { scan-assembler-times "ld_cmpdi_cr0_DI_DI_CC_none"            
>  4 } } */
> +/* { dg-final { scan-assembler-times "ld_cmpdi_cr0_DI_clobber_CC_none"       
>  4 } } */
> +/* { dg-final { scan-assembler-times "ld_cmpldi_cr0_DI_DI_CCUNS_none"        
>  1 } } */
> +/* { dg-final { scan-assembler-times "ld_cmpldi_cr0_DI_clobber_CCUNS_none"   
>  1 } } */
> +/* { dg-final { scan-assembler-times "lha_cmpdi_cr0_HI_clobber_CC_sign"      
>  8 } } */
> +/* { dg-final { scan-assembler-times "lhz_cmpldi_cr0_HI_clobber_CCUNS_zero"  
>  2 } } */
> +/* { dg-final { scan-assembler-times "lwa_cmpdi_cr0_SI_EXTSI_CC_sign"        
>  3 } } */
> +/* { dg-final { scan-assembler-times "lwa_cmpdi_cr0_SI_clobber_CC_none"      
>  4 } } */
> +/* { dg-final { scan-assembler-times "lwz_cmpldi_cr0_SI_EXTSI_CCUNS_zero"    
>  2 } } */
> +/* { dg-final { scan-assembler-times "lwz_cmpldi_cr0_SI_clobber_CCUNS_none"  
>  2 } } */

ok

lgtm,
thanks,
-WIll



Reply via email to