微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将4个字节扩展为8个字节32位-> 64位的最快方法

如何解决将4个字节扩展为8个字节32位-> 64位的最快方法

假设您有一个32位无符号整数,其中字节的组织方式如下:a b c d。 以这种方式将这些字节扩展为64位无符号整数的最快方法是: 0 a 0 b 0 c 0 d?它用于x86-64体系结构。我想知道不使用特殊内在函数的最快方法,尽管这也很有趣。 (我说“最快”,但性能合理的紧凑型解决方案也不错)。

为需要上下文的人编辑。看起来似乎很简单,只是移位了一些字节,但是它需要的指令比您想象的要多(check this godbolt with optimizations。因此,我只是想知道是否有人知道用更少的指令就能解决问题的方法

解决方法

uint64_t x = ...;
// 0 0 0 0 a b c d
x |= x << 16;
// 0 0 a b ? ? c d
x = x << 8 & 0x00ff000000ff0000 | x & 0x000000ff000000ff;
// 0 a 0 b 0 c 0 d

为了完整起见,现代的x86处理器可以通过一条快速说明来做到这一点:

x = _pdep_u64(x,0xff00ff00ff00ff)
,

像这样吗?

_mm256_cvtepu8_epi16(eight_bit_numbers):接受一个由16个8位数字组成的128位向量,并将其转换为由16个16位带符号整数组成的256位向量。例如:

 __m128i value1 = _mm_setr_epi8(0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff,0x00);
 __m256i value2 = _mm256_cvtepu8_epi16(value1);

或者对于32位-> 64位:

https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm256_cvtepu32_epi64

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。