1 /*-----------------------------------------------------------------------------
3 * Purpose: CMSIS CORE validation tests implementation
4 *-----------------------------------------------------------------------------
5 * Copyright (c) 2017 ARM Limited. All rights reserved.
6 *----------------------------------------------------------------------------*/
8 #include "CV_Framework.h"
11 /*-----------------------------------------------------------------------------
13 *----------------------------------------------------------------------------*/
15 /*-----------------------------------------------------------------------------
17 *----------------------------------------------------------------------------*/
19 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
21 \brief Test case: TC_CoreInstr_NOP
23 - Check if __NOP instrinsic is available
24 - No real assertion is deployed, just a compile time check.
26 void TC_CoreInstr_NOP (void) {
28 ASSERT_TRUE(1U == 1U);
31 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
33 \brief Test case: TC_CoreInstr_REV
35 - Check if __REV instrinsic swaps all bytes in a word.
37 void TC_CoreInstr_REV (void) {
38 uint32_t result = __REV(0x47110815U);
39 ASSERT_TRUE(result == 0x15081147U);
41 result = __REV(0x80000000U);
42 ASSERT_TRUE(result == 0x00000080U);
44 result = __REV(0x00000080U);
45 ASSERT_TRUE(result == 0x80000000U);
48 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
50 \brief Test case: TC_CoreInstr_REV16
52 - Check if __REV16 instrinsic swaps the bytes in both halfwords independendly.
54 void TC_CoreInstr_REV16(void) {
55 uint32_t result = __REV16(0x47110815U);
56 ASSERT_TRUE(result == 0x11471508U);
59 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
61 \brief Test case: TC_CoreInstr_REVSH
63 - Check if __REVSH instrinsic swaps bytes in a signed halfword keeping the sign.
65 void TC_CoreInstr_REVSH(void) {
66 int16_t result = __REVSH(0x4711);
67 ASSERT_TRUE(result == 0x1147);
69 result = __REVSH((int16_t)0x8000);
70 ASSERT_TRUE(result == 0x0080);
72 result = __REVSH(0x0080);
73 ASSERT_TRUE(result == (int16_t)0x8000);
76 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
78 \brief Test case: TC_CoreInstr_ROT
80 - Check if __ROR instrinsic moves all bits as expected.
82 void TC_CoreInstr_ROR(void) {
83 uint32_t result = __ROR(0x01U, 1U);
84 ASSERT_TRUE(result == 0x80000000U);
86 result = __ROR(0x80000000U, 1U);
87 ASSERT_TRUE(result == 0x40000000U);
89 result = __ROR(0x40000000U, 30U);
90 ASSERT_TRUE(result == 0x00000001U);
92 result = __ROR(0x01U, 32U);
93 ASSERT_TRUE(result == 0x00000001U);
95 result = __ROR(0x08154711U, 8U);
96 ASSERT_TRUE(result == 0x11081547U);
99 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
101 \brief Test case: TC_CoreInstr_RBIT
103 - Check if __RBIT instrinsic revserses the bit order of arbitrary words.
105 void TC_CoreInstr_RBIT (void) {
106 uint32_t result = __RBIT(0xAAAAAAAAU);
107 ASSERT_TRUE(result == 0x55555555U);
109 result = __RBIT(0x55555555U);
110 ASSERT_TRUE(result == 0xAAAAAAAAU);
112 result = __RBIT(0x00000001U);
113 ASSERT_TRUE(result == 0x80000000U);
115 result = __RBIT(0x80000000U);
116 ASSERT_TRUE(result == 0x00000001U);
118 result = __RBIT(0xDEADBEEFU);
119 ASSERT_TRUE(result == 0xF77DB57BU);
122 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
124 \brief Test case: TC_CoreInstr_CLZ
126 - Check if __CLZ instrinsic counts leading zeros.
129 void TC_CoreInstr_CLZ (void) {
130 uint32_t result = __CLZ(0x00U);
131 ASSERT_TRUE(result == 32);
133 result = __CLZ(0x00000001U);
134 ASSERT_TRUE(result == 31);
136 result = __CLZ(0x40000000U);
137 ASSERT_TRUE(result == 1);
139 result = __CLZ(0x80000000U);
140 ASSERT_TRUE(result == 0);
142 result = __CLZ(0xFFFFFFFFU);
143 ASSERT_TRUE(result == 0);
145 result = __CLZ(0x80000001U);
146 ASSERT_TRUE(result == 0);
149 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
151 \brief Test case: TC_CoreInstr_SSAT
153 - Check if __SSAT instrinsic saturates signed integer values.
155 void TC_CoreInstr_SSAT (void) {
156 int32_t result = __SSAT(INT32_MAX, 32U);
157 ASSERT_TRUE(result == INT32_MAX);
159 result = __SSAT(INT32_MAX, 16U);
160 ASSERT_TRUE(result == INT16_MAX);
162 result = __SSAT(INT32_MAX, 8U);
163 ASSERT_TRUE(result == INT8_MAX);
165 result = __SSAT(INT32_MAX, 1U);
166 ASSERT_TRUE(result == 0);
168 result = __SSAT(INT32_MIN, 32U);
169 ASSERT_TRUE(result == INT32_MIN);
171 result = __SSAT(INT32_MIN, 16U);
172 ASSERT_TRUE(result == INT16_MIN);
174 result = __SSAT(INT32_MIN, 8U);
175 ASSERT_TRUE(result == INT8_MIN);
177 result = __SSAT(INT32_MIN, 1U);
178 ASSERT_TRUE(result == -1);
181 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
183 \brief Test case: TC_CoreInstr_USAT
185 - Check if __USAT instrinsic saturates unsigned integer values.
187 void TC_CoreInstr_USAT (void) {
188 uint32_t result = __USAT(INT32_MAX, 31U);
189 ASSERT_TRUE(result == (UINT32_MAX>>1U));
191 result = __USAT(INT32_MAX, 16U);
192 ASSERT_TRUE(result == UINT16_MAX);
194 result = __USAT(INT32_MAX, 8U);
195 ASSERT_TRUE(result == UINT8_MAX);
197 result = __USAT(INT32_MAX, 0U);
198 ASSERT_TRUE(result == 0U);
200 result = __USAT(INT32_MIN, 31U);
201 ASSERT_TRUE(result == 0U);
203 result = __USAT(INT32_MIN, 16U);
204 ASSERT_TRUE(result == 0U);
206 result = __USAT(INT32_MIN, 8U);
207 ASSERT_TRUE(result == 0U);
209 result = __USAT(INT32_MIN, 0U);
210 ASSERT_TRUE(result == 0U);