我在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]"的前2个元素。
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");
答案 0 :(得分:1)
问题是由输出列表引起的。在输入寄存器中移动输出数组地址可以解决崩溃问题。
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");