diff options
author | Bernd Schmidt <bernds@codesourcery.com> | 2012-04-26 14:20:39 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@gcc.gnu.org> | 2012-04-26 14:20:39 +0000 |
commit | e90247f8bac2b058550d5e3af7873fa2768624d2 (patch) | |
tree | cc9676874f6a1ec2605d4af7227233a8650f66f1 /gcc/expr.c | |
parent | 81c082ecd2881c3d1ed9387e4deeb922f74a8c4f (diff) | |
download | gcc-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/expr.c')
-rw-r--r-- | gcc/expr.c | 13 |
1 files changed, 6 insertions, 7 deletions
@@ -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; |