2012-06-26 50 views
2

以下ARM ASM:爲什麼VMOV.F64不允許我加載零?

/tmp/ccZD4Iex.s:121: Error: immediate out of range -- `vmov.f64 d16,#0' 

使用臂-NONE-Linux的gnueabi-G ++編譯(的Sourcery Codebench完成精簡版2012.03-57)4.6.3

vmov.f64 d16, #0 

與以下錯誤失敗

如何清零d16寄存器 - 雙精度,這樣我可以將它用於雙精度VFP指令?

回答

4

VMOV可以將該值只接受浮點立即數的limited set,而且奇怪的是,0是不是其中之一:

Any number that can be expressed as +/-n * 2-r, where n and r are integers, 16 <= n <= 31, 0 <= r <= 7.

你可以做什麼BitBank建議,或使用intege r動作,這也會使寄存器零點。

vmov.i64 d16, #0 
1

NEON指令不允許您將64位或128位立即值加載到寄存器中。浮點值0.0碰巧是0x0000000000000000也,所以另一種方式來完成它與整數操作:

veor.i64 d16,d16,d16 

或可以加載從存儲器(慢得多)

double zero[] = {0.0}; 

    vld1.64 d16,[zero]