我正在研究SSE2到NEON的端口。 SSE代码执行以下操作:
int64x2_t a, b, c, d;
...
a = interleave_high64(b, interleave_low64(c, d));
它执行以下操作代替_mm_unpackhi_epi64
和_mm_unpacklo_epi64
:
static inline int64x2_t interleave_low64(int64x2_t a, int64x2_t b) {
const int64x2x2_t result = vzip_s64(vget_low_s64(a), vget_low_s64(b));
return vcombine_s64(result.val[0], result.val[1]);
}
static inline int64x2_t interleave_high64(int64x2_t a, int64x2_t b) {
const int64x2x2_t result = vzip_s64(vget_high_s64(a), vget_high_s64(b));
return vcombine_s64(result.val[0], result.val[1]);
}
我的第一个即时问题是,vzip_s64
为什么会丢失(vzip_s32
和vzip_s16
are available)。或许,我应该使用什么呢?
我猜测手头有更大的模式,它甚至可以使用VSTR.2
作为交错存储。我的第二个问题是,我应该做什么而不是三个或四个NEON内在函数?