Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenintrin.h
Go to the documentation of this file.
00001 #ifndef KJK_INTRIN_H_ 00002 #define KJK_INTRIN_H_ 00003 00004 #ifdef __cplusplus 00005 extern "C" { 00006 #endif 00007 00008 /*** Stack frame juggling ***/ 00009 void * _ReturnAddress(void); 00010 #pragma intrinsic(_ReturnAddress) 00011 void * _AddressOfReturnAddress(void); 00012 #pragma intrinsic(_AddressOfReturnAddress) 00013 unsigned int __getcallerseflags(void); 00014 #pragma intrinsic(__getcallerseflags) 00015 00016 /*** Memory barriers ***/ 00017 void _ReadWriteBarrier(void); 00018 #pragma intrinsic(_ReadWriteBarrier) 00019 void _ReadBarrier(void); 00020 #pragma intrinsic(_ReadBarrier) 00021 void _WriteBarrier(void); 00022 #pragma intrinsic(_WriteBarrier) 00023 void _mm_mfence(void); 00024 #pragma intrinsic(_mm_mfence) 00025 void _mm_lfence(void); 00026 #pragma intrinsic(_mm_lfence) 00027 void _mm_sfence(void); 00028 #pragma intrinsic(_mm_sfence) 00029 #ifdef _M_AMD64 00030 void __faststorefence(void); 00031 #pragma intrinsic(__faststorefence) 00032 #endif 00033 00034 /*** Atomic operations ***/ 00035 long _InterlockedCompareExchange(volatile long * Destination, long Exchange, long Comperand); 00036 #pragma intrinsic(_InterlockedCompareExchange) 00037 long _InterlockedExchange(volatile long * Target, long Value); 00038 #pragma intrinsic(_InterlockedExchange) 00039 long _InterlockedExchangeAdd(volatile long * Addend, long Value); 00040 #pragma intrinsic(_InterlockedExchangeAdd) 00041 char _InterlockedAnd8(volatile char * value, char mask); 00042 #pragma intrinsic(_InterlockedAnd8) 00043 short _InterlockedAnd16(volatile short * value, short mask); 00044 #pragma intrinsic(_InterlockedAnd16) 00045 long _InterlockedAnd(volatile long * value, long mask); 00046 #pragma intrinsic(_InterlockedAnd) 00047 char _InterlockedOr8(volatile char * value, char mask); 00048 #pragma intrinsic(_InterlockedOr8) 00049 short _InterlockedOr16(volatile short * value, short mask); 00050 #pragma intrinsic(_InterlockedOr16) 00051 long _InterlockedOr(volatile long * value, long mask); 00052 #pragma intrinsic(_InterlockedOr) 00053 char _InterlockedXor8(volatile char * value, char mask); 00054 #pragma intrinsic(_InterlockedXor8) 00055 short _InterlockedXor16(volatile short * value, short mask); 00056 #pragma intrinsic(_InterlockedXor16) 00057 long _InterlockedXor(volatile long * value, long mask); 00058 #pragma intrinsic(_InterlockedXor) 00059 long _InterlockedDecrement(volatile long * lpAddend); 00060 #pragma intrinsic(_InterlockedDecrement) 00061 long _InterlockedIncrement(volatile long * lpAddend); 00062 #pragma intrinsic(_InterlockedIncrement) 00063 short _InterlockedDecrement16(volatile short * lpAddend); 00064 #pragma intrinsic(_InterlockedDecrement16) 00065 short _InterlockedIncrement16(volatile short * lpAddend); 00066 #pragma intrinsic(_InterlockedIncrement16) 00067 unsigned char _interlockedbittestandreset(volatile long * a, long b); 00068 #pragma intrinsic(_interlockedbittestandreset) 00069 unsigned char _interlockedbittestandset(volatile long * a, long b); 00070 #pragma intrinsic(_interlockedbittestandset) 00071 00072 #if defined(_M_IX86) 00073 long _InterlockedAddLargeStatistic(volatile __int64 * Addend, long Value); 00074 #pragma intrinsic(_InterlockedAddLargeStatistic) 00075 #elif defined(_M_AMD64) 00076 __int64 _InterlockedExchange64(volatile __int64 * Target, __int64 Value); 00077 #pragma intrinsic(_InterlockedExchange64) 00078 __int64 _InterlockedExchangeAdd64(volatile __int64 * Addend, __int64 Value); 00079 #pragma intrinsic(_InterlockedExchangeAdd64) 00080 void * _InterlockedCompareExchangePointer(void * volatile * Destination, void * Exchange, void * Comperand); 00081 #pragma intrinsic(_InterlockedCompareExchangePointer) 00082 void * _InterlockedExchangePointer(void * volatile * Target, void * Value); 00083 #pragma intrinsic(_InterlockedExchangePointer) 00084 __int64 _InterlockedAnd64(volatile __int64 * value, __int64 mask); 00085 #pragma intrinsic(_InterlockedAnd64) 00086 __int64 _InterlockedOr64(volatile __int64 * value, __int64 mask); 00087 #pragma intrinsic(_InterlockedOr64) 00088 __int64 _InterlockedCompareExchange64(volatile __int64 * Destination, __int64 Exchange, __int64 Comperand); 00089 #pragma intrinsic(_InterlockedCompareExchange64) 00090 __int64 _InterlockedDecrement64(volatile __int64 * lpAddend); 00091 #pragma intrinsic(_InterlockedDecrement64) 00092 __int64 _InterlockedIncrement64(volatile __int64 * lpAddend); 00093 #pragma intrinsic(_InterlockedIncrement64) 00094 unsigned char _interlockedbittestandreset64(volatile __int64 * a, __int64 b); 00095 #pragma intrinsic(_interlockedbittestandreset64) 00096 unsigned char _interlockedbittestandset64(volatile __int64 * a, __int64 b); 00097 #pragma intrinsic(_interlockedbittestandset64) 00098 #endif 00099 00100 /*** String operations ***/ 00101 void __stosb(unsigned char * Dest, unsigned char Data, size_t Count); 00102 #pragma intrinsic(__stosb) 00103 void __stosw(unsigned short * Dest, unsigned short Data, size_t Count); 00104 #pragma intrinsic(__stosw) 00105 void __stosd(unsigned long * Dest, unsigned long Data, size_t Count); 00106 #pragma intrinsic(__stosd) 00107 void __movsb(unsigned char * Destination, unsigned char const * Source, size_t Count); 00108 #pragma intrinsic(__movsb) 00109 void __movsw(unsigned short * Destination, unsigned short const * Source, size_t Count); 00110 #pragma intrinsic(__movsw) 00111 void __movsd(unsigned long * Destination, unsigned long const * Source, size_t Count); 00112 #pragma intrinsic(__movsd) 00113 #ifdef _M_AMD64 00114 void __movsq(unsigned __int64 * Destination, unsigned __int64 const * Source, size_t Count); 00115 #pragma intrinsic(__movsq) 00116 #endif 00117 00118 #if defined(_M_AMD64) 00119 /*** GS segment addressing ***/ 00120 void __writegsbyte(unsigned long Offset, unsigned char Data); 00121 #pragma intrinsic(__writegsbyte) 00122 void __writegsword(unsigned long Offset, unsigned short Data); 00123 #pragma intrinsic(__writegsword) 00124 void __writegsdword(unsigned long Offset, unsigned long Data); 00125 #pragma intrinsic(__writegsdword) 00126 void __writegsqword(unsigned long Offset, unsigned __int64 Data); 00127 #pragma intrinsic(__writegsqword) 00128 unsigned char __readgsbyte(unsigned long Offset); 00129 #pragma intrinsic(__readgsbyte) 00130 unsigned short __readgsword(unsigned long Offset); 00131 #pragma intrinsic(__readgsword) 00132 unsigned long __readgsdword(unsigned long Offset); 00133 #pragma intrinsic(__readgsdword) 00134 unsigned __int64 __readgsqword(unsigned long Offset); 00135 #pragma intrinsic(__readgsqword) 00136 void __incgsbyte(unsigned long Offset); 00137 #pragma intrinsic(__incgsbyte) 00138 void __incgsword(unsigned long Offset); 00139 #pragma intrinsic(__incgsword) 00140 void __incgsdword(unsigned long Offset); 00141 #pragma intrinsic(__incgsdword) 00142 void __addgsbyte(unsigned long Offset, unsigned char Data); 00143 #pragma intrinsic(__addgsbyte) 00144 void __addgsword(unsigned long Offset, unsigned short Data); 00145 #pragma intrinsic(__addgsword) 00146 void __addgsdword(unsigned long Offset, unsigned int Data); 00147 #pragma intrinsic(__addgsdword) 00148 void __addgsqword(unsigned long Offset, unsigned __int64 Data); 00149 #pragma intrinsic(__addgsqword) 00150 #endif 00151 00152 #if defined(_M_IX86) 00153 /*** FS segment addressing ***/ 00154 void __writefsbyte(unsigned long Offset, unsigned char Data); 00155 #pragma intrinsic(__writefsbyte) 00156 void __writefsword(unsigned long Offset, unsigned short Data); 00157 #pragma intrinsic(__writefsword) 00158 void __writefsdword(unsigned long Offset, unsigned long Data); 00159 #pragma intrinsic(__writefsdword) 00160 unsigned char __readfsbyte(unsigned long Offset); 00161 #pragma intrinsic(__readfsbyte) 00162 unsigned short __readfsword(unsigned long Offset); 00163 #pragma intrinsic(__readfsword) 00164 unsigned long __readfsdword(unsigned long Offset); 00165 #pragma intrinsic(__readfsdword) 00166 void __incfsbyte(unsigned long Offset); 00167 #pragma intrinsic(__incfsbyte) 00168 void __incfsword(unsigned long Offset); 00169 #pragma intrinsic(__incfsword) 00170 void __incfsdword(unsigned long Offset); 00171 #pragma intrinsic(__incfsdword) 00172 void __addfsbyte(unsigned long Offset, unsigned char Data); 00173 #pragma intrinsic(__addfsbyte) 00174 void __addfsword(unsigned long Offset, unsigned short Data); 00175 #pragma intrinsic(__addfsword) 00176 void __addfsdword(unsigned long Offset, unsigned int Data); 00177 #pragma intrinsic(__addfsdword) 00178 #endif 00179 00180 00181 /*** Bit manipulation ***/ 00182 unsigned char _BitScanForward(unsigned long * Index, unsigned long Mask); 00183 #pragma intrinsic(_BitScanForward) 00184 unsigned char _BitScanReverse(unsigned long * Index, unsigned long Mask); 00185 #pragma intrinsic(_BitScanReverse) 00186 unsigned char _bittest(const long * a, long b); 00187 #pragma intrinsic(_bittest) 00188 unsigned char _bittestandcomplement(long * a, long b); 00189 #pragma intrinsic(_bittestandcomplement) 00190 unsigned char _bittestandreset(long * a, long b); 00191 #pragma intrinsic(_bittestandreset) 00192 unsigned char _bittestandset(long * a, long b); 00193 #pragma intrinsic(_bittestandset) 00194 unsigned char _rotl8(unsigned char value, unsigned char shift); 00195 #pragma intrinsic(_rotl8) 00196 unsigned short _rotl16(unsigned short value, unsigned char shift); 00197 #pragma intrinsic(_rotl16) 00198 unsigned int _rotl(unsigned int value, int shift); 00199 #pragma intrinsic(_rotl) 00200 unsigned int _rotr(unsigned int value, int shift); 00201 #pragma intrinsic(_rotr) 00202 unsigned char _rotr8(unsigned char value, unsigned char shift); 00203 #pragma intrinsic(_rotr8) 00204 unsigned short _rotr16(unsigned short value, unsigned char shift); 00205 #pragma intrinsic(_rotr16) 00206 unsigned __int64 __ll_lshift(unsigned __int64 Mask, int Bit); 00207 #pragma intrinsic(__ll_lshift) 00208 __int64 __ll_rshift(__int64 Mask, int Bit); 00209 #pragma intrinsic(__ll_rshift) 00210 unsigned __int64 __ull_rshift(unsigned __int64 Mask, int Bit); 00211 #pragma intrinsic(__ull_rshift) 00212 unsigned short _byteswap_ushort(unsigned short value); 00213 #pragma intrinsic(_byteswap_ushort) 00214 unsigned long _byteswap_ulong(unsigned long value); 00215 #pragma intrinsic(_byteswap_ulong) 00216 unsigned __int64 _byteswap_uint64(unsigned __int64 value); 00217 #pragma intrinsic(_byteswap_uint64) 00218 #ifdef _M_AMD64 00219 unsigned char _bittest64(__int64 const *a, __int64 b); 00220 #pragma intrinsic(_bittest64) 00221 #endif 00222 00223 /*** 64-bit math ***/ 00224 __int64 __emul(int a, int b); 00225 #pragma intrinsic(__emul) 00226 unsigned __int64 __emulu(unsigned int a, unsigned int b); 00227 #pragma intrinsic(__emulu) 00228 #ifdef _M_AMD64 00229 unsigned __int64 __umulh(unsigned __int64 a, unsigned __int64 b); 00230 #pragma intrinsic(__umulh) 00231 #endif 00232 00233 /*** Port I/O ***/ 00234 unsigned char __inbyte(unsigned short Port); 00235 #pragma intrinsic(__inbyte) 00236 unsigned short __inword(unsigned short Port); 00237 #pragma intrinsic(__inword) 00238 unsigned long __indword(unsigned short Port); 00239 #pragma intrinsic(__indword) 00240 void __inbytestring(unsigned short Port, unsigned char * Buffer, unsigned long Count); 00241 #pragma intrinsic(__inbytestring) 00242 void __inwordstring(unsigned short Port, unsigned short * Buffer, unsigned long Count); 00243 #pragma intrinsic(__inwordstring) 00244 void __indwordstring(unsigned short Port, unsigned long * Buffer, unsigned long Count); 00245 #pragma intrinsic(__indwordstring) 00246 void __outbyte(unsigned short Port, unsigned char Data); 00247 #pragma intrinsic(__outbyte) 00248 void __outword(unsigned short Port, unsigned short Data); 00249 #pragma intrinsic(__outword) 00250 void __outdword(unsigned short Port, unsigned long Data); 00251 #pragma intrinsic(__outdword) 00252 void __outbytestring(unsigned short Port, unsigned char * Buffer, unsigned long Count); 00253 #pragma intrinsic(__outbytestring) 00254 void __outwordstring(unsigned short Port, unsigned short * Buffer, unsigned long Count); 00255 #pragma intrinsic(__outwordstring) 00256 void __outdwordstring(unsigned short Port, unsigned long * Buffer, unsigned long Count); 00257 #pragma intrinsic(__outdwordstring) 00258 00259 /*** System information ***/ 00260 void __cpuid(int CPUInfo[], int InfoType); 00261 #pragma intrinsic(__cpuid) 00262 unsigned __int64 __rdtsc(void); 00263 #pragma intrinsic(__rdtsc) 00264 void __writeeflags(uintptr_t Value); 00265 #pragma intrinsic(__writeeflags) 00266 uintptr_t __readeflags(void); 00267 #pragma intrinsic(__readeflags) 00268 00269 /*** Interrupts ***/ 00270 void __debugbreak(void); 00271 #pragma intrinsic(__debugbreak) 00272 void __int2c(void); 00273 #pragma intrinsic(__int2c) 00274 void _disable(void); 00275 #pragma intrinsic(_disable) 00276 void _enable(void); 00277 #pragma intrinsic(_enable) 00278 void __halt(void); 00279 #pragma intrinsic(__halt) 00280 00281 /*** Protected memory management ***/ 00282 void __writecr0(unsigned __int64 Data); 00283 #pragma intrinsic(__writecr0) 00284 void __writecr3(unsigned __int64 Data); 00285 #pragma intrinsic(__writecr3) 00286 void __writecr4(unsigned __int64 Data); 00287 #pragma intrinsic(__writecr4) 00288 00289 #ifdef _M_AMD64 00290 void __writecr8(unsigned __int64 Data); 00291 #pragma intrinsic(__writecr8) 00292 unsigned __int64 __readcr0(void); 00293 #pragma intrinsic(__readcr0) 00294 unsigned __int64 __readcr2(void); 00295 #pragma intrinsic(__readcr2) 00296 unsigned __int64 __readcr3(void); 00297 #pragma intrinsic(__readcr3) 00298 unsigned __int64 __readcr4(void); 00299 #pragma intrinsic(__readcr4) 00300 unsigned __int64 __readcr8(void); 00301 #pragma intrinsic(__readcr8) 00302 unsigned __int64 __readdr(unsigned int reg); 00303 #pragma intrinsic(__readdr) 00304 void __writedr(unsigned reg, unsigned __int64 value); 00305 #pragma intrinsic(__writedr) 00306 #else 00307 unsigned long __readcr0(void); 00308 unsigned long __readcr2(void); 00309 unsigned long __readcr3(void); 00310 //unsigned long __readcr4(void); 00311 //#pragma intrinsic(__readcr4) 00312 // HACK: MSVC is broken 00313 unsigned long ___readcr4(void); 00314 #define __readcr4 ___readcr4 00315 00316 unsigned int __readdr(unsigned int reg); 00317 void __writedr(unsigned reg, unsigned int value); 00318 #endif 00319 00320 void __invlpg(void * Address); 00321 #pragma intrinsic(__invlpg) 00322 00323 #ifdef _M_IX86 00324 // This intrinsic is broken and generates wrong opcodes, 00325 // when optimization is enabled! 00326 #pragma warning(push) 00327 #pragma warning(disable:4711) 00328 void __forceinline __invlpg_fixed(void * Address) 00329 { 00330 _ReadWriteBarrier(); 00331 __asm 00332 { 00333 mov eax, Address 00334 invlpg [eax] 00335 } 00336 _ReadWriteBarrier(); 00337 } 00338 #pragma warning(pop) 00339 #define __invlpg __invlpg_fixed 00340 #endif 00341 00342 /*** System operations ***/ 00343 unsigned __int64 __readmsr(int reg); 00344 #pragma intrinsic(__readmsr) 00345 void __writemsr(unsigned long Register, unsigned __int64 Value); 00346 #pragma intrinsic(__writemsr) 00347 unsigned __int64 __readpmc(int counter); 00348 #pragma intrinsic(__readpmc) 00349 unsigned long __segmentlimit(unsigned long a); 00350 #pragma intrinsic(__segmentlimit) 00351 void __wbinvd(void); 00352 #pragma intrinsic(__wbinvd) 00353 void __lidt(void *Source); 00354 #pragma intrinsic(__lidt) 00355 void __sidt(void *Destination); 00356 #pragma intrinsic(__sidt) 00357 void _mm_pause(void); 00358 #pragma intrinsic(_mm_pause) 00359 00360 #ifdef __cplusplus 00361 } 00362 #endif 00363 00364 #endif /* KJK_INTRIN_H_ */ 00365 00366 /* EOF */ Generated on Sat May 26 2012 04:28:28 for ReactOS by
1.7.6.1
|