CV_CoreSimd.c 21 KB

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