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.h
nagłó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) |
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
, , opcode1
crn
, crm
i 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 coproc
parametrów , opcode1
i 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) |
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
, _rel
i _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
,_rel
i_nf
formularze.Częściowe: obsługuje zwykłe formularze,
_acq
i ._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, _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) |
_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) |
funkcje wewnętrzne _interlockedbittest
Funkcje wewnętrzne zwykłego testu bitowego są wspólne dla wszystkich platform. Usługa ARM dodaje _acq
, _rel
i _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) |
Zobacz też
Funkcje wewnętrzne kompilatora
Funkcje wewnętrzne ARM64
Dokumentacja asemblera ARM
Dokumentacja języka C++