tstBitOperations.cpp revision 3e6c6998d1dfeded8b9a23f5aa94ad63e9a681d9
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk * innotek Portable Runtime Testcase - Inlined Bit Operations.
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk * Copyright (C) 2006-2007 innotek GmbH
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/*******************************************************************************
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk* Header Files *
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk*******************************************************************************/
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)
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 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 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 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 /* toggle */
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 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);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk /* test bit. */
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (i = 0; i < 128; i++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(!ASMBitTestAndToggle(&au32[0], i), i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(!ASMAtomicBitTestAndToggle(&au32[0], i), i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(ASMAtomicBitTestAndToggle(&au32[0], i), i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk /* bit searching */
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstClear(&au32[0], sizeof(au32) * 8) == -1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstSet(&au32[0], sizeof(au32) * 8) == 0);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstClear(&au32[0], sizeof(au32) * 8) == 1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstSet(&au32[0], sizeof(au32) * 8) == 0);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstClear(&au32[0], sizeof(au32) * 8) == 95);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstSet(&au32[0], sizeof(au32) * 8) == 0);
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 CHECK(ASMBitNextClear(&au32[0], sizeof(au32) * 8, 0) == -1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextClear(&au32[0], sizeof(au32) * 8, 32) == -1);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextClear(&au32[0], sizeof(au32) * 8, 57) == 88);
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 CHECK(ASMBitNextSet(&au32[0], sizeof(au32) * 8, 29) == 30);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextSet(&au32[0], sizeof(au32) * 8, 30) == 32);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(ASMBitNextClear(&au32[0], sizeof(au32) * 8, i - 1) == i, i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (i = 0; i < 128; 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 /* clear range. */
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(!au32[0] && !au32[1] && !au32[2] && !au32[3]);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (i = 0; i < 128; i++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (k = 0; k < i; k++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (k = i; k < j; k++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (k = j; k < 128; k++)
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk /* searching for set bits. */
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitFirstSet(&au32[0], sizeof(au32) * 8) == -1);
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 CHECK(ASMBitNextSet(&au32[0], sizeof(au32) * 8, i) == -1);
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);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK(ASMBitNextSet(&au32[0], sizeof(au32) * 8, i) == 65);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk CHECK_BIT(ASMBitNextSet(&au32[0], sizeof(au32) * 8, i - 1) == i, i);
faaa489e1cc905efd364e01fe09111173c95db68jeff.schenk for (i = 0; i < 128; 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 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 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 RTPrintf("tstBitOperations: FAILURE - %d errors\n", rcRet);