c-mmix.texi revision 1.1.1.5.12.1 1 1.1.1.5.12.1 pgoyette @c Copyright (C) 2001-2018 Free Software Foundation, Inc.
2 1.1 skrll @c This is part of the GAS manual.
3 1.1 skrll @c For copying conditions, see the file as.texinfo.
4 1.1 skrll @c MMIX description by Hans-Peter Nilsson, hp (a] bitrange.com
5 1.1 skrll @ifset GENERIC
6 1.1 skrll @page
7 1.1 skrll @node MMIX-Dependent
8 1.1 skrll @chapter MMIX Dependent Features
9 1.1 skrll @end ifset
10 1.1 skrll @ifclear GENERIC
11 1.1 skrll @node Machine Dependencies
12 1.1 skrll @chapter MMIX Dependent Features
13 1.1 skrll @end ifclear
14 1.1 skrll
15 1.1 skrll @cindex MMIX support
16 1.1 skrll @menu
17 1.1 skrll * MMIX-Opts:: Command-line Options
18 1.1 skrll * MMIX-Expand:: Instruction expansion
19 1.1 skrll * MMIX-Syntax:: Syntax
20 1.1 skrll * MMIX-mmixal:: Differences to @code{mmixal} syntax and semantics
21 1.1 skrll @end menu
22 1.1 skrll
23 1.1 skrll @node MMIX-Opts
24 1.1 skrll @section Command-line Options
25 1.1 skrll
26 1.1 skrll @cindex options, MMIX
27 1.1 skrll @cindex MMIX options
28 1.1 skrll The MMIX version of @code{@value{AS}} has some machine-dependent options.
29 1.1 skrll
30 1.1 skrll @cindex @samp{--fixed-special-register-names} command line option, MMIX
31 1.1 skrll When @samp{--fixed-special-register-names} is specified, only the register
32 1.1 skrll names specified in @ref{MMIX-Regs} are recognized in the instructions
33 1.1 skrll @code{PUT} and @code{GET}.
34 1.1 skrll
35 1.1 skrll @cindex @samp{--globalize-symbols} command line option, MMIX
36 1.1 skrll You can use the @samp{--globalize-symbols} to make all symbols global.
37 1.1 skrll This option is useful when splitting up a @code{mmixal} program into
38 1.1 skrll several files.
39 1.1 skrll
40 1.1 skrll @cindex @samp{--gnu-syntax} command line option, MMIX
41 1.1 skrll The @samp{--gnu-syntax} turns off most syntax compatibility with
42 1.1 skrll @code{mmixal}. Its usability is currently doubtful.
43 1.1 skrll
44 1.1 skrll @cindex @samp{--relax} command line option, MMIX
45 1.1 skrll The @samp{--relax} option is not fully supported, but will eventually make
46 1.1 skrll the object file prepared for linker relaxation.
47 1.1 skrll
48 1.1 skrll @cindex @samp{--no-predefined-syms} command line option, MMIX
49 1.1 skrll If you want to avoid inadvertently calling a predefined symbol and would
50 1.1 skrll rather get an error, for example when using @code{@value{AS}} with a
51 1.1 skrll compiler or other machine-generated code, specify
52 1.1 skrll @samp{--no-predefined-syms}. This turns off built-in predefined
53 1.1 skrll definitions of all such symbols, including rounding-mode symbols, segment
54 1.1 skrll symbols, @samp{BIT} symbols, and @code{TRAP} symbols used in @code{mmix}
55 1.1 skrll ``system calls''. It also turns off predefined special-register names,
56 1.1 skrll except when used in @code{PUT} and @code{GET} instructions.
57 1.1 skrll
58 1.1 skrll @cindex @samp{--no-expand} command line option, MMIX
59 1.1 skrll By default, some instructions are expanded to fit the size of the operand
60 1.1 skrll or an external symbol (@pxref{MMIX-Expand}). By passing
61 1.1 skrll @samp{--no-expand}, no such expansion will be done, instead causing errors
62 1.1 skrll at link time if the operand does not fit.
63 1.1 skrll
64 1.1 skrll @cindex @samp{--no-merge-gregs} command line option, MMIX
65 1.1 skrll The @code{mmixal} documentation (@pxref{mmixsite}) specifies that global
66 1.1 skrll registers allocated with the @samp{GREG} directive (@pxref{MMIX-greg}) and
67 1.1 skrll initialized to the same non-zero value, will refer to the same global
68 1.1 skrll register. This isn't strictly enforceable in @code{@value{AS}} since the
69 1.1 skrll final addresses aren't known until link-time, but it will do an effort
70 1.1 skrll unless the @samp{--no-merge-gregs} option is specified. (Register merging
71 1.1 skrll isn't yet implemented in @code{@value{LD}}.)
72 1.1 skrll
73 1.1 skrll @cindex @samp{-x} command line option, MMIX
74 1.1 skrll @code{@value{AS}} will warn every time it expands an instruction to fit an
75 1.1 skrll operand unless the option @samp{-x} is specified. It is believed that
76 1.1 skrll this behaviour is more useful than just mimicking @code{mmixal}'s
77 1.1 skrll behaviour, in which instructions are only expanded if the @samp{-x} option
78 1.1 skrll is specified, and assembly fails otherwise, when an instruction needs to
79 1.1 skrll be expanded. It needs to be kept in mind that @code{mmixal} is both an
80 1.1 skrll assembler and linker, while @code{@value{AS}} will expand instructions
81 1.1 skrll that at link stage can be contracted. (Though linker relaxation isn't yet
82 1.1.1.5.12.1 pgoyette implemented in @code{@value{LD}}.) The option @samp{-x} also implies
83 1.1 skrll @samp{--linker-allocated-gregs}.
84 1.1 skrll
85 1.1 skrll @cindex @samp{--no-pushj-stubs} command line option, MMIX
86 1.1 skrll @cindex @samp{--no-stubs} command line option, MMIX
87 1.1 skrll If instruction expansion is enabled, @code{@value{AS}} can expand a
88 1.1 skrll @samp{PUSHJ} instruction into a series of instructions. The shortest
89 1.1 skrll expansion is to not expand it, but just mark the call as redirectable to a
90 1.1 skrll stub, which @code{@value{LD}} creates at link-time, but only if the
91 1.1 skrll original @samp{PUSHJ} instruction is found not to reach the target. The
92 1.1 skrll stub consists of the necessary instructions to form a jump to the target.
93 1.1 skrll This happens if @code{@value{AS}} can assert that the @samp{PUSHJ}
94 1.1 skrll instruction can reach such a stub. The option @samp{--no-pushj-stubs}
95 1.1 skrll disables this shorter expansion, and the longer series of instructions is
96 1.1 skrll then created at assembly-time. The option @samp{--no-stubs} is a synonym,
97 1.1 skrll intended for compatibility with future releases, where generation of stubs
98 1.1 skrll for other instructions may be implemented.
99 1.1 skrll
100 1.1 skrll @cindex @samp{--linker-allocated-gregs} command line option, MMIX
101 1.1 skrll Usually a two-operand-expression (@pxref{GREG-base}) without a matching
102 1.1 skrll @samp{GREG} directive is treated as an error by @code{@value{AS}}. When
103 1.1 skrll the option @samp{--linker-allocated-gregs} is in effect, they are instead
104 1.1 skrll passed through to the linker, which will allocate as many global registers
105 1.1 skrll as is needed.
106 1.1 skrll
107 1.1 skrll @node MMIX-Expand
108 1.1 skrll @section Instruction expansion
109 1.1 skrll
110 1.1 skrll @cindex instruction expansion, MMIX
111 1.1 skrll When @code{@value{AS}} encounters an instruction with an operand that is
112 1.1 skrll either not known or does not fit the operand size of the instruction,
113 1.1 skrll @code{@value{AS}} (and @code{@value{LD}}) will expand the instruction into
114 1.1 skrll a sequence of instructions semantically equivalent to the operand fitting
115 1.1 skrll the instruction. Expansion will take place for the following
116 1.1 skrll instructions:
117 1.1 skrll
118 1.1 skrll @table @asis
119 1.1 skrll @item @samp{GETA}
120 1.1 skrll Expands to a sequence of four instructions: @code{SETL}, @code{INCML},
121 1.1 skrll @code{INCMH} and @code{INCH}. The operand must be a multiple of four.
122 1.1 skrll @item Conditional branches
123 1.1 skrll A branch instruction is turned into a branch with the complemented
124 1.1 skrll condition and prediction bit over five instructions; four instructions
125 1.1 skrll setting @code{$255} to the operand value, which like with @code{GETA} must
126 1.1 skrll be a multiple of four, and a final @code{GO $255,$255,0}.
127 1.1 skrll @item @samp{PUSHJ}
128 1.1 skrll Similar to expansion for conditional branches; four instructions set
129 1.1 skrll @code{$255} to the operand value, followed by a @code{PUSHGO $255,$255,0}.
130 1.1 skrll @item @samp{JMP}
131 1.1 skrll Similar to conditional branches and @code{PUSHJ}. The final instruction
132 1.1 skrll is @code{GO $255,$255,0}.
133 1.1 skrll @end table
134 1.1 skrll
135 1.1 skrll The linker @code{@value{LD}} is expected to shrink these expansions for
136 1.1 skrll code assembled with @samp{--relax} (though not currently implemented).
137 1.1 skrll
138 1.1 skrll @node MMIX-Syntax
139 1.1 skrll @section Syntax
140 1.1 skrll
141 1.1 skrll The assembly syntax is supposed to be upward compatible with that
142 1.1 skrll described in Sections 1.3 and 1.4 of @samp{The Art of Computer
143 1.1 skrll Programming, Volume 1}. Draft versions of those chapters as well as other
144 1.1 skrll MMIX information is located at
145 1.1 skrll @anchor{mmixsite}@url{http://www-cs-faculty.stanford.edu/~knuth/mmix-news.html}.
146 1.1 skrll Most code examples from the mmixal package located there should work
147 1.1 skrll unmodified when assembled and linked as single files, with a few
148 1.1 skrll noteworthy exceptions (@pxref{MMIX-mmixal}).
149 1.1 skrll
150 1.1 skrll Before an instruction is emitted, the current location is aligned to the
151 1.1 skrll next four-byte boundary. If a label is defined at the beginning of the
152 1.1 skrll line, its value will be the aligned value.
153 1.1 skrll
154 1.1 skrll In addition to the traditional hex-prefix @samp{0x}, a hexadecimal number
155 1.1 skrll can also be specified by the prefix character @samp{#}.
156 1.1 skrll
157 1.1 skrll After all operands to an MMIX instruction or directive have been
158 1.1 skrll specified, the rest of the line is ignored, treated as a comment.
159 1.1 skrll
160 1.1 skrll @menu
161 1.1 skrll * MMIX-Chars:: Special Characters
162 1.1 skrll * MMIX-Symbols:: Symbols
163 1.1 skrll * MMIX-Regs:: Register Names
164 1.1 skrll * MMIX-Pseudos:: Assembler Directives
165 1.1 skrll @end menu
166 1.1 skrll
167 1.1 skrll @node MMIX-Chars
168 1.1 skrll @subsection Special Characters
169 1.1 skrll @cindex line comment characters, MMIX
170 1.1 skrll @cindex MMIX line comment characters
171 1.1 skrll
172 1.1 skrll The characters @samp{*} and @samp{#} are line comment characters; each
173 1.1 skrll start a comment at the beginning of a line, but only at the beginning of a
174 1.1 skrll line. A @samp{#} prefixes a hexadecimal number if found elsewhere on a
175 1.1.1.3 christos line. If a @samp{#} appears at the start of a line the whole line is
176 1.1.1.3 christos treated as a comment, but the line can also act as a logical line
177 1.1.1.3 christos number directive (@pxref{Comments}) or a preprocessor control command
178 1.1.1.3 christos (@pxref{Preprocessing}).
179 1.1 skrll
180 1.1 skrll Two other characters, @samp{%} and @samp{!}, each start a comment anywhere
181 1.1 skrll on the line. Thus you can't use the @samp{modulus} and @samp{not}
182 1.1 skrll operators in expressions normally associated with these two characters.
183 1.1 skrll
184 1.1 skrll A @samp{;} is a line separator, treated as a new-line, so separate
185 1.1 skrll instructions can be specified on a single line.
186 1.1 skrll
187 1.1 skrll @node MMIX-Symbols
188 1.1 skrll @subsection Symbols
189 1.1 skrll The character @samp{:} is permitted in identifiers. There are two
190 1.1 skrll exceptions to it being treated as any other symbol character: if a symbol
191 1.1 skrll begins with @samp{:}, it means that the symbol is in the global namespace
192 1.1 skrll and that the current prefix should not be prepended to that symbol
193 1.1 skrll (@pxref{MMIX-prefix}). The @samp{:} is then not considered part of the
194 1.1 skrll symbol. For a symbol in the label position (first on a line), a @samp{:}
195 1.1 skrll at the end of a symbol is silently stripped off. A label is permitted,
196 1.1 skrll but not required, to be followed by a @samp{:}, as with many other
197 1.1 skrll assembly formats.
198 1.1 skrll
199 1.1 skrll The character @samp{@@} in an expression, is a synonym for @samp{.}, the
200 1.1 skrll current location.
201 1.1 skrll
202 1.1 skrll In addition to the common forward and backward local symbol formats
203 1.1 skrll (@pxref{Symbol Names}), they can be specified with upper-case @samp{B} and
204 1.1 skrll @samp{F}, as in @samp{8B} and @samp{9F}. A local label defined for the
205 1.1 skrll current position is written with a @samp{H} appended to the number:
206 1.1 skrll @smallexample
207 1.1 skrll 3H LDB $0,$1,2
208 1.1 skrll @end smallexample
209 1.1 skrll This and traditional local-label formats cannot be mixed: a label must be
210 1.1 skrll defined and referred to using the same format.
211 1.1 skrll
212 1.1 skrll There's a minor caveat: just as for the ordinary local symbols, the local
213 1.1 skrll symbols are translated into ordinary symbols using control characters are
214 1.1 skrll to hide the ordinal number of the symbol. Unfortunately, these symbols
215 1.1 skrll are not translated back in error messages. Thus you may see confusing
216 1.1 skrll error messages when local symbols are used. Control characters
217 1.1 skrll @samp{\003} (control-C) and @samp{\004} (control-D) are used for the
218 1.1 skrll MMIX-specific local-symbol syntax.
219 1.1 skrll
220 1.1 skrll The symbol @samp{Main} is handled specially; it is always global.
221 1.1 skrll
222 1.1 skrll By defining the symbols @samp{__.MMIX.start..text} and
223 1.1 skrll @samp{__.MMIX.start..data}, the address of respectively the @samp{.text}
224 1.1 skrll and @samp{.data} segments of the final program can be defined, though when
225 1.1 skrll linking more than one object file, the code or data in the object file
226 1.1 skrll containing the symbol is not guaranteed to be start at that position; just
227 1.1 skrll the final executable. @xref{MMIX-loc}.
228 1.1 skrll
229 1.1 skrll @node MMIX-Regs
230 1.1 skrll @subsection Register names
231 1.1 skrll @cindex register names, MMIX
232 1.1 skrll @cindex MMIX register names
233 1.1 skrll
234 1.1 skrll Local and global registers are specified as @samp{$0} to @samp{$255}.
235 1.1 skrll The recognized special register names are @samp{rJ}, @samp{rA}, @samp{rB},
236 1.1 skrll @samp{rC}, @samp{rD}, @samp{rE}, @samp{rF}, @samp{rG}, @samp{rH},
237 1.1 skrll @samp{rI}, @samp{rK}, @samp{rL}, @samp{rM}, @samp{rN}, @samp{rO},
238 1.1 skrll @samp{rP}, @samp{rQ}, @samp{rR}, @samp{rS}, @samp{rT}, @samp{rU},
239 1.1 skrll @samp{rV}, @samp{rW}, @samp{rX}, @samp{rY}, @samp{rZ}, @samp{rBB},
240 1.1 skrll @samp{rTT}, @samp{rWW}, @samp{rXX}, @samp{rYY} and @samp{rZZ}. A leading
241 1.1 skrll @samp{:} is optional for special register names.
242 1.1 skrll
243 1.1 skrll Local and global symbols can be equated to register names and used in
244 1.1 skrll place of ordinary registers.
245 1.1 skrll
246 1.1 skrll Similarly for special registers, local and global symbols can be used.
247 1.1 skrll Also, symbols equated from numbers and constant expressions are allowed in
248 1.1 skrll place of a special register, except when either of the options
249 1.1 skrll @code{--no-predefined-syms} and @code{--fixed-special-register-names} are
250 1.1 skrll specified. Then only the special register names above are allowed for the
251 1.1 skrll instructions having a special register operand; @code{GET} and @code{PUT}.
252 1.1 skrll
253 1.1 skrll @node MMIX-Pseudos
254 1.1 skrll @subsection Assembler Directives
255 1.1 skrll @cindex assembler directives, MMIX
256 1.1 skrll @cindex pseudo-ops, MMIX
257 1.1 skrll @cindex MMIX assembler directives
258 1.1 skrll @cindex MMIX pseudo-ops
259 1.1 skrll
260 1.1 skrll @table @code
261 1.1 skrll @item LOC
262 1.1 skrll @cindex assembler directive LOC, MMIX
263 1.1 skrll @cindex pseudo-op LOC, MMIX
264 1.1 skrll @cindex MMIX assembler directive LOC
265 1.1 skrll @cindex MMIX pseudo-op LOC
266 1.1 skrll
267 1.1 skrll @anchor{MMIX-loc}
268 1.1 skrll The @code{LOC} directive sets the current location to the value of the
269 1.1 skrll operand field, which may include changing sections. If the operand is a
270 1.1 skrll constant, the section is set to either @code{.data} if the value is
271 1.1 skrll @code{0x2000000000000000} or larger, else it is set to @code{.text}.
272 1.1 skrll Within a section, the current location may only be changed to
273 1.1 skrll monotonically higher addresses. A LOC expression must be a previously
274 1.1 skrll defined symbol or a ``pure'' constant.
275 1.1 skrll
276 1.1 skrll An example, which sets the label @var{prev} to the current location, and
277 1.1 skrll updates the current location to eight bytes forward:
278 1.1 skrll @smallexample
279 1.1 skrll prev LOC @@+8
280 1.1 skrll @end smallexample
281 1.1 skrll
282 1.1 skrll When a LOC has a constant as its operand, a symbol
283 1.1 skrll @code{__.MMIX.start..text} or @code{__.MMIX.start..data} is defined
284 1.1 skrll depending on the address as mentioned above. Each such symbol is
285 1.1 skrll interpreted as special by the linker, locating the section at that
286 1.1 skrll address. Note that if multiple files are linked, the first object file
287 1.1 skrll with that section will be mapped to that address (not necessarily the file
288 1.1 skrll with the LOC definition).
289 1.1 skrll
290 1.1 skrll @item LOCAL
291 1.1 skrll @cindex assembler directive LOCAL, MMIX
292 1.1 skrll @cindex pseudo-op LOCAL, MMIX
293 1.1 skrll @cindex MMIX assembler directive LOCAL
294 1.1 skrll @cindex MMIX pseudo-op LOCAL
295 1.1 skrll
296 1.1 skrll @anchor{MMIX-local}
297 1.1 skrll Example:
298 1.1 skrll @smallexample
299 1.1 skrll LOCAL external_symbol
300 1.1 skrll LOCAL 42
301 1.1 skrll .local asymbol
302 1.1 skrll @end smallexample
303 1.1 skrll
304 1.1 skrll This directive-operation generates a link-time assertion that the operand
305 1.1 skrll does not correspond to a global register. The operand is an expression
306 1.1 skrll that at link-time resolves to a register symbol or a number. A number is
307 1.1 skrll treated as the register having that number. There is one restriction on
308 1.1 skrll the use of this directive: the pseudo-directive must be placed in a
309 1.1 skrll section with contents, code or data.
310 1.1 skrll
311 1.1 skrll @item IS
312 1.1 skrll @cindex assembler directive IS, MMIX
313 1.1 skrll @cindex pseudo-op IS, MMIX
314 1.1 skrll @cindex MMIX assembler directive IS
315 1.1 skrll @cindex MMIX pseudo-op IS
316 1.1 skrll
317 1.1 skrll @anchor{MMIX-is}
318 1.1 skrll The @code{IS} directive:
319 1.1 skrll @smallexample
320 1.1 skrll asymbol IS an_expression
321 1.1 skrll @end smallexample
322 1.1 skrll sets the symbol @samp{asymbol} to @samp{an_expression}. A symbol may not
323 1.1 skrll be set more than once using this directive. Local labels may be set using
324 1.1 skrll this directive, for example:
325 1.1 skrll @smallexample
326 1.1 skrll 5H IS @@+4
327 1.1 skrll @end smallexample
328 1.1 skrll
329 1.1 skrll @item GREG
330 1.1 skrll @cindex assembler directive GREG, MMIX
331 1.1 skrll @cindex pseudo-op GREG, MMIX
332 1.1 skrll @cindex MMIX assembler directive GREG
333 1.1 skrll @cindex MMIX pseudo-op GREG
334 1.1 skrll
335 1.1 skrll @anchor{MMIX-greg}
336 1.1 skrll This directive reserves a global register, gives it an initial value and
337 1.1 skrll optionally gives it a symbolic name. Some examples:
338 1.1 skrll
339 1.1 skrll @smallexample
340 1.1 skrll areg GREG
341 1.1 skrll breg GREG data_value
342 1.1 skrll GREG data_buffer
343 1.1 skrll .greg creg, another_data_value
344 1.1 skrll @end smallexample
345 1.1 skrll
346 1.1 skrll The symbolic register name can be used in place of a (non-special)
347 1.1 skrll register. If a value isn't provided, it defaults to zero. Unless the
348 1.1 skrll option @samp{--no-merge-gregs} is specified, non-zero registers allocated
349 1.1 skrll with this directive may be eliminated by @code{@value{AS}}; another
350 1.1 skrll register with the same value used in its place.
351 1.1 skrll Any of the instructions
352 1.1 skrll @samp{CSWAP},
353 1.1 skrll @samp{GO},
354 1.1 skrll @samp{LDA},
355 1.1 skrll @samp{LDBU},
356 1.1 skrll @samp{LDB},
357 1.1 skrll @samp{LDHT},
358 1.1 skrll @samp{LDOU},
359 1.1 skrll @samp{LDO},
360 1.1 skrll @samp{LDSF},
361 1.1 skrll @samp{LDTU},
362 1.1 skrll @samp{LDT},
363 1.1 skrll @samp{LDUNC},
364 1.1 skrll @samp{LDVTS},
365 1.1 skrll @samp{LDWU},
366 1.1 skrll @samp{LDW},
367 1.1 skrll @samp{PREGO},
368 1.1 skrll @samp{PRELD},
369 1.1 skrll @samp{PREST},
370 1.1 skrll @samp{PUSHGO},
371 1.1 skrll @samp{STBU},
372 1.1 skrll @samp{STB},
373 1.1 skrll @samp{STCO},
374 1.1 skrll @samp{STHT},
375 1.1 skrll @samp{STOU},
376 1.1 skrll @samp{STSF},
377 1.1 skrll @samp{STTU},
378 1.1 skrll @samp{STT},
379 1.1 skrll @samp{STUNC},
380 1.1 skrll @samp{SYNCD},
381 1.1 skrll @samp{SYNCID},
382 1.1 skrll can have a value nearby @anchor{GREG-base}an initial value in place of its
383 1.1 skrll second and third operands. Here, ``nearby'' is defined as within the
384 1.1 skrll range 0@dots{}255 from the initial value of such an allocated register.
385 1.1 skrll
386 1.1 skrll @smallexample
387 1.1 skrll buffer1 BYTE 0,0,0,0,0
388 1.1 skrll buffer2 BYTE 0,0,0,0,0
389 1.1 skrll @dots{}
390 1.1 skrll GREG buffer1
391 1.1 skrll LDOU $42,buffer2
392 1.1 skrll @end smallexample
393 1.1 skrll In the example above, the @samp{Y} field of the @code{LDOUI} instruction
394 1.1 skrll (LDOU with a constant Z) will be replaced with the global register
395 1.1 skrll allocated for @samp{buffer1}, and the @samp{Z} field will have the value
396 1.1 skrll 5, the offset from @samp{buffer1} to @samp{buffer2}. The result is
397 1.1 skrll equivalent to this code:
398 1.1 skrll @smallexample
399 1.1 skrll buffer1 BYTE 0,0,0,0,0
400 1.1 skrll buffer2 BYTE 0,0,0,0,0
401 1.1 skrll @dots{}
402 1.1 skrll tmpreg GREG buffer1
403 1.1 skrll LDOU $42,tmpreg,(buffer2-buffer1)
404 1.1 skrll @end smallexample
405 1.1 skrll
406 1.1 skrll Global registers allocated with this directive are allocated in order
407 1.1 skrll higher-to-lower within a file. Other than that, the exact order of
408 1.1 skrll register allocation and elimination is undefined. For example, the order
409 1.1 skrll is undefined when more than one file with such directives are linked
410 1.1 skrll together. With the options @samp{-x} and @samp{--linker-allocated-gregs},
411 1.1 skrll @samp{GREG} directives for two-operand cases like the one mentioned above
412 1.1 skrll can be omitted. Sufficient global registers will then be allocated by the
413 1.1 skrll linker.
414 1.1 skrll
415 1.1 skrll @item BYTE
416 1.1 skrll @cindex assembler directive BYTE, MMIX
417 1.1 skrll @cindex pseudo-op BYTE, MMIX
418 1.1 skrll @cindex MMIX assembler directive BYTE
419 1.1 skrll @cindex MMIX pseudo-op BYTE
420 1.1 skrll
421 1.1 skrll @anchor{MMIX-byte}
422 1.1 skrll The @samp{BYTE} directive takes a series of operands separated by a comma.
423 1.1 skrll If an operand is a string (@pxref{Strings}), each character of that string
424 1.1 skrll is emitted as a byte. Other operands must be constant expressions without
425 1.1 skrll forward references, in the range 0@dots{}255. If you need operands having
426 1.1 skrll expressions with forward references, use @samp{.byte} (@pxref{Byte}). An
427 1.1 skrll operand can be omitted, defaulting to a zero value.
428 1.1 skrll
429 1.1 skrll @item WYDE
430 1.1 skrll @itemx TETRA
431 1.1 skrll @itemx OCTA
432 1.1 skrll @cindex assembler directive WYDE, MMIX
433 1.1 skrll @cindex pseudo-op WYDE, MMIX
434 1.1 skrll @cindex MMIX assembler directive WYDE
435 1.1 skrll @cindex MMIX pseudo-op WYDE
436 1.1 skrll @cindex assembler directive TETRA, MMIX
437 1.1 skrll @cindex pseudo-op TETRA, MMIX
438 1.1 skrll @cindex MMIX assembler directive TETRA
439 1.1 skrll @cindex MMIX pseudo-op TETRA
440 1.1 skrll @cindex assembler directive OCTA, MMIX
441 1.1 skrll @cindex pseudo-op OCTA, MMIX
442 1.1 skrll @cindex MMIX assembler directive OCTA
443 1.1 skrll @cindex MMIX pseudo-op OCTA
444 1.1 skrll
445 1.1 skrll @anchor{MMIX-constants}
446 1.1 skrll The directives @samp{WYDE}, @samp{TETRA} and @samp{OCTA} emit constants of
447 1.1 skrll two, four and eight bytes size respectively. Before anything else happens
448 1.1 skrll for the directive, the current location is aligned to the respective
449 1.1 skrll constant-size boundary. If a label is defined at the beginning of the
450 1.1 skrll line, its value will be that after the alignment. A single operand can be
451 1.1 skrll omitted, defaulting to a zero value emitted for the directive. Operands
452 1.1 skrll can be expressed as strings (@pxref{Strings}), in which case each
453 1.1 skrll character in the string is emitted as a separate constant of the size
454 1.1 skrll indicated by the directive.
455 1.1 skrll
456 1.1 skrll @item PREFIX
457 1.1 skrll @cindex assembler directive PREFIX, MMIX
458 1.1 skrll @cindex pseudo-op PREFIX, MMIX
459 1.1 skrll @cindex MMIX assembler directive PREFIX
460 1.1 skrll @cindex MMIX pseudo-op PREFIX
461 1.1 skrll
462 1.1 skrll @anchor{MMIX-prefix}
463 1.1 skrll The @samp{PREFIX} directive sets a symbol name prefix to be prepended to
464 1.1 skrll all symbols (except local symbols, @pxref{MMIX-Symbols}), that are not
465 1.1 skrll prefixed with @samp{:}, until the next @samp{PREFIX} directive. Such
466 1.1 skrll prefixes accumulate. For example,
467 1.1 skrll @smallexample
468 1.1 skrll PREFIX a
469 1.1 skrll PREFIX b
470 1.1 skrll c IS 0
471 1.1 skrll @end smallexample
472 1.1 skrll defines a symbol @samp{abc} with the value 0.
473 1.1 skrll
474 1.1 skrll @item BSPEC
475 1.1 skrll @itemx ESPEC
476 1.1 skrll @cindex assembler directive BSPEC, MMIX
477 1.1 skrll @cindex pseudo-op BSPEC, MMIX
478 1.1 skrll @cindex MMIX assembler directive BSPEC
479 1.1 skrll @cindex MMIX pseudo-op BSPEC
480 1.1 skrll @cindex assembler directive ESPEC, MMIX
481 1.1 skrll @cindex pseudo-op ESPEC, MMIX
482 1.1 skrll @cindex MMIX assembler directive ESPEC
483 1.1 skrll @cindex MMIX pseudo-op ESPEC
484 1.1 skrll
485 1.1 skrll @anchor{MMIX-spec}
486 1.1 skrll A pair of @samp{BSPEC} and @samp{ESPEC} directives delimit a section of
487 1.1 skrll special contents (without specified semantics). Example:
488 1.1 skrll @smallexample
489 1.1 skrll BSPEC 42
490 1.1 skrll TETRA 1,2,3
491 1.1 skrll ESPEC
492 1.1 skrll @end smallexample
493 1.1 skrll The single operand to @samp{BSPEC} must be number in the range
494 1.1 skrll 0@dots{}255. The @samp{BSPEC} number 80 is used by the GNU binutils
495 1.1 skrll implementation.
496 1.1 skrll @end table
497 1.1 skrll
498 1.1 skrll @node MMIX-mmixal
499 1.1 skrll @section Differences to @code{mmixal}
500 1.1 skrll @cindex mmixal differences
501 1.1 skrll @cindex differences, mmixal
502 1.1 skrll
503 1.1 skrll The binutils @code{@value{AS}} and @code{@value{LD}} combination has a few
504 1.1 skrll differences in function compared to @code{mmixal} (@pxref{mmixsite}).
505 1.1 skrll
506 1.1 skrll The replacement of a symbol with a GREG-allocated register
507 1.1 skrll (@pxref{GREG-base}) is not handled the exactly same way in
508 1.1 skrll @code{@value{AS}} as in @code{mmixal}. This is apparent in the
509 1.1 skrll @code{mmixal} example file @code{inout.mms}, where different registers
510 1.1 skrll with different offsets, eventually yielding the same address, are used in
511 1.1 skrll the first instruction. This type of difference should however not affect
512 1.1 skrll the function of any program unless it has specific assumptions about the
513 1.1 skrll allocated register number.
514 1.1 skrll
515 1.1 skrll Line numbers (in the @samp{mmo} object format) are currently not
516 1.1 skrll supported.
517 1.1 skrll
518 1.1 skrll Expression operator precedence is not that of mmixal: operator precedence
519 1.1 skrll is that of the C programming language. It's recommended to use
520 1.1 skrll parentheses to explicitly specify wanted operator precedence whenever more
521 1.1 skrll than one type of operators are used.
522 1.1 skrll
523 1.1 skrll The serialize unary operator @code{&}, the fractional division operator
524 1.1 skrll @samp{//}, the logical not operator @code{!} and the modulus operator
525 1.1 skrll @samp{%} are not available.
526 1.1 skrll
527 1.1 skrll Symbols are not global by default, unless the option
528 1.1 skrll @samp{--globalize-symbols} is passed. Use the @samp{.global} directive to
529 1.1 skrll globalize symbols (@pxref{Global}).
530 1.1 skrll
531 1.1 skrll Operand syntax is a bit stricter with @code{@value{AS}} than
532 1.1 skrll @code{mmixal}. For example, you can't say @code{addu 1,2,3}, instead you
533 1.1 skrll must write @code{addu $1,$2,3}.
534 1.1 skrll
535 1.1 skrll You can't LOC to a lower address than those already visited
536 1.1 skrll (i.e., ``backwards'').
537 1.1 skrll
538 1.1 skrll A LOC directive must come before any emitted code.
539 1.1 skrll
540 1.1 skrll Predefined symbols are visible as file-local symbols after use. (In the
541 1.1 skrll ELF file, that is---the linked mmo file has no notion of a file-local
542 1.1 skrll symbol.)
543 1.1 skrll
544 1.1 skrll Some mapping of constant expressions to sections in LOC expressions is
545 1.1 skrll attempted, but that functionality is easily confused and should be avoided
546 1.1 skrll unless compatibility with @code{mmixal} is required. A LOC expression to
547 1.1 skrll @samp{0x2000000000000000} or higher, maps to the @samp{.data} section and
548 1.1 skrll lower addresses map to the @samp{.text} section (@pxref{MMIX-loc}).
549 1.1 skrll
550 1.1 skrll The code and data areas are each contiguous. Sparse programs with
551 1.1 skrll far-away LOC directives will take up the same amount of space as a
552 1.1 skrll contiguous program with zeros filled in the gaps between the LOC
553 1.1 skrll directives. If you need sparse programs, you might try and get the wanted
554 1.1 skrll effect with a linker script and splitting up the code parts into sections
555 1.1 skrll (@pxref{Section}). Assembly code for this, to be compatible with
556 1.1 skrll @code{mmixal}, would look something like:
557 1.1 skrll @smallexample
558 1.1 skrll .if 0
559 1.1 skrll LOC away_expression
560 1.1 skrll .else
561 1.1 skrll .section away,"ax"
562 1.1 skrll .fi
563 1.1 skrll @end smallexample
564 1.1 skrll @code{@value{AS}} will not execute the LOC directive and @code{mmixal}
565 1.1 skrll ignores the lines with @code{.}. This construct can be used generally to
566 1.1 skrll help compatibility.
567 1.1 skrll
568 1.1 skrll Symbols can't be defined twice--not even to the same value.
569 1.1 skrll
570 1.1 skrll Instruction mnemonics are recognized case-insensitive, though the
571 1.1 skrll @samp{IS} and @samp{GREG} pseudo-operations must be specified in
572 1.1 skrll upper-case characters.
573 1.1 skrll
574 1.1 skrll There's no unicode support.
575 1.1 skrll
576 1.1 skrll The following is a list of programs in @samp{mmix.tar.gz}, available at
577 1.1 skrll @url{http://www-cs-faculty.stanford.edu/~knuth/mmix-news.html}, last
578 1.1 skrll checked with the version dated 2001-08-25 (md5sum
579 1.1 skrll c393470cfc86fac040487d22d2bf0172) that assemble with @code{mmixal} but do
580 1.1 skrll not assemble with @code{@value{AS}}:
581 1.1 skrll
582 1.1 skrll @table @code
583 1.1 skrll @item silly.mms
584 1.1 skrll LOC to a previous address.
585 1.1 skrll @item sim.mms
586 1.1 skrll Redefines symbol @samp{Done}.
587 1.1 skrll @item test.mms
588 1.1 skrll Uses the serial operator @samp{&}.
589 1.1 skrll @end table
590