Android ARM霓虹灯汇编器-使用与维护;理解力

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.)如果我像

我对汇编程序和霓虹灯编程是新手。 我的任务是使用NEON指令将部分算法从C转换为ARM汇编程序。 该算法采用一个int32数组,从该数组加载不同的值,进行一些位移位和异或运算,并将结果写入另一个数组。 稍后我将使用64位值的数组,但现在我只是尝试重写代码

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处理器上运行,如果这有什么区别的话。谢谢你的帮助

-----------编辑-----------------

这就是我发现的:

  • 它将始终加载完整寄存器(64位)
  • 您可以使用“vmov”指令将neon寄存器的一部分传输到arm寄存器
  • 偏移量应在arm寄存器中,并将添加到 内存访问后的基址
  • 这是“被击倒的注册列表”。使用的每个寄存器,以及 输入或输出列表中都不应写入此处

  • 我可以回答你的大部分问题:(更新:澄清“车道”问题)

    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个周期。避免它。