1*dfc6aa5cSAndroid Build Coastguard Worker; 2*dfc6aa5cSAndroid Build Coastguard Worker; jsimdext.inc - common declarations 3*dfc6aa5cSAndroid Build Coastguard Worker; 4*dfc6aa5cSAndroid Build Coastguard Worker; Copyright 2009 Pierre Ossman <[email protected]> for Cendio AB 5*dfc6aa5cSAndroid Build Coastguard Worker; Copyright (C) 2010, 2016, 2018-2019, D. R. Commander. 6*dfc6aa5cSAndroid Build Coastguard Worker; Copyright (C) 2018, Matthieu Darbois. 7*dfc6aa5cSAndroid Build Coastguard Worker; Copyright (C) 2018, Matthias Räncker. 8*dfc6aa5cSAndroid Build Coastguard Worker; 9*dfc6aa5cSAndroid Build Coastguard Worker; Based on the x86 SIMD extension for IJG JPEG library - version 1.02 10*dfc6aa5cSAndroid Build Coastguard Worker; 11*dfc6aa5cSAndroid Build Coastguard Worker; Copyright (C) 1999-2006, MIYASAKA Masaru. 12*dfc6aa5cSAndroid Build Coastguard Worker; 13*dfc6aa5cSAndroid Build Coastguard Worker; This software is provided 'as-is', without any express or implied 14*dfc6aa5cSAndroid Build Coastguard Worker; warranty. In no event will the authors be held liable for any damages 15*dfc6aa5cSAndroid Build Coastguard Worker; arising from the use of this software. 16*dfc6aa5cSAndroid Build Coastguard Worker; 17*dfc6aa5cSAndroid Build Coastguard Worker; Permission is granted to anyone to use this software for any purpose, 18*dfc6aa5cSAndroid Build Coastguard Worker; including commercial applications, and to alter it and redistribute it 19*dfc6aa5cSAndroid Build Coastguard Worker; freely, subject to the following restrictions: 20*dfc6aa5cSAndroid Build Coastguard Worker; 21*dfc6aa5cSAndroid Build Coastguard Worker; 1. The origin of this software must not be misrepresented; you must not 22*dfc6aa5cSAndroid Build Coastguard Worker; claim that you wrote the original software. If you use this software 23*dfc6aa5cSAndroid Build Coastguard Worker; in a product, an acknowledgment in the product documentation would be 24*dfc6aa5cSAndroid Build Coastguard Worker; appreciated but is not required. 25*dfc6aa5cSAndroid Build Coastguard Worker; 2. Altered source versions must be plainly marked as such, and must not be 26*dfc6aa5cSAndroid Build Coastguard Worker; misrepresented as being the original software. 27*dfc6aa5cSAndroid Build Coastguard Worker; 3. This notice may not be removed or altered from any source distribution. 28*dfc6aa5cSAndroid Build Coastguard Worker 29*dfc6aa5cSAndroid Build Coastguard Worker; ========================================================================== 30*dfc6aa5cSAndroid Build Coastguard Worker; System-dependent configurations 31*dfc6aa5cSAndroid Build Coastguard Worker 32*dfc6aa5cSAndroid Build Coastguard Worker%ifdef WIN32 ; ----(nasm -fwin32 -DWIN32 ...)-------- 33*dfc6aa5cSAndroid Build Coastguard Worker; * Microsoft Visual C++ 34*dfc6aa5cSAndroid Build Coastguard Worker; * MinGW (Minimalist GNU for Windows) 35*dfc6aa5cSAndroid Build Coastguard Worker; * CygWin 36*dfc6aa5cSAndroid Build Coastguard Worker; * LCC-Win32 37*dfc6aa5cSAndroid Build Coastguard Worker 38*dfc6aa5cSAndroid Build Coastguard Worker; -- segment definition -- 39*dfc6aa5cSAndroid Build Coastguard Worker; 40*dfc6aa5cSAndroid Build Coastguard Worker%ifdef __YASM_VER__ 41*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_TEXT .text align=32 42*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_CONST .rdata align=32 43*dfc6aa5cSAndroid Build Coastguard Worker%else 44*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_TEXT .text align=32 public use32 class=CODE 45*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_CONST .rdata align=32 public use32 class=CONST 46*dfc6aa5cSAndroid Build Coastguard Worker%endif 47*dfc6aa5cSAndroid Build Coastguard Worker 48*dfc6aa5cSAndroid Build Coastguard Worker%elifdef WIN64 ; ----(nasm -fwin64 -DWIN64 ...)-------- 49*dfc6aa5cSAndroid Build Coastguard Worker; * Microsoft Visual C++ 50*dfc6aa5cSAndroid Build Coastguard Worker 51*dfc6aa5cSAndroid Build Coastguard Worker; -- segment definition -- 52*dfc6aa5cSAndroid Build Coastguard Worker; 53*dfc6aa5cSAndroid Build Coastguard Worker%ifdef __YASM_VER__ 54*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_TEXT .text align=32 55*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_CONST .rdata align=32 56*dfc6aa5cSAndroid Build Coastguard Worker%else 57*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_TEXT .text align=32 public use64 class=CODE 58*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_CONST .rdata align=32 public use64 class=CONST 59*dfc6aa5cSAndroid Build Coastguard Worker%endif 60*dfc6aa5cSAndroid Build Coastguard Worker%define EXTN(name) name ; foo() -> foo 61*dfc6aa5cSAndroid Build Coastguard Worker 62*dfc6aa5cSAndroid Build Coastguard Worker%elifdef OBJ32 ; ----(nasm -fobj -DOBJ32 ...)---------- 63*dfc6aa5cSAndroid Build Coastguard Worker; * Borland C++ (Win32) 64*dfc6aa5cSAndroid Build Coastguard Worker 65*dfc6aa5cSAndroid Build Coastguard Worker; -- segment definition -- 66*dfc6aa5cSAndroid Build Coastguard Worker; 67*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_TEXT _text align=32 public use32 class=CODE 68*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_CONST _data align=32 public use32 class=DATA 69*dfc6aa5cSAndroid Build Coastguard Worker 70*dfc6aa5cSAndroid Build Coastguard Worker%elifdef ELF ; ----(nasm -felf[64] -DELF ...)------------ 71*dfc6aa5cSAndroid Build Coastguard Worker; * Linux 72*dfc6aa5cSAndroid Build Coastguard Worker; * *BSD family Unix using elf format 73*dfc6aa5cSAndroid Build Coastguard Worker; * Unix System V, including Solaris x86, UnixWare and SCO Unix 74*dfc6aa5cSAndroid Build Coastguard Worker 75*dfc6aa5cSAndroid Build Coastguard Worker; mark stack as non-executable 76*dfc6aa5cSAndroid Build Coastguard Workersection .note.GNU-stack noalloc noexec nowrite progbits 77*dfc6aa5cSAndroid Build Coastguard Worker 78*dfc6aa5cSAndroid Build Coastguard Worker; -- segment definition -- 79*dfc6aa5cSAndroid Build Coastguard Worker; 80*dfc6aa5cSAndroid Build Coastguard Worker%ifdef __x86_64__ 81*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_TEXT .text progbits align=32 82*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_CONST .rodata progbits align=32 83*dfc6aa5cSAndroid Build Coastguard Worker%else 84*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_TEXT .text progbits alloc exec nowrite align=32 85*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_CONST .rodata progbits alloc noexec nowrite align=32 86*dfc6aa5cSAndroid Build Coastguard Worker%endif 87*dfc6aa5cSAndroid Build Coastguard Worker 88*dfc6aa5cSAndroid Build Coastguard Worker; To make the code position-independent, append -DPIC to the commandline 89*dfc6aa5cSAndroid Build Coastguard Worker; 90*dfc6aa5cSAndroid Build Coastguard Worker%define GOT_SYMBOL _GLOBAL_OFFSET_TABLE_ ; ELF supports PIC 91*dfc6aa5cSAndroid Build Coastguard Worker%define EXTN(name) name ; foo() -> foo 92*dfc6aa5cSAndroid Build Coastguard Worker 93*dfc6aa5cSAndroid Build Coastguard Worker%elifdef AOUT ; ----(nasm -faoutb/aout -DAOUT ...)---- 94*dfc6aa5cSAndroid Build Coastguard Worker; * Older Linux using a.out format (nasm -f aout -DAOUT ...) 95*dfc6aa5cSAndroid Build Coastguard Worker; * *BSD family Unix using a.out format (nasm -f aoutb -DAOUT ...) 96*dfc6aa5cSAndroid Build Coastguard Worker 97*dfc6aa5cSAndroid Build Coastguard Worker; -- segment definition -- 98*dfc6aa5cSAndroid Build Coastguard Worker; 99*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_TEXT .text 100*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_CONST .data 101*dfc6aa5cSAndroid Build Coastguard Worker 102*dfc6aa5cSAndroid Build Coastguard Worker; To make the code position-independent, append -DPIC to the commandline 103*dfc6aa5cSAndroid Build Coastguard Worker; 104*dfc6aa5cSAndroid Build Coastguard Worker%define GOT_SYMBOL __GLOBAL_OFFSET_TABLE_ ; BSD-style a.out supports PIC 105*dfc6aa5cSAndroid Build Coastguard Worker 106*dfc6aa5cSAndroid Build Coastguard Worker%elifdef MACHO ; ----(nasm -fmacho -DMACHO ...)-------- 107*dfc6aa5cSAndroid Build Coastguard Worker; * NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (Mach-O format) 108*dfc6aa5cSAndroid Build Coastguard Worker 109*dfc6aa5cSAndroid Build Coastguard Worker; -- segment definition -- 110*dfc6aa5cSAndroid Build Coastguard Worker; 111*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_TEXT .text ;align=32 ; nasm doesn't accept align=32. why? 112*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_CONST .rodata align=32 113*dfc6aa5cSAndroid Build Coastguard Worker 114*dfc6aa5cSAndroid Build Coastguard Worker; The generation of position-independent code (PIC) is the default on Darwin. 115*dfc6aa5cSAndroid Build Coastguard Worker; 116*dfc6aa5cSAndroid Build Coastguard Worker%define PIC 117*dfc6aa5cSAndroid Build Coastguard Worker%define GOT_SYMBOL _MACHO_PIC_ ; Mach-O style code-relative addressing 118*dfc6aa5cSAndroid Build Coastguard Worker 119*dfc6aa5cSAndroid Build Coastguard Worker%else ; ----(Other case)---------------------- 120*dfc6aa5cSAndroid Build Coastguard Worker 121*dfc6aa5cSAndroid Build Coastguard Worker; -- segment definition -- 122*dfc6aa5cSAndroid Build Coastguard Worker; 123*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_TEXT .text 124*dfc6aa5cSAndroid Build Coastguard Worker%define SEG_CONST .data 125*dfc6aa5cSAndroid Build Coastguard Worker 126*dfc6aa5cSAndroid Build Coastguard Worker%endif ; ---------------------------------------------- 127*dfc6aa5cSAndroid Build Coastguard Worker 128*dfc6aa5cSAndroid Build Coastguard Worker; ========================================================================== 129*dfc6aa5cSAndroid Build Coastguard Worker 130*dfc6aa5cSAndroid Build Coastguard Worker; -------------------------------------------------------------------------- 131*dfc6aa5cSAndroid Build Coastguard Worker; Common types 132*dfc6aa5cSAndroid Build Coastguard Worker; 133*dfc6aa5cSAndroid Build Coastguard Worker%ifdef __x86_64__ 134*dfc6aa5cSAndroid Build Coastguard Worker%ifnidn __OUTPUT_FORMAT__, elfx32 135*dfc6aa5cSAndroid Build Coastguard Worker%define POINTER qword ; general pointer type 136*dfc6aa5cSAndroid Build Coastguard Worker%define SIZEOF_POINTER SIZEOF_QWORD ; sizeof(POINTER) 137*dfc6aa5cSAndroid Build Coastguard Worker%define POINTER_BIT QWORD_BIT ; sizeof(POINTER)*BYTE_BIT 138*dfc6aa5cSAndroid Build Coastguard Worker%define resp resq 139*dfc6aa5cSAndroid Build Coastguard Worker%define dp dq 140*dfc6aa5cSAndroid Build Coastguard Worker%define raxp rax 141*dfc6aa5cSAndroid Build Coastguard Worker%define rbxp rbx 142*dfc6aa5cSAndroid Build Coastguard Worker%define rcxp rcx 143*dfc6aa5cSAndroid Build Coastguard Worker%define rdxp rdx 144*dfc6aa5cSAndroid Build Coastguard Worker%define rsip rsi 145*dfc6aa5cSAndroid Build Coastguard Worker%define rdip rdi 146*dfc6aa5cSAndroid Build Coastguard Worker%define rbpp rbp 147*dfc6aa5cSAndroid Build Coastguard Worker%define rspp rsp 148*dfc6aa5cSAndroid Build Coastguard Worker%define r8p r8 149*dfc6aa5cSAndroid Build Coastguard Worker%define r9p r9 150*dfc6aa5cSAndroid Build Coastguard Worker%define r10p r10 151*dfc6aa5cSAndroid Build Coastguard Worker%define r11p r11 152*dfc6aa5cSAndroid Build Coastguard Worker%define r12p r12 153*dfc6aa5cSAndroid Build Coastguard Worker%define r13p r13 154*dfc6aa5cSAndroid Build Coastguard Worker%define r14p r14 155*dfc6aa5cSAndroid Build Coastguard Worker%define r15p r15 156*dfc6aa5cSAndroid Build Coastguard Worker%endif 157*dfc6aa5cSAndroid Build Coastguard Worker%endif 158*dfc6aa5cSAndroid Build Coastguard Worker%ifndef raxp 159*dfc6aa5cSAndroid Build Coastguard Worker%define POINTER dword ; general pointer type 160*dfc6aa5cSAndroid Build Coastguard Worker%define SIZEOF_POINTER SIZEOF_DWORD ; sizeof(POINTER) 161*dfc6aa5cSAndroid Build Coastguard Worker%define POINTER_BIT DWORD_BIT ; sizeof(POINTER)*BYTE_BIT 162*dfc6aa5cSAndroid Build Coastguard Worker%define resp resd 163*dfc6aa5cSAndroid Build Coastguard Worker%define dp dd 164*dfc6aa5cSAndroid Build Coastguard Worker; x86_64 ILP32 ABI (x32) 165*dfc6aa5cSAndroid Build Coastguard Worker%define raxp eax 166*dfc6aa5cSAndroid Build Coastguard Worker%define rbxp ebx 167*dfc6aa5cSAndroid Build Coastguard Worker%define rcxp ecx 168*dfc6aa5cSAndroid Build Coastguard Worker%define rdxp edx 169*dfc6aa5cSAndroid Build Coastguard Worker%define rsip esi 170*dfc6aa5cSAndroid Build Coastguard Worker%define rdip edi 171*dfc6aa5cSAndroid Build Coastguard Worker%define rbpp ebp 172*dfc6aa5cSAndroid Build Coastguard Worker%define rspp esp 173*dfc6aa5cSAndroid Build Coastguard Worker%define r8p r8d 174*dfc6aa5cSAndroid Build Coastguard Worker%define r9p r9d 175*dfc6aa5cSAndroid Build Coastguard Worker%define r10p r10d 176*dfc6aa5cSAndroid Build Coastguard Worker%define r11p r11d 177*dfc6aa5cSAndroid Build Coastguard Worker%define r12p r12d 178*dfc6aa5cSAndroid Build Coastguard Worker%define r13p r13d 179*dfc6aa5cSAndroid Build Coastguard Worker%define r14p r14d 180*dfc6aa5cSAndroid Build Coastguard Worker%define r15p r15d 181*dfc6aa5cSAndroid Build Coastguard Worker%endif 182*dfc6aa5cSAndroid Build Coastguard Worker 183*dfc6aa5cSAndroid Build Coastguard Worker%define INT dword ; signed integer type 184*dfc6aa5cSAndroid Build Coastguard Worker%define SIZEOF_INT SIZEOF_DWORD ; sizeof(INT) 185*dfc6aa5cSAndroid Build Coastguard Worker%define INT_BIT DWORD_BIT ; sizeof(INT)*BYTE_BIT 186*dfc6aa5cSAndroid Build Coastguard Worker 187*dfc6aa5cSAndroid Build Coastguard Worker%define FP32 dword ; IEEE754 single 188*dfc6aa5cSAndroid Build Coastguard Worker%define SIZEOF_FP32 SIZEOF_DWORD ; sizeof(FP32) 189*dfc6aa5cSAndroid Build Coastguard Worker%define FP32_BIT DWORD_BIT ; sizeof(FP32)*BYTE_BIT 190*dfc6aa5cSAndroid Build Coastguard Worker 191*dfc6aa5cSAndroid Build Coastguard Worker%define MMWORD qword ; int64 (MMX register) 192*dfc6aa5cSAndroid Build Coastguard Worker%define SIZEOF_MMWORD SIZEOF_QWORD ; sizeof(MMWORD) 193*dfc6aa5cSAndroid Build Coastguard Worker%define MMWORD_BIT QWORD_BIT ; sizeof(MMWORD)*BYTE_BIT 194*dfc6aa5cSAndroid Build Coastguard Worker 195*dfc6aa5cSAndroid Build Coastguard Worker; NASM is buggy and doesn't properly handle operand sizes for SSE 196*dfc6aa5cSAndroid Build Coastguard Worker; instructions, so for now we have to define XMMWORD as blank. 197*dfc6aa5cSAndroid Build Coastguard Worker%define XMMWORD ; int128 (SSE register) 198*dfc6aa5cSAndroid Build Coastguard Worker%define SIZEOF_XMMWORD SIZEOF_OWORD ; sizeof(XMMWORD) 199*dfc6aa5cSAndroid Build Coastguard Worker%define XMMWORD_BIT OWORD_BIT ; sizeof(XMMWORD)*BYTE_BIT 200*dfc6aa5cSAndroid Build Coastguard Worker 201*dfc6aa5cSAndroid Build Coastguard Worker%define YMMWORD ; int256 (AVX register) 202*dfc6aa5cSAndroid Build Coastguard Worker%define SIZEOF_YMMWORD SIZEOF_YWORD ; sizeof(YMMWORD) 203*dfc6aa5cSAndroid Build Coastguard Worker%define YMMWORD_BIT YWORD_BIT ; sizeof(YMMWORD)*BYTE_BIT 204*dfc6aa5cSAndroid Build Coastguard Worker 205*dfc6aa5cSAndroid Build Coastguard Worker; Similar hacks for when we load a dword or MMWORD into an xmm# register 206*dfc6aa5cSAndroid Build Coastguard Worker%define XMM_DWORD 207*dfc6aa5cSAndroid Build Coastguard Worker%define XMM_MMWORD 208*dfc6aa5cSAndroid Build Coastguard Worker 209*dfc6aa5cSAndroid Build Coastguard Worker%define SIZEOF_BYTE 1 ; sizeof(byte) 210*dfc6aa5cSAndroid Build Coastguard Worker%define SIZEOF_WORD 2 ; sizeof(word) 211*dfc6aa5cSAndroid Build Coastguard Worker%define SIZEOF_DWORD 4 ; sizeof(dword) 212*dfc6aa5cSAndroid Build Coastguard Worker%define SIZEOF_QWORD 8 ; sizeof(qword) 213*dfc6aa5cSAndroid Build Coastguard Worker%define SIZEOF_OWORD 16 ; sizeof(oword) 214*dfc6aa5cSAndroid Build Coastguard Worker%define SIZEOF_YWORD 32 ; sizeof(yword) 215*dfc6aa5cSAndroid Build Coastguard Worker 216*dfc6aa5cSAndroid Build Coastguard Worker%define BYTE_BIT 8 ; CHAR_BIT in C 217*dfc6aa5cSAndroid Build Coastguard Worker%define WORD_BIT 16 ; sizeof(word)*BYTE_BIT 218*dfc6aa5cSAndroid Build Coastguard Worker%define DWORD_BIT 32 ; sizeof(dword)*BYTE_BIT 219*dfc6aa5cSAndroid Build Coastguard Worker%define QWORD_BIT 64 ; sizeof(qword)*BYTE_BIT 220*dfc6aa5cSAndroid Build Coastguard Worker%define OWORD_BIT 128 ; sizeof(oword)*BYTE_BIT 221*dfc6aa5cSAndroid Build Coastguard Worker%define YWORD_BIT 256 ; sizeof(yword)*BYTE_BIT 222*dfc6aa5cSAndroid Build Coastguard Worker 223*dfc6aa5cSAndroid Build Coastguard Worker; -------------------------------------------------------------------------- 224*dfc6aa5cSAndroid Build Coastguard Worker; External Symbol Name 225*dfc6aa5cSAndroid Build Coastguard Worker; 226*dfc6aa5cSAndroid Build Coastguard Worker%ifndef EXTN 227*dfc6aa5cSAndroid Build Coastguard Worker%define EXTN(name) _ %+ name ; foo() -> _foo 228*dfc6aa5cSAndroid Build Coastguard Worker%endif 229*dfc6aa5cSAndroid Build Coastguard Worker 230*dfc6aa5cSAndroid Build Coastguard Worker; -------------------------------------------------------------------------- 231*dfc6aa5cSAndroid Build Coastguard Worker; Hidden symbols 232*dfc6aa5cSAndroid Build Coastguard Worker; 233*dfc6aa5cSAndroid Build Coastguard Worker%ifdef ELF ; ----(nasm -felf[64] -DELF ...)-------- 234*dfc6aa5cSAndroid Build Coastguard Worker%define GLOBAL_FUNCTION(name) global EXTN(name):function hidden 235*dfc6aa5cSAndroid Build Coastguard Worker%define GLOBAL_DATA(name) global EXTN(name):data hidden 236*dfc6aa5cSAndroid Build Coastguard Worker%elifdef MACHO ; ----(nasm -fmacho -DMACHO ...)-------- 237*dfc6aa5cSAndroid Build Coastguard Worker%ifdef __YASM_VER__ 238*dfc6aa5cSAndroid Build Coastguard Worker%define GLOBAL_FUNCTION(name) global EXTN(name):private_extern 239*dfc6aa5cSAndroid Build Coastguard Worker%define GLOBAL_DATA(name) global EXTN(name):private_extern 240*dfc6aa5cSAndroid Build Coastguard Worker%else 241*dfc6aa5cSAndroid Build Coastguard Worker%if __NASM_VERSION_ID__ >= 0x020E0000 242*dfc6aa5cSAndroid Build Coastguard Worker%define GLOBAL_FUNCTION(name) global EXTN(name):private_extern 243*dfc6aa5cSAndroid Build Coastguard Worker%define GLOBAL_DATA(name) global EXTN(name):private_extern 244*dfc6aa5cSAndroid Build Coastguard Worker%endif 245*dfc6aa5cSAndroid Build Coastguard Worker%endif 246*dfc6aa5cSAndroid Build Coastguard Worker%endif 247*dfc6aa5cSAndroid Build Coastguard Worker 248*dfc6aa5cSAndroid Build Coastguard Worker%ifndef GLOBAL_FUNCTION 249*dfc6aa5cSAndroid Build Coastguard Worker%define GLOBAL_FUNCTION(name) global EXTN(name) 250*dfc6aa5cSAndroid Build Coastguard Worker%endif 251*dfc6aa5cSAndroid Build Coastguard Worker%ifndef GLOBAL_DATA 252*dfc6aa5cSAndroid Build Coastguard Worker%define GLOBAL_DATA(name) global EXTN(name) 253*dfc6aa5cSAndroid Build Coastguard Worker%endif 254*dfc6aa5cSAndroid Build Coastguard Worker 255*dfc6aa5cSAndroid Build Coastguard Worker; -------------------------------------------------------------------------- 256*dfc6aa5cSAndroid Build Coastguard Worker; Macros for position-independent code (PIC) support 257*dfc6aa5cSAndroid Build Coastguard Worker; 258*dfc6aa5cSAndroid Build Coastguard Worker%ifndef GOT_SYMBOL 259*dfc6aa5cSAndroid Build Coastguard Worker%undef PIC 260*dfc6aa5cSAndroid Build Coastguard Worker%endif 261*dfc6aa5cSAndroid Build Coastguard Worker 262*dfc6aa5cSAndroid Build Coastguard Worker%ifdef PIC ; ------------------------------------------- 263*dfc6aa5cSAndroid Build Coastguard Worker 264*dfc6aa5cSAndroid Build Coastguard Worker%ifidn GOT_SYMBOL, _MACHO_PIC_ ; -------------------- 265*dfc6aa5cSAndroid Build Coastguard Worker 266*dfc6aa5cSAndroid Build Coastguard Worker; At present, nasm doesn't seem to support PIC generation for Mach-O. 267*dfc6aa5cSAndroid Build Coastguard Worker; The PIC support code below is a little tricky. 268*dfc6aa5cSAndroid Build Coastguard Worker 269*dfc6aa5cSAndroid Build Coastguard Worker SECTION SEG_CONST 270*dfc6aa5cSAndroid Build Coastguard Workerconst_base: 271*dfc6aa5cSAndroid Build Coastguard Worker 272*dfc6aa5cSAndroid Build Coastguard Worker%define GOTOFF(got, sym) (got) + (sym) - const_base 273*dfc6aa5cSAndroid Build Coastguard Worker 274*dfc6aa5cSAndroid Build Coastguard Worker%imacro get_GOT 1 275*dfc6aa5cSAndroid Build Coastguard Worker ; NOTE: this macro destroys ecx resister. 276*dfc6aa5cSAndroid Build Coastguard Worker call %%geteip 277*dfc6aa5cSAndroid Build Coastguard Worker add ecx, byte (%%ref - $) 278*dfc6aa5cSAndroid Build Coastguard Worker jmp short %%adjust 279*dfc6aa5cSAndroid Build Coastguard Worker%%geteip: 280*dfc6aa5cSAndroid Build Coastguard Worker mov ecx, POINTER [esp] 281*dfc6aa5cSAndroid Build Coastguard Worker ret 282*dfc6aa5cSAndroid Build Coastguard Worker%%adjust: 283*dfc6aa5cSAndroid Build Coastguard Worker push ebp 284*dfc6aa5cSAndroid Build Coastguard Worker xor ebp, ebp ; ebp = 0 285*dfc6aa5cSAndroid Build Coastguard Worker%ifidni %1, ebx ; (%1 == ebx) 286*dfc6aa5cSAndroid Build Coastguard Worker ; db 0x8D,0x9C + jmp near const_base = 287*dfc6aa5cSAndroid Build Coastguard Worker ; lea ebx, [ecx+ebp*8+(const_base-%%ref)] ; 8D,9C,E9,(offset32) 288*dfc6aa5cSAndroid Build Coastguard Worker db 0x8D, 0x9C ; 8D,9C 289*dfc6aa5cSAndroid Build Coastguard Worker jmp near const_base ; E9,(const_base-%%ref) 290*dfc6aa5cSAndroid Build Coastguard Worker%%ref: 291*dfc6aa5cSAndroid Build Coastguard Worker%else ; (%1 != ebx) 292*dfc6aa5cSAndroid Build Coastguard Worker ; db 0x8D,0x8C + jmp near const_base = 293*dfc6aa5cSAndroid Build Coastguard Worker ; lea ecx, [ecx+ebp*8+(const_base-%%ref)] ; 8D,8C,E9,(offset32) 294*dfc6aa5cSAndroid Build Coastguard Worker db 0x8D, 0x8C ; 8D,8C 295*dfc6aa5cSAndroid Build Coastguard Worker jmp near const_base ; E9,(const_base-%%ref) 296*dfc6aa5cSAndroid Build Coastguard Worker%%ref: 297*dfc6aa5cSAndroid Build Coastguard Worker mov %1, ecx 298*dfc6aa5cSAndroid Build Coastguard Worker%endif ; (%1 == ebx) 299*dfc6aa5cSAndroid Build Coastguard Worker pop ebp 300*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 301*dfc6aa5cSAndroid Build Coastguard Worker 302*dfc6aa5cSAndroid Build Coastguard Worker%else ; GOT_SYMBOL != _MACHO_PIC_ ---------------- 303*dfc6aa5cSAndroid Build Coastguard Worker 304*dfc6aa5cSAndroid Build Coastguard Worker%define GOTOFF(got, sym) (got) + (sym) wrt ..gotoff 305*dfc6aa5cSAndroid Build Coastguard Worker 306*dfc6aa5cSAndroid Build Coastguard Worker%imacro get_GOT 1 307*dfc6aa5cSAndroid Build Coastguard Worker extern GOT_SYMBOL 308*dfc6aa5cSAndroid Build Coastguard Worker call %%geteip 309*dfc6aa5cSAndroid Build Coastguard Worker add %1, GOT_SYMBOL + $$ - $ wrt ..gotpc 310*dfc6aa5cSAndroid Build Coastguard Worker jmp short %%done 311*dfc6aa5cSAndroid Build Coastguard Worker%%geteip: 312*dfc6aa5cSAndroid Build Coastguard Worker mov %1, POINTER [esp] 313*dfc6aa5cSAndroid Build Coastguard Worker ret 314*dfc6aa5cSAndroid Build Coastguard Worker%%done: 315*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 316*dfc6aa5cSAndroid Build Coastguard Worker 317*dfc6aa5cSAndroid Build Coastguard Worker%endif ; GOT_SYMBOL == _MACHO_PIC_ ---------------- 318*dfc6aa5cSAndroid Build Coastguard Worker 319*dfc6aa5cSAndroid Build Coastguard Worker%imacro pushpic 1.nolist 320*dfc6aa5cSAndroid Build Coastguard Worker push %1 321*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 322*dfc6aa5cSAndroid Build Coastguard Worker%imacro poppic 1.nolist 323*dfc6aa5cSAndroid Build Coastguard Worker pop %1 324*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 325*dfc6aa5cSAndroid Build Coastguard Worker%imacro movpic 2.nolist 326*dfc6aa5cSAndroid Build Coastguard Worker mov %1, %2 327*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 328*dfc6aa5cSAndroid Build Coastguard Worker 329*dfc6aa5cSAndroid Build Coastguard Worker%else ; !PIC ----------------------------------------- 330*dfc6aa5cSAndroid Build Coastguard Worker 331*dfc6aa5cSAndroid Build Coastguard Worker%define GOTOFF(got, sym) (sym) 332*dfc6aa5cSAndroid Build Coastguard Worker 333*dfc6aa5cSAndroid Build Coastguard Worker%imacro get_GOT 1.nolist 334*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 335*dfc6aa5cSAndroid Build Coastguard Worker%imacro pushpic 1.nolist 336*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 337*dfc6aa5cSAndroid Build Coastguard Worker%imacro poppic 1.nolist 338*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 339*dfc6aa5cSAndroid Build Coastguard Worker%imacro movpic 2.nolist 340*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 341*dfc6aa5cSAndroid Build Coastguard Worker 342*dfc6aa5cSAndroid Build Coastguard Worker%endif ; PIC ----------------------------------------- 343*dfc6aa5cSAndroid Build Coastguard Worker 344*dfc6aa5cSAndroid Build Coastguard Worker; -------------------------------------------------------------------------- 345*dfc6aa5cSAndroid Build Coastguard Worker; Align the next instruction on {2,4,8,16,..}-byte boundary. 346*dfc6aa5cSAndroid Build Coastguard Worker; ".balign n,,m" in GNU as 347*dfc6aa5cSAndroid Build Coastguard Worker; 348*dfc6aa5cSAndroid Build Coastguard Worker%define MSKLE(x, y) (~(((y) & 0xFFFF) - ((x) & 0xFFFF)) >> 16) 349*dfc6aa5cSAndroid Build Coastguard Worker%define FILLB(b, n) (($$-(b)) & ((n)-1)) 350*dfc6aa5cSAndroid Build Coastguard Worker 351*dfc6aa5cSAndroid Build Coastguard Worker%imacro alignx 1-2.nolist 0xFFFF 352*dfc6aa5cSAndroid Build Coastguard Worker%%bs: \ 353*dfc6aa5cSAndroid Build Coastguard Worker times MSKLE(FILLB(%%bs, %1), %2) & MSKLE(16, FILLB($, %1)) & FILLB($, %1) \ 354*dfc6aa5cSAndroid Build Coastguard Worker db 0x90 ; nop 355*dfc6aa5cSAndroid Build Coastguard Worker times MSKLE(FILLB(%%bs, %1), %2) & FILLB($, %1) / 9 \ 356*dfc6aa5cSAndroid Build Coastguard Worker db 0x8D, 0x9C, 0x23, 0x00, 0x00, 0x00, 0x00 ; lea ebx,[ebx+0x00000000] 357*dfc6aa5cSAndroid Build Coastguard Worker times MSKLE(FILLB(%%bs, %1), %2) & FILLB($, %1) / 7 \ 358*dfc6aa5cSAndroid Build Coastguard Worker db 0x8D, 0xAC, 0x25, 0x00, 0x00, 0x00, 0x00 ; lea ebp,[ebp+0x00000000] 359*dfc6aa5cSAndroid Build Coastguard Worker times MSKLE(FILLB(%%bs, %1), %2) & FILLB($, %1) / 6 \ 360*dfc6aa5cSAndroid Build Coastguard Worker db 0x8D, 0xAD, 0x00, 0x00, 0x00, 0x00 ; lea ebp,[ebp+0x00000000] 361*dfc6aa5cSAndroid Build Coastguard Worker times MSKLE(FILLB(%%bs, %1), %2) & FILLB($, %1) / 4 \ 362*dfc6aa5cSAndroid Build Coastguard Worker db 0x8D, 0x6C, 0x25, 0x00 ; lea ebp,[ebp+0x00] 363*dfc6aa5cSAndroid Build Coastguard Worker times MSKLE(FILLB(%%bs, %1), %2) & FILLB($, %1) / 3 \ 364*dfc6aa5cSAndroid Build Coastguard Worker db 0x8D, 0x6D, 0x00 ; lea ebp,[ebp+0x00] 365*dfc6aa5cSAndroid Build Coastguard Worker times MSKLE(FILLB(%%bs, %1), %2) & FILLB($, %1) / 2 \ 366*dfc6aa5cSAndroid Build Coastguard Worker db 0x8B, 0xED ; mov ebp,ebp 367*dfc6aa5cSAndroid Build Coastguard Worker times MSKLE(FILLB(%%bs, %1), %2) & FILLB($, %1) / 1 \ 368*dfc6aa5cSAndroid Build Coastguard Worker db 0x90 ; nop 369*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 370*dfc6aa5cSAndroid Build Coastguard Worker 371*dfc6aa5cSAndroid Build Coastguard Worker; Align the next data on {2,4,8,16,..}-byte boundary. 372*dfc6aa5cSAndroid Build Coastguard Worker; 373*dfc6aa5cSAndroid Build Coastguard Worker%imacro alignz 1.nolist 374*dfc6aa5cSAndroid Build Coastguard Worker align %1, db 0 ; filling zeros 375*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 376*dfc6aa5cSAndroid Build Coastguard Worker 377*dfc6aa5cSAndroid Build Coastguard Worker%ifdef __x86_64__ 378*dfc6aa5cSAndroid Build Coastguard Worker 379*dfc6aa5cSAndroid Build Coastguard Worker%ifdef WIN64 380*dfc6aa5cSAndroid Build Coastguard Worker 381*dfc6aa5cSAndroid Build Coastguard Worker%imacro collect_args 1 382*dfc6aa5cSAndroid Build Coastguard Worker sub rsp, SIZEOF_XMMWORD 383*dfc6aa5cSAndroid Build Coastguard Worker movaps XMMWORD [rsp], xmm6 384*dfc6aa5cSAndroid Build Coastguard Worker sub rsp, SIZEOF_XMMWORD 385*dfc6aa5cSAndroid Build Coastguard Worker movaps XMMWORD [rsp], xmm7 386*dfc6aa5cSAndroid Build Coastguard Worker mov r10, rcx 387*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 1 388*dfc6aa5cSAndroid Build Coastguard Worker mov r11, rdx 389*dfc6aa5cSAndroid Build Coastguard Worker%endif 390*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 2 391*dfc6aa5cSAndroid Build Coastguard Worker push r12 392*dfc6aa5cSAndroid Build Coastguard Worker mov r12, r8 393*dfc6aa5cSAndroid Build Coastguard Worker%endif 394*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 3 395*dfc6aa5cSAndroid Build Coastguard Worker push r13 396*dfc6aa5cSAndroid Build Coastguard Worker mov r13, r9 397*dfc6aa5cSAndroid Build Coastguard Worker%endif 398*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 4 399*dfc6aa5cSAndroid Build Coastguard Worker push r14 400*dfc6aa5cSAndroid Build Coastguard Worker mov r14, [rax+48] 401*dfc6aa5cSAndroid Build Coastguard Worker%endif 402*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 5 403*dfc6aa5cSAndroid Build Coastguard Worker push r15 404*dfc6aa5cSAndroid Build Coastguard Worker mov r15, [rax+56] 405*dfc6aa5cSAndroid Build Coastguard Worker%endif 406*dfc6aa5cSAndroid Build Coastguard Worker push rsi 407*dfc6aa5cSAndroid Build Coastguard Worker push rdi 408*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 409*dfc6aa5cSAndroid Build Coastguard Worker 410*dfc6aa5cSAndroid Build Coastguard Worker%imacro uncollect_args 1 411*dfc6aa5cSAndroid Build Coastguard Worker pop rdi 412*dfc6aa5cSAndroid Build Coastguard Worker pop rsi 413*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 5 414*dfc6aa5cSAndroid Build Coastguard Worker pop r15 415*dfc6aa5cSAndroid Build Coastguard Worker%endif 416*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 4 417*dfc6aa5cSAndroid Build Coastguard Worker pop r14 418*dfc6aa5cSAndroid Build Coastguard Worker%endif 419*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 3 420*dfc6aa5cSAndroid Build Coastguard Worker pop r13 421*dfc6aa5cSAndroid Build Coastguard Worker%endif 422*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 2 423*dfc6aa5cSAndroid Build Coastguard Worker pop r12 424*dfc6aa5cSAndroid Build Coastguard Worker%endif 425*dfc6aa5cSAndroid Build Coastguard Worker movaps xmm7, XMMWORD [rsp] 426*dfc6aa5cSAndroid Build Coastguard Worker add rsp, SIZEOF_XMMWORD 427*dfc6aa5cSAndroid Build Coastguard Worker movaps xmm6, XMMWORD [rsp] 428*dfc6aa5cSAndroid Build Coastguard Worker add rsp, SIZEOF_XMMWORD 429*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 430*dfc6aa5cSAndroid Build Coastguard Worker 431*dfc6aa5cSAndroid Build Coastguard Worker%imacro push_xmm 1 432*dfc6aa5cSAndroid Build Coastguard Worker sub rsp, %1 * SIZEOF_XMMWORD 433*dfc6aa5cSAndroid Build Coastguard Worker movaps XMMWORD [rsp+0*SIZEOF_XMMWORD], xmm8 434*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 1 435*dfc6aa5cSAndroid Build Coastguard Worker movaps XMMWORD [rsp+1*SIZEOF_XMMWORD], xmm9 436*dfc6aa5cSAndroid Build Coastguard Worker%endif 437*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 2 438*dfc6aa5cSAndroid Build Coastguard Worker movaps XMMWORD [rsp+2*SIZEOF_XMMWORD], xmm10 439*dfc6aa5cSAndroid Build Coastguard Worker%endif 440*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 3 441*dfc6aa5cSAndroid Build Coastguard Worker movaps XMMWORD [rsp+3*SIZEOF_XMMWORD], xmm11 442*dfc6aa5cSAndroid Build Coastguard Worker%endif 443*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 444*dfc6aa5cSAndroid Build Coastguard Worker 445*dfc6aa5cSAndroid Build Coastguard Worker%imacro pop_xmm 1 446*dfc6aa5cSAndroid Build Coastguard Worker movaps xmm8, XMMWORD [rsp+0*SIZEOF_XMMWORD] 447*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 1 448*dfc6aa5cSAndroid Build Coastguard Worker movaps xmm9, XMMWORD [rsp+1*SIZEOF_XMMWORD] 449*dfc6aa5cSAndroid Build Coastguard Worker%endif 450*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 2 451*dfc6aa5cSAndroid Build Coastguard Worker movaps xmm10, XMMWORD [rsp+2*SIZEOF_XMMWORD] 452*dfc6aa5cSAndroid Build Coastguard Worker%endif 453*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 3 454*dfc6aa5cSAndroid Build Coastguard Worker movaps xmm11, XMMWORD [rsp+3*SIZEOF_XMMWORD] 455*dfc6aa5cSAndroid Build Coastguard Worker%endif 456*dfc6aa5cSAndroid Build Coastguard Worker add rsp, %1 * SIZEOF_XMMWORD 457*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 458*dfc6aa5cSAndroid Build Coastguard Worker 459*dfc6aa5cSAndroid Build Coastguard Worker%else 460*dfc6aa5cSAndroid Build Coastguard Worker 461*dfc6aa5cSAndroid Build Coastguard Worker%imacro collect_args 1 462*dfc6aa5cSAndroid Build Coastguard Worker push r10 463*dfc6aa5cSAndroid Build Coastguard Worker mov r10, rdi 464*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 1 465*dfc6aa5cSAndroid Build Coastguard Worker push r11 466*dfc6aa5cSAndroid Build Coastguard Worker mov r11, rsi 467*dfc6aa5cSAndroid Build Coastguard Worker%endif 468*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 2 469*dfc6aa5cSAndroid Build Coastguard Worker push r12 470*dfc6aa5cSAndroid Build Coastguard Worker mov r12, rdx 471*dfc6aa5cSAndroid Build Coastguard Worker%endif 472*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 3 473*dfc6aa5cSAndroid Build Coastguard Worker push r13 474*dfc6aa5cSAndroid Build Coastguard Worker mov r13, rcx 475*dfc6aa5cSAndroid Build Coastguard Worker%endif 476*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 4 477*dfc6aa5cSAndroid Build Coastguard Worker push r14 478*dfc6aa5cSAndroid Build Coastguard Worker mov r14, r8 479*dfc6aa5cSAndroid Build Coastguard Worker%endif 480*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 5 481*dfc6aa5cSAndroid Build Coastguard Worker push r15 482*dfc6aa5cSAndroid Build Coastguard Worker mov r15, r9 483*dfc6aa5cSAndroid Build Coastguard Worker%endif 484*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 485*dfc6aa5cSAndroid Build Coastguard Worker 486*dfc6aa5cSAndroid Build Coastguard Worker%imacro uncollect_args 1 487*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 5 488*dfc6aa5cSAndroid Build Coastguard Worker pop r15 489*dfc6aa5cSAndroid Build Coastguard Worker%endif 490*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 4 491*dfc6aa5cSAndroid Build Coastguard Worker pop r14 492*dfc6aa5cSAndroid Build Coastguard Worker%endif 493*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 3 494*dfc6aa5cSAndroid Build Coastguard Worker pop r13 495*dfc6aa5cSAndroid Build Coastguard Worker%endif 496*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 2 497*dfc6aa5cSAndroid Build Coastguard Worker pop r12 498*dfc6aa5cSAndroid Build Coastguard Worker%endif 499*dfc6aa5cSAndroid Build Coastguard Worker%if %1 > 1 500*dfc6aa5cSAndroid Build Coastguard Worker pop r11 501*dfc6aa5cSAndroid Build Coastguard Worker%endif 502*dfc6aa5cSAndroid Build Coastguard Worker pop r10 503*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 504*dfc6aa5cSAndroid Build Coastguard Worker 505*dfc6aa5cSAndroid Build Coastguard Worker%imacro push_xmm 1 506*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 507*dfc6aa5cSAndroid Build Coastguard Worker 508*dfc6aa5cSAndroid Build Coastguard Worker%imacro pop_xmm 1 509*dfc6aa5cSAndroid Build Coastguard Worker%endmacro 510*dfc6aa5cSAndroid Build Coastguard Worker 511*dfc6aa5cSAndroid Build Coastguard Worker%endif 512*dfc6aa5cSAndroid Build Coastguard Worker 513*dfc6aa5cSAndroid Build Coastguard Worker%endif 514*dfc6aa5cSAndroid Build Coastguard Worker 515*dfc6aa5cSAndroid Build Coastguard Worker; -------------------------------------------------------------------------- 516*dfc6aa5cSAndroid Build Coastguard Worker; Defines picked up from the C headers 517*dfc6aa5cSAndroid Build Coastguard Worker; 518*dfc6aa5cSAndroid Build Coastguard Worker%include "jsimdcfg.inc" 519*dfc6aa5cSAndroid Build Coastguard Worker 520*dfc6aa5cSAndroid Build Coastguard Worker; -------------------------------------------------------------------------- 521