mir-algorithm icon indicating copy to clipboard operation
mir-algorithm copied to clipboard

bitpack has unexpected behavior

Open rv32ima opened this issue 4 years ago • 0 comments

While trying to implement #369, I was trying to use bitpack in a behavior that would be equivalent to this:

ubyte[] data = cast(ubyte[])['A', 'B', 'C'];
auto grouped = data.bytegroup!(3, uint).map!bswap;
foreach(group; grouped) {
   auto a = (group >> 26) & 0x3f;
   auto b = (group >> 20) & 0x3f;
   auto c = (group >> 14) & 0x3f;
   auto d = (group >> 8) & 0x3f;
   writefln("%.6b %.6b %.6b %.6b", a, b, c, d);
}

This extracts the top 4 6-bit values from a 32-bit value, which is what I expect bitpack to do. But, the equivalent Mir Algorithm code does not result in the same behavior:

ubyte[] data = cast(ubyte[])['A', 'B', 'C'];
auto grouped = data.bytegroup!(3, uint).map!bswap;
foreach(group; grouped.bitpack!6.retro) {
   writefln("%.6b", group);
}

It appears that, instead of reading from the top-most bit for a 32-bit value (which is what I would normally expect), bitpack!6 seems to start at the LSB, and reads values from the bottom-up, resulting in these bytes being read:

value = 01000001010000100100001100000000
000001
010000
100100
001100
000000

instead of

value = 01000001010000100100001100000000
010000
010100
001001
000011
000000

Is there any way to toggle this behavior on / off?

rv32ima avatar Nov 15 '21 18:11 rv32ima