我找不到我需要的霓虹灯。我有一个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/