| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576 |
- Test:y_cell_ReverseBits0()
- {
- ASSERT(Cell_ReverseBits(0) == 0x00000000);
- ASSERT(Cell_ReverseBits(1) == 0x80000000);
- ASSERT(Cell_ReverseBits(2) == 0x40000000);
- ASSERT(Cell_ReverseBits(3) == 0xC0000000);
- ASSERT(Cell_ReverseBits(4) == 0x20000000);
- ASSERT(Cell_ReverseBits(0b01010101010) == 0b01010101010000000000000000000000);
- ASSERT(Cell_ReverseBits(0b1111000001111000011) == 0b11000011110000011110000000000000);
- }
- Test:y_cell_ExpandCompress()
- {
- new o, x, m, n;
- //printf("1");
- o = 0b11110000101001011100001100001111;
- m = 0b01010000000000000000000000000000;
- //PRINT(x);
- x = Cell_CompressRight(o, m);
- n = Cell_ExpandLeft(x, m);
- ASSERT(o & m == n);
- ASSERT(x == 0b00000000000000000000000000000011);
- //PRINT(n);
- //printf("2");
- o = 0b11110000101001011100001100001111;
- m = 0b01010101010100000000000000000000;
- //PRINT(x);
- x = Cell_CompressRight(o, m);
- n = Cell_ExpandLeft(x, m);
- ASSERT(o & m == n);
- ASSERT(x == 0b00000000000000000000000000110000);
- //PRINT(n);
- //printf("3");
- o = 0b11110000101001011100001100001111;
- m = 0b00111100000000000000000000000000;
- //PRINT(x);
- x = Cell_CompressRight(o, m);
- n = Cell_ExpandLeft(x, m);
- ASSERT(o & m == n);
- ASSERT(x == 0b00000000000000000000000000001100);
- //PRINT(n);
- //printf("4");
- o = 0b11110000101001011100001100001111;
- m = 0b00000000000000000000111111111111;
- //PRINT(x);
- x = Cell_CompressRight(o, m);
- n = Cell_ExpandLeft(x, m);
- ASSERT(o & m == n);
- ASSERT(x == 0b00000000000000000000001100001111);
- //PRINT(n);
- //printf("5");
- o = 0b11110000101001011100001100001111;
- m = 0b00000000000000000000111111000000;
- //PRINT(x);
- x = Cell_CompressRight(o, m);
- n = Cell_ExpandLeft(x, m);
- ASSERT(o & m == n);
- ASSERT(x == 0b00000000000000000000000000001100);
- //PRINT(n);
- //printf("6");
- o = 0b11110000101001011100001100001111;
- m = 0b00000110000000100001100001100000;
- //PRINT(x);
- x = Cell_CompressRight(o, m);
- n = Cell_ExpandLeft(x, m);
- ASSERT(o & m == n);
- ASSERT(x == 0b00000000000000000000000000000000);
- //PRINT(n);
- }
- // Test:y_cell_ReverseBits1()
- // {
- // for (new i = 0; i != 1000000; ++i)
- // {
- // new
- // count = 0;
- // for (new j = 0x80000000, k = 1; j; j >>>= 1, k <<= 1)
- // {
- // if (i & j) count |= k;
- // }
- // if (Cell_ReverseBits(i) != count)
- // {
- // ASSERT(Cell_ReverseBits(i) == count);
- // break;
- // }
- // }
- // }
- // Test:y_cell_ReverseBits2()
- // {
- // for (new i = 1000000000; i != 1000123000; ++i)
- // {
- // new
- // count = 0;
- // for (new j = 0x80000000, k = 1; j; j >>>= 1, k <<= 1)
- // {
- // if (i & j) count |= k;
- // }
- // if (Cell_ReverseBits(i) != count)
- // {
- // ASSERT(Cell_ReverseBits(i) == count);
- // break;
- // }
- // }
- // }
- // Test:y_cell_ReverseBits3()
- // {
- // for (new i = -999888; i != 0; ++i)
- // {
- // new
- // count = 0;
- // for (new j = 0x80000000, k = 1; j; j >>>= 1, k <<= 1)
- // {
- // if (i & j) count |= k;
- // }
- // if (Cell_ReverseBits(i) != count)
- // {
- // ASSERT(Cell_ReverseBits(i) == count);
- // break;
- // }
- // }
- // }
- Test:y_cell_ReverseNibbles0()
- {
- ASSERT(Cell_ReverseNibbles(0) == 0);
- ASSERT(Cell_ReverseNibbles(1) == 0x10000000);
- ASSERT(Cell_ReverseNibbles(2) == 0x20000000);
- ASSERT(Cell_ReverseNibbles(3) == 0x30000000);
- ASSERT(Cell_ReverseNibbles(4) == 0x40000000);
- ASSERT(Cell_ReverseNibbles(0b1010101010) == 0b10101010001000000000000000000000);
- ASSERT(Cell_ReverseNibbles(0b1111000001111000011) == 0b00111100001110000111000000000000);
- }
- // Test:y_cell_ReverseNibbles1()
- // {
- // for (new i = 0; i != 1000000; ++i)
- // {
- // new
- // count = 0,
- // k = i;
- // for (new j = 0; j != 8; ++j)
- // {
- // count <<= 4;
- // count |= k & 0x0F;
- // k >>>= 4;
- // }
- // if (Cell_ReverseNibbles(i) != count)
- // {
- // ASSERT(Cell_ReverseNibbles(i) == count);
- // break;
- // }
- // }
- // }
- // Test:y_cell_ReverseNibbles2()
- // {
- // for (new i = 1000000000; i != 1000123000; ++i)
- // {
- // new
- // count = 0,
- // k = i;
- // for (new j = 0; j != 8; ++j)
- // {
- // count <<= 4;
- // count |= k & 0x0F;
- // k >>>= 4;
- // }
- // if (Cell_ReverseNibbles(i) != count)
- // {
- // ASSERT(Cell_ReverseNibbles(i) == count);
- // break;
- // }
- // }
- // }
- // Test:y_cell_ReverseNibbles3()
- // {
- // for (new i = -999888; i != 0; ++i)
- // {
- // new
- // count = 0,
- // k = i;
- // for (new j = 0; j != 8; ++j)
- // {
- // count <<= 4;
- // count |= k & 0x0F;
- // k >>>= 4;
- // }
- // if (Cell_ReverseNibbles(i) != count)
- // {
- // ASSERT(Cell_ReverseNibbles(i) == count);
- // break;
- // }
- // }
- // }
- Test:y_cell_ReverseBytes0()
- {
- ASSERT(Cell_ReverseBytes(0) == 0);
- ASSERT(Cell_ReverseBytes(1) == 0x01000000);
- ASSERT(Cell_ReverseBytes(2) == 0x02000000);
- ASSERT(Cell_ReverseBytes(3) == 0x03000000);
- ASSERT(Cell_ReverseBytes(4) == 0x04000000);
- ASSERT(Cell_ReverseBytes(0b1010101010) == 0b10101010000000100000000000000000);
- ASSERT(Cell_ReverseBytes(0b1111000001111000011) == 0b11000011100000110000011100000000);
- }
- // Test:y_cell_ReverseBytes1()
- // {
- // for (new i = 0; i != 1000000; ++i)
- // {
- // new
- // count = 0,
- // k = i;
- // for (new j = 0; j != 4; ++j)
- // {
- // count <<= 8;
- // count |= k & 0xFF;
- // k >>>= 8;
- // }
- // if (Cell_ReverseBytes(i) != count)
- // {
- // ASSERT(Cell_ReverseBytes(i) == count);
- // break;
- // }
- // }
- // }
- // Test:y_cell_ReverseBytes2()
- // {
- // for (new i = 1000000000; i != 1000123000; ++i)
- // {
- // new
- // count = 0,
- // k = i;
- // for (new j = 0; j != 4; ++j)
- // {
- // count <<= 8;
- // count |= k & 0xFF;
- // k >>>= 8;
- // }
- // if (Cell_ReverseBytes(i) != count)
- // {
- // ASSERT(Cell_ReverseBytes(i) == count);
- // break;
- // }
- // }
- // }
- // Test:y_cell_ReverseBytes3()
- // {
- // for (new i = -999888; i != 0; ++i)
- // {
- // new
- // count = 0,
- // k = i;
- // for (new j = 0; j != 4; ++j)
- // {
- // count <<= 8;
- // count |= k & 0xFF;
- // k >>>= 8;
- // }
- // if (Cell_ReverseBytes(i) != count)
- // {
- // ASSERT(Cell_ReverseBytes(i) == count);
- // break;
- // }
- // }
- // }
- static stock y_cell_CountBits_v1(GLOBAL_TAG_TYPES:data)
- {
- static const
- scCount[256] =
- {
- 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
- };
- return scCount[data >>> 24] + scCount[(data >>> 16) & 0xFF] + scCount[(data >>> 8) & 0xFF] + scCount[data & 0xFF];
- }
- static stock y_cell_CountBits_v2(GLOBAL_TAG_TYPES:data)
- {
- data = data - ((data >>> 1) & 0x55555555);
- data = (data & 0x33333333) + ((data >>> 2) & 0x33333333);
- return ((data + (data >>> 4) & 0xF0F0F0F) * 0x1010101) >>> 24;
- }
- static stock y_cell_CountBits_v3(GLOBAL_TAG_TYPES:data)
- {
- // This function is a perfect candidate for re-writing in pure assembly.
- // data = data - ((data >>> 1) & 0x55555555);
- #emit LOAD.S.pri data // From this point on, just use registers!
- #emit PUSH.pri
- #emit SHR.C.pri 1
- #emit CONST.alt 0x55555555
- #emit AND // No "AND.C" annoyingly.
- #emit POP.alt
- #emit SUB.alt
- // data = (data & 0x33333333) + ((data >>> 2) & 0x33333333);
- #emit PUSH.pri
- #emit SHR.C.pri 2
- #emit CONST.alt 0x33333333
- #emit AND
- #emit SWAP.pri // Put the second half of the code on the stack.
- #emit AND // "alt" is already the correct value.
- #emit POP.alt
- #emit ADD
- // return ((data + (data >>> 4) & 0xF0F0F0F) * 0x1010101) >>> 24;
- #emit MOVE.alt
- #emit SHR.C.pri 4
- #emit ADD
- #emit CONST.alt 0xF0F0F0F
- #emit AND
- #emit SMUL.C 0x1010101
- #emit SHR.C.pri 24
- #emit RETN
- return 0;
- }
- static stock y_cell_CountBits_v4(GLOBAL_TAG_TYPES:data)
- {
- static const
- scCount[256] =
- {
- 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
- };
- // return scCount[data >>> 24] + scCount[(data >>> 16) & 0xFF] + scCount[(data >>> 8) & 0xFF] + scCount[data & 0xFF];
- #emit CONST.alt scCount // Get the address of the table.
- #emit ADDR.pri data // Get the address of the parameter.
- #emit PUSH.pri
-
- // Load the first value.
- #emit LODB.I 1
- #emit LIDX
- // Store the data.
- #emit SWAP.pri
- #emit PUSH.pri
-
- // Load the second value
- #emit ADD.C 1
- #emit LODB.I 1
- #emit LIDX
- // Store the data.
- #emit SWAP.pri
- #emit PUSH.pri
-
- // Load the third value
- #emit ADD.C 2
- #emit LODB.I 1
- #emit LIDX
- // Store the data.
- #emit SWAP.pri
-
- // Load the fourth value
- #emit ADD.C 3
- #emit LODB.I 1
- #emit LIDX
-
- // We now have a stack with three results, and a fourth in "pri".
- #emit POP.alt
- #emit ADD
- #emit POP.alt
- #emit ADD
- #emit POP.alt
- #emit ADD
-
- // Return.
- #emit RETN
- return 0;
- }
- Test:y_cell_CountBits0()
- {
- ASSERT(y_cell_CountBits_v4(0) == 0);
- ASSERT(y_cell_CountBits_v4(1) == 1);
- ASSERT(y_cell_CountBits_v4(2) == 1);
- ASSERT(y_cell_CountBits_v4(3) == 2);
- ASSERT(y_cell_CountBits_v4(4) == 1);
- ASSERT(y_cell_CountBits_v4(0b1010101010) == 5);
- ASSERT(y_cell_CountBits_v4(0b1111000001111000011) == 10);
- #if 0
- new
- t0, t1, t2, t3, t4;
- t0 = GetTickCount();
- for (new i = 0; i != 10000000; ++i)
- {
- for (new j = 1; j < 100000000; j *= 3)
- {
- y_cell_CountBits_v1(j);
- }
- }
- t1 = GetTickCount();
- printf("Time 1: %d", t1 - t0);
- t1 = GetTickCount();
- for (new i = 0; i != 10000000; ++i)
- {
- for (new j = 1; j < 100000000; j *= 3)
- {
- y_cell_CountBits_v2(j);
- }
- }
- t2 = GetTickCount();
- printf("Time 2: %d", t2 - t1);
- t2 = GetTickCount();
- for (new i = 0; i != 10000000; ++i)
- {
- for (new j = 1; j < 100000000; j *= 3)
- {
- y_cell_CountBits_v3(j);
- }
- }
- t3 = GetTickCount();
- printf("Time 3: %d", t3 - t2);
- t3 = GetTickCount();
- for (new i = 0; i != 10000000; ++i)
- {
- for (new j = 1; j < 100000000; j *= 3)
- {
- y_cell_CountBits_v4(j);
- }
- }
- t4 = GetTickCount();
- printf("Time 4: %d", t4 - t3);
- #endif
- }
- // Test:y_cell_CountBits1()
- // {
- // for (new i = 0; i != 1000000; ++i)
- // {
- // new
- // count = 0;
- // for (new j = 0x80000000; j; j >>>= 1)
- // {
- // if (i & j) ++count;
- // }
- // if (y_cell_CountBits_v4(i) != count)
- // {
- // ASSERT(y_cell_CountBits_v4(i) == count);
- // break;
- // }
- // }
- // }
- // Test:y_cell_CountBits2()
- // {
- // for (new i = 1000000000; i != 1000123000; ++i)
- // {
- // new
- // count = 0;
- // for (new j = 0x80000000; j; j >>>= 1)
- // {
- // if (i & j) ++count;
- // }
- // if (y_cell_CountBits_v4(i) != count)
- // {
- // ASSERT(y_cell_CountBits_v4(i) == count);
- // break;
- // }
- // }
- // }
- // Test:y_cell_CountBits3()
- // {
- // for (new i = -999888; i != 0; ++i)
- // {
- // new
- // count = 0;
- // for (new j = 0x80000000; j; j >>>= 1)
- // {
- // if (i & j) ++count;
- // }
- // if (y_cell_CountBits_v4(i) != count)
- // {
- // ASSERT(y_cell_CountBits_v4(i) == count);
- // break;
- // }
- // }
- // }
- Test:y_cell_GetLowestComponent()
- {
- ASSERT(Cell_GetLowestComponent(0) == 0);
- ASSERT(Cell_GetLowestComponent(1) == 1);
- ASSERT(Cell_GetLowestComponent(2) == 2);
- ASSERT(Cell_GetLowestComponent(6) == 2);
- ASSERT(Cell_GetLowestComponent(0x110) == 0x10);
- for (new i = 0; i != 32; ++i)
- {
- new
- k = 1 << i,
- l = k;
- ASSERT(Cell_GetLowestComponent(l) == k);
- l |= 2 << i;
- ASSERT(Cell_GetLowestComponent(l) == k);
- l |= 4 << i;
- ASSERT(Cell_GetLowestComponent(l) == k);
- l |= 8 << i;
- ASSERT(Cell_GetLowestComponent(l) == k);
- }
- }
- Test:y_cell_GetLowestBit()
- {
- ASSERT(Cell_GetLowestBit(0) == 0);
- ASSERT(Cell_GetLowestBit(1) == 0);
- ASSERT(Cell_GetLowestBit(0x800) == 11);
- ASSERT(Cell_GetLowestBit(0x111) == 0);
- ASSERT(Cell_GetLowestBit(6) == 1);
- for (new i = 0; i != 32; ++i)
- {
- new
- k = 1 << i;
- ASSERT(Cell_GetLowestBit(k) == i);
- k |= 2 << i;
- ASSERT(Cell_GetLowestBit(k) == i);
- k |= 4 << i;
- ASSERT(Cell_GetLowestBit(k) == i);
- k |= 8 << i;
- ASSERT(Cell_GetLowestBit(k) == i);
- }
- }
- Test:y_cell_GetLowestBitEx()
- {
- ASSERT(Cell_GetLowestBitEx(0) == 0);
- ASSERT(Cell_GetLowestBitEx(1) == 1);
- ASSERT(Cell_GetLowestBitEx(0x800) == 12);
- ASSERT(Cell_GetLowestBitEx(0x111) == 1);
- ASSERT(Cell_GetLowestBitEx(6) == 2);
- for (new i = 0; i != 32; ++i)
- {
- new
- k = 1 << i;
- ASSERT(Cell_GetLowestBitEx(k) == i + 1);
- k |= 2 << i;
- ASSERT(Cell_GetLowestBitEx(k) == i + 1);
- k |= 4 << i;
- ASSERT(Cell_GetLowestBitEx(k) == i + 1);
- k |= 8 << i;
- ASSERT(Cell_GetLowestBitEx(k) == i + 1);
- }
- }
|