From 4c81e9461822a04417407714c784e21766942de1 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Tue, 11 Nov 2003 02:34:56 +0000 Subject: [PATCH] Misc. fixes for -mpowerpc64 vesion darwin. Reviewed by David Edelsohn. From-SVN: r73438 --- gcc/config/rs6000/rs6000.c | 25 +++++++++++++++++++++++-- gcc/config/rs6000/rs6000.h | 3 +++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 2f6af6bc272..4c784ab2d56 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -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)); } @@ -2486,6 +2488,25 @@ legitimate_indirect_address_p (rtx x, int strict) return GET_CODE (x) == REG && INT_REG_OK_FOR_BASE_P (x, 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) { @@ -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))) diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index ce38901ff5b..37d851b3c4f 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -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 -- 2.30.2