VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstBitOperations.cpp@ 18365

最後變更 在這個檔案從18365是 18365,由 vboxsync 提交於 16 年 前

tstBitOperations: Use RTTest.

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Id
檔案大小: 12.8 KB
 
1/* $Id: tstBitOperations.cpp 18365 2009-03-27 02:03:40Z vboxsync $ */
2/** @file
3 * IPRT Testcase - Inlined Bit Operations.
4 */
5
6/*
7 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.alldomusa.eu.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 *
26 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
27 * Clara, CA 95054 USA or visit http://www.sun.com if you need
28 * additional information or have any questions.
29 */
30
31
32/*******************************************************************************
33* Header Files *
34*******************************************************************************/
35#include <iprt/asm.h>
36#include <iprt/test.h>
37#include <iprt/stream.h>
38#include <iprt/string.h>
39#include <iprt/test.h>
40#include <iprt/initterm.h>
41
42
43int main()
44{
45 /*
46 * Init the runtime and stuff.
47 */
48 RTTEST hTest;
49 if ( RT_FAILURE(RTR3Init())
50 || RT_FAILURE(RTTestCreate("tstBitOperations", &hTest)))
51 {
52 RTPrintf("tstBitOperation: fatal initialization error\n");
53 return 1;
54 }
55 RTTestBanner(hTest);
56
57 int rcRet = 0;
58 int i;
59 int j;
60 int k;
61
62 /*
63 * Tests
64 */
65 struct TestMap
66 {
67 uint32_t au32[4];
68 };
69#if 0
70 struct TestMap sTest;
71 struct TestMap *p = &sTest;
72#else
73 struct TestMap *p = (struct TestMap *)RTTestGuardedAllocTail(hTest, sizeof(*p));
74#endif
75#define DUMP() RTTestPrintf(hTest, "au32={%08x,%08x,%08x,%08x}", p->au32[0], p->au32[1], p->au32[2], p->au32[3])
76#define CHECK(expr) do { if (!(expr)) { RTTestFailed(hTest, "line %d: %s", __LINE__, #expr); DUMP(); } CHECK_GUARD(s); } while (0)
77#define CHECK_BIT(expr, b1) do { if (!(expr)) { RTTestFailed(hTest, "line %d, b1=%d: %s", __LINE__, b1, #expr); } CHECK_GUARD(s); } while (0)
78#define CHECK_BIT2(expr, b1, b2) do { if (!(expr)) { RTTestFailed(hTest, "line %d, b1=%d b2=%d: %s", __LINE__, b1, b2, #expr); } CHECK_GUARD(s); } while (0)
79#define CHECK_BIT3(expr, b1, b2, b3) do { if (!(expr)) { RTTestFailed(hTest, "line %d, b1=%d b2=%d b3=%d: %s", __LINE__, b1, b2, b3, #expr); } CHECK_GUARD(s); } while (0)
80
81#define GUARD_MAP(p) do { } while (0)
82#define CHECK_GUARD(p) do { } while (0)
83#define MAP_CLEAR(p) do { memset(p, 0, sizeof(*(p))); GUARD_MAP(p); } while (0)
84#define MAP_SET(p) do { memset(p, 0xff, sizeof(*(p))); GUARD_MAP(p); } while (0)
85
86 /* self check. */
87 MAP_CLEAR(p);
88 CHECK_GUARD(p);
89
90 /* set */
91 MAP_CLEAR(p);
92 ASMBitSet(&p->au32[0], 0);
93 ASMBitSet(&p->au32[0], 31);
94 ASMBitSet(&p->au32[0], 65);
95 CHECK(p->au32[0] == 0x80000001U);
96 CHECK(p->au32[2] == 0x00000002U);
97 CHECK(ASMBitTestAndSet(&p->au32[0], 0) && p->au32[0] == 0x80000001U);
98 CHECK(!ASMBitTestAndSet(&p->au32[0], 16) && p->au32[0] == 0x80010001U);
99 CHECK(ASMBitTestAndSet(&p->au32[0], 16) && p->au32[0] == 0x80010001U);
100 CHECK(!ASMBitTestAndSet(&p->au32[0], 80) && p->au32[2] == 0x00010002U);
101
102 MAP_CLEAR(p);
103 ASMAtomicBitSet(&p->au32[0], 0);
104 ASMAtomicBitSet(&p->au32[0], 30);
105 ASMAtomicBitSet(&p->au32[0], 64);
106 CHECK(p->au32[0] == 0x40000001U);
107 CHECK(p->au32[2] == 0x00000001U);
108 CHECK(ASMAtomicBitTestAndSet(&p->au32[0], 0) && p->au32[0] == 0x40000001U);
109 CHECK(!ASMAtomicBitTestAndSet(&p->au32[0], 16) && p->au32[0] == 0x40010001U);
110 CHECK(ASMAtomicBitTestAndSet(&p->au32[0], 16) && p->au32[0] == 0x40010001U);
111 CHECK(!ASMAtomicBitTestAndSet(&p->au32[0], 80) && p->au32[2] == 0x00010001U);
112
113 /* clear */
114 MAP_SET(p);
115 ASMBitClear(&p->au32[0], 0);
116 ASMBitClear(&p->au32[0], 31);
117 ASMBitClear(&p->au32[0], 65);
118 CHECK(p->au32[0] == ~0x80000001U);
119 CHECK(p->au32[2] == ~0x00000002U);
120 CHECK(!ASMBitTestAndClear(&p->au32[0], 0) && p->au32[0] == ~0x80000001U);
121 CHECK(ASMBitTestAndClear(&p->au32[0], 16) && p->au32[0] == ~0x80010001U);
122 CHECK(!ASMBitTestAndClear(&p->au32[0], 16) && p->au32[0] == ~0x80010001U);
123 CHECK(ASMBitTestAndClear(&p->au32[0], 80) && p->au32[2] == ~0x00010002U);
124
125 MAP_SET(p);
126 ASMAtomicBitClear(&p->au32[0], 0);
127 ASMAtomicBitClear(&p->au32[0], 30);
128 ASMAtomicBitClear(&p->au32[0], 64);
129 CHECK(p->au32[0] == ~0x40000001U);
130 CHECK(p->au32[2] == ~0x00000001U);
131 CHECK(!ASMAtomicBitTestAndClear(&p->au32[0], 0) && p->au32[0] == ~0x40000001U);
132 CHECK(ASMAtomicBitTestAndClear(&p->au32[0], 16) && p->au32[0] == ~0x40010001U);
133 CHECK(!ASMAtomicBitTestAndClear(&p->au32[0], 16) && p->au32[0] == ~0x40010001U);
134 CHECK(ASMAtomicBitTestAndClear(&p->au32[0], 80) && p->au32[2] == ~0x00010001U);
135
136 /* toggle */
137 MAP_SET(p);
138 ASMBitToggle(&p->au32[0], 0);
139 ASMBitToggle(&p->au32[0], 31);
140 ASMBitToggle(&p->au32[0], 65);
141 ASMBitToggle(&p->au32[0], 47);
142 ASMBitToggle(&p->au32[0], 47);
143 CHECK(p->au32[0] == ~0x80000001U);
144 CHECK(p->au32[2] == ~0x00000002U);
145 CHECK(!ASMBitTestAndToggle(&p->au32[0], 0) && p->au32[0] == ~0x80000000U);
146 CHECK(ASMBitTestAndToggle(&p->au32[0], 0) && p->au32[0] == ~0x80000001U);
147 CHECK(ASMBitTestAndToggle(&p->au32[0], 16) && p->au32[0] == ~0x80010001U);
148 CHECK(!ASMBitTestAndToggle(&p->au32[0], 16) && p->au32[0] == ~0x80000001U);
149 CHECK(ASMBitTestAndToggle(&p->au32[0], 80) && p->au32[2] == ~0x00010002U);
150
151 MAP_SET(p);
152 ASMAtomicBitToggle(&p->au32[0], 0);
153 ASMAtomicBitToggle(&p->au32[0], 30);
154 ASMAtomicBitToggle(&p->au32[0], 64);
155 ASMAtomicBitToggle(&p->au32[0], 47);
156 ASMAtomicBitToggle(&p->au32[0], 47);
157 CHECK(p->au32[0] == ~0x40000001U);
158 CHECK(p->au32[2] == ~0x00000001U);
159 CHECK(!ASMAtomicBitTestAndToggle(&p->au32[0], 0) && p->au32[0] == ~0x40000000U);
160 CHECK(ASMAtomicBitTestAndToggle(&p->au32[0], 0) && p->au32[0] == ~0x40000001U);
161 CHECK(ASMAtomicBitTestAndToggle(&p->au32[0], 16) && p->au32[0] == ~0x40010001U);
162 CHECK(!ASMAtomicBitTestAndToggle(&p->au32[0], 16) && p->au32[0] == ~0x40000001U);
163 CHECK(ASMAtomicBitTestAndToggle(&p->au32[0], 80) && p->au32[2] == ~0x00010001U);
164
165 /* test bit. */
166 for (i = 0; i < 128; i++)
167 {
168 MAP_SET(p);
169 CHECK_BIT(ASMBitTest(&p->au32[0], i), i);
170 ASMBitToggle(&p->au32[0], i);
171 CHECK_BIT(!ASMBitTest(&p->au32[0], i), i);
172 CHECK_BIT(!ASMBitTestAndToggle(&p->au32[0], i), i);
173 CHECK_BIT(ASMBitTest(&p->au32[0], i), i);
174 CHECK_BIT(ASMBitTestAndToggle(&p->au32[0], i), i);
175 CHECK_BIT(!ASMBitTest(&p->au32[0], i), i);
176
177 MAP_SET(p);
178 CHECK_BIT(ASMBitTest(&p->au32[0], i), i);
179 ASMAtomicBitToggle(&p->au32[0], i);
180 CHECK_BIT(!ASMBitTest(&p->au32[0], i), i);
181 CHECK_BIT(!ASMAtomicBitTestAndToggle(&p->au32[0], i), i);
182 CHECK_BIT(ASMBitTest(&p->au32[0], i), i);
183 CHECK_BIT(ASMAtomicBitTestAndToggle(&p->au32[0], i), i);
184 CHECK_BIT(!ASMBitTest(&p->au32[0], i), i);
185 }
186
187 /* bit searching */
188 MAP_SET(p);
189 CHECK(ASMBitFirstClear(&p->au32[0], sizeof(p->au32) * 8) == -1);
190 CHECK(ASMBitFirstSet(&p->au32[0], sizeof(p->au32) * 8) == 0);
191
192 ASMBitClear(&p->au32[0], 1);
193 CHECK(ASMBitFirstClear(&p->au32[0], sizeof(p->au32) * 8) == 1);
194 CHECK(ASMBitFirstSet(&p->au32[0], sizeof(p->au32) * 8) == 0);
195
196 MAP_SET(p);
197 ASMBitClear(&p->au32[0], 95);
198 CHECK(ASMBitFirstClear(&p->au32[0], sizeof(p->au32) * 8) == 95);
199 CHECK(ASMBitFirstSet(&p->au32[0], sizeof(p->au32) * 8) == 0);
200
201 MAP_SET(p);
202 ASMBitClear(&p->au32[0], 127);
203 CHECK(ASMBitFirstClear(&p->au32[0], sizeof(p->au32) * 8) == 127);
204 CHECK(ASMBitFirstSet(&p->au32[0], sizeof(p->au32) * 8) == 0);
205 CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, 0) == 1);
206 CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, 1) == 2);
207 CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, 2) == 3);
208
209
210 MAP_SET(p);
211 CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 0) == -1);
212 ASMBitClear(&p->au32[0], 32);
213 CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 32) == -1);
214 ASMBitClear(&p->au32[0], 88);
215 CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 57) == 88);
216
217 MAP_SET(p);
218 ASMBitClear(&p->au32[0], 31);
219 ASMBitClear(&p->au32[0], 57);
220 ASMBitClear(&p->au32[0], 88);
221 ASMBitClear(&p->au32[0], 101);
222 ASMBitClear(&p->au32[0], 126);
223 ASMBitClear(&p->au32[0], 127);
224 CHECK(ASMBitFirstClear(&p->au32[0], sizeof(p->au32) * 8) == 31);
225 CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 31) == 57);
226 CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 57) == 88);
227 CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 88) == 101);
228 CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 101) == 126);
229 CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 126) == 127);
230 CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 127) == -1);
231
232 CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, 29) == 30);
233 CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, 30) == 32);
234
235 MAP_CLEAR(p);
236 for (i = 1; i < 128; i++)
237 CHECK_BIT(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, i - 1) == i, i);
238 for (i = 0; i < 128; i++)
239 {
240 MAP_SET(p);
241 ASMBitClear(&p->au32[0], i);
242 CHECK_BIT(ASMBitFirstClear(&p->au32[0], sizeof(p->au32) * 8) == i, i);
243 for (j = 0; j < i; j++)
244 CHECK_BIT(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, j) == i, i);
245 for (j = i; j < 128; j++)
246 CHECK_BIT(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, j) == -1, i);
247 }
248
249 /* clear range. */
250 MAP_SET(p);
251 ASMBitClearRange(&p->au32, 0, 128);
252 CHECK(!p->au32[0] && !p->au32[1] && !p->au32[2] && !p->au32[3]);
253 for (i = 0; i < 128; i++)
254 {
255 for (j = i + 1; j <= 128; j++)
256 {
257 MAP_SET(p);
258 ASMBitClearRange(&p->au32, i, j);
259 for (k = 0; k < i; k++)
260 CHECK_BIT3(ASMBitTest(&p->au32[0], k), i, j, k);
261 for (k = i; k < j; k++)
262 CHECK_BIT3(!ASMBitTest(&p->au32[0], k), i, j, k);
263 for (k = j; k < 128; k++)
264 CHECK_BIT3(ASMBitTest(&p->au32[0], k), i, j, k);
265 }
266 }
267
268 /* searching for set bits. */
269 MAP_CLEAR(p);
270 CHECK(ASMBitFirstSet(&p->au32[0], sizeof(p->au32) * 8) == -1);
271
272 ASMBitSet(&p->au32[0], 65);
273 CHECK(ASMBitFirstSet(&p->au32[0], sizeof(p->au32) * 8) == 65);
274 CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, 65) == -1);
275 for (i = 0; i < 65; i++)
276 CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, i) == 65);
277 for (i = 65; i < 128; i++)
278 CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, i) == -1);
279
280 ASMBitSet(&p->au32[0], 17);
281 CHECK(ASMBitFirstSet(&p->au32[0], sizeof(p->au32) * 8) == 17);
282 CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, 17) == 65);
283 for (i = 0; i < 16; i++)
284 CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, i) == 17);
285 for (i = 17; i < 65; i++)
286 CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, i) == 65);
287
288 MAP_SET(p);
289 for (i = 1; i < 128; i++)
290 CHECK_BIT(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, i - 1) == i, i);
291 for (i = 0; i < 128; i++)
292 {
293 MAP_CLEAR(p);
294 ASMBitSet(&p->au32[0], i);
295 CHECK_BIT(ASMBitFirstSet(&p->au32[0], sizeof(p->au32) * 8) == i, i);
296 for (j = 0; j < i; j++)
297 CHECK_BIT(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, j) == i, i);
298 for (j = i; j < 128; j++)
299 CHECK_BIT(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, j) == -1, i);
300 }
301
302
303 CHECK(ASMBitLastSetU32(0) == 0);
304 CHECK(ASMBitLastSetU32(1) == 1);
305 CHECK(ASMBitLastSetU32(0x80000000) == 32);
306 CHECK(ASMBitLastSetU32(0xffffffff) == 32);
307 CHECK(ASMBitLastSetU32(RT_BIT(23) | RT_BIT(11)) == 24);
308 for (i = 0; i < 32; i++)
309 CHECK(ASMBitLastSetU32(1 << i) == (unsigned)i + 1);
310
311 CHECK(ASMBitFirstSetU32(0) == 0);
312 CHECK(ASMBitFirstSetU32(1) == 1);
313 CHECK(ASMBitFirstSetU32(0x80000000) == 32);
314 CHECK(ASMBitFirstSetU32(0xffffffff) == 1);
315 CHECK(ASMBitFirstSetU32(RT_BIT(23) | RT_BIT(11)) == 12);
316 for (i = 0; i < 32; i++)
317 CHECK(ASMBitFirstSetU32(1 << i) == (unsigned)i + 1);
318
319 /*
320 * Summary
321 */
322 return RTTestSummaryAndDestroy(hTest);
323}
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette