aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <law@gcc.gnu.org>1993-03-27 11:40:46 -0700
committerJeff Law <law@gcc.gnu.org>1993-03-27 11:40:46 -0700
commitf16fe3947b8d145d7b04f82287d57a1428b9668b (patch)
treef71a63384a9c19ce151fa90f5180664d57f27e55
parent0002b1a854d38d9ea0e663ca5ca82c9908e5bb8b (diff)
downloadgcc-f16fe3947b8d145d7b04f82287d57a1428b9668b.zip
gcc-f16fe3947b8d145d7b04f82287d57a1428b9668b.tar.gz
gcc-f16fe3947b8d145d7b04f82287d57a1428b9668b.tar.bz2
* From Jukka Virtanen.
* pa.h (TRAMPOLINE_TEMPLATE): Define for the PA. (TRAMPOLINE_SIZE): Define for the PA. (INITIALIZE_TRAMPOLINE): Define for the PA. From-SVN: r3894
-rw-r--r--gcc/config/pa/pa.h47
1 files changed, 38 insertions, 9 deletions
diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h
index f9381eb..27b2a80 100644
--- a/gcc/config/pa/pa.h
+++ b/gcc/config/pa/pa.h
@@ -960,23 +960,52 @@ extern union tree_node *current_function_decl;
eligible_for_epilogue_delay (trial, slots_filled)
/* Output assembler code for a block containing the constant parts
- of a trampoline, leaving space for the variable parts. */
+ of a trampoline, leaving space for the variable parts.\
-#define TRAMPOLINE_TEMPLATE(FILE) {}
+ The trampoline sets the static chain pointer to STATIC_CHAIN_REGNUM
+ and then branches to the specified routine.
-/* Length in units of the trampoline for entering a nested function. */
+ This code template is copied from text segment to stack location
+ and then patched with INITIALIZE_TRAMPOLINE to contain
+ valid values, and then entered as a subroutine.
-#define TRAMPOLINE_SIZE 0
+ It is best to keep this as small as possible to avoid having to
+ flush multiple lines in the cache. */
+
+#define TRAMPOLINE_TEMPLATE(FILE) \
+{ \
+ fprintf (FILE, "\tldw 12(0,%%r22),%%r21\n"); \
+ fprintf (FILE, "\tbe 0(4,%%r21)\n"); \
+ fprintf (FILE, "\tldw 16(0,%%r22),%%r29\n"); \
+ fprintf (FILE, "\t.long 0,0\n"); \
+}
+
+/* Length in units of the trampoline for entering a nested function.
+ If this grows to > 32 bytes, then you must update the flushcache
+ pattern in pa.md. */
+
+#define TRAMPOLINE_SIZE (5 * 4)
/* Emit RTL insns to initialize the variable parts of a trampoline.
FNADDR is an RTX for the address of the function's pure code.
CXT is an RTX for the static chain value for the function.
- This takes 16 insns: 2 shifts & 2 ands (to split up addresses), 4 sethi
- (to load in opcodes), 4 iors (to merge address and opcodes), and 4 writes
- (to store insns). This is a bit excessive. Perhaps a different
- mechanism would be better here. */
-#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) {}
+ Move the function address to the trampoline template at offset 12.
+ Move the static chain value to trampoline template at offset 16. */
+
+#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
+{ \
+ rtx addr, mem; \
+ \
+ addr = memory_address (Pmode, plus_constant ((TRAMP), 12)); \
+ emit_move_insn (gen_rtx (MEM, Pmode, addr), (FNADDR)); \
+ addr = memory_address (Pmode, plus_constant ((TRAMP), 16)); \
+ emit_move_insn (gen_rtx (MEM, Pmode, addr), (CXT)); \
+ /* fdc and fic only use registers for the address to flush, \
+ they do not accept integer displacements. */ \
+ addr = force_reg (SImode, (TRAMP)); \
+ emit_insn (gen_cacheflush (gen_rtx (MEM, Pmode, addr))); \
+}
/* Emit code for a call to builtin_saveregs. We must emit USE insns which
reference the 4 integer arg registers and 4 fp arg registers.