The MMIX version of as
has some machine-dependent options.
When ‘--fixed-special-register-names’ is specified, only the register
names specified in MMIX-Regs are recognized in the instructions
PUT
and GET
.
You can use the ‘--globalize-symbols’ to make all symbols global.
This option is useful when splitting up a mmixal
program into
several files.
The ‘--gnu-syntax’ turns off most syntax compatibility with
mmixal
. Its usability is currently doubtful.
The ‘--relax’ option is not fully supported, but will eventually make the object file prepared for linker relaxation.
If you want to avoid inadvertently calling a predefined symbol and would
rather get an error, for example when using as
with a
compiler or other machine-generated code, specify
‘--no-predefined-syms’. This turns off built-in predefined
definitions of all such symbols, including rounding-mode symbols, segment
symbols, ‘BIT’ symbols, and TRAP
symbols used in mmix
“system calls”. It also turns off predefined special-register names,
except when used in PUT
and GET
instructions.
By default, some instructions are expanded to fit the size of the operand or an external symbol (see MMIX-Expand). By passing ‘--no-expand’, no such expansion will be done, instead causing errors at link time if the operand does not fit.
The mmixal
documentation (see mmixsite) specifies that global
registers allocated with the ‘GREG’ directive (see MMIX-greg) and
initialized to the same non-zero value, will refer to the same global
register. This isn't strictly enforceable in as
since the
final addresses aren't known until link-time, but it will do an effort
unless the ‘--no-merge-gregs’ option is specified. (Register merging
isn't yet implemented in ld
.)
as
will warn every time it expands an instruction to fit an
operand unless the option ‘-x’ is specified. It is believed that
this behaviour is more useful than just mimicking mmixal
's
behaviour, in which instructions are only expanded if the ‘-x’ option
is specified, and assembly fails otherwise, when an instruction needs to
be expanded. It needs to be kept in mind that mmixal
is both an
assembler and linker, while as
will expand instructions
that at link stage can be contracted. (Though linker relaxation isn't yet
implemented in ld
.) The option ‘-x’ also implies
‘--linker-allocated-gregs’.
If instruction expansion is enabled, as
can expand a
‘PUSHJ’ instruction into a series of instructions. The shortest
expansion is to not expand it, but just mark the call as redirectable to a
stub, which ld
creates at link-time, but only if the
original ‘PUSHJ’ instruction is found not to reach the target. The
stub consists of the necessary instructions to form a jump to the target.
This happens if as
can assert that the ‘PUSHJ’
instruction can reach such a stub. The option ‘--no-pushj-stubs’
disables this shorter expansion, and the longer series of instructions is
then created at assembly-time. The option ‘--no-stubs’ is a synonym,
intended for compatibility with future releases, where generation of stubs
for other instructions may be implemented.
Usually a two-operand-expression (see GREG-base) without a matching
‘GREG’ directive is treated as an error by as
. When
the option ‘--linker-allocated-gregs’ is in effect, they are instead
passed through to the linker, which will allocate as many global registers
as is needed.