如果我们有这样的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?
答案 0 :(得分:2)
如果您不想丢失溢出信息,则应先move int8x8_t
至int16x8_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