ChangeLog:
2004-07-24 Fariborz Jahanian <fjahanian@apple.com>
* config/rs6000/rs6000.c (legitimate_lo_sum_address_p):
DImode is legit. mode with lo_sum pic address and when
long double is 128 bits.
(rs6000_split_multireg_move): Added case of LO_SUM when
register node is being obtained.
Patch:
Index: rs6000.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.671
diff -c -p -r1.671 rs6000.c
*** rs6000.c 23 Jul 2004 04:35:17 -0000 1.671
--- rs6000.c 24 Jul 2004 18:32:19 -0000
*************** legitimate_lo_sum_address_p (enum machin
*** 3162,3168 ****
if (GET_MODE_NUNITS (mode) != 1)
return false;
if (GET_MODE_BITSIZE (mode) > 32
! && !(TARGET_HARD_FLOAT && TARGET_FPRS && mode == DFmode))
return false;
return CONSTANT_P (x);
--- 3162,3170 ----
if (GET_MODE_NUNITS (mode) != 1)
return false;
if (GET_MODE_BITSIZE (mode) > 32
! && !(TARGET_HARD_FLOAT && TARGET_FPRS
! && (mode == DFmode ||
! (TARGET_LONG_DOUBLE_128 && mode == DImode))))
return false;
return CONSTANT_P (x);
*************** rs6000_split_multireg_move (rtx dst, rtx
*** 11077,11084 ****
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();
--- 11079,11087 ----
we have change that register last. */
breg = (GET_CODE (XEXP (src, 0)) == PLUS
+ || GET_CODE (XEXP (src, 0)) == LO_SUM)
? XEXP (XEXP (src, 0), 0)
! : XEXP (src, 0);
if (!REG_P (breg))
abort();