zoukankan      html  css  js  c++  java
  • 用SSE汇编求向量的点积

    class __declspec(align(16)) vector4 {
    public:
        union 
    {
            
    struct float x, y, z, w; };
            __m128 mm;
        }
    ;
    }
    ;

    inline 
    void dot3( vector4 & r, const vector4 & x, const vector4 & y )
    {
        
    /*register vector4    s;
        s.mm = _mm_mul_ps( x.mm , y.mm );
        r.mm = _mm_add_ss( s.mm , _mm_movehl_ps( s.mm , s.mm ) );
        r.mm = _mm_add_ss( r.mm , _mm_shuffle_ps( r.mm , r.mm , 1 ) );
    */

        __asm 
    {
            mov        ecx, y
            mov        edx, x
            mov        eax, r
            movaps    xmm0, xmmword ptr [ecx]
            movaps    xmm1, xmmword ptr [edx]
            mulps    xmm1, xmm0        
    //    xmm1 = s0, s1, s2, s3
            movhlps    xmm0, xmm1        //    xmm0 = s2, s3, *, *
            addss    xmm0, xmm1        //    xmm0 = s0+s2, s3, *, *
            shufps    xmm1, xmm1, 1    //    xmm1 = s1, s0, s0, s0
            addss    xmm0, xmm1        //    xmm0 = s0+s2+s1, s3, *, *
            movaps    xmmword ptr [eax], xmm0
        }

    }


    inline 
    void dot4( vector4 *r, const vector4 *x, const vector4 *y )
    {
        
    /*register vector4    s;
        s.mm = _mm_mul_ps( x->mm , y->mm );
        r->mm = _mm_add_ss( s.mm , _mm_movehl_ps( s.mm , s.mm ) );
        r->mm = _mm_add_ss( r->mm , _mm_shuffle_ps( r->mm , r->mm , 1 ) );
        r->mm = _mm_add_ss( r->mm , _mm_shuffle_ps( r->mm , r->mm , 3 ) );
    */

        __asm 
    {
            mov        ecx, y
            mov        edx, x
            mov        eax, r
            movaps    xmm0, xmmword ptr [ecx]
            movaps    xmm1, xmmword ptr [edx]
            mulps    xmm1, xmm0        
    //    xmm1 = s0, s1, s2, s3
            movhlps    xmm0, xmm1        //    xmm0 = s2, s3, *, *
            addss    xmm0, xmm1        //    xmm0 = s0+s2, s3, *, *
            shufps    xmm1, xmm1, 253    //    xmm1 = s1, s3, s3, s3
            addss    xmm0, xmm1        //    xmm0 = s0+s2+s1, s3, *, *
            movhlps    xmm1, xmm1        //    xmm1 = s3, s3, s3, s3
            addss    xmm0, xmm1        //    xmm0 = s0+s2+s1+s3, s3, *, *
            movaps    xmmword ptr [eax], xmm0
        }

    }
  • 相关阅读:
    IOS中延迟执行的几种方法
    Xcode6中如何去掉默认的Main.storyboard
    IOS7.0 UILabel实现自适应高度的新方法
    UITabBarController常见代理方法的使用
    Infopath 2010 接收SQL Server数据
    olsr学习之一:Ubuntu10.04下ns2-allinone-2.34安装方法
    常用工具遇到的错误以及解决方法
    笔记本电脑选购个人的一些浅见
    嵌入式题目集锦
    关于网络传输字节顺序的问题: hton? or ntoh?
  • 原文地址:https://www.cnblogs.com/len3d/p/818165.html
Copyright © 2011-2022 走看看