我需要为打包单元构建某种屏蔽系统,因为我需要在包含少于4个元素的向量上使用打包操作。
所以,例如,我需要做这样的事情:
section .data
align 16
a: dd 1.5, 2.3, 5.0
align 16
x: dd 1.0, -3.0, 5.0
global main
main: start
movaps xmm0, [x]
movaps xmm1, [a]
addps xmm0, xmm1
haddps xmm0, xmm0
haddps xmm0, xmm0
这应该导致进入xmm0
11.8,11.8,11.8,11.8
这样我就可以拿其中一个来获得我的操作结果。
这是必需的,因为代码应该适用于用户的输入,它可能不包含4个元素的倍数,而不是编写一个特殊的案例来处理它,我想重用它我已经拥有的代码只有一些细微的变化。
根据我的理解,在这种情况下,移动a
到xmm0
最终会进入xmm0
1.5,2.3,5.0,0.0
所以不应该出现任何问题,因为添加0不会改变任何事情。
但如果a
是从float*
程序传递的C
怎么办?根据我的理解,我很有可能将0.0
的值作为xmm0
中复制的第四个元素,因为我从内存中复制而不是处理定义的常量。
当然这会弄乱我的所有计算,导致不必要的结果,所以这就是我的想法:我可以"掩盖" xmm0
的内容基于我有多少元素?
这意味着,在这种情况下,我会手动将xmm0
的第四个元素手动设置为0,因为前三个元素是必需的。
这是我写的代码:
section .data
align 16
a: dd 1.5, 2.3, 5.0, 7.0
align 16
x: dd 1.0, -3.0, 5.0, 7.0
align 16
mask: dd 0x00, 0x00, 0x00, 0xFF
section .bss
section .text
global main
main: start
movaps xmm0, [x]
movaps xmm1, [a]
movaps xmm2, [mask] ; move the mask to a support registry
cmpnltps xmm3, xmm2 ; this compare should put -NaN where xmm2 has 0xFF
andps xmm0, xmm3 ; mask x vector
andps xmm1, xmm3 ; mask a vector
; let's make the needed operations to compute the result
addps xmm0, xmm1
haddps xmm0, xmm0
haddps xmm0, xmm0
; yay! there's 11.8, 11.8, 11.8, 11.8 in xmm0!
stop
我已经尝试了一些示例,它可以正常工作,即使我更改了掩码以排除其他一些值(0x00, 0x00, 0xFF, 0xFF
仅适用于前两个元素等。)< / p>
现在,鉴于我几天前开始使用SSE
,我不确定这是否是正确的做法,我无法想到某种举例来证明它不起作用,所以问题在于:有没有更好/官方的方法来实现我的需要,如果没有,我的代码是完成工作还是因为它的工作原因只是因为我正在使用一个&#34;幸运&#34;示例