This patch adds a scalar_mode_pod class and uses it for
fixed_value, instead of machine_mode_enum.

gcc/
2016-11-24  Richard Sandiford  <richard.sandif...@arm.com>
            Alan Hayward  <alan.hayw...@arm.com>
            David Sherwood  <david.sherw...@arm.com>

        * coretypes.h (scalar_mode_pod): New typedef.
        * machmode.h (gt_ggc_mx, gt_pch_nx): New functions.
        * fixed-value.h (fixed_value::mode): Change type to scalar_mode_pod.
        * fold-const.c (fold_convert_const_int_from_fixed): Use scalar_mode.
        * tree-streamer-in.c (unpack_ts_fixed_cst_value_fields): Use
        as_a <scalar_mode>.

diff --git a/gcc/coretypes.h b/gcc/coretypes.h
index 0fdd025..564d7fe 100644
--- a/gcc/coretypes.h
+++ b/gcc/coretypes.h
@@ -64,6 +64,7 @@ typedef opt_mode<scalar_mode> opt_scalar_mode;
 typedef opt_mode<scalar_int_mode> opt_scalar_int_mode;
 typedef opt_mode<scalar_float_mode> opt_scalar_float_mode;
 template<typename> class pod_mode;
+typedef pod_mode<scalar_mode> scalar_mode_pod;
 typedef pod_mode<scalar_int_mode> scalar_int_mode_pod;
 
 /* Subclasses of rtx_def, using indentation to show the class
diff --git a/gcc/fixed-value.h b/gcc/fixed-value.h
index 78df6e6..5e75f66 100644
--- a/gcc/fixed-value.h
+++ b/gcc/fixed-value.h
@@ -22,8 +22,8 @@ along with GCC; see the file COPYING3.  If not see
 
 struct GTY(()) fixed_value
 {
-  double_int data;             /* Store data up to 2 wide integers.  */
-  machine_mode_enum mode;      /* Use machine mode to know IBIT and FBIT.  */
+  double_int data;       /* Store data up to 2 wide integers.  */
+  scalar_mode_pod mode;  /* Use machine mode to know IBIT and FBIT.  */
 };
 
 #define FIXED_VALUE_TYPE struct fixed_value
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 3876883..7c6e0d9 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -1919,7 +1919,7 @@ fold_convert_const_int_from_fixed (tree type, const_tree 
arg1)
 {
   tree t;
   double_int temp, temp_trunc;
-  machine_mode mode;
+  scalar_mode mode;
 
   /* Right shift FIXED_CST to temp by fbit.  */
   temp = TREE_FIXED_CST (arg1).data;
diff --git a/gcc/machmode.h b/gcc/machmode.h
index 1dae146..fe62965 100644
--- a/gcc/machmode.h
+++ b/gcc/machmode.h
@@ -902,4 +902,22 @@ namespace mode_iterator
        mode_iterator::iterate_p (&(ITERATOR)); \
        mode_iterator::get_2xwider (&(ITERATOR)))
 
+template<typename T>
+void
+gt_ggc_mx (pod_mode<T> *)
+{
+}
+
+template<typename T>
+void
+gt_pch_nx (pod_mode<T> *)
+{
+}
+
+template<typename T>
+void
+gt_pch_nx (pod_mode<T> *, void (*) (void *, void *), void *)
+{
+}
+
 #endif /* not HAVE_MACHINE_MODES */
diff --git a/gcc/tree-streamer-in.c b/gcc/tree-streamer-in.c
index 3d8a7bb..d1e7f96 100644
--- a/gcc/tree-streamer-in.c
+++ b/gcc/tree-streamer-in.c
@@ -208,7 +208,7 @@ static void
 unpack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr)
 {
   FIXED_VALUE_TYPE *fp = ggc_alloc<fixed_value> ();
-  fp->mode = bp_unpack_machine_mode (bp);
+  fp->mode = as_a <scalar_mode> (bp_unpack_machine_mode (bp));
   fp->data.low = bp_unpack_var_len_int (bp);
   fp->data.high = bp_unpack_var_len_int (bp);
   TREE_FIXED_CST_PTR (expr) = fp;

Reply via email to