core_cm4_simd.h 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. /**************************************************************************//**
  2. * @file core_cm4_simd.h
  3. * @brief CMSIS Cortex-M4 SIMD Header File
  4. * @version V2.01
  5. * @date 06. December 2010
  6. *
  7. * @note
  8. * Copyright (C) 2010 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. #ifndef __CORE_CM4_SIMD_H__
  24. #define __CORE_CM4_SIMD_H__
  25. #ifdef __cplusplus
  26. extern "C" {
  27. #endif
  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 SOMD 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. #include <intrinsics.h> /* IAR Intrinsics */
  106. #pragma diag_suppress=Pe940
  107. /*------ CM4 SIMDDSP Intrinsics -----------------------------------------------------*/
  108. /* intrinsic __SADD8 see intrinsics.h */
  109. /* intrinsic __QADD8 see intrinsics.h */
  110. /* intrinsic __SHADD8 see intrinsics.h */
  111. /* intrinsic __UADD8 see intrinsics.h */
  112. /* intrinsic __UQADD8 see intrinsics.h */
  113. /* intrinsic __UHADD8 see intrinsics.h */
  114. /* intrinsic __SSUB8 see intrinsics.h */
  115. /* intrinsic __QSUB8 see intrinsics.h */
  116. /* intrinsic __SHSUB8 see intrinsics.h */
  117. /* intrinsic __USUB8 see intrinsics.h */
  118. /* intrinsic __UQSUB8 see intrinsics.h */
  119. /* intrinsic __UHSUB8 see intrinsics.h */
  120. /* intrinsic __SADD16 see intrinsics.h */
  121. /* intrinsic __QADD16 see intrinsics.h */
  122. /* intrinsic __SHADD16 see intrinsics.h */
  123. /* intrinsic __UADD16 see intrinsics.h */
  124. /* intrinsic __UQADD16 see intrinsics.h */
  125. /* intrinsic __UHADD16 see intrinsics.h */
  126. /* intrinsic __SSUB16 see intrinsics.h */
  127. /* intrinsic __QSUB16 see intrinsics.h */
  128. /* intrinsic __SHSUB16 see intrinsics.h */
  129. /* intrinsic __USUB16 see intrinsics.h */
  130. /* intrinsic __UQSUB16 see intrinsics.h */
  131. /* intrinsic __UHSUB16 see intrinsics.h */
  132. /* intrinsic __SASX see intrinsics.h */
  133. /* intrinsic __QASX see intrinsics.h */
  134. /* intrinsic __SHASX see intrinsics.h */
  135. /* intrinsic __UASX see intrinsics.h */
  136. /* intrinsic __UQASX see intrinsics.h */
  137. /* intrinsic __UHASX see intrinsics.h */
  138. /* intrinsic __SSAX see intrinsics.h */
  139. /* intrinsic __QSAX see intrinsics.h */
  140. /* intrinsic __SHSAX see intrinsics.h */
  141. /* intrinsic __USAX see intrinsics.h */
  142. /* intrinsic __UQSAX see intrinsics.h */
  143. /* intrinsic __UHSAX see intrinsics.h */
  144. /* intrinsic __USAD8 see intrinsics.h */
  145. /* intrinsic __USADA8 see intrinsics.h */
  146. /* intrinsic __SSAT16 see intrinsics.h */
  147. /* intrinsic __USAT16 see intrinsics.h */
  148. /* intrinsic __UXTB16 see intrinsics.h */
  149. /* intrinsic __SXTB16 see intrinsics.h */
  150. /* intrinsic __UXTAB16 see intrinsics.h */
  151. /* intrinsic __SXTAB16 see intrinsics.h */
  152. /* intrinsic __SMUAD see intrinsics.h */
  153. /* intrinsic __SMUADX see intrinsics.h */
  154. /* intrinsic __SMLAD see intrinsics.h */
  155. /* intrinsic __SMLADX see intrinsics.h */
  156. /* intrinsic __SMLALD see intrinsics.h */
  157. /* intrinsic __SMLALDX see intrinsics.h */
  158. /* intrinsic __SMUSD see intrinsics.h */
  159. /* intrinsic __SMUSDX see intrinsics.h */
  160. /* intrinsic __SMLSD see intrinsics.h */
  161. /* intrinsic __SMLSDX see intrinsics.h */
  162. /* intrinsic __SMLSLD see intrinsics.h */
  163. /* intrinsic __SMLSLDX see intrinsics.h */
  164. /* intrinsic __SEL see intrinsics.h */
  165. /* intrinsic __QADD see intrinsics.h */
  166. /* intrinsic __QSUB see intrinsics.h */
  167. /* intrinsic __PKHBT see intrinsics.h */
  168. /* intrinsic __PKHTB see intrinsics.h */
  169. /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
  170. #pragma diag_default=Pe940
  171. #elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/
  172. /* GNU gcc specific functions */
  173. /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
  174. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2)
  175. {
  176. uint32_t result;
  177. __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  178. return(result);
  179. }
  180. __attribute__( ( always_inline ) ) static __INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2)
  181. {
  182. uint32_t result;
  183. __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  184. return(result);
  185. }
  186. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2)
  187. {
  188. uint32_t result;
  189. __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  190. return(result);
  191. }
  192. __attribute__( ( always_inline ) ) static __INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2)
  193. {
  194. uint32_t result;
  195. __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  196. return(result);
  197. }
  198. __attribute__( ( always_inline ) ) static __INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2)
  199. {
  200. uint32_t result;
  201. __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  202. return(result);
  203. }
  204. __attribute__( ( always_inline ) ) static __INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2)
  205. {
  206. uint32_t result;
  207. __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  208. return(result);
  209. }
  210. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2)
  211. {
  212. uint32_t result;
  213. __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  214. return(result);
  215. }
  216. __attribute__( ( always_inline ) ) static __INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2)
  217. {
  218. uint32_t result;
  219. __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  220. return(result);
  221. }
  222. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2)
  223. {
  224. uint32_t result;
  225. __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  226. return(result);
  227. }
  228. __attribute__( ( always_inline ) ) static __INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2)
  229. {
  230. uint32_t result;
  231. __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  232. return(result);
  233. }
  234. __attribute__( ( always_inline ) ) static __INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2)
  235. {
  236. uint32_t result;
  237. __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  238. return(result);
  239. }
  240. __attribute__( ( always_inline ) ) static __INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2)
  241. {
  242. uint32_t result;
  243. __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  244. return(result);
  245. }
  246. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2)
  247. {
  248. uint32_t result;
  249. __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  250. return(result);
  251. }
  252. __attribute__( ( always_inline ) ) static __INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2)
  253. {
  254. uint32_t result;
  255. __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  256. return(result);
  257. }
  258. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2)
  259. {
  260. uint32_t result;
  261. __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  262. return(result);
  263. }
  264. __attribute__( ( always_inline ) ) static __INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2)
  265. {
  266. uint32_t result;
  267. __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  268. return(result);
  269. }
  270. __attribute__( ( always_inline ) ) static __INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2)
  271. {
  272. uint32_t result;
  273. __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  274. return(result);
  275. }
  276. __attribute__( ( always_inline ) ) static __INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2)
  277. {
  278. uint32_t result;
  279. __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  280. return(result);
  281. }
  282. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2)
  283. {
  284. uint32_t result;
  285. __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  286. return(result);
  287. }
  288. __attribute__( ( always_inline ) ) static __INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2)
  289. {
  290. uint32_t result;
  291. __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  292. return(result);
  293. }
  294. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2)
  295. {
  296. uint32_t result;
  297. __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  298. return(result);
  299. }
  300. __attribute__( ( always_inline ) ) static __INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2)
  301. {
  302. uint32_t result;
  303. __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  304. return(result);
  305. }
  306. __attribute__( ( always_inline ) ) static __INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2)
  307. {
  308. uint32_t result;
  309. __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  310. return(result);
  311. }
  312. __attribute__( ( always_inline ) ) static __INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2)
  313. {
  314. uint32_t result;
  315. __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  316. return(result);
  317. }
  318. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SASX(uint32_t op1, uint32_t op2)
  319. {
  320. uint32_t result;
  321. __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  322. return(result);
  323. }
  324. __attribute__( ( always_inline ) ) static __INLINE uint32_t __QASX(uint32_t op1, uint32_t op2)
  325. {
  326. uint32_t result;
  327. __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  328. return(result);
  329. }
  330. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2)
  331. {
  332. uint32_t result;
  333. __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  334. return(result);
  335. }
  336. __attribute__( ( always_inline ) ) static __INLINE uint32_t __UASX(uint32_t op1, uint32_t op2)
  337. {
  338. uint32_t result;
  339. __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  340. return(result);
  341. }
  342. __attribute__( ( always_inline ) ) static __INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2)
  343. {
  344. uint32_t result;
  345. __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  346. return(result);
  347. }
  348. __attribute__( ( always_inline ) ) static __INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2)
  349. {
  350. uint32_t result;
  351. __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  352. return(result);
  353. }
  354. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2)
  355. {
  356. uint32_t result;
  357. __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  358. return(result);
  359. }
  360. __attribute__( ( always_inline ) ) static __INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2)
  361. {
  362. uint32_t result;
  363. __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  364. return(result);
  365. }
  366. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2)
  367. {
  368. uint32_t result;
  369. __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  370. return(result);
  371. }
  372. __attribute__( ( always_inline ) ) static __INLINE uint32_t __USAX(uint32_t op1, uint32_t op2)
  373. {
  374. uint32_t result;
  375. __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  376. return(result);
  377. }
  378. __attribute__( ( always_inline ) ) static __INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2)
  379. {
  380. uint32_t result;
  381. __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  382. return(result);
  383. }
  384. __attribute__( ( always_inline ) ) static __INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2)
  385. {
  386. uint32_t result;
  387. __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  388. return(result);
  389. }
  390. __attribute__( ( always_inline ) ) static __INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2)
  391. {
  392. uint32_t result;
  393. __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  394. return(result);
  395. }
  396. __attribute__( ( always_inline ) ) static __INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3)
  397. {
  398. uint32_t result;
  399. __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
  400. return(result);
  401. }
  402. #define __SSAT16(ARG1,ARG2) \
  403. ({ \
  404. uint32_t __RES, __ARG1 = (ARG1); \
  405. __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
  406. __RES; \
  407. })
  408. #define __USAT16(ARG1,ARG2) \
  409. ({ \
  410. uint32_t __RES, __ARG1 = (ARG1); \
  411. __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
  412. __RES; \
  413. })
  414. __attribute__( ( always_inline ) ) static __INLINE uint32_t __UXTB16(uint32_t op1)
  415. {
  416. uint32_t result;
  417. __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1));
  418. return(result);
  419. }
  420. __attribute__( ( always_inline ) ) static __INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2)
  421. {
  422. uint32_t result;
  423. __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  424. return(result);
  425. }
  426. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SXTB16(uint32_t op1)
  427. {
  428. uint32_t result;
  429. __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1));
  430. return(result);
  431. }
  432. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2)
  433. {
  434. uint32_t result;
  435. __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  436. return(result);
  437. }
  438. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2)
  439. {
  440. uint32_t result;
  441. __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  442. return(result);
  443. }
  444. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2)
  445. {
  446. uint32_t result;
  447. __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  448. return(result);
  449. }
  450. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3)
  451. {
  452. uint32_t result;
  453. __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
  454. return(result);
  455. }
  456. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3)
  457. {
  458. uint32_t result;
  459. __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
  460. return(result);
  461. }
  462. #define __SMLALD(ARG1,ARG2,ARG3) \
  463. ({ \
  464. uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \
  465. __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
  466. (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
  467. })
  468. #define __SMLALDX(ARG1,ARG2,ARG3) \
  469. ({ \
  470. uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \
  471. __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
  472. (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
  473. })
  474. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2)
  475. {
  476. uint32_t result;
  477. __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  478. return(result);
  479. }
  480. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2)
  481. {
  482. uint32_t result;
  483. __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  484. return(result);
  485. }
  486. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3)
  487. {
  488. uint32_t result;
  489. __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
  490. return(result);
  491. }
  492. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3)
  493. {
  494. uint32_t result;
  495. __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
  496. return(result);
  497. }
  498. #define __SMLSLD(ARG1,ARG2,ARG3) \
  499. ({ \
  500. uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \
  501. __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
  502. (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
  503. })
  504. #define __SMLSLDX(ARG1,ARG2,ARG3) \
  505. ({ \
  506. uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \
  507. __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
  508. (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
  509. })
  510. __attribute__( ( always_inline ) ) static __INLINE uint32_t __SEL (uint32_t op1, uint32_t op2)
  511. {
  512. uint32_t result;
  513. __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  514. return(result);
  515. }
  516. __attribute__( ( always_inline ) ) static __INLINE uint32_t __QADD(uint32_t op1, uint32_t op2)
  517. {
  518. uint32_t result;
  519. __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  520. return(result);
  521. }
  522. __attribute__( ( always_inline ) ) static __INLINE uint32_t __QSUB(uint32_t op1, uint32_t op2)
  523. {
  524. uint32_t result;
  525. __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  526. return(result);
  527. }
  528. #define __PKHBT(ARG1,ARG2,ARG3) \
  529. ({ \
  530. uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
  531. __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \
  532. __RES; \
  533. })
  534. #define __PKHTB(ARG1,ARG2,ARG3) \
  535. ({ \
  536. uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
  537. if (ARG3 == 0) \
  538. __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \
  539. else \
  540. __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \
  541. __RES; \
  542. })
  543. /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
  544. #elif (defined (__TASKING__)) /*------------------ TASKING Compiler --------------*/
  545. /* TASKING carm specific functions */
  546. /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
  547. /* not yet supported */
  548. /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
  549. #endif
  550. /*@} end of group CMSIS_SIMD_intrinsics */
  551. #ifdef __cplusplus
  552. }
  553. #endif
  554. #endif /* __CORE_CM4_SIMD_H__ */