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
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define ABI_IS_32BIT 0
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%if ABI_IS_32BIT
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define rax eax
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define rbx ebx
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define rcx ecx
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define rdx edx
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define rsi esi
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define rdi edi
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define rsp esp
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define rbp ebp
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define movsxd mov
39538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber%macro movq 2
40538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %ifidn %1,eax
41538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    movd %1,%2
42538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %elifidn %2,eax
43538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    movd %1,%2
44538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %elifidn %1,ebx
45538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    movd %1,%2
46538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %elifidn %2,ebx
47538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    movd %1,%2
48538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %elifidn %1,ecx
49538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    movd %1,%2
50538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %elifidn %2,ecx
51538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    movd %1,%2
52538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %elifidn %1,edx
53538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    movd %1,%2
54538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %elifidn %2,edx
55538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    movd %1,%2
56538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %elifidn %1,esi
57538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    movd %1,%2
58538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %elifidn %2,esi
59538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    movd %1,%2
60538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %elifidn %1,edi
61538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    movd %1,%2
62538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %elifidn %2,edi
63538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    movd %1,%2
64538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %elifidn %1,esp
65538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    movd %1,%2
66538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %elifidn %2,esp
67538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    movd %1,%2
68538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %elifidn %1,ebp
69538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    movd %1,%2
70538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %elifidn %2,ebp
71538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    movd %1,%2
72538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %else
73538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    movq %1,%2
74538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %endif
75538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber%endmacro
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; sym()
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; Return the proper symbol name for the target ABI.
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; Certain ABIs, notably MS COFF and Darwin MACH-O, require that symbols
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; with C linkage be prefixed with an underscore.
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%ifidn   __OUTPUT_FORMAT__,elf32
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define sym(x) x
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%elifidn __OUTPUT_FORMAT__,elf64
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define sym(x) x
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%elifidn __OUTPUT_FORMAT__,x64
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define sym(x) x
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define sym(x) _ %+ x
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; arg()
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; Return the address specification of the given argument
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%if ABI_IS_32BIT
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %define arg(x) [ebp+8+4*x]
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  ; 64 bit ABI passes arguments in registers. This is a workaround to get up
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  ; and running quickly. Relies on SHADOW_ARGS_TO_STACK
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %ifidn __OUTPUT_FORMAT__,x64
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %define arg(x) [rbp+16+8*x]
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %else
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %define arg(x) [rbp-8-8*x]
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %endif
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; REG_SZ_BYTES, REG_SZ_BITS
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; Size of a register
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%if ABI_IS_32BIT
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define REG_SZ_BYTES 4
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define REG_SZ_BITS  32
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define REG_SZ_BYTES 8
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define REG_SZ_BITS  64
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; ALIGN_STACK <alignment> <register>
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; This macro aligns the stack to the given alignment (in bytes). The stack
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; is left such that the previous value of the stack pointer is the first
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; argument on the stack (ie, the inverse of this macro is 'pop rsp.')
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; This macro uses one temporary register, which is not preserved, and thus
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; must be specified as an argument.
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%macro ALIGN_STACK 2
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mov         %2, rsp
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    and         rsp, -%1
130f71323e297a928af368937089d3ed71239786f86Andreas Huber    lea         rsp, [rsp - (%1 - REG_SZ_BYTES)]
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    push        %2
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endmacro
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; The Microsoft assembler tries to impose a certain amount of type safety in
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; its register usage. YASM doesn't recognize these directives, so we just
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; %define them away to maintain as much compatibility as possible with the
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; original inline assembler we're porting from.
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%idefine PTR
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%idefine XMMWORD
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%idefine MMWORD
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; PIC macros
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%if ABI_IS_32BIT
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %if CONFIG_PIC=1
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %ifidn __OUTPUT_FORMAT__,elf32
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %define WRT_PLT wrt ..plt
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %macro GET_GOT 1
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber      extern _GLOBAL_OFFSET_TABLE_
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber      push %1
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber      call %%get_got
155f71323e297a928af368937089d3ed71239786f86Andreas Huber      %%sub_offset:
156f71323e297a928af368937089d3ed71239786f86Andreas Huber      jmp %%exitGG
15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber      %%get_got:
158f71323e297a928af368937089d3ed71239786f86Andreas Huber      mov %1, [esp]
159f71323e297a928af368937089d3ed71239786f86Andreas Huber      add %1, _GLOBAL_OFFSET_TABLE_ + $$ - %%sub_offset wrt ..gotpc
160f71323e297a928af368937089d3ed71239786f86Andreas Huber      ret
161f71323e297a928af368937089d3ed71239786f86Andreas Huber      %%exitGG:
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber      %undef GLOBAL
163538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      %define GLOBAL(x) x + %1 wrt ..gotoff
16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber      %undef RESTORE_GOT
16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber      %define RESTORE_GOT pop %1
16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %endmacro
16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %elifidn __OUTPUT_FORMAT__,macho32
16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %macro GET_GOT 1
16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber      push %1
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber      call %%get_got
17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber      %%get_got:
17279f15823c34ae1e423108295e416213200bb280fAndreas Huber      pop  %1
17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber      %undef GLOBAL
17479f15823c34ae1e423108295e416213200bb280fAndreas Huber      %define GLOBAL(x) x + %1 - %%get_got
17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber      %undef RESTORE_GOT
17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber      %define RESTORE_GOT pop %1
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %endmacro
17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %endif
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %endif
180f71323e297a928af368937089d3ed71239786f86Andreas Huber  %define HIDDEN_DATA(x) x
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else
18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %macro GET_GOT 1
18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %endmacro
184538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  %define GLOBAL(x) rel x
18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %ifidn __OUTPUT_FORMAT__,elf64
18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %define WRT_PLT wrt ..plt
187f71323e297a928af368937089d3ed71239786f86Andreas Huber    %define HIDDEN_DATA(x) x:data hidden
188f71323e297a928af368937089d3ed71239786f86Andreas Huber  %else
189f71323e297a928af368937089d3ed71239786f86Andreas Huber    %define HIDDEN_DATA(x) x
19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %endif
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif
19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%ifnmacro GET_GOT
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %macro GET_GOT 1
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %endmacro
195538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    %define GLOBAL(x) x
19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%ifndef RESTORE_GOT
19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define RESTORE_GOT
19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif
20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%ifndef WRT_PLT
20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define WRT_PLT
20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif
20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%if ABI_IS_32BIT
20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %macro SHADOW_ARGS_TO_STACK 1
20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %endm
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %define UNSHADOW_ARGS
20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else
20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%ifidn __OUTPUT_FORMAT__,x64
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %macro SHADOW_ARGS_TO_STACK 1 ; argc
21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %if %1 > 0
21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mov arg(0),rcx
21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %endif
21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %if %1 > 1
21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mov arg(1),rdx
21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %endif
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %if %1 > 2
21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mov arg(2),r8
21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %endif
22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %if %1 > 3
22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mov arg(3),r9
22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %endif
22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %endm
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %macro SHADOW_ARGS_TO_STACK 1 ; argc
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %if %1 > 0
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        push rdi
22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %endif
22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %if %1 > 1
23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        push rsi
23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %endif
23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %if %1 > 2
23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        push rdx
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %endif
23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %if %1 > 3
23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        push rcx
23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %endif
23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %if %1 > 4
23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        push r8
24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %endif
24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %if %1 > 5
24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        push r9
24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %endif
24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %if %1 > 6
245f71323e297a928af368937089d3ed71239786f86Andreas Huber      %assign i %1-6
246f71323e297a928af368937089d3ed71239786f86Andreas Huber      %assign off 16
247f71323e297a928af368937089d3ed71239786f86Andreas Huber      %rep i
248f71323e297a928af368937089d3ed71239786f86Andreas Huber        mov rax,[rbp+off]
24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        push rax
250f71323e297a928af368937089d3ed71239786f86Andreas Huber        %assign off off+8
251f71323e297a928af368937089d3ed71239786f86Andreas Huber      %endrep
25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    %endif
25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %endm
25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif
25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber  %define UNSHADOW_ARGS mov rsp, rbp
25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif
25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
258f71323e297a928af368937089d3ed71239786f86Andreas Huber; must keep XMM6:XMM15 (libvpx uses XMM6 and XMM7) on Win64 ABI
259f71323e297a928af368937089d3ed71239786f86Andreas Huber; rsp register has to be aligned
260f71323e297a928af368937089d3ed71239786f86Andreas Huber%ifidn __OUTPUT_FORMAT__,x64
261f71323e297a928af368937089d3ed71239786f86Andreas Huber%macro SAVE_XMM 0
262f71323e297a928af368937089d3ed71239786f86Andreas Huber  sub rsp, 32
263f71323e297a928af368937089d3ed71239786f86Andreas Huber  movdqa XMMWORD PTR [rsp], xmm6
264f71323e297a928af368937089d3ed71239786f86Andreas Huber  movdqa XMMWORD PTR [rsp+16], xmm7
265f71323e297a928af368937089d3ed71239786f86Andreas Huber%endmacro
266f71323e297a928af368937089d3ed71239786f86Andreas Huber%macro RESTORE_XMM 0
267f71323e297a928af368937089d3ed71239786f86Andreas Huber  movdqa xmm6, XMMWORD PTR [rsp]
268f71323e297a928af368937089d3ed71239786f86Andreas Huber  movdqa xmm7, XMMWORD PTR [rsp+16]
269f71323e297a928af368937089d3ed71239786f86Andreas Huber  add rsp, 32
270f71323e297a928af368937089d3ed71239786f86Andreas Huber%endmacro
271f71323e297a928af368937089d3ed71239786f86Andreas Huber%else
272f71323e297a928af368937089d3ed71239786f86Andreas Huber%macro SAVE_XMM 0
273f71323e297a928af368937089d3ed71239786f86Andreas Huber%endmacro
274f71323e297a928af368937089d3ed71239786f86Andreas Huber%macro RESTORE_XMM 0
275f71323e297a928af368937089d3ed71239786f86Andreas Huber%endmacro
276f71323e297a928af368937089d3ed71239786f86Andreas Huber%endif
27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; Name of the rodata section
27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;
28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; .rodata seems to be an elf-ism, as it doesn't work on OSX.
28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;
28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%ifidn __OUTPUT_FORMAT__,macho64
28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define SECTION_RODATA section .text
28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%elifidn __OUTPUT_FORMAT__,macho32
28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%macro SECTION_RODATA 0
28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersection .text
28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endmacro
28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%else
28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%define SECTION_RODATA section .rodata
29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber%endif
291f71323e297a928af368937089d3ed71239786f86Andreas Huber
292f71323e297a928af368937089d3ed71239786f86Andreas Huber
293f71323e297a928af368937089d3ed71239786f86Andreas Huber; Tell GNU ld that we don't require an executable stack.
294f71323e297a928af368937089d3ed71239786f86Andreas Huber%ifidn __OUTPUT_FORMAT__,elf32
295f71323e297a928af368937089d3ed71239786f86Andreas Hubersection .note.GNU-stack noalloc noexec nowrite progbits
296f71323e297a928af368937089d3ed71239786f86Andreas Hubersection .text
297f71323e297a928af368937089d3ed71239786f86Andreas Huber%elifidn __OUTPUT_FORMAT__,elf64
298f71323e297a928af368937089d3ed71239786f86Andreas Hubersection .note.GNU-stack noalloc noexec nowrite progbits
299f71323e297a928af368937089d3ed71239786f86Andreas Hubersection .text
300f71323e297a928af368937089d3ed71239786f86Andreas Huber%endif
301f71323e297a928af368937089d3ed71239786f86Andreas Huber
302