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))
Lines 177 ... 1228 are skipped.
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
Lines 1329 ... 1602 are skipped.
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