1 @c Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2003
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.
8 @chapter M32R Dependent Features
11 @node Machine Dependencies
12 @chapter M32R Dependent Features
17 * M32R-Opts:: M32R Options
18 * M32R-Directives:: M32R Directives
19 * M32R-Warnings:: M32R Warnings
28 The Renease M32R version of @code{@value{AS}} has a few machine
34 @cindex @samp{-m32rx} option, M32RX
35 @cindex architecture options, M32RX
36 @cindex M32R architecture options
37 @code{@value{AS}} can assemble code for several different members of the
38 Renesas M32R family. Normally the default is to assemble code for
39 the M32R microprocessor. This option may be used to change the default
40 to the M32RX microprocessor, which adds some more instructions to the
41 basic M32R instruction set, and some additional parameters to some of
42 the original instructions.
45 @cindex @samp{-m32rx} option, M32R2
46 @cindex architecture options, M32R2
47 @cindex M32R architecture options
48 This option changes the target processor to the the M32R2
52 @cindex @samp{-m32r} option, M32R
53 @cindex architecture options, M32R
54 @cindex M32R architecture options
55 This option can be used to restore the assembler's default behaviour of
56 assembling for the M32R microprocessor. This can be useful if the
57 default has been changed by a previous command line option.
60 @cindex @code{-little} option, M32R
61 This option tells the assembler to produce little-endian code and
62 data. The default is dependent upon how the toolchain was
66 @cindex @code{-EL} option, M32R
67 This is a synonum for @emph{-little}.
70 @cindex @code{-big} option, M32R
71 This option tells the assembler to produce big-endian code and
75 @cindex @code{-EB} option, M32R
76 This is a synonum for @emph{-big}.
79 @cindex @code{-KPIC} option, M32R
80 @cindex PIC code generation for M32R
81 This option specifies that the output of the assembler should be
82 marked as position-independent code (PIC).
85 @cindex @code{-parallel} option, M32RX
86 This option tells the assembler to attempts to combine two sequential
87 instructions into a single, parallel instruction, where it is legal to
91 @cindex @code{-no-parallel} option, M32RX
92 This option disables a previously enabled @emph{-parallel} option.
95 @cindex @code{-O} option, M32RX
96 This option tells the assembler to attempt to optimize the
97 instructions that it produces. This includes filling delay slots and
98 converting sequential instructions into parallel ones. This option
99 implies @emph{-parallel}.
101 @item -warn-explicit-parallel-conflicts
102 @cindex @samp{-warn-explicit-parallel-conflicts} option, M32RX
103 Instructs @code{@value{AS}} to produce warning messages when
104 questionable parallel instructions are encountered. This option is
105 enabled by default, but @code{@value{GCC}} disables it when it invokes
106 @code{@value{AS}} directly. Questionable instructions are those whoes
107 behaviour would be different if they were executed sequentially. For
108 example the code fragment @samp{mv r1, r2 || mv r3, r1} produces a
109 different result from @samp{mv r1, r2 \n mv r3, r1} since the former
110 moves r1 into r3 and then r2 into r1, whereas the later moves r2 into r1
114 @cindex @samp{-Wp} option, M32RX
115 This is a shorter synonym for the @emph{-warn-explicit-parallel-conflicts}
118 @item -no-warn-explicit-parallel-conflicts
119 @cindex @samp{-no-warn-explicit-parallel-conflicts} option, M32RX
120 Instructs @code{@value{AS}} not to produce warning messages when
121 questionable parallel instructions are encountered.
124 @cindex @samp{-Wnp} option, M32RX
125 This is a shorter synonym for the @emph{-no-warn-explicit-parallel-conflicts}
128 @item -ignore-parallel-conflicts
129 @cindex @samp{-ignore-parallel-conflicts} option, M32RX
130 This option tells the assembler's to stop checking parallel
131 instructions for contraint violations. This ability is provided for
132 hardware vendors testing chip designs and should not be used under
133 normal circumstances.
135 @item -no-ignore-parallel-conflicts
136 @cindex @samp{-no-ignore-parallel-conflicts} option, M32RX
137 This option restores the assembler's default behaviour of checking
138 parallel instructions to detect constraint violations.
141 @cindex @samp{-Ip} option, M32RX
142 This is a shorter synonym for the @emph{-ignore-parallel-conflicts}
146 @cindex @samp{-nIp} option, M32RX
147 This is a shorter synonym for the @emph{-no-ignore-parallel-conflicts}
150 @item -warn-unmatched-high
151 @cindex @samp{-warn-unmatched-high} option, M32R
152 This option tells the assembler to produce a warning message if a
153 @code{.high} pseudo op is encountered without a mathcing @code{.low}
154 pseudo op. The presence of such an unmatches pseudo op usually
155 indicates a programming error.
157 @item -no-warn-unmatched-high
158 @cindex @samp{-no-warn-unmatched-high} option, M32R
159 Disables a previously enabled @emph{-warn-unmatched-high} option.
162 @cindex @samp{-Wuh} option, M32RX
163 This is a shorter synonym for the @emph{-warn-unmatched-high} option.
166 @cindex @samp{-Wnuh} option, M32RX
167 This is a shorter synonym for the @emph{-no-warn-unmatched-high} option.
171 @node M32R-Directives
172 @section M32R Directives
173 @cindex directives, M32R
174 @cindex M32R directives
176 The Renease M32R version of @code{@value{AS}} has a few architecture
181 @cindex @code{low} directive, M32R
182 @item low @var{expression}
183 The @code{low} directive computes the value of its expression and
184 places the lower 16-bits of the result into the immediate-field of the
185 instruction. For example:
188 or3 r0, r0, #low(0x12345678) ; compute r0 = r0 | 0x5678
189 add3, r0, r0, #low(fred) ; compute r0 = r0 + low 16-bits of address of fred
192 @item high @var{expression}
193 @cindex @code{high} directive, M32R
194 The @code{high} directive computes the value of its expression and
195 places the upper 16-bits of the result into the immediate-field of the
196 instruction. For example:
199 seth r0, #high(0x12345678) ; compute r0 = 0x12340000
200 seth, r0, #high(fred) ; compute r0 = upper 16-bits of address of fred
203 @item shigh @var{expression}
204 @cindex @code{shigh} directive, M32R
205 The @code{shigh} directive is very similar to the @code{high}
206 directive. It also computes the value of its expression and places
207 the upper 16-bits of the result into the immediate-field of the
208 instruction. The difference is that @code{shigh} also checks to see
209 if the lower 16-bits could be interpreted as a signed number, and if
210 so it assumes that a borrow will occur from the upper-16 bits. To
211 compensate for this the @code{shigh} directive pre-biases the upper
212 16 bit value by adding one to it. For example:
217 seth r0, #shigh(0x12345678) ; compute r0 = 0x12340000
218 seth r0, #shigh(0x00008000) ; compute r0 = 0x00010000
221 In the second example the lower 16-bits are 0x8000. If these are
222 treated as a signed value and sign extended to 32-bits then the value
223 becomes 0xffff8000. If this value is then added to 0x00010000 then
224 the result is 0x00008000.
226 This behaviour is to allow for the different semantics of the
227 @code{or3} and @code{add3} instructions. The @code{or3} instruction
228 treats its 16-bit immediate argument as unsigned whereas the
229 @code{add3} treats its 16-bit immediate as a signed value. So for
233 seth r0, #shigh(0x00008000)
234 add3 r0, r0, #low(0x00008000)
237 Produces the correct result in r0, whereas:
240 seth r0, #shigh(0x00008000)
241 or3 r0, r0, #low(0x00008000)
244 Stores 0xffff8000 into r0.
246 Note - the @code{shigh} directive does not know where in the assembly
247 source code the lower 16-bits of the value are going set, so it cannot
248 check to make sure that an @code{or3} instruction is being used rather
249 than an @code{add3} instruction. It is up to the programmer to make
250 sure that correct directives are used.
252 @cindex @code{.m32r} directive, M32R
254 The directive performs a similar thing as the @emph{-m32r} command
255 line option. It tells the assembler to only accept M32R instructions
256 from now on. An instructions from later M32R architectures are
259 @cindex @code{.m32rx} directive, M32RX
261 The directive performs a similar thing as the @emph{-m32rx} command
262 line option. It tells the assembler to start accepting the extra
263 instructions in the M32RX ISA as well as the ordinary M32R ISA.
265 @cindex @code{.m32r2} directive, M32R2
267 The directive performs a similar thing as the @emph{-m32r2} command
268 line option. It tells the assembler to start accepting the extra
269 instructions in the M32R2 ISA as well as the ordinary M32R ISA.
271 @cindex @code{.little} directive, M32RX
273 The directive performs a similar thing as the @emph{-little} command
274 line option. It tells the assembler to start producing little-endian
275 code and data. This option should be used with care as producing
276 mixed-endian binary files is frought with danger.
278 @cindex @code{.big} directive, M32RX
280 The directive performs a similar thing as the @emph{-big} command
281 line option. It tells the assembler to start producing big-endian
282 code and data. This option should be used with care as producing
283 mixed-endian binary files is frought with danger.
288 @section M32R Warnings
290 @cindex warnings, M32R
291 @cindex M32R warnings
293 There are several warning and error messages that can be produced by
294 @code{@value{AS}} which are specific to the M32R:
298 @item output of 1st instruction is the same as an input to 2nd instruction - is this intentional ?
299 This message is only produced if warnings for explicit parallel
300 conflicts have been enabled. It indicates that the assembler has
301 encountered a parallel instruction in which the destination register of
302 the left hand instruction is used as an input register in the right hand
303 instruction. For example in this code fragment
304 @samp{mv r1, r2 || neg r3, r1} register r1 is the destination of the
305 move instruction and the input to the neg instruction.
307 @item output of 2nd instruction is the same as an input to 1st instruction - is this intentional ?
308 This message is only produced if warnings for explicit parallel
309 conflicts have been enabled. It indicates that the assembler has
310 encountered a parallel instruction in which the destination register of
311 the right hand instruction is used as an input register in the left hand
312 instruction. For example in this code fragment
313 @samp{mv r1, r2 || neg r2, r3} register r2 is the destination of the
314 neg instruction and the input to the move instruction.
316 @item instruction @samp{...} is for the M32RX only
317 This message is produced when the assembler encounters an instruction
318 which is only supported by the M32Rx processor, and the @samp{-m32rx}
319 command line flag has not been specified to allow assembly of such
322 @item unknown instruction @samp{...}
323 This message is produced when the assembler encounters an instruction
324 which it does not recognise.
326 @item only the NOP instruction can be issued in parallel on the m32r
327 This message is produced when the assembler encounters a parallel
328 instruction which does not involve a NOP instruction and the
329 @samp{-m32rx} command line flag has not been specified. Only the M32Rx
330 processor is able to execute two instructions in parallel.
332 @item instruction @samp{...} cannot be executed in parallel.
333 This message is produced when the assembler encounters a parallel
334 instruction which is made up of one or two instructions which cannot be
335 executed in parallel.
337 @item Instructions share the same execution pipeline
338 This message is produced when the assembler encounters a parallel
339 instruction whoes components both use the same execution pipeline.
341 @item Instructions write to the same destination register.
342 This message is produced when the assembler encounters a parallel
343 instruction where both components attempt to modify the same register.
344 For example these code fragments will produce this message:
345 @samp{mv r1, r2 || neg r1, r3}
346 @samp{jl r0 || mv r14, r1}
347 @samp{st r2, @@-r1 || mv r1, r3}
348 @samp{mv r1, r2 || ld r0, @@r1+}
349 @samp{cmp r1, r2 || addx r3, r4} (Both write to the condition bit)