summaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2002-05-29 22:51:37 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2002-05-29 22:51:37 +0000
commitf1752b7ebb4451280d937d13717d855931574017 (patch)
tree4bfaf7623b79cd4ad27d52bd8d22f52c24c7ca2a /gcc/config
parentc284a148cc6af746de35378b6ac20d776321878b (diff)
downloadgcc-f1752b7ebb4451280d937d13717d855931574017.tar.gz
* pa.h (ASM_OUTPUT_MI_THUNK): Move implementation into pa.c.
* pa.c (pa_asm_output_mi_thunk): New function. * pa-protos.h (pa_asm_output_mi_thunk): Declare. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@54026 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/pa/pa-protos.h2
-rw-r--r--gcc/config/pa/pa.c83
-rw-r--r--gcc/config/pa/pa.h76
3 files changed, 87 insertions, 74 deletions
diff --git a/gcc/config/pa/pa-protos.h b/gcc/config/pa/pa-protos.h
index 57d9d4160e4..b26b7b8fa7a 100644
--- a/gcc/config/pa/pa-protos.h
+++ b/gcc/config/pa/pa-protos.h
@@ -162,4 +162,6 @@ extern rtx function_arg PARAMS ((CUMULATIVE_ARGS *, enum machine_mode,
extern int function_arg_partial_nregs PARAMS ((CUMULATIVE_ARGS *,
enum machine_mode,
tree, int));
+
+extern void pa_asm_output_mi_thunk PARAMS ((FILE *, tree, int, tree));
#endif /* TREE_CODE */
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c
index 41e5dc05c78..67496011d25 100644
--- a/gcc/config/pa/pa.c
+++ b/gcc/config/pa/pa.c
@@ -6496,6 +6496,89 @@ is_function_label_plus_const (op)
&& GET_CODE (XEXP (op, 1)) == CONST_INT);
}
+/* Output assembly code for a thunk to FUNCTION. */
+
+void
+pa_asm_output_mi_thunk (file, thunk_fndecl, delta, function)
+ FILE *file;
+ tree thunk_fndecl;
+ int delta;
+ tree function;
+{
+ const char *target_name = XSTR (XEXP (DECL_RTL (function), 0), 0);
+ static unsigned int current_thunk_number;
+ char label[16];
+ char *lab;
+ ASM_GENERATE_INTERNAL_LABEL (label, "LTHN", current_thunk_number);
+ lab = (*targetm.strip_name_encoding) (label);
+ target_name = (*targetm.strip_name_encoding) (target_name);
+ /* FIXME: total_code_bytes is not handled correctly in files with
+ mi thunks. */
+ pa_output_function_prologue (file, 0);
+ if (VAL_14_BITS_P (delta))
+ {
+ if (! TARGET_64BIT && ! TARGET_PORTABLE_RUNTIME && flag_pic)
+ {
+ fprintf (file, "\taddil LT%%%s,%%r19\n", lab);
+ fprintf (file, "\tldw RT%%%s(%%r1),%%r22\n", lab);
+ fprintf (file, "\tldw 0(%%sr0,%%r22),%%r22\n");
+ fprintf (file, "\tbb,>=,n %%r22,30,.+16\n");
+ fprintf (file, "\tdepi 0,31,2,%%r22\n");
+ fprintf (file, "\tldw 4(%%sr0,%%r22),%%r19\n");
+ fprintf (file, "\tldw 0(%%sr0,%%r22),%%r22\n");
+ fprintf (file, "\tldsid (%%sr0,%%r22),%%r1\n\tmtsp %%r1,%%sr0\n");
+ fprintf (file, "\tbe 0(%%sr0,%%r22)\n\tldo ");
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, delta);
+ fprintf (file, "(%%r26),%%r26\n");
+ }
+ else
+ {
+ fprintf (file, "\tb %s\n\tldo ", target_name);
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, delta);
+ fprintf (file, "(%%r26),%%r26\n");
+ }
+ }
+ else
+ {
+ if (! TARGET_64BIT && ! TARGET_PORTABLE_RUNTIME && flag_pic)
+ {
+ fprintf (file, "\taddil L%%");
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, delta);
+ fprintf (file, ",%%r26\n\tldo R%%");
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, delta);
+ fprintf (file, "(%%r1),%%r26\n");
+ fprintf (file, "\taddil LT%%%s,%%r19\n", lab);
+ fprintf (file, "\tldw RT%%%s(%%r1),%%r22\n", lab);
+ fprintf (file, "\tldw 0(%%sr0,%%r22),%%r22\n");
+ fprintf (file, "\tbb,>=,n %%r22,30,.+16\n");
+ fprintf (file, "\tdepi 0,31,2,%%r22\n");
+ fprintf (file, "\tldw 4(%%sr0,%%r22),%%r19\n");
+ fprintf (file, "\tldw 0(%%sr0,%%r22),%%r22\n");
+ fprintf (file, "\tldsid (%%sr0,%%r22),%%r1\n\tmtsp %%r1,%%sr0\n");
+ fprintf (file, "\tbe,n 0(%%sr0,%%r22)\n");
+ }
+ else
+ {
+ fprintf (file, "\taddil L%%");
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, delta);
+ fprintf (file, ",%%r26\n\tb %s\n\tldo R%%", target_name);
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, delta);
+ fprintf (file, "(%%r1),%%r26\n");
+ }
+ }
+
+ fprintf (file, "\t.EXIT\n\t.PROCEND\n");
+ if (! TARGET_64BIT && ! TARGET_PORTABLE_RUNTIME && flag_pic)
+ {
+ data_section ();
+ fprintf (file, "\t.align 4\n");
+ ASM_OUTPUT_INTERNAL_LABEL (file, "LTHN", current_thunk_number);
+ fprintf (file, "\t.word P%%%s\n", target_name);
+ function_section (thunk_fndecl);
+ }
+ current_thunk_number++;
+}
+
/* Returns 1 if the 6 operands specified in OPERANDS are suitable for
use in fmpyadd instructions. */
int
diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h
index 8f432c2cc0e..accc4c1e232 100644
--- a/gcc/config/pa/pa.h
+++ b/gcc/config/pa/pa.h
@@ -864,80 +864,8 @@ struct hppa_args {int words, nargs_prototype, indirect; };
extern struct rtx_def *hppa_compare_op0, *hppa_compare_op1;
extern enum cmp_type hppa_branch_type;
-#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
-do { \
- const char *target_name = XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0); \
- static unsigned int current_thunk_number; \
- char label[16]; \
- char *lab; \
- ASM_GENERATE_INTERNAL_LABEL (label, "LTHN", current_thunk_number); \
- lab = (*targetm.strip_name_encoding) (label); \
- target_name = (*targetm.strip_name_encoding) (target_name); \
- /* FIXME: total_code_bytes is not handled correctly in files with \
- mi thunks. */ \
- pa_output_function_prologue (FILE, 0); \
- if (VAL_14_BITS_P (DELTA)) \
- { \
- if (! TARGET_64BIT && ! TARGET_PORTABLE_RUNTIME && flag_pic) \
- { \
- fprintf (FILE, "\taddil LT%%%s,%%r19\n", lab); \
- fprintf (FILE, "\tldw RT%%%s(%%r1),%%r22\n", lab); \
- fprintf (FILE, "\tldw 0(%%sr0,%%r22),%%r22\n"); \
- fprintf (FILE, "\tbb,>=,n %%r22,30,.+16\n"); \
- fprintf (FILE, "\tdepi 0,31,2,%%r22\n"); \
- fprintf (FILE, "\tldw 4(%%sr0,%%r22),%%r19\n"); \
- fprintf (FILE, "\tldw 0(%%sr0,%%r22),%%r22\n"); \
- fprintf (FILE, "\tldsid (%%sr0,%%r22),%%r1\n\tmtsp %%r1,%%sr0\n"); \
- fprintf (FILE, "\tbe 0(%%sr0,%%r22)\n\tldo "); \
- fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, DELTA); \
- fprintf (FILE, "(%%r26),%%r26\n"); \
- } \
- else \
- { \
- fprintf (FILE, "\tb %s\n\tldo ", target_name); \
- fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, DELTA); \
- fprintf (FILE, "(%%r26),%%r26\n"); \
- } \
- } \
- else \
- { \
- if (! TARGET_64BIT && ! TARGET_PORTABLE_RUNTIME && flag_pic) \
- { \
- fprintf (FILE, "\taddil L%%"); \
- fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, DELTA); \
- fprintf (FILE, ",%%r26\n\tldo R%%"); \
- fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, DELTA); \
- fprintf (FILE, "(%%r1),%%r26\n"); \
- fprintf (FILE, "\taddil LT%%%s,%%r19\n", lab); \
- fprintf (FILE, "\tldw RT%%%s(%%r1),%%r22\n", lab); \
- fprintf (FILE, "\tldw 0(%%sr0,%%r22),%%r22\n"); \
- fprintf (FILE, "\tbb,>=,n %%r22,30,.+16\n"); \
- fprintf (FILE, "\tdepi 0,31,2,%%r22\n"); \
- fprintf (FILE, "\tldw 4(%%sr0,%%r22),%%r19\n"); \
- fprintf (FILE, "\tldw 0(%%sr0,%%r22),%%r22\n"); \
- fprintf (FILE, "\tldsid (%%sr0,%%r22),%%r1\n\tmtsp %%r1,%%sr0\n"); \
- fprintf (FILE, "\tbe,n 0(%%sr0,%%r22)\n"); \
- } \
- else \
- { \
- fprintf (FILE, "\taddil L%%"); \
- fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, DELTA); \
- fprintf (FILE, ",%%r26\n\tb %s\n\tldo R%%", target_name); \
- fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, DELTA); \
- fprintf (FILE, "(%%r1),%%r26\n"); \
- } \
- } \
- fprintf (FILE, "\t.EXIT\n\t.PROCEND\n"); \
- if (! TARGET_64BIT && ! TARGET_PORTABLE_RUNTIME && flag_pic) \
- { \
- data_section (); \
- fprintf (FILE, "\t.align 4\n"); \
- ASM_OUTPUT_INTERNAL_LABEL (FILE, "LTHN", current_thunk_number); \
- fprintf (FILE, "\t.word P%%%s\n", target_name); \
- function_section (THUNK_FNDECL); \
- } \
- current_thunk_number++; \
-} while (0)
+#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
+ pa_asm_output_mi_thunk (FILE, THUNK_FNDECL, DELTA, FUNCTION);
/* On HPPA, we emit profiling code as rtl via PROFILE_HOOK rather than
as assembly via FUNCTION_PROFILER. Just output a local label.