(ASM_OUTPUT_MI_THUNK): Fix for sparc64, optimize.
authorJason Merrill <merrill@gnu.org>
Thu, 2 May 1996 00:57:29 +0000 (00:57 +0000)
committerJason Merrill <merrill@gnu.org>
Thu, 2 May 1996 00:57:29 +0000 (00:57 +0000)
From-SVN: r11913

gcc/config/sparc/sparc.h

index 84b4811..01965e3 100644 (file)
@@ -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