This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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
  };
  


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]