繁体   English   中英

在ARM Neon程序集中使用C变量

[英]Use C variables in ARM Neon assembly

我在用以下语言编写的ARM NEON汇编代码中使用C / C ++变量时遇到问题:

__asm__ __volatile()

我已经阅读了以下几种可能性,它们应该将值从ARM移到NEON寄存器。 以下每种可能性均会在我的Android应用程序中导致致命信号:

VDUP.32 d0, %[variable]
VMOV.32 d0[0], %[variable]

输入参数列表包括:

[variable] "r" (variable)

我成功的唯一方法是使用负载:

int variable = 0;
int *address = &variable;
....
VLD1.32 d0[0], [%[address]]
: [address] "+r" (address)

但是我认为,如果不需要修改变量,负载并不是最佳的性能,而且我还需要了解如何将数据从ARM移至NEON寄存器以用于其他目的。

编辑 :根据要求添加示例,可能性1和2均会导致“致命信号”。 我知道在此示例中,NEON程序集仅应修改“ array [4]”的前两个元素。

int c = 10;
int *array4;
array4 = new int[64];
for(int i = 0; i < 64; i++){
    array4[i] = 100*i;
}
__asm__ __volatile ("VLD1.32 d0, [%[array4]] \n\t"
    "VMOV.32 d1[0], %[c] \n\t" //this is possibility 1
    "VDUP.32 d2, %[c] \n\t" //this is possibility 2
    "VMUL.S32 d0, d0, d2 \n\t"
    "VST1.32 d0, [%[output_array1]] \n\t"
    : [output_array1] "=r" (output_array1)
    : [c] "r" (c), [array4] "r" (array4)
    : "d0", "d1", "d2");

问题是由输出列表引起的。 在输入寄存器中移动输出数组地址可解决崩溃问题。

int c = 10;
int *array4;
array4 = new int[64];
for(int i = 0; i < 64; i++){
    array4[i] = 100*i;
}
__asm__ __volatile ("VLD1.32 d0, [%[array4]] \n\t"
    "VMOV.32 d1[0], %[c] \n\t" //this is possibility 1
    "VDUP.32 d2, %[c] \n\t" //this is possibility 2
    "VMUL.S32 d0, d0, d2 \n\t"
    "VST1.32 d0, [%[output_array1]] \n\t"
    :
    : [c] "r" (c), [array4] "r" (array4), [output_array1] "r" (output_array1)
    : "d0", "d1", "d2");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM