aboutsummaryrefslogtreecommitdiff
path: root/gcc/genmodes.c
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@codesourcery.com>2012-04-26 14:20:39 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2012-04-26 14:20:39 +0000
commite90247f8bac2b058550d5e3af7873fa2768624d2 (patch)
treecc9676874f6a1ec2605d4af7227233a8650f66f1 /gcc/genmodes.c
parent81c082ecd2881c3d1ed9387e4deeb922f74a8c4f (diff)
downloadgcc-e90247f8bac2b058550d5e3af7873fa2768624d2.zip
gcc-e90247f8bac2b058550d5e3af7873fa2768624d2.tar.gz
gcc-e90247f8bac2b058550d5e3af7873fa2768624d2.tar.bz2
re PR middle-end/52940 (conversion from MODE_PARTIAL_INT uses sign extension for unsigned types)
PR middle-end/52940 * 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 (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. From-SVN: r186877
Diffstat (limited to 'gcc/genmodes.c')
-rw-r--r--gcc/genmodes.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/genmodes.c b/gcc/genmodes.c
index 84517b9..d0095c3 100644
--- a/gcc/genmodes.c
+++ b/gcc/genmodes.c
@@ -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:
@@ -821,7 +820,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];
}
@@ -1118,7 +1123,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 ();