-1

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

为需要上下文的人编辑。这似乎是一项非常简单的工作,只需移动一些字节,但它需要的指令比你想象的要多(检查这个带有优化的神螺栓)。因此,我只是想知道是否有人知道用更少的指令解决问题的方法。

4

2 回答 2

5
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)
于 2020-09-18T18:37:27.210 回答
1

像这样的东西?

_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

于 2020-09-18T20:44:08.200 回答