1

我不明白我如何用霓虹内在函数区分 vbit、vbsl 和 vbif。我需要执行 vbit 操作,但如果我使用内部函数中的 vbslq 指令,我将得不到我想要的。

例如,我有一个像这样的源向量:

uint8x16_t source = 39 62 9b 52 34 5b 47 48 47 35 0 0 0 0 0 0

目标向量为:

uint8x16_t destination = 0 0 0 0 0 0 0 0 0 0 0 0 c3 c8 c5 d5

我想有这样的输出:

39 62 9b 52 34 5b 47 48 47 35 0 0 c3 c8 c5 d5

这意味着我想从源中复制前 10 个字节,而其他 6 个字节保持不变。我正在使用这个面具:

{0,0,0,0,0,0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};

使用 vbslq_u8 的正确方法是什么?

4

1 回答 1

6

ARM 文档不是很清楚,但看起来您需要像这样使用内部函数:

uint8x16_t src =  {0x39,0x62,0x9b,0x52,0x34,0x5b,0x47,0x48,
                   0x47,0x35,0x00,0x00,0x00,0x00,0x00,0x0};
uint8x16_t dest = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                   0x00,0x00,0x00,0x00,0xc3,0xc8,0xc5,0xd5};
uint8x16_t mask = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
                   0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00};

dest = vbslq_u8(mask, src, dest);

请注意,掩码中的字节顺序需要与源/目标寄存器中的顺序相对应(它们似乎在您的问题中被交换了?)。

另请注意,内在函数的第一个参数似乎是选择掩码,其中 1 位从第二个参数中选择相应的位,0 位从第三个参数中选择相应的位。

于 2013-09-13T12:54:44.113 回答