【发布时间】:2012-02-16 17:36:15
【问题描述】:
我是汇编程序和 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 位 Neon D 寄存器?
2.) 如何访问 D-Register 的 2/4/8(i32、i16、i8)部分?
3.) 我正在尝试从具有偏移量的数组中加载不同的值,但它没有 似乎工作......我做错了什么......这是我的代码: (它是一个整数数组,所以我试图加载例如 3 元素,其偏移量应为 64Bit = 8 字节)
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.) 我需要使用内联汇编器,但我不确定最后一行是做什么用的:
input list : output list : what is this for?
7.) 你知道任何带有代码示例的好的 NEON 参考资料吗?
程序应该在三星 Galaxy S2、cortex-A9 处理器上运行,如果这有什么不同的话。感谢您的帮助。
----编辑-------
这是我发现的:
- 它将始终加载完整的寄存器(64 位)
- 您可以使用“vmov”指令将 Neon 寄存器的一部分传输到 arm 寄存器。
- 偏移量应该在一个臂寄存器中,并将添加到 基址在内存访问之后。
- 它是“被破坏的注册列表”。使用的每个寄存器和 无论是输入还是输出列表,都应该写在这里。
【问题讨论】:
-
2.将内容从 SIMD 寄存器移动到 ARM 寄存器将导致完整的流水线刷新,大约需要 14 个周期。避免它。
标签: android assembly arm neon armv6