aboutsummaryrefslogtreecommitdiff
path: root/gcc/genmodes.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/genmodes.cc')
-rw-r--r--gcc/genmodes.cc33
1 files changed, 32 insertions, 1 deletions
diff --git a/gcc/genmodes.cc b/gcc/genmodes.cc
index 59850bb..9f0cc9c 100644
--- a/gcc/genmodes.cc
+++ b/gcc/genmodes.cc
@@ -1527,7 +1527,7 @@ emit_mode_wider (void)
int c;
struct mode_data *m;
- print_decl ("unsigned char", "mode_wider", "NUM_MACHINE_MODES");
+ print_decl ("unsigned char", "mode_next", "NUM_MACHINE_MODES");
for_all_modes (c, m)
tagged_printf ("E_%smode",
@@ -1535,6 +1535,37 @@ emit_mode_wider (void)
m->name);
print_closer ();
+ print_decl ("unsigned char", "mode_wider", "NUM_MACHINE_MODES");
+
+ for_all_modes (c, m)
+ {
+ struct mode_data *m2 = 0;
+
+ if (m->cl == MODE_INT
+ || m->cl == MODE_PARTIAL_INT
+ || m->cl == MODE_FLOAT
+ || m->cl == MODE_DECIMAL_FLOAT
+ || m->cl == MODE_COMPLEX_FLOAT
+ || m->cl == MODE_FRACT
+ || m->cl == MODE_UFRACT
+ || m->cl == MODE_ACCUM
+ || m->cl == MODE_UACCUM)
+ for (m2 = m->wider; m2 && m2 != void_mode; m2 = m2->wider)
+ {
+ if (m2->bytesize == m->bytesize
+ && m2->precision == m->precision)
+ continue;
+ break;
+ }
+
+ if (m2 == void_mode)
+ m2 = 0;
+ tagged_printf ("E_%smode",
+ m2 ? m2->name : void_mode->name,
+ m->name);
+ }
+
+ print_closer ();
print_decl ("unsigned char", "mode_2xwider", "NUM_MACHINE_MODES");
for_all_modes (c, m)