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

Я разобрал бинарный файл arm, ранее скомпилированный с неоновыми флагами:

-mcpu = cortex-a9 -mfpu = neon -mfloat-abi = softfp -ftree-vectorize

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


person raul garcia    schedule 27.07.2016    source источник
comment
Да, это инструкция VFP. В этом легко убедиться, потому что AArch32 neon вообще не работает с 64-битными числами с плавающей запятой.   -  person EOF    schedule 27.07.2016
comment
спасибо за ваш ответ, но что, если я увижу vadd, сгенерированный компилятором, как я могу узнать, является ли это инструкцией NEON или VFP, поскольку оба движка реализуют эту инструкцию? Я работаю с процессором arm cortex-a9 и набором инструментов arm-none-linux-gnueabi *.   -  person raul garcia    schedule 27.07.2016
comment
neon использует имена регистров D[n] и Q[n] и постфиксы инструкций F32I[n] для целочисленных инструкций), VFP использует S[n] и D[n] и постфиксы инструкций F64 или F32. Оказывается, сочетание однозначное.   -  person EOF    schedule 27.07.2016


Ответы (1)


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

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

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

person Notlikethat    schedule 27.07.2016
comment
Ваше объяснение очень ясное и решает мой вопрос. Большое спасибо за ответ на этот вопрос. - person raul garcia; 27.07.2016