* tc-i386.c (md_assemble): Handle third byte of the opcode as prefix.
[deliverable/binutils-gdb.git] / gas / doc / c-i386.texi
CommitLineData
252b5132
RH
1@c Copyright (C) 1991, 92, 93, 94, 95, 97, 1998 Free Software Foundation, Inc.
2@c This is part of the GAS manual.
3@c For copying conditions, see the file as.texinfo.
4@ifset GENERIC
5@page
6@node i386-Dependent
7@chapter 80386 Dependent Features
8@end ifset
9@ifclear GENERIC
10@node Machine Dependencies
11@chapter 80386 Dependent Features
12@end ifclear
13
14@cindex i386 support
15@cindex i80306 support
16@menu
17* i386-Options:: Options
18* i386-Syntax:: AT&T Syntax versus Intel Syntax
19* i386-Mnemonics:: Instruction Naming
20* i386-Regs:: Register Naming
21* i386-Prefixes:: Instruction Prefixes
22* i386-Memory:: Memory References
23* i386-jumps:: Handling of Jump Instructions
24* i386-Float:: Floating Point
25* i386-SIMD:: Intel's MMX and AMD's 3DNow! SIMD Operations
26* i386-16bit:: Writing 16-bit Code
e413e4e9 27* i386-Arch:: Specifying an x86 CPU architecture
252b5132
RH
28* i386-Bugs:: AT&T Syntax bugs
29* i386-Notes:: Notes
30@end menu
31
32@node i386-Options
33@section Options
34
35@cindex options for i386 (none)
36@cindex i386 options (none)
37The 80386 has no machine dependent options.
38
e413e4e9 39
252b5132
RH
40@node i386-Syntax
41@section AT&T Syntax versus Intel Syntax
42
e413e4e9
AM
43@cindex i386 intel_syntax pseudo op
44@cindex intel_syntax pseudo op, i386
45@cindex i386 att_syntax pseudo op
46@cindex att_syntax pseudo op, i386
252b5132
RH
47@cindex i386 syntax compatibility
48@cindex syntax compatibility, i386
e413e4e9
AM
49
50@code{@value{AS}} now supports assembly using Intel assembler syntax.
51@code{.intel_syntax} selects Intel mode, and @code{.att_syntax} switches
52back to the usual AT&T mode for compatibility with the output of
53@code{@value{GCC}}. Either of these directives may have an optional
54argument, @code{prefix}, or @code{noprefix} specifying whether registers
55require a @samp{%} prefix. AT&T System V/386 assembler syntax is quite
252b5132
RH
56different from Intel syntax. We mention these differences because
57almost all 80386 documents use Intel syntax. Notable differences
58between the two syntaxes are:
59
60@cindex immediate operands, i386
61@cindex i386 immediate operands
62@cindex register operands, i386
63@cindex i386 register operands
64@cindex jump/call operands, i386
65@cindex i386 jump/call operands
66@cindex operand delimiters, i386
67@itemize @bullet
68@item
69AT&T immediate operands are preceded by @samp{$}; Intel immediate
70operands are undelimited (Intel @samp{push 4} is AT&T @samp{pushl $4}).
71AT&T register operands are preceded by @samp{%}; Intel register operands
72are undelimited. AT&T absolute (as opposed to PC relative) jump/call
73operands are prefixed by @samp{*}; they are undelimited in Intel syntax.
74
75@cindex i386 source, destination operands
76@cindex source, destination operands; i386
77@item
78AT&T and Intel syntax use the opposite order for source and destination
79operands. Intel @samp{add eax, 4} is @samp{addl $4, %eax}. The
80@samp{source, dest} convention is maintained for compatibility with
81previous Unix assemblers. Note that instructions with more than one
82source operand, such as the @samp{enter} instruction, do @emph{not} have
83reversed order. @ref{i386-Bugs}.
84
85@cindex mnemonic suffixes, i386
86@cindex sizes operands, i386
87@cindex i386 size suffixes
88@item
89In AT&T syntax the size of memory operands is determined from the last
90character of the instruction mnemonic. Mnemonic suffixes of @samp{b},
91@samp{w}, and @samp{l} specify byte (8-bit), word (16-bit), and long
92(32-bit) memory references. Intel syntax accomplishes this by prefixing
93memory operands (@emph{not} the instruction mnemonics) with @samp{byte
94ptr}, @samp{word ptr}, and @samp{dword ptr}. Thus, Intel @samp{mov al,
95byte ptr @var{foo}} is @samp{movb @var{foo}, %al} in AT&T syntax.
96
97@cindex return instructions, i386
98@cindex i386 jump, call, return
99@item
100Immediate form long jumps and calls are
101@samp{lcall/ljmp $@var{section}, $@var{offset}} in AT&T syntax; the
102Intel syntax is
103@samp{call/jmp far @var{section}:@var{offset}}. Also, the far return
104instruction
105is @samp{lret $@var{stack-adjust}} in AT&T syntax; Intel syntax is
106@samp{ret far @var{stack-adjust}}.
107
108@cindex sections, i386
109@cindex i386 sections
110@item
111The AT&T assembler does not provide support for multiple section
112programs. Unix style systems expect all programs to be single sections.
113@end itemize
114
115@node i386-Mnemonics
116@section Instruction Naming
117
118@cindex i386 instruction naming
119@cindex instruction naming, i386
120Instruction mnemonics are suffixed with one character modifiers which
121specify the size of operands. The letters @samp{b}, @samp{w}, and
122@samp{l} specify byte, word, and long operands. If no suffix is
123specified by an instruction then @code{@value{AS}} tries to fill in the
124missing suffix based on the destination register operand (the last one
125by convention). Thus, @samp{mov %ax, %bx} is equivalent to @samp{movw
126%ax, %bx}; also, @samp{mov $1, %bx} is equivalent to @samp{movw $1,
127%bx}. Note that this is incompatible with the AT&T Unix assembler which
128assumes that a missing mnemonic suffix implies long operand size. (This
129incompatibility does not affect compiler output since compilers always
130explicitly specify the mnemonic suffix.)
131
132Almost all instructions have the same names in AT&T and Intel format.
133There are a few exceptions. The sign extend and zero extend
134instructions need two sizes to specify them. They need a size to
135sign/zero extend @emph{from} and a size to zero extend @emph{to}. This
136is accomplished by using two instruction mnemonic suffixes in AT&T
137syntax. Base names for sign extend and zero extend are
138@samp{movs@dots{}} and @samp{movz@dots{}} in AT&T syntax (@samp{movsx}
139and @samp{movzx} in Intel syntax). The instruction mnemonic suffixes
140are tacked on to this base name, the @emph{from} suffix before the
141@emph{to} suffix. Thus, @samp{movsbl %al, %edx} is AT&T syntax for
142``move sign extend @emph{from} %al @emph{to} %edx.'' Possible suffixes,
143thus, are @samp{bl} (from byte to long), @samp{bw} (from byte to word),
144and @samp{wl} (from word to long).
145
146@cindex conversion instructions, i386
147@cindex i386 conversion instructions
148The Intel-syntax conversion instructions
149
150@itemize @bullet
151@item
152@samp{cbw} --- sign-extend byte in @samp{%al} to word in @samp{%ax},
153
154@item
155@samp{cwde} --- sign-extend word in @samp{%ax} to long in @samp{%eax},
156
157@item
158@samp{cwd} --- sign-extend word in @samp{%ax} to long in @samp{%dx:%ax},
159
160@item
161@samp{cdq} --- sign-extend dword in @samp{%eax} to quad in @samp{%edx:%eax},
162@end itemize
163
164@noindent
165are called @samp{cbtw}, @samp{cwtl}, @samp{cwtd}, and @samp{cltd} in
166AT&T naming. @code{@value{AS}} accepts either naming for these instructions.
167
168@cindex jump instructions, i386
169@cindex call instructions, i386
170Far call/jump instructions are @samp{lcall} and @samp{ljmp} in
171AT&T syntax, but are @samp{call far} and @samp{jump far} in Intel
172convention.
173
174@node i386-Regs
175@section Register Naming
176
177@cindex i386 registers
178@cindex registers, i386
179Register operands are always prefixed with @samp{%}. The 80386 registers
180consist of
181
182@itemize @bullet
183@item
184the 8 32-bit registers @samp{%eax} (the accumulator), @samp{%ebx},
185@samp{%ecx}, @samp{%edx}, @samp{%edi}, @samp{%esi}, @samp{%ebp} (the
186frame pointer), and @samp{%esp} (the stack pointer).
187
188@item
189the 8 16-bit low-ends of these: @samp{%ax}, @samp{%bx}, @samp{%cx},
190@samp{%dx}, @samp{%di}, @samp{%si}, @samp{%bp}, and @samp{%sp}.
191
192@item
193the 8 8-bit registers: @samp{%ah}, @samp{%al}, @samp{%bh},
194@samp{%bl}, @samp{%ch}, @samp{%cl}, @samp{%dh}, and @samp{%dl} (These
195are the high-bytes and low-bytes of @samp{%ax}, @samp{%bx},
196@samp{%cx}, and @samp{%dx})
197
198@item
199the 6 section registers @samp{%cs} (code section), @samp{%ds}
200(data section), @samp{%ss} (stack section), @samp{%es}, @samp{%fs},
201and @samp{%gs}.
202
203@item
204the 3 processor control registers @samp{%cr0}, @samp{%cr2}, and
205@samp{%cr3}.
206
207@item
208the 6 debug registers @samp{%db0}, @samp{%db1}, @samp{%db2},
209@samp{%db3}, @samp{%db6}, and @samp{%db7}.
210
211@item
212the 2 test registers @samp{%tr6} and @samp{%tr7}.
213
214@item
215the 8 floating point register stack @samp{%st} or equivalently
216@samp{%st(0)}, @samp{%st(1)}, @samp{%st(2)}, @samp{%st(3)},
217@samp{%st(4)}, @samp{%st(5)}, @samp{%st(6)}, and @samp{%st(7)}.
218@end itemize
219
220@node i386-Prefixes
221@section Instruction Prefixes
222
223@cindex i386 instruction prefixes
224@cindex instruction prefixes, i386
225@cindex prefixes, i386
226Instruction prefixes are used to modify the following instruction. They
227are used to repeat string instructions, to provide section overrides, to
228perform bus lock operations, and to change operand and address sizes.
229(Most instructions that normally operate on 32-bit operands will use
23016-bit operands if the instruction has an ``operand size'' prefix.)
231Instruction prefixes are best written on the same line as the instruction
232they act upon. For example, the @samp{scas} (scan string) instruction is
233repeated with:
234
235@smallexample
236 repne scas %es:(%edi),%al
237@end smallexample
238
239You may also place prefixes on the lines immediately preceding the
240instruction, but this circumvents checks that @code{@value{AS}} does
241with prefixes, and will not work with all prefixes.
242
243Here is a list of instruction prefixes:
244
245@cindex section override prefixes, i386
246@itemize @bullet
247@item
248Section override prefixes @samp{cs}, @samp{ds}, @samp{ss}, @samp{es},
249@samp{fs}, @samp{gs}. These are automatically added by specifying
250using the @var{section}:@var{memory-operand} form for memory references.
251
252@cindex size prefixes, i386
253@item
254Operand/Address size prefixes @samp{data16} and @samp{addr16}
255change 32-bit operands/addresses into 16-bit operands/addresses,
256while @samp{data32} and @samp{addr32} change 16-bit ones (in a
257@code{.code16} section) into 32-bit operands/addresses. These prefixes
258@emph{must} appear on the same line of code as the instruction they
259modify. For example, in a 16-bit @code{.code16} section, you might
260write:
261
262@smallexample
263 addr32 jmpl *(%ebx)
264@end smallexample
265
266@cindex bus lock prefixes, i386
267@cindex inhibiting interrupts, i386
268@item
269The bus lock prefix @samp{lock} inhibits interrupts during execution of
270the instruction it precedes. (This is only valid with certain
271instructions; see a 80386 manual for details).
272
273@cindex coprocessor wait, i386
274@item
275The wait for coprocessor prefix @samp{wait} waits for the coprocessor to
276complete the current instruction. This should never be needed for the
27780386/80387 combination.
278
279@cindex repeat prefixes, i386
280@item
281The @samp{rep}, @samp{repe}, and @samp{repne} prefixes are added
282to string instructions to make them repeat @samp{%ecx} times (@samp{%cx}
283times if the current address size is 16-bits).
284@end itemize
285
286@node i386-Memory
287@section Memory References
288
289@cindex i386 memory references
290@cindex memory references, i386
291An Intel syntax indirect memory reference of the form
292
293@smallexample
294@var{section}:[@var{base} + @var{index}*@var{scale} + @var{disp}]
295@end smallexample
296
297@noindent
298is translated into the AT&T syntax
299
300@smallexample
301@var{section}:@var{disp}(@var{base}, @var{index}, @var{scale})
302@end smallexample
303
304@noindent
305where @var{base} and @var{index} are the optional 32-bit base and
306index registers, @var{disp} is the optional displacement, and
307@var{scale}, taking the values 1, 2, 4, and 8, multiplies @var{index}
308to calculate the address of the operand. If no @var{scale} is
309specified, @var{scale} is taken to be 1. @var{section} specifies the
310optional section register for the memory operand, and may override the
311default section register (see a 80386 manual for section register
312defaults). Note that section overrides in AT&T syntax @emph{must}
313be preceded by a @samp{%}. If you specify a section override which
314coincides with the default section register, @code{@value{AS}} does @emph{not}
315output any section register override prefixes to assemble the given
316instruction. Thus, section overrides can be specified to emphasize which
317section register is used for a given memory operand.
318
319Here are some examples of Intel and AT&T style memory references:
320
321@table @asis
322@item AT&T: @samp{-4(%ebp)}, Intel: @samp{[ebp - 4]}
323@var{base} is @samp{%ebp}; @var{disp} is @samp{-4}. @var{section} is
324missing, and the default section is used (@samp{%ss} for addressing with
325@samp{%ebp} as the base register). @var{index}, @var{scale} are both missing.
326
327@item AT&T: @samp{foo(,%eax,4)}, Intel: @samp{[foo + eax*4]}
328@var{index} is @samp{%eax} (scaled by a @var{scale} 4); @var{disp} is
329@samp{foo}. All other fields are missing. The section register here
330defaults to @samp{%ds}.
331
332@item AT&T: @samp{foo(,1)}; Intel @samp{[foo]}
333This uses the value pointed to by @samp{foo} as a memory operand.
334Note that @var{base} and @var{index} are both missing, but there is only
335@emph{one} @samp{,}. This is a syntactic exception.
336
337@item AT&T: @samp{%gs:foo}; Intel @samp{gs:foo}
338This selects the contents of the variable @samp{foo} with section
339register @var{section} being @samp{%gs}.
340@end table
341
342Absolute (as opposed to PC relative) call and jump operands must be
343prefixed with @samp{*}. If no @samp{*} is specified, @code{@value{AS}}
344always chooses PC relative addressing for jump/call labels.
345
346Any instruction that has a memory operand, but no register operand,
347@emph{must} specify its size (byte, word, or long) with an instruction
348mnemonic suffix (@samp{b}, @samp{w}, or @samp{l}, respectively).
349
350@node i386-jumps
351@section Handling of Jump Instructions
352
353@cindex jump optimization, i386
354@cindex i386 jump optimization
355Jump instructions are always optimized to use the smallest possible
356displacements. This is accomplished by using byte (8-bit) displacement
357jumps whenever the target is sufficiently close. If a byte displacement
358is insufficient a long (32-bit) displacement is used. We do not support
359word (16-bit) displacement jumps in 32-bit mode (i.e. prefixing the jump
360instruction with the @samp{data16} instruction prefix), since the 80386
361insists upon masking @samp{%eip} to 16 bits after the word displacement
362is added.
363
364Note that the @samp{jcxz}, @samp{jecxz}, @samp{loop}, @samp{loopz},
365@samp{loope}, @samp{loopnz} and @samp{loopne} instructions only come in byte
366displacements, so that if you use these instructions (@code{@value{GCC}} does
367not use them) you may get an error message (and incorrect code). The AT&T
36880386 assembler tries to get around this problem by expanding @samp{jcxz foo}
369to
370
371@smallexample
372 jcxz cx_zero
373 jmp cx_nonzero
374cx_zero: jmp foo
375cx_nonzero:
376@end smallexample
377
378@node i386-Float
379@section Floating Point
380
381@cindex i386 floating point
382@cindex floating point, i386
383All 80387 floating point types except packed BCD are supported.
384(BCD support may be added without much difficulty). These data
385types are 16-, 32-, and 64- bit integers, and single (32-bit),
386double (64-bit), and extended (80-bit) precision floating point.
387Each supported type has an instruction mnemonic suffix and a constructor
388associated with it. Instruction mnemonic suffixes specify the operand's
389data type. Constructors build these data types into memory.
390
391@cindex @code{float} directive, i386
392@cindex @code{single} directive, i386
393@cindex @code{double} directive, i386
394@cindex @code{tfloat} directive, i386
395@itemize @bullet
396@item
397Floating point constructors are @samp{.float} or @samp{.single},
398@samp{.double}, and @samp{.tfloat} for 32-, 64-, and 80-bit formats.
399These correspond to instruction mnemonic suffixes @samp{s}, @samp{l},
400and @samp{t}. @samp{t} stands for 80-bit (ten byte) real. The 80387
401only supports this format via the @samp{fldt} (load 80-bit real to stack
402top) and @samp{fstpt} (store 80-bit real and pop stack) instructions.
403
404@cindex @code{word} directive, i386
405@cindex @code{long} directive, i386
406@cindex @code{int} directive, i386
407@cindex @code{quad} directive, i386
408@item
409Integer constructors are @samp{.word}, @samp{.long} or @samp{.int}, and
410@samp{.quad} for the 16-, 32-, and 64-bit integer formats. The
411corresponding instruction mnemonic suffixes are @samp{s} (single),
412@samp{l} (long), and @samp{q} (quad). As with the 80-bit real format,
413the 64-bit @samp{q} format is only present in the @samp{fildq} (load
414quad integer to stack top) and @samp{fistpq} (store quad integer and pop
415stack) instructions.
416@end itemize
417
418Register to register operations should not use instruction mnemonic suffixes.
419@samp{fstl %st, %st(1)} will give a warning, and be assembled as if you
420wrote @samp{fst %st, %st(1)}, since all register to register operations
421use 80-bit floating point operands. (Contrast this with @samp{fstl %st, mem},
422which converts @samp{%st} from 80-bit to 64-bit floating point format,
423then stores the result in the 4 byte location @samp{mem})
424
425@node i386-SIMD
426@section Intel's MMX and AMD's 3DNow! SIMD Operations
427
428@cindex MMX, i386
429@cindex 3DNow!, i386
430@cindex SIMD, i386
431
432@code{@value{AS}} supports Intel's MMX instruction set (SIMD
433instructions for integer data), available on Intel's Pentium MMX
434processors and Pentium II processors, AMD's K6 and K6-2 processors,
435Cyrix' M2 processor, and probably others. It also supports AMD's 3DNow!
436instruction set (SIMD instructions for 32-bit floating point data)
437available on AMD's K6-2 processor and possibly others in the future.
438
439Currently, @code{@value{AS}} does not support Intel's floating point
440SIMD, Katmai (KNI).
441
442The eight 64-bit MMX operands, also used by 3DNow!, are called @samp{%mm0},
443@samp{%mm1}, ... @samp{%mm7}. They contain eight 8-bit integers, four
44416-bit integers, two 32-bit integers, one 64-bit integer, or two 32-bit
445floating point values. The MMX registers cannot be used at the same time
446as the floating point stack.
447
448See Intel and AMD documentation, keeping in mind that the operand order in
449instructions is reversed from the Intel syntax.
450
451@node i386-16bit
452@section Writing 16-bit Code
453
454@cindex i386 16-bit code
455@cindex 16-bit code, i386
456@cindex real-mode code, i386
eecb386c 457@cindex @code{code16gcc} directive, i386
252b5132
RH
458@cindex @code{code16} directive, i386
459@cindex @code{code32} directive, i386
460While @code{@value{AS}} normally writes only ``pure'' 32-bit i386 code,
461it also supports writing code to run in real mode or in 16-bit protected
eecb386c
AM
462mode code segments. To do this, put a @samp{.code16} or
463@samp{.code16gcc} directive before the assembly language instructions to
464be run in 16-bit mode. You can switch @code{@value{AS}} back to writing
465normal 32-bit code with the @samp{.code32} directive.
466
467@samp{.code16gcc} provides experimental support for generating 16-bit
468code from gcc, and differs from @samp{.code16} in that @samp{call},
469@samp{ret}, @samp{enter}, @samp{leave}, @samp{push}, @samp{pop},
470@samp{pusha}, @samp{popa}, @samp{pushf}, and @samp{popf} instructions
471default to 32-bit size. This is so that the stack pointer is
472manipulated in the same way over function calls, allowing access to
473function parameters at the same stack offsets as in 32-bit mode.
474@samp{.code16gcc} also automatically adds address size prefixes where
475necessary to use the 32-bit addressing modes that gcc generates.
252b5132
RH
476
477The code which @code{@value{AS}} generates in 16-bit mode will not
478necessarily run on a 16-bit pre-80386 processor. To write code that
479runs on such a processor, you must refrain from using @emph{any} 32-bit
480constructs which require @code{@value{AS}} to output address or operand
481size prefixes.
482
483Note that writing 16-bit code instructions by explicitly specifying a
484prefix or an instruction mnemonic suffix within a 32-bit code section
485generates different machine instructions than those generated for a
48616-bit code segment. In a 32-bit code section, the following code
487generates the machine opcode bytes @samp{66 6a 04}, which pushes the
488value @samp{4} onto the stack, decrementing @samp{%esp} by 2.
489
490@smallexample
491 pushw $4
492@end smallexample
493
494The same code in a 16-bit code section would generate the machine
495opcode bytes @samp{6a 04} (ie. without the operand size prefix), which
496is correct since the processor default operand size is assumed to be 16
497bits in a 16-bit code section.
498
499@node i386-Bugs
500@section AT&T Syntax bugs
501
502The UnixWare assembler, and probably other AT&T derived ix86 Unix
503assemblers, generate floating point instructions with reversed source
504and destination registers in certain cases. Unfortunately, gcc and
505possibly many other programs use this reversed syntax, so we're stuck
506with it.
507
508For example
509
510@smallexample
511 fsub %st,%st(3)
512@end smallexample
513@noindent
514results in @samp{%st(3)} being updated to @samp{%st - %st(3)} rather
515than the expected @samp{%st(3) - %st}. This happens with all the
516non-commutative arithmetic floating point operations with two register
517operands where the source register is @samp{%st} and the destination
518register is @samp{%st(i)}.
519
e413e4e9
AM
520@node i386-Arch
521@section Specifying CPU Architecture
522
523@cindex arch directive, i386
524@cindex i386 arch directive
525
526@code{@value{AS}} may be told to assemble for a particular CPU
527architecture with the @code{.arch @var{cpu_type}} directive. This
528directive enables a warning when gas detects an instruction that is not
529supported on the CPU specified. The choices for @var{cpu_type} are:
530
531@multitable @columnfractions .20 .20 .20 .20
532@item @samp{i8086} @tab @samp{i186} @tab @samp{i286} @tab @samp{i386}
533@item @samp{i486} @tab @samp{i586} @tab @samp{i686} @tab @samp{pentium}
534@item @samp{pentiumpro} @tab @samp{k6} @tab @samp{athlon}
535@end multitable
536
537Apart from the warning, there is only one other effect on
538@code{@value{AS}} operation; If you specify a CPU other than
539@samp{i486}, then shift by one instructions such as @samp{sarl $1, %eax}
540will automatically use a two byte opcode sequence. The larger three
541byte opcode sequence is used on the 486 (and when no architecture is
542specified) because it executes faster on the 486. Note that you can
543explicitly request the two byte opcode by writing @samp{sarl %eax}.
544
252b5132
RH
545@node i386-Notes
546@section Notes
547
548@cindex i386 @code{mul}, @code{imul} instructions
549@cindex @code{mul} instruction, i386
550@cindex @code{imul} instruction, i386
551There is some trickery concerning the @samp{mul} and @samp{imul}
552instructions that deserves mention. The 16-, 32-, and 64-bit expanding
553multiplies (base opcode @samp{0xf6}; extension 4 for @samp{mul} and 5
554for @samp{imul}) can be output only in the one operand form. Thus,
555@samp{imul %ebx, %eax} does @emph{not} select the expanding multiply;
556the expanding multiply would clobber the @samp{%edx} register, and this
557would confuse @code{@value{GCC}} output. Use @samp{imul %ebx} to get the
55864-bit product in @samp{%edx:%eax}.
559
560We have added a two operand form of @samp{imul} when the first operand
561is an immediate mode expression and the second operand is a register.
562This is just a shorthand, so that, multiplying @samp{%eax} by 69, for
563example, can be done with @samp{imul $69, %eax} rather than @samp{imul
564$69, %eax, %eax}.
565
This page took 0.082776 seconds and 4 git commands to generate.