diff options
author | nickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-05 15:07:21 +0000 |
---|---|---|
committer | nickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-05 15:07:21 +0000 |
commit | 6e5073011542bb3b0ba144b74c2054fda70ed8b1 (patch) | |
tree | e5fb262a785e8b7adabd978c621ce0fdb1684ad5 /gcc/config/rx/rx.h | |
parent | 87b533973970ef09f94167d428fbc63331045d96 (diff) | |
download | gcc-6e5073011542bb3b0ba144b74c2054fda70ed8b1.tar.gz |
* config/rx/rx.opt (mpid): Define.
* config/rx/t-rx (MULTILIB_OPTIONS): Add -mpid
(MULTILIB_DIRNAMES): Add pid.
* config/rx/rx.c (rx_gp_base_regnum_val, rx_pid_base_regnum_val)
(rx_num_interrupt_regs): New variable.
(rx_gp_base_regnum): New function. Returns the number of the
small data area register.
(rx_pid_base_regnum): New function. Returns the number of the pid
base register.
(rx_decl_for_addr): New function. Returns the symbolic part of a
MEM.
(rx_pid_data_operand): New function. Returns whether an object is
in the position independent data area.
(rx_legitimize_address): New function. Puts undecided PID
objects in the PID data area.
(rx_is_legitimate_address): Add support for PID operands.
(rx_print_operand_address): Likewise.
(rx_print_operand): Likewise.
(rx_maybe_pidify_operand): New function. Determine if an operand
is suitable for PID addressing.
(rx_gen_move_template): Add PID support.
(rx_conditional_register_usage): Likewise.
(rx_option_override): Initialise rx_num_interrupt_regs.
(rx_is_legitimate_constant): Add support for PID constants.
(TARGET_LEGITIMIZE_ADDRESS): Define.
* config/rx/constraints.md (Rpid): Define.
(Rpda): Define.
* config/rx/rx.md (UNSPEC_PID_ADDR): Define.
(tablejump): Add PID support.
(mov<>): Likewise.
(mov<>_internal): Likewise.
(addsi3): Convert to an expander. Add PID support.
(pid_addr): New pattern.
* config/rx/rx.h (CPP_SPEC): Define.
(ASM_SPEC): Pass -mpid and -mint-register on to assembler.
(CASE_VECTOR_PC_RELATIVE): Define.
(JUMP_TABLES_IN_TEXT_SECTION): Enable for PID mode.
* config/rx/rx-protos.h (rx_maybe_pidify_operand): Prototype.
* doc/invoke.texi (RX Options): Document -mpid command line
option.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@179558 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/rx/rx.h')
-rw-r--r-- | gcc/config/rx/rx.h | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/gcc/config/rx/rx.h b/gcc/config/rx/rx.h index 67e8ce1c577..10b16bda261 100644 --- a/gcc/config/rx/rx.h +++ b/gcc/config/rx/rx.h @@ -63,6 +63,13 @@ #undef ENDFILE_SPEC #define ENDFILE_SPEC "crtend.o%s crtn.o%s" +#undef CPP_SPEC +#define CPP_SPEC "\ +%{mpid:-D_RX_PID=1} \ +%{mint-register=*:-D_RX_INT_REGISTERS=%*} \ +%{msmall-data-limit*:-D_RX_SMALL_DATA} \ +" + #undef ASM_SPEC #define ASM_SPEC "\ %{mbig-endian-data:-mbig-endian-data} \ @@ -70,6 +77,8 @@ %{!m64bit-doubles:-m32bit-doubles} \ %{msmall-data-limit*:-msmall-data-limit} \ %{mrelax:-relax} \ +%{mpid} \ +%{mint-register=*} \ " #undef LIB_SPEC @@ -200,14 +209,17 @@ enum reg_class #define STRUCT_VAL_REGNUM 15 #define CC_REGNUM 16 -/* This is the register which is used to hold the address of the start - of the small data area, if that feature is being used. Note - this - register must not be call_used because otherwise library functions - that are compiled without small data support might clobber it. +/* This is the register which will probably be used to hold the address of + the start of the small data area, if -msmall-data-limit is being used, + or the address of the constant data area if -mpid is being used. If both + features are in use then two consecutive registers will be used. - FIXME: The function gcc/config/rx/rx.c:rx_gen_move_template() has a - built in copy of this register's name, rather than constructing the - name from this #define. */ + Note - these registers must not be call_used because otherwise library + functions that are compiled without -msmall-data-limit/-mpid support + might clobber them. + + Note that the actual values used depends on other options; use + rx_gp_base_regnum() and rx_pid_base_regnum() instead. */ #define GP_BASE_REGNUM 13 #define ELIMINABLE_REGS \ @@ -444,13 +456,15 @@ typedef unsigned int CUMULATIVE_ARGS; VALUE) /* This is how to output an element of a case-vector that is relative. - Note: The local label referenced by the "3b" below is emitted by + Note: The local label referenced by the "1b" below is emitted by the tablejump insn. */ #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ fprintf (FILE, TARGET_AS100_SYNTAX \ ? "\t.LWORD L%d - ?-\n" : "\t.long .L%d - 1b\n", VALUE) +#define CASE_VECTOR_PC_RELATIVE (TARGET_PID) + #define ASM_OUTPUT_SIZE_DIRECTIVE(STREAM, NAME, SIZE) \ do \ { \ @@ -595,7 +609,7 @@ typedef unsigned int CUMULATIVE_ARGS; /* For PIC put jump tables into the text section so that the offsets that they contain are always computed between two same-section symbols. */ -#define JUMP_TABLES_IN_TEXT_SECTION (flag_pic) +#define JUMP_TABLES_IN_TEXT_SECTION (TARGET_PID || flag_pic) /* This is a version of REG_P that also returns TRUE for SUBREGs. */ #define RX_REG_P(rtl) (REG_P (rtl) || GET_CODE (rtl) == SUBREG) |