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