|
|
|
1 |
|
/*** |
2 |
|
*intrin.h = declerations/definitions for some platform specific intrinsic stuff. |
3 |
|
* |
4 |
|
* Copyright (c) Microsoft Corporation. All rights reserved. |
5 |
|
*Purpose: |
6 |
|
* This include file contains the declerations for platform specific intrinsic |
7 |
|
* functions, or will include other files that have decleration of intrinsic |
8 |
|
* functions. Also there will be some platform specific macros to be used with |
9 |
|
* intrinsic functions. |
10 |
|
* |
11 |
|
****/ |
12 |
|
|
13 |
|
#pragma once |
14 |
|
#define __INTRIN_H_ |
15 |
|
#ifndef RC_INVOKED |
16 |
|
#ifndef __midl |
17 |
|
|
18 |
|
#include <crtdefs.h> |
19 |
|
#include <setjmp.h> |
20 |
|
#include <stddef.h> |
21 |
|
|
22 |
|
#if !defined(_M_CEE_PURE) |
23 |
|
|
24 |
|
#include <emmintrin.h> |
25 |
|
#include <xmmintrin.h> |
26 |
|
#include <mmintrin.h> |
27 |
|
|
28 |
|
#if defined(_M_IX86) |
29 |
|
#include <mm3dnow.h> |
30 |
|
#if defined(__cplusplus) |
31 |
|
#include <dvec.h> |
32 |
|
#include <fvec.h> |
33 |
|
#include <ivec.h> |
34 |
|
#endif /* defined(__cplusplus) */ |
35 |
|
#endif |
36 |
|
|
37 |
|
#endif /* !defined(_M_CEE_PURE) */ |
38 |
|
|
39 |
|
#if defined(__cplusplus) |
40 |
|
extern "C" { |
41 |
|
#endif |
42 |
|
|
43 |
|
/* |
44 |
|
** __MACHINE : all compilers |
45 |
|
** __MACHINEI : Intel (32 bit x86) and X64 |
46 |
|
** __MACHINEX64 : X64 compiler only |
47 |
|
** __MACHINEIA32 : 32 bit x86 arch only |
48 |
|
** __MACHINEX86X_X64 : X86 Extended intrinsics supported on X64 |
49 |
|
** __MACHINEX86X_IA64 : X86 Extended intrinsics supported on IA64 |
50 |
|
** __MACHINEIA64 : IA64 compiler only |
51 |
|
** __MACHINEW64 : WIN64(tm), 64 bit compilers only |
52 |
|
** __MACHINEIW64 : IA32 + Win64 compilers only (__MACHINEI + __MACHINEW64) |
53 |
|
** __MACHINESA : ARM (StrongARM) only |
54 |
|
** __MACHINEARMX : ARM XSCALE intrinsics |
55 |
|
** __MACHINECC : Intel XSCALE Concan |
56 |
|
** __MACHINECE : common intrinsic functions for Windows CE |
57 |
|
** __MACHINEZ : nothing |
58 |
|
*/ |
59 |
|
|
60 |
|
#define __MACHINEI __MACHINE |
61 |
|
#define __MACHINEX64 __MACHINE |
62 |
|
#define __MACHINEIA32 __MACHINE |
63 |
|
#define __MACHINEX86X_X64 __MACHINE |
64 |
|
#define __MACHINEX86X_IA64 __MACHINE |
65 |
|
#define __MACHINEIA64 __MACHINE |
66 |
|
#define __MACHINEW64 __MACHINE |
67 |
|
#define __MACHINEIW64 __MACHINE |
68 |
|
#define __MACHINESA __MACHINE |
69 |
|
#define __MACHINEARMX __MACHINE |
70 |
|
#define __MACHINECC __MACHINE |
71 |
|
#define __MACHINECE __MACHINE |
72 |
|
|
73 |
|
/* No intrinsics available to pure managed code */ |
74 |
|
#if defined(_M_CEE_PURE) |
75 |
|
#define __MACHINE(X) __MACHINEZ(X) |
76 |
|
#else |
77 |
|
#define __MACHINE(X) X; |
78 |
|
#endif |
79 |
|
|
80 |
|
#define __MACHINEZ(X) /* NOTHING */ |
81 |
|
|
82 |
|
#if !(_M_IX86) |
83 |
|
#undef __MACHINEIA32 |
84 |
|
#define __MACHINEIA32 __MACHINEZ |
85 |
|
#endif |
86 |
|
|
87 |
|
#if !(_M_IA64) |
88 |
|
#undef __MACHINEIA64 |
89 |
|
#define __MACHINEIA64 __MACHINEZ |
90 |
|
#endif |
91 |
|
|
92 |
|
#if !(_M_AMD64) |
93 |
|
#undef __MACHINEX64 |
94 |
|
#define __MACHINEX64 __MACHINEZ |
95 |
|
#endif |
96 |
|
|
97 |
|
#if !(_M_IA64 || _M_AMD64) |
98 |
|
#undef __MACHINEW64 |
99 |
|
#define __MACHINEW64 __MACHINEZ |
100 |
|
#endif |
101 |
|
|
102 |
|
#if !(_M_IX86 || _M_AMD64 || _M_IA64) |
103 |
|
#undef __MACHINEIW64 |
104 |
|
#define __MACHINEIW64 __MACHINEZ |
105 |
|
#endif |
106 |
|
|
107 |
|
#if !(_M_IX86 || _M_IA64) |
108 |
|
#undef __MACHINEX86X_IA64 |
109 |
|
#define __MACHINEX86X_IA64 __MACHINEZ |
110 |
|
#endif |
111 |
|
|
112 |
|
#if !(_M_IX86 || _M_AMD64) |
113 |
|
#undef __MACHINEX86X_X64 |
114 |
|
#define __MACHINEX86X_X64 __MACHINEZ |
115 |
|
#endif |
116 |
|
|
117 |
|
#if !(_M_ARM) |
118 |
|
#undef __MACHINESA |
119 |
|
#undef __MACHINEARMX |
120 |
|
#undef __MACHINECC |
121 |
|
#define __MACHINESA __MACHINEZ |
122 |
|
#define __MACHINEARMX __MACHINEZ |
123 |
|
#define __MACHINECC __MACHINEZ |
124 |
|
#endif |
125 |
|
|
126 |
|
#if !defined(_WIN32_WCE) |
127 |
|
#undef __MACHINECE |
128 |
|
#define __MACHINECE __MACHINEZ |
129 |
|
#endif |
130 |
|
|
131 |
|
__MACHINEIA64(void _AcquireSpinLock(unsigned __int64 *)) |
132 |
|
__MACHINE(void * __cdecl _alloca(size_t)) |
133 |
|
__MACHINE(int __cdecl abs(_In_ int)) |
134 |
|
__MACHINEIA64(void __break(int)) |
135 |
|
__MACHINECE(__int64 __cdecl _abs64(__int64)) |
136 |
|
__MACHINE(_Check_return_ unsigned short __cdecl _byteswap_ushort(_In_ unsigned short value)) |
137 |
|
__MACHINE(_Check_return_ unsigned long __cdecl _byteswap_ulong(_In_ unsigned long value)) |
138 |
|
__MACHINE(_Check_return_ unsigned __int64 __cdecl _byteswap_uint64(_In_ unsigned __int64 value)) |
139 |
|
__MACHINECE(void __CacheRelease(void *)) |
140 |
|
__MACHINECE(void __CacheWriteback(void *)) |
141 |
|
__MACHINECE(_CRTIMP double ceil(double)) |
142 |
|
__MACHINEX64(_CRTIMP double ceil(double)) |
143 |
|
__MACHINECE(_CRTIMP double ceil(double)) |
144 |
|
__MACHINECE(double _CopyDoubleFromInt64(__int64)) |
145 |
|
__MACHINECE(float _CopyFloatFromInt32(__int32)) |
146 |
|
__MACHINECE(__int64 _CopyInt64FromDouble(double)) |
147 |
|
__MACHINECE(__int32 _CopyInt32FromFloat(float)) |
148 |
|
__MACHINECE(unsigned _CountLeadingOnes(long)) |
149 |
|
__MACHINECE(unsigned _CountLeadingOnes64(__int64)) |
150 |
|
__MACHINECE(unsigned _CountLeadingSigns(long)) |
151 |
|
__MACHINECE(unsigned _CountLeadingSigns64(__int64)) |
152 |
|
__MACHINECE(unsigned _CountLeadingZeros(long)) |
153 |
|
__MACHINECE(unsigned _CountLeadingZeros64(__int64)) |
154 |
|
__MACHINECE(unsigned _CountOneBits(long)) |
155 |
|
__MACHINECE(unsigned _CountOneBits64(__int64)) |
156 |
|
__MACHINE(void __cdecl __debugbreak(void)) |
157 |
|
__MACHINEI(void __cdecl _disable(void)) |
158 |
|
__MACHINEIA64(void __cdecl _disable(void)) |
159 |
|
__MACHINEIA64(void __dsrlz(void)) |
160 |
|
__MACHINEI(__int64 __emul(int,int)) |
161 |
|
__MACHINEI(unsigned __int64 __emulu(unsigned int,unsigned int)) |
162 |
|
__MACHINEI(void __cdecl _enable(void)) |
163 |
|
__MACHINEIA64(void __cdecl _enable(void)) |
164 |
|
__MACHINEIA64(void __fc(__int64)) |
165 |
|
__MACHINEIA64(void __fclrf(void)) |
166 |
|
__MACHINEIA64(void __fsetc(int, int)) |
167 |
|
__MACHINEIA64(void __fwb(void)) |
168 |
|
__MACHINEIA64(unsigned __int64 __getReg(int)) |
169 |
|
__MACHINEIA64(unsigned __int64 __getPSP(void)) |
170 |
|
__MACHINEIA64(unsigned __int64 __getCFS(void)) |
171 |
|
__MACHINECE(void __ICacheRefresh(void *)) |
172 |
|
__MACHINEIA64(long _InterlockedAdd(long volatile *, long)) |
173 |
|
__MACHINEIA64(long _InterlockedAdd_acq(long volatile *, long)) |
174 |
|
__MACHINEIA64(long _InterlockedAdd_rel(long volatile *, long)) |
175 |
|
__MACHINEIA64(__int64 _InterlockedAdd64(__int64 volatile *, __int64)) |
176 |
|
__MACHINEIA64(__int64 _InterlockedAdd64_acq(__int64 volatile *, __int64)) |
1229 |
|
__MACHINECC(int _m_pmovmskd(unsigned __int64 m1)) |
1230 |
|
__MACHINECC(unsigned __int64 _m_pshufw(unsigned __int64 m1, int i)) |
1231 |
|
__MACHINECC(unsigned __int64 _m_pavgb(unsigned __int64 m1, unsigned __int64 m2)) |
1232 |
|
__MACHINECC(unsigned __int64 _m_pavgw(unsigned __int64 m1, unsigned __int64 m2)) |
1233 |
|
__MACHINECC(unsigned __int64 _m_pavg2b(unsigned __int64 m1, unsigned __int64 m2)) |
1234 |
|
__MACHINECC(unsigned __int64 _m_pavg2w(unsigned __int64 m1, unsigned __int64 m2)) |
1235 |
|
__MACHINECC(unsigned __int64 _m_psadbw(unsigned __int64 m1, unsigned __int64 m2)) |
1236 |
|
__MACHINECC(unsigned __int64 _m_psadwd(unsigned __int64 m1, unsigned __int64 m2)) |
1237 |
|
__MACHINECC(unsigned __int64 _m_psadzbw(unsigned __int64 m1, unsigned __int64 m2)) |
1238 |
|
__MACHINECC(unsigned __int64 _m_psadzwd(unsigned __int64 m1, unsigned __int64 m2)) |
1239 |
|
__MACHINECC(unsigned __int64 _m_paligniq(unsigned __int64 m1, unsigned __int64 m2, int i)) |
1240 |
|
__MACHINECC(unsigned __int64 _m_cvt_si2pi(__int64 i)) |
1241 |
|
__MACHINECC(__int64 _m_cvt_pi2si(unsigned __int64 m1)) |
1242 |
|
__MACHINEIW64(void __nvreg_save_fence(void)) |
1243 |
|
__MACHINEIW64(void __nvreg_restore_fence(void)) |
1244 |
|
|
1245 |
|
__MACHINEX64(short _InterlockedCompareExchange16_np(short volatile *Destination, short Exchange, short Comparand)) |
1246 |
|
__MACHINEX64(long _InterlockedCompareExchange_np (long *, long, long)) |
1247 |
|
__MACHINEX64(__int64 _InterlockedCompareExchange64_np(__int64 *, __int64, __int64)) |
1248 |
|
__MACHINEX64(void *_InterlockedCompareExchangePointer_np (void **, void *, void *)) |
1249 |
|
__MACHINEX64(unsigned char _InterlockedCompareExchange128(__int64 volatile *, __int64, __int64, __int64 *)) |
1250 |
|
__MACHINEX64(unsigned char _InterlockedCompareExchange128_np(__int64 volatile *, __int64, __int64, __int64 *)) |
1251 |
|
__MACHINEX64(long _InterlockedAnd_np(long *, long)) |
1252 |
|
__MACHINEX64(char _InterlockedAnd8_np(char *, char)) |
1253 |
|
__MACHINEX64(short _InterlockedAnd16_np(short *, short)) |
1254 |
|
__MACHINEX64(__int64 _InterlockedAnd64_np(__int64 *, __int64)) |
1255 |
|
__MACHINEX64(long _InterlockedOr_np(long *, long)) |
1256 |
|
__MACHINEX64(char _InterlockedOr8_np(char *, char)) |
1257 |
|
__MACHINEX64(short _InterlockedOr16_np(short *, short)) |
1258 |
|
__MACHINEX64(__int64 _InterlockedOr64_np(__int64 *, __int64)) |
1259 |
|
__MACHINEX64(long _InterlockedXor_np(long *, long)) |
1260 |
|
__MACHINEX64(char _InterlockedXor8_np(char *, char)) |
1261 |
|
__MACHINEX64(short _InterlockedXor16_np(short *, short)) |
1262 |
|
__MACHINEX64(__int64 _InterlockedXor64_np(__int64 *, __int64)) |
1263 |
|
|
1264 |
|
__MACHINEI(unsigned short __lzcnt16(unsigned short)) |
1265 |
|
__MACHINEI(unsigned int __lzcnt(unsigned int)) |
1266 |
|
__MACHINEX64(unsigned __int64 __lzcnt64(unsigned __int64)) |
1267 |
|
__MACHINEI(unsigned short __popcnt16(unsigned short)) |
1268 |
|
__MACHINEI(unsigned int __popcnt(unsigned int)) |
1269 |
|
__MACHINEX64(unsigned __int64 __popcnt64(unsigned __int64)) |
1270 |
|
__MACHINEI(__m128i _mm_extract_si64(__m128i,__m128i)) |
1271 |
|
__MACHINEI(__m128i _mm_extracti_si64(__m128i, int, int)) |
1272 |
|
__MACHINEI(__m128i _mm_insert_si64(__m128i,__m128i)) |
1273 |
|
__MACHINEI(__m128i _mm_inserti_si64(__m128i, __m128i, int, int)) |
1274 |
|
__MACHINEI(void _mm_stream_sd(double*,__m128d)) |
1275 |
|
__MACHINEI(void _mm_stream_ss(float*,__m128)) |
1276 |
|
__MACHINEI(unsigned __int64 __rdtscp(unsigned int*)) |
1277 |
|
|
1278 |
|
#if defined(_M_IA64) |
1279 |
|
|
1280 |
|
/* Special Registers */ |
1281 |
|
|
1282 |
|
#define __REG_IA64_Ip 1016 |
1283 |
|
|
1284 |
|
/* General-Purpose Registers */ |
1285 |
|
|
1286 |
|
/* Integer registers */ |
1287 |
|
#define __REG_IA64_IntR0 1024 |
1288 |
|
#define __REG_IA64_IntR1 1025 |
1289 |
|
#define __REG_IA64_IntR2 1026 |
1290 |
|
#define __REG_IA64_IntR3 1027 |
1291 |
|
#define __REG_IA64_IntR4 1028 |
1292 |
|
#define __REG_IA64_IntR5 1029 |
1293 |
|
#define __REG_IA64_IntR6 1030 |
1294 |
|
#define __REG_IA64_IntR7 1031 |
1295 |
|
#define __REG_IA64_IntR8 1032 |
1296 |
|
#define __REG_IA64_IntR9 1033 |
1297 |
|
#define __REG_IA64_IntR10 1034 |
1298 |
|
#define __REG_IA64_IntR11 1035 |
1299 |
|
#define __REG_IA64_IntR12 1036 |
1300 |
|
#define __REG_IA64_IntR13 1037 |
1301 |
|
#define __REG_IA64_IntR14 1038 |
1302 |
|
#define __REG_IA64_IntR15 1039 |
1303 |
|
#define __REG_IA64_IntR16 1040 |
1304 |
|
#define __REG_IA64_IntR17 1041 |
1305 |
|
#define __REG_IA64_IntR18 1042 |
1306 |
|
#define __REG_IA64_IntR19 1043 |
1307 |
|
#define __REG_IA64_IntR20 1044 |
1308 |
|
#define __REG_IA64_IntR21 1045 |
1309 |
|
#define __REG_IA64_IntR22 1046 |
1310 |
|
#define __REG_IA64_IntR23 1047 |
1311 |
|
#define __REG_IA64_IntR24 1048 |
1312 |
|
#define __REG_IA64_IntR25 1049 |
1313 |
|
#define __REG_IA64_IntR26 1050 |
1314 |
|
#define __REG_IA64_IntR27 1051 |
1315 |
|
#define __REG_IA64_IntR28 1052 |
1316 |
|
#define __REG_IA64_IntR29 1053 |
1317 |
|
#define __REG_IA64_IntR30 1054 |
1318 |
|
#define __REG_IA64_IntR31 1055 |
1319 |
|
|
1320 |
|
/* Register Stack */ |
1321 |
|
#define __REG_IA64_IntR32 1056 |
1322 |
|
#define __REG_IA64_IntR33 1057 |
1323 |
|
#define __REG_IA64_IntR34 1058 |
1324 |
|
#define __REG_IA64_IntR35 1059 |
1325 |
|
#define __REG_IA64_IntR36 1060 |
1326 |
|
#define __REG_IA64_IntR37 1061 |
1327 |
|
#define __REG_IA64_IntR38 1062 |
1328 |
|
#define __REG_IA64_IntR39 1063 |
1603 |
|
#define __REG_IA64_PFD14 7182 |
1604 |
|
#define __REG_IA64_PFD15 7183 |
1605 |
|
#define __REG_IA64_PFD16 7184 |
1606 |
|
#define __REG_IA64_PFD17 7185 |
1607 |
|
|
1608 |
|
/* Performance Monitor Config Registers */ |
1609 |
|
|
1610 |
|
#define __REG_IA64_PFC0 7424 |
1611 |
|
#define __REG_IA64_PFC1 7425 |
1612 |
|
#define __REG_IA64_PFC2 7426 |
1613 |
|
#define __REG_IA64_PFC3 7427 |
1614 |
|
#define __REG_IA64_PFC4 7428 |
1615 |
|
#define __REG_IA64_PFC5 7429 |
1616 |
|
#define __REG_IA64_PFC6 7430 |
1617 |
|
#define __REG_IA64_PFC7 7431 |
1618 |
|
#define __REG_IA64_PFC8 7432 |
1619 |
|
#define __REG_IA64_PFC9 7433 |
1620 |
|
#define __REG_IA64_PFC10 7434 |
1621 |
|
#define __REG_IA64_PFC11 7435 |
1622 |
|
#define __REG_IA64_PFC12 7436 |
1623 |
|
#define __REG_IA64_PFC13 7437 |
1624 |
|
#define __REG_IA64_PFC14 7438 |
1625 |
|
#define __REG_IA64_PFC15 7439 |
1626 |
|
|
1627 |
|
/* Instruction Breakpoint Registers */ |
1628 |
|
|
1629 |
|
#define __REG_IA64_DbI0 8448 |
1630 |
|
#define __REG_IA64_DbI1 8449 |
1631 |
|
#define __REG_IA64_DbI2 8450 |
1632 |
|
#define __REG_IA64_DbI3 8451 |
1633 |
|
#define __REG_IA64_DbI4 8452 |
1634 |
|
#define __REG_IA64_DbI5 8453 |
1635 |
|
#define __REG_IA64_DbI6 8454 |
1636 |
|
#define __REG_IA64_DbI7 8455 |
1637 |
|
|
1638 |
|
/* Data Breakpoint Registers */ |
1639 |
|
|
1640 |
|
#define __REG_IA64_DbD0 8576 |
1641 |
|
#define __REG_IA64_DbD1 8577 |
1642 |
|
#define __REG_IA64_DbD2 8578 |
1643 |
|
#define __REG_IA64_DbD3 8579 |
1644 |
|
#define __REG_IA64_DbD4 8580 |
1645 |
|
#define __REG_IA64_DbD5 8581 |
1646 |
|
#define __REG_IA64_DbD6 8582 |
1647 |
|
#define __REG_IA64_DbD7 8583 |
1648 |
|
|
1649 |
|
#endif /* defined(_M_IA64) */ |
1650 |
|
|
1651 |
|
|
1652 |
|
#if defined(_NO_PREFETCHW) |
1653 |
|
#if defined(_M_AMD64) |
1654 |
|
|
1655 |
|
#define _InterlockedCompareExchange16 _InterlockedCompareExchange16_np |
1656 |
|
#define _InterlockedCompareExchange _InterlockedCompareExchange_np |
1657 |
|
#define _InterlockedCompareExchange64 _InterlockedCompareExchange64_np |
1658 |
|
#define _InterlockedCompareExchangePointer _InterlockedCompareExchangePointer_np |
1659 |
|
#define _InterlockedCompareExchange128 _InterlockedCompareExchange128_np |
1660 |
|
#define _InterlockedAnd _InterlockedAnd_np |
1661 |
|
#define _InterlockedAnd8 _InterlockedAnd8_np |
1662 |
|
#define _InterlockedAnd16 _InterlockedAnd16_np |
1663 |
|
#define _InterlockedAnd64 _InterlockedAnd64_np |
1664 |
|
#define _InterlockedOr _InterlockedOr_np |
1665 |
|
#define _InterlockedOr8 _InterlockedOr8_np |
1666 |
|
#define _InterlockedOr16 _InterlockedOr16_np |
1667 |
|
#define _InterlockedOr64 _InterlockedOr64_np |
1668 |
|
#define _InterlockedXor _InterlockedXor_np |
1669 |
|
#define _InterlockedXor8 _InterlockedXor8_np |
1670 |
|
#define _InterlockedXor16 _InterlockedXor16_np |
1671 |
|
#define _InterlockedXor64 _InterlockedXor64_np |
1672 |
|
|
1673 |
|
#endif /* defined(_M_AMD64) */ |
1674 |
|
#endif /* defined(_NO_PREFETCHW) */ |
1675 |
|
|
1676 |
|
#if defined(__cplusplus) |
1677 |
|
} |
1678 |
|
#endif |
1679 |
|
#endif |
1680 |
|
#endif |
1681 |
|
|
1682 |
|
|
1683 |
|
|
|
|
|