4coder-non-source/test_data/lots_of_files/armintr.h

599 lines
29 KiB
C

/***
* armintr.h - definitions and declarations for ARM specific intrinsics
*
* Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
* This file contains constant definitions and external subroutine
* declarations for the ARM specific intriniscs
*
****/
#pragma once
#if !defined (_M_ARM)
#error This header is specific to ARM targets
#endif /* !defined (_M_ARM) */
#if defined (__cplusplus)
extern "C" {
#endif /* defined (__cplusplus) */
typedef enum _tag_ARMINTR_SHIFT_T
{
_ARM_LSR = 0,
_ARM_LSL = 1,
_ARM_ASR = 2,
_ARM_ROR = 3
}
_ARMINTR_SHIFT_T;
int __arm_gen_s_Rd_Rd (const unsigned int, int);
int __arm_gen_s_Rd_RdRn (const unsigned int, int, int);
int __arm_gen_s_Rd_RdRm (const unsigned int, int, int);
int __arm_gen_s_Rd_RnRm_g (const unsigned int, int, int);
int __arm_gen_s_Rd_RnRm_q (const unsigned int, int, int);
int __arm_gen_s_Rd_Rn (const unsigned int, int);
int __arm_gen_s_Rd_Rn_q (const unsigned int, int);
int __arm_gen_s_Rd_RnRm (const unsigned int, int, int);
int __arm_gen_s_Rd_Rm (const unsigned int, int);
int __arm_gen_s_Rd_Rm_q (const unsigned int, int);
int __arm_gen_s_Rd_Rm2 (const unsigned int, int);
__int64 __arm_gen_s_Rdn_RdnRmRs(const unsigned int, __int64, int, int);
__int64 __arm_gen_s_Rdn_RmRs (const unsigned int, int, int);
int __arm_gen_s_Rn_RmRs (const unsigned int, int, int);
int __arm_gen_s_Rn_RmRsRd (const unsigned int, int, int, int);
unsigned int __arm_gen_u_Rd_Rd (const unsigned int, unsigned int);
unsigned int __arm_gen_u_Rd_RdRn (const unsigned int, unsigned int, unsigned int);
unsigned int __arm_gen_u_Rd_RdRm (const unsigned int, unsigned int, unsigned int);
unsigned int __arm_gen_u_Rd_RnRm_g (const unsigned int, unsigned int, unsigned int);
unsigned int __arm_gen_u_Rd_Rn (const unsigned int, unsigned int);
unsigned int __arm_gen_u_Rd_RnRm (const unsigned int, unsigned int, unsigned int);
unsigned int __arm_gen_u_Rd_Rm (const unsigned int, unsigned int);
unsigned int __arm_gen_u_Rd_Rm2 (const unsigned int, unsigned int);
unsigned __int64 __arm_gen_u_Rdn_RdnRmRs(const unsigned int, unsigned __int64, unsigned int, unsigned int);
unsigned __int64 __arm_gen_u_Rdn_RmRs (const unsigned int, unsigned int, unsigned int);
unsigned int __arm_gen_u_Rn_RmRs (const unsigned int, unsigned int, unsigned int);
unsigned int __arm_gen_u_Rn_RmRsRd (const unsigned int, unsigned int, unsigned int, unsigned int);
#define _ARMINTR_ASSERT(exp, msg) __static_assert(exp, msg)
#define _ARMINTR_IN_RANGE(val, low, high) (((val) >= low) && ((val) <= high))
#define _ARMINTR_ASSERT_RANGE(val, low, high, name) \
(_ARMINTR_ASSERT(_ARMINTR_IN_RANGE((val), (low), (high)), name " is out of range '" #low " - " #high "'"))
#define _ARMINTR_ASSERT_ROT(rot) \
(_ARMINTR_ASSERT(((rot) & ~0x18U) == 0, "rotation must be 0, 8, 16, or 24"))
#define _ARMINTR_ASSERT_SAT_BIT(sat_bit, low, high) \
(_ARMINTR_ASSERT_RANGE((sat_bit), low, high, "saturation bit position")) // low, high intentionally not in (parentheses)
#if defined (_M_THUMB)
#define _ARMINTR_ASSERT_SAT_SHIFT(type, amt) \
(_ARMINTR_ASSERT(((type) == _ARM_LSL) || ((type) == _ARM_ASR), "shift type must be _ARM_LSL or _ARM_ASR"), \
_ARMINTR_ASSERT(((type) != _ARM_LSL) || _ARMINTR_IN_RANGE((amt), 0, 31), "shift is out of range '0 - 31'"), \
_ARMINTR_ASSERT(((type) != _ARM_ASR) || _ARMINTR_IN_RANGE((amt), 1, 31), "shift is out of range '1 - 31'"))
#else /* defined (_M_THUMB) */
#define _ARMINTR_ASSERT_SAT_SHIFT(type, amt) \
(_ARMINTR_ASSERT(((type) == _ARM_LSL) || ((type) == _ARM_ASR), "shift type must be _ARM_LSL or _ARM_ASR"), \
_ARMINTR_ASSERT(((type) != _ARM_LSL) || _ARMINTR_IN_RANGE((amt), 0, 31), "shift is out of range '0 - 31'"), \
_ARMINTR_ASSERT(((type) != _ARM_ASR) || _ARMINTR_IN_RANGE((amt), 1, 32), "shift is out of range '1 - 32'"))
#endif /* defined (_M_THUMB) */
#if defined (_M_THUMB)
#define _ARMINTR_ENCODE_XTROT(rot) (((rot) & 0x18U) << 17)
#define _ARMINTR_ENCODE_PKHSHIFT(shift) ((((shift) & 0x1CU) << 26) | (((shift) & 0x3U) << 22))
#define _ARMINTR_ENCODE_IMM5_16(imm) (((imm) & 0x1FU) << 16)
#define _ARMINTR_ENCODE_IMM5_7(imm) ((((imm) & 0x1CU) << 26) | (((imm) & 0x3U) << 22))
#define _ARMINTR_ENCODE_SAT_SH(type, amt) ((((type) & 2U) << 4) | _ARMINTR_ENCODE_IMM5_7(amt))
#define _ARMINTR_ENCODE_IMM4_16(bit) (((bit) & 0xFU) << 16)
#define _ARMINTR_BFC 0x0000F36FU
#define _ARMINTR_BFI 0x0000F360U
#define _ARMINTR_SBFX 0x0000F340U
#define _ARMINTR_UBFX 0x0000F3C0U
#define _ARMINTR_QADD 0xF080FA80U
#define _ARMINTR_QDADD 0xF090FA80U
#define _ARMINTR_QDSUB 0xF0B0FA80U
#define _ARMINTR_QSUB 0xF0A0FA80U
#define _ARMINTR_QADD16 0xF010FA90U
#define _ARMINTR_QADD8 0xF010FA80U
#define _ARMINTR_QASX 0xF010FAA0U
#define _ARMINTR_QSAX 0xF010FAE0U
#define _ARMINTR_QSUB16 0xF010FAD0U
#define _ARMINTR_QSUB8 0xF010FAC0U
#define _ARMINTR_SHADD16 0xF020FA90U
#define _ARMINTR_SHADD8 0xF020FA80U
#define _ARMINTR_SHASX 0xF020FAA0U
#define _ARMINTR_SHSAX 0xF020FAE0U
#define _ARMINTR_SHSUB16 0xF020FAD0U
#define _ARMINTR_SHSUB8 0xF020FAC0U
#define _ARMINTR_UHADD16 0xF060FA90U
#define _ARMINTR_UHADD8 0xF060FA80U
#define _ARMINTR_UHASX 0xF060FAA0U
#define _ARMINTR_UHSAX 0xF060FAE0U
#define _ARMINTR_UHSUB16 0xF060FAD0U
#define _ARMINTR_UHSUB8 0xF060FAC0U
#define _ARMINTR_UQADD16 0xF050FA90U
#define _ARMINTR_UQADD8 0xF050FA80U
#define _ARMINTR_UQASX 0xF050FAA0U
#define _ARMINTR_UQSAX 0xF050FAE0U
#define _ARMINTR_UQSUB16 0xF050FAD0U
#define _ARMINTR_UQSUB8 0xF050FAC0U
#define _ARMINTR_SXTAB 0xF080FA40U
#define _ARMINTR_SXTAB16 0xF080FA20U
#define _ARMINTR_SXTAH 0xF080FA00U
#define _ARMINTR_UXTAB 0xF080FA50U
#define _ARMINTR_UXTAB16 0xF080FA30U
#define _ARMINTR_UXTAH 0xF080FA10U
#define _ARMINTR_SXTB 0xF080FA4FU
#define _ARMINTR_SXTB16 0xF080FA2FU
#define _ARMINTR_SXTH 0xF080FA0FU
#define _ARMINTR_UXTB 0xF080FA5FU
#define _ARMINTR_UXTB16 0xF080FA3FU
#define _ARMINTR_UXTBH 0xF080FA1FU
#define _ARMINTR_PKHBT 0x0000EAC0U
#define _ARMINTR_PKHTB 0x0020EAC0U
#define _ARMINTR_USAD8 0xF000FB70U
#define _ARMINTR_USADA8 0x0000FB70U
#define _ARMINTR_SADD16 0xF000FA90U
#define _ARMINTR_SADD8 0xF000FA80U
#define _ARMINTR_SASX 0xF000FAA0U
#define _ARMINTR_SSAX 0xF000FAE0U
#define _ARMINTR_SSUB16 0xF000FAD0U
#define _ARMINTR_SSUB8 0xF000FAC0U
#define _ARMINTR_UADD16 0xF040FA90U
#define _ARMINTR_UADD8 0xF040FA80U
#define _ARMINTR_UASX 0xF040FAA0U
#define _ARMINTR_USAX 0xF040FAE0U
#define _ARMINTR_USUB16 0xF040FAD0U
#define _ARMINTR_USUB8 0xF040FAC0U
#define _ARMINTR_SSAT 0x0000F300U
#define _ARMINTR_USAT 0x0000F380U
#define _ARMINTR_SSAT16 0x0000F320U
#define _ARMINTR_USAT16 0x0000F3A0U
#define _ARMINTR_CLZ 0xF080FAB0U
#define _ARMINTR_RBIT 0xF0A0FA90U
#define _ARMINTR_REV 0xF080FA90U
#define _ARMINTR_REV16 0xF090FA90U
#define _ARMINTR_REVSH 0xF0B0FA90U
#define _ARMINTR_SMLAD 0x0000FB20U
#define _ARMINTR_SMLADX 0x0010FB20U
#define _ARMINTR_SMLSD 0x0000FB40U
#define _ARMINTR_SMLSDX 0x0010FB40U
#define _ARMINTR_SMMLA 0x0000FB50U
#define _ARMINTR_SMMLAR 0x0010FB50U
#define _ARMINTR_SMMLS 0x0000FB60U
#define _ARMINTR_SMMLSR 0x0010FB60U
#define _ARMINTR_SMLABB 0x0000FB10U
#define _ARMINTR_SMLABT 0x0010FB10U
#define _ARMINTR_SMLATB 0x0020FB10U
#define _ARMINTR_SMLATT 0x0030FB10U
#define _ARMINTR_SMLAWB 0x0000FB30U
#define _ARMINTR_SMLAWT 0x0010FB30U
#define _ARMINTR_SMULWB 0xF000FB30U
#define _ARMINTR_SMULWT 0xF010FB30U
#define _ARMINTR_SMULBB 0xF000FB10U
#define _ARMINTR_SMULBT 0xF010FB10U
#define _ARMINTR_SMULTB 0xF020FB10U
#define _ARMINTR_SMULTT 0xF030FB10U
#define _ARMINTR_SMULL 0x0000FB80U
#define _ARMINTR_SMMUL 0xF000FB50U
#define _ARMINTR_SMMULR 0xF010FB50U
#define _ARMINTR_SMUAD 0xF000FB20U
#define _ARMINTR_SMUADX 0xF010FB20U
#define _ARMINTR_SMUSD 0xF000FB40U
#define _ARMINTR_SMUSDX 0xF010FB40U
#define _ARMINTR_SMLALBB 0x0080FBC0U
#define _ARMINTR_SMLALBT 0x0090FBC0U
#define _ARMINTR_SMLALTB 0x00A0FBC0U
#define _ARMINTR_SMLALTT 0x00B0FBC0U
#define _ARMINTR_SMLALD 0x00C0FBC0U
#define _ARMINTR_SMLALDX 0x00D0FBC0U
#define _ARMINTR_SMLSLD 0x00C0FBD0U
#define _ARMINTR_SMLSLDX 0x00D0FBD0U
#define _ARMINTR_SMLAL 0x0000FBC0U
#define _ARMINTR_UMLAL 0x0000FBE0U
#define _ARMINTR_UMAAL 0x0060FBE0U
#define _ARMINTR_UMULL 0x0000FBA0U
#define _ARMINTR_SDIV 0xF0F0FB90U
#define _ARMINTR_UDIV 0xF0F0FBB0U
#define _ARMINTR_U_DDMx __arm_gen_u_Rd_RdRn
#define _ARMINTR_U_DMx __arm_gen_u_Rd_Rn
#define _ARMINTR_S_DMx __arm_gen_s_Rd_Rn
#else /* defined (_M_THUMB) */
#define _ARMINTR_ENCODE_XTROT(rot) (((rot) & 0x18U) << 7)
#define _ARMINTR_ENCODE_PKHSHIFT(shift) (((shift) & 0x1FU) << 7)
#define _ARMINTR_ENCODE_IMM5_16(imm) (((imm) & 0x1FU) << 16)
#define _ARMINTR_ENCODE_IMM5_7(imm) (((imm) & 0x1FU) << 7)
#define _ARMINTR_ENCODE_SAT_SH(type, amt) ((((type) & 2U) << 5) | _ARMINTR_ENCODE_IMM5_7(amt))
#define _ARMINTR_ENCODE_IMM4_16(bit) (((bit) & 0xFU) << 16)
#define _ARMINTR_BFC 0x07C0001FU
#define _ARMINTR_BFI 0x07C00010U
#define _ARMINTR_SBFX 0x07A00050U
#define _ARMINTR_UBFX 0x07E00050U
#define _ARMINTR_QADD 0x01000050U
#define _ARMINTR_QDADD 0x01400050U
#define _ARMINTR_QDSUB 0x01600050U
#define _ARMINTR_QSUB 0x01200050U
#define _ARMINTR_QADD16 0x06200F10U
#define _ARMINTR_QADD8 0x06200F90U
#define _ARMINTR_QASX 0x06200F30U
#define _ARMINTR_QSAX 0x06200F50U
#define _ARMINTR_QSUB16 0x06200F70U
#define _ARMINTR_QSUB8 0x06200FF0U
#define _ARMINTR_SHADD16 0x06300F10U
#define _ARMINTR_SHADD8 0x06300F90U
#define _ARMINTR_SHASX 0x06300F30U
#define _ARMINTR_SHSAX 0x06300F50U
#define _ARMINTR_SHSUB16 0x06300F70U
#define _ARMINTR_SHSUB8 0x06300FF0U
#define _ARMINTR_UHADD16 0x06700F10U
#define _ARMINTR_UHADD8 0x06700F90U
#define _ARMINTR_UHASX 0x06700F30U
#define _ARMINTR_UHSAX 0x06700F50U
#define _ARMINTR_UHSUB16 0x06700F70U
#define _ARMINTR_UHSUB8 0x06700FF0U
#define _ARMINTR_UQADD16 0x06600F10U
#define _ARMINTR_UQADD8 0x06600F90U
#define _ARMINTR_UQASX 0x06600F30U
#define _ARMINTR_UQSAX 0x06600F50U
#define _ARMINTR_UQSUB16 0x06600F70U
#define _ARMINTR_UQSUB8 0x06600FF0U
#define _ARMINTR_SXTAB 0x06A00070U
#define _ARMINTR_SXTAB16 0x06800070U
#define _ARMINTR_SXTAH 0x06B00070U
#define _ARMINTR_UXTAB 0x06E00070U
#define _ARMINTR_UXTAB16 0x06C00070U
#define _ARMINTR_UXTAH 0x06F00070U
#define _ARMINTR_SXTB 0x06AF0070U
#define _ARMINTR_SXTB16 0x068F0070U
#define _ARMINTR_SXTH 0x06BF0070U
#define _ARMINTR_UXTB 0x06EF0070U
#define _ARMINTR_UXTB16 0x06CF0070U
#define _ARMINTR_UXTBH 0x06FF0070U
#define _ARMINTR_PKHBT 0x06800010U
#define _ARMINTR_PKHTB 0x06800050U
#define _ARMINTR_USAD8 0x0780F010U
#define _ARMINTR_USADA8 0x07800010U
#define _ARMINTR_SADD16 0x06100F10U
#define _ARMINTR_SADD8 0x06100F90U
#define _ARMINTR_SASX 0x06100F30U
#define _ARMINTR_SSAX 0x06100F50U
#define _ARMINTR_SSUB16 0x06100F70U
#define _ARMINTR_SSUB8 0x06100FF0U
#define _ARMINTR_UADD16 0x06500F10U
#define _ARMINTR_UADD8 0x06500F90U
#define _ARMINTR_UASX 0x06500F30U
#define _ARMINTR_USAX 0x06500F50U
#define _ARMINTR_USUB16 0x06500F70U
#define _ARMINTR_USUB8 0x06500FF0U
#define _ARMINTR_SSAT 0x06A00010U
#define _ARMINTR_USAT 0x06E00010U
#define _ARMINTR_SSAT16 0x06A00F30U
#define _ARMINTR_USAT16 0x06E00F30U
#define _ARMINTR_CLZ 0x016F0F10U
#define _ARMINTR_RBIT 0x06FF0F30U
#define _ARMINTR_REV 0x06BF0F30U
#define _ARMINTR_REV16 0x06BF0FB0U
#define _ARMINTR_REVSH 0x06FF0FB0U
#define _ARMINTR_SMLAD 0x07000010U
#define _ARMINTR_SMLADX 0x07000030U
#define _ARMINTR_SMLSD 0x07000050U
#define _ARMINTR_SMLSDX 0x07000070U
#define _ARMINTR_SMMLA 0x07500010U
#define _ARMINTR_SMMLAR 0x07500030U
#define _ARMINTR_SMMLS 0x075000D0U
#define _ARMINTR_SMMLSR 0x075000F0U
#define _ARMINTR_SMLABB 0x01000080U
#define _ARMINTR_SMLABT 0x010000C0U
#define _ARMINTR_SMLATB 0x010000A0U
#define _ARMINTR_SMLATT 0x010000E0U
#define _ARMINTR_SMLAWB 0x01200080U
#define _ARMINTR_SMLAWT 0x012000C0U
#define _ARMINTR_SMULWB 0x012000A0U
#define _ARMINTR_SMULWT 0x012000E0U
#define _ARMINTR_SMULBB 0x01600080U
#define _ARMINTR_SMULBT 0x016000C0U
#define _ARMINTR_SMULTB 0x016000A0U
#define _ARMINTR_SMULTT 0x016000E0U
#define _ARMINTR_SMULL 0x00C00090U
#define _ARMINTR_SMMUL 0x0750F010U
#define _ARMINTR_SMMULR 0x0750F030U
#define _ARMINTR_SMUAD 0x0700F010U
#define _ARMINTR_SMUADX 0x0700F030U
#define _ARMINTR_SMUSD 0x0700F050U
#define _ARMINTR_SMUSDX 0x0700F070U
#define _ARMINTR_SMLALBB 0x01400080U
#define _ARMINTR_SMLALBT 0x014000C0U
#define _ARMINTR_SMLALTB 0x014000A0U
#define _ARMINTR_SMLALTT 0x014000E0U
#define _ARMINTR_SMLALD 0x07400010U
#define _ARMINTR_SMLALDX 0x07400030U
#define _ARMINTR_SMLSLD 0x07400050U
#define _ARMINTR_SMLSLDX 0x07400070U
#define _ARMINTR_SMLAL 0x00E00090U
#define _ARMINTR_UMLAL 0x00A00090U
#define _ARMINTR_UMAAL 0x00400090U
#define _ARMINTR_UMULL 0x00800090U
#define _ARMINTR_U_DDMx __arm_gen_u_Rd_RdRm
#define _ARMINTR_U_DMx __arm_gen_u_Rd_Rm
#define _ARMINTR_S_DMx __arm_gen_s_Rd_Rm
#endif /* defined (_M_THUMB) */
/* ARMv4 */
#define _arm_smlal(_RdHiLo, _Rn, _Rm) (__arm_gen_s_Rdn_RdnRmRs(_ARMINTR_SMLAL, (_RdHiLo), (_Rn), (_Rm)))
#define _arm_umlal(_RdHiLo, _Rn, _Rm) (__arm_gen_u_Rdn_RdnRmRs(_ARMINTR_UMLAL, (_RdHiLo), (_Rn), (_Rm)))
/* ARMv5E */
#define _arm_clz(_Rm) (__arm_gen_u_Rd_Rm2(_ARMINTR_CLZ, (_Rm)))
#define _arm_qadd(_Rm, _Rn) (__arm_gen_s_Rd_RnRm_q(_ARMINTR_QADD, (_Rn), (_Rm)))
#define _arm_qdadd(_Rm, _Rn) (__arm_gen_s_Rd_RnRm_q(_ARMINTR_QDADD, (_Rn), (_Rm)))
#define _arm_qdsub(_Rm, _Rn) (__arm_gen_s_Rd_RnRm_q(_ARMINTR_QDSUB, (_Rn), (_Rm)))
#define _arm_qsub(_Rm, _Rn) (__arm_gen_s_Rd_RnRm_q(_ARMINTR_QSUB, (_Rn), (_Rm)))
#define _arm_smlabb(_Rn, _Rm, _Ra) (__arm_gen_s_Rn_RmRsRd(_ARMINTR_SMLABB, (_Rn), (_Rm), (_Ra)))
#define _arm_smlabt(_Rn, _Rm, _Ra) (__arm_gen_s_Rn_RmRsRd(_ARMINTR_SMLABT, (_Rn), (_Rm), (_Ra)))
#define _arm_smlatb(_Rn, _Rm, _Ra) (__arm_gen_s_Rn_RmRsRd(_ARMINTR_SMLATB, (_Rn), (_Rm), (_Ra)))
#define _arm_smlatt(_Rn, _Rm, _Ra) (__arm_gen_s_Rn_RmRsRd(_ARMINTR_SMLATT, (_Rn), (_Rm), (_Ra)))
#define _arm_smlalbb(_RdHiLo, _Rn, _Rm) (__arm_gen_s_Rdn_RdnRmRs(_ARMINTR_SMLALBB, (_RdHiLo), (_Rn), (_Rm)))
#define _arm_smlalbt(_RdHiLo, _Rn, _Rm) (__arm_gen_s_Rdn_RdnRmRs(_ARMINTR_SMLALBT, (_RdHiLo), (_Rn), (_Rm)))
#define _arm_smlaltb(_RdHiLo, _Rn, _Rm) (__arm_gen_s_Rdn_RdnRmRs(_ARMINTR_SMLALTB, (_RdHiLo), (_Rn), (_Rm)))
#define _arm_smlaltt(_RdHiLo, _Rn, _Rm) (__arm_gen_s_Rdn_RdnRmRs(_ARMINTR_SMLALTT, (_RdHiLo), (_Rn), (_Rm)))
#define _arm_smlawb(_Rn, _Rm, _Ra) (__arm_gen_s_Rn_RmRsRd(_ARMINTR_SMLAWB, (_Rn), (_Rm), (_Ra)))
#define _arm_smlawt(_Rn, _Rm, _Ra) (__arm_gen_s_Rn_RmRsRd(_ARMINTR_SMLAWT, (_Rn), (_Rm), (_Ra)))
#define _arm_smulbb(_Rn, _Rm) (__arm_gen_s_Rn_RmRs(_ARMINTR_SMULBB, (_Rn), (_Rm)))
#define _arm_smulbt(_Rn, _Rm) (__arm_gen_s_Rn_RmRs(_ARMINTR_SMULBT, (_Rn), (_Rm)))
#define _arm_smultb(_Rn, _Rm) (__arm_gen_s_Rn_RmRs(_ARMINTR_SMULTB, (_Rn), (_Rm)))
#define _arm_smultt(_Rn, _Rm) (__arm_gen_s_Rn_RmRs(_ARMINTR_SMULTT, (_Rn), (_Rm)))
#define _arm_smulwb(_Rn, _Rm) (__arm_gen_s_Rn_RmRs(_ARMINTR_SMULWB, (_Rn), (_Rm)))
#define _arm_smulwt(_Rn, _Rm) (__arm_gen_s_Rn_RmRs(_ARMINTR_SMULWT, (_Rn), (_Rm)))
/* ARMv6 */
#define _arm_sadd16(_Rn, _Rm) (__arm_gen_s_Rd_RnRm_g(_ARMINTR_SADD16, (_Rn), (_Rm)))
#define _arm_sadd8(_Rn, _Rm) (__arm_gen_s_Rd_RnRm_g(_ARMINTR_SADD8, (_Rn), (_Rm)))
#define _arm_sasx(_Rn, _Rm) (__arm_gen_s_Rd_RnRm_g(_ARMINTR_SASX, (_Rn), (_Rm)))
#define _arm_ssax(_Rn, _Rm) (__arm_gen_s_Rd_RnRm_g(_ARMINTR_SSAX, (_Rn), (_Rm)))
#define _arm_ssub16(_Rn, _Rm) (__arm_gen_s_Rd_RnRm_g(_ARMINTR_SSUB16, (_Rn), (_Rm)))
#define _arm_ssub8(_Rn, _Rm) (__arm_gen_s_Rd_RnRm_g(_ARMINTR_SSUB8, (_Rn), (_Rm)))
#define _arm_shadd16(_Rn, _Rm) (__arm_gen_s_Rd_RnRm(_ARMINTR_SHADD16, (_Rn), (_Rm)))
#define _arm_shadd8(_Rn, _Rm) (__arm_gen_s_Rd_RnRm(_ARMINTR_SHADD8, (_Rn), (_Rm)))
#define _arm_shasx(_Rn, _Rm) (__arm_gen_s_Rd_RnRm(_ARMINTR_SHASX, (_Rn), (_Rm)))
#define _arm_shsax(_Rn, _Rm) (__arm_gen_s_Rd_RnRm(_ARMINTR_SHSAX, (_Rn), (_Rm)))
#define _arm_shsub16(_Rn, _Rm) (__arm_gen_s_Rd_RnRm(_ARMINTR_SHSUB16, (_Rn), (_Rm)))
#define _arm_shsub8(_Rn, _Rm) (__arm_gen_s_Rd_RnRm(_ARMINTR_SHSUB8, (_Rn), (_Rm)))
#define _arm_qadd16(_Rn, _Rm) (__arm_gen_s_Rd_RnRm(_ARMINTR_QADD16, (_Rn), (_Rm)))
#define _arm_qadd8(_Rn, _Rm) (__arm_gen_s_Rd_RnRm(_ARMINTR_QADD8, (_Rn), (_Rm)))
#define _arm_qasx(_Rn, _Rm) (__arm_gen_s_Rd_RnRm(_ARMINTR_QASX, (_Rn), (_Rm)))
#define _arm_qsax(_Rn, _Rm) (__arm_gen_s_Rd_RnRm(_ARMINTR_QSAX, (_Rn), (_Rm)))
#define _arm_qsub16(_Rn, _Rm) (__arm_gen_s_Rd_RnRm(_ARMINTR_QSUB16, (_Rn), (_Rm)))
#define _arm_qsub8(_Rn, _Rm) (__arm_gen_s_Rd_RnRm(_ARMINTR_QSUB8, (_Rn), (_Rm)))
#define _arm_uadd16(_Rn, _Rm) (__arm_gen_u_Rd_RnRm_g(_ARMINTR_UADD16, (_Rn), (_Rm)))
#define _arm_uadd8(_Rn, _Rm) (__arm_gen_u_Rd_RnRm_g(_ARMINTR_UADD8, (_Rn), (_Rm)))
#define _arm_uasx(_Rn, _Rm) (__arm_gen_u_Rd_RnRm_g(_ARMINTR_UASX, (_Rn), (_Rm)))
#define _arm_usax(_Rn, _Rm) (__arm_gen_u_Rd_RnRm_g(_ARMINTR_USAX, (_Rn), (_Rm)))
#define _arm_usub16(_Rn, _Rm) (__arm_gen_u_Rd_RnRm_g(_ARMINTR_USUB16, (_Rn), (_Rm)))
#define _arm_usub8(_Rn, _Rm) (__arm_gen_u_Rd_RnRm_g(_ARMINTR_USUB8, (_Rn), (_Rm)))
#define _arm_uhadd16(_Rn, _Rm) (__arm_gen_u_Rd_RnRm(_ARMINTR_UHADD16, (_Rn), (_Rm)))
#define _arm_uhadd8(_Rn, _Rm) (__arm_gen_u_Rd_RnRm(_ARMINTR_UHADD8, (_Rn), (_Rm)))
#define _arm_uhasx(_Rn, _Rm) (__arm_gen_u_Rd_RnRm(_ARMINTR_UHASX, (_Rn), (_Rm)))
#define _arm_uhsax(_Rn, _Rm) (__arm_gen_u_Rd_RnRm(_ARMINTR_UHSAX, (_Rn), (_Rm)))
#define _arm_uhsub16(_Rn, _Rm) (__arm_gen_u_Rd_RnRm(_ARMINTR_UHSUB16, (_Rn), (_Rm)))
#define _arm_uhsub8(_Rn, _Rm) (__arm_gen_u_Rd_RnRm(_ARMINTR_UHSUB8, (_Rn), (_Rm)))
#define _arm_uqadd16(_Rn, _Rm) (__arm_gen_u_Rd_RnRm(_ARMINTR_UQADD16, (_Rn), (_Rm)))
#define _arm_uqadd8(_Rn, _Rm) (__arm_gen_u_Rd_RnRm(_ARMINTR_UQADD8, (_Rn), (_Rm)))
#define _arm_uqasx(_Rn, _Rm) (__arm_gen_u_Rd_RnRm(_ARMINTR_UQASX, (_Rn), (_Rm)))
#define _arm_uqsax(_Rn, _Rm) (__arm_gen_u_Rd_RnRm(_ARMINTR_UQSAX, (_Rn), (_Rm)))
#define _arm_uqsub16(_Rn, _Rm) (__arm_gen_u_Rd_RnRm(_ARMINTR_UQSUB16, (_Rn), (_Rm)))
#define _arm_uqsub8(_Rn, _Rm) (__arm_gen_u_Rd_RnRm(_ARMINTR_UQSUB8, (_Rn), (_Rm)))
#define _arm_sxtab(_Rn, _Rm, _Rotation) (_ARMINTR_ASSERT_ROT(_Rotation), __arm_gen_s_Rd_RnRm(_ARMINTR_SXTAB | _ARMINTR_ENCODE_XTROT(_Rotation), (_Rn), (_Rm)))
#define _arm_sxtab16(_Rn, _Rm, _Rotation) (_ARMINTR_ASSERT_ROT(_Rotation), __arm_gen_s_Rd_RnRm(_ARMINTR_SXTAB16 | _ARMINTR_ENCODE_XTROT(_Rotation), (_Rn), (_Rm)))
#define _arm_sxtah(_Rn, _Rm, _Rotation) (_ARMINTR_ASSERT_ROT(_Rotation), __arm_gen_s_Rd_RnRm(_ARMINTR_SXTAH | _ARMINTR_ENCODE_XTROT(_Rotation), (_Rn), (_Rm)))
#define _arm_uxtab(_Rn, _Rm, _Rotation) (_ARMINTR_ASSERT_ROT(_Rotation), __arm_gen_u_Rd_RnRm(_ARMINTR_UXTAB | _ARMINTR_ENCODE_XTROT(_Rotation), (_Rn), (_Rm)))
#define _arm_uxtab16(_Rn, _Rm, _Rotation) (_ARMINTR_ASSERT_ROT(_Rotation), __arm_gen_u_Rd_RnRm(_ARMINTR_UXTAB16 | _ARMINTR_ENCODE_XTROT(_Rotation), (_Rn), (_Rm)))
#define _arm_uxtah(_Rn, _Rm, _Rotation) (_ARMINTR_ASSERT_ROT(_Rotation), __arm_gen_u_Rd_RnRm(_ARMINTR_UXTAH | _ARMINTR_ENCODE_XTROT(_Rotation), (_Rn), (_Rm)))
#define _arm_sxtb(_Rn, _Rotation) (_ARMINTR_ASSERT_ROT(_Rotation), __arm_gen_s_Rd_Rm(_ARMINTR_SXTB | _ARMINTR_ENCODE_XTROT(_Rotation), (_Rn)))
#define _arm_sxtb16(_Rn, _Rotation) (_ARMINTR_ASSERT_ROT(_Rotation), __arm_gen_s_Rd_Rm(_ARMINTR_SXTB16 | _ARMINTR_ENCODE_XTROT(_Rotation), (_Rn)))
#define _arm_sxth(_Rn, _Rotation) (_ARMINTR_ASSERT_ROT(_Rotation), __arm_gen_s_Rd_Rm(_ARMINTR_SXTH | _ARMINTR_ENCODE_XTROT(_Rotation), (_Rn)))
#define _arm_uxtb(_Rn, _Rotation) (_ARMINTR_ASSERT_ROT(_Rotation), __arm_gen_u_Rd_Rm(_ARMINTR_UXTB | _ARMINTR_ENCODE_XTROT(_Rotation), (_Rn)))
#define _arm_uxtb16(_Rn, _Rotation) (_ARMINTR_ASSERT_ROT(_Rotation), __arm_gen_u_Rd_Rm(_ARMINTR_UXTB16 | _ARMINTR_ENCODE_XTROT(_Rotation), (_Rn)))
#define _arm_uxth(_Rn, _Rotation) (_ARMINTR_ASSERT_ROT(_Rotation), __arm_gen_u_Rd_Rm(_ARMINTR_UXTBH | _ARMINTR_ENCODE_XTROT(_Rotation), (_Rn)))
#define _arm_pkhbt(_Rn, _Rm, _Lsl_imm) (_ARMINTR_ASSERT_RANGE((_Lsl_imm), 0, 31, "logical left shift"), \
__arm_gen_s_Rd_RnRm(_ARMINTR_PKHBT | _ARMINTR_ENCODE_PKHSHIFT(_Lsl_imm), (_Rn), (_Rm)))
#define _arm_pkhtb(_Rn, _Rm, _Asr_imm) (_ARMINTR_ASSERT_RANGE((_Asr_imm), 1, 32, "arithmetic right shift"), \
__arm_gen_s_Rd_RnRm(_ARMINTR_PKHTB | _ARMINTR_ENCODE_PKHSHIFT(_Asr_imm), (_Rn), (_Rm)))
#define _arm_usad8(_Rn, _Rm) (__arm_gen_u_Rn_RmRs(_ARMINTR_USAD8, (_Rn), (_Rm)))
#define _arm_usada8(_Rn, _Rm, _Ra) (__arm_gen_u_Rn_RmRsRd(_ARMINTR_USADA8, (_Rn), (_Rm), (_Ra)))
#define _arm_ssat(_Sat_imm, _Rn, _Shift_type, _Shift_imm) (_ARMINTR_ASSERT_SAT_BIT((_Sat_imm), 1, 32), _ARMINTR_ASSERT_SAT_SHIFT((_Shift_type), (_Shift_imm)), \
_ARMINTR_S_DMx(_ARMINTR_SSAT | _ARMINTR_ENCODE_IMM5_16((_Sat_imm) - 1) | _ARMINTR_ENCODE_SAT_SH((_Shift_type), (_Shift_imm)), (_Rn)))
#define _arm_usat(_Sat_imm, _Rn, _Shift_type, _Shift_imm) (_ARMINTR_ASSERT_SAT_BIT((_Sat_imm), 0, 31), _ARMINTR_ASSERT_SAT_SHIFT((_Shift_type), (_Shift_imm)), \
_ARMINTR_S_DMx(_ARMINTR_USAT | _ARMINTR_ENCODE_IMM5_16(_Sat_imm) | _ARMINTR_ENCODE_SAT_SH((_Shift_type), (_Shift_imm)), (_Rn)))
#define _arm_ssat16(_Sat_imm, _Rn) (_ARMINTR_ASSERT_SAT_BIT((_Sat_imm), 1, 16), \
_ARMINTR_S_DMx(_ARMINTR_SSAT16 | _ARMINTR_ENCODE_IMM4_16((_Sat_imm) - 1), (_Rn)))
#define _arm_usat16(_Sat_imm, _Rn) (_ARMINTR_ASSERT_SAT_BIT((_Sat_imm), 0, 15), \
_ARMINTR_S_DMx(_ARMINTR_USAT16 | _ARMINTR_ENCODE_IMM4_16(_Sat_imm), (_Rn)))
#define _arm_rev(_Rm) (__arm_gen_u_Rd_Rm2(_ARMINTR_REV, (_Rm)))
#define _arm_rev16(_Rm) (__arm_gen_u_Rd_Rm2(_ARMINTR_REV16, (_Rm)))
#define _arm_revsh(_Rm) (__arm_gen_s_Rd_Rm2(_ARMINTR_REVSH, (_Rm)))
#define _arm_smlad(_Rn, _Rm, _Ra) (__arm_gen_s_Rn_RmRsRd(_ARMINTR_SMLAD, (_Rn), (_Rm), (_Ra)))
#define _arm_smladx(_Rn, _Rm, _Ra) (__arm_gen_s_Rn_RmRsRd(_ARMINTR_SMLADX, (_Rn), (_Rm), (_Ra)))
#define _arm_smlsd(_Rn, _Rm, _Ra) (__arm_gen_s_Rn_RmRsRd(_ARMINTR_SMLSD, (_Rn), (_Rm), (_Ra)))
#define _arm_smlsdx(_Rn, _Rm, _Ra) (__arm_gen_s_Rn_RmRsRd(_ARMINTR_SMLSDX, (_Rn), (_Rm), (_Ra)))
#define _arm_smmla(_Rn, _Rm, _Ra) (__arm_gen_s_Rn_RmRsRd(_ARMINTR_SMMLA, (_Rn), (_Rm), (_Ra)))
#define _arm_smmlar(_Rn, _Rm, _Ra) (__arm_gen_s_Rn_RmRsRd(_ARMINTR_SMMLAR, (_Rn), (_Rm), (_Ra)))
#define _arm_smmls(_Rn, _Rm, _Ra) (__arm_gen_s_Rn_RmRsRd(_ARMINTR_SMMLS, (_Rn), (_Rm), (_Ra)))
#define _arm_smmlsr(_Rn, _Rm, _Ra) (__arm_gen_s_Rn_RmRsRd(_ARMINTR_SMMLSR, (_Rn), (_Rm), (_Ra)))
#define _arm_smmul(_Rn, _Rm) (__arm_gen_s_Rn_RmRs(_ARMINTR_SMMUL, (_Rn), (_Rm)))
#define _arm_smmulr(_Rn, _Rm) (__arm_gen_s_Rn_RmRs(_ARMINTR_SMMULR, (_Rn), (_Rm)))
#define _arm_smlald(_RdHiLo, _Rn, _Rm) (__arm_gen_s_Rdn_RdnRmRs(_ARMINTR_SMLALD, (_RdHiLo), (_Rn), (_Rm)))
#define _arm_smlaldx(_RdHiLo, _Rn, _Rm) (__arm_gen_s_Rdn_RdnRmRs(_ARMINTR_SMLALDX, (_RdHiLo), (_Rn), (_Rm)))
#define _arm_smlsld(_RdHiLo, _Rn, _Rm) (__arm_gen_s_Rdn_RdnRmRs(_ARMINTR_SMLSLD, (_RdHiLo), (_Rn), (_Rm)))
#define _arm_smlsldx(_RdHiLo, _Rn, _Rm) (__arm_gen_s_Rdn_RdnRmRs(_ARMINTR_SMLSLDX, (_RdHiLo), (_Rn), (_Rm)))
#define _arm_smuad(_Rn, _Rm) (__arm_gen_s_Rn_RmRs(_ARMINTR_SMUAD, (_Rn), (_Rm)))
#define _arm_smuadx(_Rn, _Rm) (__arm_gen_s_Rn_RmRs(_ARMINTR_SMUADX, (_Rn), (_Rm)))
#define _arm_smusd(_Rn, _Rm) (__arm_gen_s_Rn_RmRs(_ARMINTR_SMUSD, (_Rn), (_Rm)))
#define _arm_smusdx(_Rn, _Rm) (__arm_gen_s_Rn_RmRs(_ARMINTR_SMUSDX, (_Rn), (_Rm)))
#define _arm_smull(_Rn, _Rm) (__arm_gen_s_Rdn_RmRs(_ARMINTR_SMULL, (_Rn), (_Rm)))
#define _arm_umull(_Rn, _Rm) (__arm_gen_u_Rdn_RmRs(_ARMINTR_UMULL, (_Rn), (_Rm)))
#define _arm_umaal(_RdLo, _RdHi, _Rn, _Rm) (__arm_gen_u_Rdn_RdnRmRs(_ARMINTR_UMAAL, ((unsigned __int64)(_RdHi) << 32) | (_RdLo), (_Rn), (_Rm)))
/* ARMv6T2 */
#define _arm_bfc(_Rd, _Lsb, _Width) (_ARMINTR_ASSERT_RANGE((_Lsb), 0, 31, "least significant bit"), _ARMINTR_ASSERT_RANGE((_Width), 1, 32-(_Lsb), "width"), \
__arm_gen_u_Rd_Rd(_ARMINTR_BFC | _ARMINTR_ENCODE_IMM5_7(_Lsb) | _ARMINTR_ENCODE_IMM5_16((_Lsb) + (_Width) - 1), (_Rd)))
#define _arm_bfi(_Rd, _Rn, _Lsb, _Width) (_ARMINTR_ASSERT_RANGE((_Lsb), 0, 31, "least significant bit"), _ARMINTR_ASSERT_RANGE((_Width), 1, 32-(_Lsb), "width"), \
_ARMINTR_U_DDMx(_ARMINTR_BFI | _ARMINTR_ENCODE_IMM5_7(_Lsb) | _ARMINTR_ENCODE_IMM5_16((_Lsb) + (_Width) - 1), (_Rd), (_Rn)))
#define _arm_rbit(_Rm) (__arm_gen_u_Rd_Rm2(_ARMINTR_RBIT, (_Rm)))
#define _arm_sbfx(_Rn, _Lsb, _Width) (_ARMINTR_ASSERT_RANGE((_Lsb), 0, 31, "least significant bit"), _ARMINTR_ASSERT_RANGE((_Width), 1, 32-(_Lsb), "width"), \
_ARMINTR_S_DMx(_ARMINTR_SBFX | _ARMINTR_ENCODE_IMM5_7(_Lsb) | _ARMINTR_ENCODE_IMM5_16((_Width) - 1), (_Rn)))
#define _arm_ubfx(_Rn, _Lsb, _Width) (_ARMINTR_ASSERT_RANGE((_Lsb), 0, 31, "least significant bit"), _ARMINTR_ASSERT_RANGE((_Width), 1, 32-(_Lsb), "width"), \
_ARMINTR_U_DMx(_ARMINTR_UBFX | _ARMINTR_ENCODE_IMM5_7(_Lsb) | _ARMINTR_ENCODE_IMM5_16((_Width) - 1), (_Rn)))
/* ARMv7 */
#if defined (_M_THUMB)
#define _arm_sdiv(_Rn, _Rm) (__arm_gen_s_Rd_RnRm(_ARMINTR_SDIV, (_Rn), (_Rm)))
#define _arm_udiv(_Rn, _Rm) (__arm_gen_u_Rd_RnRm(_ARMINTR_UDIV, (_Rn), (_Rm)))
#endif /* defined (_M_THUMB) */
typedef enum _tag_ARMINTR_CPS_OP
{
_ARM_CPS_ENABLE_INTERRUPTS = 1,
_ARM_CPS_DISABLE_INTERRUPTS = 2,
_ARM_CPS_CHANGE_MODE = 4
}
_ARMINTR_CPS_OP;
typedef enum _tag_ARMINTR_CPS_FLAG
{
_ARM_CPS_INTERRUPT_FLAG_F = 1,
_ARM_CPS_INTERRUPT_FLAG_I = 2,
_ARM_CPS_INTERRUPT_FLAG_A = 4
}
_ARMINTR_CPS_FLAG;
void __cps(unsigned int _Ops, unsigned int _Flags, unsigned int _Mode);
typedef enum _tag_ARMINTR_BARRIER_TYPE
{
_ARM_BARRIER_SY = 0xF,
_ARM_BARRIER_ST = 0xE,
_ARM_BARRIER_ISH = 0xB,
_ARM_BARRIER_ISHST = 0xA,
_ARM_BARRIER_NSH = 0x7,
_ARM_BARRIER_NSHST = 0x6,
_ARM_BARRIER_OSH = 0x3,
_ARM_BARRIER_OSHST = 0x2
}
_ARMINTR_BARRIER_TYPE;
void __dmb(unsigned int _Type);
void __dsb(unsigned int _Type);
void __isb(unsigned int _Type);
/* ARMv7VE */
typedef enum _tag_ARMINTR_BANKED_REG
{
_ARM_BANKED_R8_USR = 0x0,
_ARM_BANKED_R9_USR = 0x1,
_ARM_BANKED_R10_USR = 0x2,
_ARM_BANKED_R11_USR = 0x3,
_ARM_BANKED_R12_USR = 0x4,
_ARM_BANKED_R13_USR = 0x5,
_ARM_BANKED_SP_USR = 0x5,
_ARM_BANKED_R14_USR = 0x6,
_ARM_BANKED_LR_USR = 0x6,
_ARM_BANKED_R8_FIQ = 0x8,
_ARM_BANKED_R9_FIQ = 0x9,
_ARM_BANKED_R10_FIQ = 0xA,
_ARM_BANKED_R11_FIQ = 0xB,
_ARM_BANKED_R12_FIQ = 0xC,
_ARM_BANKED_R13_FIQ = 0xD,
_ARM_BANKED_SP_FIQ = 0xD,
_ARM_BANKED_R14_FIQ = 0xE,
_ARM_BANKED_LR_FIQ = 0xE,
_ARM_BANKED_R14_IRQ = 0x10,
_ARM_BANKED_LR_IRQ = 0x10,
_ARM_BANKED_R13_IRQ = 0x11,
_ARM_BANKED_SP_IRQ = 0x11,
_ARM_BANKED_R14_SVC = 0x12,
_ARM_BANKED_LR_SVC = 0x12,
_ARM_BANKED_R13_SVC = 0x13,
_ARM_BANKED_SP_SVC = 0x13,
_ARM_BANKED_R14_ABT = 0x14,
_ARM_BANKED_LR_ABT = 0x14,
_ARM_BANKED_R13_ABT = 0x15,
_ARM_BANKED_SP_ABT = 0x15,
_ARM_BANKED_R14_UND = 0x16,
_ARM_BANKED_LR_UND = 0x16,
_ARM_BANKED_R13_UND = 0x17,
_ARM_BANKED_SP_UND = 0x17,
_ARM_BANKED_R14_MON = 0x1C,
_ARM_BANKED_LR_MON = 0x1C,
_ARM_BANKED_R13_MON = 0x1D,
_ARM_BANKED_SP_MON = 0x1D,
_ARM_BANKED_ELR_HYP = 0x1E,
_ARM_BANKED_R13_HYP = 0x1F,
_ARM_BANKED_SP_HYP = 0x1F,
_ARM_BANKED_SPSR_FIQ = 0x2E,
_ARM_BANKED_SPSR_IRQ = 0x30,
_ARM_BANKED_SPSR_SVC = 0x32,
_ARM_BANKED_SPSR_ABT = 0x34,
_ARM_BANKED_SPSR_UND = 0x36,
_ARM_BANKED_SPSR_MON = 0x3C,
_ARM_BANKED_SPSR_HYP = 0x3E
};
void _WriteBankedReg(int _Value, int _Reg);
int _ReadBankedReg(int _Reg);
#ifdef __cplusplus
}
#endif /* __cplusplus */