aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKelvin Nilsen <kelvin@gcc.gnu.org>2018-02-19 23:08:07 +0000
committerKelvin Nilsen <kelvin@gcc.gnu.org>2018-02-19 23:08:07 +0000
commit370c71d70ae1bebb7c906bfebebddcb8f7bdaf62 (patch)
tree4c5f652f5f78c17028e4b3f3b35ce26536d63105
parent592a338de38523ec9316d947bb9fb1608d053de9 (diff)
builds - not sure how well it runs
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/ibm/better-builtin-docs@257829 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/config/rs6000/dump-builtins.c241
1 files changed, 178 insertions, 63 deletions
diff --git a/gcc/config/rs6000/dump-builtins.c b/gcc/config/rs6000/dump-builtins.c
index bceb7568096..2e8c80e24d7 100644
--- a/gcc/config/rs6000/dump-builtins.c
+++ b/gcc/config/rs6000/dump-builtins.c
@@ -455,6 +455,12 @@ t2s (machine_mode type) {
case E_V2TFmode:
return ptr_flag? "v2tf_mode *": "v2tf_mode";
+ case MAX_MACHINE_MODE:
+ return ptr_flag? "dynamic_type_mode *": "dynamic_type_mode";
+
+ case MAX_MACHINE_MODE+1:
+ return ptr_flag? "dynamic_vector_type_mode *": "dynamic_vector_type_mode";
+
default:
return ptr_flag? "unknown_mode *": "unknown_mode";
}
@@ -464,83 +470,192 @@ void
dump_special_table (const char *title,
const struct builtin_description *bidp, int num_entries)
{
+ machine_mode operand_modes[4];
+
+ unsigned int type_mask, attributes;
+
machine_mode tmode, mode0, mode1, mode2;
fprintf (stderr, "%s [%d]\n", title, num_entries);
while (num_entries--) {
- unsigned attributes = get_type (bidp->name)->attr;
- unsigned type_mask = attributes & RS6000_BTC_TYPE_MASK;
-
-bidp has an icode and a code. which of these is the fcode? I think it is the code.
-
- note that ALTIVEC_BUILTIN_VMADDFP (1) and ALTIVEC_BUILTIN_STVX_V2DF (??)
- are both enum rs6000_builtins
- it may be neither one of these
+ switch (bidp->code) {
+ case ALTIVEC_BUILTIN_STVX_V2DF:
+ case ALTIVEC_BUILTIN_STVX_V2DI:
+ case ALTIVEC_BUILTIN_STVX_V4SF:
+ case ALTIVEC_BUILTIN_STVX:
+ case ALTIVEC_BUILTIN_STVX_V4SI:
+ case ALTIVEC_BUILTIN_STVX_V8HI:
+ case ALTIVEC_BUILTIN_STVX_V16QI:
+ case ALTIVEC_BUILTIN_STVEBX:
+ case ALTIVEC_BUILTIN_STVEHX:
+ case ALTIVEC_BUILTIN_STVEWX:
+ case ALTIVEC_BUILTIN_STVXL_V2DF:
+ case ALTIVEC_BUILTIN_STVXL_V2DI:
+ case ALTIVEC_BUILTIN_STVXL_V4SF:
+ case ALTIVEC_BUILTIN_STVXL:
+ case ALTIVEC_BUILTIN_STVXL_V4SI:
+ case ALTIVEC_BUILTIN_STVXL_V8HI:
+ case ALTIVEC_BUILTIN_STVXL_V16QI:
+ case ALTIVEC_BUILTIN_STVLX:
+ case ALTIVEC_BUILTIN_STVLXL:
+ case ALTIVEC_BUILTIN_STVRX:
+ case ALTIVEC_BUILTIN_STVRXL:
+ case VSX_BUILTIN_STXVD2X_V1TI:
+ case VSX_BUILTIN_STXVD2X_V2DF:
+ case VSX_BUILTIN_STXVD2X_V2DI:
+ case VSX_BUILTIN_STXVW4X_V4SF:
+ case VSX_BUILTIN_STXVW4X_V4SI:
+ case VSX_BUILTIN_STXVW4X_V8HI:
+ case VSX_BUILTIN_STXVW4X_V16QI:
+ case VSX_BUILTIN_ST_ELEMREV_V1TI:
+ case VSX_BUILTIN_ST_ELEMREV_V2DF:
+ case VSX_BUILTIN_ST_ELEMREV_V2DI:
+ case VSX_BUILTIN_ST_ELEMREV_V4SF:
+ case VSX_BUILTIN_ST_ELEMREV_V4SI:
+ case VSX_BUILTIN_ST_ELEMREV_V8HI:
+ case VSX_BUILTIN_ST_ELEMREV_V16QI:
+ /* Implemented by altivec_expand_stv_builtin */
+ operand_modes[0] = insn_data[bidp->icode].operand[0].mode;
+ operand_modes[1] = insn_data[bidp->icode].operand[1].mode;
+
+ /* These are pointer. Assume 64-bit target. */
+ operand_modes[2] = E_DImode;
+ operand_modes[3] = E_DImode;
+
+ type_mask = (unsigned int) RS6000_BTC_TERNARY;
+ break;
+
+ case P9V_BUILTIN_STXVL:
+ case P9V_BUILTIN_XST_LEN_R:
+ /* Implemented by altivec_expand_stv_builtin */
+ operand_modes[0] = insn_data[bidp->icode].operand[0].mode;
+ operand_modes[1] = insn_data[bidp->icode].operand[1].mode;
+ operand_modes[2] = insn_data[bidp->icode].operand[2].mode;
+
+ type_mask = RS6000_BTC_BINARY;
+ break;
+
+ case ALTIVEC_BUILTIN_MFVSCR:
+ operand_modes[0] = insn_data[bidp->icode].operand[0].mode;
+
+ type_mask = RS6000_BTC_SPECIAL;
+ break;
+
+ case ALTIVEC_BUILTIN_MTVSCR:
+ operand_modes[0] = E_VOIDmode;
+ operand_modes[1] = insn_data[bidp->icode].operand[0].mode;
+
+ type_mask = RS6000_BTC_UNARY;
+ break;
+
+ case ALTIVEC_BUILTIN_DSSALL:
+ operand_modes[0] = E_VOIDmode;
+
+ type_mask = RS6000_BTC_SPECIAL;
+ break;
+
+ case ALTIVEC_BUILTIN_DSS:
+ operand_modes[0] = E_VOIDmode;
+ /* 2-bit unsigned literal int */
+ operand_modes[1] = insn_data[bidp->icode].operand[0].mode;
+
+ type_mask = RS6000_BTC_UNARY;
+ break;
+
+ case ALTIVEC_BUILTIN_VEC_INIT_V4SI:
+ case ALTIVEC_BUILTIN_VEC_INIT_V8HI:
+ case ALTIVEC_BUILTIN_VEC_INIT_V16QI:
+ case ALTIVEC_BUILTIN_VEC_INIT_V4SF:
+ case VSX_BUILTIN_VEC_INIT_V2DF:
+ case VSX_BUILTIN_VEC_INIT_V2DI:
+ case VSX_BUILTIN_VEC_INIT_V1TI:
+ /* The operand[0] type is computed at run-time. */
+ operand_modes[0] = MAX_MACHINE_MODE;
+
+ type_mask = RS6000_BTC_SPECIAL;
+ break;
+
+ case ALTIVEC_BUILTIN_VEC_SET_V4SI:
+ case ALTIVEC_BUILTIN_VEC_SET_V8HI:
+ case ALTIVEC_BUILTIN_VEC_SET_V16QI:
+ case ALTIVEC_BUILTIN_VEC_SET_V4SF:
+ case VSX_BUILTIN_VEC_SET_V2DF:
+ case VSX_BUILTIN_VEC_SET_V2DI:
+ case VSX_BUILTIN_VEC_SET_V1TI:
+ operand_modes[0] = (machine_mode) (MAX_MACHINE_MODE + 1);
+ operand_modes[1] = MAX_MACHINE_MODE;
+ operand_modes[2] = (machine_mode) (MAX_MACHINE_MODE + 1);
+
+ type_mask = RS6000_BTC_BINARY;
+ break;
+
+ case ALTIVEC_BUILTIN_VEC_EXT_V4SI:
+ case ALTIVEC_BUILTIN_VEC_EXT_V8HI:
+ case ALTIVEC_BUILTIN_VEC_EXT_V16QI:
+ case ALTIVEC_BUILTIN_VEC_EXT_V4SF:
+ case VSX_BUILTIN_VEC_EXT_V2DF:
+ case VSX_BUILTIN_VEC_EXT_V2DI:
+ case VSX_BUILTIN_VEC_EXT_V1TI:
+ operand_modes[0] = MAX_MACHINE_MODE;
+ operand_modes[1] = MAX_MACHINE_MODE;
+ operand_modes[2] = MAX_MACHINE_MODE;
+
+ type_mask = RS6000_BTC_BINARY;
+ break;
- i think it's the code. see this line from builtins.error:
-
-3-Argument built-in functions [152]
-vector float __builtin_altivec_vmaddfp (vector float, vector float, vector floa\
-t): icode: 2299, code: 1
- mask: RS6000_BTM_ALTIVEC
- attr: RS6000_BTC_TERNARY|RS6000_BTC_FP
-
-
-
-
-
-
-
- switch (fcode) {
+ default:
+ fprintf (stderr, "unrecognized special function: %s\n", bidp->name);
+ break;
+ /* Fall through. */
}
+ attributes = type_mask;
- if ((attributes & RS6000_BTC_OVERLOADED) == 0)
- {
- switch (type_mask) {
- case RS6000_BTC_PREDICATE:
- /* Two source values plus an integer predicate code. */
- case RS6000_BTC_DST:
- /* Expect ptr operand, int length, const int configuration
- operands, with void result. */
- case RS6000_BTC_TERNARY:
- tmode = insn_data[bidp->icode].operand[0].mode;
- mode0 = insn_data[bidp->icode].operand[1].mode;
- mode1 = insn_data[bidp->icode].operand[2].mode;
- mode2 = insn_data[bidp->icode].operand[3].mode;
- fprintf (stderr, "%s %s (%s, %s, %s): ", t2s (tmode),
- bidp->name, t2s (mode0), t2s (mode1), t2s (mode2));
- break;
+ switch (type_mask) {
+ case RS6000_BTC_PREDICATE:
+ /* Two source values plus an integer predicate code. */
+ case RS6000_BTC_DST:
+ /* Expect ptr operand, int length, const int configuration
+ operands, with void result. */
+ case RS6000_BTC_TERNARY:
+ tmode = operand_modes[0];
+ mode0 = operand_modes[1];
+ mode1 = operand_modes[2];
+ mode2 = operand_modes[3];
+ fprintf (stderr, "%s %s (%s, %s, %s): ", t2s (tmode),
+ bidp->name, t2s (mode0), t2s (mode1), t2s (mode2));
+ break;
- case RS6000_BTC_BINARY:
- tmode = insn_data[bidp->icode].operand[0].mode;
- mode0 = insn_data[bidp->icode].operand[1].mode;
- mode1 = insn_data[bidp->icode].operand[2].mode;
- fprintf (stderr, "%s %s (%s, %s): ",
- t2s (tmode), bidp->name, t2s (mode0), t2s (mode1));
- break;
+ case RS6000_BTC_BINARY:
+ tmode = operand_modes[0];
+ mode0 = operand_modes[1];
+ mode1 = operand_modes[2];
+ fprintf (stderr, "%s %s (%s, %s): ",
+ t2s (tmode), bidp->name, t2s (mode0), t2s (mode1));
+ break;
+
+ case RS6000_BTC_ABS: /* single argument, single result */
+ case RS6000_BTC_UNARY:
+ tmode = operand_modes[0];
+ mode0 = operand_modes[1];
+ fprintf (stderr, "%s %s (%s): ",
+ t2s (tmode), bidp->name, t2s (mode0));
+ break;
- case RS6000_BTC_ABS: /* single argument, single result */
- case RS6000_BTC_UNARY:
- tmode = insn_data[bidp->icode].operand[0].mode;
- mode0 = insn_data[bidp->icode].operand[1].mode;
- fprintf (stderr, "%s %s (%s): ",
- t2s (tmode), bidp->name, t2s (mode0));
- break;
+ case RS6000_BTC_SPECIAL:
+ /* No args, but still a result type. */
+ tmode = operand_modes[0];
+ fprintf (stderr, "%s %s (): ", t2s (tmode), bidp->name);
+ break;
- case RS6000_BTC_SPECIAL:
- /* No args, but still a result type. */
- tmode = insn_data[bidp->icode].operand[0].mode;
- fprintf (stderr, "%s %s (): ", t2s (tmode), bidp->name);
- break;
- }
- fprintf (stderr, "icode: %d, code: %d\n", bidp->icode, bidp->code);
- fprintf (stderr, " mask: %s\n", m2s (bidp->mask));
- fprintf (stderr, " attr: %s\n", a2s (attributes));
- }
+ }
+ fprintf (stderr, "icode: %d, code: %d\n", bidp->icode, bidp->code);
+ fprintf (stderr, " mask: %s\n", m2s (bidp->mask));
+ fprintf (stderr, " attr: %s\n", a2s (attributes));
bidp++;
}
+
fprintf (stderr, "\n");
}