ARM内部

Visual C++ 编译器在 ARM 体系结构使以下内部可用。 有关 ARM 的更多信息,请 ARM 体系结构参考手册 参见中的和 ARM 汇编工具指南 ARM Infocenter 网站上。

ARM 的霓虹向量命令设置的扩展提供唯一类似于 MMX,并且 SSE 向量命令组为 x86 和 x64 体系结构处理器共有的命令多个数据 (SIMD) 功能。

霓虹内部在标头文件 arm_neon.h支持,根据提供。 Visual C++ 编译器为霓虹内部函数支持类似于 ARM 编译器,在 ARM 武装编译器 toolchain,版本 4.1 编译器引用 Infocenter 网站的附录 G 文档。

Visual C++ 编译器和 ARM 编译器之间的主要区别在于 Visual C++ 编译器添加 vldX 和 vstX 向量加载和存储命令的 _ex 变量。 _ex 变体带有指定指针参数的对齐方式的一个附加参数,但与其非_ex 重复为相同。

ARM 特定的内部列表

函数名

指令

函数原型

_arm_smlal

SMLAL

_arm_smlal __int64 (__int64 _RdHiLo、_Rn int,int _Rm)

_arm_umlal

UMLAL

_arm_umlal unsigned __int64 (unsigned __int64 _RdHiLo、unsigned int _Rn,unsigned int _Rm)

_arm_clz

CLZ

unsigned int _arm_clz (unsigned int _Rm)

_arm_qadd

QADD

int _arm_qadd (_Rm int,int _Rn)

_arm_qdadd

QDADD

int _arm_qdadd (_Rm int,int _Rn)

_arm_qdsub

QDSUB

int _arm_qdsub (_Rm int,int _Rn)

_arm_qsub

QSUB

int _arm_qsub (_Rm int,int _Rn)

_arm_smlabb

SMLABB

int _arm_smlabb (int _Rn、_Rm int,int _Ra)

_arm_smlabt

SMLABT

int _arm_smlabt (int _Rn、_Rm int,int _Ra)

_arm_smlatb

SMLATB

int _arm_smlatb (int _Rn、_Rm int,int _Ra)

_arm_smlatt

SMLATT

int _arm_smlatt (int _Rn、_Rm int,int _Ra)

_arm_smlalbb

SMLALBB

__int64 _arm_smlalbb (__int64 _RdHiLo、_Rn int,int _Rm)

_arm_smlalbt

SMLALBT

__int64 _arm_smlalbt (__int64 _RdHiLo、_Rn int,int _Rm)

_arm_smlaltb

SMLALTB

__int64 _arm_smlaltb (__int64 _RdHiLo、_Rn int,int _Rm)

_arm_smlaltt

SMLALTT

__int64 _arm_smlaltt (__int64 _RdHiLo、_Rn int,int _Rm)

_arm_smlawb

SMLAWB

int _arm_smlawb (int _Rn、_Rm int,int _Ra)

_arm_smlawt

SMLAWT

int _arm_smlawt (int _Rn、_Rm int,int _Ra)

_arm_smulbb

SMULBB

int _arm_smulbb (_Rn int,int _Rm)

_arm_smulbt

SMULBT

int _arm_smulbt (_Rn int,int _Rm)

_arm_smultb

SMULTB

int _arm_smultb (_Rn int,int _Rm)

_arm_smultt

SMULTT

int _arm_smultt (_Rn int,int _Rm)

_arm_smulwb

SMULWB

int _arm_smulwb (_Rn int,int _Rm)

_arm_smulwt

SMULWT

int _arm_smulwt (_Rn int,int _Rm)

_arm_sadd16

SADD16

int _arm_sadd16 (_Rn int,int _Rm)

_arm_sadd8

SADD8

int _arm_sadd8 (_Rn int,int _Rm)

_arm_sasx

SASX

int _arm_sasx (_Rn int,int _Rm)

_arm_ssax

SSAX

int _arm_ssax (_Rn int,int _Rm)

_arm_ssub16

SSUB16

int _arm_ssub16 (_Rn int,int _Rm)

_arm_ssub8

SSUB8

int _arm_ssub8 (_Rn int,int _Rm)

_arm_shadd16

SHADD16

int _arm_shadd16 (_Rn int,int _Rm)

_arm_shadd8

SHADD8

int _arm_shadd8 (_Rn int,int _Rm)

_arm_shasx

SHASX

int _arm_shasx (_Rn int,int _Rm)

_arm_shsax

SHSAX

int _arm_shsax (_Rn int,int _Rm)

_arm_shsub16

SHSUB16

int _arm_shsub16 (_Rn int,int _Rm)

_arm_shsub8

SHSUB8

int _arm_shsub8 (_Rn int,int _Rm)

_arm_qadd16

QADD16

int _arm_qadd16 (_Rn int,int _Rm)

_arm_qadd8

QADD8

int _arm_qadd8 (_Rn int,int _Rm)

_arm_qasx

QASX

int _arm_qasx (_Rn int,int _Rm)

_arm_qsax

QSAX

int _arm_qsax (_Rn int,int _Rm)

_arm_qsub16

QSUB16

int _arm_qsub16 (_Rn int,int _Rm)

_arm_qsub8

QSUB8

int _arm_qsub8 (_Rn int,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

unsigned int _arm_uasx (unsigned int _Rn,unsigned int _Rm)

_arm_usax

USAX

unsigned int _arm_usax (unsigned int _Rn,unsigned int _Rm)

_arm_usub16

USUB16

unsigned int _arm_usub16 (unsigned int _Rn,unsigned int _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

unsigned int _arm_uhadd8 (unsigned int _Rn,unsigned int _Rm)

_arm_uhasx

UHASX

unsigned int _arm_uhasx (unsigned int _Rn,unsigned int _Rm)

_arm_uhsax

UHSAX

unsigned int _arm_uhsax (unsigned int _Rn,unsigned int _Rm)

_arm_uhsub16

UHSUB16

unsigned int _arm_uhsub16 (unsigned int _Rn,unsigned int _Rm)

_arm_uhsub8

UHSUB8

unsigned int _arm_uhsub8 (unsigned int _Rn,unsigned int _Rm)

_arm_uqadd16

UQADD16

unsigned int _arm_uqadd16 (unsigned 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 _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,unsigned int _Rotation)

_arm_sxtb16

SXTB16

int _arm_sxtb16 (int _Rn,unsigned int _Rotation)

_arm_sxth

SXTH

int _arm_sxth (int _Rn,unsigned int _Rotation)

_arm_uxtb

UXTB

unsigned int _arm_uxtb (unsigned int _Rn,unsigned int _Rotation)

_arm_uxtb16

UXTB16

unsigned int _arm_uxtb16 (unsigned int _Rn,unsigned int _Rotation)

_arm_uxth

UXTH

unsigned int _arm_uxth (unsigned 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

unsigned int _arm_usad8 (unsigned int _Rn,unsigned int _Rm)

_arm_usada8

USADA8

unsigned int _arm_usada8 (unsigned int _Rn、unsigned int _Rm,unsigned int _Ra)

_arm_ssat

SSAT

int _arm_ssat (unsigned int _Sat_imm、_int _Rn、_ARMINTR_SHIFT_T _Shift_type,unsigned int _Shift_imm)

_arm_usat

USAT

int _arm_usat (unsigned int _Sat_imm、_int _Rn、_ARMINTR_SHIFT_T _Shift_type,unsigned int _Shift_imm)

_arm_ssat16

SSAT16

int _arm_ssat16 (unsigned int _Sat_imm,_int _Rn)

_arm_usat16

USAT16

int _arm_usat16 (unsigned int _Sat_imm,_int _Rn)

_arm_rev

REV

unsigned int _arm_rev (unsigned int _Rm)

_arm_rev16

REV16

unsigned int _arm_rev16 (unsigned int _Rm)

_arm_revsh

REVSH

unsigned int _arm_revsh (unsigned int _Rm)

_arm_smlad

SMLAD

int _arm_smlad (int _Rn、_Rm int,int _Ra)

_arm_smladx

SMLADX

int _arm_smladx (int _Rn、_Rm int,int _Ra)

_arm_smlsd

SMLSD

int _arm_smlsd (int _Rn、_Rm int,int _Ra)

_arm_smlsdx

SMLSDX

int _arm_smlsdx (int _Rn、_Rm int,int _Ra)

_arm_smmla

SMMLA

int _arm_smmla (int _Rn、_Rm int,int _Ra)

_arm_smmlar

SMMLAR

_arm_smmlar 的 int (int _Rn、_Rm int,int _Ra)

_arm_smmls

SMMLS

int _arm_smmls (int _Rn、_Rm int,int _Ra)

_arm_smmlsr

SMMLSR

int _arm_smmlsr (int _Rn、_Rm int,int _Ra)

_arm_smmul

SMMUL

int _arm_smmul (_Rn int,int _Rm)

_arm_smmulr

SMMULR

int _arm_smmulr (_Rn int,int _Rm)

_arm_smlald

SMLALD

__int64 _arm_smlald (__int64 _RdHiLo、_Rn int,int _Rm)

_arm_smlaldx

SMLALDX

__int64 _arm_smlaldx (__int64 _RdHiLo、_Rn int,int _Rm)

_arm_smlsld

SMLSLD

__int64 _arm_smlsld (__int64 _RdHiLo、_Rn int,int _Rm)

_arm_smlsldx

SMLSLDX

__int64 _arm_smlsldx (__int64 _RdHiLo、_Rn int,int _Rm)

_arm_smuad

SMUAD

int _arm_smuad (_Rn int,int _Rm)

_arm_smuadx

SMUADX

int _arm_muadxs (_Rn int,int _Rm)

_arm_smusd

SMUSD

int _arm_smusd (_Rn int,int _Rm)

_arm_smusdx

SMUSDX

int _arm_smusdx (_Rn int,int _Rm)

_arm_smull

SMULL

__int64 _arm_smull (_Rn int,int _Rm)

_arm_umull

UMULL

unsigned __int64 _arm_umull (unsigned int _Rn,unsigned int _Rm)

_arm_umaal

UMAAL

_arm_umaal unsigned __int64 (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

unsigned int _arm_rbit (unsigned int _Rm)

_arm_sbfx

SBFX

int _arm_sbfx (int _Rn、unsigned int _Lsb,unsigned int _Width)

_arm_ubfx

UBFX

unsigned int _arm_ubfx (unsigned int _Rn、unsigned int _Lsb,unsigned int _Width)

_arm_sdiv

SDIV

int _arm_sdiv (_Rn int,int _Rm)

_arm_udiv

UDIV

unsigned int _arm_udiv (unsigned int _Rn,unsigned int _Rm)

__cps

CPS

无效__cps (unsigned int _Ops、unsigned int _Flags,unsigned int _Mode)

__dmb

DMB

无效__dmb (unsigned int _Type)

插入内存障碍操作到命令流。 该参数 _Type 指定关卡实施此限制。

有关上强制执行的命名限制的更多信息,请参见 内存障碍限制。

__dsb

DSB

无效__dsb (unsigned int _Type)

插入内存障碍操作到命令流。 该参数 _Type 指定关卡实施此限制。

有关上强制执行的命名限制的更多信息,请参见 内存障碍限制。

__isb

ISB

无效__isb (unsigned int _Type)

插入内存障碍操作到命令流。 该参数 _Type 指定关卡实施此限制。

有关上强制执行的命名限制的更多信息,请参见 内存障碍限制。

__emit

无效__emit (无符号__int32 操作码)

插入指定的命令为输出由编译器命令中的流。

opcode 的值必须是在编译时已知的常量表达式。 指令字大小为 16 位,并最重要的 16 位 opcode 被忽略。

在插入的命令前,编译器不尝试解释 opcode 内容,并不保证 CPU 或内存状态。

编译器假定,CPU 和内存状态未更改,在插入的命令执行后。 因此,更改状态的命令会对由编译器生成的代码的不利的影响。

因此,对影响个 CPU 一条将命令中仅使用 emit,编译器通常不处理 (例如,协处理器状态或如何使用 declspec(naked),声明的实现功能。

__hvc

HVC

unsigned int __hvc (unsigned int,…)

__iso_volatile_load16

__int16 __iso_volatile_load16 (const-volatile 的__int16 *)

有关更多信息,请参见__iso_volatile_load/store instrinsics。

__iso_volatile_load32

__int32 __iso_volatile_load32 (const-volatile 的__int32 *)

有关更多信息,请参见__iso_volatile_load/store instrinsics。

__iso_volatile_load64

__int64 __iso_volatile_load64 (const-volatile __int64 *)

有关更多信息,请参见__iso_volatile_load/store instrinsics。

__iso_volatile_load8

__int8 __iso_volatile_load8 (const-volatile 的__int8 *)

有关更多信息,请参见__iso_volatile_load/store instrinsics。

__iso_volatile_store16

无效__iso_volatile_store16 (变量的__int16 *,__int16)

有关更多信息,请参见__iso_volatile_load/store instrinsics。

__iso_volatile_store32

无效__iso_volatile_store32 (可变__int32 *,__int32)

有关更多信息,请参见__iso_volatile_load/store instrinsics。

__iso_volatile_store64

无效__iso_volatile_store64 (变量__int64 *,__int64)

有关更多信息,请参见__iso_volatile_load/store instrinsics。

__iso_volatile_store8

无效__iso_volatile_store8 (变量的__int8 *,__int8)

有关更多信息,请参见__iso_volatile_load/store instrinsics。

__ldrexd

LDREXD

__int64 __ldrexd (const-volatile __int64 *)

__prefetch

PLD

无效__cdecl __prefetch (无效的常量*)

提供一个 PLD 内存提示。在某些构造一个指定地址的内存可能很快捕获的系统。 某些系统可以选择优化为该内存存取模式可以提高运行时性能。 但是,从 C++ 语言的角度来看,该函数都没有可观察效果,还可以执行。

__rdpmccntr64

unsigned __int64 __rdpmccntr64 (失效)

__sev

SEV

无效__sev (失效)

__static_assert

无效__static_assert (int,const char *)

__swi

SVC

unsigned int __swi (unsigned int,…)

__trap

BKPT

int __trap (int,…)

__wfe

WFE

无效__wfe (失效)

__wfi

WFI

无效__wfi (失效)

_AddSatInt

QADD

int _AddSatInt (int,int)

_CopyDoubleFromInt64

二进制_CopyDoubleFromInt64 (__int64)

_CopyFloatFromInt32

浮动_CopyFloatFromInt32 (__int32)

_CopyInt32FromFloat

__int32 _CopyInt32FromFloat (浮动)

_CopyInt64FromDouble

__int64 _CopyInt64FromDouble (二元)

_CountLeadingOnes

unsigned int _CountLeadingOnes (unsigned long)

_CountLeadingOnes64

unsigned int _CountLeadingOnes64 (unsigned __int64)

_CountLeadingSigns

unsigned int _CountLeadingSigns (长)

_CountLeadingSigns64

unsigned int _CountLeadingSigns64 (__int64)

_CountLeadingZeros

unsigned int _CountLeadingZeros (unsigned long)

_CountLeadingZeros64

unsigned int _CountLeadingZeros64 (unsigned __int64)

_CountOneBits

unsigned int _CountOneBits (unsigned long)

_CountOneBits64

unsigned int _CountOneBits64 (unsigned __int64)

_DAddSatInt

QDADD

int _DAddSatInt (int,int)

_DSubSatInt

QDSUB

int _DSubSatInt (int,int)

_isunordered

_isunordered 的 int (二进制文件,二元)

_isunorderedf

int _isunorderedf (浮点数,浮动)

_MoveFromCoprocessor

MRC

unsigned int _MoveFromCoprocessor (unsigned int、unsigned int、unsigned int、unsigned int,unsigned int)

使用协处理器数据传输调整命令,读取 ARM 协处理器的数据。 有关更多信息,请参见_MoveFromCoprocessor,_MoveFromCoprocessor2。

_MoveFromCoprocessor2

MRC2

unsigned int _MoveFromCoprocessor2 (unsigned int、unsigned int、unsigned int、unsigned int,unsigned int)

使用协处理器数据传输调整命令,读取 ARM 协处理器的数据。 有关更多信息,请参见_MoveFromCoprocessor,_MoveFromCoprocessor2。

_MoveFromCoprocessor64

MRRC

unsigned __int64 _MoveFromCoprocessor64 (unsigned int、unsigned int,unsigned int)

使用协处理器数据传输调整命令,读取 ARM 协处理器的数据。 有关更多信息,请参见_MoveFromCoprocessor64。

_MoveToCoprocessor

MCR

无效_MoveToCoprocessor (unsigned int、unsigned int、unsigned int、unsigned int、unsigned int,unsigned int)

使用协处理器数据传输调整命令,读取 ARM 协处理器的数据。 有关更多信息,请参见_MoveToCoprocessor,_MoveToCoprocessor2。

_MoveToCoprocessor2

MCR2

无效_MoveToCoprocessor2 (unsigned int、unsigned int、unsigned int、unsigned int、unsigned int,unsigned int)

使用协处理器数据传输调整命令,读取 ARM 协处理器的数据。 有关更多信息,请参见_MoveToCoprocessor,_MoveToCoprocessor2。

_MoveToCoprocessor64

MCRR

无效_MoveToCoprocessor64 (unsigned __int64、unsigned int、unsigned int,unsigned int)

使用协处理器数据传输调整命令,读取 ARM 协处理器的数据。 有关更多信息,请参见_MoveToCoprocessor64。

_MulHigh

长_MulHigh (长,长)

_MulUnsignedHigh

unsigned long _MulUnsignedHigh (unsigned long,unsigned long)

_ReadBankedReg

一些

int _ReadBankedReg (int _Reg)

_ReadStatusReg

一些

int _ReadStatusReg (int)

_SubSatInt

QSUB

int _SubSatInt (int,int)

_WriteBankedReg

MSR

无效_WriteBankedReg (_Value int,int _Reg)

_WriteStatusReg

MSR

无效_WriteStatusReg (int、int,int)

[氖]

Hh875058.collapse_all(zh-cn,VS.110).gif内存障碍限制

内部函数 __dmb (数据障碍),__dsb (数据同步障碍) 和 __isb (命令同步障碍) 使用由操作影响的下列预定义的值指定的内存障碍限制基于有点儿共享的字段和访问。

限制值

描述

_ARM_BARRIER_SY

完整的系统,读取和写入。

_ARM_BARRIER_ST

完整的系统,只写访问权。

_ARM_BARRIER_ISH

内部可共享,读取和写入。

_ARM_BARRIER_ISHST

内部可共享,只写访问权。

_ARM_BARRIER_NSH

不能共享,读取和写入。

_ARM_BARRIER_NSHST

不能共享,只写访问权。

_ARM_BARRIER_OSH

外部可共享,读取和写入。

_ARM_BARRIER_OSHST

外部可共享,只写访问权。

对于 __isb 内部,当前有效的唯一限制是_ARM_BARRIER_SY;其他值由体系结构保留。

Hh875058.collapse_all(zh-cn,VS.110).gif__iso_volatile_load/store instrinsics

这些内部函数显式执行不受编译器优化取决于加载和存储。

__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)

参数

  • Location
    内存位置读取从或写入的地址。

  • 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(volatile 关键字解释)

Hh875058.collapse_all(zh-cn,VS.110).gif_MoveFromCoprocessor,_MoveFromCoprocessor2

使用协处理器数据传输调整命令,这些内部函数读取从 ARM 协处理器的数据。

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
);

参数

  • coproc
    在 0 到 15 之间的协处理器数。

  • opcode1
    在 0 到 7 之间的协处理器特定操作码

  • crn
    协处理器寄存器编号,在 0 到 15 之间,指定第一个操作线程的命令。

  • crm
    协处理器寄存器编号,在 0 到 15 之间,指定一个不同的源或目标操作。

  • opcode2
    在 0 到 7 之间 . 的其他协处理器特定操作码。

返回值

从协处理器读取的值。

备注

此内部的全部五个参数的值必须是在编译时已知的常量表达式。

_MoveFromCoprocessor 使用 MRC 命令;_MoveFromCoprocessor2 使用 MRC2。 参数对应于中输入直接添加到指令字 bitfields。 参数的解释为协处理器相关。 有关更多信息,为相关的协处理器请参见参考线。

Hh875058.collapse_all(zh-cn,VS.110).gif_MoveFromCoprocessor64

使用协处理器数据传输调整命令,读取 ARM 协处理器的数据。

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

参数

  • coproc
    在 0 到 15 之间的协处理器数。

  • opcode1
    在 0 到 15 之间的协处理器特定操作码。

  • crm
    协处理器寄存器编号,在 0 到 15 之间,指定一个不同的源或目标操作。

返回值

从协处理器读取的值。

备注

此内部的所有三个参数的值必须是在编译时已知的常量表达式。

_MoveFromCoprocessor64 使用 MRRC 命令。 参数对应于中输入直接添加到指令字 bitfields。 参数的解释为协处理器相关。 有关更多信息,为相关的协处理器请参见参考线。

Hh875058.collapse_all(zh-cn,VS.110).gif_MoveToCoprocessor,_MoveToCoprocessor2

武装协处理器的这些内部函数写入数据使用协处理器数据传输调整命令。

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
);

参数

  • value
    对协处理器要写入的值。

  • coproc
    在 0 到 15 之间的协处理器数。

  • opcode1
    在 0 到 7 之间 . 的协处理器特定操作码。

  • crn
    协处理器寄存器编号,在 0 到 15 之间,指定第一个操作线程的命令。

  • crm
    协处理器寄存器编号,在 0 到 15 之间,指定一个不同的源或目标操作。

  • opcode2
    在 0 到 7 之间 . 的其他协处理器特定操作码。

返回值

无。

备注

coproc、opcode1、crn、crm和内部的 opcode2 参数的值必须是在编译时已知的常量表达式。

_MoveToCoprocessor 使用 MCR 命令;_MoveToCoprocessor2 使用 MCR2。 参数对应于中输入直接添加到指令字 bitfields。 参数的解释为协处理器相关。 有关更多信息,为相关的协处理器请参见参考线。

Hh875058.collapse_all(zh-cn,VS.110).gif_MoveToCoprocessor64

武装协处理器的这些内部函数写入数据使用协处理器数据传输调整命令。

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

参数

  • coproc
    在 0 到 15 之间的协处理器数。

  • opcode1
    在 0 到 15 之间的协处理器特定操作码。

  • crm
    协处理器寄存器编号,在 0 到 15 之间,指定一个不同的源或目标操作。

返回值

无。

备注

coproc、opcode1和内部的 crm 参数的值必须是在编译时已知的常量表达式。

_MoveFromCoprocessor64 使用 MCRR 命令。 参数对应于中输入直接添加到指令字 bitfields。 参数的解释为协处理器相关。 有关更多信息,为相关的协处理器请参见参考线。

可用于其他体系结构的内部函数支持

下表列出了在 ARM 平台支持的其他体系结构的内部。 如果内部的行为在 ARM 的与在其他硬件体系结构的行为不同,其他详细信息注意。

函数名

函数原型

__assume

无效__assume (int)

__code_seg

无效__code_seg (const char *)

__debugbreak

无效__cdecl __debugbreak (失效)

__fastfail

declspec(noreturn) 无效__fastfail (无符号整数)

__nop

无效__nop (失效)

说明说明
在 ARM 平台上,因此,如果一个在目标结构中,实现此功能生成 NOP 命令;否则,不会更改程序状态或 CPU 是生成有关示例的替代命令,MOV r8, r8。这是功能上等效于其他硬件体系结构的__nop 内部。由于没有给过程或 CPU 的状态的影响的命令可能由目标结构忽略作为一种优化方式,命令不一定消耗 CPU 周期。因此,不要使用__nop 内部操作代码序列的执行时间,除非您确定 CPU 有关如何将行为。相反,可以使用__nop 内部对齐下命令为特定 32 位边界地址。

__yield

无效__yield (失效)

说明说明
在 ARM 平台上,此功能生成 yield 命令,指示线程执行可以从执行 (例如暂时挂起的任务,spinlock 不会影响程序的。这使 CPU 执行其他任务。会浪费的执行循环内。

_AddressOfReturnAddress

void * _AddressOfReturnAddress (失效)

_BitScanForward

unsigned char _BitScanForward (unsigned long * _Index,无符号 long _Mask)

_BitScanReverse

unsigned char _BitScanReverse (unsigned long * _Index,无符号 long _Mask)

_bittest

_bittest unsigned char (长 const *,长)

_bittestandcomplement

unsigned char _bittestandcomplement (长*,长)

_bittestandreset

unsigned char _bittestandreset (长*,长)

_bittestandset

unsigned char _bittestandset (长*,长)

_byteswap_uint64

unsigned __int64 __cdecl _byteswap_uint64 (unsigned __int64)

_byteswap_ulong

无符号 long __cdecl _byteswap_ulong (unsigned long)

_byteswap_ushort

无符号短__cdecl _byteswap_ushort (unsigned short)

_disable

_disable 无效的__cdecl (失效)

说明说明
在 ARM 平台上,此功能生成 CPSID 命令;它只能用作内部。

_enable

_enable 无效的__cdecl (失效)

说明说明
在 ARM 平台上,此功能生成 CPSIE 命令;它只能用作内部。

_lrotl

无符号 long __cdecl _lrotl (unsigned long,int)

_lrotr

无符号 long __cdecl _lrotr (unsigned long,int)

_ReadBarrier

无效_ReadBarrier (失效)

_ReadWriteBarrier

无效_ReadWriteBarrier (失效)

_ReturnAddress

void * _ReturnAddress (失效)

_rotl

unsigned int __cdecl _rotl (unsigned int,int _Value _Shift)

_rotl16

无符号短_rotl16 (无符号短_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,int _Value _Shift)

_rotr16

无符号短_rotr16 (无符号短_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

无效_WriteBarrier (失效)

[氖]

联锁的内部

联锁的内部函数用于执行基本阅读修改写操作的组继承。 某些对所有平台是通用的。 它们分别列出此处,因为具有大量它们,但,因为它们的定义主要是多余的,一般来说考虑它们更容易。 其名称可用于派生的确切行为。

下表总结了可支持非 bittest 互锁的内部。 每个单元格在表中对应于通过追加操作名称处的行最左侧的单元格和列中最顶层的单元格的类型名称。_Interlocked的名称。 例如,在 Xor 行和列 8 的交集的单元格对应于 _InterlockedXor8 和完全支持。 大多数支持的功能提供这些选项后缀:_acq、_rel和 _nf。 _acq 后缀指示“get”语义,并 _rel 后缀指示语义“的版本”。 这些后缀 MSDN 的 IPF 文档。 _nf 或“不范围”后缀是唯一的武装和讨论在下一节。

8

16

32

64

P

添加

完全

完全

And

完全

完全

完全

完全

CompareExchange

完全

完全

完全

完全

完全

递减

完全

完全

完全

Exchange

Partial

Partial

Partial

Partial

Partial

ExchangeAdd

完全

完全

完全

完全

递增

完全

完全

完全

Or

完全

完全

完全

完全

Xor

完全

完全

完全

完全

密钥:

  • 完全:支持简单地,_acq、_rel和 _nf 窗体。

  • 部分:支持简单地,_acq和 _nf 窗体。

  • :不支持

Hh875058.collapse_all(zh-cn,VS.110).gif_nf (没有大小) 后缀

_nf 或“不范围”后缀指示操作不行为就如同任何内存屏障 这与其他三个窗体是 (无格式,_acq和 _rel),所有行为是障碍。 为 _nf 窗体的可能用途是维持值未以其他方式使用多个线程同时更新,但计数器的统计信息,并在多个线程正在执行时。

Hh875058.collapse_all(zh-cn,VS.110).gif列出互锁的内部

函数名

函数原型

_InterlockedAdd

长_InterlockedAdd (长_volatile *,长)

_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

长_InterlockedAdd_acq (长可变*,长)

_InterlockedAdd_nf

长_InterlockedAdd_nf (长可变*,长)

_InterlockedAdd_rel

长_InterlockedAdd_rel (长可变*,长)

_InterlockedAnd

长_InterlockedAnd (长可变*,长)

_InterlockedAnd16

短_InterlockedAnd16 (短变量*,短)

_InterlockedAnd16_acq

短_InterlockedAnd16_acq (短变量*,短)

_InterlockedAnd16_nf

短_InterlockedAnd16_nf (短变量*,短)

_InterlockedAnd16_rel

短_InterlockedAnd16_rel (短变量*,短)

_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

字符_InterlockedAnd8 (字符 volatile *,字符)

_InterlockedAnd8_acq

字符_InterlockedAnd8_acq (字符 volatile *,字符)

_InterlockedAnd8_nf

字符_InterlockedAnd8_nf (字符 volatile *,字符)

_InterlockedAnd8_rel

字符_InterlockedAnd8_rel (字符 volatile *,字符)

_InterlockedAnd_acq

长_InterlockedAnd_acq (长可变*,长)

_InterlockedAnd_nf

长_InterlockedAnd_nf (长可变*,长)

_InterlockedAnd_rel

长_InterlockedAnd_rel (长可变*,长)

_InterlockedCompareExchange

长__cdecl _InterlockedCompareExchange (长可变*,长,长)

_InterlockedCompareExchange16

短_InterlockedCompareExchange16 (短变量*,短,短)

_InterlockedCompareExchange16_acq

短_InterlockedCompareExchange16_acq (短变量*,短,短)

_InterlockedCompareExchange16_nf

短_InterlockedCompareExchange16_nf (短变量*,短,短)

_InterlockedCompareExchange16_rel

短_InterlockedCompareExchange16_rel (短变量*,短,短)

_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

字符_InterlockedCompareExchange8 (字符 volatile *,字符,字符)

_InterlockedCompareExchange8_acq

字符_InterlockedCompareExchange8_acq (字符 volatile *,字符,字符)

_InterlockedCompareExchange8_nf

字符_InterlockedCompareExchange8_nf (字符 volatile *,字符,字符)

_InterlockedCompareExchange8_rel

字符_InterlockedCompareExchange8_rel (字符 volatile *,字符,字符)

_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

长_InterlockedCompareExchange_acq (长可变*,长,长)

_InterlockedCompareExchange_nf

长_InterlockedCompareExchange_nf (长可变*,长,长)

_InterlockedCompareExchange_rel

长_InterlockedCompareExchange_rel (长可变*,长,长)

_InterlockedDecrement

长__cdecl _InterlockedDecrement (长可变*)

_InterlockedDecrement16

短_InterlockedDecrement16 (短变量*)

_InterlockedDecrement16_acq

短_InterlockedDecrement16_acq (短变量*)

_InterlockedDecrement16_nf

短_InterlockedDecrement16_nf (短变量*)

_InterlockedDecrement16_rel

短_InterlockedDecrement16_rel (短变量*)

_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

长_InterlockedDecrement_acq (长可变*)

_InterlockedDecrement_nf

长_InterlockedDecrement_nf (长可变*)

_InterlockedDecrement_rel

长_InterlockedDecrement_rel (长可变*)

_InterlockedExchange

长__cdecl _InterlockedExchange (长可变* _Target,长)

_InterlockedExchange16

短_InterlockedExchange16 (短变量* _Target,短)

_InterlockedExchange16_acq

短_InterlockedExchange16_acq (短变量* _Target,短)

_InterlockedExchange16_nf

短_InterlockedExchange16_nf (短变量* _Target,短)

_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

字符_InterlockedExchange8 (字符 volatile * _Target,字符)

_InterlockedExchange8_acq

字符_InterlockedExchange8_acq (字符 volatile * _Target,字符)

_InterlockedExchange8_nf

字符_InterlockedExchange8_nf (字符 volatile * _Target,字符)

_InterlockedExchangeAdd

长__cdecl _InterlockedExchangeAdd (长可变*,长)

_InterlockedExchangeAdd16

短_InterlockedExchangeAdd16 (短变量*,短)

_InterlockedExchangeAdd16_acq

短_InterlockedExchangeAdd16_acq (短变量*,短)

_InterlockedExchangeAdd16_nf

短_InterlockedExchangeAdd16_nf (短变量*,短)

_InterlockedExchangeAdd16_rel

短_InterlockedExchangeAdd16_rel (短变量*,短)

_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

字符_InterlockedExchangeAdd8 (字符 volatile *,字符)

_InterlockedExchangeAdd8_acq

字符_InterlockedExchangeAdd8_acq (字符 volatile *,字符)

_InterlockedExchangeAdd8_nf

字符_InterlockedExchangeAdd8_nf (字符 volatile *,字符)

_InterlockedExchangeAdd8_rel

字符_InterlockedExchangeAdd8_rel (字符 volatile *,字符)

_InterlockedExchangeAdd_acq

长_InterlockedExchangeAdd_acq (长可变*,长)

_InterlockedExchangeAdd_nf

长_InterlockedExchangeAdd_nf (长可变*,长)

_InterlockedExchangeAdd_rel

长_InterlockedExchangeAdd_rel (长可变*,长)

_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

长_InterlockedExchange_acq (长可变* _Target,长)

_InterlockedExchange_nf

长_InterlockedExchange_nf (长可变* _Target,长)

_InterlockedIncrement

长__cdecl _InterlockedIncrement (长可变*)

_InterlockedIncrement16

短_InterlockedIncrement16 (短变量*)

_InterlockedIncrement16_acq

短_InterlockedIncrement16_acq (短变量*)

_InterlockedIncrement16_nf

短_InterlockedIncrement16_nf (短变量*)

_InterlockedIncrement16_rel

短_InterlockedIncrement16_rel (短变量*)

_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

长_InterlockedIncrement_acq (长可变*)

_InterlockedIncrement_nf

长_InterlockedIncrement_nf (长可变*)

_InterlockedIncrement_rel

长_InterlockedIncrement_rel (长可变*)

_InterlockedOr

长_InterlockedOr (长可变*,长)

_InterlockedOr16

短_InterlockedOr16 (短变量*,短)

_InterlockedOr16_acq

短_InterlockedOr16_acq (短变量*,短)

_InterlockedOr16_nf

短_InterlockedOr16_nf (短变量*,短)

_InterlockedOr16_rel

短_InterlockedOr16_rel (短变量*,短)

_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

字符_InterlockedOr8 (字符 volatile *,字符)

_InterlockedOr8_acq

字符_InterlockedOr8_acq (字符 volatile *,字符)

_InterlockedOr8_nf

字符_InterlockedOr8_nf (字符 volatile *,字符)

_InterlockedOr8_rel

字符_InterlockedOr8_rel (字符 volatile *,字符)

_InterlockedOr_acq

长_InterlockedOr_acq (长可变*,长)

_InterlockedOr_nf

长_InterlockedOr_nf (长可变*,长)

_InterlockedOr_rel

长_InterlockedOr_rel (长可变*,长)

_InterlockedXor

长_InterlockedXor (长可变*,长)

_InterlockedXor16

短_InterlockedXor16 (短变量*,短)

_InterlockedXor16_acq

短_InterlockedXor16_acq (短变量*,短)

_InterlockedXor16_nf

短_InterlockedXor16_nf (短变量*,短)

_InterlockedXor16_rel

短_InterlockedXor16_rel (短变量*,短)

_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

字符_InterlockedXor8 (字符 volatile *,字符)

_InterlockedXor8_acq

字符_InterlockedXor8_acq (字符 volatile *,字符)

_InterlockedXor8_nf

字符_InterlockedXor8_nf (字符 volatile *,字符)

_InterlockedXor8_rel

字符_InterlockedXor8_rel (字符 volatile *,字符)

_InterlockedXor_acq

长_InterlockedXor_acq (长可变*,长)

_InterlockedXor_nf

长_InterlockedXor_nf (长可变*,长)

_InterlockedXor_rel

长_InterlockedXor_rel (长可变*,长)

[氖]

Hh875058.collapse_all(zh-cn,VS.110).gif_interlockedbittest 内部

纯互锁的 bittest 内部对所有平台是通用的。 ARM 添加 _acq、_rel和 _nf 变量,修改操作的关卡语义,如 _nf (没有大小) 后缀 前面所述本文中。

函数名

函数原型

_interlockedbittestandreset

unsigned char _interlockedbittestandreset (长可变*,长)

_interlockedbittestandreset_acq

unsigned char _interlockedbittestandreset_acq (长可变*,长)

_interlockedbittestandreset_nf

unsigned char _interlockedbittestandreset_nf (长可变*,长)

_interlockedbittestandreset_rel

unsigned char _interlockedbittestandreset_rel (长可变*,长)

_interlockedbittestandset

unsigned char _interlockedbittestandset (长可变*,长)

_interlockedbittestandset_acq

unsigned char _interlockedbittestandset_acq (长可变*,长)

_interlockedbittestandset_nf

unsigned char _interlockedbittestandset_nf (长可变*,长)

_interlockedbittestandset_rel

unsigned char _interlockedbittestandset_rel (长可变*,长)

[氖]

请参见

参考

编译器内部函数

其他资源

ARM汇编引用

C++语言参考