1034 lines
40 KiB
Text
1034 lines
40 KiB
Text
|
This chapter documents the backend for the Motorola M68k/CPU32/ColdFire
|
||
|
microprocessor family.
|
||
|
|
||
|
@section Legal
|
||
|
|
||
|
This module is written in 2002-2019 by Frank Wille and
|
||
|
is covered by the vasm copyright without modifications.
|
||
|
|
||
|
|
||
|
@section Additional options for this module
|
||
|
|
||
|
Note, that the order on the command line may be important when
|
||
|
specifiying options. For example, if you specify -devpac compatibility
|
||
|
mode behind enabling some optimization options, the Devpac-mode might
|
||
|
disable these optimizations again.
|
||
|
|
||
|
This module provides the following additional options:
|
||
|
|
||
|
@subsection CPU selections
|
||
|
@table @option
|
||
|
@item -m68000
|
||
|
Generate code for the MC68000 CPU.
|
||
|
|
||
|
@item -m68008
|
||
|
Generate code for the MC68008 CPU.
|
||
|
|
||
|
@item -m68010
|
||
|
Generate code for the MC68010 CPU.
|
||
|
|
||
|
@item -m68020
|
||
|
Generate code for the MC68020 CPU.
|
||
|
|
||
|
@item -m68030
|
||
|
Generate code for the MC68030 CPU.
|
||
|
|
||
|
@item -m68040
|
||
|
Generate code for the MC68040 CPU.
|
||
|
|
||
|
@item -m68060
|
||
|
Generate code for the MC68060 CPU.
|
||
|
|
||
|
@item -m68020up
|
||
|
Generate code for the MC68020-68060 CPU. Be careful with
|
||
|
instructions like PFLUSHA, which exist on 68030 and 68040/060
|
||
|
with a different opcode (vasm will use the 040/060 version).
|
||
|
|
||
|
@item -m68080
|
||
|
Generate code for the Apollo Core AC68080 FPGA CPU.
|
||
|
|
||
|
@item -mcpu32
|
||
|
Generate code for the CPU32 family (MC6833x, MC6834x, etc.).
|
||
|
|
||
|
@item -mcf5...
|
||
|
@itemx -m5...
|
||
|
Generate code for a ColdFire family CPU. The following types are
|
||
|
recognized: 5202, 5204, 5206, 520x, 5206e, 5207, 5208, 5210a, 5211a,
|
||
|
5212, 5213, 5214, 5216, 5224, 5225, 5232, 5233, 5234, 5235, 523x,
|
||
|
5249, 5250, 5253, 5270, 5271, 5272, 5274, 5275, 5280, 5281, 528x,
|
||
|
52221, 52553, 52230, 52231, 52232, 52233, 52234, 52235, 52252,
|
||
|
52254, 52255, 52256, 52258, 52259, 52274, 52277,
|
||
|
5307, 5327, 5328, 5329, 532x, 5372, 5373, 537x, 53011, 53012, 53013,
|
||
|
53014, 53015, 53016, 53017, 5301x,
|
||
|
5407, 5470, 5471, 5472, 5473, 5474, 5475, 547x, 5480, 5481, 5482,
|
||
|
5483, 5484, 5485, 548x, 54450, 54451, 54452, 54453, 5445x.
|
||
|
|
||
|
@item -mcfv2
|
||
|
Generate code for the V2 ColdFire core. This option selects
|
||
|
ISA_A (no hardware division or MAC), which is the most limited ISA
|
||
|
supported by 5202, 5204 and 5206. All other ColdFire chips are
|
||
|
backwards compatible to V2.
|
||
|
|
||
|
@item -mcfv3
|
||
|
Generate code for the V3 ColdFire core. This option selects
|
||
|
ISA_A+, hardware division MAC and EMAC instructions, which are
|
||
|
supported by nearly all V3 CPUs, except the 5307.
|
||
|
|
||
|
@item -mcfv4
|
||
|
Generate code for the V4 ColdFire core. This option selects ISA_B
|
||
|
and MAC as supported by the 5407.
|
||
|
|
||
|
@item -mcfv4e
|
||
|
Generate code for the V4e ColdFire core. This option selects ISA_B,
|
||
|
USP-, FPU-, MAC- and EMAC-instructions (no hardware division) as
|
||
|
supported by all 547x and 548x CPUs.
|
||
|
|
||
|
@item -m68851
|
||
|
Generate code for the MC68851 MMU. May be used in combination
|
||
|
with another @option{-m} option.
|
||
|
|
||
|
@item -m68881
|
||
|
Generate code for the MC68881 FPU. May be used in combination
|
||
|
with another @option{-m} option.
|
||
|
|
||
|
@item -m68882
|
||
|
Generate code for the MC68882 FPU. May be used in combination
|
||
|
with another @option{-m} option.
|
||
|
|
||
|
@item -no-fpu
|
||
|
Ignore any FPU options or directives, which has the effect that
|
||
|
no 68881/2 FPU instructions will be accepted. This option can
|
||
|
override the default of @option{-gas} to enable the FPU.
|
||
|
@end table
|
||
|
|
||
|
@subsection Optimization options
|
||
|
@table @option
|
||
|
@item -no-opt
|
||
|
Disable all optimizations. Can be seen as a main switch to ignore
|
||
|
all other optimization options on the command line and in the source.
|
||
|
|
||
|
@item -opt-allbra
|
||
|
When specified the assembler will also try to optimize branch
|
||
|
instructions which already have a valid size extension.
|
||
|
This option is automatically enabled in @option{-phxass} mode.
|
||
|
|
||
|
@item -opt-brajmp
|
||
|
Translate relative branch instructions, whose destination is in a
|
||
|
different section, into absolute jump instructions.
|
||
|
|
||
|
@item -opt-clr
|
||
|
Enables optimization from @code{MOVE #0,<ea>} into @code{CLR <ea>}
|
||
|
for the MC68000. Note that @code{CLR} will execute a read-modify-write
|
||
|
cycle on the 68000, so it is disabled by default. With 68010 and
|
||
|
higher this is a generic standard optimization.
|
||
|
|
||
|
@item -opt-fconst
|
||
|
Floating point constants are loaded with the lowest precision
|
||
|
possible. This means that @code{FMOVE.D #1.0,FP0} would be
|
||
|
optimized to @code{FMOVE.S #1.0,FP0}, because it is faster and
|
||
|
shorter at the same precision. The optimization will be performed
|
||
|
on all FPU instructions with immediate addressing mode.
|
||
|
When an FDIV-family instruction (@code{FSDIV}, @code{FDDIV},
|
||
|
@code{FSGLDIV}) is detected it will additionally be checked if the
|
||
|
immediate constant is a power of 2 and then converted into
|
||
|
@code{FMUL #1/c,FPn}.
|
||
|
|
||
|
@item -opt-jbra
|
||
|
@code{JMP} and @code{JSR} instructions to external labels will be
|
||
|
converted into @code{BRA.L} and @code{BSR.L}, when the selected
|
||
|
CPU is 68020 or higher (or CPU32).
|
||
|
|
||
|
@item -opt-lsl
|
||
|
Allows optimization of @code{LSL #1} into @code{ADD}. It is also
|
||
|
needed to optimize @code{ASL #2} and @code{LSL #2} into two @code{ADD}
|
||
|
instructions (together with @option{-opt-speed}).
|
||
|
These optimizations may modify the V-flag, which might not be intended.
|
||
|
|
||
|
@item -opt-movem
|
||
|
Enables optimization from @code{MOVEM <ea>,Rn} into
|
||
|
@code{MOVE <ea>,Rn} (or the other way around). This optimization
|
||
|
will modify the flags, when the destination is no address
|
||
|
register.
|
||
|
|
||
|
@item -opt-mul
|
||
|
Immediate multplication factors, which are a power of two (from 2
|
||
|
to 256), are optimized to shifts. Multiplications with zero are
|
||
|
replaced by a @code{MOVEQ #0,Dn}, with -1 are replaced by a
|
||
|
@code{NEG.L Dn} and with 1 by @code{EXT.L Dn} or @code{TST.L Dn}
|
||
|
(long-form). Not all optimizations are available for all cpu types
|
||
|
(e.g. @code{MULU.W} can only be optimized on ColdFire by using
|
||
|
the @code{MVZ.W} instruction.
|
||
|
This optimization will leave the flags in a different state as
|
||
|
can normally be expected after a multiplication instruction, and
|
||
|
the size of the optimized code may be bigger than before in a few
|
||
|
situations (e.g. @code{MULS.W #4,Dn}). The latter will additionally
|
||
|
require the @option{-opt-speed} flag.
|
||
|
|
||
|
@item -opt-div
|
||
|
Unsigned immediate divisors, which are a power of two (from 2 to 256),
|
||
|
are optimized to shifts. Divisions by 1 are replaced by @code{TST.L Dn}
|
||
|
(32-bit) or @code{MVZ.W Dn,Dn} (16-bit, ColdFire only). Divisions by
|
||
|
-1 are replaced by @code{NEG.L Dn} (32-bit) or by a combination of
|
||
|
@code{NEG.W Dn} and @code{MVZ.W Dn,Dn} (16-bit, ColdFire only).
|
||
|
This optimization will leave the flags in a different state as
|
||
|
can normally be expected after a division instruction.
|
||
|
|
||
|
@item -opt-pea
|
||
|
Enables optimization from @code{MOVE #x,-(SP)} into @code{PEA x}.
|
||
|
This optimization will leave the flags unmodified, which might
|
||
|
not be intended.
|
||
|
|
||
|
@item -opt-speed
|
||
|
Optimize for speed, even if this would increase code size.
|
||
|
For example it enables optimization of @code{ASL.W #2,Dn} into two
|
||
|
@code{ADD.W Dn,Dn} instructions. Or @code{MULS.W #-4,Dn} into
|
||
|
@code{EXT.L Dn + ASL.L #2,Dn + NEG.L Dn}.
|
||
|
Generally the assembler will never optimize a single into multiple
|
||
|
instructions without this option.
|
||
|
|
||
|
@item -opt-st
|
||
|
Enables optimization from @code{MOVE.B #-1,<ea>} into @code{ST <ea>}.
|
||
|
This optimization will leave the flags unmodified, which might
|
||
|
not be intended.
|
||
|
|
||
|
@item -sc
|
||
|
All @code{JMP} and @code{JSR} instructions to external labels
|
||
|
will be converted into 16-bit PC-relative jumps.
|
||
|
|
||
|
@item -sd
|
||
|
References to absolute symbols in a
|
||
|
small data section (named "__MERGED") are optimized into a
|
||
|
base-relative addressing mode using the current base register set
|
||
|
by an active @code{NEAR} directive.
|
||
|
This option is automatically enabled in @option{-phxass} mode.
|
||
|
|
||
|
@item -showcrit
|
||
|
Print all critical optimizations which have side effects. Among
|
||
|
those are @option{-opt-lsl}, @option{-opt-mul}, @option{-opt-st},
|
||
|
@option{-opt-pea}, @option{-opt-movem} and @option{-opt-clr}.
|
||
|
|
||
|
@item -showopt
|
||
|
Print all optimizations and translations vasm is doing
|
||
|
(same as @code{opt ow+}).
|
||
|
@end table
|
||
|
|
||
|
In its default setting (no @option{-devpac} or @option{-phxass} option)
|
||
|
vasm performs the following optimizations:
|
||
|
@itemize @minus
|
||
|
@item Absolute to PC-relative.
|
||
|
@item Branches without explicit size.
|
||
|
@item Displacements (32 to 16 bit, @code{(0,An)} to @code{(An)}, etc).
|
||
|
@item Optimize floating point constants to the lowest possible precision.
|
||
|
@item Many instruction optimizations which are safe.
|
||
|
@end itemize
|
||
|
|
||
|
@subsection Other options
|
||
|
@table @option
|
||
|
@item -conv-brackets
|
||
|
Brackets (@code{'['} and @code{']'}) in an operand are automatically
|
||
|
converted into parentheses (@code{'('} and @code{')'}) as long as
|
||
|
the CPU is 68000 or 68010. This is a compatibility option for some
|
||
|
old assemblers.
|
||
|
|
||
|
@item -devpac
|
||
|
All options are initially set to be Devpac compatible. Which means
|
||
|
that all optimizations are disabled, no debugging symbols will be
|
||
|
written and vasm will warn about any optimization being done.
|
||
|
When symbol output is enabled by @code{opt d+}, then the TOS symbol
|
||
|
table defaults to standard DRI format (limited to 8 characters).
|
||
|
Shift-right operations are performed using an unsigned 32-bit value.
|
||
|
Other options are the same as vasm's defaults.
|
||
|
The symbol @code{__G2} is defined, which contains information
|
||
|
about the selected cpu type.
|
||
|
The symbol @code{__LK} reflects the type of output file generated.
|
||
|
Which is 0 for TOS executables, 4 for Amiga executables and 3 for
|
||
|
Amiga object files. All other formats are represented by 99, as
|
||
|
they are unknown to Devpac.
|
||
|
It will also automatically enable @option{-guess-ext}.
|
||
|
|
||
|
@item -elfregs
|
||
|
Register names are preceded by a '%' to prevent confusion
|
||
|
with symbol names.
|
||
|
|
||
|
@item -gas
|
||
|
Enable additional GNU-as compatibility mnemonics, like
|
||
|
@code{mov}, @code{movm} and @code{jra}. Also accepts @code{|}
|
||
|
instead of @code{;} for comments.
|
||
|
GNU-as compatibility mode selects the 68020 CPU and 68881/2 FPU
|
||
|
by default and enables @option{-opt-jbra}.
|
||
|
|
||
|
@item -guess-ext
|
||
|
Accept illegal size extensions for an instruction, as long as
|
||
|
the instruction is unsized or there is just a single size possible.
|
||
|
This is the default setting in PhxAss and Devpac compatibility mode.
|
||
|
|
||
|
@item -kick1hunks
|
||
|
Prevents optimization of JMP/JSR to 32-bit PC-relative (BRA/BSR).
|
||
|
|
||
|
@item -phxass
|
||
|
PhxAss-compatibilty mode. The "current PC symbol" (e.g. @code{*} in
|
||
|
mot-syntax module) is set to the instruction's address + 2 whenever
|
||
|
an instruction is parsed.
|
||
|
According to the current cpu setting the symbols @code{__CPU},
|
||
|
@code{__FPU} and @code{__MMU} are defined.
|
||
|
@code{JMP/JSR (label,PC)} will never be optimized (into a branch,
|
||
|
for example).
|
||
|
It will also automatically enable @option{-opt-allbra},
|
||
|
@option{-sd} and @option{-guess-ext}.
|
||
|
|
||
|
@item -rangewarnings
|
||
|
Values which are out of range usually produce an error. With this
|
||
|
option the errors 2026, 2030, 2033 and 2037 will be displayed as
|
||
|
a warning, allowing the user to create an object file.
|
||
|
|
||
|
@item -sdreg=<n>
|
||
|
Set the small data base register to @code{An}. <n> is valid
|
||
|
between 2 and 6.
|
||
|
|
||
|
@item -sgs
|
||
|
Additionally allow immediate operands to be prefixed by
|
||
|
@code{&} instead of just by @code{#}. This syntax was used by
|
||
|
the SGS assembler.
|
||
|
|
||
|
@item -regsymredef
|
||
|
Allow redefining register symbols with @code{EQUR}. This should
|
||
|
only be used for compatibility with old sources. Not many assemblers
|
||
|
support that.
|
||
|
@end table
|
||
|
|
||
|
@section General
|
||
|
|
||
|
This backend accepts M68k and CPU32 instructions as described in
|
||
|
Mototola's M68000 family Programmer's Reference Manual. Additionally
|
||
|
it supports ColdFire instructions as described in Motorola's ColdFire
|
||
|
Microprocessor Family Programmer's Reference Manual.
|
||
|
|
||
|
The syntax for the scale factor in ColdFire @code{MAC} instructions is
|
||
|
@code{<<} for left- and @code{>>} for right-shift. The scale factor may be
|
||
|
appended as an optional operand, when needed.
|
||
|
Example: @code{mac d0.l,d1.u,<<}.
|
||
|
|
||
|
The mask flag in @code{MAC} instructions is written as @code{&} and is
|
||
|
appended directly to the effective address operand. Example:
|
||
|
@code{mac d0,d1,(a0)&,d2}.
|
||
|
|
||
|
The target address type is 32bit.
|
||
|
|
||
|
Default alignment for instructions is 2 bytes. The default alignment for
|
||
|
data is 2 bytes, when the data size is larger than 8 bits.
|
||
|
|
||
|
Depending on the selected cpu type the @code{__VASM} symbol will have
|
||
|
a value defined by the following bits:
|
||
|
@table @code
|
||
|
@item bit 0
|
||
|
MC68000 instruction set. Also used by MC6830x, MC68322, MC68356.
|
||
|
@item bit 1
|
||
|
MC68010 instruction set.
|
||
|
@item bit 2
|
||
|
MC68020 instruction set.
|
||
|
@item bit 3
|
||
|
MC68030 instruction set.
|
||
|
@item bit 4
|
||
|
MC68040 instruction set.
|
||
|
@item bit 5
|
||
|
MC68060 instruction set.
|
||
|
@item bit 6
|
||
|
MC68881 or MC68882 FPU.
|
||
|
@item bit 7
|
||
|
MC68851 PMMU.
|
||
|
@item bit 8
|
||
|
CPU32. Any MC6833x or MC6834x CPU.
|
||
|
@item bit 9
|
||
|
ColdFire ISA_A.
|
||
|
@item bit 10
|
||
|
ColdFire ISA_A+.
|
||
|
@item bit 11
|
||
|
ColdFire ISA_B.
|
||
|
@item bit 12
|
||
|
ColdFire ISA_C.
|
||
|
@item bit 13
|
||
|
ColdFire hardware division support.
|
||
|
@item bit 14
|
||
|
ColdFire MAC instructions.
|
||
|
@item bit 15
|
||
|
ColdFire enhanced MAC instructions.
|
||
|
@item bit 16
|
||
|
ColdFire USP register.
|
||
|
@item bit 17
|
||
|
ColdFire FPU instructions.
|
||
|
@item bit 18
|
||
|
ColdFire MMU instructions.
|
||
|
@item bit 20
|
||
|
Apollo Core AC68080 instruction set.
|
||
|
@end table
|
||
|
|
||
|
|
||
|
@section Extensions
|
||
|
|
||
|
This backend extends the selected syntax module by the following
|
||
|
directives:
|
||
|
|
||
|
@table @code
|
||
|
@item .sdreg <An>
|
||
|
Equivalents to @code{near <An>}.
|
||
|
|
||
|
@item basereg <expression>,<An>
|
||
|
Starts a block of base-relative addressing through register @code{An}
|
||
|
(remember that @code{A7} is not allowed as a base register).
|
||
|
The programmer has to make sure that <expression> is placed
|
||
|
into @code{An} first, while the assembler automatically subtracts
|
||
|
<expression>, which is usually a program label with an optional offset,
|
||
|
from each displacement in a @code{(d,An)} addressing mode.
|
||
|
@code{basereg} has priority over the @code{near} directive. Its effect
|
||
|
can be suspended with the @code{endb} directive.
|
||
|
It is allowed to use several base registers in parallel.
|
||
|
|
||
|
@item cpu32
|
||
|
Generate code for the CPU32 family.
|
||
|
|
||
|
@item endb <An>
|
||
|
Ends a @code{basereg} block and suspends its effect onto the
|
||
|
specified base register @code{An}. It may be reused with a different
|
||
|
base expression thereafter (refer to @code{basereg}).
|
||
|
|
||
|
@item far
|
||
|
Disables small data (base-relative) mode. All data references
|
||
|
will be absolute.
|
||
|
|
||
|
@item fpu <cpID>
|
||
|
Enables 68881/68882 FPU code generation. The <cpID> is inserted
|
||
|
into the FPU instructions to select the correct coprocessor. Note
|
||
|
that <cpID> is always 1 for the on-chip FPUs in the 68040 and
|
||
|
68060. A <cpID> of zero will disable FPU code generation.
|
||
|
|
||
|
@item initnear
|
||
|
Initializes the selected small data register. In contrast to PhxAss,
|
||
|
where this directive comes from, just a reference to
|
||
|
@code{_LinkerDB} is generated, which has to be resolved by a linker.
|
||
|
|
||
|
@item machine <cpu_type>
|
||
|
Makes the assembler generate code for <cpu_type>, which can be
|
||
|
the following: @code{68000}, @code{68010}, @code{68020}, @code{68030},
|
||
|
@code{68040}, @code{68060}, @code{68080},
|
||
|
@code{68851}, @code{68881}, @code{68882}, @code{cpu32}.
|
||
|
And various ColdFire CPUs, starting with @code{5...}.
|
||
|
|
||
|
@item mc68000
|
||
|
Generate code for the MC68000 CPU.
|
||
|
|
||
|
@item mc68010
|
||
|
Generate code for the MC68010 CPU.
|
||
|
|
||
|
@item mc68020
|
||
|
Generate code for the MC68020 CPU.
|
||
|
|
||
|
@item mc68030
|
||
|
Generate code for the MC68030 CPU.
|
||
|
|
||
|
@item mc68040
|
||
|
Generate code for the MC68040 CPU.
|
||
|
|
||
|
@item mc68060
|
||
|
Generate code for the MC68060 CPU.
|
||
|
|
||
|
@item ac68080
|
||
|
Generate code for the Apollo Core AC68080 FPGA CPU.
|
||
|
|
||
|
@item mcf5...
|
||
|
Generate code for a ColdFire CPU. The recognized models are listed
|
||
|
in the assembler-options section.
|
||
|
|
||
|
@item near [<An>]
|
||
|
Enables small data (base-relative) mode and sets the base register
|
||
|
to @code{An}. @code{near} without an argument will reactivate a
|
||
|
previously defined small data mode, which might have been switched off
|
||
|
by a @code{far} directive.
|
||
|
|
||
|
@item near code
|
||
|
All @code{JMP} and @code{JSR} instructions to external labels
|
||
|
will be converted into 16-bit PC-relative jumps. The small code
|
||
|
mode can be switched off by a @code{far} directive.
|
||
|
|
||
|
@item opt <option>[,<option>...]
|
||
|
Sets Devpac-compatible options. When option @option{-phxass} is
|
||
|
given, then it will parse PhxAss options instead (which is discouraged
|
||
|
for new code, so there is no detailed description here).
|
||
|
Most supported Devpac2-style options are always suffixed by a
|
||
|
@code{+} or @code{-} to enable or disable the option:
|
||
|
@table @code
|
||
|
@item a
|
||
|
Automatically optimize absolute to PC-relative references.
|
||
|
Default is off in Devpac-comptability mode, otherwise on.
|
||
|
@item c
|
||
|
Case-sensitivity for all symbols, instructions and macros.
|
||
|
Default is on.
|
||
|
@item d
|
||
|
Include all symbols for debugging in the output file. May also
|
||
|
generate line debugging information in some output formats.
|
||
|
Default is off in Devpac-comptability mode, otherwise on.
|
||
|
@item l
|
||
|
Generate a linkable object file. The default is defined by the
|
||
|
selected output format via the assembler's @option{-F} option.
|
||
|
This option was supported by Devpac-Amiga only.
|
||
|
@item o
|
||
|
Enable all optimizations (o1 to o12), or disable all optimizations.
|
||
|
The default is that all are disabled in Devpac-compatibility mode
|
||
|
and enabled otherwise.
|
||
|
When running in native vasm mode this option will also enable
|
||
|
PC-relative (@code{opt a}) and
|
||
|
the following safe vasm-specific optimizations (see below):
|
||
|
@code{og}, @code{of}.
|
||
|
@item o1
|
||
|
Optimize branches without an explicit size extension.
|
||
|
@item o2
|
||
|
Standard displacement optimizations (e.g. @code{(0,An) -> (An)}).
|
||
|
@item o3
|
||
|
Optimize absolute addresses to short words.
|
||
|
@item o4
|
||
|
Optimize @code{move.l} to @code{moveq}.
|
||
|
@item o5
|
||
|
Optimize @code{add #x} and @code{sub #x} into their quick forms.
|
||
|
@item o6
|
||
|
No effect in vasm.
|
||
|
@item o7
|
||
|
Convert @code{bra.b} to @code{nop}, when branching to the next
|
||
|
instruction.
|
||
|
@item o8
|
||
|
Optimize 68020+ base displacements to 16 bit.
|
||
|
@item o9
|
||
|
Optimize 68020+ outer displacements to 16 bit.
|
||
|
@item o10
|
||
|
Optimize @code{add/sub #x,An} to @code{lea}.
|
||
|
@item o11
|
||
|
Optimize @code{lea (d,An),An} to @code{addq/subq}.
|
||
|
@item o12
|
||
|
Optimize @code{<op>.l #x,An} to @code{<op>.w #x,An}.
|
||
|
@item ow
|
||
|
Show all optimizations being peformed.
|
||
|
Default is on in Devpac-compatibility mode, otherwise off.
|
||
|
@item p
|
||
|
Check if code is position independant. This will cause an error on
|
||
|
each relocation being required.
|
||
|
Default is off.
|
||
|
@item s
|
||
|
Include symbols in listing file.
|
||
|
Default is on.
|
||
|
@item t
|
||
|
Check size and type of all expressions.
|
||
|
Default is on.
|
||
|
@item w
|
||
|
Show assembler warnings.
|
||
|
Default is on.
|
||
|
@item x
|
||
|
For Amiga hunk format objects @code{x+} strips local symbols from
|
||
|
the symbol table (symbols without @code{xdef}).
|
||
|
For Atari TOS executables this will enable the extended (HiSoft)
|
||
|
DRI symbol table format, which allows symbols with up to 22
|
||
|
characters. DRI standard only supports 8 characters.
|
||
|
@end table
|
||
|
|
||
|
Devpac options without +/- suffix:
|
||
|
@table @code
|
||
|
@item l<n>
|
||
|
Sets the output format (Devpac Atari only). Currently without effect.
|
||
|
@item p=<type>[/<type>]
|
||
|
Sets the CPU type to any model vasm supports (original Devpac
|
||
|
only allowed 68000-68040, 68332, 68881, 68882 and 68851).
|
||
|
@end table
|
||
|
|
||
|
Also the following Devpac3-style options are supported:
|
||
|
@table @code
|
||
|
@item autopc
|
||
|
Corresponds to @code{a+}.
|
||
|
@item case
|
||
|
Corresponds to @code{c+}.
|
||
|
@item chkpc
|
||
|
Corresponds to @code{p+}.
|
||
|
@item debug
|
||
|
Corresponds to @code{d+}.
|
||
|
@item symtab
|
||
|
Corresponds to @code{s+}.
|
||
|
@item type
|
||
|
Corresponds to @code{t+}.
|
||
|
@item warn
|
||
|
Corresponds to @code{w+}.
|
||
|
@item xdebug
|
||
|
Corresponds to @code{x+}.
|
||
|
@item noautopc
|
||
|
Corresponds to @code{a-}.
|
||
|
@item nocase
|
||
|
Corresponds to @code{c-}.
|
||
|
@item nochkpc
|
||
|
Corresponds to @code{p-}.
|
||
|
@item nodebug
|
||
|
Corresponds to @code{d-}.
|
||
|
@item nosymtab
|
||
|
Corresponds to @code{s-}.
|
||
|
@item notype
|
||
|
Corresponds to @code{t-}.
|
||
|
@item nowarn
|
||
|
Corresponds to @code{w-}.
|
||
|
@item noxdebug
|
||
|
Corresponds to @code{x-}.
|
||
|
@end table
|
||
|
|
||
|
The following options are vasm specific and should not be used when
|
||
|
writing portable source. Using @code{opt o+} or @code{opt o-} in
|
||
|
Devpac mode only toggles @code{og}, @code{of} and @code{oj}.
|
||
|
@table @code
|
||
|
@item ob
|
||
|
Convert absolute jumps to external labels into long-branches
|
||
|
(refer to @option{-opt-jbra}).
|
||
|
@item oc
|
||
|
Enable optimizations to @code{CLR} (refer to @option{-opt-clr}).
|
||
|
@item od
|
||
|
Enable optimization of divisions into shifts (refer to
|
||
|
@option{-opt-div}).
|
||
|
@item of
|
||
|
Enable immediate float constant optimizations (refer to
|
||
|
@option{-opt-fconst}).
|
||
|
@item og
|
||
|
Enable generic vasm optimizations. All optimizations which cannot
|
||
|
be controlled by another option.
|
||
|
@item oj
|
||
|
Enable branch to jump translations (refer to @option{-opt-brajmp}).
|
||
|
@item ol
|
||
|
Enable shift optimizations to @code{ADD} (refer to @option{-opt-lsl}).
|
||
|
@item om
|
||
|
Enable @code{MOVEM} optimizations (refer to @option{-opt-movem}).
|
||
|
@item on
|
||
|
Enable small data optimizations. References to absolute symbols in a
|
||
|
small data section (named "__MERGED") are optimized into a
|
||
|
base-relative addressing mode (refer to @option{-sd}).
|
||
|
@item op
|
||
|
Enable optimizations to @code{PEA} (refer to @option{-opt-pea}).
|
||
|
@item os
|
||
|
Optimize for speed before optimizing for size (refer to
|
||
|
@option{-opt-speed}).
|
||
|
@item ot
|
||
|
Enable optimizations to @code{ST} (refer to @option{-opt-st}).
|
||
|
@item ox
|
||
|
Enable optimization of multiplications into shifts
|
||
|
(refer to @option{-opt-mul}).
|
||
|
@end table
|
||
|
The default state is 'off' for all those vasm specific options.
|
||
|
@end table
|
||
|
|
||
|
The following directives are only available for the Motorola syntax
|
||
|
module:
|
||
|
|
||
|
@table @code
|
||
|
@item <symbol> equr <Rn>
|
||
|
Define a new symbol named <symbol> and assign the data or
|
||
|
address register @code{Rn}, which can be used from now on in operands.
|
||
|
When 68080 code generation is enabled, also @code{Bn} base address
|
||
|
registers are allowed to be assigned.
|
||
|
Note that a register symbol must be defined before it can be
|
||
|
used!
|
||
|
|
||
|
@item <symbol> equrl <reglist>
|
||
|
Equivalents to @code{<symbol> reg <reglist>}.
|
||
|
|
||
|
@item <symbol> fequr <FPn>
|
||
|
Define a new symbol named <symbol> and assign the FPU register
|
||
|
@code{FPn}, which can be used from now on in operands.
|
||
|
Note that a register symbol must be defined before it can be
|
||
|
used!
|
||
|
|
||
|
@item <symbol> fequrl <reglist>
|
||
|
Equivalents to @code{<symbol> freg <reglist>}.
|
||
|
|
||
|
@item <symbol> freg <reglist>
|
||
|
Defines a new symbol named <symbol> and assign the FPU register
|
||
|
list <reglist> to it. Registers in a list must be separated
|
||
|
by a slash (@code{/}) and ranges or registers can be defined
|
||
|
by using a hyphen (@code{-}). Examples for valid FPU register
|
||
|
lists are: @code{fp0-fp7}, @code{fp1-3/fp5/fp7}, @code{fpiar/fpcr}.
|
||
|
|
||
|
@item <symbol> reg <reglist>
|
||
|
Defines a new symbol named <symbol> and assign the register
|
||
|
list <reglist> to it. Registers in a list must be separated
|
||
|
by a slash (@code{/}) and ranges or registers can be defined
|
||
|
by using a hyphen (@code{-}). Examples for valid register lists
|
||
|
are: @code{d0-d7/a0-a6}, @code{d3-6/a0/a1/a4-5}.
|
||
|
|
||
|
@end table
|
||
|
|
||
|
|
||
|
@section Optimizations
|
||
|
|
||
|
This backend performs the following operand optimizations:
|
||
|
|
||
|
@itemize @minus
|
||
|
|
||
|
@item @code{(0,An)} optimized to @code{(An)}.
|
||
|
|
||
|
@item @code{(d16,An)} translated to @code{(bd32,An,ZDn.w)}, when @code{d16} is not
|
||
|
between -32768 and 32767 and the selected CPU allows it (68020 up or
|
||
|
CPU32).
|
||
|
|
||
|
@item @code{(d16,PC)} translated to @code{(bd32,PC,ZDn.w)}, when @code{d16} is not
|
||
|
between -32768 and 32767 and the selected CPU allows it (68020 up or
|
||
|
CPU32).
|
||
|
|
||
|
@item @code{(d8,An,Rn)} translated to @code{(bd,An,Rn)}, when @code{d8} is not
|
||
|
between -128 and 127 and the selected CPU allows it (68020 up or
|
||
|
CPU32).
|
||
|
|
||
|
@item @code{(d8,PC,Rn)} translated to @code{(bd,PC,Rn)}, when @code{d8} is not
|
||
|
between -128 and 127 and the selected CPU allows it (68020 up or
|
||
|
CPU32).
|
||
|
|
||
|
@item @code{<exp>.l} optimized to @code{<exp>.w}, when @code{<exp>} is absolute
|
||
|
and between -32768 and 32767.
|
||
|
|
||
|
@item @code{<exp>.w} translated to @code{<exp>.l}, when @code{<exp>} is a program
|
||
|
label or absolute and not between -32768 and 32767.
|
||
|
|
||
|
@item @code{(0,An,...)} optimized to @code{(An,...)} (which means the base
|
||
|
displacement will be suppressed). This allows further optimization
|
||
|
to @code{(An)}, when the index is suppressed.
|
||
|
|
||
|
@item @code{(bd16,An,...)} translated to @code{(bd32,An,...)}, when @code{bd16} is
|
||
|
not between -32768 and 32767.
|
||
|
|
||
|
@item @code{(bd32,An,...)} optimized to @code{(bd16,An,...)}, when @code{bd16} is
|
||
|
between -32768 and 32767.
|
||
|
|
||
|
@item @code{(bd32,An,ZRn)} optimized to @code{(d16,An)}, when @code{bd32} is
|
||
|
between -32768 and 32767, and the index is suppressed (zero-Rn).
|
||
|
|
||
|
@item @code{(An,ZRn)} optimized to @code{(An)}, when the index is suppressed.
|
||
|
|
||
|
@item @code{(0,PC,...)} optimized to @code{(PC,...)} (which means the base
|
||
|
displacement will be suppressed).
|
||
|
|
||
|
@item @code{(bd16,PC,...)} translated to @code{(bd32,PC,...)}, when @code{bd16} is
|
||
|
not between -32768 and 32767.
|
||
|
|
||
|
@item @code{(bd32,PC,...)} optimized to @code{(bd16,PC,...)}, when @code{bd16} is
|
||
|
between -32768 and 32767.
|
||
|
|
||
|
@item @code{(bd32,PC,ZRn)} optimized to @code{(d16,PC)}, when @code{bd32} is
|
||
|
between -32768 and 32767, and the index is suppressed (zero-Rn).
|
||
|
|
||
|
@item @code{([0,Rn,...],...)} optimized to @code{([An,...],...)} (which means the base
|
||
|
displacement will be suppressed).
|
||
|
|
||
|
@item @code{([bd16,Rn,...],...)} translated to @code{([bd32,An,...],...)}, when @code{bd16}
|
||
|
is not between -32768 and 32768.
|
||
|
|
||
|
@item @code{([bd32,Rn,...],...)} optimized to @code{([bd16,An,...],...)}, when @code{bd32}
|
||
|
is between -32768 and 32768.
|
||
|
|
||
|
@item @code{([...],0)} optimized to @code{([...])} (which means the outer displacement
|
||
|
will be suppressed).
|
||
|
|
||
|
@item @code{([...],od16)} translated to @code{([...],od32)}, when @code{od16} is
|
||
|
not between -32768 and 32767.
|
||
|
|
||
|
@item @code{([...],od32)} translated to @code{([...],od16)}, when @code{od32} is
|
||
|
between -32768 and 32767.
|
||
|
|
||
|
@end itemize
|
||
|
|
||
|
Note that an operand optimization will only take place when a displacement's
|
||
|
size was not enforced by the programmer (e.g. @code{(4.l,a0)})!
|
||
|
|
||
|
This backend performs the following instruction optimizations:
|
||
|
|
||
|
@itemize @minus
|
||
|
|
||
|
@item @code{<op>.L #x,An} optimized to @code{<op>.W #x,An}, when @code{x} is
|
||
|
between -32768 and 32767.
|
||
|
|
||
|
@item @code{ADD.? #x,<ea>} optimized to @code{ADDQ.? #x,<ea>}, when @code{x} is
|
||
|
between 1 and 8.
|
||
|
|
||
|
@item @code{ADD.? #x,<ea>} optimized to @code{SUBQ.? #x,<ea>}, when @code{x} is
|
||
|
between -1 and -8.
|
||
|
|
||
|
@item @code{ADDA.? #0,An} and @code{SUBA.? #0,An} will be deleted.
|
||
|
|
||
|
@item @code{ADDA.? #x,An} optimized to @code{LEA (x,An),An}, when @code{x} is
|
||
|
between -32768 and 32767.
|
||
|
|
||
|
@item @code{ANDI.L #$ff,Dn} optimized to @code{MVZ.B Dn,Dn},
|
||
|
for ColdFire ISA_B/C.
|
||
|
|
||
|
@item @code{ANDI.L #$ffff,Dn} optimized to @code{MVZ.W Dn,Dn},
|
||
|
for ColdFire ISA_B/C.
|
||
|
|
||
|
@item @code{ANDI.? #0,<ea>} optimized to @code{CLR.? <ea>}, when allowed
|
||
|
by the option @option{-opt-clr} or a different CPU than the MC68000 was
|
||
|
selected.
|
||
|
|
||
|
@item @code{ANDI.? #-1,<ea>} optimized to @code{TST.? <ea>}.
|
||
|
|
||
|
@item @code{ASL.? #1,Dn} optimized to @code{ADD.? Dn,Dn} for 68000 and 68010.
|
||
|
|
||
|
@item @code{ASL.? #2,Dn} optimized into a sequence of two @code{ADD.? Dn,Dn}
|
||
|
for 68000 and 68010, when the operation size is either byte or word and
|
||
|
the options @option{-opt-speed} and @option{-opt-lsl} are given.
|
||
|
|
||
|
@item @code{B<cc> <label>} translated into a combination of
|
||
|
@code{B!<cc> *+8} and @code{JMP <label>}, when <label> is not defined in the
|
||
|
same section (and option @option{-opt-brajmp} is given),
|
||
|
or outside the range of -32768 to 32767 bytes from the current address
|
||
|
when the selected CPU is not 68020 up, CPU32 or ColdFire ISA_B/C.
|
||
|
|
||
|
@item @code{B<cc> <label>} is automatically optimized to 8-bit, 16-bit or
|
||
|
32-bit (68020 up, CPU32, MCF5407 only), whatever fits best. When the
|
||
|
selected CPU doesn't support 32-bit branches it will try to change the
|
||
|
conditional branch into a @code{B<!cc> *+8} and @code{JMP <label>} sequence.
|
||
|
|
||
|
@item @code{BRA <label>} translated to @code{JMP <label>}, when <label> is
|
||
|
not defined in the same section (and option @option{-opt-brajmp} is given),
|
||
|
or outside the range of -32768 to 32767 bytes from the current address
|
||
|
when the selected CPU is not 68020 up, CPU32 or ColdFire ISA_B/C.
|
||
|
|
||
|
@item @code{BSR <label>} translated to @code{JSR <label>}, when <label> is
|
||
|
not defined in the same section (and option @option{-opt-brajmp} is given),
|
||
|
or outside the range of -32768 to 32767 bytes from the current address
|
||
|
when the selected CPU is not 68020 up, CPU32 or ColdFire ISA_B/C.
|
||
|
|
||
|
@item @code{<cp>B<cc> <label>} is automatically optimized to 16-bit or 32-bit,
|
||
|
whatever fits best. <cp> means coprocessor and is @code{P} for the PMMU
|
||
|
and @code{F} for the FPU.
|
||
|
|
||
|
@item @code{CLR.L Dn} optimized to @code{MOVEQ #0,Dn}.
|
||
|
|
||
|
@item @code{CMP.? #0,<ea>} optimized to @code{TST.? <ea>}. The selected CPU type
|
||
|
must be MC68020 up, ColdFire or CPU32 to support address register direct
|
||
|
as effective address (@code{<ea>}).
|
||
|
|
||
|
@item @code{DIVS.W/DIVU.W #1,Dn} optimized to @code{MVZ.W Dn,Dn}, for
|
||
|
ColdFire ISA_B/C (@option{-opt-div}).
|
||
|
|
||
|
@item @code{DIVS.W #-1,Dn} optimized to the sequence of @code{NEG.W Dn} and
|
||
|
@code{MVZ.W Dn,Dn} (@option{-opt-div} and @option{-opt-speed}).
|
||
|
|
||
|
@item @code{DIVS.L/DIVU.L #1,Dn} optimized to @code{TST.L Dn}
|
||
|
(@option{-opt-div}).
|
||
|
|
||
|
@item @code{DIVS.L #-1,Dn} optimized to @code{NEG.L Dn}
|
||
|
(@option{-opt-div}).
|
||
|
|
||
|
@item @code{DIVU.L #2..256,Dn} optimized to @code{LSR.L #x,Dn}
|
||
|
(@option{-opt-div}).
|
||
|
|
||
|
@item @code{EORI.? #-1,<ea>} optimized to @code{NOT.? <ea>}.
|
||
|
|
||
|
@item @code{EORI.? #0,<ea>} optimized to @code{TST.? <ea>}.
|
||
|
|
||
|
@item @code{FMOVEM.? <reglist>} is deleted, when the register list was empty.
|
||
|
|
||
|
@item @code{FxDIV.? #m,FPn} optimized to @code{FxMUL.? #1/m,FPn} when m is
|
||
|
a power of 2 and option @option{-opt-fconst} is given.
|
||
|
|
||
|
@item @code{JMP <label>} optimized to @code{BRA.? <label>}, when <label> is defined
|
||
|
in the same section and in the range of -32768 to 32767 bytes from the
|
||
|
current address.
|
||
|
Note that @code{JMP (<lab>,PC)} is never optimized.
|
||
|
|
||
|
@item @code{JSR <label>} optimized to @code{BSR.? <label>}, when <label> is defined
|
||
|
in the same section and in the range of -32768 to 32767 bytes from the
|
||
|
current address.
|
||
|
Note that @code{JSR (<lab>,PC)} is never optimized.
|
||
|
|
||
|
@item @code{LEA 0,An} optimized to @code{SUBA.L An,An}.
|
||
|
|
||
|
@item @code{LEA (0,An),An} and @code{LEA (An),An} will be deleted.
|
||
|
|
||
|
@item @code{LEA (d,An),An} is optimized to @code{ADDQ.L #d,An} when @code{d}
|
||
|
is between 1 and 8 and to @code{SUBQ.L #-d,An} when @code{d} is between
|
||
|
-1 and -8.
|
||
|
|
||
|
@item @code{LEA (d,Am),An} will be translated into a combination of
|
||
|
@code{MOVEA} and @code{ADDA.L} for 68000 and 68010, when @code{d} is lower
|
||
|
than -32768 or higher than 32767. The @code{MOVEA} will be omitted when
|
||
|
@code{Am} and @code{An} are identical. Otherwise @option{-opt-speed} is
|
||
|
required.
|
||
|
|
||
|
@item @code{LINK.L An,#x} optimized to @code{LINK.W An,#x}, when @code{x} is
|
||
|
between -32768 and 32767.
|
||
|
|
||
|
@item @code{LINK.W An,#x} translated to @code{LINK.L An,#x}, when @code{x} is
|
||
|
not between -32768 and 32767 and selected CPU supports this instruction.
|
||
|
|
||
|
@item @code{LSL.? #1,Dn} optimized to @code{ADD.? Dn,Dn} for 68000 and 68010,
|
||
|
when option @option{-opt-lsl} is given.
|
||
|
|
||
|
@item @code{LSL.? #2,Dn} optimized into a sequence of two @code{ADD.? Dn,Dn}
|
||
|
for 68000 and 68010, when the operation size is either byte or word and
|
||
|
the options @option{-opt-speed} and @option{-opt-lsl} are given.
|
||
|
|
||
|
@item @code{MOVE.? #0,<ea>} optimized to @code{CLR.? <ea>}, when allowed by
|
||
|
the option @option{-opt-clr} or a different CPU than the MC68000 was
|
||
|
selected.
|
||
|
|
||
|
@item @code{MOVE.? #x,-(SP)} optimized to @code{PEA x}, when allowed by the
|
||
|
option @option{-opt-pea}. The move-size must not be byte (@code{.b}).
|
||
|
|
||
|
@item @code{MOVE.B #-1,<ea>} optimized to @code{ST <ea>}, when allowed by the
|
||
|
option @option{-opt-st}.
|
||
|
|
||
|
@item @code{MOVE.L #x,Dn} optimized to @code{MOVEQ #x,Dn}, when @code{x} is
|
||
|
between -128 and 127.
|
||
|
|
||
|
@item @code{MOVE.L #x,<ea>} optimized to @code{MOV3Q #x,<ea>}, for ColdFire
|
||
|
ISA_B and ISA_C, when @code{x} is -1 or between 1 and 7.
|
||
|
|
||
|
@item @code{MOVEA.? #0,An} optimized to @code{SUBA.L An,An}.
|
||
|
|
||
|
@item @code{MOVEA.L #x,An} optimized to @code{MOVEA.W #x,An}, when @code{x} is
|
||
|
between -32768 and 32767.
|
||
|
|
||
|
@item @code{MOVEA.L #label,An} optimized to @code{LEA label,An}, which could
|
||
|
allow further optimization to @code{LEA label(PC),An}.
|
||
|
|
||
|
@item @code{MOVEM.? <reglist>} is deleted, when the register list was empty.
|
||
|
|
||
|
@item @code{MOVEM.? <ea>,An} optimized to @code{MOVE.? <ea>,An}, when the
|
||
|
register list only contains a single address register.
|
||
|
|
||
|
@item @code{MOVEM.? <ea>,Rn} optimized to @code{MOVE.? <ea>,Rn} and
|
||
|
@code{MOVEM.? Rn,<ea>} optimized to @code{MOVE.? Rn,<ea>}, when allowed
|
||
|
by the option @option{-opt-movem} or when just loading an address register.
|
||
|
|
||
|
@item @code{MOVEM.? <ea>,Rm/Rn} and @code{MOVEM.? Rm/Rn,<ea>} are optimized
|
||
|
into a sequence of two @code{MOVE} for all cpus except 68000 and 68010.
|
||
|
Complex addressing modes with displacements or addresses are optimized
|
||
|
for 68040 only. Has to be enabled by the options @option{-opt-movem} and
|
||
|
@option{-opt-speed}.
|
||
|
|
||
|
@item @code{MULS.?/MULU.? #0,Dn} optimized to @code{MOVEQ #0,Dn}
|
||
|
(@option{-opt-mul}).
|
||
|
|
||
|
@item @code{MULS.?/MULU.? #1,Dn} is deleted (@option{-opt-mul}).
|
||
|
|
||
|
@item @code{MULS.W #-1,Dn} optimized to the sequence @code{EXT.L Dn} and
|
||
|
@code{NEG.L Dn} (@option{-opt-mul} and @option{-opt-speed}).
|
||
|
|
||
|
@item @code{MULS.L #-1,Dn} optimized to @code{NEG.L Dn} (@option{-opt-mul}).
|
||
|
|
||
|
@item @code{MULS.W #2..256,Dn} optimized to the sequence @code{EXT.L Dn} and
|
||
|
@code{ASL.L #x,Dn} (@option{-opt-mul} and @option{-opt-speed}).
|
||
|
|
||
|
@item @code{MULS.W #-2..-256,Dn} optimized to the sequence @code{EXT.L Dn},
|
||
|
@code{ASL.L #x,Dn} and @code{NEG.L Dn} (@option{-opt-mul} and @option{-opt-speed}).
|
||
|
|
||
|
@item @code{MULS.L #2..256,Dn} optimized to @code{ASL.L #x,Dn}
|
||
|
(@option{-opt-mul}).
|
||
|
|
||
|
@item @code{MULS.L #-2..-256,Dn} optimized to the sequence @code{ASL.L #x,Dn}
|
||
|
and @code{NEG.L Dn} (@option{-opt-mul} and @option{-opt-speed}).
|
||
|
|
||
|
@item @code{MULU.W #2..256,Dn} optimized to the sequence @code{MVZ.W Dn,Dn} and
|
||
|
@code{ASL.L #x,Dn} for ColdFire ISA_B/C (@option{-opt-mul} and @option{-opt-speed}).
|
||
|
|
||
|
@item @code{MULU.L #2..256,Dn} optimized to @code{LSL.L #x,Dn}
|
||
|
(@option{-opt-mul}).
|
||
|
|
||
|
@item @code{MVZ.? #x,Dn} and @code{MVS.? #x,Dn} are optimized to
|
||
|
@code{MOVEQ #x,Dn}.
|
||
|
|
||
|
@item @code{ORI.? #0,<ea>} optimized to @code{TST.? <ea>}.
|
||
|
|
||
|
@item @code{SUB.? #x,<ea>} optimized to @code{SUBQ.? #x,<ea>}, when @code{x} is
|
||
|
between 1 and 8.
|
||
|
|
||
|
@item @code{SUB.? #x,<ea>} optimized to @code{ADDQ.? #x,<ea>}, when @code{x} is
|
||
|
between -1 and -8.
|
||
|
|
||
|
@item @code{SUBA.? #x,An} optimized to @code{LEA (-x,An),An}, when @code{x} is
|
||
|
between -32767 and 32768.
|
||
|
|
||
|
@end itemize
|
||
|
|
||
|
@section Known Problems
|
||
|
|
||
|
Some known problems of this module at the moment:
|
||
|
|
||
|
@itemize @minus
|
||
|
|
||
|
@item In some rare cases, mainly by stupid input sources, the optimizer
|
||
|
might oscillate forever between two states. When this happens, assembly
|
||
|
will be terminated automatically after some time.
|
||
|
|
||
|
@end itemize
|
||
|
|
||
|
@section Error Messages
|
||
|
|
||
|
This module has the following error messages:
|
||
|
|
||
|
@itemize @minus
|
||
|
@item 2001: instruction not supported on selected architecture
|
||
|
@item 2002: illegal addressing mode
|
||
|
@item 2003: invalid register list
|
||
|
@item 2004: missing ) in register indirect addressing mode
|
||
|
@item 2005: address register required
|
||
|
@item 2006: bad size extension
|
||
|
@item 2007: displacement at bad position
|
||
|
@item 2008: base or index register expected
|
||
|
@item 2009: missing ] in memory indirect addressing mode
|
||
|
@item 2010: no extension allowed here
|
||
|
@item 2011: illegal scale factor
|
||
|
@item 2012: can't scale PC register
|
||
|
@item 2013: index register expected
|
||
|
@item 2014: too many ] in memory indirect addressing mode
|
||
|
@item 2015: missing outer displacement
|
||
|
@item 2016: %c expected
|
||
|
@item 2017: can't use PC register as index
|
||
|
@item 2018: double registers in list
|
||
|
@item 2019: data register required
|
||
|
@item 2020: illegal bitfield width/offset
|
||
|
@item 2021: constant integer expression required
|
||
|
@item 2022: value from -64 to 63 required for k-factor
|
||
|
@item 2023: need 32 bits to reference a program label
|
||
|
@item 2024: option expected
|
||
|
@item 2025: absolute value expected
|
||
|
@item 2026: operand value out of range: %ld (valid: %ld..%ld)
|
||
|
@item 2027: label in operand required
|
||
|
@item 2028: using signed operand as unsigned: %ld (valid: %ld..%ld), %ld to fix
|
||
|
@item 2029: branch destination out of range
|
||
|
@item 2030: displacement out of range
|
||
|
@item 2031: absolute displacement expected
|
||
|
@item 2032: unknown option %c%c ignored
|
||
|
@item 2033: absolute short address out of range
|
||
|
@item 2034: 8-bit branch with zero displacement was converted to 16-bit
|
||
|
@item 2035: illegal opcode extension
|
||
|
@item 2036: extension for unsized instruction ignored
|
||
|
@item 2037: immediate operand out of range
|
||
|
@item 2038: immediate operand has illegal type or size
|
||
|
@item 2039: data objects with %d bits size are not supported
|
||
|
@item 2040: data out of range
|
||
|
@item 2041: data has illegal type
|
||
|
@item 2042: illegal combination of ColdFire addressing modes
|
||
|
@item 2043: FP register required
|
||
|
@item 2044: unknown cpu type
|
||
|
@item 2045: register expected
|
||
|
@item 2046: link.w changed to link.l
|
||
|
@item 2047: branch out of range changed to jmp
|
||
|
@item 2048: lea-displacement out of range, changed into move/add
|
||
|
@item 2049: translated (A%d) into (0,A%d) for movep
|
||
|
@item 2050: operand optimized: %s
|
||
|
@item 2051: operand translated: %s
|
||
|
@item 2051: instruction optimized: %s
|
||
|
@item 2053: instruction translated: %s
|
||
|
@item 2054: branch optimized into: b<cc>.%c
|
||
|
@item 2055: branch translated into: b<cc>.%c
|
||
|
@item 2056: basereg A%d already in use
|
||
|
@item 2057: basereg A%d is already free
|
||
|
@item 2058: short-branch to following instruction turned into a nop
|
||
|
@item 2059: not a valid small data register
|
||
|
@item 2060: small data mode is not enabled
|
||
|
@item 2061: division by zero
|
||
|
@item 2062: can't use B%d register as index
|
||
|
@item 2063: register list on both sides
|
||
|
@item 2064: "%s" directive was replaced by an instruction with the same name
|
||
|
@item 2065: Addr.reg. operand at level #0 causes F-line exception
|
||
|
@item 2066: Dr and Dq are identical, transforming DIVxL.L effectively into DIVx.L
|
||
|
|
||
|
@end itemize
|