From 54374491da919e539b0b2f8b4c2f7524b0bb6f89 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Wed, 29 May 2002 16:51:37 -0600 Subject: [PATCH] pa.h (ASM_OUTPUT_MI_THUNK): Move implementation into pa.c. * 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. From-SVN: r54026 --- gcc/ChangeLog | 6 +++ gcc/config/pa/pa-protos.h | 2 + gcc/config/pa/pa.c | 83 +++++++++++++++++++++++++++++++++++++++ gcc/config/pa/pa.h | 76 +---------------------------------- 4 files changed, 93 insertions(+), 74 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6ed0b6ecd58..519983798b1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-05-29 Jeff Law + + * 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. + 2002-05-29 Neil Booth Marek Michalkiewicz 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.