| ²é¿´: 152 | »Ø¸´: 0 | |||
| µ±Ç°Ö÷ÌâÒѾ´æµµ¡£ | |||
zsgllyľ³æ (ÖøÃûдÊÖ)
|
[½»Á÷]
MMXÖ¸ÁÔÚC++ÖеÄʹÓÃ
|
||
|
ÉÏ´ÎÔÚ¡¶¹ØÓÚÄÚÁª»ã±àµÄ¼¸¸ö¼¼ÇÉ¡·Ò»ÎÄÖÐÖ»ÊǼòµ¥µØ½éÉÜÁËÈçºÎÔÚC++ÖÐʹÓÃÄÚÁª»ã±à£¬ÕâÒ»´ÎÏȶÔÉÏÒ»´ÎµÄÎÄÕÂ×÷Ò»²¹³ä£¬È»ºó½éÉÜÈçºÎʹÓÃMMXÖ¸Áî¡£ Ò»¡¢ ÄÚÁª»ã±àµÄÒ»°ãÔÔò£º 1¡¢ ×ÔÓÉʹÓÃͨÓüĴæÆ÷£»£¨EAX,EBX,ECXºÍEDX£© 2¡¢ ÆäËü¼Ä´æÆ÷ÀûÓöÑÕ»±£Áô£¬Ê¹Óã¬×îºó»Ö¸´£» Ò»°ãµÄÏñÏÂÃæÕâÑù£º __asm{ push ebp push esp ¡¡¡.//ʹÓÃEBPºÍESP pop esp pop ebp } ¶þ¡¢ ÄÚÁª»ã±à__asm¿ÉÒÔµ¥¶ÀʹÓ㺠ÀýÈ磺__asm mov eax,anyval1 __asm mov ebx,anyval2 Èý¡¢ º¯Êý·µ»ØÖµ¿ÉÒÔÖ±½Ó·Åµ½eaxÖУ¬¿ÉÒÔ²»Àí»á¾¯¸æ ÀýÈ磺 int anyfun(¡¡/*anyparm*/) { int irtn; //º¯Êý·µ»ØÖµ ¡¡ //º¯ÊýÓï¾ä __asm mov eax,irtn //´úÌæreturn irtn;µ«±àÒëÆ÷»á·¢³ö¾¯¸æ£¬¿ÉÒÔ²»ÀíËü } ËÄ¡¢ ÄÚÁª»ã±à²»Çø·Ö´óСд£¬Ó﷨ͬÆÕͨ»ã±à ÀýÈ磺__asm{ mov eax,ebx MOV EAX,EBX //ͬÉÏÒ»¾ä } ×¢Ò⣺C++µÄ±äÁ¿»¹ÊÇÇø·Ö´óСдµÄ Îå¡¢ ÄÚÁª»ã±à¾¡Á¿Ê¹ÓÃ__asm»ò_asm¹Ø¼ü×Ö£¬¶ø²»Óñê×¼C++µÄasm¹Ø¼ü×Ö(Õâ¸öÊÇ΢Èí˵µÄ) ÒÔÉÏÖ»ÊÇһЩ¹ØÓÚÄÚÁª»ã±àµÄ²¹³ä£¬ÎÒ½«³öһϵÁÐÎ§ÈÆÄÚÁª»ã±àµÄÎÄÕ£¬ÏÂÃæ½Ó×ÅÉÏÒ»´ÎµÄ»°ÌâÏêϸһµãµØ½²Ò»ÏÂMMXÖ¸ÁîµÄµ÷Óà 1¡¢ MMXÖ¸Á¼ò½é£º [Êý¾Ý´«ÊäÖ¸Áî] movq //´«Êä64λÕûÊý movd //´«Êä32λÕûÊý [Êý¾Ý´ò°üת»»Ö¸Áî] PACKSSWB //Pack words into bytes with signed saturation. PACKSSDW //Pack doublewords into words with signed saturation. PACKUSWB //Pack words into bytes with unsigned saturation. PUNPCKHBW //Unpack high-order bytes. PUNPCKHWD //Unpack high-order words. PUNPCKHDQ //Unpack high-order doublewords. PUNPCKLBW //Unpack low-order bytes. PUNPCKLWD //Unpack low-order words. PUNPCKLDQ //Unpack low-order doublewords. ×¢£ºÕâÒ»×éÖ¸ÁîÎÒûÓоßÌåÓùý£¬²»ÖªµÀÊǸÉʲôµÄ£¬Çë¸ßÊִͽ̣¡Ð¡µÜÏÈлÁË£¡ [ ËãÊõÖ¸Áî] PADDB PADDW PADDD PADDSB PADDSW PADDUSB PADDUSW PSUBB PSUBW PSUBD PSUBSB PSUBSW PSUBUSB PSUBUSW PMULHW PMULLW PMADDWD [ ±È½ÏÖ¸Áî] PCMPEQB Compare packed bytes for equal. PCMPEQW Compare packed words for equal. PCMPEQD Compare packed doublewords for equal. PCMPGTB Compare packed signed byte integers for greater than. PCMPGTW Compare packed signed word integers for greater than. PCMPGTD Compare packed signed doubleword integers for greater than. Õâ×éÖ¸ÁîÓÃÓÚ³É×é±È½ÏÊý¾Ý [ λÂß¼Ö¸Áî] PAND Bitwise logical AND. PANDN Bitwise logical AND NOT. POR Bitwise logical OR. PXOR Bitwise logical exclusive OR. Õâ×éÖ¸ÁîÓëAND,XOR»ù±¾Ïàͬ£¬¶¼Êǰ´Î»½øÐÐÂß¼ÔËËã¡£ [ ÒÆÎ»ºÍÑ»·ÒÆÎ»Ö¸Áî] PSLLW //Shift packed words left logical. PSLLD //Shift packed doublewords left logical. PSLLQ //Shift packed quadword left logical. PSRLW //Shift packed words right logical. PSRLD //Shift packed doublewords right logical. PSRLQ //Shift packed quadword right logical. PSRAW //Shift packed words right arithmetic. PSRAD //Shift packed doublewords right arithmetic. [ ״̬¹ÜÀíÖ¸Áî] EMMS //Empty MMX state. ÔÚVCÖÐÒªÇóËùÓеÄMMXÖ¸Áîµ÷ÓÃÍê±Ïºó¶¼Òªµ÷ÓÃÕâ¸öÖ¸ÁîÇå¿Õ ÀýÈ磺__asm{ ¡..MMX Óï¾ä EMMS //Çå¿Õ״̬ } ÒÔÉÏÊÇËùÓеÄMMXÖ¸ÁÄã¿ÉÒÔ²âÊÔʹÓÃÆäÖеÄÖ¸ÁËûµÄ¹¤×÷ÔÀí¾ÍÊǵ¥Ö¸Á¶àÊý¾Ý 2¡¢ ʹÓÃMMXÖ¸ÁµÄ×¢ÒâÊÂÏî ÓÉÓÚÔÚCPUÄÚ²¿£¬FPU¼Ä´æÆ÷ºÍMMX¼Ä´æÆ÷ÊÇͬһ×é¼Ä´æÆ÷£¬ËùÒÔÔÚͬʱÒýÓÃÉÏÃæ¼Ä´æÆ÷ʱҪעÒâÕýÈ·µÄ״̬ת»»£¬¾ßÌå×ö·¨ÒÔºóÔÚ̽ÌÖ¡£ÄãÖ»ÒªÏȼÇס²»Äܼòµ¥µÄ»ìºÏÒÔÉÏÁ½ÖÖÖ¸Á¼´¿É¡£ ÿ´Îµ÷ÓÃ֮ǰҪÏȼì²âcpuÊÇ·ñÖ§³ÖMMXÖ¸Á£¬ÒÔÃâ·¢ÉúÒì³£¡£¾ßÌå×ö·¨¿´ÏÂÁÐʾÀý£º mov EAX, 1 ; request for feature flags CPUID ; 0Fh, 0A2h CPUID instruction test EDX, 00800000h ; Is IA MMX technology bit (Bit 23 of EDX) ; in feature flags set? jnz MMX_Technology_Found Õâ¶Î´úÂëÀ´×ÔIntelµÄ²Î¿¼ÊֲᣬËùÒÔÄã¿ÉÒÔ·ÅÐĵÄʹÓᣠ3¡¢ ÏÂÃæÓÃÒ»¶ÎʾÀý´úÂëÀ´ËµÃ÷Ò»ÏÂÔõÑùÓÃMMXÖ¸Áî __int8 i8_a[2][16]; //×Ö½Ú²Ù×÷Êý£¬Á½×飬ÿ×é16¸ö __int16 i16_a[8]; //×Ö²Ù×÷Êý __int32 i32_a[4]; __int64 i64_a[2]; i64_a[0]=0; i64_a[1]=0; i32_a[0]=1000; i32_a[1]=1000; i32_a[2]=3; i32_a[3]=4; i16_a[0]=10; i16_a[1]=20; i16_a[2]=30; i16_a[3]=40; i16_a[4]=50; i16_a[5]=60; i16_a[6]=70; i16_a[7]=80; i8_a[0][0]=1; i8_a[0][1]=1; i8_a[0][2]=1; i8_a[0][3]=1; i8_a[0][4]=1; i8_a[0][5]=1; i8_a[0][6]=1; i8_a[0][7]=1; i8_a[0][8]=1; i8_a[0][9]=1; i8_a[0][10]=1; i8_a[0][11]=1; i8_a[0][12]=1; i8_a[0][13]=1; i8_a[0][14]=1; i8_a[0][15]=1; i8_a[1][0]=2; i8_a[1][1]=2; i8_a[1][2]=2; i8_a[1][3]=2; i8_a[1][4]=2; i8_a[1][5]=2; i8_a[1][6]=2; i8_a[1][7]=2; i8_a[1][8]=2; i8_a[1][9]=2; i8_a[1][10]=2; i8_a[1][11]=2; i8_a[1][12]=2; i8_a[1][13]=2; i8_a[1][14]=2; i8_a[1][15]=2; __asm{ movq mm1,[i64_a] movq mm2,[i64_a] movq mm2, [i32_a+8] psubd mm2, [i32_a] movq [i32_a],mm2 movq mm1,[i16_a] paddsw mm1,[i16_a+8] movq [i16_a],mm1 movq mm1,[i8_a] movq mm2,[i8_a+8] paddb mm1,[i8_a+16] paddb mm2,[i8_a+24] movq [i8_a],mm1 movq [i8_a+8],mm2 emms //×îºóÇå³ýMMX״̬¼Ä´æÆ÷£¬ÕýÈ··µ»Ø¸øÏµÍ³ } Äã¿ÉÒÔͨ¹ýÉèÖöϵ㣬ºÍwatchµÄ·½·¨À´¹Û²ì¼Ä´æÆ÷ÒÔ¼°±äÁ¿µÄ±ä»¯Çé¿ö£¬ÕâÀïÖ»ÊÇÒýÓÃÁËÒ»²¿·ÖµÄÖ¸ÁÄÇô×îÒýÈË×¢ÒâµÄÊǶÔi16_a¡¢i8_a¡¢ÒÔ¼°i32_aÊý×éµÄ²Ù×÷£¬ÎÒÊÇËæ±ã¶ÔËûÃǽøÐÐÁËËãÊõÔËË㣬´ó¼Ò¿ÉÒÔ¿´µ½ÎÒ¼ÓÁ½×é×Ö½ÚÊý×éÊý¾ÝʱֻÓÃÁËÁ½Ìõ¼ÓÖ¸ÁÕâÊÇÆÕͨµÄÖ¸ÁÍû³¾Äª¼°µÄ¡£Õâ¾ÍÊǵ¥Ö¸Á¶àÊý¾ÝµÄ÷ÈÁ¦¡£Í¬Ê±ÄãÒ²¿ÉÒÔ¿´µ½¶Ô64λÕûÊýµÄ²Ù×÷Ò²¼òµ¥¶àÁË¡£µ«ÊÇҪעÒâµÄÊÇ£¬MMXÖ¸ÁÀïºÃÏñûÓÐÌṩ³ý·¨²Ù×÷¡£ËùÒÔÄãÐè½èÖúËã·¨À´ÊµÏÖ¡£ÁíÍâÒª²¹³äµÄÊÇMMX¼Ä´æÆ÷ÊÇ´ÓMM0-MM7ÃüÃûµÄÒ»×é64λ¼Ä´æÆ÷¡£ [ Last edited by »ÃÓ°ÎÞºÛ on 2006-11-29 at 07:47 ] |
» ²ÂÄãϲ»¶
08¹¤Ñ§µ÷¼Á
ÒѾÓÐ16È˻ظ´
0703»¯Ñ§µ÷¼Á£¬Çóµ¼Ê¦ÊÕ
ÒѾÓÐ7È˻ظ´
0854AI CV·½ÏòÕÐÊÕµ÷¼Á
ÒѾÓÐ3È˻ظ´
Çóµ÷¼Á323²ÄÁÏÓ뻯¹¤
ÒѾÓÐ3È˻ظ´
ÉúÎïѧѧ˶Çóµ÷¼Á
ÒѾÓÐ9È˻ظ´
289Çóµ÷¼Á
ÒѾÓÐ8È˻ظ´
07»¯Ñ§280·ÖÇóµ÷¼Á
ÒѾÓÐ5È˻ظ´
300·Ö£¬²ÄÁÏ£¬Çóµ÷¼Á£¬Ó¢Ò»Êý¶þ
ÒѾÓÐ4È˻ظ´
¡¾¿¼Ñе÷¼Á¡¿»¯Ñ§×¨Òµ 281·Ö£¬Ò»Ö¾Ô¸ËÄ´¨´óѧ£¬³ÏÐÄÇóµ÷¼Á
ÒѾÓÐ16È˻ظ´
0854µç×ÓÐÅÏ¢Çóµ÷¼Á
ÒѾÓÐ7È˻ظ´














»Ø¸´´ËÂ¥