root/trunk/docsrc/iasm.dd

Revision 1415, 21.1 kB (checked in by walter, 2 years ago)

minor changes

  • Property svn:eol-style set to native
Line 
1 Ddoc
2
3 $(SPEC_S D x86 Inline Assembler,
4
5     <a href="http://www.digitalmars.com/gift/index.html" title="Gift Shop" target="_top">
6     <img src="d5.gif" border=0 align=right alt="Some Assembly Required" width=284 height=186>
7     </a>
8
9     $(P D, being a systems programming language, provides an inline
10     assembler.
11     The inline assembler is standardized for D implementations across
12     the same CPU family, for example, the Intel Pentium inline assembler
13     for a Win32 D compiler will be syntax compatible with the inline
14     assembler for Linux running on an Intel Pentium.
15     )
16
17     $(P Implementations of D on different architectures, however, are
18     free to innovate upon the memory model, function call/return conventions,
19     argument passing conventions, etc.
20     )
21
22     $(P This document describes the x86 implementation of the inline
23     assembler.
24     )
25
26 $(GRAMMAR
27 $(GNAME AsmInstruction):
28     $(I Identifier) $(B :) $(I AsmInstruction)
29     $(B align) $(GLINK IntegerExpression)
30     $(B even)
31     $(B naked)
32     $(B db) $(I Operands)
33     $(B ds) $(I Operands)
34     $(B di) $(I Operands)
35     $(B dl) $(I Operands)
36     $(B df) $(I Operands)
37     $(B dd) $(I Operands)
38     $(B de) $(I Operands)
39     $(I Opcode)
40     $(I Opcode Operands)
41
42 $(GNAME Operands):
43     $(I Operand)
44     $(I Operand) $(B ,) $(I Operands)
45 )
46
47 <h2>Labels</h2>
48
49     $(P Assembler instructions can be labeled just like other statements.
50     They can be the target of goto statements.
51     For example:
52     )
53
54 --------------
55 void *pc;
56 asm
57 {
58     call L1     ;
59  L1:            ;
60     pop EBX     ;
61     mov pc[EBP],EBX ;   // pc now points to code at L1
62 }
63 --------------
64
65 <h2>align $(I IntegerExpression)</h2>
66
67 $(GRAMMAR
68 $(GNAME IntegerExpression):
69     $(LINK2 lex.html#IntegerLiteral, $(I IntegerLiteral))
70     $(I Identifier)
71 )
72
73     $(P Causes the assembler to emit NOP instructions to align the next
74     assembler instruction on an $(I IntegerExpression) boundary.
75     $(I IntegerExpression) must evaluate at compile time to an integer that is
76     a power of 2.
77     )
78
79     $(P Aligning the start of a loop body can sometimes have a dramatic
80     effect on the execution speed.
81     )
82
83 <h2>even</h2>
84
85     $(P Causes the assembler to emit NOP instructions to align the next
86     assembler instruction on an even boundary.
87     )
88
89 <h2>naked</h2>
90
91     $(P Causes the compiler to not generate the function prolog and epilog
92     sequences. This means such is the responsibility of inline
93     assembly programmer, and is normally used when the entire function
94     is to be written in assembler.
95     )
96
97 <h2>db, ds, di, dl, df, dd, de</h2>
98
99     These pseudo ops are for inserting raw data directly into
100     the code.
101     $(B db) is for bytes,
102     $(B ds) is for 16 bit words,
103     $(B di) is for 32 bit words,
104     $(B dl) is for 64 bit words,
105     $(B df) is for 32 bit floats,
106     $(B dd) is for 64 bit doubles,
107     and $(B de) is for 80 bit extended reals.
108     Each can have multiple operands.
109     If an operand is a string literal, it is as if there were $(I length)
110     operands, where $(I length) is the number of characters in the string.
111     One character is used per operand.
112     For example:
113
114 --------------
115 asm
116 {
117     db 5,6,0x83;   // insert bytes 0x05, 0x06, and 0x83 into code
118     ds 0x1234;     // insert bytes 0x34, 0x12
119     di 0x1234;     // insert bytes 0x34, 0x12, 0x00, 0x00
120     dl 0x1234;     // insert bytes 0x34, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
121     df 1.234;      // insert float 1.234
122     dd 1.234;      // insert double 1.234
123     de 1.234;      // insert real 1.234
124     db "abc";      // insert bytes 0x61, 0x62, and 0x63
125     ds "abc";      // insert bytes 0x61, 0x00, 0x62, 0x00, 0x63, 0x00
126 }
127 --------------
128
129 <h2>Opcodes</h2>
130
131     A list of supported opcodes is at the end.
132     <p>
133
134     The following registers are supported. Register names
135     are always in upper case.
136
137 $(GRAMMAR
138 $(GNAME Register):
139     $(B AL) $(B AH) $(B AX) $(B EAX)
140     $(B BL) $(B BH) $(B BX) $(B EBX)
141     $(B CL) $(B CH) $(B CX) $(B ECX)
142     $(B DL) $(B DH) $(B DX) $(B EDX)
143     $(B BP) $(B EBP)
144     $(B SP) $(B ESP)
145     $(B DI) $(B EDI)
146     $(B SI) $(B ESI)
147     $(B ES) $(B CS) $(B SS) $(B DS) $(B GS) $(B FS)
148     $(B CR0) $(B CR2) $(B CR3) $(B CR4)
149     $(B DR0) $(B DR1) $(B DR2) $(B DR3) $(B DR6) $(B DR7)
150     $(B TR3) $(B TR4) $(B TR5) $(B TR6) $(B TR7)
151     $(B ST)
152     $(B ST(0)) $(B ST(1)) $(B ST(2)) $(B ST(3)) $(B ST(4)) $(B ST(5)) $(B ST(6)) $(B ST(7))
153     $(B MM0) $(B MM1) $(B MM2) $(B MM3) $(B MM4) $(B MM5) $(B MM6) $(B MM7)
154     $(B XMM0) $(B XMM1) $(B XMM2) $(B XMM3) $(B XMM4) $(B XMM5) $(B XMM6) $(B XMM7)
155 )
156
157 <h3>Special Cases</h3>
158
159 $(DL
160
161     $(DT $(B lock), $(B rep), $(B repe), $(B repne),
162      $(B repnz), $(B repz))
163     $(DD These prefix instructions do not appear in the same statement
164     as the instructions they prefix; they appear in their own statement.
165     For example:
166
167 --------------
168 asm
169 {
170     rep   ;
171     movsb ;
172 }
173 --------------
174     )
175
176     $(DT $(B pause))
177     $(DD This opcode is not supported by the assembler, instead use
178
179 --------------
180 {
181     rep  ;
182     nop  ;
183 }
184 --------------
185
186     which produces the same result.
187     )
188
189     $(DT $(B floating point ops))
190     $(DD Use the two operand form of the instruction format;
191
192 --------------
193 fdiv ST(1); // wrong
194 fmul ST;        // wrong
195 fdiv ST,ST(1);  // right
196 fmul ST,ST(0);  // right
197 --------------
198     )
199 )
200
201 <h2>Operands</h2>
202
203 $(GRAMMAR
204 $(GNAME Operand):
205     $(I AsmExp)
206
207 $(GNAME AsmExp):
208     $(I AsmLogOrExp)
209     $(I AsmLogOrExp) $(B ?) $(I AsmExp) $(B :) $(I AsmExp)
210
211 $(GNAME AsmLogOrExp):
212     $(I AsmLogAndExp)
213     $(I AsmLogAndExp) $(B ||) $(I AsmLogAndExp)
214
215 $(GNAME AsmLogAndExp):
216     $(I AsmOrExp)
217     $(I AsmOrExp) $(B &&) $(I AsmOrExp)
218
219 $(GNAME AsmOrExp):
220     $(I AsmXorExp)
221     $(I AsmXorExp) $(B |) $(I AsmXorExp)
222
223 $(GNAME AsmXorExp):
224     $(I AsmAndExp)
225     $(I AsmAndExp) $(B ^) $(I AsmAndExp)
226
227 $(GNAME AsmAndExp):
228     $(I AsmEqualExp)
229     $(I AsmEqualExp) $(B &) $(I AsmEqualExp)
230
231 $(GNAME AsmEqualExp):
232     $(I AsmRelExp)
233     $(I AsmRelExp) $(B ==) $(I AsmRelExp)
234     $(I AsmRelExp) $(B !=) $(I AsmRelExp)
235
236 $(GNAME AsmRelExp):
237     $(I AsmShiftExp)
238     $(I AsmShiftExp) $(B &lt;) $(I AsmShiftExp)
239     $(I AsmShiftExp) $(B &lt;=) $(I AsmShiftExp)
240     $(I AsmShiftExp) $(B &gt;) $(I AsmShiftExp)
241     $(I AsmShiftExp) $(B &gt;=) $(I AsmShiftExp)
242
243 $(GNAME AsmShiftExp):
244     $(I AsmAddExp)
245     $(I AsmAddExp) $(B &lt;&lt;) $(I AsmAddExp)
246     $(I AsmAddExp) $(B &gt;&gt;) $(I AsmAddExp)
247     $(I AsmAddExp) $(B &gt;&gt;&gt;) $(I AsmAddExp)
248
249 $(GNAME AsmAddExp):
250     $(I AsmMulExp)
251     $(I AsmMulExp) $(B +) $(I AsmMulExp)
252     $(I AsmMulExp) $(B -) $(I AsmMulExp)
253
254 $(GNAME AsmMulExp):
255     $(I AsmBrExp)
256     $(I AsmBrExp) $(B *) $(I AsmBrExp)
257     $(I AsmBrExp) $(B /) $(I AsmBrExp)
258     $(I AsmBrExp) $(B %) $(I AsmBrExp)
259
260 $(GNAME AsmBrExp):
261     $(I AsmUnaExp)
262     $(I AsmBrExp) $(B [) $(I AsmExp) $(B ])
263
264 $(GNAME AsmUnaExp):
265     $(I AsmTypePrefix) $(I AsmExp)
266     $(B offsetof) $(I AsmExp)
267     $(B seg) $(I AsmExp)
268     $(B +) $(I AsmUnaExp)
269     $(B -) $(I AsmUnaExp)
270     $(B !) $(I AsmUnaExp)
271     $(B ~) $(I AsmUnaExp)
272     $(I AsmPrimaryExp)
273
274 $(GNAME AsmPrimaryExp):
275     $(LINK2 lex.html#IntegerLiteral, $(I IntegerLiteral))
276     $(LINK2 lex.html#FloatLiteral, $(I FloatLiteral))
277     $(B __LOCAL_SIZE)
278     $(B $)
279     $(GLINK Register)
280     $(I DotIdentifier)
281
282 $(GNAME DotIdentifier):
283     $(I Identifier)
284     $(I Identifier) $(B .) $(I DotIdentifier)
285 )
286
287     $(P The operand syntax more or less follows the Intel CPU documentation
288     conventions.
289     In particular, the convention is that for two operand instructions
290     the source is the right operand and the destination is the left
291     operand.
292     The syntax differs from that of Intel's in order to be compatible
293     with the D language tokenizer and to simplify parsing.
294     )
295
296     $(P The $(B seg) means load the segment number that the symbol is
297     in. This is not relevant for flat model code.
298     Instead, do a move from the relevant segment register.
299     )
300
301 <h3>Operand Types</h3>
302
303 $(GRAMMAR
304 $(GNAME AsmTypePrefix):
305     $(B near ptr)
306     $(B far ptr)
307     $(B byte ptr)
308     $(B short ptr)
309     $(B int ptr)
310     $(B word ptr)
311     $(B dword ptr)
312     $(B qword ptr)
313     $(B float ptr)
314     $(B double ptr)
315     $(B real ptr)
316 )
317
318     $(P In cases where the operand size is ambiguous, as in:)
319
320 --------------
321 add [EAX],3     ;
322 --------------
323
324     $(P it can be disambiguated by using an $(I AsmTypePrefix):)
325
326 --------------
327 add byte ptr [EAX],3    ;
328 add int ptr [EAX],7     ;
329 --------------
330
331     $(P $(B far ptr) is not relevant for flat model code.
332     )
333
334 <h3>Struct/Union/Class Member Offsets</h3>
335
336     $(P To access members of an aggregate, given a pointer to the aggregate
337     is in a register, use the qualified name of the member:
338     )
339
340 --------------
341 struct Foo { int a,b,c; }
342 int bar(Foo *f)
343 {
344     asm
345     {   mov EBX,f       ;
346     mov EAX,Foo.b[EBX]  ;
347     }
348 }
349 --------------
350
351 <h3>Stack Variables</h3>
352
353     $(P Stack variables (variables local to a function and allocated
354     on the stack) are accessed via the name of the variable indexed
355     by EBP:
356     )
357
358 ---
359 int foo(int x)
360 {
361     asm
362     {
363     mov EAX,x[EBP]  ;  // loads value of parameter x into EAX
364     mov EAX,x   ;  // does the same thing
365     }
366 }
367 ---
368
369     $(P If the [EBP] is omitted, it is assumed for local variables.
370     If $(B naked) is used, this no longer holds.
371     )
372
373 <h3>Special Symbols</h3>
374
375     $(DL
376
377     $(DT $(B &#36;))
378     $(DD Represents the program counter of the start of the next
379     instruction. So,
380
381 --------------
382 jmp $  ;
383 --------------
384
385     branches to the instruction following the jmp instruction.
386     The $(B &#36;) can only appear as the target of a jmp or call
387     instruction.
388     )
389
390     $(DT $(B __LOCAL_SIZE))
391     $(DD This gets replaced by the number of local bytes in the local
392     stack frame. It is most handy when the $(B naked) is invoked
393     and a custom stack frame is programmed.
394     )
395
396     )
397
398 <h2>Opcodes Supported</h2>
399
400     $(TABLE1
401     <tr>
402     <td>aaa</td>
403     <td>aad</td>
404     <td>aam</td>
405     <td>aas</td>
406     <td>adc</td>
407     </tr><tr>
408     <td>add</td>
409     <td>addpd</td>
410     <td>addps</td>
411     <td>addsd</td>
412     <td>addss</td>
413     </tr><tr>
414     <td>and</td>
415     <td>andnpd</td>
416     <td>andnps</td>
417     <td>andpd</td>
418     <td>andps</td>
419     </tr><tr>
420     <td>arpl</td>
421     <td>bound</td>
422     <td>bsf</td>
423     <td>bsr</td>
424     <td>bswap</td>
425     </tr><tr>
426     <td>bt</td>
427     <td>btc</td>
428     <td>btr</td>
429     <td>bts</td>
430     <td>call</td>
431     </tr><tr>
432     <td>cbw</td>
433     <td>cdq</td>
434     <td>clc</td>
435     <td>cld</td>
436     <td>clflush</td>
437     </tr><tr>
438     <td>cli</td>
439     <td>clts</td>
440     <td>cmc</td>
441     <td>cmova</td>
442     <td>cmovae</td>
443     </tr><tr>
444     <td>cmovb</td>
445     <td>cmovbe</td>
446     <td>cmovc</td>
447     <td>cmove</td>
448     <td>cmovg</td>
449     </tr><tr>
450     <td>cmovge</td>
451     <td>cmovl</td>
452     <td>cmovle</td>
453     <td>cmovna</td>
454     <td>cmovnae</td>
455     </tr><tr>
456     <td>cmovnb</td>
457     <td>cmovnbe</td>
458     <td>cmovnc</td>
459     <td>cmovne</td>
460     <td>cmovng</td>
461     </tr><tr>
462     <td>cmovnge</td>
463     <td>cmovnl</td>
464     <td>cmovnle</td>
465     <td>cmovno</td>
466     <td>cmovnp</td>
467     </tr><tr>
468     <td>cmovns</td>
469     <td>cmovnz</td>
470     <td>cmovo</td>
471     <td>cmovp</td>
472     <td>cmovpe</td>
473     </tr><tr>
474     <td>cmovpo</td>
475     <td>cmovs</td>
476     <td>cmovz</td>
477     <td>cmp</td>
478     <td>cmppd</td>
479     </tr><tr>
480     <td>cmpps</td>
481     <td>cmps</td>
482     <td>cmpsb</td>
483     <td>cmpsd</td>
484     <td>cmpss</td>
485     </tr><tr>
486     <td>cmpsw</td>
487     <td>cmpxch8b</td>
488     <td>cmpxchg</td>
489     <td>comisd</td>
490     <td>comiss</td>
491     </tr><tr>
492     <td>cpuid</td>
493     <td>cvtdq2pd</td>
494     <td>cvtdq2ps</td>
495     <td>cvtpd2dq</td>
496     <td>cvtpd2pi</td>
497     </tr><tr>
498     <td>cvtpd2ps</td>
499     <td>cvtpi2pd</td>
500     <td>cvtpi2ps</td>
501     <td>cvtps2dq</td>
502     <td>cvtps2pd</td>
503     </tr><tr>
504     <td>cvtps2pi</td>
505     <td>cvtsd2si</td>
506     <td>cvtsd2ss</td>
507     <td>cvtsi2sd</td>
508     <td>cvtsi2ss</td>
509     </tr><tr>
510     <td>cvtss2sd</td>
511     <td>cvtss2si</td>
512     <td>cvttpd2dq</td>
513     <td>cvttpd2pi</td>
514     <td>cvttps2dq</td>
515     </tr><tr>
516     <td>cvttps2pi</td>
517     <td>cvttsd2si</td>
518     <td>cvttss2si</td>
519     <td>cwd</td>
520     <td>cwde</td>
521     </tr><tr>
522     <td>da</td>
523     <td>daa</td>
524     <td>das</td>
525     <td>db</td>
526     <td>dd</td>
527     </tr><tr>
528     <td>de</td>
529     <td>dec</td>
530     <td>df</td>
531     <td>di</td>
532     <td>div</td>
533     </tr><tr>
534     <td>divpd</td>
535     <td>divps</td>
536     <td>divsd</td>
537     <td>divss</td>
538     <td>dl</td>
539     </tr><tr>
540     <td>dq</td>
541     <td>ds</td>
542     <td>dt</td>
543     <td>dw</td>
544     <td>emms</td>
545     </tr><tr>
546     <td>enter</td>
547     <td>f2xm1</td>
548     <td>fabs</td>
549     <td>fadd</td>
550     <td>faddp</td>
551     </tr><tr>
552     <td>fbld</td>
553     <td>fbstp</td>
554     <td>fchs</td>
555     <td>fclex</td>
556     <td>fcmovb</td>
557     </tr><tr>
558     <td>fcmovbe</td>
559     <td>fcmove</td>
560     <td>fcmovnb</td>
561     <td>fcmovnbe</td>
562     <td>fcmovne</td>
563     </tr><tr>
564     <td>fcmovnu</td>
565     <td>fcmovu</td>
566     <td>fcom</td>
567     <td>fcomi</td>
568     <td>fcomip</td>
569     </tr><tr>
570     <td>fcomp</td>
571     <td>fcompp</td>
572     <td>fcos</td>
573     <td>fdecstp</td>
574     <td>fdisi</td>
575     </tr><tr>
576     <td>fdiv</td>
577     <td>fdivp</td>
578     <td>fdivr</td>
579     <td>fdivrp</td>
580     <td>feni</td>
581     </tr><tr>
582     <td>ffree</td>
583     <td>fiadd</td>
584     <td>ficom</td>
585     <td>ficomp</td>
586     <td>fidiv</td>
587     </tr><tr>
588     <td>fidivr</td>
589     <td>fild</td>
590     <td>fimul</td>
591     <td>fincstp</td>
592     <td>finit</td>
593     </tr><tr>
594     <td>fist</td>
595     <td>fistp</td>
596     <td>fisub</td>
597     <td>fisubr</td>
598     <td>fld</td>
599     </tr><tr>
600     <td>fld1</td>
601     <td>fldcw</td>
602     <td>fldenv</td>
603     <td>fldl2e</td>
604     <td>fldl2t</td>
605     </tr><tr>
606     <td>fldlg2</td>
607     <td>fldln2</td>
608     <td>fldpi</td>
609     <td>fldz</td>
610     <td>fmul</td>
611     </tr><tr>
612     <td>fmulp</td>
613     <td>fnclex</td>
614     <td>fndisi</td>
615     <td>fneni</td>
616     <td>fninit</td>
617     </tr><tr>
618     <td>fnop</td>
619     <td>fnsave</td>
620     <td>fnstcw</td>
621     <td>fnstenv</td>
622     <td>fnstsw</td>
623     </tr><tr>
624     <td>fpatan</td>
625     <td>fprem</td>
626     <td>fprem1</td>
627     <td>fptan</td>
628     <td>frndint</td>
629     </tr><tr>
630     <td>frstor</td>
631     <td>fsave</td>
632     <td>fscale</td>
633     <td>fsetpm</td>
634     <td>fsin</td>
635     </tr><tr>
636     <td>fsincos</td>
637     <td>fsqrt</td>
638     <td>fst</td>
639     <td>fstcw</td>
640     <td>fstenv</td>
641     </tr><tr>
642     <td>fstp</td>
643     <td>fstsw</td>
644     <td>fsub</td>
645     <td>fsubp</td>
646     <td>fsubr</td>
647     </tr><tr>
648     <td>fsubrp</td>
649     <td>ftst</td>
650     <td>fucom</td>
651     <td>fucomi</td>
652     <td>fucomip</td>
653     </tr><tr>
654     <td>fucomp</td>
655     <td>fucompp</td>
656     <td>fwait</td>
657     <td>fxam</td>
658     <td>fxch</td>
659     </tr><tr>
660     <td>fxrstor</td>
661     <td>fxsave</td>
662     <td>fxtract</td>
663     <td>fyl2x</td>
664     <td>fyl2xp1</td>
665     </tr><tr>
666     <td>hlt</td>
667     <td>idiv</td>
668     <td>imul</td>
669     <td>in</td>
670     <td>inc</td>
671     </tr><tr>
672     <td>ins</td>
673     <td>insb</td>
674     <td>insd</td>
675     <td>insw</td>
676     <td>int</td>
677     </tr><tr>
678     <td>into</td>
679     <td>invd</td>
680     <td>invlpg</td>
681     <td>iret</td>
682     <td>iretd</td>
683     </tr><tr>
684     <td>ja</td>
685     <td>jae</td>
686     <td>jb</td>
687     <td>jbe</td>
688     <td>jc</td>
689     </tr><tr>
690     <td>jcxz</td>
691     <td>je</td>
692     <td>jecxz</td>
693     <td>jg</td>
694     <td>jge</td>
695     </tr><tr>
696     <td>jl</td>
697     <td>jle</td>
698     <td>jmp</td>
699     <td>jna</td>
700     <td>jnae</td>
701     </tr><tr>
702     <td>jnb</td>
703     <td>jnbe</td>
704     <td>jnc</td>
705     <td>jne</td>
706     <td>jng</td>
707     </tr><tr>
708     <td>jnge</td>
709     <td>jnl</td>
710     <td>jnle</td>
711     <td>jno</td>
712     <td>jnp</td>
713     </tr><tr>
714     <td>jns</td>
715     <td>jnz</td>
716     <td>jo</td>
717     <td>jp</td>
718     <td>jpe</td>
719     </tr><tr>
720     <td>jpo</td>
721     <td>js</td>
722     <td>jz</td>
723     <td>lahf</td>
724     <td>lar</td>
725     </tr><tr>
726     <td>ldmxcsr</td>
727     <td>lds</td>
728     <td>lea</td>
729     <td>leave</td>
730     <td>les</td>
731     </tr><tr>
732     <td>lfence</td>
733     <td>lfs</td>
734     <td>lgdt</td>
735     <td>lgs</td>
736     <td>lidt</td>
737     </tr><tr>
738     <td>lldt</td>
739     <td>lmsw</td>
740     <td>lock</td>
741     <td>lods</td>
742     <td>lodsb</td>
743     </tr><tr>
744     <td>lodsd</td>
745     <td>lodsw</td>
746     <td>loop</td>
747     <td>loope</td>
748     <td>loopne</td>
749     </tr><tr>
750     <td>loopnz</td>
751     <td>loopz</td>
752     <td>lsl</td>
753     <td>lss</td>
754     <td>ltr</td>
755     </tr><tr>
756     <td>maskmovdqu</td>
757     <td>maskmovq</td>
758     <td>maxpd</td>
759     <td>maxps</td>
760     <td>maxsd</td>
761     </tr><tr>
762     <td>maxss</td>
763     <td>mfence</td>
764     <td>minpd</td>
765     <td>minps</td>
766     <td>minsd</td>
767     </tr><tr>
768     <td>minss</td>
769     <td>mov</td>
770     <td>movapd</td>
771     <td>movaps</td>
772     <td>movd</td>
773     </tr><tr>
774     <td>movdq2q</td>
775     <td>movdqa</td>
776     <td>movdqu</td>
777     <td>movhlps</td>
778     <td>movhpd</td>
779     </tr><tr>
780     <td>movhps</td>
781     <td>movlhps</td>
782     <td>movlpd</td>
783     <td>movlps</td>
784     <td>movmskpd</td>
785     </tr><tr>
786     <td>movmskps</td>
787     <td>movntdq</td>
788     <td>movnti</td>
789     <td>movntpd</td>
790     <td>movntps</td>
791     </tr><tr>
792     <td>movntq</td>
793     <td>movq</td>
794     <td>movq2dq</td>
795     <td>movs</td>
796     <td>movsb</td>
797     </tr><tr>
798     <td>movsd</td>
799     <td>movss</td>
800     <td>movsw</td>
801     <td>movsx</td>
802     <td>movupd</td>
803     </tr><tr>
804     <td>movups</td>
805     <td>movzx</td>
806     <td>mul</td>
807     <td>mulpd</td>
808     <td>mulps</td>
809     </tr><tr>
810     <td>mulsd</td>
811     <td>mulss</td>
812     <td>neg</td>
813     <td>nop</td>
814     <td>not</td>
815     </tr><tr>
816     <td>or</td>
817     <td>orpd</td>
818     <td>orps</td>
819     <td>out</td>
820     <td>outs</td>
821     </tr><tr>
822     <td>outsb</td>
823     <td>outsd</td>
824     <td>outsw</td>
825     <td>packssdw</td>
826     <td>packsswb</td>
827     </tr><tr>
828     <td>packuswb</td>
829     <td>paddb</td>
830     <td>paddd</td>
831     <td>paddq</td>
832     <td>paddsb</td>
833     </tr><tr>
834     <td>paddsw</td>
835     <td>paddusb</td>
836     <td>paddusw</td>
837     <td>paddw</td>
838     <td>pand</td>
839     </tr><tr>
840     <td>pandn</td>
841     <td>pavgb</td>
842     <td>pavgw</td>
843     <td>pcmpeqb</td>
844     <td>pcmpeqd</td>
845     </tr><tr>
846     <td>pcmpeqw</td>
847     <td>pcmpgtb</td>
848     <td>pcmpgtd</td>
849     <td>pcmpgtw</td>
850     <td>pextrw</td>
851     </tr><tr>
852     <td>pinsrw</td>
853     <td>pmaddwd</td>
854     <td>pmaxsw</td>
855     <td>pmaxub</td>
856     <td>pminsw</td>
857     </tr><tr>
858     <td>pminub</td>
859     <td>pmovmskb</td>
860     <td>pmulhuw</td>
861     <td>pmulhw</td>
862     <td>pmullw</td>
863     </tr><tr>
864     <td>pmuludq</td>
865     <td>pop</td>
866     <td>popa</td>
867     <td>popad</td>
868     <td>popf</td>
869     </tr><tr>
870     <td>popfd</td>
871     <td>por</td>
872     <td>prefetchnta</td>
873     <td>prefetcht0</td>
874     <td>prefetcht1</td>
875     </tr><tr>
876     <td>prefetcht2</td>
877     <td>psadbw</td>
878     <td>pshufd</td>
879     <td>pshufhw</td>
880     <td>pshuflw</td>
881     </tr><tr>
882     <td>pshufw</td>
883     <td>pslld</td>
884     <td>pslldq</td>
885     <td>psllq</td>
886     <td>psllw</td>
887     </tr><tr>
888     <td>psrad</td>
889     <td>psraw</td>
890     <td>psrld</td>
891     <td>psrldq</td>
892     <td>psrlq</td>
893     </tr><tr>
894     <td>psrlw</td>
895     <td>psubb</td>
896     <td>psubd</td>
897     <td>psubq</td>
898     <td>psubsb</td>
899     </tr><tr>
900     <td>psubsw</td>
901     <td>psubusb</td>
902     <td>psubusw</td>
903     <td>psubw</td>
904     <td>punpckhbw</td>
905     </tr><tr>
906     <td>punpckhdq</td>
907     <td>punpckhqdq</td>
908     <td>punpckhwd</td>
909     <td>punpcklbw</td>
910     <td>punpckldq</td>
911     </tr><tr>
912     <td>punpcklqdq</td>
913     <td>punpcklwd</td>
914     <td>push</td>
915     <td>pusha</td>
916     <td>pushad</td>
917     </tr><tr>
918     <td>pushf</td>
919     <td>pushfd</td>
920     <td>pxor</td>
921     <td>rcl</td>
922     <td>rcpps</td>
923     </tr><tr>
924     <td>rcpss</td>
925     <td>rcr</td>
926     <td>rdmsr</td>
927     <td>rdpmc</td>
928     <td>rdtsc</td>
929     </tr><tr>
930     <td>rep</td>
931     <td>repe</td>
932     <td>repne</td>
933     <td>repnz</td>
934     <td>repz</td>
935     </tr><tr>
936     <td>ret</td>
937     <td>retf</td>
938     <td>rol</td>
939     <td>ror</td>
940     <td>rsm</td>
941     </tr><tr>
942     <td>rsqrtps</td>
943     <td>rsqrtss</td>
944     <td>sahf</td>
945     <td>sal</td>
946     <td>sar</td>
947     </tr><tr>
948     <td>sbb</td>
949     <td>scas</td>
950     <td>scasb</td>
951     <td>scasd</td>
952     <td>scasw</td>
953     </tr><tr>
954     <td>seta</td>
955     <td>setae</td>
956     <td>setb</td>
957     <td>setbe</td>
958     <td>setc</td>
959     </tr><tr>
960     <td>sete</td>
961     <td>setg</td>
962     <td>setge</td>
963     <td>setl</td>
964     <td>setle</td>
965     </tr><tr>
966     <td>setna</td>
967     <td>setnae</td>
968     <td>setnb</td>
969     <td>setnbe</td>
970     <td>setnc</td>
971     </tr><tr>
972     <td>setne</td>
973     <td>setng</td>
974     <td>setnge</td>
975     <td>setnl</td>
976     <td>setnle</td>
977     </tr><tr>
978     <td>setno</td>
979     <td>setnp</td>
980     <td>setns</td>
981     <td>setnz</td>
982     <td>seto</td>
983     </tr><tr>
984     <td>setp</td>
985     <td>setpe</td>
986     <td>setpo</td>
987     <td>sets</td>
988     <td>setz</td>
989     </tr><tr>
990     <td>sfence</td>
991     <td>sgdt</td>
992     <td>shl</td>
993     <td>shld</td>
994     <td>shr</td>
995     </tr><tr>
996     <td>shrd</td>
997     <td>shufpd</td>
998     <td>shufps</td>
999     <td>sidt</td>
1000     <td>sldt</td>
1001     </tr><tr>
1002     <td>smsw</td>
1003     <td>sqrtpd</td>
1004     <td>sqrtps</td>
1005     <td>sqrtsd</td>
1006     <td>sqrtss</td>
1007     </tr><tr>
1008     <td>stc</td>
1009     <td>std</td>
1010     <td>sti</td>
1011     <td>stmxcsr</td>
1012     <td>stos</td>
1013     </tr><tr>
1014     <td>stosb</td>
1015     <td>stosd</td>
1016     <td>stosw</td>
1017     <td>str</td>
1018     <td>sub</td>
1019     </tr><tr>
1020     <td>subpd</td>
1021     <td>subps</td>
1022     <td>subsd</td>
1023     <td>subss</td>
1024     <td>sysenter</td>
1025     </tr><tr>
1026     <td>sysexit</td>
1027     <td>test</td>
1028     <td>ucomisd</td>
1029     <td>ucomiss</td>
1030     <td>ud2</td>
1031     </tr><tr>
1032     <td>unpckhpd</td>
1033     <td>unpckhps</td>
1034     <td>unpcklpd</td>
1035     <td>unpcklps</td>
1036     <td>verr</td>
1037     </tr><tr>
1038     <td>verw</td>
1039     <td>wait</td>
1040     <td>wbinvd</td>
1041     <td>wrmsr</td>
1042     <td>xadd</td>
1043     </tr><tr>
1044     <td>xchg</td>
1045     <td>xlat</td>
1046     <td>xlatb</td>
1047     <td>xor</td>
1048     <td>xorpd</td>
1049     </tr><tr>
1050     <td>xorps</td>
1051     <td> </td>
1052     <td> </td>
1053     <td> </td>
1054     <td> </td>
1055     </tr>
1056     )
1057
1058 <h3>Pentium 4 (Prescott) Opcodes Supported</h3>
1059
1060     $(TABLE1
1061     <tr>
1062     <td>addsubpd</td>
1063     <td>addsubps</td>
1064     <td>fisttp</td>
1065     <td>haddpd</td>
1066     <td>haddps</td>
1067     </tr><tr>
1068     <td>hsubpd</td>
1069     <td>hsubps</td>
1070     <td>lddqu</td>
1071     <td>monitor</td>
1072     <td>movddup</td>
1073     </tr><tr>
1074     <td>movshdup</td>
1075     <td>movsldup</td>
1076     <td>mwait</td>
1077     <td> </td>
1078     <td> </td>
1079
1080     </tr>
1081     )
1082
1083 <h3>AMD Opcodes Supported</h3>
1084
1085     $(TABLE1
1086     <tr>
1087     <td>pavgusb</td>
1088     <td>pf2id</td>
1089     <td>pfacc</td>
1090     <td>pfadd</td>
1091     <td>pfcmpeq</td>
1092     </tr><tr>
1093     <td>pfcmpge</td>
1094     <td>pfcmpgt</td>
1095     <td>pfmax</td>
1096     <td>pfmin</td>
1097     <td>pfmul</td>
1098     </tr><tr>
1099     <td>pfnacc</td>
1100     <td>pfpnacc</td>
1101     <td>pfrcp</td>
1102     <td>pfrcpit1</td>
1103     <td>pfrcpit2</td>
1104     </tr><tr>
1105     <td>pfrsqit1</td>
1106     <td>pfrsqrt</td>
1107     <td>pfsub</td>
1108     <td>pfsubr</td>
1109     <td>pi2fd</td>
1110     </tr><tr>
1111     <td>pmulhrw</td>
1112     <td>pswapd</td>
1113     </tr>
1114     )
1115
1116 $(COMMENT
1117 SSE4.1
1118
1119 blendpd
1120 blendps
1121 blendvpd
1122 blendvps
1123 dppd
1124 dpps
1125 extractps
1126 insertps
1127 movntdqa
1128 mpsadbw
1129 packusdw
1130 pblendub
1131 pblendw
1132 pcmpeqq
1133 pextrb
1134 pextrd
1135 pextrq
1136 pextrw
1137 phminposuw
1138 pinsrb
1139 pinsrd
1140 pinsrq
1141 pmaxsb
1142 pmaxsd
1143 pmaxud
1144 pmaxuw
1145 pminsb
1146 pminsd
1147 pminud
1148 pminuw
1149 pmovsxbd
1150 pmovsxbq
1151 pmovsxbw
1152 pmovsxwd
1153 pmovsxwq
1154 pmovsxdq
1155 pmovzxbd
1156 pmovzxbq
1157 pmovzxbw
1158 pmovzxwd
1159 pmovzxwq
1160 pmovzxdq
1161 pmuldq
1162 pmulld
1163 ptest
1164 roundpd
1165 roundps
1166 roundsd
1167 roundss
1168
1169 SSE4.2
1170
1171 crc32
1172 pcmpestri
1173 pcmpestrm
1174 pcmpistri
1175 pcmpistrm
1176 pcmpgtq
1177 popcnt
1178
1179 VMS
1180
1181 invept
1182 invvpid
1183 vmcall
1184 vmclear
1185 vmlaunch
1186 vmresume
1187 vmptrld
1188 vmptrst
1189 vmread
1190 vmwrite
1191 vmxoff
1192 vmxon
1193
1194 SMX
1195
1196 getsec
1197 )
1198
1199 )
1200
1201 Macros:
1202     TITLE=Inline Assembler
1203     WIKI=IAsm
Note: See TracBrowser for help on using the browser.