190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 2f71323e297a928af368937089d3ed71239786f86Andreas Huber; Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 4f71323e297a928af368937089d3ed71239786f86Andreas Huber; Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber; that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber; tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber; in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber; be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%include "vpx_config.asm" 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 32/64 bit compatibility macros 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; In general, we make the source use 64 bit syntax, then twiddle with it using 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; the preprocessor to get the 32 bit syntax on 32 bit platforms. 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%ifidn __OUTPUT_FORMAT__,elf32 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define ABI_IS_32BIT 1 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%elifidn __OUTPUT_FORMAT__,macho32 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define ABI_IS_32BIT 1 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%elifidn __OUTPUT_FORMAT__,win32 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define ABI_IS_32BIT 1 251b362b15af34006e6a11974088a46d42b903418eJohann%elifidn __OUTPUT_FORMAT__,aout 261b362b15af34006e6a11974088a46d42b903418eJohann%define ABI_IS_32BIT 1 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define ABI_IS_32BIT 0 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%if ABI_IS_32BIT 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define rax eax 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define rbx ebx 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define rcx ecx 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define rdx edx 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define rsi esi 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define rdi edi 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define rsp esp 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define rbp ebp 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define movsxd mov 41538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber%macro movq 2 42538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %ifidn %1,eax 43538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber movd %1,%2 44538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %elifidn %2,eax 45538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber movd %1,%2 46538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %elifidn %1,ebx 47538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber movd %1,%2 48538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %elifidn %2,ebx 49538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber movd %1,%2 50538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %elifidn %1,ecx 51538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber movd %1,%2 52538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %elifidn %2,ecx 53538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber movd %1,%2 54538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %elifidn %1,edx 55538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber movd %1,%2 56538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %elifidn %2,edx 57538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber movd %1,%2 58538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %elifidn %1,esi 59538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber movd %1,%2 60538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %elifidn %2,esi 61538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber movd %1,%2 62538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %elifidn %1,edi 63538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber movd %1,%2 64538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %elifidn %2,edi 65538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber movd %1,%2 66538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %elifidn %1,esp 67538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber movd %1,%2 68538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %elifidn %2,esp 69538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber movd %1,%2 70538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %elifidn %1,ebp 71538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber movd %1,%2 72538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %elifidn %2,ebp 73538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber movd %1,%2 74538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %else 75538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber movq %1,%2 76538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %endif 77538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber%endmacro 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 81ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang; LIBVPX_YASM_WIN64 82ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang; Set LIBVPX_YASM_WIN64 if output is Windows 64bit so the code will work if x64 83ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang; or win64 is defined on the Yasm command line. 84ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang%ifidn __OUTPUT_FORMAT__,win64 85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang%define LIBVPX_YASM_WIN64 1 86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang%elifidn __OUTPUT_FORMAT__,x64 87ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang%define LIBVPX_YASM_WIN64 1 88ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang%else 89ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang%define LIBVPX_YASM_WIN64 0 90ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang%endif 91ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; sym() 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; Return the proper symbol name for the target ABI. 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; Certain ABIs, notably MS COFF and Darwin MACH-O, require that symbols 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; with C linkage be prefixed with an underscore. 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%ifidn __OUTPUT_FORMAT__,elf32 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define sym(x) x 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%elifidn __OUTPUT_FORMAT__,elf64 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define sym(x) x 1021b362b15af34006e6a11974088a46d42b903418eJohann%elifidn __OUTPUT_FORMAT__,elfx32 1031b362b15af34006e6a11974088a46d42b903418eJohann%define sym(x) x 104ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang%elif LIBVPX_YASM_WIN64 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define sym(x) x 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define sym(x) _ %+ x 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1101b362b15af34006e6a11974088a46d42b903418eJohann; PRIVATE 1111b362b15af34006e6a11974088a46d42b903418eJohann; Macro for the attribute to hide a global symbol for the target ABI. 1121b362b15af34006e6a11974088a46d42b903418eJohann; This is only active if CHROMIUM is defined. 1131b362b15af34006e6a11974088a46d42b903418eJohann; 1141b362b15af34006e6a11974088a46d42b903418eJohann; Chromium doesn't like exported global symbols due to symbol clashing with 1151b362b15af34006e6a11974088a46d42b903418eJohann; plugins among other things. 1161b362b15af34006e6a11974088a46d42b903418eJohann; 1171b362b15af34006e6a11974088a46d42b903418eJohann; Requires Chromium's patched copy of yasm: 1181b362b15af34006e6a11974088a46d42b903418eJohann; http://src.chromium.org/viewvc/chrome?view=rev&revision=73761 1191b362b15af34006e6a11974088a46d42b903418eJohann; http://www.tortall.net/projects/yasm/ticket/236 1201b362b15af34006e6a11974088a46d42b903418eJohann; 1211b362b15af34006e6a11974088a46d42b903418eJohann%ifdef CHROMIUM 1221b362b15af34006e6a11974088a46d42b903418eJohann %ifidn __OUTPUT_FORMAT__,elf32 1231b362b15af34006e6a11974088a46d42b903418eJohann %define PRIVATE :hidden 1241b362b15af34006e6a11974088a46d42b903418eJohann %elifidn __OUTPUT_FORMAT__,elf64 1251b362b15af34006e6a11974088a46d42b903418eJohann %define PRIVATE :hidden 1261b362b15af34006e6a11974088a46d42b903418eJohann %elifidn __OUTPUT_FORMAT__,elfx32 1271b362b15af34006e6a11974088a46d42b903418eJohann %define PRIVATE :hidden 128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang %elif LIBVPX_YASM_WIN64 1291b362b15af34006e6a11974088a46d42b903418eJohann %define PRIVATE 1301b362b15af34006e6a11974088a46d42b903418eJohann %else 1311b362b15af34006e6a11974088a46d42b903418eJohann %define PRIVATE :private_extern 1321b362b15af34006e6a11974088a46d42b903418eJohann %endif 1331b362b15af34006e6a11974088a46d42b903418eJohann%else 1341b362b15af34006e6a11974088a46d42b903418eJohann %define PRIVATE 1351b362b15af34006e6a11974088a46d42b903418eJohann%endif 1361b362b15af34006e6a11974088a46d42b903418eJohann 13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; arg() 13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; Return the address specification of the given argument 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%if ABI_IS_32BIT 14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %define arg(x) [ebp+8+4*x] 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else 14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; 64 bit ABI passes arguments in registers. This is a workaround to get up 14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; and running quickly. Relies on SHADOW_ARGS_TO_STACK 145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang %if LIBVPX_YASM_WIN64 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %define arg(x) [rbp+16+8*x] 14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %else 14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %define arg(x) [rbp-8-8*x] 14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; REG_SZ_BYTES, REG_SZ_BITS 15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; Size of a register 15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%if ABI_IS_32BIT 15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define REG_SZ_BYTES 4 15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define REG_SZ_BITS 32 15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else 15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define REG_SZ_BYTES 8 15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define REG_SZ_BITS 64 16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; ALIGN_STACK <alignment> <register> 16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; This macro aligns the stack to the given alignment (in bytes). The stack 16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; is left such that the previous value of the stack pointer is the first 16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; argument on the stack (ie, the inverse of this macro is 'pop rsp.') 16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; This macro uses one temporary register, which is not preserved, and thus 16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; must be specified as an argument. 16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%macro ALIGN_STACK 2 17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov %2, rsp 17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber and rsp, -%1 172f71323e297a928af368937089d3ed71239786f86Andreas Huber lea rsp, [rsp - (%1 - REG_SZ_BYTES)] 17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push %2 17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endmacro 17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; The Microsoft assembler tries to impose a certain amount of type safety in 17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; its register usage. YASM doesn't recognize these directives, so we just 18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; %define them away to maintain as much compatibility as possible with the 18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; original inline assembler we're porting from. 18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%idefine PTR 18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%idefine XMMWORD 18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%idefine MMWORD 18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; PIC macros 18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%if ABI_IS_32BIT 19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if CONFIG_PIC=1 19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %ifidn __OUTPUT_FORMAT__,elf32 1921b362b15af34006e6a11974088a46d42b903418eJohann %define GET_GOT_SAVE_ARG 1 19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %define WRT_PLT wrt ..plt 19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %macro GET_GOT 1 19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber extern _GLOBAL_OFFSET_TABLE_ 19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push %1 19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber call %%get_got 198f71323e297a928af368937089d3ed71239786f86Andreas Huber %%sub_offset: 199f71323e297a928af368937089d3ed71239786f86Andreas Huber jmp %%exitGG 20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %%get_got: 201f71323e297a928af368937089d3ed71239786f86Andreas Huber mov %1, [esp] 202f71323e297a928af368937089d3ed71239786f86Andreas Huber add %1, _GLOBAL_OFFSET_TABLE_ + $$ - %%sub_offset wrt ..gotpc 203f71323e297a928af368937089d3ed71239786f86Andreas Huber ret 204f71323e297a928af368937089d3ed71239786f86Andreas Huber %%exitGG: 20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %undef GLOBAL 206538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %define GLOBAL(x) x + %1 wrt ..gotoff 20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %undef RESTORE_GOT 20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %define RESTORE_GOT pop %1 20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endmacro 21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %elifidn __OUTPUT_FORMAT__,macho32 2111b362b15af34006e6a11974088a46d42b903418eJohann %define GET_GOT_SAVE_ARG 1 21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %macro GET_GOT 1 21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push %1 21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber call %%get_got 21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %%get_got: 21679f15823c34ae1e423108295e416213200bb280fAndreas Huber pop %1 21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %undef GLOBAL 21879f15823c34ae1e423108295e416213200bb280fAndreas Huber %define GLOBAL(x) x + %1 - %%get_got 21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %undef RESTORE_GOT 22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %define RESTORE_GOT pop %1 22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endmacro 22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 2241b362b15af34006e6a11974088a46d42b903418eJohann 2251b362b15af34006e6a11974088a46d42b903418eJohann %ifdef CHROMIUM 2261b362b15af34006e6a11974088a46d42b903418eJohann %ifidn __OUTPUT_FORMAT__,macho32 2271b362b15af34006e6a11974088a46d42b903418eJohann %define HIDDEN_DATA(x) x:private_extern 2281b362b15af34006e6a11974088a46d42b903418eJohann %else 2291b362b15af34006e6a11974088a46d42b903418eJohann %define HIDDEN_DATA(x) x 2301b362b15af34006e6a11974088a46d42b903418eJohann %endif 2311b362b15af34006e6a11974088a46d42b903418eJohann %else 2321b362b15af34006e6a11974088a46d42b903418eJohann %define HIDDEN_DATA(x) x 2331b362b15af34006e6a11974088a46d42b903418eJohann %endif 23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else 23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %macro GET_GOT 1 23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endmacro 237538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %define GLOBAL(x) rel x 23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %ifidn __OUTPUT_FORMAT__,elf64 23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %define WRT_PLT wrt ..plt 240f71323e297a928af368937089d3ed71239786f86Andreas Huber %define HIDDEN_DATA(x) x:data hidden 2411b362b15af34006e6a11974088a46d42b903418eJohann %elifidn __OUTPUT_FORMAT__,elfx32 2421b362b15af34006e6a11974088a46d42b903418eJohann %define WRT_PLT wrt ..plt 2431b362b15af34006e6a11974088a46d42b903418eJohann %define HIDDEN_DATA(x) x:data hidden 244ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang %elifidn __OUTPUT_FORMAT__,macho64 245ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang %ifdef CHROMIUM 246ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang %define HIDDEN_DATA(x) x:private_extern 247ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang %else 248ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang %define HIDDEN_DATA(x) x 249ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang %endif 250f71323e297a928af368937089d3ed71239786f86Andreas Huber %else 251f71323e297a928af368937089d3ed71239786f86Andreas Huber %define HIDDEN_DATA(x) x 25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%ifnmacro GET_GOT 25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %macro GET_GOT 1 25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endmacro 257538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %define GLOBAL(x) x 25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%ifndef RESTORE_GOT 26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define RESTORE_GOT 26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%ifndef WRT_PLT 26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define WRT_PLT 26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%if ABI_IS_32BIT 26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %macro SHADOW_ARGS_TO_STACK 1 26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endm 26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %define UNSHADOW_ARGS 27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else 271ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang%if LIBVPX_YASM_WIN64 27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %macro SHADOW_ARGS_TO_STACK 1 ; argc 27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 0 27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov arg(0),rcx 27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 1 27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov arg(1),rdx 27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 2 28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov arg(2),r8 28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 3 28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov arg(3),r9 28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endm 28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else 28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %macro SHADOW_ARGS_TO_STACK 1 ; argc 28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 0 28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push rdi 29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 1 29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push rsi 29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 2 29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push rdx 29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 3 29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push rcx 29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 4 30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push r8 30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 5 30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push r9 30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 6 307f71323e297a928af368937089d3ed71239786f86Andreas Huber %assign i %1-6 308f71323e297a928af368937089d3ed71239786f86Andreas Huber %assign off 16 309f71323e297a928af368937089d3ed71239786f86Andreas Huber %rep i 310f71323e297a928af368937089d3ed71239786f86Andreas Huber mov rax,[rbp+off] 31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push rax 312f71323e297a928af368937089d3ed71239786f86Andreas Huber %assign off off+8 313f71323e297a928af368937089d3ed71239786f86Andreas Huber %endrep 31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endm 31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %define UNSHADOW_ARGS mov rsp, rbp 31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3201b362b15af34006e6a11974088a46d42b903418eJohann; Win64 ABI requires that XMM6:XMM15 are callee saved 3211b362b15af34006e6a11974088a46d42b903418eJohann; SAVE_XMM n, [u] 3221b362b15af34006e6a11974088a46d42b903418eJohann; store registers 6-n on the stack 3231b362b15af34006e6a11974088a46d42b903418eJohann; if u is specified, use unaligned movs. 3241b362b15af34006e6a11974088a46d42b903418eJohann; Win64 ABI requires 16 byte stack alignment, but then pushes an 8 byte return 3251b362b15af34006e6a11974088a46d42b903418eJohann; value. Typically we follow this up with 'push rbp' - re-aligning the stack - 3261b362b15af34006e6a11974088a46d42b903418eJohann; but in some cases this is not done and unaligned movs must be used. 327ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang%if LIBVPX_YASM_WIN64 3281b362b15af34006e6a11974088a46d42b903418eJohann%macro SAVE_XMM 1-2 a 3291b362b15af34006e6a11974088a46d42b903418eJohann %if %1 < 6 3301b362b15af34006e6a11974088a46d42b903418eJohann %error Only xmm registers 6-15 must be preserved 3311b362b15af34006e6a11974088a46d42b903418eJohann %else 3321b362b15af34006e6a11974088a46d42b903418eJohann %assign last_xmm %1 3331b362b15af34006e6a11974088a46d42b903418eJohann %define movxmm movdq %+ %2 3341b362b15af34006e6a11974088a46d42b903418eJohann %assign xmm_stack_space ((last_xmm - 5) * 16) 3351b362b15af34006e6a11974088a46d42b903418eJohann sub rsp, xmm_stack_space 3361b362b15af34006e6a11974088a46d42b903418eJohann %assign i 6 3371b362b15af34006e6a11974088a46d42b903418eJohann %rep (last_xmm - 5) 3381b362b15af34006e6a11974088a46d42b903418eJohann movxmm [rsp + ((i - 6) * 16)], xmm %+ i 3391b362b15af34006e6a11974088a46d42b903418eJohann %assign i i+1 3401b362b15af34006e6a11974088a46d42b903418eJohann %endrep 3411b362b15af34006e6a11974088a46d42b903418eJohann %endif 342f71323e297a928af368937089d3ed71239786f86Andreas Huber%endmacro 343f71323e297a928af368937089d3ed71239786f86Andreas Huber%macro RESTORE_XMM 0 3441b362b15af34006e6a11974088a46d42b903418eJohann %ifndef last_xmm 3451b362b15af34006e6a11974088a46d42b903418eJohann %error RESTORE_XMM must be paired with SAVE_XMM n 3461b362b15af34006e6a11974088a46d42b903418eJohann %else 3471b362b15af34006e6a11974088a46d42b903418eJohann %assign i last_xmm 3481b362b15af34006e6a11974088a46d42b903418eJohann %rep (last_xmm - 5) 3491b362b15af34006e6a11974088a46d42b903418eJohann movxmm xmm %+ i, [rsp +((i - 6) * 16)] 3501b362b15af34006e6a11974088a46d42b903418eJohann %assign i i-1 3511b362b15af34006e6a11974088a46d42b903418eJohann %endrep 3521b362b15af34006e6a11974088a46d42b903418eJohann add rsp, xmm_stack_space 3531b362b15af34006e6a11974088a46d42b903418eJohann ; there are a couple functions which return from multiple places. 3541b362b15af34006e6a11974088a46d42b903418eJohann ; otherwise, we could uncomment these: 3551b362b15af34006e6a11974088a46d42b903418eJohann ; %undef last_xmm 3561b362b15af34006e6a11974088a46d42b903418eJohann ; %undef xmm_stack_space 3571b362b15af34006e6a11974088a46d42b903418eJohann ; %undef movxmm 3581b362b15af34006e6a11974088a46d42b903418eJohann %endif 359f71323e297a928af368937089d3ed71239786f86Andreas Huber%endmacro 360f71323e297a928af368937089d3ed71239786f86Andreas Huber%else 3611b362b15af34006e6a11974088a46d42b903418eJohann%macro SAVE_XMM 1-2 362f71323e297a928af368937089d3ed71239786f86Andreas Huber%endmacro 363f71323e297a928af368937089d3ed71239786f86Andreas Huber%macro RESTORE_XMM 0 364f71323e297a928af368937089d3ed71239786f86Andreas Huber%endmacro 365f71323e297a928af368937089d3ed71239786f86Andreas Huber%endif 36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; Name of the rodata section 36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; .rodata seems to be an elf-ism, as it doesn't work on OSX. 37090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%ifidn __OUTPUT_FORMAT__,macho64 37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define SECTION_RODATA section .text 37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%elifidn __OUTPUT_FORMAT__,macho32 37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%macro SECTION_RODATA 0 37590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersection .text 37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endmacro 3771b362b15af34006e6a11974088a46d42b903418eJohann%elifidn __OUTPUT_FORMAT__,aout 3781b362b15af34006e6a11974088a46d42b903418eJohann%define SECTION_RODATA section .data 37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else 38090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define SECTION_RODATA section .rodata 38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 382f71323e297a928af368937089d3ed71239786f86Andreas Huber 383f71323e297a928af368937089d3ed71239786f86Andreas Huber 384f71323e297a928af368937089d3ed71239786f86Andreas Huber; Tell GNU ld that we don't require an executable stack. 385f71323e297a928af368937089d3ed71239786f86Andreas Huber%ifidn __OUTPUT_FORMAT__,elf32 386f71323e297a928af368937089d3ed71239786f86Andreas Hubersection .note.GNU-stack noalloc noexec nowrite progbits 387f71323e297a928af368937089d3ed71239786f86Andreas Hubersection .text 388f71323e297a928af368937089d3ed71239786f86Andreas Huber%elifidn __OUTPUT_FORMAT__,elf64 389f71323e297a928af368937089d3ed71239786f86Andreas Hubersection .note.GNU-stack noalloc noexec nowrite progbits 390f71323e297a928af368937089d3ed71239786f86Andreas Hubersection .text 3911b362b15af34006e6a11974088a46d42b903418eJohann%elifidn __OUTPUT_FORMAT__,elfx32 3921b362b15af34006e6a11974088a46d42b903418eJohannsection .note.GNU-stack noalloc noexec nowrite progbits 3931b362b15af34006e6a11974088a46d42b903418eJohannsection .text 394f71323e297a928af368937089d3ed71239786f86Andreas Huber%endif 395f71323e297a928af368937089d3ed71239786f86Andreas Huber 396614a6a21483b59b4ab557785c160c8ca4722b062Johann; On Android platforms use lrand48 when building postproc routines. Prior to L 397614a6a21483b59b4ab557785c160c8ca4722b062Johann; rand() was not available. 398da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian%if CONFIG_POSTPROC=1 || CONFIG_VP9_POSTPROC=1 399614a6a21483b59b4ab557785c160c8ca4722b062Johann%ifdef __ANDROID__ 400614a6a21483b59b4ab557785c160c8ca4722b062Johannextern sym(lrand48) 401614a6a21483b59b4ab557785c160c8ca4722b062Johann%define LIBVPX_RAND lrand48 402614a6a21483b59b4ab557785c160c8ca4722b062Johann%else 403614a6a21483b59b4ab557785c160c8ca4722b062Johannextern sym(rand) 404614a6a21483b59b4ab557785c160c8ca4722b062Johann%define LIBVPX_RAND rand 405614a6a21483b59b4ab557785c160c8ca4722b062Johann%endif 406da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian%endif ; CONFIG_POSTPROC || CONFIG_VP9_POSTPROC 407