From e90247f8bac2b058550d5e3af7873fa2768624d2 Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Thu, 26 Apr 2012 14:20:39 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 9 +++++++++ gcc/expr.c | 13 ++++++------- gcc/genmodes.c | 12 +++++++++--- gcc/machmode.h | 1 + 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0515b9f8cbd..2ca14ffe8b0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,15 @@ * PR middle-end/52997 * ira.c (find_moveable_pseudos): Call resize_reg_info. + 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. + 2012-04-26 David S. Miller * config/sparc/niagara4.md: New file. diff --git a/gcc/expr.c b/gcc/expr.c index 81112da4ad3..3e8e004063b 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -438,21 +438,20 @@ convert_move (rtx to, rtx from, int unsignedp) 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; diff --git a/gcc/genmodes.c b/gcc/genmodes.c index 84517b9f3dc..d0095c3b0b1 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 (); diff --git a/gcc/machmode.h b/gcc/machmode.h index 4a3f6f50d16..6137c70e1e6 100644 --- a/gcc/machmode.h +++ b/gcc/machmode.h @@ -166,6 +166,7 @@ extern const unsigned char mode_class[NUM_MACHINE_MODES]; /* 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 \ -- 2.30.2