c - 需要将一个 XMM 寄存器乘以另一个,但具有位掩码值

标签 c optimization assembly graphics

在 x86/SIMD 汇编中,我用我需要转换的图形图像的四个 32 位像素填充了一个 XMM 寄存器。然而,像素是 10 位打包的 RGB 格式,所以它们以 32 位的形式存在:

[  red   ][  green ][  blue  ][]
RRRRRRRRRRGGGGGGGGGGBBBBBBBBBB00

最后两位是填充位,未使用。

我需要将这些像素乘以另一个值,但该值需要被屏蔽,因此它只影响红色像素。该值是常量,因此可以进行硬编码。假设该值为 0.1234。我如何将它放入另一个具有适当屏蔽的 XMM 寄存器中,以便它只影响每个 32 位段的红色部分?

以图形方式说明,我想做这样的事情:

XMM0 (first 32 bit segment):
[ 0.1234 ][  1.0   ][  1.0   ][]

*

XMM1 (first 32 bit segment):
RRRRRRRRRRGGGGGGGGGGBBBBBBBBBB00

结果是 XMM0 和 XMM1 的乘积。当然,这个 32 位段将在整个 XMM 寄存器中重复,我只是在这里指定了前 32 位,所以你明白了。

最佳答案

如果您真的只想影响红色部分,您也许可以想出一个技巧,将红色和部分绿色乘以某个常数(将寄存器视为 16 位短裤的集合)并且然后将新的红色部分与旧的绿色和蓝色部分重新组合。

如果您要对所有颜色进行操作,更好的策略是使用 shift 和 shuffle(以及可能转换为 float) 操作。然后进行所有计算,然后打包回去。

如果您曾经重复使用任何值(例如,如果您正在计算一个过滤器内核)并且您正在使用 float ,那么如果您解压并转换为 float 一次 然后一遍又一遍地重复使用那个值。即使您必须创建一个循环将整行解压缩为 32 位 float ,然后再对其进行操作并重新打包整行。

关于c - 需要将一个 XMM 寄存器乘以另一个,但具有位掩码值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14943822/

相关文章:

C 编程从命令行读取字符

python - 如何在 Python 中优化 str.replace()

algorithm - 对重叠集执行关联操作的最少操作数

c++ - Visual C++ 2010 Express x64 程序集

gcc - 将 C 函数对齐到 "odd"地址

c - TCP套接字到多个IP/端口

c - C语言中的内存管理错误。为什么会出现这些错误?

algorithm - 最大化人与人之间的互动

c - GCC 将寄存器 args 放置在堆栈上,并在局部变量下方留有间隙?

c - 递归查找数组中相同元素的数量