diff options
author | Jason Merrill <merrill@gnu.org> | 1996-05-02 00:57:29 +0000 |
---|---|---|
committer | Jason Merrill <merrill@gnu.org> | 1996-05-02 00:57:29 +0000 |
commit | 1df8f58fafb0cc8221a9828239fde24dcb9e9cc1 (patch) | |
tree | f482c65b60cac92c00e89366be6391e37d490372 | |
parent | dd4fd0a0fdeed482a3159b5579564b227041f87e (diff) | |
download | gcc-1df8f58fafb0cc8221a9828239fde24dcb9e9cc1.zip gcc-1df8f58fafb0cc8221a9828239fde24dcb9e9cc1.tar.gz gcc-1df8f58fafb0cc8221a9828239fde24dcb9e9cc1.tar.bz2 |
(ASM_OUTPUT_MI_THUNK): Fix for sparc64, optimize.
From-SVN: r11913
-rw-r--r-- | gcc/config/sparc/sparc.h | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h index 84b4811..01965e3 100644 --- a/gcc/config/sparc/sparc.h +++ b/gcc/config/sparc/sparc.h @@ -2948,16 +2948,30 @@ do { \ /* Output code to add DELTA to the first argument, and then jump to FUNCTION. Used for C++ multiple inheritance. */ -#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \ -do { \ - int big_delta = (DELTA) >= 4096 || (DELTA) < -4096; \ - if (big_delta) \ - fprintf (FILE, "\tset %d,%%g1\n\tadd %%o0,%%g1,%%o0\n", DELTA); \ - fprintf (FILE, "\tset "); \ - assemble_name (FILE, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (FUNCTION))); \ - fprintf (FILE, ",%%g1\n\tjmp %%g1\n");\ - if (big_delta) fprintf (FILE, "\tnop\n"); \ - else fprintf (FILE, "\tadd %%o0,%d,%%o0\n", DELTA); \ +#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \ +do { \ + int big_delta = (DELTA) >= 4096 || (DELTA) < -4096; \ + if (big_delta) \ + fprintf (FILE, "\tset %d,%%g1\n\tadd %%o0,%%g1,%%o0\n", (DELTA)); \ + if (TARGET_MEDANY || TARGET_FULLANY) \ + { \ + fprintf (FILE, "\tsetx "); \ + assemble_name \ + (FILE, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (FUNCTION))); \ + fprintf (FILE, ",%%g5,%%g1\n\tjmp %%g1\n"); \ + } \ + else \ + { \ + fprintf (FILE, "\tsethi %%hi("); \ + assemble_name \ + (FILE, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (FUNCTION))); \ + fprintf (FILE, "),%%g1\n\tjmp %%g1+%%lo("); \ + assemble_name \ + (FILE, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (FUNCTION))); \ + fprintf (FILE, ")\n"); \ + } \ + if (big_delta) fprintf (FILE, "\tnop\n"); \ + else fprintf (FILE, "\tadd %%o0,%d,%%o0\n", DELTA); \ } while (0) /* Define the parentheses used to group arithmetic operations |