【问题标题】:how to use arm neon vbit intrinsics?如何使用 arm neon vbit 内在函数?
【发布时间】:2013-09-18 00:58:44
【问题描述】:

我不明白如何区分 vbit、vbsl 和 vbif 与 neon 内在函数。我需要执行 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

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

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

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

【问题讨论】:

  • 您使用的是哪个内在函数,您希望它做什么?也许您可以照原样发布代码的相关部分并解释您需要做什么?
  • 我需要做与 stackoverflow.com/questions/18312814/… 完全相同的事情。我试图按照答案中的说法去做,但我得到的结果不是我想要的。我使用的指令是 vbslq_u8 但我不明白它到底是做什么的。
  • 好的 - 发布代码,同时发布您传递给内部函数的输入数据的示例,您期望的输出数据是什么,以及实际数据是什么。
  • @PaulR 。我用所有信息编辑了我的答案。

标签: arm simd neon intrinsics


【解决方案1】:

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 位从第三个参数中选择相应的位。

【讨论】:

  • 它有效。问题是我必须将掩码作为第一个参数,而我没有这样做。也必须更换面具。现在一切正常。谢谢。
  • 是的,vbsl 指令的奇怪之处在于输出寄存器也是掩码输入寄存器,因此在相应的内在函数中有点意外的参数排序。
  • 排序匹配 C 条件运算符。将 vbsl(a,b,c) 想象成 C 表达式 (a ? b : c),但在单个位上。
猜你喜欢
  • 2012-06-30
  • 1970-01-01
  • 2011-02-06
  • 2014-05-06
  • 1970-01-01
  • 2019-09-03
  • 2014-09-18
  • 2013-05-08
  • 2012-08-07
相关资源
最近更新 更多