Udostępnij za pośrednictwem


Funkcje wewnętrzne ARM

Kompilator języka Microsoft C++ (MSVC) udostępnia następujące funkcje wewnętrzne w architekturze usługi ARM. 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 usługi ARM zapewniają możliwości wielu danych z jedną instrukcją (SIMD), które przypominają te w zestawach instrukcji 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 arm_neon.hnagłówka . Obsługa funkcji wewnętrznej MSVC dla funkcji wewnętrznych NEON przypomina kompilator ARM, który jest udokumentowany w dodatku G łańcucha narzędzi kompilatora ARM w wersji 4.1 w witrynie internetowej centrum informacji usługi ARM.

Podstawową różnicą między MSVC a kompilatorem ARM jest to, że MSVC dodaje _ex warianty obciążenia wektorowego vldX i vstX instrukcji przechowywania. Warianty _ex przyjmują dodatkowy parametr określający wyrównanie argumentu wskaźnika, ale w przeciwnym razie są identyczne z ich odpowiednikami_ex .

Lista funkcji wewnętrznych specyficznych dla usługi ARM

Nazwa funkcji Instrukcja Prototyp funkcji
_arm_smlal SMLAL __int64 _arm_smlal(__int64 _RdHiLo, int _Rn, int _Rm)
_arm_umlal UMLAL niepodpisane __int64 _arm_umlal (bez znaku __int64 _RdHiLo, niepodpisane _Rn, niepodpisane _Rm)
_arm_clz CLZ niepodpisane _arm_clz (bez znaku int _Rm)
_arm_qadd QADD int _arm_qadd(int _Rm, int _Rn)
_arm_qdadd QDADD int _arm_qdadd(int _Rm, int _Rn)
_arm_qdsub QDSUB int _arm_qdsub(int _Rm, int _Rn)
_arm_qsub QSUB int _arm_qsub(int _Rm, int _Rn)
_arm_smlabb SMLABB int _arm_smlabb(int _Rn, int _Rm, int _Ra)
_arm_smlabt SMLABT int _arm_smlabt(int _Rn, int _Rm, int _Ra)
_arm_smlatb SMLATB int _arm_smlatb(int _Rn, int _Rm, int _Ra)
_arm_smlatt SMLATT int _arm_smlatt(int _Rn, int _Rm, int _Ra)
_arm_smlalbb SMLALBB __int64 _arm_smlalbb(__int64 _RdHiLo, int _Rn, int _Rm)
_arm_smlalbt SMLALBT __int64 _arm_smlalbt(__int64 _RdHiLo, _Rn int, int _Rm)
_arm_smlaltb SMLALTB __int64 _arm_smlaltb(__int64 _RdHiLo, int _Rn, int _Rm)
_arm_smlaltt SMLALTT __int64 _arm_smlaltt(__int64 _RdHiLo, int _Rn, int _Rm)
_arm_smlawb SMLAWB int _arm_smlawb(int _Rn, int _Rm, int _Ra)
_arm_smlawt SMLAWT int _arm_smlawt(int _Rn, int _Rm, int _Ra)
_arm_smulbb SMULBB int _arm_smulbb(int _Rn, int _Rm)
_arm_smulbt SMULBT int _arm_smulbt(int _Rn, int _Rm)
_arm_smultb SMULTB int _arm_smultb(int _Rn, int _Rm)
_arm_smultt SMULTT int _arm_smultt(int _Rn, int _Rm)
_arm_smulwb SMULWB int _arm_smulwb(int _Rn, int _Rm)
_arm_smulwt SMULWT int _arm_smulwt(int _Rn, int _Rm)
_arm_sadd16 SADD16 int _arm_sadd16(int _Rn, int _Rm)
_arm_sadd8 SADD8 int _arm_sadd8(int _Rn, int _Rm)
_arm_sasx Sygnatura dostępu współdzielonego int _arm_sasx(int _Rn, int _Rm)
_arm_ssax SSAX int _arm_ssax(int _Rn, int _Rm)
_arm_ssub16 SSUB16 int _arm_ssub16(int _Rn, int _Rm)
_arm_ssub8 SSUB8 int _arm_ssub8(int _Rn, int _Rm)
_arm_shadd16 SHADD16 int _arm_shadd16(int _Rn, int _Rm)
_arm_shadd8 SHADD8 int _arm_shadd8(int _Rn, int _Rm)
_arm_shasx SHASX int _arm_shasx(int _Rn, int _Rm)
_arm_shsax SHSAX int _arm_shsax(int _Rn, int _Rm)
_arm_shsub16 SHSUB16 int _arm_shsub16(int _Rn, int _Rm)
_arm_shsub8 SHSUB8 int _arm_shsub8(int _Rn, int _Rm)
_arm_qadd16 QADD16 int _arm_qadd16(int _Rn, int _Rm)
_arm_qadd8 QADD8 int _arm_qadd8(int _Rn, int _Rm)
_arm_qasx QASX int _arm_qasx(int _Rn, int _Rm)
_arm_qsax QSAX int _arm_qsax(int _Rn, int _Rm)
_arm_qsub16 QSUB16 int _arm_qsub16(int _Rn, int _Rm)
_arm_qsub8 QSUB8 int _arm_qsub8(int _Rn, int _Rm)
_arm_uadd16 UADD16 unsigned int _arm_uadd16(unsigned int _Rn, unsigned int _Rm)
_arm_uadd8 UADD8 unsigned int _arm_uadd8(unsigned int _Rn, unsigned int _Rm)
_arm_uasx UASX niepodpisane _arm_uasx (bez znaku int _Rn, niepodpisane _Rm)
_arm_usax USAX unsigned int _arm_usax(unsigned int int _Rn, unsigned int _Rm)
_arm_usub16 USUB16 unsigned int _arm_usub16 (bez znaku int _Rn, niepodpisane _Rm)
_arm_usub8 USUB8 unsigned int _arm_usub8(unsigned int _Rn, unsigned int _Rm)
_arm_uhadd16 UHADD16 unsigned int _arm_uhadd16(unsigned int _Rn, unsigned int _Rm)
_arm_uhadd8 UHADD8 niepodpisane _arm_uhadd8 (bez znaku int _Rn, niepodpisane _Rm)
_arm_uhasx UHASX niepodpisane _arm_uhasx (bez znaku int _Rn, niepodpisane _Rm)
_arm_uhsax UHSAX niepodpisane _arm_uhsax (bez znaku int _Rn, niepodpisane _Rm)
_arm_uhsub16 UHSUB16 unsigned int _arm_uhsub16(unsigned int int _Rn, unsigned int _Rm)
_arm_uhsub8 UHSUB8 niepodpisane _arm_uhsub8 (bez znaku int _Rn, niepodpisane _Rm)
_arm_uqadd16 UQADD16 unsigned int _arm_uqadd16(unsigned int int _Rn, unsigned int _Rm)
_arm_uqadd8 UQADD8 unsigned int _arm_uqadd8(unsigned int _Rn, unsigned int _Rm)
_arm_uqasx UQASX unsigned int _arm_uqasx(unsigned int int _Rn, unsigned int _Rm)
_arm_uqsax UQSAX unsigned int _arm_uqsax(unsigned int _Rn, unsigned int _Rm)
_arm_uqsub16 UQSUB16 unsigned int _arm_uqsub16(unsigned int _Rn, unsigned int _Rm)
_arm_uqsub8 UQSUB8 unsigned int _arm_uqsub8(unsigned int _Rn, unsigned int _Rm)
_arm_sxtab SXTAB int _arm_sxtab(int _Rn, int _Rm, unsigned int _Rotation)
_arm_sxtab16 SXTAB16 int _arm_sxtab16(int _Rn, int _Rm, unsigned int _Rotation)
_arm_sxtah SXTAH int _arm_sxtah(int _Rn, int _Rm, unsigned int _Rotation)
_arm_uxtab UXTAB unsigned int _arm_uxtab(unsigned int _Rn, unsigned int _Rm, unsigned int _Rotation)
_arm_uxtab16 UXTAB16 unsigned int _arm_uxta16b(unsigned int _Rn, unsigned int _Rm, unsigned int _Rotation)
_arm_uxtah UXTAH unsigned int _arm_uxtah(unsigned int _Rn, unsigned int _Rm, unsigned int _Rotation)
_arm_sxtb SXTB int _arm_sxtb(int _Rn, niepodpisane _Rotation)
_arm_sxtb16 SXTB16 int _arm_sxtb16(int _Rn, bez znaku int _Rotation)
_arm_sxth SXTH int _arm_sxth(int _Rn, bez znaku int _Rotation)
_arm_uxtb UXTB unsigned int _arm_uxtb(unsigned int _Rn, unsigned int _Rotation)
_arm_uxtb16 UXTB16 unsigned int _arm_uxtb16(unsigned int int _Rn, unsigned int _Rotation)
_arm_uxth UXTH unsigned int _arm_uxth(unsigned int int _Rn, unsigned int _Rotation)
_arm_pkhbt PKHBT int _arm_pkhbt(int _Rn, int _Rm, unsigned int _Lsl_imm)
_arm_pkhtb PKHTB int _arm_pkhtb(int _Rn, int _Rm, unsigned int _Asr_imm)
_arm_usad8 USAD8 niepodpisane _arm_usad8 (bez znaku int _Rn, niepodpisane _Rm)
_arm_usada8 USADA8 niepodpisane _arm_usada8 (bez znaku int _Rn, niepodpisane _Rm, niepodpisane _Ra)
_arm_ssat SSAT int _arm_ssat (niepodpisane _Sat_imm, _int _Rn, _ARMINTR_SHIFT_T _Shift_type, niepodpisane _Shift_imm)
_arm_usat USAT int _arm_usat(bez znaku int _Sat_imm, _int _Rn, _ARMINTR_SHIFT_T _Shift_type, niepodpisane _Shift_imm)
_arm_ssat16 SSAT16 int _arm_ssat16 (niepodpisane _Sat_imm, _int _Rn)
_arm_usat16 USAT16 int _arm_usat16 (niepodpisane _Sat_imm, _int _Rn)
_arm_rev REV niepodpisane _arm_rev (bez znaku int _Rm)
_arm_rev16 REV16 niepodpisane _arm_rev16 (bez znaku int _Rm)
_arm_revsh REVSH niepodpisane _arm_revsh (bez znaku int _Rm)
_arm_smlad SMLAD int _arm_smlad(int _Rn, int _Rm, int _Ra)
_arm_smladx SMLADX int _arm_smladx(int _Rn, int _Rm, int _Ra)
_arm_smlsd SMLSD int _arm_smlsd(int _Rn, int _Rm, int _Ra)
_arm_smlsdx SMLSDX int _arm_smlsdx(int _Rn, int _Rm, int _Ra)
_arm_smmla SMMLA int _arm_smmla(int _Rn, int _Rm, int _Ra)
_arm_smmlar SMMLAR int _arm_smmlar(int _Rn, int _Rm, int _Ra)
_arm_smmls SMMLS int _arm_smmls(int _Rn, int _Rm, int _Ra)
_arm_smmlsr SMMLSR int _arm_smmlsr(int _Rn, int _Rm, int _Ra)
_arm_smmul SMMUL int _arm_smmul(int _Rn, int _Rm)
_arm_smmulr SMMULR int _arm_smmulr(int _Rn, int _Rm)
_arm_smlald SMLALD __int64 _arm_smlald(__int64 _RdHiLo, int _Rn, int _Rm)
_arm_smlaldx SMLALDX __int64 _arm_smlaldx(__int64 _RdHiLo, int _Rn, int _Rm)
_arm_smlsld SMLSLD __int64 _arm_smlsld(__int64 _RdHiLo, int _Rn, int _Rm)
_arm_smlsldx SMLSLDX __int64 _arm_smlsldx(__int64 _RdHiLo, int _Rn, int _Rm)
_arm_smuad SMUAD int _arm_smuad(int _Rn, int _Rm)
_arm_smuadx SMUADX int _arm_muadxs(int _Rn, int _Rm)
_arm_smusd SMUSD int _arm_smusd(int _Rn, int _Rm)
_arm_smusdx SMUSDX int _arm_smusdx(int _Rn, int _Rm)
_arm_smull SMULL __int64 _arm_smull(int _Rn, int _Rm)
_arm_umull UMULL unsigned __int64 _arm_umull(unsigned int _Rn, unsigned int _Rm)
_arm_umaal UMAAL unsigned __int64 _arm_umaal(unsigned int _RdLo, unsigned int _RdHi, unsigned int _Rn, unsigned int _Rm)
_arm_bfc BFC unsigned int _arm_bfc(unsigned int _Rd, unsigned int _Lsb, unsigned int _Width)
_arm_bfi BFI unsigned int _arm_bfi(unsigned int _Rd, unsigned int _Rn, unsigned int _Lsb, unsigned int _Width)
_arm_rbit RBIT niepodpisane _arm_rbit (bez znaku int _Rm)
_arm_sbfx SBFX int _arm_sbfx(int _Rn, bez znaku int _Lsb, niepodpisane _Width)
_arm_ubfx UBFX unsigned int _arm_ubfx(unsigned int _Rn, unsigned int _Lsb, unsigned int _Width)
_arm_sdiv SDIV int _arm_sdiv(int _Rn, int _Rm)
_arm_udiv UDIV niepodpisane _arm_udiv (bez znaku int _Rn, niepodpisane _Rm)
__Cps CPS void __cps(bez znaku int _Ops, bez znaku int _Flags, bez znaku _Mode)
__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 bariery 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 bariery 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 bariery pamięci.
__emitować void __emit(bez znaku __int32 opcode)

Wstawia określoną instrukcję do strumienia instrukcji wyjściowych kompilatora.

Wartość opcode musi być wyrażeniem stałym, które jest znane w czasie kompilacji. Rozmiar wyrazu instrukcji to 16 bitów, a najważniejsze 16 bitów opcode są ignorowane.

Kompilator nie próbuje interpretować zawartości opcode obiektu i nie gwarantuje stanu procesora CPU lub pamięci przed wykonaniem wstawionej instrukcji.

Kompilator zakłada, że stany procesora CPU i pamięci pozostają niezmienione po wykonaniu wstawionej instrukcji. W związku z tym instrukcje, które zmieniają stan, mogą mieć szkodliwy wpływ na normalny kod generowany przez kompilator.

Z tego powodu należy emit wstawić tylko instrukcje, które mają wpływ na stan procesora CPU, którego kompilator zwykle nie przetwarza — na przykład stanu współprocesora — lub do implementowania funkcji zadeklarowanych przy użyciu polecenia declspec(naked).
__hvc HVC niepodpisane __hvc (niepodpisane int, ...)
__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.
__ldrexd LDREXD __int64 __ldrexd(const volatile __int64 *)
__prefetch PLD void __cdecl __prefetch(const void *)

PLD Zawiera wskazówkę dotyczącą pamięci dla 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ć.
__rdpmccntr64 unsigned __int64 __rdpmccntr64(void)
__Sev SEV void __sev(void)
__static_assert void __static_assert(int, const char *)
__swi SVC niepodpisane __swi (niepodpisane int, ...)
__pułapka BKPT int __trap(int, ...)
__wfe WFE void __wfe(void)
__wfi WFI void __wfi(void)
_AddSatInt QADD int _AddSatInt(int, int)
_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 bez znaku _CountTrailingZeros (bez znaku)
_CountTrailingZeros64 niepodpisane _CountTrailingZeros64 (niepodpisane __int64)
_CountOneBits niepodpisane _CountOneBits (bez znaku)
_CountOneBits64 niepodpisane _CountOneBits64 (bez znaku __int64)
_DAddSatInt QDADD int _DAddSatInt(int, int)
_DSubSatInt QDSUB int _DSubSatInt(int, int)
_isunordered int _isunordered(double, double)
_isunorderedf int _isunorderedf(float, float)
_MoveFromCoprocessor MRC unsigned int _MoveFromCoprocessor(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)

Odczytuje dane z współprocesora usługi ARM przy użyciu instrukcji transferu danych współprocesora. Aby uzyskać więcej informacji, zobacz _MoveFromCoprocessor, _MoveFromCoprocessor2.
_MoveFromCoprocessor2 MRC2 unsigned int _MoveFromCoprocessor2(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)

Odczytuje dane z współprocesora usługi ARM przy użyciu instrukcji transferu danych współprocesora. Aby uzyskać więcej informacji, zobacz _MoveFromCoprocessor, _MoveFromCoprocessor2.
_MoveFromCoprocessor64 MRRC unsigned __int64 _MoveFromCoprocessor64(unsigned int, unsigned int, unsigned int)

Odczytuje dane z współprocesora usługi ARM przy użyciu instrukcji transferu danych współprocesora. Aby uzyskać więcej informacji, zobacz _MoveFromCoprocessor64.
_MoveToCoprocessor MCR void _MoveToCoprocessor(bez znaku int, niepodpisane int, niepodpisane int, bez znaku int, bez znaku int, bez znaku int)

Odczytuje dane z współprocesora usługi ARM przy użyciu instrukcji transferu danych współprocesora. Aby uzyskać więcej informacji, zobacz _MoveToCoprocessor, _MoveToCoprocessor2.
_MoveToCoprocessor2 MCR2 void _MoveToCoprocessor2(bez znaku int, niepodpisane int, niepodpisane int, bez znaku int, bez znaku int)

Odczytuje dane z współprocesora usługi ARM przy użyciu instrukcji transferu danych współprocesora. Aby uzyskać więcej informacji, zobacz _MoveToCoprocessor, _MoveToCoprocessor2.
_MoveToCoprocessor64 MCRR void _MoveToCoprocessor64(bez znaku __int64, niepodpisane int, bez znaku int, bez znaku int)

Odczytuje dane z współprocesora usługi ARM przy użyciu instrukcji transferu danych współprocesora. Aby uzyskać więcej informacji, zobacz _MoveToCoprocessor64.
_MulHigh długi _MulHigh (długi, długi)
_MulUnsignedHigh niepodpisane długie _MulUnsignedHigh (niepodpisane długie, niepodpisane długie)
_ReadBankedReg PANI int _ReadBankedReg(int _Reg)
_ReadStatusReg PANI int _ReadStatusReg(int)
_SubSatInt QSUB int _SubSatInt(int, int)
_WriteBankedReg MSR void _WriteBankedReg(int _Value, int _Reg)
_WriteStatusReg MSR void _WriteStatusReg(int, int, int)

[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
_ARM_BARRIER_SY Pełny system, odczyty i zapisy.
_ARM_BARRIER_ST Pełny system, tylko zapis.
_ARM_BARRIER_ISH Wewnętrzny z możliwością udostępniania, odczyty i zapisy.
_ARM_BARRIER_ISHST Wewnętrzny z możliwością udostępniania, tylko zapisy.
_ARM_BARRIER_NSH Nieudostępniane, odczyty i zapisy.
_ARM_BARRIER_NSHST Tylko zapisy niezwiązane z udostępnianiem.
_ARM_BARRIER_OSH Zewnętrzna możliwość udostępniania, odczyty i zapisy.
_ARM_BARRIER_OSHST Zewnętrzna możliwość udostępniania, tylko zapisy.

W przypadku funkcji __isb wewnętrznej jedynym ograniczeniem, które jest obecnie prawidłowe, jest _ARM_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 Location.

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, ale nie generuje niejawnych barier pamięci sprzętowej. 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 (volatile Keyword Interpret).

_MoveFromCoprocessor, _MoveFromCoprocessor2

Te funkcje wewnętrzne odczytują dane z procesorów ARM przy użyciu instrukcji transferu danych współprocesora.

int _MoveFromCoprocessor(
      unsigned int coproc,
      unsigned int opcode1,
      unsigned int crn,
      unsigned int crm,
      unsigned int opcode2
);

int _MoveFromCoprocessor2(
      unsigned int coproc,
      unsigned int opcode1,
      unsigned int crn,
      unsigned int crm,
      unsigned int opcode2
);

Parametry

coproc
Liczba współprocesora w zakresie od 0 do 15.

opcode1
Kod operacji specyficzny dla współprocesora w zakresie od 0 do 7

crn
Numer rejestru coprocesora, w zakresie od 0 do 15, który określa pierwszy operand instrukcji.

crm
Numer rejestru coprocesora w zakresie od 0 do 15, który określa dodatkowy operand źródłowy lub docelowy.

opcode2
Dodatkowy kod operacji specyficzny dla współprocesora w zakresie od 0 do 7.

Wartość zwracana

Wartość odczytywana z współprocesora.

Uwagi

Wartości wszystkich pięciu parametrów wewnętrznych muszą być wyrażeniami stałymi, które są znane w czasie kompilacji.

_MoveFromCoprocessor używa instrukcji MRC; _MoveFromCoprocessor2 używa narzędzia MRC2. Parametry odpowiadają polam bitowym zakodowanym bezpośrednio w słowie instrukcji. Interpretacja parametrów jest zależna od współprocesora. Aby uzyskać więcej informacji, zobacz podręcznik dla danego współprocesora.

_MoveFromCoprocessor64

Odczytuje dane z procesorów współprocesorowych arm przy użyciu instrukcji transferu danych współprocesora.

unsigned __int64 _MoveFromCoprocessor64(
      unsigned int coproc,
      unsigned int opcode1,
      unsigned int crm,
);

Parametry

coproc
Liczba współprocesora w zakresie od 0 do 15.

opcode1
Kod operacji specyficzny dla współprocesora w zakresie od 0 do 15.

crm
Numer rejestru coprocesora w zakresie od 0 do 15, który określa dodatkowy operand źródłowy lub docelowy.

Wartość zwracana

Wartość odczytywana z współprocesora.

Uwagi

Wartości wszystkich trzech parametrów wewnętrznych muszą być wyrażeniami stałymi, które są znane w czasie kompilacji.

_MoveFromCoprocessor64 używa instrukcji MRRC. Parametry odpowiadają polam bitowym zakodowanym bezpośrednio w słowie instrukcji. Interpretacja parametrów jest zależna od współprocesora. Aby uzyskać więcej informacji, zobacz podręcznik dla danego współprocesora.

_MoveToCoprocessor, _MoveToCoprocessor2

Te funkcje wewnętrzne zapisują dane do współprocesorów usługi ARM przy użyciu instrukcji transferu danych współprocesora.

void _MoveToCoprocessor(
      unsigned int value,
      unsigned int coproc,
      unsigned int opcode1,
      unsigned int crn,
      unsigned int crm,
      unsigned int opcode2
);

void _MoveToCoprocessor2(
      unsigned int value,
      unsigned int coproc,
      unsigned int opcode1,
      unsigned int crn,
      unsigned int crm,
      unsigned int opcode2
);

Parametry

wartość
Wartość do zapisania do współprocesora.

coproc
Liczba współprocesora w zakresie od 0 do 15.

opcode1
Kod operacji specyficzny dla współprocesora w zakresie od 0 do 7.

crn
Numer rejestru coprocesora, w zakresie od 0 do 15, który określa pierwszy operand instrukcji.

crm
Numer rejestru coprocesora w zakresie od 0 do 15, który określa dodatkowy operand źródłowy lub docelowy.

opcode2
Dodatkowy kod operacji specyficzny dla współprocesora w zakresie od 0 do 7.

Wartość zwracana

Brak.

Uwagi

Wartości parametrów coproc, , opcode1crn, crmi opcode2 wewnętrznych muszą być wyrażeniami stałymi, które są znane w czasie kompilacji.

_MoveToCoprocessor używa instrukcji MCR; _MoveToCoprocessor2 używa mcR2. Parametry odpowiadają polam bitowym zakodowanym bezpośrednio w słowie instrukcji. Interpretacja parametrów jest zależna od współprocesora. Aby uzyskać więcej informacji, zobacz podręcznik dla danego współprocesora.

_MoveToCoprocessor64

Te funkcje wewnętrzne zapisują dane do współprocesorów usługi ARM przy użyciu instrukcji transferu danych współprocesora.

void _MoveFromCoprocessor64(
      unsigned __int64 value,
      unsigned int coproc,
      unsigned int opcode1,
      unsigned int crm,
);

Parametry

coproc
Liczba współprocesora w zakresie od 0 do 15.

opcode1
Kod operacji specyficzny dla współprocesora w zakresie od 0 do 15.

crm
Numer rejestru coprocesora w zakresie od 0 do 15, który określa dodatkowy operand źródłowy lub docelowy.

Wartość zwracana

Brak.

Uwagi

Wartości coprocparametrów , opcode1i crm funkcji wewnętrznej muszą być wyrażeniami stałymi, które są znane w czasie kompilacji.

_MoveFromCoprocessor64 używa instrukcji MCRR. Parametry odpowiadają polam bitowym zakodowanym bezpośrednio w słowie instrukcji. Interpretacja parametrów jest zależna od współprocesora. Aby uzyskać więcej informacji, zobacz podręcznik dla danego współprocesora.

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

W poniższej tabeli wymieniono funkcje wewnętrzne z innych architektur obsługiwanych na platformach ARM. W przypadku, gdy zachowanie wewnętrzne w usłudze ARM różni się od jego zachowania w innych architekturach sprzętowych, 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) Uwaga: Na platformach ARM ta funkcja generuje instrukcję NOP, jeśli jest zaimplementowana w architekturze docelowej; w przeciwnym razie alternatywna instrukcja, która nie zmienia stanu programu lub procesora CPU jest generowana — na przykład MOV r8, r8. Jest ona funkcjonalnie równoważna __nop wewnętrznej dla innych architektur sprzętowych. Ponieważ instrukcja, która nie ma wpływu na stan programu lub procesora CPU, może być ignorowana przez architekturę docelową jako optymalizację, instrukcja nie musi używać cykli procesora CPU. W związku z tym nie należy używać __nop wewnętrznego do manipulowania czasem wykonywania sekwencji kodu, chyba że masz pewność, jak będzie zachowywać się procesor. Zamiast tego można użyć __nop wewnętrznego, aby wyrównać następną instrukcję do określonego adresu granicy 32-bitowej.
__plon void __yield(void) Uwaga: Na platformach ARM ta funkcja generuje instrukcję YIELD, która wskazuje, że wątek wykonuje zadanie, które może zostać tymczasowo zawieszone z wykonania — 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)
_BitScanReverse bez znaku _BitScanReverse (niepodpisane długie * _Index, niepodpisane długie _Mask)
_bittest bez znaku _bittest (długi znak *, długi)
_bittestandcomplement bez znaku _bittestandcomplement (długie *, długie)
_bittestandreset bez znaku _bittestandreset (długie *, długie)
_bittestandset bez znaku _bittestandset (długie *, długie)
_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 ARM ta funkcja generuje instrukcję CPSID; jest dostępna tylko jako funkcja wewnętrzna.
_enable void __cdecl _enable(void) Uwaga: na platformach ARM ta funkcja generuje instrukcję CPSIE; 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 duża ich liczba, ale 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 ARM dla nienależących do bitów funkcji wewnętrznych, które nie są połączone. 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 usługi ARM i jest omówiony w następnej sekcji.

Operacja 8 16 32 64 P
Dodaj Brak Brak Pełny Pełny Brak
And Pełny Pełny Pełny Pełny Brak
CompareExchange Pełny Pełny Pełny Pełny Pełny
Zmniejszyć Brak Pełny Pełny Pełny Brak
Exchange Częściowe Częściowe Częściowe Częściowe Częściowe
ExchangeAdd Pełny Pełny Pełny Pełny Brak
Przyrost Brak Pełny Pełny Pełny Brak
Or Pełny Pełny Pełny Pełny Brak
Xor Pełny Pełny Pełny Pełny Brak

Klucz:

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

  • Częściowe: obsługuje zwykłe formularze, _acqi ._nf

  • 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)
_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 *)
_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)
_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)
_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)
_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)
_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)
_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 *)
_InterlockedExchange_acq długie _InterlockedExchange_acq (długie lotne * _Target, długie)
_InterlockedExchange_nf długie _InterlockedExchange_nf(długie lotne * _Target, długie)
_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. Usługa ARM dodaje _acq, _reli _nf warianty, które po prostu modyfikują semantyka barier 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)
_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)

[Wróć do góry]

Zobacz też

Funkcje wewnętrzne kompilatora
Funkcje wewnętrzne ARM64
Dokumentacja asemblera ARM
Dokumentacja języka C++