8 /*** Stack frame juggling ***/
9 void * _ReturnAddress(void);
10 #pragma intrinsic(_ReturnAddress)
11 void * _AddressOfReturnAddress(void);
12 #pragma intrinsic(_AddressOfReturnAddress)
13 unsigned int __getcallerseflags(void);
14 #pragma intrinsic(__getcallerseflags)
16 /*** Atomic operations ***/
17 void _ReadWriteBarrier(void);
18 #pragma intrinsic(_ReadWriteBarrier)
19 void _ReadBarrier(void);
20 #pragma intrinsic(_ReadBarrier)
21 void _WriteBarrier(void);
22 #pragma intrinsic(_WriteBarrier)
24 char _InterlockedCompareExchange8(volatile char * const Destination
, const char Exchange
, const char Comperand
);
25 #pragma intrinsic(_InterlockedCompareExchange8)
26 short _InterlockedCompareExchange16(volatile short * const Destination
, const short Exchange
, const short Comperand
);
27 #pragma intrinsic(_InterlockedCompareExchange16)
28 long _InterlockedCompareExchange(volatile long * const Destination
, const long Exchange
, const long Comperand
);
29 #pragma intrinsic(_InterlockedCompareExchange)
30 long _InterlockedExchange(volatile long * const Target
, const long Value
);
31 #pragma intrinsic(_InterlockedExchange)
32 short _InterlockedExchangeAdd16(volatile short * const Addend
, const short Value
);
33 #pragma intrinsic(_InterlockedExchangeAdd16)
34 long _InterlockedExchangeAdd(volatile long * const Addend
, const long Value
);
35 #pragma intrinsic(_InterlockedExchangeAdd)
36 char _InterlockedAnd8(volatile char * const value
, const char mask
);
37 #pragma intrinsic(_InterlockedAnd8)
38 short _InterlockedAnd16(volatile short * const value
, const short mask
);
39 #pragma intrinsic(_InterlockedAnd16)
40 long _InterlockedAnd(volatile long * const value
, const long mask
);
41 #pragma intrinsic(_InterlockedAnd)
42 char _InterlockedOr8(volatile char * const value
, const char mask
);
43 #pragma intrinsic(_InterlockedOr8)
44 short _InterlockedOr16(volatile short * const value
, const short mask
);
45 #pragma intrinsic(_InterlockedOr16)
46 long _InterlockedOr(volatile long * const value
, const long mask
);
47 #pragma intrinsic(_InterlockedOr)
48 char _InterlockedXor8(volatile char * const value
, const char mask
);
49 #pragma intrinsic(_InterlockedXor8)
50 short _InterlockedXor16(volatile short * const value
, const short mask
);
51 #pragma intrinsic(_InterlockedXor16)
52 long _InterlockedXor(volatile long * const value
, const long mask
);
53 #pragma intrinsic(_InterlockedXor)
54 long _InterlockedAddLargeStatistic(volatile __int64
* const Addend
, const long Value
);
55 #pragma intrinsic(_InterlockedAddLargeStatistic)
56 long _InterlockedDecrement(volatile long * const lpAddend
);
57 #pragma intrinsic(_InterlockedDecrement)
58 long _InterlockedIncrement(volatile long * const lpAddend
);
59 #pragma intrinsic(_InterlockedIncrement)
60 short _InterlockedDecrement16(volatile short * const lpAddend
);
61 #pragma intrinsic(_InterlockedDecrement16)
62 short _InterlockedIncrement16(volatile short * const lpAddend
);
63 #pragma intrinsic(_InterlockedIncrement16)
64 unsigned char _interlockedbittestandreset(volatile long * a
, const long b
);
65 #pragma intrinsic(_interlockedbittestandreset)
66 unsigned char _interlockedbittestandset(volatile long * a
, const long b
);
67 #pragma intrinsic(_interlockedbittestandset)
70 __int64
_InterlockedExchange64(volatile __int64
* const Target
, const __int64 Value
);
71 #pragma intrinsic(_InterlockedExchange64)
72 __int64
_InterlockedExchangeAdd64(volatile __int64
* const Addend
, const __int64 Value
);
73 #pragma intrinsic(_InterlockedExchangeAdd64)
74 void * _InterlockedCompareExchangePointer(void * volatile * const Destination
, void * const Exchange
, void * const Comperand
);
75 #pragma intrinsic(_InterlockedCompareExchangePointer)
76 void * _InterlockedExchangePointer(void * volatile * const Target
, void * const Value
);
77 #pragma intrinsic(_InterlockedExchangePointer)
78 __int64
_InterlockedAnd64(volatile __int64
* const value
, const __int64 mask
);
79 #pragma intrinsic(_InterlockedAnd64)
80 long _InterlockedOr64(volatile __int64
* const value
, const __int64 mask
);
81 #pragma intrinsic(_InterlockedOr64)
82 __int64
_InterlockedCompareExchange64(volatile __int64
* const Destination
, const __int64 Exchange
, const __int64 Comperand
);
83 #pragma intrinsic(_InterlockedCompareExchange64)
84 __int64
_InterlockedDecrement64(volatile __int64
* const lpAddend
);
85 #pragma intrinsic(_InterlockedDecrement64)
86 __int64
_InterlockedIncrement64(volatile __int64
* const lpAddend
);
87 #pragma intrinsic(_InterlockedIncrement64)
88 unsigned char _interlockedbittestandreset64(volatile __int64
* a
, const __int64 b
);
89 #pragma intrinsic(_interlockedbittestandreset64)
90 unsigned char _interlockedbittestandset64(volatile __int64
* a
, const __int64 b
);
91 #pragma intrinsic(_interlockedbittestandset64)
94 /*** String operations ***/
95 void __stosb(unsigned char * Dest
, const unsigned char Data
, size_t Count
);
96 #pragma intrinsic(__stosb)
97 void __stosw(unsigned short * Dest
, const unsigned short Data
, size_t Count
);
98 #pragma intrinsic(__stosw)
99 void __stosd(unsigned long * Dest
, const unsigned long Data
, size_t Count
);
100 #pragma intrinsic(__stosd)
101 void __movsb(unsigned char * Destination
, const unsigned char * Source
, size_t Count
);
102 #pragma intrinsic(__movsb)
103 void __movsw(unsigned short * Destination
, const unsigned short * Source
, size_t Count
);
104 #pragma intrinsic(__movsw)
105 void __movsd(unsigned long * Destination
, const unsigned long * Source
, size_t Count
);
106 #pragma intrinsic(__movsd)
108 #if defined(_M_AMD64)
109 /*** GS segment addressing ***/
110 void __writegsbyte(const unsigned long Offset
, const unsigned char Data
);
111 #pragma intrinsic(__writegsbyte)
112 void __writegsword(const unsigned long Offset
, const unsigned short Data
);
113 #pragma intrinsic(__writegsword)
114 void __writegsdword(const unsigned long Offset
, const unsigned long Data
);
115 #pragma intrinsic(__writegsdword)
116 void __writegsqword(const unsigned long Offset
, const unsigned __int64 Data
);
117 #pragma intrinsic(__writegsqword)
118 unsigned char __readgsbyte(const unsigned long Offset
);
119 #pragma intrinsic(__readgsbyte)
120 unsigned short __readgsword(const unsigned long Offset
);
121 #pragma intrinsic(__readgsword)
122 unsigned long __readgsdword(const unsigned long Offset
);
123 #pragma intrinsic(__readgsdword)
124 unsigned __int64
__readgsqword(const unsigned long Offset
);
125 #pragma intrinsic(__readgsqword)
126 void __incgsbyte(const unsigned long Offset
);
127 #pragma intrinsic(__incgsbyte)
128 void __incgsword(const unsigned long Offset
);
129 #pragma intrinsic(__incgsword)
130 void __incgsdword(const unsigned long Offset
);
131 #pragma intrinsic(__incgsdword)
132 void __addgsbyte(const unsigned long Offset
, const unsigned char Data
);
133 #pragma intrinsic(__addgsbyte)
134 void __addgsword(const unsigned long Offset
, const unsigned short Data
);
135 #pragma intrinsic(__addgsword)
136 void __addgsdword(const unsigned long Offset
, const unsigned int Data
);
137 #pragma intrinsic(__addgsdword)
138 void __addgsqword(const unsigned long Offset
, const unsigned __int64 Data
);
139 #pragma intrinsic(__addgsqword)
142 //#if defined(_M_IX86)
143 /*** FS segment addressing ***/
144 void __writefsbyte(const unsigned long Offset
, const unsigned char Data
);
145 #pragma intrinsic(__writefsbyte)
146 void __writefsword(const unsigned long Offset
, const unsigned short Data
);
147 #pragma intrinsic(__writefsword)
148 void __writefsdword(const unsigned long Offset
, const unsigned long Data
);
149 #pragma intrinsic(__writefsdword)
150 unsigned char __readfsbyte(const unsigned long Offset
);
151 #pragma intrinsic(__readfsbyte)
152 unsigned short __readfsword(const unsigned long Offset
);
153 #pragma intrinsic(__readfsword)
154 unsigned long __readfsdword(const unsigned long Offset
);
155 #pragma intrinsic(__readfsdword)
156 void __incfsbyte(const unsigned long Offset
);
157 #pragma intrinsic(__incfsbyte)
158 void __incfsword(const unsigned long Offset
);
159 #pragma intrinsic(__incfsword)
160 void __incfsdword(const unsigned long Offset
);
161 #pragma intrinsic(__incfsdword)
162 void __addfsbyte(const unsigned long Offset
, const unsigned char Data
);
163 #pragma intrinsic(__addfsbyte)
164 void __addfsword(const unsigned long Offset
, const unsigned short Data
);
165 #pragma intrinsic(__addfsword)
166 void __addfsdword(const unsigned long Offset
, const unsigned int Data
);
167 #pragma intrinsic(__addfsdword)
171 /*** Bit manipulation ***/
172 unsigned char _BitScanForward(unsigned long * const Index
, const unsigned long Mask
);
173 #pragma intrinsic(_BitScanForward)
174 unsigned char _BitScanReverse(unsigned long * const Index
, const unsigned long Mask
);
175 #pragma intrinsic(_BitScanReverse)
176 unsigned char _bittest(const long * const a
, const long b
);
177 #pragma intrinsic(_bittest)
178 unsigned char _bittestandcomplement(long * const a
, const long b
);
179 #pragma intrinsic(_bittestandcomplement)
180 unsigned char _bittestandreset(long * const a
, const long b
);
181 #pragma intrinsic(_bittestandreset)
182 unsigned char _bittestandset(long * const a
, const long b
);
183 #pragma intrinsic(_bittestandset)
184 unsigned char _rotl8(unsigned char value
, unsigned char shift
);
185 #pragma intrinsic(_rotl8)
186 unsigned short _rotl16(unsigned short value
, unsigned char shift
);
187 #pragma intrinsic(_rotl16)
188 unsigned int _rotl(unsigned int value
, int shift
);
189 #pragma intrinsic(_rotl)
190 unsigned int _rotr(unsigned int value
, int shift
);
191 #pragma intrinsic(_rotr)
192 unsigned char _rotr8(unsigned char value
, unsigned char shift
);
193 #pragma intrinsic(_rotr8)
194 unsigned short _rotr16(unsigned short value
, unsigned char shift
);
195 #pragma intrinsic(_rotr16)
196 unsigned __int64
__ll_lshift(const unsigned __int64 Mask
, const int Bit
);
197 #pragma intrinsic(__ll_lshift)
198 __int64
__ll_rshift(const __int64 Mask
, const int Bit
);
199 #pragma intrinsic(__ll_rshift)
200 unsigned __int64
__ull_rshift(const unsigned __int64 Mask
, int Bit
);
201 #pragma intrinsic(__ull_rshift)
202 unsigned short _byteswap_ushort(unsigned short value
);
203 #pragma intrinsic(_byteswap_ushort)
204 unsigned long _byteswap_ulong(unsigned long value
);
205 #pragma intrinsic(_byteswap_ulong)
206 unsigned __int64
_byteswap_uint64(unsigned __int64 value
);
207 #pragma intrinsic(_byteswap_uint64)
209 /*** 64-bit math ***/
210 __int64
__emul(const int a
, const int b
);
211 #pragma intrinsic(__emul)
212 unsigned __int64
__emulu(const unsigned int a
, const unsigned int b
);
213 #pragma intrinsic(__emulu)
216 unsigned char __inbyte(const unsigned short Port
);
217 #pragma intrinsic(__inbyte)
218 unsigned short __inword(const unsigned short Port
);
219 #pragma intrinsic(__inword)
220 unsigned long __indword(const unsigned short Port
);
221 #pragma intrinsic(__indword)
222 void __inbytestring(unsigned short Port
, unsigned char * Buffer
, unsigned long Count
);
223 #pragma intrinsic(__inbytestring)
224 void __inwordstring(unsigned short Port
, unsigned short * Buffer
, unsigned long Count
);
225 #pragma intrinsic(__inwordstring)
226 void __indwordstring(unsigned short Port
, unsigned long * Buffer
, unsigned long Count
);
227 #pragma intrinsic(__indwordstring)
228 void __outbyte(unsigned short const Port
, const unsigned char Data
);
229 #pragma intrinsic(__outbyte)
230 void __outword(unsigned short const Port
, const unsigned short Data
);
231 #pragma intrinsic(__outword)
232 void __outdword(unsigned short const Port
, const unsigned long Data
);
233 #pragma intrinsic(__outdword)
234 void __outbytestring(unsigned short const Port
, const unsigned char * const Buffer
, const unsigned long Count
);
235 #pragma intrinsic(__outbytestring)
236 void __outwordstring(unsigned short const Port
, const unsigned short * const Buffer
, const unsigned long Count
);
237 #pragma intrinsic(__outwordstring)
238 void __outdwordstring(unsigned short const Port
, const unsigned long * const Buffer
, const unsigned long Count
);
239 #pragma intrinsic(__outdwordstring)
241 /*** System information ***/
242 void __cpuid(int CPUInfo
[], const int InfoType
);
243 #pragma intrinsic(__cpuid)
244 unsigned __int64
__rdtsc(void);
245 #pragma intrinsic(__rdtsc)
246 void __writeeflags(uintptr_t Value
);
247 #pragma intrinsic(__writeeflags)
248 uintptr_t __readeflags(void);
249 #pragma intrinsic(__readeflags)
252 void __debugbreak(void);
253 #pragma intrinsic(__debugbreak)
255 #pragma intrinsic(__int2c)
257 #pragma intrinsic(_disable)
259 #pragma intrinsic(_enable)
261 #pragma intrinsic(__halt)
263 /*** Protected memory management ***/
264 void __writecr0(const unsigned __int64 Data
);
265 #pragma intrinsic(__writecr0)
266 void __writecr3(const unsigned __int64 Data
);
267 #pragma intrinsic(__writecr3)
268 void __writecr4(const unsigned __int64 Data
);
269 #pragma intrinsic(__writecr4)
272 void __writecr8(const unsigned __int64 Data
);
273 #pragma intrinsic(__writecr8)
274 unsigned __int64
__readcr0(void);
275 #pragma intrinsic(__readcr0)
276 unsigned __int64
__readcr2(void);
277 #pragma intrinsic(__readcr2)
278 unsigned __int64
__readcr3(void);
279 #pragma intrinsic(__readcr3)
280 unsigned __int64
__readcr4(void);
281 #pragma intrinsic(__readcr4)
282 unsigned __int64
__readcr8(void);
283 #pragma intrinsic(__readcr8)
284 unsigned __int64
__readdr(unsigned int reg
);
285 #pragma intrinsic(__readdr)
286 void __writedr(unsigned reg
, unsigned __int64 value
);
287 #pragma intrinsic(__writedr)
289 unsigned long __readcr0(void);
290 unsigned long __readcr2(void);
291 unsigned long __readcr3(void);
292 unsigned long __readcr4(void);
293 unsigned int __readdr(unsigned int reg
);
294 void __writedr(unsigned reg
, unsigned int value
);
297 void __invlpg(void * const Address
);
298 #pragma intrinsic(__invlpg)
300 /*** System operations ***/
301 unsigned __int64
__readmsr(const int reg
);
302 #pragma intrinsic(__readmsr)
303 void __writemsr(const unsigned long Register
, const unsigned __int64 Value
);
304 #pragma intrinsic(__writemsr)
305 unsigned __int64
__readpmc(const int counter
);
306 #pragma intrinsic(__readpmc)
307 unsigned long __segmentlimit(const unsigned long a
);
308 #pragma intrinsic(__segmentlimit)
310 #pragma intrinsic(__wbinvd)
311 void __lidt(void *Source
);
312 #pragma intrinsic(__lidt)
313 void __sidt(void *Destination
);
314 #pragma intrinsic(__sidt)
315 void _mm_pause(void);
316 #pragma intrinsic(_mm_pause)
322 #endif /* KJK_INTRIN_H_ */