在 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/