summaryrefslogtreecommitdiffstats
path: root/gcc/explow.c
diff options
context:
space:
mode:
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>1996-06-18 10:33:10 +0000
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>1996-06-18 10:33:10 +0000
commit52df372477ec3f3feed83a3c1e77cbc96aa754cf (patch)
tree9d26ee7e7eb897c8cdd301fa3f255406fc5fbaba /gcc/explow.c
parent19b6fbf5ad486685955ce64ce3d40eba97487c08 (diff)
downloadppe42-gcc-52df372477ec3f3feed83a3c1e77cbc96aa754cf.tar.gz
ppe42-gcc-52df372477ec3f3feed83a3c1e77cbc96aa754cf.zip
(convert_memory_address, case PLUS, MULT): Don't commute operation
with extension if not adding small integer. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@12292 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/explow.c')
-rw-r--r--gcc/explow.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/gcc/explow.c b/gcc/explow.c
index 89870752e8a..b918294ec84 100644
--- a/gcc/explow.c
+++ b/gcc/explow.c
@@ -304,8 +304,11 @@ convert_memory_address (to_mode, x)
enum machine_mode to_mode;
rtx x;
{
+ enum machine_mode from_mode = to_mode == ptr_mode ? Pmode : ptr_mode;
rtx temp;
+ /* Here we handle some special cases. If none of them apply, fall through
+ to the default case. */
switch (GET_CODE (x))
{
case CONST_INT:
@@ -320,21 +323,25 @@ convert_memory_address (to_mode, x)
SYMBOL_REF_FLAG (temp) = SYMBOL_REF_FLAG (x);
return temp;
- case PLUS:
- case MULT:
- return gen_rtx (GET_CODE (x), to_mode,
- convert_memory_address (to_mode, XEXP (x, 0)),
- convert_memory_address (to_mode, XEXP (x, 1)));
-
case CONST:
return gen_rtx (CONST, to_mode,
convert_memory_address (to_mode, XEXP (x, 0)));
- default:
- return convert_modes (to_mode,
- to_mode == ptr_mode ? Pmode : ptr_mode,
- x, POINTERS_EXTEND_UNSIGNED);
+ case PLUS:
+ case MULT:
+ /* For addition the second operand is a small constant, we can safely
+ permute the converstion and addition operation. We can always safely
+ permute them if we are making the address narrower. */
+ if (GET_MODE_SIZE (to_mode) < GET_MODE_SIZE (from_mode)
+ || (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT
+ && INTVAL (x) + 20000 < 40000))
+ return gen_rtx (GET_CODE (x), to_mode,
+ convert_memory_address (to_mode, XEXP (x, 0)),
+ convert_memory_address (to_mode, XEXP (x, 1)));
}
+
+ return convert_modes (to_mode, from_mode,
+ x, POINTERS_EXTEND_UNSIGNED);
}
#endif
OpenPOWER on IntegriCloud