tstBitOperations.cpp revision 3e6c6998d1dfeded8b9a23f5aa94ad63e9a681d9
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk/* $Id$ */
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk/** @file
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk * innotek Portable Runtime Testcase - Inlined Bit Operations.
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk */
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk/*
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk * Copyright (C) 2006-2007 innotek GmbH
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk *
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk * This file is part of VirtualBox Open Source Edition (OSE), as
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk * available from http://www.virtualbox.org. This file is free software;
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk * you can redistribute it and/or modify it under the terms of the GNU
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk * General Public License as published by the Free Software Foundation,
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk * distribution. VirtualBox OSE is distributed in the hope that it will
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk * be useful, but WITHOUT ANY WARRANTY of any kind.
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk */
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk/*******************************************************************************
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk* Header Files *
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk*******************************************************************************/
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk#include <iprt/asm.h>
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk#include <iprt/stream.h>
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk#include <iprt/string.h>
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenkint main()
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk{
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk int rcRet = 0;
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk int i;
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk int j;
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk int k;
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk RTPrintf("tstBitOperations: TESTING\n");
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk /*
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk * Tests
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk */
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk uint32_t au32[4];
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk #define MAP_CLEAR(a) memset(&a, 0, sizeof(a));
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk #define MAP_SET(a) memset(&a, 0xff, sizeof(a));
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk #define DUMP() RTPrintf("au32={%08x,%08x,%08x,%08x}\n", au32[0], au32[1], au32[2], au32[3])
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk #define CHECK(expr) do { if (!(expr)) { RTPrintf("tstBitOperations: error line %d: %s\n", __LINE__, #expr); DUMP(); rcRet++; } } while (0)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk #define CHECK_BIT(expr, b1) do { if (!(expr)) { RTPrintf("tstBitOperations: error line %d, b1=%d: %s\n", __LINE__, b1, #expr); rcRet++; } } while (0)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk #define CHECK_BIT2(expr, b1, b2) do { if (!(expr)) { RTPrintf("tstBitOperations: error line %d, b1=%d b2=%d: %s\n", __LINE__, b1, b2, #expr); rcRet++; } } while (0)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk #define CHECK_BIT3(expr, b1, b2, b3) do { if (!(expr)) { RTPrintf("tstBitOperations: error line %d, b1=%d b2=%d b3=%d: %s\n", __LINE__, b1, b2, b3, #expr); rcRet++; } } while (0)
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk /* set */
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_CLEAR(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitSet(&au32[0], 0);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitSet(&au32[0], 31);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitSet(&au32[0], 65);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(au32[0] == 0x80000001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(au32[2] == 0x00000002U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitTestAndSet(&au32[0], 0) && au32[0] == 0x80000001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(!ASMBitTestAndSet(&au32[0], 16) && au32[0] == 0x80010001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitTestAndSet(&au32[0], 16) && au32[0] == 0x80010001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(!ASMBitTestAndSet(&au32[0], 80) && au32[2] == 0x00010002U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_CLEAR(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMAtomicBitSet(&au32[0], 0);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMAtomicBitSet(&au32[0], 30);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMAtomicBitSet(&au32[0], 64);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(au32[0] == 0x40000001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(au32[2] == 0x00000001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMAtomicBitTestAndSet(&au32[0], 0) && au32[0] == 0x40000001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(!ASMAtomicBitTestAndSet(&au32[0], 16) && au32[0] == 0x40010001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMAtomicBitTestAndSet(&au32[0], 16) && au32[0] == 0x40010001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(!ASMAtomicBitTestAndSet(&au32[0], 80) && au32[2] == 0x00010001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk /* clear */
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_SET(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitClear(&au32[0], 0);
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk ASMBitClear(&au32[0], 31);
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk ASMBitClear(&au32[0], 65);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(au32[0] == ~0x80000001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(au32[2] == ~0x00000002U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(!ASMBitTestAndClear(&au32[0], 0) && au32[0] == ~0x80000001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitTestAndClear(&au32[0], 16) && au32[0] == ~0x80010001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(!ASMBitTestAndClear(&au32[0], 16) && au32[0] == ~0x80010001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitTestAndClear(&au32[0], 80) && au32[2] == ~0x00010002U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk MAP_SET(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMAtomicBitClear(&au32[0], 0);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMAtomicBitClear(&au32[0], 30);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMAtomicBitClear(&au32[0], 64);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(au32[0] == ~0x40000001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(au32[2] == ~0x00000001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(!ASMAtomicBitTestAndClear(&au32[0], 0) && au32[0] == ~0x40000001U);
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk CHECK(ASMAtomicBitTestAndClear(&au32[0], 16) && au32[0] == ~0x40010001U);
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk CHECK(!ASMAtomicBitTestAndClear(&au32[0], 16) && au32[0] == ~0x40010001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMAtomicBitTestAndClear(&au32[0], 80) && au32[2] == ~0x00010001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk /* toggle */
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_SET(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitToggle(&au32[0], 0);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitToggle(&au32[0], 31);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitToggle(&au32[0], 65);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitToggle(&au32[0], 47);
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk ASMBitToggle(&au32[0], 47);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(au32[0] == ~0x80000001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(au32[2] == ~0x00000002U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(!ASMBitTestAndToggle(&au32[0], 0) && au32[0] == ~0x80000000U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitTestAndToggle(&au32[0], 0) && au32[0] == ~0x80000001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitTestAndToggle(&au32[0], 16) && au32[0] == ~0x80010001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(!ASMBitTestAndToggle(&au32[0], 16) && au32[0] == ~0x80000001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitTestAndToggle(&au32[0], 80) && au32[2] == ~0x00010002U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_SET(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMAtomicBitToggle(&au32[0], 0);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMAtomicBitToggle(&au32[0], 30);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMAtomicBitToggle(&au32[0], 64);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMAtomicBitToggle(&au32[0], 47);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMAtomicBitToggle(&au32[0], 47);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(au32[0] == ~0x40000001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(au32[2] == ~0x00000001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(!ASMAtomicBitTestAndToggle(&au32[0], 0) && au32[0] == ~0x40000000U);
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk CHECK(ASMAtomicBitTestAndToggle(&au32[0], 0) && au32[0] == ~0x40000001U);
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk CHECK(ASMAtomicBitTestAndToggle(&au32[0], 16) && au32[0] == ~0x40010001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(!ASMAtomicBitTestAndToggle(&au32[0], 16) && au32[0] == ~0x40000001U);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMAtomicBitTestAndToggle(&au32[0], 80) && au32[2] == ~0x00010001U);
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk /* test bit. */
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (i = 0; i < 128; i++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk {
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_SET(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(ASMBitTest(&au32[0], i), i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitToggle(&au32[0], i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(!ASMBitTest(&au32[0], i), i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(!ASMBitTestAndToggle(&au32[0], i), i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(ASMBitTest(&au32[0], i), i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(ASMBitTestAndToggle(&au32[0], i), i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(!ASMBitTest(&au32[0], i), i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_SET(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(ASMBitTest(&au32[0], i), i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMAtomicBitToggle(&au32[0], i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(!ASMBitTest(&au32[0], i), i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(!ASMAtomicBitTestAndToggle(&au32[0], i), i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(ASMBitTest(&au32[0], i), i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(ASMAtomicBitTestAndToggle(&au32[0], i), i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(!ASMBitTest(&au32[0], i), i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk }
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk /* bit searching */
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_SET(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstClear(&au32[0], sizeof(au32) * 8) == -1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstSet(&au32[0], sizeof(au32) * 8) == 0);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitClear(&au32[0], 1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstClear(&au32[0], sizeof(au32) * 8) == 1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstSet(&au32[0], sizeof(au32) * 8) == 0);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_SET(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitClear(&au32[0], 95);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstClear(&au32[0], sizeof(au32) * 8) == 95);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstSet(&au32[0], sizeof(au32) * 8) == 0);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_SET(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitClear(&au32[0], 127);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstClear(&au32[0], sizeof(au32) * 8) == 127);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstSet(&au32[0], sizeof(au32) * 8) == 0);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextSet(&au32[0], sizeof(au32) * 8, 0) == 1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextSet(&au32[0], sizeof(au32) * 8, 1) == 2);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextSet(&au32[0], sizeof(au32) * 8, 2) == 3);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_SET(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextClear(&au32[0], sizeof(au32) * 8, 0) == -1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitClear(&au32[0], 32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextClear(&au32[0], sizeof(au32) * 8, 32) == -1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitClear(&au32[0], 88);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextClear(&au32[0], sizeof(au32) * 8, 57) == 88);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_SET(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitClear(&au32[0], 31);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitClear(&au32[0], 57);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitClear(&au32[0], 88);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitClear(&au32[0], 101);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitClear(&au32[0], 126);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitClear(&au32[0], 127);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstClear(&au32[0], sizeof(au32) * 8) == 31);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextClear(&au32[0], sizeof(au32) * 8, 31) == 57);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextClear(&au32[0], sizeof(au32) * 8, 57) == 88);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextClear(&au32[0], sizeof(au32) * 8, 88) == 101);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextClear(&au32[0], sizeof(au32) * 8, 101) == 126);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextClear(&au32[0], sizeof(au32) * 8, 126) == 127);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextClear(&au32[0], sizeof(au32) * 8, 127) == -1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextSet(&au32[0], sizeof(au32) * 8, 29) == 30);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextSet(&au32[0], sizeof(au32) * 8, 30) == 32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_CLEAR(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (i = 1; i < 128; i++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(ASMBitNextClear(&au32[0], sizeof(au32) * 8, i - 1) == i, i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (i = 0; i < 128; i++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk {
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_SET(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitClear(&au32[0], i);
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk CHECK_BIT(ASMBitFirstClear(&au32[0], sizeof(au32) * 8) == i, i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (j = 0; j < i; j++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(ASMBitNextClear(&au32[0], sizeof(au32) * 8, j) == i, i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (j = i; j < 128; j++)
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk CHECK_BIT(ASMBitNextClear(&au32[0], sizeof(au32) * 8, j) == -1, i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk }
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk /* clear range. */
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_SET(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitClearRange(&au32, 0, 128);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(!au32[0] && !au32[1] && !au32[2] && !au32[3]);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (i = 0; i < 128; i++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk {
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (j = i + 1; j <= 128; j++)
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk {
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_SET(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitClearRange(&au32, i, j);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (k = 0; k < i; k++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT3(ASMBitTest(&au32[0], k), i, j, k);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (k = i; k < j; k++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT3(!ASMBitTest(&au32[0], k), i, j, k);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (k = j; k < 128; k++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT3(ASMBitTest(&au32[0], k), i, j, k);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk }
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk }
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk /* searching for set bits. */
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_CLEAR(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstSet(&au32[0], sizeof(au32) * 8) == -1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitSet(&au32[0], 65);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstSet(&au32[0], sizeof(au32) * 8) == 65);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextSet(&au32[0], sizeof(au32) * 8, 65) == -1);
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk for (i = 0; i < 65; i++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextSet(&au32[0], sizeof(au32) * 8, i) == 65);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (i = 65; i < 128; i++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextSet(&au32[0], sizeof(au32) * 8, i) == -1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitSet(&au32[0], 17);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstSet(&au32[0], sizeof(au32) * 8) == 17);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextSet(&au32[0], sizeof(au32) * 8, 17) == 65);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (i = 0; i < 16; i++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextSet(&au32[0], sizeof(au32) * 8, i) == 17);
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk for (i = 17; i < 65; i++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextSet(&au32[0], sizeof(au32) * 8, i) == 65);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_SET(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (i = 1; i < 128; i++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(ASMBitNextSet(&au32[0], sizeof(au32) * 8, i - 1) == i, i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (i = 0; i < 128; i++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk {
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk MAP_CLEAR(au32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk ASMBitSet(&au32[0], i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(ASMBitFirstSet(&au32[0], sizeof(au32) * 8) == i, i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (j = 0; j < i; j++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(ASMBitNextSet(&au32[0], sizeof(au32) * 8, j) == i, i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (j = i; j < 128; j++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(ASMBitNextSet(&au32[0], sizeof(au32) * 8, j) == -1, i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk }
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitLastSetU32(0) == 0);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitLastSetU32(1) == 1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitLastSetU32(0x80000000) == 32);
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk CHECK(ASMBitLastSetU32(0xffffffff) == 32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitLastSetU32(RT_BIT(23) | RT_BIT(11)) == 24);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (i = 0; i < 32; i++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitLastSetU32(1 << i) == (unsigned)i + 1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk CHECK(ASMBitFirstSetU32(0) == 0);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstSetU32(1) == 1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstSetU32(0x80000000) == 32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstSetU32(0xffffffff) == 1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstSetU32(RT_BIT(23) | RT_BIT(11)) == 12);
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk for (i = 0; i < 32; i++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstSetU32(1 << i) == (unsigned)i + 1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk /*
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk * Summary
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk */
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk if (!rcRet)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk RTPrintf("tstBitOperations: SUCCESS\n");
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk else
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk RTPrintf("tstBitOperations: FAILURE - %d errors\n", rcRet);
dbcf55756e293292dfbfbb75fe317dd094b0585fjeff.schenk return rcRet;
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk}
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk