[英]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.