AAD64 NEON中的UADDL与UADDL2

时间:2017-12-11 16:26:54

标签: simd neon arm64 armv8

NEON汇编

我想了解arm-v8 NEON。让我举一个例子,我想做什么。

我从数组A加载了16个字节(uchar中的像素)。现在我想尝试“加长ADD”来进行操作。从文档中,我看到UADDL and UADDL将分别对源寄存器的下半部分和上半部分进行加长。我可以编写以下代码来使其正常工作:

ld1 {V10.16B}, [x0]

uaddl V11.8H, V10.8B, V10.8B    
uaddl2 V12.8H, V10.16B, V10.16B 

st1 {V11.8H}, [x1], #16 
st1 {V12.8H}, [x1], #16 

NEON Intrinsics

来到NEON Intrinsics,语法如下:(Refer Page 8

uint16x8_t vaddl_u8 (uint8x8_t a, uint8x8_t b)
uint16x8_t vaddl_high_u8 (uint8x16_t a, uint8x16_t b)

这里,两个函数的输入都是不同类型的。

所以一旦我加载了一个uint8x16_t变量,我该如何将这个变量传递给vaddl_u8?我可以做任何演员吗?或者我必须将下半部分复制到另一个变量? (这意味着,这是额外的费用)

所以我的问题是,如何使用NEON内在函数实现这段汇编代码?

更新

  1. 我在Ubuntu 16.04中使用aarch64-linux-gnu-g ++(gcc版本5.4.0)。

1 个答案:

答案 0 :(得分:0)

您应该知道uint8x16_tuint8x8_t都是不同的数据类型。

以下是我要做的事情:

uint8x16_t a, b, c;
uint8x8_t low, high;
.
.
.
a = vld1q_u8(pSrc);

low = vget_low_u8(a);
high = vget_high_u8(a);

b = vaddl_u8(low, low);
c = vaddl_u8(high, high);

vst1q_u8(pDst++, b);
vst1q_u8(pDst++, c);

顺便说一句,请问你在哪里vaddl_high_u8来自

Android Studio 3.0.1上的自动完成功能并未将其显示为可行选项。