теперь у меня есть код, который я хочу улучшить. тип данных src является байтовым. Я хочу рассчитать с помощью float и сохранить результат в байтах. но я не знаю, как преобразовать тип данных между BYTE и float. Я разрабатываю на Android NDK. код на C ++, который я хочу улучшить:
void DoEffect(BYTE *pSrc, float rat){
//image data:BGRA
float red, green, blue;
red = pSrc[RED_CHANNEL] * rat;
green = pSrc[GREEN_CHANNEL] * rat;
blue = pSrc[BLUE_CHANNEL] * rat;
// some step to calculate the result;
// red = ...
// ...
//
pSrc[RED_CHANNEL] = (BYTE)red;
pSrc[GREEN_CHANNEL] = (BYTE)green;
pSrc[BLUE_CHANNEL] = (BYTE)blue;
}
и мой неоновый код asm:
void DoEffect_neon_asm(BYTE *pSrc, float rat){
__asm__ __volatile__(
"vld4.8 {d0-d3},[%[src]] \n""vdupq.32 {d4, d5}, [%[rat]] \n""# convert src data to float? \n""code: convert byte to float \n""# calculate result \n"".. \n""# convert result to byte \n""code: convert float to byte \n":[src]"r"(pSrc), [rat]"r"(rat)
);
}
Моя проблема заключается в том, как кодировать «код: преобразовать байт в число с плавающей запятой» и «код: преобразовать число с плавающей точкой в байт», перечисленные в разделе «Неоновый код ассемблера».
Преобразование байтов в число с плавающей запятой довольно просто. Код ниже сделает это для одного регистра байтов:
"vmovl.u8 q3, d2 \n\t" //Expand to 16-bit
"vmovl.u16 q10, d6 \n\t" //Expand to 32-bit
"vmovl.u16 q11, d7 \n\t""vcvt.f32.u32 q10, q10 \n\t" //Convert to float
"vcvt.f32.u32 q11, q11 \n\t"
Преобразование обратно в байты — это почти полностью обратный процесс. использование vcvt.u32.f32
а также vmovn
вместо.
Кроме того, если вы новичок в NEON, я бы порекомендовал прочитать документация тщательно. Это хороший способ справиться с инструкциями.
Других решений пока нет …