使用int64x2_t向量将低64位复制到高64位?

时间:2016-05-10 13:03:21

标签: c arm neon

我很难找到我需要的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有机会变慢。

1 个答案:

答案 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位向量。