Funkcje wewnętrzne ARM64

Kompilator języka Microsoft C++ (MSVC) udostępnia następujące funkcje wewnętrzne w architekturze ARM64. Aby uzyskać więcej informacji na temat usługi ARM, zobacz sekcje Architektura i narzędzia programistyczne w witrynie internetowej dokumentacji deweloperów usługi ARM.

NEON

Rozszerzenia zestawu instrukcji wektorów NEON dla arm64 zapewniają możliwości wielu danych z jedną instrukcją (SIMD). Przypominają one te w zestawach instrukcji wektorów MMX i SSE, które są wspólne dla procesorów architektury x86 i x64.

Funkcje wewnętrzne NEON są obsługiwane, jak podano w pliku nagłówka arm64_neon.h. Obsługa funkcji wewnętrznej MSVC dla funkcji wewnętrznie NEON przypomina kompilator ARM64, który jest udokumentowany w dokumentacji wewnętrznej ARM NEON w witrynie internetowej centrum informacji usługi ARM.

Lista funkcji wewnętrznych specyficznych dla usługi ARM64

Nazwa funkcji Instrukcja Prototyp funkcji
__Przerwy BRK void __break(int)
__addx18byte void __addx18byte (niepodpisane długie, niepodpisane znaki)
__addx18word void __addx18word (niepodpisane długie, niepodpisane krótkie)
__addx18dword void __addx18dword (niepodpisane długie, niepodpisane długie)
__addx18qword void __addx18qword (niepodpisane długie, niepodpisane __int64)
__cas8 CASB unsigned __int8 __cas8(unsigned __int8 volatile* _Target, niepodpisane __int8 _Comp, niepodpisane __int8 _Value)
__cas16 GOTÓWKI unsigned __int16 __cas16(unsigned __int16 volatile* _Target, niepodpisane __int16 _Comp, niepodpisane __int16 _Value)
__cas32 CAS unsigned __int32 __cas32(unsigned __int32 volatile* _Target, niepodpisane __int32 _Comp, niepodpisane __int32 _Value)
__cas64 CAS unsigned __int64 __cas64(unsigned __int64 volatile* _Target, niepodpisane __int64 _Comp, niepodpisane __int64 _Value)
__casa8 CASAB unsigned __int8 __casa8(unsigned __int8 volatile* _Target, niepodpisane __int8 _Comp, niepodpisane __int8 _Value)
__casa16 CASAH unsigned __int16 __casa16(unsigned __int16 volatile* _Target, niepodpisane __int16 _Comp, niepodpisane __int16 _Value)
__casa32 CASA unsigned __int32 __casa32(unsigned __int32 volatile* _Target, niepodpisane __int32 _Comp, niepodpisane __int32 _Value)
__casa64 CASA unsigned __int64 __casa64(unsigned __int64 volatile* _Target, niepodpisane __int64 _Comp, niepodpisane __int64 _Value)
__casl8 CASLB unsigned __int8 __casl8(unsigned __int8 volatile* _Target, niepodpisane __int8 _Comp, niepodpisane __int8 _Value)
__casl16 CASLH unsigned __int16 __casl16(unsigned __int16 volatile* _Target, niepodpisane __int16 _Comp, niepodpisane __int16 _Value)
__casl32 CASL unsigned __int32 __casl32(unsigned __int32 volatile* _Target, niepodpisane __int32 _Comp, niepodpisane __int32 _Value)
__casl64 CASL niepodpisane __int64 __casl64 (niepodpisane __int64 volatile* _Target, niepodpisane __int64 _Comp, niepodpisane __int64 _Value)
__casal8 CASALB unsigned __int8 __casal8(unsigned __int8 volatile* _Target, niepodpisane __int8 _Comp, niepodpisane __int8 _Value)
__casal16 CASALH unsigned __int16 __casal16(unsigned __int16 volatile* _Target, niepodpisane __int16 _Comp, niepodpisane __int16 _Value)
__casal32 CASAL unsigned __int32 __casal32(unsigned __int32 volatile* _Target, niepodpisane __int32 _Comp, niepodpisane __int32 _Value)
__casal64 CASAL unsigned __int64 __casal64(unsigned __int64 volatile* _Target, niepodpisane __int64 _Comp, niepodpisane __int64 _Value)
__crc32b CRC32B unsigned __int32 __crc32b (bez znaku __int32, bez znaku __int32)
__crc32h CRC32H niepodpisane __int32 __crc32h (niepodpisane __int32, niepodpisane __int32)
__crc32w CRC32W niepodpisane __int32 __crc32w (niepodpisane __int32, bez znaku __int32)
__crc32d CRC32X niepodpisane __int32 __crc32d (niepodpisane __int32, bez znaku __int64)
__crc32cb CRC32CB niepodpisane __int32 __crc32cb (niepodpisane __int32, bez znaku __int32)
__crc32ch CRC32CH niepodpisane __int32 __crc32ch (niepodpisane __int32, bez znaku __int32)
__crc32cw CRC32CW niepodpisane __int32 __crc32cw (niepodpisane __int32, niepodpisane __int32)
__crc32cd CRC32CX niepodpisane __int32 __crc32cd (niepodpisane __int32, niepodpisane __int64)
__Dmb DMB void __dmb(bez znaku int _Type)

Wstawia operację bariery pamięci do strumienia instrukcji. Parametr _Type określa rodzaj ograniczenia wymuszanego przez barierę.

Aby uzyskać więcej informacji na temat rodzajów ograniczeń, które można wymusić, zobacz Ograniczenia barier pamięci.
__Dsb DSB void __dsb(bez znaku int _Type)

Wstawia operację bariery pamięci do strumienia instrukcji. Parametr _Type określa rodzaj ograniczenia wymuszanego przez barierę.

Aby uzyskać więcej informacji na temat rodzajów ograniczeń, które można wymusić, zobacz Ograniczenia barier pamięci.
__Isb ISB void __isb(niepodpisane _Type)

Wstawia operację bariery pamięci do strumienia instrukcji. Parametr _Type określa rodzaj ograniczenia wymuszanego przez barierę.

Aby uzyskać więcej informacji na temat rodzajów ograniczeń, które można wymusić, zobacz Ograniczenia barier pamięci.
__getReg niepodpisane __int64 __getReg(int)
__getRegFp double __getRegFp(int)
__getCallerReg niepodpisane __int64 __getCallerReg(int)
__getCallerRegFp double __getCallerRegFp(int)
__Hvc HVC niepodpisane __hvc (niepodpisane int, ...)
__Hlt HLT int __hlt(bez znaku int, ...)
__incx18byte void __incx18byte (bez znaku)
__incx18word void __incx18word (bez znaku)
__incx18dword void __incx18dword (bez znaku)
__incx18qword void __incx18qword (bez znaku)
__iso_volatile_load16 __int16 __iso_volatile_load16(const volatile __int16 *)

Aby uzyskać więcej informacji, zobacz funkcje wewnętrzne __iso_volatile_load/store.
__iso_volatile_load32 __int32 __iso_volatile_load32(const volatile __int32 *)

Aby uzyskać więcej informacji, zobacz funkcje wewnętrzne __iso_volatile_load/store.
__iso_volatile_load64 __int64 __iso_volatile_load64(const volatile __int64 *)

Aby uzyskać więcej informacji, zobacz funkcje wewnętrzne __iso_volatile_load/store.
__iso_volatile_load8 __int8 __iso_volatile_load8(const volatile __int8 *)

Aby uzyskać więcej informacji, zobacz funkcje wewnętrzne __iso_volatile_load/store.
__iso_volatile_store16 void __iso_volatile_store16(volatile __int16 *, __int16)

Aby uzyskać więcej informacji, zobacz funkcje wewnętrzne __iso_volatile_load/store.
__iso_volatile_store32 void __iso_volatile_store32(volatile __int32 *, __int32)

Aby uzyskać więcej informacji, zobacz funkcje wewnętrzne __iso_volatile_load/store.
__iso_volatile_store64 void __iso_volatile_store64(volatile __int64 *, __int64)

Aby uzyskać więcej informacji, zobacz funkcje wewnętrzne __iso_volatile_load/store.
__iso_volatile_store8 void __iso_volatile_store8(volatile __int8 *, __int8)

Aby uzyskać więcej informacji, zobacz funkcje wewnętrzne __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 __int64 __ldapr64 bez znaku (niepodpisane __int64 volatile* _Target)
__mulh __int64 __mulh(__int64, __int64)
__Prefetch PrFM void __cdecl __prefetch(const void *)

PRFM Zawiera wskazówkę dotyczącą pamięci z operacją PLDL1KEEP pobierania wstępnego do systemu, do którego może wkrótce uzyskać dostęp do pamięci lub w pobliżu określonego adresu. Niektóre systemy mogą wybrać optymalizację dla tego wzorca dostępu do pamięci w celu zwiększenia wydajności środowiska uruchomieniowego. Jednak z punktu widzenia języka C++ funkcja nie ma zauważalnego efektu i może w ogóle nic nie robić.
__prefetch2 PrFM void __cdecl __prefetch(const void *, uint8_t prfop)

PRFM Dostarcza wskazówkę dotyczącą pamięci z podaną operacją pobierania wstępnego do systemu, do którego może wkrótce uzyskać dostęp do pamięci lub w pobliżu określonego adresu. Niektóre systemy mogą wybrać optymalizację dla tego wzorca dostępu do pamięci w celu zwiększenia wydajności środowiska uruchomieniowego. Jednak z punktu widzenia języka C++ funkcja nie ma zauważalnego efektu i może w ogóle nic nie robić.
__readx18byte __readx18byte bez znaku (bez znaku)
__readx18word niepodpisane krótkie __readx18word (bez znaku)
__readx18dword niepodpisane długie __readx18dword (bez znaku)
__readx18qword bez znaku __int64 __readx18qword (bez znaku)
__Setreg void __setReg(int, niepodpisane __int64)
__setRegFp void __setRegFp(int, double)
__setCallerReg void __setCallerReg(int, niepodpisane __int64)
__setCallerRegFp void __setCallerRegFp(int, double)
__Sev SEV void __sev(void)
__Static_assert void __static_assert(int, const char *)
__stlr8 STLRB void __stlr8(niepodpisane __int8 volatile* _Target, niepodpisane __int8 _Value)
__stlr16 STLRH void __stlr16(niepodpisane __int16 volatile* _Target, niepodpisane __int16 _Value)
__stlr32 STLR void __stlr32(niepodpisane __int32 volatile* _Target, niepodpisane __int32 _Value)
__stlr64 STLR void __stlr64(niepodpisane __int64 volatile* _Target, niepodpisane __int64 _Value)
__swp8 SWPB unsigned __int8 __swp8(unsigned __int8 volatile* _Target, bez znaku __int8 _Value)
__swp16 SWPH __int16 __swp16 bez znaku (niepodpisane __int16 volatile* _Target, niepodpisane __int16 _Value)
__swp32 SWP __int32 __swp32 bez znaku (niepodpisane __int32 volatile* _Target, niepodpisane __int32 _Value)
__swp64 SWP niepodpisane __int64 __swp64 (niepodpisane __int64 volatile* _Target, niepodpisane __int64 _Value)
__swpa8 SWPAB unsigned __int8 __swpa8(unsigned __int8 volatile* _Target, niepodpisane __int8 _Value)
__swpa16 SWPAH unsigned __int16 __swpa16(unsigned __int16 volatile* _Target, bez znaku __int16 _Value)
__swpa32 SWPA niepodpisane __int32 __swpa32 (niepodpisane __int32 volatile* _Target, niepodpisane __int32 _Value)
__swpa64 SWPA unsigned __int64 __swpa64(unsigned __int64 volatile* _Target, niepodpisane __int64 _Value)
__swpl8 SWPLB unsigned __int8 __swpl8(unsigned __int8 volatile* _Target, bez znaku __int8 _Value)
__swpl16 SWPLH niepodpisane __int16 __swpl16 (niepodpisane __int16 volatile* _Target, niepodpisane __int16 _Value)
__swpl32 SWPL unsigned __int32 __swpl32(unsigned __int32 volatile* _Target, niepodpisane __int32 _Value)
__swpl64 SWPL niepodpisane __int64 __swpl64 (niepodpisane __int64 volatile* _Target, niepodpisane __int64 _Value)
__swpal8 SWPALB unsigned __int8 __swpal8(unsigned __int8 volatile* _Target, niepodpisane __int8 _Value)
__swpal16 SWPALH unsigned __int16 __swpal16(unsigned __int16 volatile* _Target, niepodpisane __int16 _Value)
__swpal32 SWPAL niepodpisane __int32 __swpal32 (niepodpisane __int32 volatile* _Target, niepodpisane __int32 _Value)
__swpal64 SWPAL unsigned __int64 __swpal64(unsigned __int64 volatile* _Target, niepodpisane __int64 _Value)
__Sys SYS niepodpisane __sys(int, __int64)
__Svc SVC niepodpisane __svc (niepodpisane int, ...)
__Wfe WFE void __wfe(void)
__Wfi WFI void __wfi(void)
__writex18byte void __writex18byte (bez znaku, bez znaku)
__writex18word void __writex18word (niepodpisane długie, niepodpisane krótkie)
__writex18dword void __writex18dword (niepodpisane długie, niepodpisane długie)
__writex18qword void __writex18qword (niepodpisane długie, niepodpisane __int64)
__umulh niepodpisane __int64 __umulh (bez znaku __int64, bez znaku __int64)
_CopyDoubleFromInt64 double _CopyDoubleFromInt64(__int64)
_CopyFloatFromInt32 float _CopyFloatFromInt32(__int32)
_CopyInt32FromFloat __int32 _CopyInt32FromFloat(float)
_CopyInt64FromDouble __int64 _CopyInt64FromDouble(podwójne)
_CountLeadingOnes niepodpisane _CountLeadingOnes (bez znaku)
_CountLeadingOnes64 niepodpisane _CountLeadingOnes64 (bez znaku __int64)
_CountLeadingSigns niepodpisane _CountLeadingSigns (długie)
_CountLeadingSigns64 niepodpisane _CountLeadingSigns64 (__int64)
_CountLeadingZeros niepodpisane _CountLeadingZeros (bez znaku)
_CountLeadingZeros64 niepodpisane _CountLeadingZeros64 (bez znaku __int64)
_CountTrailingZeros niepodpisane _CountTrailingZeros (bez znaku)
_CountTrailingZeros64 niepodpisane _CountTrailingZeros64 (bez znaku __int64)
_CountOneBits niepodpisane _CountOneBits (bez znaku)
_CountOneBits64 niepodpisane _CountOneBits64 (bez znaku __int64)
_ReadStatusReg PANI __int64 _ReadStatusReg(int)
_WriteStatusReg MSR void _WriteStatusReg(int, __int64)

[Wróć do góry]

Ograniczenia bariery pamięci

Funkcje __dmb wewnętrzne (bariera pamięci danych), __dsb (bariera synchronizacji danych) i __isb (bariera synchronizacji instrukcji) używają następujących wstępnie zdefiniowanych wartości, aby określić ograniczenie bariery pamięci pod względem domeny udostępniania i rodzaju dostępu, którego dotyczy operacja.

Wartość ograniczenia opis
_ARM64_BARRIER_SY Pełny system, odczyty i zapisy.
_ARM64_BARRIER_ST Pełny system, tylko zapis.
_ARM64_BARRIER_LD Pełny system, tylko do odczytu.
_ARM64_BARRIER_ISH Wewnętrzny z możliwością udostępniania, odczyty i zapisy.
_ARM64_BARRIER_ISHST Wewnętrzny z możliwością udostępniania, tylko zapisy.
_ARM64_BARRIER_ISHLD Wewnętrzny, dostępny tylko do odczytu.
_ARM64_BARRIER_NSH Nieudostępniane, odczyty i zapisy.
_ARM64_BARRIER_NSHST Tylko zapisy niezwiązane z udostępnianiem.
_ARM64_BARRIER_NSHLD Bez możliwości udostępniania, tylko do odczytu.
_ARM64_BARRIER_OSH Zewnętrzna możliwość udostępniania, odczyty i zapisy.
_ARM64_BARRIER_OSHST Zewnętrzna możliwość udostępniania, tylko zapisy.
_ARM64_BARRIER_OSHLD Zewnętrzna możliwość udostępniania, tylko do odczytu.

W przypadku funkcji __isb wewnętrznej jedynym ograniczeniem, które jest obecnie prawidłowe, jest _ARM64_BARRIER_SY; wszystkie inne wartości są zarezerwowane przez architekturę.

funkcje wewnętrzne __iso_volatile_load/magazynu

Te funkcje wewnętrzne jawnie wykonują obciążenia i magazyny, które nie podlegają optymalizacji kompilatora.

__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);

Parametry

Lokalizacja
Adres lokalizacji pamięci do odczytu lub zapisu.

Wartość
Wartość do zapisu w określonej lokalizacji pamięci (przechowuj tylko funkcje wewnętrzne).

Wartość zwracana (tylko ładowanie funkcji wewnętrznych)

Wartość lokalizacji pamięci określonej przez lokalizację.

Uwagi

Funkcje i __iso_volatile_store8/16/32/64 umożliwiają __iso_volatile_load8/16/32/64 jawne wykonywanie dostępu do pamięci, które nie podlegają optymalizacji kompilatora. Kompilator nie może usunąć, zsynchronizować ani zmienić względnej kolejności tych operacji. Nie generuje jednak niejawnych barier pamięci sprzętowych. W związku z tym sprzęt może nadal zmienić kolejność obserwowalnych dostępu do pamięci w wielu wątkach. Dokładniej mówiąc, te funkcje wewnętrzne są równoważne następującym wyrażeniom kompilowanym w pliku /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;

Zwróć uwagę, że funkcje wewnętrzne przyjmują nietrwałe wskaźniki, aby uwzględnić zmienne lotne. Nie ma jednak wymagania ani zalecenia dotyczącego używania wskaźników lotnych jako argumentów. Semantyka tych operacji jest dokładnie taka sama, jeśli jest używany zwykły, nietrwały typ.

Aby uzyskać więcej informacji na temat argumentu wiersza polecenia /volatile:iso, zobacz /volatile (interpretacja słowa kluczowego volatile).

Obsługa architektury ARM64 dla funkcji wewnętrznych z innych architektur

W poniższej tabeli wymieniono funkcje wewnętrzne z innych architektur obsługiwanych na platformach ARM64. W przypadku, gdy zachowanie wewnętrzne w usłudze ARM64 różni się od jego zachowania w innych architekturach sprzętu, dodatkowe szczegóły są zanotowane.

Nazwa funkcji Prototyp funkcji
__assume void __assume(int)
__code_seg void __code_seg(const char *)
__debugbreak void __cdecl __debugbreak(void)
__fastfail __declspec(noreturn) void __fastfail(niepodpisane int)
__nop void __nop(void)
__Wydajność void __yield(void) Uwaga: na platformach ARM64 ta funkcja generuje instrukcję YIELD. Ta instrukcja wskazuje, że wątek wykonuje zadanie, które może zostać tymczasowo zawieszone przed wykonaniem — na przykład spinlock — bez negatywnego wpływu na program. Umożliwia procesorowi cpu wykonywanie innych zadań podczas cykli wykonywania, które w przeciwnym razie zostaną zmarnowane.
_AddressOfReturnAddress void * _AddressOfReturnAddress(void)
_BitScanForward _BitScanForward bez znaku (bez znaku * _Index, niepodpisane długie _Mask)
_BitScanForward64 _BitScanForward64 bez znaku (bez znaku * _Index, niepodpisane __int64 _Mask)
_BitScanReverse bez znaku _BitScanReverse (niepodpisane długie * _Index, niepodpisane długie _Mask)
_BitScanReverse64 bez znaku _BitScanReverse64 (niepodpisane długie * _Index, bez znaku __int64 _Mask)
_bittest bez znaku _bittest (długi znak *, długi)
_bittest64 bez znaku _bittest64 (__int64 const *, __int64)
_bittestandcomplement bez znaku _bittestandcomplement (długie *, długie)
_bittestandcomplement64 _bittestandcomplement64 bez znaku (__int64 *, __int64)
_bittestandreset bez znaku _bittestandreset (długie *, długie)
_bittestandreset64 _bittestandreset64 bez znaku (__int64 *, __int64)
_bittestandset bez znaku _bittestandset (długie *, długie)
_bittestandset64 _bittestandset64 bez znaku (__int64 *, __int64)
_byteswap_uint64 niepodpisane __int64 __cdecl _byteswap_uint64 (niepodpisane __int64)
_byteswap_ulong niepodpisane długie __cdecl _byteswap_ulong (bez znaku)
_byteswap_ushort niepodpisane krótkie __cdecl _byteswap_ushort (niepodpisane krótkie)
_disable void __cdecl _disable(void) Uwaga: na platformach ARM64 ta funkcja generuje instrukcję MSR DAIFCLR,#2; jest dostępna tylko jako funkcja wewnętrzna.
_enable void __cdecl _enable(void) Uwaga: na platformach ARM64 ta funkcja generuje instrukcję MSR DAIFSET,#2; jest dostępna tylko jako funkcja wewnętrzna.
_lrotl niepodpisane długie __cdecl _lrotl (bez znaku, int)
_lrotr niepodpisane długie __cdecl _lrotr (niepodpisane długie, int)
_ReadBarrier void _ReadBarrier(void)
_ReadWriteBarrier void _ReadWriteBarrier(void)
_ReturnAddress void * _ReturnAddress(void)
_rotl niepodpisane __cdecl _rotl (bez znaku int _Value, int _Shift)
_rotl16 _rotl16 niepodpisane (niepodpisane krótkie _Value, niepodpisane znaki _Shift)
_rotl64 unsigned __int64 __cdecl _rotl64 (bez znaku __int64 _Value, int _Shift)
_rotl8 bez znaku _rotl8 (bez znaku _Value char, bez znaku _Shift)
_rotr niepodpisane __cdecl _rotr (niepodpisane _Value, int _Shift)
_rotr16 _rotr16 niepodpisane (niepodpisane krótkie _Value, bez znaku _Shift)
_rotr64 unsigned __int64 __cdecl _rotr64 (bez znaku __int64 _Value, int _Shift)
_rotr8 bez znaku _rotr8 (bez znaku _Value char, bez znaku _Shift)
_setjmpex int __cdecl _setjmpex(jmp_buf)
_WriteBarrier void _WriteBarrier(void)

[Wróć do góry]

Połączone funkcje wewnętrzne

Funkcje wewnętrzne połączone są zestawem funkcji wewnętrznych, które są używane do wykonywania niepodzielnych operacji odczytu-modyfikowania-zapisu. Niektóre z nich są wspólne dla wszystkich platform. Są one wymienione oddzielnie tutaj, ponieważ istnieje wiele z nich. Ponieważ ich definicje są w większości nadmiarowe, łatwiej jest myśleć o nich ogólnie. Ich nazwy mogą służyć do uzyskiwania dokładnych zachowań.

W poniższej tabeli przedstawiono podsumowanie obsługi architektury ARM64 wewnętrznych nienależących do testów bitowych. Każda komórka w tabeli odpowiada nazwie, która jest pochodna, dołączając nazwę operacji w lewej komórce wiersza i nazwę typu w górnej komórce kolumny do _Interlocked. Na przykład komórka na przecięciu Xor wiersza i 8 kolumny odpowiada _InterlockedXor8 i jest w pełni obsługiwana. Większość obsługiwanych funkcji oferuje następujące opcjonalne sufiksy: _acq, _reli _nf. Sufiks _acq wskazuje semantykę "acquire", a _rel sufiks wskazuje semantykę "release". Sufiks _nf lub "brak ogrodzenia" jest unikatowy dla arm i ARM64 i jest omówiony w następnej sekcji.

Operacja 8 16 32 64 128 P
Add Brak Brak Pełny Pełny Brak Brak
And Pełny Pełny Pełny Pełny Brak Brak
Compareexchange Pełny Pełny Pełny Pełny Pełny Pełny
Zmniejszyć Brak Pełny Pełny Pełny Brak Brak
Exchange Pełny Pełny Pełny Pełny Brak Pełny
ExchangeAdd Pełny Pełny Pełny Pełny Brak Brak
Przyrost Brak Pełny Pełny Pełny Brak Brak
Or Pełny Pełny Pełny Pełny Brak Brak
Xor Pełny Pełny Pełny Pełny Brak Brak

Klucz:

  • Pełne: obsługuje zwykłe, _acq, _reli _nf formularze.

  • Brak: nieobsługiwane

sufiks _nf (bez ogrodzenia)

Sufiks _nf lub "brak ogrodzenia" wskazuje, że operacja nie zachowuje się jako żadna bariera pamięci, w przeciwieństwie do innych trzech form (zwykłych, _acqi _rel), które zachowują się jako pewnego rodzaju barierę. Jednym z możliwych zastosowań _nf formularzy jest utrzymywanie licznika statystyk, który jest aktualizowany przez wiele wątków w tym samym czasie, ale którego wartość nie jest używana w przeciwnym razie, gdy wykonuje się wiele wątków.

Lista połączonych wewnętrznych elementów wewnętrznych

Nazwa funkcji Prototyp funkcji
_InterlockedAdd długa _InterlockedAdd (długa _volatile *, długa)
_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 długi _InterlockedAdd_acq(długi lotny *, długi)
_InterlockedAdd_nf długi _InterlockedAdd_nf(długi lotny *, długi)
_InterlockedAdd_rel długi _InterlockedAdd_rel(długi lotny *, długi)
_InterlockedAnd długi _InterlockedAnd(długi lotny *, długi)
_InterlockedAnd16 krótki _InterlockedAnd16(krótki lotny *, krótki)
_InterlockedAnd16_acq krótki _InterlockedAnd16_acq(krótki lotny *, krótki)
_InterlockedAnd16_nf krótki _InterlockedAnd16_nf(krótki lotny *, krótki)
_InterlockedAnd16_rel krótki _InterlockedAnd16_rel(krótki lotny *, krótki)
_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 długi _InterlockedAnd_acq(długi lotny *, długi)
_InterlockedAnd_nf długi _InterlockedAnd_nf(długi lotny *, długi)
_InterlockedAnd_rel długi _InterlockedAnd_rel(długi lotny *, długi)
_InterlockedCompareExchange długi __cdecl _InterlockedCompareExchange(długi lotny *, długi, długi)
_InterlockedCompareExchange_acq długi _InterlockedCompareExchange_acq(długi lotny *, długi, długi)
_InterlockedCompareExchange_nf długi _InterlockedCompareExchange_nf(długi lotny *, długi, długi)
_InterlockedCompareExchange_rel długi _InterlockedCompareExchange_rel(długi lotny *, długi, długi)
_InterlockedCompareExchange16 krótki _InterlockedCompareExchange16(krótki lotny *, krótki, krótki)
_InterlockedCompareExchange16_acq krótki _InterlockedCompareExchange16_acq(krótki lotny *, krótki, krótki)
_InterlockedCompareExchange16_nf krótki _InterlockedCompareExchange16_nf(krótki lotny *, krótki, krótki)
_InterlockedCompareExchange16_rel krótki _InterlockedCompareExchange16_rel(krótki lotny *, krótki, krótki)
_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 _InterlockedCompareExchange128 bez znaku (__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 _InterlockedCompareExchange128_nf bez znaku (__int64 volatile * _Destination, __int64 _ExchangeHigh, __int64 _ExchangeLow, __int64 * _ComparandResult)
_InterlockedCompareExchange128_rel _InterlockedCompareExchange128_rel bez znaku (__int64 volatile * _Destination, __int64 _ExchangeHigh, __int64 _ExchangeLow, __int64 * _ComparandResult)
_InterlockedDecrement długi __cdecl _InterlockedDecrement(długi lotny *)
_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 długi _InterlockedDecrement_acq(długi lotny *)
_InterlockedDecrement_nf długi _InterlockedDecrement_nf(długi lotny *)
_InterlockedDecrement_rel długi _InterlockedDecrement_rel(długi lotny *)
_InterlockedExchange długi __cdecl _InterlockedExchange(długi lotny * _Target, długi)
_InterlockedExchange_acq długie _InterlockedExchange_acq (długie lotne * _Target, długie)
_InterlockedExchange_nf długie _InterlockedExchange_nf(długie lotne * _Target, długie)
_InterlockedExchange_rel długi _InterlockedExchange_rel(długi lotny * _Target, długi)
_InterlockedExchange16 short _InterlockedExchange16(krótki lotny * _Target, krótki)
_InterlockedExchange16_acq short _InterlockedExchange16_acq(krótki lotny * _Target, krótki)
_InterlockedExchange16_nf short _InterlockedExchange16_nf(krótki lotny * _Target, krótki)
_InterlockedExchange16_rel short _InterlockedExchange16_rel(krótki lotny * _Target, krótki)
_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 długi __cdecl _InterlockedExchangeAdd(długi lotny *, długi)
_InterlockedExchangeAdd16 krótki _InterlockedExchangeAdd16(krótki lotny *, krótki)
_InterlockedExchangeAdd16_acq krótki _InterlockedExchangeAdd16_acq(krótki lotny *, krótki)
_InterlockedExchangeAdd16_nf krótki _InterlockedExchangeAdd16_nf(krótki lotny *, krótki)
_InterlockedExchangeAdd16_rel krótki _InterlockedExchangeAdd16_rel(krótki lotny *, krótki)
_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 długi _InterlockedExchangeAdd_acq(długi lotny *, długi)
_InterlockedExchangeAdd_nf długi _InterlockedExchangeAdd_nf(długi lotny *, długi)
_InterlockedExchangeAdd_rel długi _InterlockedExchangeAdd_rel(długi lotny *, długi)
_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 długi __cdecl _InterlockedIncrement(długi lotny *)
_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 długi _InterlockedIncrement_acq(długi lotny *)
_InterlockedIncrement_nf długi _InterlockedIncrement_nf(długi lotny *)
_InterlockedIncrement_rel długi _InterlockedIncrement_rel(długi lotny *)
_InterlockedOr długi _InterlockedOr(długi lotny *, długi)
_InterlockedOr16 krótki _InterlockedOr16(krótki lotny *, krótki)
_InterlockedOr16_acq krótki _InterlockedOr16_acq(krótki lotny *, krótki)
_InterlockedOr16_nf short _InterlockedOr16_nf(krótki lotny *, krótki)
_InterlockedOr16_rel krótki _InterlockedOr16_rel(krótki lotny *, krótki)
_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 długi _InterlockedOr_acq(długi lotny *, długi)
_InterlockedOr_nf długi _InterlockedOr_nf(długi lotny *, długi)
_InterlockedOr_rel długie _InterlockedOr_rel(długie lotne *, długie)
_InterlockedXor długi _InterlockedXor(długi lotny *, długi)
_InterlockedXor16 krótki _InterlockedXor16(krótki lotny *, krótki)
_InterlockedXor16_acq krótki _InterlockedXor16_acq(krótki lotny *, krótki)
_InterlockedXor16_nf krótki _InterlockedXor16_nf(krótki lotny *, krótki)
_InterlockedXor16_rel krótki _InterlockedXor16_rel(krótki lotny *, krótki)
_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 długi _InterlockedXor_acq(długi lotny *, długi)
_InterlockedXor_nf długi _InterlockedXor_nf(długi lotny *, długi)
_InterlockedXor_rel długi _InterlockedXor_rel(długi lotny *, długi)

[Wróć do góry]

funkcje wewnętrzne _interlockedbittest

Funkcje wewnętrzne zwykłego testu bitowego są wspólne dla wszystkich platform. Arm64 dodaje _acq_rel, i _nf warianty, które po prostu modyfikują semantyki bariery operacji, zgodnie z opisem w _nf (bez ogrodzenia) Sufiks wcześniej w tym artykule.

Nazwa funkcji Prototyp funkcji
_interlockedbittestandreset niepodpisane _interlockedbittestandreset znaków (długie lotne *, długie)
_interlockedbittestandreset_acq niepodpisane _interlockedbittestandreset_acq znaków (długie lotne *, długie)
_interlockedbittestandreset_nf niepodpisane _interlockedbittestandreset_nf znaków (długie lotne *, długie)
_interlockedbittestandreset_rel niepodpisane _interlockedbittestandreset_rel znaków (długie lotne *, długie)
_interlockedbittestandreset64 _interlockedbittestandreset64 bez znaku (__int64 volatile *, __int64)
_interlockedbittestandreset64_acq _interlockedbittestandreset64_acq bez znaku (__int64 volatile *, __int64)
_interlockedbittestandreset64_nf _interlockedbittestandreset64_nf bez znaku (__int64 volatile *, __int64)
_interlockedbittestandreset64_rel _interlockedbittestandreset64_rel bez znaku (__int64 volatile *, __int64)
_interlockedbittestandset niepodpisane _interlockedbittestandset znaków (długie lotne *, długie)
_interlockedbittestandset_acq niepodpisane _interlockedbittestandset_acq znaków (długie lotne *, długie)
_interlockedbittestandset_nf niepodpisane _interlockedbittestandset_nf znaków (długie lotne *, długie)
_interlockedbittestandset_rel bez znaku _interlockedbittestandset_rel (długie lotne *, długie)
_interlockedbittestandset64 _interlockedbittestandset64 bez znaku (__int64 volatile *, __int64)
_interlockedbittestandset64_acq _interlockedbittestandset64_acq bez znaku (__int64 volatile *, __int64)
_interlockedbittestandset64_nf _interlockedbittestandset64_nf bez znaku (__int64 volatile *, __int64)
_interlockedbittestandset64_rel _interlockedbittestandset64_rel bez znaku (__int64 volatile *, __int64)

[Wróć do góry]

Zobacz też

Funkcje wewnętrzne kompilatora
Funkcje wewnętrzne usługi ARM
Dokumentacja asemblera ARM
Dokumentacja języka C++