Not sure if the C version of the jmcnamara idea got benchmarked.
Yes. It is laballed as _24to32_2() in my benchmark posts above. The _byteswap_ulong() is a compiler pragma that reduces to a single x64 assembler instruction that effectively does the same thing as your manipulations of the temp variable above. And the masking constants are hardcoded.
void _24to32_2( SV *packed ) { IS_VARS; char *pp = SvPVX( packed ); int i; IS_RESET; for( i=0; i<24; i+=3 ) { unsigned int n = _byteswap_ulong( *(unsigned long*)&pp[ i -1 ] + ); IS_PUSHUV( ( n & 0xfc0000 ) >> 18 ); IS_PUSHUV( ( n & 0x03f000 ) >> 12 ); IS_PUSHUV( ( n & 0x000fc0 ) >> 6 ); IS_PUSHUV( ( n & 0x00003f ) ); } IS_DONE; return; }
In reply to Re^2: unpacking 6-bit values
by BrowserUk
in thread unpacking 6-bit values
by BrowserUk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |