assembly - 在汇编中将无符号字符转换为 float (为浮点向量计算做准备)

标签 assembly sse2

我正在尝试使用 SSE2 优化函数。我想知道是否可以比这种方式更好地为我的汇编代码准备数据。我的源数据是来自 pSrcData 的一堆无符号字符。我将其复制到这个 float 数组中,因为我的计算需要在 float 中进行。


unsigned char *pSrcData = GetSourceDataPointer();

__declspec(align(16)) float vVectX[4];

vVectX[0] = (float)pSrcData[0];
vVectX[1] = (float)pSrcData[2];
vVectX[2] = (float)pSrcData[4];
vVectX[3] = (float)pSrcData[6];

__asm 
{
     movaps xmm0, [vVectX]
     [...]  // do some floating point calculations on float vectors using addps, mulps, etc
}

是否有一种更快的方法可以将 pSrcData 的所有其他字节转换为 float 并将其存储到 vVectX 中?

谢谢!

最佳答案

(1) AND 使用掩码将奇数字节清零 (PAND)

(2) 从 16 位解压到 32 位(使用零向量的PUNPCKLWD)

(3) 将 32 位整数转换为 float (CVTDQ2PS)

三个说明。

关于assembly - 在汇编中将无符号字符转换为 float (为浮点向量计算做准备),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3991984/

相关文章:

assembly - 将两个 32 位带符号数与加法和移位相乘

x86-64 程序集的性能优化 - 对齐和分支预测

x86 - 下面的汇编指令addsd -8(%rbp), %xmm0 的作用是什么?

c++ - 从数组中向量化提取特定模式的短裤,并插入到新数组中

assembly - 将 XMM 寄存器设置为重复字节模式(广播常量字节)

performance - REP 做了什么设置?

assembly - Cortex M - IRQ 禁用的原子性

c - 为什么 GCC 在堆栈上分配的空间超出了必要的空间,超出了对齐所需的空间?

linux - Midnite 指挥官 ELF 查看器 - 这些符号是什么意思?

image-processing - 使用 sse 或 mmx 加速 rgb 平面到 rgba 交错转换