_mm_movemask_epi8 内在函数到底在做什么?

问题描述 投票:0回答:1

我在一些代码中遇到了

_mm_movemask_epi8
内在函数,我试图通过一个示例来理解它到底是做什么的,因为我通过阅读描述并没有完全理解它的作用。

描述指出:

复制每个 8 位元素的最高有效位的值 在 [16 x i8] 的 128 位整数向量中创建 16 位掩码 值,对值进行零扩展,并将其写入目的地。

在我的具体代码中,我将以下 128 位序列传递给函数:

ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
,结果
uint16_t
是十六进制
01
(二进制
0000 00001
)。

将十六进制值转换为二进制给出:

11111111 00000000 00000000 00000000
因此,根据我对此示例的理解,该函数从上面列出的四个字节中的每一个中获取最高有效位: 11111111 00000000 0 0000000 00000000 →
1000
,然后对值进行零扩展以给出
0000000000001000
,但是该函数给出的不是二进制
1000
,而是二进制 `0001。

我哪里做错了?

intrinsics sse2
1个回答
0
投票

在我的具体代码中,我将以下 128 位序列传递给函数:

ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

如果您使用类似

_mm_loadu_si128
的方式传递此值,则该值将被视为 Little Endian,就像通常在 x86 上一样。因此,作为 128 位整数,它是
0x00000000'00000000'00000000'000000ff

否则,你似乎理解正确。

© www.soinside.com 2019 - 2024. All rights reserved.