²Ä¤Q¤T³¹¡@¯BÂI¼Æ»P SSE «ü¥O

³o¤@³¹¦h½Í¤@¨Ç SSE «ü¥O¡A³Ì«á±N³o¨Ç«ü¥O¡AÀ³¥Î©ó­pºâª½¨¤§¤¼Ð¨t¤W¤wª¾¨âÂI¶¡ªº¶ZÂ÷¥H¤Î­pºâ¤@¤¸¤G¦¸¤èµ{¦¡ªº¨â­Ó®Ú¡C¤@¦p¬J©¹¡A¥ý¤¶²Ð·|¥Î¨ìªº«ü¥O¡C


¥»³¹¥Î¨ìªº«ü¥O

°²«ü¥O¡GALIGN

ALIGN ¬O¥Î¨Ó«ü¥Ü²Õ;¹§âµ{¦¡½X©Î¸ê®Æ¹ï»ô¬Y­Ó¦ì§}¡A¥H´£°ª¦s¨ú®Ä²v¡A¨ä¥Îªk¬O¡G

ALIGN   boundary

boundary ¬O¤Gªº¾­¦¸¤è¼Æ¡A¨Ò¦p 2¡B4¡B8¡B16¡Aªí¥Ü¦b¨Ï¥Î¤F ALIGN ¤§«á¡A¤U¤@­Ó«ü¥O©Î¸ê®Æªº¦s©ñ¦ì§}¥²¶·¬O¯à³Q 2¡B4¡B8¡B16 ¾ã°£¡CÁöµM boundary ¥i¥H¬O¶W¹L 16¡A¦ý¬O·|®ö¶O«Ü¦h°O¾ÐÅé©Ò¥H«Ü¤Ö¥Î¡C

¦pªG¦bµ{¦¡¤¤ªº¸ê®Æ°Ï¬q¤¤©w¸q¤U­±¸ê®Æ¡G

.CONST
n1      DB      1
ALIGN   2
n2      DB      2
ALIGN   4
n3      DW      8086h
ALIGN   8
str1    DB      "TEST ALIGN",0
ALIGN   16
str2    DB      "¤Ö¦~Ä@¡A²³¥Í©À¡A·ÀÃSÃR§¯¨¸¡I"
szApp   DB      "²Ä¤@­ÓWin64µ{¦¡",0

¨º»ò¸ü¤J°O¾ÐÅ餧«á¡Aµ²ªG¦p¤U¹Ï¡G n2 ¤§«e¦³¡uALIGN 2¡v¡A©Ò¥H n2 ªº¦ì§}¥²¶·¬O¯à³Q 2 ¾ã°£¡C¦p¤W¹Ï¡An1 ¥u¦û¤@­Ó¦ì¤¸²Õ¡A¦ì©ó¦ì§} 7F164000H¡A¥»¨Ó n2 À³©ñ¦b¦ì§} 7F164001H¡A¦ý¦]¬°¦³¡uALIGN 2¡v¡A²Õ;¹¦w´¡¤@­Ó¦ì¤¸²Õªº 0¡]¥H¯»¬õ¦âªí¥Ü¡^¡A¨Ï 2 ©ñ¦b 7F164002H ³B¡Cn3 ¤§«e¦³¡uALIGN 4¡v¡A©Ò¥H n3 ªº¦ì§}¥²¶·¬O¯à³Q 4 ¾ã°£¡A¦]¦¹²Õ;¹¦w´¡¤@­Ó¦ì¤¸²Õªº 0 ¡]¥H¾í¦âªí¥Ü¡^´N¥i¥HÅý n3 ©ñ¦b 7F164004H ³B¡C¦P²z¡A¬õ¦âªº¨â­Ó¦ì¤¸²Õªº¹s»Pºñ¦âªº 13 ­Ó¦ì¤¸²Õªº¹s¡A¤À§O¬O AILGN 8¡BALIGN 16 ©Ò²K¥[ªº¡A¥H«K¨Ï str1¡Bstr2 ¦r¦ê¯à¦b¥|¦r²Õ¡B¸`ªºÃä¬É¤W¶}©l¡C

³oùؾã²z¤@¤U¡C

  1. ALIGN 2¡G¤U­Ó«ü¥O©Î¸ê®Æ¡A¦s©ñ©óªº¦ì§}¥²¶·¯à³Q 2 ¾ã°£¡A¥iµø¬°¦r²ÕÃä¬É¡C
  2. ALIGN 4¡G¤U­Ó«ü¥O©Î¸ê®Æ¡A¦s©ñ©óªº¦ì§}¥²¶·¯à³Q 4 ¾ã°£¡A¥iµø¬°Âù¦r²ÕÃä¬É¡C
  3. ALIGN 8¡G¤U­Ó«ü¥O©Î¸ê®Æ¡A¦s©ñ©óªº¦ì§}¥²¶·¯à³Q 8 ¾ã°£¡A¥iµø¬°¥|¦r²ÕÃä¬É¡C
  4. ALIGN 16¡G¤U­Ó«ü¥O©Î¸ê®Æ¡A¦s©ñ©óªº¦ì§}¥²¶·¯à³Q 16 ¾ã°£¡A¥iµø¬°¸`Ãä¬É¡C

SSE «ü¥O¡GMOVAPD »P MOVAPS

MOVAPD »P MOVAPS ªº»yªk¬O¡G

MOVAPD  ¥Øªº¹Bºâ¤¸,¨Ó·½¹Bºâ¤¸
MOVAPS  ¥Øªº¹Bºâ¤¸,¨Ó·½¹Bºâ¤¸

¥Øªº¹Bºâ¤¸»P¨Ó·½¹Bºâ¤¸¥²¶·¦³¤@­Ó¬O XMM ¼È¦s¾¹¡A¥t¤@­Ó¥i¥H¬O°O¾ÐÅé¡A¤]¥i¥H¬O XMM ¼È¦s¾¹¡C³o¨â­Ó«ü¥O³£¬O·h²¾ 128 ­Ó¦ì¤¸¡u¥´¥]¡vªº¯BÂI¼Æ¡A¤]´N¬O§â¨Ó·½¹Bºâ¤¸ùØ­±ªº 128 ­Ó¦ì¤¸ªº¸ê®Æ·h²¾¨ì¥Øªº¹Bºâ¤¸¡A¦Ó¨Ó·½¹Bºâ¤¸ªº¤º®e¤£ÅÜ¡C

¨Ó¬Ý¬Ý¥¦­Ìªº­ì¤å¡A´N¯à©ú¥Õ¥¦­Ìªº·N«ä¡CMOVAPD ­ì¤å¬O move aligned packed double-precision¡AMOVAPS ¬O move aligned packed single-precision¡CÁÙ°O±o²Ä¤Q¤@³¹»¡¡A³æºë½T«×¯BÂI¼Æ»Ý­n¨Ï¥Î 32 ­Ó¦ì¤¸ªí¥Ü¡AÂùºë½T«×¯BÂI¼Æ«h»Ý¨Ï¥Î 64 ­Ó¦ì¤¸ªí¥Ü¡C¦Ó³o¨â­Ó«ü¥O³£¬O­n·h²¾ 128 ­Ó¦ì¤¸¡A©Ò¥H¹ï MOVAPD ¨Ó»¡¡A¬O·h²¾¨â­ÓÂùºë½T«×¯BÂI¼Æ¡F¹ï MOVAPS ¨Ó»¡¡A¬O·h²¾¥|­Ó³æºë½T«×¯BÂI¼Æ¡C

packed ªº·N«ä¬O§â³o¨â­Ó©Î¥|­Ó¯BÂI¼Æ¥´¥]°_¨Ó¡A¤@¦¸·h²¾¨ì¥Øªº¹Bºâ¤¸¡C¤]´N¬O«e¤@³¹»¡ªº¡A¡u¦ê¬y³æ«ü¥O¦h¸ê®Æ©µ¦ù«ü¥O¶°¡v¡]SSE¡AStreaming SIMD Extensions¡^¡C¦³¨Ç¤åÄm§â packed ½Ķ¦¨«Ê¸Ë©Î¦V¶q¡A½Ķ¦¨«Ê¸ËÁÙ¦nÁA¸Ñ¡A½Ķ¦¨¦V¶q¡A«h¬O¦]¬°¦V¶q»P¯Â¶q¬O¬Û¹ïªº¡]¨£«e¤@³¹¡^¡C¤£½×½Ķ¦¨¥´¥]¡B«Ê¸ËÁÙ¬O¦V¶q¡A¨ä¹ê·N«ä³£¬O«ü¤@­Ó«ü¥O³B²z¦hµ§¸ê®Æ¡C

align ªº·N«ä¬O¹ï»ô¡A¤]´N¬O»¡³o¨Ç¸ê®Æ¥²¶·¹ï»ô¸`¦ì§}¡C¤@­Ó¸`¡]paragraph¡^ªº¤j¤p¬O 16 ­Ó¦ì¤¸²Õ¡A´«¥y¸Ü»¡¡A³o¨Ç¸ê®Æ©Ò¦bªº¦ì§}¡A¨ä¼Æ­È¥²¶·¯à³Q 16 ¾ã°£¡C¦pªG§â¦ì§}¼g¦¨¤Q¤»¶i¦ì¼Æ¡A¨º»ò³Ì¥kÃä¤@¦ì¥²¶·¬O¡u0¡v¡C¨Ï¥Î¡uALIGN 16¡v°²«ü¥O¡A´N¯à»´¦Ó©öÁ|¹F¨ì¦¹¥Øªº¡C¦pªG¹H¤Ï³o¶µ³W©w¡A·|¤Þµo CPU ¤@¯ë«OÅ@¨Ò¥~¡]#GP¡Ageneral protection exception¡^¦Ó¨ÏÀ³¥Îµ{¦¡·í±¼¡C

¤p¤ì°¸¥Î©³¤Uªºµ{¦¡¡A»¡©ú MOVAPD «ü¥O¹B§@¹Lµ{¡G

align   16
number  DQ  40711A7B35F5B126,406189999999999Ah  ;100.45+100¡Ô3, 140.3
movapd  xmm0,number

°Ñ¦Ò¤U¹Ï¡A¤W­zµ{¦¡½X¸g²ÕĶ«á¡A¥Î x64dbg ¸ü¤J¡C°²¦pÅÜ¼Æ number ªº¦ì§}¬O 7FF6B6B83060¡A¸Ó¦ì§}¤ºªº¼Æ­È¬OÂùºë½T«×¯BÂI¼Æ¡A100.45+100¡Ô3¡A¥H IEEE 754 ®æ¦¡ªí¥Ü´N¬O 40711A7B35F5B126h¡C¥¦¦b°O¾ÐÅ餤¥H¤pºÝ§Ç±Æ¦C¡]§C¦ì¼Æ¦b§C¦ì§}¡A°ª¦ì¼Æ¦b°ª¦ì§}¡^¡A40 ¬O²Ä 56¡ã63 ¦ì¤¸¦b³Ì°ª¦ì§}¡A26 ¬O²Ä 0¡ã7 ¦ì¤¸¦b³Ì§C¦ì§}¡C¤U¤@­ÓÂùºë½T«×¯BÂI¼Æ¬O 140.3¡A¦ì©ó§ó°ªªº¦ì§}ªº 7FF6B6B83068 ¤W¡C°õ¦æ§¹ MOVAPD «á¡A¦ì©ó§C¦ì§}ªº 100.45+100¡Ô3 ²¾¦Ü XMM0 ªº§C¥b³¡¡]0¡ã63 ¦ì¤¸¡^¡F¦ì©ó°ª¦ì§}ªº 140.3 ²¾¦Ü XMM0 ªº°ª¥b³¡¡]64¡ã127 ¦ì¤¸¡^¡C¯BÂI¼Æ¥H IEEE 754 ®æ¦¡ªí¥Ü¡A¬O¤@¦ê¤Q¤»¶i¦ìªº¼Æ­È¡]ÄY®æ¨Ó»¡¡A¨ä¹ê¬O§ó¤j¤@¦ê¤G¶i¦ì¼Æ¡A°£¿ù¾¹¥]§t x64dbg ³£¥H¤Q¤»¶i¦ìªí¥Ü¡^¡A«D±`¤£ª½Ä±¡A¦ý¬O¡Aªº½T¬O¥Î³o¼Ëªº¤è¦¡Àx¦s©ó°O¾ÐÅ餤¡C©¹«á¡A§Ú­Ì¤]¥i¥H¥Î¤W¹Ïªº¤è¦¡¡A²³æ·Q¹³³o¨Ç¼Æ­È¦b°O¾ÐÅé©Î¼È¦s¾¹¤§¶¡¡A¬O¦p¦ó¾Þ§@ªº¡C

SSE «ü¥O¡GADDPD¡BSUBPD¡BMULPD¡BDIVPD

³o¥|­Ó«ü¥O¬O§â¦ì©ó XMM ¼È¦s¾¹¤ºªº¨â­ÓÂùºë½T«×¯BÂI¼Æ¡A»P¥t¤@­Ó XMM ¼È¦s¾¹©Î°O¾ÐÅ餺ªº¨â­ÓÂùºë½T«×¯BÂI¼Æ¶i¦æ¥|«h¹Bºâ¡C¥¦­Ìªº»yªk¬O¡G

ADDPD   XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸
SUBPD   XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸
MULPD   XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸
DIVPD   XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸

¥Ñ¤W­±¥iª¾¡A³o¥|­Ó«ü¥Oªº¥Øªº¹Bºâ¤¸¡A¥u¯à¬O XMM ¼È¦s¾¹¡A¬G¤W­±»yªk¤¤ª½±µ¼g XMM ¼È¦s¾¹¡F¦Ó¨Ó·½¹Bºâ¤¸¥i¥H¬O XMM ¼È¦s¾¹©Î°O¾ÐÅéÅܼơC¦pªG¨Ó·½¹Bºâ¤¸¬O°O¾ÐÅéÅܼơA¨º»ò¥²¶·¹ï»ô¸`¦ì§}¡F¦pªG¨S¹ï»ô¡A¨º»ò CPU ·|¤Þµo¤@¯ë«OÅ@¨Ò¥~¦Ó¨ÏÀ³¥Îµ{¦¡·í±¼¡C³o¥|­Ó«ü¥O¹Bºâ¹Lµ{³£¤@¼Ë¡A§â¥Øªº¹Bºâ¤¸¤ºªº¨â­ÓÂùºë½T«×¯BÂI¼Æ¡A¤À§O»P¦s©ó¨Ó·½¹Bºâ¤¸¬Û¹ïÀ³¦ì¤¸ªº¨â­ÓÂùºë½T«×¯BÂI¼Æ¡A¶i¦æ¥|«h¹Bºâ¡A¦A±Nµ²ªG¦s¤J¥Øªº¹Bºâ¤¸¤º¡C

©³¤U»¡©ú SUBPD¡BDIVPD «ü¥O¡A¦]¬°¥¦­Ì¤£¨ã¦³¥æ´««ß¡A©Ò¥H­þ­Ó¹Bºâ¤¸¦b«e¡A­þ­Ó¦b«á´N«Ü­«­n¡C¤U¹Ï¥ªÃä¬O SUBPD «ü¥O¹Ï¸Ñ¡A¥Øªº¹Bºâ¤¸¡B¨Ó·½¹Bºâ¤¸¤À§O¥H XMM1¡BXMM2/M128 ªí¥Ü¡A³oùتº 1¡B2 «üªº¬O¥N¸¹¡A¨Ã«D«ü¯S©wªº¼È¦s¾¹¡]¤]´N¬O»¡ XMM1¡BXMM2 ¥i¥H¬O XMM0¡ãXMM15 ¤§¤¤ªº¥ô¦ó¤@­Ó¡^¡F¦Ó M128 «üªº¬O°O¾ÐÅéÅܼơA³o­Ó«ü¥O·|¥Î¨ì 128 ¦ì¤¸ªº¸ê®Æ¡C±q¹Ï¤W¡A¥i¥H«Ü©úÅã¬Ý¥X¨Ó¡ASUBPD «ü¥O·|§â XMM1 ªº§C¥b³¡´î¥h XMM2/M128 ªº§C¥b³¡¡A¨Ã±N®t¦s©ó XMM1 ªº§C¥b³¡¡F¦P¤@®É¶¡¤]§â XMM1 ªº°ª¥b³¡´î¥h XMM2/M128 ªº°ª¥b³¡¡A¨Ã±N®t¦s©ó XMM1 ªº°ª¥b³¡¡C

¤W¹Ï¥kÃä¬O DIVPD ªº¹Ï¸Ñ»¡©ú¡A¥¦¶È¶È¬O§â´îªk§ï¦¨°£ªk¡A¦Ó¨ä¥L¹Lµ{³£¤@¼Ë¡A¤]´N¬O»¡§â XMM1 ªº§C¥b³¡°£¥H XMM2/M128 ªº§C¥b³¡¡A¨Ã±N°Ó¦s©ó XMM1 ªº§C¥b³¡¡F¦P¤@®É¶¡¤]§â XMM1 ªº°ª¥b³¡°£¥H XMM2/M128 ªº°ª¥b³¡¡A¨Ã±N°Ó¦s©ó XMM1 ªº°ª¥b³¡¡CADDPD¡BMULPD ªº¹Lµ{»P SUBPD¡BDIVPD ¬Û¦P¡A´N¤£¦h»¡¤F¡C

©³¤Uªº¨Ò¤l¡A¥H¼Æ­È»¡©ú ADDPD¡BDIVPD °õ¦æ«áµ²ªG¡G

x       DQ      5.0, 7.0
y       DQ      4.0, 9.0
z       DQ      2.0, 4.0
movapd  xmm0, x ;XMM0°ª¥b³¡¬O7.0¡A§C¥b³¡¬O5.0
addpd   xmm0, y ;XMM0°ª¥b³¡¬O16.0¡A§C¥b³¡¬O9.0
divpd   xmm0, z ;XMM0°ª¥b³¡¬O4.0¡A§C¥b³¡¬O4.5

¥k¹Ï¶È»¡©ú ADDPD «ü¥Oªº¹Lµ{¡A¦b°õ¦æ ADDPD «e¡AXMM0 ¤º§C¥b³¡»P°ª¥b³¡¤À§O¬O 5.0 »P 7.0¡F°õ¦æ ADDPD ®É¡A¦P®É»P y ©Ò«ü¦ì§}ªº 4.0 »P¸û°ª¤K­Ó¦ì¤¸²Õ¦ì§}¤ºªºªº 9.0 ¤À§O¬Û¥[¡F¤À§O±o¨ì 9.0 »P 16.0¡A³Ì«á¦s¤J XMM0 ¤º¡C

SSE «ü¥O¡GADDSD¡BSUBSD¡BMULSD¡BDIVSD

³o¥|­Ó«ü¥O¬O§â¦ì©ó XMM ¼È¦s¾¹¤ºªº§C¥b³¡Âùºë½T«×¯BÂI¼Æ¡A»P¥t¤@­Ó XMM ¼È¦s¾¹©Î°O¾ÐÅ餺ªºÂùºë½T«×¯BÂI¼Æ¶i¦æ¥|«h¹Bºâ¡C¥¦­Ìªº»yªk¬O¡G

ADDSD   XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸
SUBSD   XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸
MULSD   XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸
DIVSD   XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸

¥Ñ¤W­±¥iª¾¡A³o¥|­Ó«ü¥Oªº¥Øªº¹Bºâ¤¸¡A¥u¯à¬O XMM ¼È¦s¾¹¡A¬G¤W­±»yªk¤¤ª½±µ¼g XMM ¼È¦s¾¹¡F¦Ó¨Ó·½¹Bºâ¤¸¥i¥H¬O XMM ¼È¦s¾¹©Î°O¾ÐÅéÅܼơC³o¥|­Ó«ü¥O¹Bºâ¹Lµ{³£¤@¼Ë¡A§â¨Ó·½¹Bºâ¤¸ªºÂùºë½T«×¯BÂI¼Æ¡A»P¥Øªº¹Bºâ¤¸ªº§C¥b³¡Âùºë½T«×¯BÂI¼Æ¡A¶i¦æ¥|«h¹Bºâ¡A¦A±Nµ²ªG¦s¤J¥Øªº¹Bºâ¤¸¤º¡C

¥Øªº¹Bºâ¤¸ªº°ª¥b³¡¡A¤£·|¨ü³o¥|ºØ«ü¥O¹Bºâªº¼vÅT¡C¦pªG¨Ó·½¹Bºâ¤¸¬O°O¾ÐÅéÅܼơA¤£»Ý­n¹ï»ô¸`¦ì§}¡C¦pªG¨Ó·½¹Bºâ¤¸¬O XMM ¼È¦s¾¹¡A¨º»ò¬O§â§C¥b³¡ªºÂùºë½T«×¯BÂI¼Æ¡A»P¥Øªº¹Bºâ¤¸§C¥b³¡ªºÂùºë½T«×¯BÂI¼Æ¡A¶i¦æ¥|«hºâ¡C

SSE «ü¥O¡GHADDPD¡BHSUBPD

HADDPD «ü¥Oªº­ì¤å¬O horizontal add packed double-precision¡A¥¦¬O SSE3 «ü¥O¶°ªº¨ä¤¤¤@¹D«ü¥O¡C¥¦ªº¯S§O¤§³B¡A¦b©ó¥¦¤£¬O±N¦ì©ó¨â­Ó¹Bºâ¤¸¬Û¹ïÀ³¦ì¤¸¤Wªº¯BÂI¼Æ¬Û¥[¡A¦Ó¬O±N¬Y­Ó¹Bºâ¤¸¤º³¡ªº¯BÂI¼Æ¬Û¥[¡A³o¤]´N¬O horizontal ªº·N«ä¡CHADDPD ªº»yªk¬O¡G

HADDPD  XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸

HADDPD ªº¥Øªº¹Bºâ¤¸¥u¯à¬O XMM ¼È¦s¾¹¡A¬G¤W­±»yªk¤¤ª½±µ¼g XMM ¼È¦s¾¹¡F¦Ó¨Ó·½¹Bºâ¤¸¥i¥H¬O XMM ¼È¦s¾¹¡A¤]¥i¥H¬O°O¾ÐÅéÅܼơC¥k¤W¹Ï¬O HADDPD «ü¥Oªº¹Ï¸Ñ»¡©ú¡A¥Øªº¹Bºâ¤¸¡B¨Ó·½¹Bºâ¤¸¤À§O¥H XMM1¡BXMM2/M128 ªí¥Ü¡A³oùتº 1¡B2 «üªº¬O¥N¸¹¡A¨Ã«D«ü¯S©wªº¼È¦s¾¹¡F¦Ó M128 «üªº¬O°O¾ÐÅéÅܼơA³o­Ó«ü¥O·|¥Î¨ì 128 ¦ì¤¸ªº¸ê®Æ¡CHADDPD ·|§âÀx¦s©ó¥Øªº¹Bºâ¤¸¤ºªº¨â­Ó¯BÂI¼Æ¬Û¥[¡AµM«á¦s©ó¥Øªº¹Bºâ¤¸ªº§C¥b³¡¡]¤]´N¬O 0¡ã63 ¦ì¤¸¡^¡F¦P¤@®É¶¡¤]§â¨Ó·½¹Bºâ¤¸¤ºªº¨â­Ó¯BÂI¼Æ¬Û¥[¡AµM«á¦s©ó¥Øªº¹Bºâ¤¸ªº°ª¥b³¡¡]¤]´N¬O 64¡ã127 ¦ì¤¸¡^¡C

³o¨à¤¶²Ð­Ó¤p§Þ¥©¡C°²¦p§â HADDPD ªº¨â­Ó¹Bºâ¤¸³]¬°¬Û¦Pªº XMM ¼È¦s¾¹¡A¨º»ò°õ¦æ«á¡A³o­Ó¼È¦s¾¹ªº°ª¥b³¡»P§C¥b³¡¬O¬Ûµ¥ªº¡A¦Ó¥B§¡¬°­ì¥ý°ª¥b³¡»P§C¥b³¡¤§©M¡C¡]·Q¬Ý¹Ï¸Ñ¡A½Ð«ö³o¨à¡^¨Ò¦p

haddpd  xmm5,xmm5   ;­YXMM5°ª¥b³¡¬O8.0¡A§C¥b³¡¬O9.0¡C°õ¦æ«áXMM5°ª¥b³¡»P§C¥b³¡¬Ò¬°17.0

ÁA¸Ñ¤F HADDPD «ü¥O«á¡A­nÁA¸Ñ HSUBPD «ü¥O¡A¤]¤£¬O§xÃøªº¨Æ¤F¡A¦]¬°³o¨â¹D«ü¥O«Ü¬Û¦ü¡C¥ý¨Ó¬Ý HSUBPD ªº»yªk¡G

HSUBPD  XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸

HSUBPD ªº¥Øªº¹Bºâ¤¸¥u¯à¬O XMM ¼È¦s¾¹¡A¬G¤W­±»yªk¤¤ª½±µ¼g XMM ¼È¦s¾¹¡F¦Ó¨Ó·½¹Bºâ¤¸¥i¥H¬O XMM ¼È¦s¾¹¡A¤]¥i¥H¬O°O¾ÐÅéÅܼơCHSUBPD ·|§âÀx¦s©ó¥Øªº¹Bºâ¤¸¤ºªº§C¥b³¡¯BÂI¼Æ´î¥h°ª¥b³¡¯BÂI¼Æ¡AµM«á¦s©ó¥Øªº¹Bºâ¤¸ªº§C¥b³¡¡]¤]´N¬O 0¡ã63 ¦ì¤¸¡^¡F¦P¤@®É¶¡¤]§â¨Ó·½¹Bºâ¤¸¤ºªº§C¥b³¡¯BÂI¼Æ´î¥h°ª¥b³¡¯BÂI¼Æ¡AµM«á¦s©ó¥Øªº¹Bºâ¤¸ªº°ª¥b³¡¡]¤]´N¬O 64¡ã127 ¦ì¤¸¡^¡C

¨Ò¦p©³¤Uªº¨Ò¤l¡G

x       DQ      5.0, 7.0
y       DQ      4.0, 9.0
z       DQ      2.0, 4.0
movapd  xmm0, x ;XMM0°ª¥b³¡¬O7.0¡A§C¥b³¡¬O5.0
haddpd  xmm0, y ;XMM0°ª¥b³¡¬O13.0¡A§C¥b³¡¬O12.0
hsubpd  xmm0, z ;XMM0°ª¥b³¡¬O-2.0¡A§C¥b³¡¬O-1.0

HADDPD »P HSUBPD «ü¥O¤¤¡A¦pªG¨Ó·½¹Bºâ¤¸¬O°O¾ÐÅéÅܼơA¨º»ò¥²¶·¹ï»ô¸`¦ì§}¡C¦pªG¨S¹ï»ô¡A¨º»ò CPU ·|¤Þµo¤@¯ë«OÅ@¨Ò¥~¦Ó¨ÏÀ³¥Îµ{¦¡·í±¼¡C

SSE «ü¥O¡GXORPD »P XORPS

XORPD »P XORPS «ü¥Oªº»yªk¬O

XORPD  XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸
XORPS  XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸

³o¨â­Ó«ü¥O¬O¹ï¥Øªº¹Bºâ¤¸»P¨Ó·½¹Bºâ¤¸¡A«ö¦ì¤¸¶i¦æ¤¬¥¸©Î¹Bºâ¡C¤]´N¬O¥Øªº¹Bºâ¤¸²Ä¹s¦ì¤¸»P¨Ó·½¹Bºâ¤¸²Ä¹s¦ì¤¸¶i¦æ¤¬¥¸©Î¹Bºâ¡Aµ²ªG¦s©ó¥Øªº¹Bºâ¤¸²Ä¹s¦ì¤¸¡F¥Øªº¹Bºâ¤¸²Ä¤@¦ì¤¸»P¨Ó·½¹Bºâ¤¸²Ä¤@¦ì¤¸¶i¦æ¤¬¥¸©Î¹Bºâ¡Aµ²ªG¦s©ó¥Øªº¹Bºâ¤¸²Ä¤@¦ì¤¸¡F¥Øªº¹Bºâ¤¸²Ä¤G¦ì¤¸»P¨Ó·½¹Bºâ¤¸²Ä¤G¦ì¤¸¶i¦æXOR¹Bºâ¡Aµ²ªG¦s©ó¥Øªº¹Bºâ¤¸²Ä¤G¦ì¤¸¡F¡K¡Kª½¦Ü©Ò¦³¦ì¤¸³£ºâ§¹¡CÁöµM³o¼Ë¼g¡A¤£¹L¥¦­Ì¬O¦P®É¶i¦æ¹Bºâªº¡A¨Ã«D¤@­Ó¦ì¤¸ºâ§¹¡A¦Aºâ¥t¤@­Ó¡C

¨Ó·½¹Bºâ¤¸¥H¬O XMM ¼È¦s¾¹¡A¤]¥i¥H¬O°O¾ÐÅéÅܼơC¦pªG¨Ó·½¹Bºâ¤¸¬O°O¾ÐÅéÅܼơA¨º»ò¥²¶·¹ï»ô¸`¦ì§}¡C¦pªG¨S¹ï»ô¡A¨º»ò CPU ·|¤Þµo¤@¯ë«OÅ@¨Ò¥~¦Ó¨ÏÀ³¥Îµ{¦¡·í±¼¡C

ÅÞ¿èµ²ªG¨Ó¬Ý¡AXORPD »P XORPS ¤@¼Ò¤@¼Ë¡A³£¬O 128 ¦ì¤¸ªº«ö¦ì¤¸¶i¦æ¤¬¥¸©Î¹Bºâ¡C¦ý SSE «ü¥O¶°±N¥¦­Ì¤À¶}¡A¦Ó¤£¬O¶È¹ê§@¤@­Ó«ü¥O¡A¥i¯à¦³¨â­Ó­ì¦]¡C¤@¬O»y·N²M´·«×¡AXORPS ©ú½T«ü¥X³B²z¥|­Ó³æºë½T«×¡AXORPD ³B²z¨â­ÓÂùºë½T«×¡A¥i¥H´£°ªµ{¦¡½Xªº¥iŪ©Ê¡AºûÅ@¤]¸û¬°®e©ö¡C¤G¬O·í¸ê®Æ«¬§O¤£¤Ç°t®É¡AµwÅé·|²£¥ÍÃB¥~ªºÂàµo©µ¿ð²{¶H¡A·|¼vÅT®Ä²v¡C

³o¨à´£¨Ñ¨â­Ó§Þ¥©¡C

⑴¡B°²¦p­n¨Ï¬Y­Ó XMM ¼È¦s¾¹Âk¹s¡A¥i¥H¨Ï¥Î XORPD «ü¥O¡C¨Ò¦p­n¨Ï XMM5 Âk¹s¡A´N°õ¦æ¡uxorpd xmm5,xmm5¡v¡C

⑵¡B°²¦p­n¨Ï¬Y­Ó XMM ¼È¦s¾¹¤º¼Æ­ÈÅܸ¹¡]§Y¥¿¼ÆÅÜ­t¼Æ¡A©Î­t¼ÆÅÜ¥¿¼Æ¡^¡C¤èªk¬O¥ý·Ç³Æ±`¼Æ¸ê®Æ¡A¨Ò¦p­n¨Ï XMM7 ¤ºªº§C¥b³¡Âùºë½T«×¯BÂI¼ÆÅܸ¹¡A¨º¥i¥H¨Ï¥Î©³¤Uµ{¦¡¡G

msk_v   DQ  8000000000000000h,0
xorpd   xmm7,msk_v

SSE «ü¥O¡GMOVMSKPD »P MOVMSKPS

MOVMSKPD »P MOVMSKPS «ü¥Oªº¥\¯à¡A¬O±N XMM ¼È¦s¾¹¤¤¦U¯BÂI¼Æªº²Å¸¹¦ì¤¸´£¨ú¥X¨Ó¡A¦s¤J³q¥Îªº¼È¦s¾¹¤¤¡A°µ¬°«áÄò§PÂ_¥¿­t¼Æ®É¡A´£¨Ñ§PÂ_ªº¸ê®Æ¡C¥¦­Ìªº»yªk¬O¡G

MOVMSKPD reg,XMM¼È¦s¾¹
UNPCKLPS reg,XMM¼È¦s¾¹

¨ä¤¤ reg ¬O 32 ©Î 64 ¦ì¤¸ªº³q¥Î¼È¦s¾¹¡CMOVMSKPD ·|§â¦ì©ó XMM ¼È¦s¾¹¤º¡A§C¥b³¡©M°ª¥b³¡ªº¨â­ÓÂùºë½T«×¯BÂI¼Æªº²Å¸¹¦ì¤¸¡A¨Ì§Ç¦s¤J reg ªº²Ä 0¡B1 ¦ì¤¸¤º¡A¨Ã¨Ï reg ¨ä¥L°ª¦ì¤¸²M°£¦ÓÅܬ°¹s¡CMOVMSKPS ·|§â¦ì©ó XMM ¼È¦s¾¹¤ºªº¥|­Ó³æºë½T«×¯BÂI¼Æªº²Å¸¹¦ì¤¸¡A¤À§O¦s¤J reg ªº²Ä 0¡ã3 ¦ì¤¸¤º¡A¨Ã¨Ï¨ä¥L°ª¦ì¤¸²M°£¦ÓÅܬ°¹s¡C

SSE «ü¥O¡GUNPCKLPD »P UNPCKLPS

UNPCKLPD ªº­ì¤å¬O unpack and interleave low packed double-precision floating-point¡A·N«ä¬O§â¨â­Ó¹Bºâ¤¸ªº§C¥b³¡Âùºë½T«×¯BÂI¼Æ¡u©î¸Ñ¡v«á¡A­«·s¥´¥]¡C¦Ó UNPCKLPS «h¬O§â¥|­Ó³æºë½T«×¯BÂI¼Æ¡u©î¸Ñ¡v«á¡A­«·s¥´¥]¡C¥¦­Ìªº»yªk¬O¡G

UNPCKLPD XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸
UNPCKLPS XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸

UNPCKLPD¡BUNPCKLPS ªº¥Øªº¹Bºâ¤¸¥u¯à¬O XMM ¼È¦s¾¹¡A¬G¤W­±»yªk¤¤ª½±µ¼g XMM ¼È¦s¾¹¡F¦Ó¨Ó·½¹Bºâ¤¸¥i¥H¬O XMM ¼È¦s¾¹¡A¤]¥i¥H¬O°O¾ÐÅéÅܼơC¥ý»¡ UNPCKLPD¡A¥¦§â¨Ó·½ºâ¹Bºâ¤¸ªº§C¥b³¡¡A·h²¾¨ì¥Øªº¹Bºâ¤¸ªº°ª¥b³¡¡A¦p¤U¹Ï¥ªÃä¡C³o¨à´£¨Ñ¤@­Ó§Þ¥©¡G°²¦p UNPCKLPD ªº¨â­Ó¹Bºâ¤¸³£¬O¦P¤@­Ó XMM ¼È¦s¾¹¡A¨ºµ²ªG´N¬O§â³o­Ó XMM ¼È¦s¾¹ªº§C¥b³¡½Æ»s¨ì°ª¥b³¡¡A°ª¥b³¡­ì¥ýªº¸ê®Æ·|®ø¥¢¡C¨Ò¦p©³¤Uªºµ{¦¡½X¡G

unpcklpd  xmm4,xmm4

¨ä®ÄªG´N¬Û·í©ó§â XMM4 ¼È¦s¾¹ªº§C¥b³¡½Æ»s¨ì°ª¥b³¡¡CUNPCKLPS «h¬O§â¥Øªº¹Bºâ¤¸¤ºªº¥|­Ó³æºë½T«×¯BÂI¼Æ©î¸Ñ¡AµM«á¦A­«·s¥´¥]¡Aµ²ªG¦p¤W¹Ï¥kÃä¡C¥Øªº¹Bºâ¤¸ªº³Ì§CÂù¦r²Õ¤£§ïÅÜ¡A¦¸§CÂù¦r²ÕÅܬ°¨Ó·½¹Bºâ¤¸ªº³Ì§CÂù¦r²Õ¡A¦¸°ªÂù¦r²ÕÅܬ°¥Øªº¹Bºâ¤¸­ì¨Óªº¦¸§CÂù¦r²Õ¡A³Ì°ª¦r²ÕÅܬ°¨Ó·½¹Bºâ¤¸ªº¦¸°ª¦r²Õ¡C´«¥y¸Ü»¡¡AUNPCKLPD ¦b¥Øªº¹Bºâ¤¸¶È«O¯d­ì¨Ó¨â¹Bºâ¤¸³Ì§C©M¦¸§CªºÂù¦r²Õ¡C

SSE «ü¥O¡GADDSUBPD »P ADDSUBPS

ADDSUBPD ªº»yªk¬O

ADDSUBPD XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸

ADDSUBPD ªº¥Øªº¹Bºâ¤¸¥u¯à¬O XMM ¼È¦s¾¹¡A¬G¤W­±»yªk¤¤ª½±µ¼g XMM ¼È¦s¾¹¡F¦Ó¨Ó·½¹Bºâ¤¸¥i¥H¬O XMM ¼È¦s¾¹¡A¤]¥i¥H¬O°O¾ÐÅéÅܼơC¥k¤W¹Ï¬O ADDSUBPD «ü¥Oªº¹Ï¸Ñ»¡©ú¡A¥Øªº¹Bºâ¤¸¡B¨Ó·½¹Bºâ¤¸¤À§O¥H XMM1¡BXMM2/M128 ªí¥Ü¡A³oùتº 1¡B2 «üªº¬O¥N¸¹¡A¨Ã«D«ü¯S©wªº¼È¦s¾¹¡F¦Ó M128 «üªº¬O°O¾ÐÅéÅܼơA³o­Ó«ü¥O·|¥Î¨ì 128 ¦ì¤¸ªº¸ê®Æ¡CADDSUBPD ªº¥Î³~¬O§â¥Øªº¹Bºâ¤¸ªº§C¥b³¡´î¥h¨Ó·½¹Bºâ¤¸ªº§C¥b³¡¡A±N®t¦s©ó¥Øªº¹Bºâ¤¸ªº§C¥b³¡¡F¦P¤@®É¶¡¤]§â¥Øªº¹Bºâ¤¸ªº°ª¥b³¡¥[¤W¨Ó·½¹Bºâ¤¸ªº°ª¥b³¡¡A±N©M¦s©ó¥Øªº¹Bºâ¤¸ªº°ª¥b³¡¡C

ADDSUBPS ªº»yªk¬O

ADDSUBPS XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸

ADDSUBPS ªº¥Øªº¹Bºâ¤¸¥u¯à¬O XMM ¼È¦s¾¹¡A¬G¤W­±»yªk¤¤ª½±µ¼g XMM ¼È¦s¾¹¡F¦Ó¨Ó·½¹Bºâ¤¸¥i¥H¬O XMM ¼È¦s¾¹¡A¤]¥i¥H¬O°O¾ÐÅéÅܼơCADDSUBPS »P ADDSUBPD Ãþ¦ü¡A¶i¦æ´î¡B¥[¥æ¤¬¹Bºâ¡CADDSUBPS §â¥Øªº¹Bºâ¤¸¤À¦¨¥|­Ó³æºë½T«×¯BÂI¼Æ¡A»P¨Ó·½¹Bºâ¤¸ªº¥|­Ó³æºë½T«×¯BÂI¼Æ¦P¤@®É¶¡¶i¦æ¥[¡B´îªk¹Bºâ¡A¦Ó¹Bºâ¤è¦¡¥Ñ§C¦ì¤¸¦Ü°ª¦ì¤¸¨Ì§Ç¬O´î¡B¥[¡B´î¡B¥[¡A³Ì«á±Nµ²ªG¦s¤J¥Øªº¹Bºâ¤¸¡C¥k¤W¹Ï¬O ADDSUBPS ªº¹Ï¸Ñ»¡©ú¡A¥Øªº¹Bºâ¤¸¡B¨Ó·½¹Bºâ¤¸¤À§O¥H XMM1¡BXMM2/M128 ªí¥Ü¡A³oùتº 1¡B2 «üªº¬O¥N¸¹¡A¨Ã«D«ü¯S©wªº¼È¦s¾¹¡F¦Ó M128 «üªº¬O°O¾ÐÅéÅܼơA³o­Ó«ü¥O·|¥Î¨ì 128 ¦ì¤¸ªº¸ê®Æ¡C

¦pªG ADDSUBPD »P ADDSUBPS «ü¥Oªº¨Ó·½¹Bºâ¤¸¬O°O¾ÐÅéÅܼơA¨º»ò¥²¶·¹ï»ô¸`¦ì§}¡C¦pªG¨S¹ï»ô¡A¨º»ò CPU ·|¤Þµo¤@¯ë«OÅ@¨Ò¥~¦Ó¨ÏÀ³¥Îµ{¦¡·í±¼¡C

ADDSUBPD »P ADDSUBPS «ü¥O¥»¨Ó¬O³]­p¥Î©ó­pºâ½Æ¼Æªº­¼ªk¡C²³©Ò©Pª¾¡A½Æ¼Æ¥i¥H¼g¦¨ a+bi ªº§Î¦¡¡A¨ä¤¤ªº i ¬O¡Ô-1¡C°²¦p¦³¨â­Ó½Æ¼Æ¬Û­¼¡A¨º»ò¹ê³¡¬Û´î¡Aµê³¡¬Û¥[¡G

(a+bi)(c+di)=(ac-bd)+(ad+bc)i

¨Ò¤l¡GFP3¡]­pºâ¨âÂI¶¡¶ZÂ÷¡^

©³¤Uªº¨Ò¤l¡A¬O§Q¥Î SSE «ü¥O­pºâ¦bª½¨¤®y¼Ð¨t¤W¡A¨âÂI¶¡ªº¶ZÂ÷¡A­ì©lµ{¦¡¦p¤U¡C±N¥¦Àx¦s¦¨ FP3.ASM¡AµM«á¦b©R¥O´£¥Ü¦r¤¸¤¤²ÕĶ¡B³sµ²§Y¥i¡AFP3 ¤]¬O¦b©R¥O´£¥Ü¦r¤¸¤¤°õ¦æ¡C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
;FP3­pºâª½¨¤®y¼Ð¨t¡]²Ã¥d¨à®y¼Ð¡^¡A¨âÂI¶¡ªº¶ZÂ÷¡A³o¨âÂI¤À§O¬O(273.655080756887729,140.3)
;»P(100.45,40.3)¡C273.655080756887729¨ä¹ê¬O100.45+100¡Ô3ªºªñ¦ü­È
INCLUDE E:\masm64\include64\masm64rt.inc
EXTRN   printf:PROC
;**********************************************************
.DATA
ALIGN     16
pt1       DQ    273.655080756887729,140.3 ;x1=273.655.,y1=140.3
pt2       DQ    100.45,40.3               ;x2=100.45  ,y2=40.3
distance  DQ    ?
szFmt  DB "²Ã¥d¨à®y¼Ð¨t¤W¡AÂI(%.10g,%g)¨ìÂI(%g,%g)ªº¶ZÂ÷¬O%g",0
;***********************************************************
.CODE
;-----------------------------------------------------------
main    PROC;XMM0°ª  XMM0§C;XMM1°ª XMM1§C
        movapd  xmm0,pt1;  y1      x1
        movapd  xmm1,pt2;  y1      x1; y2     x2
        subpd   xmm0,xmm1;y=y1-y2 x=x1-x2; y2     x2
        mulpd   xmm0,xmm0;  y2      x2; y2     x2
        haddpd  xmm0,xmm1; x2+y2  x2+y2; y2     x2
        sqrtsd  xmm0,xmm0; x2+y2 ¡Ôx2+y2; y2     x2
        movq    r11,xmm0;R11=XMM0§C¥b³¡
        mov     r8,pt1[8]
        mov     r10,pt2[8]
        invoke  printf,ADDR szFmt,pt1,r8,pt2,r10,r11
        invoke  ExitProcess,0
main    ENDP
;***********************************************************
END

FP3.ASM ¥²¶·¥Î¨ì¼Æ¾Çùتº¤ÄªÑ©¶©w²z¡]¤]¥s²¦¤ó©w²z¡APythagoras' theorem¡^¡C¤Ä¬O«ü¸ûµuªºª½¨¤Ãä¡AªÑ¬O¸ûªøªºª½¨¤Ãä¡A¦Ó©¶«h¬Oª½¨¤ªº¹ïÃä¡C¤ÄªÑ©¶©w²z«üªº´N¬Oª½¨¤¤T¨¤§Î¤¤

©¶2=¤Ä2+ªÑ2

¦p¥k¤W¹Ï¡AFP3 ­pºâªº¬O (100.45, 40.3) ¨ì (100.45+100¡Ô3, 140.3) ¤§¶¡ªº¶ZÂ÷¡C¤Ä¬O¨â­Ó Y ®y¼Ð¬Û´î¡FªÑ¬O¨â­Ó X ®y¼Ð¬Û´î¡A¦Ó©¶«h¬O¨âÂI¤§¶¡ªº³s½u¡A©Ò¥H©¶µ¥©ó¤Ä»PªÑªº¥­¤è©M¦A¶}®Ú¸¹¡C¤]¦]¬°­pºâ¤Äªº¥­¤è»PªÑªº¥­¤è¡A©Ò¥H­pºâ¨â®y¼Ð¬Û´î®É¡A¤£¥²²z·|¥Î¤jªº´î¥h¤pªº¡A¤Ï¥¿µ²ªG³£¬O¥¿­È¡C

¹³³o¼Ë­pºâ¨âÂI X¡BY ®y¼Ðªº®t¡A¦A¨D®tªº¥­¤è¡A³o¼Ëªº±¡§Î¡A§Q¥Î SSE ³æ¤@«ü¥O³B²z¦hµ§¸ê®Æªº¯S©Ê¡A¯à²¤Æµ{¦¡½X¡A¤]¯à¼W¶i®Ä²v¡]ÁöµM³o­Óµ{¦¡­pºâ«Ü¤Ö¡A¤£¶·¦Ò¼{¤°»ò®Ä²v¡^¡C

FP3.ASM ²Ä 17¡ã18 ¦æ¡A±N³o¨âÂI®y¼Ð¤À§O¸ü¤J XMM0 »P XMM1 ¼È¦s¾¹ùØ­±¡A¦A¥Î SUBPD ¦P®É­pºâ X¡BY ®y¼Ð¤§®t¡A±o¨ìªº´N¬O¤Ä»PªÑªºªø«×¡C¦]¬° SSE ¨S¦³­pºâ¥­¤èªº«ü¥O¡A©Ò¥H¥Î³Ì­ì©lªº¤èªk¡A§â XMM0 ­¼¥H XMM0¡A¤]´N¬O MULPD¡AÅv¥R¥­¤è¡C

±µ¤U¨Ó¥Î¤ô¥­¥[ªk¡AHADDPD¡A­pºâ¨â®y¼Ð®tªº¥­¤è©M¡C§â XMM0 ªº§C¥b³¡»P°ª¥b³¡¬Û¥[¡Aµ²ªG¦s©ó XMM0 ªº§C¥b³¡¡CÁöµM HADDPD ¤]·|§â XMM1 ªº°ª¥b³¡»P§C¥b³¡¬Û¥[¡A¦ý³o¹ï FP3 ¦Ó¨¥¨ÃµL¥Î³B¡A«á¨Ó·|±Ë±ó¤£¥Î¡C³Ì«á¤@¨B¡A§Q¥Î SQRTSD¡A¨D XMM0 §C¥b³¡ªº¥­¤è®Ú¡]²Ä 23 ¦æ¡^¡C

³Ì«á±N XMM0 ªº§C¥b³¡¦s¤J R11 ¼È¦s¾¹¡]²Ä 26 ¦æ¡^¡A©I¥s printf ±Nµ²ªG¦L¦b¿Ã¹õ¤W¡Aµ²§ôµ{¦¡¡C


¨Ò¤l¡GFP4¡]­pºâ¤@¤¸¤G¦¸¤èµ{¦¡ªº®Ú¡^

FP4 Åý¨Ï¥ÎªÌ¿é¤J¤T­Ó¼Æ­È¡A¤À§O¥Nªí¤@¤¸¤G¦¸¤èµ{¦¡¡Aax2+bx+c=0¡Aªº«Y¼Æ¡Aa¡Bb¡Bc¡CFP4 ·|­pºâ¦¹¤èµ{¦¡ªº¸Ñ¡C­ì©lµ{¦¡¦p¤U¡A¥¦¤]¬O¥D±±»Oµ{¦¡¡A»Ý¦b©R¥O´£¥Ü¦r¤¸¤U°õ¦æ¡C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
;FP4Åý¨Ï¥ÎªÌ¿é¤J¤@¤¸¤G¦¸¤èµ{¦¡¡Aax^2+bx+c=0¡Aªº«Y¼Æ
;FP4­pºâ¸Ó¤èµ{¦¡ªº¨â®Ú
INCLUDE E:\masm64\include64\masm64rt.inc
EXTRN   printf:PROC
EXTRN   scanf:PROC
;********************************************************************
.DATA
ALIGN   16
b       DQ      ?
a       DQ      ?
b_p     DQ      ?
c       DQ      ?
one     DQ      1.0
n_four  DQ      -4.0
x1      DQ      ?
x2      DQ      ?
SIGN_MK DQ      8000000000000000h, 0
szHint  DB      "½Ð¿é¤J¤@¤¸¤G¦¸¤èµ{¦¡¡Aax^2+bx+c=0¡Aªº¤T­Ó«Y¼Æ",0Dh,0Ah
        DB      "¤T­Ó«Y¼Æ¤§¶¡¡A¥HªÅ®æ®æ¶}¡G",0
szFmt1  DB      "%lf %lf %lf",0
szFmt2  DB      "¨â®Ú¬°%g¡B%g¡C",0
szErr1  DB      "¿é¤J¿ù»~¡C",0
szErr2  DB      "a¤£¥i¬°0¡C",0
szErr3  DB      "¨S¦³¹ê¼Æ¸Ñ¡C",0
;********************************************************************
.CODE
;--------------------------------------------------------------------
main    PROC
        invoke   printf,ADDR szHint
        invoke   scanf,ADDR szFmt1,ADDR a,ADDR b,ADDR c
        cmp      rax,3
        jz       chk_a
        lea      rcx,szErr1
        jmp      error
chk_a:  cmp      a,0
        jnz      ok
        lea      rcx,szErr2
error:  call     printf
        jmp      exit
ok:     mov      rax,b
        mov      b_p,rax;XMM0°ª XMM0§C;XMM1°ª XMM1§C;XMM2°ª XMM2§C;
        movapd   xmm0,b;  a      b;
        movapd   xmm1,b_p;  a      b;  c     b;
        movapd   xmm2,one;  a      b;  c     b;  -4     1;
        mulpd    xmm0,xmm1; ac     b2;  c     b;  -4     1;
        mulpd    xmm0,xmm2;-4ac    b2;  c     b;  -4     1;
        xorpd    xmm1,SIGN_MK;-4ac    b2;  c    -b;  -4     1;
        haddpd   xmm0,xmm0;b2-4ac b2-4ac;  c    -b;  -4     1;
        movmskpd r11d,xmm0
        test     r11,1       ;´ú¸ÕD¬O§_¬°­t¼Æ¡AD=b2-4ac
        jz       pos
        lea      rcx,szErr3
        jmp      error
pos:    addsd    xmm2,xmm2;  D      D;  c    -b;  -4     2;
        sqrtpd   xmm0,xmm0; ¡ÔD    ¡ÔD;  c    -b;  -4     2;
        mulsd    xmm2,a; ¡ÔD    ¡ÔD;  c    -b;  -4     2a;
        unpcklpd xmm1,xmm1; ¡ÔD    ¡ÔD; -b    -b;  -4     2a;
        unpcklpd xmm2,xmm2; ¡ÔD    ¡ÔD; -b    -b;  2a     2a;
        addsubpd xmm1,xmm0; ¡ÔD    ¡ÔD;-b+¡ÔD -b-¡ÔD;  2a     2a;
        divpd    xmm1,xmm2; ¡ÔD    ¡ÔD;  x1    x2;  2a     2a;
        movapd   x1,xmm1
        invoke  printf,ADDR szFmt2,x1,x2
exit:   invoke  ExitProcess,0
main    ENDP
;********************************************************************
END

»¡©ú

¤@¤¸¤G¦¸¤èµ{¦¡«üªº¬O¹³ x2+bx+c=0 ªº¤èµ{¦¡¡A¦³¤T­Ó«Y¼Æ¡C·í FP3 Åý¨Ï¥ÎªÌ¿é¤J§¹¦¨¤§«á¡A¦b²Ä 31 ¦æÀˬd scanf ¬O§_¯uªºÅª¨ú¨ì¤T­Ó¼Æ­È¡C¤G¦¸¤èµ{¦¡ÁÙ¦³­Ó±ø¥ó¡Ax2 ªº«Y¼Æ¤£¥i¬O¹s¡A©Ò¥H FP3 ¦b²Ä 35 ¦æÀˬd a ¬O§_¬°¹s¡C¥u¦³³q¹L³o¨â¶µÀËÅç¡A¤~¯àÄ~Äò°õ¦æµ{¦¡¡A§_«h°h¥Xµ{¦¡¡C

¤@¤¸¤G¦¸¤èµ{¦¡ªº¨â­Ó®Ú¤À§O¬O x=¡Ðb¡Ï¡Ôb2¡Ð4ac 2a¡B ¡Ðb¡Ð¡Ôb2¡Ð4ac 2a¡A¥J²ÓÆ[¹î¡A·|µo²{­pºâ³o¨â­Ó®Úªº¹Lµ{¤¤¡A¦³¨â¼Ë¯SÂI¡G¤@¬O¦³¶i¦æ¥­¤è®Úªº¹Bºâ¡A©Ò¥H¦b¶}®Ú¸¹«e¡AÀ³¸Ó­nÀˬd§P§O¦¡¡Ab2¡Ð4ac¡A¬O§_¬°­t¼Æ¡A¦pªG¬O­t¼Æ¥Nªí¡u¨S¦³¹ê¼Æ¸Ñ¡v¡A¦L¥X³o°T®§«á°h¥Xµ{¦¡¡C¤G¬O¡A³o¨â­Ó®Úªº­pºâ¤è¦¡«D±`¬Û¹³¡A®t§O¦b©ó®Ú¸¹«e¤è¤@­Ó¬O¥[¡B¤@­Ó¬O´î¡C

¦]¬°¦³²Ä¤G­Ó¯SÂI¡A©Ò¥H¦b¶}¤è¤§«e¡A¥u»Ý­pºâ§P§O¦¡¤@¦¸§Y¥i¡C°²¦p§Ú­Ì¦A¥J²Ó¤ÀªR§P§O¦¡¡A§A·|µo²{ b2 ¬O¤@¦¸­¼ªk¡A4ac ¬O¨â¦¸­¼ªk¡A§Q¥Î SSE «ü¥Oªº¯S©Ê¡A¶È°õ¦æ MULPD ¤@¦¸¡A¦Ó­pºâ¨â­Ó­¼ªk¹Bºâ¡C­n¹F¨ì³o­Ó¥Øªº¡A¥²¶·­«½Æ¸ü¤J b ¦Ü XMM ¼È¦s¾¹¡C¦]¦¹¦b²Ä 41¡ã42 ¦æ½Æ»s b ¨ì b_p ÅܼÆùØ¡AµM«á¦b²Ä 9¡ã12 ¦æ¨Ì·Ó b¡Ba¡Bb_p¡Bc ªº±Æ¦C¡A°õ¦æ¨â¦¸ MOVAPD ´N¥i¥H¸ü¤J¥|­ÓÂùºë½T«×¯BÂI¼Æ¡]°õ¦æ²Ä¤T¦¸ MOVAPD ¬O¬°¤F­pºâ¤À¥Àªº 2a »P ¡Ð4ac¡C±µ¤U¨Ó²Ä 45¡ã46 ¦æ¡^¡CµM«á°õ¦æ¨â¦¸ MULPD¡A´N¯à­pºâ¥X b2¡B¡Ð4ac¡C

²Ä 48 ¦æªº¡uHADDPD XMM0,XMM0¡v¡A¬O«Ü¦³½ìªº«ü¥O¡C¨£¥k¹Ï¥ª¤W¨¤ªº XMM0 ¼È¦s¾¹¡]¥¦¥Nªí¥Øªº¹Bºâ¤¸¡^ªº§C¥b³¡¡AHADDPD §â±N¥¦»P°ª¥b³¡¬Û¥[¡]µµ½u¡^¡A¦s¤J§C¥b³¡¡]¬õ½u¡^¡A©ó¬O XMM0 §C¥b³¡Åܬ° b2¡Ð4ac¡F¦b¦P¤@®É¶¡¡A¥ª¤U¨¤ªº XMM0¡]ªí¥Ü¨Ó·½¹Bºâ¤¸¡^§C¥b³¡»P¥¦ªº°ª¥b³¡¬Û¥[¡]¾í¦â½u¡^¡A¦A¦s¤J¥Øªº¹Bºâ¤¸ªº°ª¥b³¡¡]´Ä½u¡^¡C¤p¤ì°¸»¡¥¦¦³½ì¡A¬O¦]¬°°õ¦æ§¹«á¡AXMM0 °ª¥b³¡»P§C¥b³¡³£Åܦ¨§P§O¦¡¡A¤]´N¬O b2¡Ð4ac¡C

§PÂ_ XMM0 ªº§P§O¦¡¬O¥¿¼ÆÁÙ¬O­t¼Æ¡A¥i¥H¥Î MOVMSKPD¡A¥¦·|§â XMM0 ªº²Å¸¹¦ì¤¸¡A¦s©ó³q¥Î¼È¦s¾¹¡C³o¨àªº³q¥Î¼È¦s¾¹¥i¥H¬O 32 ¦ì¤¸©Î 64 ¦ì¤¸¡A¥B¥i¥H¥ô·N¿ï¾Ü¡A¤p¤ì°¸³o¨à¥Î R11¡C¦]¬°¤w¸g¸g¹L¡uHADDPD XMM0,XMM0¡v³B²z¤F¡A©Ò¥H°ª¥b³¡©Î§C¥b³¡¬Û¦P¡A¥u»ÝÀˬd¨ä¤¤¤@­Ó§Y¥i¡C

¦pªG§P§O¦¡¬°­t­È¡A¨º»ò²Å¸¹¦ì¤¸¬°¤@¡AR11 ·|Åܦ¨ 0011b¡]³o¬O¤G¶i¦ì¡^¡C¥Î¡uTEST R11,1¡vÀˬd«á¡A¹s­ÈºX¼Ð¤£¬°¹s¡A¦L¥X¡u¨S¦³¹ê¼Æ¸Ñ¡vªº°T®§«á¡AÂ÷¶}µ{¦¡¡C¦pªG§P§O¦¡¬°¥¿­È©Î¹s¡A¨º»ò²Å¸¹¦ì¤¸¬°¹s¡AR11 ·|Åܦ¨ 0000b¡]³o¬O¤G¶i¦ì¡^¡C¥Î¡uTEST R11,1¡vÀˬd«á¡A¹s­ÈºX¼Ð¬°¹s¡A¸õÅD¦Ü pos: ³BÄ~Äò°õ¦æ¡C

±µ¤U¨Ó¡A¨Ï XMM1 §C¥b³¡Åܸ¹¡A»s³y¥X¡Ðb¡]²Ä 47 ¦æ¡^¡F¦b XMM2 §C¥b³¡»s³y¥X 2a¡]²Ä 54¡B56 ¦æ¡^¡B­pºâ¡ÔD¡]²Ä 55 ¦æ¡^¡C±µ¤U¨Óªº²Ä 57¡B58 ¦æ¡A°õ¦æ UNPCKPD¡A¤À§O§â XMM1¡BXMM2 ªº§C¥b³¡¦U¦Û½Æ»s¨ì°ª¥b³¡¡C

±µµÛªº²Ä 59 ¦æ¡AADDSUBPD ¤]¬O­Ó¦³½ìªº«ü¥O¡C¥¦¤@­Ó«ü¥O¦P®É§â§C¥b³¡¬Û´î¡B°ª¥b³¡¬Û¥[¡C³o«D±`²Å¦X§Ú­Ì»Ý­nªº¡C´N¬O«e­±´£¹L®Ú¸¹«e¤è¤@­Ó¬O¥[¡B¤@­Ó¬O´î¡C±µµÛªº¬O²Ä 60 ¦æ¡ADIVPD¡A¥¦¬O¤@­Ó«ü¥O¶i¦æ¨â¦¸°£ªk¹Bºâ¡C³Ì«á¤èµ{¦¡ªº¨â®Ú¦b XMM1 ªº§C¥b³¡»P°ª¥b³¡¡A°õ¦æ MOVAPD ±N¨ä¦s¤J°O¾ÐÅ餤¡]²Ä 61 ¦æ¡^¡C


«á°O

³o¤@³¹¥»¨Ó¥u¬O·Q¤¶²Ð¦p¦ó³B²z¯BÂI¼Æ¡A«á¨Óµo²{³B²z¯BÂI¼Æ³Ì¤è«Kªº¤èªk¡A³ºµMÁÙ¬O¨Ï¥Î SSE «ü¥O¡A©ó¬O¥G¦h¤¶²Ð¤F³o¨Ç«ü¥O¡C·íµMÅo¡A¶È¶È¤¶²Ð«ü¥O¨S¤°»ò·N¸q¡A©Ò¥H¤S¥[¤W¤F¨â­Ó¨Ò¤l¡C

±q DOS ¶}©l¾Ç²ß²Õ¦X»y¨¥¡A¨ì¯à´x´¤²Õ¦X»y¨¥¼¶¼g Windows À³¥Îµ{¦¡¡A¦bºë¶i²Õ¦X»y¨¥¤è­±¡A¨S¦³§ë¤J§ó¦h¤ß¤O¡A²¦³º Windows ¨t²Î¤Ó½ÆÂø¡A¥i¥H¾Çªºª¾ÃѤӦh¡C³o¦¸¡A¬°¤F³B²z¯BÂI¼Æ¡]¥H«e¬O¥Î x87 «ü¥O³B²z¡^¡A¾Ç²ß¸û¬°¥ý¶iªº SSE/SSE2 «ü¥O¡Aºâ¬Oªø¤Fª¾Ãѧa¡I¡C

ÁÙ¦³¥ó¨Æ¤]­È±o°O¤U¨Ó¡A¨º«K¬O¤H¤u´¼¼z¡C³o¦¸¾Ç²ß SSE/SSE2 «ü¥O¡A´X¥G¾a¤H¤u´¼¼z¡A¤j¬ù¤£¨ì¤@­Ó¬P´Á´N¯à¤Jªù¡C¦b¤H¤u´¼¼z°Ý¥@¤§«á¡A¦pªG§A·Q¾Ç²ß·sª¾ÃÑ¡A«K·|¦³¤@¦ì«Ü¦nªº¦Ñ®v±Ð§A¡A¥¦¡]¥¦¦Û¤v»¡¥¦¨S¦³©Ê§O¡A©Ò¥H¤£¬O¥L¡A¤]¤£¬O¦o¡A¨º¬OÍ¢¶Ü¡H§Ú¤£ª¾¹D¡^³Õ¾Ç¦h»D¡A¥B¹ï¨C¶µ»â°ì³£«Ü±Mºë¡A§ó­«­nªº¬O¡A·¥«×¦³­@¤ß¡C¤£½×§Aªº°ÝÃD¦h¦n¯º¦h·MÄø¡A¥¦¤]¤£·|¼J¯º§A¡A¤Ï¦Ó¬O¤@¨B¤@¨Bªº¸Ô²Ó¸Ñ»¡¡C§â´¤³o­Ó¬ü¦nªº®É¥N¡A§V¤Oºë¶i§a¡I