建議使用 Visual Studio 2017

ARM 內建

 

如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件

Visual C++ 編譯器讓 ARM 架構上可使用下列內建函式。 如需有關 ARM 的詳細資訊,請參閱 ARM 資訊中心網站的 ARM 架構參考手冊ARM 組譯工具指南

ARM NEON 向量指令集擴充功能,提供類似通用於 x86 和 x64 架構處理器的 MMX 和 SSE 向量指令集中的單一指令多重資料 (SIMD) 功能。

支援 NEON 內建函式,並提供於標頭檔 arm_neon.h 中。 NEON 內建函式的 Visual C++ 編譯器支援類似 ARM 編譯器,而其已記錄在ARM 資訊中心網站上<附錄 G>的 ARM 編譯器工具鏈版本 4.1 編譯器參考

Visual C++ 編譯器及 ARM 編譯器的主要差異在於,Visual C++ 編譯器加入了 _exvldX 向量載入和儲存指令的 vstX 變異。 _ex 變異採取額外的參數,以指定指標引數的對齊,除此之外,與非 _ex 對應項目均相同。

函式名稱指令函式原型
_arm_smlalSMLAL__int64 _arm_smlal(__int64 _RdHiLo, int _Rn, int _Rm)
_arm_umlalUMLALunsigned __int64 _arm_umlal(unsigned __int64 _RdHiLo, unsigned int _Rn, unsigned int _Rm)
_arm_clzCLZunsigned int _arm_clz(unsigned int _Rm)
_arm_qaddQADDint _arm_qadd(int _Rm, int _Rn)
_arm_qdaddQDADDint _arm_qdadd(int _Rm, int _Rn)
_arm_qdsubQDSUBint _arm_qdsub(int _Rm, int _Rn)
_arm_qsubQSUBint _arm_qsub(int _Rm, int _Rn)
_arm_smlabbSMLABBint _arm_smlabb(int _Rn, int _Rm, int _Ra)
_arm_smlabtSMLABTint _arm_smlabt(int _Rn, int _Rm, int _Ra)
_arm_smlatbSMLATBint _arm_smlatb(int _Rn, int _Rm, int _Ra)
_arm_smlattSMLATTint _arm_smlatt(int _Rn, int _Rm, int _Ra)
_arm_smlalbbSMLALBB__int64 _arm_smlalbb(__int64 _RdHiLo, int _Rn, int _Rm)
_arm_smlalbtSMLALBT__int64 _arm_smlalbt(__int64 _RdHiLo, int _Rn, int _Rm)
_arm_smlaltbSMLALTB__int64 _arm_smlaltb(__int64 _RdHiLo, int _Rn, int _Rm)
_arm_smlalttSMLALTT__int64 _arm_smlaltt(__int64 _RdHiLo, int _Rn, int _Rm)
_arm_smlawbSMLAWBint _arm_smlawb(int _Rn, int _Rm, int _Ra)
_arm_smlawtSMLAWTint _arm_smlawt(int _Rn, int _Rm, int _Ra)
_arm_smulbbSMULBBint _arm_smulbb(int _Rn, int _Rm)
_arm_smulbtSMULBTint _arm_smulbt(int _Rn, int _Rm)
_arm_smultbSMULTBint _arm_smultb(int _Rn, int _Rm)
_arm_smulttSMULTTint _arm_smultt(int _Rn, int _Rm)
_arm_smulwbSMULWBint _arm_smulwb(int _Rn, int _Rm)
_arm_smulwtSMULWTint _arm_smulwt(int _Rn, int _Rm)
_arm_sadd16SADD16int _arm_sadd16(int _Rn, int _Rm)
_arm_sadd8SADD8int _arm_sadd8(int _Rn, int _Rm)
_arm_sasxSASXint _arm_sasx(int _Rn, int _Rm)
_arm_ssaxSSAXint _arm_ssax(int _Rn, int _Rm)
_arm_ssub16SSUB16int _arm_ssub16(int _Rn, int _Rm)
_arm_ssub8SSUB8int _arm_ssub8(int _Rn, int _Rm)
_arm_shadd16SHADD16int _arm_shadd16(int _Rn, int _Rm)
_arm_shadd8SHADD8int _arm_shadd8(int _Rn, int _Rm)
_arm_shasxSHASXint _arm_shasx(int _Rn, int _Rm)
_arm_shsaxSHSAXint _arm_shsax(int _Rn, int _Rm)
_arm_shsub16SHSUB16int _arm_shsub16(int _Rn, int _Rm)
_arm_shsub8SHSUB8int _arm_shsub8(int _Rn, int _Rm)
_arm_qadd16QADD16int _arm_qadd16(int _Rn, int _Rm)
_arm_qadd8QADD8int _arm_qadd8(int _Rn, int _Rm)
_arm_qasxQASXint _arm_qasx(int _Rn, int _Rm)
_arm_qsaxQSAXint _arm_qsax(int _Rn, int _Rm)
_arm_qsub16QSUB16int _arm_qsub16(int _Rn, int _Rm)
_arm_qsub8QSUB8int _arm_qsub8(int _Rn, int _Rm)
_arm_uadd16UADD16unsigned int _arm_uadd16(unsigned int _Rn, unsigned int _Rm)
_arm_uadd8UADD8unsigned int _arm_uadd8(unsigned int _Rn, unsigned int _Rm)
_arm_uasxUASXunsigned int _arm_uasx(unsigned int _Rn, unsigned int _Rm)
_arm_usaxUSAXunsigned int _arm_usax(unsigned int _Rn, unsigned int _Rm)
_arm_usub16USUB16unsigned int _arm_usub16(unsigned int _Rn, unsigned int _Rm)
_arm_usub8USUB8unsigned int _arm_usub8(unsigned int _Rn, unsigned int _Rm)
_arm_uhadd16UHADD16unsigned int _arm_uhadd16(unsigned int _Rn, unsigned int _Rm)
_arm_uhadd8UHADD8unsigned int _arm_uhadd8(unsigned int _Rn, unsigned int _Rm)
_arm_uhasxUHASXunsigned int _arm_uhasx(unsigned int _Rn, unsigned int _Rm)
_arm_uhsaxUHSAXunsigned int _arm_uhsax(unsigned int _Rn, unsigned int _Rm)
_arm_uhsub16UHSUB16unsigned int _arm_uhsub16(unsigned int _Rn, unsigned int _Rm)
_arm_uhsub8UHSUB8unsigned int _arm_uhsub8(unsigned int _Rn, unsigned int _Rm)
_arm_uqadd16UQADD16unsigned int _arm_uqadd16(unsigned int _Rn, unsigned int _Rm)
_arm_uqadd8UQADD8unsigned int _arm_uqadd8(unsigned int _Rn, unsigned int _Rm)
_arm_uqasxUQASXunsigned int _arm_uqasx(unsigned int _Rn, unsigned int _Rm)
_arm_uqsaxUQSAXunsigned int _arm_uqsax(unsigned int _Rn, unsigned int _Rm)
_arm_uqsub16UQSUB16unsigned int _arm_uqsub16(unsigned int _Rn, unsigned int _Rm)
_arm_uqsub8UQSUB8unsigned int _arm_uqsub8(unsigned int _Rn, unsigned int _Rm)
_arm_sxtabSXTABint _arm_sxtab(int _Rn, int _Rm, unsigned int _Rotation)
_arm_sxtab16SXTAB16int _arm_sxtab16(int _Rn, int _Rm, unsigned int _Rotation)
_arm_sxtahSXTAHint _arm_sxtah(int _Rn, int _Rm, unsigned int _Rotation)
_arm_uxtabUXTABunsigned int _arm_uxtab(unsigned int _Rn, unsigned int _Rm, unsigned int _Rotation)
_arm_uxtab16UXTAB16unsigned int _arm_uxta16b(unsigned int _Rn, unsigned int _Rm, unsigned int _Rotation)
_arm_uxtahUXTAHunsigned int _arm_uxtah(unsigned int _Rn, unsigned int _Rm, unsigned int _Rotation)
_arm_sxtbSXTBint _arm_sxtb(int _Rn, unsigned int _Rotation)
_arm_sxtb16SXTB16int _arm_sxtb16(int _Rn, unsigned int _Rotation)
_arm_sxthSXTHint _arm_sxth(int _Rn, unsigned int _Rotation)
_arm_uxtbUXTBunsigned int _arm_uxtb(unsigned int _Rn, unsigned int _Rotation)
_arm_uxtb16UXTB16unsigned int _arm_uxtb16(unsigned int _Rn, unsigned int _Rotation)
_arm_uxthUXTHunsigned int _arm_uxth(unsigned int _Rn, unsigned int _Rotation)
_arm_pkhbtPKHBTint _arm_pkhbt(int _Rn, int _Rm, unsigned int _Lsl_imm)
_arm_pkhtbPKHTBint _arm_pkhtb(int _Rn, int _Rm, unsigned int _Asr_imm)
_arm_usad8USAD8unsigned int _arm_usad8(unsigned int _Rn, unsigned int _Rm)
_arm_usada8USADA8unsigned int _arm_usada8(unsigned int _Rn, unsigned int _Rm, unsigned int _Ra)
_arm_ssatSSATint _arm_ssat(unsigned int _Sat_imm, _int _Rn, _ARMINTR_SHIFT_T _Shift_type, unsigned int _Shift_imm)
_arm_usatUSATint _arm_usat(unsigned int _Sat_imm, _int _Rn, _ARMINTR_SHIFT_T _Shift_type, unsigned int _Shift_imm)
_arm_ssat16SSAT16int _arm_ssat16(unsigned int _Sat_imm, _int _Rn)
_arm_usat16USAT16int _arm_usat16(unsigned int _Sat_imm, _int _Rn)
_arm_revREVunsigned int _arm_rev(unsigned int _Rm)
_arm_rev16REV16unsigned int _arm_rev16(unsigned int _Rm)
_arm_revshREVSHunsigned int _arm_revsh(unsigned int _Rm)
_arm_smladSMLADint _arm_smlad(int _Rn, int _Rm, int _Ra)
_arm_smladxSMLADXint _arm_smladx(int _Rn, int _Rm, int _Ra)
_arm_smlsdSMLSDint _arm_smlsd(int _Rn, int _Rm, int _Ra)
_arm_smlsdxSMLSDXint _arm_smlsdx(int _Rn, int _Rm, int _Ra)
_arm_smmlaSMMLAint _arm_smmla(int _Rn, int _Rm, int _Ra)
_arm_smmlarSMMLARint _arm_smmlar(int _Rn, int _Rm, int _Ra)
_arm_smmlsSMMLSint _arm_smmls(int _Rn, int _Rm, int _Ra)
_arm_smmlsrSMMLSRint _arm_smmlsr(int _Rn, int _Rm, int _Ra)
_arm_smmulSMMULint _arm_smmul(int _Rn, int _Rm)
_arm_smmulrSMMULRint _arm_smmulr(int _Rn, int _Rm)
_arm_smlaldSMLALD__int64 _arm_smlald(__int64 _RdHiLo, int _Rn, int _Rm)
_arm_smlaldxSMLALDX__int64 _arm_smlaldx(__int64 _RdHiLo, int _Rn, int _Rm)
_arm_smlsldSMLSLD__int64 _arm_smlsld(__int64 _RdHiLo, int _Rn, int _Rm)
_arm_smlsldxSMLSLDX__int64 _arm_smlsldx(__int64 _RdHiLo, int _Rn, int _Rm)
_arm_smuadSMUADint _arm_smuad(int _Rn, int _Rm)
_arm_smuadxSMUADXint _arm_muadxs(int _Rn, int _Rm)
_arm_smusdSMUSDint _arm_smusd(int _Rn, int _Rm)
_arm_smusdxSMUSDXint _arm_smusdx(int _Rn, int _Rm)
_arm_smullSMULL__int64 _arm_smull(int _Rn, int _Rm)
_arm_umullUMULLunsigned __int64 _arm_umull(unsigned int _Rn, unsigned int _Rm)
_arm_umaalUMAALunsigned __int64 _arm_umaal(unsigned int _RdLo, unsigned int _RdHi, unsigned int _Rn, unsigned int _Rm)
_arm_bfcBFCunsigned int _arm_bfc(unsigned int _Rd, unsigned int _Lsb, unsigned int _Width)
_arm_bfiBFIunsigned int _arm_bfi(unsigned int _Rd, unsigned int _Rn, unsigned int _Lsb, unsigned int _Width)
_arm_rbitRBITunsigned int _arm_rbit(unsigned int _Rm)
_arm_sbfxSBFXint _arm_sbfx(int _Rn, unsigned int _Lsb, unsigned int _Width)
_arm_ubfxUBFXunsigned int _arm_ubfx(unsigned int _Rn, unsigned int _Lsb, unsigned int _Width)
_arm_sdivSDIVint _arm_sdiv(int _Rn, int _Rm)
_arm_udivUDIVunsigned int _arm_udiv(unsigned int _Rn, unsigned int _Rm)
__cpsCPSvoid __cps(unsigned int _Ops, unsigned int _Flags, unsigned int _Mode)
__dmbDMBvoid __dmb(unsigned int _Type)

將記憶體屏障作業插入指令資料流中。 參數 _Type 會指定屏障強制執行的限制類型。

如需可以強制執行的限制類型的詳細資訊,請參閱記憶體屏障限制
__dsbDSBvoid __dsb(unsigned int _Type)

將記憶體屏障作業插入指令資料流中。 參數 _Type 會指定屏障強制執行的限制類型。

如需可以強制執行的限制類型的詳細資訊,請參閱記憶體屏障限制
__isbISBvoid __isb(unsigned int _Type)

將記憶體屏障作業插入指令資料流中。 參數 _Type 會指定屏障強制執行的限制類型。

如需可以強制執行的限制類型的詳細資訊,請參閱記憶體屏障限制
__emitvoid __emit(unsigned __int32 opcode)

將指定的指令,插入由編譯器輸出的指令資料流中。

 opcode 的值,必須是在編譯時期已知的常數運算式。 指令字組的大小是 16 位元,而且最高有效的 16 位元 opcode 會被忽略。

編譯器不會嘗試解譯 opcode 的內容,並在執行插入的指令之前,不會保證 CPU 或記憶體狀態。

編譯器假設執行插入指令之後,CPU 和記憶體的狀態為不變。 因此,會變更狀態的指令,可能會對由編譯器所產生的一般程式碼,造成不利的影響。

基於這個理由,只使用 emit 將會影響編譯器通常不處理的 CPU 狀態 (例如,副處理器狀態) 的指令插入,或用於實作以 declspec(naked) 宣告的函式。
__hvcHVCunsigned int __hvc(unsigned int, ...)
__iso_volatile_load16__int16 __iso_volatile_load16(const volatile __int16 *)

如需詳細資訊,請參閱 __iso_volatile_load/store 內建函式
__iso_volatile_load32__int32 __iso_volatile_load32(const volatile __int32 *)

如需詳細資訊,請參閱 __iso_volatile_load/store 內建函式
__iso_volatile_load64__int64 __iso_volatile_load64(const volatile __int64 *)

如需詳細資訊,請參閱 __iso_volatile_load/store 內建函式
__iso_volatile_load8__int8 __iso_volatile_load8(const volatile __int8 *)

如需詳細資訊,請參閱 __iso_volatile_load/store 內建函式
__iso_volatile_store16void __iso_volatile_store16(volatile __int16 *, __int16)

如需詳細資訊,請參閱 __iso_volatile_load/store 內建函式
__iso_volatile_store32void __iso_volatile_store32(volatile __int32 *, __int32)

如需詳細資訊,請參閱 __iso_volatile_load/store 內建函式
__iso_volatile_store64void __iso_volatile_store64(volatile __int64 *, __int64)

如需詳細資訊,請參閱 __iso_volatile_load/store 內建函式
__iso_volatile_store8void __iso_volatile_store8(volatile __int8 *, __int8)

如需詳細資訊,請參閱 __iso_volatile_load/store 內建函式
__ldrexdLDREXD__int64 __ldrexd(const volatile __int64 *)
__prefetchPLDvoid __cdecl __prefetch(const void *)

提供 PLD 記憶體提示給系統,通知可能很快就存取位於或接近指定位址的記憶體。 有些系統可能會選擇最佳化此記憶體存取模式,來增加執行階段效能。 不過,從 C++ 語言的觀點來看,函式沒有顯著的影響,而且可能根本不執行任何動作。
__rdpmccntr64unsigned __int64 __rdpmccntr64(void)
__sevSEVvoid __sev(void)
__static_assertvoid __static_assert(int, const char *)
__swiSVCunsigned int __swi(unsigned int, ...)
__trapBKPTint __trap(int, ...)
__wfeWFEvoid __wfe(void)
__wfiWFIvoid __wfi(void)
_AddSatIntQADDint _AddSatInt(int, int)
_CopyDoubleFromInt64double _CopyDoubleFromInt64(__int64)
_CopyFloatFromInt32float _CopyFloatFromInt32(__int32)
_CopyInt32FromFloat__int32 _CopyInt32FromFloat(float)
_CopyInt64FromDouble__int64 _CopyInt64FromDouble(double)
_CountLeadingOnesunsigned int _CountLeadingOnes(unsigned long)
_CountLeadingOnes64unsigned int _CountLeadingOnes64(unsigned __int64)
_CountLeadingSignsunsigned int _CountLeadingSigns(long)
_CountLeadingSigns64unsigned int _CountLeadingSigns64(__int64)
_CountLeadingZerosunsigned int _CountLeadingZeros(unsigned long)
_CountLeadingZeros64unsigned int _CountLeadingZeros64(unsigned __int64)
_CountOneBitsunsigned int _CountOneBits(unsigned long)
_CountOneBits64unsigned int _CountOneBits64(unsigned __int64)
_DAddSatIntQDADDint _DAddSatInt(int, int)
_DSubSatIntQDSUBint _DSubSatInt(int, int)
_isunorderedint _isunordered(double, double)
_isunorderedfint _isunorderedf(float, float)
_MoveFromCoprocessorMRCunsigned int _MoveFromCoprocessor(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)

使用副處理器資料傳輸指令,讀取 ARM 副處理器的資料。 如需詳細資訊,請參閱 _MoveFromCoprocessor, _MoveFromCoprocessor2
_MoveFromCoprocessor2MRC2unsigned int _MoveFromCoprocessor2(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)

使用副處理器資料傳輸指令,讀取 ARM 副處理器的資料。 如需詳細資訊,請參閱 _MoveFromCoprocessor, _MoveFromCoprocessor2
_MoveFromCoprocessor64MRRCunsigned __int64 _MoveFromCoprocessor64(unsigned int, unsigned int, unsigned int)

使用副處理器資料傳輸指令,讀取 ARM 副處理器的資料。 如需詳細資訊,請參閱 _MoveFromCoprocessor64
_MoveToCoprocessorMCRvoid _MoveToCoprocessor(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)

使用副處理器資料傳輸指令,讀取 ARM 副處理器的資料。 如需詳細資訊,請參閱 _MoveToCoprocessor, _MoveToCoprocessor2
_MoveToCoprocessor2MCR2void _MoveToCoprocessor2(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)

使用副處理器資料傳輸指令,讀取 ARM 副處理器的資料。 如需詳細資訊,請參閱 _MoveToCoprocessor, _MoveToCoprocessor2
_MoveToCoprocessor64MCRRvoid _MoveToCoprocessor64(unsigned __int64, unsigned int, unsigned int, unsigned int)

使用副處理器資料傳輸指令,讀取 ARM 副處理器的資料。 如需詳細資訊,請參閱 _MoveToCoprocessor64
_MulHighlong _MulHigh(long, long)
_MulUnsignedHighunsigned long _MulUnsignedHigh(unsigned long, unsigned long)
_ReadBankedRegMRSint _ReadBankedReg(int _Reg)
_ReadStatusRegMRSint _ReadStatusReg(int)
_SubSatIntQSUBint _SubSatInt(int, int)
_WriteBankedRegMSRvoid _WriteBankedReg(int _Value, int _Reg)
_WriteStatusRegMSRvoid _WriteStatusReg(int, int, int)

[NEON]

記憶體屏障限制

內建函式 __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。架構保留其他所有值。

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

參數

Location
要讀取或寫入的記憶體位置的位址。

Value (僅限儲存內建函式)
要寫入至指定記憶體位置的值。

傳回值 (僅限載入內建函式)

Location 所指定之記憶體位置的值。

備註

您可以使用 __iso_volatile_load8/16/32/64__iso_volatile_store8/16/32/64 內建函式,明確地執行不受編譯器最佳化約束的記憶體存取。 編譯器無法移除、合成 (synthetize),或變更這些作業的相對順序,但不會產生隱含硬體記憶體屏障。 因此,硬體可能仍然重新排列跨多個執行緒中可觀察到的記憶體存取。 更準確的說,這些內建函式相當於在 /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) 指標以容納暫時性變數。 不過,沒有使用暫時性指標做為引數的需求或建議;如果使用一般的非暫時性類型,則這些作業的語意都完全相同。

如需 /volatile:iso 命令列引數的詳細資訊,請參閱 /volatile (volatile 關鍵字轉譯)

_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 的副處理器專用 opcode

crn
副處理器暫存器編號,範圍介於 0 到 15,指定第一個指令的運算元。

crm
副處理器暫存器數目 (範圍在 0 到 15 之間),用以指定其他來源或目的地運算元。

opcode2
範圍 0 到 7 的其他副處理器專用 opcode。

傳回值

從副處理器讀取的值。

備註

此內建函式的所有五個參數值,必須是在編譯時期已知的常數運算式。

_MoveFromCoprocessor 使用 MRC 指令;_MoveFromCoprocessor2 使用 MRC2。 對應到位元欄位的參數,這些參數會直接編碼到指令文字中。 參數的解譯會因副處理器而異。 如需詳細資訊,請參閱該副處理器的手冊。

_MoveFromCoprocessor64

使用副處理器資料傳輸指令,讀取 ARM 副處理器的資料。

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

參數

coproc
副處理器數目,範圍在 0 到 15 之間。

opcode1
範圍 0 到 15 的副處理器專用 opcode。

crm
副處理器暫存器數目 (範圍在 0 到 15 之間),用以指定其他來源或目的地運算元。

傳回值

從副處理器讀取的值。

備註

此內建函式的所有三個參數值,必須是在編譯時期已知的常數運算式。

_MoveFromCoprocessor64 使用 MRRC 指令。 對應到位元欄位的參數,這些參數會直接編碼到指令文字中。 參數的解譯會因副處理器而異。 如需詳細資訊,請參閱該副處理器的手冊。

_MoveToCoprocessor, _MoveToCoprocessor2

這些內建函式會使用副處理器資料傳輸指令,將資料寫入 ARM 副處理器。

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 的副處理器專用 opcode。

crn
副處理器暫存器編號,範圍介於 0 到 15,指定第一個指令的運算元。

crm
副處理器暫存器數目 (範圍在 0 到 15 之間),用以指定其他來源或目的地運算元。

opcode2
範圍 0 到 7 的其他副處理器專用 opcode。

傳回值

無。

備註

此內建函式的 coprocopcode1crncrmopcode2 參數值,必須是在編譯時期已知的常數運算式。

_MoveToCoprocessor 使用 MCR 指令;_MoveToCoprocessor2 使用 MCR2。 對應到位元欄位的參數,這些參數會直接編碼到指令文字中。 參數的解譯會因副處理器而異。 如需詳細資訊,請參閱該副處理器的手冊。

_MoveToCoprocessor64

這些內建函式會使用副處理器資料傳輸指令,將資料寫入 ARM 副處理器。

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

參數

coproc
副處理器數目,範圍在 0 到 15 之間。

opcode1
範圍 0 到 15 的副處理器專用 opcode。

crm
副處理器暫存器數目 (範圍在 0 到 15 之間),用以指定其他來源或目的地運算元。

傳回值

無。

備註

此內建函式的 coprocopcode1crm 參數值,必須是在編譯時期已知的常數運算式。

_MoveFromCoprocessor64 使用 MCRR 指令。 對應到位元欄位的參數,這些參數會直接編碼到指令文字中。 參數的解譯會因副處理器而異。 如需詳細資訊,請參閱該副處理器的手冊。

下表列出 ARM 平台支援的其他架構的內建函式。 其中註明了內建函式的行為在 ARM 上與在其他硬體架構上有哪些不同的其他詳細資料。

函式名稱函式原型
__assumevoid __assume(int)
__code_segvoid __code_seg(const char *)
__debugbreakvoid __cdecl __debugbreak(void)
__fastfail__declspec(noreturn) void __fastfail(unsigned int)
__nopvoid __nop(void) Note: ARM 平台上,如果在目標架構實作其中一個函式,這個函式會產生 NOP 指令;否則,會產生不會變更程式或 CPU 狀態的替代指令 — 例如,MOV r8, r8。 這在功能上相當於其他硬體架構的內建函式 __nop。 因為最佳化因素,目標架構可能會略過不會影響程式或 CPU 狀態的指令,所以指令不一定會消耗 CPU 週期。 因此,請勿使用 __nop 內建函式來管理程式碼順序的執行時間,除非您確定 CPU 會有什麼反應。 但您可以使用內建函式 __nop,將下一個指令對齊特定 32 位元的界限位址。
__yieldvoid __yield(void) Note: 在 ARM 平台上,這個函式會產生 YIELD 指令,表示執行緒正在執行的工作可以暫時停止執行 (例如,執行緒同步鎖定),且不會對程式有不良的影響。 這可讓 CPU 在執行週期中執行其他工作,這樣才不會浪費。
_AddressOfReturnAddressvoid * _AddressOfReturnAddress(void)
_BitScanForwardunsigned char _BitScanForward(unsigned long * _Index, unsigned long _Mask)
_BitScanReverseunsigned char _BitScanReverse(unsigned long * _Index, unsigned long _Mask)
_bittestunsigned char _bittest(long const *, long)
_bittestandcomplementunsigned char _bittestandcomplement(long *, long)
_bittestandresetunsigned char _bittestandreset(long *, long)
_bittestandsetunsigned char _bittestandset(long *, long)
_byteswap_uint64unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64)
_byteswap_ulongunsigned long __cdecl _byteswap_ulong(unsigned long)
_byteswap_ushortunsigned short __cdecl _byteswap_ushort(unsigned short)
_disablevoid __cdecl _disable(void) Note: ARM 平台上,這個函式會產生 CPSID 指令;其只限於做為內建函式使用。
_enablevoid __cdecl _enable(void) Note: ARM 平台上,這個函式會產生 CPSIE 指令;其只限於做為內建函式使用。
_lrotlunsigned long __cdecl _lrotl(unsigned long, int)
_lrotrunsigned long __cdecl _lrotr(unsigned long, int)
_ReadBarriervoid _ReadBarrier(void)
_ReadWriteBarriervoid _ReadWriteBarrier(void)
_ReturnAddressvoid * _ReturnAddress(void)
_rotlunsigned int __cdecl _rotl(unsigned int _Value, int _Shift)
_rotl16unsigned short _rotl16(unsigned short _Value, unsigned char _Shift)
_rotl64unsigned __int64 __cdecl _rotl64(unsigned __int64 _Value, int _Shift)
_rotl8unsigned char _rotl8(unsigned char _Value, unsigned char _Shift)
_rotrunsigned int __cdecl _rotr(unsigned int _Value, int _Shift)
_rotr16unsigned short _rotr16(unsigned short _Value, unsigned char _Shift)
_rotr64unsigned __int64 __cdecl _rotr64(unsigned __int64 _Value, int _Shift)
_rotr8unsigned char _rotr8(unsigned char _Value, unsigned char _Shift)
_setjmpexint __cdecl _setjmpex(jmp_buf)
_WriteBarriervoid _WriteBarrier(void)

[NEON]

連鎖內建函式是一組內建函式,用來執行不可部分完成的讀取-修改-寫入作業。 其中有部分通用於所有平台。 因為有大量的連鎖內建函式,所以此處分別列出,由於它們的定義通常是重複的,所以很容易引起聯想。 它們的名稱可以用來得出確切的行為。

下表摘要說明非位元測試連鎖內建函式的 ARM 的支援。 在表中的每個儲存格對應的名稱,是將列的最左邊儲存格的作業名稱,和欄的最上方儲存格的類型名稱,附加至 _Interlocked 所衍生的名稱。 比方說,Xor 列和 8 欄交集處的儲存格會對應至 _InterlockedXor8,並受到完整支援。 大部分受支援的函式會提供這些選擇性的字尾:_acq_rel_nf_acq 字尾表示「取得」語意,_rel 字尾表示「釋放」語意。 _nf 或「無範圍」字尾是 ARM 專屬,會在下一節討論。

8163264P
Add全功能全功能
全功能全功能全功能全功能
CompareExchange全功能全功能全功能全功能全功能
遞減全功能全功能全功能
ExchangePartialPartialPartialPartialPartial
ExchangeAdd全功能全功能全功能全功能
遞增全功能全功能全功能
全功能全功能全功能全功能
Xor全功能全功能全功能全功能

關鍵字:

  • 完整:支援一般、_acq_rel_nf 形式。

  • 部分:支援一般、_acq_nf 形式。

  • :不支援

_nf (無範圍) 字尾

_nf 或「無範圍」字尾,表示不會以任何記憶體屏障類型進行作業。 這是與其他三種形式 (一般、_acq_rel) 的不同之處,其他三種形式都會有屏障類型的行為。 有一種 _nf 形式的可能用法,是要維護由多個執行緒同時更新,但多個執行緒正在執行時卻不會使用其值的統計資料計數器。

連鎖內建函式的清單

函式名稱函式原型
_InterlockedAddlong _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_acqlong _InterlockedAdd_acq(long volatile *, long)
_InterlockedAdd_nflong _InterlockedAdd_nf(long volatile *, long)
_InterlockedAdd_rellong _InterlockedAdd_rel(long volatile *, long)
_InterlockedAndlong _InterlockedAnd(long volatile *, long)
_InterlockedAnd16short _InterlockedAnd16(short volatile *, short)
_InterlockedAnd16_acqshort _InterlockedAnd16_acq(short volatile *, short)
_InterlockedAnd16_nfshort _InterlockedAnd16_nf(short volatile *, short)
_InterlockedAnd16_relshort _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)
_InterlockedAnd8char _InterlockedAnd8(char volatile *, char)
_InterlockedAnd8_acqchar _InterlockedAnd8_acq(char volatile *, char)
_InterlockedAnd8_nfchar _InterlockedAnd8_nf(char volatile *, char)
_InterlockedAnd8_relchar _InterlockedAnd8_rel(char volatile *, char)
_InterlockedAnd_acqlong _InterlockedAnd_acq(long volatile *, long)
_InterlockedAnd_nflong _InterlockedAnd_nf(long volatile *, long)
_InterlockedAnd_rellong _InterlockedAnd_rel(long volatile *, long)
_InterlockedCompareExchangelong __cdecl _InterlockedCompareExchange(long volatile *, long, long)
_InterlockedCompareExchange16short _InterlockedCompareExchange16(short volatile *, short, short)
_InterlockedCompareExchange16_acqshort _InterlockedCompareExchange16_acq(short volatile *, short, short)
_InterlockedCompareExchange16_nfshort _InterlockedCompareExchange16_nf(short volatile *, short, short)
_InterlockedCompareExchange16_relshort _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)
_InterlockedCompareExchange8char _InterlockedCompareExchange8(char volatile *, char, char)
_InterlockedCompareExchange8_acqchar _InterlockedCompareExchange8_acq(char volatile *, char, char)
_InterlockedCompareExchange8_nfchar _InterlockedCompareExchange8_nf(char volatile *, char, char)
_InterlockedCompareExchange8_relchar _InterlockedCompareExchange8_rel(char volatile *, char, char)
_InterlockedCompareExchangePointervoid * _InterlockedCompareExchangePointer(void * volatile *, void *, void *)
_InterlockedCompareExchangePointer_acqvoid * _InterlockedCompareExchangePointer_acq(void * volatile *, void *, void *)
_InterlockedCompareExchangePointer_nfvoid * _InterlockedCompareExchangePointer_nf(void * volatile *, void *, void *)
_InterlockedCompareExchangePointer_relvoid * _InterlockedCompareExchangePointer_rel(void * volatile *, void *, void *)
_InterlockedCompareExchange_acqlong _InterlockedCompareExchange_acq(long volatile *, long, long)
_InterlockedCompareExchange_nflong _InterlockedCompareExchange_nf(long volatile *, long, long)
_InterlockedCompareExchange_rellong _InterlockedCompareExchange_rel(long volatile *, long, long)
_InterlockedDecrementlong __cdecl _InterlockedDecrement(long volatile *)
_InterlockedDecrement16short _InterlockedDecrement16(short volatile *)
_InterlockedDecrement16_acqshort _InterlockedDecrement16_acq(short volatile *)
_InterlockedDecrement16_nfshort _InterlockedDecrement16_nf(short volatile *)
_InterlockedDecrement16_relshort _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_acqlong _InterlockedDecrement_acq(long volatile *)
_InterlockedDecrement_nflong _InterlockedDecrement_nf(long volatile *)
_InterlockedDecrement_rellong _InterlockedDecrement_rel(long volatile *)
_InterlockedExchangelong __cdecl _InterlockedExchange(long volatile * _Target, long)
_InterlockedExchange16short _InterlockedExchange16(short volatile * _Target, short)
_InterlockedExchange16_acqshort _InterlockedExchange16_acq(short volatile * _Target, short)
_InterlockedExchange16_nfshort _InterlockedExchange16_nf(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)
_InterlockedExchange8char _InterlockedExchange8(char volatile * _Target, char)
_InterlockedExchange8_acqchar _InterlockedExchange8_acq(char volatile * _Target, char)
_InterlockedExchange8_nfchar _InterlockedExchange8_nf(char volatile * _Target, char)
_InterlockedExchangeAddlong __cdecl _InterlockedExchangeAdd(long volatile *, long)
_InterlockedExchangeAdd16short _InterlockedExchangeAdd16(short volatile *, short)
_InterlockedExchangeAdd16_acqshort _InterlockedExchangeAdd16_acq(short volatile *, short)
_InterlockedExchangeAdd16_nfshort _InterlockedExchangeAdd16_nf(short volatile *, short)
_InterlockedExchangeAdd16_relshort _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)
_InterlockedExchangeAdd8char _InterlockedExchangeAdd8(char volatile *, char)
_InterlockedExchangeAdd8_acqchar _InterlockedExchangeAdd8_acq(char volatile *, char)
_InterlockedExchangeAdd8_nfchar _InterlockedExchangeAdd8_nf(char volatile *, char)
_InterlockedExchangeAdd8_relchar _InterlockedExchangeAdd8_rel(char volatile *, char)
_InterlockedExchangeAdd_acqlong _InterlockedExchangeAdd_acq(long volatile *, long)
_InterlockedExchangeAdd_nflong _InterlockedExchangeAdd_nf(long volatile *, long)
_InterlockedExchangeAdd_rellong _InterlockedExchangeAdd_rel(long volatile *, long)
_InterlockedExchangePointervoid * _InterlockedExchangePointer(void * volatile * _Target, void *)
_InterlockedExchangePointer_acqvoid * _InterlockedExchangePointer_acq(void * volatile * _Target, void *)
_InterlockedExchangePointer_nfvoid * _InterlockedExchangePointer_nf(void * volatile * _Target, void *)
_InterlockedExchange_acqlong _InterlockedExchange_acq(long volatile * _Target, long)
_InterlockedExchange_nflong _InterlockedExchange_nf(long volatile * _Target, long)
_InterlockedIncrementlong __cdecl _InterlockedIncrement(long volatile *)
_InterlockedIncrement16short _InterlockedIncrement16(short volatile *)
_InterlockedIncrement16_acqshort _InterlockedIncrement16_acq(short volatile *)
_InterlockedIncrement16_nfshort _InterlockedIncrement16_nf(short volatile *)
_InterlockedIncrement16_relshort _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_acqlong _InterlockedIncrement_acq(long volatile *)
_InterlockedIncrement_nflong _InterlockedIncrement_nf(long volatile *)
_InterlockedIncrement_rellong _InterlockedIncrement_rel(long volatile *)
_InterlockedOrlong _InterlockedOr(long volatile *, long)
_InterlockedOr16short _InterlockedOr16(short volatile *, short)
_InterlockedOr16_acqshort _InterlockedOr16_acq(short volatile *, short)
_InterlockedOr16_nfshort _InterlockedOr16_nf(short volatile *, short)
_InterlockedOr16_relshort _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)
_InterlockedOr8char _InterlockedOr8(char volatile *, char)
_InterlockedOr8_acqchar _InterlockedOr8_acq(char volatile *, char)
_InterlockedOr8_nfchar _InterlockedOr8_nf(char volatile *, char)
_InterlockedOr8_relchar _InterlockedOr8_rel(char volatile *, char)
_InterlockedOr_acqlong _InterlockedOr_acq(long volatile *, long)
_InterlockedOr_nflong _InterlockedOr_nf(long volatile *, long)
_InterlockedOr_rellong _InterlockedOr_rel(long volatile *, long)
_InterlockedXorlong _InterlockedXor(long volatile *, long)
_InterlockedXor16short _InterlockedXor16(short volatile *, short)
_InterlockedXor16_acqshort _InterlockedXor16_acq(short volatile *, short)
_InterlockedXor16_nfshort _InterlockedXor16_nf(short volatile *, short)
_InterlockedXor16_relshort _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)
_InterlockedXor8char _InterlockedXor8(char volatile *, char)
_InterlockedXor8_acqchar _InterlockedXor8_acq(char volatile *, char)
_InterlockedXor8_nfchar _InterlockedXor8_nf(char volatile *, char)
_InterlockedXor8_relchar _InterlockedXor8_rel(char volatile *, char)
_InterlockedXor_acqlong _InterlockedXor_acq(long volatile *, long)
_InterlockedXor_nflong _InterlockedXor_nf(long volatile *, long)
_InterlockedXor_rellong _InterlockedXor_rel(long volatile *, long)

[NEON]

_interlockedbittest 內建函式

一般的連鎖位元測試內建函式是通用於所有平台。 ARM 加入了 _acq_rel_nf 變數,而這只是修改屏障的作業語意,如稍早在本文的 _nf (無範圍) 字尾 中所述。

函式名稱函式原型
_interlockedbittestandresetunsigned char _interlockedbittestandreset(long volatile *, long)
_interlockedbittestandreset_acqunsigned char _interlockedbittestandreset_acq(long volatile *, long)
_interlockedbittestandreset_nfunsigned char _interlockedbittestandreset_nf(long volatile *, long)
_interlockedbittestandreset_relunsigned char _interlockedbittestandreset_rel(long volatile *, long)
_interlockedbittestandsetunsigned char _interlockedbittestandset(long volatile *, long)
_interlockedbittestandset_acqunsigned char _interlockedbittestandset_acq(long volatile *, long)
_interlockedbittestandset_nfunsigned char _interlockedbittestandset_nf(long volatile *, long)
_interlockedbittestandset_relunsigned char _interlockedbittestandset_rel(long volatile *, long)

[NEON]

編譯器內建
ARM Assembler Reference
C++ 語言參考

顯示: