tstRTBitOperations.cpp revision 4b161f5c8c5ec990096e7aaf34f175dd23c97024
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest/* $Id$ */
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest/** @file
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * IPRT Testcase - Inlined Bit Operations.
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest */
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest/*
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * Copyright (C) 2006-2009 Sun Microsystems, Inc.
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest *
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * This file is part of VirtualBox Open Source Edition (OSE), as
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * available from http://www.virtualbox.org. This file is free software;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * you can redistribute it and/or modify it under the terms of the GNU
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * General Public License (GPL) as published by the Free Software
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * Foundation, in version 2 as it comes in the "COPYING" file of the
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest *
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * The contents of this file may alternatively be used under the terms
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * of the Common Development and Distribution License Version 1.0
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * VirtualBox OSE distribution, in which case the provisions of the
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * CDDL are applicable instead of those of the GPL.
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest *
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * You may elect to license modified versions of this file under the
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * terms and conditions of either the GPL or the CDDL or both.
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest *
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * Clara, CA 95054 USA or visit http://www.sun.com if you need
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * additional information or have any questions.
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest */
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest/*******************************************************************************
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest* Header Files *
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest*******************************************************************************/
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#include <iprt/asm.h>
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#include <iprt/initterm.h>
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#include <iprt/stream.h>
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#include <iprt/string.h>
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#include <iprt/test.h>
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest/*
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * Test 2 - ID allocation using a bitmap.
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest */
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#define NIL_TEST2_ID 0
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#define TEST2_ID_LAST ((RT_BIT_32(28) - 1) >> 8)
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forreststruct TestMap2
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest{
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest uint32_t idNil;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest uint32_t idLast;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest uint32_t idChunkPrev;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest uint32_t bmChunkId[(TEST2_ID_LAST + 1 + 31) / 32];
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest};
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forreststatic uint32_t test2AllocId(struct TestMap2 *p2)
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest{
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest /*
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * Scan sequentially from the last one + 1.
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest */
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest int32_t idChunk = ++p2->idChunkPrev;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest if ( (uint32_t)idChunk < TEST2_ID_LAST
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest && idChunk > NIL_TEST2_ID)
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest {
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest idChunk = ASMBitNextClear(&p2->bmChunkId[0], TEST2_ID_LAST + 1, idChunk);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest if (idChunk > NIL_TEST2_ID)
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest {
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest if (ASMAtomicBitTestAndSet(&p2->bmChunkId[0], idChunk))
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest {
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest RTTestFailed(NIL_RTTEST, "line %d: idChunk=%#x", __LINE__, idChunk);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest return NIL_TEST2_ID;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest }
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest return p2->idChunkPrev = idChunk;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest }
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest }
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest /*
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * Ok, scan from the start.
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest */
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest idChunk = ASMBitFirstClear(&p2->bmChunkId[0], TEST2_ID_LAST + 1);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest if (idChunk <= NIL_TEST2_ID)
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest {
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest RTTestFailed(NIL_RTTEST, "line %d: idChunk=%#x", __LINE__, idChunk);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest return NIL_TEST2_ID;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest }
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest if (ASMAtomicBitTestAndSet(&p2->bmChunkId[0], idChunk))
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest {
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest RTTestFailed(NIL_RTTEST, "line %d: idChunk=%#x", __LINE__, idChunk);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest return NIL_TEST2_ID;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest }
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest return p2->idChunkPrev = idChunk;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest}
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forreststatic void test2(RTTEST hTest)
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest{
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest struct TestMap2 *p2 = (struct TestMap2 *)RTTestGuardedAllocTail(hTest, sizeof(TestMap2));
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest p2->idNil = NIL_TEST2_ID;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest p2->idLast = TEST2_ID_LAST;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest /* Some simple tests first. */
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest RT_ZERO(p2->bmChunkId);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest RTTEST_CHECK(hTest, ASMBitFirstSet(&p2->bmChunkId[0], TEST2_ID_LAST + 1) == -1);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest for (uint32_t iBit = 0; iBit <= TEST2_ID_LAST; iBit++)
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest RTTEST_CHECK(hTest, !ASMBitTest(&p2->bmChunkId[0], iBit));
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest memset(&p2->bmChunkId[0], 0xff, sizeof(p2->bmChunkId));
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest RTTEST_CHECK(hTest, ASMBitFirstClear(&p2->bmChunkId[0], TEST2_ID_LAST + 1) == -1);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest for (uint32_t iBit = 0; iBit <= TEST2_ID_LAST; iBit++)
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest RTTEST_CHECK(hTest, ASMBitTest(&p2->bmChunkId[0], iBit));
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest /* The real test. */
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest p2->idChunkPrev = 0;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest RT_ZERO(p2->bmChunkId);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest ASMBitSet(p2->bmChunkId, NIL_TEST2_ID);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest uint32_t cLeft = TEST2_ID_LAST;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest while (cLeft-- > 0)
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest test2AllocId(p2);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest RTTEST_CHECK(hTest, ASMBitFirstClear(&p2->bmChunkId[0], TEST2_ID_LAST + 1) == -1);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest}
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrestint main()
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest{
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest /*
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * Init the runtime and stuff.
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest */
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest RTTEST hTest;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest if ( RT_FAILURE(RTR3Init())
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest || RT_FAILURE(RTTestCreate("tstRTBitOperations", &hTest)))
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest {
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest RTPrintf("tstRTBitOperations: fatal initialization error\n");
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest return 1;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest }
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest RTTestBanner(hTest);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest int rcRet = 0;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest int i;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest int j;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest int k;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest /*
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest * Tests
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest */
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest struct TestMap
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest {
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest uint32_t au32[4];
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest };
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#if 0
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest struct TestMap sTest;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest struct TestMap *p = &sTest;
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#else
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest struct TestMap *p = (struct TestMap *)RTTestGuardedAllocTail(hTest, sizeof(*p));
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#endif
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#define DUMP() RTTestPrintf(hTest, RTTESTLVL_INFO, "au32={%08x,%08x,%08x,%08x}", p->au32[0], p->au32[1], p->au32[2], p->au32[3])
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#define CHECK(expr) do { if (!(expr)) { RTTestFailed(hTest, "line %d: %s", __LINE__, #expr); DUMP(); } CHECK_GUARD(s); } while (0)
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#define CHECK_BIT(expr, b1) do { if (!(expr)) { RTTestFailed(hTest, "line %d, b1=%d: %s", __LINE__, b1, #expr); } CHECK_GUARD(s); } while (0)
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#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)
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#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)
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#define GUARD_MAP(p) do { } while (0)
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#define CHECK_GUARD(p) do { } while (0)
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#define MAP_CLEAR(p) do { RT_ZERO(*(p)); GUARD_MAP(p); } while (0)
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest#define MAP_SET(p) do { memset(p, 0xff, sizeof(*(p))); GUARD_MAP(p); } while (0)
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest /* self check. */
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest MAP_CLEAR(p);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest CHECK_GUARD(p);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest /* set */
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest MAP_CLEAR(p);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest ASMBitSet(&p->au32[0], 0);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest ASMBitSet(&p->au32[0], 31);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest ASMBitSet(&p->au32[0], 65);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest CHECK(p->au32[0] == 0x80000001U);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest CHECK(p->au32[2] == 0x00000002U);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest CHECK(ASMBitTestAndSet(&p->au32[0], 0) && p->au32[0] == 0x80000001U);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest CHECK(!ASMBitTestAndSet(&p->au32[0], 16) && p->au32[0] == 0x80010001U);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest CHECK(ASMBitTestAndSet(&p->au32[0], 16) && p->au32[0] == 0x80010001U);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest CHECK(!ASMBitTestAndSet(&p->au32[0], 80) && p->au32[2] == 0x00010002U);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest MAP_CLEAR(p);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest ASMAtomicBitSet(&p->au32[0], 0);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest ASMAtomicBitSet(&p->au32[0], 30);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest ASMAtomicBitSet(&p->au32[0], 64);
0fe99aaa2652cb97bbd71876ea28074e6241c3c0Andrew Forrest CHECK(p->au32[0] == 0x40000001U);
CHECK(p->au32[2] == 0x00000001U);
CHECK(ASMAtomicBitTestAndSet(&p->au32[0], 0) && p->au32[0] == 0x40000001U);
CHECK(!ASMAtomicBitTestAndSet(&p->au32[0], 16) && p->au32[0] == 0x40010001U);
CHECK(ASMAtomicBitTestAndSet(&p->au32[0], 16) && p->au32[0] == 0x40010001U);
CHECK(!ASMAtomicBitTestAndSet(&p->au32[0], 80) && p->au32[2] == 0x00010001U);
/* clear */
MAP_SET(p);
ASMBitClear(&p->au32[0], 0);
ASMBitClear(&p->au32[0], 31);
ASMBitClear(&p->au32[0], 65);
CHECK(p->au32[0] == ~0x80000001U);
CHECK(p->au32[2] == ~0x00000002U);
CHECK(!ASMBitTestAndClear(&p->au32[0], 0) && p->au32[0] == ~0x80000001U);
CHECK(ASMBitTestAndClear(&p->au32[0], 16) && p->au32[0] == ~0x80010001U);
CHECK(!ASMBitTestAndClear(&p->au32[0], 16) && p->au32[0] == ~0x80010001U);
CHECK(ASMBitTestAndClear(&p->au32[0], 80) && p->au32[2] == ~0x00010002U);
MAP_SET(p);
ASMAtomicBitClear(&p->au32[0], 0);
ASMAtomicBitClear(&p->au32[0], 30);
ASMAtomicBitClear(&p->au32[0], 64);
CHECK(p->au32[0] == ~0x40000001U);
CHECK(p->au32[2] == ~0x00000001U);
CHECK(!ASMAtomicBitTestAndClear(&p->au32[0], 0) && p->au32[0] == ~0x40000001U);
CHECK(ASMAtomicBitTestAndClear(&p->au32[0], 16) && p->au32[0] == ~0x40010001U);
CHECK(!ASMAtomicBitTestAndClear(&p->au32[0], 16) && p->au32[0] == ~0x40010001U);
CHECK(ASMAtomicBitTestAndClear(&p->au32[0], 80) && p->au32[2] == ~0x00010001U);
/* toggle */
MAP_SET(p);
ASMBitToggle(&p->au32[0], 0);
ASMBitToggle(&p->au32[0], 31);
ASMBitToggle(&p->au32[0], 65);
ASMBitToggle(&p->au32[0], 47);
ASMBitToggle(&p->au32[0], 47);
CHECK(p->au32[0] == ~0x80000001U);
CHECK(p->au32[2] == ~0x00000002U);
CHECK(!ASMBitTestAndToggle(&p->au32[0], 0) && p->au32[0] == ~0x80000000U);
CHECK(ASMBitTestAndToggle(&p->au32[0], 0) && p->au32[0] == ~0x80000001U);
CHECK(ASMBitTestAndToggle(&p->au32[0], 16) && p->au32[0] == ~0x80010001U);
CHECK(!ASMBitTestAndToggle(&p->au32[0], 16) && p->au32[0] == ~0x80000001U);
CHECK(ASMBitTestAndToggle(&p->au32[0], 80) && p->au32[2] == ~0x00010002U);
MAP_SET(p);
ASMAtomicBitToggle(&p->au32[0], 0);
ASMAtomicBitToggle(&p->au32[0], 30);
ASMAtomicBitToggle(&p->au32[0], 64);
ASMAtomicBitToggle(&p->au32[0], 47);
ASMAtomicBitToggle(&p->au32[0], 47);
CHECK(p->au32[0] == ~0x40000001U);
CHECK(p->au32[2] == ~0x00000001U);
CHECK(!ASMAtomicBitTestAndToggle(&p->au32[0], 0) && p->au32[0] == ~0x40000000U);
CHECK(ASMAtomicBitTestAndToggle(&p->au32[0], 0) && p->au32[0] == ~0x40000001U);
CHECK(ASMAtomicBitTestAndToggle(&p->au32[0], 16) && p->au32[0] == ~0x40010001U);
CHECK(!ASMAtomicBitTestAndToggle(&p->au32[0], 16) && p->au32[0] == ~0x40000001U);
CHECK(ASMAtomicBitTestAndToggle(&p->au32[0], 80) && p->au32[2] == ~0x00010001U);
/* test bit. */
for (i = 0; i < 128; i++)
{
MAP_SET(p);
CHECK_BIT(ASMBitTest(&p->au32[0], i), i);
ASMBitToggle(&p->au32[0], i);
CHECK_BIT(!ASMBitTest(&p->au32[0], i), i);
CHECK_BIT(!ASMBitTestAndToggle(&p->au32[0], i), i);
CHECK_BIT(ASMBitTest(&p->au32[0], i), i);
CHECK_BIT(ASMBitTestAndToggle(&p->au32[0], i), i);
CHECK_BIT(!ASMBitTest(&p->au32[0], i), i);
MAP_SET(p);
CHECK_BIT(ASMBitTest(&p->au32[0], i), i);
ASMAtomicBitToggle(&p->au32[0], i);
CHECK_BIT(!ASMBitTest(&p->au32[0], i), i);
CHECK_BIT(!ASMAtomicBitTestAndToggle(&p->au32[0], i), i);
CHECK_BIT(ASMBitTest(&p->au32[0], i), i);
CHECK_BIT(ASMAtomicBitTestAndToggle(&p->au32[0], i), i);
CHECK_BIT(!ASMBitTest(&p->au32[0], i), i);
}
/* bit searching */
MAP_SET(p);
CHECK(ASMBitFirstClear(&p->au32[0], sizeof(p->au32) * 8) == -1);
CHECK(ASMBitFirstSet(&p->au32[0], sizeof(p->au32) * 8) == 0);
ASMBitClear(&p->au32[0], 1);
CHECK(ASMBitFirstClear(&p->au32[0], sizeof(p->au32) * 8) == 1);
CHECK(ASMBitFirstSet(&p->au32[0], sizeof(p->au32) * 8) == 0);
MAP_SET(p);
ASMBitClear(&p->au32[0], 95);
CHECK(ASMBitFirstClear(&p->au32[0], sizeof(p->au32) * 8) == 95);
CHECK(ASMBitFirstSet(&p->au32[0], sizeof(p->au32) * 8) == 0);
MAP_SET(p);
ASMBitClear(&p->au32[0], 127);
CHECK(ASMBitFirstClear(&p->au32[0], sizeof(p->au32) * 8) == 127);
CHECK(ASMBitFirstSet(&p->au32[0], sizeof(p->au32) * 8) == 0);
CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, 0) == 1);
CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, 1) == 2);
CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, 2) == 3);
MAP_SET(p);
CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 0) == -1);
ASMBitClear(&p->au32[0], 32);
CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 32) == -1);
ASMBitClear(&p->au32[0], 88);
CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 57) == 88);
MAP_SET(p);
ASMBitClear(&p->au32[0], 31);
ASMBitClear(&p->au32[0], 57);
ASMBitClear(&p->au32[0], 88);
ASMBitClear(&p->au32[0], 101);
ASMBitClear(&p->au32[0], 126);
ASMBitClear(&p->au32[0], 127);
CHECK(ASMBitFirstClear(&p->au32[0], sizeof(p->au32) * 8) == 31);
CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 31) == 57);
CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 57) == 88);
CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 88) == 101);
CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 101) == 126);
CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 126) == 127);
CHECK(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, 127) == -1);
CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, 29) == 30);
CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, 30) == 32);
MAP_CLEAR(p);
for (i = 1; i < 128; i++)
CHECK_BIT(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, i - 1) == i, i);
for (i = 0; i < 128; i++)
{
MAP_SET(p);
ASMBitClear(&p->au32[0], i);
CHECK_BIT(ASMBitFirstClear(&p->au32[0], sizeof(p->au32) * 8) == i, i);
for (j = 0; j < i; j++)
CHECK_BIT(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, j) == i, i);
for (j = i; j < 128; j++)
CHECK_BIT(ASMBitNextClear(&p->au32[0], sizeof(p->au32) * 8, j) == -1, i);
}
/* clear range. */
MAP_SET(p);
ASMBitClearRange(&p->au32, 0, 128);
CHECK(!p->au32[0] && !p->au32[1] && !p->au32[2] && !p->au32[3]);
for (i = 0; i < 128; i++)
{
for (j = i + 1; j <= 128; j++)
{
MAP_SET(p);
ASMBitClearRange(&p->au32, i, j);
for (k = 0; k < i; k++)
CHECK_BIT3(ASMBitTest(&p->au32[0], k), i, j, k);
for (k = i; k < j; k++)
CHECK_BIT3(!ASMBitTest(&p->au32[0], k), i, j, k);
for (k = j; k < 128; k++)
CHECK_BIT3(ASMBitTest(&p->au32[0], k), i, j, k);
}
}
/* searching for set bits. */
MAP_CLEAR(p);
CHECK(ASMBitFirstSet(&p->au32[0], sizeof(p->au32) * 8) == -1);
ASMBitSet(&p->au32[0], 65);
CHECK(ASMBitFirstSet(&p->au32[0], sizeof(p->au32) * 8) == 65);
CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, 65) == -1);
for (i = 0; i < 65; i++)
CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, i) == 65);
for (i = 65; i < 128; i++)
CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, i) == -1);
ASMBitSet(&p->au32[0], 17);
CHECK(ASMBitFirstSet(&p->au32[0], sizeof(p->au32) * 8) == 17);
CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, 17) == 65);
for (i = 0; i < 16; i++)
CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, i) == 17);
for (i = 17; i < 65; i++)
CHECK(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, i) == 65);
MAP_SET(p);
for (i = 1; i < 128; i++)
CHECK_BIT(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, i - 1) == i, i);
for (i = 0; i < 128; i++)
{
MAP_CLEAR(p);
ASMBitSet(&p->au32[0], i);
CHECK_BIT(ASMBitFirstSet(&p->au32[0], sizeof(p->au32) * 8) == i, i);
for (j = 0; j < i; j++)
CHECK_BIT(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, j) == i, i);
for (j = i; j < 128; j++)
CHECK_BIT(ASMBitNextSet(&p->au32[0], sizeof(p->au32) * 8, j) == -1, i);
}
CHECK(ASMBitLastSetU32(0) == 0);
CHECK(ASMBitLastSetU32(1) == 1);
CHECK(ASMBitLastSetU32(0x80000000) == 32);
CHECK(ASMBitLastSetU32(0xffffffff) == 32);
CHECK(ASMBitLastSetU32(RT_BIT(23) | RT_BIT(11)) == 24);
for (i = 0; i < 32; i++)
CHECK(ASMBitLastSetU32(1 << i) == (unsigned)i + 1);
CHECK(ASMBitFirstSetU32(0) == 0);
CHECK(ASMBitFirstSetU32(1) == 1);
CHECK(ASMBitFirstSetU32(0x80000000) == 32);
CHECK(ASMBitFirstSetU32(0xffffffff) == 1);
CHECK(ASMBitFirstSetU32(RT_BIT(23) | RT_BIT(11)) == 12);
for (i = 0; i < 32; i++)
CHECK(ASMBitFirstSetU32(1 << i) == (unsigned)i + 1);
/*
* Special tests.
*/
test2(hTest);
/*
* Summary
*/
return RTTestSummaryAndDestroy(hTest);
}