@c Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,@c 2000, 2003, 2004@c Free Software Foundation, Inc.@c This is part of the GAS manual.@c For copying conditions, see the file as.texinfo.@ifset GENERIC@page@node M32R-Dependent@chapter M32R Dependent Features@end ifset@ifclear GENERIC@node Machine Dependencies@chapter M32R Dependent Features@end ifclear@cindex M32R support@menu* M32R-Opts:: M32R Options* M32R-Directives:: M32R Directives* M32R-Warnings:: M32R Warnings@end menu@node M32R-Opts@section M32R Options@cindex options, M32R@cindex M32R optionsThe Renease M32R version of @code{@value{AS}} has a few machinedependent options:@table @code@item -m32rx@cindex @samp{-m32rx} option, M32RX@cindex architecture options, M32RX@cindex M32R architecture options@code{@value{AS}} can assemble code for several different members of theRenesas M32R family. Normally the default is to assemble code forthe M32R microprocessor. This option may be used to change the defaultto the M32RX microprocessor, which adds some more instructions to thebasic M32R instruction set, and some additional parameters to some ofthe original instructions.@item -m32r2@cindex @samp{-m32rx} option, M32R2@cindex architecture options, M32R2@cindex M32R architecture optionsThis option changes the target processor to the the M32R2microprocessor.@item -m32r@cindex @samp{-m32r} option, M32R@cindex architecture options, M32R@cindex M32R architecture optionsThis option can be used to restore the assembler's default behaviour ofassembling for the M32R microprocessor. This can be useful if thedefault has been changed by a previous command line option.@item -little@cindex @code{-little} option, M32RThis option tells the assembler to produce little-endian code anddata. The default is dependent upon how the toolchain wasconfigured.@item -EL@cindex @code{-EL} option, M32RThis is a synonum for @emph{-little}.@item -big@cindex @code{-big} option, M32RThis option tells the assembler to produce big-endian code anddata.@item -EB@cindex @code{-EB} option, M32RThis is a synonum for @emph{-big}.@item -KPIC@cindex @code{-KPIC} option, M32R@cindex PIC code generation for M32RThis option specifies that the output of the assembler should bemarked as position-independent code (PIC).@item -parallel@cindex @code{-parallel} option, M32RXThis option tells the assembler to attempts to combine two sequentialinstructions into a single, parallel instruction, where it is legal todo so.@item -no-parallel@cindex @code{-no-parallel} option, M32RXThis option disables a previously enabled @emph{-parallel} option.@item -no-bitinst@cindex @samp{-no-bitinst}, M32R2This option disables the support for the extended bit-fieldinstructions provided by the M32R2. If this support needs to bere-enabled the @emph{-bitinst} switch can be used to restore it.@item -O@cindex @code{-O} option, M32RXThis option tells the assembler to attempt to optimize theinstructions that it produces. This includes filling delay slots andconverting sequential instructions into parallel ones. This optionimplies @emph{-parallel}.@item -warn-explicit-parallel-conflicts@cindex @samp{-warn-explicit-parallel-conflicts} option, M32RXInstructs @code{@value{AS}} to produce warning messages whenquestionable parallel instructions are encountered. This option isenabled by default, but @code{@value{GCC}} disables it when it invokes@code{@value{AS}} directly. Questionable instructions are those whoesbehaviour would be different if they were executed sequentially. Forexample the code fragment @samp{mv r1, r2 || mv r3, r1} produces adifferent result from @samp{mv r1, r2 \n mv r3, r1} since the formermoves r1 into r3 and then r2 into r1, whereas the later moves r2 into r1and r3.@item -Wp@cindex @samp{-Wp} option, M32RXThis is a shorter synonym for the @emph{-warn-explicit-parallel-conflicts}option.@item -no-warn-explicit-parallel-conflicts@cindex @samp{-no-warn-explicit-parallel-conflicts} option, M32RXInstructs @code{@value{AS}} not to produce warning messages whenquestionable parallel instructions are encountered.@item -Wnp@cindex @samp{-Wnp} option, M32RXThis is a shorter synonym for the @emph{-no-warn-explicit-parallel-conflicts}option.@item -ignore-parallel-conflicts@cindex @samp{-ignore-parallel-conflicts} option, M32RXThis option tells the assembler's to stop checking parallelinstructions for contraint violations. This ability is provided forhardware vendors testing chip designs and should not be used undernormal circumstances.@item -no-ignore-parallel-conflicts@cindex @samp{-no-ignore-parallel-conflicts} option, M32RXThis option restores the assembler's default behaviour of checkingparallel instructions to detect constraint violations.@item -Ip@cindex @samp{-Ip} option, M32RXThis is a shorter synonym for the @emph{-ignore-parallel-conflicts}option.@item -nIp@cindex @samp{-nIp} option, M32RXThis is a shorter synonym for the @emph{-no-ignore-parallel-conflicts}option.@item -warn-unmatched-high@cindex @samp{-warn-unmatched-high} option, M32RThis option tells the assembler to produce a warning message if a@code{.high} pseudo op is encountered without a mathcing @code{.low}pseudo op. The presence of such an unmatches pseudo op usuallyindicates a programming error.@item -no-warn-unmatched-high@cindex @samp{-no-warn-unmatched-high} option, M32RDisables a previously enabled @emph{-warn-unmatched-high} option.@item -Wuh@cindex @samp{-Wuh} option, M32RXThis is a shorter synonym for the @emph{-warn-unmatched-high} option.@item -Wnuh@cindex @samp{-Wnuh} option, M32RXThis is a shorter synonym for the @emph{-no-warn-unmatched-high} option.@end table@node M32R-Directives@section M32R Directives@cindex directives, M32R@cindex M32R directivesThe Renease M32R version of @code{@value{AS}} has a few architecturespecific directives:@table @code@cindex @code{low} directive, M32R@item low @var{expression}The @code{low} directive computes the value of its expression andplaces the lower 16-bits of the result into the immediate-field of theinstruction. For example:@smallexampleor3 r0, r0, #low(0x12345678) ; compute r0 = r0 | 0x5678add3, r0, r0, #low(fred) ; compute r0 = r0 + low 16-bits of address of fred@end smallexample@item high @var{expression}@cindex @code{high} directive, M32RThe @code{high} directive computes the value of its expression andplaces the upper 16-bits of the result into the immediate-field of theinstruction. For example:@smallexampleseth r0, #high(0x12345678) ; compute r0 = 0x12340000seth, r0, #high(fred) ; compute r0 = upper 16-bits of address of fred@end smallexample@item shigh @var{expression}@cindex @code{shigh} directive, M32RThe @code{shigh} directive is very similar to the @code{high}directive. It also computes the value of its expression and placesthe upper 16-bits of the result into the immediate-field of theinstruction. The difference is that @code{shigh} also checks to seeif the lower 16-bits could be interpreted as a signed number, and ifso it assumes that a borrow will occur from the upper-16 bits. Tocompensate for this the @code{shigh} directive pre-biases the upper16 bit value by adding one to it. For example:For example:@smallexampleseth r0, #shigh(0x12345678) ; compute r0 = 0x12340000seth r0, #shigh(0x00008000) ; compute r0 = 0x00010000@end smallexampleIn the second example the lower 16-bits are 0x8000. If these aretreated as a signed value and sign extended to 32-bits then the valuebecomes 0xffff8000. If this value is then added to 0x00010000 thenthe result is 0x00008000.This behaviour is to allow for the different semantics of the@code{or3} and @code{add3} instructions. The @code{or3} instructiontreats its 16-bit immediate argument as unsigned whereas the@code{add3} treats its 16-bit immediate as a signed value. So forexample:@smallexampleseth r0, #shigh(0x00008000)add3 r0, r0, #low(0x00008000)@end smallexampleProduces the correct result in r0, whereas:@smallexampleseth r0, #shigh(0x00008000)or3 r0, r0, #low(0x00008000)@end smallexampleStores 0xffff8000 into r0.Note - the @code{shigh} directive does not know where in the assemblysource code the lower 16-bits of the value are going set, so it cannotcheck to make sure that an @code{or3} instruction is being used ratherthan an @code{add3} instruction. It is up to the programmer to makesure that correct directives are used.@cindex @code{.m32r} directive, M32R@item .m32rThe directive performs a similar thing as the @emph{-m32r} commandline option. It tells the assembler to only accept M32R instructionsfrom now on. An instructions from later M32R architectures arerefused.@cindex @code{.m32rx} directive, M32RX@item .m32rxThe directive performs a similar thing as the @emph{-m32rx} commandline option. It tells the assembler to start accepting the extrainstructions in the M32RX ISA as well as the ordinary M32R ISA.@cindex @code{.m32r2} directive, M32R2@item .m32r2The directive performs a similar thing as the @emph{-m32r2} commandline option. It tells the assembler to start accepting the extrainstructions in the M32R2 ISA as well as the ordinary M32R ISA.@cindex @code{.little} directive, M32RX@item .littleThe directive performs a similar thing as the @emph{-little} commandline option. It tells the assembler to start producing little-endiancode and data. This option should be used with care as producingmixed-endian binary files is frought with danger.@cindex @code{.big} directive, M32RX@item .bigThe directive performs a similar thing as the @emph{-big} commandline option. It tells the assembler to start producing big-endiancode and data. This option should be used with care as producingmixed-endian binary files is frought with danger.@end table@node M32R-Warnings@section M32R Warnings@cindex warnings, M32R@cindex M32R warningsThere are several warning and error messages that can be produced by@code{@value{AS}} which are specific to the M32R:@table @code@item output of 1st instruction is the same as an input to 2nd instruction - is this intentional ?This message is only produced if warnings for explicit parallelconflicts have been enabled. It indicates that the assembler hasencountered a parallel instruction in which the destination register ofthe left hand instruction is used as an input register in the right handinstruction. For example in this code fragment@samp{mv r1, r2 || neg r3, r1} register r1 is the destination of themove instruction and the input to the neg instruction.@item output of 2nd instruction is the same as an input to 1st instruction - is this intentional ?This message is only produced if warnings for explicit parallelconflicts have been enabled. It indicates that the assembler hasencountered a parallel instruction in which the destination register ofthe right hand instruction is used as an input register in the left handinstruction. For example in this code fragment@samp{mv r1, r2 || neg r2, r3} register r2 is the destination of theneg instruction and the input to the move instruction.@item instruction @samp{...} is for the M32RX onlyThis message is produced when the assembler encounters an instructionwhich is only supported by the M32Rx processor, and the @samp{-m32rx}command line flag has not been specified to allow assembly of suchinstructions.@item unknown instruction @samp{...}This message is produced when the assembler encounters an instructionwhich it does not recognise.@item only the NOP instruction can be issued in parallel on the m32rThis message is produced when the assembler encounters a parallelinstruction which does not involve a NOP instruction and the@samp{-m32rx} command line flag has not been specified. Only the M32Rxprocessor is able to execute two instructions in parallel.@item instruction @samp{...} cannot be executed in parallel.This message is produced when the assembler encounters a parallelinstruction which is made up of one or two instructions which cannot beexecuted in parallel.@item Instructions share the same execution pipelineThis message is produced when the assembler encounters a parallelinstruction whoes components both use the same execution pipeline.@item Instructions write to the same destination register.This message is produced when the assembler encounters a parallelinstruction where both components attempt to modify the same register.For example these code fragments will produce this message:@samp{mv r1, r2 || neg r1, r3}@samp{jl r0 || mv r14, r1}@samp{st r2, @@-r1 || mv r1, r3}@samp{mv r1, r2 || ld r0, @@r1+}@samp{cmp r1, r2 || addx r3, r4} (Both write to the condition bit)@end table