From 0423421f6f73c7375200a3a59da5269b31c6af28 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 26 Aug 2004 01:20:25 +0000 Subject: [PATCH] re PR target/16480 (using -msdata causes internal compiler error) PR target/16480 * config/rs6000/rs6000.c (rs6000_split_multireg_move): Don't abort on "(mem (symbol_ref ..))" rtl. Look at LO_SUM base regs as well as PLUS base regs. From-SVN: r86598 --- gcc/ChangeLog | 7 +++++++ gcc/config/rs6000/rs6000.c | 20 ++++++++------------ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5fa3d878203..4af8f57b048 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-08-26 Alan Modra + + PR target/16480 + * config/rs6000/rs6000.c (rs6000_split_multireg_move): Don't abort + on "(mem (symbol_ref ..))" rtl. Look at LO_SUM base regs as well + as PLUS base regs. + 2005-08-28 Paul Brook * config/arm/symbian.h (SUBTARGET_ASM_FLOAT_SPEC): Default to diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index fd95f0ba167..745b4759d3b 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -11352,18 +11352,14 @@ rs6000_split_multireg_move (rtx dst, rtx src) src = newsrc; } - /* We have now address involving an base register only. - If we use one of the registers to address memory, - we have change that register last. */ - - breg = (GET_CODE (XEXP (src, 0)) == PLUS - ? XEXP (XEXP (src, 0), 0) - : XEXP (src, 0)); - - if (!REG_P (breg)) - abort(); - - if (REGNO (breg) >= REGNO (dst) + breg = XEXP (src, 0); + if (GET_CODE (breg) == PLUS || GET_CODE (breg) == LO_SUM) + breg = XEXP (breg, 0); + + /* If the base register we are using to address memory is + also a destination reg, then change that register last. */ + if (REG_P (breg) + && REGNO (breg) >= REGNO (dst) && REGNO (breg) < REGNO (dst) + nregs) j = REGNO (breg) - REGNO (dst); } -- 2.30.2