Встроенные объекты ARM64
Компилятор Microsoft C++ (MSVC) делает следующие встроенные компоненты доступными в архитектуре ARM64. Дополнительные сведения о ARM см. в разделах "Архитектура и средства разработки программного обеспечения" на веб-сайте документации разработчика ARM.
НЕОН
Расширения наборов инструкций векторов NEON для ARM64 предоставляют возможности с несколькими инструкциями (SIMD). Они похожи на те, которые используются в наборах инструкций MMX и SSE, которые являются общими для процессоров архитектуры x86 и x64.
Встроенные функции NEON поддерживаются, как указано в файле заголовка arm64_neon.h
. Поддержка MSVC для встроенных функций NEON напоминает поддержку компилятора ARM64, который задокументирован в встроенном справочнике ARM NEON на веб-сайте Центра обработки данных ARM.
Список встроенных встроенных элементов ARM64
Встроенные компоненты ARM64 поддерживаются, как указано в файле intrin.h
заголовка.
Имя функции | Инструкция | Прототип функции |
---|---|---|
__ломать | BRK | void __break(int) |
__addx18byte | void __addx18byte(unsigned long, unsigned char) | |
__addx18word | void __addx18word(unsigned long, unsigned short) | |
__addx18dword | void __addx18dword(unsigned long, unsigned long) | |
__addx18qword | void __addx18qword(unsigned long, unsigned __int64) | |
__cas8 | CASB | unsigned __int8 __cas8(unsigned __int8 volatile* _Target, unsigned __int8 _Comp, unsigned __int8 _Value) |
__cas16 | НАЛИЧНЫЕ | unsigned __int16 __cas16(unsigned __int16 volatile* _Target, unsigned __int16 _Comp, unsigned __int16 _Value) |
__cas32 | CAS | unsigned __int32 __cas32(unsigned __int32 volatile* _Target, unsigned __int32 _Comp, unsigned __int32 _Value) |
__cas64 | CAS | unsigned __int64 __cas64(unsigned __int64 volatile* _Target, unsigned __int64 _Comp, unsigned __int64 _Value) |
__casa8 | CASAB | unsigned __int8 __casa8(unsigned __int8 volatile* _Target, unsigned __int8 _Comp, unsigned __int8 _Value) |
__casa16 | CASAH | unsigned __int16 __casa16(unsigned __int16 volatile* _Target, unsigned __int16 _Comp, unsigned __int16 _Value) |
__casa32 | CASA | unsigned __int32 __casa32(unsigned __int32 volatile* _Target, unsigned __int32 _Comp, unsigned __int32 _Value) |
__casa64 | CASA | unsigned __int64 __casa64(unsigned __int64 volatile* _Target, unsigned __int64 _Comp, unsigned __int64 _Value) |
__casl8 | CASLB | unsigned __int8 __casl8(unsigned __int8 volatile* _Target, unsigned __int8 _Comp, unsigned __int8 _Value) |
__casl16 | CASLH | unsigned __int16 __casl16(unsigned __int16 volatile* _Target, unsigned __int16 _Comp, unsigned __int16 _Value) |
__casl32 | CASL | unsigned __int32 __casl32(unsigned __int32 volatile* _Target, unsigned __int32 _Comp, unsigned __int32 _Value) |
__casl64 | CASL | unsigned __int64 __casl64(unsigned __int64 volatile* _Target, unsigned __int64 _Comp, unsigned __int64 _Value) |
__casal8 | CASALB | unsigned __int8 __casal8(unsigned __int8 volatile* _Target, unsigned __int8 _Comp, unsigned __int8 _Value) |
__casal16 | CASALH | unsigned __int16 __casal16(unsigned __int16 volatile* _Target, unsigned __int16 _Comp, unsigned __int16 _Value) |
__casal32 | CASAL | unsigned __int32 __casal32(unsigned __int32 volatile* _Target, unsigned __int32 _Comp, unsigned __int32 _Value) |
__casal64 | CASAL | unsigned __int64 __casal64(unsigned __int64 volatile* _Target, unsigned __int64 _Comp, unsigned __int64 _Value) |
__crc32b | CRC32B | unsigned __int32 __crc32b(unsigned __int32, unsigned __int32) |
__crc32h | CRC32H | unsigned __int32 __crc32h(unsigned __int32, unsigned __int32) |
__crc32w | CRC32W | unsigned __int32 __crc32w(unsigned __int32, unsigned __int32) |
__crc32d | CRC32X | unsigned __int32 __crc32d(unsigned __int32, unsigned __int64) |
__crc32cb | CRC32CB | unsigned __int32 __crc32cb(unsigned __int32, unsigned __int32) |
__crc32ch | CRC32CH | unsigned __int32 __crc32ch(unsigned __int32, unsigned __int32) |
__crc32cw | CRC32CW | unsigned __int32 __crc32cw(unsigned __int32, unsigned __int32) |
__crc32cd | CRC32CX | unsigned __int32 __crc32cd(unsigned __int32, unsigned __int64) |
__dmb | DMB | void __dmb(unsigned int _Type )Вставляет операцию барьера памяти в поток инструкций. Параметр _Type указывает тип ограничения, которое накладывает барьер.Дополнительные сведения о типах ограничений, которые можно применить, см. в разделе "Ограничения на барьер памяти". |
__dsb | DSB | void __dsb(unsigned int _Type) Вставляет операцию барьера памяти в поток инструкций. Параметр _Type указывает тип ограничения, которое накладывает барьер.Дополнительные сведения о типах ограничений, которые можно применить, см. в разделе "Ограничения на барьер памяти". |
__isb | ISB | void __isb(unsigned int _Type) Вставляет операцию барьера памяти в поток инструкций. Параметр _Type указывает тип ограничения, которое накладывает барьер.Дополнительные сведения о типах ограничений, которые можно применить, см. в разделе "Ограничения на барьер памяти". |
__getReg | unsigned __int64 __getReg(int) | |
__getRegFp | double __getRegFp(int) | |
__getCallerReg | unsigned __int64 __getCallerReg(int) | |
__getCallerRegFp | double __getCallerRegFp(int) | |
__hvc | HVC | unsigned int __hvc(unsigned int, ...) |
__hlt | HLT | int __hlt(unsigned int, ...) |
__incx18byte | void __incx18byte(unsigned long) | |
__incx18word | void __incx18word(unsigned long) | |
__incx18dword | void __incx18dword(unsigned long) | |
__incx18qword | void __incx18qword(unsigned long) | |
__iso_volatile_load16 | __int16 __iso_volatile_load16(const volatile __int16 *) Дополнительные сведения см. в разделе __iso_volatile_load/хранилище встроенных функций. |
|
__iso_volatile_load32 | __int32 __iso_volatile_load32(const volatile __int32 *) Дополнительные сведения см. в разделе __iso_volatile_load/хранилище встроенных функций. |
|
__iso_volatile_load64 | __int64 __iso_volatile_load64(const volatile __int64 *) Дополнительные сведения см. в разделе __iso_volatile_load/хранилище встроенных функций. |
|
__iso_volatile_load8 | __int8 __iso_volatile_load8(const volatile __int8 *) Дополнительные сведения см. в разделе __iso_volatile_load/хранилище встроенных функций. |
|
__iso_volatile_store16 | void __iso_volatile_store16(переменная __int16 *, __int16) Дополнительные сведения см. в разделе __iso_volatile_load/хранилище встроенных функций. |
|
__iso_volatile_store32 | void __iso_volatile_store32(переменная __int32 *, __int32) Дополнительные сведения см. в разделе __iso_volatile_load/хранилище встроенных функций. |
|
__iso_volatile_store64 | void __iso_volatile_store64(переменная __int64 *, __int64) Дополнительные сведения см. в разделе __iso_volatile_load/хранилище встроенных функций. |
|
__iso_volatile_store8 | void __iso_volatile_store8(переменная __int8 *, __int8) Дополнительные сведения см. в разделе __iso_volatile_load/хранилище встроенных функций. |
|
__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 | unsigned __int64 __ldapr64(unsigned __int64 volatile* _Target) |
__mulh | __int64 __mulh(__int64, __int64) | |
__prefetch | PRFM | void __cdecl __prefetch(const void *)PRFM Предоставляет подсказку памяти с операцией PLDL1KEEP предварительной выборки в систему, к ней в ближайшее время можно получить доступ к памяти или рядом с указанным адресом. В некоторых системах можно оптимизировать шаблон доступа к памяти для повышения производительности во время выполнения. Тем не менее, с точки зрения языка C++, функция на имеет видимой активности и вообще может не предпринимать никаких действий. |
__prefetch2 | PRFM | void __cdecl __prefetch(const void *, uint8_t prfop)PRFM Предоставляет указание памяти с предоставленной операцией предварительной выборки в систему, к ней в ближайшее время может быть предоставлен доступ к памяти по указанному адресу или рядом с ним. В некоторых системах можно оптимизировать шаблон доступа к памяти для повышения производительности во время выполнения. Тем не менее, с точки зрения языка C++, функция на имеет видимой активности и вообще может не предпринимать никаких действий. |
__readx18byte | unsigned char __readx18byte(unsigned long) | |
__readx18word | unsigned short __readx18word(unsigned long) | |
__readx18dword | unsigned long __readx18dword(unsigned long) | |
__readx18qword | unsigned __int64 __readx18qword(unsigned long) | |
__setReg | void __setReg(int, unsigned __int64) | |
__setRegFp | void __setRegFp(int, double) | |
__setCallerReg | void __setCallerReg(int, unsigned __int64) | |
__setCallerRegFp | void __setCallerRegFp(int, double) | |
__sev | SEV | void __sev(void) |
__static_assert | void __static_assert(int, const char *) | |
__stlr8 | STLRB | void __stlr8(unsigned __int8 volatile* _Target, unsigned __int8 _Value) |
__stlr16 | STLRH | void __stlr16(unsigned __int16 volatile* _Target, unsigned __int16 _Value) |
__stlr32 | STLR | void __stlr32(unsigned __int32 volatile* _Target, unsigned __int32 _Value) |
__stlr64 | STLR | void __stlr64(unsigned __int64 volatile* _Target, unsigned __int64 _Value) |
__swp8 | SWPB | unsigned __int8 __swp8(unsigned __int8 volatile* _Target, unsigned __int8 _Value) |
__swp16 | SWPH | unsigned __int16 __swp16(unsigned __int16 volatile* _Target, unsigned __int16 _Value) |
__swp32 | SWP | unsigned __int32 __swp32(unsigned __int32 volatile* _Target, unsigned __int32 _Value) |
__swp64 | SWP | unsigned __int64 __swp64(unsigned __int64 volatile* _Target, unsigned __int64 _Value) |
__swpa8 | SWPAB | unsigned __int8 __swpa8(unsigned __int8 volatile* _Target, unsigned __int8 _Value) |
__swpa16 | SWPAH | unsigned __int16 __swpa16(unsigned __int16 volatile* _Target, unsigned __int16 _Value) |
__swpa32 | SWPA | unsigned __int32 __swpa32(unsigned __int32 volatile* _Target, unsigned __int32 _Value) |
__swpa64 | SWPA | unsigned __int64 __swpa64(unsigned __int64 volatile* _Target, unsigned __int64 _Value) |
__swpl8 | SWPLB | unsigned __int8 __swpl8(unsigned __int8 volatile* _Target, unsigned __int8 _Value) |
__swpl16 | SWPLH | unsigned __int16 __swpl16(unsigned __int16 volatile* _Target, unsigned __int16 _Value) |
__swpl32 | SWPL | unsigned __int32 __swpl32(unsigned __int32 volatile* _Target, unsigned __int32 _Value) |
__swpl64 | SWPL | unsigned __int64 __swpl64(unsigned __int64 volatile* _Target, unsigned __int64 _Value) |
__swpal8 | SWPALB | unsigned __int8 __swpal8(unsigned __int8 volatile* _Target, unsigned __int8 _Value) |
__swpal16 | SWPALH | unsigned __int16 __swpal16(unsigned __int16 volatile* _Target, unsigned __int16 _Value) |
__swpal32 | SWPAL | unsigned __int32 __swpal32(unsigned __int32 volatile* _Target, unsigned __int32 _Value) |
__swpal64 | SWPAL | unsigned __int64 __swpal64(unsigned __int64 volatile* _Target, unsigned __int64 _Value) |
__sys | SYS | unsigned int __sys(int, __int64) |
__svc | SVC | unsigned int __svc(unsigned int, ...) |
__wfe | WFE | void __wfe(void) |
__wfi | WFI | void __wfi(void) |
__writex18byte | void __writex18byte(unsigned long, unsigned char) | |
__writex18word | void __writex18word(unsigned long, unsigned short) | |
__writex18dword | void __writex18dword(unsigned long, unsigned long) | |
__writex18qword | void __writex18qword(unsigned long, unsigned __int64) | |
__umulh | unsigned __int64 __umulh(unsigned __int64, unsigned __int64) | |
_CopyDoubleFromInt64 | double _CopyDoubleFromInt64(__int64) | |
_CopyFloatFromInt32 | float _CopyFloatFromInt32(__int32) | |
_CopyInt32FromFloat | __int32 _CopyInt32FromFloat(float) | |
_CopyInt64FromDouble | __int64 _CopyInt64FromDouble(double) | |
_CountLeadingOnes | unsigned int _CountLeadingOnes(unsigned long) | |
_CountLeadingOnes64 | unsigned int _CountLeadingOnes64(unsigned __int64) | |
_CountLeadingSigns | unsigned int _CountLeadingSigns(long) | |
_CountLeadingSigns64 | unsigned int _CountLeadingSigns64(__int64) | |
_CountLeadingZeros | unsigned int _CountLeadingZeros(unsigned long) | |
_CountLeadingZeros64 | unsigned int _CountLeadingZeros64(unsigned __int64) | |
_CountTrailingZeros | unsigned int _CountTrailingZeros(unsigned long) | |
_CountTrailingZeros64 | unsigned int _CountTrailingZeros64(unsigned __int64) | |
_CountOneBits | unsigned int _CountOneBits(unsigned long) | |
_CountOneBits64 | unsigned int _CountOneBits64(unsigned __int64) | |
_ReadStatusReg | MRS | __int64 _ReadStatusReg(int) |
_WriteStatusReg | MSR / считыватель магнитных карт | void _WriteStatusReg(int, __int64) |
Ограничения на барьер памяти
Встроенные функции __dmb
(барьер памяти данных), __dsb
(барьер синхронизации данных) и __isb
(барьер синхронизации инструкций) используют следующие предопределенные значения, чтобы указать ограничение барьера памяти с точки зрения домена общего доступа и типа доступа, затронутого операцией.
Restriction Value | Description |
---|---|
_ARM64_BARRIER_SY | Полная система, операции чтения и записи. |
_ARM64_BARRIER_ST | Полная система, только запись. |
_ARM64_BARRIER_LD | Полная система, только для чтения. |
_ARM64_BARRIER_ISH | Внутренний общий, чтение и запись. |
_ARM64_BARRIER_ISHST | Внутренний общий, только запись. |
_ARM64_BARRIER_ISHLD | Внутренний шарабельный, только для чтения. |
_ARM64_BARRIER_NSH | Не общий, чтение и запись. |
_ARM64_BARRIER_NSHST | Не общий, только запись. |
_ARM64_BARRIER_NSHLD | Без совместного использования, только для чтения. |
_ARM64_BARRIER_OSH | Внешний общий, чтение и запись. |
_ARM64_BARRIER_OSHST | Внешний общий, только запись. |
_ARM64_BARRIER_OSHLD | Внешний шарабельный, только для чтения. |
Для встроенных __isb
ограничений, допустимых в настоящее время, является _ARM64_BARRIER_SY; все остальные значения зарезервированы архитектурой.
встроенные __iso_volatile_load/store
Эти встроенные функции явно выполняют нагрузки и хранилища, которые не подлежат оптимизации компилятора.
__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);
Параметры
Местонахождение
Адрес области памяти для чтения или записи.
Value
Значение для записи в указанное расположение памяти (только для хранения встроенных элементов).
Возвращаемое значение (только встроенные функции загрузки)
Значение расположения памяти, указанного в location.
Замечания
Вы можете использовать __iso_volatile_load8/16/32/64
встроенные __iso_volatile_store8/16/32/64
компоненты для явного выполнения доступа к памяти, которые не подлежат оптимизации компилятора. Компилятор не может удалить, синтетизировать или изменить относительный порядок этих операций. Однако он не создает неявные аппаратные барьеры памяти. Таким образом оборудование по-прежнему может переупорядочить возникающие операции доступа к памяти между несколькими потоками. Точнее, эти встроенные элементы эквивалентны следующим выражениям, как скомпилированные в / 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;
Обратите внимание, что встроенные функции принимают временные указатели для размещения временных переменных. Однако нет никаких требований или рекомендаций для использования переменных указателей в качестве аргументов. Семантика этих операций одинакова, если используется обычный, не изменяющийся тип.
Дополнительные сведения о аргументе командной строки /volatile:iso см. в разделе /volatile (переменная интерпретация ключевых слов).
Поддержка ARM64 для встроенных компонентов из других архитектур
В следующей таблице перечислены встроенные элементы из других архитектур, поддерживаемых на платформах ARM64. Если поведение встроенной функции ARM64 отличается от его поведения в других аппаратных архитектурах, отмечаются дополнительные сведения.
Имя функции | Прототип функции |
---|---|
__assume | void __assume(int) |
__code_seg | void __code_seg(const char *) |
__debugbreak | void __cdecl __debugbreak(void) |
__fastfail | __declspec(noreturn) void __fastfail(unsigned int) |
__nop | void __nop(void) |
__yield | Void __yield(void) Примечание. На платформах ARM64 эта функция создает инструкцию YIELD. Эта инструкция указывает, что поток выполняет задачу, которая может быть временно приостановлена от выполнения (например, спин-блокировки), не влияя на программу. Он позволяет ЦП выполнять другие задачи во время циклов выполнения, которые в противном случае будут потеряны. |
_AddressOfReturnAddress | void * _AddressOfReturnAddress(void) |
_BitScanForward | unsigned char _BitScanForward(unsigned long * _Index, unsigned long _Mask) |
_BitScanForward64 | unsigned char _BitScanForward64(unsigned long * _Index, unsigned __int64 _Mask) |
_BitScanReverse | unsigned char _BitScanReverse(unsigned long * _Index, unsigned long _Mask) |
_BitScanReverse64 | unsigned char _BitScanReverse64(unsigned long * _Index, unsigned __int64 _Mask) |
_bittest | unsigned char _bittest(long const *, long) |
_bittest64 | unsigned char _bittest64(__int64 const *, __int64) |
_bittestandcomplement | unsigned char _bittestandcomplement(long *, long) |
_bittestandcomplement64 | unsigned char _bittestandcomplement64(__int64 *, __int64) |
_bittestandreset | unsigned char _bittestandreset(long *, long) |
_bittestandreset64 | unsigned char _bittestandreset64(__int64 *, __int64) |
_bittestandset | unsigned char _bittestandset(long *, long) |
_bittestandset64 | unsigned char _bittestandset64(__int64 *, __int64) |
_byteswap_uint64 | unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64) |
_byteswap_ulong | unsigned long __cdecl _byteswap_ulong(unsigned long) |
_byteswap_ushort | unsigned short __cdecl _byteswap_ushort(unsigned short) |
_disable | Void __cdecl _disable(void) Примечание. На платформах ARM64 эта функция создает инструкцию MSR DAIFCLR,#2 ; она доступна только как встроенная. |
_enable | Void __cdecl _enable(void) Примечание. На платформах ARM64 эта функция создает инструкцию MSR DAIFSET,#2 ; она доступна только как встроенная. |
_lrotl | unsigned long __cdecl _lrotl(unsigned long, int) |
_lrotr | unsigned long __cdecl _lrotr(unsigned long, int) |
_ReadBarrier | void _ReadBarrier(void) |
_ReadWriteBarrier | void _ReadWriteBarrier(void) |
_ReturnAddress | void * _ReturnAddress(void) |
_rotl | unsigned int __cdecl _rotl(unsigned int _Value, int _Shift) |
_rotl16 | unsigned short _rotl16(unsigned short _Value, unsigned char _Shift) |
_rotl64 | unsigned __int64 __cdecl _rotl64(unsigned __int64 _Value, int _Shift) |
_rotl8 | unsigned char _rotl8(unsigned char _Value, unsigned char _Shift) |
_rotr | unsigned int __cdecl _rotr(unsigned int _Value, int _Shift) |
_rotr16 | unsigned short _rotr16(unsigned short _Value, unsigned char _Shift) |
_rotr64 | unsigned __int64 __cdecl _rotr64(unsigned __int64 _Value, int _Shift) |
_rotr8 | unsigned char _rotr8(unsigned char _Value, unsigned char _Shift) |
_setjmpex | int __cdecl _setjmpex(jmp_buf) |
_WriteBarrier | void _WriteBarrier(void) |
Переблокированные встроенные компоненты
Блокирующие встроенные функции представляют собой набор встроенных функций, которые используются для выполнения атомарных операций чтения, изменения и записи. Некоторые из них общие для всех платформ. Они перечислены отдельно здесь, потому что есть большое количество из них. Поскольку их определения в основном избыточны, проще думать о них в общих терминах. Их имена можно использовать для понимания точного поведения.
В следующей таблице приводится сводка поддержки arm64 небитовых встроенных встроенных элементов. Каждая ячейка в таблице соответствует имени, полученном путем добавления имени операции в самой левой ячейке строки к имени типа в самой верхней ячейке столбца для _Interlocked
. Например, ячейка на пересечении Xor
строки и 8
столбца соответствует _InterlockedXor8
и полностью поддерживается. Основные поддерживаемые функции предоставляют следующие дополнительные суффиксы: _acq
, _rel
и _nf
. Суффикс _acq
указывает «получить» семантику и суффикс _rel
указывает «освободить» семантику. Суффикс _nf
или "без ограждения" является уникальным для ARM и ARM64 и рассматривается в следующем разделе.
Операция | 8 | 16 | 32 | 64 | 128 | P |
---|---|---|---|---|---|---|
Добавить | нет | нет | Полностью | Полностью | нет | нет |
And | Полностью | Полностью | Полностью | Полностью | нет | нет |
CompareExchange | Полностью | Полностью | Полностью | Полностью | Полностью | Полностью |
Decrement | нет | Полностью | Полностью | Полностью | нет | нет |
Exchange | Полностью | Полностью | Полностью | Полностью | нет | Полностью |
ExchangeAdd | Полностью | Полностью | Полностью | Полностью | нет | нет |
Шаг | нет | Полностью | Полностью | Полностью | нет | нет |
Or | Полностью | Полностью | Полностью | Полностью | нет | нет |
Xor | Полностью | Полностью | Полностью | Полностью | нет | нет |
Ключ:
Full: поддерживает обычные,
_acq
и_rel
_nf
формы.Нет: не поддерживается
_nf (без ограждения) суффикс
Суффикс _nf
или "нет забора" указывает, что операция не ведет себя как какой-либо барьер памяти, в отличие от других трех форм (простых, _acq
и _rel
), которые все ведут себя как какой-то барьер. Одним из возможных вариантов использования форм является сохранение счетчика _nf
статистики, обновляемого несколькими потоками одновременно, но значение которого не используется в противном случае при выполнении нескольких потоков.
Список взаимоблокируемых встроенных элементов
Имя функции | Прототип функции |
---|---|
_InterlockedAdd | long _InterlockedAdd(long _volatile *, long) |
_InterlockedAdd64 | __int64 _InterlockedAdd64(__int64 переменные *, __int64) |
_InterlockedAdd64_acq | __int64 _InterlockedAdd64_acq(__int64 переменные *, __int64) |
_InterlockedAdd64_nf | __int64 _InterlockedAdd64_nf(__int64 переменные *, __int64) |
_InterlockedAdd64_rel | __int64 _InterlockedAdd64_rel(__int64 переменные *, __int64) |
_InterlockedAdd_acq | long _InterlockedAdd_acq(long volatile *, long) |
_InterlockedAdd_nf | long _InterlockedAdd_nf(long volatile *, long) |
_InterlockedAdd_rel | long _InterlockedAdd_rel(long volatile *, long) |
_InterlockedAnd | long _InterlockedAnd(long volatile *, long) |
_InterlockedAnd16 | short _InterlockedAnd16(short volatile *, short) |
_InterlockedAnd16_acq | short _InterlockedAnd16_acq(short volatile *, short) |
_InterlockedAnd16_nf | short _InterlockedAnd16_nf(short volatile *, short) |
_InterlockedAnd16_rel | short _InterlockedAnd16_rel(short volatile *, short) |
_InterlockedAnd64 | __int64 _InterlockedAnd64(__int64 переменные *, __int64) |
_InterlockedAnd64_acq | __int64 _InterlockedAnd64_acq(__int64 переменные *, __int64) |
_InterlockedAnd64_nf | __int64 _InterlockedAnd64_nf(__int64 переменные *, __int64) |
_InterlockedAnd64_rel | __int64 _InterlockedAnd64_rel(__int64 переменные *, __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 | long _InterlockedAnd_acq(long volatile *, long) |
_InterlockedAnd_nf | long _InterlockedAnd_nf(long volatile *, long) |
_InterlockedAnd_rel | long _InterlockedAnd_rel(long volatile *, long) |
_InterlockedCompareExchange | long __cdecl _InterlockedCompareExchange(long volatile *, long, long) |
_InterlockedCompareExchange_acq | long _InterlockedCompareExchange_acq(long volatile *, long, long) |
_InterlockedCompareExchange_nf | long _InterlockedCompareExchange_nf(long volatile *, long, long) |
_InterlockedCompareExchange_rel | long _InterlockedCompareExchange_rel(long volatile *, long, long) |
_InterlockedCompareExchange16 | short _InterlockedCompareExchange16(short volatile *, short, short) |
_InterlockedCompareExchange16_acq | short _InterlockedCompareExchange16_acq(short volatile *, short, short) |
_InterlockedCompareExchange16_nf | short _InterlockedCompareExchange16_nf(short volatile *, short, short) |
_InterlockedCompareExchange16_rel | short _InterlockedCompareExchange16_rel(short volatile *, short, short) |
_InterlockedCompareExchange64 | __int64 _InterlockedCompareExchange64(__int64 переменные *, __int64, __int64) |
_InterlockedCompareExchange64_acq | __int64 _InterlockedCompareExchange64_acq(__int64 переменные *, __int64, __int64) |
_InterlockedCompareExchange64_nf | __int64 _InterlockedCompareExchange64_nf(__int64 переменные *, __int64, __int64) |
_InterlockedCompareExchange64_rel | __int64 _InterlockedCompareExchange64_rel(__int64 переменные *, __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 * переменная *, void *, void *) |
_InterlockedCompareExchangePointer_acq | void * _InterlockedCompareExchangePointer_acq(void * переменная *, void *, void *) |
_InterlockedCompareExchangePointer_nf | void * _InterlockedCompareExchangePointer_nf(void * переменная *, void *, void *) |
_InterlockedCompareExchangePointer_rel | void * _InterlockedCompareExchangePointer_rel(void * переменная *, void *, void *) |
_InterlockedCompareExchange128 | unsigned char _InterlockedCompareExchange128(__int64 переменные * _Destination, __int64 _ExchangeHigh, __int64 _ExchangeLow, __int64 * _ComparandResult) |
_InterlockedCompareExchange128_acq | unsigned char _InterlockedCompareExchange128_acq(__int64 переменные * _Destination, __int64 _ExchangeHigh, __int64 _ExchangeLow, __int64 * _ComparandResult) |
_InterlockedCompareExchange128_nf | unsigned char _InterlockedCompareExchange128_nf(__int64 volatile * _Destination, __int64 _ExchangeHigh, __int64 _ExchangeLow, __int64 * _ComparandResult) |
_InterlockedCompareExchange128_rel | unsigned char _InterlockedCompareExchange128_rel(__int64 volatile * _Destination, __int64 _ExchangeHigh, __int64 _ExchangeLow, __int64 * _ComparandResult) |
_InterlockedDecrement | long __cdecl _InterlockedDecrement(long volatile *) |
_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 переменная *) |
_InterlockedDecrement64_acq | __int64 _InterlockedDecrement64_acq(__int64 переменная *) |
_InterlockedDecrement64_nf | __int64 _InterlockedDecrement64_nf(__int64 переменные *) |
_InterlockedDecrement64_rel | __int64 _InterlockedDecrement64_rel(__int64 переменная *) |
_InterlockedDecrement_acq | long _InterlockedDecrement_acq(long volatile *) |
_InterlockedDecrement_nf | long _InterlockedDecrement_nf(long volatile *) |
_InterlockedDecrement_rel | long _InterlockedDecrement_rel(long volatile *) |
_InterlockedExchange | long __cdecl _InterlockedExchange(long volatile * _Target, long) |
_InterlockedExchange_acq | long _InterlockedExchange_acq(long volatile * _Target, long) |
_InterlockedExchange_nf | long _InterlockedExchange_nf(long volatile * _Target, long) |
_InterlockedExchange_rel | long _InterlockedExchange_rel(long volatile * _Target, long) |
_InterlockedExchange16 | short _InterlockedExchange16(short volatile * _Target, short) |
_InterlockedExchange16_acq | short _InterlockedExchange16_acq(short volatile * _Target, short) |
_InterlockedExchange16_nf | short _InterlockedExchange16_nf(short volatile * _Target, short) |
_InterlockedExchange16_rel | short _InterlockedExchange16_rel(short volatile * _Target, short) |
_InterlockedExchange64 | __int64 _InterlockedExchange64(__int64 переменные * _Target, __int64) |
_InterlockedExchange64_acq | __int64 _InterlockedExchange64_acq(__int64 переменные * _Target, __int64) |
_InterlockedExchange64_nf | __int64 _InterlockedExchange64_nf(__int64 переменные * _Target, __int64) |
_InterlockedExchange64_rel | __int64 _InterlockedExchange64_rel(__int64 переменные * _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 | long __cdecl _InterlockedExchangeAdd(long volatile *, long) |
_InterlockedExchangeAdd16 | short _InterlockedExchangeAdd16(short volatile *, short) |
_InterlockedExchangeAdd16_acq | short _InterlockedExchangeAdd16_acq(short volatile *, short) |
_InterlockedExchangeAdd16_nf | short _InterlockedExchangeAdd16_nf(short volatile *, short) |
_InterlockedExchangeAdd16_rel | short _InterlockedExchangeAdd16_rel(short volatile *, short) |
_InterlockedExchangeAdd64 | __int64 _InterlockedExchangeAdd64(__int64 переменные *, __int64) |
_InterlockedExchangeAdd64_acq | __int64 _InterlockedExchangeAdd64_acq(__int64 переменные *, __int64) |
_InterlockedExchangeAdd64_nf | __int64 _InterlockedExchangeAdd64_nf(__int64 переменные *, __int64) |
_InterlockedExchangeAdd64_rel | __int64 _InterlockedExchangeAdd64_rel(__int64 переменные *, __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 | long _InterlockedExchangeAdd_acq(long volatile *, long) |
_InterlockedExchangeAdd_nf | long _InterlockedExchangeAdd_nf(long volatile *, long) |
_InterlockedExchangeAdd_rel | long _InterlockedExchangeAdd_rel(long volatile *, long) |
_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 | long __cdecl _InterlockedIncrement(long volatile *) |
_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 переменная *) |
_InterlockedIncrement64_acq | __int64 _InterlockedIncrement64_acq(__int64 переменная *) |
_InterlockedIncrement64_nf | __int64 _InterlockedIncrement64_nf(__int64 переменная *) |
_InterlockedIncrement64_rel | __int64 _InterlockedIncrement64_rel(__int64 переменные *) |
_InterlockedIncrement_acq | long _InterlockedIncrement_acq(long volatile *) |
_InterlockedIncrement_nf | long _InterlockedIncrement_nf(long volatile *) |
_InterlockedIncrement_rel | long _InterlockedIncrement_rel(long volatile *) |
_InterlockedOr | long _InterlockedOr(long volatile *, long) |
_InterlockedOr16 | short _InterlockedOr16(short volatile *, short) |
_InterlockedOr16_acq | short _InterlockedOr16_acq(short volatile *, short) |
_InterlockedOr16_nf | short _InterlockedOr16_nf(short volatile *, short) |
_InterlockedOr16_rel | short _InterlockedOr16_rel(short volatile *, short) |
_InterlockedOr64 | __int64 _InterlockedOr64(__int64 переменные *, __int64) |
_InterlockedOr64_acq | __int64 _InterlockedOr64_acq(__int64 переменные *, __int64) |
_InterlockedOr64_nf | __int64 _InterlockedOr64_nf(__int64 переменные *, __int64) |
_InterlockedOr64_rel | __int64 _InterlockedOr64_rel(__int64 переменная *, __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 | long _InterlockedOr_acq(long volatile *, long) |
_InterlockedOr_nf | long _InterlockedOr_nf(long volatile *, long) |
_InterlockedOr_rel | long _InterlockedOr_rel(long volatile *, long) |
_InterlockedXor | long _InterlockedXor(long volatile *, long) |
_InterlockedXor16 | short _InterlockedXor16(short volatile *, short) |
_InterlockedXor16_acq | short _InterlockedXor16_acq(short volatile *, short) |
_InterlockedXor16_nf | short _InterlockedXor16_nf(short volatile *, short) |
_InterlockedXor16_rel | short _InterlockedXor16_rel(short volatile *, short) |
_InterlockedXor64 | __int64 _InterlockedXor64(__int64 переменные *, __int64) |
_InterlockedXor64_acq | __int64 _InterlockedXor64_acq(__int64 переменные *, __int64) |
_InterlockedXor64_nf | __int64 _InterlockedXor64_nf(__int64 переменные *, __int64) |
_InterlockedXor64_rel | __int64 _InterlockedXor64_rel(__int64 переменные *, __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 | long _InterlockedXor_acq(long volatile *, long) |
_InterlockedXor_nf | long _InterlockedXor_nf(long volatile *, long) |
_InterlockedXor_rel | long _InterlockedXor_rel(long volatile *, long) |
встроенные _interlockedbittest
Встроенные встроенные тестовые функции обычного взаимодействия являются общими для всех платформ. ARM64 добавляет _acq
и _rel
_nf
варианты, которые просто изменяют семантику барьера операции, как описано в _nf (без ограждения) Суффикс ранее в этой статье.
Имя функции | Прототип функции |
---|---|
_interlockedbittestandreset | unsigned char _interlockedbittestandreset(long volatile *, long) |
_interlockedbittestandreset_acq | unsigned char _interlockedbittestandreset_acq(long volatile *, long) |
_interlockedbittestandreset_nf | unsigned char _interlockedbittestandreset_nf(long volatile *, long) |
_interlockedbittestandreset_rel | unsigned char _interlockedbittestandreset_rel(long volatile *, long) |
_interlockedbittestandreset64 | unsigned char _interlockedbittestandreset64(__int64 переменная *, __int64) |
_interlockedbittestandreset64_acq | unsigned char _interlockedbittestandreset64_acq(__int64 переменная *, __int64) |
_interlockedbittestandreset64_nf | unsigned char _interlockedbittestandreset64_nf(__int64 переменная *, __int64) |
_interlockedbittestandreset64_rel | unsigned char _interlockedbittestandreset64_rel(__int64 переменные *, __int64) |
_interlockedbittestandset | unsigned char _interlockedbittestandset(long volatile *, long) |
_interlockedbittestandset_acq | unsigned char _interlockedbittestandset_acq(long volatile *, long) |
_interlockedbittestandset_nf | unsigned char _interlockedbittestandset_nf(long volatile *, long) |
_interlockedbittestandset_rel | unsigned char _interlockedbittestandset_rel(long volatile *, long) |
_interlockedbittestandset64 | unsigned char _interlockedbittestandset64(__int64 переменная *, __int64) |
_interlockedbittestandset64_acq | unsigned char _interlockedbittestandset64_acq(__int64 переменная *, __int64) |
_interlockedbittestandset64_nf | unsigned char _interlockedbittestandset64_nf(__int64 переменная *, __int64) |
_interlockedbittestandset64_rel | unsigned char _interlockedbittestandset64_rel(__int64 переменная *, __int64) |
См. также
Встроенные компоненты компилятора
Встроенные объекты ARM
Справочник по сборщику ARM
Справочник по языку C++