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