annotate src/fftw-3.3.5/simd-support/amd64-cpuid.h @ 84:08ae793730bd

Add null config files
author Chris Cannam
date Mon, 02 Mar 2020 14:03:47 +0000
parents 2cd0e3b3e1fd
children
rev   line source
Chris@42 1 /*
Chris@42 2 * Copyright (c) 2003, 2007-14 Matteo Frigo
Chris@42 3 * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology
Chris@42 4 *
Chris@42 5 * This program is free software; you can redistribute it and/or modify
Chris@42 6 * it under the terms of the GNU General Public License as published by
Chris@42 7 * the Free Software Foundation; either version 2 of the License, or
Chris@42 8 * (at your option) any later version.
Chris@42 9 *
Chris@42 10 * This program is distributed in the hope that it will be useful,
Chris@42 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@42 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@42 13 * GNU General Public License for more details.
Chris@42 14 *
Chris@42 15 * You should have received a copy of the GNU General Public License
Chris@42 16 * along with this program; if not, write to the Free Software
Chris@42 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Chris@42 18 *
Chris@42 19 */
Chris@42 20
Chris@42 21
Chris@42 22 #ifdef _MSC_VER
Chris@42 23 #ifndef inline
Chris@42 24 #define inline __inline
Chris@42 25 #endif
Chris@42 26 #endif
Chris@42 27
Chris@42 28 #ifdef _MSC_VER
Chris@42 29 #include <intrin.h>
Chris@42 30 #if (_MSC_VER >= 1600) && !defined(__INTEL_COMPILER)
Chris@42 31 #include <immintrin.h>
Chris@42 32 #endif
Chris@42 33 #endif
Chris@42 34
Chris@42 35 /* cpuid version to get all registers. Donated by Erik Lindahl from Gromacs. */
Chris@42 36 static inline void
Chris@42 37 cpuid_all(int level, int ecxval, int *eax, int *ebx, int *ecx, int *edx)
Chris@42 38 {
Chris@42 39 # ifdef _MSC_VER
Chris@42 40 int CPUInfo[4];
Chris@42 41
Chris@42 42 #if (_MSC_VER > 1500) || (_MSC_VER == 1500 & _MSC_FULL_VER >= 150030729)
Chris@42 43 /* MSVC 9.0 SP1 or later */
Chris@42 44 __cpuidex(CPUInfo, op, ecxval);
Chris@42 45 #else
Chris@42 46 __cpuid(CPUInfo, level);
Chris@42 47 #endif
Chris@42 48 *eax = CPUInfo[0];
Chris@42 49 *ebx = CPUInfo[1];
Chris@42 50 *ecx = CPUInfo[2];
Chris@42 51 *edx = CPUInfo[3];
Chris@42 52
Chris@42 53 # else
Chris@42 54 /* Not MSVC */
Chris@42 55 *eax = level;
Chris@42 56 *ecx = ecxval;
Chris@42 57 *ebx = 0;
Chris@42 58 *edx = 0;
Chris@42 59 /* No need to save ebx if we are not in pic mode */
Chris@42 60 __asm__ ("cpuid \n\t"
Chris@42 61 : "+a" (*eax), "+b" (*ebx), "+c" (*ecx), "+d" (*edx));
Chris@42 62 # endif
Chris@42 63 }
Chris@42 64
Chris@42 65
Chris@42 66 static inline int cpuid_ecx(int op)
Chris@42 67 {
Chris@42 68 # ifdef _MSC_VER
Chris@42 69 # ifdef __INTEL_COMPILER
Chris@42 70 int result;
Chris@42 71 _asm {
Chris@42 72 push rbx
Chris@42 73 mov eax,op
Chris@42 74 cpuid
Chris@42 75 mov result,ecx
Chris@42 76 pop rbx
Chris@42 77 }
Chris@42 78 return result;
Chris@42 79 # else
Chris@42 80 int cpu_info[4];
Chris@42 81 __cpuid(cpu_info,op);
Chris@42 82 return cpu_info[2];
Chris@42 83 # endif
Chris@42 84 # else
Chris@42 85 int eax, ecx = 0, edx;
Chris@42 86
Chris@42 87 __asm__("pushq %%rbx\n\tcpuid\n\tpopq %%rbx"
Chris@42 88 : "=a" (eax), "+c" (ecx), "=d" (edx)
Chris@42 89 : "a" (op));
Chris@42 90 return ecx;
Chris@42 91 # endif
Chris@42 92 }
Chris@42 93
Chris@42 94 static inline int cpuid_ebx(int op)
Chris@42 95 {
Chris@42 96 # ifdef _MSC_VER
Chris@42 97 # ifdef __INTEL_COMPILER
Chris@42 98 int result;
Chris@42 99 _asm {
Chris@42 100 push rbx
Chris@42 101 mov eax,op
Chris@42 102 cpuid
Chris@42 103 mov result,ebx
Chris@42 104 pop rbx
Chris@42 105 }
Chris@42 106 return result;
Chris@42 107 # else
Chris@42 108 int cpu_info[4];
Chris@42 109 __cpuid(cpu_info,op);
Chris@42 110 return cpu_info[1];
Chris@42 111 # endif
Chris@42 112 # else
Chris@42 113 int eax, ecx = 0, edx;
Chris@42 114
Chris@42 115 __asm__("pushq %%rbx\n\tcpuid\nmov %%ebx,%%ecx\n\tpopq %%rbx"
Chris@42 116 : "=a" (eax), "+c" (ecx), "=d" (edx)
Chris@42 117 : "a" (op));
Chris@42 118 return ecx;
Chris@42 119 # endif
Chris@42 120 }
Chris@42 121
Chris@42 122 static inline int xgetbv_eax(int op)
Chris@42 123 {
Chris@42 124 # ifdef _MSC_VER
Chris@42 125 # ifdef __INTEL_COMPILER
Chris@42 126 int veax, vedx;
Chris@42 127 _asm {
Chris@42 128 mov ecx,op
Chris@42 129 xgetbv
Chris@42 130 mov veax,eax
Chris@42 131 mov vedx,edx
Chris@42 132 }
Chris@42 133 return veax;
Chris@42 134 # else
Chris@42 135 # if defined(_MSC_VER) && (_MSC_VER >= 1600)
Chris@42 136 unsigned __int64 result;
Chris@42 137 result = _xgetbv(op);
Chris@42 138 return (int)result;
Chris@42 139 # else
Chris@42 140 # error "Need at least Visual Studio 10 SP1 for AVX support"
Chris@42 141 # endif
Chris@42 142 # endif
Chris@42 143 # else
Chris@42 144 int eax, edx;
Chris@42 145 __asm__ (".byte 0x0f, 0x01, 0xd0" : "=a"(eax), "=d"(edx) : "c" (op));
Chris@42 146 return eax;
Chris@42 147 #endif
Chris@42 148 }