diff options
author | Jim Wilson <wilson@cygnus.com> | 1997-12-24 22:06:54 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1997-12-24 15:06:54 -0700 |
commit | 8e93a9b0214782d0725b23fdcf032d3b0e800444 (patch) | |
tree | e778e93d8f0b600b05cbf51ea5d4d4566f7df7da /gcc/config | |
parent | 70b6178184c1bcac01d04c70f03f3aae13c441f0 (diff) | |
download | gcc-8e93a9b0214782d0725b23fdcf032d3b0e800444.tar.gz |
mips.c (mips_expand_epilogue): Emit blockage insn before call to save_restore_insns if...
* mips.c (mips_expand_epilogue): Emit blockage insn before call to
save_restore_insns if no FP and GP will be restored.
* abi64.h (LONG_MAX_SPEC): Check MIPS_ABI_DEFAULT and TARGET_DEFAULT,
and define __LONG_MAX__ appropriately. Add support for -mabi=X,
-mlong64, and -mgp{32,64} options.
* mips.c (mips_abi): Change type to int.
* mips.h (enum mips_abi_type): Delete.
(ABI_32, ABI_N32, ABI_64, ABI_EABI): Define as constants.
(mips_abi): Change type to int.
From-SVN: r17228
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/mips/abi64.h | 18 | ||||
-rw-r--r-- | gcc/config/mips/mips.c | 11 | ||||
-rw-r--r-- | gcc/config/mips/mips.h | 15 |
3 files changed, 33 insertions, 11 deletions
diff --git a/gcc/config/mips/abi64.h b/gcc/config/mips/abi64.h index a3e768cdc2d..4f6fccfafb9 100644 --- a/gcc/config/mips/abi64.h +++ b/gcc/config/mips/abi64.h @@ -213,8 +213,24 @@ extern struct rtx_def *mips_function_value (); (mips_abi == ABI_EABI && (NAMED) \ && FUNCTION_ARG_PASS_BY_REFERENCE (CUM, MODE, TYPE, NAMED)) +/* Define LONG_MAX correctly for all users. We need to handle 32 bit EABI, + 64 bit EABI, N32, and N64 as possible defaults. The checks performed here + are the same as the checks in override_options in mips.c that determines + whether MASK_LONG64 will be set. + + This does not handle inappropriate options or ununusal option + combinations. */ + #undef LONG_MAX_SPEC -#define LONG_MAX_SPEC "%{!mno-long64:-D__LONG_MAX__=9223372036854775807LL}" +#if ((MIPS_ABI_DEFAULT == ABI_64) || ((MIPS_ABI_DEFAULT == ABI_EABI) && ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_64BIT))) +#define LONG_MAX_SPEC \ + "%{!mabi=n32:%{!mno-long64:%{!mgp32:-D__LONG_MAX__=9223372036854775807L}}}" +#else +#define LONG_MAX_SPEC \ + "%{mabi=64:-D__LONG_MAX__=9223372036854775807L} \ + %{mlong64:-D__LONG_MAX__=9223372036854775807L} \ + %{mgp64:-D__LONG_MAX__=9223372036854775807L}" +#endif /* ??? Unimplemented stuff follows. */ diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 79fe3261b84..4ca834b72d1 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -193,9 +193,9 @@ enum processor_type mips_cpu; int mips_isa; #ifdef MIPS_ABI_DEFAULT -/* which ABI to use. This is defined to a constant in mips.h if the target +/* Which ABI to use. This is defined to a constant in mips.h if the target doesn't support multiple ABIs. */ -enum mips_abi_type mips_abi; +int mips_abi; #endif /* Strings to hold which cpu and instruction set architecture to use. */ @@ -5627,6 +5627,13 @@ mips_expand_epilogue () else emit_insn (gen_movsi (stack_pointer_rtx, frame_pointer_rtx)); } + /* The GP/PIC register is implicitly used by all SYMBOL_REFs, so if we + are going to restore it, then we must emit a blockage insn to + prevent the scheduler from moving the restore out of the epilogue. */ + else if (TARGET_ABICALLS && mips_abi != ABI_32 + && (current_frame_info.mask + & (1L << (PIC_OFFSET_TABLE_REGNUM - GP_REG_FIRST)))) + emit_insn (gen_blockage ()); save_restore_insns (FALSE, tmp_rtx, tsize, (FILE *)0); diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index 1de2e25564d..e50bc8a171d 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -77,21 +77,20 @@ 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. */ +/* Which ABI to use. These are constants because abi64.h must check their + value at preprocessing time. */ -enum mips_abi_type { - ABI_32, - ABI_N32, - ABI_64, - ABI_EABI -}; +#define ABI_32 0 +#define ABI_N32 1 +#define ABI_64 2 +#define ABI_EABI 3 #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; +extern int mips_abi; #endif /* Whether to emit abicalls code sequences or not. */ |