我找不到我需要的霓虹灯。我有一个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有机会放慢速度。

最佳答案

你至少有两种写作方法。

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位矢量。

关于c - 使用int64x2_t vector 将低64位复制到高64位?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37139392/

10-15 11:24