[INCLUDES]
[reactos.git] / reactos / include / crt / msc / intrin.h
1 #ifndef KJK_INTRIN_H_
2 #define KJK_INTRIN_H_
3
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7
8 /** Pragma support **/
9 #define _PRAGMA_WARNING_SUPPRESS(x) __pragma(warning(suppress: x))
10
11 /*** Stack frame juggling ***/
12 void * _ReturnAddress(void);
13 #pragma intrinsic(_ReturnAddress)
14 void * _AddressOfReturnAddress(void);
15 #pragma intrinsic(_AddressOfReturnAddress)
16 #if defined(_M_IX86) || defined(_M_AMD64)
17 unsigned int __getcallerseflags(void);
18 #pragma intrinsic(__getcallerseflags)
19 #endif
20
21 /*** Memory barriers ***/
22 void _ReadWriteBarrier(void);
23 #pragma intrinsic(_ReadWriteBarrier)
24 void _ReadBarrier(void);
25 #pragma intrinsic(_ReadBarrier)
26 void _WriteBarrier(void);
27 #pragma intrinsic(_WriteBarrier)
28 #if defined(_M_IX86) || defined(_M_AMD64)
29 void _mm_mfence(void);
30 #pragma intrinsic(_mm_mfence)
31 void _mm_lfence(void);
32 #pragma intrinsic(_mm_lfence)
33 void _mm_sfence(void);
34 #pragma intrinsic(_mm_sfence)
35 #endif
36 #ifdef _M_AMD64
37 void __faststorefence(void);
38 #pragma intrinsic(__faststorefence)
39 #endif
40
41 /*** Atomic operations ***/
42 long _InterlockedCompareExchange(volatile long * Destination, long Exchange, long Comperand);
43 #pragma intrinsic(_InterlockedCompareExchange)
44 long _InterlockedExchange(volatile long * Target, long Value);
45 #pragma intrinsic(_InterlockedExchange)
46 long _InterlockedExchangeAdd(volatile long * Addend, long Value);
47 #pragma intrinsic(_InterlockedExchangeAdd)
48 char _InterlockedAnd8(volatile char * value, char mask);
49 #pragma intrinsic(_InterlockedAnd8)
50 short _InterlockedAnd16(volatile short * value, short mask);
51 #pragma intrinsic(_InterlockedAnd16)
52 long _InterlockedAnd(volatile long * value, long mask);
53 #pragma intrinsic(_InterlockedAnd)
54 char _InterlockedOr8(volatile char * value, char mask);
55 #pragma intrinsic(_InterlockedOr8)
56 short _InterlockedOr16(volatile short * value, short mask);
57 #pragma intrinsic(_InterlockedOr16)
58 long _InterlockedOr(volatile long * value, long mask);
59 #pragma intrinsic(_InterlockedOr)
60 char _InterlockedXor8(volatile char * value, char mask);
61 #pragma intrinsic(_InterlockedXor8)
62 short _InterlockedXor16(volatile short * value, short mask);
63 #pragma intrinsic(_InterlockedXor16)
64 long _InterlockedXor(volatile long * value, long mask);
65 #pragma intrinsic(_InterlockedXor)
66 long _InterlockedDecrement(volatile long * lpAddend);
67 #pragma intrinsic(_InterlockedDecrement)
68 long _InterlockedIncrement(volatile long * lpAddend);
69 #pragma intrinsic(_InterlockedIncrement)
70 short _InterlockedDecrement16(volatile short * lpAddend);
71 #pragma intrinsic(_InterlockedDecrement16)
72 short _InterlockedIncrement16(volatile short * lpAddend);
73 #pragma intrinsic(_InterlockedIncrement16)
74 unsigned char _interlockedbittestandreset(volatile long * a, long b);
75 #pragma intrinsic(_interlockedbittestandreset)
76 unsigned char _interlockedbittestandset(volatile long * a, long b);
77 #pragma intrinsic(_interlockedbittestandset)
78
79 #if defined(_M_IX86)
80 long _InterlockedAddLargeStatistic(volatile __int64 * Addend, long Value);
81 #pragma intrinsic(_InterlockedAddLargeStatistic)
82 #elif defined(_M_AMD64)
83 __int64 _InterlockedExchange64(volatile __int64 * Target, __int64 Value);
84 #pragma intrinsic(_InterlockedExchange64)
85 __int64 _InterlockedExchangeAdd64(volatile __int64 * Addend, __int64 Value);
86 #pragma intrinsic(_InterlockedExchangeAdd64)
87 void * _InterlockedCompareExchangePointer(void * volatile * Destination, void * Exchange, void * Comperand);
88 #pragma intrinsic(_InterlockedCompareExchangePointer)
89 void * _InterlockedExchangePointer(void * volatile * Target, void * Value);
90 #pragma intrinsic(_InterlockedExchangePointer)
91 __int64 _InterlockedAnd64(volatile __int64 * value, __int64 mask);
92 #pragma intrinsic(_InterlockedAnd64)
93 __int64 _InterlockedOr64(volatile __int64 * value, __int64 mask);
94 #pragma intrinsic(_InterlockedOr64)
95 __int64 _InterlockedCompareExchange64(volatile __int64 * Destination, __int64 Exchange, __int64 Comperand);
96 #pragma intrinsic(_InterlockedCompareExchange64)
97 __int64 _InterlockedDecrement64(volatile __int64 * lpAddend);
98 #pragma intrinsic(_InterlockedDecrement64)
99 __int64 _InterlockedIncrement64(volatile __int64 * lpAddend);
100 #pragma intrinsic(_InterlockedIncrement64)
101 unsigned char _interlockedbittestandreset64(volatile __int64 * a, __int64 b);
102 #pragma intrinsic(_interlockedbittestandreset64)
103 unsigned char _interlockedbittestandset64(volatile __int64 * a, __int64 b);
104 #pragma intrinsic(_interlockedbittestandset64)
105 #endif
106
107 #if defined(_M_IX86) || defined(_M_AMD64)
108 /*** String operations ***/
109 void __stosb(unsigned char * Dest, unsigned char Data, size_t Count);
110 #pragma intrinsic(__stosb)
111 void __stosw(unsigned short * Dest, unsigned short Data, size_t Count);
112 #pragma intrinsic(__stosw)
113 void __stosd(unsigned long * Dest, unsigned long Data, size_t Count);
114 #pragma intrinsic(__stosd)
115 void __movsb(unsigned char * Destination, unsigned char const * Source, size_t Count);
116 #pragma intrinsic(__movsb)
117 void __movsw(unsigned short * Destination, unsigned short const * Source, size_t Count);
118 #pragma intrinsic(__movsw)
119 void __movsd(unsigned long * Destination, unsigned long const * Source, size_t Count);
120 #pragma intrinsic(__movsd)
121 #endif
122 #ifdef _M_AMD64
123 void __movsq(unsigned __int64 * Destination, unsigned __int64 const * Source, size_t Count);
124 #pragma intrinsic(__movsq)
125 #endif
126
127 #if defined(_M_AMD64)
128 /*** GS segment addressing ***/
129 void __writegsbyte(unsigned long Offset, unsigned char Data);
130 #pragma intrinsic(__writegsbyte)
131 void __writegsword(unsigned long Offset, unsigned short Data);
132 #pragma intrinsic(__writegsword)
133 void __writegsdword(unsigned long Offset, unsigned long Data);
134 #pragma intrinsic(__writegsdword)
135 void __writegsqword(unsigned long Offset, unsigned __int64 Data);
136 #pragma intrinsic(__writegsqword)
137 unsigned char __readgsbyte(unsigned long Offset);
138 #pragma intrinsic(__readgsbyte)
139 unsigned short __readgsword(unsigned long Offset);
140 #pragma intrinsic(__readgsword)
141 unsigned long __readgsdword(unsigned long Offset);
142 #pragma intrinsic(__readgsdword)
143 unsigned __int64 __readgsqword(unsigned long Offset);
144 #pragma intrinsic(__readgsqword)
145 void __incgsbyte(unsigned long Offset);
146 #pragma intrinsic(__incgsbyte)
147 void __incgsword(unsigned long Offset);
148 #pragma intrinsic(__incgsword)
149 void __incgsdword(unsigned long Offset);
150 #pragma intrinsic(__incgsdword)
151 void __addgsbyte(unsigned long Offset, unsigned char Data);
152 #pragma intrinsic(__addgsbyte)
153 void __addgsword(unsigned long Offset, unsigned short Data);
154 #pragma intrinsic(__addgsword)
155 void __addgsdword(unsigned long Offset, unsigned int Data);
156 #pragma intrinsic(__addgsdword)
157 void __addgsqword(unsigned long Offset, unsigned __int64 Data);
158 #pragma intrinsic(__addgsqword)
159 #endif
160
161 #if defined(_M_IX86)
162 /*** FS segment addressing ***/
163 void __writefsbyte(unsigned long Offset, unsigned char Data);
164 #pragma intrinsic(__writefsbyte)
165 void __writefsword(unsigned long Offset, unsigned short Data);
166 #pragma intrinsic(__writefsword)
167 void __writefsdword(unsigned long Offset, unsigned long Data);
168 #pragma intrinsic(__writefsdword)
169 unsigned char __readfsbyte(unsigned long Offset);
170 #pragma intrinsic(__readfsbyte)
171 unsigned short __readfsword(unsigned long Offset);
172 #pragma intrinsic(__readfsword)
173 unsigned long __readfsdword(unsigned long Offset);
174 #pragma intrinsic(__readfsdword)
175 void __incfsbyte(unsigned long Offset);
176 #pragma intrinsic(__incfsbyte)
177 void __incfsword(unsigned long Offset);
178 #pragma intrinsic(__incfsword)
179 void __incfsdword(unsigned long Offset);
180 #pragma intrinsic(__incfsdword)
181 void __addfsbyte(unsigned long Offset, unsigned char Data);
182 #pragma intrinsic(__addfsbyte)
183 void __addfsword(unsigned long Offset, unsigned short Data);
184 #pragma intrinsic(__addfsword)
185 void __addfsdword(unsigned long Offset, unsigned int Data);
186 #pragma intrinsic(__addfsdword)
187 #endif
188
189
190 /*** Bit manipulation ***/
191 unsigned char _BitScanForward(unsigned long * Index, unsigned long Mask);
192 #pragma intrinsic(_BitScanForward)
193 unsigned char _BitScanReverse(unsigned long * Index, unsigned long Mask);
194 #pragma intrinsic(_BitScanReverse)
195 unsigned char _bittest(const long * a, long b);
196 #pragma intrinsic(_bittest)
197 unsigned char _bittestandcomplement(long * a, long b);
198 #pragma intrinsic(_bittestandcomplement)
199 unsigned char _bittestandreset(long * a, long b);
200 #pragma intrinsic(_bittestandreset)
201 unsigned char _bittestandset(long * a, long b);
202 #pragma intrinsic(_bittestandset)
203 unsigned char _rotl8(unsigned char value, unsigned char shift);
204 #pragma intrinsic(_rotl8)
205 unsigned short _rotl16(unsigned short value, unsigned char shift);
206 #pragma intrinsic(_rotl16)
207 unsigned int _rotl(unsigned int value, int shift);
208 #pragma intrinsic(_rotl)
209 unsigned int _rotr(unsigned int value, int shift);
210 #pragma intrinsic(_rotr)
211 unsigned char _rotr8(unsigned char value, unsigned char shift);
212 #pragma intrinsic(_rotr8)
213 unsigned short _rotr16(unsigned short value, unsigned char shift);
214 #pragma intrinsic(_rotr16)
215 unsigned short _byteswap_ushort(unsigned short value);
216 #pragma intrinsic(_byteswap_ushort)
217 unsigned long _byteswap_ulong(unsigned long value);
218 #pragma intrinsic(_byteswap_ulong)
219 unsigned __int64 _byteswap_uint64(unsigned __int64 value);
220 #pragma intrinsic(_byteswap_uint64)
221 #if defined(_M_IX86) || defined(_M_AMD64)
222 unsigned __int64 __ll_lshift(unsigned __int64 Mask, int Bit);
223 #pragma intrinsic(__ll_lshift)
224 __int64 __ll_rshift(__int64 Mask, int Bit);
225 #pragma intrinsic(__ll_rshift)
226 unsigned __int64 __ull_rshift(unsigned __int64 Mask, int Bit);
227 #pragma intrinsic(__ull_rshift)
228 #endif
229 #ifdef _M_AMD64
230 unsigned char _bittest64(__int64 const *a, __int64 b);
231 #pragma intrinsic(_bittest64)
232 #endif
233
234 #if defined(_M_IX86) || defined(_M_AMD64)
235 /*** 64-bit math ***/
236 __int64 __emul(int a, int b);
237 #pragma intrinsic(__emul)
238 unsigned __int64 __emulu(unsigned int a, unsigned int b);
239 #pragma intrinsic(__emulu)
240 #endif
241 #ifdef _M_AMD64
242 unsigned __int64 __umulh(unsigned __int64 a, unsigned __int64 b);
243 #pragma intrinsic(__umulh)
244 #endif
245
246 #if defined(_M_IX86) || defined(_M_AMD64)
247 /*** Port I/O ***/
248 unsigned char __inbyte(unsigned short Port);
249 #pragma intrinsic(__inbyte)
250 unsigned short __inword(unsigned short Port);
251 #pragma intrinsic(__inword)
252 unsigned long __indword(unsigned short Port);
253 #pragma intrinsic(__indword)
254 void __inbytestring(unsigned short Port, unsigned char * Buffer, unsigned long Count);
255 #pragma intrinsic(__inbytestring)
256 void __inwordstring(unsigned short Port, unsigned short * Buffer, unsigned long Count);
257 #pragma intrinsic(__inwordstring)
258 void __indwordstring(unsigned short Port, unsigned long * Buffer, unsigned long Count);
259 #pragma intrinsic(__indwordstring)
260 void __outbyte(unsigned short Port, unsigned char Data);
261 #pragma intrinsic(__outbyte)
262 void __outword(unsigned short Port, unsigned short Data);
263 #pragma intrinsic(__outword)
264 void __outdword(unsigned short Port, unsigned long Data);
265 #pragma intrinsic(__outdword)
266 void __outbytestring(unsigned short Port, unsigned char * Buffer, unsigned long Count);
267 #pragma intrinsic(__outbytestring)
268 void __outwordstring(unsigned short Port, unsigned short * Buffer, unsigned long Count);
269 #pragma intrinsic(__outwordstring)
270 void __outdwordstring(unsigned short Port, unsigned long * Buffer, unsigned long Count);
271 #pragma intrinsic(__outdwordstring)
272 #endif
273
274 #if defined(_M_IX86) || defined(_M_AMD64)
275 /*** System information ***/
276 void __cpuid(int CPUInfo[], int InfoType);
277 #pragma intrinsic(__cpuid)
278 unsigned __int64 __rdtsc(void);
279 #pragma intrinsic(__rdtsc)
280 void __writeeflags(uintptr_t Value);
281 #pragma intrinsic(__writeeflags)
282 uintptr_t __readeflags(void);
283 #pragma intrinsic(__readeflags)
284 #endif
285
286 /*** Interrupts ***/
287 void __debugbreak(void);
288 #pragma intrinsic(__debugbreak)
289 void _disable(void);
290 #pragma intrinsic(_disable)
291 void _enable(void);
292 #pragma intrinsic(_enable)
293 #if defined(_M_IX86) || defined(_M_AMD64)
294 void __int2c(void);
295 #pragma intrinsic(__int2c)
296 void __halt(void);
297 #pragma intrinsic(__halt)
298 #endif
299
300 /*** Protected memory management ***/
301 #if defined(_M_IX86) || defined(_M_AMD64)
302 void __writecr0(unsigned __int64 Data);
303 #pragma intrinsic(__writecr0)
304 void __writecr3(unsigned __int64 Data);
305 #pragma intrinsic(__writecr3)
306 void __writecr4(unsigned __int64 Data);
307 #pragma intrinsic(__writecr4)
308 #endif
309 #ifdef _M_AMD64
310 void __writecr8(unsigned __int64 Data);
311 #pragma intrinsic(__writecr8)
312 unsigned __int64 __readcr0(void);
313 #pragma intrinsic(__readcr0)
314 unsigned __int64 __readcr2(void);
315 #pragma intrinsic(__readcr2)
316 unsigned __int64 __readcr3(void);
317 #pragma intrinsic(__readcr3)
318 unsigned __int64 __readcr4(void);
319 #pragma intrinsic(__readcr4)
320 unsigned __int64 __readcr8(void);
321 #pragma intrinsic(__readcr8)
322 unsigned __int64 __readdr(unsigned int reg);
323 #pragma intrinsic(__readdr)
324 void __writedr(unsigned reg, unsigned __int64 value);
325 #pragma intrinsic(__writedr)
326 #elif defined(_M_IX86)
327 unsigned long __readcr0(void);
328 unsigned long __readcr2(void);
329 unsigned long __readcr3(void);
330 //unsigned long __readcr4(void);
331 //#pragma intrinsic(__readcr4)
332 // HACK: MSVC is broken
333 unsigned long ___readcr4(void);
334 #define __readcr4 ___readcr4
335
336 unsigned int __readdr(unsigned int reg);
337 void __writedr(unsigned reg, unsigned int value);
338 #endif
339
340 #ifdef _M_IX86
341 // This intrinsic is broken and generates wrong opcodes,
342 // when optimization is enabled!
343 #pragma warning(push)
344 #pragma warning(disable:4711)
345 void __forceinline __invlpg_fixed(void * Address)
346 {
347 _ReadWriteBarrier();
348 __asm
349 {
350 mov eax, Address
351 invlpg [eax]
352 }
353 _ReadWriteBarrier();
354 }
355 #pragma warning(pop)
356 #define __invlpg __invlpg_fixed
357 #elif defined(_M_AMD64)
358 void __invlpg(void * Address);
359 #pragma intrinsic(__invlpg)
360 #endif
361
362 /*** System operations ***/
363 #if defined(_M_IX86) || defined(_M_AMD64)
364 unsigned __int64 __readmsr(int reg);
365 #pragma intrinsic(__readmsr)
366 void __writemsr(unsigned long Register, unsigned __int64 Value);
367 #pragma intrinsic(__writemsr)
368 unsigned __int64 __readpmc(int counter);
369 #pragma intrinsic(__readpmc)
370 unsigned long __segmentlimit(unsigned long a);
371 #pragma intrinsic(__segmentlimit)
372 void __wbinvd(void);
373 #pragma intrinsic(__wbinvd)
374 void __lidt(void *Source);
375 #pragma intrinsic(__lidt)
376 void __sidt(void *Destination);
377 #pragma intrinsic(__sidt)
378 void _mm_pause(void);
379 #pragma intrinsic(_mm_pause)
380 #endif
381
382 #ifdef __cplusplus
383 }
384 #endif
385
386 #endif /* KJK_INTRIN_H_ */
387
388 /* EOF */