CV_CoreSimd.c 22 KB

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