Blame sysdeps/x86_64/dl-trampoline.S

Packit Service 82fcde
/* PLT trampolines.  x86-64 version.
Packit Service 82fcde
   Copyright (C) 2004-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 <config.h>
Packit Service 82fcde
#include <sysdep.h>
Packit Service 82fcde
#include <cpu-features.h>
Packit Service 82fcde
#include <link-defines.h>
Packit Service 82fcde
Packit Service 82fcde
#ifndef DL_STACK_ALIGNMENT
Packit Service 82fcde
/* Due to GCC bug:
Packit Service 82fcde
Packit Service 82fcde
   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58066
Packit Service 82fcde
Packit Service 82fcde
   __tls_get_addr may be called with 8-byte stack alignment.  Although
Packit Service 82fcde
   this bug has been fixed in GCC 4.9.4, 5.3 and 6, we can't assume
Packit Service 82fcde
   that stack will be always aligned at 16 bytes.  We use unaligned
Packit Service 82fcde
   16-byte move to load and store SSE registers, which has no penalty
Packit Service 82fcde
   on modern processors if stack is 16-byte aligned.  */
Packit Service 82fcde
# define DL_STACK_ALIGNMENT 8
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* True if _dl_runtime_resolve should align stack for STATE_SAVE or align
Packit Service 82fcde
   stack to 16 bytes before calling _dl_fixup.  */
Packit Service 82fcde
#define DL_RUNTIME_RESOLVE_REALIGN_STACK \
Packit Service 82fcde
  (STATE_SAVE_ALIGNMENT > DL_STACK_ALIGNMENT \
Packit Service 82fcde
   || 16 > DL_STACK_ALIGNMENT)
Packit Service 82fcde
Packit Service 82fcde
/* Area on stack to save and restore registers used for parameter
Packit Service 82fcde
   passing when calling _dl_fixup.  */
Packit Service 82fcde
#ifdef __ILP32__
Packit Service 82fcde
# define PRESERVE_BND_REGS_PREFIX
Packit Service 82fcde
#else
Packit Service 82fcde
# ifdef HAVE_MPX_SUPPORT
Packit Service 82fcde
#  define PRESERVE_BND_REGS_PREFIX bnd
Packit Service 82fcde
# else
Packit Service 82fcde
#  define PRESERVE_BND_REGS_PREFIX .byte 0xf2
Packit Service 82fcde
# endif
Packit Service 82fcde
#endif
Packit Service 82fcde
#define REGISTER_SAVE_RAX	0
Packit Service 82fcde
#define REGISTER_SAVE_RCX	(REGISTER_SAVE_RAX + 8)
Packit Service 82fcde
#define REGISTER_SAVE_RDX	(REGISTER_SAVE_RCX + 8)
Packit Service 82fcde
#define REGISTER_SAVE_RSI	(REGISTER_SAVE_RDX + 8)
Packit Service 82fcde
#define REGISTER_SAVE_RDI	(REGISTER_SAVE_RSI + 8)
Packit Service 82fcde
#define REGISTER_SAVE_R8	(REGISTER_SAVE_RDI + 8)
Packit Service 82fcde
#define REGISTER_SAVE_R9	(REGISTER_SAVE_R8 + 8)
Packit Service 82fcde
Packit Service 82fcde
#define RESTORE_AVX
Packit Service 82fcde
Packit Service 82fcde
#define VEC_SIZE		64
Packit Service 82fcde
#define VMOVA			vmovdqa64
Packit Service 82fcde
#define VEC(i)			zmm##i
Packit Service 82fcde
#define _dl_runtime_profile	_dl_runtime_profile_avx512
Packit Service 82fcde
#include "dl-trampoline.h"
Packit Service 82fcde
#undef _dl_runtime_profile
Packit Service 82fcde
#undef VEC
Packit Service 82fcde
#undef VMOVA
Packit Service 82fcde
#undef VEC_SIZE
Packit Service 82fcde
Packit Service 82fcde
#define VEC_SIZE		32
Packit Service 82fcde
#define VMOVA			vmovdqa
Packit Service 82fcde
#define VEC(i)			ymm##i
Packit Service 82fcde
#define _dl_runtime_profile	_dl_runtime_profile_avx
Packit Service 82fcde
#include "dl-trampoline.h"
Packit Service 82fcde
#undef _dl_runtime_profile
Packit Service 82fcde
#undef VEC
Packit Service 82fcde
#undef VMOVA
Packit Service 82fcde
#undef VEC_SIZE
Packit Service 82fcde
Packit Service 82fcde
/* movaps/movups is 1-byte shorter.  */
Packit Service 82fcde
#define VEC_SIZE		16
Packit Service 82fcde
#define VMOVA			movaps
Packit Service 82fcde
#define VEC(i)			xmm##i
Packit Service 82fcde
#define _dl_runtime_profile	_dl_runtime_profile_sse
Packit Service 82fcde
#undef RESTORE_AVX
Packit Service 82fcde
#include "dl-trampoline.h"
Packit Service 82fcde
#undef _dl_runtime_profile
Packit Service 82fcde
#undef VEC
Packit Service 82fcde
#undef VMOVA
Packit Service 82fcde
#undef VEC_SIZE
Packit Service 82fcde
Packit Service 82fcde
#define USE_FXSAVE
Packit Service 82fcde
#define STATE_SAVE_ALIGNMENT	16
Packit Service 82fcde
#define _dl_runtime_resolve	_dl_runtime_resolve_fxsave
Packit Service 82fcde
#include "dl-trampoline.h"
Packit Service 82fcde
#undef _dl_runtime_resolve
Packit Service 82fcde
#undef USE_FXSAVE
Packit Service 82fcde
#undef STATE_SAVE_ALIGNMENT
Packit Service 82fcde
Packit Service 82fcde
#define USE_XSAVE
Packit Service 82fcde
#define STATE_SAVE_ALIGNMENT	64
Packit Service 82fcde
#define _dl_runtime_resolve	_dl_runtime_resolve_xsave
Packit Service 82fcde
#include "dl-trampoline.h"
Packit Service 82fcde
#undef _dl_runtime_resolve
Packit Service 82fcde
#undef USE_XSAVE
Packit Service 82fcde
#undef STATE_SAVE_ALIGNMENT
Packit Service 82fcde
Packit Service 82fcde
#define USE_XSAVEC
Packit Service 82fcde
#define STATE_SAVE_ALIGNMENT	64
Packit Service 82fcde
#define _dl_runtime_resolve	_dl_runtime_resolve_xsavec
Packit Service 82fcde
#include "dl-trampoline.h"
Packit Service 82fcde
#undef _dl_runtime_resolve
Packit Service 82fcde
#undef USE_XSAVEC
Packit Service 82fcde
#undef STATE_SAVE_ALIGNMENT