You've already forked Frequency_Inverter
mirror of
https://github.com/Indemsys/Frequency_Inverter.git
synced 2026-04-20 09:54:32 +00:00
771 lines
24 KiB
C
771 lines
24 KiB
C
/**************************************************************************//**
|
|
* @file intrinsic_cw.h
|
|
* @brief CMSIS Cortex-M4 DSP SIMD Header File
|
|
* @version V1.00.1.0
|
|
* @date Dec-6-2012
|
|
*
|
|
******************************************************************************/
|
|
|
|
#ifndef __CW_CORTEX_M4_DSP_H__
|
|
#define __CW_CORTEX_M4_DSP_H__
|
|
|
|
/** @addtogroup CMSIS_CM4_DSP_intrinsics CM4 DSP Intrinsics
|
|
This file defines all CMSIS CM4 DSP intrinsics
|
|
@{
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ################### Compiler specific Intrinsics ########################### */
|
|
/*------ CM4 DSP Intrinsics ------------------------------------------------------*/
|
|
#define __SADD8 __sadd8
|
|
#define __QADD8 __qadd8
|
|
#define __SHADD8 __shadd8
|
|
#define __UADD8 __uadd8
|
|
#define __UQADD8 __uqadd8
|
|
#define __UHADD8 __uhadd8
|
|
#define __SSUB8 __ssub8
|
|
#define __QSUB8 __qsub8
|
|
#define __SHSUB8 __shsub8
|
|
#define __USUB8 __usub8
|
|
#define __UQSUB8 __uqsub8
|
|
#define __UHSUB8 __uhsub8
|
|
#define __SADD16 __sadd16
|
|
#define __QADD16 __qadd16
|
|
#define __SHADD16 __shadd16
|
|
#define __UADD16 __uadd16
|
|
#define __UQADD16 __uqadd16
|
|
#define __UHADD16 __uhadd16
|
|
#define __SSUB16 __ssub16
|
|
#define __QSUB16 __qsub16
|
|
#define __SHSUB16 __shsub16
|
|
#define __USUB16 __usub16
|
|
#define __UQSUB16 __uqsub16
|
|
#define __UHSUB16 __uhsub16
|
|
#define __SASX __sasx
|
|
#define __QASX __qasx
|
|
#define __SHASX __shasx
|
|
#define __UASX __uasx
|
|
#define __UQASX __uqasx
|
|
#define __UHASX __uhasx
|
|
#define __SSAX __ssax
|
|
#define __QSAX __qsax
|
|
#define __SHSAX __shsax
|
|
#define __USAX __usax
|
|
#define __UQSAX __uqsax
|
|
#define __UHSAX __uhsax
|
|
#define __USAD8 __usad8
|
|
#define __USADA8 __usada8
|
|
#define __UXTB16 __uxtb16
|
|
#define __UXTAB16 __uxtab16
|
|
#define __SXTB16 __sxtb16
|
|
#define __SXTAB16 __sxtab16
|
|
#define __SSAT16 __ssat16
|
|
#define __USAT16 __usat16
|
|
#define __SMUAD __smuad
|
|
#define __SMUADX __smuadx
|
|
#define __SMLAD __smlad
|
|
#define __SMLADX __smladx
|
|
#define __SMLALD __smlald
|
|
#define __SMLALDX __smlaldx
|
|
#define __SMUSD __smusd
|
|
#define __SMUSDX __smusdx
|
|
#define __SMLSD __smlsd
|
|
#define __SMLSDX __smlsdx
|
|
#define __SMLSLD __smlsld
|
|
#define __SMLSLDX __smlsldx
|
|
#define __SEL __sel
|
|
#define __QADD __qadd
|
|
#define __QSUB __qsub
|
|
/*-- End CM4 Intrinsics ----------------------------------------------------------*/
|
|
|
|
static inline unsigned int __SADD8(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SADD8(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
sadd8 res,op1,op2;
|
|
}
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __QADD8(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __QADD8(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
qadd8 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SHADD8(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SHADD8(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
shadd8 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __UADD8(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __UADD8(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
uadd8 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __UQADD8(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __UQADD8(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
uqadd8 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __UHADD8(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __UHADD8(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
uhadd8 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SSUB8(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SSUB8(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
ssub8 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __QSUB8(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __QSUB8(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
qsub8 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SHSUB8(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SHSUB8(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
shsub8 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __USUB8(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __USUB8(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
usub8 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __UQSUB8(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __UQSUB8(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
uqsub8 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __UHSUB8(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __UHSUB8(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
uhsub8 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SADD16(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SADD16(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
sadd16 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __QADD16(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __QADD16(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
qadd16 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SHADD16(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SHADD16(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
shadd16 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __UADD16(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __UADD16(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
uadd16 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __UQADD16(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __UQADD16(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
uqadd16 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __UHADD16(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __UHADD16(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
uhadd16 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SSUB16(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SSUB16(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
ssub16 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __QSUB16(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __QSUB16(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
qsub16 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SHSUB16(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SHSUB16(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
ssub16 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __USUB16(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __USUB16(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
usub16 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __UQSUB16(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __UQSUB16(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
uqsub16 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __UHSUB16(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __UHSUB16(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
uhsub16 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SASX(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SASX(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
sasx res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __QASX(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __QASX(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
qasx res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SHASX(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SHASX(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
shasx res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __UASX(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __UASX(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
uasx res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __UQASX(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __UQASX(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
uqasx res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __UHASX(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __UHASX(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
uhasx res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SSAX(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SSAX(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
ssax res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __QSAX(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __QSAX(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
qsax res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SHSAX(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SHSAX(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
shsax res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __USAX(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __USAX(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
usax res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __UQSAX(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __UQSAX(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
uqsax res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __UHSAX(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __UHSAX(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
uhsax res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __USAD8(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __USAD8(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
usad8 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __USADA8(register unsigned int op1, register unsigned int op2, register unsigned int op3) __attribute__((always_inline));
|
|
static inline unsigned int __USADA8(register unsigned int op1, register unsigned int op2, register unsigned int op3)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
usada8 res,op1,op2,op3;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SSAT16(register unsigned int op1, unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SSAT16(register unsigned int op1, unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm ("ssat16 %0, %1, %2" : "=r" (res) : "I" (op2), "r" (op1));
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __USAT16(register unsigned int op1, unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __USAT16(register unsigned int op1, unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm ("usat16 %0, %1, %2" : "=r" (res) : "I" (op2), "r" (op1));
|
|
return res;
|
|
}
|
|
/*#define __SSAT16(ARG1,ARG2) \
|
|
({ \
|
|
unsigned int __RES, __ARG1 = (ARG1); \
|
|
asm ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
|
|
__RES; \
|
|
})
|
|
*/
|
|
/*#define __USAT16(ARG1,ARG2) \
|
|
( \
|
|
asm {\
|
|
usat16 r0,#ARG2, ARG1\
|
|
}\
|
|
)
|
|
*/
|
|
|
|
static inline unsigned int __UXTB16(register unsigned int op1) __attribute__((always_inline));
|
|
static inline unsigned int __UXTB16(register unsigned int op1)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
uxtb16 res,op1;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __UXTAB16(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __UXTAB16(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
uxtab16 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SXTB16(register unsigned int op1) __attribute__((always_inline));
|
|
static inline unsigned int __SXTB16(register unsigned int op1)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
sxtb16 res,op1;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SXTAB16(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SXTAB16(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
sxtab16 res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SMUAD(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SMUAD(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register signed int res;
|
|
asm {
|
|
smuad res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SMUADX(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SMUADX(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
smuadx res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SMLAD(register unsigned int op1, register unsigned int op2, register unsigned int op3) __attribute__((always_inline));
|
|
static inline unsigned int __SMLAD(register unsigned int op1, register unsigned int op2, register unsigned int op3)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
smlad res,op1,op2,op3;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SMLADX(register unsigned int op1, register unsigned int op2, register unsigned int op3) __attribute__((always_inline));
|
|
static inline unsigned int __SMLADX(register unsigned int op1, register unsigned int op2, register unsigned int op3)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
smladx res,op1,op2,op3;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
static inline unsigned long long __SMLALD(register unsigned int op1, register unsigned int op2, register unsigned long long op3) __attribute__((always_inline));
|
|
static inline unsigned long long __SMLALD(register unsigned int op1, register unsigned int op2, register unsigned long long op3)
|
|
{
|
|
register unsigned int op3_H = (unsigned int)((op3) >> 32), op3_L = (unsigned int)((op3) & 0xFFFFFFFF);
|
|
unsigned long long res ;
|
|
asm {
|
|
smlald op3_L, op3_H, op1, op2;
|
|
}
|
|
res = op3_H;
|
|
return((res << 32) | op3_L);
|
|
}
|
|
|
|
static inline unsigned long long __SMLALDX(register unsigned int op1, register unsigned int op2, register unsigned long long op3) __attribute__((always_inline));
|
|
static inline unsigned long long __SMLALDX(register unsigned int op1, register unsigned int op2, register unsigned long long op3)
|
|
{
|
|
register unsigned int op3_H = (unsigned int)((op3) >> 32), op3_L = (unsigned int)((op3) & 0xFFFFFFFF);
|
|
unsigned long long res ;
|
|
asm {
|
|
smlaldx op3_L, op3_H, op1, op2;
|
|
}
|
|
|
|
res = op3_H;
|
|
return((res << 32) | op3_L);
|
|
}
|
|
|
|
/*#define __SMLALD(ARG1,ARG2,ARG3) \
|
|
({\
|
|
unsigned int __ARG1 = ARG1, __ARG2 = ARG2, __ARG3_H = (unsigned int)((ARG3) >> 32), __ARG3_L = (unsigned int)((ARG3) & 0xFFFFFFFF); \
|
|
asm { smlald __ARG3_L, __ARG3_H, __ARG1, __ARG2}\
|
|
})
|
|
|
|
#define __SMLALDX(ARG1,ARG2,ARG3) \
|
|
({\
|
|
unsigned int __ARG1 = ARG1, __ARG2 = ARG2, __ARG3_H = (unsigned int)((ARG3) >> 32), __ARG3_L = (unsigned int)((ARG3) & 0xFFFFFFFF); \
|
|
asm { smlaldx __ARG3_L, __ARG3_H, __ARG1, __ARG2}\
|
|
})
|
|
*/
|
|
static inline unsigned int __SMUSD(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SMUSD(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
smusd res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SMUSDX(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __SMUSDX(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
smusdx res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SMLSD(register unsigned int op1, register unsigned int op2, register unsigned int op3) __attribute__((always_inline));
|
|
static inline unsigned int __SMLSD(register unsigned int op1, register unsigned int op2, register unsigned int op3)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
smlsd res,op1,op2, op3;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned int __SMLSDX(register unsigned int op1, register unsigned int op2, register unsigned int op3) __attribute__((always_inline));
|
|
static inline unsigned int __SMLSDX(register unsigned int op1, register unsigned int op2, register unsigned int op3)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
smlsdx res,op1,op2,op3;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline unsigned long long __SMLSLD(register unsigned int op1, register unsigned int op2, register unsigned long long op3) __attribute__((always_inline));
|
|
static inline unsigned long long __SMLSLD(register unsigned int op1, register unsigned int op2, register unsigned long long op3)
|
|
{
|
|
register unsigned int op3_H = (unsigned int)((op3) >> 32), op3_L = (unsigned int)((op3) & 0xFFFFFFFF); \
|
|
unsigned long long res ;
|
|
asm {
|
|
smlsld op3_L, op3_H, op1, op2;
|
|
}
|
|
res = op3_H;
|
|
return((res << 32) | op3_L);
|
|
}
|
|
|
|
static inline unsigned long long __SMLSLDX(register unsigned int op1, register unsigned int op2, register unsigned long long op3) __attribute__((always_inline));
|
|
static inline unsigned long long __SMLSLDX(register unsigned int op1, register unsigned int op2, register unsigned long long op3)
|
|
{
|
|
register unsigned int op3_H = (unsigned int)((op3) >> 32), op3_L = (unsigned int)((op3) & 0xFFFFFFFF); \
|
|
unsigned long long res;
|
|
asm {
|
|
smlsldx op3_L, op3_H, op1, op2;
|
|
}
|
|
res = op3_H;
|
|
return((res << 32) | op3_L);
|
|
}
|
|
|
|
/*#define __SMLSLD(ARG1,ARG2,ARG3) \
|
|
({\
|
|
unsigned int __ARG1 = ARG1, __ARG2 = ARG2, __ARG3_H = (unsigned int)((ARG3) >> 32), __ARG3_L = (unsigned int)((ARG3) & 0xFFFFFFFF); \
|
|
asm { smlsld __ARG3_L, __ARG3_H, __ARG1, __ARG2}\
|
|
})
|
|
|
|
#define __SMLSLDX(ARG1,ARG2,ARG3) \
|
|
({\
|
|
unsigned int __ARG1 = ARG1, __ARG2 = ARG2, __ARG3_H = (unsigned int)((ARG3) >> 32), __ARG3_L = (unsigned int)((ARG3) & 0xFFFFFFFF); \
|
|
asm { smlsldx __ARG3_L, __ARG3_H, __ARG1, __ARG2}\
|
|
})
|
|
*/
|
|
static inline unsigned int __SEL(register unsigned int op1, register unsigned int op2) __attribute__((always_inline));
|
|
static inline unsigned int __sel(register unsigned int op1, register unsigned int op2)
|
|
{
|
|
register unsigned int res;
|
|
asm {
|
|
sel res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
/* ################### adding functions QADD QSUB ########################### */
|
|
|
|
static inline long __QADD(register long op1, register long op2) __attribute__((always_inline));
|
|
static inline long __qadd(register long op1, register long op2)
|
|
{
|
|
register long res;
|
|
asm {
|
|
QADD res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static inline long __QSUB(register long op1, register long op2) __attribute__((always_inline));
|
|
static inline long __qsub(register long op1, register long op2)
|
|
{
|
|
register long res;
|
|
asm {
|
|
QSUB res,op1,op2;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
#endif
|