aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <merrill@gnu.org>1996-05-02 00:57:29 +0000
committerJason Merrill <merrill@gnu.org>1996-05-02 00:57:29 +0000
commit1df8f58fafb0cc8221a9828239fde24dcb9e9cc1 (patch)
treef482c65b60cac92c00e89366be6391e37d490372
parentdd4fd0a0fdeed482a3159b5579564b227041f87e (diff)
downloadgcc-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.h34
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