2013-12-06 1 views
0

Если у нас есть такой код СЕсли мы рассмотрим переполнения при использовании неоновых встроенных функций, таких как vadd_s8

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

, когда преобразование в неоновых встроенные функции

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 Do (cur_mrefs, cur_prefs)? Нужно ли вместо этого использовать vadd_s16?

ответ

2

Если вы не хотите потерять информацию о переполнении, вы должны сначала moveint8x8_t до int16x8_t, затем выполнить суммирование.

Если вы хотите, чтобы результат насыщался, вы должны использовать vqadd.

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

Если вы просто хотите, чтобы преобразовать версию C следует использовать vhadd или vrhadd (раундов), который делает вдвое сумму вместо того, чтобы пытаться сделать сдвиг в качестве второго шага.

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