NEON ассемблерный код, как конвертировать BYTE в float?

теперь у меня есть код, который я хочу улучшить. тип данных 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)
);

}

Моя проблема заключается в том, как кодировать «код: преобразовать байт в число с плавающей запятой» и «код: преобразовать число с плавающей точкой в ​​байт», перечисленные в разделе «Неоновый код ассемблера».

2

Решение

Преобразование байтов в число с плавающей запятой довольно просто. Код ниже сделает это для одного регистра байтов:

"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, я бы порекомендовал прочитать документация тщательно. Это хороший способ справиться с инструкциями.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]