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);
42 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
44 \brief Test case: TC_CoreInstr_REV16
46 - Check if __REV16 instrinsic swaps the bytes in a halfword.
48 void TC_CoreInstr_REV16(void) {
49 uint16_t result = __REV16(0x4711U);
50 ASSERT_TRUE(result == 0x1147U);
52 result = __REV16(0x4711U);
53 ASSERT_TRUE(result == 0x1147U);
56 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
58 \brief Test case: TC_CoreInstr_REVSH
60 - Check if __REVSH instrinsic swaps bytes in a signed halfword keeping the sign.
62 void TC_CoreInstr_REVSH(void) {
63 int16_t result = __REVSH(0x4711);
64 ASSERT_TRUE(result == 0x1147);
66 result = __REVSH(-4711);
67 ASSERT_TRUE(result == -26131);
70 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
72 \brief Test case: TC_CoreInstr_ROT
74 - Check if __ROR instrinsic moves all bits as expected.
76 void TC_CoreInstr_ROR(void) {
77 uint32_t result = __ROR(0x01U, 1U);
78 ASSERT_TRUE(result == 0x80000000U);
80 result = __ROR(0x80000000U, 1U);
81 ASSERT_TRUE(result == 0x40000000U);
83 result = __ROR(0x40000000U, 30U);
84 ASSERT_TRUE(result == 0x00000001U);
86 result = __ROR(0x01U, 32U);
87 ASSERT_TRUE(result == 0x00000001U);
89 result = __ROR(0x08154711U, 8U);
90 ASSERT_TRUE(result == 0x11081547U);
93 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
95 \brief Test case: TC_CoreInstr_RBIT
97 - Check if __RBIT instrinsic revserses the bit order of arbitrary words.
99 void TC_CoreInstr_RBIT (void) {
100 uint32_t result = __RBIT(0xAAAAAAAAU);
101 ASSERT_TRUE(result == 0x55555555U);
103 result = __RBIT(0x55555555U);
104 ASSERT_TRUE(result == 0xAAAAAAAAU);
106 result = __RBIT(0x00000001U);
107 ASSERT_TRUE(result == 0x80000000U);
109 result = __RBIT(0x80000000U);
110 ASSERT_TRUE(result == 0x00000001U);
112 result = __RBIT(0xDEADBEEFU);
113 ASSERT_TRUE(result == 0xF77DB57BU);
116 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
118 \brief Test case: TC_CoreInstr_CLZ
120 - Check if __CLZ instrinsic counts leading zeros.
123 void TC_CoreInstr_CLZ (void) {
124 int32_t result = __CLZ(0x00U);
125 ASSERT_TRUE(result == 32);
127 result = __CLZ(0x00000001U);
128 ASSERT_TRUE(result == 31);
130 result = __CLZ(0x40000000U);
131 ASSERT_TRUE(result == 1);
133 result = __CLZ(0x80000000U);
134 ASSERT_TRUE(result == 0);
136 result = __CLZ(0xFFFFFFFFU);
137 ASSERT_TRUE(result == 0);
139 result = __CLZ(0x80000001U);
140 ASSERT_TRUE(result == 0);
143 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
145 \brief Test case: TC_CoreInstr_SSAT
147 - Check if __SSAT instrinsic saturates signed integer values.
149 void TC_CoreInstr_SSAT (void) {
150 int32_t result = __SSAT(INT32_MAX, 32U);
151 ASSERT_TRUE(result == INT32_MAX);
153 result = __SSAT(INT32_MAX, 16U);
154 ASSERT_TRUE(result == INT16_MAX);
156 result = __SSAT(INT32_MAX, 8U);
157 ASSERT_TRUE(result == INT8_MAX);
159 result = __SSAT(INT32_MAX, 1U);
160 ASSERT_TRUE(result == 0);
162 result = __SSAT(INT32_MIN, 32U);
163 ASSERT_TRUE(result == INT32_MIN);
165 result = __SSAT(INT32_MIN, 16U);
166 ASSERT_TRUE(result == INT16_MIN);
168 result = __SSAT(INT32_MIN, 8U);
169 ASSERT_TRUE(result == INT8_MIN);
171 result = __SSAT(INT32_MIN, 1U);
172 ASSERT_TRUE(result == -1);
175 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
177 \brief Test case: TC_CoreInstr_USAT
179 - Check if __USAT instrinsic saturates unsigned integer values.
181 void TC_CoreInstr_USAT (void) {
182 uint32_t result = __USAT(INT32_MAX, 31U);
183 ASSERT_TRUE(result == (UINT32_MAX>>1U));
185 result = __USAT(INT32_MAX, 16U);
186 ASSERT_TRUE(result == UINT16_MAX);
188 result = __USAT(INT32_MAX, 8U);
189 ASSERT_TRUE(result == UINT8_MAX);
191 result = __USAT(INT32_MAX, 0U);
192 ASSERT_TRUE(result == 0U);
194 result = __USAT(INT32_MIN, 31U);
195 ASSERT_TRUE(result == 0U);
197 result = __USAT(INT32_MIN, 16U);
198 ASSERT_TRUE(result == 0U);
200 result = __USAT(INT32_MIN, 8U);
201 ASSERT_TRUE(result == 0U);
203 result = __USAT(INT32_MIN, 0U);
204 ASSERT_TRUE(result == 0U);