home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 23 / IOPROG_23.ISO / SOFT / ASM / MMXTASM0.ZIP / MMX.ASH < prev    next >
Encoding:
Text File  |  1998-02-18  |  33.7 KB  |  1,472 lines

  1. ;// MultiMedia eXtention macroes version 0.4 BETA.
  2. ;//   These macroes are identical to those provided by intel for
  3. ;// the MASM assembler except that they are to be used in borland's
  4. ;// ideal mode.
  5.  
  6. ;//   You can use this file under two restrictions:
  7. ;//   - You cannot remove my name or email address from this file.
  8. ;//   - If you see bugs, errors or improvements report them to my email address.
  9.  
  10. ;//In a word, don't steel my work and help make this product a pleasure to work with.
  11.  
  12. ;//     Normand Leclerc(lecn1306@ele.etsmtl.ca)
  13.  
  14. ;//Intel and MMX are registered to Intel corporation.
  15. ;//Turbo Assembler is registered to Borland International.
  16. ;//MASM is registered to Microsoft corporation.
  17.  
  18.  
  19.  
  20. ;// To be compiled with at least 2 passes.
  21. ;// For 32 bits programming, you must define '@32Bit' to 1.
  22. ;// (@32Bit is defined if you use the simplified segmentation syntax)
  23.  
  24. ifndef __MMX__
  25.   display       "including mmx.ash"
  26.   __MMX__=1
  27. endif
  28.  
  29. ifndef @32Bit
  30.   @32Bit        equ 0
  31. endif
  32.  
  33. ;// Data types (don't know if this will be usefull... Hey you never know!)
  34. _packed_bytes           equ     00b     ;// 1122334455667788
  35. _packed_words           equ     01b     ;// 1111222233334444
  36. _packed_doubles         equ     10b     ;// 1111111122222222
  37. _quadwords              equ     11b     ;// 1111111111111111
  38.  
  39.  
  40. ;// MMX opcodes
  41. _opc_emms               equ     77h
  42. _opc_movd_ld            equ     6eh
  43. _opc_movd_st            equ     7eh
  44. _opc_movq_ld            equ     6fh
  45. _opc_movq_st            equ     7fh
  46. _opc_packssdw           equ     6bh
  47. _opc_packsswb           equ     63h
  48. _opc_packuswb           equ     67h
  49. _opc_paddb              equ     0fch
  50. _opc_paddd              equ     0feh
  51. _opc_paddsb             equ     0ech
  52. _opc_paddsw             equ     0edh
  53. _opc_paddusb            equ     0dch
  54. _opc_paddusw            equ     0ddh
  55. _opc_paddw              equ     0fdh
  56. _opc_pand               equ     0dbh
  57. _opc_pandn              equ     0dfh
  58. _opc_pcmpeqb            equ     74h
  59. _opc_pcmpeqd            equ     76h
  60. _opc_pcmpeqw            equ     75h
  61. _opc_pcmpgtb            equ     64h
  62. _opc_pcmpgtd            equ     66h
  63. _opc_pcmpgtw            equ     65h
  64. _opc_pmaddwd            equ     0f5h
  65. _opc_pmulhw             equ     0e5h
  66. _opc_pmullw             equ     0d5h
  67. _opc_por                equ     0ebh
  68. _opc_pshimd             equ     72h
  69. _opc_pshimq             equ     73h
  70. _opc_pshimw             equ     71h
  71. _opc_pslld              equ     0f2h
  72. _opc_psllq              equ     0f3h
  73. _opc_psllw              equ     0f1h
  74. _opc_psrad              equ     0e2h
  75. _opc_psraw              equ     0e1h
  76. _opc_psrld              equ     0d2h
  77. _opc_psrlq              equ     0d3h
  78. _opc_psrlw              equ     0d1h
  79. _opc_psubb              equ     0f8h
  80. _opc_psubd              equ     0fah
  81. _opc_psubsb             equ     0e8h
  82. _opc_psubsw             equ     0e9h
  83. _opc_psubusb            equ     0d8h
  84. _opc_psubusw            equ     0d9h
  85. _opc_psubw              equ     0f9h
  86. _opc_punpckhbw          equ     68h
  87. _opc_punpckhwd          equ     69h
  88. _opc_punpckhdq          equ     6ah
  89. _opc_punpcklbw          equ     60h
  90. _opc_punpcklwd          equ     61h
  91. _opc_punpckldq          equ     62h
  92. _opc_pxor               equ     0efh
  93. _opc_rdpmc              equ     33h
  94.  
  95. ;// MMX registers (condemned text strings mm[0-7])
  96. macro   defineMMxRegs
  97.   if @32Bit eq 0
  98.     mm0                 equ     <ax>
  99.     mm1                 equ     <cx>
  100.     mm2                 equ     <dx>
  101.     mm3                 equ     <bx>
  102.     mm4                 equ     <sp>
  103.     mm5                 equ     <bp>
  104.     mm6                 equ     <si>
  105.     mm7                 equ     <di>
  106. ;// Intel wishes a standard word as a size identifier...  Let's define
  107. ;// it here and use it if we want to... :)
  108.   typedef mmword  word
  109.   else
  110.     mm0                 equ     <eax>
  111.     mm1                 equ     <ecx>
  112.     mm2                 equ     <edx>
  113.     mm3                 equ     <ebx>
  114.     mm4                 equ     <esp>
  115.     mm5                 equ     <ebp>
  116.     mm6                 equ     <esi>
  117.     mm7                 equ     <edi>
  118.   typedef mmword  dword
  119.   endif
  120. endm
  121.  
  122. ;//   I chose to undefine the mm[0-7] registers to prevent weird code
  123. ;// strings like 'mov eax,mm0' or even 'mov ax,mm0'.
  124. macro   undefineMMxRegs
  125.   mm0                   equ     !mm0
  126.   mm1                   equ     !mm1
  127.   mm2                   equ     !mm2
  128.   mm3                   equ     !mm3
  129.   mm4                   equ     !mm4
  130.   mm5                   equ     !mm5
  131.   mm6                   equ     !mm6
  132.   mm7                   equ     !mm7
  133. endm
  134.  
  135. ;// Symbolic types (preprocessor defines)
  136. _prog_pointer           equ     00000001b       ;// program pointer
  137. _data_pointer           equ     00000010b       ;// data pointer
  138. _constant               equ     00000100b       ;// is a constant
  139. _direct_address         equ     00001000b       ;// uses direct access
  140. _reg_used               equ     00010000b       ;// register is used
  141. _symbol_defined         equ     00100000b       ;// symbol is defined
  142. _external               equ     10000000b       ;// externally defined
  143.  
  144.  
  145. ;// This union will greatly simplify our data initialisation.
  146. ;// Everything should be to it's place with this.
  147. union MMxMem
  148.   q                     dq      ?       ;// quadword
  149.   struc                                 ;// doublewords
  150.     d0                  dd      ?
  151.     d1                  dd      ?
  152.   ends
  153.   struc                                 ;// single words
  154.     w0                  dw      ?
  155.     w1                  dw      ?
  156.     w2                  dw      ?
  157.     w3                  dw      ?
  158.   ends
  159.   struc                                 ;// bytes
  160.     b0                  db      ?
  161.     b1                  db      ?
  162.     b2                  db      ?
  163.     b3                  db      ?
  164.     b4                  db      ?
  165.     b5                  db      ?
  166.     b6                  db      ?
  167.     b7                  db      ?
  168.   ends
  169. ends
  170.  
  171.  
  172. ; /////////////////
  173. ;// Instructions //
  174. ;/////////////////
  175.  
  176. ;// EMMS, empty MMX state
  177. macro   emms
  178.     db 0fh,_opc_emms
  179. endm
  180.  
  181. ;// These two (movd and movq) gave me a splitting headache!
  182. ;// They work great tough. :P
  183.  
  184. ;// MOVD, move doubleword
  185. macro   movd dest:req,src:rest
  186.     local pre,post,string,segovr,extnd,increment,temp
  187.  
  188.   defineMMxRegs
  189.   string instr <src>,<mm>
  190.  
  191.   if (string eq 1) and (\
  192.    (symtype src) and _reg_used and \
  193.    not _symbol_defined)                         ;// MMX reg is source
  194.     newreg equ dest
  195.     if (symtype dest) and _reg_used         ;// register operand
  196.      if @32Bit eq 0
  197.        newreg substr <dest>,2
  198.      endif
  199.     endif
  200. pre:    cmpxchg newreg,src
  201. post:   segovr instr <dest>,<:>
  202.     increment=1
  203.     if (segovr gt 0)
  204.       increment=increment+1
  205.     endif
  206.     temp substr <dest>,segovr+1
  207.     if (symtype dest) and _reg_used and _data_pointer ;// register used as pointer
  208.       extnd instr temp,<e>
  209.       if (@32Bit eq 0) and (extnd gt 0)
  210.         increment=increment+1
  211.       endif
  212.     endif
  213.     org pre+increment
  214.     db  _opc_movd_st
  215.     org post
  216.   else                                          ;// MMX reg not source
  217.     if (symtype src) and _reg_used              ;// register operand
  218.     newreg equ src
  219.     if (symtype src) and not _symbol_defined ;// genuine register
  220.       if @32Bit eq 0
  221.         newreg substr <src>,2
  222.       endif
  223.     endif
  224. pre:    cmpxchg newreg,dest
  225.     else                                        ;// memory operand
  226. pre:    cmpxchg dest,src
  227.     endif
  228. post:   segovr instr <src>,<:>
  229.     increment=1
  230.     if (segovr gt 0)
  231.       increment=increment+1
  232.     endif
  233.     temp substr <src>,segovr+1
  234.     if (symtype src) and _reg_used and _data_pointer ;// register used as pointer
  235.       extnd instr temp,<e>
  236.       if (@32Bit eq 0) and (extnd gt 0)
  237.         increment=increment+1
  238.       endif
  239.     endif
  240.     org pre+increment
  241.     db  _opc_movd_ld
  242.     org post
  243.  endif
  244.  undefineMMxRegs
  245.  
  246. endm
  247.  
  248. ;// MOVQ, move quadword
  249. macro   movq dest:req,src:rest
  250.     local pre,post,string,segovr,extnd,increment,temp
  251.  
  252.   defineMMxRegs
  253.   string instr <src>,<mm>
  254.  
  255.   if (string eq 1) and (\
  256.    (symtype src) and _reg_used and \
  257.    not _symbol_defined)                         ;// MMX reg is source
  258. pre:    cmpxchg dest,src
  259. post:   segovr instr <dest>,<:>
  260.     increment=1
  261.     if (segovr gt 0)
  262.       increment=increment+1
  263.     endif
  264.     temp substr <dest>,segovr+1
  265.     if (symtype dest) and _reg_used         ;// register used
  266.       extnd instr temp,<e>
  267.       if (@32Bit eq 0) and (extnd gt 0)
  268.         increment=increment+1
  269.       endif
  270.     endif
  271.     org pre+increment
  272.     db  _opc_movq_st
  273.     org post
  274.   else                                          ;// MMX reg not source
  275.     if (symtype dest) and _reg_used             ;// register operand
  276. pre:    cmpxchg src,dest
  277.     else                                        ;// memory operand
  278. pre:    cmpxchg dest,src
  279.     endif
  280. post:   segovr instr <src>,<:>
  281.     increment=1
  282.     if (segovr gt 0)
  283.       increment=increment+1
  284.     endif
  285.     temp substr <src>,segovr+1
  286.     if (symtype src) and _reg_used          ;// register used
  287.       extnd instr temp,<e>
  288.       if (@32Bit eq 0) and (extnd gt 0)
  289.         increment=increment+1
  290.       endif
  291.     endif
  292.     org pre+increment
  293.     db  _opc_movq_ld
  294.     org post
  295.  endif
  296.  undefineMMxRegs
  297.  
  298. endm
  299.  
  300. ;// PACKSSDW, pack with signed saturation (words)
  301. macro   packssdw dest:req,src:rest
  302.     local pre,post,segovr,extnd,temp
  303.  
  304.   defineMMxRegs
  305. pre:    cmpxchg src,dest
  306. post:   segovr instr <src>,<:>
  307.     increment=1
  308.     if (segovr gt 0)
  309.       increment=increment+1
  310.     endif
  311.     temp substr <src>,segovr+1
  312.     if (symtype src) and _reg_used          ;// register used
  313.       extnd instr temp,<e>
  314.       if (@32Bit eq 0) and (extnd gt 0)
  315.         increment=increment+1
  316.       endif
  317.     endif
  318.     org pre+increment
  319.     db  _opc_packssdw
  320.     org post
  321.  undefineMMxRegs
  322.  
  323. endm
  324.  
  325. ;// PACKSSWB, pack with signed saturation (bytes)
  326. macro   packsswb dest:req,src:rest
  327.     local source,pre,post,segovr,extnd,temp
  328.  
  329.   defineMMxRegs
  330. pre:    cmpxchg src,dest
  331. post:   segovr instr <src>,<:>
  332.     increment=1
  333.     if (segovr gt 0)
  334.       increment=increment+1
  335.     endif
  336.     temp substr <src>,segovr+1
  337.     if (symtype src) and _reg_used          ;// register used
  338.       extnd instr temp,<e>
  339.       if (@32Bit eq 0) and (extnd gt 0)
  340.         increment=increment+1
  341.       endif
  342.     endif
  343.     org pre+increment
  344.     db  _opc_packsswb
  345.     org post
  346.  undefineMMxRegs
  347.  
  348. endm
  349.  
  350. ;// PACKUSWB, pack with unsigned saturation (bytes)
  351. macro   packuswb dest:req,src:rest
  352.     local pre,post,segovr,extnd,temp
  353.  
  354.   defineMMxRegs
  355. pre:    cmpxchg src,dest
  356. post:   segovr instr <src>,<:>
  357.     increment=1
  358.     if (segovr gt 0)
  359.       increment=increment+1
  360.     endif
  361.     temp substr <src>,segovr+1
  362.     if (symtype src) and _reg_used          ;// register used
  363.       extnd instr temp,<e>
  364.       if (@32Bit eq 0) and (extnd gt 0)
  365.         increment=increment+1
  366.       endif
  367.     endif
  368.     org pre+increment
  369.     db  _opc_packuswb
  370.     org post
  371.  undefineMMxRegs
  372.  
  373. endm
  374.  
  375. ;// PADDB, packed add (bytes)
  376. macro   paddb dest:req,src:rest
  377.     local pre,post,segovr,extnd,temp
  378.  
  379.   defineMMxRegs
  380. pre:    cmpxchg src,dest
  381. post:   segovr instr <src>,<:>
  382.     increment=1
  383.     if (segovr gt 0)
  384.       increment=increment+1
  385.     endif
  386.     temp substr <src>,segovr+1
  387.     if (symtype src) and _reg_used          ;// register used
  388.       extnd instr temp,<e>
  389.       if (@32Bit eq 0) and (extnd gt 0)
  390.         increment=increment+1
  391.       endif
  392.     endif
  393.     org pre+increment
  394.     db  _opc_paddb
  395.     org post
  396.  undefineMMxRegs
  397.  
  398. endm
  399.  
  400. ;// PADDD, packed add (dwords)
  401. macro   paddd dest:req,src:rest
  402.     local pre,post,segovr,extnd,temp
  403.  
  404.   defineMMxRegs
  405. pre:    cmpxchg src,dest
  406. post:   segovr instr <src>,<:>
  407.     increment=1
  408.     if (segovr gt 0)
  409.       increment=increment+1
  410.     endif
  411.     temp substr <src>,segovr+1
  412.     if (symtype src) and _reg_used          ;// register used
  413.       extnd instr temp,<e>
  414.       if (@32Bit eq 0) and (extnd gt 0)
  415.         increment=increment+1
  416.       endif
  417.     endif
  418.     org pre+increment
  419.     db  _opc_paddb
  420.     org post
  421.  undefineMMxRegs
  422.  
  423. endm
  424.  
  425. ;// PADDSB, packed add with saturation (bytes)
  426. macro   paddsb dest:req,src:rest
  427.     local pre,post,segovr,extnd,temp
  428.  
  429.   defineMMxRegs
  430. pre:    cmpxchg src,dest
  431. post:   segovr instr <src>,<:>
  432.     increment=1
  433.     if (segovr gt 0)
  434.       increment=increment+1
  435.     endif
  436.     temp substr <src>,segovr+1
  437.     if (symtype src) and _reg_used          ;// register used
  438.       extnd instr temp,<e>
  439.       if (@32Bit eq 0) and (extnd gt 0)
  440.         increment=increment+1
  441.       endif
  442.     endif
  443.     org pre+increment
  444.     db  _opc_paddsb
  445.     org post
  446.  undefineMMxRegs
  447.  
  448. endm
  449.  
  450. ;// PADDSW, packed add with saturation (words)
  451. macro   paddsw dest:req,src:rest
  452.     local pre,post,segovr,extnd,temp
  453.  
  454.   defineMMxRegs
  455. pre:    cmpxchg src,dest
  456. post:   segovr instr <src>,<:>
  457.     increment=1
  458.     if (segovr gt 0)
  459.       increment=increment+1
  460.     endif
  461.     temp substr <src>,segovr+1
  462.     if (symtype src) and _reg_used          ;// register used
  463.       extnd instr temp,<e>
  464.       if (@32Bit eq 0) and (extnd gt 0)
  465.         increment=increment+1
  466.       endif
  467.     endif
  468.     org pre+increment
  469.     db  _opc_paddsw
  470.     org post
  471.  undefineMMxRegs
  472.  
  473. endm
  474.  
  475. ;// PADDUSB, packed add unsigned with saturation (bytes)
  476. macro   paddusb dest:req,src:rest
  477.     local pre,post,segovr,extnd,temp
  478.  
  479.   defineMMxRegs
  480. pre:    cmpxchg src,dest
  481. post:   segovr instr <src>,<:>
  482.     increment=1
  483.     if (segovr gt 0)
  484.       increment=increment+1
  485.     endif
  486.     temp substr <src>,segovr+1
  487.     if (symtype src) and _reg_used          ;// register used
  488.       extnd instr temp,<e>
  489.       if (@32Bit eq 0) and (extnd gt 0)
  490.         increment=increment+1
  491.       endif
  492.     endif
  493.     org pre+increment
  494.     db  _opc_paddusb
  495.     org post
  496.  undefineMMxRegs
  497.  
  498. endm
  499.  
  500. ;// PADDUSW, packed add unsigned with saturation (words)
  501. macro   paddusw dest:req,src:rest
  502.     local pre,post,segovr,extnd,temp
  503.  
  504.   defineMMxRegs
  505. pre:    cmpxchg src,dest
  506. post:   segovr instr <src>,<:>
  507.     increment=1
  508.     if (segovr gt 0)
  509.       increment=increment+1
  510.     endif
  511.     temp substr <src>,segovr+1
  512.     if (symtype src) and _reg_used          ;// register used
  513.       extnd instr temp,<e>
  514.       if (@32Bit eq 0) and (extnd gt 0)
  515.         increment=increment+1
  516.       endif
  517.     endif
  518.     org pre+increment
  519.     db  _opc_paddusw
  520.     org post
  521.  undefineMMxRegs
  522.  
  523. endm
  524.  
  525. ;// PADDW, packed add (words)
  526. macro   paddw dest:req,src:rest
  527.     local pre,post,segovr,extnd,temp
  528.  
  529.   defineMMxRegs
  530. pre:    cmpxchg src,dest
  531. post:   segovr instr <src>,<:>
  532.     increment=1
  533.     if (segovr gt 0)
  534.       increment=increment+1
  535.     endif
  536.     temp substr <src>,segovr+1
  537.     if (symtype src) and _reg_used          ;// register used
  538.       extnd instr temp,<e>
  539.       if (@32Bit eq 0) and (extnd gt 0)
  540.         increment=increment+1
  541.       endif
  542.     endif
  543.     org pre+increment
  544.     db  _opc_paddw
  545.     org post
  546.  undefineMMxRegs
  547.  
  548. endm
  549.  
  550. ;// PAND, bitwise logical and
  551. macro   pand dest:req,src:rest
  552.     local pre,post,segovr,extnd,temp
  553.  
  554.   defineMMxRegs
  555. pre:    cmpxchg src,dest
  556. post:   segovr instr <src>,<:>
  557.     increment=1
  558.     if (segovr gt 0)
  559.       increment=increment+1
  560.     endif
  561.     temp substr <src>,segovr+1
  562.     if (symtype src) and _reg_used          ;// register used
  563.       extnd instr temp,<e>
  564.       if (@32Bit eq 0) and (extnd gt 0)
  565.         increment=increment+1
  566.       endif
  567.     endif
  568.     org pre+increment
  569.     db  _opc_pand
  570.     org post
  571.  undefineMMxRegs
  572.  
  573. endm
  574.  
  575. ;// PANDN, bitwise logical and not
  576. macro   pandn dest:req,src:rest
  577.     local pre,post,segovr,extnd,temp
  578.  
  579.   defineMMxRegs
  580. pre:    cmpxchg src,dest
  581. post:   segovr instr <src>,<:>
  582.     increment=1
  583.     if (segovr gt 0)
  584.       increment=increment+1
  585.     endif
  586.     temp substr <src>,segovr+1
  587.     if (symtype src) and _reg_used          ;// register used
  588.       extnd instr temp,<e>
  589.       if (@32Bit eq 0) and (extnd gt 0)
  590.         increment=increment+1
  591.       endif
  592.     endif
  593.     org pre+increment
  594.     db  _opc_pandn
  595.     org post
  596.  undefineMMxRegs
  597.  
  598. endm
  599.  
  600. ;// PCMPEQB, packed compare for equal (bytes)
  601. macro   pcmpeqb dest:req,src:rest
  602.     local pre,post,segovr,extnd,temp
  603.  
  604.   defineMMxRegs
  605. pre:    cmpxchg src,dest
  606. post:   segovr instr <src>,<:>
  607.     increment=1
  608.     if (segovr gt 0)
  609.       increment=increment+1
  610.     endif
  611.     temp substr <src>,segovr+1
  612.     if (symtype src) and _reg_used          ;// register used
  613.       extnd instr temp,<e>
  614.       if (@32Bit eq 0) and (extnd gt 0)
  615.         increment=increment+1
  616.       endif
  617.     endif
  618.     org pre+increment
  619.     db  _opc_pcmpeqb
  620.     org post
  621.  undefineMMxRegs
  622.  
  623. endm
  624.  
  625. ;// PCMPEQD, packed compare for equal (dwords)
  626. macro   pcmpeqd dest:req,src:rest
  627.     local pre,post,segovr,extnd,temp
  628.  
  629.   defineMMxRegs
  630. pre:    cmpxchg src,dest
  631. post:   segovr instr <src>,<:>
  632.     increment=1
  633.     if (segovr gt 0)
  634.       increment=increment+1
  635.     endif
  636.     temp substr <src>,segovr+1
  637.     if (symtype src) and _reg_used          ;// register used
  638.       extnd instr temp,<e>
  639.       if (@32Bit eq 0) and (extnd gt 0)
  640.         increment=increment+1
  641.       endif
  642.     endif
  643.     org pre+increment
  644.     db  _opc_pcmpeqd
  645.     org post
  646.  undefineMMxRegs
  647.  
  648. endm
  649.  
  650. ;// PCMPEQW, packed compare for equal (words)
  651. macro   pcmpeqw dest:req,src:rest
  652.     local pre,post,segovr,extnd,temp
  653.  
  654.   defineMMxRegs
  655. pre:    cmpxchg src,dest
  656. post:   segovr instr <src>,<:>
  657.     increment=1
  658.     if (segovr gt 0)
  659.       increment=increment+1
  660.     endif
  661.     temp substr <src>,segovr+1
  662.     if (symtype src) and _reg_used          ;// register used
  663.       extnd instr temp,<e>
  664.       if (@32Bit eq 0) and (extnd gt 0)
  665.         increment=increment+1
  666.       endif
  667.     endif
  668.     org pre+increment
  669.     db  _opc_pcmpeqw
  670.     org post
  671.  undefineMMxRegs
  672.  
  673. endm
  674.  
  675. ;// PCMPGTB, packed compare for greater than (bytes)
  676. macro   pcmpeqb dest:req,src:rest
  677.     local pre,post,segovr,extnd,temp
  678.  
  679.   defineMMxRegs
  680. pre:    cmpxchg src,dest
  681. post:   segovr instr <src>,<:>
  682.     increment=1
  683.     if (segovr gt 0)
  684.       increment=increment+1
  685.     endif
  686.     temp substr <src>,segovr+1
  687.     if (symtype src) and _reg_used          ;// register used
  688.       extnd instr temp,<e>
  689.       if (@32Bit eq 0) and (extnd gt 0)
  690.         increment=increment+1
  691.       endif
  692.     endif
  693.     org pre+increment
  694.     db  _opc_pcmpgtb
  695.     org post
  696.  undefineMMxRegs
  697.  
  698. endm
  699.  
  700. ;// PCMGTQD, packed compare for greater than (dwords)
  701. macro   pcmpgtd dest:req,src:rest
  702.     local pre,post,segovr,extnd,temp
  703.  
  704.   defineMMxRegs
  705. pre:    cmpxchg src,dest
  706. post:   segovr instr <src>,<:>
  707.     increment=1
  708.     if (segovr gt 0)
  709.       increment=increment+1
  710.     endif
  711.     temp substr <src>,segovr+1
  712.     if (symtype src) and _reg_used          ;// register used
  713.       extnd instr temp,<e>
  714.       if (@32Bit eq 0) and (extnd gt 0)
  715.         increment=increment+1
  716.       endif
  717.     endif
  718.     org pre+increment
  719.     db  _opc_pcmpgtd
  720.     org post
  721.  undefineMMxRegs
  722.  
  723. endm
  724.  
  725. ;// PCMGTQW, packed compare for greater than (words)
  726. macro   pcmpgtw dest:req,src:rest
  727.     local pre,post,segovr,extnd,temp
  728.  
  729.   defineMMxRegs
  730. pre:    cmpxchg src,dest
  731. post:   segovr instr <src>,<:>
  732.     increment=1
  733.     if (segovr gt 0)
  734.       increment=increment+1
  735.     endif
  736.     temp substr <src>,segovr+1
  737.     if (symtype src) and _reg_used          ;// register used
  738.       extnd instr temp,<e>
  739.       if (@32Bit eq 0) and (extnd gt 0)
  740.         increment=increment+1
  741.       endif
  742.     endif
  743.     org pre+increment
  744.     db  _opc_pcmpgtw
  745.     org post
  746.  undefineMMxRegs
  747.  
  748. endm
  749.  
  750. ;// PMADDWD, packed multiply and add (dwords)
  751. macro   pmaddwd dest:req,src:rest
  752.     local pre,post,segovr,extnd,temp
  753.  
  754.   defineMMxRegs
  755. pre:    cmpxchg src,dest
  756. post:   segovr instr <src>,<:>
  757.     increment=1
  758.     if (segovr gt 0)
  759.       increment=increment+1
  760.     endif
  761.     temp substr <src>,segovr+1
  762.     if (symtype src) and _reg_used          ;// register used
  763.       extnd instr temp,<e>
  764.       if (@32Bit eq 0) and (extnd gt 0)
  765.         increment=increment+1
  766.       endif
  767.     endif
  768.     org pre+increment
  769.     db  _opc_pmaddwd
  770.     org post
  771.  undefineMMxRegs
  772.  
  773. endm
  774.  
  775. ;// PMULHW, packed multiply high (words)
  776. macro   pmulhw dest:req,src:rest
  777.     local pre,post,segovr,extnd,temp
  778.  
  779.   defineMMxRegs
  780. pre:    cmpxchg src,dest
  781. post:   segovr instr <src>,<:>
  782.     increment=1
  783.     if (segovr gt 0)
  784.       increment=increment+1
  785.     endif
  786.     temp substr <src>,segovr+1
  787.     if (symtype src) and _reg_used          ;// register used
  788.       extnd instr temp,<e>
  789.       if (@32Bit eq 0) and (extnd gt 0)
  790.         increment=increment+1
  791.       endif
  792.     endif
  793.     org pre+increment
  794.     db  _opc_pmulhw
  795.     org post
  796.  undefineMMxRegs
  797.  
  798. endm
  799.  
  800. ;// PMULLW, packed multiply low (words)
  801. macro   pmullw dest:req,src:rest
  802.     local pre,post,segovr,extnd,temp
  803.  
  804.   defineMMxRegs
  805. pre:    cmpxchg src,dest
  806. post:   segovr instr <src>,<:>
  807.     increment=1
  808.     if (segovr gt 0)
  809.       increment=increment+1
  810.     endif
  811.     temp substr <src>,segovr+1
  812.     if (symtype src) and _reg_used          ;// register used
  813.       extnd instr temp,<e>
  814.       if (@32Bit eq 0) and (extnd gt 0)
  815.         increment=increment+1
  816.       endif
  817.     endif
  818.     org pre+increment
  819.     db  _opc_pmullw
  820.     org post
  821.  undefineMMxRegs
  822.  
  823. endm
  824.  
  825. ;// POR, bitwise logical or
  826. macro   por dest:req,src:rest
  827.     local pre,post,segovr,extnd,temp
  828.  
  829.   defineMMxRegs
  830. pre:    cmpxchg src,dest
  831. post:   segovr instr <src>,<:>
  832.     increment=1
  833.     if (segovr gt 0)
  834.       increment=increment+1
  835.     endif
  836.     temp substr <src>,segovr+1
  837.     if (symtype src) and _reg_used          ;// register used
  838.       extnd instr temp,<e>
  839.       if (@32Bit eq 0) and (extnd gt 0)
  840.         increment=increment+1
  841.       endif
  842.     endif
  843.     org pre+increment
  844.     db  _opc_por
  845.     org post
  846.  undefineMMxRegs
  847.  
  848. endm
  849.  
  850. ;// PSLLD, packed shift left logical (dwords)
  851. macro   pslld dest:req,src:rest
  852.     local pre,post,segovr,extnd,temp
  853.  
  854.   defineMMxRegs
  855. pre:
  856.     if ((symtype src) xor (\
  857.      _constant or _symbol_defined)) eq 0    ;// constant
  858.       btr dest,src
  859. post:     org pre+1
  860.       db  _opc_pshimd
  861.     else
  862.       cmpxchg src,dest
  863. post:     segovr instr <src>,<:>
  864.       increment=1
  865.       if (segovr gt 0)
  866.         increment=increment+1
  867.       endif
  868.       temp substr <src>,segovr+1
  869.       if (symtype src) and _reg_used        ;// register used
  870.         extnd instr temp,<e>
  871.         if (@32Bit eq 0) and (extnd gt 0)
  872.           increment=increment+1
  873.         endif
  874.       endif
  875.       org pre+increment
  876.       db  _opc_pslld
  877.     endif
  878.     org post
  879.  undefineMMxRegs
  880.  
  881. endm
  882.  
  883. ;// PSLLQ, packed shift left logical (quadwords)
  884. macro   psllq dest:req,src:rest
  885.     local pre,post,segovr,extnd,temp
  886.  
  887.   defineMMxRegs
  888. pre:
  889.     if ((symtype src) xor (\
  890.      _constant or _symbol_defined)) eq 0    ;// constant
  891.       btr dest,src
  892. post:     org pre+1
  893.       db  _opc_pshimq
  894.     else
  895.       cmpxchg src,dest
  896. post:     segovr instr <src>,<:>
  897.       increment=1
  898.       if (segovr gt 0)
  899.         increment=increment+1
  900.       endif
  901.       temp substr <src>,segovr+1
  902.       if (symtype src) and _reg_used        ;// register used
  903.         extnd instr temp,<e>
  904.         if (@32Bit eq 0) and (extnd gt 0)
  905.           increment=increment+1
  906.         endif
  907.       endif
  908.       org pre+increment
  909.       db  _opc_psllq
  910.     endif
  911.     org post
  912.  undefineMMxRegs
  913.  
  914. endm
  915.  
  916. ;// PSLLW, packed shift left logical (words)
  917. macro   psllw dest:req,src:rest
  918.     local pre,post,segovr,extnd,temp
  919.  
  920.   defineMMxRegs
  921. pre:
  922.     if ((symtype src) xor (\
  923.      _constant or _symbol_defined)) eq 0    ;// constant
  924.       btr dest,src
  925. post:     org pre+1
  926.       db  _opc_pshimw
  927.     else
  928.       cmpxchg src,dest
  929. post:     segovr instr <src>,<:>
  930.       increment=1
  931.       if (segovr gt 0)
  932.         increment=increment+1
  933.       endif
  934.       temp substr <src>,segovr+1
  935.       if (symtype src) and _reg_used        ;// register used
  936.         extnd instr temp,<e>
  937.         if (@32Bit eq 0) and (extnd gt 0)
  938.           increment=increment+1
  939.         endif
  940.       endif
  941.       org pre+increment
  942.       db  _opc_psllw
  943.     endif
  944.     org post
  945.  undefineMMxRegs
  946.  
  947. endm
  948.  
  949. ;// PSRAD, packed shift right arithmetic (dwords)
  950. macro   psrad dest:req,src:rest
  951.     local pre,post,segovr,extnd,temp
  952.  
  953.   defineMMxRegs
  954. pre:
  955.     if ((symtype src) xor (\
  956.      _constant or _symbol_defined)) eq 0    ;// constant
  957.       bt dest,src
  958. post:     org pre+1
  959.       db  _opc_pshimd
  960.     else
  961.       cmpxchg src,dest
  962. post:     segovr instr <src>,<:>
  963.       increment=1
  964.       if (segovr gt 0)
  965.         increment=increment+1
  966.       endif
  967.       temp substr <src>,segovr+1
  968.       if (symtype src) and _reg_used        ;// register used
  969.         extnd instr temp,<e>
  970.         if (@32Bit eq 0) and (extnd gt 0)
  971.           increment=increment+1
  972.         endif
  973.       endif
  974.       org pre+increment
  975.         db  _opc_psrad
  976.     endif
  977.     org post
  978.  undefineMMxRegs
  979.  
  980. endm
  981.  
  982. ;// PSRAW, packed shift right arithmetic (words)
  983. macro   psraw dest:req,src:rest
  984.     local pre,post,segovr,extnd,temp
  985.  
  986.   defineMMxRegs
  987. pre:
  988.     if ((symtype src) xor (\
  989.      _constant or _symbol_defined)) eq 0    ;// constant
  990.       bt dest,src
  991. post:     org pre+1
  992.       db  _opc_pshimw
  993.     else
  994.       cmpxchg src,dest
  995. post:     segovr instr <src>,<:>
  996.       increment=1
  997.       if (segovr gt 0)
  998.         increment=increment+1
  999.       endif
  1000.       temp substr <src>,segovr+1
  1001.       if (symtype src) and _reg_used        ;// register used
  1002.         extnd instr temp,<e>
  1003.         if (@32Bit eq 0) and (extnd gt 0)
  1004.           increment=increment+1
  1005.         endif
  1006.       endif
  1007.       org pre+increment
  1008.       db  _opc_psraw
  1009.     endif
  1010.     org post
  1011.  undefineMMxRegs
  1012.  
  1013. endm
  1014.  
  1015. ;// PSRLD, packed shift right logical (dwords)
  1016. macro   psrld dest:req,src:rest
  1017.     local pre,post,segovr,extnd,temp
  1018.  
  1019.   defineMMxRegs
  1020. pre:
  1021.     if ((symtype src) xor (\
  1022.      _constant or _symbol_defined)) eq 0    ;// constant
  1023.       cmpxchg dest,mm2
  1024.       db src
  1025. post:     org pre+1
  1026.       db  _opc_pshimd
  1027.     else
  1028.       cmpxchg src,dest
  1029. post:     segovr instr <src>,<:>
  1030.       increment=1
  1031.       if (segovr gt 0)
  1032.         increment=increment+1
  1033.       endif
  1034.       temp substr <src>,segovr+1
  1035.       if (symtype src) and _reg_used        ;// register used
  1036.         extnd instr temp,<e>
  1037.         if (@32Bit eq 0) and (extnd gt 0)
  1038.           increment=increment+1
  1039.         endif
  1040.       endif
  1041.       org pre+increment
  1042.       db  _opc_psrld
  1043.     endif
  1044.     org post
  1045.  undefineMMxRegs
  1046.  
  1047. endm
  1048.  
  1049. ;// PSRLQ, packed shift right logical (quadwords)
  1050. macro   psrlq dest:req,src:rest
  1051.     local pre,post,segovr,extnd,temp
  1052.  
  1053.   defineMMxRegs
  1054. pre:
  1055.     if ((symtype src) xor (\
  1056.      _constant or _symbol_defined)) eq 0    ;// constant
  1057.       cmpxchg dest,mm2
  1058.       db src
  1059. post:     org pre+1
  1060.       db  _opc_pshimq
  1061.     else
  1062.       cmpxchg src,dest
  1063. post:     segovr instr <src>,<:>
  1064.       increment=1
  1065.       if (segovr gt 0)
  1066.         increment=increment+1
  1067.       endif
  1068.       temp substr <src>,segovr+1
  1069.       if (symtype src) and _reg_used        ;// register used
  1070.         extnd instr temp,<e>
  1071.         if (@32Bit eq 0) and (extnd gt 0)
  1072.           increment=increment+1
  1073.         endif
  1074.       endif
  1075.       org pre+increment
  1076.       db  _opc_psrlq
  1077.     endif
  1078.     org post
  1079.  undefineMMxRegs
  1080.  
  1081. endm
  1082.  
  1083. ;// PSRLW, packed shift right logical (words)
  1084. macro   psrlw dest:req,src:rest
  1085.     local pre,post,segovr,extnd,temp
  1086.  
  1087.   defineMMxRegs
  1088. pre:
  1089.     if ((symtype src) xor (\
  1090.      _constant or _symbol_defined)) eq 0    ;// constant
  1091.       cmpxchg dest,mm2
  1092.       db src
  1093. post:     org pre+1
  1094.       db  _opc_pshimw
  1095.     else
  1096.       cmpxchg src,dest
  1097. post:     segovr instr <src>,<:>
  1098.       increment=1
  1099.       if (segovr gt 0)
  1100.         increment=increment+1
  1101.       endif
  1102.       temp substr <src>,segovr+1
  1103.       if (symtype src) and _reg_used        ;// register used
  1104.         extnd instr temp,<e>
  1105.         if (@32Bit eq 0) and (extnd gt 0)
  1106.           increment=increment+1
  1107.         endif
  1108.       endif
  1109.       org pre+increment
  1110.       db  _opc_psrlw
  1111.     endif
  1112.     org post
  1113.  undefineMMxRegs
  1114.  
  1115. endm
  1116.  
  1117. ;// PSUBB, packet substract (bytes)
  1118. macro   psubb dest:req,src:rest
  1119.     local pre,post,segovr,extnd,temp
  1120.  
  1121.   defineMMxRegs
  1122. pre:    cmpxchg src,dest
  1123. post:   segovr instr <src>,<:>
  1124.     increment=1
  1125.     if (segovr gt 0)
  1126.       increment=increment+1
  1127.     endif
  1128.     temp substr <src>,segovr+1
  1129.     if (symtype src) and _reg_used          ;// register used
  1130.       extnd instr temp,<e>
  1131.       if (@32Bit eq 0) and (extnd gt 0)
  1132.         increment=increment+1
  1133.       endif
  1134.     endif
  1135.     org pre+increment
  1136.     db  _opc_psubb
  1137.     org post
  1138.  undefineMMxRegs
  1139.  
  1140. endm
  1141.  
  1142. ;// PSUBD, packet substract (dwords)
  1143. macro   psubd dest:req,src:rest
  1144.     local pre,post,segovr,extnd,temp
  1145.  
  1146.   defineMMxRegs
  1147. pre:    cmpxchg src,dest
  1148. post:   segovr instr <src>,<:>
  1149.     increment=1
  1150.     if (segovr gt 0)
  1151.       increment=increment+1
  1152.     endif
  1153.     temp substr <src>,segovr+1
  1154.     if (symtype src) and _reg_used          ;// register used
  1155.       extnd instr temp,<e>
  1156.       if (@32Bit eq 0) and (extnd gt 0)
  1157.         increment=increment+1
  1158.       endif
  1159.     endif
  1160.     org pre+increment
  1161.     db  _opc_psubd
  1162.     org post
  1163.  undefineMMxRegs
  1164.  
  1165. endm
  1166.  
  1167. ;// PSUBSB, packet substract with saturation (bytes)
  1168. macro   psubsb dest:req,src:rest
  1169.     local pre,post,segovr,extnd,temp
  1170.  
  1171.   defineMMxRegs
  1172. pre:    cmpxchg src,dest
  1173. post:   segovr instr <src>,<:>
  1174.     increment=1
  1175.     if (segovr gt 0)
  1176.       increment=increment+1
  1177.     endif
  1178.     temp substr <src>,segovr+1
  1179.     if (symtype src) and _reg_used          ;// register used
  1180.       extnd instr temp,<e>
  1181.       if (@32Bit eq 0) and (extnd gt 0)
  1182.         increment=increment+1
  1183.       endif
  1184.     endif
  1185.     org pre+increment
  1186.     db  _opc_psubsb
  1187.     org post
  1188.  undefineMMxRegs
  1189.  
  1190. endm
  1191.  
  1192. ;// PSUBSW, packet substract with saturation (words)
  1193. macro   psubsw dest:req,src:rest
  1194.     local pre,post,segovr,extnd,temp
  1195.  
  1196.   defineMMxRegs
  1197. pre:    cmpxchg src,dest
  1198. post:   segovr instr <src>,<:>
  1199.     increment=1
  1200.     if (segovr gt 0)
  1201.       increment=increment+1
  1202.     endif
  1203.     temp substr <src>,segovr+1
  1204.     if (symtype src) and _reg_used          ;// register used
  1205.       extnd instr temp,<e>
  1206.       if (@32Bit eq 0) and (extnd gt 0)
  1207.         increment=increment+1
  1208.       endif
  1209.     endif
  1210.     org pre+increment
  1211.     db  _opc_psubsw
  1212.     org post
  1213.  undefineMMxRegs
  1214.  
  1215. endm
  1216.  
  1217. ;// PSUBUSB, packet substract unsigned with saturation (bytes)
  1218. macro   psubusb dest:req,src:rest
  1219.     local pre,post,segovr,extnd,temp
  1220.  
  1221.   defineMMxRegs
  1222. pre:    cmpxchg src,dest
  1223. post:   segovr instr <src>,<:>
  1224.     increment=1
  1225.     if (segovr gt 0)
  1226.       increment=increment+1
  1227.     endif
  1228.     temp substr <src>,segovr+1
  1229.     if (symtype src) and _reg_used          ;// register used
  1230.       extnd instr temp,<e>
  1231.       if (@32Bit eq 0) and (extnd gt 0)
  1232.         increment=increment+1
  1233.       endif
  1234.     endif
  1235.     org pre+increment
  1236.     db  _opc_psubusb
  1237.     org post
  1238.  undefineMMxRegs
  1239.  
  1240. endm
  1241.  
  1242. ;// PSUBUSW, packet substract unsigned with saturation (words)
  1243. macro   psubusw dest:req,src:rest
  1244.     local pre,post,segovr,extnd,temp
  1245.  
  1246.   defineMMxRegs
  1247. pre:    cmpxchg src,dest
  1248. post:   segovr instr <src>,<:>
  1249.     increment=1
  1250.     if (segovr gt 0)
  1251.       increment=increment+1
  1252.     endif
  1253.     temp substr <src>,segovr+1
  1254.     if (symtype src) and _reg_used          ;// register used
  1255.       extnd instr temp,<e>
  1256.       if (@32Bit eq 0) and (extnd gt 0)
  1257.         increment=increment+1
  1258.       endif
  1259.     endif
  1260.     org pre+increment
  1261.     db  _opc_psubusw
  1262.     org post
  1263.  undefineMMxRegs
  1264.  
  1265. endm
  1266.  
  1267. ;// PSUBW, packet substract (words)
  1268. macro   psubw dest:req,src:rest
  1269.     local pre,post,segovr,extnd,temp
  1270.  
  1271.   defineMMxRegs
  1272. pre:    cmpxchg src,dest
  1273. post:   segovr instr <src>,<:>
  1274.     increment=1
  1275.     if (segovr gt 0)
  1276.       increment=increment+1
  1277.     endif
  1278.     temp substr <src>,segovr+1
  1279.     if (symtype src) and _reg_used          ;// register used
  1280.       extnd instr temp,<e>
  1281.       if (@32Bit eq 0) and (extnd gt 0)
  1282.         increment=increment+1
  1283.       endif
  1284.     endif
  1285.     org pre+increment
  1286.     db  _opc_psubw
  1287.     org post
  1288.  undefineMMxRegs
  1289.  
  1290. endm
  1291.  
  1292. ;// PUNPCKHBW, Unpack high packed data (words)
  1293. macro   punpckhbw dest:req,src:rest
  1294.     local pre,post,segovr,extnd,temp
  1295.  
  1296.   defineMMxRegs
  1297. pre:    cmpxchg src,dest
  1298. post:   segovr instr <src>,<:>
  1299.     increment=1
  1300.     if (segovr gt 0)
  1301.       increment=increment+1
  1302.     endif
  1303.     temp substr <src>,segovr+1
  1304.     if (symtype src) and _reg_used          ;// register used
  1305.       extnd instr temp,<e>
  1306.       if (@32Bit eq 0) and (extnd gt 0)
  1307.         increment=increment+1
  1308.       endif
  1309.     endif
  1310.     org pre+increment
  1311.     db  _opc_punpckhbw
  1312.     org post
  1313.  undefineMMxRegs
  1314.  
  1315. endm
  1316.  
  1317. ;// PUNPCKHDQ, Unpack high packed data (quadwords)
  1318. macro   punpckhdq dest:req,src:rest
  1319.     local pre,post,segovr,extnd,temp
  1320.  
  1321.   defineMMxRegs
  1322. pre:    cmpxchg src,dest
  1323. post:   segovr instr <src>,<:>
  1324.     increment=1
  1325.     if (segovr gt 0)
  1326.       increment=increment+1
  1327.     endif
  1328.     temp substr <src>,segovr+1
  1329.     if (symtype src) and _reg_used          ;// register used
  1330.       extnd instr temp,<e>
  1331.       if (@32Bit eq 0) and (extnd gt 0)
  1332.         increment=increment+1
  1333.       endif
  1334.     endif
  1335.     org pre+increment
  1336.     db  _opc_punpckhdq
  1337.     org post
  1338.  undefineMMxRegs
  1339.  
  1340. endm
  1341.  
  1342. ;// PUNPCKHWD, Unpack high packed data (dwords)
  1343. macro   punpckhwd dest:req,src:rest
  1344.     local pre,post,segovr,extnd,temp
  1345.  
  1346.   defineMMxRegs
  1347. pre:    cmpxchg src,dest
  1348. post:   segovr instr <src>,<:>
  1349.     increment=1
  1350.     if (segovr gt 0)
  1351.       increment=increment+1
  1352.     endif
  1353.     temp substr <src>,segovr+1
  1354.     if (symtype src) and _reg_used          ;// register used
  1355.       extnd instr temp,<e>
  1356.       if (@32Bit eq 0) and (extnd gt 0)
  1357.         increment=increment+1
  1358.       endif
  1359.     endif
  1360.     org pre+increment
  1361.     db  _opc_punpckhwd
  1362.     org post
  1363.  undefineMMxRegs
  1364.  
  1365. endm
  1366.  
  1367. ;// PUNPCKLBW, Unpack low packed data (words)
  1368. macro   punpcklbw dest:req,src:rest
  1369.     local pre,post,segovr,extnd,temp
  1370.  
  1371.   defineMMxRegs
  1372. pre:    cmpxchg src,dest
  1373. post:   segovr instr <src>,<:>
  1374.     increment=1
  1375.     if (segovr gt 0)
  1376.       increment=increment+1
  1377.     endif
  1378.     temp substr <src>,segovr+1
  1379.     if (symtype src) and _reg_used          ;// register used
  1380.       extnd instr temp,<e>
  1381.       if (@32Bit eq 0) and (extnd gt 0)
  1382.         increment=increment+1
  1383.       endif
  1384.     endif
  1385.     org pre+increment
  1386.     db  _opc_punpcklbw
  1387.     org post
  1388.  undefineMMxRegs
  1389.  
  1390. endm
  1391.  
  1392. ;// PUNPCKLDQ, Unpack low packed data (quadwords)
  1393. macro   punpckldq dest:req,src:rest
  1394.     local pre,post,segovr,extnd,temp
  1395.  
  1396.   defineMMxRegs
  1397. pre:    cmpxchg src,dest
  1398. post:   segovr instr <src>,<:>
  1399.     increment=1
  1400.     if (segovr gt 0)
  1401.       increment=increment+1
  1402.     endif
  1403.     temp substr <src>,segovr+1
  1404.     if (symtype src) and _reg_used          ;// register used
  1405.       extnd instr temp,<e>
  1406.       if (@32Bit eq 0) and (extnd gt 0)
  1407.         increment=increment+1
  1408.       endif
  1409.     endif
  1410.     org pre+increment
  1411.     db  _opc_punpckldq
  1412.     org post
  1413.  undefineMMxRegs
  1414.  
  1415. endm
  1416.  
  1417. ;// PUNPCKLWD, Unpack low packed data (dwords)
  1418. macro   punpcklwd dest:req,src:rest
  1419.     local pre,post,segovr,extnd
  1420.  
  1421.   defineMMxRegs
  1422. pre:    cmpxchg src,dest
  1423. post:   segovr instr <src>,<:>
  1424.     increment=1
  1425.     if (segovr gt 0)
  1426.       increment=increment+1
  1427.     endif
  1428.     temp substr <src>,segovr+1
  1429.     if (symtype src) and _reg_used          ;// register used
  1430.       extnd instr temp,<e>
  1431.       if (@32Bit eq 0) and (extnd gt 0)
  1432.         increment=increment+1
  1433.       endif
  1434.     endif
  1435.     org pre+increment
  1436.     db  _opc_punpcklwd
  1437.     org post
  1438.  undefineMMxRegs
  1439.  
  1440. endm
  1441.  
  1442. ;// PXOR, bitwise logical exclusive or
  1443. macro   pxor dest:req,src:rest
  1444.     local pre,post,segovr,extnd,temp
  1445.  
  1446.   defineMMxRegs
  1447. pre:    cmpxchg src,dest
  1448. post:   segovr instr <src>,<:>
  1449.     increment=1
  1450.     if (segovr gt 0)
  1451.       increment=increment+1
  1452.     endif
  1453.     temp substr <src>,segovr+1
  1454.     if (symtype src) and _reg_used          ;// register used
  1455.       extnd instr temp,<e>
  1456.       if (@32Bit eq 0) and (extnd gt 0)
  1457.         increment=increment+1
  1458.       endif
  1459.     endif
  1460.     org pre+increment
  1461.     db  _opc_pxor
  1462.     org post
  1463.  undefineMMxRegs
  1464.  
  1465. endm
  1466.  
  1467. ;// RDPMC, read performance monitoring counter
  1468. macro   rdpmc
  1469.     db 0fh,_opc_rdpmc
  1470. endm
  1471.  
  1472.