diff mbox

[10/28] mn10300: Clean up trampoline handling

Message ID 1294691517-19580-11-git-send-email-rth@redhat.com
State New
Headers show

Commit Message

Richard Henderson Jan. 10, 2011, 8:31 p.m. UTC
From: Richard Henderson <rth@twiddle.net>

The old code was failing in the testsuite.  I didn't try to
debug exactly why, since the existing code was needlessly
complex.
---
 gcc/config/mn10300/mn10300.c |   50 +++++++++++++++++++++---------------------
 gcc/config/mn10300/mn10300.h |    5 +--
 2 files changed, 27 insertions(+), 28 deletions(-)

Comments

Jeff Law Jan. 12, 2011, 2:01 p.m. UTC | #1
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 01/10/11 13:31, Richard Henderson wrote:
> From: Richard Henderson <rth@twiddle.net>
> 
> The old code was failing in the testsuite.  I didn't try to
> debug exactly why, since the existing code was needlessly
> complex.
OK.
jeff
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJNLbRFAAoJEBRtltQi2kC7GTUH/3ndw5YXuPKi9InW9MaWEyBy
V9uLC4Fb4/5VqANO2mmyUlc/6e+a9qLWVooPNzpmIv6BpCAM5aNnrlf6vlMOSbjH
sx9HagXdR5XI8L5RdcS3Hl7CBbBBxTOdja9RLBSTZJoAOeSUHc3JN24a6IaIYfDD
LoEKsmOiO2rgfelvSi/0T4jSDAjSz/2WFMwrQuaHKZhncUAAoVMppU6MyRmrng1R
eVYjpSNAFjj2y5U6I/uu0g6agcx2ilzk7b9xNXR/N4gmOQTFUqu8DJQC9+7uu6El
p5i4+Rui7Eq/ZlRqd9eyAcn7pSKykrbFWxJWhHh4daiDtL+n1XRAiqb3MOWvwwE=
=c7kB
-----END PGP SIGNATURE-----
diff mbox

Patch

diff --git a/gcc/config/mn10300/mn10300.c b/gcc/config/mn10300/mn10300.c
index e801c47..7c090aa 100644
--- a/gcc/config/mn10300/mn10300.c
+++ b/gcc/config/mn10300/mn10300.c
@@ -2239,37 +2239,39 @@  mn10300_case_values_threshold (void)
   return 6;
 }
 
-/* Worker function for TARGET_ASM_TRAMPOLINE_TEMPLATE.  */
-
-static void
-mn10300_asm_trampoline_template (FILE *f)
-{
-  fprintf (f, "\tadd -4,sp\n");
-  fprintf (f, "\t.long 0x0004fffa\n");
-  fprintf (f, "\tmov (0,sp),a0\n");
-  fprintf (f, "\tadd 4,sp\n");
-  fprintf (f, "\tmov (13,a0),a1\n");	
-  fprintf (f, "\tmov (17,a0),a0\n");
-  fprintf (f, "\tjmp (a0)\n");
-  fprintf (f, "\t.long 0\n");
-  fprintf (f, "\t.long 0\n");
-}
-
 /* Worker function for TARGET_TRAMPOLINE_INIT.  */
 
 static void
 mn10300_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
 {
-  rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
-  rtx mem;
+  rtx mem, disp, fnaddr = XEXP (DECL_RTL (fndecl), 0);
+
+  /* This is a strict alignment target, which means that we play
+     some games to make sure that the locations at which we need
+     to store <chain> and <disp> wind up at aligned addresses.
+
+	0x28 0x00			add 0,d0
+	          0xfc 0xdd		mov chain,a1
+        <chain>
+	0xf8 0xed 0x00			btst 0,d1
+	               0xdc		jmp fnaddr
+	<disp>
+
+     Note that the two extra insns are effectively nops; they 
+     clobber the flags but do not affect the contents of D0 or D1.  */
 
-  emit_block_move (m_tramp, assemble_trampoline_template (),
-		   GEN_INT (TRAMPOLINE_SIZE), BLOCK_OP_NORMAL);
+  disp = expand_binop (SImode, sub_optab, fnaddr,
+		       plus_constant (XEXP (m_tramp, 0), 11),
+		       NULL_RTX, 1, OPTAB_DIRECT);
 
-  mem = adjust_address (m_tramp, SImode, 0x14);
+  mem = adjust_address (m_tramp, SImode, 0);
+  emit_move_insn (mem, gen_int_mode (0xddfc0028, SImode));
+  mem = adjust_address (m_tramp, SImode, 4);
   emit_move_insn (mem, chain_value);
-  mem = adjust_address (m_tramp, SImode, 0x18);
-  emit_move_insn (mem, fnaddr);
+  mem = adjust_address (m_tramp, SImode, 8);
+  emit_move_insn (mem, gen_int_mode (0xdc00edf8, SImode));
+  mem = adjust_address (m_tramp, SImode, 12);
+  emit_move_insn (mem, disp);
 }
 
 /* Output the assembler code for a C++ thunk function.
@@ -2558,8 +2560,6 @@  mn10300_conditional_register_usage (void)
 #undef  TARGET_PREFERRED_OUTPUT_RELOAD_CLASS
 #define TARGET_PREFERRED_OUTPUT_RELOAD_CLASS mn10300_preferred_output_reload_class
 
-#undef  TARGET_ASM_TRAMPOLINE_TEMPLATE
-#define TARGET_ASM_TRAMPOLINE_TEMPLATE mn10300_asm_trampoline_template
 #undef  TARGET_TRAMPOLINE_INIT
 #define TARGET_TRAMPOLINE_INIT mn10300_trampoline_init
 
diff --git a/gcc/config/mn10300/mn10300.h b/gcc/config/mn10300/mn10300.h
index 60d7d43..0ee0cd1 100644
--- a/gcc/config/mn10300/mn10300.h
+++ b/gcc/config/mn10300/mn10300.h
@@ -533,9 +533,8 @@  struct cum_arg
 
 /* Length in units of the trampoline for entering a nested function.  */
 
-#define TRAMPOLINE_SIZE 0x1b
-
-#define TRAMPOLINE_ALIGNMENT 32
+#define TRAMPOLINE_SIZE		16
+#define TRAMPOLINE_ALIGNMENT	32
 
 /* A C expression whose value is RTL representing the value of the return
    address for the frame COUNT steps up from the current frame.