Syn*_*tix 5 c graphics optimization assembly
在x86/SIMD程序集中,我已经填充了一个XMM寄存器,其中包含我需要转换的四个32位像素的图形图像.但是,像素采用10位打包RGB格式,因此它们以32位的形式存在:
[ red ][ green ][ blue ][]
RRRRRRRRRRGGGGGGGGGGBBBBBBBBBB00
Run Code Online (Sandbox Code Playgroud)
最后两位是填充位,未使用.
我需要将这些像素乘以另一个值,但是需要屏蔽该值,因此它只影响红色像素.该值是常量,因此可以进行硬编码.假设该值为0.1234.如何通过适当的屏蔽将其放入另一个XMM寄存器中,以便它只影响每个32位段的红色部分?
以图形方式说明,我想做这样的事情:
XMM0 (first 32 bit segment):
[ 0.1234 ][ 1.0 ][ 1.0 ][]
*
XMM1 (first 32 bit segment):
RRRRRRRRRRGGGGGGGGGGBBBBBBBBBB00
Run Code Online (Sandbox Code Playgroud)
结果是XMM0和XMM1的乘积.当然,这个32位段将在整个XMM寄存器中重复,我只是在这里指定了前32位,所以你明白了.
如果你真的只想影响红色部分,你也许可以想出一个技巧,将红色和部分绿色乘以某个常数(将寄存器视为 16 位短路的集合),然后重新组合新的红色部分与旧的绿色和蓝色部分。
如果您要对所有颜色进行操作,更好的策略是使用移位和随机播放的组合(并可能转换为浮动)操作。然后做所有的数学运算,然后打包回来。
如果您曾经重复使用任何值(例如,如果您正在计算过滤器内核)并且您正在使用浮点数,那么如果您解压并转换为浮点数一次,然后重新使用该值,那么速度会快得多。以及结束。即使您必须先创建一个循环,将整行解压为 32 位浮点数,然后再对其进行操作并重新打包整行。
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |