我想计算y = ax + b,其中x和y是一个像素值[即,值范围为0~255的字节],a而且b是浮点数
由于我需要对图像中的每个像素应用此公式,此外,a和b对于不同的像素是不同的.在C++中直接计算很慢,所以我很有兴趣知道c ++中的sse2指令.
搜索之后,我发现浮点数与sse2的乘法和加法一样_mm_mul_ps和_mm_add_ps.但首先,我需要将字节中的x转换为float(4字节).
问题是,在我从字节数据源(_mm_load_si128)加载数据后,如何将数据从byte转换为float?
据我了解,浮点存储在XMM寄存器中,而不是诸如的通用寄存器中eax,因此我做了一个实验:
float a = 5;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,a被存储1084227584在XMM寄存器中。这是程序集版本:
.text
.global _start
.LCO:
.long 1084227584
_start:
mov .LCO, %eax
movss .LCO, %xmm0
Run Code Online (Sandbox Code Playgroud)
执行上述组件和使用它的调试gdb显示,在值eax将是1084227584,然而,在值ymm0是5。
这是我的问题:
1- XMM寄存器有什么特别之处?除了SIMD指令,它们是唯一存储浮点的寄存器类型吗?
为什么不能在常规寄存器中设置相同的位?
2- float和double值始终存储为浮点吗?
我们永远不能将它们存储为fixed pointC或汇编语言吗?