2012-06-26 2 views
2

Следующие ARM ASM:Почему VMOV.F64 не позволяет загружать ноль?

vmov.f64 d16, #0 

завершается со следующей ошибкой:

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

Составитель с помощью рычажного ни-Linux-gnueabi-г ++ (Sourcery CodeBench Lite 2012.03-57) 4.6.3

Как отключить двойной регистр d16, чтобы я мог использовать его для инструкций VFP с двойной точностью?

ответ

4

VMOV может Принимается только limited set с плавающей запятой immediates, и, что удивительно, 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 move, который также будет обнулять регистр.

vmov.i64 d16, #0 
1

Инструкции NEON не позволяют загружать 64 или 128-битные значения в регистры. Значение 0.0 с плавающей точкой, случается, 0x0000000000000000 также, так что еще один способ сделать это с целыми операций:

veor.i64 d16,d16,d16 

или вы можете загрузить значение из памяти (гораздо медленнее)

double zero[] = {0.0}; 

    vld1.64 d16,[zero] 
Смежные вопросы