2012-09-26 48 views
3

我想使用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 

哪有我做到了?

謝謝!

+1

我不認爲你可以使用vmov.f64在VFP和ARM寄存器之間移動數據。您應該使用「vmov Rd,Rn,Dm」,但是我無法通過內聯彙編來正確使用它。 – auselen

+0

是的,的確我不行。這是因爲我告訴輸出約束,dTmp必須是準備寫入(= w)的雙精度寄存器。 AFAIK gcc應該使用範圍爲d0-d31的「d」寄存器作爲dTmp變量(引起約束)。它可能是一個語法錯誤,因爲它甚至不能編譯。 –

+0

我升級到binutils-2.22,但錯誤與binutils-2.21完全一樣。 –

回答