我想使用Google NDKv8b附帶的工具鏈(gcc-4.6)將雙精度寄存器(d8)的值加載到ARM平臺上的C變量中。我的ARM機器是三星Galaxy S2(它有VFPv3和NEON)。 GCC文檔說,爲了在內聯彙編上使用VFP雙精度寄存器,必須使用「w」約束。 所以,我想這樣的事情(好吧,別看這麼多到整個程序的邏輯):GCC使用ARM VFP指令操作的正確內聯彙編約束是什麼?
#include <stdio.h>
int main()
{
double dVar = 1.2345678;
double dTmp;
int i;
for(i = 0; i < 100; i++)
{
asm volatile(
"vmov.f64 %[dTmp], d8\n"
: [dTmp] "=w" (dTmp)
:
:
);
dVar *= 10.0;
printf("d8 = %f\n", dTmp);
}
return 0;
}
好了,它甚至不編譯:
/tmp/cc9wQA1z.s: Assembler messages:
/tmp/cc9wQA1z.s:62: Internal error, aborting at /usr/local/google/home/andrewhsieh/ndk-andrewhsieh/src/build/../binutils/binutils-2.21/gas/config/tc-arm.c line 14709 in do_neon_mov
哪有我做到了?
謝謝!
我不認爲你可以使用vmov.f64在VFP和ARM寄存器之間移動數據。您應該使用「vmov Rd,Rn,Dm」,但是我無法通過內聯彙編來正確使用它。 – auselen
是的,的確我不行。這是因爲我告訴輸出約束,dTmp必須是準備寫入(= w)的雙精度寄存器。 AFAIK gcc應該使用範圍爲d0-d31的「d」寄存器作爲dTmp變量(引起約束)。它可能是一個語法錯誤,因爲它甚至不能編譯。 –
我升級到binutils-2.22,但錯誤與binutils-2.21完全一樣。 –