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