我们应该考虑使用Neon内在函数(如vadd_s8)时的溢出

时间:2013-12-06 14:45:53

标签: arm neon

如果我们有这样的C代码

spatial_pred= (cur[mrefs] + cur[prefs])>>1;

转换为Neon内在函数时

int8x8_t cur_mrefs = vld1_s8(cur+mrefs);
int8x8_t cur_prefs = vld1_s8(cur+prefs);
int8x8_t spatial_pred = vshr_n_s8(vadd_s8(cur_mrefs, cur_prefs), 1);

vadd_s8(cur_mrefs,cur_prefs)时是否需要考虑溢出?我们是否应该使用vadd_s16?

1 个答案:

答案 0 :(得分:2)

如果您不想丢失溢出信息,则应先move int8x8_tint16x8_t然后进行求和。

如果您希望结果饱和,那么您应该使用vqadd

Vector saturating add: vqadd -> Vr[i]:=sat<size>(Va[i]+Vb[i])

如果你只想转换C版本,你应该使用vhadd或vrhadd(rounds),它会减少总和,而不是尝试做第二步。

Vector halving add: vhadd -> Vr[i]:=(Va[i]+Vb[i])>>1
Vector rounding halving add: vrhadd -> Vr[i]:=(Va[i]+Vb[i]+1)>>1