CV_CoreInstr.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /*-----------------------------------------------------------------------------
  2. * Name: CV_CoreInstr.c
  3. * Purpose: CMSIS CORE validation tests implementation
  4. *-----------------------------------------------------------------------------
  5. * Copyright (c) 2017 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. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  16. /**
  17. \brief Test case: TC_CoreInstr_NOP
  18. \details
  19. - Check if __NOP instrinsic is available
  20. - No real assertion is deployed, just a compile time check.
  21. */
  22. void TC_CoreInstr_NOP (void) {
  23. __NOP();
  24. ASSERT_TRUE(1U == 1U);
  25. }
  26. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  27. /**
  28. \brief Test case: TC_CoreInstr_REV
  29. \details
  30. - Check if __REV instrinsic swaps all bytes in a word.
  31. */
  32. void TC_CoreInstr_REV (void) {
  33. uint32_t result = __REV(0x47110815U);
  34. ASSERT_TRUE(result == 0x15081147U);
  35. result = __REV(0x80000000U);
  36. ASSERT_TRUE(result == 0x00000080U);
  37. result = __REV(0x00000080U);
  38. ASSERT_TRUE(result == 0x80000000U);
  39. }
  40. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  41. /**
  42. \brief Test case: TC_CoreInstr_REV16
  43. \details
  44. - Check if __REV16 instrinsic swaps the bytes in both halfwords independendly.
  45. */
  46. void TC_CoreInstr_REV16(void) {
  47. uint32_t result = __REV16(0x47110815U);
  48. ASSERT_TRUE(result == 0x11471508U);
  49. }
  50. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  51. /**
  52. \brief Test case: TC_CoreInstr_REVSH
  53. \details
  54. - Check if __REVSH instrinsic swaps bytes in a signed halfword keeping the sign.
  55. */
  56. void TC_CoreInstr_REVSH(void) {
  57. int16_t result = __REVSH(0x4711);
  58. ASSERT_TRUE(result == 0x1147);
  59. result = __REVSH((int16_t)0x8000);
  60. ASSERT_TRUE(result == 0x0080);
  61. result = __REVSH(0x0080);
  62. ASSERT_TRUE(result == (int16_t)0x8000);
  63. }
  64. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  65. /**
  66. \brief Test case: TC_CoreInstr_ROT
  67. \details
  68. - Check if __ROR instrinsic moves all bits as expected.
  69. */
  70. void TC_CoreInstr_ROR(void) {
  71. uint32_t result = __ROR(0x01U, 1U);
  72. ASSERT_TRUE(result == 0x80000000U);
  73. result = __ROR(0x80000000U, 1U);
  74. ASSERT_TRUE(result == 0x40000000U);
  75. result = __ROR(0x40000000U, 30U);
  76. ASSERT_TRUE(result == 0x00000001U);
  77. result = __ROR(0x01U, 32U);
  78. ASSERT_TRUE(result == 0x00000001U);
  79. result = __ROR(0x08154711U, 8U);
  80. ASSERT_TRUE(result == 0x11081547U);
  81. }
  82. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  83. /**
  84. \brief Test case: TC_CoreInstr_RBIT
  85. \details
  86. - Check if __RBIT instrinsic revserses the bit order of arbitrary words.
  87. */
  88. void TC_CoreInstr_RBIT (void) {
  89. uint32_t result = __RBIT(0xAAAAAAAAU);
  90. ASSERT_TRUE(result == 0x55555555U);
  91. result = __RBIT(0x55555555U);
  92. ASSERT_TRUE(result == 0xAAAAAAAAU);
  93. result = __RBIT(0x00000001U);
  94. ASSERT_TRUE(result == 0x80000000U);
  95. result = __RBIT(0x80000000U);
  96. ASSERT_TRUE(result == 0x00000001U);
  97. result = __RBIT(0xDEADBEEFU);
  98. ASSERT_TRUE(result == 0xF77DB57BU);
  99. }
  100. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  101. /**
  102. \brief Test case: TC_CoreInstr_CLZ
  103. \details
  104. - Check if __CLZ instrinsic counts leading zeros.
  105. */
  106. void TC_CoreInstr_CLZ (void) {
  107. uint32_t result = __CLZ(0x00U);
  108. ASSERT_TRUE(result == 32);
  109. result = __CLZ(0x00000001U);
  110. ASSERT_TRUE(result == 31);
  111. result = __CLZ(0x40000000U);
  112. ASSERT_TRUE(result == 1);
  113. result = __CLZ(0x80000000U);
  114. ASSERT_TRUE(result == 0);
  115. result = __CLZ(0xFFFFFFFFU);
  116. ASSERT_TRUE(result == 0);
  117. result = __CLZ(0x80000001U);
  118. ASSERT_TRUE(result == 0);
  119. }
  120. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  121. /**
  122. \brief Test case: TC_CoreInstr_SSAT
  123. \details
  124. - Check if __SSAT instrinsic saturates signed integer values.
  125. */
  126. void TC_CoreInstr_SSAT (void) {
  127. int32_t result = __SSAT(INT32_MAX, 32U);
  128. ASSERT_TRUE(result == INT32_MAX);
  129. result = __SSAT(INT32_MAX, 16U);
  130. ASSERT_TRUE(result == INT16_MAX);
  131. result = __SSAT(INT32_MAX, 8U);
  132. ASSERT_TRUE(result == INT8_MAX);
  133. result = __SSAT(INT32_MAX, 1U);
  134. ASSERT_TRUE(result == 0);
  135. result = __SSAT(INT32_MIN, 32U);
  136. ASSERT_TRUE(result == INT32_MIN);
  137. result = __SSAT(INT32_MIN, 16U);
  138. ASSERT_TRUE(result == INT16_MIN);
  139. result = __SSAT(INT32_MIN, 8U);
  140. ASSERT_TRUE(result == INT8_MIN);
  141. result = __SSAT(INT32_MIN, 1U);
  142. ASSERT_TRUE(result == -1);
  143. }
  144. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  145. /**
  146. \brief Test case: TC_CoreInstr_USAT
  147. \details
  148. - Check if __USAT instrinsic saturates unsigned integer values.
  149. */
  150. void TC_CoreInstr_USAT (void) {
  151. uint32_t result = __USAT(INT32_MAX, 31U);
  152. ASSERT_TRUE(result == (UINT32_MAX>>1U));
  153. result = __USAT(INT32_MAX, 16U);
  154. ASSERT_TRUE(result == UINT16_MAX);
  155. result = __USAT(INT32_MAX, 8U);
  156. ASSERT_TRUE(result == UINT8_MAX);
  157. result = __USAT(INT32_MAX, 0U);
  158. ASSERT_TRUE(result == 0U);
  159. result = __USAT(INT32_MIN, 31U);
  160. ASSERT_TRUE(result == 0U);
  161. result = __USAT(INT32_MIN, 16U);
  162. ASSERT_TRUE(result == 0U);
  163. result = __USAT(INT32_MIN, 8U);
  164. ASSERT_TRUE(result == 0U);
  165. result = __USAT(INT32_MIN, 0U);
  166. ASSERT_TRUE(result == 0U);
  167. }