gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:02:35 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com