Blame sysdeps/ia64/dl-trampoline.S

Packit Service 82fcde
/* PLT trampolines.  ia64 version.
Packit Service 82fcde
   Copyright (C) 2005-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <sysdep.h>
Packit Service 82fcde
#undef ret
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
   This code is used in dl-runtime.c to call the `_dl_fixup' function
Packit Service 82fcde
   and then redirect to the address it returns. `_dl_fixup()' takes two
Packit Service 82fcde
   arguments, however _dl_profile_fixup() takes five.
Packit Service 82fcde
Packit Service 82fcde
   The ABI specifies that we will never see more than 8 input
Packit Service 82fcde
   registers to a function call, thus it is safe to simply allocate
Packit Service 82fcde
   those, and simpler than playing stack games.  */
Packit Service 82fcde
Packit Service 82fcde
/* Used to save and restore 8 incoming fp registers */
Packit Service 82fcde
#define RESOLVE_FRAME_SIZE (16*8)
Packit Service 82fcde
Packit Service 82fcde
ENTRY(_dl_runtime_resolve)
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  .prologue
Packit Service 82fcde
	  .save ar.pfs, r40
Packit Service 82fcde
	  alloc loc0 = ar.pfs, 8, 6, 2, 0
Packit Service 82fcde
	  /* Use the 16 byte scratch area. r2 will start at f8 and
Packit Service 82fcde
	     r3 will start at f9.  */
Packit Service 82fcde
	  adds r2 = -(RESOLVE_FRAME_SIZE - 16), r12
Packit Service 82fcde
	  adds r3 = -(RESOLVE_FRAME_SIZE - 32), r12
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  .fframe RESOLVE_FRAME_SIZE
Packit Service 82fcde
	  adds r12 = -RESOLVE_FRAME_SIZE, r12
Packit Service 82fcde
	  .save rp, loc1
Packit Service 82fcde
	  mov loc1 = b0
Packit Service 82fcde
	  .body
Packit Service 82fcde
	  mov loc2 = r8		/* preserve struct value register */
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  mov loc3 = r9		/* preserve language specific register */
Packit Service 82fcde
	  mov loc4 = r10	/* preserve language specific register */
Packit Service 82fcde
	  mov loc5 = r11	/* preserve language specific register */
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  stf.spill [r2] = f8, 32
Packit Service 82fcde
	  stf.spill [r3] = f9, 32
Packit Service 82fcde
	  mov out0 = r16
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  stf.spill [r2] = f10, 32
Packit Service 82fcde
	  stf.spill [r3] = f11, 32
Packit Service 82fcde
	  shl out1 = r15, 4
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  stf.spill [r2] = f12, 32
Packit Service 82fcde
	  stf.spill [r3] = f13, 32
Packit Service 82fcde
	  /* Relocation record is 24 byte. */
Packit Service 82fcde
	  shladd out1 = r15, 3, out1
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmb
Packit Service 82fcde
	  stf.spill [r2] = f14
Packit Service 82fcde
	  stf.spill [r3] = f15
Packit Service 82fcde
	  br.call.sptk.many b0 = _dl_fixup
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  /* Skip the 16byte scratch area.  */
Packit Service 82fcde
	  adds r2 = 16, r12
Packit Service 82fcde
	  adds r3 = 32, r12
Packit Service 82fcde
	  mov b6 = ret0
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  ldf.fill f8 = [r2], 32
Packit Service 82fcde
	  ldf.fill f9 = [r3], 32
Packit Service 82fcde
	  mov b0 = loc1
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  ldf.fill f10 = [r2], 32
Packit Service 82fcde
	  ldf.fill f11 = [r3], 32
Packit Service 82fcde
	  mov gp = ret1
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  ldf.fill f12 = [r2], 32
Packit Service 82fcde
	  ldf.fill f13 = [r3], 32
Packit Service 82fcde
	  mov ar.pfs = loc0
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  ldf.fill f14 = [r2], 32
Packit Service 82fcde
	  ldf.fill f15 = [r3], 32
Packit Service 82fcde
	  .restore sp		/* pop the unwind frame state */
Packit Service 82fcde
	  adds r12 = RESOLVE_FRAME_SIZE, r12
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  mov r9 = loc3		/* restore language specific register */
Packit Service 82fcde
	  mov r10 = loc4	/* restore language specific register */
Packit Service 82fcde
	  mov r11 = loc5	/* restore language specific register */
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  mov r8 = loc2		/* restore struct value register */
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	/* An alloc is needed for the break system call to work.
Packit Service 82fcde
	   We don't care about the old value of the pfs register.  */
Packit Service 82fcde
	{ .mmb
Packit Service 82fcde
	  .prologue
Packit Service 82fcde
	  .body
Packit Service 82fcde
	  alloc r2 = ar.pfs, 0, 0, 8, 0
Packit Service 82fcde
	  br.sptk.many b6
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
END(_dl_runtime_resolve)
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* The fourth argument to _dl_profile_fixup and the third one to
Packit Service 82fcde
   _dl_call_pltexit are a pointer to La_ia64_regs:
Packit Service 82fcde
Packit Service 82fcde
   8byte r8
Packit Service 82fcde
   8byte r9
Packit Service 82fcde
   8byte r10
Packit Service 82fcde
   8byte r11
Packit Service 82fcde
   8byte in0
Packit Service 82fcde
   8byte in1
Packit Service 82fcde
   8byte in2
Packit Service 82fcde
   8byte in3
Packit Service 82fcde
   8byte in4
Packit Service 82fcde
   8byte in5
Packit Service 82fcde
   8byte in6
Packit Service 82fcde
   8byte in7
Packit Service 82fcde
   16byte f8
Packit Service 82fcde
   16byte f9
Packit Service 82fcde
   16byte f10
Packit Service 82fcde
   16byte f11
Packit Service 82fcde
   16byte f12
Packit Service 82fcde
   16byte f13
Packit Service 82fcde
   16byte f14
Packit Service 82fcde
   16byte f15
Packit Service 82fcde
   8byte ar.unat
Packit Service 82fcde
   8byte sp
Packit Service 82fcde
Packit Service 82fcde
   The fifth argument to _dl_profile_fixup is a pointer to long int.
Packit Service 82fcde
   The fourth argument to _dl_call_pltexit is a pointer to
Packit Service 82fcde
   La_ia64_retval:
Packit Service 82fcde
Packit Service 82fcde
   8byte r8
Packit Service 82fcde
   8byte r9
Packit Service 82fcde
   8byte r10
Packit Service 82fcde
   8byte r11
Packit Service 82fcde
   16byte f8
Packit Service 82fcde
   16byte f9
Packit Service 82fcde
   16byte f10
Packit Service 82fcde
   16byte f11
Packit Service 82fcde
   16byte f12
Packit Service 82fcde
   16byte f13
Packit Service 82fcde
   16byte f14
Packit Service 82fcde
   16byte f15
Packit Service 82fcde
Packit Service 82fcde
  Since stack has to be 16 byte aligned, the stack allocation is in
Packit Service 82fcde
  16byte increment. Before calling _dl_profile_fixup, the stack will
Packit Service 82fcde
  look like
Packit Service 82fcde
Packit Service 82fcde
  psp	new frame_size
Packit Service 82fcde
  +16	La_ia64_regs
Packit Service 82fcde
  sp	scratch
Packit Service 82fcde
Packit Service 82fcde
 */
Packit Service 82fcde
Packit Service 82fcde
#define PLTENTER_FRAME_SIZE (4*8 + 8*8 + 8*16 + 2*8 + 16)
Packit Service 82fcde
#define PLTEXIT_FRAME_SIZE (PLTENTER_FRAME_SIZE + 4*8 + 8*16)
Packit Service 82fcde
Packit Service 82fcde
#ifndef PROF
Packit Service 82fcde
ENTRY(_dl_runtime_profile)
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  .prologue
Packit Service 82fcde
	  .save ar.pfs, r40
Packit Service 82fcde
	  alloc loc0 = ar.pfs, 8, 12, 8, 0
Packit Service 82fcde
	  .vframe loc10
Packit Service 82fcde
	  mov loc10 = r12
Packit Service 82fcde
	  .save rp, loc1
Packit Service 82fcde
	  mov loc1 = b0
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  .save ar.unat, r17
Packit Service 82fcde
	  mov r17 = ar.unat
Packit Service 82fcde
	  .save ar.lc, loc6
Packit Service 82fcde
	  mov loc6 = ar.lc
Packit Service 82fcde
	  mov loc11 = gp
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  .body
Packit Service 82fcde
	  /* There is a 16 byte scratch area. r2 will start at r8 and
Packit Service 82fcde
	     r3 will start at r9 for La_ia64_regs.  */
Packit Service 82fcde
	  adds r2 = -(PLTENTER_FRAME_SIZE - 16), r12
Packit Service 82fcde
	  adds r3 = -(PLTENTER_FRAME_SIZE - 24), r12
Packit Service 82fcde
	  adds r12 = -PLTENTER_FRAME_SIZE, r12
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  st8 [r2] = r8, 16;
Packit Service 82fcde
	  st8 [r3] = r9, 16;
Packit Service 82fcde
	  mov out2 = b0		/* needed by _dl_fixup_profile */
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  st8 [r2] = r10, 16;
Packit Service 82fcde
	  st8 [r3] = r11, 16;
Packit Service 82fcde
	  adds out3 = 16, r12	/* pointer to La_ia64_regs */
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  .mem.offset 0, 0
Packit Service 82fcde
	  st8.spill [r2] = in0, 16
Packit Service 82fcde
	  .mem.offset 8, 0
Packit Service 82fcde
	  st8.spill [r3] = in1, 16
Packit Service 82fcde
	  mov out4 = loc10	/* pointer to new frame size  */
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  .mem.offset 0, 0
Packit Service 82fcde
	  st8.spill [r2] = in2, 16
Packit Service 82fcde
	  .mem.offset 8, 0
Packit Service 82fcde
	  st8.spill [r3] = in3, 16
Packit Service 82fcde
	  mov loc2 = r8		/* preserve struct value register */
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  .mem.offset 0, 0
Packit Service 82fcde
	  st8.spill [r2] = in4, 16
Packit Service 82fcde
	  .mem.offset 8, 0
Packit Service 82fcde
	  st8.spill [r3] = in5, 16
Packit Service 82fcde
	  mov loc3 = r9		/* preserve language specific register */
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  .mem.offset 0, 0
Packit Service 82fcde
	  st8 [r2] = in6, 16
Packit Service 82fcde
	  .mem.offset 8, 0
Packit Service 82fcde
	  st8 [r3] = in7, 24	/* adjust for f9 */
Packit Service 82fcde
	  mov loc4 = r10	/* preserve language specific register */
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  mov r18 = ar.unat	/* save it in La_ia64_regs */
Packit Service 82fcde
	  mov loc7 = out3	/* save it for _dl_call_pltexit */
Packit Service 82fcde
	  mov loc5 = r11	/* preserve language specific register */
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  stf.spill [r2] = f8, 32
Packit Service 82fcde
	  stf.spill [r3] = f9, 32
Packit Service 82fcde
	  mov out0 = r16	/* needed by _dl_fixup_profile */
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  mov ar.unat = r17	/* restore it for function call */
Packit Service 82fcde
	  mov loc8 = r16	/* save it for _dl_call_pltexit */
Packit Service 82fcde
	  nop.i 0x0
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  stf.spill [r2] = f10, 32
Packit Service 82fcde
	  stf.spill [r3] = f11, 32
Packit Service 82fcde
	  shl out1 = r15, 4
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  stf.spill [r2] = f12, 32
Packit Service 82fcde
	  stf.spill [r3] = f13, 32
Packit Service 82fcde
	  /* Relocation record is 24 byte. */
Packit Service 82fcde
	  shladd out1 = r15, 3, out1
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  stf.spill [r2] = f14, 32
Packit Service 82fcde
	  stf.spill [r3] = f15, 24
Packit Service 82fcde
	  mov loc9 = out1	/* save it for _dl_call_pltexit */
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmb
Packit Service 82fcde
	  st8 [r2] = r18	/* store ar.unat */
Packit Service 82fcde
	  st8 [r3] = loc10	/* store sp */
Packit Service 82fcde
	  br.call.sptk.many b0 = _dl_profile_fixup
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  /* Skip the 16byte scratch area, 4 language specific GRs and
Packit Service 82fcde
	     8 incoming GRs to restore incoming fp registers.  */
Packit Service 82fcde
	  adds r2 = (4*8 + 8*8 + 16), r12
Packit Service 82fcde
	  adds r3 = (4*8 + 8*8 + 32), r12
Packit Service 82fcde
	  mov b6 = ret0
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  ldf.fill f8 = [r2], 32
Packit Service 82fcde
	  ldf.fill f9 = [r3], 32
Packit Service 82fcde
	  mov gp = ret1
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  ldf.fill f10 = [r2], 32
Packit Service 82fcde
	  ldf.fill f11 = [r3], 32
Packit Service 82fcde
	  mov r8 = loc2		/* restore struct value register */
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  ldf.fill f12 = [r2], 32
Packit Service 82fcde
	  ldf.fill f13 = [r3], 32
Packit Service 82fcde
	  mov r9 = loc3		/* restore language specific register */
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  ldf.fill f14 = [r2], 32
Packit Service 82fcde
	  ldf.fill f15 = [r3], 32
Packit Service 82fcde
	  mov r10 = loc4	/* restore language specific register */
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  ld8 r15 = [loc10]	/* load the new frame size */
Packit Service 82fcde
	  mov r11 = loc5	/* restore language specific register */
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	  cmp.eq p6, p7 = -1, r15
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
(p7)	  cmp.eq p8, p9 = 0, r15
Packit Service 82fcde
(p6)	  mov b0 = loc1
Packit Service 82fcde
(p6)	  mov ar.lc = loc6
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mib
Packit Service 82fcde
	  nop.m 0x0
Packit Service 82fcde
(p6)	  mov ar.pfs = loc0
Packit Service 82fcde
(p6)	  br.cond.dptk.many .Lresolved
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
	/* At this point, the stack looks like
Packit Service 82fcde
Packit Service 82fcde
	  +psp	free
Packit Service 82fcde
	  +16	La_ia64_regs
Packit Service 82fcde
	  sp	scratch
Packit Service 82fcde
Packit Service 82fcde
	  We need to keep the current stack and call the resolved
Packit Service 82fcde
	  function by copying the r15 byte from sp + PLTENTER_FRAME_SIZE
Packit Service 82fcde
	  + 16 (scratch area) to sp + 16 (scratch area). Since stack
Packit Service 82fcde
	  has to be 16byte aligned, we around r15 up to 16byte.  */
Packit Service 82fcde
Packit Service 82fcde
	{ .mbb
Packit Service 82fcde
(p9)	  adds r15 = 15, r15
Packit Service 82fcde
(p8)	  br.cond.dptk.many .Lno_new_frame
Packit Service 82fcde
	  nop.b 0x0
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  and r15 = -16, r15
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	  /* We don't copy the 16byte scatch area. Prepare r16/r17 as
Packit Service 82fcde
	     destination.  */
Packit Service 82fcde
	  sub r16 = r12, r15
Packit Service 82fcde
	  sub r17 = r12, r15
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  adds r16 = 16, r16
Packit Service 82fcde
	  adds r17 = 24, r17
Packit Service 82fcde
	  sub r12 = r12, r15		/* Adjust stack  */
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  nop.m 0x0
Packit Service 82fcde
	  shr r15 = r15, 4
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	  adds r15 = -1, r15
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  /* Skip the 16byte scatch area. Prepare r2/r3 as source.  */
Packit Service 82fcde
	  adds r2 = 16, loc10
Packit Service 82fcde
	  adds r3 = 24, loc10
Packit Service 82fcde
	  mov ar.lc = r15
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
.Lcopy:
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  ld8 r18 = [r2], 16
Packit Service 82fcde
	  ld8 r19 = [r3], 16
Packit Service 82fcde
	  nop.i 0x0
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmb
Packit Service 82fcde
	  st8 [r16] = r18, 16
Packit Service 82fcde
	  st8 [r17] = r19, 16
Packit Service 82fcde
	  br.cloop.sptk.few .Lcopy
Packit Service 82fcde
	}
Packit Service 82fcde
.Lno_new_frame:
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  mov out0 = in0
Packit Service 82fcde
	  mov out1 = in1
Packit Service 82fcde
	  mov out2 = in2
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  mov out3 = in3
Packit Service 82fcde
	  mov out4 = in4
Packit Service 82fcde
	  mov out5 = in5
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mib
Packit Service 82fcde
	  mov out6 = in6
Packit Service 82fcde
	  mov out7 = in7
Packit Service 82fcde
	  /* Call the resolved function  */
Packit Service 82fcde
	  br.call.sptk.many b0 = b6
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mii
Packit Service 82fcde
	  /* Prepare stack for _dl_call_pltexit. Loc10 has the original
Packit Service 82fcde
	     stack pointer.  */
Packit Service 82fcde
	  adds r12 = -PLTEXIT_FRAME_SIZE, loc10
Packit Service 82fcde
	  adds r2 = -(PLTEXIT_FRAME_SIZE - 16), loc10
Packit Service 82fcde
	  adds r3 = -(PLTEXIT_FRAME_SIZE - 24), loc10
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  /* Load all possible return values into buffer.  */
Packit Service 82fcde
	  st8 [r2] = r8, 16
Packit Service 82fcde
	  st8 [r3] = r9, 16
Packit Service 82fcde
	  mov out0 = loc8
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  st8 [r2] = r10, 16
Packit Service 82fcde
	  st8 [r3] = r11, 24
Packit Service 82fcde
	  mov out1 = loc9
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  stf.spill [r2] = f8, 32
Packit Service 82fcde
	  stf.spill [r3] = f9, 32
Packit Service 82fcde
	  mov out2 = loc7		/* Pointer to La_ia64_regs */
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  stf.spill [r2] = f10, 32
Packit Service 82fcde
	  stf.spill [r3] = f11, 32
Packit Service 82fcde
	  adds out3 = 16, r12		/* Pointer to La_ia64_retval */
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  stf.spill [r2] = f12, 32
Packit Service 82fcde
	  stf.spill [r3] = f13, 32
Packit Service 82fcde
	  /* We need to restore gp for _dl_call_pltexit. */
Packit Service 82fcde
	  mov gp = loc11
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmb
Packit Service 82fcde
	  stf.spill [r2] = f14
Packit Service 82fcde
	  stf.spill [r3] = f15
Packit Service 82fcde
	  br.call.sptk.many b0 = _dl_call_pltexit
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  /* Load all the non-floating and floating return values. Skip
Packit Service 82fcde
	     the 16byte scratch area.  */
Packit Service 82fcde
	  adds r2 = 16, r12
Packit Service 82fcde
	  adds r3 = 24, r12
Packit Service 82fcde
	  nop.i 0x0
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  ld8 r8 = [r2], 16
Packit Service 82fcde
	  ld8 r9 = [r3], 16
Packit Service 82fcde
	  nop.i 0x0
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  ld8 r10 = [r2], 16
Packit Service 82fcde
	  ld8 r11 = [r3], 24
Packit Service 82fcde
	  nop.i 0x0
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  ldf.fill f8 = [r2], 32
Packit Service 82fcde
	  ldf.fill f9 = [r3], 32
Packit Service 82fcde
	  mov ar.lc = loc6
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  ldf.fill f10 = [r2], 32
Packit Service 82fcde
	  ldf.fill f11 = [r3], 32
Packit Service 82fcde
	  mov ar.pfs = loc0
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  ldf.fill f12 = [r2], 32
Packit Service 82fcde
	  ldf.fill f13 = [r3], 32
Packit Service 82fcde
	  mov b0 = loc1
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	{ .mmi
Packit Service 82fcde
	  ldf.fill f14 = [r2]
Packit Service 82fcde
	  ldf.fill f15 = [r3]
Packit Service 82fcde
	  /* We know that the previous stack pointer, loc10, isn't 0.
Packit Service 82fcde
	     We use it to reload p7.  */
Packit Service 82fcde
	  cmp.ne p7, p0 = 0, loc10
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
.Lresolved:
Packit Service 82fcde
	{ .mmb
Packit Service 82fcde
	  .restore sp
Packit Service 82fcde
	  mov r12 = loc10
Packit Service 82fcde
(p7)	  br.ret.sptk.many b0
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
	/* An alloc is needed for the break system call to work. We
Packit Service 82fcde
	   don't care about the old value of the pfs register. After
Packit Service 82fcde
	   this alloc, we can't use any rotating registers. Otherwise
Packit Service 82fcde
	   assembler won't be happy. This has to be at the end.  */
Packit Service 82fcde
	{ .mmb
Packit Service 82fcde
	  .prologue
Packit Service 82fcde
	  .body
Packit Service 82fcde
	  alloc r2 = ar.pfs, 0, 0, 8, 0
Packit Service 82fcde
	  br.sptk.many b6
Packit Service 82fcde
	  ;;
Packit Service 82fcde
	}
Packit Service 82fcde
END(_dl_runtime_profile)
Packit Service 82fcde
#endif