The LLVM and GCC teams agreed to rename the __builtin_mma_assemble_pair and __builtin_mma_disassemble_pair built-ins to __builtin_vsx_assemble_pair and __builtin_vsx_disassemble_pair respectively. It's too late to remove the old names, so this patch adds support for creating compatibility built-ins (ie, multiple built-in functions generate the same code) and then creates compatibility built-ins using the new names.
This passed bootstrap and regtesting on powerpc64le-linux with no regressions. Ok for mainline? This will need backporting to GCC 10. Ok there too once it's baked on trunk for a little while? Peter gcc/ * gcc/config/rs6000/rs6000-builtin.def (BU_COMPAT): Add support macro for defining compatibility built-ins. (vsx_assemble_pair): Add compatibility built-in. * gcc/config/rs6000/rs6000-call.c (struct builtin_compatibility): New. (bdesc_compat): New. (RS6000_BUILTIN_COMPAT): Define. (rs6000_init_builtins): Register compatibility built-ins. * gcc/testsuite/gcc.target/powerpc/mma-builtin-4.c: Add tests for __builtin_vsx_assemble_pair and __builtin_vsx_disassemble_pair. Update expected instruction counts. diff --git a/gcc/config/rs6000/rs6000-builtin.def b/gcc/config/rs6000/rs6000-builtin.def index 058a32abf4c..268f5d5b52b 100644 --- a/gcc/config/rs6000/rs6000-builtin.def +++ b/gcc/config/rs6000/rs6000-builtin.def @@ -43,6 +43,10 @@ ATTR builtin attribute information. ICODE Insn code of the function that implements the builtin. */ +#ifndef RS6000_BUILTIN_COMPAT + #undef BU_COMPAT + #define BU_COMPAT(ENUM, COMPAT_NAME) + #ifndef RS6000_BUILTIN_0 #error "RS6000_BUILTIN_0 is not defined." #endif @@ -87,6 +91,36 @@ #error "RS6000_BUILTIN_X is not defined." #endif +#else + /* Compatibility builtins. These builtins are simply mapped into + their compatible builtin function identified by ENUM. */ + #undef BU_COMPAT + #define BU_COMPAT(ENUM, COMPAT_NAME) { ENUM, "__builtin_" COMPAT_NAME }, + + #undef RS6000_BUILTIN_0 + #undef RS6000_BUILTIN_1 + #undef RS6000_BUILTIN_2 + #undef RS6000_BUILTIN_3 + #undef RS6000_BUILTIN_4 + #undef RS6000_BUILTIN_A + #undef RS6000_BUILTIN_D + #undef RS6000_BUILTIN_H + #undef RS6000_BUILTIN_M + #undef RS6000_BUILTIN_P + #undef RS6000_BUILTIN_X + #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE) + #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE) + #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE) + #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE) + #define RS6000_BUILTIN_4(ENUM, NAME, MASK, ATTR, ICODE) + #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE) + #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE) + #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE) + #define RS6000_BUILTIN_M(ENUM, NAME, MASK, ATTR, ICODE) + #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE) + #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE) +#endif + #ifndef BU_AV_1 /* Define convenience macros using token pasting to allow fitting everything in one line. */ @@ -3137,8 +3171,10 @@ BU_MMA_1 (XXSETACCZ, "xxsetaccz", MISC, mma_xxsetaccz) BU_MMA_2 (DISASSEMBLE_ACC, "disassemble_acc", QUAD, mma_disassemble_acc) BU_MMA_2 (DISASSEMBLE_PAIR,"disassemble_pair", PAIR, mma_disassemble_pair) +BU_COMPAT (MMA_BUILTIN_DISASSEMBLE_PAIR, "vsx_disassemble_pair") BU_MMA_3 (ASSEMBLE_PAIR, "assemble_pair", MISC, mma_assemble_pair) +BU_COMPAT (MMA_BUILTIN_ASSEMBLE_PAIR, "vsx_assemble_pair") BU_MMA_3 (XVBF16GER2, "xvbf16ger2", MISC, mma_xvbf16ger2) BU_MMA_3 (XVF16GER2, "xvf16ger2", MISC, mma_xvf16ger2) BU_MMA_3 (XVF32GER, "xvf32ger", MISC, mma_xvf32ger) diff --git a/gcc/config/rs6000/rs6000-call.c b/gcc/config/rs6000/rs6000-call.c index ae0c761f0a4..240533dec55 100644 --- a/gcc/config/rs6000/rs6000-call.c +++ b/gcc/config/rs6000/rs6000-call.c @@ -89,6 +89,12 @@ #define TARGET_NO_PROTOTYPE 0 #endif +struct builtin_compatibility +{ + const enum rs6000_builtins code; + const char *const name; +}; + struct builtin_description { const HOST_WIDE_INT mask; @@ -8839,6 +8845,13 @@ def_builtin (const char *name, tree type, enum rs6000_builtins code) (int)code, name, attr_string); } +static const struct builtin_compatibility bdesc_compat[] = +{ +#define RS6000_BUILTIN_COMPAT +#include "rs6000-builtin.def" +}; +#undef RS6000_BUILTIN_COMPAT + /* Simple ternary operations: VECd = foo (VECa, VECb, VECc). */ #undef RS6000_BUILTIN_0 @@ -13445,6 +13458,18 @@ rs6000_init_builtins (void) #ifdef SUBTARGET_INIT_BUILTINS SUBTARGET_INIT_BUILTINS; #endif + + /* Register the compatibility builtins after all of the normal + builtins have been defined. */ + const struct builtin_compatibility *d = bdesc_compat; + unsigned i; + for (i = 0; i < ARRAY_SIZE (bdesc_compat); i++, d++) + { + tree decl = rs6000_builtin_decls[(int)d->code]; + gcc_assert (decl != NULL); + add_builtin_function (d->name, TREE_TYPE (decl), (int)d->code, + BUILT_IN_MD, NULL, NULL_TREE); + } } /* Returns the rs6000 builtin decl for CODE. */ diff --git a/gcc/testsuite/gcc.target/powerpc/mma-builtin-4.c b/gcc/testsuite/gcc.target/powerpc/mma-builtin-4.c index f3a857bb8c1..4b1ba3148e2 100644 --- a/gcc/testsuite/gcc.target/powerpc/mma-builtin-4.c +++ b/gcc/testsuite/gcc.target/powerpc/mma-builtin-4.c @@ -12,6 +12,14 @@ foo (__vector_pair *dst, vec_t *src) *dst = pair; } +void +foo2 (__vector_pair *dst, vec_t *src) +{ + __vector_pair pair; + __builtin_vsx_assemble_pair (&pair, src[0], src[4]); + *dst = pair; +} + void bar (vec_t *dst, __vector_pair *src) { @@ -21,8 +29,17 @@ bar (vec_t *dst, __vector_pair *src) dst[4] = res[1]; } -/* { dg-final { scan-assembler-times {\mlxv\M} 2 } } */ -/* { dg-final { scan-assembler-times {\mlxvp\M} 1 } } */ -/* { dg-final { scan-assembler-times {\mstxv\M} 2 } } */ -/* { dg-final { scan-assembler-times {\mstxvp\M} 1 } } */ +void +bar2 (vec_t *dst, __vector_pair *src) +{ + vec_t res[2]; + __builtin_vsx_disassemble_pair (res, src); + dst[0] = res[0]; + dst[4] = res[1]; +} + +/* { dg-final { scan-assembler-times {\mlxv\M} 4 } } */ +/* { dg-final { scan-assembler-times {\mlxvp\M} 2 } } */ +/* { dg-final { scan-assembler-times {\mstxv\M} 4 } } */ +/* { dg-final { scan-assembler-times {\mstxvp\M} 2 } } */