aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/spu
diff options
context:
space:
mode:
authorUlrich Weigand <Ulrich.Weigand@de.ibm.com>2009-04-23 22:48:47 +0000
committerUlrich Weigand <Ulrich.Weigand@de.ibm.com>2009-04-23 22:48:47 +0000
commit471c614a71ac1b66c62d8dcda71eb6d33b5488e3 (patch)
tree5d2532db5c7f8ebb76683b0584c57697a9254274 /gcc/config/spu
parent99c01efd497700eecc225644283395bd7105f556 (diff)
* config/spu/spu-builtins.h: Delete file.
* config/spu/spu.h (enum spu_builtin_type): Move here from spu-builtins.h. (struct spu_builtin_description): Likewise. Add GTY marker. Do not use enum spu_function_code or enum insn_code. (spu_builtins): Add extern declaration. * config/spu/spu.c: Do not include "spu-builtins.h". (enum spu_function_code, enum spu_builtin_type_index, V16QI_type_node, V8HI_type_node, V4SI_type_node, V2DI_type_node, V4SF_type_node, V2DF_type_node, unsigned_V16QI_type_node, unsigned_V8HI_type_node, unsigned_V4SI_type_node, unsigned_V2DI_type_node): Move here from spu-builtins.h. (spu_builtin_types): Make static. Add GTY marker. (spu_builtins): Add extern declaration with GTY marker. Include "gt-spu.h". * config/spu/spu-c.c: Do not include "spu-builtins.h". (spu_resolve_overloaded_builtin): Do not use spu_function_code. Check programmatically whether all parameters are scalar. * config/spu/t-spu-elf (spu.o, spu-c.o): Update dependencies. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@146660 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/spu')
-rw-r--r--gcc/config/spu/spu-builtins.h119
-rw-r--r--gcc/config/spu/spu-c.c16
-rw-r--r--gcc/config/spu/spu.c82
-rw-r--r--gcc/config/spu/spu.h30
-rw-r--r--gcc/config/spu/t-spu-elf3
5 files changed, 118 insertions, 132 deletions
diff --git a/gcc/config/spu/spu-builtins.h b/gcc/config/spu/spu-builtins.h
deleted file mode 100644
index 9acdbf1682a..00000000000
--- a/gcc/config/spu/spu-builtins.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/* Copyright (C) 2006, 2007 Free Software Foundation, Inc.
-
- This file is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 3 of the License, or (at your option)
- any later version.
-
- This file is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- for more details.
-
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
- <http://www.gnu.org/licenses/>. */
-
-/* built-ins */
-
-enum spu_builtin_type_index
-{
- SPU_BTI_END_OF_PARAMS,
-
- /* We create new type nodes for these. */
- SPU_BTI_V16QI,
- SPU_BTI_V8HI,
- SPU_BTI_V4SI,
- SPU_BTI_V2DI,
- SPU_BTI_V4SF,
- SPU_BTI_V2DF,
- SPU_BTI_UV16QI,
- SPU_BTI_UV8HI,
- SPU_BTI_UV4SI,
- SPU_BTI_UV2DI,
-
- /* A 16-byte type. (Implemented with V16QI_type_node) */
- SPU_BTI_QUADWORD,
-
- /* These all correspond to intSI_type_node */
- SPU_BTI_7,
- SPU_BTI_S7,
- SPU_BTI_U7,
- SPU_BTI_S10,
- SPU_BTI_S10_4,
- SPU_BTI_U14,
- SPU_BTI_16,
- SPU_BTI_S16,
- SPU_BTI_S16_2,
- SPU_BTI_U16,
- SPU_BTI_U16_2,
- SPU_BTI_U18,
-
- /* These correspond to the standard types */
- SPU_BTI_INTQI,
- SPU_BTI_INTHI,
- SPU_BTI_INTSI,
- SPU_BTI_INTDI,
-
- SPU_BTI_UINTQI,
- SPU_BTI_UINTHI,
- SPU_BTI_UINTSI,
- SPU_BTI_UINTDI,
-
- SPU_BTI_FLOAT,
- SPU_BTI_DOUBLE,
-
- SPU_BTI_VOID,
- SPU_BTI_PTR,
-
- SPU_BTI_MAX
-};
-
-#define V16QI_type_node (spu_builtin_types[SPU_BTI_V16QI])
-#define V8HI_type_node (spu_builtin_types[SPU_BTI_V8HI])
-#define V4SI_type_node (spu_builtin_types[SPU_BTI_V4SI])
-#define V2DI_type_node (spu_builtin_types[SPU_BTI_V2DI])
-#define V4SF_type_node (spu_builtin_types[SPU_BTI_V4SF])
-#define V2DF_type_node (spu_builtin_types[SPU_BTI_V2DF])
-#define unsigned_V16QI_type_node (spu_builtin_types[SPU_BTI_UV16QI])
-#define unsigned_V8HI_type_node (spu_builtin_types[SPU_BTI_UV8HI])
-#define unsigned_V4SI_type_node (spu_builtin_types[SPU_BTI_UV4SI])
-#define unsigned_V2DI_type_node (spu_builtin_types[SPU_BTI_UV2DI])
-
-extern GTY(()) tree spu_builtin_types[SPU_BTI_MAX];
-
-/* Some builtins require special handling. This enum differentiates. */
-enum spu_builtin_type {
- B_INSN,
- B_JUMP,
- B_BISLED,
- B_CALL,
- B_HINT,
- B_OVERLOAD,
- B_INTERNAL
-};
-
-typedef enum {
-#define DEF_BUILTIN(fcode, icode, name, type, params) fcode,
-#include "spu-builtins.def"
-#undef DEF_BUILTIN
- NUM_SPU_BUILTINS
-} spu_function_code;
-
-struct spu_builtin_description {
- spu_function_code fcode;
- enum insn_code icode;
- const char *name;
- enum spu_builtin_type type;
-
- /* The first element of parm is always the return type. The rest
- * are a zero terminated list of parameters. */
- int parm[5];
-
- tree fndecl;
-};
-
-extern GTY(()) struct spu_builtin_description spu_builtins[];
-
-
-
diff --git a/gcc/config/spu/spu-c.c b/gcc/config/spu/spu-c.c
index 6e37fc532ea..e1352b14a8a 100644
--- a/gcc/config/spu/spu-c.c
+++ b/gcc/config/spu/spu-c.c
@@ -31,7 +31,6 @@
#include "insn-codes.h"
#include "recog.h"
#include "optabs.h"
-#include "spu-builtins.h"
/* Keep the vector keywords handy for fast comparisons. */
@@ -102,8 +101,7 @@ spu_resolve_overloaded_builtin (tree fndecl, void *passed_args)
|| POINTER_TYPE_P (t))
VEC(tree,gc) *fnargs = (VEC(tree,gc) *) passed_args;
unsigned int nargs = VEC_length (tree, fnargs);
- spu_function_code new_fcode, fcode =
- DECL_FUNCTION_CODE (fndecl) - END_BUILTINS;
+ int new_fcode, fcode = DECL_FUNCTION_CODE (fndecl) - END_BUILTINS;
struct spu_builtin_description *desc;
tree match = NULL_TREE;
@@ -123,8 +121,15 @@ spu_resolve_overloaded_builtin (tree fndecl, void *passed_args)
tree decl = spu_builtins[new_fcode].fndecl;
tree params = TYPE_ARG_TYPES (TREE_TYPE (decl));
tree param;
+ bool all_scalar;
unsigned int p;
+ /* Check whether all parameters are scalar. */
+ all_scalar = true;
+ for (param = params; param != void_list_node; param = TREE_CHAIN (param))
+ if (!SCALAR_TYPE_P (TREE_VALUE (param)))
+ all_scalar = false;
+
for (param = params, p = 0;
param != void_list_node;
param = TREE_CHAIN (param), p++)
@@ -156,10 +161,7 @@ spu_resolve_overloaded_builtin (tree fndecl, void *passed_args)
parameter. */
if ((!SCALAR_TYPE_P (param_type)
|| !SCALAR_TYPE_P (arg_type)
- || ((fcode == SPU_SPLATS || fcode == SPU_PROMOTE
- || fcode == SPU_HCMPEQ || fcode == SPU_HCMPGT
- || fcode == SPU_MASKB || fcode == SPU_MASKH
- || fcode == SPU_MASKW) && p == 0))
+ || (all_scalar && p == 0))
&& !comptypes (TYPE_MAIN_VARIANT (param_type),
TYPE_MAIN_VARIANT (arg_type)))
break;
diff --git a/gcc/config/spu/spu.c b/gcc/config/spu/spu.c
index b0ba7ceebd2..a51170bad21 100644
--- a/gcc/config/spu/spu.c
+++ b/gcc/config/spu/spu.c
@@ -52,13 +52,79 @@
#include "machmode.h"
#include "gimple.h"
#include "tm-constrs.h"
-#include "spu-builtins.h"
#include "ddg.h"
#include "sbitmap.h"
#include "timevar.h"
#include "df.h"
/* Builtin types, data and prototypes. */
+
+enum spu_builtin_type_index
+{
+ SPU_BTI_END_OF_PARAMS,
+
+ /* We create new type nodes for these. */
+ SPU_BTI_V16QI,
+ SPU_BTI_V8HI,
+ SPU_BTI_V4SI,
+ SPU_BTI_V2DI,
+ SPU_BTI_V4SF,
+ SPU_BTI_V2DF,
+ SPU_BTI_UV16QI,
+ SPU_BTI_UV8HI,
+ SPU_BTI_UV4SI,
+ SPU_BTI_UV2DI,
+
+ /* A 16-byte type. (Implemented with V16QI_type_node) */
+ SPU_BTI_QUADWORD,
+
+ /* These all correspond to intSI_type_node */
+ SPU_BTI_7,
+ SPU_BTI_S7,
+ SPU_BTI_U7,
+ SPU_BTI_S10,
+ SPU_BTI_S10_4,
+ SPU_BTI_U14,
+ SPU_BTI_16,
+ SPU_BTI_S16,
+ SPU_BTI_S16_2,
+ SPU_BTI_U16,
+ SPU_BTI_U16_2,
+ SPU_BTI_U18,
+
+ /* These correspond to the standard types */
+ SPU_BTI_INTQI,
+ SPU_BTI_INTHI,
+ SPU_BTI_INTSI,
+ SPU_BTI_INTDI,
+
+ SPU_BTI_UINTQI,
+ SPU_BTI_UINTHI,
+ SPU_BTI_UINTSI,
+ SPU_BTI_UINTDI,
+
+ SPU_BTI_FLOAT,
+ SPU_BTI_DOUBLE,
+
+ SPU_BTI_VOID,
+ SPU_BTI_PTR,
+
+ SPU_BTI_MAX
+};
+
+#define V16QI_type_node (spu_builtin_types[SPU_BTI_V16QI])
+#define V8HI_type_node (spu_builtin_types[SPU_BTI_V8HI])
+#define V4SI_type_node (spu_builtin_types[SPU_BTI_V4SI])
+#define V2DI_type_node (spu_builtin_types[SPU_BTI_V2DI])
+#define V4SF_type_node (spu_builtin_types[SPU_BTI_V4SF])
+#define V2DF_type_node (spu_builtin_types[SPU_BTI_V2DF])
+#define unsigned_V16QI_type_node (spu_builtin_types[SPU_BTI_UV16QI])
+#define unsigned_V8HI_type_node (spu_builtin_types[SPU_BTI_UV8HI])
+#define unsigned_V4SI_type_node (spu_builtin_types[SPU_BTI_UV4SI])
+#define unsigned_V2DI_type_node (spu_builtin_types[SPU_BTI_UV2DI])
+
+static GTY(()) tree spu_builtin_types[SPU_BTI_MAX];
+
struct spu_builtin_range
{
int low, high;
@@ -202,8 +268,6 @@ spu_libgcc_cmp_return_mode (void);
static enum machine_mode
spu_libgcc_shift_count_mode (void);
-/* Built in types. */
-tree spu_builtin_types[SPU_BTI_MAX];
/* TARGET overrides. */
@@ -5059,6 +5123,16 @@ spu_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
/* Create the built-in types and functions */
+enum spu_function_code
+{
+#define DEF_BUILTIN(fcode, icode, name, type, params) fcode,
+#include "spu-builtins.def"
+#undef DEF_BUILTIN
+ NUM_SPU_BUILTINS
+};
+
+extern GTY(()) struct spu_builtin_description spu_builtins[NUM_SPU_BUILTINS];
+
struct spu_builtin_description spu_builtins[] = {
#define DEF_BUILTIN(fcode, icode, name, type, params) \
{fcode, icode, name, type, params, NULL_TREE},
@@ -6289,3 +6363,5 @@ spu_section_type_flags (tree decl, const char *name, int reloc)
return SECTION_BSS;
return default_section_type_flags (decl, name, reloc);
}
+
+#include "gt-spu.h"
diff --git a/gcc/config/spu/spu.h b/gcc/config/spu/spu.h
index ae84aac2775..8780d1b9002 100644
--- a/gcc/config/spu/spu.h
+++ b/gcc/config/spu/spu.h
@@ -622,3 +622,33 @@ targetm.resolve_overloaded_builtin = spu_resolve_overloaded_builtin; \
extern GTY(()) rtx spu_compare_op0;
extern GTY(()) rtx spu_compare_op1;
+
+/* Builtins. */
+
+enum spu_builtin_type
+{
+ B_INSN,
+ B_JUMP,
+ B_BISLED,
+ B_CALL,
+ B_HINT,
+ B_OVERLOAD,
+ B_INTERNAL
+};
+
+struct GTY(()) spu_builtin_description
+{
+ int fcode;
+ int icode;
+ const char *name;
+ enum spu_builtin_type type;
+
+ /* The first element of parm is always the return type. The rest
+ are a zero terminated list of parameters. */
+ int parm[5];
+
+ tree fndecl;
+};
+
+extern struct spu_builtin_description spu_builtins[];
+
diff --git a/gcc/config/spu/t-spu-elf b/gcc/config/spu/t-spu-elf
index 97341327501..0a36e959c5b 100644
--- a/gcc/config/spu/t-spu-elf
+++ b/gcc/config/spu/t-spu-elf
@@ -85,13 +85,10 @@ spu.o: $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
output.h $(BASIC_BLOCK_H) $(INTEGRATE_H) toplev.h $(GGC_H) $(HASHTAB_H) \
$(TM_P_H) $(TARGET_H) $(TARGET_DEF_H) langhooks.h reload.h cfglayout.h \
$(srcdir)/config/spu/spu-protos.h \
- $(srcdir)/config/spu/spu-builtins.h \
$(srcdir)/config/spu/spu-builtins.def
spu-c.o: $(srcdir)/config/spu/spu-c.c \
$(srcdir)/config/spu/spu-protos.h \
- $(srcdir)/config/spu/spu-builtins.h \
- $(srcdir)/config/spu/spu-builtins.def \
$(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(CPPLIB_H) \
$(TM_P_H) c-pragma.h coretypes.h $(TM_H) insn-codes.h
$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(srcdir)/config/spu/spu-c.c