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 arm64_neon.h
nagłówka . 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
Funkcje wewnętrzne specyficzne dla usługi ARM64 są obsługiwane, jak podano w pliku intrin.h
nagłówka .
Nazwa funkcji | Instrukcja | Prototyp funkcji |
---|---|---|
__przerwa | 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ÓWKA | 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 | SYSTEM | 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) |
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) |
__plon | 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) |
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
, _rel
i _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 |
---|---|---|---|---|---|---|
Dodaj | 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
,_rel
i_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, _acq
i _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) |
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) |
Zobacz też
Funkcje wewnętrzne kompilatora
Funkcje wewnętrzne usługi ARM
Dokumentacja asemblera ARM
Dokumentacja języka C++