ARM Neon intcinsic vcombine_s16 combinese два вектора в один длинный вектор. Каков его код сборки?Какой неоновый код сборки объединяет два вектора в длинный вектор?
2
A
ответ
3
int16x8_t vcombine_s16 (int16x4_t, int16x4_t)
не имеет прямое указание соответствия, это способ лечения два двойных реестров в качестве регистра четырехъядерного и обеспечить безопасность типов в C. Можно было бы сделать это в сборке неявно просто вызывая двойные или квадроцикл регистров когда это требуется. См. Диаграмму ниже для возможных способов использования банка регистрации NEON.
gcc
documentation для внутренних дел.
Для, как это будет реализовано в сборке, вы можете использовать GCC
#include "arm_neon.h"
int16x8_t c(int16x4_t a, int16x4_t b) {
return vcombine_s16(b, a);
}
превращается в
c(__simd64_int16_t, __simd64_int16_t):
vswp d1, d0
bx lr
Я на самом деле сгенерирована online.
Так что, в конце концов, я думаю, что это кипит, если регистры смежны, тогда они уже объединены, если нет, вы можете просто использовать vmov
или vswp
.
См. Это arm documentation о том, как neon
Регистры, отложенные и переданные.
+1 для интерактивного онлайн-компилятора. – Spectravideo328