This patch enables GET_MODE_WIDER_MODE for MODE_PARTIAL_INT (by setting
the wider mode to the one the partial mode is based on), which is useful
for the port I'm working on: I can avoid defining operations on the
partial modes. Also, convert_modes is changed so that unsignedp is taken
into account when widening partial modes.
I've tested this on m32c-elf as well as on my port, and bootstrapped on
i686-linux. Ok?
Bernd
* machmode.h (CLASS_HAS_WIDER_MODES_P): True for MODE_PARTIAL_INT.
* expr.c (convert_move): Honor unsignedp when extending partial int
modes.
* genmodes.c (power_of_two_p, regular_mode, make_complex_modes,
emit_mode_wider): Revert Spider hacks.
(complete_mode): Don't clear component field of partial int modes.
(emit_mode_inner): Don't emit it however.
(calc_wider_mode): Partial int modes widen to their component.
Index: machmode.h
===================================================================
--- machmode.h (revision 186270)
+++ machmode.h (working copy)
@@ -166,6 +166,7 @@ extern const unsigned char mode_class[NU
/* Nonzero if CLASS modes can be widened. */
#define CLASS_HAS_WIDER_MODES_P(CLASS) \
(CLASS == MODE_INT \
+ || CLASS == MODE_PARTIAL_INT \
|| CLASS == MODE_FLOAT \
|| CLASS == MODE_DECIMAL_FLOAT \
|| CLASS == MODE_COMPLEX_FLOAT \
Index: expr.c
===================================================================
--- expr.c (revision 186270)
+++ expr.c (working copy)
@@ -438,21 +438,20 @@ convert_move (rtx to, rtx from, int unsi
rtx new_from;
enum machine_mode full_mode
= smallest_mode_for_size (GET_MODE_BITSIZE (from_mode), MODE_INT);
+ convert_optab ctab = unsignedp ? zext_optab : sext_optab;
+ enum insn_code icode;
- gcc_assert (convert_optab_handler (sext_optab, full_mode, from_mode)
- != CODE_FOR_nothing);
+ icode = convert_optab_handler (ctab, full_mode, from_mode);
+ gcc_assert (icode != CODE_FOR_nothing);
if (to_mode == full_mode)
{
- emit_unop_insn (convert_optab_handler (sext_optab, full_mode,
- from_mode),
- to, from, UNKNOWN);
+ emit_unop_insn (icode, to, from, UNKNOWN);
return;
}
new_from = gen_reg_rtx (full_mode);
- emit_unop_insn (convert_optab_handler (sext_optab, full_mode, from_mode),
- new_from, from, UNKNOWN);
+ emit_unop_insn (icode, new_from, from, UNKNOWN);
/* else proceed to integer conversions below. */
from_mode = full_mode;
Index: genmodes.c
===================================================================
--- genmodes.c (revision 186270)
+++ genmodes.c (working copy)
@@ -360,7 +360,6 @@ complete_mode (struct mode_data *m)
m->bytesize = m->component->bytesize;
m->ncomponents = 1;
- m->component = 0; /* ??? preserve this */
break;
case MODE_COMPLEX_INT:
@@ -823,7 +822,13 @@ calc_wider_mode (void)
sortbuf[i] = 0;
for (j = 0; j < i; j++)
- sortbuf[j]->next = sortbuf[j]->wider = sortbuf[j + 1];
+ {
+ sortbuf[j]->next = sortbuf[j + 1];
+ if (c == MODE_PARTIAL_INT)
+ sortbuf[j]->wider = sortbuf[j]->component;
+ else
+ sortbuf[j]->wider = sortbuf[j]->next;
+ }
modes[c] = sortbuf[0];
}
@@ -1120,7 +1125,8 @@ emit_mode_inner (void)
for_all_modes (c, m)
tagged_printf ("%smode",
- m->component ? m->component->name : void_mode->name,
+ c != MODE_PARTIAL_INT && m->component
+ ? m->component->name : void_mode->name,
m->name);
print_closer ();