Misc. fixes for -mpowerpc64 vesion darwin.
authorfjahanian <fjahanian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 Nov 2003 02:34:56 +0000 (02:34 +0000)
committerfjahanian <fjahanian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 Nov 2003 02:34:56 +0000 (02:34 +0000)
Reviewed by David Edelsohn.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@73438 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.h

index 2f6af6b..4c784ab 100644 (file)
@@ -235,6 +235,7 @@ static bool legitimate_small_data_p (enum machine_mode, rtx);
 static bool legitimate_offset_address_p (enum machine_mode, rtx, int);
 static bool legitimate_indexed_address_p (rtx, int);
 static bool legitimate_indirect_address_p (rtx, int);
+static bool macho_lo_sum_memory_operand (rtx x, enum machine_mode mode);
 static bool legitimate_lo_sum_address_p (enum machine_mode, rtx, int);
 static struct machine_function * rs6000_init_machine_status (void);
 static bool rs6000_assemble_integer (rtx, unsigned int, int);
@@ -2145,6 +2146,7 @@ reg_or_mem_operand (rtx op, enum machine_mode mode)
 {
   return (gpc_reg_operand (op, mode)
          || memory_operand (op, mode)
+         || macho_lo_sum_memory_operand (op, mode)
          || volatile_mem_operand (op, mode));
 }
 
@@ -2487,6 +2489,25 @@ legitimate_indirect_address_p (rtx x, int strict)
 }
 
 static bool
+macho_lo_sum_memory_operand (rtx x, enum machine_mode mode)
+{
+    if (!TARGET_MACHO || !flag_pic
+        || mode != SImode || GET_CODE(x) != MEM)
+      return false;
+    x = XEXP (x, 0);
+
+  if (GET_CODE (x) != LO_SUM)
+    return false;
+  if (GET_CODE (XEXP (x, 0)) != REG)
+    return false;
+  if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 0))
+    return false;
+  x = XEXP (x, 1);
+
+  return CONSTANT_P (x);
+}
+
+static bool
 legitimate_lo_sum_address_p (enum machine_mode mode, rtx x, int strict)
 {
   if (GET_CODE (x) != LO_SUM)
@@ -3211,12 +3232,12 @@ rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c1, HOST_WIDE_INT c2)
       HOST_WIDE_INT ud1, ud2, ud3, ud4;
 
       ud1 = c1 & 0xffff;
-      ud2 = (c1 & 0xffff0000) >> 16;
+      ud2 = (unsigned HOST_WIDE_INT)(c1 & 0xffff0000) >> 16;
 #if HOST_BITS_PER_WIDE_INT >= 64
       c2 = c1 >> 32;
 #endif
       ud3 = c2 & 0xffff;
-      ud4 = (c2 & 0xffff0000) >> 16;
+      ud4 = (unsigned HOST_WIDE_INT)(c2 & 0xffff0000) >> 16;
 
       if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000)) 
          || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
index ce38901..37d851b 100644 (file)
@@ -2276,6 +2276,9 @@ do {                                                              \
    between pointers and any other objects of this machine mode.  */
 #define Pmode (TARGET_32BIT ? SImode : DImode)
 
+/* Supply definition of STACK_SIZE_MODE for allocate_dynamic_stack_space. */
+#define STACK_SIZE_MODE (TARGET_32BIT ? SImode : DImode)
+
 /* Mode of a function address in a call instruction (for indexing purposes).
    Doesn't matter on RS/6000.  */
 #define FUNCTION_MODE SImode