2016-07-27 11 views
0

я демонтировал нарукавную бинарный ранее скомпилированный с неоновыми флагами:Почему команда vdiv генерируется с неоновыми флагами?

-mcpu = Cortex-A9 -mfpu = неон -mfloat-аби = softfp -ftree-векторизовать

Свалки показывает команду vdiv.f64 генерируемой компилятором. Согласно руководству руки для armv7 (cortex-a9) neon simd isa не поддерживает команду vdiv, но движок с плавающей запятой (vfp). Почему эта инструкция сгенерирована? это тогда инструкция с плавающей запятой, которая будет выполняться vfp? Как neon, так и VFP поддерживают добавление и умножение для с плавающей запятой, так как я могу отличить их от eahc other?

+0

Да, это инструкция VFP. Вы можете легко это увидеть, потому что AArch32 neon не работает на 64-битной плавающей запятой вообще. – EOF

+0

благодарю вас за ответ, но что, если я увижу «вадд», сгенерированный компилятором, как я могу узнать, является ли это инструкцией NEON или VFP, поскольку оба эти устройства выполняют эту инструкцию? Я работаю с процессором arm cortex-a9 и инструментальной цепочкой arm-none-linux-gnueabi *. –

+2

neon использует имена регистров 'D [n]' и 'Q [n]' и инструкции-postfixes 'F32' (и' I [n] 'для целых инструкций), VFP использует' S [n] 'и' D [ n] 'и инструкции-postfixes' F64' или 'F32'. Оказывается, комбинация недвусмысленная. – EOF

ответ

1

В случае Cortex-A9, the NEON FPU option also implements VFP; это надмножество вырезанного 16-регистрового варианта FPU только для VFP.

В более общем плане архитектура не позволяет внедрять расширенный SIMD с плавающей запятой, не реализуя, по меньшей мере, однопроцессорный VFP, поэтому в GCC -mfpu=neon также подразумевается VFPv3. Это является допустимым для реализации целочисленного расширенного SIMD без каких-либо возможностей с плавающей запятой, но я не уверен, что GCC может поддержать это (или что кто-либо когда-либо создавал такую ​​вещь).

Фактические варианты инструкций VFP и Advanced SIMD недвусмысленны из синтаксиса - все, что работает с данными двойной точности (то есть <op>.F64), очевидно, является VFP, поскольку Advanced SIMD не поддерживает двойную точность. Операции с одной точностью (то есть <op>.F32), работающие на 32-разрядных s, являются скалярными, таким образом, VFP; если они работают на более крупных 64-битных d или 128-битных q регистрах, то они обрабатывают сразу несколько 32-битных значений, поэтому они векторизовали расширенные инструкции SIMD.

+0

Ваше объяснение очень ясное и решает мой вопрос. Большое спасибо за ответ на этот вопрос. –