core_cm4_simd.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649
  1. /**************************************************************************//**
  2. * @file core_cm4_simd.h
  3. * @brief CMSIS Cortex-M4 SIMD Header File
  4. * @version V3.01
  5. * @date 06. March 2012
  6. *
  7. * @note
  8. * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
  9. *
  10. * @par
  11. * ARM Limited (ARM) is supplying this software for use with Cortex-M
  12. * processor based microcontrollers. This file can be freely distributed
  13. * within development tools that are supporting such ARM based processors.
  14. *
  15. * @par
  16. * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
  17. * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
  18. * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
  19. * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
  20. * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
  21. *
  22. ******************************************************************************/
  23. #ifdef __cplusplus
  24. extern "C" {
  25. #endif
  26. #ifndef __CORE_CM4_SIMD_H
  27. #define __CORE_CM4_SIMD_H
  28. /*******************************************************************************
  29. * Hardware Abstraction Layer
  30. ******************************************************************************/
  31. /* ################### Compiler specific Intrinsics ########################### */
  32. /** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
  33. Access to dedicated SIMD instructions
  34. @{
  35. */
  36. #if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
  37. /* ARM armcc specific functions */
  38. /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
  39. #define __SADD8 __sadd8
  40. #define __QADD8 __qadd8
  41. #define __SHADD8 __shadd8
  42. #define __UADD8 __uadd8
  43. #define __UQADD8 __uqadd8
  44. #define __UHADD8 __uhadd8
  45. #define __SSUB8 __ssub8
  46. #define __QSUB8 __qsub8
  47. #define __SHSUB8 __shsub8
  48. #define __USUB8 __usub8
  49. #define __UQSUB8 __uqsub8
  50. #define __UHSUB8 __uhsub8
  51. #define __SADD16 __sadd16
  52. #define __QADD16 __qadd16
  53. #define __SHADD16 __shadd16
  54. #define __UADD16 __uadd16
  55. #define __UQADD16 __uqadd16
  56. #define __UHADD16 __uhadd16
  57. #define __SSUB16 __ssub16
  58. #define __QSUB16 __qsub16
  59. #define __SHSUB16 __shsub16
  60. #define __USUB16 __usub16
  61. #define __UQSUB16 __uqsub16
  62. #define __UHSUB16 __uhsub16
  63. #define __SASX __sasx
  64. #define __QASX __qasx
  65. #define __SHASX __shasx
  66. #define __UASX __uasx
  67. #define __UQASX __uqasx
  68. #define __UHASX __uhasx
  69. #define __SSAX __ssax
  70. #define __QSAX __qsax
  71. #define __SHSAX __shsax
  72. #define __USAX __usax
  73. #define __UQSAX __uqsax
  74. #define __UHSAX __uhsax
  75. #define __USAD8 __usad8
  76. #define __USADA8 __usada8
  77. #define __SSAT16 __ssat16
  78. #define __USAT16 __usat16
  79. #define __UXTB16 __uxtb16
  80. #define __UXTAB16 __uxtab16
  81. #define __SXTB16 __sxtb16
  82. #define __SXTAB16 __sxtab16
  83. #define __SMUAD __smuad
  84. #define __SMUADX __smuadx
  85. #define __SMLAD __smlad
  86. #define __SMLADX __smladx
  87. #define __SMLALD __smlald
  88. #define __SMLALDX __smlaldx
  89. #define __SMUSD __smusd
  90. #define __SMUSDX __smusdx
  91. #define __SMLSD __smlsd
  92. #define __SMLSDX __smlsdx
  93. #define __SMLSLD __smlsld
  94. #define __SMLSLDX __smlsldx
  95. #define __SEL __sel
  96. #define __QADD __qadd
  97. #define __QSUB __qsub
  98. #define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \
  99. ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) )
  100. #define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \
  101. ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) )
  102. /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
  103. #elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
  104. /* IAR iccarm specific functions */
  105. /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
  106. #include <cmsis_iar.h>
  107. /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
  108. #elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
  109. /* TI CCS specific functions */
  110. /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
  111. #include <cmsis_ccs.h>
  112. /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
  113. #elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
  114. /* GNU gcc specific functions */
  115. /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
  116. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2)
  117. {
  118. uint32_t result;
  119. __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  120. return(result);
  121. }
  122. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2)
  123. {
  124. uint32_t result;
  125. __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  126. return(result);
  127. }
  128. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2)
  129. {
  130. uint32_t result;
  131. __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  132. return(result);
  133. }
  134. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2)
  135. {
  136. uint32_t result;
  137. __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  138. return(result);
  139. }
  140. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2)
  141. {
  142. uint32_t result;
  143. __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  144. return(result);
  145. }
  146. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2)
  147. {
  148. uint32_t result;
  149. __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  150. return(result);
  151. }
  152. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2)
  153. {
  154. uint32_t result;
  155. __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  156. return(result);
  157. }
  158. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2)
  159. {
  160. uint32_t result;
  161. __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  162. return(result);
  163. }
  164. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2)
  165. {
  166. uint32_t result;
  167. __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  168. return(result);
  169. }
  170. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2)
  171. {
  172. uint32_t result;
  173. __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  174. return(result);
  175. }
  176. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2)
  177. {
  178. uint32_t result;
  179. __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  180. return(result);
  181. }
  182. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2)
  183. {
  184. uint32_t result;
  185. __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  186. return(result);
  187. }
  188. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2)
  189. {
  190. uint32_t result;
  191. __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  192. return(result);
  193. }
  194. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2)
  195. {
  196. uint32_t result;
  197. __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  198. return(result);
  199. }
  200. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2)
  201. {
  202. uint32_t result;
  203. __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  204. return(result);
  205. }
  206. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2)
  207. {
  208. uint32_t result;
  209. __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  210. return(result);
  211. }
  212. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2)
  213. {
  214. uint32_t result;
  215. __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  216. return(result);
  217. }
  218. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2)
  219. {
  220. uint32_t result;
  221. __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  222. return(result);
  223. }
  224. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2)
  225. {
  226. uint32_t result;
  227. __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  228. return(result);
  229. }
  230. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2)
  231. {
  232. uint32_t result;
  233. __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  234. return(result);
  235. }
  236. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2)
  237. {
  238. uint32_t result;
  239. __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  240. return(result);
  241. }
  242. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2)
  243. {
  244. uint32_t result;
  245. __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  246. return(result);
  247. }
  248. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2)
  249. {
  250. uint32_t result;
  251. __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  252. return(result);
  253. }
  254. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2)
  255. {
  256. uint32_t result;
  257. __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  258. return(result);
  259. }
  260. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2)
  261. {
  262. uint32_t result;
  263. __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  264. return(result);
  265. }
  266. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2)
  267. {
  268. uint32_t result;
  269. __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  270. return(result);
  271. }
  272. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2)
  273. {
  274. uint32_t result;
  275. __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  276. return(result);
  277. }
  278. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2)
  279. {
  280. uint32_t result;
  281. __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  282. return(result);
  283. }
  284. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2)
  285. {
  286. uint32_t result;
  287. __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  288. return(result);
  289. }
  290. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2)
  291. {
  292. uint32_t result;
  293. __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  294. return(result);
  295. }
  296. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2)
  297. {
  298. uint32_t result;
  299. __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  300. return(result);
  301. }
  302. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2)
  303. {
  304. uint32_t result;
  305. __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  306. return(result);
  307. }
  308. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2)
  309. {
  310. uint32_t result;
  311. __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  312. return(result);
  313. }
  314. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2)
  315. {
  316. uint32_t result;
  317. __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  318. return(result);
  319. }
  320. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2)
  321. {
  322. uint32_t result;
  323. __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  324. return(result);
  325. }
  326. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2)
  327. {
  328. uint32_t result;
  329. __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  330. return(result);
  331. }
  332. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2)
  333. {
  334. uint32_t result;
  335. __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  336. return(result);
  337. }
  338. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3)
  339. {
  340. uint32_t result;
  341. __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
  342. return(result);
  343. }
  344. #define __SSAT16(ARG1,ARG2) \
  345. ({ \
  346. uint32_t __RES, __ARG1 = (ARG1); \
  347. __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
  348. __RES; \
  349. })
  350. #define __USAT16(ARG1,ARG2) \
  351. ({ \
  352. uint32_t __RES, __ARG1 = (ARG1); \
  353. __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
  354. __RES; \
  355. })
  356. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1)
  357. {
  358. uint32_t result;
  359. __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1));
  360. return(result);
  361. }
  362. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2)
  363. {
  364. uint32_t result;
  365. __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  366. return(result);
  367. }
  368. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1)
  369. {
  370. uint32_t result;
  371. __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1));
  372. return(result);
  373. }
  374. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2)
  375. {
  376. uint32_t result;
  377. __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  378. return(result);
  379. }
  380. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2)
  381. {
  382. uint32_t result;
  383. __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  384. return(result);
  385. }
  386. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2)
  387. {
  388. uint32_t result;
  389. __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  390. return(result);
  391. }
  392. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3)
  393. {
  394. uint32_t result;
  395. __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
  396. return(result);
  397. }
  398. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3)
  399. {
  400. uint32_t result;
  401. __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
  402. return(result);
  403. }
  404. #define __SMLALD(ARG1,ARG2,ARG3) \
  405. ({ \
  406. uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \
  407. __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
  408. (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
  409. })
  410. #define __SMLALDX(ARG1,ARG2,ARG3) \
  411. ({ \
  412. uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \
  413. __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
  414. (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
  415. })
  416. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2)
  417. {
  418. uint32_t result;
  419. __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  420. return(result);
  421. }
  422. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2)
  423. {
  424. uint32_t result;
  425. __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  426. return(result);
  427. }
  428. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3)
  429. {
  430. uint32_t result;
  431. __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
  432. return(result);
  433. }
  434. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3)
  435. {
  436. uint32_t result;
  437. __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
  438. return(result);
  439. }
  440. #define __SMLSLD(ARG1,ARG2,ARG3) \
  441. ({ \
  442. uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \
  443. __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
  444. (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
  445. })
  446. #define __SMLSLDX(ARG1,ARG2,ARG3) \
  447. ({ \
  448. uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \
  449. __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
  450. (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
  451. })
  452. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SEL (uint32_t op1, uint32_t op2)
  453. {
  454. uint32_t result;
  455. __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  456. return(result);
  457. }
  458. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD(uint32_t op1, uint32_t op2)
  459. {
  460. uint32_t result;
  461. __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  462. return(result);
  463. }
  464. __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB(uint32_t op1, uint32_t op2)
  465. {
  466. uint32_t result;
  467. __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  468. return(result);
  469. }
  470. #define __PKHBT(ARG1,ARG2,ARG3) \
  471. ({ \
  472. uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
  473. __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \
  474. __RES; \
  475. })
  476. #define __PKHTB(ARG1,ARG2,ARG3) \
  477. ({ \
  478. uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
  479. if (ARG3 == 0) \
  480. __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \
  481. else \
  482. __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \
  483. __RES; \
  484. })
  485. /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
  486. #elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
  487. /* TASKING carm specific functions */
  488. /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
  489. /* not yet supported */
  490. /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
  491. #endif
  492. /*@} end of group CMSIS_SIMD_intrinsics */
  493. #endif /* __CORE_CM4_SIMD_H */
  494. #ifdef __cplusplus
  495. }
  496. #endif