How to add 256 byte sized opaque mode in gcc

Avinash Jayakar via Gcc <[email protected]>
Newsgroups gmane.comp.gcc.devel
Message-ID <[email protected]>
Hi,

I am trying to add a 256 byte opaque mode for the rs6000 backend in order to
represent a 2048 bit (pair of 1024 bit DMR) registers, following a similar
approach as we did for OO and XOmodes.

The problem is the mode_unit_size is declared as 'unsigned char' array in
genmodes.cc. Because of this I get an overflow warning, and querying this array
for the new QDOmode implemented below will return 0.

mode_unit_size_inline (machine_mode mode)\n\
{\n\
  extern CONST_MODE_UNIT_SIZE unsigned char mode_unit_size[NUM_MACHINE_MODES];\
\n\

Is it safe to change this array type to unsigned int, since the struct mode_data's
fields for bytesize and ncomponents are also unsigned int?

Work in progress patch is below, here I am trying to add opaque mode in
rs6000-modes.def.

Thanks and regards,
Avinash

---
 gcc/config/rs6000/rs6000-builtin.cc | 16 ++++++++++++++++
 gcc/config/rs6000/rs6000-modes.def  |  3 ++-
 gcc/config/rs6000/rs6000.cc         | 15 +++++++++++----
 gcc/config/rs6000/rs6000.h          |  4 ++++
 4 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/gcc/config/rs6000/rs6000-builtin.cc b/gcc/config/rs6000/rs6000-builtin.cc
index ad6f1fc09f4..0081c3cb0e4 100644
--- a/gcc/config/rs6000/rs6000-builtin.cc
+++ b/gcc/config/rs6000/rs6000-builtin.cc
@@ -519,6 +519,8 @@ const char *rs6000_type_string (tree type_node)
     return "__vector_quad";
   else if (type_node == dmr1024_type_node)
     return "__dmr1024";
+  else if (type_node == dmr2048_type_node)
+    return "__dmr2048";
 
   return "unknown";
 }
@@ -835,6 +837,17 @@ rs6000_init_builtins (void)
   t = build_qualified_type (dmr1024_type_node, TYPE_QUAL_CONST);
   ptr_dmr1024_type_node = build_pointer_type (t);
 
+  dmr2048_type_node = make_node (OPAQUE_TYPE);
+  SET_TYPE_MODE (dmr2048_type_node, QDOmode);
+  TYPE_SIZE (dmr2048_type_node) = bitsize_int (GET_MODE_BITSIZE (QDOmode));
+  TYPE_PRECISION (dmr2048_type_node) = GET_MODE_BITSIZE (QDOmode);
+  TYPE_SIZE_UNIT (dmr2048_type_node) = size_int (GET_MODE_SIZE (QDOmode));
+  SET_TYPE_ALIGN (dmr2048_type_node, 512);
+  TYPE_USER_ALIGN (dmr2048_type_node) = 0;
+  lang_hooks.types.register_builtin_type (dmr2048_type_node, "__dmr2048");
+  t = build_qualified_type (dmr2048_type_node, TYPE_QUAL_CONST);
+  ptr_dmr2048_type_node = build_pointer_type (t);
+
   tdecl = add_builtin_type ("__bool char", bool_char_type_node);
   TYPE_NAME (bool_char_type_node) = tdecl;
 
@@ -1337,6 +1350,9 @@ rs6000_gimple_fold_mma_builtin (gimple_stmt_iterator *gsi,
     case OOmode:
       lhs_type = vector_pair_type_node;
       break;
+    case QDOmode:
+      lhs_type = dmr2048_type_node;
+      break;
     default:
       gcc_unreachable ();
     }
diff --git a/gcc/config/rs6000/rs6000-modes.def b/gcc/config/rs6000/rs6000-modes.def
index 0ad326751c4..e9fdc145d43 100644
--- a/gcc/config/rs6000/rs6000-modes.def
+++ b/gcc/config/rs6000/rs6000-modes.def
@@ -76,7 +76,8 @@ VECTOR_MODE (INT, SI, 2);     /*                 V2SI  */
    combination.  */
 PARTIAL_INT_MODE (TI, 128, PTI);
 
-/* Modes used by __vector_pair, __vector_quad and __dmr1024.  */
+/* Modes used by __vector_pair, __vector_quad, __dmr1024, __dmr2048.  */
 OPAQUE_MODE (OO, 32);
 OPAQUE_MODE (XO, 64);
 OPAQUE_MODE (TDO, 128);
+OPAQUE_MODE (QDO, 256);
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index 99555988913..bca421fe1fb 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -1868,8 +1868,9 @@ rs6000_hard_regno_mode_ok_uncached (int regno, machine_mode mode)
   if (COMPLEX_MODE_P (mode))
     mode = GET_MODE_INNER (mode);
 
-  /* No other types other than XOmode or TDOmode can go in DMRs.  */
-  if (DMR_REGNO_P (regno) && !(mode ==XOmode || mode == TDOmode))
+  /* No other types other than XOmode, TDOmode or QDOmode can go in DMRs.  */
+  if (DMR_REGNO_P (regno)
+      && !(mode == XOmode || mode == TDOmode || mode == QDOmode))
     return 0;
 
   /* TDOmode value can be held in either 1 DMR register or 8 VSX
@@ -1884,6 +1885,11 @@ rs6000_hard_regno_mode_ok_uncached (int regno, machine_mode mode)
       else
 	return 0;
     }
+  /* QDOmode needs even/odd DMR register pairs.  */
+  if (mode == QDOmode)
+    {
+      return (TARGET_DMF && DMR_REGNO_P (regno) && (regno & 1) == 0);
+    }
 
   /* Vector pair modes need even/odd VSX register pairs.  Only allow vector
      registers.  */
@@ -2011,8 +2017,9 @@ static bool
 rs6000_modes_tieable_p (machine_mode mode1, machine_mode mode2)
 {
   if (mode1 == PTImode || mode1 == OOmode || mode1 == XOmode
-      || mode1 == TDOmode || mode2 == PTImode || mode2 == OOmode
-      || mode2 == XOmode || mode2 == TDOmode)
+      || mode1 == TDOmode || mode1 == QDOmode || mode2 == PTImode
+      || mode2 == OOmode || mode2 == XOmode || mode2 == TDOmode
+      || mode2 == QDOmode)
     return mode1 == mode2;
 
   if (ALTIVEC_OR_VSX_VECTOR_MODE (mode1))
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index bcd4c39d24d..c06de1396b1 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -2277,6 +2277,7 @@ enum rs6000_builtin_type_index
   RS6000_BTI_vector_pair,	 /* unsigned 256-bit types (vector pair).  */
   RS6000_BTI_vector_quad,	 /* unsigned 512-bit types (vector quad).  */
   RS6000_BTI_dmr1024,            /* unsigned 1024-bit type (dmr1024).  */
+  RS6000_BTI_dmr2048,            /* unsigned 2048-bit type (dmr2048).  */
   RS6000_BTI_const_ptr_void,     /* const pointer to void */
   RS6000_BTI_ptr_V16QI,
   RS6000_BTI_ptr_V1TI,
@@ -2316,6 +2317,7 @@ enum rs6000_builtin_type_index
   RS6000_BTI_ptr_vector_pair,
   RS6000_BTI_ptr_vector_quad,
   RS6000_BTI_ptr_dmr1024,
+  RS6000_BTI_ptr_dmr2048,
   RS6000_BTI_ptr_long_long,
   RS6000_BTI_ptr_long_long_unsigned,
   RS6000_BTI_INTPTI,
@@ -2378,6 +2380,7 @@ enum rs6000_builtin_type_index
 #define vector_pair_type_node		 (rs6000_builtin_types[RS6000_BTI_vector_pair])
 #define vector_quad_type_node		 (rs6000_builtin_types[RS6000_BTI_vector_quad])
 #define dmr1024_type_node                (rs6000_builtin_types[RS6000_BTI_dmr1024])
+#define dmr2048_type_node                (rs6000_builtin_types[RS6000_BTI_dmr2048])
 #define pcvoid_type_node		 (rs6000_builtin_types[RS6000_BTI_const_ptr_void])
 #define ptr_V16QI_type_node		 (rs6000_builtin_types[RS6000_BTI_ptr_V16QI])
 #define ptr_V1TI_type_node		 (rs6000_builtin_types[RS6000_BTI_ptr_V1TI])
@@ -2417,6 +2420,7 @@ enum rs6000_builtin_type_index
 #define ptr_vector_pair_type_node	 (rs6000_builtin_types[RS6000_BTI_ptr_vector_pair])
 #define ptr_vector_quad_type_node	 (rs6000_builtin_types[RS6000_BTI_ptr_vector_quad])
 #define ptr_dmr1024_type_node            (rs6000_builtin_types[RS6000_BTI_ptr_dmr1024])
+#define ptr_dmr2048_type_node            (rs6000_builtin_types[RS6000_BTI_ptr_dmr2048])
 #define ptr_long_long_integer_type_node	 (rs6000_builtin_types[RS6000_BTI_ptr_long_long])
 #define ptr_long_long_unsigned_type_node (rs6000_builtin_types[RS6000_BTI_ptr_long_long_unsigned])
 
-- 
2.54.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.