ARM64 내장 함수
MSVC(Microsoft C++ 컴파일러)는 ARM64 아키텍처에서 다음 내장 함수를 사용할 수 있도록 합니다. ARM에 대한 자세한 내용은 ARM 개발자 설명서 웹 사이트의 아키텍처 및 소프트웨어 개발 도구 섹션을 참조하세요.
네온
ARM64에 대한 NEON 벡터 명령 집합 확장은 SIMD(단일 명령 다중 데이터) 기능을 제공합니다. x86 및 x64 아키텍처 프로세서에 공통적인 MMX 및 SSE 벡터 명령 집합의 것과 유사합니다.
NEON 내장 함수는 arm64_neon.h
헤더 파일에서 제공된 데로 지원됩니다. NEON 내장 함수에 대한 MSVC 지원은 ARM Infocenter 웹 사이트의 ARM NEON 내장 참조에 설명된 ARM64 컴파일러와 유사합니다.
ARM64 관련 내장 함수 목록
헤더 파일에 intrin.h
제공된 대로 ARM64 관련 내장 함수가 지원됩니다.
함수 이름 | 지침 | 함수 프로토타입 |
---|---|---|
__휴식 | 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 | 카사 | unsigned __int32 __casa32(unsigned __int32 volatile* _Target, unsigned __int32 _Comp, unsigned __int32 _Value) |
__casa64 | 카사 | 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(volatile __int16 *, __int16) 자세한 내용은 __iso_volatile_load/내장 함수 저장을 참조하세요. |
|
__iso_volatile_store32 | void __iso_volatile_store32(volatile __int32 *, __int32) 자세한 내용은 __iso_volatile_load/내장 함수 저장을 참조하세요. |
|
__iso_volatile_store64 | void __iso_volatile_store64(volatile __int64 *, __int64) 자세한 내용은 __iso_volatile_load/내장 함수 저장을 참조하세요. |
|
__iso_volatile_store8 | void __iso_volatile_store8(volatile __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
(명령 동기화 장벽)은 다음 미리 정의된 값을 사용하여 공유 도메인 및 작업의 영향을 받는 액세스의 종류에 따라 메모리 장벽 제한을 지정합니다.
제한 값 | 설명 |
---|---|
_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/저장
이러한 내장 함수는 컴파일러 최적화의 대상이 아닌 로드 및 저장소를 명시적으로 수행합니다.
__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);
매개 변수
위치
읽거나 쓸 메모리 위치의 주소입니다.
값
지정된 메모리 위치에 쓸 값입니다(내장 함수만 저장).
반환 값(내장 함수만 로드)
위치로 지정된 메모리 위치의 값입니다.
설명
및 내장 함수를 사용하여 __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(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 명령을 생성합니다. 이 명령은 스레드가 프로그램에 부정적인 영향을 주지 않고 일시적으로 실행(예: 스핀 잠금)에서 일시 중단될 수 있는 작업을 수행하고 있음을 나타냅니다. 이렇게 하면 CPU가 실행 주기 중에 다른 작업을 실행할 수 있으며, 그렇지 않으면 낭비될 수 있습니다. |
_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) |
[맨 위로 돌아가기]
연동 내장 함수
Interlocked 내장 함수는 원자성 읽기-수정-쓰기 작업을 수행하는데 사용되는 내장 함수 집합입니다. 일부 내장 함수는 모든 플랫폼에 공통적입니다. 많은 수의 항목이 있으므로 여기에 별도로 나열됩니다. 정의는 대부분 중복되므로 일반적인 용어로 생각하는 것이 더 쉽습니다. 내장 함수의 이름을 사용해 정확한 동작을 파악할 수 있습니다.
다음 표에는 비비트 비비트 연동 내장 함수의 ARM64 지원이 요약되어 있습니다. 테이블의 각 셀은 _Interlocked
에 행의 가장 왼쪽 셀에 작업 이름 및 열의 맨 위 셀에 형식 이름을 추가하여 파생된 이름을 뜻합니다. 예를 들어 행과 열의 Xor
교차점에 있는 셀이 8
해당 _InterlockedXor8
하며 완전히 지원됩니다. 대부분의 지원되는 함수에는 옵션 접미사 _acq
, _rel
, 및 _nf
가 제공됩니다. _acq
접미사는 "acquire" 의미를 나타내며 _rel
접미사는 "release" 의미를 나타냅니다. _nf
또는 "no fence" 접미사는 ARM 및 ARM64에 고유하며 다음 섹션에서 설명합니다.
연산 | 8 | 16 | 32 | 64 | 128 | P |
---|---|---|---|---|---|---|
추가 | None | None | 전체 | 전체 | None | None |
및 | 전체 | 전체 | 전체 | 전체 | None | None |
CompareExchange | 전체 | 전체 | 전체 | 전체 | 전체 | 전체 |
감소 | None | 전체 | 전체 | 전체 | None | None |
Exchange | 전체 | 전체 | 전체 | 전체 | None | 전체 |
ExchangeAdd | 전체 | 전체 | 전체 | 전체 | None | None |
ID 증가값 | None | 전체 | 전체 | 전체 | None | None |
또는 | 전체 | 전체 | 전체 | 전체 | None | None |
Xor | 전체 | 전체 | 전체 | 전체 | None | None |
키:
전체: 일반,
_acq
,_rel
및_nf
양식을 지원합니다.없음: 지원되지 않음
_nf(울타리 없음) 접미사
_nf
또는 "no fence" 접미사는 모든 종류의 장벽으로 동작하는 다른 세 가지 형태(일반 및_acq
)와 _rel
달리 작업이 어떤 종류의 메모리 장벽으로도 동작하지 않음을 나타냅니다. 양식을 사용할 _nf
수 있는 한 가지 방법은 여러 스레드에서 동시에 업데이트되지만 여러 스레드가 실행되는 동안 값이 사용되지 않는 통계 카운터를 유지하는 것입니다.
연동된 내장 함수 목록
함수 이름 | 함수 프로토타입 |
---|---|
_InterlockedAdd | long _InterlockedAdd(long _volatile *, long) |
_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 | 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 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 | 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 volatile *, __int64, __int64) |
_InterlockedCompareExchange64_acq | __int64 _InterlockedCompareExchange64_acq(__int64 volatile *, __int64, __int64) |
_InterlockedCompareExchange64_nf | __int64 _InterlockedCompareExchange64_nf(__int64 volatile *, __int64, __int64) |
_InterlockedCompareExchange64_rel | __int64 _InterlockedCompareExchange64_rel(__int64 volatile *, __int64, __int64) |
_InterlockedCompareExchange8 | char _InterlockedCompareExchange8(char volatile *, char, char) |
_InterlockedCompareExchange8_acq | char _InterlockedCompareExchange8_acq(char volatile *, char, char) |
_InterlockedCompareExchange8_nf | char _InterlockedCompareExchange8_nf(char volatile *, char, char) |
_InterlockedCompareExchange8_rel | char _InterlockedCompareExchange8_rel(char volatile *, char, char) |
_InterlockedCompareExchangePointer | void * _InterlockedCompareExchangePointer(void * volatile *, void *, void *) |
_InterlockedCompareExchangePointer_acq | void * _InterlockedCompareExchangePointer_acq(void * volatile *, void *, void *) |
_InterlockedCompareExchangePointer_nf | void * _InterlockedCompareExchangePointer_nf(void * volatile *, void *, void *) |
_InterlockedCompareExchangePointer_rel | void * _InterlockedCompareExchangePointer_rel(void * volatile *, void *, void *) |
_InterlockedCompareExchange128 | unsigned char _InterlockedCompareExchange128(__int64 volatile * _Destination, __int64 _ExchangeHigh, __int64 _ExchangeLow, __int64 * _ComparandResult) |
_InterlockedCompareExchange128_acq | unsigned char _InterlockedCompareExchange128_acq(__int64 volatile * _Destination, __int64 _ExchangeHigh, __int64 _ExchangeLow, __int64 * _ComparandResult) |
_InterlockedCompareExchange128_nf | 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 volatile *) |
_InterlockedDecrement64_acq | __int64 _InterlockedDecrement64_acq(__int64 volatile *) |
_InterlockedDecrement64_nf | __int64 _InterlockedDecrement64_nf(__int64 volatile *) |
_InterlockedDecrement64_rel | __int64 _InterlockedDecrement64_rel(__int64 volatile *) |
_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 volatile * _Target, __int64) |
_InterlockedExchange64_acq | __int64 _InterlockedExchange64_acq(__int64 volatile * _Target, __int64) |
_InterlockedExchange64_nf | __int64 _InterlockedExchange64_nf(__int64 volatile * _Target, __int64) |
_InterlockedExchange64_rel | __int64 _InterlockedExchange64_rel(__int64 volatile * _Target, __int64) |
_InterlockedExchange8 | char _InterlockedExchange8(char volatile * _Target, char) |
_InterlockedExchange8_acq | char _InterlockedExchange8_acq(char volatile * _Target, char) |
_InterlockedExchange8_nf | char _InterlockedExchange8_nf(char volatile * _Target, char) |
_InterlockedExchange8_rel | char _InterlockedExchange8_rel(char volatile * _Target, char) |
_InterlockedExchangeAdd | 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 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 | 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 volatile *) |
_InterlockedIncrement64_acq | __int64 _InterlockedIncrement64_acq(__int64 volatile *) |
_InterlockedIncrement64_nf | __int64 _InterlockedIncrement64_nf(__int64 volatile *) |
_InterlockedIncrement64_rel | __int64 _InterlockedIncrement64_rel(__int64 volatile *) |
_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 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 | 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 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 | long _InterlockedXor_acq(long volatile *, long) |
_InterlockedXor_nf | long _InterlockedXor_nf(long volatile *, long) |
_InterlockedXor_rel | long _InterlockedXor_rel(long volatile *, long) |
[맨 위로 돌아가기]
_interlockedbittest 내장 함수
일반 연동 비트 테스트 내장 함수는 모든 플랫폼에 공통적으로 적용됩니다. ARM64는 이 문서의 앞부분에 나오는 _nf(펜스 없음) 접미사에 설명된 대로 작업의 장벽 의미 체계를 수정하는 변형을 _nf
추가_acq
_rel
합니다.
함수 이름 | 함수 프로토타입 |
---|---|
_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 volatile *, __int64) |
_interlockedbittestandreset64_acq | unsigned char _interlockedbittestandreset64_acq(__int64 volatile *, __int64) |
_interlockedbittestandreset64_nf | unsigned char _interlockedbittestandreset64_nf(__int64 volatile *, __int64) |
_interlockedbittestandreset64_rel | unsigned char _interlockedbittestandreset64_rel(__int64 volatile *, __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 volatile *, __int64) |
_interlockedbittestandset64_acq | unsigned char _interlockedbittestandset64_acq(__int64 volatile *, __int64) |
_interlockedbittestandset64_nf | unsigned char _interlockedbittestandset64_nf(__int64 volatile *, __int64) |
_interlockedbittestandset64_rel | unsigned char _interlockedbittestandset64_rel(__int64 volatile *, __int64) |
[맨 위로 돌아가기]