From 2b28d92ef69dfe9845b6cdc06267b535ed53932d Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Wed, 28 Oct 1998 10:30:46 +0000 Subject: [PATCH] Add code written by rth to generate use shifts to perform an extension if no suitable extend patterns can be found. From-SVN: r23398 --- gcc/ChangeLog | 6 ++++++ gcc/expr.c | 16 ++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a84f2124f9a1..21ec81f21df8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Wed Oct 28 10:29:09 1998 Nick Clifton + + * expr.c (convert_move): Use shifts to perform the move if a + suitable extend pattern cannot be found. Code written by + Richard Henderson . + Wed Oct 28 03:59:29 1998 Bernd Schmidt * regclass.c (renumber, regno_allocated): New static variables, moved diff --git a/gcc/expr.c b/gcc/expr.c index 37581ec39ce8..1dd7cb718d64 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -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; } } -- 2.43.5