[AMD64]
[reactos.git] / reactos / include / crt / msc / intrin.h
index ed53695..07f92ea 100644 (file)
@@ -10,209 +10,505 @@ void * _ReturnAddress(void);
 #pragma intrinsic(_ReturnAddress)
 void * _AddressOfReturnAddress(void);
 #pragma intrinsic(_AddressOfReturnAddress)
+#if defined(_M_IX86) || defined(_M_AMD64)
 unsigned int __getcallerseflags(void);
 #pragma intrinsic(__getcallerseflags)
+#endif
 
-/*** Atomic operations ***/
+/*** Memory barriers ***/
 void _ReadWriteBarrier(void);
 #pragma intrinsic(_ReadWriteBarrier)
 void _ReadBarrier(void);
 #pragma intrinsic(_ReadBarrier)
 void _WriteBarrier(void);
 #pragma intrinsic(_WriteBarrier)
+#if defined(_M_IX86) || defined(_M_AMD64)
+void _mm_mfence(void);
+#pragma intrinsic(_mm_mfence)
+void _mm_lfence(void);
+#pragma intrinsic(_mm_lfence)
+void _mm_sfence(void);
+#pragma intrinsic(_mm_sfence)
+void __nvreg_restore_fence(void);
+void __nvreg_save_fence(void);
+#endif
+#if defined(_M_AMD64)
+void __faststorefence(void);
+#pragma intrinsic(__faststorefence)
+#elif defined(_M_ARM)
+__int16 __iso_volatile_load16(const volatile __int16 *);
+#pragma intrinsic(__iso_volatile_load16)
+__int32 __iso_volatile_load32(const volatile __int32 *);
+#pragma intrinsic(__iso_volatile_load32)
+__int64 __iso_volatile_load64(const volatile __int64 *);
+#pragma intrinsic(__iso_volatile_load64)
+__int8 __iso_volatile_load8(const volatile __int8 *);
+#pragma intrinsic(__iso_volatile_load8)
+void __iso_volatile_store16(volatile __int16 *, __int16);
+#pragma intrinsic(__iso_volatile_store16)
+void __iso_volatile_store32(volatile __int32 *, __int32);
+#pragma intrinsic(__iso_volatile_store32)
+void __iso_volatile_store64(volatile __int64 *, __int64);
+#pragma intrinsic(__iso_volatile_store64)
+void __iso_volatile_store8(volatile __int8 *, __int8);
+#pragma intrinsic(__iso_volatile_store8)
+#endif
 
-long _InterlockedCompareExchange(volatile long * const Destination, const long Exchange, const long Comperand);
+/*** Atomic operations ***/
+long _InterlockedCompareExchange(_Interlocked_operand_ volatile long * Destination, long Exchange, long Comperand);
 #pragma intrinsic(_InterlockedCompareExchange)
-long _InterlockedExchange(volatile long * const Target, const long Value);
+char _InterlockedCompareExchange8(_Interlocked_operand_ char volatile * Destination, char Exchange, char Comparand);
+#pragma intrinsic(_InterlockedCompareExchange8)
+short _InterlockedCompareExchange16(_Interlocked_operand_ short volatile * Destination, short Exchange, short Comparand);
+#pragma intrinsic(_InterlockedCompareExchange16)
+__int64 _InterlockedCompareExchange64(_Interlocked_operand_ volatile __int64 * Destination, __int64 Exchange, __int64 Comperand);
+#pragma intrinsic(_InterlockedCompareExchange64)
+long _InterlockedExchange(_Interlocked_operand_ volatile long * Target, long Value);
 #pragma intrinsic(_InterlockedExchange)
-long _InterlockedExchangeAdd(volatile long * const Addend, const long Value);
+char _InterlockedExchange8(_Interlocked_operand_ char volatile * Target, char Value);
+#pragma intrinsic(_InterlockedExchange8)
+short _InterlockedExchange16(_Interlocked_operand_ short volatile * Target, short Value);
+#pragma intrinsic(_InterlockedExchange16)
+long _InterlockedExchangeAdd(_Interlocked_operand_ volatile long * Addend, long Value);
 #pragma intrinsic(_InterlockedExchangeAdd)
-char _InterlockedAnd8(volatile char * const value, const char mask);
+char _InterlockedExchangeAdd8(_Interlocked_operand_ char volatile * Addend, char Value);
+#pragma intrinsic(_InterlockedExchangeAdd8)
+short _InterlockedExchangeAdd16(_Interlocked_operand_ short volatile * Addend, short Value);
+#pragma intrinsic(_InterlockedExchangeAdd16)
+char _InterlockedAnd8(_Interlocked_operand_ volatile char * value, char mask);
 #pragma intrinsic(_InterlockedAnd8)
-short _InterlockedAnd16(volatile short * const value, const short mask);
+short _InterlockedAnd16(_Interlocked_operand_ volatile short * value, short mask);
 #pragma intrinsic(_InterlockedAnd16)
-long _InterlockedAnd(volatile long * const value, const long mask);
+long _InterlockedAnd(_Interlocked_operand_ volatile long * value, long mask);
 #pragma intrinsic(_InterlockedAnd)
-char _InterlockedOr8(volatile char * const value, const char mask);
+char _InterlockedOr8(_Interlocked_operand_ volatile char * value, char mask);
 #pragma intrinsic(_InterlockedOr8)
-short _InterlockedOr16(volatile short * const value, const short mask);
+short _InterlockedOr16(_Interlocked_operand_ volatile short * value, short mask);
 #pragma intrinsic(_InterlockedOr16)
-long _InterlockedOr(volatile long * const value, const long mask);
+long _InterlockedOr(_Interlocked_operand_ volatile long * value, long mask);
 #pragma intrinsic(_InterlockedOr)
-char _InterlockedXor8(volatile char * const value, const char mask);
+char _InterlockedXor8(_Interlocked_operand_ volatile char * value, char mask);
 #pragma intrinsic(_InterlockedXor8)
-short _InterlockedXor16(volatile short * const value, const short mask);
+short _InterlockedXor16(_Interlocked_operand_ volatile short * value, short mask);
 #pragma intrinsic(_InterlockedXor16)
-long _InterlockedXor(volatile long * const value, const long mask);
+long _InterlockedXor(_Interlocked_operand_ volatile long * value, long mask);
 #pragma intrinsic(_InterlockedXor)
-long _InterlockedDecrement(volatile long * const lpAddend);
+long _InterlockedDecrement(_Interlocked_operand_ volatile long * lpAddend);
 #pragma intrinsic(_InterlockedDecrement)
-long _InterlockedIncrement(volatile long * const lpAddend);
+long _InterlockedIncrement(_Interlocked_operand_ volatile long * lpAddend);
 #pragma intrinsic(_InterlockedIncrement)
-short _InterlockedDecrement16(volatile short * const lpAddend);
+short _InterlockedDecrement16(_Interlocked_operand_ volatile short * lpAddend);
 #pragma intrinsic(_InterlockedDecrement16)
-short _InterlockedIncrement16(volatile short * const lpAddend);
+short _InterlockedIncrement16(_Interlocked_operand_ volatile short * lpAddend);
 #pragma intrinsic(_InterlockedIncrement16)
-unsigned char _interlockedbittestandreset(volatile long * a, const long b);
+unsigned char _interlockedbittestandreset(volatile long * a, long b);
 #pragma intrinsic(_interlockedbittestandreset)
-unsigned char _interlockedbittestandset(volatile long * a, const long b);
+unsigned char _interlockedbittestandset(volatile long * a, long b);
 #pragma intrinsic(_interlockedbittestandset)
-
 #if defined(_M_IX86)
-long _InterlockedAddLargeStatistic(volatile __int64 * const Addend, const long Value);
+long _InterlockedAddLargeStatistic(_Interlocked_operand_ volatile __int64 * Addend, long Value);
 #pragma intrinsic(_InterlockedAddLargeStatistic)
 #elif defined(_M_AMD64)
-__int64 _InterlockedExchange64(volatile __int64 * const Target, const __int64 Value);
+__int64 _InterlockedExchange64(volatile __int64 * Target, __int64 Value);
 #pragma intrinsic(_InterlockedExchange64)
-__int64 _InterlockedExchangeAdd64(volatile __int64 * const Addend, const __int64 Value);
+__int64 _InterlockedExchangeAdd64(volatile __int64 * Addend, __int64 Value);
 #pragma intrinsic(_InterlockedExchangeAdd64)
-void * _InterlockedCompareExchangePointer(void * volatile * const Destination, void * const Exchange, void * const Comperand);
+void * _InterlockedCompareExchangePointer(void * volatile * Destination, void * Exchange, void * Comperand);
 #pragma intrinsic(_InterlockedCompareExchangePointer)
-void * _InterlockedExchangePointer(void * volatile * const Target, void * const Value);
+void * _InterlockedExchangePointer(void * volatile * Target, void * Value);
 #pragma intrinsic(_InterlockedExchangePointer)
-__int64 _InterlockedAnd64(volatile __int64 * const value, const __int64 mask);
+unsigned char _InterlockedCompareExchange128(_Interlocked_operand_ volatile __int64 * Destination, __int64 ExchangeHigh, __int64 ExchangeLow, __int64 * ComparandResult);
+#pragma intrinsic(_InterlockedCompareExchange128)
+__int64 _InterlockedAnd64(volatile __int64 * value, __int64 mask);
 #pragma intrinsic(_InterlockedAnd64)
-__int64 _InterlockedOr64(volatile __int64 * const value, const __int64 mask);
+__int64 _InterlockedOr64(volatile __int64 * value, __int64 mask);
 #pragma intrinsic(_InterlockedOr64)
-__int64 _InterlockedCompareExchange64(volatile __int64 * const Destination, const __int64 Exchange, const __int64 Comperand);
-#pragma intrinsic(_InterlockedCompareExchange64)
-__int64 _InterlockedDecrement64(volatile __int64 * const lpAddend);
+__int64 _InterlockedDecrement64(volatile __int64 * lpAddend);
 #pragma intrinsic(_InterlockedDecrement64)
-__int64 _InterlockedIncrement64(volatile __int64 * const lpAddend);
+__int64 _InterlockedIncrement64(volatile __int64 * lpAddend);
 #pragma intrinsic(_InterlockedIncrement64)
-unsigned char _interlockedbittestandreset64(volatile __int64 * a, const __int64 b);
+unsigned char _interlockedbittestandreset64(volatile __int64 * a, __int64 b);
 #pragma intrinsic(_interlockedbittestandreset64)
-unsigned char _interlockedbittestandset64(volatile __int64 * a, const __int64 b);
+unsigned char _interlockedbittestandset64(volatile __int64 * a, __int64 b);
 #pragma intrinsic(_interlockedbittestandset64)
+long _InterlockedAnd_np(volatile long * Value, long Mask);
+#pragma intrinsic(_InterlockedAnd_np)
+char _InterlockedAnd8_np(volatile char * Value, char Mask);
+#pragma intrinsic(_InterlockedAnd8_np)
+short _InterlockedAnd16_np(volatile short * Value, short Mask);
+#pragma intrinsic(_InterlockedAnd16_np)
+__int64 _InterlockedAnd64_np(volatile __int64 * Value, __int64 Mask);
+#pragma intrinsic(_InterlockedAnd64_np)
+short _InterlockedCompareExchange16_np(volatile short * Destination, short Exchange, short Comparand);
+#pragma intrinsic(_InterlockedCompareExchange16_np)
+__int64 _InterlockedCompareExchange64_np(volatile __int64 * Destination, __int64 Exchange, __int64 Comparand);
+#pragma intrinsic(_InterlockedCompareExchange64_np)
+unsigned char _InterlockedCompareExchange128_np(volatile __int64 * Destination, __int64 ExchangeHigh, __int64 ExchangeLow, __int64 * ComparandResult);
+#pragma intrinsic(_InterlockedCompareExchange128_np)
+void * _InterlockedCompareExchangePointer_np(void * volatile * Destination, void * Exchange, void * Comparand);
+#pragma intrinsic(_InterlockedCompareExchangePointer_np)
+long _InterlockedCompareExchange_np(volatile long * Destination, long Exchange, long Comparand);
+#pragma intrinsic(_InterlockedCompareExchange_np)
+short _InterlockedOr16_np(volatile short * Value, short Mask);
+#pragma intrinsic(_InterlockedOr16_np)
+char _InterlockedOr8_np(volatile char * Value, char Mask);
+#pragma intrinsic(_InterlockedOr8_np)
+long _InterlockedOr_np(volatile long * Value, long Mask);
+#pragma intrinsic(_InterlockedOr_np)
+short _InterlockedXor16_np(volatile short * Value, short Mask);
+#pragma intrinsic(_InterlockedXor16_np)
+__int64 _InterlockedXor64_np(volatile __int64 * Value, __int64 Mask);
+#pragma intrinsic(_InterlockedXor64_np)
+char _InterlockedXor8_np(volatile char * Value, char Mask);
+#pragma intrinsic(_InterlockedXor8_np)
+long _InterlockedXor_np(volatile long * Value, long Mask);
+#pragma intrinsic(_InterlockedXor_np)
+__int64 _InterlockedOr64_np(volatile __int64 * Value, __int64 Mask);
+#pragma intrinsic(_InterlockedOr64_np)
+#elif defined(_M_ARM)
+long _InterlockedAdd(_Interlocked_operand_ long volatile * Addend, long Value);
+__int64 _InterlockedAdd64(_Interlocked_operand_ __int64 volatile * Addend, __int64 Value);
+__int64 _InterlockedAdd64_acq(__int64 volatile * Addend, __int64 Value);
+__int64 _InterlockedAdd64_nf(__int64 volatile * Addend, __int64 Value);
+__int64 _InterlockedAdd64_rel(__int64 volatile * Addend, __int64 Value);
+long _InterlockedAdd_acq(long volatile * Addend, long Value);
+long _InterlockedAdd_nf(long volatile * Addend, long Value);
+long _InterlockedAdd_rel(long volatile * Addend, long Value);
+short _InterlockedAnd16_acq(short volatile * Value, short Mask);
+short _InterlockedAnd16_nf(short volatile * Value, short Mask);
+short _InterlockedAnd16_rel(short volatile * Value, short Mask);
+__int64 _InterlockedAnd64_acq(__int64 volatile * Value, __int64 Mask);
+__int64 _InterlockedAnd64_nf(__int64 volatile * Value, __int64 Mask);
+__int64 _InterlockedAnd64_rel(__int64 volatile * Value, __int64 Mask);
+char _InterlockedAnd8_acq(char volatile * Value, char Mask);
+char _InterlockedAnd8_nf(char volatile * Value, char Mask);
+char _InterlockedAnd8_rel(char volatile * Value, char Mask);
+long _InterlockedAnd_acq(long volatile * Value, long Mask);
+long _InterlockedAnd_nf(long volatile * Value, long Mask);
+long _InterlockedAnd_rel(long volatile * Value, long Mask);
+short _InterlockedCompareExchange16_acq(short volatile * Destination, short Exchange, short Comparand);
+short _InterlockedCompareExchange16_nf(short volatile * Destination, short Exchange, short Comparand);
+short _InterlockedCompareExchange16_rel(short volatile * Destination, short Exchange, short Comparand);
+__int64 _InterlockedCompareExchange64_acq(__int64 volatile * Destination, __int64 Exchange, __int64 Comparand);
+__int64 _InterlockedCompareExchange64_nf(__int64 volatile * Destination, __int64 Exchange, __int64 Comparand);
+__int64 _InterlockedCompareExchange64_rel(__int64 volatile * Destination, __int64 Exchange, __int64 Comparand);
+char _InterlockedCompareExchange8_acq(char volatile * Destination, char Exchange, char Comparand);
+char _InterlockedCompareExchange8_nf(char volatile * Destination, char Exchange, char Comparand);
+char _InterlockedCompareExchange8_rel(char volatile * Destination, char Exchange, char Comparand);
+void * _InterlockedCompareExchangePointer_acq(void * volatile * Destination, void * Exchange, void * Comparand);
+void * _InterlockedCompareExchangePointer_nf(void * volatile * Destination, void * Exchange, void * Comparand);
+void * _InterlockedCompareExchangePointer_rel(void * volatile * Destination, void * Exchange, void * Comparand);
+long _InterlockedCompareExchange_acq(long volatile * Destination, long Exchange, long Comparand);
+long _InterlockedCompareExchange_nf(long volatile * Destination, long Exchange, long Comparand);
+long _InterlockedCompareExchange_rel(long volatile * Destination, long Exchange, long Comparand);
+short _InterlockedDecrement16_acq(short volatile * Addend);
+short _InterlockedDecrement16_nf(short volatile * Addend);
+short _InterlockedDecrement16_rel(short volatile * Addend);
+__int64 _InterlockedDecrement64_acq(__int64 volatile * Addend);
+__int64 _InterlockedDecrement64_nf(__int64 volatile * Addend);
+__int64 _InterlockedDecrement64_rel(__int64 volatile * Addend);
+long _InterlockedDecrement_acq(long volatile * Addend);
+long _InterlockedDecrement_nf(long volatile * Addend);
+long _InterlockedDecrement_rel(long volatile * Addend);
+short _InterlockedExchange16_acq(short volatile * Target, short Value);
+short _InterlockedExchange16_nf(short volatile * Target, short Value);
+__int64 _InterlockedExchange64_acq(__int64 volatile * Target, __int64 Value);
+__int64 _InterlockedExchange64_nf(__int64 volatile * Target, __int64 Value);
+char _InterlockedExchange8_acq(char volatile * Target, char Value);
+char _InterlockedExchange8_nf(char volatile * Target, char Value);
+short _InterlockedExchangeAdd16_acq(short volatile * Addend, short Value);
+short _InterlockedExchangeAdd16_nf(short volatile * Addend, short Value);
+short _InterlockedExchangeAdd16_rel(short volatile * Addend, short Value);
+__int64 _InterlockedExchangeAdd64_acq(__int64 volatile * Addend, __int64 Value);
+__int64 _InterlockedExchangeAdd64_nf(__int64 volatile * Addend, __int64 Value);
+__int64 _InterlockedExchangeAdd64_rel(__int64 volatile * Addend, __int64 Value);
+char _InterlockedExchangeAdd8_acq(char volatile * Addend, char Value);
+char _InterlockedExchangeAdd8_nf(char volatile * Addend, char Value);
+char _InterlockedExchangeAdd8_rel(char volatile * Addend, char Value);
+long _InterlockedExchangeAdd_acq(long volatile * Addend, long Value);
+long _InterlockedExchangeAdd_nf(long volatile * Addend, long Value);
+long _InterlockedExchangeAdd_rel(long volatile * Addend, long Value);
+void * _InterlockedExchangePointer_acq(void * volatile * Target, void * Value);
+void * _InterlockedExchangePointer_nf(void * volatile * Target, void * Value);
+long _InterlockedExchange_acq(long volatile * Target, long Value);
+long _InterlockedExchange_nf(long volatile * Target, long Value);
+short _InterlockedIncrement16_acq(short volatile * Addend);
+short _InterlockedIncrement16_nf(short volatile * Addend);
+short _InterlockedIncrement16_rel(short volatile * Addend);
+__int64 _InterlockedIncrement64_acq(__int64 volatile * Addend);
+__int64 _InterlockedIncrement64_nf(__int64 volatile * Addend);
+__int64 _InterlockedIncrement64_rel(__int64 volatile * Addend);
+long _InterlockedIncrement_acq(long volatile * Addend);
+long _InterlockedIncrement_nf(long volatile * Addend);
+long _InterlockedIncrement_rel(long volatile * Addend);
+short _InterlockedOr16_acq(short volatile * Value, short Mask);
+short _InterlockedOr16_nf(short volatile * Value, short Mask);
+short _InterlockedOr16_rel(short volatile * Value, short Mask);
+__int64 _InterlockedOr64_acq(__int64 volatile * Value, __int64 Mask);
+__int64 _InterlockedOr64_nf(__int64 volatile * Value, __int64 Mask);
+__int64 _InterlockedOr64_rel(__int64 volatile * Value, __int64 Mask);
+char _InterlockedOr8_acq(char volatile * Value, char Mask);
+char _InterlockedOr8_nf(char volatile * Value, char Mask);
+char _InterlockedOr8_rel(char volatile * Value, char Mask);
+long _InterlockedOr_acq(long volatile * Value, long Mask);
+long _InterlockedOr_nf(long volatile * Value, long Mask);
+long _InterlockedOr_rel(long volatile * Value, long Mask);
+short _InterlockedXor16_acq(short volatile * Value, short Mask);
+short _InterlockedXor16_nf(short volatile * Value, short Mask);
+short _InterlockedXor16_rel(short volatile * Value, short Mask);
+__int64 _InterlockedXor64_acq(__int64 volatile * Value, __int64 Mask);
+__int64 _InterlockedXor64_nf(__int64 volatile * Value, __int64 Mask);
+__int64 _InterlockedXor64_rel(_Interlocked_operand_ __int64 volatile * Value, __int64 Mask);
+char _InterlockedXor8_acq(char volatile * Value, char Mask);
+char _InterlockedXor8_nf(char volatile * Value, char Mask);
+char _InterlockedXor8_rel(char volatile * Value, char Mask);
+long _InterlockedXor_acq(long volatile * Value, long Mask);
+long _InterlockedXor_nf(long volatile * Value, long Mask);
+long _InterlockedXor_rel(long volatile * Value, long Mask);
+unsigned char _interlockedbittestandreset_acq(long volatile *, long);
+unsigned char _interlockedbittestandreset_nf(long volatile *, long);
+unsigned char _interlockedbittestandreset_rel(long volatile *, long);
+unsigned char _interlockedbittestandset_acq(long volatile *, long);
+unsigned char _interlockedbittestandset_nf(long volatile *, long);
+unsigned char _interlockedbittestandset_rel(long volatile *, long);
+#endif
+#if defined(_M_AMD64) || defined(_M_ARM)
+__int64 _InterlockedAnd64(_Interlocked_operand_ __int64 volatile * Value, __int64 Mask);
+void * _InterlockedCompareExchangePointer(_Interlocked_operand_ void * volatile * Destination, void * Exchange, void * Comparand);
+__int64 _InterlockedDecrement64(_Interlocked_operand_ __int64 volatile * Addend);
+__int64 _InterlockedExchange64(_Interlocked_operand_ __int64 volatile * Target, __int64 Value);
+__int64 _InterlockedExchangeAdd64(_Interlocked_operand_ __int64 volatile * Addend, __int64 Value);
+void * _InterlockedExchangePointer(_Interlocked_operand_ void * volatile * Target, void * Value);
+__int64 _InterlockedIncrement64(_Interlocked_operand_ __int64 volatile * Addend);
+__int64 _InterlockedOr64(_Interlocked_operand_ __int64 volatile * Value, __int64 Mask);
+__int64 _InterlockedXor64(_Interlocked_operand_ __int64 volatile * Value, __int64 Mask);
 #endif
 
 /*** String operations ***/
-void __stosb(unsigned char * Dest, const unsigned char Data, size_t Count);
+#if defined(_M_IX86) || defined(_M_AMD64)
+void __stosb(unsigned char * Dest, unsigned char Data, size_t Count);
 #pragma intrinsic(__stosb)
-void __stosw(unsigned short * Dest, const unsigned short Data, size_t Count);
+void __stosw(unsigned short * Dest, unsigned short Data, size_t Count);
 #pragma intrinsic(__stosw)
-void __stosd(unsigned long * Dest, const unsigned long Data, size_t Count);
+void __stosd(unsigned long * Dest, unsigned long Data, size_t Count);
 #pragma intrinsic(__stosd)
-void __movsb(unsigned char * Destination, const unsigned char * Source, size_t Count);
+void __movsb(unsigned char * Destination, unsigned char const * Source, size_t Count);
 #pragma intrinsic(__movsb)
-void __movsw(unsigned short * Destination, const unsigned short * Source, size_t Count);
+void __movsw(unsigned short * Destination, unsigned short const * Source, size_t Count);
 #pragma intrinsic(__movsw)
-void __movsd(unsigned long * Destination, const unsigned long * Source, size_t Count);
+void __movsd(unsigned long * Destination, unsigned long const * Source, size_t Count);
 #pragma intrinsic(__movsd)
+#endif
+#ifdef _M_AMD64
+void __stosq(unsigned __int64 * Dest, unsigned __int64 Data, size_t Count);
+#pragma intrinsic(__stosq)
+void __movsq(unsigned __int64 * Destination, unsigned __int64 const * Source, size_t Count);
+#pragma intrinsic(__movsq)
+#endif
 
-#if defined(_M_AMD64)
 /*** GS segment addressing ***/
-void __writegsbyte(const unsigned long Offset, const unsigned char Data);
+#if defined(_M_AMD64)
+void __writegsbyte(unsigned long Offset, unsigned char Data);
 #pragma intrinsic(__writegsbyte)
-void __writegsword(const unsigned long Offset, const unsigned short Data);
+void __writegsword(unsigned long Offset, unsigned short Data);
 #pragma intrinsic(__writegsword)
-void __writegsdword(const unsigned long Offset, const unsigned long Data);
+void __writegsdword(unsigned long Offset, unsigned long Data);
 #pragma intrinsic(__writegsdword)
-void __writegsqword(const unsigned long Offset, const unsigned __int64 Data);
+void __writegsqword(unsigned long Offset, unsigned __int64 Data);
 #pragma intrinsic(__writegsqword)
-unsigned char __readgsbyte(const unsigned long Offset);
+unsigned char __readgsbyte(unsigned long Offset);
 #pragma intrinsic(__readgsbyte)
-unsigned short __readgsword(const unsigned long Offset);
+unsigned short __readgsword(unsigned long Offset);
 #pragma intrinsic(__readgsword)
-unsigned long __readgsdword(const unsigned long Offset);
+unsigned long __readgsdword(unsigned long Offset);
 #pragma intrinsic(__readgsdword)
-unsigned __int64 __readgsqword(const unsigned long Offset);
+unsigned __int64 __readgsqword(unsigned long Offset);
 #pragma intrinsic(__readgsqword)
-void __incgsbyte(const unsigned long Offset);
+void __incgsbyte(unsigned long Offset);
 #pragma intrinsic(__incgsbyte)
-void __incgsword(const unsigned long Offset);
+void __incgsword(unsigned long Offset);
 #pragma intrinsic(__incgsword)
-void __incgsdword(const unsigned long Offset);
+void __incgsdword(unsigned long Offset);
 #pragma intrinsic(__incgsdword)
-void __addgsbyte(const unsigned long Offset, const unsigned char Data);
+void __incgsqword(unsigned long);
+#pragma intrinsic(__incgsqword)
+void __addgsbyte(unsigned long Offset, unsigned char Data);
 #pragma intrinsic(__addgsbyte)
-void __addgsword(const unsigned long Offset, const unsigned short Data);
+void __addgsword(unsigned long Offset, unsigned short Data);
 #pragma intrinsic(__addgsword)
-void __addgsdword(const unsigned long Offset, const unsigned int Data);
+void __addgsdword(unsigned long Offset, unsigned long Data);
 #pragma intrinsic(__addgsdword)
-void __addgsqword(const unsigned long Offset, const unsigned __int64 Data);
+void __addgsqword(unsigned long Offset, unsigned __int64 Data);
 #pragma intrinsic(__addgsqword)
 #endif
 
-#if defined(_M_IX86)
 /*** FS segment addressing ***/
-void __writefsbyte(const unsigned long Offset, const unsigned char Data);
+#if defined(_M_IX86)
+void __writefsbyte(unsigned long Offset, unsigned char Data);
 #pragma intrinsic(__writefsbyte)
-void __writefsword(const unsigned long Offset, const unsigned short Data);
+void __writefsword(unsigned long Offset, unsigned short Data);
 #pragma intrinsic(__writefsword)
-void __writefsdword(const unsigned long Offset, const unsigned long Data);
+void __writefsdword(unsigned long Offset, unsigned long Data);
+#pragma intrinsic(__writefsdword)
+void __writefsqword(unsigned long Offset, unsigned __int64 Data);
 #pragma intrinsic(__writefsdword)
-unsigned char __readfsbyte(const unsigned long Offset);
+unsigned char __readfsbyte(unsigned long Offset);
 #pragma intrinsic(__readfsbyte)
-unsigned short __readfsword(const unsigned long Offset);
+unsigned short __readfsword(unsigned long Offset);
 #pragma intrinsic(__readfsword)
-unsigned long __readfsdword(const unsigned long Offset);
+unsigned long __readfsdword(unsigned long Offset);
 #pragma intrinsic(__readfsdword)
-void __incfsbyte(const unsigned long Offset);
+void __incfsbyte(unsigned long Offset);
 #pragma intrinsic(__incfsbyte)
-void __incfsword(const unsigned long Offset);
+void __incfsword(unsigned long Offset);
 #pragma intrinsic(__incfsword)
-void __incfsdword(const unsigned long Offset);
+void __incfsdword(unsigned long Offset);
 #pragma intrinsic(__incfsdword)
-void __addfsbyte(const unsigned long Offset, const unsigned char Data);
+void __addfsbyte(unsigned long Offset, unsigned char Data);
 #pragma intrinsic(__addfsbyte)
-void __addfsword(const unsigned long Offset, const unsigned short Data);
+void __addfsword(unsigned long Offset, unsigned short Data);
 #pragma intrinsic(__addfsword)
-void __addfsdword(const unsigned long Offset, const unsigned int Data);
+void __addfsdword(unsigned long Offset, unsigned long Data);
 #pragma intrinsic(__addfsdword)
 #endif
 
-
 /*** Bit manipulation ***/
-unsigned char _BitScanForward(unsigned long * const Index, const unsigned long Mask);
+unsigned char _BitScanForward(unsigned long * Index, unsigned long Mask);
 #pragma intrinsic(_BitScanForward)
-unsigned char _BitScanReverse(unsigned long * const Index, const unsigned long Mask);
+unsigned char _BitScanReverse(unsigned long * Index, unsigned long Mask);
 #pragma intrinsic(_BitScanReverse)
-unsigned char _bittest(const long * const a, const long b);
+#ifdef _WIN64
+unsigned char _BitScanForward64(unsigned long * Index, unsigned long long Mask);
+#pragma intrinsic(_BitScanForward64)
+unsigned char _BitScanReverse64(unsigned long * Index, unsigned long long Mask);
+#pragma intrinsic(_BitScanReverse64)
+#endif
+unsigned char _bittest(const long * a, long b);
 #pragma intrinsic(_bittest)
-unsigned char _bittestandcomplement(long * const a, const long b);
+unsigned char _bittestandcomplement(long * a, long b);
 #pragma intrinsic(_bittestandcomplement)
-unsigned char _bittestandreset(long * const a, const long b);
+unsigned char _bittestandreset(long * a, long b);
 #pragma intrinsic(_bittestandreset)
-unsigned char _bittestandset(long * const a, const long b);
+unsigned char _bittestandset(long * a, long b);
 #pragma intrinsic(_bittestandset)
 unsigned char _rotl8(unsigned char value, unsigned char shift);
 #pragma intrinsic(_rotl8)
 unsigned short _rotl16(unsigned short value, unsigned char shift);
 #pragma intrinsic(_rotl16)
-unsigned int _rotl(unsigned int value, int shift);
+_Check_return_ unsigned int _rotl(unsigned int value, int shift);
 #pragma intrinsic(_rotl)
-unsigned int _rotr(unsigned int value, int shift);
-#pragma intrinsic(_rotr)
+_Check_return_ unsigned __int64 __cdecl _rotl64(_In_ unsigned __int64 Value, _In_ int Shift);
+#pragma intrinsic(_rotl64)
+_Check_return_ unsigned long __cdecl _lrotl(_In_ unsigned long, _In_ int);
+#pragma intrinsic(_lrotl)
 unsigned char _rotr8(unsigned char value, unsigned char shift);
 #pragma intrinsic(_rotr8)
 unsigned short _rotr16(unsigned short value, unsigned char shift);
 #pragma intrinsic(_rotr16)
-unsigned __int64 __ll_lshift(const unsigned __int64 Mask, const int Bit);
-#pragma intrinsic(__ll_lshift)
-__int64 __ll_rshift(const __int64 Mask, const int Bit);
-#pragma intrinsic(__ll_rshift)
-unsigned __int64 __ull_rshift(const unsigned __int64 Mask, int Bit);
-#pragma intrinsic(__ull_rshift)
+_Check_return_ unsigned int _rotr(unsigned int value, int shift);
+#pragma intrinsic(_rotr)
+_Check_return_ unsigned __int64 __cdecl _rotr64(_In_ unsigned __int64 Value, _In_ int Shift);
+#pragma intrinsic(_rotr64)
+_Check_return_ unsigned long __cdecl _lrotr(_In_ unsigned long, _In_ int);
+#pragma intrinsic(_lrotr)
 unsigned short _byteswap_ushort(unsigned short value);
 #pragma intrinsic(_byteswap_ushort)
 unsigned long _byteswap_ulong(unsigned long value);
 #pragma intrinsic(_byteswap_ulong)
 unsigned __int64 _byteswap_uint64(unsigned __int64 value);
 #pragma intrinsic(_byteswap_uint64)
+#if defined(_M_IX86) || defined(_M_AMD64)
+unsigned __int64 __ll_lshift(unsigned __int64 Mask, int Bit);
+#pragma intrinsic(__ll_lshift)
+__int64 __ll_rshift(__int64 Mask, int Bit);
+#pragma intrinsic(__ll_rshift)
+unsigned __int64 __ull_rshift(unsigned __int64 Mask, int Bit);
+#pragma intrinsic(__ull_rshift)
+unsigned int __lzcnt(unsigned int Value);
+#pragma intrinsic(__lzcnt)
+unsigned short __lzcnt16(unsigned short Value);
+#pragma intrinsic(__lzcnt16)
+unsigned int __popcnt(unsigned int Value);
+#pragma intrinsic(__popcnt)
+unsigned short __popcnt16(unsigned short Value);
+#pragma intrinsic(__popcnt16)
+#endif
+#ifdef _M_AMD64
+unsigned __int64 __shiftleft128(unsigned __int64 LowPart, unsigned __int64 HighPart, unsigned char Shift);
+#pragma intrinsic(__shiftleft128)
+unsigned __int64 __shiftright128(unsigned __int64 LowPart, unsigned __int64 HighPart, unsigned char Shift);
+#pragma intrinsic(__shiftright128)
+unsigned char _bittest64(__int64 const *a, __int64 b);
+#pragma intrinsic(_bittest64)
+unsigned char _bittestandcomplement64(__int64 *a, __int64 b);
+#pragma intrinsic(_bittestandcomplement64)
+unsigned char _bittestandreset64(__int64 *a, __int64 b);
+#pragma intrinsic(_bittestandreset64)
+unsigned char _bittestandset64(__int64 *a, __int64 b);
+#pragma intrinsic(_bittestandset64)
+unsigned __int64 __lzcnt64(unsigned __int64 Value);
+#pragma intrinsic(__lzcnt64)
+unsigned __int64 __popcnt64(unsigned __int64 Value);
+#pragma intrinsic(__popcnt64)
+#elif defined(_M_ARM)
+unsigned int _CountLeadingOnes(unsigned long Value);
+unsigned int _CountLeadingOnes64(unsigned __int64 Value);
+unsigned int _CountLeadingSigns(long Value);
+unsigned int _CountLeadingSigns64(__int64 Value);
+unsigned int _CountLeadingZeros(unsigned long Value);
+unsigned int _CountLeadingZeros64(unsigned __int64 Value);
+unsigned int _CountOneBits(unsigned long Value);
+unsigned int _CountOneBits64(unsigned __int64 Value);
+#endif
 
-/*** 64-bit math ***/
-__int64 __emul(const int a, const int b);
+/*** 64/128-bit math ***/
+__int64 __cdecl _abs64(__int64);
+#pragma intrinsic(_abs64)
+#if defined(_M_IX86) || defined(_M_AMD64)
+__int64 __emul(int a, int b);
 #pragma intrinsic(__emul)
-unsigned __int64 __emulu(const unsigned int a, const unsigned int b);
+unsigned __int64 __emulu(unsigned int a, unsigned int b);
 #pragma intrinsic(__emulu)
+#endif
+#ifdef _M_AMD64
+__int64 __mulh(__int64 a, __int64 b);
+#pragma intrinsic(__mulh)
+unsigned __int64 __umulh(unsigned __int64 a, unsigned __int64 b);
+#pragma intrinsic(__umulh)
+__int64 _mul128(__int64 Multiplier, __int64 Multiplicand, __int64 * HighProduct);
+#pragma intrinsic(_mul128)
+unsigned __int64 _umul128(unsigned __int64 Multiplier, unsigned __int64 Multiplicand, unsigned __int64 * HighProduct);
+#pragma intrinsic(_umul128)
+#elif defined(_M_ARM)
+long _MulHigh(long Multiplier, long Multiplicand);
+#pragma intrinsic(_MulHigh)
+unsigned long _MulUnsignedHigh(unsigned long Multiplier, unsigned long Multiplicand);
+#pragma intrinsic(_MulUnsignedHigh)
+#endif
+
+/** Floating point stuff **/
+#if defined(_M_ARM)
+int _isunordered(double arg1, double arg2);
+#pragma intrinsic(_isunordered)
+int _isunorderedf(float arg1, float arg2);
+#pragma intrinsic(_isunorderedf)
+double _CopyDoubleFromInt64(__int64);
+#pragma intrinsic(_CopyDoubleFromInt64)
+float _CopyFloatFromInt32(__int32);
+#pragma intrinsic(_CopyFloatFromInt32)
+__int32 _CopyInt32FromFloat(float);
+#pragma intrinsic(_CopyInt32FromFloat)
+__int64 _CopyInt64FromDouble(double);
+#pragma intrinsic(_CopyInt64FromDouble)
+#endif
 
 /*** Port I/O ***/
-unsigned char __inbyte(const unsigned short Port);
+#if defined(_M_IX86) || defined(_M_AMD64)
+unsigned char __inbyte(unsigned short Port);
 #pragma intrinsic(__inbyte)
-unsigned short __inword(const unsigned short Port);
+unsigned short __inword(unsigned short Port);
 #pragma intrinsic(__inword)
-unsigned long __indword(const unsigned short Port);
+unsigned long __indword(unsigned short Port);
 #pragma intrinsic(__indword)
 void __inbytestring(unsigned short Port, unsigned char * Buffer, unsigned long Count);
 #pragma intrinsic(__inbytestring)
@@ -220,52 +516,141 @@ void __inwordstring(unsigned short Port, unsigned short * Buffer, unsigned long
 #pragma intrinsic(__inwordstring)
 void __indwordstring(unsigned short Port, unsigned long * Buffer, unsigned long Count);
 #pragma intrinsic(__indwordstring)
-void __outbyte(unsigned short const Port, const unsigned char Data);
+void __outbyte(unsigned short Port, unsigned char Data);
 #pragma intrinsic(__outbyte)
-void __outword(unsigned short const Port, const unsigned short Data);
+void __outword(unsigned short Port, unsigned short Data);
 #pragma intrinsic(__outword)
-void __outdword(unsigned short const Port, const unsigned long Data);
+void __outdword(unsigned short Port, unsigned long Data);
 #pragma intrinsic(__outdword)
-void __outbytestring(unsigned short const Port, const unsigned char * const Buffer, const unsigned long Count);
+void __outbytestring(unsigned short Port, unsigned char * Buffer, unsigned long Count);
 #pragma intrinsic(__outbytestring)
-void __outwordstring(unsigned short const Port, const unsigned short * const Buffer, const unsigned long Count);
+void __outwordstring(unsigned short Port, unsigned short * Buffer, unsigned long Count);
 #pragma intrinsic(__outwordstring)
-void __outdwordstring(unsigned short const Port, const unsigned long * const Buffer, const unsigned long Count);
+void __outdwordstring(unsigned short Port, unsigned long * Buffer, unsigned long Count);
 #pragma intrinsic(__outdwordstring)
+int __cdecl _inp(unsigned short Port);
+#pragma intrinsic(_inp)
+unsigned long __cdecl _inpd(unsigned short Port);
+#pragma intrinsic(_inpd)
+unsigned short __cdecl _inpw(unsigned short Port);
+#pragma intrinsic(_inpw)
+int __cdecl inp(unsigned short Port);
+#pragma intrinsic(inp)
+unsigned long __cdecl inpd(unsigned short Port);
+#pragma intrinsic(inpd)
+unsigned short __cdecl inpw(unsigned short Port);
+#pragma intrinsic(inpw)
+int __cdecl _outp(unsigned short Port, int Value);
+#pragma intrinsic(_outp)
+unsigned long __cdecl _outpd(unsigned short Port, unsigned long Value);
+#pragma intrinsic(_outpd)
+unsigned short __cdecl _outpw(unsigned short Port, unsigned short Value);
+#pragma intrinsic(_outpw)
+int __cdecl outp(unsigned short Port, int Value);
+#pragma intrinsic(outp)
+unsigned long __cdecl outpd(unsigned short Port, unsigned long Value);
+#pragma intrinsic(outpd)
+unsigned short __cdecl outpw(unsigned short Port, unsigned short Value);
+#pragma intrinsic(outpw)
+#endif
 
 /*** System information ***/
-void __cpuid(int CPUInfo[], const int InfoType);
+#if defined(_M_IX86) || defined(_M_AMD64)
+void __cpuid(int CPUInfo[4], int InfoType);
 #pragma intrinsic(__cpuid)
+void __cpuidex(int CPUInfo[4], int InfoType, int ECXValue);
+#pragma intrinsic(__cpuidex)
 unsigned __int64 __rdtsc(void);
 #pragma intrinsic(__rdtsc)
+unsigned __int64 __rdtscp(unsigned int *);
+#pragma intrinsic(__rdtscp)
 void __writeeflags(uintptr_t Value);
 #pragma intrinsic(__writeeflags)
 uintptr_t __readeflags(void);
 #pragma intrinsic(__readeflags)
+#endif
 
-/*** Interrupts ***/
+/*** Interrupts and traps ***/
 void __debugbreak(void);
 #pragma intrinsic(__debugbreak)
-void __int2c(void);
-#pragma intrinsic(__int2c)
 void _disable(void);
 #pragma intrinsic(_disable)
 void _enable(void);
 #pragma intrinsic(_enable)
+#if defined(_M_IX86) || defined(_M_AMD64)
+void __int2c(void);
+#pragma intrinsic(__int2c)
 void __halt(void);
 #pragma intrinsic(__halt)
+void __ud2(void);
+#pragma intrinsic(__ud2)
+#if (_MSC_VER >= 1700)
+__declspec(noreturn) void __fastfail(unsigned int Code);
+#pragma intrinsic(__fastfail)
+#else
+__declspec(noreturn) __forceinline
+void __fastfail(unsigned int Code)
+{
+    __asm
+    {
+        mov ecx, Code
+        int 29h
+    }
+}
+#endif
+#endif
+#if defined(_M_ARM)
+int __trap(int Arg1, ...);
+#endif
 
 /*** Protected memory management ***/
-void __writecr0(const unsigned __int64 Data);
+#if defined(_M_IX86) || defined(_M_AMD64)
+void __writecr0(uintptr_t Data);
 #pragma intrinsic(__writecr0)
-void __writecr3(const unsigned __int64 Data);
+void __writecr3(uintptr_t Data);
 #pragma intrinsic(__writecr3)
-void __writecr4(const unsigned __int64 Data);
+void __writecr4(uintptr_t Data);
 #pragma intrinsic(__writecr4)
-
-#ifdef _M_AMD64
-void __writecr8(const unsigned __int64 Data);
+void __writecr8(uintptr_t Data);
 #pragma intrinsic(__writecr8)
+#endif
+#if defined(_M_IX86)
+unsigned long __readcr0(void);
+#pragma intrinsic(__readcr0)
+unsigned long __readcr2(void);
+#pragma intrinsic(__readcr2)
+unsigned long __readcr3(void);
+#pragma intrinsic(__readcr3)
+//unsigned long __readcr4(void);
+//#pragma intrinsic(__readcr4)
+// HACK: MSVC is broken
+unsigned long  ___readcr4(void);
+#define __readcr4 ___readcr4
+unsigned long __readcr8(void);
+#pragma intrinsic(__readcr8)
+unsigned int __readdr(unsigned int reg);
+#pragma intrinsic(__readdr)
+void __writedr(unsigned reg, unsigned int value);
+#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)
+void __invlpg(void * Address);
+#pragma intrinsic(__invlpg)
 unsigned __int64 __readcr0(void);
 #pragma intrinsic(__readcr0)
 unsigned __int64 __readcr2(void);
@@ -280,31 +665,20 @@ unsigned __int64 __readdr(unsigned int reg);
 #pragma intrinsic(__readdr)
 void __writedr(unsigned reg, unsigned __int64 value);
 #pragma intrinsic(__writedr)
-#else
-unsigned long __readcr0(void);
-unsigned long __readcr2(void);
-unsigned long __readcr3(void);
-//unsigned long __readcr4(void);
-//#pragma intrinsic(__readcr4)
-// HACK: MSVC is broken
-unsigned long  ___readcr4(void);
-#define __readcr4 ___readcr4
-
-unsigned int __readdr(unsigned int reg);
-void __writedr(unsigned reg, unsigned int value);
+#elif defined(_M_ARM)
+void __cdecl __prefetch(const void *);
+#pragma intrinsic(__prefetch)
 #endif
 
-void __invlpg(void * const Address);
-#pragma intrinsic(__invlpg)
-
 /*** System operations ***/
-unsigned __int64 __readmsr(const int reg);
+#if defined(_M_IX86) || defined(_M_AMD64)
+unsigned __int64 __readmsr(unsigned long reg);
 #pragma intrinsic(__readmsr)
-void __writemsr(const unsigned long Register, const unsigned __int64 Value);
+void __writemsr(unsigned long Register, unsigned __int64 Value);
 #pragma intrinsic(__writemsr)
-unsigned __int64 __readpmc(const int counter);
+unsigned __int64 __readpmc(unsigned long counter);
 #pragma intrinsic(__readpmc)
-unsigned long __segmentlimit(const unsigned long a);
+unsigned long __segmentlimit(unsigned long a);
 #pragma intrinsic(__segmentlimit)
 void __wbinvd(void);
 #pragma intrinsic(__wbinvd)
@@ -314,6 +688,96 @@ void __sidt(void *Destination);
 #pragma intrinsic(__sidt)
 void _mm_pause(void);
 #pragma intrinsic(_mm_pause)
+#endif
+#if defined(_M_ARM)
+unsigned int _MoveFromCoprocessor(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int);
+#pragma intrinsic(_MoveFromCoprocessor)
+unsigned int _MoveFromCoprocessor2(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int);
+#pragma intrinsic(_MoveFromCoprocessor2)
+unsigned __int64 _MoveFromCoprocessor64(unsigned int, unsigned int, unsigned int);
+#pragma intrinsic(_MoveFromCoprocessor64)
+void _MoveToCoprocessor(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int);
+#pragma intrinsic(_MoveToCoprocessor)
+void _MoveToCoprocessor2(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int);
+#pragma intrinsic(_MoveToCoprocessor2)
+void _MoveToCoprocessor64(unsigned __int64, unsigned int, unsigned int, unsigned int);
+#pragma intrinsic(_MoveToCoprocessor64)
+int _ReadStatusReg(int);
+#pragma intrinsic(_ReadStatusReg)
+void _WriteStatusReg(int, int, int);
+#pragma intrinsic(_WriteStatusReg)
+void __yield(void);
+#pragma intrinsic(__yield)
+void __wfe(void);
+#pragma intrinsic(__wfe)
+void __wfi(void);
+#pragma intrinsic(__wfi)
+unsigned int __swi(unsigned int, ...);
+#pragma intrinsic(__swi)
+unsigned int __hvc(unsigned int, ...);
+#pragma intrinsic(__hvc)
+__int64 __ldrexd(__int64 volatile *);
+#pragma intrinsic(__ldrexd)
+unsigned __int64 __rdpmccntr64(void);
+#pragma intrinsic(__rdpmccntr64)
+void __sev(void);
+#pragma intrinsic(__sev)
+#endif
+
+/** Secure virtual machine **/
+#if defined(_M_IX86) || defined(_M_AMD64)
+void __svm_clgi(void);
+#pragma intrinsic(__svm_clgi)
+void __svm_invlpga(void * Va, int Asid);
+#pragma intrinsic(__svm_invlpga)
+void __svm_skinit(int Slb);
+#pragma intrinsic(__svm_skinit)
+void __svm_stgi(void);
+#pragma intrinsic(__svm_stgi)
+void __svm_vmload(uintptr_t VmcbPhysicalAddress);
+#pragma intrinsic(__svm_vmload)
+void __svm_vmrun(uintptr_t VmcbPhysicalAddress);
+#pragma intrinsic(__svm_vmrun)
+void __svm_vmsave(uintptr_t VmcbPhysicalAddress);
+#pragma intrinsic(__svm_vmsave)
+#endif
+
+/** Virtual machine extension **/
+#if defined(_M_IX86) || defined(_M_AMD64)
+void __vmx_off(void);
+void __vmx_vmptrst(unsigned __int64 * VmcsPhysicalAddress );
+#endif
+#if defined(_M_AMD64)
+unsigned char __vmx_on(unsigned __int64 * VmsSupportPhysicalAddress);
+unsigned char __vmx_vmclear(unsigned __int64 * VmcsPhysicalAddress);
+unsigned char __vmx_vmlaunch(void);
+unsigned char __vmx_vmptrld(unsigned __int64 *VmcsPhysicalAddress );
+unsigned char __vmx_vmread(size_t Field, size_t *FieldValue);
+unsigned char __vmx_vmresume(void);
+unsigned char __vmx_vmwrite(size_t Field, size_t FieldValue);
+#endif
+
+/** Misc **/
+void __nop(void);
+#pragma intrinsic(__nop)
+#if (_MSC_VER >= 1700)
+void __code_seg(const char *);
+#pragma intrinsic(__code_seg)
+#endif
+#ifdef _M_ARM
+int _AddSatInt(int, int);
+#pragma intrinsic(_AddSatInt)
+int _DAddSatInt(int, int);
+#pragma intrinsic(_DAddSatInt)
+int _DSubSatInt(int, int);
+#pragma intrinsic(_DSubSatInt)
+int _SubSatInt(int, int);
+#pragma intrinsic(_SubSatInt)
+void __emit(unsigned __int32);
+#pragma intrinsic(__emit)
+void __static_assert(int, const char *);
+#pragma intrinsic(__static_assert)
+#endif
 
 #ifdef __cplusplus
 }