mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-09 21:55:29 +02:00
34 lines
1.1 KiB
C
Vendored
34 lines
1.1 KiB
C
Vendored
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
|
|
}
|