我是汇编程序和 NEON 编程的新手。我的任务是使用 NEON 指令将部分算法从 C 转换为 ARM 汇编程序。该算法采用一个 int32 数组,从该数组加载不同的值,进行一些位移和异或并将结果写入另一个数组。稍后我将使用具有 64 位值的数组,但现在我只是尝试重写代码。
C Pseudo code:
out_array[index] = shiftSome( in_array[index] ) ^ shiftSome( in_array[index] );
所以这是我关于NEON指令的问题:
1.)如果我加载这样的寄存器:
vld1.32 d0, [r1]
它会从内存中仅加载 32 位还是 2x32 位来填充 64 位霓虹 D 寄存器?
2.) 如何访问 D-Register 的 2/4/8 (i32, i16, i8) 部分?
3.)我正在尝试从具有偏移量的数组中加载不同的值,但它似乎不起作用......我做错了什么......这是我的代码:(它是一个整数数组,所以我´ m 尝试加载例如 3 元素,其偏移量应为 64Bit = 8 Byte)
asm volatile(
"vld1.32 d0, [%0], #8 \n"
"vst1.32 d0, [%1]" : : "r" (a), "r" (out): "d0", "r5");
其中“a”是数组,“out”是指向整数的指针(用于调试)。
4.)从数组中加载一个值后,我需要将其向右移动,但它似乎不起作用:
vshr.u32 d0, d0, #24 // C code: x >> 24;
5.) 是否可以只在 Neon 寄存器中加载 1 个字节,这样我就不必移动/屏蔽某些东西来只获得我需要的一个字节?
6.) 我需要使用 Inline 汇编器,但我不确定最后一行是做什么用的:
input list : output list : what is this for?
7.) 你知道任何带有代码示例的好的 NEON 参考吗?
该程序应在三星 Galaxy S2、cortex-A9 处理器上运行,如果这有什么不同的话。谢谢您的帮助。
- - - - - - - - 编辑 - - - - - - - - - -
这就是我发现的:
- 它将始终加载完整的寄存器(64 位)
- 您可以使用“vmov”指令将霓虹灯寄存器的一部分传输到手臂寄存器。
- 偏移量应该在一个臂寄存器中,并将在内存访问后添加到基地址。
- 它是“被破坏的注册列表”。每个使用的寄存器,既不在输入列表中,也不在输出列表中,应该写在这里。