青龙骑士团吧 关注:1,673贴子:97,083
  • 11回复贴,共1

老子奋斗一天老子终于把MMX指令集玩转了

只看楼主收藏回复

老子嘛圈儿都夹紧了才研究出来,虽然你们一个二个看不懂但是老子还是要贴上来吓哈你们,让你们晓得锅儿是铁倒的,老子现在图片透明处理速度提升两倍以上,而镂空或者变明变暗速度更是提升高达4倍以上,太无敌了,日吗小小一个奔腾1竟然有mmx这么强大的指令集,老子要爆了,老子二滚工作室的游戏在明年就能正式发行了。


1楼2010-04-13 22:13回复
    老子就贴个透明给你们看哈,日吗就这段代码已经把老子的编程技术推向了顶峰。
    void MMXBlend(void *des, void *src, unsigned long Lenth, unsigned char Alpha)     // Lenth以8字节为1单位
    {
         unsigned __int64 alp=Alpha | Alpha<<8|Alpha<<16|Alpha<<24;
         _asm
         {
             mov             esi,     src
             mov             edi,     des
             mov             ecx,     Lenth
             pxor         mm7,     mm7
             movq         mm6,     alp
             punpcklbw     mm6,     mm7
    _startblendloop:
             movq         mm0,     [edi+ecx*8-8]         //mm0=[des]
             movq         mm1,     [esi+ecx*8-8]         //mm1=[src]
             movq         mm2,     mm0
             movq         mm3,     mm1
             punpcklbw     mm0,     mm7                         //字节变为字,以便计算
             punpckhbw     mm2,     mm7                         //字节变为字,以便计算
             punpcklbw     mm1,     mm7                         //
             punpckhbw     mm3,     mm7                         //         mm1,mm3为源数据,mm0,mm2为目标数据
    


    2楼2010-04-13 22:14
    回复
               psubw         mm1,     mm0    
               psubw         mm3,     mm2                         // s-d
               pmullw         mm1,     mm6
               pmullw         mm3,     mm6                         //(s-d)*a
               psrlw         mm1,     8
               psrlw         mm3,     8                         //(s-d)*a/256
               paddb         mm1,     mm0
               paddb         mm3,     mm2                         //(s-d)*a/256+s     =     d*a/256 - s*(256-a)/256
               packuswb     mm1,     mm3                         //打包,无符号打包,有符号是packsswb
               movq         [edi+ecx*8-8],mm1
               loop     _startblendloop
               EMMS
           }
      }


      3楼2010-04-13 22:14
      回复
        再给你们看镂空,镂空和透明是2D游戏的绝招,而这两大函数老子都用mmx完美地操空了,MMX指令集的最大优点就是能把4笔char类型的数据同时进行加减乘移位等运算,从而成倍提升处理速度,镂空速度竟然能提升4倍,还有王法吗,还有法律吗?
        void MMXHollow(void *des, void *src, int ColorKey, unsigned long Lenth)     //镂空
        {
             unsigned __int64     ck     =     0 ,     max     =     0xffffffffffffffff;
             _asm
             {
                 mov         eax,     ColorKey
                 lea         esi,     ck
                 mov         [esi],     eax
                 mov         [esi+4],eax
             }
             _asm
             {
                 mov             esi,     src
                 mov             edi,     des
                 mov             ecx,     Lenth
                 movq         mm7,     ck
                 movq         mm5,     max
        _startAddARGBLoop:
                 movq         mm6,     mm7
                 movq         mm0,     [edi+ecx*8-8]             //mm0目标,mm1源
                 movq         mm1,     [esi+ecx*8-8]
                 pcmpeqd         mm6,     mm1
                 pand         mm0,     mm6
                 pxor         mm6,     mm5
                 pand         mm1,     mm6
                 por             mm0,     mm1
                 movq         [edi+ecx*8-8],     mm0
                 loop     _startAddARGBLoop
                 EMMS
             }
        }


        4楼2010-04-13 22:18
        回复
          我希望你们了解,C语言是博大精深的,C语言嵌入MMX以后跟是强大得天怒人怨,你们除了泪流满面已经没有第二条路了


          5楼2010-04-13 22:22
          回复
            等老子开发3D游戏的时候老子还要研究sse指令集,我草,如果是mmx能同时计算8笔char数据,那sse指令就能同时计算4笔float数据,刚好是一组三维坐标


            6楼2010-04-13 22:25
            回复
              #include <iostream>
              using namespace std;
              void MMXBlend(void *des, void *src, unsigned long Lenth, unsigned char Alpha)     // Lenth以8字节为1单位
              {
                   unsigned __int64 alp=Alpha | Alpha<<8|Alpha<<16|Alpha<<24;
                   _asm
                   {
                       mov             esi,     src
                       mov             edi,     des
                       mov             ecx,     Lenth
                       pxor         mm7,     mm7
                       movq         mm6,     alp
                       punpcklbw     mm6,     mm7
              _startblendloop:
                       movq         mm0,     [edi+ecx*8-8]         //mm0=[des]
                       movq         mm1,     [esi+ecx*8-8]         //mm1=[src]
                       movq         mm2,     mm0
                       movq         mm3,     mm1
                       punpcklbw     mm0,     mm7                         //字节变为字,以便计算
                       punpckhbw     mm2,     mm7                         //字节变为字,以便计算
                       punpcklbw     mm1,     mm7                         //
                       punpckhbw     mm3,     mm7                         //         mm1,mm3为源数据,mm0,mm2为目标数据
              


              7楼2010-04-13 22:48
              回复
                         psubw         mm1,     mm0    
                         psubw         mm3,     mm2                         // s-d
                         pmullw         mm1,     mm6
                         pmullw         mm3,     mm6                         //(s-d)*a
                         psrlw         mm1,     8
                         psrlw         mm3,     8                         //(s-d)*a/256
                         paddb         mm1,     mm0
                         paddb         mm3,     mm2                         //(s-d)*a/256+s     =     d*a/256 - s*(256-a)/256
                         packuswb     mm1,     mm3                         //打包,无符号打包,有符号是packsswb
                         movq         [edi+ecx*8-8],mm1
                         loop     _startblendloop
                         EMMS
                     }
                }
                void MMXAddARGB(void *des, void *src, unsigned long Lenth)             //像素相加
                {
                     _asm
                     {
                         mov             esi,     src
                         mov             edi,     des
                         mov             ecx,     Lenth
                


                8楼2010-04-13 22:48
                回复
                  _startAddARGBLoop:
                           movq         mm0,     [edi+ecx*8-8]
                           movq         mm1,     [esi+ecx*8-8]
                           paddusb         mm0,     mm1                 //mm0+mm1
                           movq         [edi+ecx*8-8],     mm0
                           loop     _startAddARGBLoop
                           EMMS
                       }
                  }
                  void MMXSubARGB(void *des, void *src, unsigned long Lenth)                 //像素相减
                  {
                       _asm
                       {
                           mov             esi,     src
                           mov             edi,     des
                           mov             ecx,     Lenth
                  _startAddARGBLoop:
                           movq         mm0,     [edi+ecx*8-8]
                           movq         mm1,     [esi+ecx*8-8]
                           psubusb         mm0,     mm1                 //mm0+mm1
                           movq         [edi+ecx*8-8],     mm0
                           loop     _startAddARGBLoop
                           EMMS
                       }
                  }
                  void MMXHollow(void *des, void *src, int ColorKey, unsigned long Lenth)     //镂空
                  {
                       unsigned __int64     ck     =     0 ,     max     =     0xffffffffffffffff;
                       _asm
                       {
                           mov         eax,     ColorKey
                  


                  9楼2010-04-13 22:48
                  回复
                             lea         esi,     ck
                             mov         [esi],     eax
                             mov         [esi+4],eax
                         }
                         _asm
                         {
                             mov             esi,     src
                             mov             edi,     des
                             mov             ecx,     Lenth
                             movq         mm7,     ck
                             movq         mm5,     max
                    _startAddARGBLoop:
                             movq         mm6,     mm7
                             movq         mm0,     [edi+ecx*8-8]             //mm0目标,mm1源
                             movq         mm1,     [esi+ecx*8-8]
                             pcmpeqd         mm6,     mm1
                             pand         mm0,     mm6
                             pxor         mm6,     mm5
                             pand         mm1,     mm6
                             por             mm0,     mm1
                             movq         [edi+ecx*8-8],     mm0
                             loop     _startAddARGBLoop
                             EMMS
                         }
                    }
                    void MMXSubNumber(void *des, unsigned number, unsigned long Lenth)         //像素ARGB分别-Number
                    {
                         __int64     num     =     number | number<<8 | number<<16 | number<<24;
                    


                    10楼2010-04-13 22:48
                    回复
                           _asm
                           {
                               mov             esi,     des
                               mov             ecx,     Lenth
                               movq         mm7,     num
                               movq         mm6,     mm7
                               psllq         mm7,     32
                               por             mm7,     mm6
                      _startSubNumer:
                               movq         mm0,     [esi+ecx*8-8]
                               psubusb         mm0,     mm7
                               movq         [esi+ecx*8-8],mm0
                               loop         _startSubNumer
                               emms
                           }
                      }
                      void MMXAddNumber(void *des, unsigned number, unsigned long Lenth)         //像素ARGB分别+Number
                      {
                           __int64     num     =     number | number<<8 | number<<16 | number<<24;
                           _asm
                           {
                               mov             esi,     des
                               mov             ecx,     Lenth
                               movq         mm7,     num
                               movq         mm6,     mm7
                               psllq         mm7,     32
                               por             mm7,     mm6
                      _startSubNumer:
                               movq         mm0,     [esi+ecx*8-8]
                               paddusb         mm0,     mm7
                               movq         [esi+ecx*8-8],mm0
                               loop         _startSubNumer
                               emms
                           }
                      }


                      11楼2010-04-13 22:48
                      回复
                        我唯一不明白的是,为什么总是提到我。


                        IP属地:湖南12楼2020-11-18 11:25
                        回复