#ifdef __cplusplus extern "C" { #endif /*** Stack frame juggling ***/ #pragma intrinsic(_ReturnAddress) #pragma intrinsic(_AddressOfReturnAddress) #if defined(_M_IX86) || defined(_M_AMD64) #pragma intrinsic(__getcallerseflags) #endif /*** Memory barriers ***/ #pragma intrinsic(_ReadWriteBarrier) #pragma intrinsic(_ReadBarrier) #pragma intrinsic(_WriteBarrier) #if defined(_M_IX86) || defined(_M_AMD64) #pragma intrinsic(_mm_mfence) #pragma intrinsic(_mm_lfence) #pragma intrinsic(_mm_sfence) #endif #if defined(_M_AMD64) #pragma intrinsic(__faststorefence) #elif defined(_M_ARM) #pragma intrinsic(__iso_volatile_load16) #pragma intrinsic(__iso_volatile_load32) #pragma intrinsic(__iso_volatile_load64) #pragma intrinsic(__iso_volatile_load8) #pragma intrinsic(__iso_volatile_store16) #pragma intrinsic(__iso_volatile_store32) #pragma intrinsic(__iso_volatile_store64) #pragma intrinsic(__iso_volatile_store8) #endif /*** Atomic operations ***/ #pragma intrinsic(_InterlockedCompareExchange) #pragma intrinsic(_InterlockedCompareExchange8) #pragma intrinsic(_InterlockedCompareExchange16) #pragma intrinsic(_InterlockedCompareExchange64) #pragma intrinsic(_InterlockedExchange) #pragma intrinsic(_InterlockedExchange8) #pragma intrinsic(_InterlockedExchange16) #pragma intrinsic(_InterlockedExchangeAdd) #pragma intrinsic(_InterlockedExchangeAdd8) #pragma intrinsic(_InterlockedExchangeAdd16) #pragma intrinsic(_InterlockedAnd8) #pragma intrinsic(_InterlockedAnd16) #pragma intrinsic(_InterlockedAnd) #pragma intrinsic(_InterlockedOr8) #pragma intrinsic(_InterlockedOr16) #pragma intrinsic(_InterlockedOr) #pragma intrinsic(_InterlockedXor8) #pragma intrinsic(_InterlockedXor16) #pragma intrinsic(_InterlockedXor) #pragma intrinsic(_InterlockedDecrement) #pragma intrinsic(_InterlockedIncrement) #pragma intrinsic(_InterlockedDecrement16) #pragma intrinsic(_InterlockedIncrement16) #pragma intrinsic(_interlockedbittestandreset) #pragma intrinsic(_interlockedbittestandset) #if defined(_M_IX86) #pragma intrinsic(_InterlockedAddLargeStatistic) #elif defined(_M_AMD64) #pragma intrinsic(_InterlockedExchange64) #pragma intrinsic(_InterlockedExchangeAdd64) #pragma intrinsic(_InterlockedCompareExchangePointer) #pragma intrinsic(_InterlockedExchangePointer) #pragma intrinsic(_InterlockedCompareExchange128) #pragma intrinsic(_InterlockedAnd64) #pragma intrinsic(_InterlockedOr64) #pragma intrinsic(_InterlockedDecrement64) #pragma intrinsic(_InterlockedIncrement64) #pragma intrinsic(_interlockedbittestandreset64) #pragma intrinsic(_interlockedbittestandset64) #pragma intrinsic(_InterlockedAnd_np) #pragma intrinsic(_InterlockedAnd8_np) #pragma intrinsic(_InterlockedAnd16_np) #pragma intrinsic(_InterlockedAnd64_np) #pragma intrinsic(_InterlockedCompareExchange16_np) #pragma intrinsic(_InterlockedCompareExchange64_np) #pragma intrinsic(_InterlockedCompareExchange128_np) #pragma intrinsic(_InterlockedCompareExchangePointer_np) #pragma intrinsic(_InterlockedCompareExchange_np) #pragma intrinsic(_InterlockedOr16_np) #pragma intrinsic(_InterlockedOr8_np) #pragma intrinsic(_InterlockedOr_np) #pragma intrinsic(_InterlockedXor16_np) #pragma intrinsic(_InterlockedXor64_np) #pragma intrinsic(_InterlockedXor8_np) #pragma intrinsic(_InterlockedXor_np) #pragma intrinsic(_InterlockedOr64_np) #elif defined(_M_ARM) #endif #if defined(_M_AMD64) || defined(_M_ARM) #endif /*** String operations ***/ #if defined(_M_IX86) || defined(_M_AMD64) #pragma intrinsic(__stosb) #pragma intrinsic(__stosw) #pragma intrinsic(__stosd) #pragma intrinsic(__movsb) #pragma intrinsic(__movsw) #pragma intrinsic(__movsd) #endif #ifdef _M_AMD64 #pragma intrinsic(__stosq) #pragma intrinsic(__movsq) #endif /*** GS segment addressing ***/ #if defined(_M_AMD64) #pragma intrinsic(__writegsbyte) #pragma intrinsic(__writegsword) #pragma intrinsic(__writegsdword) #pragma intrinsic(__writegsqword) #pragma intrinsic(__readgsbyte) #pragma intrinsic(__readgsword) #pragma intrinsic(__readgsdword) #pragma intrinsic(__readgsqword) #pragma intrinsic(__incgsbyte) #pragma intrinsic(__incgsword) #pragma intrinsic(__incgsdword) #pragma intrinsic(__incgsqword) #pragma intrinsic(__addgsbyte) #pragma intrinsic(__addgsword) #pragma intrinsic(__addgsdword) #pragma intrinsic(__addgsqword) #endif /*** FS segment addressing ***/ #if defined(_M_IX86) #pragma intrinsic(__writefsbyte) #pragma intrinsic(__writefsword) #pragma intrinsic(__writefsdword) #pragma intrinsic(__writefsdword) #pragma intrinsic(__readfsbyte) #pragma intrinsic(__readfsword) #pragma intrinsic(__readfsdword) #pragma intrinsic(__incfsbyte) #pragma intrinsic(__incfsword) #pragma intrinsic(__incfsdword) #pragma intrinsic(__addfsbyte) #pragma intrinsic(__addfsword) #pragma intrinsic(__addfsdword) #endif /*** Bit manipulation ***/ #pragma intrinsic(_BitScanForward) #pragma intrinsic(_BitScanReverse) #ifdef _WIN64 #pragma intrinsic(_BitScanForward64) #pragma intrinsic(_BitScanReverse64) #endif #pragma intrinsic(_bittest) #pragma intrinsic(_bittestandcomplement) #pragma intrinsic(_bittestandreset) #pragma intrinsic(_bittestandset) #pragma intrinsic(_rotl8) #pragma intrinsic(_rotl16) #pragma intrinsic(_rotl) #pragma intrinsic(_rotl64) #pragma intrinsic(_lrotl) #pragma intrinsic(_rotr8) #pragma intrinsic(_rotr16) #pragma intrinsic(_rotr) #pragma intrinsic(_rotr64) #pragma intrinsic(_lrotr) #pragma intrinsic(_byteswap_ushort) #pragma intrinsic(_byteswap_ulong) #pragma intrinsic(_byteswap_uint64) #if defined(_M_IX86) || defined(_M_AMD64) #pragma intrinsic(__ll_lshift) #pragma intrinsic(__ll_rshift) #pragma intrinsic(__ull_rshift) #pragma intrinsic(__lzcnt) #pragma intrinsic(__lzcnt16) #pragma intrinsic(__popcnt) #pragma intrinsic(__popcnt16) #endif #ifdef _M_AMD64 #pragma intrinsic(__shiftleft128) #pragma intrinsic(__shiftright128) #pragma intrinsic(_bittest64) #pragma intrinsic(_bittestandcomplement64) #pragma intrinsic(_bittestandreset64) #pragma intrinsic(_bittestandset64) #pragma intrinsic(__lzcnt64) #pragma intrinsic(__popcnt64) #elif defined(_M_ARM) #endif /*** 64/128-bit math ***/ #pragma intrinsic(_abs64) #if defined(_M_IX86) || defined(_M_AMD64) #pragma intrinsic(__emul) #pragma intrinsic(__emulu) #endif #ifdef _M_AMD64 #pragma intrinsic(__mulh) #pragma intrinsic(__umulh) #pragma intrinsic(_mul128) #pragma intrinsic(_umul128) #elif defined(_M_ARM) #pragma intrinsic(_MulHigh) #pragma intrinsic(_MulUnsignedHigh) #endif /** Floating point stuff **/ #if defined(_M_ARM) #pragma intrinsic(_isunordered) #pragma intrinsic(_isunorderedf) #pragma intrinsic(_CopyDoubleFromInt64) #pragma intrinsic(_CopyFloatFromInt32) #pragma intrinsic(_CopyInt32FromFloat) #pragma intrinsic(_CopyInt64FromDouble) #endif /*** Port I/O ***/ #if defined(_M_IX86) || defined(_M_AMD64) #pragma intrinsic(__inbyte) #pragma intrinsic(__inword) #pragma intrinsic(__indword) #pragma intrinsic(__inbytestring) #pragma intrinsic(__inwordstring) #pragma intrinsic(__indwordstring) #pragma intrinsic(__outbyte) #pragma intrinsic(__outword) #pragma intrinsic(__outdword) #pragma intrinsic(__outbytestring) #pragma intrinsic(__outwordstring) #pragma intrinsic(__outdwordstring) #pragma intrinsic(_inp) #pragma intrinsic(_inpd) #pragma intrinsic(_inpw) #pragma intrinsic(inp) #pragma intrinsic(inpd) #pragma intrinsic(inpw) #pragma intrinsic(_outp) #pragma intrinsic(_outpd) #pragma intrinsic(_outpw) #pragma intrinsic(outp) #pragma intrinsic(outpd) #pragma intrinsic(outpw) #endif /*** System information ***/ #if defined(_M_IX86) || defined(_M_AMD64) #pragma intrinsic(__cpuid) #pragma intrinsic(__cpuidex) #pragma intrinsic(__rdtsc) #pragma intrinsic(__rdtscp) #pragma intrinsic(__writeeflags) #pragma intrinsic(__readeflags) #endif /*** Interrupts and traps ***/ #pragma intrinsic(__debugbreak) #pragma intrinsic(_disable) #pragma intrinsic(_enable) #if defined(_M_IX86) || defined(_M_AMD64) #pragma intrinsic(__int2c) #pragma intrinsic(__halt) #pragma intrinsic(__ud2) #if (_MSC_VER >= 1700) #pragma intrinsic(__fastfail) #else __declspec(noreturn) __forceinline void __fastfail(unsigned int Code) { __asm { mov ecx, Code int 29h } } #endif #endif #if defined(_M_ARM) #endif /*** Protected memory management ***/ #if defined(_M_IX86) || defined(_M_AMD64) #pragma intrinsic(__writecr0) #pragma intrinsic(__writecr3) #pragma intrinsic(__writecr4) #pragma intrinsic(__writecr8) #endif #if defined(_M_IX86) #pragma intrinsic(__readcr0) #pragma intrinsic(__readcr2) #pragma intrinsic(__readcr3) //#pragma intrinsic(__readcr4) // HACK: MSVC is broken unsigned long __cdecl ___readcr4(void); #define __readcr4 ___readcr4 #pragma intrinsic(__readcr8) #pragma intrinsic(__readdr) #pragma intrinsic(__writedr) // This intrinsic is broken and generates wrong opcodes, // when optimization is enabled! #pragma warning(push) #pragma warning(disable:4711) void __forceinline __invlpg_fixed(void * Address) { _ReadWriteBarrier(); __asm { mov eax, Address invlpg [eax] } _ReadWriteBarrier(); } #pragma warning(pop) #define __invlpg __invlpg_fixed #elif defined(_M_AMD64) #pragma intrinsic(__invlpg) #pragma intrinsic(__readcr0) #pragma intrinsic(__readcr2) #pragma intrinsic(__readcr3) #pragma intrinsic(__readcr4) #pragma intrinsic(__readcr8) #pragma intrinsic(__readdr) #pragma intrinsic(__writedr) #elif defined(_M_ARM) #pragma intrinsic(__prefetch) #endif /*** System operations ***/ #if defined(_M_IX86) || defined(_M_AMD64) #pragma intrinsic(__readmsr) #pragma intrinsic(__writemsr) #pragma intrinsic(__readpmc) #pragma intrinsic(__segmentlimit) #pragma intrinsic(__wbinvd) #pragma intrinsic(__lidt) #pragma intrinsic(__sidt) #if (_MSC_VER >= 1800) #pragma intrinsic(_sgdt) #else __forceinline void _sgdt(void *Destination) { __asm { mov eax, Destination sgdt [eax] } } #endif #pragma intrinsic(_mm_pause) #endif #if defined(_M_ARM) #pragma intrinsic(_MoveFromCoprocessor) #pragma intrinsic(_MoveFromCoprocessor2) #pragma intrinsic(_MoveFromCoprocessor64) #pragma intrinsic(_MoveToCoprocessor) #pragma intrinsic(_MoveToCoprocessor2) #pragma intrinsic(_MoveToCoprocessor64) #pragma intrinsic(_ReadStatusReg) #pragma intrinsic(_WriteStatusReg) #pragma intrinsic(__yield) #pragma intrinsic(__wfe) #pragma intrinsic(__wfi) #pragma intrinsic(__swi) #pragma intrinsic(__hvc) #pragma intrinsic(__ldrexd) #pragma intrinsic(__rdpmccntr64) #pragma intrinsic(__sev) #endif /** Secure virtual machine **/ #if defined(_M_IX86) || defined(_M_AMD64) #pragma intrinsic(__svm_clgi) #pragma intrinsic(__svm_invlpga) #pragma intrinsic(__svm_skinit) #pragma intrinsic(__svm_stgi) #pragma intrinsic(__svm_vmload) #pragma intrinsic(__svm_vmrun) #pragma intrinsic(__svm_vmsave) #endif /** Virtual machine extension **/ #if defined(_M_IX86) || defined(_M_AMD64) #endif #if defined(_M_AMD64) #endif /** Misc **/ #pragma intrinsic(__nop) #if (_MSC_VER >= 1700) #pragma intrinsic(__code_seg) #endif #ifdef _M_ARM #pragma intrinsic(_AddSatInt) #pragma intrinsic(_DAddSatInt) #pragma intrinsic(_DSubSatInt) #pragma intrinsic(_SubSatInt) #pragma intrinsic(__emit) #pragma intrinsic(__static_assert) #endif #ifdef __cplusplus } #endif /* EOF */