Внутри цикла я должен реализовать своего рода отсечение
if ( isLast )
{
val = ( val < 0 ) ? 0 : val;
val = ( val > 255 ) ? 255 : val;
}
Однако это отсечение занимает почти половину времени выполнения цикла в Neon. Вот как выглядит весь цикл:
for (row = 0; row < height; row++)
{
for (col = 0; col < width; col++)
{
Int sum;
//...Calculate the sum
Short val = ( sum + offset ) >> shift;
if ( isLast )
{
val = ( val < 0 ) ? 0 : val;
val = ( val > 255 ) ? 255 : val;
}
dst[col] = val;
}
}
Так реализовано отсечение в Neon.
cmp %10,#1 //if(isLast)
bne 3f
vmov.i32 %4, d4[0] //put val in %4
cmp %4,#0 //if( val < 0 )
blt 4f
b 5f
4:
mov %4,#0
vmov.i32 d4[0],%4
5:
cmp %4,%11 //if( val > maxVal )
bgt 6f
b 3f
6:
mov %4,%11
vmov.i32 d4[0],%4
3:
Это отображение переменных в регистры-
isLast- %10
maxVal- %11
Любые предложения, чтобы сделать это быстрее? Спасибо
РЕДАКТИРОВАТЬ-
Вырезка сейчас выглядит так:
"cmp %10,#1 \n\t"//if(isLast)
"bne 3f \n\t"
"vmin.s32 d4,d4,d13 \n\t"
"vmax.s32 d4,d4,d12 \n\t"
"3: \n\t"
//d13 contains maxVal(255)
//d12 contains 0
Время, затрачиваемое на выполнение этой части кода, сократилось с 223 мс до 18 мс.