use*_*328 1 arm simd intrinsics neon
我不明白我如何用霓虹灯内在函数来区分 vbit、vbsl 和 vbif。我需要执行 vbit 操作,但是如果我使用内部函数中的 vbslq 指令,我将得不到我想要的。
例如,我有一个这样的源向量:
uint8x16_t source = 39 62 9b 52 34 5b 47 48 47 35 0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
目标向量是:
uint8x16_t destination = 0 0 0 0 0 0 0 0 0 0 0 0 c3 c8 c5 d5
Run Code Online (Sandbox Code Playgroud)
我想有这样的输出:
39 62 9b 52 34 5b 47 48 47 35 0 0 c3 c8 c5 d5
Run Code Online (Sandbox Code Playgroud)
这意味着我想从源复制前十个字节并保持其他 6 个不变。我正在使用这个面具:
{0,0,0,0,0,0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
Run Code Online (Sandbox Code Playgroud)
使用 vbslq_u8 的正确方法是什么?
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);
Run Code Online (Sandbox Code Playgroud)
请注意,掩码中的字节顺序需要与源/目标寄存器中的顺序相对应(它们似乎在您的问题中交换了?)。
另请注意,内在参数的第一个参数似乎是选择掩码,其中 1 位从第二个参数中选择相应位,0 位从第三个参数中选择相应位。
| 归档时间: |
|
| 查看次数: |
2033 次 |
| 最近记录: |