Bagikan melalui


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.hheader . 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.hheader .

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 _Typetidak 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)

[Kembali ke atas]

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)

[Kembali ke atas]

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, , _reldan _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)

[Kembali ke atas]

_interlockedbittest intrinsik

Intrinsik uji bit yang saling di-interlock biasa untuk semua platform. ARM64 menambahkan _acqvarian , _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)

[Kembali ke atas]

Lihat juga

Intrinsik pengkompilasi
Intrinsik ARM
Referensi perakitan ARM
Referensi bahasa C++