ARM内在函数包括提取不同大小标量的函数。功能被最完全地记录在ARM® C Language Extensions:vgetq_lane_u64(x,0)与vget_low_u64(x)
ET vgetQ_lane_ST(T vec, const int lane);
获取从输入向量指定车道的值。有12个内在函数。
和:
T vget_high_ST(T2 a); T vget_low_ST(T2 a);
得到一个128位向量的高或低,一半。内部函数有24 。
我知道在某些情况下存在等价性。例如,小端机器上,以下为64位值也是如此:
uint64x2_t x = ...;
vgetq_lane_u64(x, 0) == vget_low_u64(x);
类似的等价存在高道:
uint64x2_t x = ...;
vgetq_lane_u64(x, 1) == vget_high_u64(x);
我的问题是,什么是实际差异,因为这两个函数返回一个标量?应该比另一个更受欢迎吗?
'在小端机器上'可能不相关,因为在任何时候你都没有索引一个数组。索引矢量寄存器中的元素更像是标量寄存器中整数的左/右移位。我没有看过,但我认为可以以任何一种字节顺序运行的体系结构不会改变洗牌向量的指令的行为,也不会改变向量中插入/提取标量的行为。 (当然,如果标量来自内存,则字节顺序对标量内的字节顺序很重要,而不是向量内的元素位置。) –