Commit 4c81e946 by Fariborz Jahanian

Misc. fixes for -mpowerpc64 vesion darwin.

Reviewed by David Edelsohn.

From-SVN: r73438
parent 84083f51
...@@ -235,6 +235,7 @@ static bool legitimate_small_data_p (enum machine_mode, rtx); ...@@ -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_offset_address_p (enum machine_mode, rtx, int);
static bool legitimate_indexed_address_p (rtx, int); static bool legitimate_indexed_address_p (rtx, int);
static bool legitimate_indirect_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 bool legitimate_lo_sum_address_p (enum machine_mode, rtx, int);
static struct machine_function * rs6000_init_machine_status (void); static struct machine_function * rs6000_init_machine_status (void);
static bool rs6000_assemble_integer (rtx, unsigned int, int); static bool rs6000_assemble_integer (rtx, unsigned int, int);
...@@ -2145,6 +2146,7 @@ reg_or_mem_operand (rtx op, enum machine_mode mode) ...@@ -2145,6 +2146,7 @@ reg_or_mem_operand (rtx op, enum machine_mode mode)
{ {
return (gpc_reg_operand (op, mode) return (gpc_reg_operand (op, mode)
|| memory_operand (op, mode) || memory_operand (op, mode)
|| macho_lo_sum_memory_operand (op, mode)
|| volatile_mem_operand (op, mode)); || volatile_mem_operand (op, mode));
} }
...@@ -2487,6 +2489,25 @@ legitimate_indirect_address_p (rtx x, int strict) ...@@ -2487,6 +2489,25 @@ legitimate_indirect_address_p (rtx x, int strict)
} }
static bool 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) legitimate_lo_sum_address_p (enum machine_mode mode, rtx x, int strict)
{ {
if (GET_CODE (x) != LO_SUM) 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) ...@@ -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; HOST_WIDE_INT ud1, ud2, ud3, ud4;
ud1 = c1 & 0xffff; ud1 = c1 & 0xffff;
ud2 = (c1 & 0xffff0000) >> 16; ud2 = (unsigned HOST_WIDE_INT)(c1 & 0xffff0000) >> 16;
#if HOST_BITS_PER_WIDE_INT >= 64 #if HOST_BITS_PER_WIDE_INT >= 64
c2 = c1 >> 32; c2 = c1 >> 32;
#endif #endif
ud3 = c2 & 0xffff; ud3 = c2 & 0xffff;
ud4 = (c2 & 0xffff0000) >> 16; ud4 = (unsigned HOST_WIDE_INT)(c2 & 0xffff0000) >> 16;
if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000)) if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
|| (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000))) || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
......
...@@ -2276,6 +2276,9 @@ do { \ ...@@ -2276,6 +2276,9 @@ do { \
between pointers and any other objects of this machine mode. */ between pointers and any other objects of this machine mode. */
#define Pmode (TARGET_32BIT ? SImode : DImode) #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). /* Mode of a function address in a call instruction (for indexing purposes).
Doesn't matter on RS/6000. */ Doesn't matter on RS/6000. */
#define FUNCTION_MODE SImode #define FUNCTION_MODE SImode
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment