Android ARM霓虹灯汇编器-使用与维护;理解力
我对汇编程序和霓虹灯编程是新手。 我的任务是使用NEON指令将部分算法从C转换为ARM汇编程序。 该算法采用一个int32数组,从该数组加载不同的值,进行一些位移位和异或运算,并将结果写入另一个数组。 稍后我将使用64位值的数组,但现在我只是尝试重写代码Android ARM霓虹灯汇编器-使用与维护;理解力,android,assembly,arm,neon,armv6,Android,Assembly,Arm,Neon,Armv6,我对汇编程序和霓虹灯编程是新手。 我的任务是使用NEON指令将部分算法从C转换为ARM汇编程序。 该算法采用一个int32数组,从该数组加载不同的值,进行一些位移位和异或运算,并将结果写入另一个数组。 稍后我将使用64位值的数组,但现在我只是尝试重写代码 C Pseudo code: out_array[index] = shiftSome( in_array[index] ) ^ shiftSome( in_array[index] ); 以下是我关于霓虹灯使用说明的问题: 1.)如果我像
C Pseudo code:
out_array[index] = shiftSome( in_array[index] ) ^ shiftSome( in_array[index] );
以下是我关于霓虹灯使用说明的问题:
1.)如果我像这样加载寄存器:
vld1.32 d0, [r1]
它会从内存中只加载32位还是2X32位来填充64位Neon D寄存器
2.)如何访问D寄存器的2/4/8(i32、i16、i8)部分
3.)我试图从带有偏移量的数组中加载不同的值,但它没有
似乎工作…我做错了什么。。。这是我的密码:
(这是一个整数数组,所以我尝试加载例如3元素,它的偏移量应该是64位=8字节)
其中“a”是数组,“out”是指向整数的指针(用于调试)
4.)从数组加载值后,我需要将其向右移动,但它似乎不起作用:
vshr.u32 d0, d0, #24 // C code: x >> 24;
5.)是否可以在Neon寄存器中只加载1个字节,这样我就不必移位/屏蔽某些内容,从而只获得所需的1个字节
6.)我需要使用内联汇编程序,但我不确定最后一行的用途:
input list : output list : what is this for?
7.)你知道有什么好的NEON参考代码示例吗
该程序应该在三星Galaxy S2 cortex-A9处理器上运行,如果这有什么区别的话。谢谢你的帮助
-----------编辑-----------------
这就是我发现的:
我可以回答你的大部分问题:(更新:澄清“车道”问题) 1) NEON指令一次只能从内存加载和存储整个寄存器(64位、128位)。有一种MOV指令变体,允许将单个“通道”移动到ARM寄存器或从ARM寄存器移动
asm(code : output operand list : input operand list : clobber list);
2) 可以使用NEON MOV指令影响单车道。执行过多的单元素操作会影响性能。霓虹灯指令通过对向量(浮点/整数组)执行并行操作来提高应用程序性能
3) ARM汇编语言中的立即值偏移量是字节,而不是元素/寄存器。霓虹灯指令允许使用寄存器进行后期增量,而不是立即值。对于普通ARM指令,post增量8将向源指针添加8(字节)
4) 霓虹灯的偏移会影响向量的所有元素。使用vshr.u32将24位右移将使两个32位无符号长移位24位,并丢弃移出的位
5) 霓虹灯指令允许将单个元素移入和移出正常ARM寄存器,但不允许从内存直接加载或存储到“通道”
6) ?
7) 从这里开始:ARM站点有一个关于NEON的很好的教程。6)被破坏的寄存器
asm(code : output operand list : input operand list : clobber list);
如果您正在使用未作为操作数传递的寄存器,则需要通知
编译器对此进行了讨论。以下代码将值调整为四的倍数。信息技术
使用r3作为暂存寄存器,并通过在
打击者名单。此外,CPU状态标志由ands指令修改。
将伪寄存器cc添加到clobber列表将使编译器了解
这一修改也是如此
asm (
"ands R3, %1, #3"
"eor %0, %0, r3"
: "=r"(len)
: "0"(len)
: "cc", "r3"
);
关于1和5:可以在NEON寄存器中加载和存储单个元素。只需在NEON寄存器后用[]指定元素索引。例如,相同的符号可以用于将一个向量与另一个向量中的单个元素相乘。除了后增量之外,这是非常正确的。不能使用NEON将立即值添加为后期增量。您可以使用寄存器ARM寄存器来执行此操作或使用!这将随着读取数据的大小而增加。将内容从SIMD寄存器移动到ARM寄存器将导致完整的管道刷新,大约需要14个周期。避免它。