Commit 3cd45774 by Richard Earnshaw Committed by Richard Earnshaw

arm.h (HAVE_PRE_MODIFY_DISP, [...]): Define.

* arm.h (HAVE_PRE_MODIFY_DISP, HAVE_PRE_MODIFY_REG): Define.
(HAVE_POST_MODIFY_DISP, HAVE_POST_MODIFY_REG): Define.
(ARM_GO_IF_LEGITIMATE_ADDRESS): Handle pre/post-modify addresses.
(ARM_PRINT_OPERAND_ADDRESS): Likewise.

From-SVN: r61332
parent c161ecf7
2003-01-15 Richard Earnshaw <rearnsha@arm.com>
* arm.h (HAVE_PRE_MODIFY_DISP, HAVE_PRE_MODIFY_REG): Define.
(HAVE_POST_MODIFY_DISP, HAVE_POST_MODIFY_REG): Define.
(ARM_GO_IF_LEGITIMATE_ADDRESS): Handle pre/post-modify addresses.
(ARM_PRINT_OPERAND_ADDRESS): Likewise.
Wed Jan 15 12:23:21 CET 2003 Jan Hubicka <jh@suse.cz> Wed Jan 15 12:23:21 CET 2003 Jan Hubicka <jh@suse.cz>
PR f/9258 PR f/9258
......
...@@ -1760,10 +1760,14 @@ typedef struct ...@@ -1760,10 +1760,14 @@ typedef struct
/* Addressing modes, and classification of registers for them. */ /* Addressing modes, and classification of registers for them. */
#define HAVE_POST_INCREMENT 1 #define HAVE_POST_INCREMENT 1
#define HAVE_PRE_INCREMENT TARGET_ARM #define HAVE_PRE_INCREMENT TARGET_ARM
#define HAVE_POST_DECREMENT TARGET_ARM #define HAVE_POST_DECREMENT TARGET_ARM
#define HAVE_PRE_DECREMENT TARGET_ARM #define HAVE_PRE_DECREMENT TARGET_ARM
#define HAVE_PRE_MODIFY_DISP TARGET_ARM
#define HAVE_POST_MODIFY_DISP TARGET_ARM
#define HAVE_PRE_MODIFY_REG TARGET_ARM
#define HAVE_POST_MODIFY_REG TARGET_ARM
/* Macros to check register numbers against specific register classes. */ /* Macros to check register numbers against specific register classes. */
...@@ -2001,65 +2005,73 @@ typedef struct ...@@ -2001,65 +2005,73 @@ typedef struct
floating SYMBOL_REF to the constant pool. Allow REG-only and floating SYMBOL_REF to the constant pool. Allow REG-only and
AUTINC-REG if handling TImode or HImode. Other symbol refs must be AUTINC-REG if handling TImode or HImode. Other symbol refs must be
forced though a static cell to ensure addressability. */ forced though a static cell to ensure addressability. */
#define ARM_GO_IF_LEGITIMATE_ADDRESS(MODE, X, LABEL) \ #define ARM_GO_IF_LEGITIMATE_ADDRESS(MODE, X, LABEL) \
{ \ { \
if (ARM_BASE_REGISTER_RTX_P (X)) \ if (ARM_BASE_REGISTER_RTX_P (X)) \
goto LABEL; \ goto LABEL; \
else if ((GET_CODE (X) == POST_INC || GET_CODE (X) == PRE_DEC) \ else if ((GET_CODE (X) == POST_INC || GET_CODE (X) == PRE_DEC) \
&& GET_CODE (XEXP (X, 0)) == REG \ && GET_CODE (XEXP (X, 0)) == REG \
&& ARM_REG_OK_FOR_BASE_P (XEXP (X, 0))) \ && ARM_REG_OK_FOR_BASE_P (XEXP (X, 0))) \
goto LABEL; \ goto LABEL; \
else if (GET_MODE_SIZE (MODE) >= 4 && reload_completed \ else if ((GET_CODE (X) == POST_MODIFY || GET_CODE (X) == PRE_MODIFY) \
&& (GET_CODE (X) == LABEL_REF \ && GET_MODE_SIZE (MODE) <= 4 \
|| (GET_CODE (X) == CONST \ && GET_CODE (XEXP (X, 0)) == REG \
&& GET_CODE (XEXP ((X), 0)) == PLUS \ && ARM_REG_OK_FOR_BASE_P (XEXP (X, 0)) \
&& GET_CODE (XEXP (XEXP ((X), 0), 0)) == LABEL_REF \ && GET_CODE (XEXP (X, 1)) == PLUS \
&& GET_CODE (XEXP (XEXP ((X), 0), 1)) == CONST_INT)))\ && XEXP (XEXP (X, 1), 0) == XEXP (X, 0)) \
goto LABEL; \ ARM_GO_IF_LEGITIMATE_INDEX (MODE, REGNO (XEXP (X, 0)), \
else if ((MODE) == TImode) \ XEXP (XEXP (X, 1), 1), LABEL); \
; \ else if (GET_MODE_SIZE (MODE) >= 4 && reload_completed \
else if ((MODE) == DImode || (TARGET_SOFT_FLOAT && (MODE) == DFmode)) \ && (GET_CODE (X) == LABEL_REF \
{ \ || (GET_CODE (X) == CONST \
if (GET_CODE (X) == PLUS && ARM_BASE_REGISTER_RTX_P (XEXP (X, 0)) \ && GET_CODE (XEXP ((X), 0)) == PLUS \
&& GET_CODE (XEXP (X, 1)) == CONST_INT) \ && GET_CODE (XEXP (XEXP ((X), 0), 0)) == LABEL_REF \
{ \ && GET_CODE (XEXP (XEXP ((X), 0), 1)) == CONST_INT))) \
HOST_WIDE_INT val = INTVAL (XEXP (X, 1)); \ goto LABEL; \
if (val == 4 || val == -4 || val == -8) \ else if ((MODE) == TImode) \
goto LABEL; \ ; \
} \ else if ((MODE) == DImode || (TARGET_SOFT_FLOAT && (MODE) == DFmode)) \
} \ { \
else if (GET_CODE (X) == PLUS) \ if (GET_CODE (X) == PLUS && ARM_BASE_REGISTER_RTX_P (XEXP (X, 0)) \
{ \ && GET_CODE (XEXP (X, 1)) == CONST_INT) \
rtx xop0 = XEXP (X, 0); \ { \
rtx xop1 = XEXP (X, 1); \ HOST_WIDE_INT val = INTVAL (XEXP (X, 1)); \
\ if (val == 4 || val == -4 || val == -8) \
if (ARM_BASE_REGISTER_RTX_P (xop0)) \ goto LABEL; \
ARM_GO_IF_LEGITIMATE_INDEX (MODE, REGNO (xop0), xop1, LABEL); \ } \
else if (ARM_BASE_REGISTER_RTX_P (xop1)) \ } \
ARM_GO_IF_LEGITIMATE_INDEX (MODE, REGNO (xop1), xop0, LABEL); \ else if (GET_CODE (X) == PLUS) \
} \ { \
/* Reload currently can't handle MINUS, so disable this for now */ \ rtx xop0 = XEXP (X, 0); \
/* else if (GET_CODE (X) == MINUS) \ rtx xop1 = XEXP (X, 1); \
{ \ \
rtx xop0 = XEXP (X,0); \ if (ARM_BASE_REGISTER_RTX_P (xop0)) \
rtx xop1 = XEXP (X,1); \ ARM_GO_IF_LEGITIMATE_INDEX (MODE, REGNO (xop0), xop1, LABEL); \
\ else if (ARM_BASE_REGISTER_RTX_P (xop1)) \
if (ARM_BASE_REGISTER_RTX_P (xop0)) \ ARM_GO_IF_LEGITIMATE_INDEX (MODE, REGNO (xop1), xop0, LABEL); \
ARM_GO_IF_LEGITIMATE_INDEX (MODE, -1, xop1, LABEL); \ } \
} */ \ /* Reload currently can't handle MINUS, so disable this for now */ \
else if (GET_MODE_CLASS (MODE) != MODE_FLOAT \ /* else if (GET_CODE (X) == MINUS) \
&& GET_CODE (X) == SYMBOL_REF \ { \
&& CONSTANT_POOL_ADDRESS_P (X) \ rtx xop0 = XEXP (X,0); \
&& ! (flag_pic \ rtx xop1 = XEXP (X,1); \
&& symbol_mentioned_p (get_pool_constant (X)))) \ \
goto LABEL; \ if (ARM_BASE_REGISTER_RTX_P (xop0)) \
else if ((GET_CODE (X) == PRE_INC || GET_CODE (X) == POST_DEC) \ ARM_GO_IF_LEGITIMATE_INDEX (MODE, -1, xop1, LABEL); \
&& (GET_MODE_SIZE (MODE) <= 4) \ } */ \
&& GET_CODE (XEXP (X, 0)) == REG \ else if (GET_MODE_CLASS (MODE) != MODE_FLOAT \
&& ARM_REG_OK_FOR_BASE_P (XEXP (X, 0))) \ && GET_CODE (X) == SYMBOL_REF \
goto LABEL; \ && CONSTANT_POOL_ADDRESS_P (X) \
&& ! (flag_pic \
&& symbol_mentioned_p (get_pool_constant (X)))) \
goto LABEL; \
else if ((GET_CODE (X) == PRE_INC || GET_CODE (X) == POST_DEC) \
&& (GET_MODE_SIZE (MODE) <= 4) \
&& GET_CODE (XEXP (X, 0)) == REG \
&& ARM_REG_OK_FOR_BASE_P (XEXP (X, 0))) \
goto LABEL; \
} }
/* ---------------------thumb version----------------------------------*/ /* ---------------------thumb version----------------------------------*/
#define THUMB_LEGITIMATE_OFFSET(MODE, VAL) \ #define THUMB_LEGITIMATE_OFFSET(MODE, VAL) \
(GET_MODE_SIZE (MODE) == 1 ? ((unsigned HOST_WIDE_INT) (VAL) < 32) \ (GET_MODE_SIZE (MODE) == 1 ? ((unsigned HOST_WIDE_INT) (VAL) < 32) \
...@@ -2570,79 +2582,99 @@ extern int making_const_table; ...@@ -2570,79 +2582,99 @@ extern int making_const_table;
: 0)))) : 0))))
/* Output the address of an operand. */ /* Output the address of an operand. */
#define ARM_PRINT_OPERAND_ADDRESS(STREAM, X) \ #define ARM_PRINT_OPERAND_ADDRESS(STREAM, X) \
{ \ { \
int is_minus = GET_CODE (X) == MINUS; \ int is_minus = GET_CODE (X) == MINUS; \
\ \
if (GET_CODE (X) == REG) \ if (GET_CODE (X) == REG) \
asm_fprintf (STREAM, "[%r, #0]", REGNO (X)); \ asm_fprintf (STREAM, "[%r, #0]", REGNO (X)); \
else if (GET_CODE (X) == PLUS || is_minus) \ else if (GET_CODE (X) == PLUS || is_minus) \
{ \ { \
rtx base = XEXP (X, 0); \ rtx base = XEXP (X, 0); \
rtx index = XEXP (X, 1); \ rtx index = XEXP (X, 1); \
HOST_WIDE_INT offset = 0; \ HOST_WIDE_INT offset = 0; \
if (GET_CODE (base) != REG) \ if (GET_CODE (base) != REG) \
{ \ { \
/* Ensure that BASE is a register */ \ /* Ensure that BASE is a register */ \
/* (one of them must be). */ \ /* (one of them must be). */ \
rtx temp = base; \ rtx temp = base; \
base = index; \ base = index; \
index = temp; \ index = temp; \
} \ } \
switch (GET_CODE (index)) \ switch (GET_CODE (index)) \
{ \ { \
case CONST_INT: \ case CONST_INT: \
offset = INTVAL (index); \ offset = INTVAL (index); \
if (is_minus) \ if (is_minus) \
offset = -offset; \ offset = -offset; \
asm_fprintf (STREAM, "[%r, #%d]", \ asm_fprintf (STREAM, "[%r, #%d]", \
REGNO (base), offset); \ REGNO (base), offset); \
break; \ break; \
\ \
case REG: \ case REG: \
asm_fprintf (STREAM, "[%r, %s%r]", \ asm_fprintf (STREAM, "[%r, %s%r]", \
REGNO (base), is_minus ? "-" : "", \ REGNO (base), is_minus ? "-" : "", \
REGNO (index)); \ REGNO (index)); \
break; \ break; \
\ \
case MULT: \ case MULT: \
case ASHIFTRT: \ case ASHIFTRT: \
case LSHIFTRT: \ case LSHIFTRT: \
case ASHIFT: \ case ASHIFT: \
case ROTATERT: \ case ROTATERT: \
{ \ { \
asm_fprintf (STREAM, "[%r, %s%r", \ asm_fprintf (STREAM, "[%r, %s%r", \
REGNO (base), is_minus ? "-" : "", \ REGNO (base), is_minus ? "-" : "", \
REGNO (XEXP (index, 0))); \ REGNO (XEXP (index, 0))); \
arm_print_operand (STREAM, index, 'S'); \ arm_print_operand (STREAM, index, 'S'); \
fputs ("]", STREAM); \ fputs ("]", STREAM); \
break; \ break; \
} \ } \
\ \
default: \ default: \
abort(); \ abort(); \
} \ } \
} \ } \
else if ( GET_CODE (X) == PRE_INC || GET_CODE (X) == POST_INC\ else if (GET_CODE (X) == PRE_INC || GET_CODE (X) == POST_INC \
|| GET_CODE (X) == PRE_DEC || GET_CODE (X) == POST_DEC)\ || GET_CODE (X) == PRE_DEC || GET_CODE (X) == POST_DEC) \
{ \ { \
extern int output_memory_reference_mode; \ extern enum machine_mode output_memory_reference_mode; \
\ \
if (GET_CODE (XEXP (X, 0)) != REG) \ if (GET_CODE (XEXP (X, 0)) != REG) \
abort (); \ abort (); \
\ \
if (GET_CODE (X) == PRE_DEC || GET_CODE (X) == PRE_INC) \ if (GET_CODE (X) == PRE_DEC || GET_CODE (X) == PRE_INC) \
asm_fprintf (STREAM, "[%r, #%s%d]!", \ asm_fprintf (STREAM, "[%r, #%s%d]!", \
REGNO (XEXP (X, 0)), \ REGNO (XEXP (X, 0)), \
GET_CODE (X) == PRE_DEC ? "-" : "", \ GET_CODE (X) == PRE_DEC ? "-" : "", \
GET_MODE_SIZE (output_memory_reference_mode));\ GET_MODE_SIZE (output_memory_reference_mode)); \
else \ else \
asm_fprintf (STREAM, "[%r], #%s%d", \ asm_fprintf (STREAM, "[%r], #%s%d", \
REGNO (XEXP (X, 0)), \ REGNO (XEXP (X, 0)), \
GET_CODE (X) == POST_DEC ? "-" : "", \ GET_CODE (X) == POST_DEC ? "-" : "", \
GET_MODE_SIZE (output_memory_reference_mode));\ GET_MODE_SIZE (output_memory_reference_mode)); \
} \ } \
else output_addr_const (STREAM, X); \ else if (GET_CODE (X) == PRE_MODIFY) \
{ \
asm_fprintf (STREAM, "[%r, ", REGNO (XEXP (X, 0))); \
if (GET_CODE (XEXP (XEXP (X, 1), 1)) == CONST_INT) \
asm_fprintf (STREAM, "#%d]!", \
INTVAL (XEXP (XEXP (X, 1), 1))); \
else \
asm_fprintf (STREAM, "%r]!", \
REGNO (XEXP (XEXP (X, 1), 1))); \
} \
else if (GET_CODE (X) == POST_MODIFY) \
{ \
asm_fprintf (STREAM, "[%r], ", REGNO (XEXP (X, 0))); \
if (GET_CODE (XEXP (XEXP (X, 1), 1)) == CONST_INT) \
asm_fprintf (STREAM, "#%d", \
INTVAL (XEXP (XEXP (X, 1), 1))); \
else \
asm_fprintf (STREAM, "%r", \
REGNO (XEXP (XEXP (X, 1), 1))); \
} \
else output_addr_const (STREAM, X); \
} }
#define THUMB_PRINT_OPERAND_ADDRESS(STREAM, X) \ #define THUMB_PRINT_OPERAND_ADDRESS(STREAM, X) \
......
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