/* PLT trampolines.  m68k version.
   Copyright (C) 2005-2014 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library.  If not, see
   <http://www.gnu.org/licenses/>.  */

#include <sysdep.h>

#if !defined (__mcoldfire__)
# define FMOVE		fmove.x
# define FPSPACE	12
#elif defined (__mcffpu__)
# define FMOVE		fmove.d
# define FPSPACE	8
#else
# define FPSPACE	0
#endif

	.text
	.globl _dl_runtime_resolve
	.type _dl_runtime_resolve, @function
_dl_runtime_resolve:
	cfi_startproc
	cfi_adjust_cfa_offset (8)
	| Save %a0 (struct return address) and %a1.
	move.l %a0, -(%sp)
	cfi_adjust_cfa_offset (4)
	move.l %a1, -(%sp)
	cfi_adjust_cfa_offset (4)
	| Call the real address resolver.
	jbsr _dl_fixup
	| Restore register %a0 and %a1.
	move.l (%sp)+, %a1
	cfi_adjust_cfa_offset (-4)
	move.l (%sp)+, %a0
	cfi_adjust_cfa_offset (-4)
	| Pop parameters
	addq.l #8, %sp
	cfi_adjust_cfa_offset (-8)
	| Call real function.
#ifdef __mcoldfire__
	move.l %d0,-(%sp)
	cfi_adjust_cfa_offset (4)
	rts
#else
	jmp (%d0)
#endif
	cfi_endproc
	.size _dl_runtime_resolve, . - _dl_runtime_resolve

	.text
	.globl _dl_runtime_profile
	.type _dl_runtime_profile, @function
_dl_runtime_profile:
	cfi_startproc
	cfi_adjust_cfa_offset (8)
	pea 8(%sp)
	cfi_adjust_cfa_offset (4)
	move.l %a1, -(%sp)
	cfi_adjust_cfa_offset (4)
	move.l %a0, -(%sp)
	cfi_adjust_cfa_offset (4)
	pea -1.w
	cfi_adjust_cfa_offset (4)
	| Push parameters for _dl_profile_fixup
	pea (%sp)
	cfi_adjust_cfa_offset (4)
	pea 8(%sp)
	cfi_adjust_cfa_offset (4)
	move.l 32(%sp), -(%sp)
	cfi_adjust_cfa_offset (4)
	move.l 32(%sp), -(%sp)
	cfi_adjust_cfa_offset (4)
	move.l 32(%sp), -(%sp)
	cfi_adjust_cfa_offset (4)
	subq.l #8, %sp
	cfi_adjust_cfa_offset (8)
	| Call the real address resolver.
	jbsr _dl_profile_fixup
	| Pop parameters
	lea 28(%sp), %sp
	cfi_adjust_cfa_offset (-28)
	move.l (%sp), %d1
	jpl 1f
	addq.l #4, %sp
	cfi_adjust_cfa_offset (-4)
	| Restore register %a0 and %a1.
	move.l (%sp)+, %a0
	cfi_adjust_cfa_offset (-4)
	move.l (%sp)+, %a1
	cfi_adjust_cfa_offset (-4)
	lea 12(%sp), %sp
	cfi_adjust_cfa_offset (-12)
	| Call real function.
#ifdef __mcoldfire__
	move.l %d0,-(%sp)
	cfi_adjust_cfa_offset (4)
	rts
#else
	jmp (%d0)
#endif

	/*
	    +24     return address
	    +20     PLT1
	    +16     PLT2
	    +12     %sp
	    +8      %a1
	    +4      %a0
	   %sp      free
	*/
#ifdef __mcoldfire__
	cfi_adjust_cfa_offset (20)
#else
	cfi_adjust_cfa_offset (24)
#endif
1:	move.l %a2, (%sp)
	cfi_rel_offset (%a2, 0)
	move.l %sp, %a2
	move.l %sp, %a0
	lea 28(%sp), %a1
	| Round framesize up to longword alignment
	addq.l #3, %d1
	and.l #-3, %d1
	sub.l %d1, %a0
	move.l %a0, %sp
	cfi_def_cfa_register (%a2)
#ifdef __mcoldfire__
	tst.l %d1
	beq 2f
1:	move.l (%a1)+, (%a0)+
	subq.l #4,%d1
	bne 1b
2:
#else
	lsr.l #2,%d1
	jra 2f
1:	move.l (%a1)+, (%a0)+
2:	dbra %d1,1b
#endif
	/*
	   %a2+24  return address
	   %a2+20  PLT1
	   %a2+16  PLT2
	   %a2+12  %sp
	   %a2+8   %a1
	   %a2+4   %a0
	   %a2     %a2
	   %sp     copied stack frame
	*/

	move.l 4(%a2), %a0
	move.l 8(%a2), %a1
#ifdef __mcoldfire__
	pea 2f(%pc)
	move.l %d0,-(%sp)
	rts
2:
#else
	jsr (%d0)
#endif
	move.l %a2, %sp
	cfi_def_cfa_register (%sp)
	move.l (%sp)+, %a2
	cfi_adjust_cfa_offset (4)
	cfi_restore (%a2)
	/*
	    +20     return address
	    +16     PLT1
	    +12     PLT2
	    +8      %sp
	    +4      %a1
	   %sp      %a0
	*/
#ifdef FMOVE
	FMOVE %fp0, -(%sp)
	cfi_adjust_cfa_offset (FPSPACE)
#endif
	move.l %a0, -(%sp)
	cfi_adjust_cfa_offset (4)
	move.l %d1, -(%sp)
	cfi_adjust_cfa_offset (4)
	move.l %d0, -(%sp)
	cfi_adjust_cfa_offset (4)
	pea (%sp)
	cfi_adjust_cfa_offset (4)
	pea (16+FPSPACE)(%sp)
	cfi_adjust_cfa_offset (4)
	move.l (32+FPSPACE)(%sp), -(%sp)
	cfi_adjust_cfa_offset (4)
	move.l (32+FPSPACE)(%sp), -(%sp)
	cfi_adjust_cfa_offset (4)
	jbsr _dl_call_pltexit
	lea 16(%sp), %sp
	cfi_adjust_cfa_offset (-16)
	move.l (%sp)+, %d0
	cfi_adjust_cfa_offset (-4)
	move.l (%sp)+, %d1
	cfi_adjust_cfa_offset (-4)
	move.l (%sp)+, %a0
	cfi_adjust_cfa_offset (-4)
#ifdef FMOVE
	FMOVE (%sp)+, %fp0
	cfi_adjust_cfa_offset (-FPSPACE)
#endif
	lea 20(%sp), %sp
	cfi_adjust_cfa_offset (-20)
	rts
	cfi_endproc
	.size _dl_runtime_profile, . - _dl_runtime_profile
