1/* 2 * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> 3 * 4 * This file is part of Libav. 5 * 6 * Libav is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * Libav is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with Libav; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21#ifndef AVUTIL_X86_CPU_H 22#define AVUTIL_X86_CPU_H 23 24#include <stdint.h> 25#include "config.h" 26 27#if ARCH_X86_64 28# define OPSIZE "q" 29# define REG_a "rax" 30# define REG_b "rbx" 31# define REG_c "rcx" 32# define REG_d "rdx" 33# define REG_D "rdi" 34# define REG_S "rsi" 35# define PTR_SIZE "8" 36typedef int64_t x86_reg; 37 38# define REG_SP "rsp" 39# define REG_BP "rbp" 40# define REGBP rbp 41# define REGa rax 42# define REGb rbx 43# define REGc rcx 44# define REGd rdx 45# define REGSP rsp 46 47#elif ARCH_X86_32 48 49# define OPSIZE "l" 50# define REG_a "eax" 51# define REG_b "ebx" 52# define REG_c "ecx" 53# define REG_d "edx" 54# define REG_D "edi" 55# define REG_S "esi" 56# define PTR_SIZE "4" 57typedef int32_t x86_reg; 58 59# define REG_SP "esp" 60# define REG_BP "ebp" 61# define REGBP ebp 62# define REGa eax 63# define REGb ebx 64# define REGc ecx 65# define REGd edx 66# define REGSP esp 67#else 68typedef int x86_reg; 69#endif 70 71#define HAVE_7REGS (ARCH_X86_64 || (HAVE_EBX_AVAILABLE && HAVE_EBP_AVAILABLE)) 72#define HAVE_6REGS (ARCH_X86_64 || (HAVE_EBX_AVAILABLE || HAVE_EBP_AVAILABLE)) 73 74#if ARCH_X86_64 && defined(PIC) 75# define BROKEN_RELOCATIONS 1 76#endif 77 78/* 79 * If gcc is not set to support sse (-msse) it will not accept xmm registers 80 * in the clobber list for inline asm. XMM_CLOBBERS takes a list of xmm 81 * registers to be marked as clobbered and evaluates to nothing if they are 82 * not supported, or to the list itself if they are supported. Since a clobber 83 * list may not be empty, XMM_CLOBBERS_ONLY should be used if the xmm 84 * registers are the only in the clobber list. 85 * For example a list with "eax" and "xmm0" as clobbers should become: 86 * : XMM_CLOBBERS("xmm0",) "eax" 87 * and a list with only "xmm0" should become: 88 * XMM_CLOBBERS_ONLY("xmm0") 89 */ 90#if HAVE_XMM_CLOBBERS 91# define XMM_CLOBBERS(...) __VA_ARGS__ 92# define XMM_CLOBBERS_ONLY(...) : __VA_ARGS__ 93#else 94# define XMM_CLOBBERS(...) 95# define XMM_CLOBBERS_ONLY(...) 96#endif 97 98#endif /* AVUTIL_X86_CPU_H */ 99