NEON汇编代码,如何将BYTE转换为float?

时间:2013-01-24 10:14:14

标签: c++ assembly neon

现在我有一个想改进的代码。 src数据的数据类型是byte。我想用float计算并将结果存储到byte。但我不知道如何转换BYTE和浮点数据的数据类型。我在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)
);

}

我的问题是如何编码“neon asm code”中列出的“code:convert byte to float”和“code:convert float to byte”。

1 个答案:

答案 0 :(得分:3)

将字节转换为浮点数非常简单。下面的代码将为一个字节寄存器执行此操作:

"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.f32vmovn

另外,如果您是NEON的新手,我建议您彻底阅读documentation。这是处理说明的好方法。