diff options
author | Nick Clifton <nickc@cygnus.com> | 1998-10-28 10:30:46 +0000 |
---|---|---|
committer | Nick Clifton <nickc@gcc.gnu.org> | 1998-10-28 10:30:46 +0000 |
commit | 2b28d92ef69dfe9845b6cdc06267b535ed53932d (patch) | |
tree | de3b301456c7de16320fcb33ace83dc50e815d73 /gcc/expr.c | |
parent | ed396e68008200351bd49b4eb8a1cbe644d3b5f3 (diff) | |
download | gcc-2b28d92ef69dfe9845b6cdc06267b535ed53932d.zip gcc-2b28d92ef69dfe9845b6cdc06267b535ed53932d.tar.gz gcc-2b28d92ef69dfe9845b6cdc06267b535ed53932d.tar.bz2 |
Add code written by rth to generate use shifts to perform an extension if no
suitable extend patterns can be found.
From-SVN: r23398
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 16 |
1 files changed, 14 insertions, 2 deletions
@@ -1100,6 +1100,8 @@ convert_move (to, from, unsignedp) else { enum machine_mode intermediate; + rtx tmp; + tree shift_amount; /* Search for a mode to convert via. */ for (intermediate = from_mode; intermediate != VOIDmode; @@ -1116,8 +1118,18 @@ convert_move (to, from, unsignedp) return; } - /* No suitable intermediate mode. */ - abort (); + /* No suitable intermediate mode. + Generate what we need with shifts. */ + shift_amount = build_int_2 (GET_MODE_BITSIZE (to_mode) + - GET_MODE_BITSIZE (from_mode), 0); + from = gen_lowpart (to_mode, force_reg (from_mode, from)); + tmp = expand_shift (LSHIFT_EXPR, to_mode, from, shift_amount, + to, unsignedp); + tmp = expand_shift (RSHIFT_EXPR, to_mode, tmp, shift_amount, + to, unsignedp); + if (tmp != to) + emit_move_insn (to, tmp); + return; } } |