aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.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/expr.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/expr.c')
-rw-r--r--gcc/expr.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 81112da..3e8e004 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;