This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Add Single Element Vectors support
- From: Nick Clifton <nickc at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: 17 Sep 2002 14:03:58 +0100
- Subject: Add Single Element Vectors support
Hi Guys,
With approval from Richard Henderson I am checking in the patch
below. It adds support for a single element, 64-bit vector type
(V1DImode). This type is needed by the Motorola e500 part which has
a vector processor that includes support for objects for this type,
and which are not handled by the same registers as an ordinary
DImode variable.
Tested against the x86 native - no regressions introduced.
Cheers
Nick
2002-09-17 Nick Clifton <nickc@redhat.com>
* machmode.def (V1DImode): New mode. A single element vector.
* tree.h (TI_UV1DI_TYPE, TI_V1DI_TYPE): New tree_index enums.
(unsigned_V1DI_type_node, V1D1_type_node): New type nodes.
* tree.c (build_common_tree_nodes_2): Build
unsigned_V1DI_type_node and V1D1_type_node.
* c-common.c (c_common_type_for_mode): Return
unsigned_V1DI_type_node or V1D1_type_node for V1DImode.
* rtl.c (class_narrowest_): Start integer vector nodes with V1DImode.
Index: machmode.def
===================================================================
RCS file: /cvs/gcc/gcc/gcc/machmode.def,v
retrieving revision 1.20
diff -c -3 -p -w -r1.20 machmode.def
*** machmode.def 10 Jun 2002 22:35:44 -0000 1.20
--- machmode.def 17 Sep 2002 12:56:15 -0000
*************** DEF_MACHMODE (CTImode, "CTI", MODE_COMPL
*** 113,123 ****
DEF_MACHMODE (COImode, "COI", MODE_COMPLEX_INT, BITS_PER_UNIT*64, 64, 32, VOIDmode, OImode)
/* Vector modes. */
- /* There are no V1xx vector modes. These are equivalent to normal
- scalar modes. */
/* The wider mode field for vectors follows in order of increasing bit
size with QI coming before HI, HI before SI, and SI before DI
within same bit sizes. */
DEF_MACHMODE (V2QImode, "V2QI", MODE_VECTOR_INT, BITS_PER_UNIT*2, 2, 1, V4QImode, QImode)
DEF_MACHMODE (V2HImode, "V2HI", MODE_VECTOR_INT, BITS_PER_UNIT*4, 4, 2, V8QImode, HImode)
DEF_MACHMODE (V2SImode, "V2SI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 4, V16QImode, SImode)
--- 113,122 ----
DEF_MACHMODE (COImode, "COI", MODE_COMPLEX_INT, BITS_PER_UNIT*64, 64, 32, VOIDmode, OImode)
/* Vector modes. */
/* The wider mode field for vectors follows in order of increasing bit
size with QI coming before HI, HI before SI, and SI before DI
within same bit sizes. */
+ DEF_MACHMODE (V1DImode, "V1DI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 8, V2QImode, DImode)
DEF_MACHMODE (V2QImode, "V2QI", MODE_VECTOR_INT, BITS_PER_UNIT*2, 2, 1, V4QImode, QImode)
DEF_MACHMODE (V2HImode, "V2HI", MODE_VECTOR_INT, BITS_PER_UNIT*4, 4, 2, V8QImode, HImode)
DEF_MACHMODE (V2SImode, "V2SI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 4, V16QImode, SImode)
Index: tree.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree.h,v
retrieving revision 1.350
diff -c -3 -p -w -r1.350 tree.h
*** tree.h 16 Sep 2002 18:33:19 -0000 1.350
--- tree.h 17 Sep 2002 12:56:18 -0000
*************** enum tree_index
*** 1968,1973 ****
--- 1968,1974 ----
TI_UV2SI_TYPE,
TI_UV2SF_TYPE,
TI_UV2DI_TYPE,
+ TI_UV1DI_TYPE,
TI_UV16QI_TYPE,
TI_V4SF_TYPE,
*************** enum tree_index
*** 1980,1985 ****
--- 1981,1987 ----
TI_V2SF_TYPE,
TI_V2DF_TYPE,
TI_V2DI_TYPE,
+ TI_V1DI_TYPE,
TI_V16QI_TYPE,
TI_MAIN_IDENTIFIER,
*************** extern GTY(()) tree global_trees[TI_MAX]
*** 2048,2053 ****
--- 2050,2056 ----
#define unsigned_V4HI_type_node global_trees[TI_UV4HI_TYPE]
#define unsigned_V2SI_type_node global_trees[TI_UV2SI_TYPE]
#define unsigned_V2DI_type_node global_trees[TI_UV2DI_TYPE]
+ #define unsigned_V1DI_type_node global_trees[TI_UV1DI_TYPE]
#define V16QI_type_node global_trees[TI_V16QI_TYPE]
#define V4SF_type_node global_trees[TI_V4SF_TYPE]
*************** extern GTY(()) tree global_trees[TI_MAX]
*** 2060,2065 ****
--- 2063,2069 ----
#define V2DI_type_node global_trees[TI_V2DI_TYPE]
#define V2DF_type_node global_trees[TI_V2DF_TYPE]
#define V16SF_type_node global_trees[TI_V16SF_TYPE]
+ #define V1DI_type_node global_trees[TI_V1DI_TYPE]
/* An enumeration of the standard C integer types. These must be
ordered so that shorter types appear before longer ones, and so
Index: tree.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree.c,v
retrieving revision 1.272
diff -c -3 -p -w -r1.272 tree.c
*** tree.c 16 Sep 2002 16:36:34 -0000 1.272
--- tree.c 17 Sep 2002 12:56:17 -0000
*************** build_common_tree_nodes_2 (short_double)
*** 4775,4780 ****
--- 4775,4782 ----
= make_vector (V8HImode, unsigned_intHI_type_node, 1);
unsigned_V16QI_type_node
= make_vector (V16QImode, unsigned_intQI_type_node, 1);
+ unsigned_V1DI_type_node
+ = make_vector (V1DImode, unsigned_intDI_type_node, 1);
V16SF_type_node = make_vector (V16SFmode, float_type_node, 0);
V4SF_type_node = make_vector (V4SFmode, float_type_node, 0);
*************** build_common_tree_nodes_2 (short_double)
*** 4787,4792 ****
--- 4789,4795 ----
V2SF_type_node = make_vector (V2SFmode, float_type_node, 0);
V2DF_type_node = make_vector (V2DFmode, double_type_node, 0);
V16QI_type_node = make_vector (V16QImode, intQI_type_node, 0);
+ V1DI_type_node = make_vector (V1DImode, intDI_type_node, 0);
}
/* Returns a vector tree node given a vector mode, the inner type, and
Index: c-common.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-common.c,v
retrieving revision 1.377
diff -c -3 -p -w -r1.377 c-common.c
*** c-common.c 16 Sep 2002 16:58:40 -0000 1.377
--- c-common.c 17 Sep 2002 12:56:15 -0000
*************** c_common_type_for_mode (mode, unsignedp)
*** 2029,2034 ****
--- 2029,2036 ----
return unsignedp ? unsigned_V4HI_type_node : V4HI_type_node;
case V8QImode:
return unsignedp ? unsigned_V8QI_type_node : V8QI_type_node;
+ case V1DImode:
+ return unsignedp ? unsigned_V1DI_type_node : V1DI_type_node;
case V16SFmode:
return V16SF_type_node;
case V4SFmode:
Index: rtl.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/rtl.c,v
retrieving revision 1.118
diff -c -3 -p -w -r1.118 rtl.c
*** rtl.c 16 Sep 2002 18:33:19 -0000 1.118
--- rtl.c 17 Sep 2002 12:56:15 -0000
*************** const enum machine_mode class_narrowest_
*** 152,158 ****
/* MODE_CC */ CCmode,
/* MODE_COMPLEX_INT */ CQImode,
/* MODE_COMPLEX_FLOAT */ QCmode,
! /* MODE_VECTOR_INT */ V2QImode,
/* MODE_VECTOR_FLOAT */ V2SFmode
};
--- 152,158 ----
/* MODE_CC */ CCmode,
/* MODE_COMPLEX_INT */ CQImode,
/* MODE_COMPLEX_FLOAT */ QCmode,
! /* MODE_VECTOR_INT */ V1DImode,
/* MODE_VECTOR_FLOAT */ V2SFmode
};