我很难找到我需要的NEON instrinsic。我有一个128位的值作为int64x2_t
,我需要将低64位复制到高64位。我还需要有时将高64位复制到低64位。
NEON有lane dup,但需要int64x1_t
并返回int64x1_t
。
int64x1_t vdup_lane_s64(int64x1_t vec, __constrange(0,0) int lane);
该范围也似乎已关闭,因为我似乎应该能够选择1或2.(也许这对我来说是一种误解)。
如何在int64x2_t
中将低64位复制到高64位?
我没有使用下面建议的(high >> x) | (low << x)
模式。首先是undefined behavior in C/C++ when x
is 0。其次,值应该在NEON SIMD寄存器中,所以我不想不小心往返它。第三,GCC is not generating the code I hoped for,所以我不想让GCC有机会变慢。
答案 0 :(得分:1)
有(至少)两种方法可以写它。
int64x2_t f(int64x1_t v)
{
return vdupq_lane_s64(v, 0);
// or
// return vcombine_s64(v, v); // poor code with GCC
}
vdupq_lane的输入是64位向量,但结果是128位向量。