ARM64 組み込み

Microsoft C++ コンパイラ (MSVC) では、ARM64 アーキテクチャで以下の組み込みを利用できるようになっています。 ARM の詳細については、ARM 開発者ドキュメントの Web サイトで、アーキテクチャとソフトウェア開発ツールに関するセクションを参照してください。

NEON

ARM64 の NEON ベクター命令セット拡張は、Single Instruction Multiple Data (SIMD) 機能を提供します。 これらは、x86 および x64 アーキテクチャのプロセッサに共通する MMX や SSE ベクター命令セットの機能に似ています。

ヘッダー ファイル arm64_neon.h に記述されているように、NEON の組み込みはサポートされています。 MSVC による NEON の組み込みのサポートは、ARM64 コンパイラのそれと似ています。この点については、ARM Infocenter Web サイトの ARM NEON 組み込みリファレンスに記載されています。

ARM64 固有の組み込みの一覧

関数名 指示 関数プロトタイプ
__break BRK void __break(int)
__addx18byte void __addx18byte(unsigned long, unsigned char)
__addx18word void __addx18word(unsigned long, unsigned short)
__addx18dword void __addx18dword(unsigned long, unsigned long)
__addx18qword void __addx18qword(unsigned long, unsigned __int64)
__cas8 CASB unsigned __int8 __cas8(unsigned __int8 volatile* _Target, unsigned __int8 _Comp, unsigned __int8 _Value)
__cas16 現金 unsigned __int16 __cas16(unsigned __int16 volatile* _Target, unsigned __int16 _Comp, unsigned __int16 _Value)
__cas32 CAS unsigned __int32 __cas32(unsigned __int32 volatile* _Target, unsigned __int32 _Comp, unsigned __int32 _Value)
__cas64 CAS unsigned __int64 __cas64(unsigned __int64 volatile* _Target, unsigned __int64 _Comp, unsigned __int64 _Value)
__casa8 CASAB unsigned __int8 __casa8(unsigned __int8 volatile* _Target, unsigned __int8 _Comp, unsigned __int8 _Value)
__casa16 CASAH unsigned __int16 __casa16(unsigned __int16 volatile* _Target, unsigned __int16 _Comp, unsigned __int16 _Value)
__casa32 CASA unsigned __int32 __casa32(unsigned __int32 volatile* _Target, unsigned __int32 _Comp, unsigned __int32 _Value)
__casa64 CASA unsigned __int64 __casa64(unsigned __int64 volatile* _Target, unsigned __int64 _Comp, unsigned __int64 _Value)
__casl8 CASLB unsigned __int8 __casl8(unsigned __int8 volatile* _Target, unsigned __int8 _Comp, unsigned __int8 _Value)
__casl16 CASLH unsigned __int16 __casl16(unsigned __int16 volatile* _Target, unsigned __int16 _Comp, unsigned __int16 _Value)
__casl32 CASL unsigned __int32 __casl32(unsigned __int32 volatile* _Target, unsigned __int32 _Comp, unsigned __int32 _Value)
__casl64 CASL unsigned __int64 __casl64(unsigned __int64 volatile* _Target, unsigned __int64 _Comp, unsigned __int64 _Value)
__casal8 CASALB unsigned __int8 __casal8(unsigned __int8 volatile* _Target, unsigned __int8 _Comp, unsigned __int8 _Value)
__casal16 CASALH unsigned __int16 __casal16(unsigned __int16 volatile* _Target, unsigned __int16 _Comp, unsigned __int16 _Value)
__casal32 CASAL unsigned __int32 __casal32(unsigned __int32 volatile* _Target, unsigned __int32 _Comp, unsigned __int32 _Value)
__casal64 CASAL unsigned __int64 __casal64(unsigned __int64 volatile* _Target, unsigned __int64 _Comp, unsigned __int64 _Value)
__crc32b CRC32B unsigned __int32 __crc32b(unsigned __int32, unsigned __int32)
__crc32h CRC32H unsigned __int32 __crc32h(unsigned __int32, unsigned __int32)
__crc32w CRC32W unsigned __int32 __crc32w(unsigned __int32, unsigned __int32)
__crc32d CRC32X unsigned __int32 __crc32d(unsigned __int32, unsigned __int64)
__crc32cb CRC32CB unsigned __int32 __crc32cb(unsigned __int32, unsigned __int32)
__crc32ch CRC32CH unsigned __int32 __crc32ch(unsigned __int32, unsigned __int32)
__crc32cw CRC32CW unsigned __int32 __crc32cw(unsigned __int32, unsigned __int32)
__crc32cd CRC32CX unsigned __int32 __crc32cd(unsigned __int32, unsigned __int64)
__dmb DMB void __dmb(unsigned int _Type)

命令ストリームにメモリ バリア操作を挿入します。 パラメーター _Type で、バリアによって適用される制限の種類を指定します。

強制できる制限の種類の詳細については、「メモリ バリアの制限」を参照してください。
__dsb DSB void __dsb(unsigned int _Type)

命令ストリームにメモリ バリア操作を挿入します。 パラメーター _Type で、バリアによって適用される制限の種類を指定します。

強制できる制限の種類の詳細については、「メモリ バリアの制限」を参照してください。
__isb ISB void __isb(unsigned int _Type)

命令ストリームにメモリ バリア操作を挿入します。 パラメーター _Type で、バリアによって適用される制限の種類を指定します。

強制できる制限の種類の詳細については、「メモリ バリアの制限」を参照してください。
__getReg unsigned __int64 __getReg(int)
__getRegFp double __getRegFp(int)
__getCallerReg unsigned __int64 __getCallerReg(int)
__getCallerRegFp double __getCallerRegFp(int)
__hvc HVC unsigned int __hvc(unsigned int, ...)
__hlt HLT int __hlt(unsigned int, ...)
__incx18byte void __incx18byte(unsigned long)
__incx18word void __incx18word(unsigned long)
__incx18dword void __incx18dword(unsigned long)
__incx18qword void __incx18qword(unsigned long)
__iso_volatile_load16 __int16 __iso_volatile_load16(const volatile __int16 *)

詳細については、「__iso_volatile_load/store 組み込み」を参照してください。
__iso_volatile_load32 __int32 __iso_volatile_load32(const volatile __int32 *)

詳細については、「__iso_volatile_load/store 組み込み」を参照してください。
__iso_volatile_load64 __int64 __iso_volatile_load64(const volatile __int64 *)

詳細については、「__iso_volatile_load/store 組み込み」を参照してください。
__iso_volatile_load8 __int8 __iso_volatile_load8(const volatile __int8 *)

詳細については、「__iso_volatile_load/store 組み込み」を参照してください。
__iso_volatile_store16 void __iso_volatile_store16(volatile __int16 *, __int16)

詳細については、「__iso_volatile_load/store 組み込み」を参照してください。
__iso_volatile_store32 void __iso_volatile_store32(volatile __int32 *, __int32)

詳細については、「__iso_volatile_load/store 組み込み」を参照してください。
__iso_volatile_store64 void __iso_volatile_store64(volatile __int64 *, __int64)

詳細については、「__iso_volatile_load/store 組み込み」を参照してください。
__iso_volatile_store8 void __iso_volatile_store8(volatile __int8 *, __int8)

詳細については、「__iso_volatile_load/store 組み込み」を参照してください。
__ldar8 LDARB unsigned __int8 __ldar8(unsigned __int8 volatile* _Target)
__ldar16 LDARH unsigned __int16 __ldar16(unsigned __int16 volatile* _Target)
__ldar32 LDAR unsigned __int32 __ldar32(unsigned __int32 volatile* _Target)
__ldar64 LDAR unsigned __int64 __ldar64(unsigned __int64 volatile* _Target)
__ldapr8 LDAPRB unsigned __int8 __ldapr8(unsigned __int8 volatile* _Target)
__ldapr16 LDAPRH unsigned __int16 __ldapr16(unsigned __int16 volatile* _Target)
__ldapr32 LDAPR unsigned __int32 __ldapr32(unsigned __int32 volatile* _Target)
__ldapr64 LDAPR unsigned __int64 __ldapr64(unsigned __int64 volatile* _Target)
__mulh __int64 __mulh(__int64, __int64)
__prefetch PRFM void __cdecl __prefetch(const void *)

指定したアドレス、またはその付近のアドレスのメモリに間もなくアクセスする可能性があるという PRFM メモリ ヒントとプリフェッチ操作 PLDL1KEEP をシステムに提供します。 システムによっては、実行時のパフォーマンスを向上させるために、そのメモリへのアクセス パターンを最適化する場合があります。 ただし、C++ 言語側からすると、この関数には目に見える効果がなく、何も実行しないことがあります。
__prefetch2 PRFM void __cdecl __prefetch(const void *, uint8_t prfop)

指定したアドレス、またはその付近のアドレスのメモリに間もなくアクセスする可能性があるという PRFM メモリ ヒントと指定されたプリフェッチ操作をシステムに提供します。 システムによっては、実行時のパフォーマンスを向上させるために、そのメモリへのアクセス パターンを最適化する場合があります。 ただし、C++ 言語側からすると、この関数には目に見える効果がなく、何も実行しないことがあります。
__readx18byte unsigned char __readx18byte(unsigned long)
__readx18word unsigned short __readx18word(unsigned long)
__readx18dword unsigned long __readx18dword(unsigned long)
__readx18qword unsigned __int64 __readx18qword(unsigned long)
__setReg void __setReg(int, unsigned __int64)
__setRegFp void __setRegFp(int, double)
__setCallerReg void __setCallerReg(int, unsigned __int64)
__setCallerRegFp void __setCallerRegFp(int, double)
__sev SEV void __sev(void)
__static_assert void __static_assert(int, const char *)
__stlr8 STLRB void __stlr8(unsigned __int8 volatile* _Target, unsigned __int8 _Value)
__stlr16 STLRH void __stlr16(unsigned __int16 volatile* _Target, unsigned __int16 _Value)
__stlr32 STLR void __stlr32(unsigned __int32 volatile* _Target, unsigned __int32 _Value)
__stlr64 STLR void __stlr64(unsigned __int64 volatile* _Target, unsigned __int64 _Value)
__swp8 SWPB unsigned __int8 __swp8(unsigned __int8 volatile* _Target, unsigned __int8 _Value)
__swp16 SWPH unsigned __int16 __swp16(unsigned __int16 volatile* _Target, unsigned __int16 _Value)
__swp32 SWP unsigned __int32 __swp32(unsigned __int32 volatile* _Target, unsigned __int32 _Value)
__swp64 SWP unsigned __int64 __swp64(unsigned __int64 volatile* _Target, unsigned __int64 _Value)
__swpa8 SWPAB unsigned __int8 __swpa8(unsigned __int8 volatile* _Target, unsigned __int8 _Value)
__swpa16 SWPAH unsigned __int16 __swpa16(unsigned __int16 volatile* _Target, unsigned __int16 _Value)
__swpa32 SWPA unsigned __int32 __swpa32(unsigned __int32 volatile* _Target, unsigned __int32 _Value)
__swpa64 SWPA unsigned __int64 __swpa64(unsigned __int64 volatile* _Target, unsigned __int64 _Value)
__swpl8 SWPLB unsigned __int8 __swpl8(unsigned __int8 volatile* _Target, unsigned __int8 _Value)
__swpl16 SWPLH unsigned __int16 __swpl16(unsigned __int16 volatile* _Target, unsigned __int16 _Value)
__swpl32 SWPL unsigned __int32 __swpl32(unsigned __int32 volatile* _Target, unsigned __int32 _Value)
__swpl64 SWPL unsigned __int64 __swpl64(unsigned __int64 volatile* _Target, unsigned __int64 _Value)
__swpal8 SWPALB unsigned __int8 __swpal8(unsigned __int8 volatile* _Target, unsigned __int8 _Value)
__swpal16 SWPALH unsigned __int16 __swpal16(unsigned __int16 volatile* _Target, unsigned __int16 _Value)
__swpal32 SWPAL unsigned __int32 __swpal32(unsigned __int32 volatile* _Target, unsigned __int32 _Value)
__swpal64 SWPAL unsigned __int64 __swpal64(unsigned __int64 volatile* _Target, unsigned __int64 _Value)
__sys SYS unsigned int __sys(int, __int64)
__svc SVC unsigned int __svc(unsigned int, ...)
__wfe WFE void __wfe(void)
__wfi WFI void __wfi(void)
__writex18byte void __writex18byte(unsigned long, unsigned char)
__writex18word void __writex18word(unsigned long, unsigned short)
__writex18dword void __writex18dword(unsigned long, unsigned long)
__writex18qword void __writex18qword(unsigned long, unsigned __int64)
__umulh unsigned __int64 __umulh(unsigned __int64, unsigned __int64)
_CopyDoubleFromInt64 double _CopyDoubleFromInt64(__int64)
_CopyFloatFromInt32 float _CopyFloatFromInt32(__int32)
_CopyInt32FromFloat __int32 _CopyInt32FromFloat(float)
_CopyInt64FromDouble __int64 _CopyInt64FromDouble(double)
_CountLeadingOnes unsigned int _CountLeadingOnes(unsigned long)
_CountLeadingOnes64 unsigned int _CountLeadingOnes64(unsigned __int64)
_CountLeadingSigns unsigned int _CountLeadingSigns(long)
_CountLeadingSigns64 unsigned int _CountLeadingSigns64(__int64)
_CountLeadingZeros unsigned int _CountLeadingZeros(unsigned long)
_CountLeadingZeros64 unsigned int _CountLeadingZeros64(unsigned __int64)
_CountTrailingZeros unsigned int _CountTrailingZeros(unsigned long)
_CountTrailingZeros64 unsigned int _CountTrailingZeros64(unsigned __int64)
_CountOneBits unsigned int _CountOneBits(unsigned long)
_CountOneBits64 unsigned int _CountOneBits64(unsigned __int64)
_ReadStatusReg MRS __int64 _ReadStatusReg(int)
_WriteStatusReg MSR void _WriteStatusReg(int, __int64)

[トップに戻る]

メモリ バリアの制限

組み込み関数 __dmb (データ メモリ バリア)、__dsb (データ同期バリア)、および __isb (命令同期バリア) では、定義済みの次の値を使用して、操作の影響を受ける共有ドメインおよびアクセスの種類の観点からメモリ バリアの制限を指定します。

制限値 説明
_ARM64_BARRIER_SY システム全体、読み取りと書き込み。
_ARM64_BARRIER_ST システム全体、書き込みのみ。
_ARM64_BARRIER_LD システム全体、読み取り専用。
_ARM64_BARRIER_ISH 内部共有可能、読み取りと書き込み。
_ARM64_BARRIER_ISHST 内部共有可能、書き込みのみ。
_ARM64_BARRIER_ISHLD 内部共有可能、読み取り専用。
_ARM64_BARRIER_NSH 共有不可、読み取りと書き込み。
_ARM64_BARRIER_NSHST 共有不可、書き込みのみ。
_ARM64_BARRIER_NSHLD 共有不可、読み取り専用。
_ARM64_BARRIER_OSH 外部共有可能、読み取りと書き込み。
_ARM64_BARRIER_OSHST 外部共有可能、書き込みのみ。
_ARM64_BARRIER_OSHLD 外部共有可能、読み取り専用。

組み込みが __isb の場合、現在有効な制限は _ARM64_BARRIER_SY のみです。その他のすべての値は、アーキテクチャによって予約されています。

__iso_volatile_load/store 組み込み

これらの組み込み関数では、コンパイラによる最適化の対象にならないロードとストアが明示的に実行されます。

__int16 __iso_volatile_load16(const volatile __int16 * Location);
__int32 __iso_volatile_load32(const volatile __int32 * Location);
__int64 __iso_volatile_load64(const volatile __int64 * Location);
__int8 __iso_volatile_load8(const volatile __int8 * Location);

void __iso_volatile_store16(volatile __int16 * Location, __int16 Value);
void __iso_volatile_store32(volatile __int32 * Location, __int32 Value);
void __iso_volatile_store64(volatile __int64 * Location, __int64 Value);
void __iso_volatile_store8(volatile __int8 * Location, __int8 Value);

パラメーター

場所
読み取る、または書き込むメモリ位置のアドレスです。

Value
指定されたメモリ位置に書き込む値です (store 組み込みのみ)。

戻り値 (load 組み込みのみ)

Location で指定されたメモリ位置の値。

解説

組み込みの __iso_volatile_load8/16/32/64 および __iso_volatile_store8/16/32/64 を使用すると、コンパイラによる最適化の対象にはならないメモリ アクセスを明示的に実行することができます。 コンパイラはこれらの操作の相対順序を削除、合成、変更できません。 ただし、暗黙的なハードウェアメモリバリアは生成されません。 したがって、ハードウェアでも複数のスレッド間で観察可能なメモリ アクセスの順序が変更される場合があります。 具体的には、これらの組み込みは、/volatile:iso でコンパイルされる次の式と同等です。

int a = __iso_volatile_load32(p);    // equivalent to: int a = *(const volatile __int32*)p;
__iso_volatile_store32(p, a);        // equivalent to: *(volatile __int32*)p = a;

組み込みは、volatile 変数を格納する volatile ポインターを受け取ることに注意してください。 ただし、volatile ポインターを引数として使用するための要件や推奨事項はありません。 これらの操作のセマンティクスは、volatile ではない通常の型を使用する場合とまったく同じです。

/volatile:iso コマンドライン引数の詳細については、「/volatile (volatile キーワードの解釈)」を参照してください。

他のアーキテクチャの組み込みの ARM64 サポート

次の表は、ARM64 プラットフォームでサポートされている他のアーキテクチャの組み込みを示しています。 ARM64 の組み込みの動作が他のハードウェア アーキテクチャの動作と異なる場合は、さらに詳細な情報がメモに記載されています。

関数名 関数プロトタイプ
__assume void __assume(int)
__code_seg void __code_seg(const char *)
__debugbreak void __cdecl __debugbreak(void)
__fastfail __declspec(noreturn) void __fastfail(unsigned int)
__nop void __nop(void)
__yield void __yield(void) 注: ARM64 プラットフォームでは、この関数によって YIELD 命令が生成されます。 この命令は、プログラムに悪影響を与えることなく一時的に実行を中断できるタスク (スピンロックなど) を、スレッドが実行していることを示します。 これにより、CPU が実行サイクル中に他のタスクを実行できるようになり、実行サイクルが浪費されなくなります。
_AddressOfReturnAddress void * _AddressOfReturnAddress(void)
_BitScanForward unsigned char _BitScanForward(unsigned long * _Index, unsigned long _Mask)
_BitScanForward64 unsigned char _BitScanForward64(unsigned long * _Index, unsigned __int64 _Mask)
_BitScanReverse unsigned char _BitScanReverse(unsigned long * _Index, unsigned long _Mask)
_BitScanReverse64 unsigned char _BitScanReverse64(unsigned long * _Index, unsigned __int64 _Mask)
_bittest unsigned char _bittest(long const *, long)
_bittest64 unsigned char _bittest64(__int64 const *, __int64)
_bittestandcomplement unsigned char _bittestandcomplement(long *, long)
_bittestandcomplement64 unsigned char _bittestandcomplement64(__int64 *, __int64)
_bittestandreset unsigned char _bittestandreset(long *, long)
_bittestandreset64 unsigned char _bittestandreset64(__int64 *, __int64)
_bittestandset unsigned char _bittestandset(long *, long)
_bittestandset64 unsigned char _bittestandset64(__int64 *, __int64)
_byteswap_uint64 unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64)
_byteswap_ulong unsigned long __cdecl _byteswap_ulong(unsigned long)
_byteswap_ushort unsigned short __cdecl _byteswap_ushort(unsigned short)
_disable void __cdecl _disable(void) 注: ARM64 プラットフォームでは、この関数によって MSR DAIFCLR,#2 命令が生成されます。これは、組み込みとしてのみ利用できます。
_enable void __cdecl _enable(void) 注: ARM64 プラットフォームでは、この関数によって MSR DAIFSET,#2 命令が生成されます。これは、組み込みとしてのみ利用できます。
_lrotl unsigned long __cdecl _lrotl(unsigned long, int)
_lrotr unsigned long __cdecl _lrotr(unsigned long, int)
_ReadBarrier void _ReadBarrier(void)
_ReadWriteBarrier void _ReadWriteBarrier(void)
_ReturnAddress void * _ReturnAddress(void)
_rotl unsigned int __cdecl _rotl(unsigned int _Value, int _Shift)
_rotl16 unsigned short _rotl16(unsigned short _Value, unsigned char _Shift)
_rotl64 unsigned __int64 __cdecl _rotl64(unsigned __int64 _Value, int _Shift)
_rotl8 unsigned char _rotl8(unsigned char _Value, unsigned char _Shift)
_rotr unsigned int __cdecl _rotr(unsigned int _Value, int _Shift)
_rotr16 unsigned short _rotr16(unsigned short _Value, unsigned char _Shift)
_rotr64 unsigned __int64 __cdecl _rotr64(unsigned __int64 _Value, int _Shift)
_rotr8 unsigned char _rotr8(unsigned char _Value, unsigned char _Shift)
_setjmpex int __cdecl _setjmpex(jmp_buf)
_WriteBarrier void _WriteBarrier(void)

[トップに戻る]

インタロックされた組み込み

インタロックされた組み込みは、アトミックな読み取り/変更/書き込み操作を実行するときに使用する一連の組み込みです。 一部の組み込みは、すべてのプラットフォームに共通です。 これらは数が多いため、ここではその 1 つ 1 つをリストに示しています。 その定義のほとんどは重複しているため、概要で考える方が簡単です。 組み込みの名前から、その具体的な動作を推測できます。

次の表は、bittest 以外のインタロック組み込みについて、ARM64 サポートの概要を示しています。 テーブル内の各セルで、行の一番左のセルにある操作名と、列の一番上にある型名を _Interlocked の最後に付け加えると、組み込みの名前になります。 たとえば、Xor 行と 8 列の交点のセルは _InterlockedXor8 に対応し、これは完全にサポートされています。 サポートされているほとんどの関数には、オプションのサフィックス _acq_rel、および _nf が用意されています。 _acq サフィックスは "取得" のセマンティクスを示し、_rel サフィックスは "解放" のセマンティクスを示します。 _nf ("フェンスなし") サフィックスは ARM と ARM64 で一意であり、次のセクションで説明します。

操作 8 16 32 64 128 P
追加 なし なし [完全] [完全] なし なし
および [完全] [完全] [完全] [完全] なし なし
CompareExchange [完全] [完全] [完全] [完全] [完全] [完全]
Decrement なし [完全] [完全] [完全] なし なし
Exchange [完全] [完全] [完全] [完全] なし 完全
ExchangeAdd [完全] [完全] [完全] [完全] なし なし
Increment なし [完全] [完全] [完全] なし なし
または [完全] [完全] [完全] [完全] なし なし
Xor [完全] [完全] [完全] [完全] なし なし

キー:

  • 完全: サフィックスなし、_acq_rel、および _nf の各形式をサポートします。

  • なし: サポートされません。

_nf (フェンスなし) サフィックス

_nf ("フェンスなし") サフィックスは、その操作に、どのような種類のメモリ バリアとしての機能もないことを示します。これは、すべてがなんらかのバリアとして機能する他の 3 つの形式 (サフィックスなし、_acq、および _rel) とは対照的です。 考えられる _nf 形式の用途の 1 つに、複数のスレッドから同時に更新されるものの、そのスレッドの実行中には値が利用されない統計カウンターの保持があります。

インタロック組み込みのリスト

関数名 関数プロトタイプ
_InterlockedAdd long _InterlockedAdd(long _volatile *, long)
_InterlockedAdd64 __int64 _InterlockedAdd64(__int64 volatile *, __int64)
_InterlockedAdd64_acq __int64 _InterlockedAdd64_acq(__int64 volatile *, __int64)
_InterlockedAdd64_nf __int64 _InterlockedAdd64_nf(__int64 volatile *, __int64)
_InterlockedAdd64_rel __int64 _InterlockedAdd64_rel(__int64 volatile *, __int64)
_InterlockedAdd_acq long _InterlockedAdd_acq(long volatile *, long)
_InterlockedAdd_nf long _InterlockedAdd_nf(long volatile *, long)
_InterlockedAdd_rel long _InterlockedAdd_rel(long volatile *, long)
_InterlockedAnd long _InterlockedAnd(long volatile *, long)
_InterlockedAnd16 short _InterlockedAnd16(short volatile *, short)
_InterlockedAnd16_acq short _InterlockedAnd16_acq(short volatile *, short)
_InterlockedAnd16_nf short _InterlockedAnd16_nf(short volatile *, short)
_InterlockedAnd16_rel short _InterlockedAnd16_rel(short volatile *, short)
_InterlockedAnd64 __int64 _InterlockedAnd64(__int64 volatile *, __int64)
_InterlockedAnd64_acq __int64 _InterlockedAnd64_acq(__int64 volatile *, __int64)
_InterlockedAnd64_nf __int64 _InterlockedAnd64_nf(__int64 volatile *, __int64)
_InterlockedAnd64_rel __int64 _InterlockedAnd64_rel(__int64 volatile *, __int64)
_InterlockedAnd8 char _InterlockedAnd8(char volatile *, char)
_InterlockedAnd8_acq char _InterlockedAnd8_acq(char volatile *, char)
_InterlockedAnd8_nf char _InterlockedAnd8_nf(char volatile *, char)
_InterlockedAnd8_rel char _InterlockedAnd8_rel(char volatile *, char)
_InterlockedAnd_acq long _InterlockedAnd_acq(long volatile *, long)
_InterlockedAnd_nf long _InterlockedAnd_nf(long volatile *, long)
_InterlockedAnd_rel long _InterlockedAnd_rel(long volatile *, long)
_InterlockedCompareExchange long __cdecl _InterlockedCompareExchange(long volatile *, long, long)
_InterlockedCompareExchange_acq long _InterlockedCompareExchange_acq(long volatile *, long, long)
_InterlockedCompareExchange_nf long _InterlockedCompareExchange_nf(long volatile *, long, long)
_InterlockedCompareExchange_rel long _InterlockedCompareExchange_rel(long volatile *, long, long)
_InterlockedCompareExchange16 short _InterlockedCompareExchange16(short volatile *, short, short)
_InterlockedCompareExchange16_acq short _InterlockedCompareExchange16_acq(short volatile *, short, short)
_InterlockedCompareExchange16_nf short _InterlockedCompareExchange16_nf(short volatile *, short, short)
_InterlockedCompareExchange16_rel short _InterlockedCompareExchange16_rel(short volatile *, short, short)
_InterlockedCompareExchange64 __int64 _InterlockedCompareExchange64(__int64 volatile *, __int64, __int64)
_InterlockedCompareExchange64_acq __int64 _InterlockedCompareExchange64_acq(__int64 volatile *, __int64, __int64)
_InterlockedCompareExchange64_nf __int64 _InterlockedCompareExchange64_nf(__int64 volatile *, __int64, __int64)
_InterlockedCompareExchange64_rel __int64 _InterlockedCompareExchange64_rel(__int64 volatile *, __int64, __int64)
_InterlockedCompareExchange8 char _InterlockedCompareExchange8(char volatile *, char, char)
_InterlockedCompareExchange8_acq char _InterlockedCompareExchange8_acq(char volatile *, char, char)
_InterlockedCompareExchange8_nf char _InterlockedCompareExchange8_nf(char volatile *, char, char)
_InterlockedCompareExchange8_rel char _InterlockedCompareExchange8_rel(char volatile *, char, char)
_InterlockedCompareExchangePointer void * _InterlockedCompareExchangePointer(void * volatile *, void *, void *)
_InterlockedCompareExchangePointer_acq void * _InterlockedCompareExchangePointer_acq(void * volatile *, void *, void *)
_InterlockedCompareExchangePointer_nf void * _InterlockedCompareExchangePointer_nf(void * volatile *, void *, void *)
_InterlockedCompareExchangePointer_rel void * _InterlockedCompareExchangePointer_rel(void * volatile *, void *, void *)
_InterlockedCompareExchange128 unsigned char _InterlockedCompareExchange128(__int64 volatile * _Destination, __int64 _ExchangeHigh, __int64 _ExchangeLow, __int64 * _ComparandResult)
_InterlockedCompareExchange128_acq unsigned char _InterlockedCompareExchange128_acq(__int64 volatile * _Destination, __int64 _ExchangeHigh, __int64 _ExchangeLow, __int64 * _ComparandResult)
_InterlockedCompareExchange128_nf unsigned char _InterlockedCompareExchange128_nf(__int64 volatile * _Destination, __int64 _ExchangeHigh, __int64 _ExchangeLow, __int64 * _ComparandResult)
_InterlockedCompareExchange128_rel unsigned char _InterlockedCompareExchange128_rel(__int64 volatile * _Destination, __int64 _ExchangeHigh, __int64 _ExchangeLow, __int64 * _ComparandResult)
_InterlockedDecrement long __cdecl _InterlockedDecrement(long volatile *)
_InterlockedDecrement16 short _InterlockedDecrement16(short volatile *)
_InterlockedDecrement16_acq short _InterlockedDecrement16_acq(short volatile *)
_InterlockedDecrement16_nf short _InterlockedDecrement16_nf(short volatile *)
_InterlockedDecrement16_rel short _InterlockedDecrement16_rel(short volatile *)
_InterlockedDecrement64 __int64 _InterlockedDecrement64(__int64 volatile *)
_InterlockedDecrement64_acq __int64 _InterlockedDecrement64_acq(__int64 volatile *)
_InterlockedDecrement64_nf __int64 _InterlockedDecrement64_nf(__int64 volatile *)
_InterlockedDecrement64_rel __int64 _InterlockedDecrement64_rel(__int64 volatile *)
_InterlockedDecrement_acq long _InterlockedDecrement_acq(long volatile *)
_InterlockedDecrement_nf long _InterlockedDecrement_nf(long volatile *)
_InterlockedDecrement_rel long _InterlockedDecrement_rel(long volatile *)
_InterlockedExchange long __cdecl _InterlockedExchange(long volatile * _Target, long)
_InterlockedExchange_acq long _InterlockedExchange_acq(long volatile * _Target, long)
_InterlockedExchange_nf long _InterlockedExchange_nf(long volatile * _Target, long)
_InterlockedExchange_rel long _InterlockedExchange_rel(long volatile * _Target, long)
_InterlockedExchange16 short _InterlockedExchange16(short volatile * _Target, short)
_InterlockedExchange16_acq short _InterlockedExchange16_acq(short volatile * _Target, short)
_InterlockedExchange16_nf short _InterlockedExchange16_nf(short volatile * _Target, short)
_InterlockedExchange16_rel short _InterlockedExchange16_rel(short volatile * _Target, short)
_InterlockedExchange64 __int64 _InterlockedExchange64(__int64 volatile * _Target, __int64)
_InterlockedExchange64_acq __int64 _InterlockedExchange64_acq(__int64 volatile * _Target, __int64)
_InterlockedExchange64_nf __int64 _InterlockedExchange64_nf(__int64 volatile * _Target, __int64)
_InterlockedExchange64_rel __int64 _InterlockedExchange64_rel(__int64 volatile * _Target, __int64)
_InterlockedExchange8 char _InterlockedExchange8(char volatile * _Target, char)
_InterlockedExchange8_acq char _InterlockedExchange8_acq(char volatile * _Target, char)
_InterlockedExchange8_nf char _InterlockedExchange8_nf(char volatile * _Target, char)
_InterlockedExchange8_rel char _InterlockedExchange8_rel(char volatile * _Target, char)
_InterlockedExchangeAdd long __cdecl _InterlockedExchangeAdd(long volatile *, long)
_InterlockedExchangeAdd16 short _InterlockedExchangeAdd16(short volatile *, short)
_InterlockedExchangeAdd16_acq short _InterlockedExchangeAdd16_acq(short volatile *, short)
_InterlockedExchangeAdd16_nf short _InterlockedExchangeAdd16_nf(short volatile *, short)
_InterlockedExchangeAdd16_rel short _InterlockedExchangeAdd16_rel(short volatile *, short)
_InterlockedExchangeAdd64 __int64 _InterlockedExchangeAdd64(__int64 volatile *, __int64)
_InterlockedExchangeAdd64_acq __int64 _InterlockedExchangeAdd64_acq(__int64 volatile *, __int64)
_InterlockedExchangeAdd64_nf __int64 _InterlockedExchangeAdd64_nf(__int64 volatile *, __int64)
_InterlockedExchangeAdd64_rel __int64 _InterlockedExchangeAdd64_rel(__int64 volatile *, __int64)
_InterlockedExchangeAdd8 char _InterlockedExchangeAdd8(char volatile *, char)
_InterlockedExchangeAdd8_acq char _InterlockedExchangeAdd8_acq(char volatile *, char)
_InterlockedExchangeAdd8_nf char _InterlockedExchangeAdd8_nf(char volatile *, char)
_InterlockedExchangeAdd8_rel char _InterlockedExchangeAdd8_rel(char volatile *, char)
_InterlockedExchangeAdd_acq long _InterlockedExchangeAdd_acq(long volatile *, long)
_InterlockedExchangeAdd_nf long _InterlockedExchangeAdd_nf(long volatile *, long)
_InterlockedExchangeAdd_rel long _InterlockedExchangeAdd_rel(long volatile *, long)
_InterlockedExchangePointer void * _InterlockedExchangePointer(void * volatile * _Target, void *)
_InterlockedExchangePointer_acq void * _InterlockedExchangePointer_acq(void * volatile * _Target, void *)
_InterlockedExchangePointer_nf void * _InterlockedExchangePointer_nf(void * volatile * _Target, void *)
_InterlockedExchangePointer_rel void * _InterlockedExchangePointer_rel(void * volatile * _Target, void *)
_InterlockedIncrement long __cdecl _InterlockedIncrement(long volatile *)
_InterlockedIncrement16 short _InterlockedIncrement16(short volatile *)
_InterlockedIncrement16_acq short _InterlockedIncrement16_acq(short volatile *)
_InterlockedIncrement16_nf short _InterlockedIncrement16_nf(short volatile *)
_InterlockedIncrement16_rel short _InterlockedIncrement16_rel(short volatile *)
_InterlockedIncrement64 __int64 _InterlockedIncrement64(__int64 volatile *)
_InterlockedIncrement64_acq __int64 _InterlockedIncrement64_acq(__int64 volatile *)
_InterlockedIncrement64_nf __int64 _InterlockedIncrement64_nf(__int64 volatile *)
_InterlockedIncrement64_rel __int64 _InterlockedIncrement64_rel(__int64 volatile *)
_InterlockedIncrement_acq long _InterlockedIncrement_acq(long volatile *)
_InterlockedIncrement_nf long _InterlockedIncrement_nf(long volatile *)
_InterlockedIncrement_rel long _InterlockedIncrement_rel(long volatile *)
_InterlockedOr long _InterlockedOr(long volatile *, long)
_InterlockedOr16 short _InterlockedOr16(short volatile *, short)
_InterlockedOr16_acq short _InterlockedOr16_acq(short volatile *, short)
_InterlockedOr16_nf short _InterlockedOr16_nf(short volatile *, short)
_InterlockedOr16_rel short _InterlockedOr16_rel(short volatile *, short)
_InterlockedOr64 __int64 _InterlockedOr64(__int64 volatile *, __int64)
_InterlockedOr64_acq __int64 _InterlockedOr64_acq(__int64 volatile *, __int64)
_InterlockedOr64_nf __int64 _InterlockedOr64_nf(__int64 volatile *, __int64)
_InterlockedOr64_rel __int64 _InterlockedOr64_rel(__int64 volatile *, __int64)
_InterlockedOr8 char _InterlockedOr8(char volatile *, char)
_InterlockedOr8_acq char _InterlockedOr8_acq(char volatile *, char)
_InterlockedOr8_nf char _InterlockedOr8_nf(char volatile *, char)
_InterlockedOr8_rel char _InterlockedOr8_rel(char volatile *, char)
_InterlockedOr_acq long _InterlockedOr_acq(long volatile *, long)
_InterlockedOr_nf long _InterlockedOr_nf(long volatile *, long)
_InterlockedOr_rel long _InterlockedOr_rel(long volatile *, long)
_InterlockedXor long _InterlockedXor(long volatile *, long)
_InterlockedXor16 short _InterlockedXor16(short volatile *, short)
_InterlockedXor16_acq short _InterlockedXor16_acq(short volatile *, short)
_InterlockedXor16_nf short _InterlockedXor16_nf(short volatile *, short)
_InterlockedXor16_rel short _InterlockedXor16_rel(short volatile *, short)
_InterlockedXor64 __int64 _InterlockedXor64(__int64 volatile *, __int64)
_InterlockedXor64_acq __int64 _InterlockedXor64_acq(__int64 volatile *, __int64)
_InterlockedXor64_nf __int64 _InterlockedXor64_nf(__int64 volatile *, __int64)
_InterlockedXor64_rel __int64 _InterlockedXor64_rel(__int64 volatile *, __int64)
_InterlockedXor8 char _InterlockedXor8(char volatile *, char)
_InterlockedXor8_acq char _InterlockedXor8_acq(char volatile *, char)
_InterlockedXor8_nf char _InterlockedXor8_nf(char volatile *, char)
_InterlockedXor8_rel char _InterlockedXor8_rel(char volatile *, char)
_InterlockedXor_acq long _InterlockedXor_acq(long volatile *, long)
_InterlockedXor_nf long _InterlockedXor_nf(long volatile *, long)
_InterlockedXor_rel long _InterlockedXor_rel(long volatile *, long)

[トップに戻る]

_interlockedbittest の組み込み

サフィックスなしの bit test インターロック組み込みは、すべてのプラットフォームに共通です。 ARM64 では _acq_rel、および _nf の各バリアントが追加されますが、これらのバリアントにより変更されるのは、バリアに関する操作のセマンティクスのみです (このドキュメントの「_nf (フェンスなし) サフィックス」を参照)。

関数名 関数プロトタイプ
_interlockedbittestandreset unsigned char _interlockedbittestandreset(long volatile *, long)
_interlockedbittestandreset_acq unsigned char _interlockedbittestandreset_acq(long volatile *, long)
_interlockedbittestandreset_nf unsigned char _interlockedbittestandreset_nf(long volatile *, long)
_interlockedbittestandreset_rel unsigned char _interlockedbittestandreset_rel(long volatile *, long)
_interlockedbittestandreset64 unsigned char _interlockedbittestandreset64(__int64 volatile *, __int64)
_interlockedbittestandreset64_acq unsigned char _interlockedbittestandreset64_acq(__int64 volatile *, __int64)
_interlockedbittestandreset64_nf unsigned char _interlockedbittestandreset64_nf(__int64 volatile *, __int64)
_interlockedbittestandreset64_rel unsigned char _interlockedbittestandreset64_rel(__int64 volatile *, __int64)
_interlockedbittestandset unsigned char _interlockedbittestandset(long volatile *, long)
_interlockedbittestandset_acq unsigned char _interlockedbittestandset_acq(long volatile *, long)
_interlockedbittestandset_nf unsigned char _interlockedbittestandset_nf(long volatile *, long)
_interlockedbittestandset_rel unsigned char _interlockedbittestandset_rel(long volatile *, long)
_interlockedbittestandset64 unsigned char _interlockedbittestandset64(__int64 volatile *, __int64)
_interlockedbittestandset64_acq unsigned char _interlockedbittestandset64_acq(__int64 volatile *, __int64)
_interlockedbittestandset64_nf unsigned char _interlockedbittestandset64_nf(__int64 volatile *, __int64)
_interlockedbittestandset64_rel unsigned char _interlockedbittestandset64_rel(__int64 volatile *, __int64)

[トップに戻る]

関連項目

コンパイラの組み込み
ARM 組み込み
ARM アセンブラー リファレンス
C++ 言語リファレンス