2 @c Free Software Foundation, Inc.
3 @c This is part of the GAS manual.
4 @c For copying conditions, see the file as.texinfo.
9 @chapter Alpha Dependent Features
13 @node Machine Dependencies
14 @chapter Alpha Dependent Features
20 * Alpha Options:: Options
21 * Alpha Syntax:: Syntax
22 * Alpha Floating Point:: Floating Point
23 * Alpha Directives:: Alpha Machine Directives
24 * Alpha Opcodes:: Opcodes
30 @cindex notes for Alpha
32 The documentation here is primarily for the ELF object format.
33 @code{@value{AS}} also supports the ECOFF and EVAX formats, but
34 features specific to these formats are not yet documented.
39 @cindex options for Alpha
42 @cindex @code{-m@var{cpu}} command line option, Alpha
44 This option specifies the target processor. If an attempt is made to
45 assemble an instruction which will not execute on the target processor,
46 the assembler may either expand the instruction as a macro or issue an
47 error message. This option is equivalent to the @code{.arch} directive.
49 The following processor names are recognized:
65 The special name @code{all} may be used to allow the assembler to accept
66 instructions valid for any Alpha processor.
68 In order to support existing practice in OSF/1 with respect to @code{.arch},
69 and existing practice within @command{MILO} (the Linux ARC bootloader), the
70 numbered processor names (e.g.@: 21064) enable the processor-specific PALcode
71 instructions, while the ``electro-vlasic'' names (e.g.@: @code{ev4}) do not.
73 @cindex @code{-mdebug} command line option, Alpha
74 @cindex @code{-no-mdebug} command line option, Alpha
77 Enables or disables the generation of @code{.mdebug} encapsulation for
78 stabs directives and procedure descriptors. The default is to automatically
79 enable @code{.mdebug} when the first stabs directive is seen.
81 @cindex @code{-relax} command line option, Alpha
83 This option forces all relocations to be put into the object file, instead
84 of saving space and resolving some relocations at assembly time. Note that
85 this option does not propagate all symbol arithmetic into the object file,
86 because not all symbol arithmetic can be represented. However, the option
87 can still be useful in specific applications.
89 @cindex @code{-g} command line option, Alpha
91 This option is used when the compiler generates debug information. When
92 @command{gcc} is using @command{mips-tfile} to generate debug
93 information for ECOFF, local labels must be passed through to the object
94 file. Otherwise this option has no effect.
96 @cindex @code{-G} command line option, Alpha
98 A local common symbol larger than @var{size} is placed in @code{.bss},
99 while smaller symbols are placed in @code{.sbss}.
101 @cindex @code{-F} command line option, Alpha
102 @cindex @code{-32addr} command line option, Alpha
105 These options are ignored for backward compatibility.
111 The assembler syntax closely follow the Alpha Reference Manual;
112 assembler directives and general syntax closely follow the OSF/1 and
113 OpenVMS syntax, with a few differences for ELF.
116 * Alpha-Chars:: Special Characters
117 * Alpha-Regs:: Register Names
118 * Alpha-Relocs:: Relocations
122 @subsection Special Characters
124 @cindex line comment character, Alpha
125 @cindex Alpha line comment character
126 @samp{#} is the line comment character.
128 @cindex line separator, Alpha
129 @cindex statement separator, Alpha
130 @cindex Alpha line separator
131 @samp{;} can be used instead of a newline to separate statements.
134 @subsection Register Names
135 @cindex Alpha registers
136 @cindex register names, Alpha
138 The 32 integer registers are refered to as @samp{$@var{n}} or
139 @samp{$r@var{n}}. In addition, registers 15, 28, 29, and 30 may
140 be refered to by the symbols @samp{$fp}, @samp{$at}, @samp{$gp},
141 and @samp{$sp} respectively.
143 The 32 floating-point registers are refered to as @samp{$f@var{n}}.
146 @subsection Relocations
147 @cindex Alpha relocations
148 @cindex relocations, Alpha
150 Some of these relocations are available for ECOFF, but mostly
151 only for ELF. They are modeled after the relocation format
152 introduced in Digial Unix 4.0, but there are additions.
154 The format is @samp{!@var{tag}} or @samp{!@var{tag}!@var{number}}
155 where @var{tag} is the name of the relocation. In some cases
156 @var{number} is used to relate specific instructions.
158 The relocation is placed at the end of the instruction like so:
161 ldah $0,a($29) !gprelhigh
162 lda $0,a($0) !gprellow
163 ldq $1,b($29) !literal!100
164 ldl $2,0($1) !lituse_base!100
169 @itemx !literal!@var{N}
170 Used with an @code{ldq} instruction to load the address of a symbol
173 A sequence number @var{N} is optional, and if present is used to pair
174 @code{lituse} relocations with this @code{literal} relocation. The
175 @code{lituse} relocations are used by the linker to optimize the code
176 based on the final location of the symbol.
178 Note that these optimizations are dependent on the data flow of the
179 program. Therefore, if @emph{any} @code{lituse} is paired with a
180 @code{literal} relocation, then @emph{all} uses of the register set by
181 the @code{literal} instruction must also be marked with @code{lituse}
182 relocations. This is because the original @code{literal} instruction
183 may be deleted or transformed into another instruction.
185 Also note that there may be a one-to-many relationship between
186 @code{literal} and @code{lituse}, but not a many-to-one. That is, if
187 there are two code paths that load up the same address and feed the
188 value to a single use, then the use may not use a @code{lituse}
191 @item !lituse_base!@var{N}
192 Used with any memory format instruction (e.g.@: @code{ldl}) to indicate
193 that the literal is used for an address load. The offset field of the
194 instruction must be zero. During relaxation, the code may be altered
195 to use a gp-relative load.
197 @item !lituse_jsr!@var{N}
198 Used with a register branch format instruction (e.g.@: @code{jsr}) to
199 indicate that the literal is used for a call. During relaxation, the
200 code may be altered to use a direct branch (e.g.@: @code{bsr}).
202 @item !lituse_bytoff!@var{N}
203 Used with a byte mask instruction (e.g.@: @code{extbl}) to indicate
204 that only the low 3 bits of the address are relevant. During relaxation,
205 the code may be altered to use an immediate instead of a register shift.
207 @item !lituse_addr!@var{N}
208 Used with any other instruction to indicate that the original address
209 is in fact used, and the original @code{ldq} instruction may not be
210 altered or deleted. This is useful in conjunction with @code{lituse_jsr}
211 to test whether a weak symbol is defined.
214 ldq $27,foo($29) !literal!1
215 beq $27,is_undef !lituse_addr!1
216 jsr $26,($27),foo !lituse_jsr!1
219 @item !lituse_tlsgd!@var{N}
220 Used with a register branch format instruction to indicate that the
221 literal is the call to @code{__tls_get_addr} used to compute the
222 address of the thread-local storage variable whose descriptor was
223 loaded with @code{!tlsgd!@var{N}}.
225 @item !lituse_tlsldm!@var{N}
226 Used with a register branch format instruction to indicate that the
227 literal is the call to @code{__tls_get_addr} used to compute the
228 address of the base of the thread-local storage block for the current
229 module. The descriptor for the module must have been loaded with
230 @code{!tlsldm!@var{N}}.
232 @item !gpdisp!@var{N}
233 Used with @code{ldah} and @code{lda} to load the GP from the current
234 address, a-la the @code{ldgp} macro. The source register for the
235 @code{ldah} instruction must contain the address of the @code{ldah}
236 instruction. There must be exactly one @code{lda} instruction paired
237 with the @code{ldah} instruction, though it may appear anywhere in
238 the instruction stream. The immediate operands must be zero.
242 ldah $29,0($26) !gpdisp!1
243 lda $29,0($29) !gpdisp!1
247 Used with an @code{ldah} instruction to add the high 16 bits of a
248 32-bit displacement from the GP.
251 Used with any memory format instruction to add the low 16 bits of a
252 32-bit displacement from the GP.
255 Used with any memory format instruction to add a 16-bit displacement
259 Used with any branch format instruction to skip the GP load at the
260 target address. The referenced symbol must have the same GP as the
261 source object file, and it must be declared to either not use @code{$27}
262 or perform a standard GP load in the first two instructions via the
263 @code{.prologue} directive.
266 @itemx !tlsgd!@var{N}
267 Used with an @code{lda} instruction to load the address of a TLS
268 descriptor for a symbol in the GOT.
270 The sequence number @var{N} is optional, and if present it used to
271 pair the descriptor load with both the @code{literal} loading the
272 address of the @code{__tls_get_addr} function and the @code{lituse_tlsgd}
273 marking the call to that function.
275 For proper relaxation, both the @code{tlsgd}, @code{literal} and
276 @code{lituse} relocations must be in the same extended basic block.
277 That is, the relocation with the lowest address must be executed
281 @itemx !tlsldm!@var{N}
282 Used with an @code{lda} instruction to load the address of a TLS
283 descriptor for the current module in the GOT.
285 Similar in other respects to @code{tlsgd}.
288 Used with an @code{ldq} instruction to load the offset of the TLS
289 symbol within its module's thread-local storage block. Also known
290 as the dynamic thread pointer offset or dtp-relative offset.
295 Like @code{gprel} relocations except they compute dtp-relative offsets.
298 Used with an @code{ldq} instruction to load the offset of the TLS
299 symbol from the thread pointer. Also known as the tp-relative offset.
304 Like @code{gprel} relocations except they compute tp-relative offsets.
307 @node Alpha Floating Point
308 @section Floating Point
309 @cindex floating point, Alpha (@sc{ieee})
310 @cindex Alpha floating point (@sc{ieee})
311 The Alpha family uses both @sc{ieee} and VAX floating-point numbers.
313 @node Alpha Directives
314 @section Alpha Assembler Directives
316 @command{@value{AS}} for the Alpha supports many additional directives for
317 compatibility with the native assembler. This section describes them only
320 @cindex Alpha-only directives
321 These are the additional directives in @code{@value{AS}} for the Alpha:
324 @item .arch @var{cpu}
325 Specifies the target processor. This is equivalent to the
326 @option{-m@var{cpu}} command-line option. @xref{Alpha Options, Options},
327 for a list of values for @var{cpu}.
329 @item .ent @var{function}[, @var{n}]
330 Mark the beginning of @var{function}. An optional number may follow for
331 compatibility with the OSF/1 assembler, but is ignored. When generating
332 @code{.mdebug} information, this will create a procedure descriptor for
333 the function. In ELF, it will mark the symbol as a function a-la the
334 generic @code{.type} directive.
336 @item .end @var{function}
337 Mark the end of @var{function}. In ELF, it will set the size of the symbol
338 a-la the generic @code{.size} directive.
340 @item .mask @var{mask}, @var{offset}
341 Indicate which of the integer registers are saved in the current
342 function's stack frame. @var{mask} is interpreted a bit mask in which
343 bit @var{n} set indicates that register @var{n} is saved. The registers
344 are saved in a block located @var{offset} bytes from the @dfn{canonical
345 frame address} (CFA) which is the value of the stack pointer on entry to
346 the function. The registers are saved sequentially, except that the
347 return address register (normally @code{$26}) is saved first.
349 This and the other directives that describe the stack frame are
350 currently only used when generating @code{.mdebug} information. They
351 may in the future be used to generate DWARF2 @code{.debug_frame} unwind
352 information for hand written assembly.
354 @item .fmask @var{mask}, @var{offset}
355 Indicate which of the floating-point registers are saved in the current
356 stack frame. The @var{mask} and @var{offset} parameters are interpreted
357 as with @code{.mask}.
359 @item .frame @var{framereg}, @var{frameoffset}, @var{retreg}[, @var{argoffset}]
360 Describes the shape of the stack frame. The frame pointer in use is
361 @var{framereg}; normally this is either @code{$fp} or @code{$sp}. The
362 frame pointer is @var{frameoffset} bytes below the CFA. The return
363 address is initially located in @var{retreg} until it is saved as
364 indicated in @code{.mask}. For compatibility with OSF/1 an optional
365 @var{argoffset} parameter is accepted and ignored. It is believed to
366 indicate the offset from the CFA to the saved argument registers.
368 @item .prologue @var{n}
369 Indicate that the stack frame is set up and all registers have been
370 spilled. The argument @var{n} indicates whether and how the function
371 uses the incoming @dfn{procedure vector} (the address of the called
372 function) in @code{$27}. 0 indicates that @code{$27} is not used; 1
373 indicates that the first two instructions of the function use @code{$27}
374 to perform a load of the GP register; 2 indicates that @code{$27} is
375 used in some non-standard way and so the linker cannot elide the load of
376 the procedure vector during relaxation.
378 @item .gprel32 @var{expression}
379 Computes the difference between the address in @var{expression} and the
380 GP for the current object file, and stores it in 4 bytes. In addition
381 to being smaller than a full 8 byte address, this also does not require
382 a dynamic relocation when used in a shared library.
384 @item .t_floating @var{expression}
385 Stores @var{expression} as an @sc{ieee} double precision value.
387 @item .s_floating @var{expression}
388 Stores @var{expression} as an @sc{ieee} single precision value.
390 @item .f_floating @var{expression}
391 Stores @var{expression} as a VAX F format value.
393 @item .g_floating @var{expression}
394 Stores @var{expression} as a VAX G format value.
396 @item .d_floating @var{expression}
397 Stores @var{expression} as a VAX D format value.
399 @item .set @var{feature}
400 Enables or disables various assembler features. Using the positive
401 name of the feature enables while using @samp{no@var{feature}} disables.
405 Indicates that macro expansions may clobber the @dfn{assembler
406 temporary} (@code{$at} or @code{$28}) register. Some macros may not be
407 expanded without this and will generate an error message if @code{noat}
408 is in effect. When @code{at} is in effect, a warning will be generated
409 if @code{$at} is used by the programmer.
412 Enables the expasion of macro instructions. Note that variants of real
413 instructions, such as @code{br label} vs @code{br $31,label} are
414 considered alternate forms and not macros.
419 These control whether and how the assembler may re-order instructions.
420 Accepted for compatibility with the OSF/1 assembler, but @command{@value{AS}}
421 does not do instruction scheduling, so these features are ignored.
425 The following directives are recognized for compatibility with the OSF/1
426 assembler but are ignored.
438 For detailed information on the Alpha machine instruction set, see the
439 @c Attempt to work around a very overfull hbox.
441 Alpha Architecture Handbook located at
444 ftp://ftp.digital.com/pub/Digital/info/semiconductor/literature/alphaahb.pdf
449 @uref{ftp://ftp.digital.com/pub/Digital/info/semiconductor/literature/alphaahb.pdf,Alpha Architecture Handbook}.