a671be81f4545df88ac6e07046a074d9acc34485
[deliverable/binutils-gdb.git] / gas / doc / c-i386.texi
1 @c Copyright (C) 1991-2018 Free Software Foundation, Inc.
2 @c This is part of the GAS manual.
3 @c For copying conditions, see the file as.texinfo.
4 @c man end
5
6 @ifset GENERIC
7 @page
8 @node i386-Dependent
9 @chapter 80386 Dependent Features
10 @end ifset
11 @ifclear GENERIC
12 @node Machine Dependencies
13 @chapter 80386 Dependent Features
14 @end ifclear
15
16 @cindex i386 support
17 @cindex i80386 support
18 @cindex x86-64 support
19
20 The i386 version @code{@value{AS}} supports both the original Intel 386
21 architecture in both 16 and 32-bit mode as well as AMD x86-64 architecture
22 extending the Intel architecture to 64-bits.
23
24 @menu
25 * i386-Options:: Options
26 * i386-Directives:: X86 specific directives
27 * i386-Syntax:: Syntactical considerations
28 * i386-Mnemonics:: Instruction Naming
29 * i386-Regs:: Register Naming
30 * i386-Prefixes:: Instruction Prefixes
31 * i386-Memory:: Memory References
32 * i386-Jumps:: Handling of Jump Instructions
33 * i386-Float:: Floating Point
34 * i386-SIMD:: Intel's MMX and AMD's 3DNow! SIMD Operations
35 * i386-LWP:: AMD's Lightweight Profiling Instructions
36 * i386-BMI:: Bit Manipulation Instruction
37 * i386-TBM:: AMD's Trailing Bit Manipulation Instructions
38 * i386-16bit:: Writing 16-bit Code
39 * i386-Arch:: Specifying an x86 CPU architecture
40 * i386-Bugs:: AT&T Syntax bugs
41 * i386-Notes:: Notes
42 @end menu
43
44 @node i386-Options
45 @section Options
46
47 @cindex options for i386
48 @cindex options for x86-64
49 @cindex i386 options
50 @cindex x86-64 options
51
52 The i386 version of @code{@value{AS}} has a few machine
53 dependent options:
54
55 @c man begin OPTIONS
56 @table @gcctabopt
57 @cindex @samp{--32} option, i386
58 @cindex @samp{--32} option, x86-64
59 @cindex @samp{--x32} option, i386
60 @cindex @samp{--x32} option, x86-64
61 @cindex @samp{--64} option, i386
62 @cindex @samp{--64} option, x86-64
63 @item --32 | --x32 | --64
64 Select the word size, either 32 bits or 64 bits. @samp{--32}
65 implies Intel i386 architecture, while @samp{--x32} and @samp{--64}
66 imply AMD x86-64 architecture with 32-bit or 64-bit word-size
67 respectively.
68
69 These options are only available with the ELF object file format, and
70 require that the necessary BFD support has been included (on a 32-bit
71 platform you have to add --enable-64-bit-bfd to configure enable 64-bit
72 usage and use x86-64 as target platform).
73
74 @item -n
75 By default, x86 GAS replaces multiple nop instructions used for
76 alignment within code sections with multi-byte nop instructions such
77 as leal 0(%esi,1),%esi. This switch disables the optimization if a single
78 byte nop (0x90) is explicitly specified as the fill byte for alignment.
79
80 @cindex @samp{--divide} option, i386
81 @item --divide
82 On SVR4-derived platforms, the character @samp{/} is treated as a comment
83 character, which means that it cannot be used in expressions. The
84 @samp{--divide} option turns @samp{/} into a normal character. This does
85 not disable @samp{/} at the beginning of a line starting a comment, or
86 affect using @samp{#} for starting a comment.
87
88 @cindex @samp{-march=} option, i386
89 @cindex @samp{-march=} option, x86-64
90 @item -march=@var{CPU}[+@var{EXTENSION}@dots{}]
91 This option specifies the target processor. The assembler will
92 issue an error message if an attempt is made to assemble an instruction
93 which will not execute on the target processor. The following
94 processor names are recognized:
95 @code{i8086},
96 @code{i186},
97 @code{i286},
98 @code{i386},
99 @code{i486},
100 @code{i586},
101 @code{i686},
102 @code{pentium},
103 @code{pentiumpro},
104 @code{pentiumii},
105 @code{pentiumiii},
106 @code{pentium4},
107 @code{prescott},
108 @code{nocona},
109 @code{core},
110 @code{core2},
111 @code{corei7},
112 @code{l1om},
113 @code{k1om},
114 @code{iamcu},
115 @code{k6},
116 @code{k6_2},
117 @code{athlon},
118 @code{opteron},
119 @code{k8},
120 @code{amdfam10},
121 @code{bdver1},
122 @code{bdver2},
123 @code{bdver3},
124 @code{bdver4},
125 @code{znver1},
126 @code{btver1},
127 @code{btver2},
128 @code{generic32} and
129 @code{generic64}.
130
131 In addition to the basic instruction set, the assembler can be told to
132 accept various extension mnemonics. For example,
133 @code{-march=i686+sse4+vmx} extends @var{i686} with @var{sse4} and
134 @var{vmx}. The following extensions are currently supported:
135 @code{8087},
136 @code{287},
137 @code{387},
138 @code{687},
139 @code{no87},
140 @code{no287},
141 @code{no387},
142 @code{no687},
143 @code{mmx},
144 @code{nommx},
145 @code{sse},
146 @code{sse2},
147 @code{sse3},
148 @code{ssse3},
149 @code{sse4.1},
150 @code{sse4.2},
151 @code{sse4},
152 @code{nosse},
153 @code{nosse2},
154 @code{nosse3},
155 @code{nossse3},
156 @code{nosse4.1},
157 @code{nosse4.2},
158 @code{nosse4},
159 @code{avx},
160 @code{avx2},
161 @code{noavx},
162 @code{noavx2},
163 @code{adx},
164 @code{rdseed},
165 @code{prfchw},
166 @code{smap},
167 @code{mpx},
168 @code{sha},
169 @code{rdpid},
170 @code{ptwrite},
171 @code{cet},
172 @code{gfni},
173 @code{vaes},
174 @code{vpclmulqdq},
175 @code{prefetchwt1},
176 @code{clflushopt},
177 @code{se1},
178 @code{clwb},
179 @code{avx512f},
180 @code{avx512cd},
181 @code{avx512er},
182 @code{avx512pf},
183 @code{avx512vl},
184 @code{avx512bw},
185 @code{avx512dq},
186 @code{avx512ifma},
187 @code{avx512vbmi},
188 @code{avx512_4fmaps},
189 @code{avx512_4vnniw},
190 @code{avx512_vpopcntdq},
191 @code{avx512_vbmi2},
192 @code{avx512_vnni},
193 @code{avx512_bitalg},
194 @code{noavx512f},
195 @code{noavx512cd},
196 @code{noavx512er},
197 @code{noavx512pf},
198 @code{noavx512vl},
199 @code{noavx512bw},
200 @code{noavx512dq},
201 @code{noavx512ifma},
202 @code{noavx512vbmi},
203 @code{noavx512_4fmaps},
204 @code{noavx512_4vnniw},
205 @code{noavx512_vpopcntdq},
206 @code{noavx512_vbmi2},
207 @code{noavx512_vnni},
208 @code{noavx512_bitalg},
209 @code{vmx},
210 @code{vmfunc},
211 @code{smx},
212 @code{xsave},
213 @code{xsaveopt},
214 @code{xsavec},
215 @code{xsaves},
216 @code{aes},
217 @code{pclmul},
218 @code{fsgsbase},
219 @code{rdrnd},
220 @code{f16c},
221 @code{bmi2},
222 @code{fma},
223 @code{movbe},
224 @code{ept},
225 @code{lzcnt},
226 @code{hle},
227 @code{rtm},
228 @code{invpcid},
229 @code{clflush},
230 @code{mwaitx},
231 @code{clzero},
232 @code{wbnoinvd},
233 @code{lwp},
234 @code{fma4},
235 @code{xop},
236 @code{cx16},
237 @code{syscall},
238 @code{rdtscp},
239 @code{3dnow},
240 @code{3dnowa},
241 @code{sse4a},
242 @code{sse5},
243 @code{svme},
244 @code{abm} and
245 @code{padlock}.
246 Note that rather than extending a basic instruction set, the extension
247 mnemonics starting with @code{no} revoke the respective functionality.
248
249 When the @code{.arch} directive is used with @option{-march}, the
250 @code{.arch} directive will take precedent.
251
252 @cindex @samp{-mtune=} option, i386
253 @cindex @samp{-mtune=} option, x86-64
254 @item -mtune=@var{CPU}
255 This option specifies a processor to optimize for. When used in
256 conjunction with the @option{-march} option, only instructions
257 of the processor specified by the @option{-march} option will be
258 generated.
259
260 Valid @var{CPU} values are identical to the processor list of
261 @option{-march=@var{CPU}}.
262
263 @cindex @samp{-msse2avx} option, i386
264 @cindex @samp{-msse2avx} option, x86-64
265 @item -msse2avx
266 This option specifies that the assembler should encode SSE instructions
267 with VEX prefix.
268
269 @cindex @samp{-msse-check=} option, i386
270 @cindex @samp{-msse-check=} option, x86-64
271 @item -msse-check=@var{none}
272 @itemx -msse-check=@var{warning}
273 @itemx -msse-check=@var{error}
274 These options control if the assembler should check SSE instructions.
275 @option{-msse-check=@var{none}} will make the assembler not to check SSE
276 instructions, which is the default. @option{-msse-check=@var{warning}}
277 will make the assembler issue a warning for any SSE instruction.
278 @option{-msse-check=@var{error}} will make the assembler issue an error
279 for any SSE instruction.
280
281 @cindex @samp{-mavxscalar=} option, i386
282 @cindex @samp{-mavxscalar=} option, x86-64
283 @item -mavxscalar=@var{128}
284 @itemx -mavxscalar=@var{256}
285 These options control how the assembler should encode scalar AVX
286 instructions. @option{-mavxscalar=@var{128}} will encode scalar
287 AVX instructions with 128bit vector length, which is the default.
288 @option{-mavxscalar=@var{256}} will encode scalar AVX instructions
289 with 256bit vector length.
290
291 @cindex @samp{-mevexlig=} option, i386
292 @cindex @samp{-mevexlig=} option, x86-64
293 @item -mevexlig=@var{128}
294 @itemx -mevexlig=@var{256}
295 @itemx -mevexlig=@var{512}
296 These options control how the assembler should encode length-ignored
297 (LIG) EVEX instructions. @option{-mevexlig=@var{128}} will encode LIG
298 EVEX instructions with 128bit vector length, which is the default.
299 @option{-mevexlig=@var{256}} and @option{-mevexlig=@var{512}} will
300 encode LIG EVEX instructions with 256bit and 512bit vector length,
301 respectively.
302
303 @cindex @samp{-mevexwig=} option, i386
304 @cindex @samp{-mevexwig=} option, x86-64
305 @item -mevexwig=@var{0}
306 @itemx -mevexwig=@var{1}
307 These options control how the assembler should encode w-ignored (WIG)
308 EVEX instructions. @option{-mevexwig=@var{0}} will encode WIG
309 EVEX instructions with evex.w = 0, which is the default.
310 @option{-mevexwig=@var{1}} will encode WIG EVEX instructions with
311 evex.w = 1.
312
313 @cindex @samp{-mmnemonic=} option, i386
314 @cindex @samp{-mmnemonic=} option, x86-64
315 @item -mmnemonic=@var{att}
316 @itemx -mmnemonic=@var{intel}
317 This option specifies instruction mnemonic for matching instructions.
318 The @code{.att_mnemonic} and @code{.intel_mnemonic} directives will
319 take precedent.
320
321 @cindex @samp{-msyntax=} option, i386
322 @cindex @samp{-msyntax=} option, x86-64
323 @item -msyntax=@var{att}
324 @itemx -msyntax=@var{intel}
325 This option specifies instruction syntax when processing instructions.
326 The @code{.att_syntax} and @code{.intel_syntax} directives will
327 take precedent.
328
329 @cindex @samp{-mnaked-reg} option, i386
330 @cindex @samp{-mnaked-reg} option, x86-64
331 @item -mnaked-reg
332 This option specifies that registers don't require a @samp{%} prefix.
333 The @code{.att_syntax} and @code{.intel_syntax} directives will take precedent.
334
335 @cindex @samp{-madd-bnd-prefix} option, i386
336 @cindex @samp{-madd-bnd-prefix} option, x86-64
337 @item -madd-bnd-prefix
338 This option forces the assembler to add BND prefix to all branches, even
339 if such prefix was not explicitly specified in the source code.
340
341 @cindex @samp{-mshared} option, i386
342 @cindex @samp{-mshared} option, x86-64
343 @item -mno-shared
344 On ELF target, the assembler normally optimizes out non-PLT relocations
345 against defined non-weak global branch targets with default visibility.
346 The @samp{-mshared} option tells the assembler to generate code which
347 may go into a shared library where all non-weak global branch targets
348 with default visibility can be preempted. The resulting code is
349 slightly bigger. This option only affects the handling of branch
350 instructions.
351
352 @cindex @samp{-mbig-obj} option, x86-64
353 @item -mbig-obj
354 On x86-64 PE/COFF target this option forces the use of big object file
355 format, which allows more than 32768 sections.
356
357 @cindex @samp{-momit-lock-prefix=} option, i386
358 @cindex @samp{-momit-lock-prefix=} option, x86-64
359 @item -momit-lock-prefix=@var{no}
360 @itemx -momit-lock-prefix=@var{yes}
361 These options control how the assembler should encode lock prefix.
362 This option is intended as a workaround for processors, that fail on
363 lock prefix. This option can only be safely used with single-core,
364 single-thread computers
365 @option{-momit-lock-prefix=@var{yes}} will omit all lock prefixes.
366 @option{-momit-lock-prefix=@var{no}} will encode lock prefix as usual,
367 which is the default.
368
369 @cindex @samp{-mfence-as-lock-add=} option, i386
370 @cindex @samp{-mfence-as-lock-add=} option, x86-64
371 @item -mfence-as-lock-add=@var{no}
372 @itemx -mfence-as-lock-add=@var{yes}
373 These options control how the assembler should encode lfence, mfence and
374 sfence.
375 @option{-mfence-as-lock-add=@var{yes}} will encode lfence, mfence and
376 sfence as @samp{lock addl $0x0, (%rsp)} in 64-bit mode and
377 @samp{lock addl $0x0, (%esp)} in 32-bit mode.
378 @option{-mfence-as-lock-add=@var{no}} will encode lfence, mfence and
379 sfence as usual, which is the default.
380
381 @cindex @samp{-mrelax-relocations=} option, i386
382 @cindex @samp{-mrelax-relocations=} option, x86-64
383 @item -mrelax-relocations=@var{no}
384 @itemx -mrelax-relocations=@var{yes}
385 These options control whether the assembler should generate relax
386 relocations, R_386_GOT32X, in 32-bit mode, or R_X86_64_GOTPCRELX and
387 R_X86_64_REX_GOTPCRELX, in 64-bit mode.
388 @option{-mrelax-relocations=@var{yes}} will generate relax relocations.
389 @option{-mrelax-relocations=@var{no}} will not generate relax
390 relocations. The default can be controlled by a configure option
391 @option{--enable-x86-relax-relocations}.
392
393 @cindex @samp{-mevexrcig=} option, i386
394 @cindex @samp{-mevexrcig=} option, x86-64
395 @item -mevexrcig=@var{rne}
396 @itemx -mevexrcig=@var{rd}
397 @itemx -mevexrcig=@var{ru}
398 @itemx -mevexrcig=@var{rz}
399 These options control how the assembler should encode SAE-only
400 EVEX instructions. @option{-mevexrcig=@var{rne}} will encode RC bits
401 of EVEX instruction with 00, which is the default.
402 @option{-mevexrcig=@var{rd}}, @option{-mevexrcig=@var{ru}}
403 and @option{-mevexrcig=@var{rz}} will encode SAE-only EVEX instructions
404 with 01, 10 and 11 RC bits, respectively.
405
406 @cindex @samp{-mamd64} option, x86-64
407 @cindex @samp{-mintel64} option, x86-64
408 @item -mamd64
409 @itemx -mintel64
410 This option specifies that the assembler should accept only AMD64 or
411 Intel64 ISA in 64-bit mode. The default is to accept both.
412
413 @end table
414 @c man end
415
416 @node i386-Directives
417 @section x86 specific Directives
418
419 @cindex machine directives, x86
420 @cindex x86 machine directives
421 @table @code
422
423 @cindex @code{lcomm} directive, COFF
424 @item .lcomm @var{symbol} , @var{length}[, @var{alignment}]
425 Reserve @var{length} (an absolute expression) bytes for a local common
426 denoted by @var{symbol}. The section and value of @var{symbol} are
427 those of the new local common. The addresses are allocated in the bss
428 section, so that at run-time the bytes start off zeroed. Since
429 @var{symbol} is not declared global, it is normally not visible to
430 @code{@value{LD}}. The optional third parameter, @var{alignment},
431 specifies the desired alignment of the symbol in the bss section.
432
433 This directive is only available for COFF based x86 targets.
434
435 @cindex @code{largecomm} directive, ELF
436 @item .largecomm @var{symbol} , @var{length}[, @var{alignment}]
437 This directive behaves in the same way as the @code{comm} directive
438 except that the data is placed into the @var{.lbss} section instead of
439 the @var{.bss} section @ref{Comm}.
440
441 The directive is intended to be used for data which requires a large
442 amount of space, and it is only available for ELF based x86_64
443 targets.
444
445 @c FIXME: Document other x86 specific directives ? Eg: .code16gcc,
446
447 @end table
448
449 @node i386-Syntax
450 @section i386 Syntactical Considerations
451 @menu
452 * i386-Variations:: AT&T Syntax versus Intel Syntax
453 * i386-Chars:: Special Characters
454 @end menu
455
456 @node i386-Variations
457 @subsection AT&T Syntax versus Intel Syntax
458
459 @cindex i386 intel_syntax pseudo op
460 @cindex intel_syntax pseudo op, i386
461 @cindex i386 att_syntax pseudo op
462 @cindex att_syntax pseudo op, i386
463 @cindex i386 syntax compatibility
464 @cindex syntax compatibility, i386
465 @cindex x86-64 intel_syntax pseudo op
466 @cindex intel_syntax pseudo op, x86-64
467 @cindex x86-64 att_syntax pseudo op
468 @cindex att_syntax pseudo op, x86-64
469 @cindex x86-64 syntax compatibility
470 @cindex syntax compatibility, x86-64
471
472 @code{@value{AS}} now supports assembly using Intel assembler syntax.
473 @code{.intel_syntax} selects Intel mode, and @code{.att_syntax} switches
474 back to the usual AT&T mode for compatibility with the output of
475 @code{@value{GCC}}. Either of these directives may have an optional
476 argument, @code{prefix}, or @code{noprefix} specifying whether registers
477 require a @samp{%} prefix. AT&T System V/386 assembler syntax is quite
478 different from Intel syntax. We mention these differences because
479 almost all 80386 documents use Intel syntax. Notable differences
480 between the two syntaxes are:
481
482 @cindex immediate operands, i386
483 @cindex i386 immediate operands
484 @cindex register operands, i386
485 @cindex i386 register operands
486 @cindex jump/call operands, i386
487 @cindex i386 jump/call operands
488 @cindex operand delimiters, i386
489
490 @cindex immediate operands, x86-64
491 @cindex x86-64 immediate operands
492 @cindex register operands, x86-64
493 @cindex x86-64 register operands
494 @cindex jump/call operands, x86-64
495 @cindex x86-64 jump/call operands
496 @cindex operand delimiters, x86-64
497 @itemize @bullet
498 @item
499 AT&T immediate operands are preceded by @samp{$}; Intel immediate
500 operands are undelimited (Intel @samp{push 4} is AT&T @samp{pushl $4}).
501 AT&T register operands are preceded by @samp{%}; Intel register operands
502 are undelimited. AT&T absolute (as opposed to PC relative) jump/call
503 operands are prefixed by @samp{*}; they are undelimited in Intel syntax.
504
505 @cindex i386 source, destination operands
506 @cindex source, destination operands; i386
507 @cindex x86-64 source, destination operands
508 @cindex source, destination operands; x86-64
509 @item
510 AT&T and Intel syntax use the opposite order for source and destination
511 operands. Intel @samp{add eax, 4} is @samp{addl $4, %eax}. The
512 @samp{source, dest} convention is maintained for compatibility with
513 previous Unix assemblers. Note that @samp{bound}, @samp{invlpga}, and
514 instructions with 2 immediate operands, such as the @samp{enter}
515 instruction, do @emph{not} have reversed order. @ref{i386-Bugs}.
516
517 @cindex mnemonic suffixes, i386
518 @cindex sizes operands, i386
519 @cindex i386 size suffixes
520 @cindex mnemonic suffixes, x86-64
521 @cindex sizes operands, x86-64
522 @cindex x86-64 size suffixes
523 @item
524 In AT&T syntax the size of memory operands is determined from the last
525 character of the instruction mnemonic. Mnemonic suffixes of @samp{b},
526 @samp{w}, @samp{l} and @samp{q} specify byte (8-bit), word (16-bit), long
527 (32-bit) and quadruple word (64-bit) memory references. Intel syntax accomplishes
528 this by prefixing memory operands (@emph{not} the instruction mnemonics) with
529 @samp{byte ptr}, @samp{word ptr}, @samp{dword ptr} and @samp{qword ptr}. Thus,
530 Intel @samp{mov al, byte ptr @var{foo}} is @samp{movb @var{foo}, %al} in AT&T
531 syntax.
532
533 In 64-bit code, @samp{movabs} can be used to encode the @samp{mov}
534 instruction with the 64-bit displacement or immediate operand.
535
536 @cindex return instructions, i386
537 @cindex i386 jump, call, return
538 @cindex return instructions, x86-64
539 @cindex x86-64 jump, call, return
540 @item
541 Immediate form long jumps and calls are
542 @samp{lcall/ljmp $@var{section}, $@var{offset}} in AT&T syntax; the
543 Intel syntax is
544 @samp{call/jmp far @var{section}:@var{offset}}. Also, the far return
545 instruction
546 is @samp{lret $@var{stack-adjust}} in AT&T syntax; Intel syntax is
547 @samp{ret far @var{stack-adjust}}.
548
549 @cindex sections, i386
550 @cindex i386 sections
551 @cindex sections, x86-64
552 @cindex x86-64 sections
553 @item
554 The AT&T assembler does not provide support for multiple section
555 programs. Unix style systems expect all programs to be single sections.
556 @end itemize
557
558 @node i386-Chars
559 @subsection Special Characters
560
561 @cindex line comment character, i386
562 @cindex i386 line comment character
563 The presence of a @samp{#} appearing anywhere on a line indicates the
564 start of a comment that extends to the end of that line.
565
566 If a @samp{#} appears as the first character of a line then the whole
567 line is treated as a comment, but in this case the line can also be a
568 logical line number directive (@pxref{Comments}) or a preprocessor
569 control command (@pxref{Preprocessing}).
570
571 If the @option{--divide} command line option has not been specified
572 then the @samp{/} character appearing anywhere on a line also
573 introduces a line comment.
574
575 @cindex line separator, i386
576 @cindex statement separator, i386
577 @cindex i386 line separator
578 The @samp{;} character can be used to separate statements on the same
579 line.
580
581 @node i386-Mnemonics
582 @section i386-Mnemonics
583 @subsection Instruction Naming
584
585 @cindex i386 instruction naming
586 @cindex instruction naming, i386
587 @cindex x86-64 instruction naming
588 @cindex instruction naming, x86-64
589
590 Instruction mnemonics are suffixed with one character modifiers which
591 specify the size of operands. The letters @samp{b}, @samp{w}, @samp{l}
592 and @samp{q} specify byte, word, long and quadruple word operands. If
593 no suffix is specified by an instruction then @code{@value{AS}} tries to
594 fill in the missing suffix based on the destination register operand
595 (the last one by convention). Thus, @samp{mov %ax, %bx} is equivalent
596 to @samp{movw %ax, %bx}; also, @samp{mov $1, %bx} is equivalent to
597 @samp{movw $1, bx}. Note that this is incompatible with the AT&T Unix
598 assembler which assumes that a missing mnemonic suffix implies long
599 operand size. (This incompatibility does not affect compiler output
600 since compilers always explicitly specify the mnemonic suffix.)
601
602 Almost all instructions have the same names in AT&T and Intel format.
603 There are a few exceptions. The sign extend and zero extend
604 instructions need two sizes to specify them. They need a size to
605 sign/zero extend @emph{from} and a size to zero extend @emph{to}. This
606 is accomplished by using two instruction mnemonic suffixes in AT&T
607 syntax. Base names for sign extend and zero extend are
608 @samp{movs@dots{}} and @samp{movz@dots{}} in AT&T syntax (@samp{movsx}
609 and @samp{movzx} in Intel syntax). The instruction mnemonic suffixes
610 are tacked on to this base name, the @emph{from} suffix before the
611 @emph{to} suffix. Thus, @samp{movsbl %al, %edx} is AT&T syntax for
612 ``move sign extend @emph{from} %al @emph{to} %edx.'' Possible suffixes,
613 thus, are @samp{bl} (from byte to long), @samp{bw} (from byte to word),
614 @samp{wl} (from word to long), @samp{bq} (from byte to quadruple word),
615 @samp{wq} (from word to quadruple word), and @samp{lq} (from long to
616 quadruple word).
617
618 @cindex encoding options, i386
619 @cindex encoding options, x86-64
620
621 Different encoding options can be specified via pseudo prefixes:
622
623 @itemize @bullet
624 @item
625 @samp{@{disp8@}} -- prefer 8-bit displacement.
626
627 @item
628 @samp{@{disp32@}} -- prefer 32-bit displacement.
629
630 @item
631 @samp{@{load@}} -- prefer load-form instruction.
632
633 @item
634 @samp{@{store@}} -- prefer store-form instruction.
635
636 @item
637 @samp{@{vex2@}} -- prefer 2-byte VEX prefix for VEX instruction.
638
639 @item
640 @samp{@{vex3@}} -- prefer 3-byte VEX prefix for VEX instruction.
641
642 @item
643 @samp{@{evex@}} -- encode with EVEX prefix.
644 @end itemize
645
646 @cindex conversion instructions, i386
647 @cindex i386 conversion instructions
648 @cindex conversion instructions, x86-64
649 @cindex x86-64 conversion instructions
650 The Intel-syntax conversion instructions
651
652 @itemize @bullet
653 @item
654 @samp{cbw} --- sign-extend byte in @samp{%al} to word in @samp{%ax},
655
656 @item
657 @samp{cwde} --- sign-extend word in @samp{%ax} to long in @samp{%eax},
658
659 @item
660 @samp{cwd} --- sign-extend word in @samp{%ax} to long in @samp{%dx:%ax},
661
662 @item
663 @samp{cdq} --- sign-extend dword in @samp{%eax} to quad in @samp{%edx:%eax},
664
665 @item
666 @samp{cdqe} --- sign-extend dword in @samp{%eax} to quad in @samp{%rax}
667 (x86-64 only),
668
669 @item
670 @samp{cqo} --- sign-extend quad in @samp{%rax} to octuple in
671 @samp{%rdx:%rax} (x86-64 only),
672 @end itemize
673
674 @noindent
675 are called @samp{cbtw}, @samp{cwtl}, @samp{cwtd}, @samp{cltd}, @samp{cltq}, and
676 @samp{cqto} in AT&T naming. @code{@value{AS}} accepts either naming for these
677 instructions.
678
679 @cindex jump instructions, i386
680 @cindex call instructions, i386
681 @cindex jump instructions, x86-64
682 @cindex call instructions, x86-64
683 Far call/jump instructions are @samp{lcall} and @samp{ljmp} in
684 AT&T syntax, but are @samp{call far} and @samp{jump far} in Intel
685 convention.
686
687 @subsection AT&T Mnemonic versus Intel Mnemonic
688
689 @cindex i386 mnemonic compatibility
690 @cindex mnemonic compatibility, i386
691
692 @code{@value{AS}} supports assembly using Intel mnemonic.
693 @code{.intel_mnemonic} selects Intel mnemonic with Intel syntax, and
694 @code{.att_mnemonic} switches back to the usual AT&T mnemonic with AT&T
695 syntax for compatibility with the output of @code{@value{GCC}}.
696 Several x87 instructions, @samp{fadd}, @samp{fdiv}, @samp{fdivp},
697 @samp{fdivr}, @samp{fdivrp}, @samp{fmul}, @samp{fsub}, @samp{fsubp},
698 @samp{fsubr} and @samp{fsubrp}, are implemented in AT&T System V/386
699 assembler with different mnemonics from those in Intel IA32 specification.
700 @code{@value{GCC}} generates those instructions with AT&T mnemonic.
701
702 @node i386-Regs
703 @section Register Naming
704
705 @cindex i386 registers
706 @cindex registers, i386
707 @cindex x86-64 registers
708 @cindex registers, x86-64
709 Register operands are always prefixed with @samp{%}. The 80386 registers
710 consist of
711
712 @itemize @bullet
713 @item
714 the 8 32-bit registers @samp{%eax} (the accumulator), @samp{%ebx},
715 @samp{%ecx}, @samp{%edx}, @samp{%edi}, @samp{%esi}, @samp{%ebp} (the
716 frame pointer), and @samp{%esp} (the stack pointer).
717
718 @item
719 the 8 16-bit low-ends of these: @samp{%ax}, @samp{%bx}, @samp{%cx},
720 @samp{%dx}, @samp{%di}, @samp{%si}, @samp{%bp}, and @samp{%sp}.
721
722 @item
723 the 8 8-bit registers: @samp{%ah}, @samp{%al}, @samp{%bh},
724 @samp{%bl}, @samp{%ch}, @samp{%cl}, @samp{%dh}, and @samp{%dl} (These
725 are the high-bytes and low-bytes of @samp{%ax}, @samp{%bx},
726 @samp{%cx}, and @samp{%dx})
727
728 @item
729 the 6 section registers @samp{%cs} (code section), @samp{%ds}
730 (data section), @samp{%ss} (stack section), @samp{%es}, @samp{%fs},
731 and @samp{%gs}.
732
733 @item
734 the 5 processor control registers @samp{%cr0}, @samp{%cr2},
735 @samp{%cr3}, @samp{%cr4}, and @samp{%cr8}.
736
737 @item
738 the 6 debug registers @samp{%db0}, @samp{%db1}, @samp{%db2},
739 @samp{%db3}, @samp{%db6}, and @samp{%db7}.
740
741 @item
742 the 2 test registers @samp{%tr6} and @samp{%tr7}.
743
744 @item
745 the 8 floating point register stack @samp{%st} or equivalently
746 @samp{%st(0)}, @samp{%st(1)}, @samp{%st(2)}, @samp{%st(3)},
747 @samp{%st(4)}, @samp{%st(5)}, @samp{%st(6)}, and @samp{%st(7)}.
748 These registers are overloaded by 8 MMX registers @samp{%mm0},
749 @samp{%mm1}, @samp{%mm2}, @samp{%mm3}, @samp{%mm4}, @samp{%mm5},
750 @samp{%mm6} and @samp{%mm7}.
751
752 @item
753 the 8 128-bit SSE registers registers @samp{%xmm0}, @samp{%xmm1}, @samp{%xmm2},
754 @samp{%xmm3}, @samp{%xmm4}, @samp{%xmm5}, @samp{%xmm6} and @samp{%xmm7}.
755 @end itemize
756
757 The AMD x86-64 architecture extends the register set by:
758
759 @itemize @bullet
760 @item
761 enhancing the 8 32-bit registers to 64-bit: @samp{%rax} (the
762 accumulator), @samp{%rbx}, @samp{%rcx}, @samp{%rdx}, @samp{%rdi},
763 @samp{%rsi}, @samp{%rbp} (the frame pointer), @samp{%rsp} (the stack
764 pointer)
765
766 @item
767 the 8 extended registers @samp{%r8}--@samp{%r15}.
768
769 @item
770 the 8 32-bit low ends of the extended registers: @samp{%r8d}--@samp{%r15d}.
771
772 @item
773 the 8 16-bit low ends of the extended registers: @samp{%r8w}--@samp{%r15w}.
774
775 @item
776 the 8 8-bit low ends of the extended registers: @samp{%r8b}--@samp{%r15b}.
777
778 @item
779 the 4 8-bit registers: @samp{%sil}, @samp{%dil}, @samp{%bpl}, @samp{%spl}.
780
781 @item
782 the 8 debug registers: @samp{%db8}--@samp{%db15}.
783
784 @item
785 the 8 128-bit SSE registers: @samp{%xmm8}--@samp{%xmm15}.
786 @end itemize
787
788 With the AVX extensions more registers were made available:
789
790 @itemize @bullet
791
792 @item
793 the 16 256-bit SSE @samp{%ymm0}--@samp{%ymm15} (only the first 8
794 available in 32-bit mode). The bottom 128 bits are overlaid with the
795 @samp{xmm0}--@samp{xmm15} registers.
796
797 @end itemize
798
799 The AVX2 extensions made in 64-bit mode more registers available:
800
801 @itemize @bullet
802
803 @item
804 the 16 128-bit registers @samp{%xmm16}--@samp{%xmm31} and the 16 256-bit
805 registers @samp{%ymm16}--@samp{%ymm31}.
806
807 @end itemize
808
809 The AVX512 extensions added the following registers:
810
811 @itemize @bullet
812
813 @item
814 the 32 512-bit registers @samp{%zmm0}--@samp{%zmm31} (only the first 8
815 available in 32-bit mode). The bottom 128 bits are overlaid with the
816 @samp{%xmm0}--@samp{%xmm31} registers and the first 256 bits are
817 overlaid with the @samp{%ymm0}--@samp{%ymm31} registers.
818
819 @item
820 the 8 mask registers @samp{%k0}--@samp{%k7}.
821
822 @end itemize
823
824 @node i386-Prefixes
825 @section Instruction Prefixes
826
827 @cindex i386 instruction prefixes
828 @cindex instruction prefixes, i386
829 @cindex prefixes, i386
830 Instruction prefixes are used to modify the following instruction. They
831 are used to repeat string instructions, to provide section overrides, to
832 perform bus lock operations, and to change operand and address sizes.
833 (Most instructions that normally operate on 32-bit operands will use
834 16-bit operands if the instruction has an ``operand size'' prefix.)
835 Instruction prefixes are best written on the same line as the instruction
836 they act upon. For example, the @samp{scas} (scan string) instruction is
837 repeated with:
838
839 @smallexample
840 repne scas %es:(%edi),%al
841 @end smallexample
842
843 You may also place prefixes on the lines immediately preceding the
844 instruction, but this circumvents checks that @code{@value{AS}} does
845 with prefixes, and will not work with all prefixes.
846
847 Here is a list of instruction prefixes:
848
849 @cindex section override prefixes, i386
850 @itemize @bullet
851 @item
852 Section override prefixes @samp{cs}, @samp{ds}, @samp{ss}, @samp{es},
853 @samp{fs}, @samp{gs}. These are automatically added by specifying
854 using the @var{section}:@var{memory-operand} form for memory references.
855
856 @cindex size prefixes, i386
857 @item
858 Operand/Address size prefixes @samp{data16} and @samp{addr16}
859 change 32-bit operands/addresses into 16-bit operands/addresses,
860 while @samp{data32} and @samp{addr32} change 16-bit ones (in a
861 @code{.code16} section) into 32-bit operands/addresses. These prefixes
862 @emph{must} appear on the same line of code as the instruction they
863 modify. For example, in a 16-bit @code{.code16} section, you might
864 write:
865
866 @smallexample
867 addr32 jmpl *(%ebx)
868 @end smallexample
869
870 @cindex bus lock prefixes, i386
871 @cindex inhibiting interrupts, i386
872 @item
873 The bus lock prefix @samp{lock} inhibits interrupts during execution of
874 the instruction it precedes. (This is only valid with certain
875 instructions; see a 80386 manual for details).
876
877 @cindex coprocessor wait, i386
878 @item
879 The wait for coprocessor prefix @samp{wait} waits for the coprocessor to
880 complete the current instruction. This should never be needed for the
881 80386/80387 combination.
882
883 @cindex repeat prefixes, i386
884 @item
885 The @samp{rep}, @samp{repe}, and @samp{repne} prefixes are added
886 to string instructions to make them repeat @samp{%ecx} times (@samp{%cx}
887 times if the current address size is 16-bits).
888 @cindex REX prefixes, i386
889 @item
890 The @samp{rex} family of prefixes is used by x86-64 to encode
891 extensions to i386 instruction set. The @samp{rex} prefix has four
892 bits --- an operand size overwrite (@code{64}) used to change operand size
893 from 32-bit to 64-bit and X, Y and Z extensions bits used to extend the
894 register set.
895
896 You may write the @samp{rex} prefixes directly. The @samp{rex64xyz}
897 instruction emits @samp{rex} prefix with all the bits set. By omitting
898 the @code{64}, @code{x}, @code{y} or @code{z} you may write other
899 prefixes as well. Normally, there is no need to write the prefixes
900 explicitly, since gas will automatically generate them based on the
901 instruction operands.
902 @end itemize
903
904 @node i386-Memory
905 @section Memory References
906
907 @cindex i386 memory references
908 @cindex memory references, i386
909 @cindex x86-64 memory references
910 @cindex memory references, x86-64
911 An Intel syntax indirect memory reference of the form
912
913 @smallexample
914 @var{section}:[@var{base} + @var{index}*@var{scale} + @var{disp}]
915 @end smallexample
916
917 @noindent
918 is translated into the AT&T syntax
919
920 @smallexample
921 @var{section}:@var{disp}(@var{base}, @var{index}, @var{scale})
922 @end smallexample
923
924 @noindent
925 where @var{base} and @var{index} are the optional 32-bit base and
926 index registers, @var{disp} is the optional displacement, and
927 @var{scale}, taking the values 1, 2, 4, and 8, multiplies @var{index}
928 to calculate the address of the operand. If no @var{scale} is
929 specified, @var{scale} is taken to be 1. @var{section} specifies the
930 optional section register for the memory operand, and may override the
931 default section register (see a 80386 manual for section register
932 defaults). Note that section overrides in AT&T syntax @emph{must}
933 be preceded by a @samp{%}. If you specify a section override which
934 coincides with the default section register, @code{@value{AS}} does @emph{not}
935 output any section register override prefixes to assemble the given
936 instruction. Thus, section overrides can be specified to emphasize which
937 section register is used for a given memory operand.
938
939 Here are some examples of Intel and AT&T style memory references:
940
941 @table @asis
942 @item AT&T: @samp{-4(%ebp)}, Intel: @samp{[ebp - 4]}
943 @var{base} is @samp{%ebp}; @var{disp} is @samp{-4}. @var{section} is
944 missing, and the default section is used (@samp{%ss} for addressing with
945 @samp{%ebp} as the base register). @var{index}, @var{scale} are both missing.
946
947 @item AT&T: @samp{foo(,%eax,4)}, Intel: @samp{[foo + eax*4]}
948 @var{index} is @samp{%eax} (scaled by a @var{scale} 4); @var{disp} is
949 @samp{foo}. All other fields are missing. The section register here
950 defaults to @samp{%ds}.
951
952 @item AT&T: @samp{foo(,1)}; Intel @samp{[foo]}
953 This uses the value pointed to by @samp{foo} as a memory operand.
954 Note that @var{base} and @var{index} are both missing, but there is only
955 @emph{one} @samp{,}. This is a syntactic exception.
956
957 @item AT&T: @samp{%gs:foo}; Intel @samp{gs:foo}
958 This selects the contents of the variable @samp{foo} with section
959 register @var{section} being @samp{%gs}.
960 @end table
961
962 Absolute (as opposed to PC relative) call and jump operands must be
963 prefixed with @samp{*}. If no @samp{*} is specified, @code{@value{AS}}
964 always chooses PC relative addressing for jump/call labels.
965
966 Any instruction that has a memory operand, but no register operand,
967 @emph{must} specify its size (byte, word, long, or quadruple) with an
968 instruction mnemonic suffix (@samp{b}, @samp{w}, @samp{l} or @samp{q},
969 respectively).
970
971 The x86-64 architecture adds an RIP (instruction pointer relative)
972 addressing. This addressing mode is specified by using @samp{rip} as a
973 base register. Only constant offsets are valid. For example:
974
975 @table @asis
976 @item AT&T: @samp{1234(%rip)}, Intel: @samp{[rip + 1234]}
977 Points to the address 1234 bytes past the end of the current
978 instruction.
979
980 @item AT&T: @samp{symbol(%rip)}, Intel: @samp{[rip + symbol]}
981 Points to the @code{symbol} in RIP relative way, this is shorter than
982 the default absolute addressing.
983 @end table
984
985 Other addressing modes remain unchanged in x86-64 architecture, except
986 registers used are 64-bit instead of 32-bit.
987
988 @node i386-Jumps
989 @section Handling of Jump Instructions
990
991 @cindex jump optimization, i386
992 @cindex i386 jump optimization
993 @cindex jump optimization, x86-64
994 @cindex x86-64 jump optimization
995 Jump instructions are always optimized to use the smallest possible
996 displacements. This is accomplished by using byte (8-bit) displacement
997 jumps whenever the target is sufficiently close. If a byte displacement
998 is insufficient a long displacement is used. We do not support
999 word (16-bit) displacement jumps in 32-bit mode (i.e. prefixing the jump
1000 instruction with the @samp{data16} instruction prefix), since the 80386
1001 insists upon masking @samp{%eip} to 16 bits after the word displacement
1002 is added. (See also @pxref{i386-Arch})
1003
1004 Note that the @samp{jcxz}, @samp{jecxz}, @samp{loop}, @samp{loopz},
1005 @samp{loope}, @samp{loopnz} and @samp{loopne} instructions only come in byte
1006 displacements, so that if you use these instructions (@code{@value{GCC}} does
1007 not use them) you may get an error message (and incorrect code). The AT&T
1008 80386 assembler tries to get around this problem by expanding @samp{jcxz foo}
1009 to
1010
1011 @smallexample
1012 jcxz cx_zero
1013 jmp cx_nonzero
1014 cx_zero: jmp foo
1015 cx_nonzero:
1016 @end smallexample
1017
1018 @node i386-Float
1019 @section Floating Point
1020
1021 @cindex i386 floating point
1022 @cindex floating point, i386
1023 @cindex x86-64 floating point
1024 @cindex floating point, x86-64
1025 All 80387 floating point types except packed BCD are supported.
1026 (BCD support may be added without much difficulty). These data
1027 types are 16-, 32-, and 64- bit integers, and single (32-bit),
1028 double (64-bit), and extended (80-bit) precision floating point.
1029 Each supported type has an instruction mnemonic suffix and a constructor
1030 associated with it. Instruction mnemonic suffixes specify the operand's
1031 data type. Constructors build these data types into memory.
1032
1033 @cindex @code{float} directive, i386
1034 @cindex @code{single} directive, i386
1035 @cindex @code{double} directive, i386
1036 @cindex @code{tfloat} directive, i386
1037 @cindex @code{float} directive, x86-64
1038 @cindex @code{single} directive, x86-64
1039 @cindex @code{double} directive, x86-64
1040 @cindex @code{tfloat} directive, x86-64
1041 @itemize @bullet
1042 @item
1043 Floating point constructors are @samp{.float} or @samp{.single},
1044 @samp{.double}, and @samp{.tfloat} for 32-, 64-, and 80-bit formats.
1045 These correspond to instruction mnemonic suffixes @samp{s}, @samp{l},
1046 and @samp{t}. @samp{t} stands for 80-bit (ten byte) real. The 80387
1047 only supports this format via the @samp{fldt} (load 80-bit real to stack
1048 top) and @samp{fstpt} (store 80-bit real and pop stack) instructions.
1049
1050 @cindex @code{word} directive, i386
1051 @cindex @code{long} directive, i386
1052 @cindex @code{int} directive, i386
1053 @cindex @code{quad} directive, i386
1054 @cindex @code{word} directive, x86-64
1055 @cindex @code{long} directive, x86-64
1056 @cindex @code{int} directive, x86-64
1057 @cindex @code{quad} directive, x86-64
1058 @item
1059 Integer constructors are @samp{.word}, @samp{.long} or @samp{.int}, and
1060 @samp{.quad} for the 16-, 32-, and 64-bit integer formats. The
1061 corresponding instruction mnemonic suffixes are @samp{s} (single),
1062 @samp{l} (long), and @samp{q} (quad). As with the 80-bit real format,
1063 the 64-bit @samp{q} format is only present in the @samp{fildq} (load
1064 quad integer to stack top) and @samp{fistpq} (store quad integer and pop
1065 stack) instructions.
1066 @end itemize
1067
1068 Register to register operations should not use instruction mnemonic suffixes.
1069 @samp{fstl %st, %st(1)} will give a warning, and be assembled as if you
1070 wrote @samp{fst %st, %st(1)}, since all register to register operations
1071 use 80-bit floating point operands. (Contrast this with @samp{fstl %st, mem},
1072 which converts @samp{%st} from 80-bit to 64-bit floating point format,
1073 then stores the result in the 4 byte location @samp{mem})
1074
1075 @node i386-SIMD
1076 @section Intel's MMX and AMD's 3DNow! SIMD Operations
1077
1078 @cindex MMX, i386
1079 @cindex 3DNow!, i386
1080 @cindex SIMD, i386
1081 @cindex MMX, x86-64
1082 @cindex 3DNow!, x86-64
1083 @cindex SIMD, x86-64
1084
1085 @code{@value{AS}} supports Intel's MMX instruction set (SIMD
1086 instructions for integer data), available on Intel's Pentium MMX
1087 processors and Pentium II processors, AMD's K6 and K6-2 processors,
1088 Cyrix' M2 processor, and probably others. It also supports AMD's 3DNow!@:
1089 instruction set (SIMD instructions for 32-bit floating point data)
1090 available on AMD's K6-2 processor and possibly others in the future.
1091
1092 Currently, @code{@value{AS}} does not support Intel's floating point
1093 SIMD, Katmai (KNI).
1094
1095 The eight 64-bit MMX operands, also used by 3DNow!, are called @samp{%mm0},
1096 @samp{%mm1}, ... @samp{%mm7}. They contain eight 8-bit integers, four
1097 16-bit integers, two 32-bit integers, one 64-bit integer, or two 32-bit
1098 floating point values. The MMX registers cannot be used at the same time
1099 as the floating point stack.
1100
1101 See Intel and AMD documentation, keeping in mind that the operand order in
1102 instructions is reversed from the Intel syntax.
1103
1104 @node i386-LWP
1105 @section AMD's Lightweight Profiling Instructions
1106
1107 @cindex LWP, i386
1108 @cindex LWP, x86-64
1109
1110 @code{@value{AS}} supports AMD's Lightweight Profiling (LWP)
1111 instruction set, available on AMD's Family 15h (Orochi) processors.
1112
1113 LWP enables applications to collect and manage performance data, and
1114 react to performance events. The collection of performance data
1115 requires no context switches. LWP runs in the context of a thread and
1116 so several counters can be used independently across multiple threads.
1117 LWP can be used in both 64-bit and legacy 32-bit modes.
1118
1119 For detailed information on the LWP instruction set, see the
1120 @cite{AMD Lightweight Profiling Specification} available at
1121 @uref{http://developer.amd.com/cpu/LWP,Lightweight Profiling Specification}.
1122
1123 @node i386-BMI
1124 @section Bit Manipulation Instructions
1125
1126 @cindex BMI, i386
1127 @cindex BMI, x86-64
1128
1129 @code{@value{AS}} supports the Bit Manipulation (BMI) instruction set.
1130
1131 BMI instructions provide several instructions implementing individual
1132 bit manipulation operations such as isolation, masking, setting, or
1133 resetting.
1134
1135 @c Need to add a specification citation here when available.
1136
1137 @node i386-TBM
1138 @section AMD's Trailing Bit Manipulation Instructions
1139
1140 @cindex TBM, i386
1141 @cindex TBM, x86-64
1142
1143 @code{@value{AS}} supports AMD's Trailing Bit Manipulation (TBM)
1144 instruction set, available on AMD's BDVER2 processors (Trinity and
1145 Viperfish).
1146
1147 TBM instructions provide instructions implementing individual bit
1148 manipulation operations such as isolating, masking, setting, resetting,
1149 complementing, and operations on trailing zeros and ones.
1150
1151 @c Need to add a specification citation here when available.
1152
1153 @node i386-16bit
1154 @section Writing 16-bit Code
1155
1156 @cindex i386 16-bit code
1157 @cindex 16-bit code, i386
1158 @cindex real-mode code, i386
1159 @cindex @code{code16gcc} directive, i386
1160 @cindex @code{code16} directive, i386
1161 @cindex @code{code32} directive, i386
1162 @cindex @code{code64} directive, i386
1163 @cindex @code{code64} directive, x86-64
1164 While @code{@value{AS}} normally writes only ``pure'' 32-bit i386 code
1165 or 64-bit x86-64 code depending on the default configuration,
1166 it also supports writing code to run in real mode or in 16-bit protected
1167 mode code segments. To do this, put a @samp{.code16} or
1168 @samp{.code16gcc} directive before the assembly language instructions to
1169 be run in 16-bit mode. You can switch @code{@value{AS}} to writing
1170 32-bit code with the @samp{.code32} directive or 64-bit code with the
1171 @samp{.code64} directive.
1172
1173 @samp{.code16gcc} provides experimental support for generating 16-bit
1174 code from gcc, and differs from @samp{.code16} in that @samp{call},
1175 @samp{ret}, @samp{enter}, @samp{leave}, @samp{push}, @samp{pop},
1176 @samp{pusha}, @samp{popa}, @samp{pushf}, and @samp{popf} instructions
1177 default to 32-bit size. This is so that the stack pointer is
1178 manipulated in the same way over function calls, allowing access to
1179 function parameters at the same stack offsets as in 32-bit mode.
1180 @samp{.code16gcc} also automatically adds address size prefixes where
1181 necessary to use the 32-bit addressing modes that gcc generates.
1182
1183 The code which @code{@value{AS}} generates in 16-bit mode will not
1184 necessarily run on a 16-bit pre-80386 processor. To write code that
1185 runs on such a processor, you must refrain from using @emph{any} 32-bit
1186 constructs which require @code{@value{AS}} to output address or operand
1187 size prefixes.
1188
1189 Note that writing 16-bit code instructions by explicitly specifying a
1190 prefix or an instruction mnemonic suffix within a 32-bit code section
1191 generates different machine instructions than those generated for a
1192 16-bit code segment. In a 32-bit code section, the following code
1193 generates the machine opcode bytes @samp{66 6a 04}, which pushes the
1194 value @samp{4} onto the stack, decrementing @samp{%esp} by 2.
1195
1196 @smallexample
1197 pushw $4
1198 @end smallexample
1199
1200 The same code in a 16-bit code section would generate the machine
1201 opcode bytes @samp{6a 04} (i.e., without the operand size prefix), which
1202 is correct since the processor default operand size is assumed to be 16
1203 bits in a 16-bit code section.
1204
1205 @node i386-Arch
1206 @section Specifying CPU Architecture
1207
1208 @cindex arch directive, i386
1209 @cindex i386 arch directive
1210 @cindex arch directive, x86-64
1211 @cindex x86-64 arch directive
1212
1213 @code{@value{AS}} may be told to assemble for a particular CPU
1214 (sub-)architecture with the @code{.arch @var{cpu_type}} directive. This
1215 directive enables a warning when gas detects an instruction that is not
1216 supported on the CPU specified. The choices for @var{cpu_type} are:
1217
1218 @multitable @columnfractions .20 .20 .20 .20
1219 @item @samp{i8086} @tab @samp{i186} @tab @samp{i286} @tab @samp{i386}
1220 @item @samp{i486} @tab @samp{i586} @tab @samp{i686} @tab @samp{pentium}
1221 @item @samp{pentiumpro} @tab @samp{pentiumii} @tab @samp{pentiumiii} @tab @samp{pentium4}
1222 @item @samp{prescott} @tab @samp{nocona} @tab @samp{core} @tab @samp{core2}
1223 @item @samp{corei7} @tab @samp{l1om} @tab @samp{k1om} @samp{iamcu}
1224 @item @samp{k6} @tab @samp{k6_2} @tab @samp{athlon} @tab @samp{k8}
1225 @item @samp{amdfam10} @tab @samp{bdver1} @tab @samp{bdver2} @tab @samp{bdver3}
1226 @item @samp{bdver4} @tab @samp{znver1} @tab @samp{btver1} @tab @samp{btver2}
1227 @item @samp{generic32} @tab @samp{generic64}
1228 @item @samp{.mmx} @tab @samp{.sse} @tab @samp{.sse2} @tab @samp{.sse3}
1229 @item @samp{.ssse3} @tab @samp{.sse4.1} @tab @samp{.sse4.2} @tab @samp{.sse4}
1230 @item @samp{.avx} @tab @samp{.vmx} @tab @samp{.smx} @tab @samp{.ept}
1231 @item @samp{.clflush} @tab @samp{.movbe} @tab @samp{.xsave} @tab @samp{.xsaveopt}
1232 @item @samp{.aes} @tab @samp{.pclmul} @tab @samp{.fma} @tab @samp{.fsgsbase}
1233 @item @samp{.rdrnd} @tab @samp{.f16c} @tab @samp{.avx2} @tab @samp{.bmi2}
1234 @item @samp{.lzcnt} @tab @samp{.invpcid} @tab @samp{.vmfunc} @tab @samp{.hle}
1235 @item @samp{.rtm} @tab @samp{.adx} @tab @samp{.rdseed} @tab @samp{.prfchw}
1236 @item @samp{.smap} @tab @samp{.mpx} @tab @samp{.sha} @tab @samp{.prefetchwt1}
1237 @item @samp{.clflushopt} @tab @samp{.xsavec} @tab @samp{.xsaves} @tab @samp{.se1}
1238 @item @samp{.avx512f} @tab @samp{.avx512cd} @tab @samp{.avx512er} @tab @samp{.avx512pf}
1239 @item @samp{.avx512vl} @tab @samp{.avx512bw} @tab @samp{.avx512dq} @tab @samp{.avx512ifma}
1240 @item @samp{.avx512vbmi} @tab @samp{.avx512_4fmaps} @tab @samp{.avx512_4vnniw}
1241 @item @samp{.avx512_vpopcntdq} @tab @samp{.avx512_vbmi2} @tab @samp{.avx512_vnni}
1242 @item @samp{.avx512_bitalg}
1243 @item @samp{.clwb} @tab @samp{.rdpid} @tab @samp{.ptwrite} @tab @item @samp{.ibt}
1244 @item @samp{.wbnoinvd}
1245 @item @samp{.shstk} @tab @samp{.gfni} @tab @samp{.vaes} @tab @samp{.vpclmulqdq}
1246 @item @samp{.3dnow} @tab @samp{.3dnowa} @tab @samp{.sse4a} @tab @samp{.sse5}
1247 @item @samp{.syscall} @tab @samp{.rdtscp} @tab @samp{.svme} @tab @samp{.abm}
1248 @item @samp{.lwp} @tab @samp{.fma4} @tab @samp{.xop} @tab @samp{.cx16}
1249 @item @samp{.padlock} @tab @samp{.clzero} @tab @samp{.mwaitx}
1250 @end multitable
1251
1252 Apart from the warning, there are only two other effects on
1253 @code{@value{AS}} operation; Firstly, if you specify a CPU other than
1254 @samp{i486}, then shift by one instructions such as @samp{sarl $1, %eax}
1255 will automatically use a two byte opcode sequence. The larger three
1256 byte opcode sequence is used on the 486 (and when no architecture is
1257 specified) because it executes faster on the 486. Note that you can
1258 explicitly request the two byte opcode by writing @samp{sarl %eax}.
1259 Secondly, if you specify @samp{i8086}, @samp{i186}, or @samp{i286},
1260 @emph{and} @samp{.code16} or @samp{.code16gcc} then byte offset
1261 conditional jumps will be promoted when necessary to a two instruction
1262 sequence consisting of a conditional jump of the opposite sense around
1263 an unconditional jump to the target.
1264
1265 Following the CPU architecture (but not a sub-architecture, which are those
1266 starting with a dot), you may specify @samp{jumps} or @samp{nojumps} to
1267 control automatic promotion of conditional jumps. @samp{jumps} is the
1268 default, and enables jump promotion; All external jumps will be of the long
1269 variety, and file-local jumps will be promoted as necessary.
1270 (@pxref{i386-Jumps}) @samp{nojumps} leaves external conditional jumps as
1271 byte offset jumps, and warns about file-local conditional jumps that
1272 @code{@value{AS}} promotes.
1273 Unconditional jumps are treated as for @samp{jumps}.
1274
1275 For example
1276
1277 @smallexample
1278 .arch i8086,nojumps
1279 @end smallexample
1280
1281 @node i386-Bugs
1282 @section AT&T Syntax bugs
1283
1284 The UnixWare assembler, and probably other AT&T derived ix86 Unix
1285 assemblers, generate floating point instructions with reversed source
1286 and destination registers in certain cases. Unfortunately, gcc and
1287 possibly many other programs use this reversed syntax, so we're stuck
1288 with it.
1289
1290 For example
1291
1292 @smallexample
1293 fsub %st,%st(3)
1294 @end smallexample
1295 @noindent
1296 results in @samp{%st(3)} being updated to @samp{%st - %st(3)} rather
1297 than the expected @samp{%st(3) - %st}. This happens with all the
1298 non-commutative arithmetic floating point operations with two register
1299 operands where the source register is @samp{%st} and the destination
1300 register is @samp{%st(i)}.
1301
1302 @node i386-Notes
1303 @section Notes
1304
1305 @cindex i386 @code{mul}, @code{imul} instructions
1306 @cindex @code{mul} instruction, i386
1307 @cindex @code{imul} instruction, i386
1308 @cindex @code{mul} instruction, x86-64
1309 @cindex @code{imul} instruction, x86-64
1310 There is some trickery concerning the @samp{mul} and @samp{imul}
1311 instructions that deserves mention. The 16-, 32-, 64- and 128-bit expanding
1312 multiplies (base opcode @samp{0xf6}; extension 4 for @samp{mul} and 5
1313 for @samp{imul}) can be output only in the one operand form. Thus,
1314 @samp{imul %ebx, %eax} does @emph{not} select the expanding multiply;
1315 the expanding multiply would clobber the @samp{%edx} register, and this
1316 would confuse @code{@value{GCC}} output. Use @samp{imul %ebx} to get the
1317 64-bit product in @samp{%edx:%eax}.
1318
1319 We have added a two operand form of @samp{imul} when the first operand
1320 is an immediate mode expression and the second operand is a register.
1321 This is just a shorthand, so that, multiplying @samp{%eax} by 69, for
1322 example, can be done with @samp{imul $69, %eax} rather than @samp{imul
1323 $69, %eax, %eax}.
1324
This page took 0.058807 seconds and 4 git commands to generate.