Blame sysdeps/powerpc/powerpc64/__longjmp-common.S

Packit 6c4009
/* longjmp for PowerPC64.
Packit 6c4009
   Copyright (C) 1995-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <sysdep.h>
Packit 6c4009
#include <stap-probe.h>
Packit 6c4009
#define _ASM
Packit 6c4009
#define _SETJMP_H
Packit 6c4009
#ifdef __NO_VMX__
Packit 6c4009
# include <novmxsetjmp.h>
Packit 6c4009
#else
Packit 6c4009
# include <jmpbuf-offsets.h>
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#ifndef __NO_VMX__
Packit 6c4009
	.section	".toc","aw"
Packit 6c4009
.LC__dl_hwcap:
Packit 6c4009
# ifdef SHARED
Packit 6c4009
#  if IS_IN (rtld)
Packit 6c4009
	/* Inside ld.so we use the local alias to avoid runtime GOT
Packit 6c4009
	   relocations.  */
Packit 6c4009
	.tc _rtld_local_ro[TC],_rtld_local_ro
Packit 6c4009
#  else
Packit 6c4009
	.tc _rtld_global_ro[TC],_rtld_global_ro
Packit 6c4009
#  endif
Packit 6c4009
# else
Packit 6c4009
	.tc _dl_hwcap[TC],_dl_hwcap
Packit 6c4009
# endif
Packit 6c4009
	.section ".text"
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
	.machine	"altivec"
Packit 6c4009
ENTRY (__longjmp)
Packit 6c4009
	CALL_MCOUNT 2
Packit 6c4009
#ifndef __NO_VMX__
Packit 6c4009
	ld    r5,.LC__dl_hwcap@toc(r2)
Packit 6c4009
# ifdef SHARED
Packit 6c4009
	/* Load _rtld-global._dl_hwcap.  */
Packit 6c4009
	ld    r5,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r5)
Packit 6c4009
# else
Packit 6c4009
	ld    r5,0(r5) /* Load extern _dl_hwcap.  */
Packit 6c4009
# endif
Packit 6c4009
	andis.  r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16)
Packit 6c4009
	beq	L(no_vmx)
Packit 6c4009
	la	r5,((JB_VRS)*8)(3)
Packit 6c4009
	andi.	r6,r5,0xf
Packit 6c4009
	lwz	r0,((JB_VRSAVE)*8)(3)	/* 32-bit VRSAVE.  */
Packit 6c4009
	mtspr	VRSAVE,r0
Packit 6c4009
	beq+	L(aligned_restore_vmx)
Packit 6c4009
	addi    r6,r5,16
Packit 6c4009
	lvsl	v0,0,r5
Packit 6c4009
	lvx	v1,0,r5
Packit 6c4009
	addi    r5,r5,32
Packit 6c4009
	lvx	v21,0,r6
Packit 6c4009
	vperm   v20,v1,v21,v0
Packit 6c4009
# define load_misaligned_vmx_lo_loaded(loadvr,lovr,shiftvr,loadgpr,addgpr) \
Packit 6c4009
	addi    addgpr,addgpr,32; \
Packit 6c4009
	lvx	lovr,0,loadgpr; \
Packit 6c4009
	vperm   loadvr,loadvr,lovr,shiftvr;
Packit 6c4009
	load_misaligned_vmx_lo_loaded(v21,v22,v0,r5,r6)
Packit 6c4009
	load_misaligned_vmx_lo_loaded(v22,v23,v0,r6,r5)
Packit 6c4009
	load_misaligned_vmx_lo_loaded(v23,v24,v0,r5,r6)
Packit 6c4009
	load_misaligned_vmx_lo_loaded(v24,v25,v0,r6,r5)
Packit 6c4009
	load_misaligned_vmx_lo_loaded(v25,v26,v0,r5,r6)
Packit 6c4009
	load_misaligned_vmx_lo_loaded(v26,v27,v0,r6,r5)
Packit 6c4009
	load_misaligned_vmx_lo_loaded(v27,v28,v0,r5,r6)
Packit 6c4009
	load_misaligned_vmx_lo_loaded(v28,v29,v0,r6,r5)
Packit 6c4009
	load_misaligned_vmx_lo_loaded(v29,v30,v0,r5,r6)
Packit 6c4009
	load_misaligned_vmx_lo_loaded(v30,v31,v0,r6,r5)
Packit 6c4009
	lvx	v1,0,r5
Packit 6c4009
	vperm   v31,v31,v1,v0
Packit 6c4009
	b       L(no_vmx)
Packit 6c4009
L(aligned_restore_vmx):
Packit 6c4009
	addi	r6,r5,16
Packit 6c4009
	lvx	v20,0,r5
Packit 6c4009
	addi	r5,r5,32
Packit 6c4009
	lvx	v21,0,r6
Packit 6c4009
	addi	r6,r6,32
Packit 6c4009
	lvx	v22,0,r5
Packit 6c4009
	addi	r5,r5,32
Packit 6c4009
	lvx	v23,0,r6
Packit 6c4009
	addi	r6,r6,32
Packit 6c4009
	lvx	v24,0,r5
Packit 6c4009
	addi	r5,r5,32
Packit 6c4009
	lvx	v25,0,r6
Packit 6c4009
	addi	r6,r6,32
Packit 6c4009
	lvx	v26,0,r5
Packit 6c4009
	addi	r5,r5,32
Packit 6c4009
	lvx	v27,0,r6
Packit 6c4009
	addi	r6,r6,32
Packit 6c4009
	lvx	v28,0,r5
Packit 6c4009
	addi	r5,r5,32
Packit 6c4009
	lvx	v29,0,r6
Packit 6c4009
	addi	r6,r6,32
Packit 6c4009
	lvx	v30,0,r5
Packit 6c4009
	lvx	v31,0,r6
Packit 6c4009
L(no_vmx):
Packit 6c4009
#endif
Packit 6c4009
#if defined PTR_DEMANGLE || defined CHECK_SP
Packit 6c4009
	ld r22,(JB_GPR1*8)(r3)
Packit 6c4009
#else
Packit 6c4009
	ld r1,(JB_GPR1*8)(r3)
Packit 6c4009
#endif
Packit 6c4009
#ifdef PTR_DEMANGLE
Packit 6c4009
# ifdef CHECK_SP
Packit 6c4009
	PTR_DEMANGLE3 (r22, r22, r25)
Packit 6c4009
# else
Packit 6c4009
	PTR_DEMANGLE3 (r1, r22, r25)
Packit 6c4009
# endif
Packit 6c4009
#endif
Packit 6c4009
#ifdef CHECK_SP
Packit 6c4009
	CHECK_SP (r22)
Packit 6c4009
	mr r1,r22
Packit 6c4009
#endif
Packit 6c4009
	ld r2,(JB_GPR2*8)(r3)
Packit 6c4009
	ld r0,(JB_LR*8)(r3)
Packit 6c4009
	ld r14,((JB_GPRS+0)*8)(r3)
Packit 6c4009
	lfd fp14,((JB_FPRS+0)*8)(r3)
Packit 6c4009
	ld r15,((JB_GPRS+1)*8)(r3)
Packit 6c4009
	lfd fp15,((JB_FPRS+1)*8)(r3)
Packit 6c4009
	ld r16,((JB_GPRS+2)*8)(r3)
Packit 6c4009
	lfd fp16,((JB_FPRS+2)*8)(r3)
Packit 6c4009
	ld r17,((JB_GPRS+3)*8)(r3)
Packit 6c4009
	lfd fp17,((JB_FPRS+3)*8)(r3)
Packit 6c4009
	ld r18,((JB_GPRS+4)*8)(r3)
Packit 6c4009
	lfd fp18,((JB_FPRS+4)*8)(r3)
Packit 6c4009
	ld r19,((JB_GPRS+5)*8)(r3)
Packit 6c4009
	lfd fp19,((JB_FPRS+5)*8)(r3)
Packit 6c4009
	ld r20,((JB_GPRS+6)*8)(r3)
Packit 6c4009
	lfd fp20,((JB_FPRS+6)*8)(r3)
Packit 6c4009
#ifdef PTR_DEMANGLE
Packit 6c4009
	PTR_DEMANGLE2 (r0, r25)
Packit 6c4009
#endif
Packit 6c4009
     /* longjmp/longjmp_target probe expects longjmp first argument (8@3),
Packit 6c4009
	second argument (-4@4), and target address (8@0), respectively.  */
Packit 6c4009
	LIBC_PROBE (longjmp, 3, 8@3, -4@4, 8@0)
Packit 6c4009
	mtlr r0
Packit 6c4009
	std r2,FRAME_TOC_SAVE(r1)	/* Restore the TOC save area.  */
Packit 6c4009
	ld r21,((JB_GPRS+7)*8)(r3)
Packit 6c4009
	lfd fp21,((JB_FPRS+7)*8)(r3)
Packit 6c4009
	ld r22,((JB_GPRS+8)*8)(r3)
Packit 6c4009
	lfd fp22,((JB_FPRS+8)*8)(r3)
Packit 6c4009
	lwz r5,((JB_CR*8)+4)(r3)	/* 32-bit CR.  */
Packit 6c4009
	ld r23,((JB_GPRS+9)*8)(r3)
Packit 6c4009
	lfd fp23,((JB_FPRS+9)*8)(r3)
Packit 6c4009
	ld r24,((JB_GPRS+10)*8)(r3)
Packit 6c4009
	lfd fp24,((JB_FPRS+10)*8)(r3)
Packit 6c4009
	ld r25,((JB_GPRS+11)*8)(r3)
Packit 6c4009
	lfd fp25,((JB_FPRS+11)*8)(r3)
Packit 6c4009
	mtcrf 0xFF,r5
Packit 6c4009
	ld r26,((JB_GPRS+12)*8)(r3)
Packit 6c4009
	lfd fp26,((JB_FPRS+12)*8)(r3)
Packit 6c4009
	ld r27,((JB_GPRS+13)*8)(r3)
Packit 6c4009
	lfd fp27,((JB_FPRS+13)*8)(r3)
Packit 6c4009
	ld r28,((JB_GPRS+14)*8)(r3)
Packit 6c4009
	lfd fp28,((JB_FPRS+14)*8)(r3)
Packit 6c4009
	ld r29,((JB_GPRS+15)*8)(r3)
Packit 6c4009
	lfd fp29,((JB_FPRS+15)*8)(r3)
Packit 6c4009
	ld r30,((JB_GPRS+16)*8)(r3)
Packit 6c4009
	lfd fp30,((JB_FPRS+16)*8)(r3)
Packit 6c4009
	ld r31,((JB_GPRS+17)*8)(r3)
Packit 6c4009
	lfd fp31,((JB_FPRS+17)*8)(r3)
Packit 6c4009
	LIBC_PROBE (longjmp_target, 3, 8@3, -4@4, 8@0)
Packit 6c4009
	mr r3,r4
Packit 6c4009
	blr
Packit 6c4009
END (__longjmp)