xref: /dpdk/app/test/test_bitops.c (revision 7660614c)
1*7660614cSJoyce Kong /* SPDX-License-Identifier: BSD-3-Clause
2*7660614cSJoyce Kong  * Copyright(c) 2019 Arm Limited
3*7660614cSJoyce Kong  */
4*7660614cSJoyce Kong 
5*7660614cSJoyce Kong #include <rte_launch.h>
6*7660614cSJoyce Kong #include <rte_bitops.h>
7*7660614cSJoyce Kong #include "test.h"
8*7660614cSJoyce Kong 
9*7660614cSJoyce Kong uint32_t val32;
10*7660614cSJoyce Kong uint64_t val64;
11*7660614cSJoyce Kong 
12*7660614cSJoyce Kong #define MAX_BITS_32 32
13*7660614cSJoyce Kong #define MAX_BITS_64 64
14*7660614cSJoyce Kong 
15*7660614cSJoyce Kong /*
16*7660614cSJoyce Kong  * Bitops functions
17*7660614cSJoyce Kong  * ================
18*7660614cSJoyce Kong  *
19*7660614cSJoyce Kong  * - The main test function performs several subtests.
20*7660614cSJoyce Kong  * - Check bit operations on one core.
21*7660614cSJoyce Kong  *   - Initialize valXX to specified values, then set each bit of valXX
22*7660614cSJoyce Kong  *     to 1 one by one in "test_bit_relaxed_set".
23*7660614cSJoyce Kong  *
24*7660614cSJoyce Kong  *   - Clear each bit of valXX to 0 one by one in "test_bit_relaxed_clear".
25*7660614cSJoyce Kong  *
26*7660614cSJoyce Kong  *   - Function "test_bit_relaxed_test_set_clear" checks whether each bit
27*7660614cSJoyce Kong  *     of valXX can do "test and set" and "test and clear" correctly.
28*7660614cSJoyce Kong  */
29*7660614cSJoyce Kong 
30*7660614cSJoyce Kong static int
test_bit_relaxed_set(void)31*7660614cSJoyce Kong test_bit_relaxed_set(void)
32*7660614cSJoyce Kong {
33*7660614cSJoyce Kong 	unsigned int i;
34*7660614cSJoyce Kong 
35*7660614cSJoyce Kong 	for (i = 0; i < MAX_BITS_32; i++)
36*7660614cSJoyce Kong 		rte_bit_relaxed_set32(i, &val32);
37*7660614cSJoyce Kong 
38*7660614cSJoyce Kong 	for (i = 0; i < MAX_BITS_32; i++)
39*7660614cSJoyce Kong 		if (!rte_bit_relaxed_get32(i, &val32)) {
40*7660614cSJoyce Kong 			printf("Failed to set bit in relaxed version.\n");
41*7660614cSJoyce Kong 			return TEST_FAILED;
42*7660614cSJoyce Kong 		}
43*7660614cSJoyce Kong 
44*7660614cSJoyce Kong 	for (i = 0; i < MAX_BITS_64; i++)
45*7660614cSJoyce Kong 		rte_bit_relaxed_set64(i, &val64);
46*7660614cSJoyce Kong 
47*7660614cSJoyce Kong 	for (i = 0; i < MAX_BITS_64; i++)
48*7660614cSJoyce Kong 		if (!rte_bit_relaxed_get64(i, &val64)) {
49*7660614cSJoyce Kong 			printf("Failed to set bit in relaxed version.\n");
50*7660614cSJoyce Kong 			return TEST_FAILED;
51*7660614cSJoyce Kong 		}
52*7660614cSJoyce Kong 
53*7660614cSJoyce Kong 	return TEST_SUCCESS;
54*7660614cSJoyce Kong }
55*7660614cSJoyce Kong 
56*7660614cSJoyce Kong static int
test_bit_relaxed_clear(void)57*7660614cSJoyce Kong test_bit_relaxed_clear(void)
58*7660614cSJoyce Kong {
59*7660614cSJoyce Kong 	unsigned int i;
60*7660614cSJoyce Kong 
61*7660614cSJoyce Kong 	for (i = 0; i < MAX_BITS_32; i++)
62*7660614cSJoyce Kong 		rte_bit_relaxed_clear32(i, &val32);
63*7660614cSJoyce Kong 
64*7660614cSJoyce Kong 	for (i = 0; i < MAX_BITS_32; i++)
65*7660614cSJoyce Kong 		if (rte_bit_relaxed_get32(i, &val32)) {
66*7660614cSJoyce Kong 			printf("Failed to clear bit in relaxed version.\n");
67*7660614cSJoyce Kong 			return TEST_FAILED;
68*7660614cSJoyce Kong 		}
69*7660614cSJoyce Kong 
70*7660614cSJoyce Kong 	for (i = 0; i < MAX_BITS_64; i++)
71*7660614cSJoyce Kong 		rte_bit_relaxed_clear64(i, &val64);
72*7660614cSJoyce Kong 
73*7660614cSJoyce Kong 	for (i = 0; i < MAX_BITS_64; i++)
74*7660614cSJoyce Kong 		if (rte_bit_relaxed_get64(i, &val64)) {
75*7660614cSJoyce Kong 			printf("Failed to clear bit in relaxed version.\n");
76*7660614cSJoyce Kong 			return TEST_FAILED;
77*7660614cSJoyce Kong 		}
78*7660614cSJoyce Kong 
79*7660614cSJoyce Kong 	return TEST_SUCCESS;
80*7660614cSJoyce Kong }
81*7660614cSJoyce Kong 
82*7660614cSJoyce Kong static int
test_bit_relaxed_test_set_clear(void)83*7660614cSJoyce Kong test_bit_relaxed_test_set_clear(void)
84*7660614cSJoyce Kong {
85*7660614cSJoyce Kong 	unsigned int i;
86*7660614cSJoyce Kong 
87*7660614cSJoyce Kong 	for (i = 0; i < MAX_BITS_32; i++)
88*7660614cSJoyce Kong 		rte_bit_relaxed_test_and_set32(i, &val32);
89*7660614cSJoyce Kong 
90*7660614cSJoyce Kong 	for (i = 0; i < MAX_BITS_32; i++)
91*7660614cSJoyce Kong 		if (!rte_bit_relaxed_test_and_clear32(i, &val32)) {
92*7660614cSJoyce Kong 			printf("Failed to set and test bit in relaxed version.\n");
93*7660614cSJoyce Kong 			return TEST_FAILED;
94*7660614cSJoyce Kong 	}
95*7660614cSJoyce Kong 
96*7660614cSJoyce Kong 	for (i = 0; i < MAX_BITS_32; i++)
97*7660614cSJoyce Kong 		if (rte_bit_relaxed_get32(i, &val32)) {
98*7660614cSJoyce Kong 			printf("Failed to test and clear bit in relaxed version.\n");
99*7660614cSJoyce Kong 			return TEST_FAILED;
100*7660614cSJoyce Kong 		}
101*7660614cSJoyce Kong 
102*7660614cSJoyce Kong 	for (i = 0; i < MAX_BITS_64; i++)
103*7660614cSJoyce Kong 		rte_bit_relaxed_test_and_set64(i, &val64);
104*7660614cSJoyce Kong 
105*7660614cSJoyce Kong 	for (i = 0; i < MAX_BITS_64; i++)
106*7660614cSJoyce Kong 		if (!rte_bit_relaxed_test_and_clear64(i, &val64)) {
107*7660614cSJoyce Kong 			printf("Failed to set and test bit in relaxed version.\n");
108*7660614cSJoyce Kong 			return TEST_FAILED;
109*7660614cSJoyce Kong 		}
110*7660614cSJoyce Kong 
111*7660614cSJoyce Kong 	for (i = 0; i < MAX_BITS_64; i++)
112*7660614cSJoyce Kong 		if (rte_bit_relaxed_get64(i, &val64)) {
113*7660614cSJoyce Kong 			printf("Failed to test and clear bit in relaxed version.\n");
114*7660614cSJoyce Kong 			return TEST_FAILED;
115*7660614cSJoyce Kong 		}
116*7660614cSJoyce Kong 
117*7660614cSJoyce Kong 	return TEST_SUCCESS;
118*7660614cSJoyce Kong }
119*7660614cSJoyce Kong 
120*7660614cSJoyce Kong static int
test_bitops(void)121*7660614cSJoyce Kong test_bitops(void)
122*7660614cSJoyce Kong {
123*7660614cSJoyce Kong 	val32 = 0;
124*7660614cSJoyce Kong 	val64 = 0;
125*7660614cSJoyce Kong 
126*7660614cSJoyce Kong 	if (test_bit_relaxed_set() < 0)
127*7660614cSJoyce Kong 		return TEST_FAILED;
128*7660614cSJoyce Kong 
129*7660614cSJoyce Kong 	if (test_bit_relaxed_clear() < 0)
130*7660614cSJoyce Kong 		return TEST_FAILED;
131*7660614cSJoyce Kong 
132*7660614cSJoyce Kong 	if (test_bit_relaxed_test_set_clear() < 0)
133*7660614cSJoyce Kong 		return TEST_FAILED;
134*7660614cSJoyce Kong 
135*7660614cSJoyce Kong 	return TEST_SUCCESS;
136*7660614cSJoyce Kong }
137*7660614cSJoyce Kong 
138*7660614cSJoyce Kong REGISTER_TEST_COMMAND(bitops_autotest, test_bitops);
139