ÀÌ°ÍÀº 1999³â ÇÏÀÌÅÚ °ÔÀÓ Á¦ÀÛ µ¿È£È¸¿¡ ¿Ã·È´ø °­Á 4ȸºÐ ÀÔ´Ï´Ù.

#####################################################

---------------------------------------------------------------------------
      µ¨ÆÄÀÌ¿¡¼­ MMX Äڵ带 (1/4)

   1. µ¨ÆÄÀÌ¿¡¼­ MMX Äڵ带 »ç¿ëÇÏ´Â ¹ý
   2. MMX üŷ°ú MMX ·¹Áö½ºÅ͸¦ ÀÌ¿ëÇÑ 8 bytes Àü¼Û
   3. MMX ÀÀ¿ë (1) - Å©·Î¸¶Å°
   4. MMX ÀÀ¿ë (2) - °í¼Ó Çà·Ä ¿¬»ê
---------------------------------------------------------------------------

¾È³çÇϼ¼¿ä.. ¾È¿µ±âÀÔ´Ï´Ù.

´Ù¸§ ¾Æ´Ï¶ó À̹ø¿¡´Â µ¨ÆÄÀÌ¿¡¼­ MMX Technology¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ý°ú ±× ÀÀ¿ë ÇÁ
·Î±×·¥À» ¸¸µå´Â ¿¹Á¦¸¦ ¼³¸í µå¸®°íÀÚ ÇÕ´Ï´Ù.

MMX Technology ´Â ¸î ³â Àü¿¡ »ó´çÈ÷ À¯ÇàÇϸ鼭, ÄÄÇ»ÅÍ°¡ ¹ºÁöµµ ¸ð¸£´Â »ç¶÷
µéÁ¶Â÷µµ 'ÆæƼ¾ö 166'º¸´Ü 'ÆæƼ¾ö 166 MMX'°¡ ÁÁ´Ù´Â °ÍÀ» ¾Ë Á¤µµ¿´Áö¸¸,  Á¤
ÀÛ ÇÁ·Î±×·¡¸Óµé¿¡°Ô´Â MMX ¶ó´Â °ÍÀÌ ¶Ç ´Ù¸¥ ºÎ´ãÀ» ÁØ °ÍÀÌ »ç½ÇÀÌÁö¿ä..
( ³ªÁß¿¡ MMX¿Í ÆæƼ¾ö ÇÁ·Î°¡ ÇÕÃÄÁ®¼­ ÆæƼ¾ö 2 °¡ µÇ´Â °á°ú¸¦ ³ª¾Ò½À´Ï´Ù. )

MMX Technology ¿¡ ´ëÇؼ­ °£´ÜÇÏ°Ô ¼³¸íÇÏÀÚ¸é,  ±âÁ¸¿¡ FPU °¡ »ç¿ëÇÏ´ø  ½ºÅÃ
ÇÁ·¹ÀÓÀ» Àý´ë ¹øÁö·Î »ç¿ëÇÏ¿© 64bit ·¹Áö½ºÅÍÀÎ mm0 ºÎÅÍ mm7±îÁöÀÇ 8 °³ÀÇ ·¹
Áö½ºÅÍ·Î È®ÀåÀ» Çϸ鼭, MMX ÆÄÀÌÇÁ ¶óÀÎÀ¸·Î µ¿½Ã¿¡ µÎ °³ ÀÌ»óÀÇ ¿¬»êÀ» Çϵµ
·Ï ¸¸µç °ÍÀÔ´Ï´Ù.

ÁÖ·Î »ç¿ëµÇ´Â ºÐ¾ß´Â ¸ÖƼ¹Ìµð¾î ºÎºÐÀε¥, Intel ¿¡¼­ ¼Ò°³ÇÏ´Â ÀÀ¿ë ¿¹Á¦¿¡´Â
´ÙÀ½°ú °°Àº °ÍÀÌ ÀÖ½À´Ï´Ù.

  1. Á¶°ÇºÎ ¼±ÅÃ
     - ¾Æ·¡¿¡ ³ª¿À´Â Å©·Î¸¶Å°¿Í °°Àº ±â´ÉÀÌ´Ù. ´Ü Å©·Î¸¶Å°¿Í °°Àº °ÍÀº ±×·¡
       ÇÈ¿¡ ±¹ÇÑµÈ °ÍÀÌÁö¸¸ Á¶°ÇºÎ ¼±ÅÃÀº °í¼ÓÀÇ ¸¶½ºÅ·(masking)À» °¡´ÉÇÏ°Ô
       ÇØÁØ´Ù.

  2. Å©·Î¸¶Å° (Chroma Key)
     - ÈçÈ÷ ºí·ç ½ºÅ©¸°À̳ª ±×¸° ½ºÅ©¸°À¸·Î ºÒ¸®¾îÁö´Â °ÍÀÌ´Ù.  ¿µÈ­¸¦ ÂïÀ»
       ¶§ Ǫ¸¥»öÀÇ ¹è°æ µÚ¿¡ »ç¶÷ÀÌ ¿òÁ÷ÀÌ´Â °ÍÀ» ÂïÀº µÚ  ½ÇÁ¦ÀÇ ¹è°æ°ú ÇÕ
       ¼ºÇÒ ¶§,  ½ÇÁ¦ ¹è°æ À§¿¡ Ǫ¸¥»öÀ» Á¦¿ÜÇÑ ´Ù¸¥ »öÀÇ Àι° ½ºÅ©¸°À»  µ¡
       ¾º¿ì´Â ¹æ½ÄÀ¸·Î ¸¶Ä¡ ±× »ç¶÷ÀÌ ½ÇÁ¦ ¹è°æ ¾È¿¡¼­ ÇൿÇÏ´Â °Íó·³ º¸ÀÌ
       ´Â ±â¼úÀÌ´Ù.
       °ÔÀÓ¿¡¼­´Â ½ºÇÁ¶óÀÌÆ®(sprite; ¿äÁ¤)¶ó°í ºÒ¸®´Â ±â¹ýÀÌ´Ù.

  3. °í¼Ó Çà·Ä ¿¬»ê
     - MMX ¸í·É¾îÀÇ Æ¯Â¡ÀÎ DSP ÀûÀÎ ¿ä¼Ò¸¦ ±Ø´ëÈ­½ÃŲ ÀÀ¿ë¹ýÀÌ´Ù. Çà·ÄÀÇ ÁÖ
       µÈ ¿¬»êÀº °öÇÑ µÚ ´õÇÏ´Â ¿¬»êÀÌ´Ù.  MMX ´Â ÀÌ·± ¿¬»ê¹ýÀ» Áö¿øÇÏ´Â ¸í
       ·É¾î°¡ ÀÖ´Ù.

  4. 24bit Ä÷¯ Á¦¾î
     - À§ÀÇ °í¼Ó Çà·Ä°ú ¾Æ·¡ÀÇ ¾ËÆÄºí·»µùÀ» °áÇÕÇÑ °ÍÀ̶ó°í »ý°¢ÇÏ¸é µÈ´Ù.
       24bit Æ®·çÄ÷¯¿¡ ´ëÇÑ À̹ÌÁö Á¶ÇÕ°ú ¾ËÆÄºí·»µùÀÌ °¡´ÉÇÏ´Ù.

  5. ¾ËÆÄºí·»µùÀ» ÀÌ¿ëÇÑ À̹ÌÁö ºÐÇØ
     - °í¼Ó Çà·Ä ¿¬»êÀ» ±×·¡ÇÈ ÂÊÀ¸·Î ÀÀ¿ëÇÑ °ÍÀÌ´Ù.  ¾ËÆÄ ºí·»µùÀº ÁÖ·Î ¹Ý
       Åõ¸í°ú ¿À¹ö·¦À¸·Î ´ëÇ¥µÇ´Âµ¥, ÀÌ°Í ¿ª½Ã °¢ RGB º°·Î °öÇÏ°í ´õÇÏ´Â ¿¬
       »êÀÌ ÁÖ¸¦ ÀÌ·ç±â ¶§¹®¿¡ MMX ÀÇ ´É·ÂÀ» ½ÊºÐ ¹ßÈÖÇÒ ¼ö ÀÖ´Â ¿ä¼Ò´Ù.

ÀÌ·¸µí ¸ÖƼ¹Ìµð¾îÀÇ °í¼Ó Ãâ·Â¿¡ ÁÖ·Î ÀÌ¿ëµÇ¸ç MMX °¡ žÀçµÈ ÄÄÇ»Åͳª ÆæƼ¾ö
2 ÀÌ»óÀÇ ÄÄÇ»ÅÍ¿¡¼­´Â ´ç¿¬È÷ »ç¿ëÇÒ ¼ö ÀÖ´Â ±â´ÉµéÀÔ´Ï´Ù.

±×·¸´Ù¸é ÀÌ·± MMX Äڵ带 µ¨ÆÄÀÌ¿¡¼­ »ç¿ëÇÏ·Á¸é ¾î¶»°Ô µÉ±î¿ä ?  ÇÏÁö¸¸ ºÒÇà
ÇÏ°Ôµµ µ¨ÆÄÀÌ´Â MMX ¸í·É¾î ÀÚü¸¦ Áö¿øÇÏÁö ¾Ê½À´Ï´Ù.

±×·¸´Ù¸é ¿ì¸®ÀÇ »ç¸íÀº ¹«¾ùÀϱî¿ä ? ³×.. ±×·¸½À´Ï´Ù.  µ¨ÆÄÀÌ¿¡¼­ MMX Äڵ带
»ç¿ëÇÒ ¼ö ÀÖ°Ô ¸¸µå´Â °ÍÀÔ´Ï´Ù.

µ¨ÆÄÀÌ°¡ Borland Pascal 6.0 À̾úÀ» ¶§ºÎÅÍ Áö¿øÇÏ´Â ¿¹¾à¾î°¡ ÀÖ½À´Ï´Ù.  ¹Ù·Î
'asm' °ú 'assembler' ÀÔ´Ï´Ù.

º¸ÅëÀº begin .. end ¸¦ »ç¿ëÇÏÁö¸¸ °æ¿ì¿¡ µû¶ó¼­´Â asm ... end ¸¦ »ç¿ë ÇÒ ¼ö
°¡ ÀÖ½À´Ï´Ù. ±×¸®°í,

procedure A;
begin
end;

´ë½Å¿¡

procedure A; Assembler;
asm
end;

¸¦ »ç¿ëÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ( µ¨ÆÄÀÌ¿¡¼­´Â Assembler ¿¹¾à¾î¸¦ ¾²Áö ¾Ê¾Æµµ µÇ´Â
°¡ º¾´Ï´Ù. )

¶ÇÇÑ,

procedure A;
begin
   .......
   asm
      .......
   end;
   .......
end;

ó·³µµ »ç¿ëÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

begin ... end ¿Í asm ... end ÀÇ Â÷ÀÌÁ¡À̶ó¸é,  ´Ù ¾Æ½Ã°ÚÁö¸¸ ±× ¾È¿¡ ÆĽºÄ®
Äڵ尡 µé¾î°¡´ÂÁö ¾î¼Àºí·¯ Äڵ尡 µé¾î°¡´ÂÁöÀÇ Â÷ÀÌÀÔ´Ï´Ù.

MMX ÄÚµå´Â  ÀÏ´Ü ¸ðµÎ ¾î¼Àºí¸®¾î ¸í·ÉÀÔ´Ï´Ù.  ±×·¯´Ï ÄÄÆÄÀÏ·¯ ÀÚü°¡ ±¸ÇöÇØ
ÁÖ´Â ÄÚµå ÀÌ¿Ü¿¡ ÇÁ·Î±×·¡¸Ó°¡ Á÷Á¢ MMX Äڵ带 ¸¸µé·Á¸é ¾î¼Àºí¸®¾î¸¦ »ç¿ë ÇÒ
¼ö ¹Û¿¡´Â ¾ø´Â °ÍÀÔ´Ï´Ù.  ÇÏÁö¸¸ À§¿¡ ¸»¾¸ µå·ÈµíÀÌ µ¨ÆÄÀÌ´Â MMX ¾î¼Àºí¸®¾î
¸í·É¾î¸¦ Áö¿øÇÏÁö ¾Ê½À´Ï´Ù.  ( µ¨ÆÄÀÌ 5 ´Â Áö¿øÇÏÁö ¾ÊÁö¸¸ C++ ºô´õ 4 ´Â Áö
¿øÇÕ´Ï´Ù... )

¿¹Àü¿¡ Borland Pascal ÀÌ 32bit ·¹Áö½ºÅÍ¿Í 386 ÀÌ»óÀÇ ¸í·É¾î¸¦ Áö¿øÇÏÁö ¾Ê¾Ò
Áö¸¸ ±×¶§µµ ÈǸ¢ÇÏ°Ô ÆÄ¿ö À¯ÀúµéÀº ±× ±æÀ» ã¾Æ³Â´Âµ¥... ±×°ÍÀÌ ¹Ù·Î ±â°è¾î
Äڵ带 ¹Ù·Î ¾²´Â °ÍÀ̾ú½À´Ï´Ù.
( 32bit ·¹Áö½ºÅÍ´Â Ç×»ó 16bit ·¹Áö½ºÅÍÀÇ ¸í·É¾î ¾Õ¿¡ $66 À̳ª $67 À̶ó´Â Á¢
  µÎ¾î ¹ÙÀÌÆ®°¡ Ç×»ó ºÙ¾ú±â ¶§¹®¿¡  ½ÇÁ¦ ÄÚµåÀÇ ¸í·É¾î ¾Õ¿¡ ÀÏÀÏÀÌ Á¢µÎ¾î¸¦
  ºÙ¿´½À´Ï´Ù. )

¾î¼Àºí¸®¾î ¸í·É¾î·Î 32bit ·¹Áö½ºÅ͸¦ Á¢±ÙÇϱâ À§Çؼ­´Â  'mov' ¶ó´Â ¸í·É¾î¸¦
»ç¿ëÇß¾ú½À´Ï´Ù. ¿ª½Ã ¾Æ·¡¿Í °°ÀÌ ÇÏ¸é µ¨ÆÄÀÌ´Â ÈǸ¢ÇÏ°Ô ÄÄÆÄÀÏ ÇØ ³À´Ï´Ù.

   asm
      mov   eax, [esi]
      mov   ecx, eax
   end;

¾Æ±îµµ ¸»¾¸ µå·È´Ù½ÃÇÇ MMX ·¹Áö½ºÅÍ´Â 64bit ÀÔ´Ï´Ù. ±×¸®°í 64bit MMX ·¹Áö½º
ÅÍ¿¡ ´ëÇÑ ´ëÀÔ¿¬»êÀº ¾Æ·¡¿Í °°Àº ¾î¼Àºí¸®¾î·Î °¡´ÉÇÕ´Ï´Ù.

   asm
      movq  mm1, [esi]
      movq  mm2, mm1
   end;

ÇÏÁö¸¸ ºÒÇàÇÏ°Ôµµ µ¨ÆÄÀÌ´Â À§¿Í °°Àº ¸í·É¿¡´Â ¿¡·¯¸¦ ³À´Ï´Ù. ( ±×·¸Áö¸¸ C++
ºô´õ4 ¿¡¼­´Â Á¦´ë·Î ÄÄÆÄÀÏÀÌ µË´Ï´Ù. °°Àº º¼·£µå»ç ÄÄÆÄÀÏ·¯Àε¥.... -_-; )
±×·¸´Ù¸é ÀÌ ¾î¼Àºí¸®¾î¸¦ ±â°è¾î·Î ¹Ù²Ù¸é ¾î¶³±î¿ä ?

   asm
      db $0F,$6F,$0E    // movq  mm1, [esi]
      db $0F,$6F,$D1    // movq  mm2, mm1
   end;

½ÇÁ¦  ¸¸µé¾îÁö´Â ÄÚµå´Â °°Áö¸¸  ÀÏ´Ü ÄÄÆÄÀÏ·¯¿¡¼­ ¿¡·¯¸¦ ¸¸µéÁö ¾Ê±â ¶§¹®¿¡
¿øÇÏ´Â ´ë·Î °á°ú¸¦ ³»°Ô µË´Ï´Ù. Á÷Á¢ ±â°è¾î ¹ÙÀÌÆ® ÄÚµå·Î ¾´ °ÍµéÀ» Ç®ÀÌ ÇÏ
ÀÚ¸é....

      $0F,$6F,$0E
       |   |   +---- mm1, [esi]       
       |   +-------- movq
       +------------ MMX ÄÚµå¶ó´Â Á¢µÎ¾î

      $0F,$6F,$D1
       |   |   +---- mm2, mm1       
       |   +-------- movq
       +------------ MMX ÄÚµå¶ó´Â Á¢µÎ¾î

ÀÌ·± ½ÄÀ¸·Î Ç®¾îÁö±â ¶§¹®¿¡ ¾à°£ÀÇ ¼öÀÛ¾÷À» °ÅÄ¡¸é ´©±¸³ª MMX Äڵ带 µ¨ÆÄÀÌ
¿¡ »ðÀÔÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.
( À§ÀÇ ±â°è¾î´Â Intel »çÀÌÆ®¿¡¼­ ÀڷḦ ±¸ÇÒ ¼ö ÀÖ½À´Ï´Ù. )

±×·±µ¥... Á¦°¡ ÀÌ·¯ÇÑ ±â°è¾î Ç®¾î¾²±â °­Á¸¦ Çϱ⵵ Àü¿¡ ÀÌ·± ¼öÀÛ¾÷À» µµ¿Í
ÁÖ´Â µ¨ÆÄÀÌ ÀͽºÆÛÆ®°¡ ÀÌ¹Ì ³ª¿Í ÀÖ¾ú½À´Ï´Ù. MMXasm À̶ó´Â °ÍÀ¸·Î.. DelphiX
¸¦ ¸¸µç »ç¶÷ÀÇ È¨ÆäÀÌÁö¿¡¼­ ±×°ÍÀ» ±¸ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

    http://www.ingjapan.ne.jp/hori/program.html

±×·¡¼­ ±â°è¾î ÄÚµå Ç®¾î¾²±â º¸´Ù´Â   MMX Äڵ带 Á÷Á¢ ¾²´Â ÂÊÀ¸·Î  ÁßÁ¡À» µÑ
°èȹÀÔ´Ï´Ù. ( ÀϺ»ÀÎÀÌ ÀÌ·± °É ¸¸µå´Ï ºÐÇÑ ´À³¦ÀÔ´Ï´Ù¸¸... )

(*

Âü°í·Î °Å±â¿¡´Â Á¤¸» À¯¿ëÇÑ µ¨ÆÄÀÌ ÀÚ·á°¡ ¸¹½À´Ï´Ù.

1999/10/24 DelphiX
           - Delphi 3, 4, 5éÄ DirectX «³«ó«Ý-«Í«ó«È
            ( µ¨ÆÄÀÌ 3,4,5 ¿ë DirectX ÄÞÆ÷³ÍÆ® )
1999/09/09 DirectX 6 Header
           - Delphi 3, 4éÄ DirectX 6 «Ø«Ã«À-
            ( µ¨ÆÄÀÌ 3,4 ¿ë DirectX 6 Çì´õ )
1997/11/11 WPColorDIalog
           - WordPad «é«¤«¯ªÊ«««é-«À«¤«¢«í«°
            ( ¿öµåÆÐµå °°Àº Ä÷¯ ´ÙÀ̾ó·Î±× )
1998/05/07 MemCheck
           - «á«â«ê«ê-«¯üÞ-«Á«§«Ã««-
            ( ¸Þ¸ð¸® ´©¼ö üĿ )
1999/08/29 MMXasm
           - Delphi 3, 4 ªÇ MMX Ù¤ÖµªÊªÉªòÞŪ¨ªëªèª¦ªËª¹ªë«¢«É«¤«ó
            ( µ¨ÆÄÀÌ 3,4 ¿¡¼­ MMX ¸í·É µîÀ» »ç¿ëÇÏ°Ô ÇØÁÖ´Â ¾ÖµåÀÎ )
1998/08/17 «×«í«Ñ«Æ«£ï³öñ ( ÇÁ·ÎÆÛƼ °è»ê±â )
           - «ª«Ö«¸«§«¯«È«¤«ó«¹«Ú«¯«¿ªÇøúãƪµªìªë Integer úþªÎ«×«í«Ñ«Æ«£ªÇ
             ãÒª¬ÞŪ¨ªëªèª¦ªËª¹ªë«×«í«Ñ«Æ«£«¨«Ç«£«¿
            ( ¿ÀºêÁ§Æ® ÀνºÆåÅÍ¿¡¼­ Ç¥½ÃµÇ´Â integer ÇüÀÇ ÇÁ·ÎÆÛƼ·Î,
              ½ÄÀÌ »ç¿ëµÇµµ·Ï ÇÑ ÇÁ·ÎÆÛƼ ¿¡µðÅÍ )

*)

±×¸®°í MMX ¸í·É¾î ÀÚü¿¡ ´ëÇÑ °ÍÀº ÀÌ¹Ì ÇÏÀÌÅÚ¿¡ °­Á°¡ ÀÖÀ¸¹Ç·Î ( ¼ÒÇÁÆ®¿þ
¾î µ¿È£È¸ °­Á¶õ < go soft 21 > ) Áߺ¹ °­Á´ ÇÇÇÏ°Ú½À´Ï´Ù.


---------------------------------------------------------------------------
                                                 copyright SMgal 1999/11/04

#####################################################


---------------------------------------------------------------------------
      µ¨ÆÄÀÌ¿¡¼­ MMX Äڵ带 (2/4)

   1. µ¨ÆÄÀÌ¿¡¼­ MMX Äڵ带 »ç¿ëÇÏ´Â ¹ý
   2. MMX üŷ°ú MMX ·¹Áö½ºÅ͸¦ ÀÌ¿ëÇÑ 8 bytes Àü¼Û
   3. MMX ÀÀ¿ë (1) - Å©·Î¸¶Å°
   4. MMX ÀÀ¿ë (2) - °í¼Ó Çà·Ä ¿¬»ê
---------------------------------------------------------------------------

¾È³çÇϼ¼¿ä.. ¾È¿µ±âÀÔ´Ï´Ù.

À̹ø Àå¿¡¼­´Â MMX ÀÇ ±âº» ¸í·É¾î ¼³¸íÀ» ½ÃÀÛÀ¸·Î MMX üŷ°ú MMX ·¹Áö½ºÅÍ »ç
¿ëÀ» ´Ù·ç°Ú½À´Ï´Ù.


MMX ¸í·É¾î´Â ¸ðµÎ 57 °³ÀÔ´Ï´Ù. ÇÏÁö¸¸ È®ÀåµÈ °ÍÀ» ´Ù ÇÕÃļ­ 57°³À̸ç,  ½ÇÁ¦
·Î´Â ¸í·É¾î ¼¼Æ® °³³äÀ̹ǷΠ¾Æ·¡ÀÇ ¸í·É¾î°¡ ÀüºÎÀÔ´Ï´Ù.

1. ´ë¼ö ¿¬»ê

   1) µ¡¼À          - padd
   2) »¬¼À          - psub
   3) °ö¼À          - pmul ( pmull / pmulh )
   4) °ö¼À + µ¡¼À   - pmadd
   5) »ê¼ú ½¬ÇÁÆ®   - psra
   6) ºñ±³          - pcmp??

2. º¯È¯

   1) Æ÷È­ Ãà¼Ò     - pack ( packss / packus )
   2) È®Àå          - punpck ( punpckl / punpckh )

3. ³í¸® ¿¬»ê

   1) AND           - pand
   2) AND NOT       - pandn
   3) OR            - por
   4) Exclusive OR  - pxor
   5) ¿ÞÂÊ ½¬ÇÁÆ®   - psll
   6) ¿À¸¥ÂÊ ½¬ÇÁÆ® - psrl

4. µ¥ÀÌÅÍ À̵¿

   1) ·¹Áö½ºÅͳ¢¸®  - mov ( movd / movq )
   2) ¸Þ¸ð¸®·ÎºÎÅÍ  - mov ( movd / movq )
   3) ¸Þ¸ð¸®¿¡      - mov ( movd / movq )

5. ±âŸ

   1) EMMS          - emms

MMX ¸í·É¾î´Â ³ª¸§´ë·Î Á¶¾î±ÔÄ¢ÀÌ ÀÖ½À´Ï´Ù.  À§ÀÇ ¸í·É¾îµéÀ» º¸½Ã¸é ¾Æ½Ã°ÚÁö
¸¸ mov ¿Í emms ¸¦ Á¦¿ÜÇÏ°í´Â ¸ðµÎ p ·Î ½ÃÀÛÇÕ´Ï´Ù.

¾Õ¿¡ ºÙÀº 'p' ´Â Á¢µÎ¾î·Î 'packed' ÀÇ ¾àÀÚÀÔ´Ï´Ù. ±× ´ÙÀ½¿¡´Â ¿ø·¡ÀÇ ¸í·É¾î
¸¦ ÀǹÌÇÏ´Â ´Ü¾î°¡ ¿À°í ¸¶Áö¸·¿¡´Â Á¢¹Ì¾î°¡ ºÙ´Âµ¥ 'us' ( ºÎÈ£¾ø´Â Æ÷È­¸ðµå
) ¿Í 's' ( ºÎÈ£ ÀÖ´Â Æ÷È­¸ðµå ) °¡ ºÙ½À´Ï´Ù.  ±×¸®°í ¸¶Áö¸·¿¡´Â °ü·ÃµÇ´Â µ¥
ÀÌÅÍÇü¿¡ µû¶ó 'b', 'w', 'd', 'q' °¡ ºÙ½À´Ï´Ù.

   < MMX Á¶¾î ±ÔÄ¢ ¿¹ >

    1. paddsb  - Æ÷È­¸ðµåÀÇ ºÎÈ£ÀÖ´Â byte ´ÜÀ§ÀÇ µ¡¼À

       p add s b
       |  |  | +------- byte ´ÜÀ§
       |  |  +--------- signed ( ºÎÈ£ÀÖÀ½ )
       |  +------------ ´õÇϱ⠸í·É
       +--------------- packed

    2. movq    - 8 ¹ÙÀÌÆ® Àü¼Û

       mov q
        |  +----------- 64 bit ´ÜÀ§
        +-------------- Àü¼Û¸í·É

    3. pcmpeqw - word ´ÜÀ§·Î °°ÀºÁö ºñ±³

       p cmp eq w
       |  |  |  +------ word ´ÜÀ§
       |  |  +--------- °°À» Á¶°Ç ( gt °¡ ºÙÀ¸¸é Ŭ ¶§°¡ µÈ´Ù. )
       |  +------------ ºñ±³ ¸í·É
       +--------------- packed

ÀÌ·± ½ÄÀ¸·Î Á¶ÇյǸç,  Á¶ÇÕÀÌ °¡´ÉÇÑ°¡´Â ¸Å´º¾óÀÇ ¸í·É¾î ¸ñ·ÏÀ» º¸½Ã¸é µË´Ï
´Ù. ±×¸®°í ¸í·É¾î ÀÚü¿¡ ´ëÇÑ °­Á´ '¼ÒÇÁÆ®¿þ¾î µ¿È£È¸' ( go soft )ÀÇ °­ÁÂ
¸¦ Âü°í ÇÏ½Ã¸é µË´Ï´Ù.

---------------------------------------------------------------------------

<< MMX üũ¹ý >>

ÀÏ´Ü MMX ¸¦ »ç¿ëÇϱâ À§Çؼ­´Â MMX ¸¦ Áö¿øÇÏ´Â CPU °¡ ÀÖ¾î¾ß ÇÕ´Ï´Ù. ±× ¿©ºÎ
¸¦ ¾Ë±â À§Çؼ­ ¾Æ·¡¿Í °°Àº ¹æ¹ýÀ¸·Î ÇÔ¼ö¸¦ ¸¸µé¾î üũÇÏ½Ã¸é µË´Ï´Ù.

( ¼Ò½ºÀÇ ÁÖ¼®¿¡ ¼³¸íÀ» ÇØ ³õ¾ÒÀ¸´Ï ±×°É Âü°í Çϼ¼¿ä... )

| function  CheckMMX : Boolean;
| var
|    _EDX   : DWORD;
| begin
|    CheckMMX := FALSE;
|    try
|       asm
|          mov   eax, 1     //  eax¿¡ 1À» ³ÖÀ¸¸é CPUID ¿¡¼­ '¹öÀüÁ¤º¸'¸¦ µ¹
|                           //  ·ÁÁØ´Ù.
|          db $0F,$A2       /// CPUID
|                           //  CPU ÀÇ Á¤º¸¸¦ ¾Ë¾Æ¿À´Â ¸í·É
|          mov   _EDX, edx  //  edx°¡ ¸®ÅÏ°ª
|       end;
|    except
|       Exit;               //  ÇÁ·Î¼¼¼­°¡ CPUID ¸í·ÉÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù.
|                           //  Áï CPUID ¸í·É¾î°¡ ³ª¿À±â ÀÌÀüÀÇ CPU ´Ù.
|    end;
|                           //  MMX ¸¦ Áö¿øÇϸé 23¹ø ºñÆ®°¡ set µÈ´Ù
|    if (_EDX and $800000) > 0 then begin
|       try
|          asm
|             db $0F,$77    /// emms
|                           //  MMX ¸í·É¾î¸¦ Çϳª ½á º»´Ù
|          end;
|          CheckMMX := TRUE;
|       except
|          Exit;            //  ÇÁ·Î¼¼¼­°¡ MMX ¸í·ÉÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù.
|       end;
|    end;
| end;

¹æ½ÄÀ» ¼³¸íÇϸé,

   1. 'CPUID' ¸í·ÉÀ» »ç¿ëÇؼ­ CPU ¹öÀü Á¤º¸¸¦ ¾Ë¾Æ ¿Â´Ù.
      ¸¸¾à ½ÇÆÐÇßÀ¸¸é ÀÌ CPU ´Â 'CPUID' ¸í·ÉÀ» Áö¿øÇÏÁö ¾Ê´Â ÀÌÀü CPU ÀÌ´Ù.

   2. 'CPUID' ¸í·É ÈÄ¿¡ edx ·¹Áö½ºÅÍ¿¡ ¸®ÅÏ °ªÀÌ µ¹¾Æ¿Â´Ù. ±×Áß 23¹ø ºñÆ®°¡
      ¼¼Æ®µÇ¸é MMX ¸¦ Áö¿øÇÏ´Â CPU ÀÌ´Ù.

   3. ½ÇÁ¦·Î MMX ¸í·ÉÀÎ 'emms' ¸¦ ³Ö¾î º»´Ù.  ÀÌ ¸í·ÉÀÌ ½ÇÆÐÇÏ¸é  ±× CPU ´Â
      MMX ¸í·É¾î¸¦ Áö¿øÇÏÁö¾Ê´Â °ÍÀÌ´Ù.

< Âü°í >

   1 Àå¿¡¼­ ¸»¾¸ µå·ÈµíÀÌ MMX ´Â FPU ÀÇ ½ºÅà ÇÁ·¹ÀÓÀ» Àý´ë ¹øÁö·Î »ç¿ëÇÑ ·¹
   Áö½ºÅ͸¦ »ç¿ëÇÑ´Ù°í Çß½À´Ï´Ù.  Áï  ±×°ÍÀº FPU ¿Í MMX ´Â µ¿½Ã¿¡ »ç¿ëÇÒ ¼ö
   ¾ø´Ù´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù.

   ±×·¡¼­ MMX ·¹Áö½ºÅ͸¦ »ç¿ëÇÏ°í ³ª¸é Ç×»ó FPU ½ºÅà ÇÁ·¹ÀÓÀ» ºñ¿öÁÖ´Â ¸í·É
   ¾î¸¦ Áà¾ß Çϴµ¥ ±× ¸í·É¾î°¡ 'emms' ( Empty MultiMedia State ) ÀÔ´Ï´Ù.
 ( ¹°·Ð  FPU ÀÇ ½Ç¼ö ¿¬»êÀ» »ç¿ëÇÏ´Â °÷ÀÌ ÀÖ±â Àü¿¡ »ç¿ëÇϱ⸸ ÇÏ¸é µÇ´Âµ¥,
   ¸¸¾à FPU ¸¦ ÀÌ¿ëÇÑ ½Ç¼ö¿¬»êÀ» ÇÏÁö¾Ê°í MMX Äڵ忡 ÀçÁøÀÔÇÑ´Ù¸é »ç¿ëÇÒ ÇÊ
   ¿ä°¡ ¾ø½À´Ï´Ù. 'emms' ¸í·É¾îÀÇ Å¬·°¼ö°¡ ¸¹±â ¶§¹®ÀÔ´Ï´Ù. )

---------------------------------------------------------------------------

<< MMX ·¹Áö½ºÅ͸¦ ÀÌ¿ëÇÑ 8 bytes Àü¼Û >>

µ¨ÆÄÀÌ¿¡´Â Move() ¶ó´Â ¸í·É¾î°¡ Àִµ¥  4 Bytes °í¼Ó Àü¼ÛÀ» ÇØÁÖ´Â ¸í·É¾î·Î
»ó´çÇÑ ÆÛÆ÷¸Õ½º¸¦ °¡Áö°í ÀÖ½À´Ï´Ù.  4 bytes Àü¼ÛÀÎ ÀÌÀ¯´Â 386 À̻󿡼­ Áö¿ø
ÇÏ´Â 32 ºñÆ® ·¹Áö½ºÅ͸¦ »ç¿ëÇϱ⠶§¹®ÀÔ´Ï´Ù.
( movsd ¸í·É¾î·Î ÃÖ´ë 32 bit Àü¼Û±îÁö °¡´É. )

ÇÏÁö¸¸ ¾Õ¿¡µµ ¸»¾¸ µå·ÈµíÀÌ MMX ·¹Áö½ºÅÍ´Â ¸ðµÎ 64 bit ·¹Áö½ºÅÍÀÔ´Ï´Ù. Çѹø
¿¡ 8 bytes ¾¿ µ¥ÀÌÅ͸¦ Àü¼ÛÇÒ ¼ö ÀÖ´Ù´Â ¸»Àε¥..... À̹ø¿¡´Â MMX ·¹Áö½ºÅ͸¦
ÀÌ¿ëÇؼ­ 8 bytes Àü¼Û ÇÔ¼ö¸¦ ¸¸µé¾î º¸°Ú½À´Ï´Ù.

( ¿ª½Ã À̹ø¿¡µµ ¼Ò½ºÀÇ ÁÖ¼®¿¡ ¼³¸íÀ» ÇØ ³õ¾ÒÀ¸´Ï ±×°É Âü°íÇϼ¼¿ä... )

| procedure MMXMove(const Sour; var Dest; Count : integer); Assembler
| asm
|
|       push   esi       //  esi¸¦ ½ºÅÿ¡ ³Ö´Â´Ù
|       push   edi       //  edi¸¦ ½ºÅÿ¡ ³Ö´Â´Ù
|
|       mov    esi, eax  //  SourÀÇ Æ÷ÀÎÅÍ
|       mov    edi, edx  //  DestÀÇ Æ÷ÀÎÅÍ
|                        //  Count´Â óÀ½ºÎÅÍ ecx¿¡ µé¾î°¡ ÀÖ´Ù.
|       shr    ecx, 3    //  Count div 8
|
| @@LOOP:                //  ALIGN 16 ÇÊ¿ä....
|       db $0F,$6F,$06   /// movq   mm0, [esi]
|                        //  esi°¡ °¡¸®Å°´Â ¹øÁö·ÎºÎÅÍ 8¹ÙÀÌÆ® ²¨³½´Ù
|       db $0F,$7F,$07   /// movq   [edi], mm0
|                        //  edi°¡ °¡¸®Å°´Â ¹øÁö¿¡ 8¹ÙÀÌÆ® ¾´´Ù
|       add    esi, 8    //  esi ÁÖ¼Ò 8¹ÙÀÌÆ® Áõ°¡
|       add    edi, 8    //  edi ÁÖ¼Ò 8¹ÙÀÌÆ® Áõ°¡
|       loop   @@LOOP    //  ecx ¸¸Å­ ¹Ýº¹
|
|       pop    edi       //  edi¸¦ ½ºÅÿ¡¼­ ²¨³½´Ù
|       pop    esi       //  esi¸¦ ½ºÅÿ¡¼­ ²¨³½´Ù
|
| end;

±×Àú ÆòÀÌÇÑ Àü¼Û ÇÔ¼ö¶û °°½À´Ï´Ù. ´Ü Count´Â 8 ÀÇ ¹è¼ö°¡ µÇ¾î¾ß Á¦´ë·Î µ¿ÀÛ
ÇÒ °Ì´Ï´Ù. ±× ºÎºÐÀº ÃæºÐÈ÷ °³·®ÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù.
( shr ¿¡¼­ ij¸®°¡ ¹ß»ýÇÒ ¶§¸¶´Ù movsb, movsw, movsd ¸¦ ÇÏ¸é µË´Ï´Ù. )

±×·±µ¥, 8 bytes ¾¿ Àü¼ÛÇϱ⠶§¹®¿¡ 4 bytes ¾¿ Àü¼ÛÇÏ´Â Move ¸í·É¾î º¸´Ù 2¹è
ºü¸¦±î¿ä ?  ¾Æ½±°Ôµµ... ´äÀº '°ÅÀÇ ºñ½ÁÇÏ´Ù' ÀÔ´Ï´Ù.

80386 ÀÌ»óÀÇ CPU ÃÖÀûÈ­°¡ Ç×»ó ±×·¸µí MMX ¿¡¼­µµ 8 bytes Àü¼ÛÀ» ÇÒ ¶§ ±× IP
( Instruction Pointer )°¡ ¸Þ¸ð¸®»óÀÇ Àý´ë¹øÁö°¡ 8ÀÇ ¹è¼ö°¡ µÇ´Â °÷¿¡ À§Ä¡ÇØ
¾ß Çϴµ¥, µ¨ÆÄÀÌÀÇ ÀζóÀÎ ¾î¼Àºí·¯¿¡¼­´Â ±× ±â´ÉÀ» Á¦´ë·Î Áö¿øÇÏÁö ¾Ê±â ¶§
¹®ÀÔ´Ï´Ù.

¿ø·¡´ë·Î¶ó¸é 'movq' ¸í·É ¾Õ¿¡´Ù°¡ 16 ¹ÙÀÌÆ® ´ÜÀ§·Î ÁÖ¼Ò¸¦ Á¤·ÄÇØÁÖ´Â Áö½ÃÀÚ
ÀÎ 'ALIGN 16' À» ½áÁà¾ß ÇÕ´Ï´Ù. ( C++ Builder´Â µÇ´Âµ¥ ¿Ö µ¨ÆÄÀÌ´Â Áö¿øÇÏÁö
¾ÊÀ»±î¿ä.. T_T; )

movq ¸í·É¿¡¼­ ÁÖÀÇÇÒ Á¡ÀÌÀִµ¥, ¾Æ·¡¿Í °°Àº °ÍµéÀº ¸ðµÎ ¿¡·¯¸¦ ³À´Ï´Ù.

   1. movq  mm0, eax

      - ÀÌ °æ¿ì¿¡´Â »çÀÌÁî°¡ ´Ù¸£±â ¶§¹®Àε¥  MMX ·¹Áö½ºÅ͸¦ Á¦¿ÜÇÏ°í´Â  64
        bit ·¹Áö½ºÅÍ°¡ ¾ø±â ¶§¹®¿¡ Ç×»ó 'movq mm0, [esi]' ó·³ °£Á¢ ÁÖ¼Ò ¹æ
        ½ÄÀ¸·Î »çÀÌÁ ¸ÂÃçÁà¾ß ÇÕ´Ï´Ù.

   2. movq  mm0, 1

      - ÀÌ °æ¿ì¿¡´Â »ó¼ö °ªÀ» ¹Ù·Î »ç¿ëÇߴµ¥.. ÀÌ°Í ¿ª½Ã Çã¿ëÇÏÁö ¾Ê½À´Ï´Ù.
        ÀÌ·² ¶§´Â ¾Æ·¡Ã³·³ ÇØ¾ß ÇÕ´Ï´Ù.

        pxor  mm0, mm0
        mov   eax, 1
        movd  mm0, eax

±×¸®°í ¿ª½Ã MMX µµ ÆæƼ¾öÀÇ ÃÖÀûÈ­ ±ÔÄ¢À» µû¸£´Âµ¥...

   movd  mm0, [esi]    // mm0 ·¹Áö½ºÅÍÀÇ ÇÏÀ§ 4 ¹ÙÀÌÆ® ¾²±â
   movq  mm1, mm0      // mm0 ·¹Áö½ºÅÍ Àüü Àбâ

ó·³ ·¹Áö½ºÅÍÀÇ ÀϺκÐÀ» '¾²±â' ÇÑ ÈÄ¿¡ ·¹Áö½ºÅÍ Àüü¸¦ 'ÀаÔ' µÇ¸é stallÀÌ
¹ß»ýÇÏ¿© Á¦ ¼Óµµ¸¦ ³»Áö ¸øÇÕ´Ï´Ù. ÀÌ·² ¶§´Â ÀÌ·¸°Ô ÇØÁÖ¸é µË´Ï´Ù.

   pxor  mm0, mm0      // psubb  mm0, mm0 µµ °°Àº È¿°ú
   movd  mm0, [esi]
   movq  mm1, mm0


---------------------------------------------------------------------------

<< MMX ·¹Áö½ºÅ͸¦ »ç¿ëÇÑ ÆÁµé >

1. mm0 ·¹Áö½ºÅ͸¦ 0·Î ¸¸µé±â

   pxor   mm0, mm0

2. mm0 ÀÇ ¸ðµç bit¸¦ 1 ·Î ¸¸µé±â

   pcmpeq mm0, mm0

3. mm0 ÀÇ 8 °³ÀÇ ¹ÙÀÌÆ®¸¦ 1 ·Î ÃʱâÈ­ Çϱâ

   pxor   mm0, mm0
   pcmpeq mm1, mm1
   psubb  mm0, mm1

4. mm0 ÀÇ °¢ word ´ÜÀ§·Î º¸È£ÀÖ´Â 2^(n-1) À» ±¸Çϱâ

   pcmpeq mm0, mm0
   psrlw  mm0, (16 - n)

5. mm0 ÀÇ °¢ word ´ÜÀ§·Î º¸È£ÀÖ´Â -2^(n-1) À» ±¸Çϱâ

   pcmpeg mm0, mm0
   psrlw  mm0, n

6. mm0 ÀÇ Àý´ë °ªÀ» mm1 ¿¡ ³Ö±â

   movq   mm1, mm0
   psraw  mm0, 15
   pxor   mm0, mm1
   psubs  mm1, mm0

7. ºÎÈ£¾ø´Â °ª mm0 °ú mm1 ÀÇ Àý´ë Â÷¸¦ ±¸Çϱâ

   movq    mm2, mm0
   psubusb mm0, mm1
   psubusb mm1, mm2
   por     mm0, mm1

8. ºÎÈ£ÀÖ´Â °ª mm0 °ú mm1 ÀÇ Àý´ë Â÷¸¦ ±¸Çϱâ

   movq    mm2, mm0
   pcmpgtw mm0, mm1
   movq    mm4, mm2
   pxor    mm2, mm1
   pand    mm2, mm0
   movq    mm3, mm2
   pxor    mm4, mm2
   pxor    mm1, mm3
   psubw   mm1, mm4

9. º¹¼Ò¼öÀÇ °öÀ» ±¸Çϱâ
   ( mm0 : ÇÏÀ§ 4 ¹ÙÀÌÆ®Áß, º¹¼Ò¼öÀÇ ½Ç¼öºÎ°¡ »óÀ§ 2 ¹ÙÀÌÆ®¿¡,  Çã¼öºÎ°¡ ÇÏ
           À§ 2 ¹ÙÀÌÆ®¿¡ µé¾î ÀÖ´Ù.
     mm1 : º¹¼Ò °è¼ö°¡ 2 ¹ÙÀÌÆ®¾¿ [ Re -Im Im Re ] Çü½ÄÀ¸·Î µé¾î°£´Ù.     )

   punpckldq mm0, mm0  // ÇÏÀ§ 4 ¹ÙÀÌÆ®¸¦ »óÀ§ 4 ¹ÙÀÌÆ®·Î È®Àå º¹»çÇÑ´Ù.
   pmaddwd   mm0, mm1  // (m0.r*m1.r - m0.i*m1.i)(m0.r*m1.i - m0.i*m1.r)

   ( °á°ú´Â mm0 ¿¡ »óÀ§ 4 ¹ÙÀÌÆ®°¡ ½Ç¼öºÎ, ÇÏÀ§ 4 ¹ÙÀÌÆ®°¡ Çã¼öºÎ·Î µÈ´Ù. )

 

---------------------------------------------------------------------------
                                                 copyright SMgal 1999/11/04

#####################################################


---------------------------------------------------------------------------
      µ¨ÆÄÀÌ¿¡¼­ MMX Äڵ带 (3/4)

   1. µ¨ÆÄÀÌ¿¡¼­ MMX Äڵ带 »ç¿ëÇÏ´Â ¹ý
   2. MMX üŷ°ú MMX ·¹Áö½ºÅ͸¦ ÀÌ¿ëÇÑ 8 bytes Àü¼Û
   3. MMX ÀÀ¿ë (1) - Å©·Î¸¶Å°
   4. MMX ÀÀ¿ë (2) - °í¼Ó Çà·Ä ¿¬»ê
---------------------------------------------------------------------------

¾È³çÇϼ¼¿ä.. ¾È¿µ±âÀÔ´Ï´Ù.

À̹ø ÀåºÎÅÍ´Â MMX ÀÀ¿ëÀ¸·Î µé¾î°¡¼­  µ¨ÆÄÀÌ¿¡¼­ Á÷Á¢ ±¸ÇöÀ» Çغ¸´Â Â÷·ÊÀÔ´Ï
´Ù. À̹ø¿¡ ÇÏ°íÀÚ ÇÏ´Â °ÍÀº Å©·Î¸¶Å°Àε¥, 1 Àå¿¡¼­µµ ¸»¾¸ µå·ÈµíÀÌ ¿µÈ­¿¡¼­
ºí·ç ½ºÅ©¸°°ú °°Àº °³³äÀÌ¸ç °ÔÀÓÀ¸·Î Àû¿ëµÇ¸é ½ºÇÁ¶óÀÌÆ®°¡ µÈ´Ù°í Çß½À´Ï´Ù.

¿¹Àü¿¡´Â DX (Direct X) »ó¿¡¼­ ½ºÇÁ¶óÀÌÆ®¸¦ Âï±â À§¾È ¾Ë°í¸®ÁòÀº ÀÌ·¸½À´Ï´Ù.

ÈçÈ÷ DX 256 Ä÷¯ ¸ðµå¿¡¼­ Ç¥¸éÀ» LockÇÏ¿© ±×°÷¿¡ ½ºÇÁ¶óÀÌÆ®¸¦ ¾²°íÀÚ ÇÑ´Ù¸é
¾ÐÃà ½ºÇÁ¶óÀÌÆ®¸¦ ¾²´øÁö ¾Æ´Ï¸é Á÷Á¢ 1 byte ¾¿ Åõ¸í»öÀÎÁö ¾Æ´ÑÁö¸¦ üũÇØ°¡
¸ç Á¡ ´ÜÀ§ ¿¬»êÀ» ÇÏ´Â °ÍÀÌ º¸ÅëÀ̾ú½À´Ï´Ù. ( Åõ¸í»öÀ̶ó´Â °ÍÀº ºí·ç ½ºÅ©¸°
À϶§´Â Ǫ¸¥»ö (0,0,255)ÀÔ´Ï´Ù. )

¿¹Àü °°À¸¸é ½ºÇÁ¶óÀÌÆ®¸¦ Âï±â À§ÇØ ¾Æ·¡¿Í °°ÀÌ Åõ¸í»ö ÆǺ°À» Çß½À´Ï´Ù.

      mov  ecx, Size.X

   LOOP_X:
      cmp  ptr byte [esi], TRANSPARENCY_COLOR
      je   SKIP
      stosb

   SKIP:
      inc  esi
      loop LOOP_X

ÀÌ·± ½ÄÀÌ µÇ¾î¼­ Á¡ÀÇ ¼ö¸¸Å­ 'cmp'¸¦ Çؾ߸¸ Çß¾ú½À´Ï´Ù.

ÇÏÁö¸¸ Áö±Ý ¿ì¸®°¡ ÇÏ°í ÀÖ´Â MMX ÀÇ °æ¿ì¿¡´Â Åõ¸í»öÀÎÁö ÆǺ°Á¶Â÷ ÇÏÁö¾Ê°í¼­
µµ 8 °³ÀÇ ½ºÇÁ¶óÀÌÆ® Çȼ¿À» µ¿½Ã¿¡ Àü¼ÛÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

ÀÏ´Ü ¿¹Àüó·³ Åõ¸í»öÀÎÁö ¾Æ´ÑÁö ÆǺ°ÇÏ´Â ºÎºÐÀÌ ¾ø¾îÁ³À¸¹Ç·Î  'je', 'jz' ¶ó
´Â ¸í·É¾î·Î ÀÎÇÑ ºÐ±âÀÇ ºÎÇϸ¦ ÁÙÀÌ°í  1 byte ¾¿ ÇÏ´ø Àü¼ÛÀ» Çѹø¿¡ 8 bytes
¾¿ °¡´ÉÇÏ°Ô ÇØÁشٴ °Í¿¡ ±× ÀÇÀǸ¦ µÑ ¼ö°¡ ÀÖ½À´Ï´Ù.

Ç®¼Ò½º¿¡ µé¾î°¡±â Àü¿¡ ÇÙ½É ºÎºÐ¸¸ Ãß·Áº¸¸é ´ÙÀ½°ú °°½À´Ï´Ù.

---------------------------------------------------------------------------

 >> ÀüÁ¦...

   esi     : ½ºÇÁ¶óÀÌÆ® µ¥ÀÌÅÍ
   edi     : Lock µÈ Direct Draw Surface ÀÇ ¹Ì¸® °è»êµÈ ÁÖ¼Ò
   pMask   : char pMask[8] ·Î Á¤ÀǵǾî ÀÖÀ¸¸ç 8°³ÀÇ byte °¡ ¸ðµÎ Åõ¸í»ö
             Index ·Î ä¿öÁ® ÀÖ´Ù.

 >> ÄÚµå

   mov   ebx, pMask
   movq  mm4, [ebx]     // mm4 ¿¡ Åõ¸í»ö ¹øÈ£¸¦ ³Ö´Â´Ù

   mov   ecx, Size.X    // Size.X ¿¡´Â X ½ºÇÁ¶óÀÌÆ®ÀÇ x »çÀÌÁî°¡ µé¾î°¨
   shr   ecx, 3         // µ¿½Ã¿¡ 8°³ÀÇ Á¡À» ¿¬»êÇϹǷÎ

LOOP_X:
   movq  mm0, [edi]     // mm0 Àº Destination
   movq  mm1, [esi]     // mm1 Àº Source
   movq  mm2, mm1       // mm2 ¿¡ Source µ¥ÀÌÅ͸¦ º¹»ç
   pcmpeqb mm2, mm4     // mm2 ¿¡ Åõ¸í»ö¿¡ µû¸¥ ¸¶½ºÅ©¸¦ »ý¼º
   movq  mm3, mm2       // mm3 ¿¡ ¸¶½ºÅ©¸¦ Çϳª ´õº¹»ç
   pandn mm2, mm1       // Source ½ºÇÁ¶óÀÌÆ® ºÎºÐ¸¸ º¹»ç
   pand  mm3, mm0       // Destination ÀÇ °»½ÅµÉ ºÎºÐ¸¸ Á¦°Å
   por   mm2, mm3       // Source ¿Í Destination À» °áÇÕ
   movq  [edi], mm2     // Destination ¿¡ °á°ú¸¦ ¾¸

   add   esi, 8         //  Çѹø¿¡ 8 bytes ¸¦ µ¿½Ã¿¡ ó¸®ÇßÀ¸¹Ç·Î
   add   edi, 8

   loop  LOOP_X

 >> ÄÚµåºÐ¼®

   °¡Àå ÄÚ¾î ºÎºÐ¸¸ º¸¸é ´ÙÀ½°ú °°½À´Ï´Ù.

   - movq  mm0, [edi]

     mm0 ·¹Áö½ºÅÍ¿¡ edi °¡ °¡¸®Å°´Â µ¥ÀÌÅÍÁß 8 bytes ¸¦ °¡Á® ¿É´Ï´Ù.

     ¿¹>   mm0   =>   43 2D 1A E4 54 78 20 CA

   - movq  mm1, [esi]

     mm0 ·¹Áö½ºÅÍ¿¡ esi °¡ °¡¸®Å°´Â µ¥ÀÌÅÍÁß 8 bytes ¸¦ °¡Á® ¿É´Ï´Ù.

     ¿¹>   mm2   =>  10 2F F8 80 80 3D 80 CE

   - movq  mm2, mm1

     mm2 ·¹Áö½ºÅÍ¿¡ mm1 ·¹Áö½ºÅÍÀÇ ³»¿ëÀ» Ä«ÇÇÇÕ´Ï´Ù.
     ¼Ò½º µ¥ÀÌÅÍ¿¡¼­ Åõ¸í»ö¿¡ ´ëÇÑ Á¤º¸¸¦ ¾ò±â À§Çؼ­ÀÔ´Ï´Ù.

   - pcmpeqb mm2, mm4

     À§¿¡ º¸½Ã¸é ÀÌ¹Ì mm4¿¡´Â 1byte Â¥¸® ¸¶½ºÅ©·Î 8bytes °¡ ä¿öÁ® ÀÖ½À´Ï´Ù.
     'pcmpeqb' ¸í·ÉÀº byte ´ÜÀ§·Î 8 °³ÀÇ °¢ byte °¡ °°ÀºÁö °°Áö ¾ÊÀºÁö¸¦ ÆÇ
     º°ÇÕ´Ï´Ù. ±×·¡¼­ ¸¸¾à °ªÀÌ °°´Ù¸é ±× byte´Â ¸ðµÎ 1·Î ä¿ì°í ±×·¸Áö¾Ê´Ù
     ¸é ¸ðµÎ 0À¸·Î ä¿ó´Ï´Ù/

     ¿¹>     mm2   =>   10 2F F8 80 80 3D 80 CE
             mm4   =>   80 80 80 80 80 80 80 80   ( Åõ¸í»öÀÌ 0x80 À϶§ )

      °á°ú   mm2   =>   00 00 00 FF FF 00 FF 00

   - movq  mm3, mm2

     ÀÌ·¸°Ô ¸¸µé¾îÁø ¸¶½ºÅ©¸¦ mm3 ¿¡ Çϳª ´õ º¹»çÇÕ´Ï´Ù.

   - pandn mm2, mm1       // Source ½ºÇÁ¶óÀÌÆ® ºÎºÐ¸¸ º¹»ç

     'pandn' ¸í·É¾î´Â mm2 ¸¦ ¹ÝÀüÇÑÈÄ ±× mm2 ¿Í mm1 ¸¦ and Çؼ­ mm2 ·Î
     ³Ö½À´Ï´Ù.

     ¿¹>     mm2    =>   00 00 00 FF FF 00 FF 00
             mm2    =>   FF FF FF 00 00 FF 00 FF  ( ¹ÝÀü )
             mm1    =>   10 2F F8 80 80 3D80 CE

      °á°ú   mm2    =>   10 2F F8 00 00 3D 00 CE  ( mm2 & mm1 )

     °á°ú¿¡¼­ º¸½Ã¸é ¾Æ½Ã°ÚÁö¸¸ ¿ø ½ºÇÁ¶óÀÌÆ® µ¥ÀÌÅÍ¿¡¼­ Åõ¸í»ö ºÎºÐ¸¸ '00'
     ÀÌ µÇ¾ú´Ù´Â °ÍÀ» ¾Ë °ÍÀÔ´Ï´Ù.

   - pand  mm3, mm0

     'pand' ¸í·É¾î´Â mm3 ¿Í mm0 ¸¦ and ¿¬»êÇÏ¿© mm3 ¿¡ ³Ö½À´Ï´Ù.

     ¿¹>     mm3    =>   00 00 00 FF FF 00 FF 00
             mm0    =>   43 2D 1A E4 54 78 20 CA

      °á°ú   mm3    =>   00 00 00 E4 54 00 20 00

   - por   mm2, mm3

     'por' ¸í·É¾î´Â mm2 ¿Í mm3 ¸¦ or ¿¬»êÇÏ¿© mm2 ¿¡ ³Ö½À´Ï´Ù.

     ¿¹>     mm3    =>   00 00 00 E4 54 00 20 00
             mm2    =>   10 2F F8 00 00 3D 00 CE

      °á°ú   mm2    =>   10 2F F8 E4 54 3D 20 CE

   - movq  [edi], mm2

     edi °¡ °¡¸®Å°´Â ÁÖ¼Ò¿¡ mm2 ÀÇ ³»¿ë 8 bytes ¸¦ ¾´´Ù.


   ÀÌ·¸°Ô Çؼ­ °á±¹Àº ¾Æ·¡ÀÇ °á°ú¸¦ ³À´Ï´Ù.

             [edi]   =>   43 2D 1A E4 54 78 20 CA ( ¹è°æ )
             [esi]   =>   10 2F F8 80 80 3D 80 CE ( ½ºÇÁ¶óÀÌÆ®, Åõ¸í»ö 80 )

             [edi]   =>   10 2F F8 E4 54 3D 20 CE
                                   ~~ ~~    ~~    ( Åõ¸í»öÀ̾ú´ø ºÎºÐ¸¸
                                                    ¹è°æÀ¸·Î ġȯ         )

---------------------------------------------------------------------------

Á¦ ³ª¸§´ë·Î´Â ¿­½ÉÈ÷ ¼³¸íÀ» µå¸°´Ù°í Çϱä Çߴµ¥  Á¦´ë·Î ÀÌÇØ°¡ µÇ¼Ì´ÂÁö ¸ð
¸£°Ú³×¿ä...

±×¸®°í Á¦°¡ 8 bit Ä÷¯ ¸ðµå¿¡ ´ëÇؼ­¸¸ ¼³¸íÇߴµ¥, 16bit ¸ðµå³ª Æ®·çÄ÷¯ ¸ð
µå¿¡¼­µµ ¶È°°ÀÌ Àû¿ëµË´Ï´Ù. ´Ü 'pcmpeqb' ¶ó´Â ¸í·É¾î°¡ 2bytes, 4bytes ¾¿ ºñ
±³ÇÏ´Â 'pcmpeqw', 'pcmpeqd' ·Î ¼öÁ¤ÇÏ½Ã¸é µË´Ï´Ù.

±×¸®°í ¾Æ·¡´Â ¹æ±Ý Çغ» ÄÚµåÀÇ µ¨ÆÄÀÌ ¼Ò½ºÀÔ´Ï´Ù.
( ¸ðµç Ç® ¼Ò½º¿Í ½ÇÇà ÆÄÀÏÀº °ÔÀÓ Á¦ÀÛ µ¿È£È¸ ÀÚ·á½Ç¿¡¼­ ( go gma 5 )
  =========================================================================
  5366 k2gma3   mmx_spr.zip   192K  156 SOUR  MMX ¹«ºÐ±â SPRITE Ãâ·Â ¼Ò½º&
  =========================================================================
  À§ÀÇ ÀڷḦ ¹ÞÀ¸½Ã¸é µË´Ï´Ù.

---------------------------------------------------------------------------
( ¿©±â´Â °¢°¢ ¼­Çǽº¿¡¼­ Á÷Á¢ ÀоúÁö¸¸  ½ÇÁ¦·Ð ½ºÇÁ¶óÀÌÆ®°¡ À¯Àú µ¥ÀÌÅÍÇüÀ¸
  ·Î µé¾î°¡°Ô µÇ°ÚÁÒ... ( ÀÌ°Ç Å×½ºÆ®¶ó¼­ Direct Draw Surface »ç¿ëÇßÀ½.. ))

procedure   SpriteCopy(DestX, DestY : integer;
                       SourX, SourY : integer;
                       Size         : TPoint;
                       Sour, Dest   : IDirectDrawSurface);
const
   TRANSPARENCY_VALUE  = 80; // Åõ¸í»öÀÌ 80¹ø À妽ºÀÌ´Ù.
var
   SourDesc, DestDesc  : TDDSurfaceDesc;
   pSour, pDest, pMask : PByte;
   Transparency        : array[1..8] of byte;
begin

   FillChar(Transparency,8,TRANSPARENCY_VALUE);

   SourDesc.dwSize := SizeOf(TDDSurfaceDesc);
   with Basic do repeat
   until MakeItSo(Sour.Lock(PRect(nil)^,SourDesc,DDLOCK_SURFACEMEMORYPTR +
                                                 DDLOCK_WAIT,0));

   DestDesc.dwSize := SizeOf(TDDSurfaceDesc);
   with Basic do repeat
   until MakeItSo(Dest.Lock(PRect(nil)^,DestDesc,DDLOCK_SURFACEMEMORYPTR +
             DDLOCK_WAIT,0));

   pSour := PByte(DWORD(SourDesc.lpSurface)+SourY*SourDesc.lPitch+SourX);
   pDest := PByte(DWORD(DestDesc.lpSurface)+DestY*DestDesc.lPitch+DestX);
   pMask := Pointer(@Transparency);

   asm
         push  esi
         push  edi

         mov   esi, pMask
         db $0F,$6F,$26       /// movq  mm4, [esi]
                              //  mm4 ¿¡ Åõ¸í»ö ¹øÈ£¸¦ ³Ö´Â´Ù
         mov   esi, pSour
         mov   edi, pDest

         mov   ecx, Size.Y

   @@LOOP_Y:

         push  ecx

         mov   ecx, Size.X
         shr   ecx, 3         // µ¿½Ã¿¡ 8°³ÀÇ Á¡À» ¿¬»êÇϹǷÎ


   @@LOOP_X:

         db $0F,$6F,$07       /// movq  mm0, [edi]
                              //  mm0 Àº Destination
         db $0F,$6F,$0E       /// movq  mm1, [esi]
                              //  mm1 Àº Source
         db $0F,$6F,$D1       /// movq  mm2, mm1
                              //  mm2 ¿¡ Source µ¥ÀÌÅ͸¦ º¹»ç
         db $0F,$74,$D4       /// pcmpeqb mm2, mm4
                              //  mm2 ¿¡ Åõ¸í»ö¿¡ µû¸¥ ¸¶½ºÅ©¸¦ »ý¼º
         db $0F,$6F,$DA       /// movq  mm3, mm2
                              //  mm3 ¿¡ ¸¶½ºÅ©¸¦ Çϳª ´õ º¹»ç
         db $0F,$DF,$D1       /// pandn mm2, mm1
                              //  Source ½ºÇÁ¶óÀÌÆ® ºÎºÐ¸¸À» ³²±è
         db $0F,$DB,$D8       /// pand  mm3, mm0
                              //  Destination ÀÇ °»½ÅµÉ ºÎºÐ¸¸ Á¦°Å
         db $0F,$EB,$D3       /// por   mm2, mm3
                              //  Source ¿Í Destination À» °áÇÕ
         db $0F,$7F,$17       /// movq  [edi], mm2
                              //  Destination ¿¡ °á°ú¸¦ ¾¸

         add   esi, 8
                              //  Çѹø¿¡ 8 bytes ¸¦ µ¿½Ã¿¡ ó¸®ÇßÀ¸¹Ç·Î
         add   edi, 8

         loop  @@LOOP_X

         add   esi, SourDesc.lPitch
         sub   esi, Size.X
         add   edi, DestDesc.lPitch
         sub   edi, Size.X

         pop   ecx
         loop  @@LOOP_Y

         db $0F,$77              /// emms

         pop   edi
         pop   esi

   end;

   Sour.UnLock(SourDesc.lpSurface);
   Dest.UnLock(DestDesc.lpSurface);

end;

---------------------------------------------------------------------------
                                                 copyright SMgal 1999/11/04

#####################################################


---------------------------------------------------------------------------
      µ¨ÆÄÀÌ¿¡¼­ MMX Äڵ带 (4/4)

   1. µ¨ÆÄÀÌ¿¡¼­ MMX Äڵ带 »ç¿ëÇÏ´Â ¹ý
   2. MMX üŷ°ú MMX ·¹Áö½ºÅ͸¦ ÀÌ¿ëÇÑ 8 bytes Àü¼Û
   3. MMX ÀÀ¿ë (1) - Å©·Î¸¶Å°
   4. MMX ÀÀ¿ë (2) - °í¼Ó Çà·Ä ¿¬»ê
---------------------------------------------------------------------------

¾È³çÇϼ¼¿ä.. ¾È¿µ±âÀÔ´Ï´Ù.

À̹ø¿¡´Â MMX ÀÇ ¶Ç´Ù¸¥ ÀÀ¿ëÀÎ 3D ¿¡ »ç¿ëµÇ´Â °í¼Ó Çà·Ä ¿¬»êÀ» ¼³¸íÇÏ°íÀÚ ÇÕ
´Ï´Ù.

ÈçÈ÷ 3D °ÔÀÓÀ» ¸¸µé ¶§ °¡Àå ±âº»ÀÌ µÇ´Â ¿¬»êÀÌ¸ç  È®´ë, Ãà¼Ò, À̵¿, °¢µµ º¯
È­ µîµî¿¡ °ÉÃÄ ´Ù¿ëµµ·Î ¾²ÀÌ´Â ºÎºÐÀÔ´Ï´Ù.

MMX°¡ ź»ýÇÑ ¹è°æÀÌ ºü¸¥ Multimedia Áö¿øÀÌ´Ï ¸¸Å­ ÀÌ·± ÂÊ¿¡¼­µµ Áö¿øÀÌ µÇ´Â
µ¥¿ä... ÀÌ¿¡, Á¦°¡ ¼Ò°³ ÇÏ°íÀÚ ÇÏ´Â ÀÀ¿ëÀÌ ¹Ù·Î MMX Äڵ带 ÀÌ¿ëÇÏ¿© ±× Çà·Ä
°è»êÀ» ºü¸£°Ô Çغ¸ÀÚ´Â ÀǵµÀÔ´Ï´Ù.

Ç®¼Ò½º¿¡ µé¾î°¡±â Àü¿¡ ÇÙ½É ºÎºÐ¸¸ Ãß·Áº¸¸é ´ÙÀ½°ú °°½À´Ï´Ù.

-------------------------------------------------------------------------

 >> MMX ÀÌ·Ð

±¸Ã¼ÀûÀÎ ¹æ½ÄÀ̶ó°í ¸»ÇÑ´Ù¸é MMX ¸í·É¾îÀÎ 'pmaddwd'¶ó´Â ¸í·É¾î¿¡ ÀÖ½À´Ï´Ù.
ÀÌ ¸í·É¾î´Â ¿©Å¸ÀÇ DSP Ĩ¿¡¼­¿Í °°ÀÌ °öÇÏ°í µ¿½Ã¿¡ ´õÇÏ´Â ¿¬»êÀ» ÇÕ´Ï´Ù.
                                     ~~~~~~~~~~~~~~~~~~~~~~~~~
±×¸®°í Çѹø¿¡ ÇϳªÀÇ °ö¼ÀÀÌ ¾Æ´Ñ  µ¿½Ã¿¡ word Çü µ¥ÀÌÅÍ 4°³¸¦ °öÇÏ°í ´õÇÕ´Ï
´Ù.

±×·¸´Ù¸é °¨ÀÌ ¿À½Ã°ÚÁÒ ?

3D °ÔÀÓ¿¡¼­ »ç¿ëÇÏ´Â Çà·ÄÀº 4-3 ¸¦ ÁÖ·Î »ç¿ëÇÏ°í 4-3 ³¢¸® °öÇÏ´Â ¿¬»êÀ» ÇÏ
±â À§Çؼ­ 4 - 4 Çà·Ä·Î È®ÀåÀ» Çؼ­ »ç¿ëÇÏ°Ô µË´Ï´Ù.  ¹°·Ð ¸¶Áö¸· °ªÀº Ç×»ó
( 0, 0, 0, 1 )·Î µÓ´Ï´Ù.

( 4-3 °ú 4-3 ³¢¸®´Â Àý´ë °öÇØÁú¼ö ¾øÁÒ. °í±³ Á¤¼® ¼öÇРåÀ» Âü°í ÇϽñæ..)

±×¸®°í Á¦°¡ À̹ø¿¡ ½ÇÇèÇÏ°íÀÚ ÇÏ´Â Çà·Ä½ÄÀ» º»´Ù¸é...

  | x' |     |  a1  a2  a3  a0  | | x |
  | y' |  =  |  b1  b2  b3  b0  | | y |
  | z' |     |  c1  c2  c3  c0  | | z |
  | w' |     |  p1  p2  p3  p0  | | 1 |

ÀÌ·¸½À´Ï´Ù.. ¶ÇÇÑ,

        x' = a1 * x +  a2 * y + a3 * z + a0

·Î °è»êÀÌ µË´Ï´Ù.

»õ·Î¿î x ÁÂÇ¥ÀÎ x' ¸¦ °è»êÇϱâ À§Çؼ­´Â ÃÑ 8°³ÀÇ ÀÎÀÚ¸¦ ¦À» ¸ÂÃç °öÇÏ°í ±×
4°³ÀÇ °ªÀ» ´õÇÏ´Â Çü½ÄÀÔ´Ï´Ù.

Áï ÀÌ ¹æ½ÄÀÌ ¹Ù·Î pmaddwd ¸í·É¾î¿Í µ¿ÀÏÇÏÁÒ ?

±×·³ pmaddwd ÀÇ ±¸Ã¼ÀûÀÎ µ¿ÀÛÀ» ¾ê±âÇØ º¸°Ú½À´Ï´Ù.

              1    2    3    4    5    6    7    8    <- °¢ byteº°

    mm0 =    (  w1  )  (  w2  )  (  w3  )  (  w4  )

    mm1 =    (  w1' )  (  w2' )  (  w3' )  (  w4' )

°¡ µé¾î ÀÖÀ» ¶§ ...

    pmaddwd mm0, mm1

À̶õ ¸í·ÉÀ» ½ÇÇàÇϸé..

              1    2    3    4    5    6    7    8    <- °¢ byteº°

    mm0 =    ( w1*w1' + w2*w2')  ( w3*w3' + w4*w4')

ÀÌ·¸°Ô word°¡ DWORD·Î È®ÀåÀÌ µÇ¸é¼­ ´õÇØÁý´Ï´Ù.(mm0 ·¹Áö½ºÅÍ´Â 8bytesÂ¥¸®)

±×¸®°í »óÀ§ 4bytes ¿Í ÇÏÀ§ 4bytes ¸¦ ´õÇÏ¸é µÇ´Âµ¥..

    movq   mm1, mm0
    psrlq  mm1, 32
    paddd  mm0, mm1
    movd   eax, mm0

ÀÌ·¸°Ô Çϸé ÃÖÁ¾ °á°úÀÎ w1*w1' + w2*w2' + w3*w3' + w4*w4' °¡ eax¿¡ µé¾î°¡°Ô
µË´Ï´Ù.

À§¿¡ ÀÖ´Â MMX ·¹Áö½ºÅͳ¢¸®ÀÇ ´ëÀÔÀ̳ª ½¬ÇÁÆ®´Â  ¸ðµÎ 1 Ŭ·°¸¸ ¼ÒºñÇϹǷΠºü
¸¥ ¼Óµµ·Î Çà·Ä °è»êÀ» ÇØ ³¾ ¼ö°¡ ÀÖ´Â °ÍÀÔ´Ï´Ù.

---------------------------------------------------------------------------

 >> ±¸Ã¼ÀûÀÎ ÄÚµå·Î ¼³¸í

À§ÀÇ ÇÔ¼ö´Â C = A * B ¶ó´Â Çà·ÄÀ» °è»êÇϱâ À§ÇØ  ÀÓÀÇ·Î ¸¸µé¾îÁø ¿¹Á¦½ÄÀ̸ç
( A = 4*4,  B = 4*1,  C = 4*1 )

   A : array[1..4,1..4] of word =
       ((1,2,3,4),(5,6,7,8),(9,10,11,12),(13,14,15,16));
   B : array[1..4] of word =
       (11,22,33,44);
   C : array[1..4] of word;  

   MMX_Matrix(A,B,C);

À§¿Í °°Àº ¹æ½ÄÀ¸·Î »ç¿ëÇϽøé C ¿¡ °á°ú°¡ µ¹¾Æ¿À´Â ¹æ½ÄÀÔ´Ï´Ù.

¿ø·¡ ¿ì¸®µéÀº ÀåȲÇÑ À̷к¸´Ù´Â ¼Ò½ºÄÚµåÀÇ ÁÖ¼®¿¡ ´õ »¡¸® ¸Ó¸®°¡ ¹ÝÀÀÇϹǷÎ
¹Ù·Î ¼Ò½º¿¡ ÁÖ¼®À» ´Ù´Â ½ÄÀ¸·Î ¼³¸íÇÏ°Ú½À´Ï´Ù.

| procedure MMX_Matrix(var A, B, C); assembler;
| asm
|    mov     esi, eax         //  A ÀÇ Æ÷ÀÎÅÍ ÁÖ¼Ò¸¦ esi¿¡
|
|    mov     ebx, edx         //  B ÀÇ Æ÷ÀÎÅÍ ÁÖ¼Ò¸¦ ebx¿¡
|    db $0F,$6F,$13           /// movq    mm2, [ebx]
|                             //  mm2 ¿¡ B[]ÀÇ wordÇü Àμö 4°³¸¦ ÀúÀå
|
|    mov     edi, ecx         //  C ÀÇ Æ÷ÀÎÅ͸¦ edi¿¡
|
|    db $0F,$EF,$E4           /// pxor    mm4, mm4
|                             //  mm4 ·¹Áö½ºÅÍ ÃʱâÈ­
|    mov     eax, 0000FFFFh
|    db $0F,$6E,$E0           /// movd    mm4, eax
|                             //  mm4 <- 0000 0000 0000 FFFF
|
|    // 1 Çà
|    db $0F,$6F,$06           /// movq    mm0, [esi]
|                             //  A[0]ÀÇ 4°³ÀÇ wordÇü Àμö¸¦ ÀúÀå
|    db $0F,$6F,$CA           /// movq    mm1, mm2
|                             //  mm1 À» B ÀÇ °ªÀ¸·Î
|
|    db $0F,$F5,$C1           /// pmaddwd mm0, mm1
|                             //  ¹®Á¦ÀÇ ¿¬»ê, ¼³¸íÀº À§¿¡¼­ Çß´Ù..
|    db $0F,$6F,$C8           /// movq    mm1, mm0
|                             //  ÇöÀç °öÇÏ°í ´õÇÑ °á°ú°¡ 4bytes¾¿ ºÐ¸®µÇ¾î
|    db $0F,$73,$D1,$20       /// psrlq   mm1, 32
|                             //  ÀÖÀ¸¹Ç·Î »óÀ§¿Í ÇÏÀ§ 4bytes ¸¦ ´õÇؼ­
|    db $0F,$FE,$C1           /// paddd   mm0, mm1
|                             //  mm0 ·¹Áö½ºÅÍ¿¡ ÀúÀå
|    db $0F,$DB,$C4           /// pand    mm0, mm4
|                             //  mm3 ´Â ÇÏÀ§ 2bytes ¸¸ ³²°ÔÇÔ
|    db $0F,$6F,$D8           /// movq    mm3, mm0
|                             //  mm3 ÀÇ C[0] À§Ä¡¿¡ ÀúÀå
|
|    // 2 Çà
|    db $0F,$6F,$46,$08       /// movq    mm0, [esi+8]
|                             //  A[2]ÀÇ 4°³ÀÇ wordÇü Àμö¸¦ ÀúÀå
|    db $0F,$6F,$CA           /// movq    mm1, mm2
|
|    db $0F,$F5,$C1           /// pmaddwd mm0, mm1
|    db $0F,$6F,$C8           /// movq    mm1, mm0
|    db $0F,$73,$D1,$20       /// psrlq   mm1, 32
|    db $0F,$FE,$C1           /// paddd   mm0, mm1
|    db $0F,$DB,$C4           /// pand    mm0, mm4
|    db $0F,$73,$F0,$10       /// psllq   mm0, 16
|    db $0F,$EB,$D8           /// por     mm3, mm0
|                             //  mm3 ÀÇ C[1] À§Ä¡¿¡ ÀúÀå
|
|    // 3 Çà
|    db $0F,$6F,$46,$10       /// movq    mm0, [esi+16]
|    db $0F,$6F,$CA           /// movq    mm1, mm2
|
|    db $0F,$F5,$C1           /// pmaddwd mm0, mm1
|    db $0F,$6F,$C8           /// movq    mm1, mm0
|    db $0F,$73,$D1,$20       /// psrlq   mm1, 32
|    db $0F,$FE,$C1           /// paddd   mm0, mm1
|    db $0F,$DB,$C4           /// pand    mm0, mm4
|    db $0F,$73,$F0,$20       /// psllq   mm0, 32
|    db $0F,$EB,$D8           /// por     mm3, mm0
|                             //  mm3 ÀÇ C[2] À§Ä¡¿¡ ÀúÀå
|
|    // 4 Çà
|    db $0F,$6F,$46,$18       /// movq    mm0, [esi+24]
|    db $0F,$6F,$CA           /// movq    mm1, mm2
|
|    db $0F,$F5,$C1           /// pmaddwd mm0, mm1
|    db $0F,$6F,$C8           /// movq    mm1, mm0
|    db $0F,$73,$D1,$20       /// psrlq   mm1, 32
|    db $0F,$FE,$C1           /// paddd   mm0, mm1
|    db $0F,$DB,$C4           /// pand    mm0, mm4
|    db $0F,$73,$F0,$30       /// psllq   mm0, 48
|    db $0F,$EB,$D8           /// por     mm3, mm0
|                             //  mm3 ÀÇ C[3] À§Ä¡¿¡ ÀúÀå
|
|    db $0F,$7F,$1F           /// movq    [edi], mm3
|                             //  mm3 ÀÇ ³»¿ëÀ» C[] ¿¡ º¹»ç
|
|    db $0F,$77               /// emms
|                             //  FPU »óÅ ºñ¿ò
| end;

pmaddwd ¸í·ÉÀÇ ¿ëµµ¸¸ ¾Ë¸é ½±°Ô ÀÌÇØ°¡ µÉ¸¸ÇÑ ³»¿ëÀÌ¶ó  µû·Î ¼³¸íÀº ÇÏÁö ¾Ê
°Ú°í 4°³ÀÇ ÇàÀ» °¢°¢ Ç®¾î¾´ °ÍÀº ±×³ª¸¶ ¼Óµµ°¡ Á¶±ÝÀ̳ª¸¶ »¡¶óÁöÁö ¾Ê°Ú³ª¶ó
´Â »ý°¢¿¡ ÇÑ °ÍÀÔ´Ï´Ù.

---------------------------------------------------------------------------

 >> ÆÛÆ÷¸Õ½º

ÀÏ´Ü °¡Àå Áß¿äÇÑ °Ô ¾ó¸¶³ª ºü¸£³Ä ? ¶ó´Â °ÍÀÔ´Ï´Ù.
ºü¸£Áö ¾Ê´Ù¸é ±¸Å¿© ÀÌ·± °ÍÀ» »ç¿ëÇÒ ÇÊ¿äµµ ¾ø°í »ç¿ëÇؼ­µµ ¾ÈµÉ °ÍÀÔ´Ï´Ù.

Á÷Á¢ µ¨ÆÄÀÌ ÄÚµå·Î¸¸ ¶È°°Àº ±â´ÉÀ» ÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé¾î µ¹·Á º» °á°ú´Â ´ÙÀ½°ú
°°½À´Ï´Ù.

===========================================================================
ÀÏ¹Ý Çà·Ä °è»ê½ÄÀ¸·Î °è»ê    :  1000000 ¹ø È£ÃâÇϴµ¥  Æò±Õ 0.483 ÃÊ
                                                       ~~~~~~~~~~~~~
MMX Çà·Ä °è»ê½ÄÀ¸·Î °è»ê     :  1000000 ¹ø È£ÃâÇϴµ¥  Æò±Õ 0.222 ÃÊ
                                                       ~~~~~~~~~~~~~
( ÆæƼ¾ö 2 266MHz ¿¡¼­ Å×½ºÆ®.. )
===========================================================================

ÀÌ·¸°Ô ¾à 2 ¹è ÀÌ»óÀÇ ¼º´É Çâ»óÀ» º¸ÀÌ´Â °ÍÀ¸·Î °á°ú°¡ ³ª¿Ô½À´Ï´Ù.

ÀÌÁ¦´Â À§¿Í °°Àº ´Ü¼ø Çà·Ä °è»ê½ÄÀ»  Àڽſ¡°Ô ¸Â´Â 3D ¿ë Çà·Ä °è»ê¿¡ Àû¿ë½Ã
Å°´Â ÀÏÀÌ ³²¾Ò½À´Ï´Ù.

±×¸®°í Æ®·çÄ÷¯¿¡¼­ MMX ¾ËÆÄºí·£µù ¹æ¹ýµµ À§¿Í ´ëµ¿¼ÒÀÌÇÑ °ÍÀÌ°í Æ®·çÄ÷¯ÀÇ
RGB °ª ºÐÇصµ °ÅÀÇ °°Àº ¸Æ¶ôÀ¸·Î º¸½Ã¸é µË´Ï´Ù.

---------------------------------------------------------------------------

<< ¿¡ÇÊ·Î±× >>

ÀÌ °­Á´ ¿¹Àü¿¡ °ÔÀÓ Á¦ÀÛ µ¿È£È¸¿¡¼­ Çß´ø C++ºô´õ¿ë °­Á¸¦ µ¨ÆÄÀÌ·Î ÄÁ¹öÀü
ÇÑ °ÍÀÔ´Ï´Ù. MMX ¿¡ ´ëÇؼ­ ´õ ÀÚ¼¼ÇÏ°Ô ¾²°í ½ÍÁö¸¸ Intel »çÀÌÆ®¿¡ ÀÖ´Â µµÅ¥
¸àÆ®°¡ ¿ö³« ÀߵǾî À־ Á¦°¡ ¼³¸íÇØ¾ß ÇÒ ºÎºÐÀÌ Àû¾î Áø °Í °°½À´Ï´Ù.

±×¸®°í ÀÌ °­Á ÀÌ¿Ü¿¡µµ Á¦°¡ÇÑ ¸ðµç °­Áµé°ú ±× ¼Ò½ºµé.. ±×¸®°í Á¦°¡ ¸¸µé¾ú
´ø °ÔÀÓ ¼Ò½ºµéÀº ¸ðµÎ Á¦ ȨÆäÀÌÁö¿¡ ÀÖ½À´Ï´Ù.

  < http://smgal.com/ >

±×·³ ¸¶Áö¸·À¸·Î ÇѸ¶µð ÇÏ°Ú½À´Ï´Ù.

             " A Mountain is a mountain, Water is water "


                                                 copyright SMgal 1999/11/04