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 19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %define WRT_PLT wrt ..plt 19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %macro GET_GOT 1 19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber extern _GLOBAL_OFFSET_TABLE_ 19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push %1 19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber call %%get_got 197f71323e297a928af368937089d3ed71239786f86Andreas Huber %%sub_offset: 198f71323e297a928af368937089d3ed71239786f86Andreas Huber jmp %%exitGG 19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %%get_got: 200f71323e297a928af368937089d3ed71239786f86Andreas Huber mov %1, [esp] 201f71323e297a928af368937089d3ed71239786f86Andreas Huber add %1, _GLOBAL_OFFSET_TABLE_ + $$ - %%sub_offset wrt ..gotpc 202f71323e297a928af368937089d3ed71239786f86Andreas Huber ret 203f71323e297a928af368937089d3ed71239786f86Andreas Huber %%exitGG: 20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %undef GLOBAL 205538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %define GLOBAL(x) x + %1 wrt ..gotoff 20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %undef RESTORE_GOT 20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %define RESTORE_GOT pop %1 20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endmacro 20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %elifidn __OUTPUT_FORMAT__,macho32 21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %macro GET_GOT 1 21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push %1 21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber call %%get_got 21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %%get_got: 21479f15823c34ae1e423108295e416213200bb280fAndreas Huber pop %1 21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %undef GLOBAL 21679f15823c34ae1e423108295e416213200bb280fAndreas Huber %define GLOBAL(x) x + %1 - %%get_got 21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %undef RESTORE_GOT 21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %define RESTORE_GOT pop %1 21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endmacro 22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 2221b362b15af34006e6a11974088a46d42b903418eJohann 2231b362b15af34006e6a11974088a46d42b903418eJohann %ifdef CHROMIUM 2241b362b15af34006e6a11974088a46d42b903418eJohann %ifidn __OUTPUT_FORMAT__,macho32 2251b362b15af34006e6a11974088a46d42b903418eJohann %define HIDDEN_DATA(x) x:private_extern 2261b362b15af34006e6a11974088a46d42b903418eJohann %else 2271b362b15af34006e6a11974088a46d42b903418eJohann %define HIDDEN_DATA(x) x 2281b362b15af34006e6a11974088a46d42b903418eJohann %endif 2291b362b15af34006e6a11974088a46d42b903418eJohann %else 2301b362b15af34006e6a11974088a46d42b903418eJohann %define HIDDEN_DATA(x) x 2311b362b15af34006e6a11974088a46d42b903418eJohann %endif 23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else 23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %macro GET_GOT 1 23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endmacro 235538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %define GLOBAL(x) rel x 23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %ifidn __OUTPUT_FORMAT__,elf64 23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %define WRT_PLT wrt ..plt 238f71323e297a928af368937089d3ed71239786f86Andreas Huber %define HIDDEN_DATA(x) x:data hidden 2391b362b15af34006e6a11974088a46d42b903418eJohann %elifidn __OUTPUT_FORMAT__,elfx32 2401b362b15af34006e6a11974088a46d42b903418eJohann %define WRT_PLT wrt ..plt 2411b362b15af34006e6a11974088a46d42b903418eJohann %define HIDDEN_DATA(x) x:data hidden 242ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang %elifidn __OUTPUT_FORMAT__,macho64 243ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang %ifdef CHROMIUM 244ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang %define HIDDEN_DATA(x) x:private_extern 245ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang %else 246ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang %define HIDDEN_DATA(x) x 247ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang %endif 248f71323e297a928af368937089d3ed71239786f86Andreas Huber %else 249f71323e297a928af368937089d3ed71239786f86Andreas Huber %define HIDDEN_DATA(x) x 25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%ifnmacro GET_GOT 25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %macro GET_GOT 1 25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endmacro 255538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber %define GLOBAL(x) x 25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%ifndef RESTORE_GOT 25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define RESTORE_GOT 25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%ifndef WRT_PLT 26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define WRT_PLT 26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%if ABI_IS_32BIT 26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %macro SHADOW_ARGS_TO_STACK 1 26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endm 26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %define UNSHADOW_ARGS 26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else 269ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang%if LIBVPX_YASM_WIN64 27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %macro SHADOW_ARGS_TO_STACK 1 ; argc 27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 0 27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov arg(0),rcx 27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 1 27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov arg(1),rdx 27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 2 27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov arg(2),r8 27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 3 28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov arg(3),r9 28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endm 28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else 28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %macro SHADOW_ARGS_TO_STACK 1 ; argc 28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 0 28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push rdi 28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 1 29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push rsi 29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 2 29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push rdx 29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 3 29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push rcx 29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 4 29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push r8 30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 5 30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push r9 30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %if %1 > 6 305f71323e297a928af368937089d3ed71239786f86Andreas Huber %assign i %1-6 306f71323e297a928af368937089d3ed71239786f86Andreas Huber %assign off 16 307f71323e297a928af368937089d3ed71239786f86Andreas Huber %rep i 308f71323e297a928af368937089d3ed71239786f86Andreas Huber mov rax,[rbp+off] 30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push rax 310f71323e297a928af368937089d3ed71239786f86Andreas Huber %assign off off+8 311f71323e297a928af368937089d3ed71239786f86Andreas Huber %endrep 31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endif 31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %endm 31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %define UNSHADOW_ARGS mov rsp, rbp 31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3181b362b15af34006e6a11974088a46d42b903418eJohann; Win64 ABI requires that XMM6:XMM15 are callee saved 3191b362b15af34006e6a11974088a46d42b903418eJohann; SAVE_XMM n, [u] 3201b362b15af34006e6a11974088a46d42b903418eJohann; store registers 6-n on the stack 3211b362b15af34006e6a11974088a46d42b903418eJohann; if u is specified, use unaligned movs. 3221b362b15af34006e6a11974088a46d42b903418eJohann; Win64 ABI requires 16 byte stack alignment, but then pushes an 8 byte return 3231b362b15af34006e6a11974088a46d42b903418eJohann; value. Typically we follow this up with 'push rbp' - re-aligning the stack - 3241b362b15af34006e6a11974088a46d42b903418eJohann; but in some cases this is not done and unaligned movs must be used. 325ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang%if LIBVPX_YASM_WIN64 3261b362b15af34006e6a11974088a46d42b903418eJohann%macro SAVE_XMM 1-2 a 3271b362b15af34006e6a11974088a46d42b903418eJohann %if %1 < 6 3281b362b15af34006e6a11974088a46d42b903418eJohann %error Only xmm registers 6-15 must be preserved 3291b362b15af34006e6a11974088a46d42b903418eJohann %else 3301b362b15af34006e6a11974088a46d42b903418eJohann %assign last_xmm %1 3311b362b15af34006e6a11974088a46d42b903418eJohann %define movxmm movdq %+ %2 3321b362b15af34006e6a11974088a46d42b903418eJohann %assign xmm_stack_space ((last_xmm - 5) * 16) 3331b362b15af34006e6a11974088a46d42b903418eJohann sub rsp, xmm_stack_space 3341b362b15af34006e6a11974088a46d42b903418eJohann %assign i 6 3351b362b15af34006e6a11974088a46d42b903418eJohann %rep (last_xmm - 5) 3361b362b15af34006e6a11974088a46d42b903418eJohann movxmm [rsp + ((i - 6) * 16)], xmm %+ i 3371b362b15af34006e6a11974088a46d42b903418eJohann %assign i i+1 3381b362b15af34006e6a11974088a46d42b903418eJohann %endrep 3391b362b15af34006e6a11974088a46d42b903418eJohann %endif 340f71323e297a928af368937089d3ed71239786f86Andreas Huber%endmacro 341f71323e297a928af368937089d3ed71239786f86Andreas Huber%macro RESTORE_XMM 0 3421b362b15af34006e6a11974088a46d42b903418eJohann %ifndef last_xmm 3431b362b15af34006e6a11974088a46d42b903418eJohann %error RESTORE_XMM must be paired with SAVE_XMM n 3441b362b15af34006e6a11974088a46d42b903418eJohann %else 3451b362b15af34006e6a11974088a46d42b903418eJohann %assign i last_xmm 3461b362b15af34006e6a11974088a46d42b903418eJohann %rep (last_xmm - 5) 3471b362b15af34006e6a11974088a46d42b903418eJohann movxmm xmm %+ i, [rsp +((i - 6) * 16)] 3481b362b15af34006e6a11974088a46d42b903418eJohann %assign i i-1 3491b362b15af34006e6a11974088a46d42b903418eJohann %endrep 3501b362b15af34006e6a11974088a46d42b903418eJohann add rsp, xmm_stack_space 3511b362b15af34006e6a11974088a46d42b903418eJohann ; there are a couple functions which return from multiple places. 3521b362b15af34006e6a11974088a46d42b903418eJohann ; otherwise, we could uncomment these: 3531b362b15af34006e6a11974088a46d42b903418eJohann ; %undef last_xmm 3541b362b15af34006e6a11974088a46d42b903418eJohann ; %undef xmm_stack_space 3551b362b15af34006e6a11974088a46d42b903418eJohann ; %undef movxmm 3561b362b15af34006e6a11974088a46d42b903418eJohann %endif 357f71323e297a928af368937089d3ed71239786f86Andreas Huber%endmacro 358f71323e297a928af368937089d3ed71239786f86Andreas Huber%else 3591b362b15af34006e6a11974088a46d42b903418eJohann%macro SAVE_XMM 1-2 360f71323e297a928af368937089d3ed71239786f86Andreas Huber%endmacro 361f71323e297a928af368937089d3ed71239786f86Andreas Huber%macro RESTORE_XMM 0 362f71323e297a928af368937089d3ed71239786f86Andreas Huber%endmacro 363f71323e297a928af368937089d3ed71239786f86Andreas Huber%endif 36490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 36590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; Name of the rodata section 36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; .rodata seems to be an elf-ism, as it doesn't work on OSX. 36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%ifidn __OUTPUT_FORMAT__,macho64 37090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define SECTION_RODATA section .text 37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%elifidn __OUTPUT_FORMAT__,macho32 37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%macro SECTION_RODATA 0 37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersection .text 37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endmacro 3751b362b15af34006e6a11974088a46d42b903418eJohann%elifidn __OUTPUT_FORMAT__,aout 3761b362b15af34006e6a11974088a46d42b903418eJohann%define SECTION_RODATA section .data 37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else 37890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define SECTION_RODATA section .rodata 37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif 380f71323e297a928af368937089d3ed71239786f86Andreas Huber 381f71323e297a928af368937089d3ed71239786f86Andreas Huber 382f71323e297a928af368937089d3ed71239786f86Andreas Huber; Tell GNU ld that we don't require an executable stack. 383f71323e297a928af368937089d3ed71239786f86Andreas Huber%ifidn __OUTPUT_FORMAT__,elf32 384f71323e297a928af368937089d3ed71239786f86Andreas Hubersection .note.GNU-stack noalloc noexec nowrite progbits 385f71323e297a928af368937089d3ed71239786f86Andreas Hubersection .text 386f71323e297a928af368937089d3ed71239786f86Andreas Huber%elifidn __OUTPUT_FORMAT__,elf64 387f71323e297a928af368937089d3ed71239786f86Andreas Hubersection .note.GNU-stack noalloc noexec nowrite progbits 388f71323e297a928af368937089d3ed71239786f86Andreas Hubersection .text 3891b362b15af34006e6a11974088a46d42b903418eJohann%elifidn __OUTPUT_FORMAT__,elfx32 3901b362b15af34006e6a11974088a46d42b903418eJohannsection .note.GNU-stack noalloc noexec nowrite progbits 3911b362b15af34006e6a11974088a46d42b903418eJohannsection .text 392f71323e297a928af368937089d3ed71239786f86Andreas Huber%endif 393f71323e297a928af368937089d3ed71239786f86Andreas Huber 394614a6a21483b59b4ab557785c160c8ca4722b062Johann; On Android platforms use lrand48 when building postproc routines. Prior to L 395614a6a21483b59b4ab557785c160c8ca4722b062Johann; rand() was not available. 3967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian%if CONFIG_POSTPROC=1 || CONFIG_VP9_POSTPROC=1 397614a6a21483b59b4ab557785c160c8ca4722b062Johann%ifdef __ANDROID__ 398614a6a21483b59b4ab557785c160c8ca4722b062Johannextern sym(lrand48) 399614a6a21483b59b4ab557785c160c8ca4722b062Johann%define LIBVPX_RAND lrand48 400614a6a21483b59b4ab557785c160c8ca4722b062Johann%else 401614a6a21483b59b4ab557785c160c8ca4722b062Johannextern sym(rand) 402614a6a21483b59b4ab557785c160c8ca4722b062Johann%define LIBVPX_RAND rand 403614a6a21483b59b4ab557785c160c8ca4722b062Johann%endif 4047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian%endif ; CONFIG_POSTPROC || CONFIG_VP9_POSTPROC 405