diff options
author | Jim Wilson <wilson@gcc.gnu.org> | 1996-05-31 12:01:37 -0700 |
---|---|---|
committer | Jim Wilson <wilson@gcc.gnu.org> | 1996-05-31 12:01:37 -0700 |
commit | b2d8cf335caf08209d1b0dc031b87d907a36a814 (patch) | |
tree | 33a7c8ab7afa912f904d20d042316a3512158ed2 | |
parent | 694aa3f2a28d53464aaddee011f1652793ae222e (diff) | |
download | gcc-b2d8cf335caf08209d1b0dc031b87d907a36a814.zip gcc-b2d8cf335caf08209d1b0dc031b87d907a36a814.tar.gz gcc-b2d8cf335caf08209d1b0dc031b87d907a36a814.tar.bz2 |
Add -mabi=n32 support.
(ABI_64BIT): Delete.
(TARGET_OPTIONS, INITIAL_ELIMINATION_OFFSET, GO_IF_LEGITIMATE_ADDRESS,
CONSTANT_ADDRESS_P, LEGITIMATE_CONSTANT_P, LEGITIMIZE_ADDRESS,
ASM_OUTPUT_ADDR_DIFF_ELT): Modify.
(enum mips_abi_type, SUBTARGET_TARGET_OPTIONS): Define.
(mips_abi, mips_abi_string): Declare.
From-SVN: r12131
-rw-r--r-- | gcc/config/mips/mips.h | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index 4a7f563..037836e 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -74,6 +74,22 @@ enum processor_type { /* Recast the cpu class to be the cpu attribute. */ #define mips_cpu_attr ((enum attr_cpu)mips_cpu) +/* Which ABI to use. This is only used by the Irix 6 port currently. */ + +enum mips_abi_type { + ABI_32, + ABI_N32, + ABI_64 +}; + +#ifndef MIPS_ABI_DEFAULT +/* We define this away so that there is no extra runtime cost if the target + doesn't support multiple ABIs. */ +#define mips_abi ABI_32 +#else +extern enum mips_abi_type mips_abi; +#endif + /* Whether to emit abicalls code sequences or not. */ enum mips_abicalls_type { @@ -119,6 +135,7 @@ extern enum mips_abicalls_type mips_abicalls;/* for svr4 abi pic calls */ extern int mips_isa; /* architectural level */ extern char *mips_cpu_string; /* for -mcpu=<xxx> */ extern char *mips_isa_string; /* for -mips{1,2,3,4} */ +extern char *mips_abi_string; /* for -misa={32,n32,64} */ extern int dslots_load_total; /* total # load related delay slots */ extern int dslots_load_filled; /* # filled load delay slots */ extern int dslots_jump_total; /* total # jump related delay slots */ @@ -450,10 +467,14 @@ extern char *mktemp (); #define TARGET_OPTIONS \ { \ + SUBTARGET_TARGET_OPTIONS \ { "cpu=", &mips_cpu_string }, \ { "ips", &mips_isa_string } \ } +/* This is meant to be redefined in the host dependent files. */ +#define SUBTARGET_TARGET_OPTIONS + /* Macros to decide whether certain features are available or not, depending on the instruction set architecture level. */ @@ -530,7 +551,7 @@ do \ } \ while (0) -/* This is meant to be redefined in the host dependent files */ +/* This is meant to be redefined in the host dependent files. */ #define SUBTARGET_CONDITIONAL_REGISTER_USAGE /* Show we can debug even without a frame pointer. */ @@ -1635,10 +1656,6 @@ extern enum reg_class mips_secondary_reload_class (); /* Stack layout; function entry, exit and calling. */ -/* Don't enable support for the 64 bit ABI calling convention. - Some embedded code depends on the old 64 bit calling convention. */ -#define ABI_64BIT 0 - /* Define this if pushing a word on the stack makes the stack pointer a smaller address. */ #define STACK_GROWS_DOWNWARD @@ -1790,7 +1807,7 @@ extern struct mips_frame_info current_frame_info; && ((TO) == FRAME_POINTER_REGNUM \ || (TO) == STACK_POINTER_REGNUM)) \ (OFFSET) = (current_frame_info.total_size \ - - (ABI_64BIT && mips_isa >= 3 \ + - (mips_abi != ABI_32 \ ? current_function_pretend_args_size \ : 0)); \ else if ((FROM) == RETURN_ADDRESS_POINTER_REGNUM \ @@ -2371,7 +2388,7 @@ typedef struct mips_args { /* ??? Reject combining an address with a register for the MIPS \ 64 bit ABI, because the SGI assembler can not handle this. */ \ if (!TARGET_DEBUG_A_MODE \ - && ! ABI_64BIT \ + && mips_abi == ABI_32 \ && CONSTANT_ADDRESS_P (xplus1) \ && (!TARGET_EMBEDDED_PIC \ || code1 != CONST \ @@ -2400,7 +2417,7 @@ typedef struct mips_args { || GET_CODE (X) == CONST_INT || GET_CODE (X) == HIGH \ || (GET_CODE (X) == CONST \ && ! (flag_pic && pic_address_needs_scratch (X)) \ - && ! ABI_64BIT)) \ + && mips_abi == ABI_32)) \ && (!HALF_PIC_P () || !HALF_PIC_ADDRESS_P (X))) /* Define this, so that when PIC, reload won't try to reload invalid @@ -2419,7 +2436,7 @@ typedef struct mips_args { #define LEGITIMATE_CONSTANT_P(X) \ ((GET_CODE (X) != CONST_DOUBLE \ || mips_const_double_ok (X, GET_MODE (X))) \ - && ! (GET_CODE (X) == CONST && ABI_64BIT)) + && ! (GET_CODE (X) == CONST && mips_abi != ABI_32)) /* A C compound statement that attempts to replace X with a valid memory address for an operand of mode MODE. WIN will be a C @@ -2473,7 +2490,7 @@ typedef struct mips_args { if (GET_CODE (xinsn) == CONST \ && ((flag_pic && pic_address_needs_scratch (xinsn)) \ /* ??? SGI's Irix 6 assembler can't handle CONST. */ \ - || ABI_64BIT)) \ + || mips_abi != ABI_32)) \ { \ rtx ptr_reg = gen_reg_rtx (Pmode); \ rtx constant = XEXP (XEXP (xinsn, 0), 1); \ @@ -3594,15 +3611,14 @@ do { \ fprintf (STREAM, "\t%s\t%sL%d-%sLS%d\n", \ TARGET_LONG64 ? ".dword" : ".word", \ LOCAL_LABEL_PREFIX, VALUE, LOCAL_LABEL_PREFIX, REL); \ - else if (! ABI_64BIT) \ + else if (mips_abi == ABI_32) \ fprintf (STREAM, "\t%s\t%sL%d\n", \ TARGET_LONG64 ? ".gpdword" : ".gpword", \ LOCAL_LABEL_PREFIX, VALUE); \ else \ - /* ??? Why does this one use . and not LOCAL_LABEL_PREFIX? */ \ - fprintf (STREAM, "\t%s\t.L%d\n", \ + fprintf (STREAM, "\t%s\t%sL%d\n", \ TARGET_LONG64 ? ".dword" : ".word", \ - VALUE); \ + LOCAL_LABEL_PREFIX, VALUE); \ } while (0) /* When generating embedded PIC code we want to put the jump table in |