NEON 汇编代码,如何将 BYTE 转换为浮点数?

Posted

技术标签:

【中文标题】NEON 汇编代码,如何将 BYTE 转换为浮点数?【英文标题】:NEON assembly code, how to convert BYTE to float? 【发布时间】:2013-01-24 10:14:13 【问题描述】:

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

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

【问题讨论】:

您需要分两个阶段执行此操作 - 首先将字节解压缩为 32 位整数,然后将 32 位整数转换为浮点数。请注意,使用内部函数而不是原始的内联 asm 会更容易 【参考方案1】:

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

"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。这是掌握说明的好方法。

【讨论】:

以上是关于NEON 汇编代码,如何将 BYTE 转换为浮点数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中将4字节数组转换为浮点数

怎么将4字节16进制转化成浮点数

如何防止 Gson 将整数表示为浮点数

如何将表示为字符串的数字转换为浮点数

Sympy - 生成 C 代码。将 Rational 转换为浮点数

如何将带指数的字符串转换为浮点数?