CV_CoreSimd.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672
  1. /*-----------------------------------------------------------------------------
  2. * Name: CV_CoreSimd.c
  3. * Purpose: CMSIS CORE validation tests implementation
  4. *-----------------------------------------------------------------------------
  5. * Copyright (c) 2018 Arm Limited. All rights reserved.
  6. *----------------------------------------------------------------------------*/
  7. #include "CV_Framework.h"
  8. #include "cmsis_cv.h"
  9. /*-----------------------------------------------------------------------------
  10. * Test implementation
  11. *----------------------------------------------------------------------------*/
  12. /*-----------------------------------------------------------------------------
  13. * Test cases
  14. *----------------------------------------------------------------------------*/
  15. /**
  16. \brief Test case: TC_CoreSimd_SatAddSub
  17. \details
  18. - Check Saturating addition and subtraction:
  19. __QADD
  20. __QSUB
  21. */
  22. void TC_CoreSimd_SatAddSub (void) {
  23. #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
  24. (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
  25. volatile int32_t op1_s32, op2_s32;
  26. volatile int32_t res_s32;
  27. /* --- __QADD Test ---------------------------------------------- */
  28. op1_s32 = (int32_t)0x80000003;
  29. op2_s32 = (int32_t)0x00000004;
  30. res_s32 = __QADD(op1_s32, op2_s32);
  31. ASSERT_TRUE(res_s32 == (int32_t)0x80000007);
  32. op1_s32 = (int32_t)0x80000000;
  33. op2_s32 = (int32_t)0x80000002;
  34. res_s32 = __QADD(op1_s32, op2_s32);
  35. ASSERT_TRUE(res_s32 == (int32_t)0x80000000);
  36. /* --- __QSUB Test ---------------------------------------------- */
  37. op1_s32 = (int32_t)0x80000003;
  38. op2_s32 = (int32_t)0x00000004;
  39. res_s32 = __QSUB(op1_s32, op2_s32);
  40. ASSERT_TRUE(res_s32 == (int32_t)0x80000000);
  41. op1_s32 = (int32_t)0x80000003;
  42. op2_s32 = (int32_t)0x00000002;
  43. res_s32 = __QSUB(op1_s32, op2_s32);
  44. ASSERT_TRUE(res_s32 == (int32_t)0x80000001);
  45. #endif
  46. }
  47. /**
  48. \brief Test case: TC_CoreSimd_ParSat16
  49. \details
  50. - Check Parallel 16-bit saturation:
  51. __SSAT16
  52. __USAT16
  53. */
  54. void TC_CoreSimd_ParSat16 (void) {
  55. #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
  56. (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
  57. volatile int32_t op1_s32;
  58. volatile int32_t res_s32;
  59. /* --- __SSAT16 Test ---------------------------------------------- */
  60. op1_s32 = (int32_t)0x80030168;
  61. res_s32 = __SSAT16(op1_s32, 8);
  62. ASSERT_TRUE(res_s32 == (int32_t)0xFF80007F);
  63. /* --- __USAT16 Test ---------------------------------------------- */
  64. op1_s32 = 0x0030168;
  65. res_s32 = __USAT16(op1_s32, 8);
  66. ASSERT_TRUE(res_s32 == 0x000300FF);
  67. #endif
  68. }
  69. /**
  70. \brief Test case: TC_CoreSimd_PackUnpack
  71. \details
  72. - Check Packing and unpacking:
  73. __SXTB16
  74. __SXTAB16
  75. __UXTB16
  76. __UXTAB16
  77. */
  78. void TC_CoreSimd_PackUnpack (void) {
  79. #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
  80. (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
  81. volatile int32_t op1_s32, op2_s32;
  82. volatile int32_t res_s32;
  83. /* --- __SXTB16 Test ---------------------------------------------- */
  84. op1_s32 = (int32_t)0x80830168;
  85. res_s32 = __SXTB16(op1_s32);
  86. ASSERT_TRUE(res_s32 == (int32_t)0xFF830068);
  87. /* --- __SXTAB16 Test ---------------------------------------------- */
  88. op1_s32 = (int32_t)0x000D0008;
  89. op2_s32 = (int32_t)0x80830168;
  90. res_s32 = __SXTAB16(op1_s32, op2_s32);
  91. ASSERT_TRUE(res_s32 == (int32_t)0xFF900070);
  92. /* --- __UXTB16 Test ---------------------------------------------- */
  93. op1_s32 = (int32_t)0x80830168;
  94. res_s32 = __UXTB16(op1_s32);
  95. ASSERT_TRUE(res_s32 == 0x00830068);
  96. /* --- __UXTAB16 Test ---------------------------------------------- */
  97. op1_s32 = 0x000D0008;
  98. op2_s32 = (int32_t)0x80830168;
  99. res_s32 = __UXTAB16(op1_s32, op2_s32);
  100. ASSERT_TRUE(res_s32 == 0x00900070);
  101. #endif
  102. }
  103. /**
  104. \brief Test case: TC_CoreSimd_ParSel
  105. \details
  106. - Check Parallel selection:
  107. __SEL
  108. */
  109. void TC_CoreSimd_ParSel (void) {
  110. #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
  111. (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
  112. volatile uint32_t res_u32;
  113. volatile int32_t op1_s32, op2_s32;
  114. volatile int32_t res_s32;
  115. APSR_Type apsr;
  116. xPSR_Type xpsr;
  117. /* --- __SEL Test ---------------------------------------------- */
  118. op1_s32 = 0x33221100;
  119. op2_s32 = 0x77665544;
  120. res_s32 = __SADD8(0x80808080, 0x00000000); /* __sadd8 sets APSR.GE = 0x00 */
  121. res_u32 = __get_APSR();
  122. apsr.w = __get_APSR();
  123. ASSERT_TRUE( (res_u32 == apsr.w) );
  124. xpsr.w = __get_xPSR();
  125. ASSERT_TRUE( (((res_u32 >> 16) & 0x0F) == xpsr.b.GE) );
  126. res_s32 = __SEL(op1_s32, op2_s32); /* __sel APSR.GE = 0x00 */
  127. ASSERT_TRUE( res_s32 == 0x77665544);
  128. res_s32 = __SADD8(0x80808000, 0x00000000); /* __sadd8 sets APSR.GE = 0x01 */
  129. res_u32 = __get_APSR();
  130. apsr.w = __get_APSR();
  131. ASSERT_TRUE( (res_u32 == apsr.w) );
  132. xpsr.w = __get_xPSR();
  133. ASSERT_TRUE( (((res_u32 >> 16) & 0x0F) == xpsr.b.GE) );
  134. res_s32 = __SEL(op1_s32, op2_s32); /* __sel APSR.GE = 0x01 */
  135. ASSERT_TRUE(res_s32 == 0x77665500);
  136. res_s32 = __SADD8(0x80800080, 0x00000000); /* __sadd8 sets APSR.GE = 0x02 */
  137. res_u32 = __get_APSR();
  138. apsr.w = __get_APSR();
  139. ASSERT_TRUE( (res_u32 == apsr.w) );
  140. xpsr.w = __get_xPSR();
  141. ASSERT_TRUE( (((res_u32 >> 16) & 0x0F) == xpsr.b.GE) );
  142. res_s32 = __SEL(op1_s32, op2_s32); /* __sel APSR.GE = 0x02 */
  143. ASSERT_TRUE(res_s32 == 0x77661144);
  144. #endif
  145. }
  146. /**
  147. \brief Test case: TC_CoreSimd_ParAddSub8
  148. \details
  149. - Check Parallel 8-bit addition and subtraction:
  150. __SADD8 S Signed
  151. __SSUB8 Q Signed Saturating
  152. __SHADD8 SH Signed Halving
  153. __SHSUB8 U Unsigned
  154. __QADD8 UQ Unsigned Saturating
  155. __QSUB8 UH Unsigned Halving
  156. __UADD8
  157. __USUB8
  158. __UHADD8
  159. __UHSUB8
  160. __UQADD8
  161. __UQSUB8
  162. */
  163. void TC_CoreSimd_ParAddSub8 (void) {
  164. #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
  165. (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
  166. volatile uint32_t op1_u32, op2_u32;
  167. volatile uint32_t res_u32;
  168. volatile int32_t op1_s32, op2_s32;
  169. volatile int32_t res_s32;
  170. /* --- __SADD8 Test ---------------------------------------------- */
  171. op1_s32 = (int32_t)0x87858381;
  172. op2_s32 = (int32_t)0x08060402;
  173. res_s32 = __SADD8(op1_s32, op2_s32);
  174. ASSERT_TRUE(res_s32 == (int32_t)0x8F8B8783);
  175. /* --- __SSUB8 Test ---------------------------------------------- */
  176. op1_s32 = (int32_t)0x8F8B8783;
  177. op2_s32 = (int32_t)0x08060402;
  178. res_s32 = __SSUB8(op1_s32, op2_s32);
  179. ASSERT_TRUE(res_s32 == (int32_t)0x87858381);
  180. /* --- __SHADD8 Test ---------------------------------------------- */
  181. op1_s32 = 0x07050302;
  182. op2_s32 = 0x08060402;
  183. res_s32 = __SHADD8(op1_s32, op2_s32);
  184. ASSERT_TRUE(res_s32 == 0x07050302);
  185. /* --- __SHSUB8 Test ---------------------------------------------- */
  186. op1_s32 = (int32_t)0x8F8B8783;
  187. op2_s32 = 0x08060402;
  188. res_s32 = __SHSUB8(op1_s32, op2_s32);
  189. ASSERT_TRUE(res_s32 == (int32_t)0xC3C2C1C0);
  190. /* --- __QADD8 Test ---------------------------------------------- */
  191. op1_s32 = (int32_t)0x8085837F;
  192. op2_s32 = (int32_t)0xFF060402;
  193. res_s32 = __QADD8(op1_s32, op2_s32);
  194. ASSERT_TRUE(res_s32 == (int32_t)0x808B877F);
  195. /* --- __QSUB8 Test ---------------------------------------------- */
  196. op1_s32 = (int32_t)0x808B8783;
  197. op2_s32 = (int32_t)0x08060402;
  198. res_s32 = __QSUB8(op1_s32, op2_s32);
  199. ASSERT_TRUE(res_s32 == (int32_t)0x80858381);
  200. /* --- __UADD8 Test ---------------------------------------------- */
  201. op1_u32 = 0x07050301;
  202. op2_u32 = 0x08060402;
  203. res_u32 = __UADD8(op1_u32, op2_u32);
  204. ASSERT_TRUE(res_u32 == 0x0F0B0703);
  205. /* --- __USUB8 Test ---------------------------------------------- */
  206. op1_u32 = 0x0F0B0703;
  207. op2_u32 = 0x08060402;
  208. res_u32 = __USUB8(op1_u32, op2_u32);
  209. ASSERT_TRUE(res_u32 == 0x07050301);
  210. /* --- __UHADD8 Test ---------------------------------------------- */
  211. op1_u32 = 0x07050302;
  212. op2_u32 = 0x08060402;
  213. res_u32 = __UHADD8(op1_u32, op2_u32);
  214. ASSERT_TRUE(res_u32 == 0x07050302);
  215. /* --- __UHSUB8 Test ---------------------------------------------- */
  216. op1_u32 = 0x0F0B0703;
  217. op2_u32 = 0x08060402;
  218. res_u32 = __UHSUB8(op1_u32, op2_u32);
  219. ASSERT_TRUE(res_u32 == 0x03020100);
  220. /* --- __UQADD8 Test ---------------------------------------------- */
  221. op1_u32 = 0xFF050301;
  222. op2_u32 = 0x08060402;
  223. res_u32 = __UQADD8(op1_u32, op2_u32);
  224. ASSERT_TRUE(res_u32 == 0xFF0B0703);
  225. /* --- __UQSUB8 Test ---------------------------------------------- */
  226. op1_u32 = 0x080B0702;
  227. op2_u32 = 0x0F060408;
  228. res_u32 = __UQSUB8(op1_u32, op2_u32);
  229. ASSERT_TRUE(res_u32 == 0x00050300);
  230. #endif
  231. }
  232. /**
  233. \brief Test case: TC_CoreSimd_AbsDif8
  234. \details
  235. - Check Sum of 8-bit absolute differences:
  236. __USAD8
  237. __USADA8
  238. */
  239. void TC_CoreSimd_AbsDif8 (void) {
  240. #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
  241. (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
  242. volatile uint32_t op1_u32, op2_u32, op3_u32;
  243. volatile uint32_t res_u32;
  244. /* --- __USAD8 Test ---------------------------------------------- */
  245. op1_u32 = 0x87858381;
  246. op2_u32 = 0x08060402;
  247. res_u32 = __USAD8(op1_u32, op2_u32);
  248. ASSERT_TRUE(res_u32 == 0x000001FC);
  249. /* --- __USADA8 Test ---------------------------------------------- */
  250. op1_u32 = 0x87858381;
  251. op2_u32 = 0x08060402;
  252. op3_u32 = 0x00008000;
  253. res_u32 = __USADA8(op1_u32, op2_u32, op3_u32);
  254. ASSERT_TRUE(res_u32 == 0x000081FC);
  255. #endif
  256. }
  257. /**
  258. \brief Test case: TC_CoreSimd_ParAddSub16
  259. \details
  260. - Check Parallel 16-bit addition and subtraction:
  261. __SADD16
  262. __SSUB16
  263. __SASX
  264. __SSAX
  265. __SHADD16
  266. __SHSUB16
  267. __SHASX
  268. __SHSAX
  269. __QADD16
  270. __QSUB16
  271. __QASX
  272. __QSAX
  273. __UADD16
  274. __USUB16
  275. __UASX
  276. __USAX
  277. __UHADD16
  278. __UHSUB16
  279. __UHASX
  280. __UHSAX
  281. __UQSUB16
  282. __UQADD16
  283. __UQASX
  284. __UQSAX
  285. */
  286. void TC_CoreSimd_ParAddSub16 (void) {
  287. #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
  288. (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
  289. volatile uint32_t op1_u32, op2_u32;
  290. volatile uint32_t res_u32;
  291. volatile int32_t op1_s32, op2_s32;
  292. volatile int32_t res_s32;
  293. /* --- __SADD16 Test ---------------------------------------------- */
  294. op1_s32 = (int32_t)0x80038001;
  295. op2_s32 = (int32_t)0x00040002;
  296. res_s32 = __SADD16(op1_s32, op2_s32);
  297. ASSERT_TRUE(res_s32 == (int32_t)0x80078003);
  298. /* --- __SSUB16 Test ---------------------------------------------- */
  299. op1_s32 = (int32_t)0x80078003;
  300. op2_s32 = (int32_t)0x00040002;
  301. res_s32 = __SSUB16(op1_s32, op2_s32);
  302. ASSERT_TRUE(res_s32 == (int32_t)0x80038001);
  303. /* --- __SASX Test ---------------------------------------------- */
  304. op1_s32 = (int32_t)0x80078003;
  305. op2_s32 = (int32_t)0x00040002;
  306. res_s32 = __SASX(op1_s32, op2_s32);
  307. ASSERT_TRUE(res_s32 == (int32_t)0x80097FFF);
  308. /* --- __SSAX Test ---------------------------------------------- */
  309. op1_s32 = (int32_t)0x80038007;
  310. op2_s32 = (int32_t)0x00020004;
  311. res_s32 = __SSAX(op1_s32, op2_s32);
  312. ASSERT_TRUE(res_s32 == (int32_t)0x7FFF8009);
  313. /* --- __SHADD16 Test ---------------------------------------------- */
  314. op1_s32 = (int32_t)0x80038001;
  315. op2_s32 = (int32_t)0x00040002;
  316. res_s32 = __SHADD16(op1_s32, op2_s32);
  317. ASSERT_TRUE(res_s32 == (int32_t)0xC003C001);
  318. /* --- __SHSUB16 Test ---------------------------------------------- */
  319. op1_s32 = (int32_t)0x80078003;
  320. op2_s32 = (int32_t)0x00040002;
  321. res_s32 = __SHSUB16(op1_s32, op2_s32);
  322. ASSERT_TRUE(res_s32 == (int32_t)0xC001C000);
  323. /* --- __SHASX Test ---------------------------------------------- */
  324. op1_s32 = (int32_t)0x80078003;
  325. op2_s32 = (int32_t)0x00040002;
  326. res_s32 = __SHASX(op1_s32, op2_s32);
  327. ASSERT_TRUE(res_s32 == (int32_t)0xC004BFFF);
  328. /* --- __SHSAX Test ---------------------------------------------- */
  329. op1_s32 = (int32_t)0x80038007;
  330. op2_s32 = (int32_t)0x00020004;
  331. res_s32 = __SHSAX(op1_s32, op2_s32);
  332. ASSERT_TRUE(res_s32 == (int32_t)0xBFFFC004);
  333. /* --- __QADD16 Test ---------------------------------------------- */
  334. op1_s32 = (int32_t)0x80038000;
  335. op2_s32 = (int32_t)0x00048002;
  336. res_s32 = __QADD16(op1_s32, op2_s32);
  337. ASSERT_TRUE(res_s32 == (int32_t)0x80078000);
  338. /* --- __QSUB16 Test ---------------------------------------------- */
  339. op1_s32 = (int32_t)0x80038003;
  340. op2_s32 = (int32_t)0x00040002;
  341. res_s32 = __QSUB16(op1_s32, op2_s32);
  342. ASSERT_TRUE(res_s32 == (int32_t)0x80008001);
  343. /* --- __QASX Test ---------------------------------------------- */
  344. op1_s32 = (int32_t)0x80078003;
  345. op2_s32 = (int32_t)0x00040002;
  346. res_s32 = __QASX(op1_s32, op2_s32);
  347. ASSERT_TRUE(res_s32 == (int32_t)0x80098000);
  348. /* --- __QSAX Test ---------------------------------------------- */
  349. op1_s32 = (int32_t)0x80038007;
  350. op2_s32 = (int32_t)0x00020004;
  351. res_s32 = __QSAX(op1_s32, op2_s32);
  352. ASSERT_TRUE(res_s32 == (int32_t)0x80008009);
  353. /* --- __UADD16 Test ---------------------------------------------- */
  354. op1_u32 = 0x00010002;
  355. op2_u32 = 0x00020004;
  356. res_u32 = __UADD16(op1_u32, op2_u32);
  357. ASSERT_TRUE(res_u32 == 0x00030006);
  358. /* --- __USUB16 Test ---------------------------------------------- */
  359. op1_u32 = 0x00030006;
  360. op2_u32 = 0x00020004;
  361. res_u32 = __USUB16(op1_u32, op2_u32);
  362. ASSERT_TRUE(res_u32 == 0x00010002);
  363. /* --- __UASX Test ---------------------------------------------- */
  364. op1_u32 = 0x80078003;
  365. op2_u32 = 0x00040002;
  366. res_u32 = __UASX(op1_u32, op2_u32);
  367. ASSERT_TRUE(res_u32 == 0x80097FFF);
  368. /* --- __USAX Test ---------------------------------------------- */
  369. op1_u32 = 0x80038007;
  370. op2_u32 = 0x00020004;
  371. res_u32 = __USAX(op1_u32, op2_u32);
  372. ASSERT_TRUE(res_u32 == 0x7FFF8009);
  373. /* --- __UHADD16 Test ---------------------------------------------- */
  374. op1_u32 = 0x00010002;
  375. op2_u32 = 0x00020004;
  376. res_u32 = __UHADD16(op1_u32, op2_u32);
  377. ASSERT_TRUE(res_u32 == 0x00010003);
  378. /* --- __UHSUB16 Test ---------------------------------------------- */
  379. op1_u32 = 0x00030006;
  380. op2_u32 = 0x00020004;
  381. res_u32 = __UHSUB16(op1_u32, op2_u32);
  382. ASSERT_TRUE(res_u32 == 0x00000001);
  383. /* --- __UHASX Test ---------------------------------------------- */
  384. op1_u32 = 0x80078003;
  385. op2_u32 = 0x00040002;
  386. res_u32 = __UHASX(op1_u32, op2_u32);
  387. ASSERT_TRUE(res_u32 == 0x40043FFF);
  388. /* --- __UHSAX Test ---------------------------------------------- */
  389. op1_u32 = 0x80038007;
  390. op2_u32 = 0x00020004;
  391. res_u32 = __UHSAX(op1_u32, op2_u32);
  392. ASSERT_TRUE(res_u32 == 0x3FFF4004);
  393. /* --- __UQADD16 Test ---------------------------------------------- */
  394. op1_u32 = 0xFFFE0002;
  395. op2_u32 = 0x00020004;
  396. res_u32 = __UQADD16(op1_u32, op2_u32);
  397. ASSERT_TRUE(res_u32 == 0xFFFF0006);
  398. /* --- __UQSUB16 Test ---------------------------------------------- */
  399. op1_u32 = 0x00020006;
  400. op2_u32 = 0x00030004;
  401. res_u32 = __UQSUB16(op1_u32, op2_u32);
  402. ASSERT_TRUE(res_u32 == 0x00000002);
  403. /* --- __UQASX Test ---------------------------------------------- */
  404. op1_u32 = 0xFFF80003;
  405. op2_u32 = 0x00040009;
  406. res_u32 = __UQASX(op1_u32, op2_u32);
  407. ASSERT_TRUE(res_u32 == 0xFFFF0000);
  408. /* --- __UQSAX Test ---------------------------------------------- */
  409. op1_u32 = 0x0003FFF8;
  410. op2_u32 = 0x00090004;
  411. res_u32 = __UQSAX(op1_u32, op2_u32);
  412. ASSERT_TRUE(res_u32 == 0x0000FFFF);
  413. #endif
  414. }
  415. /**
  416. \brief Test case: TC_CoreSimd_ParMul16
  417. \details
  418. - Check Parallel 16-bit multiplication:
  419. __SMLAD
  420. __SMLADX
  421. __SMLALD
  422. __SMLALDX
  423. __SMLSD
  424. __SMLSDX
  425. __SMLSLD
  426. __SMLSLDX
  427. __SMUAD
  428. __SMUADX
  429. __SMUSD
  430. __SMUSDX
  431. */
  432. void TC_CoreSimd_ParMul16 (void) {
  433. #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
  434. (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
  435. volatile int32_t op1_s32, op2_s32, op3_s32;
  436. volatile int32_t res_s32;
  437. volatile int64_t op1_s64;
  438. volatile int64_t res_s64;
  439. /* --- __SMLAD Test ---------------------------------------------- */
  440. op1_s32 = 0x00030002;
  441. op2_s32 = 0x00050004;
  442. op3_s32 = 0x20000000;
  443. res_s32 = __SMLAD(op1_s32, op2_s32, op3_s32);
  444. ASSERT_TRUE(res_s32 == 0x20000017);
  445. /* --- __SMLADX Test ---------------------------------------------- */
  446. op1_s32 = 0x00030002;
  447. op2_s32 = 0x00050004;
  448. op3_s32 = 0x00000800;
  449. res_s32 = __SMLADX(op1_s32, op2_s32, op3_s32);
  450. ASSERT_TRUE(res_s32 == 0x00000816);
  451. /* --- __SMLALD Test ---------------------------------------------- */
  452. op1_s32 = 0x00030002;
  453. op2_s32 = 0x00050004;
  454. op1_s64 = 0x00000000200000000LL;
  455. res_s64 = __SMLALD(op1_s32, op2_s32, op1_s64);
  456. ASSERT_TRUE(res_s64 == 0x0000000200000017LL);
  457. /* --- __SMLALDX Test ---------------------------------------------- */
  458. op1_s32 = 0x00030002;
  459. op2_s32 = 0x00050004;
  460. op1_s64 = 0x00000000200000000LL;
  461. res_s64 = __SMLALDX(op1_s32, op2_s32, op1_s64);
  462. ASSERT_TRUE(res_s64 == 0x0000000200000016LL);
  463. /* --- __SMLSD Test ---------------------------------------------- */
  464. op1_s32 = 0x00030006;
  465. op2_s32 = 0x00050004;
  466. op3_s32 = 0x00000800;
  467. res_s32 = __SMLSD(op1_s32, op2_s32, op3_s32);
  468. ASSERT_TRUE(res_s32 == 0x00000809);
  469. /* --- __SMLSDX Test ---------------------------------------------- */
  470. op1_s32 = 0x00030002;
  471. op2_s32 = 0x00050004;
  472. op3_s32 = 0x00000800;
  473. res_s32 = __SMLSDX(op1_s32, op2_s32, op3_s32);
  474. ASSERT_TRUE(res_s32 == 0x000007FE);
  475. /* --- __SMLSLD Test ---------------------------------------------- */
  476. op1_s32 = 0x00030006;
  477. op2_s32 = 0x00050004;
  478. op1_s64 = 0x00000000200000000LL;
  479. res_s64 = __SMLSLD(op1_s32, op2_s32, op1_s64);
  480. ASSERT_TRUE(res_s64 == 0x0000000200000009LL);
  481. /* --- __SMLSLDX Test ---------------------------------------------- */
  482. op1_s32 = 0x00030006;
  483. op2_s32 = 0x00050004;
  484. op1_s64 = 0x00000000200000000LL;
  485. res_s64 = __SMLSLDX(op1_s32, op2_s32, op1_s64);
  486. ASSERT_TRUE(res_s64 == 0x0000000200000012LL);
  487. /* --- __SMUAD Test ---------------------------------------------- */
  488. op1_s32 = 0x00030001;
  489. op2_s32 = 0x00040002;
  490. res_s32 = __SMUAD(op1_s32,op2_s32);
  491. ASSERT_TRUE(res_s32 == 0x0000000E);
  492. op1_s32 = (int32_t)0xFFFDFFFF;
  493. op2_s32 = (int32_t)0x00040002;
  494. res_s32 = __SMUAD(op1_s32,op2_s32);
  495. ASSERT_TRUE(res_s32 == (int32_t)0xFFFFFFF2);
  496. /* --- __SMUADX Test ---------------------------------------------- */
  497. op1_s32 = 0x00030001;
  498. op2_s32 = 0x00040002;
  499. res_s32 = __SMUADX(op1_s32,op2_s32);
  500. ASSERT_TRUE(res_s32 == 0x0000000A);
  501. op1_s32 = (int32_t)0xFFFDFFFF;
  502. op2_s32 = (int32_t)0x00040002;
  503. res_s32 = __SMUADX(op1_s32,op2_s32);
  504. ASSERT_TRUE(res_s32 == (int32_t)0xFFFFFFF6);
  505. /* --- __SMUSD Test ---------------------------------------------- */
  506. op1_s32 = (int32_t)0x00030001;
  507. op2_s32 = (int32_t)0x00040002;
  508. res_s32 = __SMUSD(op1_s32,op2_s32);
  509. ASSERT_TRUE(res_s32 == (int32_t)0xFFFFFFF6);
  510. op1_s32 = (int32_t)0xFFFDFFFF;
  511. op2_s32 = (int32_t)0x00040002;
  512. res_s32 = __SMUSD(op1_s32,op2_s32);
  513. ASSERT_TRUE(res_s32 == 0x0000000A);
  514. /* --- __SMUSDX Test ---------------------------------------------- */
  515. op1_s32 = 0x00030001;
  516. op2_s32 = 0x00040002;
  517. res_s32 = __SMUSDX(op1_s32,op2_s32);
  518. ASSERT_TRUE(res_s32 == (int32_t)0xFFFFFFFE);
  519. op1_s32 = (int32_t)0xFFFDFFFF;
  520. op2_s32 = (int32_t)0x00040002;
  521. res_s32 = __SMUSDX(op1_s32,op2_s32);
  522. ASSERT_TRUE(res_s32 == (int32_t)0x00000002);
  523. #endif
  524. }
  525. /**
  526. \brief Test case: TC_CoreSimd_Part9
  527. \details
  528. - Check Packing Halfword:
  529. __PKHBT
  530. __PKHTB
  531. */
  532. void TC_CoreSimd_Pack16 (void) {
  533. #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
  534. (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
  535. volatile uint32_t op1_u32, op2_u32;
  536. volatile uint32_t res_u32;
  537. /* --- __PKHBT Test ---------------------------------------------- */
  538. op1_u32 = 0x00000111;
  539. op2_u32 = 0x22200000;
  540. res_u32 = __PKHBT(op1_u32, op2_u32, 0);
  541. ASSERT_TRUE(res_u32 == 0x22200111);
  542. op1_u32 = 0x00000111;
  543. op2_u32 = 0x22200000;
  544. res_u32 = __PKHBT(op1_u32, op2_u32, 4);
  545. ASSERT_TRUE(res_u32 == 0x22000111);
  546. /* --- __PKHTB Test ---------------------------------------------- */
  547. op1_u32 = 0x11100000;
  548. op2_u32 = 0x00000222;
  549. res_u32 = __PKHTB(op1_u32, op2_u32, 0);
  550. ASSERT_TRUE(res_u32 == 0x11100222);
  551. op1_u32 = 0x11100000;
  552. op2_u32 = 0x00000222;
  553. res_u32 = __PKHTB(op1_u32, op2_u32, 4);
  554. ASSERT_TRUE(res_u32 == 0x11100022);
  555. #endif
  556. }
  557. /**
  558. \brief Test case: TC_CoreSimd_MulAcc32
  559. \details
  560. - Check Signed Most Significant Word Multiply Accumulate:
  561. __SMMLA
  562. */
  563. void TC_CoreSimd_MulAcc32 (void) {
  564. #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
  565. (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
  566. volatile int32_t op1_s32, op2_s32, op3_s32;
  567. volatile int32_t res_s32;
  568. /* --- __SMMLA Test ---------------------------------------------- */
  569. op1_s32 = 0x00000200;
  570. op2_s32 = 0x00000004;
  571. op3_s32 = 0x00000100;
  572. res_s32 = __SMMLA(op1_s32, op2_s32, op3_s32);
  573. ASSERT_TRUE(res_s32 == 0x00000100);
  574. op1_s32 = 0x40000000;
  575. op2_s32 = 0x00000010;
  576. op3_s32 = 0x00000300;
  577. res_s32 = __SMMLA(op1_s32, op2_s32, op3_s32);
  578. ASSERT_TRUE(res_s32 == 0x00000304);
  579. #endif
  580. }