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