Intrinsik ARM64
Pengkompilasi Microsoft C++ (MSVC) membuat intrinsik berikut tersedia pada arsitektur ARM64. Untuk informasi selengkapnya tentang ARM, lihat bagian Alat Pengembangan Arsitektur dan Perangkat Lunak dari situs web Dokumentasi Pengembang ARM.
NEON
Ekstensi set instruksi vektor NEON untuk ARM64 menyediakan kemampuan Single Instruction Multiple Data (SIMD). Mereka menyerupai yang ada di set instruksi vektor MMX dan SSE yang umum untuk prosesor arsitektur x86 dan x64.
Intrinsik NEON didukung, seperti yang disediakan dalam file arm64_neon.h
header . Dukungan MSVC untuk intrinsik NEON menyerupan kompilator ARM64, yang didokumentasikan dalam Referensi Intrinsik ARM NEON di situs web ARM Infocenter.
Daftar intrinsik khusus ARM64
Intrinsik khusus ARM64 didukung, seperti yang disediakan dalam file intrin.h
header .
Nama Fungsi | Instruksi | Prototipe Fungsi |
---|---|---|
__pecah | BRK | __break batal(int) |
__addx18byte | __addx18byte batal(karakter panjang dan tidak ditandatangani) | |
__addx18word | __addx18word batal(panjang tidak ditandatangani, pendek tidak ditandatangani) | |
__addx18dword | __addx18dword batal (panjang tidak ditandatangani, panjang tidak ditandatangani) | |
__addx18qword | __addx18qword batal(__int64 panjang dan tidak ditandatangani) | |
__cas8 | CASB | __int8 __cas8 tidak ditandatangani(_Target volatil __int8 yang tidak ditandatangani, __int8 _Comp __int8 _Value tidak ditandatangani) |
__cas16 | UANG | __int16 __cas16 tidak ditandatangani(__int16 _Target volatile* yang tidak ditandatangani _Target, __int16 _Comp tidak ditandatangani, __int16 _Value) |
__cas32 | CAS | __int32 __cas32 tidak ditandatangani(_Target volatile* __int32 tidak ditandatangani, __int32 _Comp tidak ditandatangani, __int32 _Value) |
__cas64 | CAS | __int64 __cas64 tidak ditandatangani(_Target volatile* __int64 tidak ditandatangani, __int64 _Comp tidak ditandatangani, __int64 _Value) |
__casa8 | CASAB | __int8 __casa8 tidak ditandatangani(_Target volatil __int8 yang tidak ditandatangani, __int8 _Comp tidak ditandatangani, __int8 _Value) |
__casa16 | CASAH | __int16 __casa16 yang tidak ditandatangani(_Target volatil __int16 yang tidak ditandatangani, __int16 _Comp tidak ditandatangani, __int16 _Value) |
__casa32 | CASA | __int32 __casa32 tidak ditandatangani(__int32 volatile* _Target, __int32 _Comp tidak ditandatangani, __int32 _Value tidak ditandatangani) |
__casa64 | CASA | __int64 __casa64 tidak ditandatangani(_Target volatil __int64 yang tidak ditandatangani, __int64 _Comp tidak ditandatangani, __int64 _Value) |
__casl8 | CASLB | __int8 __casl8 tidak ditandatangani(__int8 _Target volatile* yang tidak ditandatangani _Target, __int8 _Comp yang tidak ditandatangani, __int8 _Value tidak ditandatangani) |
__casl16 | CASLH | __int16 __casl16 tidak ditandatangani(_Target volatile* __int16 yang tidak ditandatangani _Target, __int16 _Comp yang tidak ditandatangani, __int16 _Value tidak ditandatangani) |
__casl32 | CASL | __int32 __casl32 tidak ditandatangani(_Target volatil __int32 yang tidak ditandatangani, __int32 _Comp tidak ditandatangani, __int32 _Value tidak ditandatangani) |
__casl64 | CASL | __int64 __casl64 tidak ditandatangani (_Target volatil __int64 tidak bertanda tangan*, __int64 _Comp yang tidak ditandatangani, __int64 _Value tidak ditandatangani) |
__casal8 | CASALB | __int8 __casal8 tidak ditandatangani(__int8 volatile* _Target, __int8 _Comp tidak ditandatangani, __int8 _Value tidak ditandatangani) |
__casal16 | CASALH | __int16 __casal16 tidak ditandatangani(_Target volatil __int16 tidak ditandatangani* , __int16 _Comp tidak ditandatangani, __int16 _Value) |
__casal32 | CASAL | __int32 __casal32 tidak ditandatangani(_Target volatile* __int32 tidak ditandatangani, __int32 _Comp tidak ditandatangani, __int32 _Value) |
__casal64 | CASAL | __int64 __casal64 tidak ditandatangani(_Target volatil __int64 yang tidak ditandatangani, __int64 _Comp tidak ditandatangani, __int64 _Value) |
__crc32b | CRC32B | __int32 __crc32b tidak ditandatangani(__int32 tidak ditandatangani, __int32 tidak ditandatangani) |
__crc32h | CRC32H | __int32 __crc32h tidak ditandatangani(__int32 tidak ditandatangani, __int32 tidak ditandatangani) |
__crc32w | CRC32W | __int32 __crc32w tidak ditandatangani(__int32 tidak ditandatangani, __int32 tidak ditandatangani) |
__crc32d | CRC32X | __int32 __crc32d tidak ditandatangani(__int32 tidak ditandatangani, __int64 tidak ditandatangani) |
__crc32cb | CRC32CB | __int32 __crc32cb tidak ditandatangani(__int32 tidak ditandatangani, __int32 tidak ditandatangani) |
__crc32ch | CRC32CH | __int32 __crc32ch tidak ditandatangani(__int32 tidak ditandatangani, __int32 tidak ditandatangani) |
__crc32cw | CRC32CW | __int32 __crc32cw tidak ditandatangani(__int32 tidak ditandatangani, __int32 tidak ditandatangani) |
__crc32cd | CRC32CX | __int32 __crc32cd tidak ditandatangani(__int32 tidak ditandatangani, __int64 tidak ditandatangani) |
__dmb | DMB | __dmb batal (int _Type tidak ditandatangani )Menyisipkan operasi penghubung memori ke dalam aliran instruksi. Parameter _Type menentukan jenis pembatasan yang diterapkan hambatan.Untuk informasi selengkapnya tentang jenis pembatasan yang dapat diberlakukan, lihat Pembatasan hambatan memori. |
__dsb | DSB | __dsb batal (_Type int yang tidak ditandatangani) Menyisipkan operasi penghubung memori ke dalam aliran instruksi. Parameter _Type menentukan jenis pembatasan yang diterapkan hambatan.Untuk informasi selengkapnya tentang jenis pembatasan yang dapat diberlakukan, lihat Pembatasan hambatan memori. |
__isb | ISB | __isb batal(_Type int yang tidak ditandatangani) Menyisipkan operasi penghubung memori ke dalam aliran instruksi. Parameter _Type menentukan jenis pembatasan yang diterapkan hambatan.Untuk informasi selengkapnya tentang jenis pembatasan yang dapat diberlakukan, lihat Pembatasan hambatan memori. |
__getReg | __int64 __getReg(int) yang tidak ditandatangani | |
__getRegFp | __getRegFp ganda(int) | |
__getCallerReg | __int64 __getCallerReg tidak ditandatangani(int) | |
__getCallerRegFp | __getCallerRegFp ganda(int) | |
__hvc | HVC | __hvc int tidak ditandatangani(int tidak ditandatangani, ...) |
__hlt | HLT | int __hlt(int tidak ditandatangani, ...) |
__incx18byte | __incx18byte batal (panjang tidak ditandatangani) | |
__incx18word | __incx18word batal (panjang tidak ditandatangani) | |
__incx18dword | __incx18dword batal (panjang tidak ditandatangani) | |
__incx18qword | __incx18qword batal(panjang tidak ditandatangani) | |
__iso_volatile_load16 | __int16 __iso_volatile_load16(const volatile __int16 *) Untuk informasi selengkapnya, lihat __iso_volatile_load/menyimpan intrinsik. |
|
__iso_volatile_load32 | __int32 __iso_volatile_load32(const volatile __int32 *) Untuk informasi selengkapnya, lihat __iso_volatile_load/menyimpan intrinsik. |
|
__iso_volatile_load64 | __int64 __iso_volatile_load64(const volatile __int64 *) Untuk informasi selengkapnya, lihat __iso_volatile_load/menyimpan intrinsik. |
|
__iso_volatile_load8 | __int8 __iso_volatile_load8(const volatil __int8 *) Untuk informasi selengkapnya, lihat __iso_volatile_load/menyimpan intrinsik. |
|
__iso_volatile_store16 | __iso_volatile_store16 batal (__int16 volatil *, __int16) Untuk informasi selengkapnya, lihat __iso_volatile_load/menyimpan intrinsik. |
|
__iso_volatile_store32 | __iso_volatile_store32 batal (__int32 volatil *, __int32) Untuk informasi selengkapnya, lihat __iso_volatile_load/menyimpan intrinsik. |
|
__iso_volatile_store64 | __iso_volatile_store64 batal (__int64 volatil *, __int64) Untuk informasi selengkapnya, lihat __iso_volatile_load/menyimpan intrinsik. |
|
__iso_volatile_store8 | __iso_volatile_store8 batal (__int8 volatil *, __int8) Untuk informasi selengkapnya, lihat __iso_volatile_load/menyimpan intrinsik. |
|
__ldar8 | LDARB | __int8 __ldar8 tidak ditandatangani(_Target volatil* __int8 tidak ditandatangani) |
__ldar16 | LDARH | __int16 __ldar16 tidak ditandatangani (_Target volatil __int16 tidak ditandatangani* ) |
__ldar32 | LDAR | __int32 __ldar32 tidak ditandatangani(_Target volatile* __int32 tidak ditandatangani) |
__ldar64 | LDAR | __int64 __ldar64 tidak ditandatangani(_Target volatile* __int64 tidak ditandatangani) |
__ldapr8 | LDAPRB | __int8 __ldapr8 tidak ditandatangani(_Target volatile* __int8 tidak ditandatangani) |
__ldapr16 | LDAPRH | __int16 __ldapr16 tidak ditandatangani(_Target volatil* __int16 tidak ditandatangani) |
__ldapr32 | LDAPR | __int32 __ldapr32 tidak ditandatangani(_Target volatile* __int32 tidak ditandatangani) |
__ldapr64 | LDAPR | __int64 __ldapr64 tidak ditandatangani(_Target volatil __int64 tidak ditandatangani) |
__mulh | __int64 __mulh(__int64, __int64) | |
__prefetch | PRFM | void __cdecl __prefetch(const void *) Menyediakan PRFM petunjuk memori dengan operasi PLDL1KEEP prefetch ke sistem yang memorinya berada di atau dekat alamat yang ditentukan dapat segera diakses. Beberapa sistem dapat memilih untuk mengoptimalkan pola akses memori tersebut untuk meningkatkan performa runtime. Namun, dari sudut pandang bahasa C++, fungsi tidak memiliki efek yang dapat diamati, dan mungkin tidak melakukan apa pun sama sekali. |
__prefetch2 | PRFM | __cdecl __prefetch batal(const void *, uint8_t prfop) Memberikan PRFM petunjuk memori dengan operasi prefetch yang disediakan ke sistem bahwa memori di atau dekat alamat yang ditentukan dapat segera diakses. Beberapa sistem dapat memilih untuk mengoptimalkan pola akses memori tersebut untuk meningkatkan performa runtime. Namun, dari sudut pandang bahasa C++, fungsi tidak memiliki efek yang dapat diamati, dan mungkin tidak melakukan apa pun sama sekali. |
__readx18byte | __readx18byte karakter yang tidak ditandatangani (panjang tidak ditandatangani) | |
__readx18word | __readx18word pendek yang tidak ditandatangani (panjang tidak ditandatangani) | |
__readx18dword | __readx18dword panjang yang tidak ditandatangani (panjang tidak ditandatangani) | |
__readx18qword | __int64 __readx18qword tidak ditandatangani(panjang tidak ditandatangani) | |
__setReg | __setReg batal(int, __int64 tidak ditandatangani) | |
__setRegFp | __setRegFp batal(int, double) | |
__setCallerReg | __setCallerReg batal(int, __int64 tidak ditandatangani) | |
__setCallerRegFp | __setCallerRegFp void(int, double) | |
__sev | SEV | __sev batal (batal) |
__static_assert | __static_assert batal(int, const char *) | |
__stlr8 | STLRB | __stlr8 tidak ditandatangani __int8 _Target, __int8 _Value tidak ditandatangani) |
__stlr16 | STLRH | __stlr16 tidak ditandatangani __int16 volatil* _Target, __int16 _Value yang tidak ditandatangani) |
__stlr32 | STLR | __stlr32 tidak ditandatangani __int32 _Target, __int32 _Value tidak ditandatangani) |
__stlr64 | STLR | __stlr64 tidak ditandatangani __int64 _Target, __int64 _Value tidak ditandatangani) |
__swp8 | SWPB | __int8 __swp8 tidak ditandatangani(__int8 volatile* _Target, __int8 _Value tidak ditandatangani) |
__swp16 | SWPH | __int16 __swp16 tidak ditandatangani(__int16 volatile* _Target yang tidak ditandatangani, __int16 _Value tidak ditandatangani) |
__swp32 | SWP | __int32 __swp32 yang tidak ditandatangani(_Target volatil __int32 tidak ditandatangani*, __int32 _Value tidak ditandatangani) |
__swp64 | SWP | __int64 __swp64 tidak ditandatangani(__int64 _Target volatile* yang tidak ditandatangani, __int64 _Value tidak ditandatangani) |
__swpa8 | SWPAB | __int8 __swpa8 yang tidak ditandatangani(_Target volatil __int8 yang tidak ditandatangani, __int8 _Value tidak ditandatangani) |
__swpa16 | SWPAH | __int16 __swpa16 tidak ditandatangani(_Target volatil __int16 tidak ditandatangani*, __int16 _Value tidak ditandatangani) |
__swpa32 | SWPA | __int32 __swpa32 yang tidak ditandatangani(_Target volatil __int32 tidak ditandatangani*, __int32 _Value tidak ditandatangani) |
__swpa64 | SWPA | __int64 __swpa64 tidak ditandatangani(__int64 volatile* _Target yang tidak ditandatangani, __int64 _Value tidak ditandatangani) |
__swpl8 | SWPLB | __int8 __swpl8 tidak ditandatangani(_Target volatil __int8 tidak bertanda tangan*, __int8 _Value tidak ditandatangani) |
__swpl16 | SWPLH | __int16 __swpl16 tidak ditandatangani (_Target volatil __int16 tidak bertanda tangan*, __int16 _Value tidak ditandatangani) |
__swpl32 | SWPL | __int32 __swpl32 tidak ditandatangani(_Target volatil __int32 yang tidak ditandatangani, __int32 _Value tidak ditandatangani) |
__swpl64 | SWPL | __int64 __swpl64 tidak ditandatangani(_Target volatile* __int64 tidak ditandatangani, __int64 _Value tidak ditandatangani) |
__swpal8 | SWPALB | __int8 __swpal8 yang tidak ditandatangani(_Target volatil __int8 yang tidak ditandatangani, __int8 _Value) |
__swpal16 | SWPALH | __int16 __swpal16 tidak ditandatangani(_Target volatile* __int16 tidak ditandatangani, __int16 _Value tidak ditandatangani) |
__swpal32 | SWPAL | __int32 __swpal32 tidak ditandatangani(_Target volatil __int32 yang tidak ditandatangani*, __int32 _Value tidak ditandatangani) |
__swpal64 | SWPAL | __int64 __swpal64 tidak ditandatangani(_Target volatil __int64 tidak ditandatangani* _Target, __int64 _Value tidak ditandatangani) |
__sys | SYS | __sys int yang tidak ditandatangani(int, __int64) |
__Svc | SVC | __svc int tidak ditandatangani(int tidak ditandatangani, ...) |
__wfe | WFE | __wfe batal (batal) |
__wfi | WFI | __wfi batal (batal) |
__writex18byte | __writex18byte tidak ditandatangani(karakter panjang dan tidak ditandatangani) | |
__writex18word | __writex18word batal(panjang tidak ditandatangani, pendek tidak ditandatangani) | |
__writex18dword | __writex18dword batal(panjang tidak ditandatangani, panjang tidak ditandatangani) | |
__writex18qword | __writex18qword batal(__int64 panjang dan tidak ditandatangani) | |
__umulh | __int64 __umulh tidak ditandatangani(__int64 tidak ditandatangani, __int64 tidak ditandatangani) | |
_CopyDoubleFromInt64 | _CopyDoubleFromInt64 ganda(__int64) | |
_CopyFloatFromInt32 | _CopyFloatFromInt32 float(__int32) | |
_CopyInt32FromFloat | __int32 _CopyInt32FromFloat(float) | |
_CopyInt64FromDouble | __int64 _CopyInt64FromDouble(ganda) | |
_CountLeadingOnes | _CountLeadingOnes int yang tidak ditandatangani(panjang tidak ditandatangani) | |
_CountLeadingOnes64 | _CountLeadingOnes64 int yang tidak ditandatangani(__int64 tidak ditandatangani) | |
_CountLeadingSigns | _CountLeadingSigns int tidak ditandatangani(panjang) | |
_CountLeadingSigns64 | _CountLeadingSigns64 int tidak ditandatangani(__int64) | |
_CountLeadingZeros | _CountLeadingZeros int yang tidak ditandatangani (panjang tidak ditandatangani) | |
_CountLeadingZeros64 | _CountLeadingZeros64 int yang tidak ditandatangani(__int64 yang tidak ditandatangani) | |
_CountTrailingZeros | _CountTrailingZeros int tidak ditandatangani(panjang tidak ditandatangani) | |
_CountTrailingZeros64 | _CountTrailingZeros64 int tidak ditandatangani(__int64 tidak ditandatangani) | |
_CountOneBits | _CountOneBits int yang tidak ditandatangani(panjang tidak ditandatangani) | |
_CountOneBits64 | _CountOneBits64 int yang tidak ditandatangani(__int64 yang tidak ditandatangani) | |
_ReadStatusReg | MRS | __int64 _ReadStatusReg(int) |
_WriteStatusReg | MSR | _WriteStatusReg batal(int, __int64) |
Pembatasan pembatas memori
Fungsi __dmb
intrinsik (hambatan memori data), __dsb
(hambatan sinkronisasi data), dan __isb
(hambatan sinkronisasi instruksi) menggunakan nilai yang telah ditentukan sebelumnya berikut untuk menentukan pembatasan hambatan memori dalam hal domain berbagi dan jenis akses yang terpengaruh oleh operasi.
Nilai Pembatasan | Deskripsi |
---|---|
_ARM64_BARRIER_SY | Sistem lengkap, baca dan tulis. |
_ARM64_BARRIER_ST | Sistem penuh, hanya menulis. |
_ARM64_BARRIER_LD | Sistem penuh, baca saja. |
_ARM64_BARRIER_ISH | Inner sharable, membaca dan menulis. |
_ARM64_BARRIER_ISHST | Inner sharable, hanya menulis. |
_ARM64_BARRIER_ISHLD | Inner sharable, baca saja. |
_ARM64_BARRIER_NSH | Tidak dapat dibagikan, dibaca dan ditulis. |
_ARM64_BARRIER_NSHST | Tidak dapat dibagikan, hanya menulis. |
_ARM64_BARRIER_NSHLD | Tidak dapat dibagikan, baca saja. |
_ARM64_BARRIER_OSH | Outer sharable, membaca dan menulis. |
_ARM64_BARRIER_OSHST | Outer sharable, hanya menulis. |
_ARM64_BARRIER_OSHLD | Outer sharable, baca saja. |
Untuk intrinsik __isb
, satu-satunya batasan yang saat ini valid adalah _ARM64_BARRIER_SY; semua nilai lain dicadangkan oleh arsitektur.
__iso_volatile_load/menyimpan intrinsik
Fungsi intrinsik ini secara eksplisit melakukan beban dan penyimpanan yang tidak tunduk pada pengoptimalan pengkompilasi.
__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);
Parameter
Location
Alamat lokasi memori untuk dibaca atau ditulis.
Nilai
Nilai untuk menulis ke lokasi memori yang ditentukan (hanya menyimpan intrinsik).
Mengembalikan nilai (hanya intrinsik beban)
Nilai lokasi memori yang ditentukan oleh Lokasi.
Keterangan
Anda dapat menggunakan __iso_volatile_load8/16/32/64
intrinsik dan __iso_volatile_store8/16/32/64
untuk secara eksplisit melakukan akses memori yang tidak tunduk pada pengoptimalan pengkompilasi. Pengkompilasi tidak dapat menghapus, mensinthetisasi, atau mengubah urutan relatif operasi ini. Namun, itu tidak menghasilkan hambatan memori perangkat keras implisit. Oleh karena itu, perangkat keras mungkin masih menyusun ulang akses memori yang dapat diamati di beberapa utas. Lebih tepatnya, intrinsik ini setara dengan ekspresi berikut seperti yang dikompilasi di bawah /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;
Perhatikan bahwa intrinsik mengambil pointer volatil untuk mengakomodasi variabel volatil. Namun, tidak ada persyaratan atau rekomendasi untuk menggunakan pointer volatil sebagai argumen. Semantik operasi ini sama persis jika jenis reguler dan non-volatil digunakan.
Untuk informasi selengkapnya tentang argumen baris perintah /volatile:iso , lihat /volatile (interpretasi kata kunci volatil).
Dukungan ARM64 untuk intrinsik dari arsitektur lain
Tabel berikut mencantumkan intrinsik dari arsitektur lain yang didukung pada platform ARM64. Jika perilaku intrinsik pada ARM64 berbeda dari perilakunya pada arsitektur perangkat keras lainnya, detail tambahan dicatat.
Nama Fungsi | Prototipe Fungsi |
---|---|
__assume | __assume batal (int) |
__code_seg | __code_seg void(const char *) |
__debugbreak | __cdecl __debugbreak batal (batal) |
__fastfail | __declspec(noreturn) __fastfail batal (int tidak ditandatangani) |
__nop | void __nop(void) |
__hasil | void __yield(void) Note: Pada platform ARM64, fungsi ini menghasilkan instruksi YIELD. Instruksi ini menunjukkan bahwa utas melakukan tugas yang mungkin ditangguhkan sementara dari eksekusi—misalnya, spinlock—tanpa berdampak buruk pada program. Ini memungkinkan CPU untuk menjalankan tugas lain selama siklus eksekusi yang jika tidak akan terbuang-. |
_AddressOfReturnAddress | void * _AddressOfReturnAddress(void) |
_BitScanForward | _BitScanForward karakter yang tidak ditandatangani (panjang * _Index, _Mask panjang yang tidak ditandatangani) |
_BitScanForward64 | _BitScanForward64 karakter tidak ditandatangani (panjang * _Index, __int64 _Mask tidak ditandatangani) |
_BitScanReverse | _BitScanReverse karakter yang tidak ditandatangani (panjang * _Index, _Mask panjang yang tidak ditandatangani) |
_BitScanReverse64 | _BitScanReverse64 karakter yang tidak ditandatangani (panjang * _Index, __int64 _Mask tidak ditandatangani) |
_bittest | karakter yang tidak ditandatangani _bittest(kontra panjang *, panjang) |
_bittest64 | _bittest64 karakter yang tidak ditandatangani(__int64 const *, __int64) |
_bittestandcomplement | karakter tidak ditandatangani _bittestandcomplement(panjang *, panjang) |
_bittestandcomplement64 | _bittestandcomplement64 karakter yang tidak ditandatangani(__int64 *, __int64) |
_bittestandreset | karakter yang tidak ditandatangani _bittestandreset(panjang *, panjang) |
_bittestandreset64 | _bittestandreset64 karakter tidak ditandatangani(__int64 *, __int64) |
_bittestandset | karakter tidak ditandatangani _bittestandset(panjang *, panjang) |
_bittestandset64 | _bittestandset64 karakter yang tidak ditandatangani(__int64 *, __int64) |
_byteswap_uint64 | __int64 __cdecl _byteswap_uint64 tidak ditandatangani(__int64 tidak ditandatangani) |
_byteswap_ulong | __cdecl _byteswap_ulong panjang yang tidak ditandatangani(panjang tidak ditandatangani) |
_byteswap_ushort | __cdecl _byteswap_ushort pendek yang tidak ditandatangani(pendek tidak ditandatangani) |
_disable | void __cdecl _disable(void) Note: Pada platform ARM64, fungsi ini menghasilkan instruksi MSR DAIFCLR,#2 ; hanya tersedia sebagai intrinsik. |
_enable | void __cdecl _enable(void) Note: Pada platform ARM64, fungsi ini menghasilkan instruksi MSR DAIFSET,#2 ; hanya tersedia sebagai intrinsik. |
_lrotl | __cdecl _lrotl panjang yang tidak ditandatangani(panjang tidak ditandatangani, int) |
_lrotr | __cdecl _lrotr panjang yang tidak ditandatangani(panjang tidak ditandatangani, int) |
_ReadBarrier | _ReadBarrier batal (batal) |
_ReadWriteBarrier | _ReadWriteBarrier batal (batal) |
_ReturnAddress | void * _ReturnAddress(void) |
_rotl | __cdecl _rotl int yang tidak ditandatangani(_Value int yang tidak ditandatangani, _Shift int) |
_rotl16 | _rotl16 pendek yang tidak ditandatangani(_Value pendek yang tidak ditandatangani, karakter yang tidak ditandatangani _Shift) |
_rotl64 | __int64 __cdecl _rotl64 tidak ditandatangani(__int64 _Value yang tidak ditandatangani, _Shift int) |
_rotl8 | _rotl8 karakter yang tidak ditandatangani(_Value karakter yang tidak ditandatangani, _Shift karakter yang tidak ditandatangani) |
_rotr | __cdecl _rotr int yang tidak ditandatangani(_Value int yang tidak ditandatangani, _Shift int) |
_rotr16 | _rotr16 pendek yang tidak ditandatangani(_Value pendek yang tidak ditandatangani, _Shift karakter tidak ditandatangani) |
_rotr64 | __int64 __cdecl _rotr64 yang tidak ditandatangani(__int64 _Value yang tidak ditandatangani, _Shift int) |
_rotr8 | _rotr8 karakter yang tidak ditandatangani(_Value karakter yang tidak ditandatangani, _Shift karakter yang tidak ditandatangani) |
_setjmpex | __cdecl _setjmpex int(jmp_buf) |
_WriteBarrier | _WriteBarrier batal (batal) |
Intrinsik yang saling mengunci
Intrinsik yang saling diblokir adalah sekumpulan intrinsik yang digunakan untuk melakukan operasi baca-ubah-tulis atomik. Beberapa dari mereka umum untuk semua platform. Mereka terdaftar secara terpisah di sini karena ada sejumlah besar dari mereka. Karena definisi mereka sebagian besar berlebihan, lebih mudah untuk memikirkannya secara umum. Nama mereka dapat digunakan untuk mendapatkan perilaku yang tepat.
Tabel berikut ini meringkas dukungan ARM64 dari intrinsik interlock non-bittest. Setiap sel dalam tabel sesuai dengan nama yang diturunkan dengan menambahkan nama operasi di sel paling kiri baris dan nama jenis di sel paling atas kolom ke _Interlocked
. Misalnya, sel di persimpangan Xor
baris dan 8
kolom sesuai dengan _InterlockedXor8
dan didukung sepenuhnya. Sebagian besar fungsi yang didukung menawarkan akhiran opsional ini: _acq
, , _rel
dan _nf
. Akhiran _acq
menunjukkan semantik "akuisisi" dan _rel
akhiran menunjukkan semantik "rilis". Akhiran _nf
atau "tanpa pagar" unik untuk ARM dan ARM64 dan dibahas di bagian berikutnya.
Operasi | 8 | 16 | 32 | 64 | 128 | P |
---|---|---|---|---|---|---|
Menambahkan | Tidak | Tidak | Penuh | Penuh | Tidak | Tidak |
Dan | Penuh | Penuh | Penuh | Penuh | Tidak | Tidak |
BandingkanExchange | Penuh | Penuh | Penuh | Penuh | Penuh | Penuh |
Keputusan | Tidak | Penuh | Penuh | Penuh | Tidak | Tidak |
Exchange | Penuh | Penuh | Penuh | Penuh | Tidak | Penuh |
ExchangeAdd | Penuh | Penuh | Penuh | Penuh | Tidak | Tidak |
Peningkatan | Tidak | Penuh | Penuh | Penuh | Tidak | Tidak |
Atau | Penuh | Penuh | Penuh | Penuh | Tidak | Tidak |
Xor | Penuh | Penuh | Penuh | Penuh | Tidak | Tidak |
Kunci:
Penuh: mendukung formulir biasa,
_acq
,_rel
, dan_nf
.Tidak ada: Tidak didukung
akhiran _nf (tanpa pagar)
Akhiran _nf
atau "tanpa pagar" menunjukkan bahwa operasi tidak berperilaku sebagai penghapus memori apa pun, berbeda dengan tiga bentuk lainnya (polos, _acq
, dan _rel
), yang semuanya berperilaku sebagai semacam penghapus. Salah satu kemungkinan penggunaan _nf
formulir adalah mempertahankan penghitung statistik yang diperbarui oleh beberapa utas secara bersamaan tetapi nilainya tidak digunakan saat beberapa utas dijalankan.
Daftar intrinsik yang saling mengunci
Nama Fungsi | Prototipe Fungsi |
---|---|
_InterlockedAdd | _InterlockedAdd panjang(_volatile panjang *, panjang) |
_InterlockedAdd64 | __int64 _InterlockedAdd64(__int64 volatil *, __int64) |
_InterlockedAdd64_acq | __int64 _InterlockedAdd64_acq(__int64 volatil *, __int64) |
_InterlockedAdd64_nf | __int64 _InterlockedAdd64_nf(__int64 volatil *, __int64) |
_InterlockedAdd64_rel | __int64 _InterlockedAdd64_rel(__int64 volatil *, __int64) |
_InterlockedAdd_acq | _InterlockedAdd_acq panjang (volatil panjang *, panjang) |
_InterlockedAdd_nf | _InterlockedAdd_nf panjang (volatil panjang *, panjang) |
_InterlockedAdd_rel | _InterlockedAdd_rel panjang (volatil panjang *, panjang) |
_InterlockedAnd | _InterlockedAnd panjang (volatil panjang *, panjang) |
_InterlockedAnd16 | _InterlockedAnd16 pendek (volatil pendek *, pendek) |
_InterlockedAnd16_acq | _InterlockedAnd16_acq pendek (volatil pendek *, pendek) |
_InterlockedAnd16_nf | _InterlockedAnd16_nf pendek (volatil pendek *, pendek) |
_InterlockedAnd16_rel | _InterlockedAnd16_rel pendek (volatil pendek *, pendek) |
_InterlockedAnd64 | __int64 _InterlockedAnd64(__int64 volatil *, __int64) |
_InterlockedAnd64_acq | __int64 _InterlockedAnd64_acq(__int64 volatil *, __int64) |
_InterlockedAnd64_nf | __int64 _InterlockedAnd64_nf(__int64 volatil *, __int64) |
_InterlockedAnd64_rel | __int64 _InterlockedAnd64_rel(__int64 volatil *, __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 | _InterlockedAnd_acq panjang (volatil panjang *, panjang) |
_InterlockedAnd_nf | _InterlockedAnd_nf panjang (volatil panjang *, panjang) |
_InterlockedAnd_rel | _InterlockedAnd_rel panjang (volatil panjang *, panjang) |
_InterlockedCompareExchange | __cdecl _InterlockedCompareExchange panjang (volatil panjang *, panjang, panjang) |
_InterlockedCompareExchange_acq | _InterlockedCompareExchange_acq panjang (volatil panjang *, panjang, panjang) |
_InterlockedCompareExchange_nf | _InterlockedCompareExchange_nf panjang (volatil panjang *, panjang, panjang) |
_InterlockedCompareExchange_rel | _InterlockedCompareExchange_rel panjang (volatil panjang *, panjang, panjang) |
_InterlockedCompareExchange16 | _InterlockedCompareExchange16 pendek (volatil pendek *, pendek, pendek) |
_InterlockedCompareExchange16_acq | _InterlockedCompareExchange16_acq pendek (volatil pendek *, pendek, pendek) |
_InterlockedCompareExchange16_nf | _InterlockedCompareExchange16_nf pendek (volatil pendek *, pendek, pendek) |
_InterlockedCompareExchange16_rel | _InterlockedCompareExchange16_rel pendek(volatile pendek *, pendek, pendek) |
_InterlockedCompareExchange64 | __int64 _InterlockedCompareExchange64(__int64 volatil *, __int64, __int64) |
_InterlockedCompareExchange64_acq | __int64 _InterlockedCompareExchange64_acq(__int64 volatil *, __int64, __int64) |
_InterlockedCompareExchange64_nf | __int64 _InterlockedCompareExchange64_nf(__int64 volatil *, __int64, __int64) |
_InterlockedCompareExchange64_rel | __int64 _InterlockedCompareExchange64_rel(__int64 volatil *, __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(batal * volatil *, batal *, batal *) |
_InterlockedCompareExchangePointer_acq | void * _InterlockedCompareExchangePointer_acq(void * volatile *, void *, void *) |
_InterlockedCompareExchangePointer_nf | void * _InterlockedCompareExchangePointer_nf(void * volatile *, void *, void *) |
_InterlockedCompareExchangePointer_rel | void * _InterlockedCompareExchangePointer_rel(batal * volatil *, batal *, batal *) |
_InterlockedCompareExchange128 | _InterlockedCompareExchange128 karakter yang tidak ditandatangani (__int64 volatil * _Destination, __int64 _ExchangeHigh, __int64 _ExchangeLow, __int64 * _ComparandResult) |
_InterlockedCompareExchange128_acq | _InterlockedCompareExchange128_acq karakter yang tidak ditandatangani (__int64 volatil * _Destination, __int64 _ExchangeHigh, __int64 _ExchangeLow, __int64 * _ComparandResult) |
_InterlockedCompareExchange128_nf | _InterlockedCompareExchange128_nf karakter yang tidak ditandatangani (__int64 volatil * _Destination, __int64 _ExchangeHigh, __int64 _ExchangeLow, __int64 * _ComparandResult) |
_InterlockedCompareExchange128_rel | _InterlockedCompareExchange128_rel karakter yang tidak ditandatangani (__int64 volatil * _Destination, __int64 _ExchangeHigh, __int64 _ExchangeLow, __int64 * _ComparandResult) |
_InterlockedDecrement | __cdecl _InterlockedDecrement panjang (volatil panjang *) |
_InterlockedDecrement16 | _InterlockedDecrement16 pendek(volatile pendek *) |
_InterlockedDecrement16_acq | _InterlockedDecrement16_acq pendek(volatile pendek *) |
_InterlockedDecrement16_nf | _InterlockedDecrement16_nf pendek (volatil pendek *) |
_InterlockedDecrement16_rel | _InterlockedDecrement16_rel pendek(volatile pendek *) |
_InterlockedDecrement64 | __int64 _InterlockedDecrement64(__int64 volatil *) |
_InterlockedDecrement64_acq | __int64 _InterlockedDecrement64_acq(__int64 volatil *) |
_InterlockedDecrement64_nf | __int64 _InterlockedDecrement64_nf(__int64 volatil *) |
_InterlockedDecrement64_rel | __int64 _InterlockedDecrement64_rel(__int64 volatil *) |
_InterlockedDecrement_acq | _InterlockedDecrement_acq panjang (volatil panjang *) |
_InterlockedDecrement_nf | _InterlockedDecrement_nf panjang (volatil panjang *) |
_InterlockedDecrement_rel | _InterlockedDecrement_rel panjang (volatil panjang *) |
_InterlockedExchange | __cdecl _InterlockedExchange panjang (volatil panjang * _Target, panjang) |
_InterlockedExchange_acq | _InterlockedExchange_acq panjang (volatil panjang * _Target, panjang) |
_InterlockedExchange_nf | _InterlockedExchange_nf panjang (volatil panjang * _Target, panjang) |
_InterlockedExchange_rel | _InterlockedExchange_rel panjang (volatil panjang * _Target, panjang) |
_InterlockedExchange16 | _InterlockedExchange16 pendek (volatil pendek * _Target, pendek) |
_InterlockedExchange16_acq | _InterlockedExchange16_acq pendek (volatil pendek * _Target, pendek) |
_InterlockedExchange16_nf | _InterlockedExchange16_nf pendek (volatil pendek * _Target, pendek) |
_InterlockedExchange16_rel | _InterlockedExchange16_rel pendek (volatil pendek * _Target, pendek) |
_InterlockedExchange64 | __int64 _InterlockedExchange64(__int64 volatil * _Target, __int64) |
_InterlockedExchange64_acq | __int64 _InterlockedExchange64_acq(__int64 volatil * _Target, __int64) |
_InterlockedExchange64_nf | __int64 _InterlockedExchange64_nf(__int64 volatil * _Target, __int64) |
_InterlockedExchange64_rel | __int64 _InterlockedExchange64_rel(__int64 volatil * _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 | __cdecl _InterlockedExchangeAdd panjang (volatil panjang *, panjang) |
_InterlockedExchangeAdd16 | _InterlockedExchangeAdd16 pendek (volatil pendek *, pendek) |
_InterlockedExchangeAdd16_acq | _InterlockedExchangeAdd16_acq pendek (volatil pendek *, pendek) |
_InterlockedExchangeAdd16_nf | _InterlockedExchangeAdd16_nf pendek (volatil pendek *, pendek) |
_InterlockedExchangeAdd16_rel | _InterlockedExchangeAdd16_rel pendek (volatil pendek *, pendek) |
_InterlockedExchangeAdd64 | __int64 _InterlockedExchangeAdd64(__int64 volatil *, __int64) |
_InterlockedExchangeAdd64_acq | __int64 _InterlockedExchangeAdd64_acq(__int64 volatil *, __int64) |
_InterlockedExchangeAdd64_nf | __int64 _InterlockedExchangeAdd64_nf(__int64 volatil *, __int64) |
_InterlockedExchangeAdd64_rel | __int64 _InterlockedExchangeAdd64_rel(__int64 volatil *, __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 | _InterlockedExchangeAdd_acq panjang (volatil panjang *, panjang) |
_InterlockedExchangeAdd_nf | _InterlockedExchangeAdd_nf panjang (volatil panjang *, panjang) |
_InterlockedExchangeAdd_rel | _InterlockedExchangeAdd_rel panjang (volatil panjang *, panjang) |
_InterlockedExchangePointer | void * _InterlockedExchangePointer(void * volatil * _Target, batal *) |
_InterlockedExchangePointer_acq | void * _InterlockedExchangePointer_acq(batal * volatil * _Target, batal *) |
_InterlockedExchangePointer_nf | void * _InterlockedExchangePointer_nf(batal * volatil * _Target, batal *) |
_InterlockedExchangePointer_rel | void * _InterlockedExchangePointer_rel(batal * volatil * _Target, batal *) |
_InterlockedIncrement | __cdecl _InterlockedIncrement panjang (volatil panjang *) |
_InterlockedIncrement16 | _InterlockedIncrement16 pendek (volatil pendek *) |
_InterlockedIncrement16_acq | _InterlockedIncrement16_acq pendek(volatile pendek *) |
_InterlockedIncrement16_nf | _InterlockedIncrement16_nf pendek (volatil pendek *) |
_InterlockedIncrement16_rel | _InterlockedIncrement16_rel pendek (volatil pendek *) |
_InterlockedIncrement64 | __int64 _InterlockedIncrement64(__int64 volatil *) |
_InterlockedIncrement64_acq | __int64 _InterlockedIncrement64_acq(__int64 volatil *) |
_InterlockedIncrement64_nf | __int64 _InterlockedIncrement64_nf(__int64 volatil *) |
_InterlockedIncrement64_rel | __int64 _InterlockedIncrement64_rel(__int64 volatil *) |
_InterlockedIncrement_acq | _InterlockedIncrement_acq panjang (volatil panjang *) |
_InterlockedIncrement_nf | _InterlockedIncrement_nf panjang (volatil panjang *) |
_InterlockedIncrement_rel | _InterlockedIncrement_rel panjang (volatil panjang *) |
_InterlockedOr | _InterlockedOr panjang (volatil panjang *, panjang) |
_InterlockedOr16 | _InterlockedOr16 pendek (volatil pendek *, pendek) |
_InterlockedOr16_acq | _InterlockedOr16_acq pendek (volatil pendek *, pendek) |
_InterlockedOr16_nf | _InterlockedOr16_nf pendek (volatil pendek *, pendek) |
_InterlockedOr16_rel | _InterlockedOr16_rel pendek (volatil pendek *, pendek) |
_InterlockedOr64 | __int64 _InterlockedOr64(__int64 volatil *, __int64) |
_InterlockedOr64_acq | __int64 _InterlockedOr64_acq(__int64 volatil *, __int64) |
_InterlockedOr64_nf | __int64 _InterlockedOr64_nf(__int64 volatil *, __int64) |
_InterlockedOr64_rel | __int64 _InterlockedOr64_rel(__int64 volatil *, __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 | _InterlockedOr_acq panjang (volatil panjang *, panjang) |
_InterlockedOr_nf | _InterlockedOr_nf panjang (volatil panjang *, panjang) |
_InterlockedOr_rel | _InterlockedOr_rel panjang (volatil panjang *, panjang) |
_InterlockedXor | _InterlockedXor panjang (volatil panjang *, panjang) |
_InterlockedXor16 | _InterlockedXor16 pendek (volatil pendek *, pendek) |
_InterlockedXor16_acq | _InterlockedXor16_acq pendek (volatil pendek *, pendek) |
_InterlockedXor16_nf | _InterlockedXor16_nf pendek (volatil pendek *, pendek) |
_InterlockedXor16_rel | _InterlockedXor16_rel pendek (volatil pendek *, pendek) |
_InterlockedXor64 | __int64 _InterlockedXor64(__int64 volatil *, __int64) |
_InterlockedXor64_acq | __int64 _InterlockedXor64_acq(__int64 volatil *, __int64) |
_InterlockedXor64_nf | __int64 _InterlockedXor64_nf(__int64 volatil *, __int64) |
_InterlockedXor64_rel | __int64 _InterlockedXor64_rel(__int64 volatil *, __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 | _InterlockedXor_acq panjang (volatil panjang *, panjang) |
_InterlockedXor_nf | _InterlockedXor_nf panjang (volatil panjang *, panjang) |
_InterlockedXor_rel | _InterlockedXor_rel panjang (volatil panjang *, panjang) |
_interlockedbittest intrinsik
Intrinsik uji bit yang saling di-interlock biasa untuk semua platform. ARM64 menambahkan _acq
varian , _rel
, dan _nf
, yang hanya memodifikasi semantik penghalus operasi, seperti yang dijelaskan dalam akhiran _nf (tanpa pagar) sebelumnya dalam artikel ini.
Nama Fungsi | Prototipe Fungsi |
---|---|
_interlockedbittestandreset | karakter tidak ditandatangani _interlockedbittestandreset(volatil panjang *, panjang) |
_interlockedbittestandreset_acq | karakter yang tidak ditandatangani _interlockedbittestandreset_acq(volatil panjang *, panjang) |
_interlockedbittestandreset_nf | karakter yang tidak ditandatangani _interlockedbittestandreset_nf(volatil panjang *, panjang) |
_interlockedbittestandreset_rel | karakter tidak ditandatangani _interlockedbittestandreset_rel(volatil panjang *, panjang) |
_interlockedbittestandreset64 | _interlockedbittestandreset64 karakter tidak ditandatangani (__int64 volatil *, __int64) |
_interlockedbittestandreset64_acq | _interlockedbittestandreset64_acq karakter yang tidak ditandatangani (__int64 volatil *, __int64) |
_interlockedbittestandreset64_nf | _interlockedbittestandreset64_nf karakter yang tidak ditandatangani (__int64 volatil *, __int64) |
_interlockedbittestandreset64_rel | _interlockedbittestandreset64_rel karakter yang tidak ditandatangani (__int64 volatil *, __int64) |
_interlockedbittestandset | karakter yang tidak ditandatangani _interlockedbittestandset(volatil panjang *, panjang) |
_interlockedbittestandset_acq | _interlockedbittestandset_acq karakter yang tidak ditandatangani (volatil panjang *, panjang) |
_interlockedbittestandset_nf | karakter yang tidak ditandatangani _interlockedbittestandset_nf(volatil panjang *, panjang) |
_interlockedbittestandset_rel | _interlockedbittestandset_rel karakter yang tidak ditandatangani (volatil panjang *, panjang) |
_interlockedbittestandset64 | _interlockedbittestandset64 karakter yang tidak ditandatangani (__int64 volatil *, __int64) |
_interlockedbittestandset64_acq | _interlockedbittestandset64_acq karakter yang tidak ditandatangani (__int64 volatil *, __int64) |
_interlockedbittestandset64_nf | _interlockedbittestandset64_nf karakter yang tidak ditandatangani (__int64 volatil *, __int64) |
_interlockedbittestandset64_rel | _interlockedbittestandset64_rel karakter yang tidak ditandatangani (__int64 volatil *, __int64) |
Lihat juga
Intrinsik pengkompilasi
Intrinsik ARM
Referensi perakitan ARM
Referensi bahasa C++