Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 

652 wiersze
20 KiB

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