SSE中的封装屏蔽

时间:2015-05-01 11:08:03

标签: c assembly x86 nasm sse

我需要为打包单元构建某种屏蔽系统,因为我需要在包含少于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个元素的倍数,而不是编写一个特殊的案例来处理它,我想重用它我已经拥有的代码只有一些细微的变化。

根据我的理解,在这种情况下,移动axmm0最终会进入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;示例

0 个答案:

没有答案