Blame src/libmpg123/mangle.h

Packit c32a2d
/*
Packit c32a2d
	mangle: support defines for preprocessed assembler
Packit c32a2d
Packit c32a2d
	copyright 1995-2007 by the mpg123 project - free software under the terms of the LGPL 2.1
Packit c32a2d
	see COPYING and AUTHORS files in distribution or http://mpg123.org
Packit c32a2d
Packit c32a2d
	This once started out as mangle.h from MPlayer, but you can't really call it derived work... the small part that in principle stems from MPlayer also being not very special (once you decided to use such a header at all, it's quite obvious material).
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
#ifndef __MANGLE_H
Packit c32a2d
#define __MANGLE_H
Packit c32a2d
Packit c32a2d
#include "config.h"
Packit c32a2d
#include "intsym.h"
Packit c32a2d
Packit c32a2d
#if (defined OPT_I486)  || (defined OPT_I586) || (defined OPT_I586_DITHER) \
Packit c32a2d
 || (defined OPT_MMX)   || (defined OPT_SSE)  || (defined OPT_3DNOW) || (defined OPT_3DNOWEXT) \
Packit c32a2d
 || (defined OPT_3DNOW_VINTAGE) || (defined OPT_3DNOWEXT_VINTAGE) \
Packit c32a2d
 || (defined OPT_SSE_VINTAGE)
Packit c32a2d
#define OPT_X86
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#ifdef CCALIGN
Packit c32a2d
#define MOVUAPS movaps
Packit c32a2d
#else
Packit c32a2d
#define MOVUAPS movups
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
/*
Packit c32a2d
	ALIGNX: align to X bytes
Packit c32a2d
	This differs per compiler/platform in taking the byte count or an exponent for base 2.
Packit c32a2d
	A way out is balign, if the assembler supports it (gas extension).
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
#ifdef ASMALIGN_BALIGN
Packit c32a2d
Packit c32a2d
#define ALIGN4  .balign 4
Packit c32a2d
#define ALIGN8  .balign 8
Packit c32a2d
#define ALIGN16 .balign 16
Packit c32a2d
#define ALIGN32 .balign 32
Packit c32a2d
#define ALIGN64 .balign 64
Packit c32a2d
Packit c32a2d
#else
Packit c32a2d
Packit c32a2d
#ifdef ASMALIGN_EXP
Packit c32a2d
#define ALIGN4  .align 2
Packit c32a2d
#define ALIGN8  .align 3
Packit c32a2d
#define ALIGN16 .align 4
Packit c32a2d
#define ALIGN32 .align 5
Packit c32a2d
#define ALIGN64 .align 6
Packit c32a2d
#else
Packit c32a2d
#ifdef ASMALIGN_BYTE
Packit c32a2d
#define ALIGN4  .align 4
Packit c32a2d
#define ALIGN8  .align 8
Packit c32a2d
#define ALIGN16 .align 16
Packit c32a2d
#define ALIGN32 .align 32
Packit c32a2d
#define ALIGN64 .align 64
Packit c32a2d
#else
Packit c32a2d
#ifdef ASMALIGN_ARMASM
Packit c32a2d
#define ALIGN4  ALIGN 4
Packit c32a2d
#define ALIGN8  ALIGN 8
Packit c32a2d
#define ALIGN16 ALIGN 16
Packit c32a2d
#define ALIGN32 ALIGN 32
Packit c32a2d
#define ALIGN64 ALIGN 64
Packit c32a2d
#else
Packit c32a2d
#error "Dunno how assembler alignment works. Please specify."
Packit c32a2d
#endif
Packit c32a2d
#endif
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#define MANGLE_MACROCAT_REALLY(a, b) a ## b
Packit c32a2d
#define MANGLE_MACROCAT(a, b) MANGLE_MACROCAT_REALLY(a, b)
Packit c32a2d
/* Feel free to add more to the list, eg. a.out IMO */
Packit c32a2d
#if defined(__USER_LABEL_PREFIX__)
Packit c32a2d
#define ASM_NAME(a) MANGLE_MACROCAT(__USER_LABEL_PREFIX__,a)
Packit c32a2d
#define ASM_VALUE(a) MANGLE_MACROCAT($,ASM_NAME(a))
Packit c32a2d
#elif defined(__CYGWIN__) || defined(_WIN32) && !defined (_WIN64) && !defined (_M_ARM) || defined(__OS2__) || \
Packit c32a2d
   (defined(__OpenBSD__) && !defined(__ELF__)) || defined(__APPLE__)
Packit c32a2d
#define ASM_NAME(a) MANGLE_MACROCAT(_,a)
Packit c32a2d
#define ASM_VALUE(a) MANGLE_MACROCAT($_,a)
Packit c32a2d
#else
Packit c32a2d
#define ASM_NAME(a) a
Packit c32a2d
#define ASM_VALUE(a) MANGLE_MACROCAT($,a)
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
/* Enable position-independent code for certain platforms. */
Packit c32a2d
Packit c32a2d
#if defined(OPT_X86)
Packit c32a2d
Packit c32a2d
#define _EBX_ %ebx
Packit c32a2d
Packit c32a2d
#if defined(PIC) && defined(__ELF__)
Packit c32a2d
Packit c32a2d
/* ELF binaries (Unix/Linux) */
Packit c32a2d
#define LOCAL_VAR(a) a ## @GOTOFF(_EBX_)
Packit c32a2d
#define GLOBAL_VAR(a) ASM_NAME(a) ## @GOTOFF(_EBX_)
Packit c32a2d
#define GLOBAL_VAR_PTR(a) ASM_NAME(a) ## @GOT(_EBX_)
Packit c32a2d
#define FUNC(a) ASM_NAME(a)
Packit c32a2d
#define EXTERNAL_FUNC(a) ASM_NAME(a) ## @PLT
Packit c32a2d
#undef ASM_VALUE
Packit c32a2d
#define ASM_VALUE(a) MANGLE_MACROCAT($,a) ##@GOTOFF
Packit c32a2d
#define GET_GOT \
Packit c32a2d
	call 1f; \
Packit c32a2d
1: \
Packit c32a2d
	pop _EBX_; \
Packit c32a2d
2: \
Packit c32a2d
	addl $_GLOBAL_OFFSET_TABLE_ + (2b-1b), _EBX_
Packit c32a2d
#define PREPARE_GOT pushl _EBX_
Packit c32a2d
#define RESTORE_GOT popl _EBX_
Packit c32a2d
Packit c32a2d
#elif defined(PIC) && defined(__APPLE__)
Packit c32a2d
Packit c32a2d
/* Mach-O binaries (OSX/iOS) */
Packit c32a2d
#define LOCAL_VAR(a) a ## - Lpic_base(_EBX_)
Packit c32a2d
#define GLOBAL_VAR(a) #error This ABI cannot access non-local symbols directly.
Packit c32a2d
#define GLOBAL_VAR_PTR(a) L_ ## a ## - Lpic_base(_EBX_)
Packit c32a2d
#define FUNC(a) L_ ## a
Packit c32a2d
#define EXTERNAL_FUNC(a) L_ ## a
Packit c32a2d
#define GET_GOT \
Packit c32a2d
	call Lpic_base; \
Packit c32a2d
Lpic_base: \
Packit c32a2d
	pop _EBX_
Packit c32a2d
#define PREPARE_GOT pushl _EBX_
Packit c32a2d
#define RESTORE_GOT popl _EBX_
Packit c32a2d
Packit c32a2d
#else
Packit c32a2d
Packit c32a2d
/* Dummies for everyone else. */
Packit c32a2d
#define LOCAL_VAR(a) a
Packit c32a2d
#define GLOBAL_VAR ASM_NAME
Packit c32a2d
#define GLOBAL_VAR_PTR(a) #error Cannot use indirect addressing in non-PIC object.
Packit c32a2d
#define FUNC ASM_NAME
Packit c32a2d
#define EXTERNAL_FUNC ASM_NAME
Packit c32a2d
#define GET_GOT
Packit c32a2d
#define PREPARE_GOT
Packit c32a2d
#define RESTORE_GOT
Packit c32a2d
Packit c32a2d
#endif /* PIC variants */
Packit c32a2d
Packit c32a2d
#endif /* OPT_X86 */
Packit c32a2d
Packit c32a2d
#if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__)
Packit c32a2d
#define COMM(a,b,c) .comm a,b
Packit c32a2d
#else
Packit c32a2d
#define COMM(a,b,c) .comm a,b,c
Packit c32a2d
#endif
Packit c32a2d
/* more hacks for macosx; no .bss ... */
Packit c32a2d
#ifdef __APPLE__
Packit c32a2d
#define BSS .data
Packit c32a2d
#else
Packit c32a2d
#define BSS .bss
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
/* armasm for WIN32 UWP */
Packit c32a2d
#ifdef _M_ARM
Packit c32a2d
#define GLOBAL_SYMBOL EXPORT
Packit c32a2d
#else
Packit c32a2d
#define GLOBAL_SYMBOL .globl
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
/* Mark non-executable stack.
Packit c32a2d
   It's mainly for GNU on Linux... who else does (not) like this? */
Packit c32a2d
#if !defined(__SUNPRO_C) && defined(__linux__) && defined(__ELF__)
Packit c32a2d
#if defined(__arm__)
Packit c32a2d
#define NONEXEC_STACK .section .note.GNU-stack,"",%progbits
Packit c32a2d
#else
Packit c32a2d
#define NONEXEC_STACK .section .note.GNU-stack,"",@progbits
Packit c32a2d
#endif
Packit c32a2d
#else
Packit c32a2d
#define NONEXEC_STACK
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#if (defined(__x86_64__) || defined(_M_X64)) && (defined(_WIN64) || defined (__CYGWIN__))
Packit c32a2d
#define IS_MSABI 1 /* Not using SYSV */
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
/* Macros for +-4GiB PC-relative addressing on AArch64 */
Packit c32a2d
#ifdef __APPLE__
Packit c32a2d
#define AARCH64_PCREL_HI(label) label@PAGE
Packit c32a2d
#define AARCH64_PCREL_LO(label) label@PAGEOFF
Packit c32a2d
#else
Packit c32a2d
#define AARCH64_PCREL_HI(label) label
Packit c32a2d
#define AARCH64_PCREL_LO(label) :lo12:label
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#ifdef __APPLE__
Packit c32a2d
#define AARCH64_DUP_4S(dst, src, elem) dup.4s dst, src[elem]
Packit c32a2d
#define AARCH64_DUP_2D(dst, src, elem) dup.2d dst, src[elem]
Packit c32a2d
#define AARCH64_SQXTN2_8H(dst, src) sqxtn2.8h dst, src
Packit c32a2d
#else
Packit c32a2d
#define AARCH64_DUP_4S(dst, src, elem) dup dst.4s, src.s[elem]
Packit c32a2d
#define AARCH64_DUP_2D(dst, src, elem) dup dst.2d, src.d[elem]
Packit c32a2d
#define AARCH64_SQXTN2_8H(dst, src) sqxtn2 dst.8h, src.4s
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#endif /* !__MANGLE_H */
Packit c32a2d