---- == PentiumÀÇ MMXÀÇ »ç¿ë == [[TableOfContents]] * ÀÛ¼ºÀÚ : Á¶ÀçÇõ([minzkn], [mailto:minzkn_at_infoeq.comminzkn_at_infoeq.com]) === MMX¶õ? === * MMX´Â '''M'''ulti'''M'''edia e'''X'''tensionÀÇ ¾àÀÚ·Î ±× ¸ñÀûÀº ¹ü¿ë·¹Áö½ºÅÍÀÇ Å©±âº¸´Ù Å« Á¤¼ö¿¬»êÀ» º¸´Ù ºü¸£°Ô Çϱâ À§ÇÔÀÔ´Ï´Ù. * ÀÌ ¹®¼­¸¦ ÀÛ¼ºÇÏ´Â ÇöÀç½ÃÁ¡À» ±âÁØÀ¸·Î MM0 ~ 7±îÁöÀÇ Æ¯¼ö ¸íĪÀÌ MMX¿¡ »ç¿ëµÇ°í ÀÖÀ¸¸ç À̸§¸¸ ÀÌ·¸°Ô »ç¿ëµÉ»Ó »ç½Ç»ó ºÎµ¿¼Ò¼öÁ¡ ¿¬»ê¿ë ·¹Áö½ºÅ͸¦ »ç¿ëÇÏ°Ô µË´Ï´Ù. (ÀÌ·¯ÇÑ ÀÌÀ¯·Î ¾Æ·¡ ¼³¸íÇÏÁö¸¸ EMMSÀÇ ¸í·É¿¡ ´ëÇؼ­ ÇÊ¿äÇÑ ÀÌÀ¯¸¦ ÀÌÇØÇϼ¼¿ä!) * MMXÀÇ °¡Àå ´ëÇ¥ÀûÀÎ ±â´ÉÀ¸·Î´Â 8¹ÙÀÌÆ® ´ÜÀ§·Î Data¸¦ Àü¼ÛÇÏ´Â °ÍÀε¥ ÀÌ°Í ¸»°íµµ ±âº» »ê¼ú¿¬»ê ¹× ³í¸®¿¬»êÀ» ÇÒ¼ö ÀÖ°Ô µÇ¾î ÀÖ½À´Ï´Ù. * MMX´Â ¹ü¿ë·¹Áö½ºÅÍ·Î ÇÏ´Â ±â´É°ú ºñ±³ÇßÀ» ¶§ ´Ù¸¥ Á¡ÀÌ Packed mode¶ó´Â °ÍÀÌ Àִµ¥ ¾ÆÁ÷ ÀÌ°Í¿¡ ´ëÇÑ Çʿ伺À» Á¦°¡ ¸ø´À³¢°í ÀÖ´Â °ü°è·Î ³ªÁß¿¡ Çʿ伺ÀÌ »ý±â¸é Á¤¸®Á» Çغ¸°Ú½À´Ï´Ù. === MMXÀÇ Áö¿ø¿©ºÎ ÆÇ´Ü === * ¾Æ·¡¿Í °°ÀÌ '''cpuid'''¸í·ÉÀ» ÅëÇÏ¿© ÇØ´ç ±â´ÉÀÇ Áö¿ø ¿©ºÎ¸¦ È®ÀÎ ÇÒ¼ö ÀÖ½À´Ï´Ù. À̹ۿ¡ 3D-NOW°°Àº °æ¿ìµµ ºñ½ÁÇÑ ¹æ¹ýÀ¸·Î Áö¿ø¿©ºÎ¸¦ ¾Ë¼ö ÀÖ°Ú½À´Ï´Ù. {{{#!vim c int MZ_IsMMX(void) { static int s_Return = (-1);^I if(s_Return == (-1)) { __asm__ __volatile__( "\n\t" "movl $1, %%eax\n\t" "cpuid\n\t" "xorl %%eax, %%eax\n\t" "testl $0x800000, %%edx\n\t" "jz L_Return\n\t" "incl %%eax\n\t" "L_Return:\n\t" "movl %%eax, %0\n\t" "\n\t" : "=m"(s_Return) : : "ebx" ); } return(s_Return); } }}} === MMX ¸í·É¾î ¿ä¾àÇ¥ === * Ưº°ÇÑ ¼³¸íÀÌ ¾ø´õ¶óµµ ¾Æ·¡ÀÇ ¿ä¾àÇ¥¸¦ º¸½Ã¸é ¾î¼Àºí¸® °³¹ßÀںеéÀ̶ó¸é ±×¸® ¾î·ÆÁö ¾Ê°Ô Á¢±ÙÇϽǼö ÀÖÀ»°Ì´Ï´Ù. * EMMS¿¡ ´ëÇØ °£´ÜÈ÷ Ãß°¡¼³¸íÇÏÀÚ¸é ºÎµ¿¼Ò¼öÁ¡ ¿¬»êÀ» Çϱâ À§Çؼ­ »óŸ¦ Áö¿ï ÇÊ¿ä°¡ Àִµ¥ ±×·± °æ¿ì¿¡ ÀûÀýÈ÷ »ðÀÔÇÏ¿© »ç¿ëÇÏ¿©¾ß ÇÕ´Ï´Ù. (Áï, MMX¸í·ÉÀ» »ç¿ëÇÏ°Ô µÇ¸é EMMS¸í·ÉÀº µÚµû¶ó¾ß °ñÄ¡¾ÆÇ ¿Àµ¿ÀÛ °è»êÀ» ¹æÁöÇÒ¼ö ÀÖ½À´Ï´Ù.) || '''±â´É''' || '''°ªÀÇ ¼øȯÀÌ °í·ÁµÉ ¶§''' || '''ºÎÈ£°¡ °í·ÁµÉ ¶§''' || '''ºÎÈ£°¡ °í·ÁµÇÁö ¾ÊÀ» ¶§''' || || »ê¼úµ¡¼À || PADDB, PADDW, PADDD || PADDSB, PADDSW || PADDUB, PADDUW || || »ê¼ú»¬¼À || PSUBB, PSUBW, PSUBD || PSUBSB, PSUBSW || PSUBUB, PSUBUW || || »ê¼ú°ö¼À || PMULL, PMULH || || || || »ê¼ú°ö¼ÀÀÚ¸®¿Ã¸² || PMADD || || || || ºñ±³ || PCMPEQB, PCMPEQW, PCMPEQD || || || || PCMPGTPB, PCMPGTPW, PCMPGTPD || || || || º¯È¯ || PUNPCKHBW || PACKSSWB || PACKUSWB || || PUNPCKHWD || PACKSSDW || || || PUNPCKHDQ || || || || PUNPCKLBW || || || || PUNPCKLWD || || || || PUNPCKLDQ || || || || ³í¸®¿¬»ê || '''¹­À½ÀÇ ´ÜÀ§''' || '''Quad´ÜÀ§''' || || || PAND || || || PANDN || || || POR || || || PXOR || || || PSLLQ || || || PSRLQ || || Àü¼Û || '''Double word Àü¼Û''' || '''Quad word Àü¼Û''' || || MOVD || MOVQ || || MMX »óŸ¦ ºñ¿ò || EMMS || === ÇÁ·Î±×·¥¿¡ Àû¿ëÇغ¸±â === ==== Inline assembly¿¡ ¾î¶»°Ô Àû¿ëÇÒ °ÍÀΰ¡? ==== * Clobber¿¡ ¾î¶»°Ô µÎ¾î¾ß »ç¿ëÇÒ¼ö ÀÖÀ»±î¿ä? ¾Æ·¡ÀÇ °£´ÜÇÑ ¿¹Á¦¸¦ º¸½Ã´Ù½ÃÇÇ "X"¶ó´Â °ÍÀÌ ÇöÀç·Î¼­´Â Àû´çÇÑµí ½Í±º¿ä. ÇÊÀÚ´Â »ç½Ç»ó ÀÌ·¸°Ô ¾²´Â°ÍÀÌ º°·Î ¸¶À½¿¡ ³»Å°Áö ¸øÇÏ¿© ±×³É *.s ·Î InlineÀÌ ¾Æ´Ñ »óÅ·Π´ëºÎºÐ »ç¿ëÇϱâ´Â ÇÏÁö¸¸ °¡²ûÀº InlineÀ» ¾Æ·¡¿Í °°ÀÌ »ç¿ëÇϱâ´Â ÇÕ´Ï´Ù. Ȥ½Ã ´õ Àû´çÇÑ Clobber¸¦ ¾Ë°í °è½Ã´Ù¸é ÁÖÀú¾øÀÌ ¾Ë·ÁÁֽøé ÁÁ°Ú±º¿ä. * "X"´Â ¾î¶°ÇÑ ÀÎÀÚ¶óµµ Çã¿ëÇÏ´Â °ÍÀ̶ó´Â Á¡À» ³ëÆĽɿ¡ ¼³¸í µå¸®¸ç »ç½Ç»ó ¿Ø¸¸ÇÑ°Å´Â ¸ð¸£°Ú´Ù ½ÍÀ¸¸é ÀÌ°ÍÀ» ¾²¸é Àß µÇÁÒ. (¾ÈµÇ¸é °ñÄ¡¾ÆÇ°Š¾Æ½ÃÁÒ?) {{{#!vim c unsigned long long MZ_NopMMX(unsigned long long s_Value) { unsigned long long s_Return; __asm__ volatile( "\n\t" "movd %1, %%mm0\n\t" "movd %%mm0, %0\n\t" "emms\n\t" "\n\t" : "=X"(s_Return) : "X"(s_Value) ); return(s_Return); } }}} === ¹®¼­¸¦ ¸¶Ä¡¸ç === * ÀÌ ¹®¼­¸¦ ÀÛ¼ºÇϱâ À§ÇØ Intel pentium manualÀ» ÂüÁ¶ÇÏ¿´½À´Ï´Ù. ÀÚ¼¼ÇÑ°ÍÀº IntelÀÇ È¨ÆäÀÌÁö¸¦ ¹æ¹®Çϼ¼¿ä. * º» ¹®¼­ÀÇ ÃÖ±Ù ¹öÁ¯Àº [http://minzkn.pe.ky http://minzkn.pe.ky]¿¡¼­ º¸½Ç¼ö ÀÖ½À´Ï´Ù. ----