Ping. Aaron Sawdey, Ph.D. saw...@linux.ibm.com IBM Linux on POWER Toolchain
> On Jan 3, 2021, at 2:44 PM, Aaron Sawdey <acsaw...@linux.ibm.com> wrote: > > Ping. > > Aaron Sawdey, Ph.D. saw...@linux.ibm.com > IBM Linux on POWER Toolchain > > >> On Dec 11, 2020, at 1:53 PM, 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. >> >> These test cases pass on power10. OK for trunk after the 2 previous patches >> for the fusion patterns go in? >> >> Thanks! >> Aaron >> >> 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 | 201 ++++++++++++++++++ >> .../gcc.target/powerpc/fusion-p10-ldcmpi.c | 66 ++++++ >> 2 files changed, 267 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 >> >> 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..cfe8f6c679a >> --- /dev/null >> +++ b/gcc/testsuite/gcc.target/powerpc/fusion-p10-2logical.c >> @@ -0,0 +1,201 @@ >> +/* { 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); >> + >> +/* { dg-final { scan-assembler-times "fuse_and_and/0" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_and_and/2" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_andc_and/0" 48 } } */ >> +/* { dg-final { scan-assembler-times "fuse_andc_and/1" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_andc_and/2" 26 } } */ >> +/* { dg-final { scan-assembler-times "fuse_andc_and/3" 6 } } */ >> +/* { dg-final { scan-assembler-times "fuse_andc_or/0" 32 } } */ >> +/* { dg-final { scan-assembler-times "fuse_andc_or/1" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_andc_or/2" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_andc_orc/0" 48 } } */ >> +/* { dg-final { scan-assembler-times "fuse_andc_orc/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_andc_orc/2" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_andc_xor/0" 32 } } */ >> +/* { dg-final { scan-assembler-times "fuse_andc_xor/1" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_andc_xor/2" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_and_eqv/0" 24 } } */ >> +/* { dg-final { scan-assembler-times "fuse_and_eqv/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_and_or/0" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_and_or/1" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_and_orc/0" 24 } } */ >> +/* { dg-final { scan-assembler-times "fuse_and_orc/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_and_xor/0" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_and_xor/1" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_eqv_and/0" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_eqv_and/1" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_eqv_andc/0" 24 } } */ >> +/* { dg-final { scan-assembler-times "fuse_eqv_andc/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_eqv_or/0" 24 } } */ >> +/* { dg-final { scan-assembler-times "fuse_eqv_or/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nand_and/0" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nand_and/1" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nand_andc/0" 24 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nand_andc/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nand_or/0" 72 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nand_or/1" 14 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nand_or/2" 2 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nand_or/3" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nand_orc/0" 24 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nand_orc/3" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nor_and/0" 48 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nor_and/1" 28 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nor_and/2" 4 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nor_and/3" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nor_andc/0" 24 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nor_andc/3" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nor_or/0" 24 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nor_or/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nor_orc/0" 24 } } */ >> +/* { dg-final { scan-assembler-times "fuse_nor_orc/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_or_and/0" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_or_and/1" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_or_andc/0" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_or_andc/1" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_orc_and/0" 32 } } */ >> +/* { dg-final { scan-assembler-times "fuse_orc_and/1" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_orc_and/2" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_orc_andc/0" 48 } } */ >> +/* { dg-final { scan-assembler-times "fuse_orc_andc/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_orc_andc/2" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_orc_or/0" 72 } } */ >> +/* { dg-final { scan-assembler-times "fuse_orc_or/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_orc_or/2" 10 } } */ >> +/* { dg-final { scan-assembler-times "fuse_orc_or/3" 6 } } */ >> +/* { dg-final { scan-assembler-times "fuse_orc_xor/0" 48 } } */ >> +/* { dg-final { scan-assembler-times "fuse_orc_xor/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_orc_xor/2" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_or_eqv/0" 24 } } */ >> +/* { dg-final { scan-assembler-times "fuse_or_eqv/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_or_or/0" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_or_or/2" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_or_xor/0" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_or_xor/1" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vandc_vand/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vandc_vand/2" 10 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vandc_vand/3" 6 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vandc_vor/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vandc_vor/2" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vandc_vorc/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vandc_vorc/2" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vandc_vxor/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vandc_vxor/2" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vand_vand/2" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vand_veqv/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vand_vor/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vand_vorc/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vand_vxor/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_veqv_vand/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_veqv_vandc/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_veqv_vor/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vnand_vand/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vnand_vandc/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vnand_vor/1" 14 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vnand_vor/2" 2 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vnand_vor/3" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vnand_vorc/3" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vnor_vand/1" 14 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vnor_vand/2" 2 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vnor_vand/3" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vnor_vandc/3" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vnor_vor/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vnor_vorc/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vorc_vand/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vorc_vand/2" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vorc_vandc/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vorc_vandc/2" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vorc_vor/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vorc_vor/2" 10 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vorc_vor/3" 6 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vorc_vxor/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vorc_vxor/2" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vor_vand/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vor_vandc/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vor_veqv/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vor_vor/2" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vor_vxor/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vxor_vand/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vxor_vandc/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vxor_veqv/3" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vxor_vnand/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vxor_vor/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vxor_vorc/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_vxor_vxor/2" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_xor_and/0" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_xor_and/1" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_xor_andc/0" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_xor_andc/1" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_xor_eqv/0" 24 } } */ >> +/* { dg-final { scan-assembler-times "fuse_xor_eqv/3" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_xor_nand/0" 24 } } */ >> +/* { dg-final { scan-assembler-times "fuse_xor_nand/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_xor_or/0" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_xor_or/1" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_xor_orc/0" 24 } } */ >> +/* { dg-final { scan-assembler-times "fuse_xor_orc/1" 8 } } */ >> +/* { dg-final { scan-assembler-times "fuse_xor_xor/0" 16 } } */ >> +/* { dg-final { scan-assembler-times "fuse_xor_xor/2" 16 } } */ >> 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..3f33f49362e >> --- /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_cmpldi_cr0_DI_clobber_CCUNS_none" >> 2 } } */ >> +/* { dg-final { scan-assembler-times "ld_cmpldi_cr0_DI_DI_CCUNS_none" >> 2 } } */ >> +/* { dg-final { scan-assembler-times "lhz_cmpldi_cr0_HI_clobber_CCUNS_zero" >> 2 } } */ >> +/* { dg-final { scan-assembler-times "lwz_cmpldi_cr0_SI_clobber_CCUNS_none" >> 2 } } */ >> +/* { dg-final { scan-assembler-times "lwz_cmpldi_cr0_SI_EXTSI_CCUNS_zero" >> 2 } } */ >> +/* { dg-final { scan-assembler-times "lwa_cmpdi_cr0_SI_EXTSI_CC_sign" >> 6 } } */ >> +/* { dg-final { scan-assembler-times "ld_cmpdi_cr0_DI_clobber_CC_none" >> 8 } } */ >> +/* { dg-final { scan-assembler-times "lha_cmpdi_cr0_HI_clobber_CC_sign" >> 8 } } */ >> +/* { dg-final { scan-assembler-times "lwa_cmpdi_cr0_SI_clobber_CC_none" >> 8 } } */ >> +/* { dg-final { scan-assembler-times "ld_cmpdi_cr0_DI_DI_CC_none" >> 24 } } */ >> -- >> 2.27.0 >> >