我有点卡住了!我想用ARM NEON优化以下代码,但我不知道该怎么做。
uint8_t* srcPtr = src->get();
uint8_t* dstPtr = dst->get();
int i;
for(i=0; i< SIZE; i++){
dstPtr++ = srcPtr[0];
dstPtr++ = srcPtr[1];
dstPtr++ = srcPtr[0];
dstPtr++ = srcPtr[1];
dstPtr++ = srcPtr[0];
dstPtr++ = srcPtr[1];
srcPtr+= 2;
}
假设uint8_t中的srcPtr包含
0 1 2 3
dstPtr将是
0 1 0 1 0 1 2 3 2 3 2 3
有人可以帮帮我吗?
答案 0 :(得分:4)
由于您希望复制字节对,因此最简单的方法是将它们视为16位值。只要加载并存储相同的类型,Endianness就无关紧要,如果你记得将指针强制转换为void*
,那么你不必担心编译器添加对齐提示(如果你施加指针到uint16_t*
然后Clang会认为它是一个对齐的指针,在某些情况下可能会添加不安全的提示。)
由于您的展开时间是3倍,因此最简单的方法是使用vst3
。如果它是4或8的因子,那么你可以使用vdup
代替,但不能用于三分之一。
循环体看起来像这样:
uint16x4_t v = vld1_u16((void *)src);
uint16x4x3_t v3 = { v, v, v };
vst3_u16((void *)dst, v3);
srcPtr += 8;
dstPtr += 24;