mirror of https://github.com/tstack/lnav
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
34 lines
1.1 KiB
C
34 lines
1.1 KiB
C
static inline __m128i
|
|
dec_reshuffle (const __m128i in)
|
|
{
|
|
// in, bits, upper case are most significant bits, lower case are least significant bits
|
|
// 00llllll 00kkkkLL 00jjKKKK 00JJJJJJ
|
|
// 00iiiiii 00hhhhII 00ggHHHH 00GGGGGG
|
|
// 00ffffff 00eeeeFF 00ddEEEE 00DDDDDD
|
|
// 00cccccc 00bbbbCC 00aaBBBB 00AAAAAA
|
|
|
|
const __m128i merge_ab_and_bc = _mm_maddubs_epi16(in, _mm_set1_epi32(0x01400140));
|
|
// 0000kkkk LLllllll 0000JJJJ JJjjKKKK
|
|
// 0000hhhh IIiiiiii 0000GGGG GGggHHHH
|
|
// 0000eeee FFffffff 0000DDDD DDddEEEE
|
|
// 0000bbbb CCcccccc 0000AAAA AAaaBBBB
|
|
|
|
const __m128i out = _mm_madd_epi16(merge_ab_and_bc, _mm_set1_epi32(0x00011000));
|
|
// 00000000 JJJJJJjj KKKKkkkk LLllllll
|
|
// 00000000 GGGGGGgg HHHHhhhh IIiiiiii
|
|
// 00000000 DDDDDDdd EEEEeeee FFffffff
|
|
// 00000000 AAAAAAaa BBBBbbbb CCcccccc
|
|
|
|
// Pack bytes together:
|
|
return _mm_shuffle_epi8(out, _mm_setr_epi8(
|
|
2, 1, 0,
|
|
6, 5, 4,
|
|
10, 9, 8,
|
|
14, 13, 12,
|
|
-1, -1, -1, -1));
|
|
// 00000000 00000000 00000000 00000000
|
|
// LLllllll KKKKkkkk JJJJJJjj IIiiiiii
|
|
// HHHHhhhh GGGGGGgg FFffffff EEEEeeee
|
|
// DDDDDDdd CCcccccc BBBBbbbb AAAAAAaa
|
|
}
|