GAS: Consistently fix labels at the `.end' pseudo-op
[external/binutils.git] / gas / config / tc-mips.c
1 /* tc-mips.c -- assemble code for a MIPS chip.
2    Copyright (C) 1993-2017 Free Software Foundation, Inc.
3    Contributed by the OSF and Ralph Campbell.
4    Written by Keith Knowles and Ralph Campbell, working independently.
5    Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
6    Support.
7
8    This file is part of GAS.
9
10    GAS is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 3, or (at your option)
13    any later version.
14
15    GAS is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with GAS; see the file COPYING.  If not, write to the Free
22    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
23    02110-1301, USA.  */
24
25 #include "as.h"
26 #include "config.h"
27 #include "subsegs.h"
28 #include "safe-ctype.h"
29
30 #include "opcode/mips.h"
31 #include "itbl-ops.h"
32 #include "dwarf2dbg.h"
33 #include "dw2gencfi.h"
34
35 /* Check assumptions made in this file.  */
36 typedef char static_assert1[sizeof (offsetT) < 8 ? -1 : 1];
37 typedef char static_assert2[sizeof (valueT) < 8 ? -1 : 1];
38
39 #ifdef DEBUG
40 #define DBG(x) printf x
41 #else
42 #define DBG(x)
43 #endif
44
45 #define streq(a, b)           (strcmp (a, b) == 0)
46
47 #define SKIP_SPACE_TABS(S) \
48   do { while (*(S) == ' ' || *(S) == '\t') ++(S); } while (0)
49
50 /* Clean up namespace so we can include obj-elf.h too.  */
51 static int mips_output_flavor (void);
52 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
53 #undef OBJ_PROCESS_STAB
54 #undef OUTPUT_FLAVOR
55 #undef S_GET_ALIGN
56 #undef S_GET_SIZE
57 #undef S_SET_ALIGN
58 #undef S_SET_SIZE
59 #undef obj_frob_file
60 #undef obj_frob_file_after_relocs
61 #undef obj_frob_symbol
62 #undef obj_pop_insert
63 #undef obj_sec_sym_ok_for_reloc
64 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
65
66 #include "obj-elf.h"
67 /* Fix any of them that we actually care about.  */
68 #undef OUTPUT_FLAVOR
69 #define OUTPUT_FLAVOR mips_output_flavor()
70
71 #include "elf/mips.h"
72
73 #ifndef ECOFF_DEBUGGING
74 #define NO_ECOFF_DEBUGGING
75 #define ECOFF_DEBUGGING 0
76 #endif
77
78 int mips_flag_mdebug = -1;
79
80 /* Control generation of .pdr sections.  Off by default on IRIX: the native
81    linker doesn't know about and discards them, but relocations against them
82    remain, leading to rld crashes.  */
83 #ifdef TE_IRIX
84 int mips_flag_pdr = FALSE;
85 #else
86 int mips_flag_pdr = TRUE;
87 #endif
88
89 #include "ecoff.h"
90
91 static char *mips_regmask_frag;
92 static char *mips_flags_frag;
93
94 #define ZERO 0
95 #define ATREG 1
96 #define S0  16
97 #define S7  23
98 #define TREG 24
99 #define PIC_CALL_REG 25
100 #define KT0 26
101 #define KT1 27
102 #define GP  28
103 #define SP  29
104 #define FP  30
105 #define RA  31
106
107 #define ILLEGAL_REG (32)
108
109 #define AT  mips_opts.at
110
111 extern int target_big_endian;
112
113 /* The name of the readonly data section.  */
114 #define RDATA_SECTION_NAME ".rodata"
115
116 /* Ways in which an instruction can be "appended" to the output.  */
117 enum append_method {
118   /* Just add it normally.  */
119   APPEND_ADD,
120
121   /* Add it normally and then add a nop.  */
122   APPEND_ADD_WITH_NOP,
123
124   /* Turn an instruction with a delay slot into a "compact" version.  */
125   APPEND_ADD_COMPACT,
126
127   /* Insert the instruction before the last one.  */
128   APPEND_SWAP
129 };
130
131 /* Information about an instruction, including its format, operands
132    and fixups.  */
133 struct mips_cl_insn
134 {
135   /* The opcode's entry in mips_opcodes or mips16_opcodes.  */
136   const struct mips_opcode *insn_mo;
137
138   /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
139      a copy of INSN_MO->match with the operands filled in.  If we have
140      decided to use an extended MIPS16 instruction, this includes the
141      extension.  */
142   unsigned long insn_opcode;
143
144   /* The frag that contains the instruction.  */
145   struct frag *frag;
146
147   /* The offset into FRAG of the first instruction byte.  */
148   long where;
149
150   /* The relocs associated with the instruction, if any.  */
151   fixS *fixp[3];
152
153   /* True if this entry cannot be moved from its current position.  */
154   unsigned int fixed_p : 1;
155
156   /* True if this instruction occurred in a .set noreorder block.  */
157   unsigned int noreorder_p : 1;
158
159   /* True for mips16 instructions that jump to an absolute address.  */
160   unsigned int mips16_absolute_jump_p : 1;
161
162   /* True if this instruction is complete.  */
163   unsigned int complete_p : 1;
164
165   /* True if this instruction is cleared from history by unconditional
166      branch.  */
167   unsigned int cleared_p : 1;
168 };
169
170 /* The ABI to use.  */
171 enum mips_abi_level
172 {
173   NO_ABI = 0,
174   O32_ABI,
175   O64_ABI,
176   N32_ABI,
177   N64_ABI,
178   EABI_ABI
179 };
180
181 /* MIPS ABI we are using for this output file.  */
182 static enum mips_abi_level mips_abi = NO_ABI;
183
184 /* Whether or not we have code that can call pic code.  */
185 int mips_abicalls = FALSE;
186
187 /* Whether or not we have code which can be put into a shared
188    library.  */
189 static bfd_boolean mips_in_shared = TRUE;
190
191 /* This is the set of options which may be modified by the .set
192    pseudo-op.  We use a struct so that .set push and .set pop are more
193    reliable.  */
194
195 struct mips_set_options
196 {
197   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
198      if it has not been initialized.  Changed by `.set mipsN', and the
199      -mipsN command line option, and the default CPU.  */
200   int isa;
201   /* Enabled Application Specific Extensions (ASEs).  Changed by `.set
202      <asename>', by command line options, and based on the default
203      architecture.  */
204   int ase;
205   /* Whether we are assembling for the mips16 processor.  0 if we are
206      not, 1 if we are, and -1 if the value has not been initialized.
207      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
208      -nomips16 command line options, and the default CPU.  */
209   int mips16;
210   /* Whether we are assembling for the mipsMIPS ASE.  0 if we are not,
211      1 if we are, and -1 if the value has not been initialized.  Changed
212      by `.set micromips' and `.set nomicromips', and the -mmicromips
213      and -mno-micromips command line options, and the default CPU.  */
214   int micromips;
215   /* Non-zero if we should not reorder instructions.  Changed by `.set
216      reorder' and `.set noreorder'.  */
217   int noreorder;
218   /* Non-zero if we should not permit the register designated "assembler
219      temporary" to be used in instructions.  The value is the register
220      number, normally $at ($1).  Changed by `.set at=REG', `.set noat'
221      (same as `.set at=$0') and `.set at' (same as `.set at=$1').  */
222   unsigned int at;
223   /* Non-zero if we should warn when a macro instruction expands into
224      more than one machine instruction.  Changed by `.set nomacro' and
225      `.set macro'.  */
226   int warn_about_macros;
227   /* Non-zero if we should not move instructions.  Changed by `.set
228      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
229   int nomove;
230   /* Non-zero if we should not optimize branches by moving the target
231      of the branch into the delay slot.  Actually, we don't perform
232      this optimization anyhow.  Changed by `.set bopt' and `.set
233      nobopt'.  */
234   int nobopt;
235   /* Non-zero if we should not autoextend mips16 instructions.
236      Changed by `.set autoextend' and `.set noautoextend'.  */
237   int noautoextend;
238   /* True if we should only emit 32-bit microMIPS instructions.
239      Changed by `.set insn32' and `.set noinsn32', and the -minsn32
240      and -mno-insn32 command line options.  */
241   bfd_boolean insn32;
242   /* Restrict general purpose registers and floating point registers
243      to 32 bit.  This is initially determined when -mgp32 or -mfp32
244      is passed but can changed if the assembler code uses .set mipsN.  */
245   int gp;
246   int fp;
247   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
248      command line option, and the default CPU.  */
249   int arch;
250   /* True if ".set sym32" is in effect.  */
251   bfd_boolean sym32;
252   /* True if floating-point operations are not allowed.  Changed by .set
253      softfloat or .set hardfloat, by command line options -msoft-float or
254      -mhard-float.  The default is false.  */
255   bfd_boolean soft_float;
256
257   /* True if only single-precision floating-point operations are allowed.
258      Changed by .set singlefloat or .set doublefloat, command-line options
259      -msingle-float or -mdouble-float.  The default is false.  */
260   bfd_boolean single_float;
261
262   /* 1 if single-precision operations on odd-numbered registers are
263      allowed.  */
264   int oddspreg;
265 };
266
267 /* Specifies whether module level options have been checked yet.  */
268 static bfd_boolean file_mips_opts_checked = FALSE;
269
270 /* Do we support nan2008?  0 if we don't, 1 if we do, and -1 if the
271    value has not been initialized.  Changed by `.nan legacy' and
272    `.nan 2008', and the -mnan=legacy and -mnan=2008 command line
273    options, and the default CPU.  */
274 static int mips_nan2008 = -1;
275
276 /* This is the struct we use to hold the module level set of options.
277    Note that we must set the isa field to ISA_UNKNOWN and the ASE, gp and
278    fp fields to -1 to indicate that they have not been initialized.  */
279
280 static struct mips_set_options file_mips_opts =
281 {
282   /* isa */ ISA_UNKNOWN, /* ase */ 0, /* mips16 */ -1, /* micromips */ -1,
283   /* noreorder */ 0,  /* at */ ATREG, /* warn_about_macros */ 0,
284   /* nomove */ 0, /* nobopt */ 0, /* noautoextend */ 0, /* insn32 */ FALSE,
285   /* gp */ -1, /* fp */ -1, /* arch */ CPU_UNKNOWN, /* sym32 */ FALSE,
286   /* soft_float */ FALSE, /* single_float */ FALSE, /* oddspreg */ -1
287 };
288
289 /* This is similar to file_mips_opts, but for the current set of options.  */
290
291 static struct mips_set_options mips_opts =
292 {
293   /* isa */ ISA_UNKNOWN, /* ase */ 0, /* mips16 */ -1, /* micromips */ -1,
294   /* noreorder */ 0,  /* at */ ATREG, /* warn_about_macros */ 0,
295   /* nomove */ 0, /* nobopt */ 0, /* noautoextend */ 0, /* insn32 */ FALSE,
296   /* gp */ -1, /* fp */ -1, /* arch */ CPU_UNKNOWN, /* sym32 */ FALSE,
297   /* soft_float */ FALSE, /* single_float */ FALSE, /* oddspreg */ -1
298 };
299
300 /* Which bits of file_ase were explicitly set or cleared by ASE options.  */
301 static unsigned int file_ase_explicit;
302
303 /* These variables are filled in with the masks of registers used.
304    The object format code reads them and puts them in the appropriate
305    place.  */
306 unsigned long mips_gprmask;
307 unsigned long mips_cprmask[4];
308
309 /* True if any MIPS16 code was produced.  */
310 static int file_ase_mips16;
311
312 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
313                               || mips_opts.isa == ISA_MIPS32R2          \
314                               || mips_opts.isa == ISA_MIPS32R3          \
315                               || mips_opts.isa == ISA_MIPS32R5          \
316                               || mips_opts.isa == ISA_MIPS64            \
317                               || mips_opts.isa == ISA_MIPS64R2          \
318                               || mips_opts.isa == ISA_MIPS64R3          \
319                               || mips_opts.isa == ISA_MIPS64R5)
320
321 /* True if any microMIPS code was produced.  */
322 static int file_ase_micromips;
323
324 /* True if we want to create R_MIPS_JALR for jalr $25.  */
325 #ifdef TE_IRIX
326 #define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
327 #else
328 /* As a GNU extension, we use R_MIPS_JALR for o32 too.  However,
329    because there's no place for any addend, the only acceptable
330    expression is a bare symbol.  */
331 #define MIPS_JALR_HINT_P(EXPR) \
332   (!HAVE_IN_PLACE_ADDENDS \
333    || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
334 #endif
335
336 /* The argument of the -march= flag.  The architecture we are assembling.  */
337 static const char *mips_arch_string;
338
339 /* The argument of the -mtune= flag.  The architecture for which we
340    are optimizing.  */
341 static int mips_tune = CPU_UNKNOWN;
342 static const char *mips_tune_string;
343
344 /* True when generating 32-bit code for a 64-bit processor.  */
345 static int mips_32bitmode = 0;
346
347 /* True if the given ABI requires 32-bit registers.  */
348 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
349
350 /* Likewise 64-bit registers.  */
351 #define ABI_NEEDS_64BIT_REGS(ABI)       \
352   ((ABI) == N32_ABI                     \
353    || (ABI) == N64_ABI                  \
354    || (ABI) == O64_ABI)
355
356 #define ISA_IS_R6(ISA)                  \
357   ((ISA) == ISA_MIPS32R6                \
358    || (ISA) == ISA_MIPS64R6)
359
360 /*  Return true if ISA supports 64 bit wide gp registers.  */
361 #define ISA_HAS_64BIT_REGS(ISA)         \
362   ((ISA) == ISA_MIPS3                   \
363    || (ISA) == ISA_MIPS4                \
364    || (ISA) == ISA_MIPS5                \
365    || (ISA) == ISA_MIPS64               \
366    || (ISA) == ISA_MIPS64R2             \
367    || (ISA) == ISA_MIPS64R3             \
368    || (ISA) == ISA_MIPS64R5             \
369    || (ISA) == ISA_MIPS64R6)
370
371 /*  Return true if ISA supports 64 bit wide float registers.  */
372 #define ISA_HAS_64BIT_FPRS(ISA)         \
373   ((ISA) == ISA_MIPS3                   \
374    || (ISA) == ISA_MIPS4                \
375    || (ISA) == ISA_MIPS5                \
376    || (ISA) == ISA_MIPS32R2             \
377    || (ISA) == ISA_MIPS32R3             \
378    || (ISA) == ISA_MIPS32R5             \
379    || (ISA) == ISA_MIPS32R6             \
380    || (ISA) == ISA_MIPS64               \
381    || (ISA) == ISA_MIPS64R2             \
382    || (ISA) == ISA_MIPS64R3             \
383    || (ISA) == ISA_MIPS64R5             \
384    || (ISA) == ISA_MIPS64R6)
385
386 /* Return true if ISA supports 64-bit right rotate (dror et al.)
387    instructions.  */
388 #define ISA_HAS_DROR(ISA)               \
389   ((ISA) == ISA_MIPS64R2                \
390    || (ISA) == ISA_MIPS64R3             \
391    || (ISA) == ISA_MIPS64R5             \
392    || (ISA) == ISA_MIPS64R6             \
393    || (mips_opts.micromips              \
394        && ISA_HAS_64BIT_REGS (ISA))     \
395    )
396
397 /* Return true if ISA supports 32-bit right rotate (ror et al.)
398    instructions.  */
399 #define ISA_HAS_ROR(ISA)                \
400   ((ISA) == ISA_MIPS32R2                \
401    || (ISA) == ISA_MIPS32R3             \
402    || (ISA) == ISA_MIPS32R5             \
403    || (ISA) == ISA_MIPS32R6             \
404    || (ISA) == ISA_MIPS64R2             \
405    || (ISA) == ISA_MIPS64R3             \
406    || (ISA) == ISA_MIPS64R5             \
407    || (ISA) == ISA_MIPS64R6             \
408    || (mips_opts.ase & ASE_SMARTMIPS)   \
409    || mips_opts.micromips               \
410    )
411
412 /* Return true if ISA supports single-precision floats in odd registers.  */
413 #define ISA_HAS_ODD_SINGLE_FPR(ISA, CPU)\
414   (((ISA) == ISA_MIPS32                 \
415     || (ISA) == ISA_MIPS32R2            \
416     || (ISA) == ISA_MIPS32R3            \
417     || (ISA) == ISA_MIPS32R5            \
418     || (ISA) == ISA_MIPS32R6            \
419     || (ISA) == ISA_MIPS64              \
420     || (ISA) == ISA_MIPS64R2            \
421     || (ISA) == ISA_MIPS64R3            \
422     || (ISA) == ISA_MIPS64R5            \
423     || (ISA) == ISA_MIPS64R6            \
424     || (CPU) == CPU_R5900)              \
425    && (CPU) != CPU_LOONGSON_3A)
426
427 /* Return true if ISA supports move to/from high part of a 64-bit
428    floating-point register. */
429 #define ISA_HAS_MXHC1(ISA)              \
430   ((ISA) == ISA_MIPS32R2                \
431    || (ISA) == ISA_MIPS32R3             \
432    || (ISA) == ISA_MIPS32R5             \
433    || (ISA) == ISA_MIPS32R6             \
434    || (ISA) == ISA_MIPS64R2             \
435    || (ISA) == ISA_MIPS64R3             \
436    || (ISA) == ISA_MIPS64R5             \
437    || (ISA) == ISA_MIPS64R6)
438
439 /*  Return true if ISA supports legacy NAN.  */
440 #define ISA_HAS_LEGACY_NAN(ISA)         \
441   ((ISA) == ISA_MIPS1                   \
442    || (ISA) == ISA_MIPS2                \
443    || (ISA) == ISA_MIPS3                \
444    || (ISA) == ISA_MIPS4                \
445    || (ISA) == ISA_MIPS5                \
446    || (ISA) == ISA_MIPS32               \
447    || (ISA) == ISA_MIPS32R2             \
448    || (ISA) == ISA_MIPS32R3             \
449    || (ISA) == ISA_MIPS32R5             \
450    || (ISA) == ISA_MIPS64               \
451    || (ISA) == ISA_MIPS64R2             \
452    || (ISA) == ISA_MIPS64R3             \
453    || (ISA) == ISA_MIPS64R5)
454
455 #define GPR_SIZE \
456     (mips_opts.gp == 64 && !ISA_HAS_64BIT_REGS (mips_opts.isa) \
457      ? 32 \
458      : mips_opts.gp)
459
460 #define FPR_SIZE \
461     (mips_opts.fp == 64 && !ISA_HAS_64BIT_FPRS (mips_opts.isa) \
462      ? 32 \
463      : mips_opts.fp)
464
465 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
466
467 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
468
469 /* True if relocations are stored in-place.  */
470 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
471
472 /* The ABI-derived address size.  */
473 #define HAVE_64BIT_ADDRESSES \
474   (GPR_SIZE == 64 && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
475 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
476
477 /* The size of symbolic constants (i.e., expressions of the form
478    "SYMBOL" or "SYMBOL + OFFSET").  */
479 #define HAVE_32BIT_SYMBOLS \
480   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
481 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
482
483 /* Addresses are loaded in different ways, depending on the address size
484    in use.  The n32 ABI Documentation also mandates the use of additions
485    with overflow checking, but existing implementations don't follow it.  */
486 #define ADDRESS_ADD_INSN                                                \
487    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
488
489 #define ADDRESS_ADDI_INSN                                               \
490    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
491
492 #define ADDRESS_LOAD_INSN                                               \
493    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
494
495 #define ADDRESS_STORE_INSN                                              \
496    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
497
498 /* Return true if the given CPU supports the MIPS16 ASE.  */
499 #define CPU_HAS_MIPS16(cpu)                                             \
500    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
501     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
502
503 /* Return true if the given CPU supports the microMIPS ASE.  */
504 #define CPU_HAS_MICROMIPS(cpu)  0
505
506 /* True if CPU has a dror instruction.  */
507 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
508
509 /* True if CPU has a ror instruction.  */
510 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
511
512 /* True if CPU is in the Octeon family */
513 #define CPU_IS_OCTEON(CPU) ((CPU) == CPU_OCTEON || (CPU) == CPU_OCTEONP \
514                             || (CPU) == CPU_OCTEON2 || (CPU) == CPU_OCTEON3)
515
516 /* True if CPU has seq/sne and seqi/snei instructions.  */
517 #define CPU_HAS_SEQ(CPU)        (CPU_IS_OCTEON (CPU))
518
519 /* True, if CPU has support for ldc1 and sdc1. */
520 #define CPU_HAS_LDC1_SDC1(CPU)  \
521    ((mips_opts.isa != ISA_MIPS1) && ((CPU) != CPU_R5900))
522
523 /* True if mflo and mfhi can be immediately followed by instructions
524    which write to the HI and LO registers.
525
526    According to MIPS specifications, MIPS ISAs I, II, and III need
527    (at least) two instructions between the reads of HI/LO and
528    instructions which write them, and later ISAs do not.  Contradicting
529    the MIPS specifications, some MIPS IV processor user manuals (e.g.
530    the UM for the NEC Vr5000) document needing the instructions between
531    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
532    MIPS64 and later ISAs to have the interlocks, plus any specific
533    earlier-ISA CPUs for which CPU documentation declares that the
534    instructions are really interlocked.  */
535 #define hilo_interlocks \
536   (mips_opts.isa == ISA_MIPS32                        \
537    || mips_opts.isa == ISA_MIPS32R2                   \
538    || mips_opts.isa == ISA_MIPS32R3                   \
539    || mips_opts.isa == ISA_MIPS32R5                   \
540    || mips_opts.isa == ISA_MIPS32R6                   \
541    || mips_opts.isa == ISA_MIPS64                     \
542    || mips_opts.isa == ISA_MIPS64R2                   \
543    || mips_opts.isa == ISA_MIPS64R3                   \
544    || mips_opts.isa == ISA_MIPS64R5                   \
545    || mips_opts.isa == ISA_MIPS64R6                   \
546    || mips_opts.arch == CPU_R4010                     \
547    || mips_opts.arch == CPU_R5900                     \
548    || mips_opts.arch == CPU_R10000                    \
549    || mips_opts.arch == CPU_R12000                    \
550    || mips_opts.arch == CPU_R14000                    \
551    || mips_opts.arch == CPU_R16000                    \
552    || mips_opts.arch == CPU_RM7000                    \
553    || mips_opts.arch == CPU_VR5500                    \
554    || mips_opts.micromips                             \
555    )
556
557 /* Whether the processor uses hardware interlocks to protect reads
558    from the GPRs after they are loaded from memory, and thus does not
559    require nops to be inserted.  This applies to instructions marked
560    INSN_LOAD_MEMORY.  These nops are only required at MIPS ISA
561    level I and microMIPS mode instructions are always interlocked.  */
562 #define gpr_interlocks                                \
563   (mips_opts.isa != ISA_MIPS1                         \
564    || mips_opts.arch == CPU_R3900                     \
565    || mips_opts.arch == CPU_R5900                     \
566    || mips_opts.micromips                             \
567    )
568
569 /* Whether the processor uses hardware interlocks to avoid delays
570    required by coprocessor instructions, and thus does not require
571    nops to be inserted.  This applies to instructions marked
572    INSN_LOAD_COPROC, INSN_COPROC_MOVE, and to delays between
573    instructions marked INSN_WRITE_COND_CODE and ones marked
574    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
575    levels I, II, and III and microMIPS mode instructions are always
576    interlocked.  */
577 /* Itbl support may require additional care here.  */
578 #define cop_interlocks                                \
579   ((mips_opts.isa != ISA_MIPS1                        \
580     && mips_opts.isa != ISA_MIPS2                     \
581     && mips_opts.isa != ISA_MIPS3)                    \
582    || mips_opts.arch == CPU_R4300                     \
583    || mips_opts.micromips                             \
584    )
585
586 /* Whether the processor uses hardware interlocks to protect reads
587    from coprocessor registers after they are loaded from memory, and
588    thus does not require nops to be inserted.  This applies to
589    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
590    requires at MIPS ISA level I and microMIPS mode instructions are
591    always interlocked.  */
592 #define cop_mem_interlocks                            \
593   (mips_opts.isa != ISA_MIPS1                         \
594    || mips_opts.micromips                             \
595    )
596
597 /* Is this a mfhi or mflo instruction?  */
598 #define MF_HILO_INSN(PINFO) \
599   ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
600
601 /* Whether code compression (either of the MIPS16 or the microMIPS ASEs)
602    has been selected.  This implies, in particular, that addresses of text
603    labels have their LSB set.  */
604 #define HAVE_CODE_COMPRESSION                                           \
605   ((mips_opts.mips16 | mips_opts.micromips) != 0)
606
607 /* The minimum and maximum signed values that can be stored in a GPR.  */
608 #define GPR_SMAX ((offsetT) (((valueT) 1 << (GPR_SIZE - 1)) - 1))
609 #define GPR_SMIN (-GPR_SMAX - 1)
610
611 /* MIPS PIC level.  */
612
613 enum mips_pic_level mips_pic;
614
615 /* 1 if we should generate 32 bit offsets from the $gp register in
616    SVR4_PIC mode.  Currently has no meaning in other modes.  */
617 static int mips_big_got = 0;
618
619 /* 1 if trap instructions should used for overflow rather than break
620    instructions.  */
621 static int mips_trap = 0;
622
623 /* 1 if double width floating point constants should not be constructed
624    by assembling two single width halves into two single width floating
625    point registers which just happen to alias the double width destination
626    register.  On some architectures this aliasing can be disabled by a bit
627    in the status register, and the setting of this bit cannot be determined
628    automatically at assemble time.  */
629 static int mips_disable_float_construction;
630
631 /* Non-zero if any .set noreorder directives were used.  */
632
633 static int mips_any_noreorder;
634
635 /* Non-zero if nops should be inserted when the register referenced in
636    an mfhi/mflo instruction is read in the next two instructions.  */
637 static int mips_7000_hilo_fix;
638
639 /* The size of objects in the small data section.  */
640 static unsigned int g_switch_value = 8;
641 /* Whether the -G option was used.  */
642 static int g_switch_seen = 0;
643
644 #define N_RMASK 0xc4
645 #define N_VFP   0xd4
646
647 /* If we can determine in advance that GP optimization won't be
648    possible, we can skip the relaxation stuff that tries to produce
649    GP-relative references.  This makes delay slot optimization work
650    better.
651
652    This function can only provide a guess, but it seems to work for
653    gcc output.  It needs to guess right for gcc, otherwise gcc
654    will put what it thinks is a GP-relative instruction in a branch
655    delay slot.
656
657    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
658    fixed it for the non-PIC mode.  KR 95/04/07  */
659 static int nopic_need_relax (symbolS *, int);
660
661 /* handle of the OPCODE hash table */
662 static struct hash_control *op_hash = NULL;
663
664 /* The opcode hash table we use for the mips16.  */
665 static struct hash_control *mips16_op_hash = NULL;
666
667 /* The opcode hash table we use for the microMIPS ASE.  */
668 static struct hash_control *micromips_op_hash = NULL;
669
670 /* This array holds the chars that always start a comment.  If the
671     pre-processor is disabled, these aren't very useful */
672 const char comment_chars[] = "#";
673
674 /* This array holds the chars that only start a comment at the beginning of
675    a line.  If the line seems to have the form '# 123 filename'
676    .line and .file directives will appear in the pre-processed output */
677 /* Note that input_file.c hand checks for '#' at the beginning of the
678    first line of the input file.  This is because the compiler outputs
679    #NO_APP at the beginning of its output.  */
680 /* Also note that C style comments are always supported.  */
681 const char line_comment_chars[] = "#";
682
683 /* This array holds machine specific line separator characters.  */
684 const char line_separator_chars[] = ";";
685
686 /* Chars that can be used to separate mant from exp in floating point nums */
687 const char EXP_CHARS[] = "eE";
688
689 /* Chars that mean this number is a floating point constant */
690 /* As in 0f12.456 */
691 /* or    0d1.2345e12 */
692 const char FLT_CHARS[] = "rRsSfFdDxXpP";
693
694 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
695    changed in read.c .  Ideally it shouldn't have to know about it at all,
696    but nothing is ideal around here.
697  */
698
699 /* Types of printf format used for instruction-related error messages.
700    "I" means int ("%d") and "S" means string ("%s"). */
701 enum mips_insn_error_format {
702   ERR_FMT_PLAIN,
703   ERR_FMT_I,
704   ERR_FMT_SS,
705 };
706
707 /* Information about an error that was found while assembling the current
708    instruction.  */
709 struct mips_insn_error {
710   /* We sometimes need to match an instruction against more than one
711      opcode table entry.  Errors found during this matching are reported
712      against a particular syntactic argument rather than against the
713      instruction as a whole.  We grade these messages so that errors
714      against argument N have a greater priority than an error against
715      any argument < N, since the former implies that arguments up to N
716      were acceptable and that the opcode entry was therefore a closer match.
717      If several matches report an error against the same argument,
718      we only use that error if it is the same in all cases.
719
720      min_argnum is the minimum argument number for which an error message
721      should be accepted.  It is 0 if MSG is against the instruction as
722      a whole.  */
723   int min_argnum;
724
725   /* The printf()-style message, including its format and arguments.  */
726   enum mips_insn_error_format format;
727   const char *msg;
728   union {
729     int i;
730     const char *ss[2];
731   } u;
732 };
733
734 /* The error that should be reported for the current instruction.  */
735 static struct mips_insn_error insn_error;
736
737 static int auto_align = 1;
738
739 /* When outputting SVR4 PIC code, the assembler needs to know the
740    offset in the stack frame from which to restore the $gp register.
741    This is set by the .cprestore pseudo-op, and saved in this
742    variable.  */
743 static offsetT mips_cprestore_offset = -1;
744
745 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
746    more optimizations, it can use a register value instead of a memory-saved
747    offset and even an other register than $gp as global pointer.  */
748 static offsetT mips_cpreturn_offset = -1;
749 static int mips_cpreturn_register = -1;
750 static int mips_gp_register = GP;
751 static int mips_gprel_offset = 0;
752
753 /* Whether mips_cprestore_offset has been set in the current function
754    (or whether it has already been warned about, if not).  */
755 static int mips_cprestore_valid = 0;
756
757 /* This is the register which holds the stack frame, as set by the
758    .frame pseudo-op.  This is needed to implement .cprestore.  */
759 static int mips_frame_reg = SP;
760
761 /* Whether mips_frame_reg has been set in the current function
762    (or whether it has already been warned about, if not).  */
763 static int mips_frame_reg_valid = 0;
764
765 /* To output NOP instructions correctly, we need to keep information
766    about the previous two instructions.  */
767
768 /* Whether we are optimizing.  The default value of 2 means to remove
769    unneeded NOPs and swap branch instructions when possible.  A value
770    of 1 means to not swap branches.  A value of 0 means to always
771    insert NOPs.  */
772 static int mips_optimize = 2;
773
774 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
775    equivalent to seeing no -g option at all.  */
776 static int mips_debug = 0;
777
778 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
779 #define MAX_VR4130_NOPS 4
780
781 /* The maximum number of NOPs needed to fill delay slots.  */
782 #define MAX_DELAY_NOPS 2
783
784 /* The maximum number of NOPs needed for any purpose.  */
785 #define MAX_NOPS 4
786
787 /* A list of previous instructions, with index 0 being the most recent.
788    We need to look back MAX_NOPS instructions when filling delay slots
789    or working around processor errata.  We need to look back one
790    instruction further if we're thinking about using history[0] to
791    fill a branch delay slot.  */
792 static struct mips_cl_insn history[1 + MAX_NOPS];
793
794 /* Arrays of operands for each instruction.  */
795 #define MAX_OPERANDS 6
796 struct mips_operand_array {
797   const struct mips_operand *operand[MAX_OPERANDS];
798 };
799 static struct mips_operand_array *mips_operands;
800 static struct mips_operand_array *mips16_operands;
801 static struct mips_operand_array *micromips_operands;
802
803 /* Nop instructions used by emit_nop.  */
804 static struct mips_cl_insn nop_insn;
805 static struct mips_cl_insn mips16_nop_insn;
806 static struct mips_cl_insn micromips_nop16_insn;
807 static struct mips_cl_insn micromips_nop32_insn;
808
809 /* The appropriate nop for the current mode.  */
810 #define NOP_INSN (mips_opts.mips16                                      \
811                   ? &mips16_nop_insn                                    \
812                   : (mips_opts.micromips                                \
813                      ? (mips_opts.insn32                                \
814                         ? &micromips_nop32_insn                         \
815                         : &micromips_nop16_insn)                        \
816                      : &nop_insn))
817
818 /* The size of NOP_INSN in bytes.  */
819 #define NOP_INSN_SIZE ((mips_opts.mips16                                \
820                         || (mips_opts.micromips && !mips_opts.insn32))  \
821                        ? 2 : 4)
822
823 /* If this is set, it points to a frag holding nop instructions which
824    were inserted before the start of a noreorder section.  If those
825    nops turn out to be unnecessary, the size of the frag can be
826    decreased.  */
827 static fragS *prev_nop_frag;
828
829 /* The number of nop instructions we created in prev_nop_frag.  */
830 static int prev_nop_frag_holds;
831
832 /* The number of nop instructions that we know we need in
833    prev_nop_frag.  */
834 static int prev_nop_frag_required;
835
836 /* The number of instructions we've seen since prev_nop_frag.  */
837 static int prev_nop_frag_since;
838
839 /* Relocations against symbols are sometimes done in two parts, with a HI
840    relocation and a LO relocation.  Each relocation has only 16 bits of
841    space to store an addend.  This means that in order for the linker to
842    handle carries correctly, it must be able to locate both the HI and
843    the LO relocation.  This means that the relocations must appear in
844    order in the relocation table.
845
846    In order to implement this, we keep track of each unmatched HI
847    relocation.  We then sort them so that they immediately precede the
848    corresponding LO relocation.  */
849
850 struct mips_hi_fixup
851 {
852   /* Next HI fixup.  */
853   struct mips_hi_fixup *next;
854   /* This fixup.  */
855   fixS *fixp;
856   /* The section this fixup is in.  */
857   segT seg;
858 };
859
860 /* The list of unmatched HI relocs.  */
861
862 static struct mips_hi_fixup *mips_hi_fixup_list;
863
864 /* The frag containing the last explicit relocation operator.
865    Null if explicit relocations have not been used.  */
866
867 static fragS *prev_reloc_op_frag;
868
869 /* Map mips16 register numbers to normal MIPS register numbers.  */
870
871 static const unsigned int mips16_to_32_reg_map[] =
872 {
873   16, 17, 2, 3, 4, 5, 6, 7
874 };
875
876 /* Map microMIPS register numbers to normal MIPS register numbers.  */
877
878 #define micromips_to_32_reg_d_map       mips16_to_32_reg_map
879
880 /* The microMIPS registers with type h.  */
881 static const unsigned int micromips_to_32_reg_h_map1[] =
882 {
883   5, 5, 6, 4, 4, 4, 4, 4
884 };
885 static const unsigned int micromips_to_32_reg_h_map2[] =
886 {
887   6, 7, 7, 21, 22, 5, 6, 7
888 };
889
890 /* The microMIPS registers with type m.  */
891 static const unsigned int micromips_to_32_reg_m_map[] =
892 {
893   0, 17, 2, 3, 16, 18, 19, 20
894 };
895
896 #define micromips_to_32_reg_n_map      micromips_to_32_reg_m_map
897
898 /* Classifies the kind of instructions we're interested in when
899    implementing -mfix-vr4120.  */
900 enum fix_vr4120_class
901 {
902   FIX_VR4120_MACC,
903   FIX_VR4120_DMACC,
904   FIX_VR4120_MULT,
905   FIX_VR4120_DMULT,
906   FIX_VR4120_DIV,
907   FIX_VR4120_MTHILO,
908   NUM_FIX_VR4120_CLASSES
909 };
910
911 /* ...likewise -mfix-loongson2f-jump.  */
912 static bfd_boolean mips_fix_loongson2f_jump;
913
914 /* ...likewise -mfix-loongson2f-nop.  */
915 static bfd_boolean mips_fix_loongson2f_nop;
916
917 /* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed.  */
918 static bfd_boolean mips_fix_loongson2f;
919
920 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
921    there must be at least one other instruction between an instruction
922    of type X and an instruction of type Y.  */
923 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
924
925 /* True if -mfix-vr4120 is in force.  */
926 static int mips_fix_vr4120;
927
928 /* ...likewise -mfix-vr4130.  */
929 static int mips_fix_vr4130;
930
931 /* ...likewise -mfix-24k.  */
932 static int mips_fix_24k;
933
934 /* ...likewise -mfix-rm7000  */
935 static int mips_fix_rm7000;
936
937 /* ...likewise -mfix-cn63xxp1 */
938 static bfd_boolean mips_fix_cn63xxp1;
939
940 /* We don't relax branches by default, since this causes us to expand
941    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
942    fail to compute the offset before expanding the macro to the most
943    efficient expansion.  */
944
945 static int mips_relax_branch;
946
947 /* TRUE if checks are suppressed for invalid branches between ISA modes.
948    Needed for broken assembly produced by some GCC versions and some
949    sloppy code out there, where branches to data labels are present.  */
950 static bfd_boolean mips_ignore_branch_isa;
951 \f
952 /* The expansion of many macros depends on the type of symbol that
953    they refer to.  For example, when generating position-dependent code,
954    a macro that refers to a symbol may have two different expansions,
955    one which uses GP-relative addresses and one which uses absolute
956    addresses.  When generating SVR4-style PIC, a macro may have
957    different expansions for local and global symbols.
958
959    We handle these situations by generating both sequences and putting
960    them in variant frags.  In position-dependent code, the first sequence
961    will be the GP-relative one and the second sequence will be the
962    absolute one.  In SVR4 PIC, the first sequence will be for global
963    symbols and the second will be for local symbols.
964
965    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
966    SECOND are the lengths of the two sequences in bytes.  These fields
967    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
968    the subtype has the following flags:
969
970    RELAX_USE_SECOND
971         Set if it has been decided that we should use the second
972         sequence instead of the first.
973
974    RELAX_SECOND_LONGER
975         Set in the first variant frag if the macro's second implementation
976         is longer than its first.  This refers to the macro as a whole,
977         not an individual relaxation.
978
979    RELAX_NOMACRO
980         Set in the first variant frag if the macro appeared in a .set nomacro
981         block and if one alternative requires a warning but the other does not.
982
983    RELAX_DELAY_SLOT
984         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
985         delay slot.
986
987    RELAX_DELAY_SLOT_16BIT
988         Like RELAX_DELAY_SLOT, but indicates that the delay slot requires a
989         16-bit instruction.
990
991    RELAX_DELAY_SLOT_SIZE_FIRST
992         Like RELAX_DELAY_SLOT, but indicates that the first implementation of
993         the macro is of the wrong size for the branch delay slot.
994
995    RELAX_DELAY_SLOT_SIZE_SECOND
996         Like RELAX_DELAY_SLOT, but indicates that the second implementation of
997         the macro is of the wrong size for the branch delay slot.
998
999    The frag's "opcode" points to the first fixup for relaxable code.
1000
1001    Relaxable macros are generated using a sequence such as:
1002
1003       relax_start (SYMBOL);
1004       ... generate first expansion ...
1005       relax_switch ();
1006       ... generate second expansion ...
1007       relax_end ();
1008
1009    The code and fixups for the unwanted alternative are discarded
1010    by md_convert_frag.  */
1011 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
1012
1013 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
1014 #define RELAX_SECOND(X) ((X) & 0xff)
1015 #define RELAX_USE_SECOND 0x10000
1016 #define RELAX_SECOND_LONGER 0x20000
1017 #define RELAX_NOMACRO 0x40000
1018 #define RELAX_DELAY_SLOT 0x80000
1019 #define RELAX_DELAY_SLOT_16BIT 0x100000
1020 #define RELAX_DELAY_SLOT_SIZE_FIRST 0x200000
1021 #define RELAX_DELAY_SLOT_SIZE_SECOND 0x400000
1022
1023 /* Branch without likely bit.  If label is out of range, we turn:
1024
1025         beq reg1, reg2, label
1026         delay slot
1027
1028    into
1029
1030         bne reg1, reg2, 0f
1031         nop
1032         j label
1033      0: delay slot
1034
1035    with the following opcode replacements:
1036
1037         beq <-> bne
1038         blez <-> bgtz
1039         bltz <-> bgez
1040         bc1f <-> bc1t
1041
1042         bltzal <-> bgezal  (with jal label instead of j label)
1043
1044    Even though keeping the delay slot instruction in the delay slot of
1045    the branch would be more efficient, it would be very tricky to do
1046    correctly, because we'd have to introduce a variable frag *after*
1047    the delay slot instruction, and expand that instead.  Let's do it
1048    the easy way for now, even if the branch-not-taken case now costs
1049    one additional instruction.  Out-of-range branches are not supposed
1050    to be common, anyway.
1051
1052    Branch likely.  If label is out of range, we turn:
1053
1054         beql reg1, reg2, label
1055         delay slot (annulled if branch not taken)
1056
1057    into
1058
1059         beql reg1, reg2, 1f
1060         nop
1061         beql $0, $0, 2f
1062         nop
1063      1: j[al] label
1064         delay slot (executed only if branch taken)
1065      2:
1066
1067    It would be possible to generate a shorter sequence by losing the
1068    likely bit, generating something like:
1069
1070         bne reg1, reg2, 0f
1071         nop
1072         j[al] label
1073         delay slot (executed only if branch taken)
1074      0:
1075
1076         beql -> bne
1077         bnel -> beq
1078         blezl -> bgtz
1079         bgtzl -> blez
1080         bltzl -> bgez
1081         bgezl -> bltz
1082         bc1fl -> bc1t
1083         bc1tl -> bc1f
1084
1085         bltzall -> bgezal  (with jal label instead of j label)
1086         bgezall -> bltzal  (ditto)
1087
1088
1089    but it's not clear that it would actually improve performance.  */
1090 #define RELAX_BRANCH_ENCODE(at, uncond, likely, link, toofar)   \
1091   ((relax_substateT)                                            \
1092    (0xc0000000                                                  \
1093     | ((at) & 0x1f)                                             \
1094     | ((toofar) ? 0x20 : 0)                                     \
1095     | ((link) ? 0x40 : 0)                                       \
1096     | ((likely) ? 0x80 : 0)                                     \
1097     | ((uncond) ? 0x100 : 0)))
1098 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
1099 #define RELAX_BRANCH_UNCOND(i) (((i) & 0x100) != 0)
1100 #define RELAX_BRANCH_LIKELY(i) (((i) & 0x80) != 0)
1101 #define RELAX_BRANCH_LINK(i) (((i) & 0x40) != 0)
1102 #define RELAX_BRANCH_TOOFAR(i) (((i) & 0x20) != 0)
1103 #define RELAX_BRANCH_AT(i) ((i) & 0x1f)
1104
1105 /* For mips16 code, we use an entirely different form of relaxation.
1106    mips16 supports two versions of most instructions which take
1107    immediate values: a small one which takes some small value, and a
1108    larger one which takes a 16 bit value.  Since branches also follow
1109    this pattern, relaxing these values is required.
1110
1111    We can assemble both mips16 and normal MIPS code in a single
1112    object.  Therefore, we need to support this type of relaxation at
1113    the same time that we support the relaxation described above.  We
1114    use the high bit of the subtype field to distinguish these cases.
1115
1116    The information we store for this type of relaxation is the
1117    argument code found in the opcode file for this relocation, whether
1118    the user explicitly requested a small or extended form, and whether
1119    the relocation is in a jump or jal delay slot.  That tells us the
1120    size of the value, and how it should be stored.  We also store
1121    whether the fragment is considered to be extended or not.  We also
1122    store whether this is known to be a branch to a different section,
1123    whether we have tried to relax this frag yet, and whether we have
1124    ever extended a PC relative fragment because of a shift count.  */
1125 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
1126   (0x80000000                                                   \
1127    | ((type) & 0xff)                                            \
1128    | ((small) ? 0x100 : 0)                                      \
1129    | ((ext) ? 0x200 : 0)                                        \
1130    | ((dslot) ? 0x400 : 0)                                      \
1131    | ((jal_dslot) ? 0x800 : 0))
1132 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
1133 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
1134 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
1135 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
1136 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
1137 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
1138 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
1139 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
1140 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
1141 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
1142 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
1143 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
1144
1145 /* For microMIPS code, we use relaxation similar to one we use for
1146    MIPS16 code.  Some instructions that take immediate values support
1147    two encodings: a small one which takes some small value, and a
1148    larger one which takes a 16 bit value.  As some branches also follow
1149    this pattern, relaxing these values is required.
1150
1151    We can assemble both microMIPS and normal MIPS code in a single
1152    object.  Therefore, we need to support this type of relaxation at
1153    the same time that we support the relaxation described above.  We
1154    use one of the high bits of the subtype field to distinguish these
1155    cases.
1156
1157    The information we store for this type of relaxation is the argument
1158    code found in the opcode file for this relocation, the register
1159    selected as the assembler temporary, whether in the 32-bit
1160    instruction mode, whether the branch is unconditional, whether it is
1161    compact, whether there is no delay-slot instruction available to fill
1162    in, whether it stores the link address implicitly in $ra, whether
1163    relaxation of out-of-range 32-bit branches to a sequence of
1164    instructions is enabled, and whether the displacement of a branch is
1165    too large to fit as an immediate argument of a 16-bit and a 32-bit
1166    branch, respectively.  */
1167 #define RELAX_MICROMIPS_ENCODE(type, at, insn32,                \
1168                                uncond, compact, link, nods,     \
1169                                relax32, toofar16, toofar32)     \
1170   (0x40000000                                                   \
1171    | ((type) & 0xff)                                            \
1172    | (((at) & 0x1f) << 8)                                       \
1173    | ((insn32) ? 0x2000 : 0)                                    \
1174    | ((uncond) ? 0x4000 : 0)                                    \
1175    | ((compact) ? 0x8000 : 0)                                   \
1176    | ((link) ? 0x10000 : 0)                                     \
1177    | ((nods) ? 0x20000 : 0)                                     \
1178    | ((relax32) ? 0x40000 : 0)                                  \
1179    | ((toofar16) ? 0x80000 : 0)                                 \
1180    | ((toofar32) ? 0x100000 : 0))
1181 #define RELAX_MICROMIPS_P(i) (((i) & 0xc0000000) == 0x40000000)
1182 #define RELAX_MICROMIPS_TYPE(i) ((i) & 0xff)
1183 #define RELAX_MICROMIPS_AT(i) (((i) >> 8) & 0x1f)
1184 #define RELAX_MICROMIPS_INSN32(i) (((i) & 0x2000) != 0)
1185 #define RELAX_MICROMIPS_UNCOND(i) (((i) & 0x4000) != 0)
1186 #define RELAX_MICROMIPS_COMPACT(i) (((i) & 0x8000) != 0)
1187 #define RELAX_MICROMIPS_LINK(i) (((i) & 0x10000) != 0)
1188 #define RELAX_MICROMIPS_NODS(i) (((i) & 0x20000) != 0)
1189 #define RELAX_MICROMIPS_RELAX32(i) (((i) & 0x40000) != 0)
1190
1191 #define RELAX_MICROMIPS_TOOFAR16(i) (((i) & 0x80000) != 0)
1192 #define RELAX_MICROMIPS_MARK_TOOFAR16(i) ((i) | 0x80000)
1193 #define RELAX_MICROMIPS_CLEAR_TOOFAR16(i) ((i) & ~0x80000)
1194 #define RELAX_MICROMIPS_TOOFAR32(i) (((i) & 0x100000) != 0)
1195 #define RELAX_MICROMIPS_MARK_TOOFAR32(i) ((i) | 0x100000)
1196 #define RELAX_MICROMIPS_CLEAR_TOOFAR32(i) ((i) & ~0x100000)
1197
1198 /* Sign-extend 16-bit value X.  */
1199 #define SEXT_16BIT(X) ((((X) + 0x8000) & 0xffff) - 0x8000)
1200
1201 /* Is the given value a sign-extended 32-bit value?  */
1202 #define IS_SEXT_32BIT_NUM(x)                                            \
1203   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
1204    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
1205
1206 /* Is the given value a sign-extended 16-bit value?  */
1207 #define IS_SEXT_16BIT_NUM(x)                                            \
1208   (((x) &~ (offsetT) 0x7fff) == 0                                       \
1209    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
1210
1211 /* Is the given value a sign-extended 12-bit value?  */
1212 #define IS_SEXT_12BIT_NUM(x)                                            \
1213   (((((x) & 0xfff) ^ 0x800LL) - 0x800LL) == (x))
1214
1215 /* Is the given value a sign-extended 9-bit value?  */
1216 #define IS_SEXT_9BIT_NUM(x)                                             \
1217   (((((x) & 0x1ff) ^ 0x100LL) - 0x100LL) == (x))
1218
1219 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
1220 #define IS_ZEXT_32BIT_NUM(x)                                            \
1221   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
1222    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
1223
1224 /* Extract bits MASK << SHIFT from STRUCT and shift them right
1225    SHIFT places.  */
1226 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
1227   (((STRUCT) >> (SHIFT)) & (MASK))
1228
1229 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
1230 #define EXTRACT_OPERAND(MICROMIPS, FIELD, INSN) \
1231   (!(MICROMIPS) \
1232    ? EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD) \
1233    : EXTRACT_BITS ((INSN).insn_opcode, \
1234                    MICROMIPSOP_MASK_##FIELD, MICROMIPSOP_SH_##FIELD))
1235 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1236   EXTRACT_BITS ((INSN).insn_opcode, \
1237                 MIPS16OP_MASK_##FIELD, \
1238                 MIPS16OP_SH_##FIELD)
1239
1240 /* The MIPS16 EXTEND opcode, shifted left 16 places.  */
1241 #define MIPS16_EXTEND (0xf000U << 16)
1242 \f
1243 /* Whether or not we are emitting a branch-likely macro.  */
1244 static bfd_boolean emit_branch_likely_macro = FALSE;
1245
1246 /* Global variables used when generating relaxable macros.  See the
1247    comment above RELAX_ENCODE for more details about how relaxation
1248    is used.  */
1249 static struct {
1250   /* 0 if we're not emitting a relaxable macro.
1251      1 if we're emitting the first of the two relaxation alternatives.
1252      2 if we're emitting the second alternative.  */
1253   int sequence;
1254
1255   /* The first relaxable fixup in the current frag.  (In other words,
1256      the first fixup that refers to relaxable code.)  */
1257   fixS *first_fixup;
1258
1259   /* sizes[0] says how many bytes of the first alternative are stored in
1260      the current frag.  Likewise sizes[1] for the second alternative.  */
1261   unsigned int sizes[2];
1262
1263   /* The symbol on which the choice of sequence depends.  */
1264   symbolS *symbol;
1265 } mips_relax;
1266 \f
1267 /* Global variables used to decide whether a macro needs a warning.  */
1268 static struct {
1269   /* True if the macro is in a branch delay slot.  */
1270   bfd_boolean delay_slot_p;
1271
1272   /* Set to the length in bytes required if the macro is in a delay slot
1273      that requires a specific length of instruction, otherwise zero.  */
1274   unsigned int delay_slot_length;
1275
1276   /* For relaxable macros, sizes[0] is the length of the first alternative
1277      in bytes and sizes[1] is the length of the second alternative.
1278      For non-relaxable macros, both elements give the length of the
1279      macro in bytes.  */
1280   unsigned int sizes[2];
1281
1282   /* For relaxable macros, first_insn_sizes[0] is the length of the first
1283      instruction of the first alternative in bytes and first_insn_sizes[1]
1284      is the length of the first instruction of the second alternative.
1285      For non-relaxable macros, both elements give the length of the first
1286      instruction in bytes.
1287
1288      Set to zero if we haven't yet seen the first instruction.  */
1289   unsigned int first_insn_sizes[2];
1290
1291   /* For relaxable macros, insns[0] is the number of instructions for the
1292      first alternative and insns[1] is the number of instructions for the
1293      second alternative.
1294
1295      For non-relaxable macros, both elements give the number of
1296      instructions for the macro.  */
1297   unsigned int insns[2];
1298
1299   /* The first variant frag for this macro.  */
1300   fragS *first_frag;
1301 } mips_macro_warning;
1302 \f
1303 /* Prototypes for static functions.  */
1304
1305 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1306
1307 static void append_insn
1308   (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *,
1309    bfd_boolean expansionp);
1310 static void mips_no_prev_insn (void);
1311 static void macro_build (expressionS *, const char *, const char *, ...);
1312 static void mips16_macro_build
1313   (expressionS *, const char *, const char *, va_list *);
1314 static void load_register (int, expressionS *, int);
1315 static void macro_start (void);
1316 static void macro_end (void);
1317 static void macro (struct mips_cl_insn *ip, char *str);
1318 static void mips16_macro (struct mips_cl_insn * ip);
1319 static void mips_ip (char *str, struct mips_cl_insn * ip);
1320 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1321 static void mips16_immed
1322   (const char *, unsigned int, int, bfd_reloc_code_real_type, offsetT,
1323    unsigned int, unsigned long *);
1324 static size_t my_getSmallExpression
1325   (expressionS *, bfd_reloc_code_real_type *, char *);
1326 static void my_getExpression (expressionS *, char *);
1327 static void s_align (int);
1328 static void s_change_sec (int);
1329 static void s_change_section (int);
1330 static void s_cons (int);
1331 static void s_float_cons (int);
1332 static void s_mips_globl (int);
1333 static void s_option (int);
1334 static void s_mipsset (int);
1335 static void s_abicalls (int);
1336 static void s_cpload (int);
1337 static void s_cpsetup (int);
1338 static void s_cplocal (int);
1339 static void s_cprestore (int);
1340 static void s_cpreturn (int);
1341 static void s_dtprelword (int);
1342 static void s_dtpreldword (int);
1343 static void s_tprelword (int);
1344 static void s_tpreldword (int);
1345 static void s_gpvalue (int);
1346 static void s_gpword (int);
1347 static void s_gpdword (int);
1348 static void s_ehword (int);
1349 static void s_cpadd (int);
1350 static void s_insn (int);
1351 static void s_nan (int);
1352 static void s_module (int);
1353 static void s_mips_ent (int);
1354 static void s_mips_end (int);
1355 static void s_mips_frame (int);
1356 static void s_mips_mask (int reg_type);
1357 static void s_mips_stab (int);
1358 static void s_mips_weakext (int);
1359 static void s_mips_file (int);
1360 static void s_mips_loc (int);
1361 static bfd_boolean pic_need_relax (symbolS *);
1362 static int relaxed_branch_length (fragS *, asection *, int);
1363 static int relaxed_micromips_16bit_branch_length (fragS *, asection *, int);
1364 static int relaxed_micromips_32bit_branch_length (fragS *, asection *, int);
1365 static void file_mips_check_options (void);
1366
1367 /* Table and functions used to map between CPU/ISA names, and
1368    ISA levels, and CPU numbers.  */
1369
1370 struct mips_cpu_info
1371 {
1372   const char *name;           /* CPU or ISA name.  */
1373   int flags;                  /* MIPS_CPU_* flags.  */
1374   int ase;                    /* Set of ASEs implemented by the CPU.  */
1375   int isa;                    /* ISA level.  */
1376   int cpu;                    /* CPU number (default CPU if ISA).  */
1377 };
1378
1379 #define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1380
1381 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1382 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1383 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1384 \f
1385 /* Command-line options.  */
1386 const char *md_shortopts = "O::g::G:";
1387
1388 enum options
1389   {
1390     OPTION_MARCH = OPTION_MD_BASE,
1391     OPTION_MTUNE,
1392     OPTION_MIPS1,
1393     OPTION_MIPS2,
1394     OPTION_MIPS3,
1395     OPTION_MIPS4,
1396     OPTION_MIPS5,
1397     OPTION_MIPS32,
1398     OPTION_MIPS64,
1399     OPTION_MIPS32R2,
1400     OPTION_MIPS32R3,
1401     OPTION_MIPS32R5,
1402     OPTION_MIPS32R6,
1403     OPTION_MIPS64R2,
1404     OPTION_MIPS64R3,
1405     OPTION_MIPS64R5,
1406     OPTION_MIPS64R6,
1407     OPTION_MIPS16,
1408     OPTION_NO_MIPS16,
1409     OPTION_MIPS3D,
1410     OPTION_NO_MIPS3D,
1411     OPTION_MDMX,
1412     OPTION_NO_MDMX,
1413     OPTION_DSP,
1414     OPTION_NO_DSP,
1415     OPTION_MT,
1416     OPTION_NO_MT,
1417     OPTION_VIRT,
1418     OPTION_NO_VIRT,
1419     OPTION_MSA,
1420     OPTION_NO_MSA,
1421     OPTION_SMARTMIPS,
1422     OPTION_NO_SMARTMIPS,
1423     OPTION_DSPR2,
1424     OPTION_NO_DSPR2,
1425     OPTION_DSPR3,
1426     OPTION_NO_DSPR3,
1427     OPTION_EVA,
1428     OPTION_NO_EVA,
1429     OPTION_XPA,
1430     OPTION_NO_XPA,
1431     OPTION_MICROMIPS,
1432     OPTION_NO_MICROMIPS,
1433     OPTION_MCU,
1434     OPTION_NO_MCU,
1435     OPTION_COMPAT_ARCH_BASE,
1436     OPTION_M4650,
1437     OPTION_NO_M4650,
1438     OPTION_M4010,
1439     OPTION_NO_M4010,
1440     OPTION_M4100,
1441     OPTION_NO_M4100,
1442     OPTION_M3900,
1443     OPTION_NO_M3900,
1444     OPTION_M7000_HILO_FIX,
1445     OPTION_MNO_7000_HILO_FIX,
1446     OPTION_FIX_24K,
1447     OPTION_NO_FIX_24K,
1448     OPTION_FIX_RM7000,
1449     OPTION_NO_FIX_RM7000,
1450     OPTION_FIX_LOONGSON2F_JUMP,
1451     OPTION_NO_FIX_LOONGSON2F_JUMP,
1452     OPTION_FIX_LOONGSON2F_NOP,
1453     OPTION_NO_FIX_LOONGSON2F_NOP,
1454     OPTION_FIX_VR4120,
1455     OPTION_NO_FIX_VR4120,
1456     OPTION_FIX_VR4130,
1457     OPTION_NO_FIX_VR4130,
1458     OPTION_FIX_CN63XXP1,
1459     OPTION_NO_FIX_CN63XXP1,
1460     OPTION_TRAP,
1461     OPTION_BREAK,
1462     OPTION_EB,
1463     OPTION_EL,
1464     OPTION_FP32,
1465     OPTION_GP32,
1466     OPTION_CONSTRUCT_FLOATS,
1467     OPTION_NO_CONSTRUCT_FLOATS,
1468     OPTION_FP64,
1469     OPTION_FPXX,
1470     OPTION_GP64,
1471     OPTION_RELAX_BRANCH,
1472     OPTION_NO_RELAX_BRANCH,
1473     OPTION_IGNORE_BRANCH_ISA,
1474     OPTION_NO_IGNORE_BRANCH_ISA,
1475     OPTION_INSN32,
1476     OPTION_NO_INSN32,
1477     OPTION_MSHARED,
1478     OPTION_MNO_SHARED,
1479     OPTION_MSYM32,
1480     OPTION_MNO_SYM32,
1481     OPTION_SOFT_FLOAT,
1482     OPTION_HARD_FLOAT,
1483     OPTION_SINGLE_FLOAT,
1484     OPTION_DOUBLE_FLOAT,
1485     OPTION_32,
1486     OPTION_CALL_SHARED,
1487     OPTION_CALL_NONPIC,
1488     OPTION_NON_SHARED,
1489     OPTION_XGOT,
1490     OPTION_MABI,
1491     OPTION_N32,
1492     OPTION_64,
1493     OPTION_MDEBUG,
1494     OPTION_NO_MDEBUG,
1495     OPTION_PDR,
1496     OPTION_NO_PDR,
1497     OPTION_MVXWORKS_PIC,
1498     OPTION_NAN,
1499     OPTION_ODD_SPREG,
1500     OPTION_NO_ODD_SPREG,
1501     OPTION_END_OF_ENUM
1502   };
1503
1504 struct option md_longopts[] =
1505 {
1506   /* Options which specify architecture.  */
1507   {"march", required_argument, NULL, OPTION_MARCH},
1508   {"mtune", required_argument, NULL, OPTION_MTUNE},
1509   {"mips0", no_argument, NULL, OPTION_MIPS1},
1510   {"mips1", no_argument, NULL, OPTION_MIPS1},
1511   {"mips2", no_argument, NULL, OPTION_MIPS2},
1512   {"mips3", no_argument, NULL, OPTION_MIPS3},
1513   {"mips4", no_argument, NULL, OPTION_MIPS4},
1514   {"mips5", no_argument, NULL, OPTION_MIPS5},
1515   {"mips32", no_argument, NULL, OPTION_MIPS32},
1516   {"mips64", no_argument, NULL, OPTION_MIPS64},
1517   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
1518   {"mips32r3", no_argument, NULL, OPTION_MIPS32R3},
1519   {"mips32r5", no_argument, NULL, OPTION_MIPS32R5},
1520   {"mips32r6", no_argument, NULL, OPTION_MIPS32R6},
1521   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
1522   {"mips64r3", no_argument, NULL, OPTION_MIPS64R3},
1523   {"mips64r5", no_argument, NULL, OPTION_MIPS64R5},
1524   {"mips64r6", no_argument, NULL, OPTION_MIPS64R6},
1525
1526   /* Options which specify Application Specific Extensions (ASEs).  */
1527   {"mips16", no_argument, NULL, OPTION_MIPS16},
1528   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
1529   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
1530   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
1531   {"mdmx", no_argument, NULL, OPTION_MDMX},
1532   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
1533   {"mdsp", no_argument, NULL, OPTION_DSP},
1534   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
1535   {"mmt", no_argument, NULL, OPTION_MT},
1536   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
1537   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
1538   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
1539   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
1540   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
1541   {"mdspr3", no_argument, NULL, OPTION_DSPR3},
1542   {"mno-dspr3", no_argument, NULL, OPTION_NO_DSPR3},
1543   {"meva", no_argument, NULL, OPTION_EVA},
1544   {"mno-eva", no_argument, NULL, OPTION_NO_EVA},
1545   {"mmicromips", no_argument, NULL, OPTION_MICROMIPS},
1546   {"mno-micromips", no_argument, NULL, OPTION_NO_MICROMIPS},
1547   {"mmcu", no_argument, NULL, OPTION_MCU},
1548   {"mno-mcu", no_argument, NULL, OPTION_NO_MCU},
1549   {"mvirt", no_argument, NULL, OPTION_VIRT},
1550   {"mno-virt", no_argument, NULL, OPTION_NO_VIRT},
1551   {"mmsa", no_argument, NULL, OPTION_MSA},
1552   {"mno-msa", no_argument, NULL, OPTION_NO_MSA},
1553   {"mxpa", no_argument, NULL, OPTION_XPA},
1554   {"mno-xpa", no_argument, NULL, OPTION_NO_XPA},
1555
1556   /* Old-style architecture options.  Don't add more of these.  */
1557   {"m4650", no_argument, NULL, OPTION_M4650},
1558   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
1559   {"m4010", no_argument, NULL, OPTION_M4010},
1560   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
1561   {"m4100", no_argument, NULL, OPTION_M4100},
1562   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
1563   {"m3900", no_argument, NULL, OPTION_M3900},
1564   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
1565
1566   /* Options which enable bug fixes.  */
1567   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
1568   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
1569   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
1570   {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
1571   {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
1572   {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
1573   {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
1574   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
1575   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
1576   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
1577   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
1578   {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
1579   {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
1580   {"mfix-rm7000",    no_argument, NULL, OPTION_FIX_RM7000},
1581   {"mno-fix-rm7000", no_argument, NULL, OPTION_NO_FIX_RM7000},
1582   {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
1583   {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
1584
1585   /* Miscellaneous options.  */
1586   {"trap", no_argument, NULL, OPTION_TRAP},
1587   {"no-break", no_argument, NULL, OPTION_TRAP},
1588   {"break", no_argument, NULL, OPTION_BREAK},
1589   {"no-trap", no_argument, NULL, OPTION_BREAK},
1590   {"EB", no_argument, NULL, OPTION_EB},
1591   {"EL", no_argument, NULL, OPTION_EL},
1592   {"mfp32", no_argument, NULL, OPTION_FP32},
1593   {"mgp32", no_argument, NULL, OPTION_GP32},
1594   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
1595   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
1596   {"mfp64", no_argument, NULL, OPTION_FP64},
1597   {"mfpxx", no_argument, NULL, OPTION_FPXX},
1598   {"mgp64", no_argument, NULL, OPTION_GP64},
1599   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
1600   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
1601   {"mignore-branch-isa", no_argument, NULL, OPTION_IGNORE_BRANCH_ISA},
1602   {"mno-ignore-branch-isa", no_argument, NULL, OPTION_NO_IGNORE_BRANCH_ISA},
1603   {"minsn32", no_argument, NULL, OPTION_INSN32},
1604   {"mno-insn32", no_argument, NULL, OPTION_NO_INSN32},
1605   {"mshared", no_argument, NULL, OPTION_MSHARED},
1606   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
1607   {"msym32", no_argument, NULL, OPTION_MSYM32},
1608   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
1609   {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
1610   {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
1611   {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
1612   {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
1613   {"modd-spreg", no_argument, NULL, OPTION_ODD_SPREG},
1614   {"mno-odd-spreg", no_argument, NULL, OPTION_NO_ODD_SPREG},
1615
1616   /* Strictly speaking this next option is ELF specific,
1617      but we allow it for other ports as well in order to
1618      make testing easier.  */
1619   {"32", no_argument, NULL, OPTION_32},
1620
1621   /* ELF-specific options.  */
1622   {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
1623   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
1624   {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
1625   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
1626   {"xgot", no_argument, NULL, OPTION_XGOT},
1627   {"mabi", required_argument, NULL, OPTION_MABI},
1628   {"n32", no_argument, NULL, OPTION_N32},
1629   {"64", no_argument, NULL, OPTION_64},
1630   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
1631   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
1632   {"mpdr", no_argument, NULL, OPTION_PDR},
1633   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
1634   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
1635   {"mnan", required_argument, NULL, OPTION_NAN},
1636
1637   {NULL, no_argument, NULL, 0}
1638 };
1639 size_t md_longopts_size = sizeof (md_longopts);
1640 \f
1641 /* Information about either an Application Specific Extension or an
1642    optional architecture feature that, for simplicity, we treat in the
1643    same way as an ASE.  */
1644 struct mips_ase
1645 {
1646   /* The name of the ASE, used in both the command-line and .set options.  */
1647   const char *name;
1648
1649   /* The associated ASE_* flags.  If the ASE is available on both 32-bit
1650      and 64-bit architectures, the flags here refer to the subset that
1651      is available on both.  */
1652   unsigned int flags;
1653
1654   /* The ASE_* flag used for instructions that are available on 64-bit
1655      architectures but that are not included in FLAGS.  */
1656   unsigned int flags64;
1657
1658   /* The command-line options that turn the ASE on and off.  */
1659   int option_on;
1660   int option_off;
1661
1662   /* The minimum required architecture revisions for MIPS32, MIPS64,
1663      microMIPS32 and microMIPS64, or -1 if the extension isn't supported.  */
1664   int mips32_rev;
1665   int mips64_rev;
1666   int micromips32_rev;
1667   int micromips64_rev;
1668
1669   /* The architecture where the ASE was removed or -1 if the extension has not
1670      been removed.  */
1671   int rem_rev;
1672 };
1673
1674 /* A table of all supported ASEs.  */
1675 static const struct mips_ase mips_ases[] = {
1676   { "dsp", ASE_DSP, ASE_DSP64,
1677     OPTION_DSP, OPTION_NO_DSP,
1678     2, 2, 2, 2,
1679     -1 },
1680
1681   { "dspr2", ASE_DSP | ASE_DSPR2, 0,
1682     OPTION_DSPR2, OPTION_NO_DSPR2,
1683     2, 2, 2, 2,
1684     -1 },
1685
1686   { "dspr3", ASE_DSP | ASE_DSPR2 | ASE_DSPR3, 0,
1687     OPTION_DSPR3, OPTION_NO_DSPR3,
1688     6, 6, -1, -1,
1689     -1 },
1690
1691   { "eva", ASE_EVA, 0,
1692     OPTION_EVA, OPTION_NO_EVA,
1693      2,  2,  2,  2,
1694     -1 },
1695
1696   { "mcu", ASE_MCU, 0,
1697     OPTION_MCU, OPTION_NO_MCU,
1698      2,  2,  2,  2,
1699     -1 },
1700
1701   /* Deprecated in MIPS64r5, but we don't implement that yet.  */
1702   { "mdmx", ASE_MDMX, 0,
1703     OPTION_MDMX, OPTION_NO_MDMX,
1704     -1, 1, -1, -1,
1705      6 },
1706
1707   /* Requires 64-bit FPRs, so the minimum MIPS32 revision is 2.  */
1708   { "mips3d", ASE_MIPS3D, 0,
1709     OPTION_MIPS3D, OPTION_NO_MIPS3D,
1710     2, 1, -1, -1,
1711     6 },
1712
1713   { "mt", ASE_MT, 0,
1714     OPTION_MT, OPTION_NO_MT,
1715      2,  2, -1, -1,
1716     -1 },
1717
1718   { "smartmips", ASE_SMARTMIPS, 0,
1719     OPTION_SMARTMIPS, OPTION_NO_SMARTMIPS,
1720     1, -1, -1, -1,
1721     6 },
1722
1723   { "virt", ASE_VIRT, ASE_VIRT64,
1724     OPTION_VIRT, OPTION_NO_VIRT,
1725      2,  2,  2,  2,
1726     -1 },
1727
1728   { "msa", ASE_MSA, ASE_MSA64,
1729     OPTION_MSA, OPTION_NO_MSA,
1730      2,  2,  2,  2,
1731     -1 },
1732
1733   { "xpa", ASE_XPA, 0,
1734     OPTION_XPA, OPTION_NO_XPA,
1735      2,  2, -1, -1,
1736     -1 },
1737 };
1738
1739 /* The set of ASEs that require -mfp64.  */
1740 #define FP64_ASES (ASE_MIPS3D | ASE_MDMX | ASE_MSA)
1741
1742 /* Groups of ASE_* flags that represent different revisions of an ASE.  */
1743 static const unsigned int mips_ase_groups[] = {
1744   ASE_DSP | ASE_DSPR2 | ASE_DSPR3
1745 };
1746 \f
1747 /* Pseudo-op table.
1748
1749    The following pseudo-ops from the Kane and Heinrich MIPS book
1750    should be defined here, but are currently unsupported: .alias,
1751    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1752
1753    The following pseudo-ops from the Kane and Heinrich MIPS book are
1754    specific to the type of debugging information being generated, and
1755    should be defined by the object format: .aent, .begin, .bend,
1756    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1757    .vreg.
1758
1759    The following pseudo-ops from the Kane and Heinrich MIPS book are
1760    not MIPS CPU specific, but are also not specific to the object file
1761    format.  This file is probably the best place to define them, but
1762    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1763
1764 static const pseudo_typeS mips_pseudo_table[] =
1765 {
1766   /* MIPS specific pseudo-ops.  */
1767   {"option", s_option, 0},
1768   {"set", s_mipsset, 0},
1769   {"rdata", s_change_sec, 'r'},
1770   {"sdata", s_change_sec, 's'},
1771   {"livereg", s_ignore, 0},
1772   {"abicalls", s_abicalls, 0},
1773   {"cpload", s_cpload, 0},
1774   {"cpsetup", s_cpsetup, 0},
1775   {"cplocal", s_cplocal, 0},
1776   {"cprestore", s_cprestore, 0},
1777   {"cpreturn", s_cpreturn, 0},
1778   {"dtprelword", s_dtprelword, 0},
1779   {"dtpreldword", s_dtpreldword, 0},
1780   {"tprelword", s_tprelword, 0},
1781   {"tpreldword", s_tpreldword, 0},
1782   {"gpvalue", s_gpvalue, 0},
1783   {"gpword", s_gpword, 0},
1784   {"gpdword", s_gpdword, 0},
1785   {"ehword", s_ehword, 0},
1786   {"cpadd", s_cpadd, 0},
1787   {"insn", s_insn, 0},
1788   {"nan", s_nan, 0},
1789   {"module", s_module, 0},
1790
1791   /* Relatively generic pseudo-ops that happen to be used on MIPS
1792      chips.  */
1793   {"asciiz", stringer, 8 + 1},
1794   {"bss", s_change_sec, 'b'},
1795   {"err", s_err, 0},
1796   {"half", s_cons, 1},
1797   {"dword", s_cons, 3},
1798   {"weakext", s_mips_weakext, 0},
1799   {"origin", s_org, 0},
1800   {"repeat", s_rept, 0},
1801
1802   /* For MIPS this is non-standard, but we define it for consistency.  */
1803   {"sbss", s_change_sec, 'B'},
1804
1805   /* These pseudo-ops are defined in read.c, but must be overridden
1806      here for one reason or another.  */
1807   {"align", s_align, 0},
1808   {"byte", s_cons, 0},
1809   {"data", s_change_sec, 'd'},
1810   {"double", s_float_cons, 'd'},
1811   {"float", s_float_cons, 'f'},
1812   {"globl", s_mips_globl, 0},
1813   {"global", s_mips_globl, 0},
1814   {"hword", s_cons, 1},
1815   {"int", s_cons, 2},
1816   {"long", s_cons, 2},
1817   {"octa", s_cons, 4},
1818   {"quad", s_cons, 3},
1819   {"section", s_change_section, 0},
1820   {"short", s_cons, 1},
1821   {"single", s_float_cons, 'f'},
1822   {"stabd", s_mips_stab, 'd'},
1823   {"stabn", s_mips_stab, 'n'},
1824   {"stabs", s_mips_stab, 's'},
1825   {"text", s_change_sec, 't'},
1826   {"word", s_cons, 2},
1827
1828   { "extern", ecoff_directive_extern, 0},
1829
1830   { NULL, NULL, 0 },
1831 };
1832
1833 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1834 {
1835   /* These pseudo-ops should be defined by the object file format.
1836      However, a.out doesn't support them, so we have versions here.  */
1837   {"aent", s_mips_ent, 1},
1838   {"bgnb", s_ignore, 0},
1839   {"end", s_mips_end, 0},
1840   {"endb", s_ignore, 0},
1841   {"ent", s_mips_ent, 0},
1842   {"file", s_mips_file, 0},
1843   {"fmask", s_mips_mask, 'F'},
1844   {"frame", s_mips_frame, 0},
1845   {"loc", s_mips_loc, 0},
1846   {"mask", s_mips_mask, 'R'},
1847   {"verstamp", s_ignore, 0},
1848   { NULL, NULL, 0 },
1849 };
1850
1851 /* Export the ABI address size for use by TC_ADDRESS_BYTES for the
1852    purpose of the `.dc.a' internal pseudo-op.  */
1853
1854 int
1855 mips_address_bytes (void)
1856 {
1857   file_mips_check_options ();
1858   return HAVE_64BIT_ADDRESSES ? 8 : 4;
1859 }
1860
1861 extern void pop_insert (const pseudo_typeS *);
1862
1863 void
1864 mips_pop_insert (void)
1865 {
1866   pop_insert (mips_pseudo_table);
1867   if (! ECOFF_DEBUGGING)
1868     pop_insert (mips_nonecoff_pseudo_table);
1869 }
1870 \f
1871 /* Symbols labelling the current insn.  */
1872
1873 struct insn_label_list
1874 {
1875   struct insn_label_list *next;
1876   symbolS *label;
1877 };
1878
1879 static struct insn_label_list *free_insn_labels;
1880 #define label_list tc_segment_info_data.labels
1881
1882 static void mips_clear_insn_labels (void);
1883 static void mips_mark_labels (void);
1884 static void mips_compressed_mark_labels (void);
1885
1886 static inline void
1887 mips_clear_insn_labels (void)
1888 {
1889   struct insn_label_list **pl;
1890   segment_info_type *si;
1891
1892   if (now_seg)
1893     {
1894       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1895         ;
1896
1897       si = seg_info (now_seg);
1898       *pl = si->label_list;
1899       si->label_list = NULL;
1900     }
1901 }
1902
1903 /* Mark instruction labels in MIPS16/microMIPS mode.  */
1904
1905 static inline void
1906 mips_mark_labels (void)
1907 {
1908   if (HAVE_CODE_COMPRESSION)
1909     mips_compressed_mark_labels ();
1910 }
1911 \f
1912 static char *expr_end;
1913
1914 /* An expression in a macro instruction.  This is set by mips_ip and
1915    mips16_ip and when populated is always an O_constant.  */
1916
1917 static expressionS imm_expr;
1918
1919 /* The relocatable field in an instruction and the relocs associated
1920    with it.  These variables are used for instructions like LUI and
1921    JAL as well as true offsets.  They are also used for address
1922    operands in macros.  */
1923
1924 static expressionS offset_expr;
1925 static bfd_reloc_code_real_type offset_reloc[3]
1926   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1927
1928 /* This is set to the resulting size of the instruction to be produced
1929    by mips16_ip if an explicit extension is used or by mips_ip if an
1930    explicit size is supplied.  */
1931
1932 static unsigned int forced_insn_length;
1933
1934 /* True if we are assembling an instruction.  All dot symbols defined during
1935    this time should be treated as code labels.  */
1936
1937 static bfd_boolean mips_assembling_insn;
1938
1939 /* The pdr segment for per procedure frame/regmask info.  Not used for
1940    ECOFF debugging.  */
1941
1942 static segT pdr_seg;
1943
1944 /* The default target format to use.  */
1945
1946 #if defined (TE_FreeBSD)
1947 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips-freebsd"
1948 #elif defined (TE_TMIPS)
1949 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips"
1950 #else
1951 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX ENDIAN "mips"
1952 #endif
1953
1954 const char *
1955 mips_target_format (void)
1956 {
1957   switch (OUTPUT_FLAVOR)
1958     {
1959     case bfd_target_elf_flavour:
1960 #ifdef TE_VXWORKS
1961       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1962         return (target_big_endian
1963                 ? "elf32-bigmips-vxworks"
1964                 : "elf32-littlemips-vxworks");
1965 #endif
1966       return (target_big_endian
1967               ? (HAVE_64BIT_OBJECTS
1968                  ? ELF_TARGET ("elf64-", "big")
1969                  : (HAVE_NEWABI
1970                     ? ELF_TARGET ("elf32-n", "big")
1971                     : ELF_TARGET ("elf32-", "big")))
1972               : (HAVE_64BIT_OBJECTS
1973                  ? ELF_TARGET ("elf64-", "little")
1974                  : (HAVE_NEWABI
1975                     ? ELF_TARGET ("elf32-n", "little")
1976                     : ELF_TARGET ("elf32-", "little"))));
1977     default:
1978       abort ();
1979       return NULL;
1980     }
1981 }
1982
1983 /* Return the ISA revision that is currently in use, or 0 if we are
1984    generating code for MIPS V or below.  */
1985
1986 static int
1987 mips_isa_rev (void)
1988 {
1989   if (mips_opts.isa == ISA_MIPS32R2 || mips_opts.isa == ISA_MIPS64R2)
1990     return 2;
1991
1992   if (mips_opts.isa == ISA_MIPS32R3 || mips_opts.isa == ISA_MIPS64R3)
1993     return 3;
1994
1995   if (mips_opts.isa == ISA_MIPS32R5 || mips_opts.isa == ISA_MIPS64R5)
1996     return 5;
1997
1998   if (mips_opts.isa == ISA_MIPS32R6 || mips_opts.isa == ISA_MIPS64R6)
1999     return 6;
2000
2001   /* microMIPS implies revision 2 or above.  */
2002   if (mips_opts.micromips)
2003     return 2;
2004
2005   if (mips_opts.isa == ISA_MIPS32 || mips_opts.isa == ISA_MIPS64)
2006     return 1;
2007
2008   return 0;
2009 }
2010
2011 /* Return the mask of all ASEs that are revisions of those in FLAGS.  */
2012
2013 static unsigned int
2014 mips_ase_mask (unsigned int flags)
2015 {
2016   unsigned int i;
2017
2018   for (i = 0; i < ARRAY_SIZE (mips_ase_groups); i++)
2019     if (flags & mips_ase_groups[i])
2020       flags |= mips_ase_groups[i];
2021   return flags;
2022 }
2023
2024 /* Check whether the current ISA supports ASE.  Issue a warning if
2025    appropriate.  */
2026
2027 static void
2028 mips_check_isa_supports_ase (const struct mips_ase *ase)
2029 {
2030   const char *base;
2031   int min_rev, size;
2032   static unsigned int warned_isa;
2033   static unsigned int warned_fp32;
2034
2035   if (ISA_HAS_64BIT_REGS (mips_opts.isa))
2036     min_rev = mips_opts.micromips ? ase->micromips64_rev : ase->mips64_rev;
2037   else
2038     min_rev = mips_opts.micromips ? ase->micromips32_rev : ase->mips32_rev;
2039   if ((min_rev < 0 || mips_isa_rev () < min_rev)
2040       && (warned_isa & ase->flags) != ase->flags)
2041     {
2042       warned_isa |= ase->flags;
2043       base = mips_opts.micromips ? "microMIPS" : "MIPS";
2044       size = ISA_HAS_64BIT_REGS (mips_opts.isa) ? 64 : 32;
2045       if (min_rev < 0)
2046         as_warn (_("the %d-bit %s architecture does not support the"
2047                    " `%s' extension"), size, base, ase->name);
2048       else
2049         as_warn (_("the `%s' extension requires %s%d revision %d or greater"),
2050                  ase->name, base, size, min_rev);
2051     }
2052   else if ((ase->rem_rev > 0 && mips_isa_rev () >= ase->rem_rev)
2053            && (warned_isa & ase->flags) != ase->flags)
2054     {
2055       warned_isa |= ase->flags;
2056       base = mips_opts.micromips ? "microMIPS" : "MIPS";
2057       size = ISA_HAS_64BIT_REGS (mips_opts.isa) ? 64 : 32;
2058       as_warn (_("the `%s' extension was removed in %s%d revision %d"),
2059                ase->name, base, size, ase->rem_rev);
2060     }
2061
2062   if ((ase->flags & FP64_ASES)
2063       && mips_opts.fp != 64
2064       && (warned_fp32 & ase->flags) != ase->flags)
2065     {
2066       warned_fp32 |= ase->flags;
2067       as_warn (_("the `%s' extension requires 64-bit FPRs"), ase->name);
2068     }
2069 }
2070
2071 /* Check all enabled ASEs to see whether they are supported by the
2072    chosen architecture.  */
2073
2074 static void
2075 mips_check_isa_supports_ases (void)
2076 {
2077   unsigned int i, mask;
2078
2079   for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
2080     {
2081       mask = mips_ase_mask (mips_ases[i].flags);
2082       if ((mips_opts.ase & mask) == mips_ases[i].flags)
2083         mips_check_isa_supports_ase (&mips_ases[i]);
2084     }
2085 }
2086
2087 /* Set the state of ASE to ENABLED_P.  Return the mask of ASE_* flags
2088    that were affected.  */
2089
2090 static unsigned int
2091 mips_set_ase (const struct mips_ase *ase, struct mips_set_options *opts,
2092               bfd_boolean enabled_p)
2093 {
2094   unsigned int mask;
2095
2096   mask = mips_ase_mask (ase->flags);
2097   opts->ase &= ~mask;
2098   if (enabled_p)
2099     opts->ase |= ase->flags;
2100   return mask;
2101 }
2102
2103 /* Return the ASE called NAME, or null if none.  */
2104
2105 static const struct mips_ase *
2106 mips_lookup_ase (const char *name)
2107 {
2108   unsigned int i;
2109
2110   for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
2111     if (strcmp (name, mips_ases[i].name) == 0)
2112       return &mips_ases[i];
2113   return NULL;
2114 }
2115
2116 /* Return the length of a microMIPS instruction in bytes.  If bits of
2117    the mask beyond the low 16 are 0, then it is a 16-bit instruction,
2118    otherwise it is a 32-bit instruction.  */
2119
2120 static inline unsigned int
2121 micromips_insn_length (const struct mips_opcode *mo)
2122 {
2123   return mips_opcode_32bit_p (mo) ? 4 : 2;
2124 }
2125
2126 /* Return the length of MIPS16 instruction OPCODE.  */
2127
2128 static inline unsigned int
2129 mips16_opcode_length (unsigned long opcode)
2130 {
2131   return (opcode >> 16) == 0 ? 2 : 4;
2132 }
2133
2134 /* Return the length of instruction INSN.  */
2135
2136 static inline unsigned int
2137 insn_length (const struct mips_cl_insn *insn)
2138 {
2139   if (mips_opts.micromips)
2140     return micromips_insn_length (insn->insn_mo);
2141   else if (mips_opts.mips16)
2142     return mips16_opcode_length (insn->insn_opcode);
2143   else
2144     return 4;
2145 }
2146
2147 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
2148
2149 static void
2150 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
2151 {
2152   size_t i;
2153
2154   insn->insn_mo = mo;
2155   insn->insn_opcode = mo->match;
2156   insn->frag = NULL;
2157   insn->where = 0;
2158   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
2159     insn->fixp[i] = NULL;
2160   insn->fixed_p = (mips_opts.noreorder > 0);
2161   insn->noreorder_p = (mips_opts.noreorder > 0);
2162   insn->mips16_absolute_jump_p = 0;
2163   insn->complete_p = 0;
2164   insn->cleared_p = 0;
2165 }
2166
2167 /* Get a list of all the operands in INSN.  */
2168
2169 static const struct mips_operand_array *
2170 insn_operands (const struct mips_cl_insn *insn)
2171 {
2172   if (insn->insn_mo >= &mips_opcodes[0]
2173       && insn->insn_mo < &mips_opcodes[NUMOPCODES])
2174     return &mips_operands[insn->insn_mo - &mips_opcodes[0]];
2175
2176   if (insn->insn_mo >= &mips16_opcodes[0]
2177       && insn->insn_mo < &mips16_opcodes[bfd_mips16_num_opcodes])
2178     return &mips16_operands[insn->insn_mo - &mips16_opcodes[0]];
2179
2180   if (insn->insn_mo >= &micromips_opcodes[0]
2181       && insn->insn_mo < &micromips_opcodes[bfd_micromips_num_opcodes])
2182     return &micromips_operands[insn->insn_mo - &micromips_opcodes[0]];
2183
2184   abort ();
2185 }
2186
2187 /* Get a description of operand OPNO of INSN.  */
2188
2189 static const struct mips_operand *
2190 insn_opno (const struct mips_cl_insn *insn, unsigned opno)
2191 {
2192   const struct mips_operand_array *operands;
2193
2194   operands = insn_operands (insn);
2195   if (opno >= MAX_OPERANDS || !operands->operand[opno])
2196     abort ();
2197   return operands->operand[opno];
2198 }
2199
2200 /* Install UVAL as the value of OPERAND in INSN.  */
2201
2202 static inline void
2203 insn_insert_operand (struct mips_cl_insn *insn,
2204                      const struct mips_operand *operand, unsigned int uval)
2205 {
2206   insn->insn_opcode = mips_insert_operand (operand, insn->insn_opcode, uval);
2207 }
2208
2209 /* Extract the value of OPERAND from INSN.  */
2210
2211 static inline unsigned
2212 insn_extract_operand (const struct mips_cl_insn *insn,
2213                       const struct mips_operand *operand)
2214 {
2215   return mips_extract_operand (operand, insn->insn_opcode);
2216 }
2217
2218 /* Record the current MIPS16/microMIPS mode in now_seg.  */
2219
2220 static void
2221 mips_record_compressed_mode (void)
2222 {
2223   segment_info_type *si;
2224
2225   si = seg_info (now_seg);
2226   if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
2227     si->tc_segment_info_data.mips16 = mips_opts.mips16;
2228   if (si->tc_segment_info_data.micromips != mips_opts.micromips)
2229     si->tc_segment_info_data.micromips = mips_opts.micromips;
2230 }
2231
2232 /* Read a standard MIPS instruction from BUF.  */
2233
2234 static unsigned long
2235 read_insn (char *buf)
2236 {
2237   if (target_big_endian)
2238     return bfd_getb32 ((bfd_byte *) buf);
2239   else
2240     return bfd_getl32 ((bfd_byte *) buf);
2241 }
2242
2243 /* Write standard MIPS instruction INSN to BUF.  Return a pointer to
2244    the next byte.  */
2245
2246 static char *
2247 write_insn (char *buf, unsigned int insn)
2248 {
2249   md_number_to_chars (buf, insn, 4);
2250   return buf + 4;
2251 }
2252
2253 /* Read a microMIPS or MIPS16 opcode from BUF, given that it
2254    has length LENGTH.  */
2255
2256 static unsigned long
2257 read_compressed_insn (char *buf, unsigned int length)
2258 {
2259   unsigned long insn;
2260   unsigned int i;
2261
2262   insn = 0;
2263   for (i = 0; i < length; i += 2)
2264     {
2265       insn <<= 16;
2266       if (target_big_endian)
2267         insn |= bfd_getb16 ((char *) buf);
2268       else
2269         insn |= bfd_getl16 ((char *) buf);
2270       buf += 2;
2271     }
2272   return insn;
2273 }
2274
2275 /* Write microMIPS or MIPS16 instruction INSN to BUF, given that the
2276    instruction is LENGTH bytes long.  Return a pointer to the next byte.  */
2277
2278 static char *
2279 write_compressed_insn (char *buf, unsigned int insn, unsigned int length)
2280 {
2281   unsigned int i;
2282
2283   for (i = 0; i < length; i += 2)
2284     md_number_to_chars (buf + i, insn >> ((length - i - 2) * 8), 2);
2285   return buf + length;
2286 }
2287
2288 /* Install INSN at the location specified by its "frag" and "where" fields.  */
2289
2290 static void
2291 install_insn (const struct mips_cl_insn *insn)
2292 {
2293   char *f = insn->frag->fr_literal + insn->where;
2294   if (HAVE_CODE_COMPRESSION)
2295     write_compressed_insn (f, insn->insn_opcode, insn_length (insn));
2296   else
2297     write_insn (f, insn->insn_opcode);
2298   mips_record_compressed_mode ();
2299 }
2300
2301 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
2302    and install the opcode in the new location.  */
2303
2304 static void
2305 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
2306 {
2307   size_t i;
2308
2309   insn->frag = frag;
2310   insn->where = where;
2311   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
2312     if (insn->fixp[i] != NULL)
2313       {
2314         insn->fixp[i]->fx_frag = frag;
2315         insn->fixp[i]->fx_where = where;
2316       }
2317   install_insn (insn);
2318 }
2319
2320 /* Add INSN to the end of the output.  */
2321
2322 static void
2323 add_fixed_insn (struct mips_cl_insn *insn)
2324 {
2325   char *f = frag_more (insn_length (insn));
2326   move_insn (insn, frag_now, f - frag_now->fr_literal);
2327 }
2328
2329 /* Start a variant frag and move INSN to the start of the variant part,
2330    marking it as fixed.  The other arguments are as for frag_var.  */
2331
2332 static void
2333 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
2334                   relax_substateT subtype, symbolS *symbol, offsetT offset)
2335 {
2336   frag_grow (max_chars);
2337   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
2338   insn->fixed_p = 1;
2339   frag_var (rs_machine_dependent, max_chars, var,
2340             subtype, symbol, offset, NULL);
2341 }
2342
2343 /* Insert N copies of INSN into the history buffer, starting at
2344    position FIRST.  Neither FIRST nor N need to be clipped.  */
2345
2346 static void
2347 insert_into_history (unsigned int first, unsigned int n,
2348                      const struct mips_cl_insn *insn)
2349 {
2350   if (mips_relax.sequence != 2)
2351     {
2352       unsigned int i;
2353
2354       for (i = ARRAY_SIZE (history); i-- > first;)
2355         if (i >= first + n)
2356           history[i] = history[i - n];
2357         else
2358           history[i] = *insn;
2359     }
2360 }
2361
2362 /* Clear the error in insn_error.  */
2363
2364 static void
2365 clear_insn_error (void)
2366 {
2367   memset (&insn_error, 0, sizeof (insn_error));
2368 }
2369
2370 /* Possibly record error message MSG for the current instruction.
2371    If the error is about a particular argument, ARGNUM is the 1-based
2372    number of that argument, otherwise it is 0.  FORMAT is the format
2373    of MSG.  Return true if MSG was used, false if the current message
2374    was kept.  */
2375
2376 static bfd_boolean
2377 set_insn_error_format (int argnum, enum mips_insn_error_format format,
2378                        const char *msg)
2379 {
2380   if (argnum == 0)
2381     {
2382       /* Give priority to errors against specific arguments, and to
2383          the first whole-instruction message.  */
2384       if (insn_error.msg)
2385         return FALSE;
2386     }
2387   else
2388     {
2389       /* Keep insn_error if it is against a later argument.  */
2390       if (argnum < insn_error.min_argnum)
2391         return FALSE;
2392
2393       /* If both errors are against the same argument but are different,
2394          give up on reporting a specific error for this argument.
2395          See the comment about mips_insn_error for details.  */
2396       if (argnum == insn_error.min_argnum
2397           && insn_error.msg
2398           && strcmp (insn_error.msg, msg) != 0)
2399         {
2400           insn_error.msg = 0;
2401           insn_error.min_argnum += 1;
2402           return FALSE;
2403         }
2404     }
2405   insn_error.min_argnum = argnum;
2406   insn_error.format = format;
2407   insn_error.msg = msg;
2408   return TRUE;
2409 }
2410
2411 /* Record an instruction error with no % format fields.  ARGNUM and MSG are
2412    as for set_insn_error_format.  */
2413
2414 static void
2415 set_insn_error (int argnum, const char *msg)
2416 {
2417   set_insn_error_format (argnum, ERR_FMT_PLAIN, msg);
2418 }
2419
2420 /* Record an instruction error with one %d field I.  ARGNUM and MSG are
2421    as for set_insn_error_format.  */
2422
2423 static void
2424 set_insn_error_i (int argnum, const char *msg, int i)
2425 {
2426   if (set_insn_error_format (argnum, ERR_FMT_I, msg))
2427     insn_error.u.i = i;
2428 }
2429
2430 /* Record an instruction error with two %s fields S1 and S2.  ARGNUM and MSG
2431    are as for set_insn_error_format.  */
2432
2433 static void
2434 set_insn_error_ss (int argnum, const char *msg, const char *s1, const char *s2)
2435 {
2436   if (set_insn_error_format (argnum, ERR_FMT_SS, msg))
2437     {
2438       insn_error.u.ss[0] = s1;
2439       insn_error.u.ss[1] = s2;
2440     }
2441 }
2442
2443 /* Report the error in insn_error, which is against assembly code STR.  */
2444
2445 static void
2446 report_insn_error (const char *str)
2447 {
2448   const char *msg = concat (insn_error.msg, " `%s'", NULL);
2449
2450   switch (insn_error.format)
2451     {
2452     case ERR_FMT_PLAIN:
2453       as_bad (msg, str);
2454       break;
2455
2456     case ERR_FMT_I:
2457       as_bad (msg, insn_error.u.i, str);
2458       break;
2459
2460     case ERR_FMT_SS:
2461       as_bad (msg, insn_error.u.ss[0], insn_error.u.ss[1], str);
2462       break;
2463     }
2464
2465   free ((char *) msg);
2466 }
2467
2468 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
2469    the idea is to make it obvious at a glance that each errata is
2470    included.  */
2471
2472 static void
2473 init_vr4120_conflicts (void)
2474 {
2475 #define CONFLICT(FIRST, SECOND) \
2476     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
2477
2478   /* Errata 21 - [D]DIV[U] after [D]MACC */
2479   CONFLICT (MACC, DIV);
2480   CONFLICT (DMACC, DIV);
2481
2482   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
2483   CONFLICT (DMULT, DMULT);
2484   CONFLICT (DMULT, DMACC);
2485   CONFLICT (DMACC, DMULT);
2486   CONFLICT (DMACC, DMACC);
2487
2488   /* Errata 24 - MT{LO,HI} after [D]MACC */
2489   CONFLICT (MACC, MTHILO);
2490   CONFLICT (DMACC, MTHILO);
2491
2492   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
2493      instruction is executed immediately after a MACC or DMACC
2494      instruction, the result of [either instruction] is incorrect."  */
2495   CONFLICT (MACC, MULT);
2496   CONFLICT (MACC, DMULT);
2497   CONFLICT (DMACC, MULT);
2498   CONFLICT (DMACC, DMULT);
2499
2500   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
2501      executed immediately after a DMULT, DMULTU, DIV, DIVU,
2502      DDIV or DDIVU instruction, the result of the MACC or
2503      DMACC instruction is incorrect.".  */
2504   CONFLICT (DMULT, MACC);
2505   CONFLICT (DMULT, DMACC);
2506   CONFLICT (DIV, MACC);
2507   CONFLICT (DIV, DMACC);
2508
2509 #undef CONFLICT
2510 }
2511
2512 struct regname {
2513   const char *name;
2514   unsigned int num;
2515 };
2516
2517 #define RNUM_MASK       0x00000ff
2518 #define RTYPE_MASK      0x0ffff00
2519 #define RTYPE_NUM       0x0000100
2520 #define RTYPE_FPU       0x0000200
2521 #define RTYPE_FCC       0x0000400
2522 #define RTYPE_VEC       0x0000800
2523 #define RTYPE_GP        0x0001000
2524 #define RTYPE_CP0       0x0002000
2525 #define RTYPE_PC        0x0004000
2526 #define RTYPE_ACC       0x0008000
2527 #define RTYPE_CCC       0x0010000
2528 #define RTYPE_VI        0x0020000
2529 #define RTYPE_VF        0x0040000
2530 #define RTYPE_R5900_I   0x0080000
2531 #define RTYPE_R5900_Q   0x0100000
2532 #define RTYPE_R5900_R   0x0200000
2533 #define RTYPE_R5900_ACC 0x0400000
2534 #define RTYPE_MSA       0x0800000
2535 #define RWARN           0x8000000
2536
2537 #define GENERIC_REGISTER_NUMBERS \
2538     {"$0",      RTYPE_NUM | 0},  \
2539     {"$1",      RTYPE_NUM | 1},  \
2540     {"$2",      RTYPE_NUM | 2},  \
2541     {"$3",      RTYPE_NUM | 3},  \
2542     {"$4",      RTYPE_NUM | 4},  \
2543     {"$5",      RTYPE_NUM | 5},  \
2544     {"$6",      RTYPE_NUM | 6},  \
2545     {"$7",      RTYPE_NUM | 7},  \
2546     {"$8",      RTYPE_NUM | 8},  \
2547     {"$9",      RTYPE_NUM | 9},  \
2548     {"$10",     RTYPE_NUM | 10}, \
2549     {"$11",     RTYPE_NUM | 11}, \
2550     {"$12",     RTYPE_NUM | 12}, \
2551     {"$13",     RTYPE_NUM | 13}, \
2552     {"$14",     RTYPE_NUM | 14}, \
2553     {"$15",     RTYPE_NUM | 15}, \
2554     {"$16",     RTYPE_NUM | 16}, \
2555     {"$17",     RTYPE_NUM | 17}, \
2556     {"$18",     RTYPE_NUM | 18}, \
2557     {"$19",     RTYPE_NUM | 19}, \
2558     {"$20",     RTYPE_NUM | 20}, \
2559     {"$21",     RTYPE_NUM | 21}, \
2560     {"$22",     RTYPE_NUM | 22}, \
2561     {"$23",     RTYPE_NUM | 23}, \
2562     {"$24",     RTYPE_NUM | 24}, \
2563     {"$25",     RTYPE_NUM | 25}, \
2564     {"$26",     RTYPE_NUM | 26}, \
2565     {"$27",     RTYPE_NUM | 27}, \
2566     {"$28",     RTYPE_NUM | 28}, \
2567     {"$29",     RTYPE_NUM | 29}, \
2568     {"$30",     RTYPE_NUM | 30}, \
2569     {"$31",     RTYPE_NUM | 31}
2570
2571 #define FPU_REGISTER_NAMES       \
2572     {"$f0",     RTYPE_FPU | 0},  \
2573     {"$f1",     RTYPE_FPU | 1},  \
2574     {"$f2",     RTYPE_FPU | 2},  \
2575     {"$f3",     RTYPE_FPU | 3},  \
2576     {"$f4",     RTYPE_FPU | 4},  \
2577     {"$f5",     RTYPE_FPU | 5},  \
2578     {"$f6",     RTYPE_FPU | 6},  \
2579     {"$f7",     RTYPE_FPU | 7},  \
2580     {"$f8",     RTYPE_FPU | 8},  \
2581     {"$f9",     RTYPE_FPU | 9},  \
2582     {"$f10",    RTYPE_FPU | 10}, \
2583     {"$f11",    RTYPE_FPU | 11}, \
2584     {"$f12",    RTYPE_FPU | 12}, \
2585     {"$f13",    RTYPE_FPU | 13}, \
2586     {"$f14",    RTYPE_FPU | 14}, \
2587     {"$f15",    RTYPE_FPU | 15}, \
2588     {"$f16",    RTYPE_FPU | 16}, \
2589     {"$f17",    RTYPE_FPU | 17}, \
2590     {"$f18",    RTYPE_FPU | 18}, \
2591     {"$f19",    RTYPE_FPU | 19}, \
2592     {"$f20",    RTYPE_FPU | 20}, \
2593     {"$f21",    RTYPE_FPU | 21}, \
2594     {"$f22",    RTYPE_FPU | 22}, \
2595     {"$f23",    RTYPE_FPU | 23}, \
2596     {"$f24",    RTYPE_FPU | 24}, \
2597     {"$f25",    RTYPE_FPU | 25}, \
2598     {"$f26",    RTYPE_FPU | 26}, \
2599     {"$f27",    RTYPE_FPU | 27}, \
2600     {"$f28",    RTYPE_FPU | 28}, \
2601     {"$f29",    RTYPE_FPU | 29}, \
2602     {"$f30",    RTYPE_FPU | 30}, \
2603     {"$f31",    RTYPE_FPU | 31}
2604
2605 #define FPU_CONDITION_CODE_NAMES \
2606     {"$fcc0",   RTYPE_FCC | 0},  \
2607     {"$fcc1",   RTYPE_FCC | 1},  \
2608     {"$fcc2",   RTYPE_FCC | 2},  \
2609     {"$fcc3",   RTYPE_FCC | 3},  \
2610     {"$fcc4",   RTYPE_FCC | 4},  \
2611     {"$fcc5",   RTYPE_FCC | 5},  \
2612     {"$fcc6",   RTYPE_FCC | 6},  \
2613     {"$fcc7",   RTYPE_FCC | 7}
2614
2615 #define COPROC_CONDITION_CODE_NAMES         \
2616     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
2617     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
2618     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
2619     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
2620     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
2621     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
2622     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
2623     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
2624
2625 #define N32N64_SYMBOLIC_REGISTER_NAMES \
2626     {"$a4",     RTYPE_GP | 8},  \
2627     {"$a5",     RTYPE_GP | 9},  \
2628     {"$a6",     RTYPE_GP | 10}, \
2629     {"$a7",     RTYPE_GP | 11}, \
2630     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
2631     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
2632     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
2633     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
2634     {"$t0",     RTYPE_GP | 12}, \
2635     {"$t1",     RTYPE_GP | 13}, \
2636     {"$t2",     RTYPE_GP | 14}, \
2637     {"$t3",     RTYPE_GP | 15}
2638
2639 #define O32_SYMBOLIC_REGISTER_NAMES \
2640     {"$t0",     RTYPE_GP | 8},  \
2641     {"$t1",     RTYPE_GP | 9},  \
2642     {"$t2",     RTYPE_GP | 10}, \
2643     {"$t3",     RTYPE_GP | 11}, \
2644     {"$t4",     RTYPE_GP | 12}, \
2645     {"$t5",     RTYPE_GP | 13}, \
2646     {"$t6",     RTYPE_GP | 14}, \
2647     {"$t7",     RTYPE_GP | 15}, \
2648     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
2649     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
2650     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
2651     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */
2652
2653 /* Remaining symbolic register names */
2654 #define SYMBOLIC_REGISTER_NAMES \
2655     {"$zero",   RTYPE_GP | 0},  \
2656     {"$at",     RTYPE_GP | 1},  \
2657     {"$AT",     RTYPE_GP | 1},  \
2658     {"$v0",     RTYPE_GP | 2},  \
2659     {"$v1",     RTYPE_GP | 3},  \
2660     {"$a0",     RTYPE_GP | 4},  \
2661     {"$a1",     RTYPE_GP | 5},  \
2662     {"$a2",     RTYPE_GP | 6},  \
2663     {"$a3",     RTYPE_GP | 7},  \
2664     {"$s0",     RTYPE_GP | 16}, \
2665     {"$s1",     RTYPE_GP | 17}, \
2666     {"$s2",     RTYPE_GP | 18}, \
2667     {"$s3",     RTYPE_GP | 19}, \
2668     {"$s4",     RTYPE_GP | 20}, \
2669     {"$s5",     RTYPE_GP | 21}, \
2670     {"$s6",     RTYPE_GP | 22}, \
2671     {"$s7",     RTYPE_GP | 23}, \
2672     {"$t8",     RTYPE_GP | 24}, \
2673     {"$t9",     RTYPE_GP | 25}, \
2674     {"$k0",     RTYPE_GP | 26}, \
2675     {"$kt0",    RTYPE_GP | 26}, \
2676     {"$k1",     RTYPE_GP | 27}, \
2677     {"$kt1",    RTYPE_GP | 27}, \
2678     {"$gp",     RTYPE_GP | 28}, \
2679     {"$sp",     RTYPE_GP | 29}, \
2680     {"$s8",     RTYPE_GP | 30}, \
2681     {"$fp",     RTYPE_GP | 30}, \
2682     {"$ra",     RTYPE_GP | 31}
2683
2684 #define MIPS16_SPECIAL_REGISTER_NAMES \
2685     {"$pc",     RTYPE_PC | 0}
2686
2687 #define MDMX_VECTOR_REGISTER_NAMES \
2688     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
2689     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
2690     {"$v2",     RTYPE_VEC | 2},  \
2691     {"$v3",     RTYPE_VEC | 3},  \
2692     {"$v4",     RTYPE_VEC | 4},  \
2693     {"$v5",     RTYPE_VEC | 5},  \
2694     {"$v6",     RTYPE_VEC | 6},  \
2695     {"$v7",     RTYPE_VEC | 7},  \
2696     {"$v8",     RTYPE_VEC | 8},  \
2697     {"$v9",     RTYPE_VEC | 9},  \
2698     {"$v10",    RTYPE_VEC | 10}, \
2699     {"$v11",    RTYPE_VEC | 11}, \
2700     {"$v12",    RTYPE_VEC | 12}, \
2701     {"$v13",    RTYPE_VEC | 13}, \
2702     {"$v14",    RTYPE_VEC | 14}, \
2703     {"$v15",    RTYPE_VEC | 15}, \
2704     {"$v16",    RTYPE_VEC | 16}, \
2705     {"$v17",    RTYPE_VEC | 17}, \
2706     {"$v18",    RTYPE_VEC | 18}, \
2707     {"$v19",    RTYPE_VEC | 19}, \
2708     {"$v20",    RTYPE_VEC | 20}, \
2709     {"$v21",    RTYPE_VEC | 21}, \
2710     {"$v22",    RTYPE_VEC | 22}, \
2711     {"$v23",    RTYPE_VEC | 23}, \
2712     {"$v24",    RTYPE_VEC | 24}, \
2713     {"$v25",    RTYPE_VEC | 25}, \
2714     {"$v26",    RTYPE_VEC | 26}, \
2715     {"$v27",    RTYPE_VEC | 27}, \
2716     {"$v28",    RTYPE_VEC | 28}, \
2717     {"$v29",    RTYPE_VEC | 29}, \
2718     {"$v30",    RTYPE_VEC | 30}, \
2719     {"$v31",    RTYPE_VEC | 31}
2720
2721 #define R5900_I_NAMES \
2722     {"$I",      RTYPE_R5900_I | 0}
2723
2724 #define R5900_Q_NAMES \
2725     {"$Q",      RTYPE_R5900_Q | 0}
2726
2727 #define R5900_R_NAMES \
2728     {"$R",      RTYPE_R5900_R | 0}
2729
2730 #define R5900_ACC_NAMES \
2731     {"$ACC",    RTYPE_R5900_ACC | 0 }
2732
2733 #define MIPS_DSP_ACCUMULATOR_NAMES \
2734     {"$ac0",    RTYPE_ACC | 0}, \
2735     {"$ac1",    RTYPE_ACC | 1}, \
2736     {"$ac2",    RTYPE_ACC | 2}, \
2737     {"$ac3",    RTYPE_ACC | 3}
2738
2739 static const struct regname reg_names[] = {
2740   GENERIC_REGISTER_NUMBERS,
2741   FPU_REGISTER_NAMES,
2742   FPU_CONDITION_CODE_NAMES,
2743   COPROC_CONDITION_CODE_NAMES,
2744
2745   /* The $txx registers depends on the abi,
2746      these will be added later into the symbol table from
2747      one of the tables below once mips_abi is set after
2748      parsing of arguments from the command line. */
2749   SYMBOLIC_REGISTER_NAMES,
2750
2751   MIPS16_SPECIAL_REGISTER_NAMES,
2752   MDMX_VECTOR_REGISTER_NAMES,
2753   R5900_I_NAMES,
2754   R5900_Q_NAMES,
2755   R5900_R_NAMES,
2756   R5900_ACC_NAMES,
2757   MIPS_DSP_ACCUMULATOR_NAMES,
2758   {0, 0}
2759 };
2760
2761 static const struct regname reg_names_o32[] = {
2762   O32_SYMBOLIC_REGISTER_NAMES,
2763   {0, 0}
2764 };
2765
2766 static const struct regname reg_names_n32n64[] = {
2767   N32N64_SYMBOLIC_REGISTER_NAMES,
2768   {0, 0}
2769 };
2770
2771 /* Register symbols $v0 and $v1 map to GPRs 2 and 3, but they can also be
2772    interpreted as vector registers 0 and 1.  If SYMVAL is the value of one
2773    of these register symbols, return the associated vector register,
2774    otherwise return SYMVAL itself.  */
2775
2776 static unsigned int
2777 mips_prefer_vec_regno (unsigned int symval)
2778 {
2779   if ((symval & -2) == (RTYPE_GP | 2))
2780     return RTYPE_VEC | (symval & 1);
2781   return symval;
2782 }
2783
2784 /* Return true if string [S, E) is a valid register name, storing its
2785    symbol value in *SYMVAL_PTR if so.  */
2786
2787 static bfd_boolean
2788 mips_parse_register_1 (char *s, char *e, unsigned int *symval_ptr)
2789 {
2790   char save_c;
2791   symbolS *symbol;
2792
2793   /* Terminate name.  */
2794   save_c = *e;
2795   *e = '\0';
2796
2797   /* Look up the name.  */
2798   symbol = symbol_find (s);
2799   *e = save_c;
2800
2801   if (!symbol || S_GET_SEGMENT (symbol) != reg_section)
2802     return FALSE;
2803
2804   *symval_ptr = S_GET_VALUE (symbol);
2805   return TRUE;
2806 }
2807
2808 /* Return true if the string at *SPTR is a valid register name.  Allow it
2809    to have a VU0-style channel suffix of the form x?y?z?w? if CHANNELS_PTR
2810    is nonnull.
2811
2812    When returning true, move *SPTR past the register, store the
2813    register's symbol value in *SYMVAL_PTR and the channel mask in
2814    *CHANNELS_PTR (if nonnull).  The symbol value includes the register
2815    number (RNUM_MASK) and register type (RTYPE_MASK).  The channel mask
2816    is a 4-bit value of the form XYZW and is 0 if no suffix was given.  */
2817
2818 static bfd_boolean
2819 mips_parse_register (char **sptr, unsigned int *symval_ptr,
2820                      unsigned int *channels_ptr)
2821 {
2822   char *s, *e, *m;
2823   const char *q;
2824   unsigned int channels, symval, bit;
2825
2826   /* Find end of name.  */
2827   s = e = *sptr;
2828   if (is_name_beginner (*e))
2829     ++e;
2830   while (is_part_of_name (*e))
2831     ++e;
2832
2833   channels = 0;
2834   if (!mips_parse_register_1 (s, e, &symval))
2835     {
2836       if (!channels_ptr)
2837         return FALSE;
2838
2839       /* Eat characters from the end of the string that are valid
2840          channel suffixes.  The preceding register must be $ACC or
2841          end with a digit, so there is no ambiguity.  */
2842       bit = 1;
2843       m = e;
2844       for (q = "wzyx"; *q; q++, bit <<= 1)
2845         if (m > s && m[-1] == *q)
2846           {
2847             --m;
2848             channels |= bit;
2849           }
2850
2851       if (channels == 0
2852           || !mips_parse_register_1 (s, m, &symval)
2853           || (symval & (RTYPE_VI | RTYPE_VF | RTYPE_R5900_ACC)) == 0)
2854         return FALSE;
2855     }
2856
2857   *sptr = e;
2858   *symval_ptr = symval;
2859   if (channels_ptr)
2860     *channels_ptr = channels;
2861   return TRUE;
2862 }
2863
2864 /* Check if SPTR points at a valid register specifier according to TYPES.
2865    If so, then return 1, advance S to consume the specifier and store
2866    the register's number in REGNOP, otherwise return 0.  */
2867
2868 static int
2869 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
2870 {
2871   unsigned int regno;
2872
2873   if (mips_parse_register (s, &regno, NULL))
2874     {
2875       if (types & RTYPE_VEC)
2876         regno = mips_prefer_vec_regno (regno);
2877       if (regno & types)
2878         regno &= RNUM_MASK;
2879       else
2880         regno = ~0;
2881     }
2882   else
2883     {
2884       if (types & RWARN)
2885         as_warn (_("unrecognized register name `%s'"), *s);
2886       regno = ~0;
2887     }
2888   if (regnop)
2889     *regnop = regno;
2890   return regno <= RNUM_MASK;
2891 }
2892
2893 /* Parse a VU0 "x?y?z?w?" channel mask at S and store the associated
2894    mask in *CHANNELS.  Return a pointer to the first unconsumed character.  */
2895
2896 static char *
2897 mips_parse_vu0_channels (char *s, unsigned int *channels)
2898 {
2899   unsigned int i;
2900
2901   *channels = 0;
2902   for (i = 0; i < 4; i++)
2903     if (*s == "xyzw"[i])
2904       {
2905         *channels |= 1 << (3 - i);
2906         ++s;
2907       }
2908   return s;
2909 }
2910
2911 /* Token types for parsed operand lists.  */
2912 enum mips_operand_token_type {
2913   /* A plain register, e.g. $f2.  */
2914   OT_REG,
2915
2916   /* A 4-bit XYZW channel mask.  */
2917   OT_CHANNELS,
2918
2919   /* A constant vector index, e.g. [1].  */
2920   OT_INTEGER_INDEX,
2921
2922   /* A register vector index, e.g. [$2].  */
2923   OT_REG_INDEX,
2924
2925   /* A continuous range of registers, e.g. $s0-$s4.  */
2926   OT_REG_RANGE,
2927
2928   /* A (possibly relocated) expression.  */
2929   OT_INTEGER,
2930
2931   /* A floating-point value.  */
2932   OT_FLOAT,
2933
2934   /* A single character.  This can be '(', ')' or ',', but '(' only appears
2935      before OT_REGs.  */
2936   OT_CHAR,
2937
2938   /* A doubled character, either "--" or "++".  */
2939   OT_DOUBLE_CHAR,
2940
2941   /* The end of the operand list.  */
2942   OT_END
2943 };
2944
2945 /* A parsed operand token.  */
2946 struct mips_operand_token
2947 {
2948   /* The type of token.  */
2949   enum mips_operand_token_type type;
2950   union
2951   {
2952     /* The register symbol value for an OT_REG or OT_REG_INDEX.  */
2953     unsigned int regno;
2954
2955     /* The 4-bit channel mask for an OT_CHANNEL_SUFFIX.  */
2956     unsigned int channels;
2957
2958     /* The integer value of an OT_INTEGER_INDEX.  */
2959     addressT index;
2960
2961     /* The two register symbol values involved in an OT_REG_RANGE.  */
2962     struct {
2963       unsigned int regno1;
2964       unsigned int regno2;
2965     } reg_range;
2966
2967     /* The value of an OT_INTEGER.  The value is represented as an
2968        expression and the relocation operators that were applied to
2969        that expression.  The reloc entries are BFD_RELOC_UNUSED if no
2970        relocation operators were used.  */
2971     struct {
2972       expressionS value;
2973       bfd_reloc_code_real_type relocs[3];
2974     } integer;
2975
2976     /* The binary data for an OT_FLOAT constant, and the number of bytes
2977        in the constant.  */
2978     struct {
2979       unsigned char data[8];
2980       int length;
2981     } flt;
2982
2983     /* The character represented by an OT_CHAR or OT_DOUBLE_CHAR.  */
2984     char ch;
2985   } u;
2986 };
2987
2988 /* An obstack used to construct lists of mips_operand_tokens.  */
2989 static struct obstack mips_operand_tokens;
2990
2991 /* Give TOKEN type TYPE and add it to mips_operand_tokens.  */
2992
2993 static void
2994 mips_add_token (struct mips_operand_token *token,
2995                 enum mips_operand_token_type type)
2996 {
2997   token->type = type;
2998   obstack_grow (&mips_operand_tokens, token, sizeof (*token));
2999 }
3000
3001 /* Check whether S is '(' followed by a register name.  Add OT_CHAR
3002    and OT_REG tokens for them if so, and return a pointer to the first
3003    unconsumed character.  Return null otherwise.  */
3004
3005 static char *
3006 mips_parse_base_start (char *s)
3007 {
3008   struct mips_operand_token token;
3009   unsigned int regno, channels;
3010   bfd_boolean decrement_p;
3011
3012   if (*s != '(')
3013     return 0;
3014
3015   ++s;
3016   SKIP_SPACE_TABS (s);
3017
3018   /* Only match "--" as part of a base expression.  In other contexts "--X"
3019      is a double negative.  */
3020   decrement_p = (s[0] == '-' && s[1] == '-');
3021   if (decrement_p)
3022     {
3023       s += 2;
3024       SKIP_SPACE_TABS (s);
3025     }
3026
3027   /* Allow a channel specifier because that leads to better error messages
3028      than treating something like "$vf0x++" as an expression.  */
3029   if (!mips_parse_register (&s, &regno, &channels))
3030     return 0;
3031
3032   token.u.ch = '(';
3033   mips_add_token (&token, OT_CHAR);
3034
3035   if (decrement_p)
3036     {
3037       token.u.ch = '-';
3038       mips_add_token (&token, OT_DOUBLE_CHAR);
3039     }
3040
3041   token.u.regno = regno;
3042   mips_add_token (&token, OT_REG);
3043
3044   if (channels)
3045     {
3046       token.u.channels = channels;
3047       mips_add_token (&token, OT_CHANNELS);
3048     }
3049
3050   /* For consistency, only match "++" as part of base expressions too.  */
3051   SKIP_SPACE_TABS (s);
3052   if (s[0] == '+' && s[1] == '+')
3053     {
3054       s += 2;
3055       token.u.ch = '+';
3056       mips_add_token (&token, OT_DOUBLE_CHAR);
3057     }
3058
3059   return s;
3060 }
3061
3062 /* Parse one or more tokens from S.  Return a pointer to the first
3063    unconsumed character on success.  Return null if an error was found
3064    and store the error text in insn_error.  FLOAT_FORMAT is as for
3065    mips_parse_arguments.  */
3066
3067 static char *
3068 mips_parse_argument_token (char *s, char float_format)
3069 {
3070   char *end, *save_in;
3071   const char *err;
3072   unsigned int regno1, regno2, channels;
3073   struct mips_operand_token token;
3074
3075   /* First look for "($reg", since we want to treat that as an
3076      OT_CHAR and OT_REG rather than an expression.  */
3077   end = mips_parse_base_start (s);
3078   if (end)
3079     return end;
3080
3081   /* Handle other characters that end up as OT_CHARs.  */
3082   if (*s == ')' || *s == ',')
3083     {
3084       token.u.ch = *s;
3085       mips_add_token (&token, OT_CHAR);
3086       ++s;
3087       return s;
3088     }
3089
3090   /* Handle tokens that start with a register.  */
3091   if (mips_parse_register (&s, &regno1, &channels))
3092     {
3093       if (channels)
3094         {
3095           /* A register and a VU0 channel suffix.  */
3096           token.u.regno = regno1;
3097           mips_add_token (&token, OT_REG);
3098
3099           token.u.channels = channels;
3100           mips_add_token (&token, OT_CHANNELS);
3101           return s;
3102         }
3103
3104       SKIP_SPACE_TABS (s);
3105       if (*s == '-')
3106         {
3107           /* A register range.  */
3108           ++s;
3109           SKIP_SPACE_TABS (s);
3110           if (!mips_parse_register (&s, &regno2, NULL))
3111             {
3112               set_insn_error (0, _("invalid register range"));
3113               return 0;
3114             }
3115
3116           token.u.reg_range.regno1 = regno1;
3117           token.u.reg_range.regno2 = regno2;
3118           mips_add_token (&token, OT_REG_RANGE);
3119           return s;
3120         }
3121
3122       /* Add the register itself.  */
3123       token.u.regno = regno1;
3124       mips_add_token (&token, OT_REG);
3125
3126       /* Check for a vector index.  */
3127       if (*s == '[')
3128         {
3129           ++s;
3130           SKIP_SPACE_TABS (s);
3131           if (mips_parse_register (&s, &token.u.regno, NULL))
3132             mips_add_token (&token, OT_REG_INDEX);
3133           else
3134             {
3135               expressionS element;
3136
3137               my_getExpression (&element, s);
3138               if (element.X_op != O_constant)
3139                 {
3140                   set_insn_error (0, _("vector element must be constant"));
3141                   return 0;
3142                 }
3143               s = expr_end;
3144               token.u.index = element.X_add_number;
3145               mips_add_token (&token, OT_INTEGER_INDEX);
3146             }
3147           SKIP_SPACE_TABS (s);
3148           if (*s != ']')
3149             {
3150               set_insn_error (0, _("missing `]'"));
3151               return 0;
3152             }
3153           ++s;
3154         }
3155       return s;
3156     }
3157
3158   if (float_format)
3159     {
3160       /* First try to treat expressions as floats.  */
3161       save_in = input_line_pointer;
3162       input_line_pointer = s;
3163       err = md_atof (float_format, (char *) token.u.flt.data,
3164                      &token.u.flt.length);
3165       end = input_line_pointer;
3166       input_line_pointer = save_in;
3167       if (err && *err)
3168         {
3169           set_insn_error (0, err);
3170           return 0;
3171         }
3172       if (s != end)
3173         {
3174           mips_add_token (&token, OT_FLOAT);
3175           return end;
3176         }
3177     }
3178
3179   /* Treat everything else as an integer expression.  */
3180   token.u.integer.relocs[0] = BFD_RELOC_UNUSED;
3181   token.u.integer.relocs[1] = BFD_RELOC_UNUSED;
3182   token.u.integer.relocs[2] = BFD_RELOC_UNUSED;
3183   my_getSmallExpression (&token.u.integer.value, token.u.integer.relocs, s);
3184   s = expr_end;
3185   mips_add_token (&token, OT_INTEGER);
3186   return s;
3187 }
3188
3189 /* S points to the operand list for an instruction.  FLOAT_FORMAT is 'f'
3190    if expressions should be treated as 32-bit floating-point constants,
3191    'd' if they should be treated as 64-bit floating-point constants,
3192    or 0 if they should be treated as integer expressions (the usual case).
3193
3194    Return a list of tokens on success, otherwise return 0.  The caller
3195    must obstack_free the list after use.  */
3196
3197 static struct mips_operand_token *
3198 mips_parse_arguments (char *s, char float_format)
3199 {
3200   struct mips_operand_token token;
3201
3202   SKIP_SPACE_TABS (s);
3203   while (*s)
3204     {
3205       s = mips_parse_argument_token (s, float_format);
3206       if (!s)
3207         {
3208           obstack_free (&mips_operand_tokens,
3209                         obstack_finish (&mips_operand_tokens));
3210           return 0;
3211         }
3212       SKIP_SPACE_TABS (s);
3213     }
3214   mips_add_token (&token, OT_END);
3215   return (struct mips_operand_token *) obstack_finish (&mips_operand_tokens);
3216 }
3217
3218 /* Return TRUE if opcode MO is valid on the currently selected ISA, ASE
3219    and architecture.  Use is_opcode_valid_16 for MIPS16 opcodes.  */
3220
3221 static bfd_boolean
3222 is_opcode_valid (const struct mips_opcode *mo)
3223 {
3224   int isa = mips_opts.isa;
3225   int ase = mips_opts.ase;
3226   int fp_s, fp_d;
3227   unsigned int i;
3228
3229   if (ISA_HAS_64BIT_REGS (isa))
3230     for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
3231       if ((ase & mips_ases[i].flags) == mips_ases[i].flags)
3232         ase |= mips_ases[i].flags64;
3233
3234   if (!opcode_is_member (mo, isa, ase, mips_opts.arch))
3235     return FALSE;
3236
3237   /* Check whether the instruction or macro requires single-precision or
3238      double-precision floating-point support.  Note that this information is
3239      stored differently in the opcode table for insns and macros.  */
3240   if (mo->pinfo == INSN_MACRO)
3241     {
3242       fp_s = mo->pinfo2 & INSN2_M_FP_S;
3243       fp_d = mo->pinfo2 & INSN2_M_FP_D;
3244     }
3245   else
3246     {
3247       fp_s = mo->pinfo & FP_S;
3248       fp_d = mo->pinfo & FP_D;
3249     }
3250
3251   if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
3252     return FALSE;
3253
3254   if (fp_s && mips_opts.soft_float)
3255     return FALSE;
3256
3257   return TRUE;
3258 }
3259
3260 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
3261    selected ISA and architecture.  */
3262
3263 static bfd_boolean
3264 is_opcode_valid_16 (const struct mips_opcode *mo)
3265 {
3266   return opcode_is_member (mo, mips_opts.isa, 0, mips_opts.arch);
3267 }
3268
3269 /* Return TRUE if the size of the microMIPS opcode MO matches one
3270    explicitly requested.  Always TRUE in the standard MIPS mode.
3271    Use is_size_valid_16 for MIPS16 opcodes.  */
3272
3273 static bfd_boolean
3274 is_size_valid (const struct mips_opcode *mo)
3275 {
3276   if (!mips_opts.micromips)
3277     return TRUE;
3278
3279   if (mips_opts.insn32)
3280     {
3281       if (mo->pinfo != INSN_MACRO && micromips_insn_length (mo) != 4)
3282         return FALSE;
3283       if ((mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0)
3284         return FALSE;
3285     }
3286   if (!forced_insn_length)
3287     return TRUE;
3288   if (mo->pinfo == INSN_MACRO)
3289     return FALSE;
3290   return forced_insn_length == micromips_insn_length (mo);
3291 }
3292
3293 /* Return TRUE if the size of the MIPS16 opcode MO matches one
3294    explicitly requested.  */
3295
3296 static bfd_boolean
3297 is_size_valid_16 (const struct mips_opcode *mo)
3298 {
3299   if (!forced_insn_length)
3300     return TRUE;
3301   if (mo->pinfo == INSN_MACRO)
3302     return FALSE;
3303   if (forced_insn_length == 2 && mips_opcode_32bit_p (mo))
3304     return FALSE;
3305   if (forced_insn_length == 4 && (mo->pinfo2 & INSN2_SHORT_ONLY))
3306     return FALSE;
3307   return TRUE;
3308 }
3309
3310 /* Return TRUE if the microMIPS opcode MO is valid for the delay slot
3311    of the preceding instruction.  Always TRUE in the standard MIPS mode.
3312
3313    We don't accept macros in 16-bit delay slots to avoid a case where
3314    a macro expansion fails because it relies on a preceding 32-bit real
3315    instruction to have matched and does not handle the operands correctly.
3316    The only macros that may expand to 16-bit instructions are JAL that
3317    cannot be placed in a delay slot anyway, and corner cases of BALIGN
3318    and BGT (that likewise cannot be placed in a delay slot) that decay to
3319    a NOP.  In all these cases the macros precede any corresponding real
3320    instruction definitions in the opcode table, so they will match in the
3321    second pass where the size of the delay slot is ignored and therefore
3322    produce correct code.  */
3323
3324 static bfd_boolean
3325 is_delay_slot_valid (const struct mips_opcode *mo)
3326 {
3327   if (!mips_opts.micromips)
3328     return TRUE;
3329
3330   if (mo->pinfo == INSN_MACRO)
3331     return (history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) == 0;
3332   if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
3333       && micromips_insn_length (mo) != 4)
3334     return FALSE;
3335   if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
3336       && micromips_insn_length (mo) != 2)
3337     return FALSE;
3338
3339   return TRUE;
3340 }
3341
3342 /* For consistency checking, verify that all bits of OPCODE are specified
3343    either by the match/mask part of the instruction definition, or by the
3344    operand list.  Also build up a list of operands in OPERANDS.
3345
3346    INSN_BITS says which bits of the instruction are significant.
3347    If OPCODE is a standard or microMIPS instruction, DECODE_OPERAND
3348    provides the mips_operand description of each operand.  DECODE_OPERAND
3349    is null for MIPS16 instructions.  */
3350
3351 static int
3352 validate_mips_insn (const struct mips_opcode *opcode,
3353                     unsigned long insn_bits,
3354                     const struct mips_operand *(*decode_operand) (const char *),
3355                     struct mips_operand_array *operands)
3356 {
3357   const char *s;
3358   unsigned long used_bits, doubled, undefined, opno, mask;
3359   const struct mips_operand *operand;
3360
3361   mask = (opcode->pinfo == INSN_MACRO ? 0 : opcode->mask);
3362   if ((mask & opcode->match) != opcode->match)
3363     {
3364       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
3365               opcode->name, opcode->args);
3366       return 0;
3367     }
3368   used_bits = 0;
3369   opno = 0;
3370   if (opcode->pinfo2 & INSN2_VU0_CHANNEL_SUFFIX)
3371     used_bits = mips_insert_operand (&mips_vu0_channel_mask, used_bits, -1);
3372   for (s = opcode->args; *s; ++s)
3373     switch (*s)
3374       {
3375       case ',':
3376       case '(':
3377       case ')':
3378         break;
3379
3380       case '#':
3381         s++;
3382         break;
3383
3384       default:
3385         if (!decode_operand)
3386           operand = decode_mips16_operand (*s, mips_opcode_32bit_p (opcode));
3387         else
3388           operand = decode_operand (s);
3389         if (!operand && opcode->pinfo != INSN_MACRO)
3390           {
3391             as_bad (_("internal: unknown operand type: %s %s"),
3392                     opcode->name, opcode->args);
3393             return 0;
3394           }
3395         gas_assert (opno < MAX_OPERANDS);
3396         operands->operand[opno] = operand;
3397         if (operand && operand->type != OP_VU0_MATCH_SUFFIX)
3398           {
3399             used_bits = mips_insert_operand (operand, used_bits, -1);
3400             if (operand->type == OP_MDMX_IMM_REG)
3401               /* Bit 5 is the format selector (OB vs QH).  The opcode table
3402                  has separate entries for each format.  */
3403               used_bits &= ~(1 << (operand->lsb + 5));
3404             if (operand->type == OP_ENTRY_EXIT_LIST)
3405               used_bits &= ~(mask & 0x700);
3406           }
3407         /* Skip prefix characters.  */
3408         if (decode_operand && (*s == '+' || *s == 'm' || *s == '-'))
3409           ++s;
3410         opno += 1;
3411         break;
3412       }
3413   doubled = used_bits & mask & insn_bits;
3414   if (doubled)
3415     {
3416       as_bad (_("internal: bad mips opcode (bits 0x%08lx doubly defined):"
3417                 " %s %s"), doubled, opcode->name, opcode->args);
3418       return 0;
3419     }
3420   used_bits |= mask;
3421   undefined = ~used_bits & insn_bits;
3422   if (opcode->pinfo != INSN_MACRO && undefined)
3423     {
3424       as_bad (_("internal: bad mips opcode (bits 0x%08lx undefined): %s %s"),
3425               undefined, opcode->name, opcode->args);
3426       return 0;
3427     }
3428   used_bits &= ~insn_bits;
3429   if (used_bits)
3430     {
3431       as_bad (_("internal: bad mips opcode (bits 0x%08lx defined): %s %s"),
3432               used_bits, opcode->name, opcode->args);
3433       return 0;
3434     }
3435   return 1;
3436 }
3437
3438 /* The MIPS16 version of validate_mips_insn.  */
3439
3440 static int
3441 validate_mips16_insn (const struct mips_opcode *opcode,
3442                       struct mips_operand_array *operands)
3443 {
3444   unsigned long insn_bits = mips_opcode_32bit_p (opcode) ? 0xffffffff : 0xffff;
3445
3446   return validate_mips_insn (opcode, insn_bits, 0, operands);
3447 }
3448
3449 /* The microMIPS version of validate_mips_insn.  */
3450
3451 static int
3452 validate_micromips_insn (const struct mips_opcode *opc,
3453                          struct mips_operand_array *operands)
3454 {
3455   unsigned long insn_bits;
3456   unsigned long major;
3457   unsigned int length;
3458
3459   if (opc->pinfo == INSN_MACRO)
3460     return validate_mips_insn (opc, 0xffffffff, decode_micromips_operand,
3461                                operands);
3462
3463   length = micromips_insn_length (opc);
3464   if (length != 2 && length != 4)
3465     {
3466       as_bad (_("internal error: bad microMIPS opcode (incorrect length: %u): "
3467                 "%s %s"), length, opc->name, opc->args);
3468       return 0;
3469     }
3470   major = opc->match >> (10 + 8 * (length - 2));
3471   if ((length == 2 && (major & 7) != 1 && (major & 6) != 2)
3472       || (length == 4 && (major & 7) != 0 && (major & 4) != 4))
3473     {
3474       as_bad (_("internal error: bad microMIPS opcode "
3475                 "(opcode/length mismatch): %s %s"), opc->name, opc->args);
3476       return 0;
3477     }
3478
3479   /* Shift piecewise to avoid an overflow where unsigned long is 32-bit.  */
3480   insn_bits = 1 << 4 * length;
3481   insn_bits <<= 4 * length;
3482   insn_bits -= 1;
3483   return validate_mips_insn (opc, insn_bits, decode_micromips_operand,
3484                              operands);
3485 }
3486
3487 /* This function is called once, at assembler startup time.  It should set up
3488    all the tables, etc. that the MD part of the assembler will need.  */
3489
3490 void
3491 md_begin (void)
3492 {
3493   const char *retval = NULL;
3494   int i = 0;
3495   int broken = 0;
3496
3497   if (mips_pic != NO_PIC)
3498     {
3499       if (g_switch_seen && g_switch_value != 0)
3500         as_bad (_("-G may not be used in position-independent code"));
3501       g_switch_value = 0;
3502     }
3503   else if (mips_abicalls)
3504     {
3505       if (g_switch_seen && g_switch_value != 0)
3506         as_bad (_("-G may not be used with abicalls"));
3507       g_switch_value = 0;
3508     }
3509
3510   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_opts.arch))
3511     as_warn (_("could not set architecture and machine"));
3512
3513   op_hash = hash_new ();
3514
3515   mips_operands = XCNEWVEC (struct mips_operand_array, NUMOPCODES);
3516   for (i = 0; i < NUMOPCODES;)
3517     {
3518       const char *name = mips_opcodes[i].name;
3519
3520       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
3521       if (retval != NULL)
3522         {
3523           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
3524                    mips_opcodes[i].name, retval);
3525           /* Probably a memory allocation problem?  Give up now.  */
3526           as_fatal (_("broken assembler, no assembly attempted"));
3527         }
3528       do
3529         {
3530           if (!validate_mips_insn (&mips_opcodes[i], 0xffffffff,
3531                                    decode_mips_operand, &mips_operands[i]))
3532             broken = 1;
3533           if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
3534             {
3535               create_insn (&nop_insn, mips_opcodes + i);
3536               if (mips_fix_loongson2f_nop)
3537                 nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
3538               nop_insn.fixed_p = 1;
3539             }
3540           ++i;
3541         }
3542       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
3543     }
3544
3545   mips16_op_hash = hash_new ();
3546   mips16_operands = XCNEWVEC (struct mips_operand_array,
3547                               bfd_mips16_num_opcodes);
3548
3549   i = 0;
3550   while (i < bfd_mips16_num_opcodes)
3551     {
3552       const char *name = mips16_opcodes[i].name;
3553
3554       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
3555       if (retval != NULL)
3556         as_fatal (_("internal: can't hash `%s': %s"),
3557                   mips16_opcodes[i].name, retval);
3558       do
3559         {
3560           if (!validate_mips16_insn (&mips16_opcodes[i], &mips16_operands[i]))
3561             broken = 1;
3562           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
3563             {
3564               create_insn (&mips16_nop_insn, mips16_opcodes + i);
3565               mips16_nop_insn.fixed_p = 1;
3566             }
3567           ++i;
3568         }
3569       while (i < bfd_mips16_num_opcodes
3570              && strcmp (mips16_opcodes[i].name, name) == 0);
3571     }
3572
3573   micromips_op_hash = hash_new ();
3574   micromips_operands = XCNEWVEC (struct mips_operand_array,
3575                                  bfd_micromips_num_opcodes);
3576
3577   i = 0;
3578   while (i < bfd_micromips_num_opcodes)
3579     {
3580       const char *name = micromips_opcodes[i].name;
3581
3582       retval = hash_insert (micromips_op_hash, name,
3583                             (void *) &micromips_opcodes[i]);
3584       if (retval != NULL)
3585         as_fatal (_("internal: can't hash `%s': %s"),
3586                   micromips_opcodes[i].name, retval);
3587       do
3588         {
3589           struct mips_cl_insn *micromips_nop_insn;
3590
3591           if (!validate_micromips_insn (&micromips_opcodes[i],
3592                                         &micromips_operands[i]))
3593             broken = 1;
3594
3595           if (micromips_opcodes[i].pinfo != INSN_MACRO)
3596             {
3597               if (micromips_insn_length (micromips_opcodes + i) == 2)
3598                 micromips_nop_insn = &micromips_nop16_insn;
3599               else if (micromips_insn_length (micromips_opcodes + i) == 4)
3600                 micromips_nop_insn = &micromips_nop32_insn;
3601               else
3602                 continue;
3603
3604               if (micromips_nop_insn->insn_mo == NULL
3605                   && strcmp (name, "nop") == 0)
3606                 {
3607                   create_insn (micromips_nop_insn, micromips_opcodes + i);
3608                   micromips_nop_insn->fixed_p = 1;
3609                 }
3610             }
3611         }
3612       while (++i < bfd_micromips_num_opcodes
3613              && strcmp (micromips_opcodes[i].name, name) == 0);
3614     }
3615
3616   if (broken)
3617     as_fatal (_("broken assembler, no assembly attempted"));
3618
3619   /* We add all the general register names to the symbol table.  This
3620      helps us detect invalid uses of them.  */
3621   for (i = 0; reg_names[i].name; i++)
3622     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
3623                                      reg_names[i].num, /* & RNUM_MASK, */
3624                                      &zero_address_frag));
3625   if (HAVE_NEWABI)
3626     for (i = 0; reg_names_n32n64[i].name; i++)
3627       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
3628                                        reg_names_n32n64[i].num, /* & RNUM_MASK, */
3629                                        &zero_address_frag));
3630   else
3631     for (i = 0; reg_names_o32[i].name; i++)
3632       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
3633                                        reg_names_o32[i].num, /* & RNUM_MASK, */
3634                                        &zero_address_frag));
3635
3636   for (i = 0; i < 32; i++)
3637     {
3638       char regname[6];
3639
3640       /* R5900 VU0 floating-point register.  */
3641       sprintf (regname, "$vf%d", i);
3642       symbol_table_insert (symbol_new (regname, reg_section,
3643                                        RTYPE_VF | i, &zero_address_frag));
3644
3645       /* R5900 VU0 integer register.  */
3646       sprintf (regname, "$vi%d", i);
3647       symbol_table_insert (symbol_new (regname, reg_section,
3648                                        RTYPE_VI | i, &zero_address_frag));
3649
3650       /* MSA register.  */
3651       sprintf (regname, "$w%d", i);
3652       symbol_table_insert (symbol_new (regname, reg_section,
3653                                        RTYPE_MSA | i, &zero_address_frag));
3654     }
3655
3656   obstack_init (&mips_operand_tokens);
3657
3658   mips_no_prev_insn ();
3659
3660   mips_gprmask = 0;
3661   mips_cprmask[0] = 0;
3662   mips_cprmask[1] = 0;
3663   mips_cprmask[2] = 0;
3664   mips_cprmask[3] = 0;
3665
3666   /* set the default alignment for the text section (2**2) */
3667   record_alignment (text_section, 2);
3668
3669   bfd_set_gp_size (stdoutput, g_switch_value);
3670
3671   /* On a native system other than VxWorks, sections must be aligned
3672      to 16 byte boundaries.  When configured for an embedded ELF
3673      target, we don't bother.  */
3674   if (strncmp (TARGET_OS, "elf", 3) != 0
3675       && strncmp (TARGET_OS, "vxworks", 7) != 0)
3676     {
3677       (void) bfd_set_section_alignment (stdoutput, text_section, 4);
3678       (void) bfd_set_section_alignment (stdoutput, data_section, 4);
3679       (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
3680     }
3681
3682   /* Create a .reginfo section for register masks and a .mdebug
3683      section for debugging information.  */
3684   {
3685     segT seg;
3686     subsegT subseg;
3687     flagword flags;
3688     segT sec;
3689
3690     seg = now_seg;
3691     subseg = now_subseg;
3692
3693     /* The ABI says this section should be loaded so that the
3694        running program can access it.  However, we don't load it
3695        if we are configured for an embedded target */
3696     flags = SEC_READONLY | SEC_DATA;
3697     if (strncmp (TARGET_OS, "elf", 3) != 0)
3698       flags |= SEC_ALLOC | SEC_LOAD;
3699
3700     if (mips_abi != N64_ABI)
3701       {
3702         sec = subseg_new (".reginfo", (subsegT) 0);
3703
3704         bfd_set_section_flags (stdoutput, sec, flags);
3705         bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
3706
3707         mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
3708       }
3709     else
3710       {
3711         /* The 64-bit ABI uses a .MIPS.options section rather than
3712            .reginfo section.  */
3713         sec = subseg_new (".MIPS.options", (subsegT) 0);
3714         bfd_set_section_flags (stdoutput, sec, flags);
3715         bfd_set_section_alignment (stdoutput, sec, 3);
3716
3717         /* Set up the option header.  */
3718         {
3719           Elf_Internal_Options opthdr;
3720           char *f;
3721
3722           opthdr.kind = ODK_REGINFO;
3723           opthdr.size = (sizeof (Elf_External_Options)
3724                          + sizeof (Elf64_External_RegInfo));
3725           opthdr.section = 0;
3726           opthdr.info = 0;
3727           f = frag_more (sizeof (Elf_External_Options));
3728           bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
3729                                          (Elf_External_Options *) f);
3730
3731           mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
3732         }
3733       }
3734
3735     sec = subseg_new (".MIPS.abiflags", (subsegT) 0);
3736     bfd_set_section_flags (stdoutput, sec,
3737                            SEC_READONLY | SEC_DATA | SEC_ALLOC | SEC_LOAD);
3738     bfd_set_section_alignment (stdoutput, sec, 3);
3739     mips_flags_frag = frag_more (sizeof (Elf_External_ABIFlags_v0));
3740
3741     if (ECOFF_DEBUGGING)
3742       {
3743         sec = subseg_new (".mdebug", (subsegT) 0);
3744         (void) bfd_set_section_flags (stdoutput, sec,
3745                                       SEC_HAS_CONTENTS | SEC_READONLY);
3746         (void) bfd_set_section_alignment (stdoutput, sec, 2);
3747       }
3748     else if (mips_flag_pdr)
3749       {
3750         pdr_seg = subseg_new (".pdr", (subsegT) 0);
3751         (void) bfd_set_section_flags (stdoutput, pdr_seg,
3752                                       SEC_READONLY | SEC_RELOC
3753                                       | SEC_DEBUGGING);
3754         (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
3755       }
3756
3757     subseg_set (seg, subseg);
3758   }
3759
3760   if (mips_fix_vr4120)
3761     init_vr4120_conflicts ();
3762 }
3763
3764 static inline void
3765 fpabi_incompatible_with (int fpabi, const char *what)
3766 {
3767   as_warn (_(".gnu_attribute %d,%d is incompatible with `%s'"),
3768            Tag_GNU_MIPS_ABI_FP, fpabi, what);
3769 }
3770
3771 static inline void
3772 fpabi_requires (int fpabi, const char *what)
3773 {
3774   as_warn (_(".gnu_attribute %d,%d requires `%s'"),
3775            Tag_GNU_MIPS_ABI_FP, fpabi, what);
3776 }
3777
3778 /* Check -mabi and register sizes against the specified FP ABI.  */
3779 static void
3780 check_fpabi (int fpabi)
3781 {
3782   switch (fpabi)
3783     {
3784     case Val_GNU_MIPS_ABI_FP_DOUBLE:
3785       if (file_mips_opts.soft_float)
3786         fpabi_incompatible_with (fpabi, "softfloat");
3787       else if (file_mips_opts.single_float)
3788         fpabi_incompatible_with (fpabi, "singlefloat");
3789       if (file_mips_opts.gp == 64 && file_mips_opts.fp == 32)
3790         fpabi_incompatible_with (fpabi, "gp=64 fp=32");
3791       else if (file_mips_opts.gp == 32 && file_mips_opts.fp == 64)
3792         fpabi_incompatible_with (fpabi, "gp=32 fp=64");
3793       break;
3794
3795     case Val_GNU_MIPS_ABI_FP_XX:
3796       if (mips_abi != O32_ABI)
3797         fpabi_requires (fpabi, "-mabi=32");
3798       else if (file_mips_opts.soft_float)
3799         fpabi_incompatible_with (fpabi, "softfloat");
3800       else if (file_mips_opts.single_float)
3801         fpabi_incompatible_with (fpabi, "singlefloat");
3802       else if (file_mips_opts.fp != 0)
3803         fpabi_requires (fpabi, "fp=xx");
3804       break;
3805
3806     case Val_GNU_MIPS_ABI_FP_64A:
3807     case Val_GNU_MIPS_ABI_FP_64:
3808       if (mips_abi != O32_ABI)
3809         fpabi_requires (fpabi, "-mabi=32");
3810       else if (file_mips_opts.soft_float)
3811         fpabi_incompatible_with (fpabi, "softfloat");
3812       else if (file_mips_opts.single_float)
3813         fpabi_incompatible_with (fpabi, "singlefloat");
3814       else if (file_mips_opts.fp != 64)
3815         fpabi_requires (fpabi, "fp=64");
3816       else if (fpabi == Val_GNU_MIPS_ABI_FP_64 && !file_mips_opts.oddspreg)
3817         fpabi_incompatible_with (fpabi, "nooddspreg");
3818       else if (fpabi == Val_GNU_MIPS_ABI_FP_64A && file_mips_opts.oddspreg)
3819         fpabi_requires (fpabi, "nooddspreg");
3820       break;
3821
3822     case Val_GNU_MIPS_ABI_FP_SINGLE:
3823       if (file_mips_opts.soft_float)
3824         fpabi_incompatible_with (fpabi, "softfloat");
3825       else if (!file_mips_opts.single_float)
3826         fpabi_requires (fpabi, "singlefloat");
3827       break;
3828
3829     case Val_GNU_MIPS_ABI_FP_SOFT:
3830       if (!file_mips_opts.soft_float)
3831         fpabi_requires (fpabi, "softfloat");
3832       break;
3833
3834     case Val_GNU_MIPS_ABI_FP_OLD_64:
3835       as_warn (_(".gnu_attribute %d,%d is no longer supported"),
3836                Tag_GNU_MIPS_ABI_FP, fpabi);
3837       break;
3838
3839     case Val_GNU_MIPS_ABI_FP_NAN2008:
3840       /* Silently ignore compatibility value.  */
3841       break;
3842
3843     default:
3844       as_warn (_(".gnu_attribute %d,%d is not a recognized"
3845                  " floating-point ABI"), Tag_GNU_MIPS_ABI_FP, fpabi);
3846       break;
3847     }
3848 }
3849
3850 /* Perform consistency checks on the current options.  */
3851
3852 static void
3853 mips_check_options (struct mips_set_options *opts, bfd_boolean abi_checks)
3854 {
3855   /* Check the size of integer registers agrees with the ABI and ISA.  */
3856   if (opts->gp == 64 && !ISA_HAS_64BIT_REGS (opts->isa))
3857     as_bad (_("`gp=64' used with a 32-bit processor"));
3858   else if (abi_checks
3859            && opts->gp == 32 && ABI_NEEDS_64BIT_REGS (mips_abi))
3860     as_bad (_("`gp=32' used with a 64-bit ABI"));
3861   else if (abi_checks
3862            && opts->gp == 64 && ABI_NEEDS_32BIT_REGS (mips_abi))
3863     as_bad (_("`gp=64' used with a 32-bit ABI"));
3864
3865   /* Check the size of the float registers agrees with the ABI and ISA.  */
3866   switch (opts->fp)
3867     {
3868     case 0:
3869       if (!CPU_HAS_LDC1_SDC1 (opts->arch))
3870         as_bad (_("`fp=xx' used with a cpu lacking ldc1/sdc1 instructions"));
3871       else if (opts->single_float == 1)
3872         as_bad (_("`fp=xx' cannot be used with `singlefloat'"));
3873       break;
3874     case 64:
3875       if (!ISA_HAS_64BIT_FPRS (opts->isa))
3876         as_bad (_("`fp=64' used with a 32-bit fpu"));
3877       else if (abi_checks
3878                && ABI_NEEDS_32BIT_REGS (mips_abi)
3879                && !ISA_HAS_MXHC1 (opts->isa))
3880         as_warn (_("`fp=64' used with a 32-bit ABI"));
3881       break;
3882     case 32:
3883       if (abi_checks
3884           && ABI_NEEDS_64BIT_REGS (mips_abi))
3885         as_warn (_("`fp=32' used with a 64-bit ABI"));
3886       if (ISA_IS_R6 (opts->isa) && opts->single_float == 0)
3887         as_bad (_("`fp=32' used with a MIPS R6 cpu"));
3888       break;
3889     default:
3890       as_bad (_("Unknown size of floating point registers"));
3891       break;
3892     }
3893
3894   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !opts->oddspreg)
3895     as_bad (_("`nooddspreg` cannot be used with a 64-bit ABI"));
3896
3897   if (opts->micromips == 1 && opts->mips16 == 1)
3898     as_bad (_("`%s' cannot be used with `%s'"), "mips16", "micromips");
3899   else if (ISA_IS_R6 (opts->isa)
3900            && (opts->micromips == 1
3901                || opts->mips16 == 1))
3902     as_fatal (_("`%s' cannot be used with `%s'"),
3903               opts->micromips ? "micromips" : "mips16",
3904               mips_cpu_info_from_isa (opts->isa)->name);
3905
3906   if (ISA_IS_R6 (opts->isa) && mips_relax_branch)
3907     as_fatal (_("branch relaxation is not supported in `%s'"),
3908               mips_cpu_info_from_isa (opts->isa)->name);
3909 }
3910
3911 /* Perform consistency checks on the module level options exactly once.
3912    This is a deferred check that happens:
3913      at the first .set directive
3914      or, at the first pseudo op that generates code (inc .dc.a)
3915      or, at the first instruction
3916      or, at the end.  */
3917
3918 static void
3919 file_mips_check_options (void)
3920 {
3921   const struct mips_cpu_info *arch_info = 0;
3922
3923   if (file_mips_opts_checked)
3924     return;
3925
3926   /* The following code determines the register size.
3927      Similar code was added to GCC 3.3 (see override_options() in
3928      config/mips/mips.c).  The GAS and GCC code should be kept in sync
3929      as much as possible.  */
3930
3931   if (file_mips_opts.gp < 0)
3932     {
3933       /* Infer the integer register size from the ABI and processor.
3934          Restrict ourselves to 32-bit registers if that's all the
3935          processor has, or if the ABI cannot handle 64-bit registers.  */
3936       file_mips_opts.gp = (ABI_NEEDS_32BIT_REGS (mips_abi)
3937                            || !ISA_HAS_64BIT_REGS (file_mips_opts.isa))
3938                           ? 32 : 64;
3939     }
3940
3941   if (file_mips_opts.fp < 0)
3942     {
3943       /* No user specified float register size.
3944          ??? GAS treats single-float processors as though they had 64-bit
3945          float registers (although it complains when double-precision
3946          instructions are used).  As things stand, saying they have 32-bit
3947          registers would lead to spurious "register must be even" messages.
3948          So here we assume float registers are never smaller than the
3949          integer ones.  */
3950       if (file_mips_opts.gp == 64)
3951         /* 64-bit integer registers implies 64-bit float registers.  */
3952         file_mips_opts.fp = 64;
3953       else if ((file_mips_opts.ase & FP64_ASES)
3954                && ISA_HAS_64BIT_FPRS (file_mips_opts.isa))
3955         /* Handle ASEs that require 64-bit float registers, if possible.  */
3956         file_mips_opts.fp = 64;
3957       else if (ISA_IS_R6 (mips_opts.isa))
3958         /* R6 implies 64-bit float registers.  */
3959         file_mips_opts.fp = 64;
3960       else
3961         /* 32-bit float registers.  */
3962         file_mips_opts.fp = 32;
3963     }
3964
3965   arch_info = mips_cpu_info_from_arch (file_mips_opts.arch);
3966
3967   /* Disable operations on odd-numbered floating-point registers by default
3968      when using the FPXX ABI.  */
3969   if (file_mips_opts.oddspreg < 0)
3970     {
3971       if (file_mips_opts.fp == 0)
3972         file_mips_opts.oddspreg = 0;
3973       else
3974         file_mips_opts.oddspreg = 1;
3975     }
3976
3977   /* End of GCC-shared inference code.  */
3978
3979   /* This flag is set when we have a 64-bit capable CPU but use only
3980      32-bit wide registers.  Note that EABI does not use it.  */
3981   if (ISA_HAS_64BIT_REGS (file_mips_opts.isa)
3982       && ((mips_abi == NO_ABI && file_mips_opts.gp == 32)
3983           || mips_abi == O32_ABI))
3984     mips_32bitmode = 1;
3985
3986   if (file_mips_opts.isa == ISA_MIPS1 && mips_trap)
3987     as_bad (_("trap exception not supported at ISA 1"));
3988
3989   /* If the selected architecture includes support for ASEs, enable
3990      generation of code for them.  */
3991   if (file_mips_opts.mips16 == -1)
3992     file_mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_opts.arch)) ? 1 : 0;
3993   if (file_mips_opts.micromips == -1)
3994     file_mips_opts.micromips = (CPU_HAS_MICROMIPS (file_mips_opts.arch))
3995                                 ? 1 : 0;
3996
3997   if (mips_nan2008 == -1)
3998     mips_nan2008 = (ISA_HAS_LEGACY_NAN (file_mips_opts.isa)) ? 0 : 1;
3999   else if (!ISA_HAS_LEGACY_NAN (file_mips_opts.isa) && mips_nan2008 == 0)
4000     as_fatal (_("`%s' does not support legacy NaN"),
4001               mips_cpu_info_from_arch (file_mips_opts.arch)->name);
4002
4003   /* Some ASEs require 64-bit FPRs, so -mfp32 should stop those ASEs from
4004      being selected implicitly.  */
4005   if (file_mips_opts.fp != 64)
4006     file_ase_explicit |= ASE_MIPS3D | ASE_MDMX | ASE_MSA;
4007
4008   /* If the user didn't explicitly select or deselect a particular ASE,
4009      use the default setting for the CPU.  */
4010   file_mips_opts.ase |= (arch_info->ase & ~file_ase_explicit);
4011
4012   /* Set up the current options.  These may change throughout assembly.  */
4013   mips_opts = file_mips_opts;
4014
4015   mips_check_isa_supports_ases ();
4016   mips_check_options (&file_mips_opts, TRUE);
4017   file_mips_opts_checked = TRUE;
4018
4019   if (!bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_opts.arch))
4020     as_warn (_("could not set architecture and machine"));
4021 }
4022
4023 void
4024 md_assemble (char *str)
4025 {
4026   struct mips_cl_insn insn;
4027   bfd_reloc_code_real_type unused_reloc[3]
4028     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
4029
4030   file_mips_check_options ();
4031
4032   imm_expr.X_op = O_absent;
4033   offset_expr.X_op = O_absent;
4034   offset_reloc[0] = BFD_RELOC_UNUSED;
4035   offset_reloc[1] = BFD_RELOC_UNUSED;
4036   offset_reloc[2] = BFD_RELOC_UNUSED;
4037
4038   mips_mark_labels ();
4039   mips_assembling_insn = TRUE;
4040   clear_insn_error ();
4041
4042   if (mips_opts.mips16)
4043     mips16_ip (str, &insn);
4044   else
4045     {
4046       mips_ip (str, &insn);
4047       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
4048             str, insn.insn_opcode));
4049     }
4050
4051   if (insn_error.msg)
4052     report_insn_error (str);
4053   else if (insn.insn_mo->pinfo == INSN_MACRO)
4054     {
4055       macro_start ();
4056       if (mips_opts.mips16)
4057         mips16_macro (&insn);
4058       else
4059         macro (&insn, str);
4060       macro_end ();
4061     }
4062   else
4063     {
4064       if (offset_expr.X_op != O_absent)
4065         append_insn (&insn, &offset_expr, offset_reloc, FALSE);
4066       else
4067         append_insn (&insn, NULL, unused_reloc, FALSE);
4068     }
4069
4070   mips_assembling_insn = FALSE;
4071 }
4072
4073 /* Convenience functions for abstracting away the differences between
4074    MIPS16 and non-MIPS16 relocations.  */
4075
4076 static inline bfd_boolean
4077 mips16_reloc_p (bfd_reloc_code_real_type reloc)
4078 {
4079   switch (reloc)
4080     {
4081     case BFD_RELOC_MIPS16_JMP:
4082     case BFD_RELOC_MIPS16_GPREL:
4083     case BFD_RELOC_MIPS16_GOT16:
4084     case BFD_RELOC_MIPS16_CALL16:
4085     case BFD_RELOC_MIPS16_HI16_S:
4086     case BFD_RELOC_MIPS16_HI16:
4087     case BFD_RELOC_MIPS16_LO16:
4088     case BFD_RELOC_MIPS16_16_PCREL_S1:
4089       return TRUE;
4090
4091     default:
4092       return FALSE;
4093     }
4094 }
4095
4096 static inline bfd_boolean
4097 micromips_reloc_p (bfd_reloc_code_real_type reloc)
4098 {
4099   switch (reloc)
4100     {
4101     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
4102     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
4103     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
4104     case BFD_RELOC_MICROMIPS_GPREL16:
4105     case BFD_RELOC_MICROMIPS_JMP:
4106     case BFD_RELOC_MICROMIPS_HI16:
4107     case BFD_RELOC_MICROMIPS_HI16_S:
4108     case BFD_RELOC_MICROMIPS_LO16:
4109     case BFD_RELOC_MICROMIPS_LITERAL:
4110     case BFD_RELOC_MICROMIPS_GOT16:
4111     case BFD_RELOC_MICROMIPS_CALL16:
4112     case BFD_RELOC_MICROMIPS_GOT_HI16:
4113     case BFD_RELOC_MICROMIPS_GOT_LO16:
4114     case BFD_RELOC_MICROMIPS_CALL_HI16:
4115     case BFD_RELOC_MICROMIPS_CALL_LO16:
4116     case BFD_RELOC_MICROMIPS_SUB:
4117     case BFD_RELOC_MICROMIPS_GOT_PAGE:
4118     case BFD_RELOC_MICROMIPS_GOT_OFST:
4119     case BFD_RELOC_MICROMIPS_GOT_DISP:
4120     case BFD_RELOC_MICROMIPS_HIGHEST:
4121     case BFD_RELOC_MICROMIPS_HIGHER:
4122     case BFD_RELOC_MICROMIPS_SCN_DISP:
4123     case BFD_RELOC_MICROMIPS_JALR:
4124       return TRUE;
4125
4126     default:
4127       return FALSE;
4128     }
4129 }
4130
4131 static inline bfd_boolean
4132 jmp_reloc_p (bfd_reloc_code_real_type reloc)
4133 {
4134   return reloc == BFD_RELOC_MIPS_JMP || reloc == BFD_RELOC_MICROMIPS_JMP;
4135 }
4136
4137 static inline bfd_boolean
4138 b_reloc_p (bfd_reloc_code_real_type reloc)
4139 {
4140   return (reloc == BFD_RELOC_MIPS_26_PCREL_S2
4141           || reloc == BFD_RELOC_MIPS_21_PCREL_S2
4142           || reloc == BFD_RELOC_16_PCREL_S2
4143           || reloc == BFD_RELOC_MIPS16_16_PCREL_S1
4144           || reloc == BFD_RELOC_MICROMIPS_16_PCREL_S1
4145           || reloc == BFD_RELOC_MICROMIPS_10_PCREL_S1
4146           || reloc == BFD_RELOC_MICROMIPS_7_PCREL_S1);
4147 }
4148
4149 static inline bfd_boolean
4150 got16_reloc_p (bfd_reloc_code_real_type reloc)
4151 {
4152   return (reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16
4153           || reloc == BFD_RELOC_MICROMIPS_GOT16);
4154 }
4155
4156 static inline bfd_boolean
4157 hi16_reloc_p (bfd_reloc_code_real_type reloc)
4158 {
4159   return (reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S
4160           || reloc == BFD_RELOC_MICROMIPS_HI16_S);
4161 }
4162
4163 static inline bfd_boolean
4164 lo16_reloc_p (bfd_reloc_code_real_type reloc)
4165 {
4166   return (reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16
4167           || reloc == BFD_RELOC_MICROMIPS_LO16);
4168 }
4169
4170 static inline bfd_boolean
4171 jalr_reloc_p (bfd_reloc_code_real_type reloc)
4172 {
4173   return reloc == BFD_RELOC_MIPS_JALR || reloc == BFD_RELOC_MICROMIPS_JALR;
4174 }
4175
4176 static inline bfd_boolean
4177 gprel16_reloc_p (bfd_reloc_code_real_type reloc)
4178 {
4179   return (reloc == BFD_RELOC_GPREL16 || reloc == BFD_RELOC_MIPS16_GPREL
4180           || reloc == BFD_RELOC_MICROMIPS_GPREL16);
4181 }
4182
4183 /* Return true if RELOC is a PC-relative relocation that does not have
4184    full address range.  */
4185
4186 static inline bfd_boolean
4187 limited_pcrel_reloc_p (bfd_reloc_code_real_type reloc)
4188 {
4189   switch (reloc)
4190     {
4191     case BFD_RELOC_16_PCREL_S2:
4192     case BFD_RELOC_MIPS16_16_PCREL_S1:
4193     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
4194     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
4195     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
4196     case BFD_RELOC_MIPS_21_PCREL_S2:
4197     case BFD_RELOC_MIPS_26_PCREL_S2:
4198     case BFD_RELOC_MIPS_18_PCREL_S3:
4199     case BFD_RELOC_MIPS_19_PCREL_S2:
4200       return TRUE;
4201
4202     case BFD_RELOC_32_PCREL:
4203     case BFD_RELOC_HI16_S_PCREL:
4204     case BFD_RELOC_LO16_PCREL:
4205       return HAVE_64BIT_ADDRESSES;
4206
4207     default:
4208       return FALSE;
4209     }
4210 }
4211
4212 /* Return true if the given relocation might need a matching %lo().
4213    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
4214    need a matching %lo() when applied to local symbols.  */
4215
4216 static inline bfd_boolean
4217 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
4218 {
4219   return (HAVE_IN_PLACE_ADDENDS
4220           && (hi16_reloc_p (reloc)
4221               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
4222                  all GOT16 relocations evaluate to "G".  */
4223               || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
4224 }
4225
4226 /* Return the type of %lo() reloc needed by RELOC, given that
4227    reloc_needs_lo_p.  */
4228
4229 static inline bfd_reloc_code_real_type
4230 matching_lo_reloc (bfd_reloc_code_real_type reloc)
4231 {
4232   return (mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16
4233           : (micromips_reloc_p (reloc) ? BFD_RELOC_MICROMIPS_LO16
4234              : BFD_RELOC_LO16));
4235 }
4236
4237 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
4238    relocation.  */
4239
4240 static inline bfd_boolean
4241 fixup_has_matching_lo_p (fixS *fixp)
4242 {
4243   return (fixp->fx_next != NULL
4244           && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
4245           && fixp->fx_addsy == fixp->fx_next->fx_addsy
4246           && fixp->fx_offset == fixp->fx_next->fx_offset);
4247 }
4248
4249 /* Move all labels in LABELS to the current insertion point.  TEXT_P
4250    says whether the labels refer to text or data.  */
4251
4252 static void
4253 mips_move_labels (struct insn_label_list *labels, bfd_boolean text_p)
4254 {
4255   struct insn_label_list *l;
4256   valueT val;
4257
4258   for (l = labels; l != NULL; l = l->next)
4259     {
4260       gas_assert (S_GET_SEGMENT (l->label) == now_seg);
4261       symbol_set_frag (l->label, frag_now);
4262       val = (valueT) frag_now_fix ();
4263       /* MIPS16/microMIPS text labels are stored as odd.  */
4264       if (text_p && HAVE_CODE_COMPRESSION)
4265         ++val;
4266       S_SET_VALUE (l->label, val);
4267     }
4268 }
4269
4270 /* Move all labels in insn_labels to the current insertion point
4271    and treat them as text labels.  */
4272
4273 static void
4274 mips_move_text_labels (void)
4275 {
4276   mips_move_labels (seg_info (now_seg)->label_list, TRUE);
4277 }
4278
4279 /* Duplicate the test for LINK_ONCE sections as in `adjust_reloc_syms'.  */
4280
4281 static bfd_boolean
4282 s_is_linkonce (symbolS *sym, segT from_seg)
4283 {
4284   bfd_boolean linkonce = FALSE;
4285   segT symseg = S_GET_SEGMENT (sym);
4286
4287   if (symseg != from_seg && !S_IS_LOCAL (sym))
4288     {
4289       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
4290         linkonce = TRUE;
4291       /* The GNU toolchain uses an extension for ELF: a section
4292          beginning with the magic string .gnu.linkonce is a
4293          linkonce section.  */
4294       if (strncmp (segment_name (symseg), ".gnu.linkonce",
4295                    sizeof ".gnu.linkonce" - 1) == 0)
4296         linkonce = TRUE;
4297     }
4298   return linkonce;
4299 }
4300
4301 /* Mark MIPS16 or microMIPS instruction label LABEL.  This permits the
4302    linker to handle them specially, such as generating jalx instructions
4303    when needed.  We also make them odd for the duration of the assembly,
4304    in order to generate the right sort of code.  We will make them even
4305    in the adjust_symtab routine, while leaving them marked.  This is
4306    convenient for the debugger and the disassembler.  The linker knows
4307    to make them odd again.  */
4308
4309 static void
4310 mips_compressed_mark_label (symbolS *label)
4311 {
4312   gas_assert (HAVE_CODE_COMPRESSION);
4313
4314   if (mips_opts.mips16)
4315     S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
4316   else
4317     S_SET_OTHER (label, ELF_ST_SET_MICROMIPS (S_GET_OTHER (label)));
4318   if ((S_GET_VALUE (label) & 1) == 0
4319       /* Don't adjust the address if the label is global or weak, or
4320          in a link-once section, since we'll be emitting symbol reloc
4321          references to it which will be patched up by the linker, and
4322          the final value of the symbol may or may not be MIPS16/microMIPS.  */
4323       && !S_IS_WEAK (label)
4324       && !S_IS_EXTERNAL (label)
4325       && !s_is_linkonce (label, now_seg))
4326     S_SET_VALUE (label, S_GET_VALUE (label) | 1);
4327 }
4328
4329 /* Mark preceding MIPS16 or microMIPS instruction labels.  */
4330
4331 static void
4332 mips_compressed_mark_labels (void)
4333 {
4334   struct insn_label_list *l;
4335
4336   for (l = seg_info (now_seg)->label_list; l != NULL; l = l->next)
4337     mips_compressed_mark_label (l->label);
4338 }
4339
4340 /* End the current frag.  Make it a variant frag and record the
4341    relaxation info.  */
4342
4343 static void
4344 relax_close_frag (void)
4345 {
4346   mips_macro_warning.first_frag = frag_now;
4347   frag_var (rs_machine_dependent, 0, 0,
4348             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
4349             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
4350
4351   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
4352   mips_relax.first_fixup = 0;
4353 }
4354
4355 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
4356    See the comment above RELAX_ENCODE for more details.  */
4357
4358 static void
4359 relax_start (symbolS *symbol)
4360 {
4361   gas_assert (mips_relax.sequence == 0);
4362   mips_relax.sequence = 1;
4363   mips_relax.symbol = symbol;
4364 }
4365
4366 /* Start generating the second version of a relaxable sequence.
4367    See the comment above RELAX_ENCODE for more details.  */
4368
4369 static void
4370 relax_switch (void)
4371 {
4372   gas_assert (mips_relax.sequence == 1);
4373   mips_relax.sequence = 2;
4374 }
4375
4376 /* End the current relaxable sequence.  */
4377
4378 static void
4379 relax_end (void)
4380 {
4381   gas_assert (mips_relax.sequence == 2);
4382   relax_close_frag ();
4383   mips_relax.sequence = 0;
4384 }
4385
4386 /* Return true if IP is a delayed branch or jump.  */
4387
4388 static inline bfd_boolean
4389 delayed_branch_p (const struct mips_cl_insn *ip)
4390 {
4391   return (ip->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
4392                                 | INSN_COND_BRANCH_DELAY
4393                                 | INSN_COND_BRANCH_LIKELY)) != 0;
4394 }
4395
4396 /* Return true if IP is a compact branch or jump.  */
4397
4398 static inline bfd_boolean
4399 compact_branch_p (const struct mips_cl_insn *ip)
4400 {
4401   return (ip->insn_mo->pinfo2 & (INSN2_UNCOND_BRANCH
4402                                  | INSN2_COND_BRANCH)) != 0;
4403 }
4404
4405 /* Return true if IP is an unconditional branch or jump.  */
4406
4407 static inline bfd_boolean
4408 uncond_branch_p (const struct mips_cl_insn *ip)
4409 {
4410   return ((ip->insn_mo->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0
4411           || (ip->insn_mo->pinfo2 & INSN2_UNCOND_BRANCH) != 0);
4412 }
4413
4414 /* Return true if IP is a branch-likely instruction.  */
4415
4416 static inline bfd_boolean
4417 branch_likely_p (const struct mips_cl_insn *ip)
4418 {
4419   return (ip->insn_mo->pinfo & INSN_COND_BRANCH_LIKELY) != 0;
4420 }
4421
4422 /* Return the type of nop that should be used to fill the delay slot
4423    of delayed branch IP.  */
4424
4425 static struct mips_cl_insn *
4426 get_delay_slot_nop (const struct mips_cl_insn *ip)
4427 {
4428   if (mips_opts.micromips
4429       && (ip->insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
4430     return &micromips_nop32_insn;
4431   return NOP_INSN;
4432 }
4433
4434 /* Return a mask that has bit N set if OPCODE reads the register(s)
4435    in operand N.  */
4436
4437 static unsigned int
4438 insn_read_mask (const struct mips_opcode *opcode)
4439 {
4440   return (opcode->pinfo & INSN_READ_ALL) >> INSN_READ_SHIFT;
4441 }
4442
4443 /* Return a mask that has bit N set if OPCODE writes to the register(s)
4444    in operand N.  */
4445
4446 static unsigned int
4447 insn_write_mask (const struct mips_opcode *opcode)
4448 {
4449   return (opcode->pinfo & INSN_WRITE_ALL) >> INSN_WRITE_SHIFT;
4450 }
4451
4452 /* Return a mask of the registers specified by operand OPERAND of INSN.
4453    Ignore registers of type OP_REG_<t> unless bit OP_REG_<t> of TYPE_MASK
4454    is set.  */
4455
4456 static unsigned int
4457 operand_reg_mask (const struct mips_cl_insn *insn,
4458                   const struct mips_operand *operand,
4459                   unsigned int type_mask)
4460 {
4461   unsigned int uval, vsel;
4462
4463   switch (operand->type)
4464     {
4465     case OP_INT:
4466     case OP_MAPPED_INT:
4467     case OP_MSB:
4468     case OP_PCREL:
4469     case OP_PERF_REG:
4470     case OP_ADDIUSP_INT:
4471     case OP_ENTRY_EXIT_LIST:
4472     case OP_REPEAT_DEST_REG:
4473     case OP_REPEAT_PREV_REG:
4474     case OP_PC:
4475     case OP_VU0_SUFFIX:
4476     case OP_VU0_MATCH_SUFFIX:
4477     case OP_IMM_INDEX:
4478       abort ();
4479
4480     case OP_REG:
4481     case OP_OPTIONAL_REG:
4482       {
4483         const struct mips_reg_operand *reg_op;
4484
4485         reg_op = (const struct mips_reg_operand *) operand;
4486         if (!(type_mask & (1 << reg_op->reg_type)))
4487           return 0;
4488         uval = insn_extract_operand (insn, operand);
4489         return 1 << mips_decode_reg_operand (reg_op, uval);
4490       }
4491
4492     case OP_REG_PAIR:
4493       {
4494         const struct mips_reg_pair_operand *pair_op;
4495
4496         pair_op = (const struct mips_reg_pair_operand *) operand;
4497         if (!(type_mask & (1 << pair_op->reg_type)))
4498           return 0;
4499         uval = insn_extract_operand (insn, operand);
4500         return (1 << pair_op->reg1_map[uval]) | (1 << pair_op->reg2_map[uval]);
4501       }
4502
4503     case OP_CLO_CLZ_DEST:
4504       if (!(type_mask & (1 << OP_REG_GP)))
4505         return 0;
4506       uval = insn_extract_operand (insn, operand);
4507       return (1 << (uval & 31)) | (1 << (uval >> 5));
4508
4509     case OP_SAME_RS_RT:
4510       if (!(type_mask & (1 << OP_REG_GP)))
4511         return 0;
4512       uval = insn_extract_operand (insn, operand);
4513       gas_assert ((uval & 31) == (uval >> 5));
4514       return 1 << (uval & 31);
4515
4516     case OP_CHECK_PREV:
4517     case OP_NON_ZERO_REG:
4518       if (!(type_mask & (1 << OP_REG_GP)))
4519         return 0;
4520       uval = insn_extract_operand (insn, operand);
4521       return 1 << (uval & 31);
4522
4523     case OP_LWM_SWM_LIST:
4524       abort ();
4525
4526     case OP_SAVE_RESTORE_LIST:
4527       abort ();
4528
4529     case OP_MDMX_IMM_REG:
4530       if (!(type_mask & (1 << OP_REG_VEC)))
4531         return 0;
4532       uval = insn_extract_operand (insn, operand);
4533       vsel = uval >> 5;
4534       if ((vsel & 0x18) == 0x18)
4535         return 0;
4536       return 1 << (uval & 31);
4537
4538     case OP_REG_INDEX:
4539       if (!(type_mask & (1 << OP_REG_GP)))
4540         return 0;
4541       return 1 << insn_extract_operand (insn, operand);
4542     }
4543   abort ();
4544 }
4545
4546 /* Return a mask of the registers specified by operands OPNO_MASK of INSN,
4547    where bit N of OPNO_MASK is set if operand N should be included.
4548    Ignore registers of type OP_REG_<t> unless bit OP_REG_<t> of TYPE_MASK
4549    is set.  */
4550
4551 static unsigned int
4552 insn_reg_mask (const struct mips_cl_insn *insn,
4553                unsigned int type_mask, unsigned int opno_mask)
4554 {
4555   unsigned int opno, reg_mask;
4556
4557   opno = 0;
4558   reg_mask = 0;
4559   while (opno_mask != 0)
4560     {
4561       if (opno_mask & 1)
4562         reg_mask |= operand_reg_mask (insn, insn_opno (insn, opno), type_mask);
4563       opno_mask >>= 1;
4564       opno += 1;
4565     }
4566   return reg_mask;
4567 }
4568
4569 /* Return the mask of core registers that IP reads.  */
4570
4571 static unsigned int
4572 gpr_read_mask (const struct mips_cl_insn *ip)
4573 {
4574   unsigned long pinfo, pinfo2;
4575   unsigned int mask;
4576
4577   mask = insn_reg_mask (ip, 1 << OP_REG_GP, insn_read_mask (ip->insn_mo));
4578   pinfo = ip->insn_mo->pinfo;
4579   pinfo2 = ip->insn_mo->pinfo2;
4580   if (pinfo & INSN_UDI)
4581     {
4582       /* UDI instructions have traditionally been assumed to read RS
4583          and RT.  */
4584       mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
4585       mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
4586     }
4587   if (pinfo & INSN_READ_GPR_24)
4588     mask |= 1 << 24;
4589   if (pinfo2 & INSN2_READ_GPR_16)
4590     mask |= 1 << 16;
4591   if (pinfo2 & INSN2_READ_SP)
4592     mask |= 1 << SP;
4593   if (pinfo2 & INSN2_READ_GPR_31)
4594     mask |= 1 << 31;
4595   /* Don't include register 0.  */
4596   return mask & ~1;
4597 }
4598
4599 /* Return the mask of core registers that IP writes.  */
4600
4601 static unsigned int
4602 gpr_write_mask (const struct mips_cl_insn *ip)
4603 {
4604   unsigned long pinfo, pinfo2;
4605   unsigned int mask;
4606
4607   mask = insn_reg_mask (ip, 1 << OP_REG_GP, insn_write_mask (ip->insn_mo));
4608   pinfo = ip->insn_mo->pinfo;
4609   pinfo2 = ip->insn_mo->pinfo2;
4610   if (pinfo & INSN_WRITE_GPR_24)
4611     mask |= 1 << 24;
4612   if (pinfo & INSN_WRITE_GPR_31)
4613     mask |= 1 << 31;
4614   if (pinfo & INSN_UDI)
4615     /* UDI instructions have traditionally been assumed to write to RD.  */
4616     mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
4617   if (pinfo2 & INSN2_WRITE_SP)
4618     mask |= 1 << SP;
4619   /* Don't include register 0.  */
4620   return mask & ~1;
4621 }
4622
4623 /* Return the mask of floating-point registers that IP reads.  */
4624
4625 static unsigned int
4626 fpr_read_mask (const struct mips_cl_insn *ip)
4627 {
4628   unsigned long pinfo;
4629   unsigned int mask;
4630
4631   mask = insn_reg_mask (ip, ((1 << OP_REG_FP) | (1 << OP_REG_VEC)
4632                              | (1 << OP_REG_MSA)),
4633                         insn_read_mask (ip->insn_mo));
4634   pinfo = ip->insn_mo->pinfo;
4635   /* Conservatively treat all operands to an FP_D instruction are doubles.
4636      (This is overly pessimistic for things like cvt.d.s.)  */
4637   if (FPR_SIZE != 64 && (pinfo & FP_D))
4638     mask |= mask << 1;
4639   return mask;
4640 }
4641
4642 /* Return the mask of floating-point registers that IP writes.  */
4643
4644 static unsigned int
4645 fpr_write_mask (const struct mips_cl_insn *ip)
4646 {
4647   unsigned long pinfo;
4648   unsigned int mask;
4649
4650   mask = insn_reg_mask (ip, ((1 << OP_REG_FP) | (1 << OP_REG_VEC)
4651                              | (1 << OP_REG_MSA)),
4652                         insn_write_mask (ip->insn_mo));
4653   pinfo = ip->insn_mo->pinfo;
4654   /* Conservatively treat all operands to an FP_D instruction are doubles.
4655      (This is overly pessimistic for things like cvt.s.d.)  */
4656   if (FPR_SIZE != 64 && (pinfo & FP_D))
4657     mask |= mask << 1;
4658   return mask;
4659 }
4660
4661 /* Operand OPNUM of INSN is an odd-numbered floating-point register.
4662    Check whether that is allowed.  */
4663
4664 static bfd_boolean
4665 mips_oddfpreg_ok (const struct mips_opcode *insn, int opnum)
4666 {
4667   const char *s = insn->name;
4668   bfd_boolean oddspreg = (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa, mips_opts.arch)
4669                           || FPR_SIZE == 64)
4670                          && mips_opts.oddspreg;
4671
4672   if (insn->pinfo == INSN_MACRO)
4673     /* Let a macro pass, we'll catch it later when it is expanded.  */
4674     return TRUE;
4675
4676   /* Single-precision coprocessor loads and moves are OK for 32-bit registers,
4677      otherwise it depends on oddspreg.  */
4678   if ((insn->pinfo & FP_S)
4679       && (insn->pinfo & (INSN_LOAD_MEMORY | INSN_STORE_MEMORY
4680                          | INSN_LOAD_COPROC | INSN_COPROC_MOVE)))
4681     return FPR_SIZE == 32 || oddspreg;
4682
4683   /* Allow odd registers for single-precision ops and double-precision if the
4684      floating-point registers are 64-bit wide.  */
4685   switch (insn->pinfo & (FP_S | FP_D))
4686     {
4687     case FP_S:
4688     case 0:
4689       return oddspreg;
4690     case FP_D:
4691       return FPR_SIZE == 64;
4692     default:
4693       break;
4694     }
4695
4696   /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
4697   s = strchr (insn->name, '.');
4698   if (s != NULL && opnum == 2)
4699     s = strchr (s + 1, '.');
4700   if (s != NULL && (s[1] == 'w' || s[1] == 's'))
4701     return oddspreg;
4702
4703   return FPR_SIZE == 64;
4704 }
4705
4706 /* Information about an instruction argument that we're trying to match.  */
4707 struct mips_arg_info
4708 {
4709   /* The instruction so far.  */
4710   struct mips_cl_insn *insn;
4711
4712   /* The first unconsumed operand token.  */
4713   struct mips_operand_token *token;
4714
4715   /* The 1-based operand number, in terms of insn->insn_mo->args.  */
4716   int opnum;
4717
4718   /* The 1-based argument number, for error reporting.  This does not
4719      count elided optional registers, etc..  */
4720   int argnum;
4721
4722   /* The last OP_REG operand seen, or ILLEGAL_REG if none.  */
4723   unsigned int last_regno;
4724
4725   /* If the first operand was an OP_REG, this is the register that it
4726      specified, otherwise it is ILLEGAL_REG.  */
4727   unsigned int dest_regno;
4728
4729   /* The value of the last OP_INT operand.  Only used for OP_MSB,
4730      where it gives the lsb position.  */
4731   unsigned int last_op_int;
4732
4733   /* If true, match routines should assume that no later instruction
4734      alternative matches and should therefore be as accommodating as
4735      possible.  Match routines should not report errors if something
4736      is only invalid for !LAX_MATCH.  */
4737   bfd_boolean lax_match;
4738
4739   /* True if a reference to the current AT register was seen.  */
4740   bfd_boolean seen_at;
4741 };
4742
4743 /* Record that the argument is out of range.  */
4744
4745 static void
4746 match_out_of_range (struct mips_arg_info *arg)
4747 {
4748   set_insn_error_i (arg->argnum, _("operand %d out of range"), arg->argnum);
4749 }
4750
4751 /* Record that the argument isn't constant but needs to be.  */
4752
4753 static void
4754 match_not_constant (struct mips_arg_info *arg)
4755 {
4756   set_insn_error_i (arg->argnum, _("operand %d must be constant"),
4757                     arg->argnum);
4758 }
4759
4760 /* Try to match an OT_CHAR token for character CH.  Consume the token
4761    and return true on success, otherwise return false.  */
4762
4763 static bfd_boolean
4764 match_char (struct mips_arg_info *arg, char ch)
4765 {
4766   if (arg->token->type == OT_CHAR && arg->token->u.ch == ch)
4767     {
4768       ++arg->token;
4769       if (ch == ',')
4770         arg->argnum += 1;
4771       return TRUE;
4772     }
4773   return FALSE;
4774 }
4775
4776 /* Try to get an expression from the next tokens in ARG.  Consume the
4777    tokens and return true on success, storing the expression value in
4778    VALUE and relocation types in R.  */
4779
4780 static bfd_boolean
4781 match_expression (struct mips_arg_info *arg, expressionS *value,
4782                   bfd_reloc_code_real_type *r)
4783 {
4784   /* If the next token is a '(' that was parsed as being part of a base
4785      expression, assume we have an elided offset.  The later match will fail
4786      if this turns out to be wrong.  */
4787   if (arg->token->type == OT_CHAR && arg->token->u.ch == '(')
4788     {
4789       value->X_op = O_constant;
4790       value->X_add_number = 0;
4791       r[0] = r[1] = r[2] = BFD_RELOC_UNUSED;
4792       return TRUE;
4793     }
4794
4795   /* Reject register-based expressions such as "0+$2" and "(($2))".
4796      For plain registers the default error seems more appropriate.  */
4797   if (arg->token->type == OT_INTEGER
4798       && arg->token->u.integer.value.X_op == O_register)
4799     {
4800       set_insn_error (arg->argnum, _("register value used as expression"));
4801       return FALSE;
4802     }
4803
4804   if (arg->token->type == OT_INTEGER)
4805     {
4806       *value = arg->token->u.integer.value;
4807       memcpy (r, arg->token->u.integer.relocs, 3 * sizeof (*r));
4808       ++arg->token;
4809       return TRUE;
4810     }
4811
4812   set_insn_error_i
4813     (arg->argnum, _("operand %d must be an immediate expression"),
4814      arg->argnum);
4815   return FALSE;
4816 }
4817
4818 /* Try to get a constant expression from the next tokens in ARG.  Consume
4819    the tokens and return return true on success, storing the constant value
4820    in *VALUE.  Use FALLBACK as the value if the match succeeded with an
4821    error.  */
4822
4823 static bfd_boolean
4824 match_const_int (struct mips_arg_info *arg, offsetT *value)
4825 {
4826   expressionS ex;
4827   bfd_reloc_code_real_type r[3];
4828
4829   if (!match_expression (arg, &ex, r))
4830     return FALSE;
4831
4832   if (r[0] == BFD_RELOC_UNUSED && ex.X_op == O_constant)
4833     *value = ex.X_add_number;
4834   else
4835     {
4836       match_not_constant (arg);
4837       return FALSE;
4838     }
4839   return TRUE;
4840 }
4841
4842 /* Return the RTYPE_* flags for a register operand of type TYPE that
4843    appears in instruction OPCODE.  */
4844
4845 static unsigned int
4846 convert_reg_type (const struct mips_opcode *opcode,
4847                   enum mips_reg_operand_type type)
4848 {
4849   switch (type)
4850     {
4851     case OP_REG_GP:
4852       return RTYPE_NUM | RTYPE_GP;
4853
4854     case OP_REG_FP:
4855       /* Allow vector register names for MDMX if the instruction is a 64-bit
4856          FPR load, store or move (including moves to and from GPRs).  */
4857       if ((mips_opts.ase & ASE_MDMX)
4858           && (opcode->pinfo & FP_D)
4859           && (opcode->pinfo & (INSN_COPROC_MOVE
4860                                | INSN_COPROC_MEMORY_DELAY
4861                                | INSN_LOAD_COPROC
4862                                | INSN_LOAD_MEMORY
4863                                | INSN_STORE_MEMORY)))
4864         return RTYPE_FPU | RTYPE_VEC;
4865       return RTYPE_FPU;
4866
4867     case OP_REG_CCC:
4868       if (opcode->pinfo & (FP_D | FP_S))
4869         return RTYPE_CCC | RTYPE_FCC;
4870       return RTYPE_CCC;
4871
4872     case OP_REG_VEC:
4873       if (opcode->membership & INSN_5400)
4874         return RTYPE_FPU;
4875       return RTYPE_FPU | RTYPE_VEC;
4876
4877     case OP_REG_ACC:
4878       return RTYPE_ACC;
4879
4880     case OP_REG_COPRO:
4881       if (opcode->name[strlen (opcode->name) - 1] == '0')
4882         return RTYPE_NUM | RTYPE_CP0;
4883       return RTYPE_NUM;
4884
4885     case OP_REG_HW:
4886       return RTYPE_NUM;
4887
4888     case OP_REG_VI:
4889       return RTYPE_NUM | RTYPE_VI;
4890
4891     case OP_REG_VF:
4892       return RTYPE_NUM | RTYPE_VF;
4893
4894     case OP_REG_R5900_I:
4895       return RTYPE_R5900_I;
4896
4897     case OP_REG_R5900_Q:
4898       return RTYPE_R5900_Q;
4899
4900     case OP_REG_R5900_R:
4901       return RTYPE_R5900_R;
4902
4903     case OP_REG_R5900_ACC:
4904       return RTYPE_R5900_ACC;
4905
4906     case OP_REG_MSA:
4907       return RTYPE_MSA;
4908
4909     case OP_REG_MSA_CTRL:
4910       return RTYPE_NUM;
4911     }
4912   abort ();
4913 }
4914
4915 /* ARG is register REGNO, of type TYPE.  Warn about any dubious registers.  */
4916
4917 static void
4918 check_regno (struct mips_arg_info *arg,
4919              enum mips_reg_operand_type type, unsigned int regno)
4920 {
4921   if (AT && type == OP_REG_GP && regno == AT)
4922     arg->seen_at = TRUE;
4923
4924   if (type == OP_REG_FP
4925       && (regno & 1) != 0
4926       && !mips_oddfpreg_ok (arg->insn->insn_mo, arg->opnum))
4927     {
4928       /* This was a warning prior to introducing O32 FPXX and FP64 support
4929          so maintain a warning for FP32 but raise an error for the new
4930          cases.  */
4931       if (FPR_SIZE == 32)
4932         as_warn (_("float register should be even, was %d"), regno);
4933       else
4934         as_bad (_("float register should be even, was %d"), regno);
4935     }
4936
4937   if (type == OP_REG_CCC)
4938     {
4939       const char *name;
4940       size_t length;
4941
4942       name = arg->insn->insn_mo->name;
4943       length = strlen (name);
4944       if ((regno & 1) != 0
4945           && ((length >= 3 && strcmp (name + length - 3, ".ps") == 0)
4946               || (length >= 5 && strncmp (name + length - 5, "any2", 4) == 0)))
4947         as_warn (_("condition code register should be even for %s, was %d"),
4948                  name, regno);
4949
4950       if ((regno & 3) != 0
4951           && (length >= 5 && strncmp (name + length - 5, "any4", 4) == 0))
4952         as_warn (_("condition code register should be 0 or 4 for %s, was %d"),
4953                  name, regno);
4954     }
4955 }
4956
4957 /* ARG is a register with symbol value SYMVAL.  Try to interpret it as
4958    a register of type TYPE.  Return true on success, storing the register
4959    number in *REGNO and warning about any dubious uses.  */
4960
4961 static bfd_boolean
4962 match_regno (struct mips_arg_info *arg, enum mips_reg_operand_type type,
4963              unsigned int symval, unsigned int *regno)
4964 {
4965   if (type == OP_REG_VEC)
4966     symval = mips_prefer_vec_regno (symval);
4967   if (!(symval & convert_reg_type (arg->insn->insn_mo, type)))
4968     return FALSE;
4969
4970   *regno = symval & RNUM_MASK;
4971   check_regno (arg, type, *regno);
4972   return TRUE;
4973 }
4974
4975 /* Try to interpret the next token in ARG as a register of type TYPE.
4976    Consume the token and return true on success, storing the register
4977    number in *REGNO.  Return false on failure.  */
4978
4979 static bfd_boolean
4980 match_reg (struct mips_arg_info *arg, enum mips_reg_operand_type type,
4981            unsigned int *regno)
4982 {
4983   if (arg->token->type == OT_REG
4984       && match_regno (arg, type, arg->token->u.regno, regno))
4985     {
4986       ++arg->token;
4987       return TRUE;
4988     }
4989   return FALSE;
4990 }
4991
4992 /* Try to interpret the next token in ARG as a range of registers of type TYPE.
4993    Consume the token and return true on success, storing the register numbers
4994    in *REGNO1 and *REGNO2.  Return false on failure.  */
4995
4996 static bfd_boolean
4997 match_reg_range (struct mips_arg_info *arg, enum mips_reg_operand_type type,
4998                  unsigned int *regno1, unsigned int *regno2)
4999 {
5000   if (match_reg (arg, type, regno1))
5001     {
5002       *regno2 = *regno1;
5003       return TRUE;
5004     }
5005   if (arg->token->type == OT_REG_RANGE
5006       && match_regno (arg, type, arg->token->u.reg_range.regno1, regno1)
5007       && match_regno (arg, type, arg->token->u.reg_range.regno2, regno2)
5008       && *regno1 <= *regno2)
5009     {
5010       ++arg->token;
5011       return TRUE;
5012     }
5013   return FALSE;
5014 }
5015
5016 /* OP_INT matcher.  */
5017
5018 static bfd_boolean
5019 match_int_operand (struct mips_arg_info *arg,
5020                    const struct mips_operand *operand_base)
5021 {
5022   const struct mips_int_operand *operand;
5023   unsigned int uval;
5024   int min_val, max_val, factor;
5025   offsetT sval;
5026
5027   operand = (const struct mips_int_operand *) operand_base;
5028   factor = 1 << operand->shift;
5029   min_val = mips_int_operand_min (operand);
5030   max_val = mips_int_operand_max (operand);
5031
5032   if (operand_base->lsb == 0
5033       && operand_base->size == 16
5034       && operand->shift == 0
5035       && operand->bias == 0
5036       && (operand->max_val == 32767 || operand->max_val == 65535))
5037     {
5038       /* The operand can be relocated.  */
5039       if (!match_expression (arg, &offset_expr, offset_reloc))
5040         return FALSE;
5041
5042       if (offset_reloc[0] != BFD_RELOC_UNUSED)
5043         /* Relocation operators were used.  Accept the argument and
5044            leave the relocation value in offset_expr and offset_relocs
5045            for the caller to process.  */
5046         return TRUE;
5047
5048       if (offset_expr.X_op != O_constant)
5049         {
5050           /* Accept non-constant operands if no later alternative matches,
5051              leaving it for the caller to process.  */
5052           if (!arg->lax_match)
5053             return FALSE;
5054           offset_reloc[0] = BFD_RELOC_LO16;
5055           return TRUE;
5056         }
5057
5058       /* Clear the global state; we're going to install the operand
5059          ourselves.  */
5060       sval = offset_expr.X_add_number;
5061       offset_expr.X_op = O_absent;
5062
5063       /* For compatibility with older assemblers, we accept
5064          0x8000-0xffff as signed 16-bit numbers when only
5065          signed numbers are allowed.  */
5066       if (sval > max_val)
5067         {
5068           max_val = ((1 << operand_base->size) - 1) << operand->shift;
5069           if (!arg->lax_match && sval <= max_val)
5070             return FALSE;
5071         }
5072     }
5073   else
5074     {
5075       if (!match_const_int (arg, &sval))
5076         return FALSE;
5077     }
5078
5079   arg->last_op_int = sval;
5080
5081   if (sval < min_val || sval > max_val || sval % factor)
5082     {
5083       match_out_of_range (arg);
5084       return FALSE;
5085     }
5086
5087   uval = (unsigned int) sval >> operand->shift;
5088   uval -= operand->bias;
5089
5090   /* Handle -mfix-cn63xxp1.  */
5091   if (arg->opnum == 1
5092       && mips_fix_cn63xxp1
5093       && !mips_opts.micromips
5094       && strcmp ("pref", arg->insn->insn_mo->name) == 0)
5095     switch (uval)
5096       {
5097       case 5:
5098       case 25:
5099       case 26:
5100       case 27:
5101       case 28:
5102       case 29:
5103       case 30:
5104       case 31:
5105         /* These are ok.  */
5106         break;
5107
5108       default:
5109         /* The rest must be changed to 28.  */
5110         uval = 28;
5111         break;
5112       }
5113
5114   insn_insert_operand (arg->insn, operand_base, uval);
5115   return TRUE;
5116 }
5117
5118 /* OP_MAPPED_INT matcher.  */
5119
5120 static bfd_boolean
5121 match_mapped_int_operand (struct mips_arg_info *arg,
5122                           const struct mips_operand *operand_base)
5123 {
5124   const struct mips_mapped_int_operand *operand;
5125   unsigned int uval, num_vals;
5126   offsetT sval;
5127
5128   operand = (const struct mips_mapped_int_operand *) operand_base;
5129   if (!match_const_int (arg, &sval))
5130     return FALSE;
5131
5132   num_vals = 1 << operand_base->size;
5133   for (uval = 0; uval < num_vals; uval++)
5134     if (operand->int_map[uval] == sval)
5135       break;
5136   if (uval == num_vals)
5137     {
5138       match_out_of_range (arg);
5139       return FALSE;
5140     }
5141
5142   insn_insert_operand (arg->insn, operand_base, uval);
5143   return TRUE;
5144 }
5145
5146 /* OP_MSB matcher.  */
5147
5148 static bfd_boolean
5149 match_msb_operand (struct mips_arg_info *arg,
5150                    const struct mips_operand *operand_base)
5151 {
5152   const struct mips_msb_operand *operand;
5153   int min_val, max_val, max_high;
5154   offsetT size, sval, high;
5155
5156   operand = (const struct mips_msb_operand *) operand_base;
5157   min_val = operand->bias;
5158   max_val = min_val + (1 << operand_base->size) - 1;
5159   max_high = operand->opsize;
5160
5161   if (!match_const_int (arg, &size))
5162     return FALSE;
5163
5164   high = size + arg->last_op_int;
5165   sval = operand->add_lsb ? high : size;
5166
5167   if (size < 0 || high > max_high || sval < min_val || sval > max_val)
5168     {
5169       match_out_of_range (arg);
5170       return FALSE;
5171     }
5172   insn_insert_operand (arg->insn, operand_base, sval - min_val);
5173   return TRUE;
5174 }
5175
5176 /* OP_REG matcher.  */
5177
5178 static bfd_boolean
5179 match_reg_operand (struct mips_arg_info *arg,
5180                    const struct mips_operand *operand_base)
5181 {
5182   const struct mips_reg_operand *operand;
5183   unsigned int regno, uval, num_vals;
5184
5185   operand = (const struct mips_reg_operand *) operand_base;
5186   if (!match_reg (arg, operand->reg_type, &regno))
5187     return FALSE;
5188
5189   if (operand->reg_map)
5190     {
5191       num_vals = 1 << operand->root.size;
5192       for (uval = 0; uval < num_vals; uval++)
5193         if (operand->reg_map[uval] == regno)
5194           break;
5195       if (num_vals == uval)
5196         return FALSE;
5197     }
5198   else
5199     uval = regno;
5200
5201   arg->last_regno = regno;
5202   if (arg->opnum == 1)
5203     arg->dest_regno = regno;
5204   insn_insert_operand (arg->insn, operand_base, uval);
5205   return TRUE;
5206 }
5207
5208 /* OP_REG_PAIR matcher.  */
5209
5210 static bfd_boolean
5211 match_reg_pair_operand (struct mips_arg_info *arg,
5212                         const struct mips_operand *operand_base)
5213 {
5214   const struct mips_reg_pair_operand *operand;
5215   unsigned int regno1, regno2, uval, num_vals;
5216
5217   operand = (const struct mips_reg_pair_operand *) operand_base;
5218   if (!match_reg (arg, operand->reg_type, &regno1)
5219       || !match_char (arg, ',')
5220       || !match_reg (arg, operand->reg_type, &regno2))
5221     return FALSE;
5222
5223   num_vals = 1 << operand_base->size;
5224   for (uval = 0; uval < num_vals; uval++)
5225     if (operand->reg1_map[uval] == regno1 && operand->reg2_map[uval] == regno2)
5226       break;
5227   if (uval == num_vals)
5228     return FALSE;
5229
5230   insn_insert_operand (arg->insn, operand_base, uval);
5231   return TRUE;
5232 }
5233
5234 /* OP_PCREL matcher.  The caller chooses the relocation type.  */
5235
5236 static bfd_boolean
5237 match_pcrel_operand (struct mips_arg_info *arg)
5238 {
5239   bfd_reloc_code_real_type r[3];
5240
5241   return match_expression (arg, &offset_expr, r) && r[0] == BFD_RELOC_UNUSED;
5242 }
5243
5244 /* OP_PERF_REG matcher.  */
5245
5246 static bfd_boolean
5247 match_perf_reg_operand (struct mips_arg_info *arg,
5248                         const struct mips_operand *operand)
5249 {
5250   offsetT sval;
5251
5252   if (!match_const_int (arg, &sval))
5253     return FALSE;
5254
5255   if (sval != 0
5256       && (sval != 1
5257           || (mips_opts.arch == CPU_R5900
5258               && (strcmp (arg->insn->insn_mo->name, "mfps") == 0
5259                   || strcmp (arg->insn->insn_mo->name, "mtps") == 0))))
5260     {
5261       set_insn_error (arg->argnum, _("invalid performance register"));
5262       return FALSE;
5263     }
5264
5265   insn_insert_operand (arg->insn, operand, sval);
5266   return TRUE;
5267 }
5268
5269 /* OP_ADDIUSP matcher.  */
5270
5271 static bfd_boolean
5272 match_addiusp_operand (struct mips_arg_info *arg,
5273                        const struct mips_operand *operand)
5274 {
5275   offsetT sval;
5276   unsigned int uval;
5277
5278   if (!match_const_int (arg, &sval))
5279     return FALSE;
5280
5281   if (sval % 4)
5282     {
5283       match_out_of_range (arg);
5284       return FALSE;
5285     }
5286
5287   sval /= 4;
5288   if (!(sval >= -258 && sval <= 257) || (sval >= -2 && sval <= 1))
5289     {
5290       match_out_of_range (arg);
5291       return FALSE;
5292     }
5293
5294   uval = (unsigned int) sval;
5295   uval = ((uval >> 1) & ~0xff) | (uval & 0xff);
5296   insn_insert_operand (arg->insn, operand, uval);
5297   return TRUE;
5298 }
5299
5300 /* OP_CLO_CLZ_DEST matcher.  */
5301
5302 static bfd_boolean
5303 match_clo_clz_dest_operand (struct mips_arg_info *arg,
5304                             const struct mips_operand *operand)
5305 {
5306   unsigned int regno;
5307
5308   if (!match_reg (arg, OP_REG_GP, &regno))
5309     return FALSE;
5310
5311   insn_insert_operand (arg->insn, operand, regno | (regno << 5));
5312   return TRUE;
5313 }
5314
5315 /* OP_CHECK_PREV matcher.  */
5316
5317 static bfd_boolean
5318 match_check_prev_operand (struct mips_arg_info *arg,
5319                           const struct mips_operand *operand_base)
5320 {
5321   const struct mips_check_prev_operand *operand;
5322   unsigned int regno;
5323
5324   operand = (const struct mips_check_prev_operand *) operand_base;
5325
5326   if (!match_reg (arg, OP_REG_GP, &regno))
5327     return FALSE;
5328
5329   if (!operand->zero_ok && regno == 0)
5330     return FALSE;
5331
5332   if ((operand->less_than_ok && regno < arg->last_regno)
5333       || (operand->greater_than_ok && regno > arg->last_regno)
5334       || (operand->equal_ok && regno == arg->last_regno))
5335     {
5336       arg->last_regno = regno;
5337       insn_insert_operand (arg->insn, operand_base, regno);
5338       return TRUE;
5339     }
5340
5341   return FALSE;
5342 }
5343
5344 /* OP_SAME_RS_RT matcher.  */
5345
5346 static bfd_boolean
5347 match_same_rs_rt_operand (struct mips_arg_info *arg,
5348                           const struct mips_operand *operand)
5349 {
5350   unsigned int regno;
5351
5352   if (!match_reg (arg, OP_REG_GP, &regno))
5353     return FALSE;
5354
5355   if (regno == 0)
5356     {
5357       set_insn_error (arg->argnum, _("the source register must not be $0"));
5358       return FALSE;
5359     }
5360
5361   arg->last_regno = regno;
5362
5363   insn_insert_operand (arg->insn, operand, regno | (regno << 5));
5364   return TRUE;
5365 }
5366
5367 /* OP_LWM_SWM_LIST matcher.  */
5368
5369 static bfd_boolean
5370 match_lwm_swm_list_operand (struct mips_arg_info *arg,
5371                             const struct mips_operand *operand)
5372 {
5373   unsigned int reglist, sregs, ra, regno1, regno2;
5374   struct mips_arg_info reset;
5375
5376   reglist = 0;
5377   if (!match_reg_range (arg, OP_REG_GP, &regno1, &regno2))
5378     return FALSE;
5379   do
5380     {
5381       if (regno2 == FP && regno1 >= S0 && regno1 <= S7)
5382         {
5383           reglist |= 1 << FP;
5384           regno2 = S7;
5385         }
5386       reglist |= ((1U << regno2 << 1) - 1) & -(1U << regno1);
5387       reset = *arg;
5388     }
5389   while (match_char (arg, ',')
5390          && match_reg_range (arg, OP_REG_GP, &regno1, &regno2));
5391   *arg = reset;
5392
5393   if (operand->size == 2)
5394     {
5395       /* The list must include both ra and s0-sN, for 0 <= N <= 3.  E.g.:
5396
5397          s0, ra
5398          s0, s1, ra, s2, s3
5399          s0-s2, ra
5400
5401          and any permutations of these.  */
5402       if ((reglist & 0xfff1ffff) != 0x80010000)
5403         return FALSE;
5404
5405       sregs = (reglist >> 17) & 7;
5406       ra = 0;
5407     }
5408   else
5409     {
5410       /* The list must include at least one of ra and s0-sN,
5411          for 0 <= N <= 8.  (Note that there is a gap between s7 and s8,
5412          which are $23 and $30 respectively.)  E.g.:
5413
5414          ra
5415          s0
5416          ra, s0, s1, s2
5417          s0-s8
5418          s0-s5, ra
5419
5420          and any permutations of these.  */
5421       if ((reglist & 0x3f00ffff) != 0)
5422         return FALSE;
5423
5424       ra = (reglist >> 27) & 0x10;
5425       sregs = ((reglist >> 22) & 0x100) | ((reglist >> 16) & 0xff);
5426     }
5427   sregs += 1;
5428   if ((sregs & -sregs) != sregs)
5429     return FALSE;
5430
5431   insn_insert_operand (arg->insn, operand, (ffs (sregs) - 1) | ra);
5432   return TRUE;
5433 }
5434
5435 /* OP_ENTRY_EXIT_LIST matcher.  */
5436
5437 static unsigned int
5438 match_entry_exit_operand (struct mips_arg_info *arg,
5439                           const struct mips_operand *operand)
5440 {
5441   unsigned int mask;
5442   bfd_boolean is_exit;
5443
5444   /* The format is the same for both ENTRY and EXIT, but the constraints
5445      are different.  */
5446   is_exit = strcmp (arg->insn->insn_mo->name, "exit") == 0;
5447   mask = (is_exit ? 7 << 3 : 0);
5448   do
5449     {
5450       unsigned int regno1, regno2;
5451       bfd_boolean is_freg;
5452
5453       if (match_reg_range (arg, OP_REG_GP, &regno1, &regno2))
5454         is_freg = FALSE;
5455       else if (match_reg_range (arg, OP_REG_FP, &regno1, &regno2))
5456         is_freg = TRUE;
5457       else
5458         return FALSE;
5459
5460       if (is_exit && is_freg && regno1 == 0 && regno2 < 2)
5461         {
5462           mask &= ~(7 << 3);
5463           mask |= (5 + regno2) << 3;
5464         }
5465       else if (!is_exit && regno1 == 4 && regno2 >= 4 && regno2 <= 7)
5466         mask |= (regno2 - 3) << 3;
5467       else if (regno1 == 16 && regno2 >= 16 && regno2 <= 17)
5468         mask |= (regno2 - 15) << 1;
5469       else if (regno1 == RA && regno2 == RA)
5470         mask |= 1;
5471       else
5472         return FALSE;
5473     }
5474   while (match_char (arg, ','));
5475
5476   insn_insert_operand (arg->insn, operand, mask);
5477   return TRUE;
5478 }
5479
5480 /* OP_SAVE_RESTORE_LIST matcher.  */
5481
5482 static bfd_boolean
5483 match_save_restore_list_operand (struct mips_arg_info *arg)
5484 {
5485   unsigned int opcode, args, statics, sregs;
5486   unsigned int num_frame_sizes, num_args, num_statics, num_sregs;
5487   offsetT frame_size;
5488
5489   opcode = arg->insn->insn_opcode;
5490   frame_size = 0;
5491   num_frame_sizes = 0;
5492   args = 0;
5493   statics = 0;
5494   sregs = 0;
5495   do
5496     {
5497       unsigned int regno1, regno2;
5498
5499       if (arg->token->type == OT_INTEGER)
5500         {
5501           /* Handle the frame size.  */
5502           if (!match_const_int (arg, &frame_size))
5503             return FALSE;
5504           num_frame_sizes += 1;
5505         }
5506       else
5507         {
5508           if (!match_reg_range (arg, OP_REG_GP, &regno1, &regno2))
5509             return FALSE;
5510
5511           while (regno1 <= regno2)
5512             {
5513               if (regno1 >= 4 && regno1 <= 7)
5514                 {
5515                   if (num_frame_sizes == 0)
5516                     /* args $a0-$a3 */
5517                     args |= 1 << (regno1 - 4);
5518                   else
5519                     /* statics $a0-$a3 */
5520                     statics |= 1 << (regno1 - 4);
5521                 }
5522               else if (regno1 >= 16 && regno1 <= 23)
5523                 /* $s0-$s7 */
5524                 sregs |= 1 << (regno1 - 16);
5525               else if (regno1 == 30)
5526                 /* $s8 */
5527                 sregs |= 1 << 8;
5528               else if (regno1 == 31)
5529                 /* Add $ra to insn.  */
5530                 opcode |= 0x40;
5531               else
5532                 return FALSE;
5533               regno1 += 1;
5534               if (regno1 == 24)
5535                 regno1 = 30;
5536             }
5537         }
5538     }
5539   while (match_char (arg, ','));
5540
5541   /* Encode args/statics combination.  */
5542   if (args & statics)
5543     return FALSE;
5544   else if (args == 0xf)
5545     /* All $a0-$a3 are args.  */
5546     opcode |= MIPS16_ALL_ARGS << 16;
5547   else if (statics == 0xf)
5548     /* All $a0-$a3 are statics.  */
5549     opcode |= MIPS16_ALL_STATICS << 16;
5550   else
5551     {
5552       /* Count arg registers.  */
5553       num_args = 0;
5554       while (args & 0x1)
5555         {
5556           args >>= 1;
5557           num_args += 1;
5558         }
5559       if (args != 0)
5560         return FALSE;
5561
5562       /* Count static registers.  */
5563       num_statics = 0;
5564       while (statics & 0x8)
5565         {
5566           statics = (statics << 1) & 0xf;
5567           num_statics += 1;
5568         }
5569       if (statics != 0)
5570         return FALSE;
5571
5572       /* Encode args/statics.  */
5573       opcode |= ((num_args << 2) | num_statics) << 16;
5574     }
5575
5576   /* Encode $s0/$s1.  */
5577   if (sregs & (1 << 0))         /* $s0 */
5578     opcode |= 0x20;
5579   if (sregs & (1 << 1))         /* $s1 */
5580     opcode |= 0x10;
5581   sregs >>= 2;
5582
5583   /* Encode $s2-$s8. */
5584   num_sregs = 0;
5585   while (sregs & 1)
5586     {
5587       sregs >>= 1;
5588       num_sregs += 1;
5589     }
5590   if (sregs != 0)
5591     return FALSE;
5592   opcode |= num_sregs << 24;
5593
5594   /* Encode frame size.  */
5595   if (num_frame_sizes == 0)
5596     {
5597       set_insn_error (arg->argnum, _("missing frame size"));
5598       return FALSE;
5599     }
5600   if (num_frame_sizes > 1)
5601     {
5602       set_insn_error (arg->argnum, _("frame size specified twice"));
5603       return FALSE;
5604     }
5605   if ((frame_size & 7) != 0 || frame_size < 0 || frame_size > 0xff * 8)
5606     {
5607       set_insn_error (arg->argnum, _("invalid frame size"));
5608       return FALSE;
5609     }
5610   if (frame_size != 128 || (opcode >> 16) != 0)
5611     {
5612       frame_size /= 8;
5613       opcode |= (((frame_size & 0xf0) << 16)
5614                  | (frame_size & 0x0f));
5615     }
5616
5617   /* Finally build the instruction.  */
5618   if ((opcode >> 16) != 0 || frame_size == 0)
5619     opcode |= MIPS16_EXTEND;
5620   arg->insn->insn_opcode = opcode;
5621   return TRUE;
5622 }
5623
5624 /* OP_MDMX_IMM_REG matcher.  */
5625
5626 static bfd_boolean
5627 match_mdmx_imm_reg_operand (struct mips_arg_info *arg,
5628                             const struct mips_operand *operand)
5629 {
5630   unsigned int regno, uval;
5631   bfd_boolean is_qh;
5632   const struct mips_opcode *opcode;
5633
5634   /* The mips_opcode records whether this is an octobyte or quadhalf
5635      instruction.  Start out with that bit in place.  */
5636   opcode = arg->insn->insn_mo;
5637   uval = mips_extract_operand (operand, opcode->match);
5638   is_qh = (uval != 0);
5639
5640   if (arg->token->type == OT_REG)
5641     {
5642       if ((opcode->membership & INSN_5400)
5643           && strcmp (opcode->name, "rzu.ob") == 0)
5644         {
5645           set_insn_error_i (arg->argnum, _("operand %d must be an immediate"),
5646                             arg->argnum);
5647           return FALSE;
5648         }
5649
5650       if (!match_regno (arg, OP_REG_VEC, arg->token->u.regno, &regno))
5651         return FALSE;
5652       ++arg->token;
5653
5654       /* Check whether this is a vector register or a broadcast of
5655          a single element.  */
5656       if (arg->token->type == OT_INTEGER_INDEX)
5657         {
5658           if (arg->token->u.index > (is_qh ? 3 : 7))
5659             {
5660               set_insn_error (arg->argnum, _("invalid element selector"));
5661               return FALSE;
5662             }
5663           uval |= arg->token->u.index << (is_qh ? 2 : 1) << 5;
5664           ++arg->token;
5665         }
5666       else
5667         {
5668           /* A full vector.  */
5669           if ((opcode->membership & INSN_5400)
5670               && (strcmp (opcode->name, "sll.ob") == 0
5671                   || strcmp (opcode->name, "srl.ob") == 0))
5672             {
5673               set_insn_error_i (arg->argnum, _("operand %d must be scalar"),
5674                                 arg->argnum);
5675               return FALSE;
5676             }
5677
5678           if (is_qh)
5679             uval |= MDMX_FMTSEL_VEC_QH << 5;
5680           else
5681             uval |= MDMX_FMTSEL_VEC_OB << 5;
5682         }
5683       uval |= regno;
5684     }
5685   else
5686     {
5687       offsetT sval;
5688
5689       if (!match_const_int (arg, &sval))
5690         return FALSE;
5691       if (sval < 0 || sval > 31)
5692         {
5693           match_out_of_range (arg);
5694           return FALSE;
5695         }
5696       uval |= (sval & 31);
5697       if (is_qh)
5698         uval |= MDMX_FMTSEL_IMM_QH << 5;
5699       else
5700         uval |= MDMX_FMTSEL_IMM_OB << 5;
5701     }
5702   insn_insert_operand (arg->insn, operand, uval);
5703   return TRUE;
5704 }
5705
5706 /* OP_IMM_INDEX matcher.  */
5707
5708 static bfd_boolean
5709 match_imm_index_operand (struct mips_arg_info *arg,
5710                          const struct mips_operand *operand)
5711 {
5712   unsigned int max_val;
5713
5714   if (arg->token->type != OT_INTEGER_INDEX)
5715     return FALSE;
5716
5717   max_val = (1 << operand->size) - 1;
5718   if (arg->token->u.index > max_val)
5719     {
5720       match_out_of_range (arg);
5721       return FALSE;
5722     }
5723   insn_insert_operand (arg->insn, operand, arg->token->u.index);
5724   ++arg->token;
5725   return TRUE;
5726 }
5727
5728 /* OP_REG_INDEX matcher.  */
5729
5730 static bfd_boolean
5731 match_reg_index_operand (struct mips_arg_info *arg,
5732                          const struct mips_operand *operand)
5733 {
5734   unsigned int regno;
5735
5736   if (arg->token->type != OT_REG_INDEX)
5737     return FALSE;
5738
5739   if (!match_regno (arg, OP_REG_GP, arg->token->u.regno, &regno))
5740     return FALSE;
5741
5742   insn_insert_operand (arg->insn, operand, regno);
5743   ++arg->token;
5744   return TRUE;
5745 }
5746
5747 /* OP_PC matcher.  */
5748
5749 static bfd_boolean
5750 match_pc_operand (struct mips_arg_info *arg)
5751 {
5752   if (arg->token->type == OT_REG && (arg->token->u.regno & RTYPE_PC))
5753     {
5754       ++arg->token;
5755       return TRUE;
5756     }
5757   return FALSE;
5758 }
5759
5760 /* OP_NON_ZERO_REG matcher.  */
5761
5762 static bfd_boolean
5763 match_non_zero_reg_operand (struct mips_arg_info *arg,
5764                             const struct mips_operand *operand)
5765 {
5766   unsigned int regno;
5767
5768   if (!match_reg (arg, OP_REG_GP, &regno))
5769     return FALSE;
5770
5771   if (regno == 0)
5772     return FALSE;
5773
5774   arg->last_regno = regno;
5775   insn_insert_operand (arg->insn, operand, regno);
5776   return TRUE;
5777 }
5778
5779 /* OP_REPEAT_DEST_REG and OP_REPEAT_PREV_REG matcher.  OTHER_REGNO is the
5780    register that we need to match.  */
5781
5782 static bfd_boolean
5783 match_tied_reg_operand (struct mips_arg_info *arg, unsigned int other_regno)
5784 {
5785   unsigned int regno;
5786
5787   return match_reg (arg, OP_REG_GP, &regno) && regno == other_regno;
5788 }
5789
5790 /* Read a floating-point constant from S for LI.S or LI.D.  LENGTH is
5791    the length of the value in bytes (4 for float, 8 for double) and
5792    USING_GPRS says whether the destination is a GPR rather than an FPR.
5793
5794    Return the constant in IMM and OFFSET as follows:
5795
5796    - If the constant should be loaded via memory, set IMM to O_absent and
5797      OFFSET to the memory address.
5798
5799    - Otherwise, if the constant should be loaded into two 32-bit registers,
5800      set IMM to the O_constant to load into the high register and OFFSET
5801      to the corresponding value for the low register.
5802
5803    - Otherwise, set IMM to the full O_constant and set OFFSET to O_absent.
5804
5805    These constants only appear as the last operand in an instruction,
5806    and every instruction that accepts them in any variant accepts them
5807    in all variants.  This means we don't have to worry about backing out
5808    any changes if the instruction does not match.  We just match
5809    unconditionally and report an error if the constant is invalid.  */
5810
5811 static bfd_boolean
5812 match_float_constant (struct mips_arg_info *arg, expressionS *imm,
5813                       expressionS *offset, int length, bfd_boolean using_gprs)
5814 {
5815   char *p;
5816   segT seg, new_seg;
5817   subsegT subseg;
5818   const char *newname;
5819   unsigned char *data;
5820
5821   /* Where the constant is placed is based on how the MIPS assembler
5822      does things:
5823
5824      length == 4 && using_gprs  -- immediate value only
5825      length == 8 && using_gprs  -- .rdata or immediate value
5826      length == 4 && !using_gprs -- .lit4 or immediate value
5827      length == 8 && !using_gprs -- .lit8 or immediate value
5828
5829      The .lit4 and .lit8 sections are only used if permitted by the
5830      -G argument.  */
5831   if (arg->token->type != OT_FLOAT)
5832     {
5833       set_insn_error (arg->argnum, _("floating-point expression required"));
5834       return FALSE;
5835     }
5836
5837   gas_assert (arg->token->u.flt.length == length);
5838   data = arg->token->u.flt.data;
5839   ++arg->token;
5840
5841   /* Handle 32-bit constants for which an immediate value is best.  */
5842   if (length == 4
5843       && (using_gprs
5844           || g_switch_value < 4
5845           || (data[0] == 0 && data[1] == 0)
5846           || (data[2] == 0 && data[3] == 0)))
5847     {
5848       imm->X_op = O_constant;
5849       if (!target_big_endian)
5850         imm->X_add_number = bfd_getl32 (data);
5851       else
5852         imm->X_add_number = bfd_getb32 (data);
5853       offset->X_op = O_absent;
5854       return TRUE;
5855     }
5856
5857   /* Handle 64-bit constants for which an immediate value is best.  */
5858   if (length == 8
5859       && !mips_disable_float_construction
5860       /* Constants can only be constructed in GPRs and copied to FPRs if the
5861          GPRs are at least as wide as the FPRs or MTHC1 is available.
5862          Unlike most tests for 32-bit floating-point registers this check
5863          specifically looks for GPR_SIZE == 32 as the FPXX ABI does not
5864          permit 64-bit moves without MXHC1.
5865          Force the constant into memory otherwise.  */
5866       && (using_gprs
5867           || GPR_SIZE == 64
5868           || ISA_HAS_MXHC1 (mips_opts.isa)
5869           || FPR_SIZE == 32)
5870       && ((data[0] == 0 && data[1] == 0)
5871           || (data[2] == 0 && data[3] == 0))
5872       && ((data[4] == 0 && data[5] == 0)
5873           || (data[6] == 0 && data[7] == 0)))
5874     {
5875       /* The value is simple enough to load with a couple of instructions.
5876          If using 32-bit registers, set IMM to the high order 32 bits and
5877          OFFSET to the low order 32 bits.  Otherwise, set IMM to the entire
5878          64 bit constant.  */
5879       if (GPR_SIZE == 32 || (!using_gprs && FPR_SIZE != 64))
5880         {
5881           imm->X_op = O_constant;
5882           offset->X_op = O_constant;
5883           if (!target_big_endian)
5884             {
5885               imm->X_add_number = bfd_getl32 (data + 4);
5886               offset->X_add_number = bfd_getl32 (data);
5887             }
5888           else
5889             {
5890               imm->X_add_number = bfd_getb32 (data);
5891               offset->X_add_number = bfd_getb32 (data + 4);
5892             }
5893           if (offset->X_add_number == 0)
5894             offset->X_op = O_absent;
5895         }
5896       else
5897         {
5898           imm->X_op = O_constant;
5899           if (!target_big_endian)
5900             imm->X_add_number = bfd_getl64 (data);
5901           else
5902             imm->X_add_number = bfd_getb64 (data);
5903           offset->X_op = O_absent;
5904         }
5905       return TRUE;
5906     }
5907
5908   /* Switch to the right section.  */
5909   seg = now_seg;
5910   subseg = now_subseg;
5911   if (length == 4)
5912     {
5913       gas_assert (!using_gprs && g_switch_value >= 4);
5914       newname = ".lit4";
5915     }
5916   else
5917     {
5918       if (using_gprs || g_switch_value < 8)
5919         newname = RDATA_SECTION_NAME;
5920       else
5921         newname = ".lit8";
5922     }
5923
5924   new_seg = subseg_new (newname, (subsegT) 0);
5925   bfd_set_section_flags (stdoutput, new_seg,
5926                          SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA);
5927   frag_align (length == 4 ? 2 : 3, 0, 0);
5928   if (strncmp (TARGET_OS, "elf", 3) != 0)
5929     record_alignment (new_seg, 4);
5930   else
5931     record_alignment (new_seg, length == 4 ? 2 : 3);
5932   if (seg == now_seg)
5933     as_bad (_("cannot use `%s' in this section"), arg->insn->insn_mo->name);
5934
5935   /* Set the argument to the current address in the section.  */
5936   imm->X_op = O_absent;
5937   offset->X_op = O_symbol;
5938   offset->X_add_symbol = symbol_temp_new_now ();
5939   offset->X_add_number = 0;
5940
5941   /* Put the floating point number into the section.  */
5942   p = frag_more (length);
5943   memcpy (p, data, length);
5944
5945   /* Switch back to the original section.  */
5946   subseg_set (seg, subseg);
5947   return TRUE;
5948 }
5949
5950 /* OP_VU0_SUFFIX and OP_VU0_MATCH_SUFFIX matcher; MATCH_P selects between
5951    them.  */
5952
5953 static bfd_boolean
5954 match_vu0_suffix_operand (struct mips_arg_info *arg,
5955                           const struct mips_operand *operand,
5956                           bfd_boolean match_p)
5957 {
5958   unsigned int uval;
5959
5960   /* The operand can be an XYZW mask or a single 2-bit channel index
5961      (with X being 0).  */
5962   gas_assert (operand->size == 2 || operand->size == 4);
5963
5964   /* The suffix can be omitted when it is already part of the opcode.  */
5965   if (arg->token->type != OT_CHANNELS)
5966     return match_p;
5967
5968   uval = arg->token->u.channels;
5969   if (operand->size == 2)
5970     {
5971       /* Check that a single bit is set and convert it into a 2-bit index.  */
5972       if ((uval & -uval) != uval)
5973         return FALSE;
5974       uval = 4 - ffs (uval);
5975     }
5976
5977   if (match_p && insn_extract_operand (arg->insn, operand) != uval)
5978     return FALSE;
5979
5980   ++arg->token;
5981   if (!match_p)
5982     insn_insert_operand (arg->insn, operand, uval);
5983   return TRUE;
5984 }
5985
5986 /* S is the text seen for ARG.  Match it against OPERAND.  Return the end
5987    of the argument text if the match is successful, otherwise return null.  */
5988
5989 static bfd_boolean
5990 match_operand (struct mips_arg_info *arg,
5991                const struct mips_operand *operand)
5992 {
5993   switch (operand->type)
5994     {
5995     case OP_INT:
5996       return match_int_operand (arg, operand);
5997
5998     case OP_MAPPED_INT:
5999       return match_mapped_int_operand (arg, operand);
6000
6001     case OP_MSB:
6002       return match_msb_operand (arg, operand);
6003
6004     case OP_REG:
6005     case OP_OPTIONAL_REG:
6006       return match_reg_operand (arg, operand);
6007
6008     case OP_REG_PAIR:
6009       return match_reg_pair_operand (arg, operand);
6010
6011     case OP_PCREL:
6012       return match_pcrel_operand (arg);
6013
6014     case OP_PERF_REG:
6015       return match_perf_reg_operand (arg, operand);
6016
6017     case OP_ADDIUSP_INT:
6018       return match_addiusp_operand (arg, operand);
6019
6020     case OP_CLO_CLZ_DEST:
6021       return match_clo_clz_dest_operand (arg, operand);
6022
6023     case OP_LWM_SWM_LIST:
6024       return match_lwm_swm_list_operand (arg, operand);
6025
6026     case OP_ENTRY_EXIT_LIST:
6027       return match_entry_exit_operand (arg, operand);
6028
6029     case OP_SAVE_RESTORE_LIST:
6030       return match_save_restore_list_operand (arg);
6031
6032     case OP_MDMX_IMM_REG:
6033       return match_mdmx_imm_reg_operand (arg, operand);
6034
6035     case OP_REPEAT_DEST_REG:
6036       return match_tied_reg_operand (arg, arg->dest_regno);
6037
6038     case OP_REPEAT_PREV_REG:
6039       return match_tied_reg_operand (arg, arg->last_regno);
6040
6041     case OP_PC:
6042       return match_pc_operand (arg);
6043
6044     case OP_VU0_SUFFIX:
6045       return match_vu0_suffix_operand (arg, operand, FALSE);
6046
6047     case OP_VU0_MATCH_SUFFIX:
6048       return match_vu0_suffix_operand (arg, operand, TRUE);
6049
6050     case OP_IMM_INDEX:
6051       return match_imm_index_operand (arg, operand);
6052
6053     case OP_REG_INDEX:
6054       return match_reg_index_operand (arg, operand);
6055
6056     case OP_SAME_RS_RT:
6057       return match_same_rs_rt_operand (arg, operand);
6058
6059     case OP_CHECK_PREV:
6060       return match_check_prev_operand (arg, operand);
6061
6062     case OP_NON_ZERO_REG:
6063       return match_non_zero_reg_operand (arg, operand);
6064     }
6065   abort ();
6066 }
6067
6068 /* ARG is the state after successfully matching an instruction.
6069    Issue any queued-up warnings.  */
6070
6071 static void
6072 check_completed_insn (struct mips_arg_info *arg)
6073 {
6074   if (arg->seen_at)
6075     {
6076       if (AT == ATREG)
6077         as_warn (_("used $at without \".set noat\""));
6078       else
6079         as_warn (_("used $%u with \".set at=$%u\""), AT, AT);
6080     }
6081 }
6082
6083 /* Return true if modifying general-purpose register REG needs a delay.  */
6084
6085 static bfd_boolean
6086 reg_needs_delay (unsigned int reg)
6087 {
6088   unsigned long prev_pinfo;
6089
6090   prev_pinfo = history[0].insn_mo->pinfo;
6091   if (!mips_opts.noreorder
6092       && (((prev_pinfo & INSN_LOAD_MEMORY) && !gpr_interlocks)
6093           || ((prev_pinfo & INSN_LOAD_COPROC) && !cop_interlocks))
6094       && (gpr_write_mask (&history[0]) & (1 << reg)))
6095     return TRUE;
6096
6097   return FALSE;
6098 }
6099
6100 /* Classify an instruction according to the FIX_VR4120_* enumeration.
6101    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
6102    by VR4120 errata.  */
6103
6104 static unsigned int
6105 classify_vr4120_insn (const char *name)
6106 {
6107   if (strncmp (name, "macc", 4) == 0)
6108     return FIX_VR4120_MACC;
6109   if (strncmp (name, "dmacc", 5) == 0)
6110     return FIX_VR4120_DMACC;
6111   if (strncmp (name, "mult", 4) == 0)
6112     return FIX_VR4120_MULT;
6113   if (strncmp (name, "dmult", 5) == 0)
6114     return FIX_VR4120_DMULT;
6115   if (strstr (name, "div"))
6116     return FIX_VR4120_DIV;
6117   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
6118     return FIX_VR4120_MTHILO;
6119   return NUM_FIX_VR4120_CLASSES;
6120 }
6121
6122 #define INSN_ERET       0x42000018
6123 #define INSN_DERET      0x4200001f
6124 #define INSN_DMULT      0x1c
6125 #define INSN_DMULTU     0x1d
6126
6127 /* Return the number of instructions that must separate INSN1 and INSN2,
6128    where INSN1 is the earlier instruction.  Return the worst-case value
6129    for any INSN2 if INSN2 is null.  */
6130
6131 static unsigned int
6132 insns_between (const struct mips_cl_insn *insn1,
6133                const struct mips_cl_insn *insn2)
6134 {
6135   unsigned long pinfo1, pinfo2;
6136   unsigned int mask;
6137
6138   /* If INFO2 is null, pessimistically assume that all flags are set for
6139      the second instruction.  */
6140   pinfo1 = insn1->insn_mo->pinfo;
6141   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
6142
6143   /* For most targets, write-after-read dependencies on the HI and LO
6144      registers must be separated by at least two instructions.  */
6145   if (!hilo_interlocks)
6146     {
6147       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
6148         return 2;
6149       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
6150         return 2;
6151     }
6152
6153   /* If we're working around r7000 errata, there must be two instructions
6154      between an mfhi or mflo and any instruction that uses the result.  */
6155   if (mips_7000_hilo_fix
6156       && !mips_opts.micromips
6157       && MF_HILO_INSN (pinfo1)
6158       && (insn2 == NULL || (gpr_read_mask (insn2) & gpr_write_mask (insn1))))
6159     return 2;
6160
6161   /* If we're working around 24K errata, one instruction is required
6162      if an ERET or DERET is followed by a branch instruction.  */
6163   if (mips_fix_24k && !mips_opts.micromips)
6164     {
6165       if (insn1->insn_opcode == INSN_ERET
6166           || insn1->insn_opcode == INSN_DERET)
6167         {
6168           if (insn2 == NULL
6169               || insn2->insn_opcode == INSN_ERET
6170               || insn2->insn_opcode == INSN_DERET
6171               || delayed_branch_p (insn2))
6172             return 1;
6173         }
6174     }
6175
6176   /* If we're working around PMC RM7000 errata, there must be three
6177      nops between a dmult and a load instruction.  */
6178   if (mips_fix_rm7000 && !mips_opts.micromips)
6179     {
6180       if ((insn1->insn_opcode & insn1->insn_mo->mask) == INSN_DMULT
6181           || (insn1->insn_opcode & insn1->insn_mo->mask) == INSN_DMULTU)
6182         {
6183           if (pinfo2 & INSN_LOAD_MEMORY)
6184            return 3;
6185         }
6186     }
6187
6188   /* If working around VR4120 errata, check for combinations that need
6189      a single intervening instruction.  */
6190   if (mips_fix_vr4120 && !mips_opts.micromips)
6191     {
6192       unsigned int class1, class2;
6193
6194       class1 = classify_vr4120_insn (insn1->insn_mo->name);
6195       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
6196         {
6197           if (insn2 == NULL)
6198             return 1;
6199           class2 = classify_vr4120_insn (insn2->insn_mo->name);
6200           if (vr4120_conflicts[class1] & (1 << class2))
6201             return 1;
6202         }
6203     }
6204
6205   if (!HAVE_CODE_COMPRESSION)
6206     {
6207       /* Check for GPR or coprocessor load delays.  All such delays
6208          are on the RT register.  */
6209       /* Itbl support may require additional care here.  */
6210       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY))
6211           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC)))
6212         {
6213           if (insn2 == NULL || (gpr_read_mask (insn2) & gpr_write_mask (insn1)))
6214             return 1;
6215         }
6216
6217       /* Check for generic coprocessor hazards.
6218
6219          This case is not handled very well.  There is no special
6220          knowledge of CP0 handling, and the coprocessors other than
6221          the floating point unit are not distinguished at all.  */
6222       /* Itbl support may require additional care here. FIXME!
6223          Need to modify this to include knowledge about
6224          user specified delays!  */
6225       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE))
6226                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
6227         {
6228           /* Handle cases where INSN1 writes to a known general coprocessor
6229              register.  There must be a one instruction delay before INSN2
6230              if INSN2 reads that register, otherwise no delay is needed.  */
6231           mask = fpr_write_mask (insn1);
6232           if (mask != 0)
6233             {
6234               if (!insn2 || (mask & fpr_read_mask (insn2)) != 0)
6235                 return 1;
6236             }
6237           else
6238             {
6239               /* Read-after-write dependencies on the control registers
6240                  require a two-instruction gap.  */
6241               if ((pinfo1 & INSN_WRITE_COND_CODE)
6242                   && (pinfo2 & INSN_READ_COND_CODE))
6243                 return 2;
6244
6245               /* We don't know exactly what INSN1 does.  If INSN2 is
6246                  also a coprocessor instruction, assume there must be
6247                  a one instruction gap.  */
6248               if (pinfo2 & INSN_COP)
6249                 return 1;
6250             }
6251         }
6252
6253       /* Check for read-after-write dependencies on the coprocessor
6254          control registers in cases where INSN1 does not need a general
6255          coprocessor delay.  This means that INSN1 is a floating point
6256          comparison instruction.  */
6257       /* Itbl support may require additional care here.  */
6258       else if (!cop_interlocks
6259                && (pinfo1 & INSN_WRITE_COND_CODE)
6260                && (pinfo2 & INSN_READ_COND_CODE))
6261         return 1;
6262     }
6263
6264   /* Forbidden slots can not contain Control Transfer Instructions (CTIs)
6265      CTIs include all branches and jumps, nal, eret, eretnc, deret, wait
6266      and pause.  */
6267   if ((insn1->insn_mo->pinfo2 & INSN2_FORBIDDEN_SLOT)
6268       && ((pinfo2 & INSN_NO_DELAY_SLOT)
6269           || (insn2 && delayed_branch_p (insn2))))
6270     return 1;
6271
6272   return 0;
6273 }
6274
6275 /* Return the number of nops that would be needed to work around the
6276    VR4130 mflo/mfhi errata if instruction INSN immediately followed
6277    the MAX_VR4130_NOPS instructions described by HIST.  Ignore hazards
6278    that are contained within the first IGNORE instructions of HIST.  */
6279
6280 static int
6281 nops_for_vr4130 (int ignore, const struct mips_cl_insn *hist,
6282                  const struct mips_cl_insn *insn)
6283 {
6284   int i, j;
6285   unsigned int mask;
6286
6287   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
6288      are not affected by the errata.  */
6289   if (insn != 0
6290       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
6291           || strcmp (insn->insn_mo->name, "mtlo") == 0
6292           || strcmp (insn->insn_mo->name, "mthi") == 0))
6293     return 0;
6294
6295   /* Search for the first MFLO or MFHI.  */
6296   for (i = 0; i < MAX_VR4130_NOPS; i++)
6297     if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
6298       {
6299         /* Extract the destination register.  */
6300         mask = gpr_write_mask (&hist[i]);
6301
6302         /* No nops are needed if INSN reads that register.  */
6303         if (insn != NULL && (gpr_read_mask (insn) & mask) != 0)
6304           return 0;
6305
6306         /* ...or if any of the intervening instructions do.  */
6307         for (j = 0; j < i; j++)
6308           if (gpr_read_mask (&hist[j]) & mask)
6309             return 0;
6310
6311         if (i >= ignore)
6312           return MAX_VR4130_NOPS - i;
6313       }
6314   return 0;
6315 }
6316
6317 #define BASE_REG_EQ(INSN1, INSN2)       \
6318   ((((INSN1) >> OP_SH_RS) & OP_MASK_RS) \
6319       == (((INSN2) >> OP_SH_RS) & OP_MASK_RS))
6320
6321 /* Return the minimum alignment for this store instruction.  */
6322
6323 static int
6324 fix_24k_align_to (const struct mips_opcode *mo)
6325 {
6326   if (strcmp (mo->name, "sh") == 0)
6327     return 2;
6328
6329   if (strcmp (mo->name, "swc1") == 0
6330       || strcmp (mo->name, "swc2") == 0
6331       || strcmp (mo->name, "sw") == 0
6332       || strcmp (mo->name, "sc") == 0
6333       || strcmp (mo->name, "s.s") == 0)
6334     return 4;
6335
6336   if (strcmp (mo->name, "sdc1") == 0
6337       || strcmp (mo->name, "sdc2") == 0
6338       || strcmp (mo->name, "s.d") == 0)
6339     return 8;
6340
6341   /* sb, swl, swr */
6342   return 1;
6343 }
6344
6345 struct fix_24k_store_info
6346   {
6347     /* Immediate offset, if any, for this store instruction.  */
6348     short off;
6349     /* Alignment required by this store instruction.  */
6350     int align_to;
6351     /* True for register offsets.  */
6352     int register_offset;
6353   };
6354
6355 /* Comparison function used by qsort.  */
6356
6357 static int
6358 fix_24k_sort (const void *a, const void *b)
6359 {
6360   const struct fix_24k_store_info *pos1 = a;
6361   const struct fix_24k_store_info *pos2 = b;
6362
6363   return (pos1->off - pos2->off);
6364 }
6365
6366 /* INSN is a store instruction.  Try to record the store information
6367    in STINFO.  Return false if the information isn't known.  */
6368
6369 static bfd_boolean
6370 fix_24k_record_store_info (struct fix_24k_store_info *stinfo,
6371                            const struct mips_cl_insn *insn)
6372 {
6373   /* The instruction must have a known offset.  */
6374   if (!insn->complete_p || !strstr (insn->insn_mo->args, "o("))
6375     return FALSE;
6376
6377   stinfo->off = (insn->insn_opcode >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE;
6378   stinfo->align_to = fix_24k_align_to (insn->insn_mo);
6379   return TRUE;
6380 }
6381
6382 /* Return the number of nops that would be needed to work around the 24k
6383    "lost data on stores during refill" errata if instruction INSN
6384    immediately followed the 2 instructions described by HIST.
6385    Ignore hazards that are contained within the first IGNORE
6386    instructions of HIST.
6387
6388    Problem: The FSB (fetch store buffer) acts as an intermediate buffer
6389    for the data cache refills and store data. The following describes
6390    the scenario where the store data could be lost.
6391
6392    * A data cache miss, due to either a load or a store, causing fill
6393      data to be supplied by the memory subsystem
6394    * The first three doublewords of fill data are returned and written
6395      into the cache
6396    * A sequence of four stores occurs in consecutive cycles around the
6397      final doubleword of the fill:
6398    * Store A
6399    * Store B
6400    * Store C
6401    * Zero, One or more instructions
6402    * Store D
6403
6404    The four stores A-D must be to different doublewords of the line that
6405    is being filled. The fourth instruction in the sequence above permits
6406    the fill of the final doubleword to be transferred from the FSB into
6407    the cache. In the sequence above, the stores may be either integer
6408    (sb, sh, sw, swr, swl, sc) or coprocessor (swc1/swc2, sdc1/sdc2,
6409    swxc1, sdxc1, suxc1) stores, as long as the four stores are to
6410    different doublewords on the line. If the floating point unit is
6411    running in 1:2 mode, it is not possible to create the sequence above
6412    using only floating point store instructions.
6413
6414    In this case, the cache line being filled is incorrectly marked
6415    invalid, thereby losing the data from any store to the line that
6416    occurs between the original miss and the completion of the five
6417    cycle sequence shown above.
6418
6419    The workarounds are:
6420
6421    * Run the data cache in write-through mode.
6422    * Insert a non-store instruction between
6423      Store A and Store B or Store B and Store C.  */
6424
6425 static int
6426 nops_for_24k (int ignore, const struct mips_cl_insn *hist,
6427               const struct mips_cl_insn *insn)
6428 {
6429   struct fix_24k_store_info pos[3];
6430   int align, i, base_offset;
6431
6432   if (ignore >= 2)
6433     return 0;
6434
6435   /* If the previous instruction wasn't a store, there's nothing to
6436      worry about.  */
6437   if ((hist[0].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
6438     return 0;
6439
6440   /* If the instructions after the previous one are unknown, we have
6441      to assume the worst.  */
6442   if (!insn)
6443     return 1;
6444
6445   /* Check whether we are dealing with three consecutive stores.  */
6446   if ((insn->insn_mo->pinfo & INSN_STORE_MEMORY) == 0
6447       || (hist[1].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
6448     return 0;
6449
6450   /* If we don't know the relationship between the store addresses,
6451      assume the worst.  */
6452   if (!BASE_REG_EQ (insn->insn_opcode, hist[0].insn_opcode)
6453       || !BASE_REG_EQ (insn->insn_opcode, hist[1].insn_opcode))
6454     return 1;
6455
6456   if (!fix_24k_record_store_info (&pos[0], insn)
6457       || !fix_24k_record_store_info (&pos[1], &hist[0])
6458       || !fix_24k_record_store_info (&pos[2], &hist[1]))
6459     return 1;
6460
6461   qsort (&pos, 3, sizeof (struct fix_24k_store_info), fix_24k_sort);
6462
6463   /* Pick a value of ALIGN and X such that all offsets are adjusted by
6464      X bytes and such that the base register + X is known to be aligned
6465      to align bytes.  */
6466
6467   if (((insn->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == SP)
6468     align = 8;
6469   else
6470     {
6471       align = pos[0].align_to;
6472       base_offset = pos[0].off;
6473       for (i = 1; i < 3; i++)
6474         if (align < pos[i].align_to)
6475           {
6476             align = pos[i].align_to;
6477             base_offset = pos[i].off;
6478           }
6479       for (i = 0; i < 3; i++)
6480         pos[i].off -= base_offset;
6481     }
6482
6483   pos[0].off &= ~align + 1;
6484   pos[1].off &= ~align + 1;
6485   pos[2].off &= ~align + 1;
6486
6487   /* If any two stores write to the same chunk, they also write to the
6488      same doubleword.  The offsets are still sorted at this point.  */
6489   if (pos[0].off == pos[1].off || pos[1].off == pos[2].off)
6490     return 0;
6491
6492   /* A range of at least 9 bytes is needed for the stores to be in
6493      non-overlapping doublewords.  */
6494   if (pos[2].off - pos[0].off <= 8)
6495     return 0;
6496
6497   if (pos[2].off - pos[1].off >= 24
6498       || pos[1].off - pos[0].off >= 24
6499       || pos[2].off - pos[0].off >= 32)
6500     return 0;
6501
6502   return 1;
6503 }
6504
6505 /* Return the number of nops that would be needed if instruction INSN
6506    immediately followed the MAX_NOPS instructions given by HIST,
6507    where HIST[0] is the most recent instruction.  Ignore hazards
6508    between INSN and the first IGNORE instructions in HIST.
6509
6510    If INSN is null, return the worse-case number of nops for any
6511    instruction.  */
6512
6513 static int
6514 nops_for_insn (int ignore, const struct mips_cl_insn *hist,
6515                const struct mips_cl_insn *insn)
6516 {
6517   int i, nops, tmp_nops;
6518
6519   nops = 0;
6520   for (i = ignore; i < MAX_DELAY_NOPS; i++)
6521     {
6522       tmp_nops = insns_between (hist + i, insn) - i;
6523       if (tmp_nops > nops)
6524         nops = tmp_nops;
6525     }
6526
6527   if (mips_fix_vr4130 && !mips_opts.micromips)
6528     {
6529       tmp_nops = nops_for_vr4130 (ignore, hist, insn);
6530       if (tmp_nops > nops)
6531         nops = tmp_nops;
6532     }
6533
6534   if (mips_fix_24k && !mips_opts.micromips)
6535     {
6536       tmp_nops = nops_for_24k (ignore, hist, insn);
6537       if (tmp_nops > nops)
6538         nops = tmp_nops;
6539     }
6540
6541   return nops;
6542 }
6543
6544 /* The variable arguments provide NUM_INSNS extra instructions that
6545    might be added to HIST.  Return the largest number of nops that
6546    would be needed after the extended sequence, ignoring hazards
6547    in the first IGNORE instructions.  */
6548
6549 static int
6550 nops_for_sequence (int num_insns, int ignore,
6551                    const struct mips_cl_insn *hist, ...)
6552 {
6553   va_list args;
6554   struct mips_cl_insn buffer[MAX_NOPS];
6555   struct mips_cl_insn *cursor;
6556   int nops;
6557
6558   va_start (args, hist);
6559   cursor = buffer + num_insns;
6560   memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
6561   while (cursor > buffer)
6562     *--cursor = *va_arg (args, const struct mips_cl_insn *);
6563
6564   nops = nops_for_insn (ignore, buffer, NULL);
6565   va_end (args);
6566   return nops;
6567 }
6568
6569 /* Like nops_for_insn, but if INSN is a branch, take into account the
6570    worst-case delay for the branch target.  */
6571
6572 static int
6573 nops_for_insn_or_target (int ignore, const struct mips_cl_insn *hist,
6574                          const struct mips_cl_insn *insn)
6575 {
6576   int nops, tmp_nops;
6577
6578   nops = nops_for_insn (ignore, hist, insn);
6579   if (delayed_branch_p (insn))
6580     {
6581       tmp_nops = nops_for_sequence (2, ignore ? ignore + 2 : 0,
6582                                     hist, insn, get_delay_slot_nop (insn));
6583       if (tmp_nops > nops)
6584         nops = tmp_nops;
6585     }
6586   else if (compact_branch_p (insn))
6587     {
6588       tmp_nops = nops_for_sequence (1, ignore ? ignore + 1 : 0, hist, insn);
6589       if (tmp_nops > nops)
6590         nops = tmp_nops;
6591     }
6592   return nops;
6593 }
6594
6595 /* Fix NOP issue: Replace nops by "or at,at,zero".  */
6596
6597 static void
6598 fix_loongson2f_nop (struct mips_cl_insn * ip)
6599 {
6600   gas_assert (!HAVE_CODE_COMPRESSION);
6601   if (strcmp (ip->insn_mo->name, "nop") == 0)
6602     ip->insn_opcode = LOONGSON2F_NOP_INSN;
6603 }
6604
6605 /* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
6606                    jr target pc &= 'hffff_ffff_cfff_ffff.  */
6607
6608 static void
6609 fix_loongson2f_jump (struct mips_cl_insn * ip)
6610 {
6611   gas_assert (!HAVE_CODE_COMPRESSION);
6612   if (strcmp (ip->insn_mo->name, "j") == 0
6613       || strcmp (ip->insn_mo->name, "jr") == 0
6614       || strcmp (ip->insn_mo->name, "jalr") == 0)
6615     {
6616       int sreg;
6617       expressionS ep;
6618
6619       if (! mips_opts.at)
6620         return;
6621
6622       sreg = EXTRACT_OPERAND (0, RS, *ip);
6623       if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
6624         return;
6625
6626       ep.X_op = O_constant;
6627       ep.X_add_number = 0xcfff0000;
6628       macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
6629       ep.X_add_number = 0xffff;
6630       macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
6631       macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
6632     }
6633 }
6634
6635 static void
6636 fix_loongson2f (struct mips_cl_insn * ip)
6637 {
6638   if (mips_fix_loongson2f_nop)
6639     fix_loongson2f_nop (ip);
6640
6641   if (mips_fix_loongson2f_jump)
6642     fix_loongson2f_jump (ip);
6643 }
6644
6645 /* IP is a branch that has a delay slot, and we need to fill it
6646    automatically.   Return true if we can do that by swapping IP
6647    with the previous instruction.
6648    ADDRESS_EXPR is an operand of the instruction to be used with
6649    RELOC_TYPE.  */
6650
6651 static bfd_boolean
6652 can_swap_branch_p (struct mips_cl_insn *ip, expressionS *address_expr,
6653                    bfd_reloc_code_real_type *reloc_type)
6654 {
6655   unsigned long pinfo, pinfo2, prev_pinfo, prev_pinfo2;
6656   unsigned int gpr_read, gpr_write, prev_gpr_read, prev_gpr_write;
6657   unsigned int fpr_read, prev_fpr_write;
6658
6659   /* -O2 and above is required for this optimization.  */
6660   if (mips_optimize < 2)
6661     return FALSE;
6662
6663   /* If we have seen .set volatile or .set nomove, don't optimize.  */
6664   if (mips_opts.nomove)
6665     return FALSE;
6666
6667   /* We can't swap if the previous instruction's position is fixed.  */
6668   if (history[0].fixed_p)
6669     return FALSE;
6670
6671   /* If the previous previous insn was in a .set noreorder, we can't
6672      swap.  Actually, the MIPS assembler will swap in this situation.
6673      However, gcc configured -with-gnu-as will generate code like
6674
6675         .set    noreorder
6676         lw      $4,XXX
6677         .set    reorder
6678         INSN
6679         bne     $4,$0,foo
6680
6681      in which we can not swap the bne and INSN.  If gcc is not configured
6682      -with-gnu-as, it does not output the .set pseudo-ops.  */
6683   if (history[1].noreorder_p)
6684     return FALSE;
6685
6686   /* If the previous instruction had a fixup in mips16 mode, we can not swap.
6687      This means that the previous instruction was a 4-byte one anyhow.  */
6688   if (mips_opts.mips16 && history[0].fixp[0])
6689     return FALSE;
6690
6691   /* If the branch is itself the target of a branch, we can not swap.
6692      We cheat on this; all we check for is whether there is a label on
6693      this instruction.  If there are any branches to anything other than
6694      a label, users must use .set noreorder.  */
6695   if (seg_info (now_seg)->label_list)
6696     return FALSE;
6697
6698   /* If the previous instruction is in a variant frag other than this
6699      branch's one, we cannot do the swap.  This does not apply to
6700      MIPS16 code, which uses variant frags for different purposes.  */
6701   if (!mips_opts.mips16
6702       && history[0].frag
6703       && history[0].frag->fr_type == rs_machine_dependent)
6704     return FALSE;
6705
6706   /* We do not swap with instructions that cannot architecturally
6707      be placed in a branch delay slot, such as SYNC or ERET.  We
6708      also refrain from swapping with a trap instruction, since it
6709      complicates trap handlers to have the trap instruction be in
6710      a delay slot.  */
6711   prev_pinfo = history[0].insn_mo->pinfo;
6712   if (prev_pinfo & INSN_NO_DELAY_SLOT)
6713     return FALSE;
6714
6715   /* Check for conflicts between the branch and the instructions
6716      before the candidate delay slot.  */
6717   if (nops_for_insn (0, history + 1, ip) > 0)
6718     return FALSE;
6719
6720   /* Check for conflicts between the swapped sequence and the
6721      target of the branch.  */
6722   if (nops_for_sequence (2, 0, history + 1, ip, history) > 0)
6723     return FALSE;
6724
6725   /* If the branch reads a register that the previous
6726      instruction sets, we can not swap.  */
6727   gpr_read = gpr_read_mask (ip);
6728   prev_gpr_write = gpr_write_mask (&history[0]);
6729   if (gpr_read & prev_gpr_write)
6730     return FALSE;
6731
6732   fpr_read = fpr_read_mask (ip);
6733   prev_fpr_write = fpr_write_mask (&history[0]);
6734   if (fpr_read & prev_fpr_write)
6735     return FALSE;
6736
6737   /* If the branch writes a register that the previous
6738      instruction sets, we can not swap.  */
6739   gpr_write = gpr_write_mask (ip);
6740   if (gpr_write & prev_gpr_write)
6741     return FALSE;
6742
6743   /* If the branch writes a register that the previous
6744      instruction reads, we can not swap.  */
6745   prev_gpr_read = gpr_read_mask (&history[0]);
6746   if (gpr_write & prev_gpr_read)
6747     return FALSE;
6748
6749   /* If one instruction sets a condition code and the
6750      other one uses a condition code, we can not swap.  */
6751   pinfo = ip->insn_mo->pinfo;
6752   if ((pinfo & INSN_READ_COND_CODE)
6753       && (prev_pinfo & INSN_WRITE_COND_CODE))
6754     return FALSE;
6755   if ((pinfo & INSN_WRITE_COND_CODE)
6756       && (prev_pinfo & INSN_READ_COND_CODE))
6757     return FALSE;
6758
6759   /* If the previous instruction uses the PC, we can not swap.  */
6760   prev_pinfo2 = history[0].insn_mo->pinfo2;
6761   if (prev_pinfo2 & INSN2_READ_PC)
6762     return FALSE;
6763
6764   /* If the previous instruction has an incorrect size for a fixed
6765      branch delay slot in microMIPS mode, we cannot swap.  */
6766   pinfo2 = ip->insn_mo->pinfo2;
6767   if (mips_opts.micromips
6768       && (pinfo2 & INSN2_BRANCH_DELAY_16BIT)
6769       && insn_length (history) != 2)
6770     return FALSE;
6771   if (mips_opts.micromips
6772       && (pinfo2 & INSN2_BRANCH_DELAY_32BIT)
6773       && insn_length (history) != 4)
6774     return FALSE;
6775
6776   /* On R5900 short loops need to be fixed by inserting a nop in
6777      the branch delay slots.
6778      A short loop can be terminated too early.  */
6779   if (mips_opts.arch == CPU_R5900
6780       /* Check if instruction has a parameter, ignore "j $31". */
6781       && (address_expr != NULL)
6782       /* Parameter must be 16 bit. */
6783       && (*reloc_type == BFD_RELOC_16_PCREL_S2)
6784       /* Branch to same segment. */
6785       && (S_GET_SEGMENT (address_expr->X_add_symbol) == now_seg)
6786       /* Branch to same code fragment. */
6787       && (symbol_get_frag (address_expr->X_add_symbol) == frag_now)
6788       /* Can only calculate branch offset if value is known. */
6789       && symbol_constant_p (address_expr->X_add_symbol)
6790       /* Check if branch is really conditional. */
6791       && !((ip->insn_opcode & 0xffff0000) == 0x10000000   /* beq $0,$0 */
6792         || (ip->insn_opcode & 0xffff0000) == 0x04010000   /* bgez $0 */
6793         || (ip->insn_opcode & 0xffff0000) == 0x04110000)) /* bgezal $0 */
6794     {
6795       int distance;
6796       /* Check if loop is shorter than 6 instructions including
6797          branch and delay slot.  */
6798       distance = frag_now_fix () - S_GET_VALUE (address_expr->X_add_symbol);
6799       if (distance <= 20)
6800         {
6801           int i;
6802           int rv;
6803
6804           rv = FALSE;
6805           /* When the loop includes branches or jumps,
6806              it is not a short loop. */
6807           for (i = 0; i < (distance / 4); i++)
6808             {
6809               if ((history[i].cleared_p)
6810                   || delayed_branch_p (&history[i]))
6811                 {
6812                   rv = TRUE;
6813                   break;
6814                 }
6815             }
6816           if (rv == FALSE)
6817             {
6818               /* Insert nop after branch to fix short loop. */
6819               return FALSE;
6820             }
6821         }
6822     }
6823
6824   return TRUE;
6825 }
6826
6827 /* Decide how we should add IP to the instruction stream.
6828    ADDRESS_EXPR is an operand of the instruction to be used with
6829    RELOC_TYPE.  */
6830
6831 static enum append_method
6832 get_append_method (struct mips_cl_insn *ip, expressionS *address_expr,
6833                    bfd_reloc_code_real_type *reloc_type)
6834 {
6835   /* The relaxed version of a macro sequence must be inherently
6836      hazard-free.  */
6837   if (mips_relax.sequence == 2)
6838     return APPEND_ADD;
6839
6840   /* We must not dabble with instructions in a ".set noreorder" block.  */
6841   if (mips_opts.noreorder)
6842     return APPEND_ADD;
6843
6844   /* Otherwise, it's our responsibility to fill branch delay slots.  */
6845   if (delayed_branch_p (ip))
6846     {
6847       if (!branch_likely_p (ip)
6848           && can_swap_branch_p (ip, address_expr, reloc_type))
6849         return APPEND_SWAP;
6850
6851       if (mips_opts.mips16
6852           && ISA_SUPPORTS_MIPS16E
6853           && gpr_read_mask (ip) != 0)
6854         return APPEND_ADD_COMPACT;
6855
6856       if (mips_opts.micromips
6857           && ((ip->insn_opcode & 0xffe0) == 0x4580
6858               || (!forced_insn_length
6859                   && ((ip->insn_opcode & 0xfc00) == 0xcc00
6860                       || (ip->insn_opcode & 0xdc00) == 0x8c00))
6861               || (ip->insn_opcode & 0xdfe00000) == 0x94000000
6862               || (ip->insn_opcode & 0xdc1f0000) == 0x94000000))
6863         return APPEND_ADD_COMPACT;
6864
6865       return APPEND_ADD_WITH_NOP;
6866     }
6867
6868   return APPEND_ADD;
6869 }
6870
6871 /* IP is an instruction whose opcode we have just changed, END points
6872    to the end of the opcode table processed.  Point IP->insn_mo to the
6873    new opcode's definition.  */
6874
6875 static void
6876 find_altered_opcode (struct mips_cl_insn *ip, const struct mips_opcode *end)
6877 {
6878   const struct mips_opcode *mo;
6879
6880   for (mo = ip->insn_mo; mo < end; mo++)
6881     if (mo->pinfo != INSN_MACRO
6882         && (ip->insn_opcode & mo->mask) == mo->match)
6883       {
6884         ip->insn_mo = mo;
6885         return;
6886       }
6887   abort ();
6888 }
6889
6890 /* IP is a MIPS16 instruction whose opcode we have just changed.
6891    Point IP->insn_mo to the new opcode's definition.  */
6892
6893 static void
6894 find_altered_mips16_opcode (struct mips_cl_insn *ip)
6895 {
6896   find_altered_opcode (ip, &mips16_opcodes[bfd_mips16_num_opcodes]);
6897 }
6898
6899 /* IP is a microMIPS instruction whose opcode we have just changed.
6900    Point IP->insn_mo to the new opcode's definition.  */
6901
6902 static void
6903 find_altered_micromips_opcode (struct mips_cl_insn *ip)
6904 {
6905   find_altered_opcode (ip, &micromips_opcodes[bfd_micromips_num_opcodes]);
6906 }
6907
6908 /* For microMIPS macros, we need to generate a local number label
6909    as the target of branches.  */
6910 #define MICROMIPS_LABEL_CHAR            '\037'
6911 static unsigned long micromips_target_label;
6912 static char micromips_target_name[32];
6913
6914 static char *
6915 micromips_label_name (void)
6916 {
6917   char *p = micromips_target_name;
6918   char symbol_name_temporary[24];
6919   unsigned long l;
6920   int i;
6921
6922   if (*p)
6923     return p;
6924
6925   i = 0;
6926   l = micromips_target_label;
6927 #ifdef LOCAL_LABEL_PREFIX
6928   *p++ = LOCAL_LABEL_PREFIX;
6929 #endif
6930   *p++ = 'L';
6931   *p++ = MICROMIPS_LABEL_CHAR;
6932   do
6933     {
6934       symbol_name_temporary[i++] = l % 10 + '0';
6935       l /= 10;
6936     }
6937   while (l != 0);
6938   while (i > 0)
6939     *p++ = symbol_name_temporary[--i];
6940   *p = '\0';
6941
6942   return micromips_target_name;
6943 }
6944
6945 static void
6946 micromips_label_expr (expressionS *label_expr)
6947 {
6948   label_expr->X_op = O_symbol;
6949   label_expr->X_add_symbol = symbol_find_or_make (micromips_label_name ());
6950   label_expr->X_add_number = 0;
6951 }
6952
6953 static void
6954 micromips_label_inc (void)
6955 {
6956   micromips_target_label++;
6957   *micromips_target_name = '\0';
6958 }
6959
6960 static void
6961 micromips_add_label (void)
6962 {
6963   symbolS *s;
6964
6965   s = colon (micromips_label_name ());
6966   micromips_label_inc ();
6967   S_SET_OTHER (s, ELF_ST_SET_MICROMIPS (S_GET_OTHER (s)));
6968 }
6969
6970 /* If assembling microMIPS code, then return the microMIPS reloc
6971    corresponding to the requested one if any.  Otherwise return
6972    the reloc unchanged.  */
6973
6974 static bfd_reloc_code_real_type
6975 micromips_map_reloc (bfd_reloc_code_real_type reloc)
6976 {
6977   static const bfd_reloc_code_real_type relocs[][2] =
6978     {
6979       /* Keep sorted incrementally by the left-hand key.  */
6980       { BFD_RELOC_16_PCREL_S2, BFD_RELOC_MICROMIPS_16_PCREL_S1 },
6981       { BFD_RELOC_GPREL16, BFD_RELOC_MICROMIPS_GPREL16 },
6982       { BFD_RELOC_MIPS_JMP, BFD_RELOC_MICROMIPS_JMP },
6983       { BFD_RELOC_HI16, BFD_RELOC_MICROMIPS_HI16 },
6984       { BFD_RELOC_HI16_S, BFD_RELOC_MICROMIPS_HI16_S },
6985       { BFD_RELOC_LO16, BFD_RELOC_MICROMIPS_LO16 },
6986       { BFD_RELOC_MIPS_LITERAL, BFD_RELOC_MICROMIPS_LITERAL },
6987       { BFD_RELOC_MIPS_GOT16, BFD_RELOC_MICROMIPS_GOT16 },
6988       { BFD_RELOC_MIPS_CALL16, BFD_RELOC_MICROMIPS_CALL16 },
6989       { BFD_RELOC_MIPS_GOT_HI16, BFD_RELOC_MICROMIPS_GOT_HI16 },
6990       { BFD_RELOC_MIPS_GOT_LO16, BFD_RELOC_MICROMIPS_GOT_LO16 },
6991       { BFD_RELOC_MIPS_CALL_HI16, BFD_RELOC_MICROMIPS_CALL_HI16 },
6992       { BFD_RELOC_MIPS_CALL_LO16, BFD_RELOC_MICROMIPS_CALL_LO16 },
6993       { BFD_RELOC_MIPS_SUB, BFD_RELOC_MICROMIPS_SUB },
6994       { BFD_RELOC_MIPS_GOT_PAGE, BFD_RELOC_MICROMIPS_GOT_PAGE },
6995       { BFD_RELOC_MIPS_GOT_OFST, BFD_RELOC_MICROMIPS_GOT_OFST },
6996       { BFD_RELOC_MIPS_GOT_DISP, BFD_RELOC_MICROMIPS_GOT_DISP },
6997       { BFD_RELOC_MIPS_HIGHEST, BFD_RELOC_MICROMIPS_HIGHEST },
6998       { BFD_RELOC_MIPS_HIGHER, BFD_RELOC_MICROMIPS_HIGHER },
6999       { BFD_RELOC_MIPS_SCN_DISP, BFD_RELOC_MICROMIPS_SCN_DISP },
7000       { BFD_RELOC_MIPS_TLS_GD, BFD_RELOC_MICROMIPS_TLS_GD },
7001       { BFD_RELOC_MIPS_TLS_LDM, BFD_RELOC_MICROMIPS_TLS_LDM },
7002       { BFD_RELOC_MIPS_TLS_DTPREL_HI16, BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16 },
7003       { BFD_RELOC_MIPS_TLS_DTPREL_LO16, BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16 },
7004       { BFD_RELOC_MIPS_TLS_GOTTPREL, BFD_RELOC_MICROMIPS_TLS_GOTTPREL },
7005       { BFD_RELOC_MIPS_TLS_TPREL_HI16, BFD_RELOC_MICROMIPS_TLS_TPREL_HI16 },
7006       { BFD_RELOC_MIPS_TLS_TPREL_LO16, BFD_RELOC_MICROMIPS_TLS_TPREL_LO16 }
7007     };
7008   bfd_reloc_code_real_type r;
7009   size_t i;
7010
7011   if (!mips_opts.micromips)
7012     return reloc;
7013   for (i = 0; i < ARRAY_SIZE (relocs); i++)
7014     {
7015       r = relocs[i][0];
7016       if (r > reloc)
7017         return reloc;
7018       if (r == reloc)
7019         return relocs[i][1];
7020     }
7021   return reloc;
7022 }
7023
7024 /* Try to resolve relocation RELOC against constant OPERAND at assembly time.
7025    Return true on success, storing the resolved value in RESULT.  */
7026
7027 static bfd_boolean
7028 calculate_reloc (bfd_reloc_code_real_type reloc, offsetT operand,
7029                  offsetT *result)
7030 {
7031   switch (reloc)
7032     {
7033     case BFD_RELOC_MIPS_HIGHEST:
7034     case BFD_RELOC_MICROMIPS_HIGHEST:
7035       *result = ((operand + 0x800080008000ull) >> 48) & 0xffff;
7036       return TRUE;
7037
7038     case BFD_RELOC_MIPS_HIGHER:
7039     case BFD_RELOC_MICROMIPS_HIGHER:
7040       *result = ((operand + 0x80008000ull) >> 32) & 0xffff;
7041       return TRUE;
7042
7043     case BFD_RELOC_HI16_S:
7044     case BFD_RELOC_HI16_S_PCREL:
7045     case BFD_RELOC_MICROMIPS_HI16_S:
7046     case BFD_RELOC_MIPS16_HI16_S:
7047       *result = ((operand + 0x8000) >> 16) & 0xffff;
7048       return TRUE;
7049
7050     case BFD_RELOC_HI16:
7051     case BFD_RELOC_MICROMIPS_HI16:
7052     case BFD_RELOC_MIPS16_HI16:
7053       *result = (operand >> 16) & 0xffff;
7054       return TRUE;
7055
7056     case BFD_RELOC_LO16:
7057     case BFD_RELOC_LO16_PCREL:
7058     case BFD_RELOC_MICROMIPS_LO16:
7059     case BFD_RELOC_MIPS16_LO16:
7060       *result = operand & 0xffff;
7061       return TRUE;
7062
7063     case BFD_RELOC_UNUSED:
7064       *result = operand;
7065       return TRUE;
7066
7067     default:
7068       return FALSE;
7069     }
7070 }
7071
7072 /* Output an instruction.  IP is the instruction information.
7073    ADDRESS_EXPR is an operand of the instruction to be used with
7074    RELOC_TYPE.  EXPANSIONP is true if the instruction is part of
7075    a macro expansion.  */
7076
7077 static void
7078 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
7079              bfd_reloc_code_real_type *reloc_type, bfd_boolean expansionp)
7080 {
7081   unsigned long prev_pinfo2, pinfo;
7082   bfd_boolean relaxed_branch = FALSE;
7083   enum append_method method;
7084   bfd_boolean relax32;
7085   int branch_disp;
7086
7087   if (mips_fix_loongson2f && !HAVE_CODE_COMPRESSION)
7088     fix_loongson2f (ip);
7089
7090   file_ase_mips16 |= mips_opts.mips16;
7091   file_ase_micromips |= mips_opts.micromips;
7092
7093   prev_pinfo2 = history[0].insn_mo->pinfo2;
7094   pinfo = ip->insn_mo->pinfo;
7095
7096   /* Don't raise alarm about `nods' frags as they'll fill in the right
7097      kind of nop in relaxation if required.  */
7098   if (mips_opts.micromips
7099       && !expansionp
7100       && !(history[0].frag
7101            && history[0].frag->fr_type == rs_machine_dependent
7102            && RELAX_MICROMIPS_P (history[0].frag->fr_subtype)
7103            && RELAX_MICROMIPS_NODS (history[0].frag->fr_subtype))
7104       && (((prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
7105            && micromips_insn_length (ip->insn_mo) != 2)
7106           || ((prev_pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
7107               && micromips_insn_length (ip->insn_mo) != 4)))
7108     as_warn (_("wrong size instruction in a %u-bit branch delay slot"),
7109              (prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0 ? 16 : 32);
7110
7111   if (address_expr == NULL)
7112     ip->complete_p = 1;
7113   else if (reloc_type[0] <= BFD_RELOC_UNUSED
7114            && reloc_type[1] == BFD_RELOC_UNUSED
7115            && reloc_type[2] == BFD_RELOC_UNUSED
7116            && address_expr->X_op == O_constant)
7117     {
7118       switch (*reloc_type)
7119         {
7120         case BFD_RELOC_MIPS_JMP:
7121           {
7122             int shift;
7123
7124             /* Shift is 2, unusually, for microMIPS JALX.  */
7125             shift = (mips_opts.micromips
7126                      && strcmp (ip->insn_mo->name, "jalx") != 0) ? 1 : 2;
7127             if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
7128               as_bad (_("jump to misaligned address (0x%lx)"),
7129                       (unsigned long) address_expr->X_add_number);
7130             ip->insn_opcode |= ((address_expr->X_add_number >> shift)
7131                                 & 0x3ffffff);
7132             ip->complete_p = 1;
7133           }
7134           break;
7135
7136         case BFD_RELOC_MIPS16_JMP:
7137           if ((address_expr->X_add_number & 3) != 0)
7138             as_bad (_("jump to misaligned address (0x%lx)"),
7139                     (unsigned long) address_expr->X_add_number);
7140           ip->insn_opcode |=
7141             (((address_expr->X_add_number & 0x7c0000) << 3)
7142                | ((address_expr->X_add_number & 0xf800000) >> 7)
7143                | ((address_expr->X_add_number & 0x3fffc) >> 2));
7144           ip->complete_p = 1;
7145           break;
7146
7147         case BFD_RELOC_16_PCREL_S2:
7148           {
7149             int shift;
7150
7151             shift = mips_opts.micromips ? 1 : 2;
7152             if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
7153               as_bad (_("branch to misaligned address (0x%lx)"),
7154                       (unsigned long) address_expr->X_add_number);
7155             if (!mips_relax_branch)
7156               {
7157                 if ((address_expr->X_add_number + (1 << (shift + 15)))
7158                     & ~((1 << (shift + 16)) - 1))
7159                   as_bad (_("branch address range overflow (0x%lx)"),
7160                           (unsigned long) address_expr->X_add_number);
7161                 ip->insn_opcode |= ((address_expr->X_add_number >> shift)
7162                                     & 0xffff);
7163               }
7164           }
7165           break;
7166
7167         case BFD_RELOC_MIPS_21_PCREL_S2:
7168           {
7169             int shift;
7170
7171             shift = 2;
7172             if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
7173               as_bad (_("branch to misaligned address (0x%lx)"),
7174                       (unsigned long) address_expr->X_add_number);
7175             if ((address_expr->X_add_number + (1 << (shift + 20)))
7176                 & ~((1 << (shift + 21)) - 1))
7177               as_bad (_("branch address range overflow (0x%lx)"),
7178                       (unsigned long) address_expr->X_add_number);
7179             ip->insn_opcode |= ((address_expr->X_add_number >> shift)
7180                                 & 0x1fffff);
7181           }
7182           break;
7183
7184         case BFD_RELOC_MIPS_26_PCREL_S2:
7185           {
7186             int shift;
7187
7188             shift = 2;
7189             if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
7190               as_bad (_("branch to misaligned address (0x%lx)"),
7191                       (unsigned long) address_expr->X_add_number);
7192             if ((address_expr->X_add_number + (1 << (shift + 25)))
7193                 & ~((1 << (shift + 26)) - 1))
7194               as_bad (_("branch address range overflow (0x%lx)"),
7195                       (unsigned long) address_expr->X_add_number);
7196             ip->insn_opcode |= ((address_expr->X_add_number >> shift)
7197                                 & 0x3ffffff);
7198           }
7199           break;
7200
7201         default:
7202           {
7203             offsetT value;
7204
7205             if (calculate_reloc (*reloc_type, address_expr->X_add_number,
7206                                  &value))
7207               {
7208                 ip->insn_opcode |= value & 0xffff;
7209                 ip->complete_p = 1;
7210               }
7211           }
7212           break;
7213         }
7214     }
7215
7216   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
7217     {
7218       /* There are a lot of optimizations we could do that we don't.
7219          In particular, we do not, in general, reorder instructions.
7220          If you use gcc with optimization, it will reorder
7221          instructions and generally do much more optimization then we
7222          do here; repeating all that work in the assembler would only
7223          benefit hand written assembly code, and does not seem worth
7224          it.  */
7225       int nops = (mips_optimize == 0
7226                   ? nops_for_insn (0, history, NULL)
7227                   : nops_for_insn_or_target (0, history, ip));
7228       if (nops > 0)
7229         {
7230           fragS *old_frag;
7231           unsigned long old_frag_offset;
7232           int i;
7233
7234           old_frag = frag_now;
7235           old_frag_offset = frag_now_fix ();
7236
7237           for (i = 0; i < nops; i++)
7238             add_fixed_insn (NOP_INSN);
7239           insert_into_history (0, nops, NOP_INSN);
7240
7241           if (listing)
7242             {
7243               listing_prev_line ();
7244               /* We may be at the start of a variant frag.  In case we
7245                  are, make sure there is enough space for the frag
7246                  after the frags created by listing_prev_line.  The
7247                  argument to frag_grow here must be at least as large
7248                  as the argument to all other calls to frag_grow in
7249                  this file.  We don't have to worry about being in the
7250                  middle of a variant frag, because the variants insert
7251                  all needed nop instructions themselves.  */
7252               frag_grow (40);
7253             }
7254
7255           mips_move_text_labels ();
7256
7257 #ifndef NO_ECOFF_DEBUGGING
7258           if (ECOFF_DEBUGGING)
7259             ecoff_fix_loc (old_frag, old_frag_offset);
7260 #endif
7261         }
7262     }
7263   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
7264     {
7265       int nops;
7266
7267       /* Work out how many nops in prev_nop_frag are needed by IP,
7268          ignoring hazards generated by the first prev_nop_frag_since
7269          instructions.  */
7270       nops = nops_for_insn_or_target (prev_nop_frag_since, history, ip);
7271       gas_assert (nops <= prev_nop_frag_holds);
7272
7273       /* Enforce NOPS as a minimum.  */
7274       if (nops > prev_nop_frag_required)
7275         prev_nop_frag_required = nops;
7276
7277       if (prev_nop_frag_holds == prev_nop_frag_required)
7278         {
7279           /* Settle for the current number of nops.  Update the history
7280              accordingly (for the benefit of any future .set reorder code).  */
7281           prev_nop_frag = NULL;
7282           insert_into_history (prev_nop_frag_since,
7283                                prev_nop_frag_holds, NOP_INSN);
7284         }
7285       else
7286         {
7287           /* Allow this instruction to replace one of the nops that was
7288              tentatively added to prev_nop_frag.  */
7289           prev_nop_frag->fr_fix -= NOP_INSN_SIZE;
7290           prev_nop_frag_holds--;
7291           prev_nop_frag_since++;
7292         }
7293     }
7294
7295   method = get_append_method (ip, address_expr, reloc_type);
7296   branch_disp = method == APPEND_SWAP ? insn_length (history) : 0;
7297
7298   dwarf2_emit_insn (0);
7299   /* We want MIPS16 and microMIPS debug info to use ISA-encoded addresses,
7300      so "move" the instruction address accordingly.
7301
7302      Also, it doesn't seem appropriate for the assembler to reorder .loc
7303      entries.  If this instruction is a branch that we are going to swap
7304      with the previous instruction, the two instructions should be
7305      treated as a unit, and the debug information for both instructions
7306      should refer to the start of the branch sequence.  Using the
7307      current position is certainly wrong when swapping a 32-bit branch
7308      and a 16-bit delay slot, since the current position would then be
7309      in the middle of a branch.  */
7310   dwarf2_move_insn ((HAVE_CODE_COMPRESSION ? 1 : 0) - branch_disp);
7311
7312   relax32 = (mips_relax_branch
7313              /* Don't try branch relaxation within .set nomacro, or within
7314                 .set noat if we use $at for PIC computations.  If it turns
7315                 out that the branch was out-of-range, we'll get an error.  */
7316              && !mips_opts.warn_about_macros
7317              && (mips_opts.at || mips_pic == NO_PIC)
7318              /* Don't relax BPOSGE32/64 or BC1ANY2T/F and BC1ANY4T/F
7319                 as they have no complementing branches.  */
7320              && !(ip->insn_mo->ase & (ASE_MIPS3D | ASE_DSP64 | ASE_DSP)));
7321
7322   if (!HAVE_CODE_COMPRESSION
7323       && address_expr
7324       && relax32
7325       && *reloc_type == BFD_RELOC_16_PCREL_S2
7326       && delayed_branch_p (ip))
7327     {
7328       relaxed_branch = TRUE;
7329       add_relaxed_insn (ip, (relaxed_branch_length
7330                              (NULL, NULL,
7331                               uncond_branch_p (ip) ? -1
7332                               : branch_likely_p (ip) ? 1
7333                               : 0)), 4,
7334                         RELAX_BRANCH_ENCODE
7335                         (AT,
7336                          uncond_branch_p (ip),
7337                          branch_likely_p (ip),
7338                          pinfo & INSN_WRITE_GPR_31,
7339                          0),
7340                         address_expr->X_add_symbol,
7341                         address_expr->X_add_number);
7342       *reloc_type = BFD_RELOC_UNUSED;
7343     }
7344   else if (mips_opts.micromips
7345            && address_expr
7346            && ((relax32 && *reloc_type == BFD_RELOC_16_PCREL_S2)
7347                || *reloc_type > BFD_RELOC_UNUSED)
7348            && (delayed_branch_p (ip) || compact_branch_p (ip))
7349            /* Don't try branch relaxation when users specify
7350               16-bit/32-bit instructions.  */
7351            && !forced_insn_length)
7352     {
7353       bfd_boolean relax16 = (method != APPEND_ADD_COMPACT
7354                              && *reloc_type > BFD_RELOC_UNUSED);
7355       int type = relax16 ? *reloc_type - BFD_RELOC_UNUSED : 0;
7356       int uncond = uncond_branch_p (ip) ? -1 : 0;
7357       int compact = compact_branch_p (ip) || method == APPEND_ADD_COMPACT;
7358       int nods = method == APPEND_ADD_WITH_NOP;
7359       int al = pinfo & INSN_WRITE_GPR_31;
7360       int length32 = nods ? 8 : 4;
7361
7362       gas_assert (address_expr != NULL);
7363       gas_assert (!mips_relax.sequence);
7364
7365       relaxed_branch = TRUE;
7366       if (nods)
7367         method = APPEND_ADD;
7368       if (relax32)
7369         length32 = relaxed_micromips_32bit_branch_length (NULL, NULL, uncond);
7370       add_relaxed_insn (ip, length32, relax16 ? 2 : 4,
7371                         RELAX_MICROMIPS_ENCODE (type, AT, mips_opts.insn32,
7372                                                 uncond, compact, al, nods,
7373                                                 relax32, 0, 0),
7374                         address_expr->X_add_symbol,
7375                         address_expr->X_add_number);
7376       *reloc_type = BFD_RELOC_UNUSED;
7377     }
7378   else if (mips_opts.mips16 && *reloc_type > BFD_RELOC_UNUSED)
7379     {
7380       bfd_boolean require_unextended;
7381       bfd_boolean require_extended;
7382       symbolS *symbol;
7383       offsetT offset;
7384
7385       if (forced_insn_length != 0)
7386         {
7387           require_unextended = forced_insn_length == 2;
7388           require_extended = forced_insn_length == 4;
7389         }
7390       else
7391         {
7392           require_unextended = (mips_opts.noautoextend
7393                                 && !mips_opcode_32bit_p (ip->insn_mo));
7394           require_extended = 0;
7395         }
7396
7397       /* We need to set up a variant frag.  */
7398       gas_assert (address_expr != NULL);
7399       /* Pass any `O_symbol' expression unchanged as an `expr_section'
7400          symbol created by `make_expr_symbol' may not get a necessary
7401          external relocation produced.  */
7402       if (address_expr->X_op == O_symbol)
7403         {
7404           symbol = address_expr->X_add_symbol;
7405           offset = address_expr->X_add_number;
7406         }
7407       else
7408         {
7409           symbol = make_expr_symbol (address_expr);
7410           offset = 0;
7411         }
7412       add_relaxed_insn (ip, 4, 0,
7413                         RELAX_MIPS16_ENCODE
7414                         (*reloc_type - BFD_RELOC_UNUSED,
7415                          require_unextended, require_extended,
7416                          delayed_branch_p (&history[0]),
7417                          history[0].mips16_absolute_jump_p),
7418                         symbol, offset);
7419     }
7420   else if (mips_opts.mips16 && insn_length (ip) == 2)
7421     {
7422       if (!delayed_branch_p (ip))
7423         /* Make sure there is enough room to swap this instruction with
7424            a following jump instruction.  */
7425         frag_grow (6);
7426       add_fixed_insn (ip);
7427     }
7428   else
7429     {
7430       if (mips_opts.mips16
7431           && mips_opts.noreorder
7432           && delayed_branch_p (&history[0]))
7433         as_warn (_("extended instruction in delay slot"));
7434
7435       if (mips_relax.sequence)
7436         {
7437           /* If we've reached the end of this frag, turn it into a variant
7438              frag and record the information for the instructions we've
7439              written so far.  */
7440           if (frag_room () < 4)
7441             relax_close_frag ();
7442           mips_relax.sizes[mips_relax.sequence - 1] += insn_length (ip);
7443         }
7444
7445       if (mips_relax.sequence != 2)
7446         {
7447           if (mips_macro_warning.first_insn_sizes[0] == 0)
7448             mips_macro_warning.first_insn_sizes[0] = insn_length (ip);
7449           mips_macro_warning.sizes[0] += insn_length (ip);
7450           mips_macro_warning.insns[0]++;
7451         }
7452       if (mips_relax.sequence != 1)
7453         {
7454           if (mips_macro_warning.first_insn_sizes[1] == 0)
7455             mips_macro_warning.first_insn_sizes[1] = insn_length (ip);
7456           mips_macro_warning.sizes[1] += insn_length (ip);
7457           mips_macro_warning.insns[1]++;
7458         }
7459
7460       if (mips_opts.mips16)
7461         {
7462           ip->fixed_p = 1;
7463           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
7464         }
7465       add_fixed_insn (ip);
7466     }
7467
7468   if (!ip->complete_p && *reloc_type < BFD_RELOC_UNUSED)
7469     {
7470       bfd_reloc_code_real_type final_type[3];
7471       reloc_howto_type *howto0;
7472       reloc_howto_type *howto;
7473       int i;
7474
7475       /* Perform any necessary conversion to microMIPS relocations
7476          and find out how many relocations there actually are.  */
7477       for (i = 0; i < 3 && reloc_type[i] != BFD_RELOC_UNUSED; i++)
7478         final_type[i] = micromips_map_reloc (reloc_type[i]);
7479
7480       /* In a compound relocation, it is the final (outermost)
7481          operator that determines the relocated field.  */
7482       howto = howto0 = bfd_reloc_type_lookup (stdoutput, final_type[i - 1]);
7483       if (!howto)
7484         abort ();
7485
7486       if (i > 1)
7487         howto0 = bfd_reloc_type_lookup (stdoutput, final_type[0]);
7488       ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
7489                                  bfd_get_reloc_size (howto),
7490                                  address_expr,
7491                                  howto0 && howto0->pc_relative,
7492                                  final_type[0]);
7493
7494       /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
7495       if (final_type[0] == BFD_RELOC_MIPS16_JMP && ip->fixp[0]->fx_addsy)
7496         *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
7497
7498       /* These relocations can have an addend that won't fit in
7499          4 octets for 64bit assembly.  */
7500       if (GPR_SIZE == 64
7501           && ! howto->partial_inplace
7502           && (reloc_type[0] == BFD_RELOC_16
7503               || reloc_type[0] == BFD_RELOC_32
7504               || reloc_type[0] == BFD_RELOC_MIPS_JMP
7505               || reloc_type[0] == BFD_RELOC_GPREL16
7506               || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
7507               || reloc_type[0] == BFD_RELOC_GPREL32
7508               || reloc_type[0] == BFD_RELOC_64
7509               || reloc_type[0] == BFD_RELOC_CTOR
7510               || reloc_type[0] == BFD_RELOC_MIPS_SUB
7511               || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
7512               || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
7513               || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
7514               || reloc_type[0] == BFD_RELOC_MIPS_REL16
7515               || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
7516               || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
7517               || hi16_reloc_p (reloc_type[0])
7518               || lo16_reloc_p (reloc_type[0])))
7519         ip->fixp[0]->fx_no_overflow = 1;
7520
7521       /* These relocations can have an addend that won't fit in 2 octets.  */
7522       if (reloc_type[0] == BFD_RELOC_MICROMIPS_7_PCREL_S1
7523           || reloc_type[0] == BFD_RELOC_MICROMIPS_10_PCREL_S1)
7524         ip->fixp[0]->fx_no_overflow = 1;
7525
7526       if (mips_relax.sequence)
7527         {
7528           if (mips_relax.first_fixup == 0)
7529             mips_relax.first_fixup = ip->fixp[0];
7530         }
7531       else if (reloc_needs_lo_p (*reloc_type))
7532         {
7533           struct mips_hi_fixup *hi_fixup;
7534
7535           /* Reuse the last entry if it already has a matching %lo.  */
7536           hi_fixup = mips_hi_fixup_list;
7537           if (hi_fixup == 0
7538               || !fixup_has_matching_lo_p (hi_fixup->fixp))
7539             {
7540               hi_fixup = XNEW (struct mips_hi_fixup);
7541               hi_fixup->next = mips_hi_fixup_list;
7542               mips_hi_fixup_list = hi_fixup;
7543             }
7544           hi_fixup->fixp = ip->fixp[0];
7545           hi_fixup->seg = now_seg;
7546         }
7547
7548       /* Add fixups for the second and third relocations, if given.
7549          Note that the ABI allows the second relocation to be
7550          against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
7551          moment we only use RSS_UNDEF, but we could add support
7552          for the others if it ever becomes necessary.  */
7553       for (i = 1; i < 3; i++)
7554         if (reloc_type[i] != BFD_RELOC_UNUSED)
7555           {
7556             ip->fixp[i] = fix_new (ip->frag, ip->where,
7557                                    ip->fixp[0]->fx_size, NULL, 0,
7558                                    FALSE, final_type[i]);
7559
7560             /* Use fx_tcbit to mark compound relocs.  */
7561             ip->fixp[0]->fx_tcbit = 1;
7562             ip->fixp[i]->fx_tcbit = 1;
7563           }
7564     }
7565
7566   /* Update the register mask information.  */
7567   mips_gprmask |= gpr_read_mask (ip) | gpr_write_mask (ip);
7568   mips_cprmask[1] |= fpr_read_mask (ip) | fpr_write_mask (ip);
7569
7570   switch (method)
7571     {
7572     case APPEND_ADD:
7573       insert_into_history (0, 1, ip);
7574       break;
7575
7576     case APPEND_ADD_WITH_NOP:
7577       {
7578         struct mips_cl_insn *nop;
7579
7580         insert_into_history (0, 1, ip);
7581         nop = get_delay_slot_nop (ip);
7582         add_fixed_insn (nop);
7583         insert_into_history (0, 1, nop);
7584         if (mips_relax.sequence)
7585           mips_relax.sizes[mips_relax.sequence - 1] += insn_length (nop);
7586       }
7587       break;
7588
7589     case APPEND_ADD_COMPACT:
7590       /* Convert MIPS16 jr/jalr into a "compact" jump.  */
7591       if (mips_opts.mips16)
7592         {
7593           ip->insn_opcode |= 0x0080;
7594           find_altered_mips16_opcode (ip);
7595         }
7596       /* Convert microMIPS instructions.  */
7597       else if (mips_opts.micromips)
7598         {
7599           /* jr16->jrc */
7600           if ((ip->insn_opcode & 0xffe0) == 0x4580)
7601             ip->insn_opcode |= 0x0020;
7602           /* b16->bc */
7603           else if ((ip->insn_opcode & 0xfc00) == 0xcc00)
7604             ip->insn_opcode = 0x40e00000;
7605           /* beqz16->beqzc, bnez16->bnezc */
7606           else if ((ip->insn_opcode & 0xdc00) == 0x8c00)
7607             {
7608               unsigned long regno;
7609
7610               regno = ip->insn_opcode >> MICROMIPSOP_SH_MD;
7611               regno &= MICROMIPSOP_MASK_MD;
7612               regno = micromips_to_32_reg_d_map[regno];
7613               ip->insn_opcode = (((ip->insn_opcode << 9) & 0x00400000)
7614                                  | (regno << MICROMIPSOP_SH_RS)
7615                                  | 0x40a00000) ^ 0x00400000;
7616             }
7617           /* beqz->beqzc, bnez->bnezc */
7618           else if ((ip->insn_opcode & 0xdfe00000) == 0x94000000)
7619             ip->insn_opcode = ((ip->insn_opcode & 0x001f0000)
7620                                | ((ip->insn_opcode >> 7) & 0x00400000)
7621                                | 0x40a00000) ^ 0x00400000;
7622           /* beq $0->beqzc, bne $0->bnezc */
7623           else if ((ip->insn_opcode & 0xdc1f0000) == 0x94000000)
7624             ip->insn_opcode = (((ip->insn_opcode >>
7625                                  (MICROMIPSOP_SH_RT - MICROMIPSOP_SH_RS))
7626                                 & (MICROMIPSOP_MASK_RS << MICROMIPSOP_SH_RS))
7627                                | ((ip->insn_opcode >> 7) & 0x00400000)
7628                                | 0x40a00000) ^ 0x00400000;
7629           else
7630             abort ();
7631           find_altered_micromips_opcode (ip);
7632         }
7633       else
7634         abort ();
7635       install_insn (ip);
7636       insert_into_history (0, 1, ip);
7637       break;
7638
7639     case APPEND_SWAP:
7640       {
7641         struct mips_cl_insn delay = history[0];
7642
7643         if (relaxed_branch || delay.frag != ip->frag)
7644           {
7645             /* Add the delay slot instruction to the end of the
7646                current frag and shrink the fixed part of the
7647                original frag.  If the branch occupies the tail of
7648                the latter, move it backwards to cover the gap.  */
7649             delay.frag->fr_fix -= branch_disp;
7650             if (delay.frag == ip->frag)
7651               move_insn (ip, ip->frag, ip->where - branch_disp);
7652             add_fixed_insn (&delay);
7653           }
7654         else
7655           {
7656             /* If this is not a relaxed branch and we are in the
7657                same frag, then just swap the instructions.  */
7658             move_insn (ip, delay.frag, delay.where);
7659             move_insn (&delay, ip->frag, ip->where + insn_length (ip));
7660           }
7661         history[0] = *ip;
7662         delay.fixed_p = 1;
7663         insert_into_history (0, 1, &delay);
7664       }
7665       break;
7666     }
7667
7668   /* If we have just completed an unconditional branch, clear the history.  */
7669   if ((delayed_branch_p (&history[1]) && uncond_branch_p (&history[1]))
7670       || (compact_branch_p (&history[0]) && uncond_branch_p (&history[0])))
7671     {
7672       unsigned int i;
7673
7674       mips_no_prev_insn ();
7675
7676       for (i = 0; i < ARRAY_SIZE (history); i++)
7677         history[i].cleared_p = 1;
7678     }
7679
7680   /* We need to emit a label at the end of branch-likely macros.  */
7681   if (emit_branch_likely_macro)
7682     {
7683       emit_branch_likely_macro = FALSE;
7684       micromips_add_label ();
7685     }
7686
7687   /* We just output an insn, so the next one doesn't have a label.  */
7688   mips_clear_insn_labels ();
7689 }
7690
7691 /* Forget that there was any previous instruction or label.
7692    When BRANCH is true, the branch history is also flushed.  */
7693
7694 static void
7695 mips_no_prev_insn (void)
7696 {
7697   prev_nop_frag = NULL;
7698   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
7699   mips_clear_insn_labels ();
7700 }
7701
7702 /* This function must be called before we emit something other than
7703    instructions.  It is like mips_no_prev_insn except that it inserts
7704    any NOPS that might be needed by previous instructions.  */
7705
7706 void
7707 mips_emit_delays (void)
7708 {
7709   if (! mips_opts.noreorder)
7710     {
7711       int nops = nops_for_insn (0, history, NULL);
7712       if (nops > 0)
7713         {
7714           while (nops-- > 0)
7715             add_fixed_insn (NOP_INSN);
7716           mips_move_text_labels ();
7717         }
7718     }
7719   mips_no_prev_insn ();
7720 }
7721
7722 /* Start a (possibly nested) noreorder block.  */
7723
7724 static void
7725 start_noreorder (void)
7726 {
7727   if (mips_opts.noreorder == 0)
7728     {
7729       unsigned int i;
7730       int nops;
7731
7732       /* None of the instructions before the .set noreorder can be moved.  */
7733       for (i = 0; i < ARRAY_SIZE (history); i++)
7734         history[i].fixed_p = 1;
7735
7736       /* Insert any nops that might be needed between the .set noreorder
7737          block and the previous instructions.  We will later remove any
7738          nops that turn out not to be needed.  */
7739       nops = nops_for_insn (0, history, NULL);
7740       if (nops > 0)
7741         {
7742           if (mips_optimize != 0)
7743             {
7744               /* Record the frag which holds the nop instructions, so
7745                  that we can remove them if we don't need them.  */
7746               frag_grow (nops * NOP_INSN_SIZE);
7747               prev_nop_frag = frag_now;
7748               prev_nop_frag_holds = nops;
7749               prev_nop_frag_required = 0;
7750               prev_nop_frag_since = 0;
7751             }
7752
7753           for (; nops > 0; --nops)
7754             add_fixed_insn (NOP_INSN);
7755
7756           /* Move on to a new frag, so that it is safe to simply
7757              decrease the size of prev_nop_frag.  */
7758           frag_wane (frag_now);
7759           frag_new (0);
7760           mips_move_text_labels ();
7761         }
7762       mips_mark_labels ();
7763       mips_clear_insn_labels ();
7764     }
7765   mips_opts.noreorder++;
7766   mips_any_noreorder = 1;
7767 }
7768
7769 /* End a nested noreorder block.  */
7770
7771 static void
7772 end_noreorder (void)
7773 {
7774   mips_opts.noreorder--;
7775   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
7776     {
7777       /* Commit to inserting prev_nop_frag_required nops and go back to
7778          handling nop insertion the .set reorder way.  */
7779       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
7780                                 * NOP_INSN_SIZE);
7781       insert_into_history (prev_nop_frag_since,
7782                            prev_nop_frag_required, NOP_INSN);
7783       prev_nop_frag = NULL;
7784     }
7785 }
7786
7787 /* Sign-extend 32-bit mode constants that have bit 31 set and all
7788    higher bits unset.  */
7789
7790 static void
7791 normalize_constant_expr (expressionS *ex)
7792 {
7793   if (ex->X_op == O_constant
7794       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
7795     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
7796                         - 0x80000000);
7797 }
7798
7799 /* Sign-extend 32-bit mode address offsets that have bit 31 set and
7800    all higher bits unset.  */
7801
7802 static void
7803 normalize_address_expr (expressionS *ex)
7804 {
7805   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
7806         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
7807       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
7808     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
7809                         - 0x80000000);
7810 }
7811
7812 /* Try to match TOKENS against OPCODE, storing the result in INSN.
7813    Return true if the match was successful.
7814
7815    OPCODE_EXTRA is a value that should be ORed into the opcode
7816    (used for VU0 channel suffixes, etc.).  MORE_ALTS is true if
7817    there are more alternatives after OPCODE and SOFT_MATCH is
7818    as for mips_arg_info.  */
7819
7820 static bfd_boolean
7821 match_insn (struct mips_cl_insn *insn, const struct mips_opcode *opcode,
7822             struct mips_operand_token *tokens, unsigned int opcode_extra,
7823             bfd_boolean lax_match, bfd_boolean complete_p)
7824 {
7825   const char *args;
7826   struct mips_arg_info arg;
7827   const struct mips_operand *operand;
7828   char c;
7829
7830   imm_expr.X_op = O_absent;
7831   offset_expr.X_op = O_absent;
7832   offset_reloc[0] = BFD_RELOC_UNUSED;
7833   offset_reloc[1] = BFD_RELOC_UNUSED;
7834   offset_reloc[2] = BFD_RELOC_UNUSED;
7835
7836   create_insn (insn, opcode);
7837   /* When no opcode suffix is specified, assume ".xyzw". */
7838   if ((opcode->pinfo2 & INSN2_VU0_CHANNEL_SUFFIX) != 0 && opcode_extra == 0)
7839     insn->insn_opcode |= 0xf << mips_vu0_channel_mask.lsb;
7840   else
7841     insn->insn_opcode |= opcode_extra;
7842   memset (&arg, 0, sizeof (arg));
7843   arg.insn = insn;
7844   arg.token = tokens;
7845   arg.argnum = 1;
7846   arg.last_regno = ILLEGAL_REG;
7847   arg.dest_regno = ILLEGAL_REG;
7848   arg.lax_match = lax_match;
7849   for (args = opcode->args;; ++args)
7850     {
7851       if (arg.token->type == OT_END)
7852         {
7853           /* Handle unary instructions in which only one operand is given.
7854              The source is then the same as the destination.  */
7855           if (arg.opnum == 1 && *args == ',')
7856             {
7857               operand = (mips_opts.micromips
7858                          ? decode_micromips_operand (args + 1)
7859                          : decode_mips_operand (args + 1));
7860               if (operand && mips_optional_operand_p (operand))
7861                 {
7862                   arg.token = tokens;
7863                   arg.argnum = 1;
7864                   continue;
7865                 }
7866             }
7867
7868           /* Treat elided base registers as $0.  */
7869           if (strcmp (args, "(b)") == 0)
7870             args += 3;
7871
7872           if (args[0] == '+')
7873             switch (args[1])
7874               {
7875               case 'K':
7876               case 'N':
7877                 /* The register suffix is optional. */
7878                 args += 2;
7879                 break;
7880               }
7881
7882           /* Fail the match if there were too few operands.  */
7883           if (*args)
7884             return FALSE;
7885
7886           /* Successful match.  */
7887           if (!complete_p)
7888             return TRUE;
7889           clear_insn_error ();
7890           if (arg.dest_regno == arg.last_regno
7891               && strncmp (insn->insn_mo->name, "jalr", 4) == 0)
7892             {
7893               if (arg.opnum == 2)
7894                 set_insn_error
7895                   (0, _("source and destination must be different"));
7896               else if (arg.last_regno == 31)
7897                 set_insn_error
7898                   (0, _("a destination register must be supplied"));
7899             }
7900           else if (arg.last_regno == 31
7901                    && (strncmp (insn->insn_mo->name, "bltzal", 6) == 0
7902                        || strncmp (insn->insn_mo->name, "bgezal", 6) == 0))
7903             set_insn_error (0, _("the source register must not be $31"));
7904           check_completed_insn (&arg);
7905           return TRUE;
7906         }
7907
7908       /* Fail the match if the line has too many operands.   */
7909       if (*args == 0)
7910         return FALSE;
7911
7912       /* Handle characters that need to match exactly.  */
7913       if (*args == '(' || *args == ')' || *args == ',')
7914         {
7915           if (match_char (&arg, *args))
7916             continue;
7917           return FALSE;
7918         }
7919       if (*args == '#')
7920         {
7921           ++args;
7922           if (arg.token->type == OT_DOUBLE_CHAR
7923               && arg.token->u.ch == *args)
7924             {
7925               ++arg.token;
7926               continue;
7927             }
7928           return FALSE;
7929         }
7930
7931       /* Handle special macro operands.  Work out the properties of
7932          other operands.  */
7933       arg.opnum += 1;
7934       switch (*args)
7935         {
7936         case '-':
7937           switch (args[1])
7938             {
7939             case 'A':
7940               *offset_reloc = BFD_RELOC_MIPS_19_PCREL_S2;
7941               break;
7942
7943             case 'B':
7944               *offset_reloc = BFD_RELOC_MIPS_18_PCREL_S3;
7945               break;
7946             }
7947           break;
7948
7949         case '+':
7950           switch (args[1])
7951             {
7952             case 'i':
7953               *offset_reloc = BFD_RELOC_MIPS_JMP;
7954               break;
7955
7956             case '\'':
7957               *offset_reloc = BFD_RELOC_MIPS_26_PCREL_S2;
7958               break;
7959
7960             case '\"':
7961               *offset_reloc = BFD_RELOC_MIPS_21_PCREL_S2;
7962               break;
7963             }
7964           break;
7965
7966         case 'I':
7967           if (!match_const_int (&arg, &imm_expr.X_add_number))
7968             return FALSE;
7969           imm_expr.X_op = O_constant;
7970           if (GPR_SIZE == 32)
7971             normalize_constant_expr (&imm_expr);
7972           continue;
7973
7974         case 'A':
7975           if (arg.token->type == OT_CHAR && arg.token->u.ch == '(')
7976             {
7977               /* Assume that the offset has been elided and that what
7978                  we saw was a base register.  The match will fail later
7979                  if that assumption turns out to be wrong.  */
7980               offset_expr.X_op = O_constant;
7981               offset_expr.X_add_number = 0;
7982             }
7983           else
7984             {
7985               if (!match_expression (&arg, &offset_expr, offset_reloc))
7986                 return FALSE;
7987               normalize_address_expr (&offset_expr);
7988             }
7989           continue;
7990
7991         case 'F':
7992           if (!match_float_constant (&arg, &imm_expr, &offset_expr,
7993                                      8, TRUE))
7994             return FALSE;
7995           continue;
7996
7997         case 'L':
7998           if (!match_float_constant (&arg, &imm_expr, &offset_expr,
7999                                      8, FALSE))
8000             return FALSE;
8001           continue;
8002
8003         case 'f':
8004           if (!match_float_constant (&arg, &imm_expr, &offset_expr,
8005                                      4, TRUE))
8006             return FALSE;
8007           continue;
8008
8009         case 'l':
8010           if (!match_float_constant (&arg, &imm_expr, &offset_expr,
8011                                      4, FALSE))
8012             return FALSE;
8013           continue;
8014
8015         case 'p':
8016           *offset_reloc = BFD_RELOC_16_PCREL_S2;
8017           break;
8018
8019         case 'a':
8020           *offset_reloc = BFD_RELOC_MIPS_JMP;
8021           break;
8022
8023         case 'm':
8024           gas_assert (mips_opts.micromips);
8025           c = args[1];
8026           switch (c)
8027             {
8028             case 'D':
8029             case 'E':
8030               if (!forced_insn_length)
8031                 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
8032               else if (c == 'D')
8033                 *offset_reloc = BFD_RELOC_MICROMIPS_10_PCREL_S1;
8034               else
8035                 *offset_reloc = BFD_RELOC_MICROMIPS_7_PCREL_S1;
8036               break;
8037             }
8038           break;
8039         }
8040
8041       operand = (mips_opts.micromips
8042                  ? decode_micromips_operand (args)
8043                  : decode_mips_operand (args));
8044       if (!operand)
8045         abort ();
8046
8047       /* Skip prefixes.  */
8048       if (*args == '+' || *args == 'm' || *args == '-')
8049         args++;
8050
8051       if (mips_optional_operand_p (operand)
8052           && args[1] == ','
8053           && (arg.token[0].type != OT_REG
8054               || arg.token[1].type == OT_END))
8055         {
8056           /* Assume that the register has been elided and is the
8057              same as the first operand.  */
8058           arg.token = tokens;
8059           arg.argnum = 1;
8060         }
8061
8062       if (!match_operand (&arg, operand))
8063         return FALSE;
8064     }
8065 }
8066
8067 /* Like match_insn, but for MIPS16.  */
8068
8069 static bfd_boolean
8070 match_mips16_insn (struct mips_cl_insn *insn, const struct mips_opcode *opcode,
8071                    struct mips_operand_token *tokens)
8072 {
8073   const char *args;
8074   const struct mips_operand *operand;
8075   const struct mips_operand *ext_operand;
8076   int required_insn_length;
8077   struct mips_arg_info arg;
8078   int relax_char;
8079
8080   if (forced_insn_length)
8081     required_insn_length = forced_insn_length;
8082   else if (mips_opts.noautoextend && !mips_opcode_32bit_p (opcode))
8083     required_insn_length = 2;
8084   else
8085     required_insn_length = 0;
8086
8087   create_insn (insn, opcode);
8088   imm_expr.X_op = O_absent;
8089   offset_expr.X_op = O_absent;
8090   offset_reloc[0] = BFD_RELOC_UNUSED;
8091   offset_reloc[1] = BFD_RELOC_UNUSED;
8092   offset_reloc[2] = BFD_RELOC_UNUSED;
8093   relax_char = 0;
8094
8095   memset (&arg, 0, sizeof (arg));
8096   arg.insn = insn;
8097   arg.token = tokens;
8098   arg.argnum = 1;
8099   arg.last_regno = ILLEGAL_REG;
8100   arg.dest_regno = ILLEGAL_REG;
8101   relax_char = 0;
8102   for (args = opcode->args;; ++args)
8103     {
8104       int c;
8105
8106       if (arg.token->type == OT_END)
8107         {
8108           offsetT value;
8109
8110           /* Handle unary instructions in which only one operand is given.
8111              The source is then the same as the destination.  */
8112           if (arg.opnum == 1 && *args == ',')
8113             {
8114               operand = decode_mips16_operand (args[1], FALSE);
8115               if (operand && mips_optional_operand_p (operand))
8116                 {
8117                   arg.token = tokens;
8118                   arg.argnum = 1;
8119                   continue;
8120                 }
8121             }
8122
8123           /* Fail the match if there were too few operands.  */
8124           if (*args)
8125             return FALSE;
8126
8127           /* Successful match.  Stuff the immediate value in now, if
8128              we can.  */
8129           clear_insn_error ();
8130           if (opcode->pinfo == INSN_MACRO)
8131             {
8132               gas_assert (relax_char == 0 || relax_char == 'p');
8133               gas_assert (*offset_reloc == BFD_RELOC_UNUSED);
8134             }
8135           else if (relax_char
8136                    && offset_expr.X_op == O_constant
8137                    && calculate_reloc (*offset_reloc,
8138                                        offset_expr.X_add_number,
8139                                        &value))
8140             {
8141               mips16_immed (NULL, 0, relax_char, *offset_reloc, value,
8142                             required_insn_length, &insn->insn_opcode);
8143               offset_expr.X_op = O_absent;
8144               *offset_reloc = BFD_RELOC_UNUSED;
8145             }
8146           else if (relax_char && *offset_reloc != BFD_RELOC_UNUSED)
8147             {
8148               if (required_insn_length == 2)
8149                 set_insn_error (0, _("invalid unextended operand value"));
8150               else
8151                 {
8152                   forced_insn_length = 4;
8153                   insn->insn_opcode |= MIPS16_EXTEND;
8154                 }
8155             }
8156           else if (relax_char)
8157             *offset_reloc = (int) BFD_RELOC_UNUSED + relax_char;
8158
8159           check_completed_insn (&arg);
8160           return TRUE;
8161         }
8162
8163       /* Fail the match if the line has too many operands.   */
8164       if (*args == 0)
8165         return FALSE;
8166
8167       /* Handle characters that need to match exactly.  */
8168       if (*args == '(' || *args == ')' || *args == ',')
8169         {
8170           if (match_char (&arg, *args))
8171             continue;
8172           return FALSE;
8173         }
8174
8175       arg.opnum += 1;
8176       c = *args;
8177       switch (c)
8178         {
8179         case 'p':
8180         case 'q':
8181         case 'A':
8182         case 'B':
8183         case 'E':
8184           relax_char = c;
8185           break;
8186
8187         case 'I':
8188           if (!match_const_int (&arg, &imm_expr.X_add_number))
8189             return FALSE;
8190           imm_expr.X_op = O_constant;
8191           if (GPR_SIZE == 32)
8192             normalize_constant_expr (&imm_expr);
8193           continue;
8194
8195         case 'a':
8196         case 'i':
8197           *offset_reloc = BFD_RELOC_MIPS16_JMP;
8198           break;
8199         }
8200
8201       operand = decode_mips16_operand (c, mips_opcode_32bit_p (opcode));
8202       if (!operand)
8203         abort ();
8204
8205       if (operand->type != OP_PCREL)
8206         {
8207           ext_operand = decode_mips16_operand (c, TRUE);
8208           if (operand != ext_operand)
8209             {
8210               if (arg.token->type == OT_CHAR && arg.token->u.ch == '(')
8211                 {
8212                   offset_expr.X_op = O_constant;
8213                   offset_expr.X_add_number = 0;
8214                   relax_char = c;
8215                   continue;
8216                 }
8217
8218               /* We need the OT_INTEGER check because some MIPS16
8219                  immediate variants are listed before the register ones.  */
8220               if (arg.token->type != OT_INTEGER
8221                   || !match_expression (&arg, &offset_expr, offset_reloc))
8222                 return FALSE;
8223
8224               /* '8' is used for SLTI(U) and has traditionally not
8225                  been allowed to take relocation operators.  */
8226               if (offset_reloc[0] != BFD_RELOC_UNUSED
8227                   && (ext_operand->size != 16 || c == '8'))
8228                 return FALSE;
8229
8230               relax_char = c;
8231               continue;
8232             }
8233         }
8234
8235       if (mips_optional_operand_p (operand)
8236           && args[1] == ','
8237           && (arg.token[0].type != OT_REG
8238               || arg.token[1].type == OT_END))
8239         {
8240           /* Assume that the register has been elided and is the
8241              same as the first operand.  */
8242           arg.token = tokens;
8243           arg.argnum = 1;
8244         }
8245
8246       if (!match_operand (&arg, operand))
8247         return FALSE;
8248     }
8249 }
8250
8251 /* Record that the current instruction is invalid for the current ISA.  */
8252
8253 static void
8254 match_invalid_for_isa (void)
8255 {
8256   set_insn_error_ss
8257     (0, _("opcode not supported on this processor: %s (%s)"),
8258      mips_cpu_info_from_arch (mips_opts.arch)->name,
8259      mips_cpu_info_from_isa (mips_opts.isa)->name);
8260 }
8261
8262 /* Try to match TOKENS against a series of opcode entries, starting at FIRST.
8263    Return true if a definite match or failure was found, storing any match
8264    in INSN.  OPCODE_EXTRA is a value that should be ORed into the opcode
8265    (to handle things like VU0 suffixes).  LAX_MATCH is true if we have already
8266    tried and failed to match under normal conditions and now want to try a
8267    more relaxed match.  */
8268
8269 static bfd_boolean
8270 match_insns (struct mips_cl_insn *insn, const struct mips_opcode *first,
8271              const struct mips_opcode *past, struct mips_operand_token *tokens,
8272              int opcode_extra, bfd_boolean lax_match)
8273 {
8274   const struct mips_opcode *opcode;
8275   const struct mips_opcode *invalid_delay_slot;
8276   bfd_boolean seen_valid_for_isa, seen_valid_for_size;
8277
8278   /* Search for a match, ignoring alternatives that don't satisfy the
8279      current ISA or forced_length.  */
8280   invalid_delay_slot = 0;
8281   seen_valid_for_isa = FALSE;
8282   seen_valid_for_size = FALSE;
8283   opcode = first;
8284   do
8285     {
8286       gas_assert (strcmp (opcode->name, first->name) == 0);
8287       if (is_opcode_valid (opcode))
8288         {
8289           seen_valid_for_isa = TRUE;
8290           if (is_size_valid (opcode))
8291             {
8292               bfd_boolean delay_slot_ok;
8293
8294               seen_valid_for_size = TRUE;
8295               delay_slot_ok = is_delay_slot_valid (opcode);
8296               if (match_insn (insn, opcode, tokens, opcode_extra,
8297                               lax_match, delay_slot_ok))
8298                 {
8299                   if (!delay_slot_ok)
8300                     {
8301                       if (!invalid_delay_slot)
8302                         invalid_delay_slot = opcode;
8303                     }
8304                   else
8305                     return TRUE;
8306                 }
8307             }
8308         }
8309       ++opcode;
8310     }
8311   while (opcode < past && strcmp (opcode->name, first->name) == 0);
8312
8313   /* If the only matches we found had the wrong length for the delay slot,
8314      pick the first such match.  We'll issue an appropriate warning later.  */
8315   if (invalid_delay_slot)
8316     {
8317       if (match_insn (insn, invalid_delay_slot, tokens, opcode_extra,
8318                       lax_match, TRUE))
8319         return TRUE;
8320       abort ();
8321     }
8322
8323   /* Handle the case where we didn't try to match an instruction because
8324      all the alternatives were incompatible with the current ISA.  */
8325   if (!seen_valid_for_isa)
8326     {
8327       match_invalid_for_isa ();
8328       return TRUE;
8329     }
8330
8331   /* Handle the case where we didn't try to match an instruction because
8332      all the alternatives were of the wrong size.  */
8333   if (!seen_valid_for_size)
8334     {
8335       if (mips_opts.insn32)
8336         set_insn_error (0, _("opcode not supported in the `insn32' mode"));
8337       else
8338         set_insn_error_i
8339           (0, _("unrecognized %d-bit version of microMIPS opcode"),
8340            8 * forced_insn_length);
8341       return TRUE;
8342     }
8343
8344   return FALSE;
8345 }
8346
8347 /* Like match_insns, but for MIPS16.  */
8348
8349 static bfd_boolean
8350 match_mips16_insns (struct mips_cl_insn *insn, const struct mips_opcode *first,
8351                     struct mips_operand_token *tokens)
8352 {
8353   const struct mips_opcode *opcode;
8354   bfd_boolean seen_valid_for_isa;
8355   bfd_boolean seen_valid_for_size;
8356
8357   /* Search for a match, ignoring alternatives that don't satisfy the
8358      current ISA.  There are no separate entries for extended forms so
8359      we deal with forced_length later.  */
8360   seen_valid_for_isa = FALSE;
8361   seen_valid_for_size = FALSE;
8362   opcode = first;
8363   do
8364     {
8365       gas_assert (strcmp (opcode->name, first->name) == 0);
8366       if (is_opcode_valid_16 (opcode))
8367         {
8368           seen_valid_for_isa = TRUE;
8369           if (is_size_valid_16 (opcode))
8370             {
8371               seen_valid_for_size = TRUE;
8372               if (match_mips16_insn (insn, opcode, tokens))
8373                 return TRUE;
8374             }
8375         }
8376       ++opcode;
8377     }
8378   while (opcode < &mips16_opcodes[bfd_mips16_num_opcodes]
8379          && strcmp (opcode->name, first->name) == 0);
8380
8381   /* Handle the case where we didn't try to match an instruction because
8382      all the alternatives were incompatible with the current ISA.  */
8383   if (!seen_valid_for_isa)
8384     {
8385       match_invalid_for_isa ();
8386       return TRUE;
8387     }
8388
8389   /* Handle the case where we didn't try to match an instruction because
8390      all the alternatives were of the wrong size.  */
8391   if (!seen_valid_for_size)
8392     {
8393       if (forced_insn_length == 2)
8394         set_insn_error
8395           (0, _("unrecognized unextended version of MIPS16 opcode"));
8396       else
8397         set_insn_error
8398           (0, _("unrecognized extended version of MIPS16 opcode"));
8399       return TRUE;
8400     }
8401
8402   return FALSE;
8403 }
8404
8405 /* Set up global variables for the start of a new macro.  */
8406
8407 static void
8408 macro_start (void)
8409 {
8410   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
8411   memset (&mips_macro_warning.first_insn_sizes, 0,
8412           sizeof (mips_macro_warning.first_insn_sizes));
8413   memset (&mips_macro_warning.insns, 0, sizeof (mips_macro_warning.insns));
8414   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
8415                                      && delayed_branch_p (&history[0]));
8416   if (history[0].frag
8417       && history[0].frag->fr_type == rs_machine_dependent
8418       && RELAX_MICROMIPS_P (history[0].frag->fr_subtype)
8419       && RELAX_MICROMIPS_NODS (history[0].frag->fr_subtype))
8420     mips_macro_warning.delay_slot_length = 0;
8421   else
8422     switch (history[0].insn_mo->pinfo2
8423             & (INSN2_BRANCH_DELAY_32BIT | INSN2_BRANCH_DELAY_16BIT))
8424       {
8425       case INSN2_BRANCH_DELAY_32BIT:
8426         mips_macro_warning.delay_slot_length = 4;
8427         break;
8428       case INSN2_BRANCH_DELAY_16BIT:
8429         mips_macro_warning.delay_slot_length = 2;
8430         break;
8431       default:
8432         mips_macro_warning.delay_slot_length = 0;
8433         break;
8434       }
8435   mips_macro_warning.first_frag = NULL;
8436 }
8437
8438 /* Given that a macro is longer than one instruction or of the wrong size,
8439    return the appropriate warning for it.  Return null if no warning is
8440    needed.  SUBTYPE is a bitmask of RELAX_DELAY_SLOT, RELAX_DELAY_SLOT_16BIT,
8441    RELAX_DELAY_SLOT_SIZE_FIRST, RELAX_DELAY_SLOT_SIZE_SECOND,
8442    and RELAX_NOMACRO.  */
8443
8444 static const char *
8445 macro_warning (relax_substateT subtype)
8446 {
8447   if (subtype & RELAX_DELAY_SLOT)
8448     return _("macro instruction expanded into multiple instructions"
8449              " in a branch delay slot");
8450   else if (subtype & RELAX_NOMACRO)
8451     return _("macro instruction expanded into multiple instructions");
8452   else if (subtype & (RELAX_DELAY_SLOT_SIZE_FIRST
8453                       | RELAX_DELAY_SLOT_SIZE_SECOND))
8454     return ((subtype & RELAX_DELAY_SLOT_16BIT)
8455             ? _("macro instruction expanded into a wrong size instruction"
8456                 " in a 16-bit branch delay slot")
8457             : _("macro instruction expanded into a wrong size instruction"
8458                 " in a 32-bit branch delay slot"));
8459   else
8460     return 0;
8461 }
8462
8463 /* Finish up a macro.  Emit warnings as appropriate.  */
8464
8465 static void
8466 macro_end (void)
8467 {
8468   /* Relaxation warning flags.  */
8469   relax_substateT subtype = 0;
8470
8471   /* Check delay slot size requirements.  */
8472   if (mips_macro_warning.delay_slot_length == 2)
8473     subtype |= RELAX_DELAY_SLOT_16BIT;
8474   if (mips_macro_warning.delay_slot_length != 0)
8475     {
8476       if (mips_macro_warning.delay_slot_length
8477           != mips_macro_warning.first_insn_sizes[0])
8478         subtype |= RELAX_DELAY_SLOT_SIZE_FIRST;
8479       if (mips_macro_warning.delay_slot_length
8480           != mips_macro_warning.first_insn_sizes[1])
8481         subtype |= RELAX_DELAY_SLOT_SIZE_SECOND;
8482     }
8483
8484   /* Check instruction count requirements.  */
8485   if (mips_macro_warning.insns[0] > 1 || mips_macro_warning.insns[1] > 1)
8486     {
8487       if (mips_macro_warning.insns[1] > mips_macro_warning.insns[0])
8488         subtype |= RELAX_SECOND_LONGER;
8489       if (mips_opts.warn_about_macros)
8490         subtype |= RELAX_NOMACRO;
8491       if (mips_macro_warning.delay_slot_p)
8492         subtype |= RELAX_DELAY_SLOT;
8493     }
8494
8495   /* If both alternatives fail to fill a delay slot correctly,
8496      emit the warning now.  */
8497   if ((subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0
8498       && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0)
8499     {
8500       relax_substateT s;
8501       const char *msg;
8502
8503       s = subtype & (RELAX_DELAY_SLOT_16BIT
8504                      | RELAX_DELAY_SLOT_SIZE_FIRST
8505                      | RELAX_DELAY_SLOT_SIZE_SECOND);
8506       msg = macro_warning (s);
8507       if (msg != NULL)
8508         as_warn ("%s", msg);
8509       subtype &= ~s;
8510     }
8511
8512   /* If both implementations are longer than 1 instruction, then emit the
8513      warning now.  */
8514   if (mips_macro_warning.insns[0] > 1 && mips_macro_warning.insns[1] > 1)
8515     {
8516       relax_substateT s;
8517       const char *msg;
8518
8519       s = subtype & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT);
8520       msg = macro_warning (s);
8521       if (msg != NULL)
8522         as_warn ("%s", msg);
8523       subtype &= ~s;
8524     }
8525
8526   /* If any flags still set, then one implementation might need a warning
8527      and the other either will need one of a different kind or none at all.
8528      Pass any remaining flags over to relaxation.  */
8529   if (mips_macro_warning.first_frag != NULL)
8530     mips_macro_warning.first_frag->fr_subtype |= subtype;
8531 }
8532
8533 /* Instruction operand formats used in macros that vary between
8534    standard MIPS and microMIPS code.  */
8535
8536 static const char * const brk_fmt[2][2] = { { "c", "c" }, { "mF", "c" } };
8537 static const char * const cop12_fmt[2] = { "E,o(b)", "E,~(b)" };
8538 static const char * const jalr_fmt[2] = { "d,s", "t,s" };
8539 static const char * const lui_fmt[2] = { "t,u", "s,u" };
8540 static const char * const mem12_fmt[2] = { "t,o(b)", "t,~(b)" };
8541 static const char * const mfhl_fmt[2][2] = { { "d", "d" }, { "mj", "s" } };
8542 static const char * const shft_fmt[2] = { "d,w,<", "t,r,<" };
8543 static const char * const trap_fmt[2] = { "s,t,q", "s,t,|" };
8544
8545 #define BRK_FMT (brk_fmt[mips_opts.micromips][mips_opts.insn32])
8546 #define COP12_FMT (ISA_IS_R6 (mips_opts.isa) ? "E,+:(d)" \
8547                                              : cop12_fmt[mips_opts.micromips])
8548 #define JALR_FMT (jalr_fmt[mips_opts.micromips])
8549 #define LUI_FMT (lui_fmt[mips_opts.micromips])
8550 #define MEM12_FMT (mem12_fmt[mips_opts.micromips])
8551 #define LL_SC_FMT (ISA_IS_R6 (mips_opts.isa) ? "t,+j(b)" \
8552                                              : mem12_fmt[mips_opts.micromips])
8553 #define MFHL_FMT (mfhl_fmt[mips_opts.micromips][mips_opts.insn32])
8554 #define SHFT_FMT (shft_fmt[mips_opts.micromips])
8555 #define TRAP_FMT (trap_fmt[mips_opts.micromips])
8556
8557 /* Read a macro's relocation codes from *ARGS and store them in *R.
8558    The first argument in *ARGS will be either the code for a single
8559    relocation or -1 followed by the three codes that make up a
8560    composite relocation.  */
8561
8562 static void
8563 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
8564 {
8565   int i, next;
8566
8567   next = va_arg (*args, int);
8568   if (next >= 0)
8569     r[0] = (bfd_reloc_code_real_type) next;
8570   else
8571     {
8572       for (i = 0; i < 3; i++)
8573         r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
8574       /* This function is only used for 16-bit relocation fields.
8575          To make the macro code simpler, treat an unrelocated value
8576          in the same way as BFD_RELOC_LO16.  */
8577       if (r[0] == BFD_RELOC_UNUSED)
8578         r[0] = BFD_RELOC_LO16;
8579     }
8580 }
8581
8582 /* Build an instruction created by a macro expansion.  This is passed
8583    a pointer to the count of instructions created so far, an
8584    expression, the name of the instruction to build, an operand format
8585    string, and corresponding arguments.  */
8586
8587 static void
8588 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
8589 {
8590   const struct mips_opcode *mo = NULL;
8591   bfd_reloc_code_real_type r[3];
8592   const struct mips_opcode *amo;
8593   const struct mips_operand *operand;
8594   struct hash_control *hash;
8595   struct mips_cl_insn insn;
8596   va_list args;
8597   unsigned int uval;
8598
8599   va_start (args, fmt);
8600
8601   if (mips_opts.mips16)
8602     {
8603       mips16_macro_build (ep, name, fmt, &args);
8604       va_end (args);
8605       return;
8606     }
8607
8608   r[0] = BFD_RELOC_UNUSED;
8609   r[1] = BFD_RELOC_UNUSED;
8610   r[2] = BFD_RELOC_UNUSED;
8611   hash = mips_opts.micromips ? micromips_op_hash : op_hash;
8612   amo = (struct mips_opcode *) hash_find (hash, name);
8613   gas_assert (amo);
8614   gas_assert (strcmp (name, amo->name) == 0);
8615
8616   do
8617     {
8618       /* Search until we get a match for NAME.  It is assumed here that
8619          macros will never generate MDMX, MIPS-3D, or MT instructions.
8620          We try to match an instruction that fulfills the branch delay
8621          slot instruction length requirement (if any) of the previous
8622          instruction.  While doing this we record the first instruction
8623          seen that matches all the other conditions and use it anyway
8624          if the requirement cannot be met; we will issue an appropriate
8625          warning later on.  */
8626       if (strcmp (fmt, amo->args) == 0
8627           && amo->pinfo != INSN_MACRO
8628           && is_opcode_valid (amo)
8629           && is_size_valid (amo))
8630         {
8631           if (is_delay_slot_valid (amo))
8632             {
8633               mo = amo;
8634               break;
8635             }
8636           else if (!mo)
8637             mo = amo;
8638         }
8639
8640       ++amo;
8641       gas_assert (amo->name);
8642     }
8643   while (strcmp (name, amo->name) == 0);
8644
8645   gas_assert (mo);
8646   create_insn (&insn, mo);
8647   for (; *fmt; ++fmt)
8648     {
8649       switch (*fmt)
8650         {
8651         case ',':
8652         case '(':
8653         case ')':
8654         case 'z':
8655           break;
8656
8657         case 'i':
8658         case 'j':
8659           macro_read_relocs (&args, r);
8660           gas_assert (*r == BFD_RELOC_GPREL16
8661                       || *r == BFD_RELOC_MIPS_HIGHER
8662                       || *r == BFD_RELOC_HI16_S
8663                       || *r == BFD_RELOC_LO16
8664                       || *r == BFD_RELOC_MIPS_GOT_OFST);
8665           break;
8666
8667         case 'o':
8668           macro_read_relocs (&args, r);
8669           break;
8670
8671         case 'u':
8672           macro_read_relocs (&args, r);
8673           gas_assert (ep != NULL
8674                       && (ep->X_op == O_constant
8675                           || (ep->X_op == O_symbol
8676                               && (*r == BFD_RELOC_MIPS_HIGHEST
8677                                   || *r == BFD_RELOC_HI16_S
8678                                   || *r == BFD_RELOC_HI16
8679                                   || *r == BFD_RELOC_GPREL16
8680                                   || *r == BFD_RELOC_MIPS_GOT_HI16
8681                                   || *r == BFD_RELOC_MIPS_CALL_HI16))));
8682           break;
8683
8684         case 'p':
8685           gas_assert (ep != NULL);
8686
8687           /*
8688            * This allows macro() to pass an immediate expression for
8689            * creating short branches without creating a symbol.
8690            *
8691            * We don't allow branch relaxation for these branches, as
8692            * they should only appear in ".set nomacro" anyway.
8693            */
8694           if (ep->X_op == O_constant)
8695             {
8696               /* For microMIPS we always use relocations for branches.
8697                  So we should not resolve immediate values.  */
8698               gas_assert (!mips_opts.micromips);
8699
8700               if ((ep->X_add_number & 3) != 0)
8701                 as_bad (_("branch to misaligned address (0x%lx)"),
8702                         (unsigned long) ep->X_add_number);
8703               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
8704                 as_bad (_("branch address range overflow (0x%lx)"),
8705                         (unsigned long) ep->X_add_number);
8706               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
8707               ep = NULL;
8708             }
8709           else
8710             *r = BFD_RELOC_16_PCREL_S2;
8711           break;
8712
8713         case 'a':
8714           gas_assert (ep != NULL);
8715           *r = BFD_RELOC_MIPS_JMP;
8716           break;
8717
8718         default:
8719           operand = (mips_opts.micromips
8720                      ? decode_micromips_operand (fmt)
8721                      : decode_mips_operand (fmt));
8722           if (!operand)
8723             abort ();
8724
8725           uval = va_arg (args, int);
8726           if (operand->type == OP_CLO_CLZ_DEST)
8727             uval |= (uval << 5);
8728           insn_insert_operand (&insn, operand, uval);
8729
8730           if (*fmt == '+' || *fmt == 'm' || *fmt == '-')
8731             ++fmt;
8732           break;
8733         }
8734     }
8735   va_end (args);
8736   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
8737
8738   append_insn (&insn, ep, r, TRUE);
8739 }
8740
8741 static void
8742 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
8743                     va_list *args)
8744 {
8745   struct mips_opcode *mo;
8746   struct mips_cl_insn insn;
8747   const struct mips_operand *operand;
8748   bfd_reloc_code_real_type r[3]
8749     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
8750
8751   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
8752   gas_assert (mo);
8753   gas_assert (strcmp (name, mo->name) == 0);
8754
8755   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
8756     {
8757       ++mo;
8758       gas_assert (mo->name);
8759       gas_assert (strcmp (name, mo->name) == 0);
8760     }
8761
8762   create_insn (&insn, mo);
8763   for (; *fmt; ++fmt)
8764     {
8765       int c;
8766
8767       c = *fmt;
8768       switch (c)
8769         {
8770         case ',':
8771         case '(':
8772         case ')':
8773           break;
8774
8775         case '.':
8776         case 'S':
8777         case 'P':
8778         case 'R':
8779           break;
8780
8781         case '<':
8782         case '5':
8783         case 'F':
8784         case 'H':
8785         case 'W':
8786         case 'D':
8787         case 'j':
8788         case '8':
8789         case 'V':
8790         case 'C':
8791         case 'U':
8792         case 'k':
8793         case 'K':
8794         case 'p':
8795         case 'q':
8796           {
8797             offsetT value;
8798
8799             gas_assert (ep != NULL);
8800
8801             if (ep->X_op != O_constant)
8802               *r = (int) BFD_RELOC_UNUSED + c;
8803             else if (calculate_reloc (*r, ep->X_add_number, &value))
8804               {
8805                 mips16_immed (NULL, 0, c, *r, value, 0, &insn.insn_opcode);
8806                 ep = NULL;
8807                 *r = BFD_RELOC_UNUSED;
8808               }
8809           }
8810           break;
8811
8812         default:
8813           operand = decode_mips16_operand (c, FALSE);
8814           if (!operand)
8815             abort ();
8816
8817           insn_insert_operand (&insn, operand, va_arg (*args, int));
8818           break;
8819         }
8820     }
8821
8822   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
8823
8824   append_insn (&insn, ep, r, TRUE);
8825 }
8826
8827 /*
8828  * Generate a "jalr" instruction with a relocation hint to the called
8829  * function.  This occurs in NewABI PIC code.
8830  */
8831 static void
8832 macro_build_jalr (expressionS *ep, int cprestore)
8833 {
8834   static const bfd_reloc_code_real_type jalr_relocs[2]
8835     = { BFD_RELOC_MIPS_JALR, BFD_RELOC_MICROMIPS_JALR };
8836   bfd_reloc_code_real_type jalr_reloc = jalr_relocs[mips_opts.micromips];
8837   const char *jalr;
8838   char *f = NULL;
8839
8840   if (MIPS_JALR_HINT_P (ep))
8841     {
8842       frag_grow (8);
8843       f = frag_more (0);
8844     }
8845   if (mips_opts.micromips)
8846     {
8847       jalr = ((mips_opts.noreorder && !cprestore) || mips_opts.insn32
8848               ? "jalr" : "jalrs");
8849       if (MIPS_JALR_HINT_P (ep)
8850           || mips_opts.insn32
8851           || (history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
8852         macro_build (NULL, jalr, "t,s", RA, PIC_CALL_REG);
8853       else
8854         macro_build (NULL, jalr, "mj", PIC_CALL_REG);
8855     }
8856   else
8857     macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
8858   if (MIPS_JALR_HINT_P (ep))
8859     fix_new_exp (frag_now, f - frag_now->fr_literal, 4, ep, FALSE, jalr_reloc);
8860 }
8861
8862 /*
8863  * Generate a "lui" instruction.
8864  */
8865 static void
8866 macro_build_lui (expressionS *ep, int regnum)
8867 {
8868   gas_assert (! mips_opts.mips16);
8869
8870   if (ep->X_op != O_constant)
8871     {
8872       gas_assert (ep->X_op == O_symbol);
8873       /* _gp_disp is a special case, used from s_cpload.
8874          __gnu_local_gp is used if mips_no_shared.  */
8875       gas_assert (mips_pic == NO_PIC
8876               || (! HAVE_NEWABI
8877                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
8878               || (! mips_in_shared
8879                   && strcmp (S_GET_NAME (ep->X_add_symbol),
8880                              "__gnu_local_gp") == 0));
8881     }
8882
8883   macro_build (ep, "lui", LUI_FMT, regnum, BFD_RELOC_HI16_S);
8884 }
8885
8886 /* Generate a sequence of instructions to do a load or store from a constant
8887    offset off of a base register (breg) into/from a target register (treg),
8888    using AT if necessary.  */
8889 static void
8890 macro_build_ldst_constoffset (expressionS *ep, const char *op,
8891                               int treg, int breg, int dbl)
8892 {
8893   gas_assert (ep->X_op == O_constant);
8894
8895   /* Sign-extending 32-bit constants makes their handling easier.  */
8896   if (!dbl)
8897     normalize_constant_expr (ep);
8898
8899   /* Right now, this routine can only handle signed 32-bit constants.  */
8900   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
8901     as_warn (_("operand overflow"));
8902
8903   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
8904     {
8905       /* Signed 16-bit offset will fit in the op.  Easy!  */
8906       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8907     }
8908   else
8909     {
8910       /* 32-bit offset, need multiple instructions and AT, like:
8911            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
8912            addu     $tempreg,$tempreg,$breg
8913            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
8914          to handle the complete offset.  */
8915       macro_build_lui (ep, AT);
8916       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8917       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8918
8919       if (!mips_opts.at)
8920         as_bad (_("macro used $at after \".set noat\""));
8921     }
8922 }
8923
8924 /*                      set_at()
8925  * Generates code to set the $at register to true (one)
8926  * if reg is less than the immediate expression.
8927  */
8928 static void
8929 set_at (int reg, int unsignedp)
8930 {
8931   if (imm_expr.X_add_number >= -0x8000
8932       && imm_expr.X_add_number < 0x8000)
8933     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
8934                  AT, reg, BFD_RELOC_LO16);
8935   else
8936     {
8937       load_register (AT, &imm_expr, GPR_SIZE == 64);
8938       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
8939     }
8940 }
8941
8942 /* Count the leading zeroes by performing a binary chop. This is a
8943    bulky bit of source, but performance is a LOT better for the
8944    majority of values than a simple loop to count the bits:
8945        for (lcnt = 0; (lcnt < 32); lcnt++)
8946          if ((v) & (1 << (31 - lcnt)))
8947            break;
8948   However it is not code size friendly, and the gain will drop a bit
8949   on certain cached systems.
8950 */
8951 #define COUNT_TOP_ZEROES(v)             \
8952   (((v) & ~0xffff) == 0                 \
8953    ? ((v) & ~0xff) == 0                 \
8954      ? ((v) & ~0xf) == 0                \
8955        ? ((v) & ~0x3) == 0              \
8956          ? ((v) & ~0x1) == 0            \
8957            ? !(v)                       \
8958              ? 32                       \
8959              : 31                       \
8960            : 30                         \
8961          : ((v) & ~0x7) == 0            \
8962            ? 29                         \
8963            : 28                         \
8964        : ((v) & ~0x3f) == 0             \
8965          ? ((v) & ~0x1f) == 0           \
8966            ? 27                         \
8967            : 26                         \
8968          : ((v) & ~0x7f) == 0           \
8969            ? 25                         \
8970            : 24                         \
8971      : ((v) & ~0xfff) == 0              \
8972        ? ((v) & ~0x3ff) == 0            \
8973          ? ((v) & ~0x1ff) == 0          \
8974            ? 23                         \
8975            : 22                         \
8976          : ((v) & ~0x7ff) == 0          \
8977            ? 21                         \
8978            : 20                         \
8979        : ((v) & ~0x3fff) == 0           \
8980          ? ((v) & ~0x1fff) == 0         \
8981            ? 19                         \
8982            : 18                         \
8983          : ((v) & ~0x7fff) == 0         \
8984            ? 17                         \
8985            : 16                         \
8986    : ((v) & ~0xffffff) == 0             \
8987      ? ((v) & ~0xfffff) == 0            \
8988        ? ((v) & ~0x3ffff) == 0          \
8989          ? ((v) & ~0x1ffff) == 0        \
8990            ? 15                         \
8991            : 14                         \
8992          : ((v) & ~0x7ffff) == 0        \
8993            ? 13                         \
8994            : 12                         \
8995        : ((v) & ~0x3fffff) == 0         \
8996          ? ((v) & ~0x1fffff) == 0       \
8997            ? 11                         \
8998            : 10                         \
8999          : ((v) & ~0x7fffff) == 0       \
9000            ? 9                          \
9001            : 8                          \
9002      : ((v) & ~0xfffffff) == 0          \
9003        ? ((v) & ~0x3ffffff) == 0        \
9004          ? ((v) & ~0x1ffffff) == 0      \
9005            ? 7                          \
9006            : 6                          \
9007          : ((v) & ~0x7ffffff) == 0      \
9008            ? 5                          \
9009            : 4                          \
9010        : ((v) & ~0x3fffffff) == 0       \
9011          ? ((v) & ~0x1fffffff) == 0     \
9012            ? 3                          \
9013            : 2                          \
9014          : ((v) & ~0x7fffffff) == 0     \
9015            ? 1                          \
9016            : 0)
9017
9018 /*                      load_register()
9019  *  This routine generates the least number of instructions necessary to load
9020  *  an absolute expression value into a register.
9021  */
9022 static void
9023 load_register (int reg, expressionS *ep, int dbl)
9024 {
9025   int freg;
9026   expressionS hi32, lo32;
9027
9028   if (ep->X_op != O_big)
9029     {
9030       gas_assert (ep->X_op == O_constant);
9031
9032       /* Sign-extending 32-bit constants makes their handling easier.  */
9033       if (!dbl)
9034         normalize_constant_expr (ep);
9035
9036       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
9037         {
9038           /* We can handle 16 bit signed values with an addiu to
9039              $zero.  No need to ever use daddiu here, since $zero and
9040              the result are always correct in 32 bit mode.  */
9041           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
9042           return;
9043         }
9044       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
9045         {
9046           /* We can handle 16 bit unsigned values with an ori to
9047              $zero.  */
9048           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
9049           return;
9050         }
9051       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
9052         {
9053           /* 32 bit values require an lui.  */
9054           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
9055           if ((ep->X_add_number & 0xffff) != 0)
9056             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
9057           return;
9058         }
9059     }
9060
9061   /* The value is larger than 32 bits.  */
9062
9063   if (!dbl || GPR_SIZE == 32)
9064     {
9065       char value[32];
9066
9067       sprintf_vma (value, ep->X_add_number);
9068       as_bad (_("number (0x%s) larger than 32 bits"), value);
9069       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
9070       return;
9071     }
9072
9073   if (ep->X_op != O_big)
9074     {
9075       hi32 = *ep;
9076       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
9077       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
9078       hi32.X_add_number &= 0xffffffff;
9079       lo32 = *ep;
9080       lo32.X_add_number &= 0xffffffff;
9081     }
9082   else
9083     {
9084       gas_assert (ep->X_add_number > 2);
9085       if (ep->X_add_number == 3)
9086         generic_bignum[3] = 0;
9087       else if (ep->X_add_number > 4)
9088         as_bad (_("number larger than 64 bits"));
9089       lo32.X_op = O_constant;
9090       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
9091       hi32.X_op = O_constant;
9092       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
9093     }
9094
9095   if (hi32.X_add_number == 0)
9096     freg = 0;
9097   else
9098     {
9099       int shift, bit;
9100       unsigned long hi, lo;
9101
9102       if (hi32.X_add_number == (offsetT) 0xffffffff)
9103         {
9104           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
9105             {
9106               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
9107               return;
9108             }
9109           if (lo32.X_add_number & 0x80000000)
9110             {
9111               macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
9112               if (lo32.X_add_number & 0xffff)
9113                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
9114               return;
9115             }
9116         }
9117
9118       /* Check for 16bit shifted constant.  We know that hi32 is
9119          non-zero, so start the mask on the first bit of the hi32
9120          value.  */
9121       shift = 17;
9122       do
9123         {
9124           unsigned long himask, lomask;
9125
9126           if (shift < 32)
9127             {
9128               himask = 0xffff >> (32 - shift);
9129               lomask = (0xffff << shift) & 0xffffffff;
9130             }
9131           else
9132             {
9133               himask = 0xffff << (shift - 32);
9134               lomask = 0;
9135             }
9136           if ((hi32.X_add_number & ~(offsetT) himask) == 0
9137               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
9138             {
9139               expressionS tmp;
9140
9141               tmp.X_op = O_constant;
9142               if (shift < 32)
9143                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
9144                                     | (lo32.X_add_number >> shift));
9145               else
9146                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
9147               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
9148               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", SHFT_FMT,
9149                            reg, reg, (shift >= 32) ? shift - 32 : shift);
9150               return;
9151             }
9152           ++shift;
9153         }
9154       while (shift <= (64 - 16));
9155
9156       /* Find the bit number of the lowest one bit, and store the
9157          shifted value in hi/lo.  */
9158       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
9159       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
9160       if (lo != 0)
9161         {
9162           bit = 0;
9163           while ((lo & 1) == 0)
9164             {
9165               lo >>= 1;
9166               ++bit;
9167             }
9168           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
9169           hi >>= bit;
9170         }
9171       else
9172         {
9173           bit = 32;
9174           while ((hi & 1) == 0)
9175             {
9176               hi >>= 1;
9177               ++bit;
9178             }
9179           lo = hi;
9180           hi = 0;
9181         }
9182
9183       /* Optimize if the shifted value is a (power of 2) - 1.  */
9184       if ((hi == 0 && ((lo + 1) & lo) == 0)
9185           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
9186         {
9187           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
9188           if (shift != 0)
9189             {
9190               expressionS tmp;
9191
9192               /* This instruction will set the register to be all
9193                  ones.  */
9194               tmp.X_op = O_constant;
9195               tmp.X_add_number = (offsetT) -1;
9196               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
9197               if (bit != 0)
9198                 {
9199                   bit += shift;
9200                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", SHFT_FMT,
9201                                reg, reg, (bit >= 32) ? bit - 32 : bit);
9202                 }
9203               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", SHFT_FMT,
9204                            reg, reg, (shift >= 32) ? shift - 32 : shift);
9205               return;
9206             }
9207         }
9208
9209       /* Sign extend hi32 before calling load_register, because we can
9210          generally get better code when we load a sign extended value.  */
9211       if ((hi32.X_add_number & 0x80000000) != 0)
9212         hi32.X_add_number |= ~(offsetT) 0xffffffff;
9213       load_register (reg, &hi32, 0);
9214       freg = reg;
9215     }
9216   if ((lo32.X_add_number & 0xffff0000) == 0)
9217     {
9218       if (freg != 0)
9219         {
9220           macro_build (NULL, "dsll32", SHFT_FMT, reg, freg, 0);
9221           freg = reg;
9222         }
9223     }
9224   else
9225     {
9226       expressionS mid16;
9227
9228       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
9229         {
9230           macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
9231           macro_build (NULL, "dsrl32", SHFT_FMT, reg, reg, 0);
9232           return;
9233         }
9234
9235       if (freg != 0)
9236         {
9237           macro_build (NULL, "dsll", SHFT_FMT, reg, freg, 16);
9238           freg = reg;
9239         }
9240       mid16 = lo32;
9241       mid16.X_add_number >>= 16;
9242       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
9243       macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
9244       freg = reg;
9245     }
9246   if ((lo32.X_add_number & 0xffff) != 0)
9247     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
9248 }
9249
9250 static inline void
9251 load_delay_nop (void)
9252 {
9253   if (!gpr_interlocks)
9254     macro_build (NULL, "nop", "");
9255 }
9256
9257 /* Load an address into a register.  */
9258
9259 static void
9260 load_address (int reg, expressionS *ep, int *used_at)
9261 {
9262   if (ep->X_op != O_constant
9263       && ep->X_op != O_symbol)
9264     {
9265       as_bad (_("expression too complex"));
9266       ep->X_op = O_constant;
9267     }
9268
9269   if (ep->X_op == O_constant)
9270     {
9271       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
9272       return;
9273     }
9274
9275   if (mips_pic == NO_PIC)
9276     {
9277       /* If this is a reference to a GP relative symbol, we want
9278            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
9279          Otherwise we want
9280            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
9281            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
9282          If we have an addend, we always use the latter form.
9283
9284          With 64bit address space and a usable $at we want
9285            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
9286            lui          $at,<sym>               (BFD_RELOC_HI16_S)
9287            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
9288            daddiu       $at,<sym>               (BFD_RELOC_LO16)
9289            dsll32       $reg,0
9290            daddu        $reg,$reg,$at
9291
9292          If $at is already in use, we use a path which is suboptimal
9293          on superscalar processors.
9294            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
9295            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
9296            dsll         $reg,16
9297            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
9298            dsll         $reg,16
9299            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
9300
9301          For GP relative symbols in 64bit address space we can use
9302          the same sequence as in 32bit address space.  */
9303       if (HAVE_64BIT_SYMBOLS)
9304         {
9305           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
9306               && !nopic_need_relax (ep->X_add_symbol, 1))
9307             {
9308               relax_start (ep->X_add_symbol);
9309               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
9310                            mips_gp_register, BFD_RELOC_GPREL16);
9311               relax_switch ();
9312             }
9313
9314           if (*used_at == 0 && mips_opts.at)
9315             {
9316               macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
9317               macro_build (ep, "lui", LUI_FMT, AT, BFD_RELOC_HI16_S);
9318               macro_build (ep, "daddiu", "t,r,j", reg, reg,
9319                            BFD_RELOC_MIPS_HIGHER);
9320               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
9321               macro_build (NULL, "dsll32", SHFT_FMT, reg, reg, 0);
9322               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
9323               *used_at = 1;
9324             }
9325           else
9326             {
9327               macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
9328               macro_build (ep, "daddiu", "t,r,j", reg, reg,
9329                            BFD_RELOC_MIPS_HIGHER);
9330               macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
9331               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
9332               macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
9333               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
9334             }
9335
9336           if (mips_relax.sequence)
9337             relax_end ();
9338         }
9339       else
9340         {
9341           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
9342               && !nopic_need_relax (ep->X_add_symbol, 1))
9343             {
9344               relax_start (ep->X_add_symbol);
9345               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
9346                            mips_gp_register, BFD_RELOC_GPREL16);
9347               relax_switch ();
9348             }
9349           macro_build_lui (ep, reg);
9350           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
9351                        reg, reg, BFD_RELOC_LO16);
9352           if (mips_relax.sequence)
9353             relax_end ();
9354         }
9355     }
9356   else if (!mips_big_got)
9357     {
9358       expressionS ex;
9359
9360       /* If this is a reference to an external symbol, we want
9361            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
9362          Otherwise we want
9363            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
9364            nop
9365            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
9366          If there is a constant, it must be added in after.
9367
9368          If we have NewABI, we want
9369            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
9370          unless we're referencing a global symbol with a non-zero
9371          offset, in which case cst must be added separately.  */
9372       if (HAVE_NEWABI)
9373         {
9374           if (ep->X_add_number)
9375             {
9376               ex.X_add_number = ep->X_add_number;
9377               ep->X_add_number = 0;
9378               relax_start (ep->X_add_symbol);
9379               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
9380                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
9381               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
9382                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9383               ex.X_op = O_constant;
9384               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
9385                            reg, reg, BFD_RELOC_LO16);
9386               ep->X_add_number = ex.X_add_number;
9387               relax_switch ();
9388             }
9389           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
9390                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
9391           if (mips_relax.sequence)
9392             relax_end ();
9393         }
9394       else
9395         {
9396           ex.X_add_number = ep->X_add_number;
9397           ep->X_add_number = 0;
9398           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
9399                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
9400           load_delay_nop ();
9401           relax_start (ep->X_add_symbol);
9402           relax_switch ();
9403           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
9404                        BFD_RELOC_LO16);
9405           relax_end ();
9406
9407           if (ex.X_add_number != 0)
9408             {
9409               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
9410                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9411               ex.X_op = O_constant;
9412               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
9413                            reg, reg, BFD_RELOC_LO16);
9414             }
9415         }
9416     }
9417   else if (mips_big_got)
9418     {
9419       expressionS ex;
9420
9421       /* This is the large GOT case.  If this is a reference to an
9422          external symbol, we want
9423            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
9424            addu         $reg,$reg,$gp
9425            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
9426
9427          Otherwise, for a reference to a local symbol in old ABI, we want
9428            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
9429            nop
9430            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
9431          If there is a constant, it must be added in after.
9432
9433          In the NewABI, for local symbols, with or without offsets, we want:
9434            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
9435            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
9436       */
9437       if (HAVE_NEWABI)
9438         {
9439           ex.X_add_number = ep->X_add_number;
9440           ep->X_add_number = 0;
9441           relax_start (ep->X_add_symbol);
9442           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
9443           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9444                        reg, reg, mips_gp_register);
9445           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
9446                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
9447           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
9448             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9449           else if (ex.X_add_number)
9450             {
9451               ex.X_op = O_constant;
9452               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
9453                            BFD_RELOC_LO16);
9454             }
9455
9456           ep->X_add_number = ex.X_add_number;
9457           relax_switch ();
9458           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
9459                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
9460           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
9461                        BFD_RELOC_MIPS_GOT_OFST);
9462           relax_end ();
9463         }
9464       else
9465         {
9466           ex.X_add_number = ep->X_add_number;
9467           ep->X_add_number = 0;
9468           relax_start (ep->X_add_symbol);
9469           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
9470           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9471                        reg, reg, mips_gp_register);
9472           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
9473                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
9474           relax_switch ();
9475           if (reg_needs_delay (mips_gp_register))
9476             {
9477               /* We need a nop before loading from $gp.  This special
9478                  check is required because the lui which starts the main
9479                  instruction stream does not refer to $gp, and so will not
9480                  insert the nop which may be required.  */
9481               macro_build (NULL, "nop", "");
9482             }
9483           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
9484                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
9485           load_delay_nop ();
9486           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
9487                        BFD_RELOC_LO16);
9488           relax_end ();
9489
9490           if (ex.X_add_number != 0)
9491             {
9492               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
9493                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9494               ex.X_op = O_constant;
9495               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
9496                            BFD_RELOC_LO16);
9497             }
9498         }
9499     }
9500   else
9501     abort ();
9502
9503   if (!mips_opts.at && *used_at == 1)
9504     as_bad (_("macro used $at after \".set noat\""));
9505 }
9506
9507 /* Move the contents of register SOURCE into register DEST.  */
9508
9509 static void
9510 move_register (int dest, int source)
9511 {
9512   /* Prefer to use a 16-bit microMIPS instruction unless the previous
9513      instruction specifically requires a 32-bit one.  */
9514   if (mips_opts.micromips
9515       && !mips_opts.insn32
9516       && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
9517     macro_build (NULL, "move", "mp,mj", dest, source);
9518   else
9519     macro_build (NULL, "or", "d,v,t", dest, source, 0);
9520 }
9521
9522 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
9523    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
9524    The two alternatives are:
9525
9526    Global symbol                Local symbol
9527    -------------                ------------
9528    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
9529    ...                          ...
9530    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
9531
9532    load_got_offset emits the first instruction and add_got_offset
9533    emits the second for a 16-bit offset or add_got_offset_hilo emits
9534    a sequence to add a 32-bit offset using a scratch register.  */
9535
9536 static void
9537 load_got_offset (int dest, expressionS *local)
9538 {
9539   expressionS global;
9540
9541   global = *local;
9542   global.X_add_number = 0;
9543
9544   relax_start (local->X_add_symbol);
9545   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
9546                BFD_RELOC_MIPS_GOT16, mips_gp_register);
9547   relax_switch ();
9548   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
9549                BFD_RELOC_MIPS_GOT16, mips_gp_register);
9550   relax_end ();
9551 }
9552
9553 static void
9554 add_got_offset (int dest, expressionS *local)
9555 {
9556   expressionS global;
9557
9558   global.X_op = O_constant;
9559   global.X_op_symbol = NULL;
9560   global.X_add_symbol = NULL;
9561   global.X_add_number = local->X_add_number;
9562
9563   relax_start (local->X_add_symbol);
9564   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
9565                dest, dest, BFD_RELOC_LO16);
9566   relax_switch ();
9567   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
9568   relax_end ();
9569 }
9570
9571 static void
9572 add_got_offset_hilo (int dest, expressionS *local, int tmp)
9573 {
9574   expressionS global;
9575   int hold_mips_optimize;
9576
9577   global.X_op = O_constant;
9578   global.X_op_symbol = NULL;
9579   global.X_add_symbol = NULL;
9580   global.X_add_number = local->X_add_number;
9581
9582   relax_start (local->X_add_symbol);
9583   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
9584   relax_switch ();
9585   /* Set mips_optimize around the lui instruction to avoid
9586      inserting an unnecessary nop after the lw.  */
9587   hold_mips_optimize = mips_optimize;
9588   mips_optimize = 2;
9589   macro_build_lui (&global, tmp);
9590   mips_optimize = hold_mips_optimize;
9591   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
9592   relax_end ();
9593
9594   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
9595 }
9596
9597 /* Emit a sequence of instructions to emulate a branch likely operation.
9598    BR is an ordinary branch corresponding to one to be emulated.  BRNEG
9599    is its complementing branch with the original condition negated.
9600    CALL is set if the original branch specified the link operation.
9601    EP, FMT, SREG and TREG specify the usual macro_build() parameters.
9602
9603    Code like this is produced in the noreorder mode:
9604
9605         BRNEG   <args>, 1f
9606          nop
9607         b       <sym>
9608          delay slot (executed only if branch taken)
9609     1:
9610
9611    or, if CALL is set:
9612
9613         BRNEG   <args>, 1f
9614          nop
9615         bal     <sym>
9616          delay slot (executed only if branch taken)
9617     1:
9618
9619    In the reorder mode the delay slot would be filled with a nop anyway,
9620    so code produced is simply:
9621
9622         BR      <args>, <sym>
9623          nop
9624
9625    This function is used when producing code for the microMIPS ASE that
9626    does not implement branch likely instructions in hardware.  */
9627
9628 static void
9629 macro_build_branch_likely (const char *br, const char *brneg,
9630                            int call, expressionS *ep, const char *fmt,
9631                            unsigned int sreg, unsigned int treg)
9632 {
9633   int noreorder = mips_opts.noreorder;
9634   expressionS expr1;
9635
9636   gas_assert (mips_opts.micromips);
9637   start_noreorder ();
9638   if (noreorder)
9639     {
9640       micromips_label_expr (&expr1);
9641       macro_build (&expr1, brneg, fmt, sreg, treg);
9642       macro_build (NULL, "nop", "");
9643       macro_build (ep, call ? "bal" : "b", "p");
9644
9645       /* Set to true so that append_insn adds a label.  */
9646       emit_branch_likely_macro = TRUE;
9647     }
9648   else
9649     {
9650       macro_build (ep, br, fmt, sreg, treg);
9651       macro_build (NULL, "nop", "");
9652     }
9653   end_noreorder ();
9654 }
9655
9656 /* Emit a coprocessor branch-likely macro specified by TYPE, using CC as
9657    the condition code tested.  EP specifies the branch target.  */
9658
9659 static void
9660 macro_build_branch_ccl (int type, expressionS *ep, unsigned int cc)
9661 {
9662   const int call = 0;
9663   const char *brneg;
9664   const char *br;
9665
9666   switch (type)
9667     {
9668     case M_BC1FL:
9669       br = "bc1f";
9670       brneg = "bc1t";
9671       break;
9672     case M_BC1TL:
9673       br = "bc1t";
9674       brneg = "bc1f";
9675       break;
9676     case M_BC2FL:
9677       br = "bc2f";
9678       brneg = "bc2t";
9679       break;
9680     case M_BC2TL:
9681       br = "bc2t";
9682       brneg = "bc2f";
9683       break;
9684     default:
9685       abort ();
9686     }
9687   macro_build_branch_likely (br, brneg, call, ep, "N,p", cc, ZERO);
9688 }
9689
9690 /* Emit a two-argument branch macro specified by TYPE, using SREG as
9691    the register tested.  EP specifies the branch target.  */
9692
9693 static void
9694 macro_build_branch_rs (int type, expressionS *ep, unsigned int sreg)
9695 {
9696   const char *brneg = NULL;
9697   const char *br;
9698   int call = 0;
9699
9700   switch (type)
9701     {
9702     case M_BGEZ:
9703       br = "bgez";
9704       break;
9705     case M_BGEZL:
9706       br = mips_opts.micromips ? "bgez" : "bgezl";
9707       brneg = "bltz";
9708       break;
9709     case M_BGEZALL:
9710       gas_assert (mips_opts.micromips);
9711       br = mips_opts.insn32 ? "bgezal" : "bgezals";
9712       brneg = "bltz";
9713       call = 1;
9714       break;
9715     case M_BGTZ:
9716       br = "bgtz";
9717       break;
9718     case M_BGTZL:
9719       br = mips_opts.micromips ? "bgtz" : "bgtzl";
9720       brneg = "blez";
9721       break;
9722     case M_BLEZ:
9723       br = "blez";
9724       break;
9725     case M_BLEZL:
9726       br = mips_opts.micromips ? "blez" : "blezl";
9727       brneg = "bgtz";
9728       break;
9729     case M_BLTZ:
9730       br = "bltz";
9731       break;
9732     case M_BLTZL:
9733       br = mips_opts.micromips ? "bltz" : "bltzl";
9734       brneg = "bgez";
9735       break;
9736     case M_BLTZALL:
9737       gas_assert (mips_opts.micromips);
9738       br = mips_opts.insn32 ? "bltzal" : "bltzals";
9739       brneg = "bgez";
9740       call = 1;
9741       break;
9742     default:
9743       abort ();
9744     }
9745   if (mips_opts.micromips && brneg)
9746     macro_build_branch_likely (br, brneg, call, ep, "s,p", sreg, ZERO);
9747   else
9748     macro_build (ep, br, "s,p", sreg);
9749 }
9750
9751 /* Emit a three-argument branch macro specified by TYPE, using SREG and
9752    TREG as the registers tested.  EP specifies the branch target.  */
9753
9754 static void
9755 macro_build_branch_rsrt (int type, expressionS *ep,
9756                          unsigned int sreg, unsigned int treg)
9757 {
9758   const char *brneg = NULL;
9759   const int call = 0;
9760   const char *br;
9761
9762   switch (type)
9763     {
9764     case M_BEQ:
9765     case M_BEQ_I:
9766       br = "beq";
9767       break;
9768     case M_BEQL:
9769     case M_BEQL_I:
9770       br = mips_opts.micromips ? "beq" : "beql";
9771       brneg = "bne";
9772       break;
9773     case M_BNE:
9774     case M_BNE_I:
9775       br = "bne";
9776       break;
9777     case M_BNEL:
9778     case M_BNEL_I:
9779       br = mips_opts.micromips ? "bne" : "bnel";
9780       brneg = "beq";
9781       break;
9782     default:
9783       abort ();
9784     }
9785   if (mips_opts.micromips && brneg)
9786     macro_build_branch_likely (br, brneg, call, ep, "s,t,p", sreg, treg);
9787   else
9788     macro_build (ep, br, "s,t,p", sreg, treg);
9789 }
9790
9791 /* Return the high part that should be loaded in order to make the low
9792    part of VALUE accessible using an offset of OFFBITS bits.  */
9793
9794 static offsetT
9795 offset_high_part (offsetT value, unsigned int offbits)
9796 {
9797   offsetT bias;
9798   addressT low_mask;
9799
9800   if (offbits == 0)
9801     return value;
9802   bias = 1 << (offbits - 1);
9803   low_mask = bias * 2 - 1;
9804   return (value + bias) & ~low_mask;
9805 }
9806
9807 /* Return true if the value stored in offset_expr and offset_reloc
9808    fits into a signed offset of OFFBITS bits.  RANGE is the maximum
9809    amount that the caller wants to add without inducing overflow
9810    and ALIGN is the known alignment of the value in bytes.  */
9811
9812 static bfd_boolean
9813 small_offset_p (unsigned int range, unsigned int align, unsigned int offbits)
9814 {
9815   if (offbits == 16)
9816     {
9817       /* Accept any relocation operator if overflow isn't a concern.  */
9818       if (range < align && *offset_reloc != BFD_RELOC_UNUSED)
9819         return TRUE;
9820
9821       /* These relocations are guaranteed not to overflow in correct links.  */
9822       if (*offset_reloc == BFD_RELOC_MIPS_LITERAL
9823           || gprel16_reloc_p (*offset_reloc))
9824         return TRUE;
9825     }
9826   if (offset_expr.X_op == O_constant
9827       && offset_high_part (offset_expr.X_add_number, offbits) == 0
9828       && offset_high_part (offset_expr.X_add_number + range, offbits) == 0)
9829     return TRUE;
9830   return FALSE;
9831 }
9832
9833 /*
9834  *                      Build macros
9835  *   This routine implements the seemingly endless macro or synthesized
9836  * instructions and addressing modes in the mips assembly language. Many
9837  * of these macros are simple and are similar to each other. These could
9838  * probably be handled by some kind of table or grammar approach instead of
9839  * this verbose method. Others are not simple macros but are more like
9840  * optimizing code generation.
9841  *   One interesting optimization is when several store macros appear
9842  * consecutively that would load AT with the upper half of the same address.
9843  * The ensuing load upper instructions are omitted. This implies some kind
9844  * of global optimization. We currently only optimize within a single macro.
9845  *   For many of the load and store macros if the address is specified as a
9846  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
9847  * first load register 'at' with zero and use it as the base register. The
9848  * mips assembler simply uses register $zero. Just one tiny optimization
9849  * we're missing.
9850  */
9851 static void
9852 macro (struct mips_cl_insn *ip, char *str)
9853 {
9854   const struct mips_operand_array *operands;
9855   unsigned int breg, i;
9856   unsigned int tempreg;
9857   int mask;
9858   int used_at = 0;
9859   expressionS label_expr;
9860   expressionS expr1;
9861   expressionS *ep;
9862   const char *s;
9863   const char *s2;
9864   const char *fmt;
9865   int likely = 0;
9866   int coproc = 0;
9867   int offbits = 16;
9868   int call = 0;
9869   int jals = 0;
9870   int dbl = 0;
9871   int imm = 0;
9872   int ust = 0;
9873   int lp = 0;
9874   bfd_boolean large_offset;
9875   int off;
9876   int hold_mips_optimize;
9877   unsigned int align;
9878   unsigned int op[MAX_OPERANDS];
9879
9880   gas_assert (! mips_opts.mips16);
9881
9882   operands = insn_operands (ip);
9883   for (i = 0; i < MAX_OPERANDS; i++)
9884     if (operands->operand[i])
9885       op[i] = insn_extract_operand (ip, operands->operand[i]);
9886     else
9887       op[i] = -1;
9888
9889   mask = ip->insn_mo->mask;
9890
9891   label_expr.X_op = O_constant;
9892   label_expr.X_op_symbol = NULL;
9893   label_expr.X_add_symbol = NULL;
9894   label_expr.X_add_number = 0;
9895
9896   expr1.X_op = O_constant;
9897   expr1.X_op_symbol = NULL;
9898   expr1.X_add_symbol = NULL;
9899   expr1.X_add_number = 1;
9900   align = 1;
9901
9902   switch (mask)
9903     {
9904     case M_DABS:
9905       dbl = 1;
9906       /* Fall through.  */
9907     case M_ABS:
9908       /*    bgez    $a0,1f
9909             move    v0,$a0
9910             sub     v0,$zero,$a0
9911          1:
9912        */
9913
9914       start_noreorder ();
9915
9916       if (mips_opts.micromips)
9917         micromips_label_expr (&label_expr);
9918       else
9919         label_expr.X_add_number = 8;
9920       macro_build (&label_expr, "bgez", "s,p", op[1]);
9921       if (op[0] == op[1])
9922         macro_build (NULL, "nop", "");
9923       else
9924         move_register (op[0], op[1]);
9925       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", op[0], 0, op[1]);
9926       if (mips_opts.micromips)
9927         micromips_add_label ();
9928
9929       end_noreorder ();
9930       break;
9931
9932     case M_ADD_I:
9933       s = "addi";
9934       s2 = "add";
9935       goto do_addi;
9936     case M_ADDU_I:
9937       s = "addiu";
9938       s2 = "addu";
9939       goto do_addi;
9940     case M_DADD_I:
9941       dbl = 1;
9942       s = "daddi";
9943       s2 = "dadd";
9944       if (!mips_opts.micromips)
9945         goto do_addi;
9946       if (imm_expr.X_add_number >= -0x200
9947           && imm_expr.X_add_number < 0x200)
9948         {
9949           macro_build (NULL, s, "t,r,.", op[0], op[1],
9950                        (int) imm_expr.X_add_number);
9951           break;
9952         }
9953       goto do_addi_i;
9954     case M_DADDU_I:
9955       dbl = 1;
9956       s = "daddiu";
9957       s2 = "daddu";
9958     do_addi:
9959       if (imm_expr.X_add_number >= -0x8000
9960           && imm_expr.X_add_number < 0x8000)
9961         {
9962           macro_build (&imm_expr, s, "t,r,j", op[0], op[1], BFD_RELOC_LO16);
9963           break;
9964         }
9965     do_addi_i:
9966       used_at = 1;
9967       load_register (AT, &imm_expr, dbl);
9968       macro_build (NULL, s2, "d,v,t", op[0], op[1], AT);
9969       break;
9970
9971     case M_AND_I:
9972       s = "andi";
9973       s2 = "and";
9974       goto do_bit;
9975     case M_OR_I:
9976       s = "ori";
9977       s2 = "or";
9978       goto do_bit;
9979     case M_NOR_I:
9980       s = "";
9981       s2 = "nor";
9982       goto do_bit;
9983     case M_XOR_I:
9984       s = "xori";
9985       s2 = "xor";
9986     do_bit:
9987       if (imm_expr.X_add_number >= 0
9988           && imm_expr.X_add_number < 0x10000)
9989         {
9990           if (mask != M_NOR_I)
9991             macro_build (&imm_expr, s, "t,r,i", op[0], op[1], BFD_RELOC_LO16);
9992           else
9993             {
9994               macro_build (&imm_expr, "ori", "t,r,i",
9995                            op[0], op[1], BFD_RELOC_LO16);
9996               macro_build (NULL, "nor", "d,v,t", op[0], op[0], 0);
9997             }
9998           break;
9999         }
10000
10001       used_at = 1;
10002       load_register (AT, &imm_expr, GPR_SIZE == 64);
10003       macro_build (NULL, s2, "d,v,t", op[0], op[1], AT);
10004       break;
10005
10006     case M_BALIGN:
10007       switch (imm_expr.X_add_number)
10008         {
10009         case 0:
10010           macro_build (NULL, "nop", "");
10011           break;
10012         case 2:
10013           macro_build (NULL, "packrl.ph", "d,s,t", op[0], op[0], op[1]);
10014           break;
10015         case 1:
10016         case 3:
10017           macro_build (NULL, "balign", "t,s,2", op[0], op[1],
10018                        (int) imm_expr.X_add_number);
10019           break;
10020         default:
10021           as_bad (_("BALIGN immediate not 0, 1, 2 or 3 (%lu)"),
10022                   (unsigned long) imm_expr.X_add_number);
10023           break;
10024         }
10025       break;
10026
10027     case M_BC1FL:
10028     case M_BC1TL:
10029     case M_BC2FL:
10030     case M_BC2TL:
10031       gas_assert (mips_opts.micromips);
10032       macro_build_branch_ccl (mask, &offset_expr,
10033                               EXTRACT_OPERAND (1, BCC, *ip));
10034       break;
10035
10036     case M_BEQ_I:
10037     case M_BEQL_I:
10038     case M_BNE_I:
10039     case M_BNEL_I:
10040       if (imm_expr.X_add_number == 0)
10041         op[1] = 0;
10042       else
10043         {
10044           op[1] = AT;
10045           used_at = 1;
10046           load_register (op[1], &imm_expr, GPR_SIZE == 64);
10047         }
10048       /* Fall through.  */
10049     case M_BEQL:
10050     case M_BNEL:
10051       macro_build_branch_rsrt (mask, &offset_expr, op[0], op[1]);
10052       break;
10053
10054     case M_BGEL:
10055       likely = 1;
10056       /* Fall through.  */
10057     case M_BGE:
10058       if (op[1] == 0)
10059         macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, op[0]);
10060       else if (op[0] == 0)
10061         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, op[1]);
10062       else
10063         {
10064           used_at = 1;
10065           macro_build (NULL, "slt", "d,v,t", AT, op[0], op[1]);
10066           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
10067                                    &offset_expr, AT, ZERO);
10068         }
10069       break;
10070
10071     case M_BGEZL:
10072     case M_BGEZALL:
10073     case M_BGTZL:
10074     case M_BLEZL:
10075     case M_BLTZL:
10076     case M_BLTZALL:
10077       macro_build_branch_rs (mask, &offset_expr, op[0]);
10078       break;
10079
10080     case M_BGTL_I:
10081       likely = 1;
10082       /* Fall through.  */
10083     case M_BGT_I:
10084       /* Check for > max integer.  */
10085       if (imm_expr.X_add_number >= GPR_SMAX)
10086         {
10087         do_false:
10088           /* Result is always false.  */
10089           if (! likely)
10090             macro_build (NULL, "nop", "");
10091           else
10092             macro_build_branch_rsrt (M_BNEL, &offset_expr, ZERO, ZERO);
10093           break;
10094         }
10095       ++imm_expr.X_add_number;
10096       /* FALLTHROUGH */
10097     case M_BGE_I:
10098     case M_BGEL_I:
10099       if (mask == M_BGEL_I)
10100         likely = 1;
10101       if (imm_expr.X_add_number == 0)
10102         {
10103           macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ,
10104                                  &offset_expr, op[0]);
10105           break;
10106         }
10107       if (imm_expr.X_add_number == 1)
10108         {
10109           macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ,
10110                                  &offset_expr, op[0]);
10111           break;
10112         }
10113       if (imm_expr.X_add_number <= GPR_SMIN)
10114         {
10115         do_true:
10116           /* result is always true */
10117           as_warn (_("branch %s is always true"), ip->insn_mo->name);
10118           macro_build (&offset_expr, "b", "p");
10119           break;
10120         }
10121       used_at = 1;
10122       set_at (op[0], 0);
10123       macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
10124                                &offset_expr, AT, ZERO);
10125       break;
10126
10127     case M_BGEUL:
10128       likely = 1;
10129       /* Fall through.  */
10130     case M_BGEU:
10131       if (op[1] == 0)
10132         goto do_true;
10133       else if (op[0] == 0)
10134         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
10135                                  &offset_expr, ZERO, op[1]);
10136       else
10137         {
10138           used_at = 1;
10139           macro_build (NULL, "sltu", "d,v,t", AT, op[0], op[1]);
10140           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
10141                                    &offset_expr, AT, ZERO);
10142         }
10143       break;
10144
10145     case M_BGTUL_I:
10146       likely = 1;
10147       /* Fall through.  */
10148     case M_BGTU_I:
10149       if (op[0] == 0
10150           || (GPR_SIZE == 32
10151               && imm_expr.X_add_number == -1))
10152         goto do_false;
10153       ++imm_expr.X_add_number;
10154       /* FALLTHROUGH */
10155     case M_BGEU_I:
10156     case M_BGEUL_I:
10157       if (mask == M_BGEUL_I)
10158         likely = 1;
10159       if (imm_expr.X_add_number == 0)
10160         goto do_true;
10161       else if (imm_expr.X_add_number == 1)
10162         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
10163                                  &offset_expr, op[0], ZERO);
10164       else
10165         {
10166           used_at = 1;
10167           set_at (op[0], 1);
10168           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
10169                                    &offset_expr, AT, ZERO);
10170         }
10171       break;
10172
10173     case M_BGTL:
10174       likely = 1;
10175       /* Fall through.  */
10176     case M_BGT:
10177       if (op[1] == 0)
10178         macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, op[0]);
10179       else if (op[0] == 0)
10180         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, op[1]);
10181       else
10182         {
10183           used_at = 1;
10184           macro_build (NULL, "slt", "d,v,t", AT, op[1], op[0]);
10185           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
10186                                    &offset_expr, AT, ZERO);
10187         }
10188       break;
10189
10190     case M_BGTUL:
10191       likely = 1;
10192       /* Fall through.  */
10193     case M_BGTU:
10194       if (op[1] == 0)
10195         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
10196                                  &offset_expr, op[0], ZERO);
10197       else if (op[0] == 0)
10198         goto do_false;
10199       else
10200         {
10201           used_at = 1;
10202           macro_build (NULL, "sltu", "d,v,t", AT, op[1], op[0]);
10203           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
10204                                    &offset_expr, AT, ZERO);
10205         }
10206       break;
10207
10208     case M_BLEL:
10209       likely = 1;
10210       /* Fall through.  */
10211     case M_BLE:
10212       if (op[1] == 0)
10213         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, op[0]);
10214       else if (op[0] == 0)
10215         macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, op[1]);
10216       else
10217         {
10218           used_at = 1;
10219           macro_build (NULL, "slt", "d,v,t", AT, op[1], op[0]);
10220           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
10221                                    &offset_expr, AT, ZERO);
10222         }
10223       break;
10224
10225     case M_BLEL_I:
10226       likely = 1;
10227       /* Fall through.  */
10228     case M_BLE_I:
10229       if (imm_expr.X_add_number >= GPR_SMAX)
10230         goto do_true;
10231       ++imm_expr.X_add_number;
10232       /* FALLTHROUGH */
10233     case M_BLT_I:
10234     case M_BLTL_I:
10235       if (mask == M_BLTL_I)
10236         likely = 1;
10237       if (imm_expr.X_add_number == 0)
10238         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, op[0]);
10239       else if (imm_expr.X_add_number == 1)
10240         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, op[0]);
10241       else
10242         {
10243           used_at = 1;
10244           set_at (op[0], 0);
10245           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
10246                                    &offset_expr, AT, ZERO);
10247         }
10248       break;
10249
10250     case M_BLEUL:
10251       likely = 1;
10252       /* Fall through.  */
10253     case M_BLEU:
10254       if (op[1] == 0)
10255         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
10256                                  &offset_expr, op[0], ZERO);
10257       else if (op[0] == 0)
10258         goto do_true;
10259       else
10260         {
10261           used_at = 1;
10262           macro_build (NULL, "sltu", "d,v,t", AT, op[1], op[0]);
10263           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
10264                                    &offset_expr, AT, ZERO);
10265         }
10266       break;
10267
10268     case M_BLEUL_I:
10269       likely = 1;
10270       /* Fall through.  */
10271     case M_BLEU_I:
10272       if (op[0] == 0
10273           || (GPR_SIZE == 32
10274               && imm_expr.X_add_number == -1))
10275         goto do_true;
10276       ++imm_expr.X_add_number;
10277       /* FALLTHROUGH */
10278     case M_BLTU_I:
10279     case M_BLTUL_I:
10280       if (mask == M_BLTUL_I)
10281         likely = 1;
10282       if (imm_expr.X_add_number == 0)
10283         goto do_false;
10284       else if (imm_expr.X_add_number == 1)
10285         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
10286                                  &offset_expr, op[0], ZERO);
10287       else
10288         {
10289           used_at = 1;
10290           set_at (op[0], 1);
10291           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
10292                                    &offset_expr, AT, ZERO);
10293         }
10294       break;
10295
10296     case M_BLTL:
10297       likely = 1;
10298       /* Fall through.  */
10299     case M_BLT:
10300       if (op[1] == 0)
10301         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, op[0]);
10302       else if (op[0] == 0)
10303         macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, op[1]);
10304       else
10305         {
10306           used_at = 1;
10307           macro_build (NULL, "slt", "d,v,t", AT, op[0], op[1]);
10308           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
10309                                    &offset_expr, AT, ZERO);
10310         }
10311       break;
10312
10313     case M_BLTUL:
10314       likely = 1;
10315       /* Fall through.  */
10316     case M_BLTU:
10317       if (op[1] == 0)
10318         goto do_false;
10319       else if (op[0] == 0)
10320         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
10321                                  &offset_expr, ZERO, op[1]);
10322       else
10323         {
10324           used_at = 1;
10325           macro_build (NULL, "sltu", "d,v,t", AT, op[0], op[1]);
10326           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
10327                                    &offset_expr, AT, ZERO);
10328         }
10329       break;
10330
10331     case M_DDIV_3:
10332       dbl = 1;
10333       /* Fall through.  */
10334     case M_DIV_3:
10335       s = "mflo";
10336       goto do_div3;
10337     case M_DREM_3:
10338       dbl = 1;
10339       /* Fall through.  */
10340     case M_REM_3:
10341       s = "mfhi";
10342     do_div3:
10343       if (op[2] == 0)
10344         {
10345           as_warn (_("divide by zero"));
10346           if (mips_trap)
10347             macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
10348           else
10349             macro_build (NULL, "break", BRK_FMT, 7);
10350           break;
10351         }
10352
10353       start_noreorder ();
10354       if (mips_trap)
10355         {
10356           macro_build (NULL, "teq", TRAP_FMT, op[2], ZERO, 7);
10357           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", op[1], op[2]);
10358         }
10359       else
10360         {
10361           if (mips_opts.micromips)
10362             micromips_label_expr (&label_expr);
10363           else
10364             label_expr.X_add_number = 8;
10365           macro_build (&label_expr, "bne", "s,t,p", op[2], ZERO);
10366           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", op[1], op[2]);
10367           macro_build (NULL, "break", BRK_FMT, 7);
10368           if (mips_opts.micromips)
10369             micromips_add_label ();
10370         }
10371       expr1.X_add_number = -1;
10372       used_at = 1;
10373       load_register (AT, &expr1, dbl);
10374       if (mips_opts.micromips)
10375         micromips_label_expr (&label_expr);
10376       else
10377         label_expr.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
10378       macro_build (&label_expr, "bne", "s,t,p", op[2], AT);
10379       if (dbl)
10380         {
10381           expr1.X_add_number = 1;
10382           load_register (AT, &expr1, dbl);
10383           macro_build (NULL, "dsll32", SHFT_FMT, AT, AT, 31);
10384         }
10385       else
10386         {
10387           expr1.X_add_number = 0x80000000;
10388           macro_build (&expr1, "lui", LUI_FMT, AT, BFD_RELOC_HI16);
10389         }
10390       if (mips_trap)
10391         {
10392           macro_build (NULL, "teq", TRAP_FMT, op[1], AT, 6);
10393           /* We want to close the noreorder block as soon as possible, so
10394              that later insns are available for delay slot filling.  */
10395           end_noreorder ();
10396         }
10397       else
10398         {
10399           if (mips_opts.micromips)
10400             micromips_label_expr (&label_expr);
10401           else
10402             label_expr.X_add_number = 8;
10403           macro_build (&label_expr, "bne", "s,t,p", op[1], AT);
10404           macro_build (NULL, "nop", "");
10405
10406           /* We want to close the noreorder block as soon as possible, so
10407              that later insns are available for delay slot filling.  */
10408           end_noreorder ();
10409
10410           macro_build (NULL, "break", BRK_FMT, 6);
10411         }
10412       if (mips_opts.micromips)
10413         micromips_add_label ();
10414       macro_build (NULL, s, MFHL_FMT, op[0]);
10415       break;
10416
10417     case M_DIV_3I:
10418       s = "div";
10419       s2 = "mflo";
10420       goto do_divi;
10421     case M_DIVU_3I:
10422       s = "divu";
10423       s2 = "mflo";
10424       goto do_divi;
10425     case M_REM_3I:
10426       s = "div";
10427       s2 = "mfhi";
10428       goto do_divi;
10429     case M_REMU_3I:
10430       s = "divu";
10431       s2 = "mfhi";
10432       goto do_divi;
10433     case M_DDIV_3I:
10434       dbl = 1;
10435       s = "ddiv";
10436       s2 = "mflo";
10437       goto do_divi;
10438     case M_DDIVU_3I:
10439       dbl = 1;
10440       s = "ddivu";
10441       s2 = "mflo";
10442       goto do_divi;
10443     case M_DREM_3I:
10444       dbl = 1;
10445       s = "ddiv";
10446       s2 = "mfhi";
10447       goto do_divi;
10448     case M_DREMU_3I:
10449       dbl = 1;
10450       s = "ddivu";
10451       s2 = "mfhi";
10452     do_divi:
10453       if (imm_expr.X_add_number == 0)
10454         {
10455           as_warn (_("divide by zero"));
10456           if (mips_trap)
10457             macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
10458           else
10459             macro_build (NULL, "break", BRK_FMT, 7);
10460           break;
10461         }
10462       if (imm_expr.X_add_number == 1)
10463         {
10464           if (strcmp (s2, "mflo") == 0)
10465             move_register (op[0], op[1]);
10466           else
10467             move_register (op[0], ZERO);
10468           break;
10469         }
10470       if (imm_expr.X_add_number == -1 && s[strlen (s) - 1] != 'u')
10471         {
10472           if (strcmp (s2, "mflo") == 0)
10473             macro_build (NULL, dbl ? "dneg" : "neg", "d,w", op[0], op[1]);
10474           else
10475             move_register (op[0], ZERO);
10476           break;
10477         }
10478
10479       used_at = 1;
10480       load_register (AT, &imm_expr, dbl);
10481       macro_build (NULL, s, "z,s,t", op[1], AT);
10482       macro_build (NULL, s2, MFHL_FMT, op[0]);
10483       break;
10484
10485     case M_DIVU_3:
10486       s = "divu";
10487       s2 = "mflo";
10488       goto do_divu3;
10489     case M_REMU_3:
10490       s = "divu";
10491       s2 = "mfhi";
10492       goto do_divu3;
10493     case M_DDIVU_3:
10494       s = "ddivu";
10495       s2 = "mflo";
10496       goto do_divu3;
10497     case M_DREMU_3:
10498       s = "ddivu";
10499       s2 = "mfhi";
10500     do_divu3:
10501       start_noreorder ();
10502       if (mips_trap)
10503         {
10504           macro_build (NULL, "teq", TRAP_FMT, op[2], ZERO, 7);
10505           macro_build (NULL, s, "z,s,t", op[1], op[2]);
10506           /* We want to close the noreorder block as soon as possible, so
10507              that later insns are available for delay slot filling.  */
10508           end_noreorder ();
10509         }
10510       else
10511         {
10512           if (mips_opts.micromips)
10513             micromips_label_expr (&label_expr);
10514           else
10515             label_expr.X_add_number = 8;
10516           macro_build (&label_expr, "bne", "s,t,p", op[2], ZERO);
10517           macro_build (NULL, s, "z,s,t", op[1], op[2]);
10518
10519           /* We want to close the noreorder block as soon as possible, so
10520              that later insns are available for delay slot filling.  */
10521           end_noreorder ();
10522           macro_build (NULL, "break", BRK_FMT, 7);
10523           if (mips_opts.micromips)
10524             micromips_add_label ();
10525         }
10526       macro_build (NULL, s2, MFHL_FMT, op[0]);
10527       break;
10528
10529     case M_DLCA_AB:
10530       dbl = 1;
10531       /* Fall through.  */
10532     case M_LCA_AB:
10533       call = 1;
10534       goto do_la;
10535     case M_DLA_AB:
10536       dbl = 1;
10537       /* Fall through.  */
10538     case M_LA_AB:
10539     do_la:
10540       /* Load the address of a symbol into a register.  If breg is not
10541          zero, we then add a base register to it.  */
10542
10543       breg = op[2];
10544       if (dbl && GPR_SIZE == 32)
10545         as_warn (_("dla used to load 32-bit register; recommend using la "
10546                    "instead"));
10547
10548       if (!dbl && HAVE_64BIT_OBJECTS)
10549         as_warn (_("la used to load 64-bit address; recommend using dla "
10550                    "instead"));
10551
10552       if (small_offset_p (0, align, 16))
10553         {
10554           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", op[0], breg,
10555                        -1, offset_reloc[0], offset_reloc[1], offset_reloc[2]);
10556           break;
10557         }
10558
10559       if (mips_opts.at && (op[0] == breg))
10560         {
10561           tempreg = AT;
10562           used_at = 1;
10563         }
10564       else
10565         tempreg = op[0];
10566
10567       if (offset_expr.X_op != O_symbol
10568           && offset_expr.X_op != O_constant)
10569         {
10570           as_bad (_("expression too complex"));
10571           offset_expr.X_op = O_constant;
10572         }
10573
10574       if (offset_expr.X_op == O_constant)
10575         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
10576       else if (mips_pic == NO_PIC)
10577         {
10578           /* If this is a reference to a GP relative symbol, we want
10579                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
10580              Otherwise we want
10581                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
10582                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
10583              If we have a constant, we need two instructions anyhow,
10584              so we may as well always use the latter form.
10585
10586              With 64bit address space and a usable $at we want
10587                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
10588                lui      $at,<sym>               (BFD_RELOC_HI16_S)
10589                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
10590                daddiu   $at,<sym>               (BFD_RELOC_LO16)
10591                dsll32   $tempreg,0
10592                daddu    $tempreg,$tempreg,$at
10593
10594              If $at is already in use, we use a path which is suboptimal
10595              on superscalar processors.
10596                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
10597                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
10598                dsll     $tempreg,16
10599                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
10600                dsll     $tempreg,16
10601                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
10602
10603              For GP relative symbols in 64bit address space we can use
10604              the same sequence as in 32bit address space.  */
10605           if (HAVE_64BIT_SYMBOLS)
10606             {
10607               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
10608                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
10609                 {
10610                   relax_start (offset_expr.X_add_symbol);
10611                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
10612                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
10613                   relax_switch ();
10614                 }
10615
10616               if (used_at == 0 && mips_opts.at)
10617                 {
10618                   macro_build (&offset_expr, "lui", LUI_FMT,
10619                                tempreg, BFD_RELOC_MIPS_HIGHEST);
10620                   macro_build (&offset_expr, "lui", LUI_FMT,
10621                                AT, BFD_RELOC_HI16_S);
10622                   macro_build (&offset_expr, "daddiu", "t,r,j",
10623                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
10624                   macro_build (&offset_expr, "daddiu", "t,r,j",
10625                                AT, AT, BFD_RELOC_LO16);
10626                   macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
10627                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
10628                   used_at = 1;
10629                 }
10630               else
10631                 {
10632                   macro_build (&offset_expr, "lui", LUI_FMT,
10633                                tempreg, BFD_RELOC_MIPS_HIGHEST);
10634                   macro_build (&offset_expr, "daddiu", "t,r,j",
10635                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
10636                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
10637                   macro_build (&offset_expr, "daddiu", "t,r,j",
10638                                tempreg, tempreg, BFD_RELOC_HI16_S);
10639                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
10640                   macro_build (&offset_expr, "daddiu", "t,r,j",
10641                                tempreg, tempreg, BFD_RELOC_LO16);
10642                 }
10643
10644               if (mips_relax.sequence)
10645                 relax_end ();
10646             }
10647           else
10648             {
10649               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
10650                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
10651                 {
10652                   relax_start (offset_expr.X_add_symbol);
10653                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
10654                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
10655                   relax_switch ();
10656                 }
10657               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
10658                 as_bad (_("offset too large"));
10659               macro_build_lui (&offset_expr, tempreg);
10660               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
10661                            tempreg, tempreg, BFD_RELOC_LO16);
10662               if (mips_relax.sequence)
10663                 relax_end ();
10664             }
10665         }
10666       else if (!mips_big_got && !HAVE_NEWABI)
10667         {
10668           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
10669
10670           /* If this is a reference to an external symbol, and there
10671              is no constant, we want
10672                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
10673              or for lca or if tempreg is PIC_CALL_REG
10674                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
10675              For a local symbol, we want
10676                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
10677                nop
10678                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
10679
10680              If we have a small constant, and this is a reference to
10681              an external symbol, we want
10682                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
10683                nop
10684                addiu    $tempreg,$tempreg,<constant>
10685              For a local symbol, we want the same instruction
10686              sequence, but we output a BFD_RELOC_LO16 reloc on the
10687              addiu instruction.
10688
10689              If we have a large constant, and this is a reference to
10690              an external symbol, we want
10691                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
10692                lui      $at,<hiconstant>
10693                addiu    $at,$at,<loconstant>
10694                addu     $tempreg,$tempreg,$at
10695              For a local symbol, we want the same instruction
10696              sequence, but we output a BFD_RELOC_LO16 reloc on the
10697              addiu instruction.
10698            */
10699
10700           if (offset_expr.X_add_number == 0)
10701             {
10702               if (mips_pic == SVR4_PIC
10703                   && breg == 0
10704                   && (call || tempreg == PIC_CALL_REG))
10705                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
10706
10707               relax_start (offset_expr.X_add_symbol);
10708               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
10709                            lw_reloc_type, mips_gp_register);
10710               if (breg != 0)
10711                 {
10712                   /* We're going to put in an addu instruction using
10713                      tempreg, so we may as well insert the nop right
10714                      now.  */
10715                   load_delay_nop ();
10716                 }
10717               relax_switch ();
10718               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
10719                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
10720               load_delay_nop ();
10721               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
10722                            tempreg, tempreg, BFD_RELOC_LO16);
10723               relax_end ();
10724               /* FIXME: If breg == 0, and the next instruction uses
10725                  $tempreg, then if this variant case is used an extra
10726                  nop will be generated.  */
10727             }
10728           else if (offset_expr.X_add_number >= -0x8000
10729                    && offset_expr.X_add_number < 0x8000)
10730             {
10731               load_got_offset (tempreg, &offset_expr);
10732               load_delay_nop ();
10733               add_got_offset (tempreg, &offset_expr);
10734             }
10735           else
10736             {
10737               expr1.X_add_number = offset_expr.X_add_number;
10738               offset_expr.X_add_number =
10739                 SEXT_16BIT (offset_expr.X_add_number);
10740               load_got_offset (tempreg, &offset_expr);
10741               offset_expr.X_add_number = expr1.X_add_number;
10742               /* If we are going to add in a base register, and the
10743                  target register and the base register are the same,
10744                  then we are using AT as a temporary register.  Since
10745                  we want to load the constant into AT, we add our
10746                  current AT (from the global offset table) and the
10747                  register into the register now, and pretend we were
10748                  not using a base register.  */
10749               if (breg == op[0])
10750                 {
10751                   load_delay_nop ();
10752                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
10753                                op[0], AT, breg);
10754                   breg = 0;
10755                   tempreg = op[0];
10756                 }
10757               add_got_offset_hilo (tempreg, &offset_expr, AT);
10758               used_at = 1;
10759             }
10760         }
10761       else if (!mips_big_got && HAVE_NEWABI)
10762         {
10763           int add_breg_early = 0;
10764
10765           /* If this is a reference to an external, and there is no
10766              constant, or local symbol (*), with or without a
10767              constant, we want
10768                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
10769              or for lca or if tempreg is PIC_CALL_REG
10770                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
10771
10772              If we have a small constant, and this is a reference to
10773              an external symbol, we want
10774                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
10775                addiu    $tempreg,$tempreg,<constant>
10776
10777              If we have a large constant, and this is a reference to
10778              an external symbol, we want
10779                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
10780                lui      $at,<hiconstant>
10781                addiu    $at,$at,<loconstant>
10782                addu     $tempreg,$tempreg,$at
10783
10784              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
10785              local symbols, even though it introduces an additional
10786              instruction.  */
10787
10788           if (offset_expr.X_add_number)
10789             {
10790               expr1.X_add_number = offset_expr.X_add_number;
10791               offset_expr.X_add_number = 0;
10792
10793               relax_start (offset_expr.X_add_symbol);
10794               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
10795                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
10796
10797               if (expr1.X_add_number >= -0x8000
10798                   && expr1.X_add_number < 0x8000)
10799                 {
10800                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
10801                                tempreg, tempreg, BFD_RELOC_LO16);
10802                 }
10803               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
10804                 {
10805                   unsigned int dreg;
10806
10807                   /* If we are going to add in a base register, and the
10808                      target register and the base register are the same,
10809                      then we are using AT as a temporary register.  Since
10810                      we want to load the constant into AT, we add our
10811                      current AT (from the global offset table) and the
10812                      register into the register now, and pretend we were
10813                      not using a base register.  */
10814                   if (breg != op[0])
10815                     dreg = tempreg;
10816                   else
10817                     {
10818                       gas_assert (tempreg == AT);
10819                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
10820                                    op[0], AT, breg);
10821                       dreg = op[0];
10822                       add_breg_early = 1;
10823                     }
10824
10825                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
10826                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
10827                                dreg, dreg, AT);
10828
10829                   used_at = 1;
10830                 }
10831               else
10832                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
10833
10834               relax_switch ();
10835               offset_expr.X_add_number = expr1.X_add_number;
10836
10837               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
10838                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
10839               if (add_breg_early)
10840                 {
10841                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
10842                                op[0], tempreg, breg);
10843                   breg = 0;
10844                   tempreg = op[0];
10845                 }
10846               relax_end ();
10847             }
10848           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
10849             {
10850               relax_start (offset_expr.X_add_symbol);
10851               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
10852                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
10853               relax_switch ();
10854               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
10855                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
10856               relax_end ();
10857             }
10858           else
10859             {
10860               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
10861                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
10862             }
10863         }
10864       else if (mips_big_got && !HAVE_NEWABI)
10865         {
10866           int gpdelay;
10867           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
10868           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
10869           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
10870
10871           /* This is the large GOT case.  If this is a reference to an
10872              external symbol, and there is no constant, we want
10873                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
10874                addu     $tempreg,$tempreg,$gp
10875                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
10876              or for lca or if tempreg is PIC_CALL_REG
10877                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
10878                addu     $tempreg,$tempreg,$gp
10879                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
10880              For a local symbol, we want
10881                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
10882                nop
10883                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
10884
10885              If we have a small constant, and this is a reference to
10886              an external symbol, we want
10887                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
10888                addu     $tempreg,$tempreg,$gp
10889                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
10890                nop
10891                addiu    $tempreg,$tempreg,<constant>
10892              For a local symbol, we want
10893                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
10894                nop
10895                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
10896
10897              If we have a large constant, and this is a reference to
10898              an external symbol, we want
10899                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
10900                addu     $tempreg,$tempreg,$gp
10901                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
10902                lui      $at,<hiconstant>
10903                addiu    $at,$at,<loconstant>
10904                addu     $tempreg,$tempreg,$at
10905              For a local symbol, we want
10906                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
10907                lui      $at,<hiconstant>
10908                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
10909                addu     $tempreg,$tempreg,$at
10910           */
10911
10912           expr1.X_add_number = offset_expr.X_add_number;
10913           offset_expr.X_add_number = 0;
10914           relax_start (offset_expr.X_add_symbol);
10915           gpdelay = reg_needs_delay (mips_gp_register);
10916           if (expr1.X_add_number == 0 && breg == 0
10917               && (call || tempreg == PIC_CALL_REG))
10918             {
10919               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
10920               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
10921             }
10922           macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
10923           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
10924                        tempreg, tempreg, mips_gp_register);
10925           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
10926                        tempreg, lw_reloc_type, tempreg);
10927           if (expr1.X_add_number == 0)
10928             {
10929               if (breg != 0)
10930                 {
10931                   /* We're going to put in an addu instruction using
10932                      tempreg, so we may as well insert the nop right
10933                      now.  */
10934                   load_delay_nop ();
10935                 }
10936             }
10937           else if (expr1.X_add_number >= -0x8000
10938                    && expr1.X_add_number < 0x8000)
10939             {
10940               load_delay_nop ();
10941               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
10942                            tempreg, tempreg, BFD_RELOC_LO16);
10943             }
10944           else
10945             {
10946               unsigned int dreg;
10947
10948               /* If we are going to add in a base register, and the
10949                  target register and the base register are the same,
10950                  then we are using AT as a temporary register.  Since
10951                  we want to load the constant into AT, we add our
10952                  current AT (from the global offset table) and the
10953                  register into the register now, and pretend we were
10954                  not using a base register.  */
10955               if (breg != op[0])
10956                 dreg = tempreg;
10957               else
10958                 {
10959                   gas_assert (tempreg == AT);
10960                   load_delay_nop ();
10961                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
10962                                op[0], AT, breg);
10963                   dreg = op[0];
10964                 }
10965
10966               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
10967               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
10968
10969               used_at = 1;
10970             }
10971           offset_expr.X_add_number = SEXT_16BIT (expr1.X_add_number);
10972           relax_switch ();
10973
10974           if (gpdelay)
10975             {
10976               /* This is needed because this instruction uses $gp, but
10977                  the first instruction on the main stream does not.  */
10978               macro_build (NULL, "nop", "");
10979             }
10980
10981           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
10982                        local_reloc_type, mips_gp_register);
10983           if (expr1.X_add_number >= -0x8000
10984               && expr1.X_add_number < 0x8000)
10985             {
10986               load_delay_nop ();
10987               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
10988                            tempreg, tempreg, BFD_RELOC_LO16);
10989               /* FIXME: If add_number is 0, and there was no base
10990                  register, the external symbol case ended with a load,
10991                  so if the symbol turns out to not be external, and
10992                  the next instruction uses tempreg, an unnecessary nop
10993                  will be inserted.  */
10994             }
10995           else
10996             {
10997               if (breg == op[0])
10998                 {
10999                   /* We must add in the base register now, as in the
11000                      external symbol case.  */
11001                   gas_assert (tempreg == AT);
11002                   load_delay_nop ();
11003                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
11004                                op[0], AT, breg);
11005                   tempreg = op[0];
11006                   /* We set breg to 0 because we have arranged to add
11007                      it in in both cases.  */
11008                   breg = 0;
11009                 }
11010
11011               macro_build_lui (&expr1, AT);
11012               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
11013                            AT, AT, BFD_RELOC_LO16);
11014               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
11015                            tempreg, tempreg, AT);
11016               used_at = 1;
11017             }
11018           relax_end ();
11019         }
11020       else if (mips_big_got && HAVE_NEWABI)
11021         {
11022           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
11023           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
11024           int add_breg_early = 0;
11025
11026           /* This is the large GOT case.  If this is a reference to an
11027              external symbol, and there is no constant, we want
11028                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
11029                add      $tempreg,$tempreg,$gp
11030                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
11031              or for lca or if tempreg is PIC_CALL_REG
11032                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
11033                add      $tempreg,$tempreg,$gp
11034                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
11035
11036              If we have a small constant, and this is a reference to
11037              an external symbol, we want
11038                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
11039                add      $tempreg,$tempreg,$gp
11040                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
11041                addi     $tempreg,$tempreg,<constant>
11042
11043              If we have a large constant, and this is a reference to
11044              an external symbol, we want
11045                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
11046                addu     $tempreg,$tempreg,$gp
11047                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
11048                lui      $at,<hiconstant>
11049                addi     $at,$at,<loconstant>
11050                add      $tempreg,$tempreg,$at
11051
11052              If we have NewABI, and we know it's a local symbol, we want
11053                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
11054                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
11055              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
11056
11057           relax_start (offset_expr.X_add_symbol);
11058
11059           expr1.X_add_number = offset_expr.X_add_number;
11060           offset_expr.X_add_number = 0;
11061
11062           if (expr1.X_add_number == 0 && breg == 0
11063               && (call || tempreg == PIC_CALL_REG))
11064             {
11065               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
11066               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
11067             }
11068           macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
11069           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
11070                        tempreg, tempreg, mips_gp_register);
11071           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
11072                        tempreg, lw_reloc_type, tempreg);
11073
11074           if (expr1.X_add_number == 0)
11075             ;
11076           else if (expr1.X_add_number >= -0x8000
11077                    && expr1.X_add_number < 0x8000)
11078             {
11079               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
11080                            tempreg, tempreg, BFD_RELOC_LO16);
11081             }
11082           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
11083             {
11084               unsigned int dreg;
11085
11086               /* If we are going to add in a base register, and the
11087                  target register and the base register are the same,
11088                  then we are using AT as a temporary register.  Since
11089                  we want to load the constant into AT, we add our
11090                  current AT (from the global offset table) and the
11091                  register into the register now, and pretend we were
11092                  not using a base register.  */
11093               if (breg != op[0])
11094                 dreg = tempreg;
11095               else
11096                 {
11097                   gas_assert (tempreg == AT);
11098                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
11099                                op[0], AT, breg);
11100                   dreg = op[0];
11101                   add_breg_early = 1;
11102                 }
11103
11104               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
11105               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
11106
11107               used_at = 1;
11108             }
11109           else
11110             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
11111
11112           relax_switch ();
11113           offset_expr.X_add_number = expr1.X_add_number;
11114           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
11115                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
11116           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
11117                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
11118           if (add_breg_early)
11119             {
11120               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
11121                            op[0], tempreg, breg);
11122               breg = 0;
11123               tempreg = op[0];
11124             }
11125           relax_end ();
11126         }
11127       else
11128         abort ();
11129
11130       if (breg != 0)
11131         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", op[0], tempreg, breg);
11132       break;
11133
11134     case M_MSGSND:
11135       gas_assert (!mips_opts.micromips);
11136       macro_build (NULL, "c2", "C", (op[0] << 16) | 0x01);
11137       break;
11138
11139     case M_MSGLD:
11140       gas_assert (!mips_opts.micromips);
11141       macro_build (NULL, "c2", "C", 0x02);
11142       break;
11143
11144     case M_MSGLD_T:
11145       gas_assert (!mips_opts.micromips);
11146       macro_build (NULL, "c2", "C", (op[0] << 16) | 0x02);
11147       break;
11148
11149     case M_MSGWAIT:
11150       gas_assert (!mips_opts.micromips);
11151       macro_build (NULL, "c2", "C", 3);
11152       break;
11153
11154     case M_MSGWAIT_T:
11155       gas_assert (!mips_opts.micromips);
11156       macro_build (NULL, "c2", "C", (op[0] << 16) | 0x03);
11157       break;
11158
11159     case M_J_A:
11160       /* The j instruction may not be used in PIC code, since it
11161          requires an absolute address.  We convert it to a b
11162          instruction.  */
11163       if (mips_pic == NO_PIC)
11164         macro_build (&offset_expr, "j", "a");
11165       else
11166         macro_build (&offset_expr, "b", "p");
11167       break;
11168
11169       /* The jal instructions must be handled as macros because when
11170          generating PIC code they expand to multi-instruction
11171          sequences.  Normally they are simple instructions.  */
11172     case M_JALS_1:
11173       op[1] = op[0];
11174       op[0] = RA;
11175       /* Fall through.  */
11176     case M_JALS_2:
11177       gas_assert (mips_opts.micromips);
11178       if (mips_opts.insn32)
11179         {
11180           as_bad (_("opcode not supported in the `insn32' mode `%s'"), str);
11181           break;
11182         }
11183       jals = 1;
11184       goto jal;
11185     case M_JAL_1:
11186       op[1] = op[0];
11187       op[0] = RA;
11188       /* Fall through.  */
11189     case M_JAL_2:
11190     jal:
11191       if (mips_pic == NO_PIC)
11192         {
11193           s = jals ? "jalrs" : "jalr";
11194           if (mips_opts.micromips
11195               && !mips_opts.insn32
11196               && op[0] == RA
11197               && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
11198             macro_build (NULL, s, "mj", op[1]);
11199           else
11200             macro_build (NULL, s, JALR_FMT, op[0], op[1]);
11201         }
11202       else
11203         {
11204           int cprestore = (mips_pic == SVR4_PIC && !HAVE_NEWABI
11205                            && mips_cprestore_offset >= 0);
11206
11207           if (op[1] != PIC_CALL_REG)
11208             as_warn (_("MIPS PIC call to register other than $25"));
11209
11210           s = ((mips_opts.micromips
11211                 && !mips_opts.insn32
11212                 && (!mips_opts.noreorder || cprestore))
11213                ? "jalrs" : "jalr");
11214           if (mips_opts.micromips
11215               && !mips_opts.insn32
11216               && op[0] == RA
11217               && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
11218             macro_build (NULL, s, "mj", op[1]);
11219           else
11220             macro_build (NULL, s, JALR_FMT, op[0], op[1]);
11221           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
11222             {
11223               if (mips_cprestore_offset < 0)
11224                 as_warn (_("no .cprestore pseudo-op used in PIC code"));
11225               else
11226                 {
11227                   if (!mips_frame_reg_valid)
11228                     {
11229                       as_warn (_("no .frame pseudo-op used in PIC code"));
11230                       /* Quiet this warning.  */
11231                       mips_frame_reg_valid = 1;
11232                     }
11233                   if (!mips_cprestore_valid)
11234                     {
11235                       as_warn (_("no .cprestore pseudo-op used in PIC code"));
11236                       /* Quiet this warning.  */
11237                       mips_cprestore_valid = 1;
11238                     }
11239                   if (mips_opts.noreorder)
11240                     macro_build (NULL, "nop", "");
11241                   expr1.X_add_number = mips_cprestore_offset;
11242                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
11243                                                 mips_gp_register,
11244                                                 mips_frame_reg,
11245                                                 HAVE_64BIT_ADDRESSES);
11246                 }
11247             }
11248         }
11249
11250       break;
11251
11252     case M_JALS_A:
11253       gas_assert (mips_opts.micromips);
11254       if (mips_opts.insn32)
11255         {
11256           as_bad (_("opcode not supported in the `insn32' mode `%s'"), str);
11257           break;
11258         }
11259       jals = 1;
11260       /* Fall through.  */
11261     case M_JAL_A:
11262       if (mips_pic == NO_PIC)
11263         macro_build (&offset_expr, jals ? "jals" : "jal", "a");
11264       else if (mips_pic == SVR4_PIC)
11265         {
11266           /* If this is a reference to an external symbol, and we are
11267              using a small GOT, we want
11268                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
11269                nop
11270                jalr     $ra,$25
11271                nop
11272                lw       $gp,cprestore($sp)
11273              The cprestore value is set using the .cprestore
11274              pseudo-op.  If we are using a big GOT, we want
11275                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
11276                addu     $25,$25,$gp
11277                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
11278                nop
11279                jalr     $ra,$25
11280                nop
11281                lw       $gp,cprestore($sp)
11282              If the symbol is not external, we want
11283                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
11284                nop
11285                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
11286                jalr     $ra,$25
11287                nop
11288                lw $gp,cprestore($sp)
11289
11290              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
11291              sequences above, minus nops, unless the symbol is local,
11292              which enables us to use GOT_PAGE/GOT_OFST (big got) or
11293              GOT_DISP.  */
11294           if (HAVE_NEWABI)
11295             {
11296               if (!mips_big_got)
11297                 {
11298                   relax_start (offset_expr.X_add_symbol);
11299                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
11300                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
11301                                mips_gp_register);
11302                   relax_switch ();
11303                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
11304                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
11305                                mips_gp_register);
11306                   relax_end ();
11307                 }
11308               else
11309                 {
11310                   relax_start (offset_expr.X_add_symbol);
11311                   macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
11312                                BFD_RELOC_MIPS_CALL_HI16);
11313                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
11314                                PIC_CALL_REG, mips_gp_register);
11315                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
11316                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
11317                                PIC_CALL_REG);
11318                   relax_switch ();
11319                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
11320                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
11321                                mips_gp_register);
11322                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
11323                                PIC_CALL_REG, PIC_CALL_REG,
11324                                BFD_RELOC_MIPS_GOT_OFST);
11325                   relax_end ();
11326                 }
11327
11328               macro_build_jalr (&offset_expr, 0);
11329             }
11330           else
11331             {
11332               relax_start (offset_expr.X_add_symbol);
11333               if (!mips_big_got)
11334                 {
11335                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
11336                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
11337                                mips_gp_register);
11338                   load_delay_nop ();
11339                   relax_switch ();
11340                 }
11341               else
11342                 {
11343                   int gpdelay;
11344
11345                   gpdelay = reg_needs_delay (mips_gp_register);
11346                   macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
11347                                BFD_RELOC_MIPS_CALL_HI16);
11348                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
11349                                PIC_CALL_REG, mips_gp_register);
11350                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
11351                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
11352                                PIC_CALL_REG);
11353                   load_delay_nop ();
11354                   relax_switch ();
11355                   if (gpdelay)
11356                     macro_build (NULL, "nop", "");
11357                 }
11358               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
11359                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
11360                            mips_gp_register);
11361               load_delay_nop ();
11362               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
11363                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
11364               relax_end ();
11365               macro_build_jalr (&offset_expr, mips_cprestore_offset >= 0);
11366
11367               if (mips_cprestore_offset < 0)
11368                 as_warn (_("no .cprestore pseudo-op used in PIC code"));
11369               else
11370                 {
11371                   if (!mips_frame_reg_valid)
11372                     {
11373                       as_warn (_("no .frame pseudo-op used in PIC code"));
11374                       /* Quiet this warning.  */
11375                       mips_frame_reg_valid = 1;
11376                     }
11377                   if (!mips_cprestore_valid)
11378                     {
11379                       as_warn (_("no .cprestore pseudo-op used in PIC code"));
11380                       /* Quiet this warning.  */
11381                       mips_cprestore_valid = 1;
11382                     }
11383                   if (mips_opts.noreorder)
11384                     macro_build (NULL, "nop", "");
11385                   expr1.X_add_number = mips_cprestore_offset;
11386                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
11387                                                 mips_gp_register,
11388                                                 mips_frame_reg,
11389                                                 HAVE_64BIT_ADDRESSES);
11390                 }
11391             }
11392         }
11393       else if (mips_pic == VXWORKS_PIC)
11394         as_bad (_("non-PIC jump used in PIC library"));
11395       else
11396         abort ();
11397
11398       break;
11399
11400     case M_LBUE_AB:
11401       s = "lbue";
11402       fmt = "t,+j(b)";
11403       offbits = 9;
11404       goto ld_st;
11405     case M_LHUE_AB:
11406       s = "lhue";
11407       fmt = "t,+j(b)";
11408       offbits = 9;
11409       goto ld_st;
11410     case M_LBE_AB:
11411       s = "lbe";
11412       fmt = "t,+j(b)";
11413       offbits = 9;
11414       goto ld_st;
11415     case M_LHE_AB:
11416       s = "lhe";
11417       fmt = "t,+j(b)";
11418       offbits = 9;
11419       goto ld_st;
11420     case M_LLE_AB:
11421       s = "lle";
11422       fmt = "t,+j(b)";
11423       offbits = 9;
11424       goto ld_st;
11425     case M_LWE_AB:
11426       s = "lwe";
11427       fmt = "t,+j(b)";
11428       offbits = 9;
11429       goto ld_st;
11430     case M_LWLE_AB:
11431       s = "lwle";
11432       fmt = "t,+j(b)";
11433       offbits = 9;
11434       goto ld_st;
11435     case M_LWRE_AB:
11436       s = "lwre";
11437       fmt = "t,+j(b)";
11438       offbits = 9;
11439       goto ld_st;
11440     case M_SBE_AB:
11441       s = "sbe";
11442       fmt = "t,+j(b)";
11443       offbits = 9;
11444       goto ld_st;
11445     case M_SCE_AB:
11446       s = "sce";
11447       fmt = "t,+j(b)";
11448       offbits = 9;
11449       goto ld_st;
11450     case M_SHE_AB:
11451       s = "she";
11452       fmt = "t,+j(b)";
11453       offbits = 9;
11454       goto ld_st;
11455     case M_SWE_AB:
11456       s = "swe";
11457       fmt = "t,+j(b)";
11458       offbits = 9;
11459       goto ld_st;
11460     case M_SWLE_AB:
11461       s = "swle";
11462       fmt = "t,+j(b)";
11463       offbits = 9;
11464       goto ld_st;
11465     case M_SWRE_AB:
11466       s = "swre";
11467       fmt = "t,+j(b)";
11468       offbits = 9;
11469       goto ld_st;
11470     case M_ACLR_AB:
11471       s = "aclr";
11472       fmt = "\\,~(b)";
11473       offbits = 12;
11474       goto ld_st;
11475     case M_ASET_AB:
11476       s = "aset";
11477       fmt = "\\,~(b)";
11478       offbits = 12;
11479       goto ld_st;
11480     case M_LB_AB:
11481       s = "lb";
11482       fmt = "t,o(b)";
11483       goto ld;
11484     case M_LBU_AB:
11485       s = "lbu";
11486       fmt = "t,o(b)";
11487       goto ld;
11488     case M_LH_AB:
11489       s = "lh";
11490       fmt = "t,o(b)";
11491       goto ld;
11492     case M_LHU_AB:
11493       s = "lhu";
11494       fmt = "t,o(b)";
11495       goto ld;
11496     case M_LW_AB:
11497       s = "lw";
11498       fmt = "t,o(b)";
11499       goto ld;
11500     case M_LWC0_AB:
11501       gas_assert (!mips_opts.micromips);
11502       s = "lwc0";
11503       fmt = "E,o(b)";
11504       /* Itbl support may require additional care here.  */
11505       coproc = 1;
11506       goto ld_st;
11507     case M_LWC1_AB:
11508       s = "lwc1";
11509       fmt = "T,o(b)";
11510       /* Itbl support may require additional care here.  */
11511       coproc = 1;
11512       goto ld_st;
11513     case M_LWC2_AB:
11514       s = "lwc2";
11515       fmt = COP12_FMT;
11516       offbits = (mips_opts.micromips ? 12
11517                  : ISA_IS_R6 (mips_opts.isa) ? 11
11518                  : 16);
11519       /* Itbl support may require additional care here.  */
11520       coproc = 1;
11521       goto ld_st;
11522     case M_LWC3_AB:
11523       gas_assert (!mips_opts.micromips);
11524       s = "lwc3";
11525       fmt = "E,o(b)";
11526       /* Itbl support may require additional care here.  */
11527       coproc = 1;
11528       goto ld_st;
11529     case M_LWL_AB:
11530       s = "lwl";
11531       fmt = MEM12_FMT;
11532       offbits = (mips_opts.micromips ? 12 : 16);
11533       goto ld_st;
11534     case M_LWR_AB:
11535       s = "lwr";
11536       fmt = MEM12_FMT;
11537       offbits = (mips_opts.micromips ? 12 : 16);
11538       goto ld_st;
11539     case M_LDC1_AB:
11540       s = "ldc1";
11541       fmt = "T,o(b)";
11542       /* Itbl support may require additional care here.  */
11543       coproc = 1;
11544       goto ld_st;
11545     case M_LDC2_AB:
11546       s = "ldc2";
11547       fmt = COP12_FMT;
11548       offbits = (mips_opts.micromips ? 12
11549                  : ISA_IS_R6 (mips_opts.isa) ? 11
11550                  : 16);
11551       /* Itbl support may require additional care here.  */
11552       coproc = 1;
11553       goto ld_st;
11554     case M_LQC2_AB:
11555       s = "lqc2";
11556       fmt = "+7,o(b)";
11557       /* Itbl support may require additional care here.  */
11558       coproc = 1;
11559       goto ld_st;
11560     case M_LDC3_AB:
11561       s = "ldc3";
11562       fmt = "E,o(b)";
11563       /* Itbl support may require additional care here.  */
11564       coproc = 1;
11565       goto ld_st;
11566     case M_LDL_AB:
11567       s = "ldl";
11568       fmt = MEM12_FMT;
11569       offbits = (mips_opts.micromips ? 12 : 16);
11570       goto ld_st;
11571     case M_LDR_AB:
11572       s = "ldr";
11573       fmt = MEM12_FMT;
11574       offbits = (mips_opts.micromips ? 12 : 16);
11575       goto ld_st;
11576     case M_LL_AB:
11577       s = "ll";
11578       fmt = LL_SC_FMT;
11579       offbits = (mips_opts.micromips ? 12
11580                  : ISA_IS_R6 (mips_opts.isa) ? 9
11581                  : 16);
11582       goto ld;
11583     case M_LLD_AB:
11584       s = "lld";
11585       fmt = LL_SC_FMT;
11586       offbits = (mips_opts.micromips ? 12
11587                  : ISA_IS_R6 (mips_opts.isa) ? 9
11588                  : 16);
11589       goto ld;
11590     case M_LWU_AB:
11591       s = "lwu";
11592       fmt = MEM12_FMT;
11593       offbits = (mips_opts.micromips ? 12 : 16);
11594       goto ld;
11595     case M_LWP_AB:
11596       gas_assert (mips_opts.micromips);
11597       s = "lwp";
11598       fmt = "t,~(b)";
11599       offbits = 12;
11600       lp = 1;
11601       goto ld;
11602     case M_LDP_AB:
11603       gas_assert (mips_opts.micromips);
11604       s = "ldp";
11605       fmt = "t,~(b)";
11606       offbits = 12;
11607       lp = 1;
11608       goto ld;
11609     case M_LWM_AB:
11610       gas_assert (mips_opts.micromips);
11611       s = "lwm";
11612       fmt = "n,~(b)";
11613       offbits = 12;
11614       goto ld_st;
11615     case M_LDM_AB:
11616       gas_assert (mips_opts.micromips);
11617       s = "ldm";
11618       fmt = "n,~(b)";
11619       offbits = 12;
11620       goto ld_st;
11621
11622     ld:
11623       /* We don't want to use $0 as tempreg.  */
11624       if (op[2] == op[0] + lp || op[0] + lp == ZERO)
11625         goto ld_st;
11626       else
11627         tempreg = op[0] + lp;
11628       goto ld_noat;
11629
11630     case M_SB_AB:
11631       s = "sb";
11632       fmt = "t,o(b)";
11633       goto ld_st;
11634     case M_SH_AB:
11635       s = "sh";
11636       fmt = "t,o(b)";
11637       goto ld_st;
11638     case M_SW_AB:
11639       s = "sw";
11640       fmt = "t,o(b)";
11641       goto ld_st;
11642     case M_SWC0_AB:
11643       gas_assert (!mips_opts.micromips);
11644       s = "swc0";
11645       fmt = "E,o(b)";
11646       /* Itbl support may require additional care here.  */
11647       coproc = 1;
11648       goto ld_st;
11649     case M_SWC1_AB:
11650       s = "swc1";
11651       fmt = "T,o(b)";
11652       /* Itbl support may require additional care here.  */
11653       coproc = 1;
11654       goto ld_st;
11655     case M_SWC2_AB:
11656       s = "swc2";
11657       fmt = COP12_FMT;
11658       offbits = (mips_opts.micromips ? 12
11659                  : ISA_IS_R6 (mips_opts.isa) ? 11
11660                  : 16);
11661       /* Itbl support may require additional care here.  */
11662       coproc = 1;
11663       goto ld_st;
11664     case M_SWC3_AB:
11665       gas_assert (!mips_opts.micromips);
11666       s = "swc3";
11667       fmt = "E,o(b)";
11668       /* Itbl support may require additional care here.  */
11669       coproc = 1;
11670       goto ld_st;
11671     case M_SWL_AB:
11672       s = "swl";
11673       fmt = MEM12_FMT;
11674       offbits = (mips_opts.micromips ? 12 : 16);
11675       goto ld_st;
11676     case M_SWR_AB:
11677       s = "swr";
11678       fmt = MEM12_FMT;
11679       offbits = (mips_opts.micromips ? 12 : 16);
11680       goto ld_st;
11681     case M_SC_AB:
11682       s = "sc";
11683       fmt = LL_SC_FMT;
11684       offbits = (mips_opts.micromips ? 12
11685                  : ISA_IS_R6 (mips_opts.isa) ? 9
11686                  : 16);
11687       goto ld_st;
11688     case M_SCD_AB:
11689       s = "scd";
11690       fmt = LL_SC_FMT;
11691       offbits = (mips_opts.micromips ? 12
11692                  : ISA_IS_R6 (mips_opts.isa) ? 9
11693                  : 16);
11694       goto ld_st;
11695     case M_CACHE_AB:
11696       s = "cache";
11697       fmt = (mips_opts.micromips ? "k,~(b)"
11698              : ISA_IS_R6 (mips_opts.isa) ? "k,+j(b)"
11699              : "k,o(b)");
11700       offbits = (mips_opts.micromips ? 12
11701                  : ISA_IS_R6 (mips_opts.isa) ? 9
11702                  : 16);
11703       goto ld_st;
11704     case M_CACHEE_AB:
11705       s = "cachee";
11706       fmt = "k,+j(b)";
11707       offbits = 9;
11708       goto ld_st;
11709     case M_PREF_AB:
11710       s = "pref";
11711       fmt = (mips_opts.micromips ? "k,~(b)"
11712              : ISA_IS_R6 (mips_opts.isa) ? "k,+j(b)"
11713              : "k,o(b)");
11714       offbits = (mips_opts.micromips ? 12
11715                  : ISA_IS_R6 (mips_opts.isa) ? 9
11716                  : 16);
11717       goto ld_st;
11718     case M_PREFE_AB:
11719       s = "prefe";
11720       fmt = "k,+j(b)";
11721       offbits = 9;
11722       goto ld_st;
11723     case M_SDC1_AB:
11724       s = "sdc1";
11725       fmt = "T,o(b)";
11726       coproc = 1;
11727       /* Itbl support may require additional care here.  */
11728       goto ld_st;
11729     case M_SDC2_AB:
11730       s = "sdc2";
11731       fmt = COP12_FMT;
11732       offbits = (mips_opts.micromips ? 12
11733                  : ISA_IS_R6 (mips_opts.isa) ? 11
11734                  : 16);
11735       /* Itbl support may require additional care here.  */
11736       coproc = 1;
11737       goto ld_st;
11738     case M_SQC2_AB:
11739       s = "sqc2";
11740       fmt = "+7,o(b)";
11741       /* Itbl support may require additional care here.  */
11742       coproc = 1;
11743       goto ld_st;
11744     case M_SDC3_AB:
11745       gas_assert (!mips_opts.micromips);
11746       s = "sdc3";
11747       fmt = "E,o(b)";
11748       /* Itbl support may require additional care here.  */
11749       coproc = 1;
11750       goto ld_st;
11751     case M_SDL_AB:
11752       s = "sdl";
11753       fmt = MEM12_FMT;
11754       offbits = (mips_opts.micromips ? 12 : 16);
11755       goto ld_st;
11756     case M_SDR_AB:
11757       s = "sdr";
11758       fmt = MEM12_FMT;
11759       offbits = (mips_opts.micromips ? 12 : 16);
11760       goto ld_st;
11761     case M_SWP_AB:
11762       gas_assert (mips_opts.micromips);
11763       s = "swp";
11764       fmt = "t,~(b)";
11765       offbits = 12;
11766       goto ld_st;
11767     case M_SDP_AB:
11768       gas_assert (mips_opts.micromips);
11769       s = "sdp";
11770       fmt = "t,~(b)";
11771       offbits = 12;
11772       goto ld_st;
11773     case M_SWM_AB:
11774       gas_assert (mips_opts.micromips);
11775       s = "swm";
11776       fmt = "n,~(b)";
11777       offbits = 12;
11778       goto ld_st;
11779     case M_SDM_AB:
11780       gas_assert (mips_opts.micromips);
11781       s = "sdm";
11782       fmt = "n,~(b)";
11783       offbits = 12;
11784
11785     ld_st:
11786       tempreg = AT;
11787     ld_noat:
11788       breg = op[2];
11789       if (small_offset_p (0, align, 16))
11790         {
11791           /* The first case exists for M_LD_AB and M_SD_AB, which are
11792              macros for o32 but which should act like normal instructions
11793              otherwise.  */
11794           if (offbits == 16)
11795             macro_build (&offset_expr, s, fmt, op[0], -1, offset_reloc[0],
11796                          offset_reloc[1], offset_reloc[2], breg);
11797           else if (small_offset_p (0, align, offbits))
11798             {
11799               if (offbits == 0)
11800                 macro_build (NULL, s, fmt, op[0], breg);
11801               else
11802                 macro_build (NULL, s, fmt, op[0],
11803                              (int) offset_expr.X_add_number, breg);
11804             }
11805           else
11806             {
11807               if (tempreg == AT)
11808                 used_at = 1;
11809               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
11810                            tempreg, breg, -1, offset_reloc[0],
11811                            offset_reloc[1], offset_reloc[2]);
11812               if (offbits == 0)
11813                 macro_build (NULL, s, fmt, op[0], tempreg);
11814               else
11815                 macro_build (NULL, s, fmt, op[0], 0, tempreg);
11816             }
11817           break;
11818         }
11819
11820       if (tempreg == AT)
11821         used_at = 1;
11822
11823       if (offset_expr.X_op != O_constant
11824           && offset_expr.X_op != O_symbol)
11825         {
11826           as_bad (_("expression too complex"));
11827           offset_expr.X_op = O_constant;
11828         }
11829
11830       if (HAVE_32BIT_ADDRESSES
11831           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
11832         {
11833           char value [32];
11834
11835           sprintf_vma (value, offset_expr.X_add_number);
11836           as_bad (_("number (0x%s) larger than 32 bits"), value);
11837         }
11838
11839       /* A constant expression in PIC code can be handled just as it
11840          is in non PIC code.  */
11841       if (offset_expr.X_op == O_constant)
11842         {
11843           expr1.X_add_number = offset_high_part (offset_expr.X_add_number,
11844                                                  offbits == 0 ? 16 : offbits);
11845           offset_expr.X_add_number -= expr1.X_add_number;
11846
11847           load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
11848           if (breg != 0)
11849             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
11850                          tempreg, tempreg, breg);
11851           if (offbits == 0)
11852             {
11853               if (offset_expr.X_add_number != 0)
11854                 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
11855                              "t,r,j", tempreg, tempreg, BFD_RELOC_LO16);
11856               macro_build (NULL, s, fmt, op[0], tempreg);
11857             }
11858           else if (offbits == 16)
11859             macro_build (&offset_expr, s, fmt, op[0], BFD_RELOC_LO16, tempreg);
11860           else
11861             macro_build (NULL, s, fmt, op[0],
11862                          (int) offset_expr.X_add_number, tempreg);
11863         }
11864       else if (offbits != 16)
11865         {
11866           /* The offset field is too narrow to be used for a low-part
11867              relocation, so load the whole address into the auxiliary
11868              register.  */
11869           load_address (tempreg, &offset_expr, &used_at);
11870           if (breg != 0)
11871             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
11872                          tempreg, tempreg, breg);
11873           if (offbits == 0)
11874             macro_build (NULL, s, fmt, op[0], tempreg);
11875           else
11876             macro_build (NULL, s, fmt, op[0], 0, tempreg);
11877         }
11878       else if (mips_pic == NO_PIC)
11879         {
11880           /* If this is a reference to a GP relative symbol, and there
11881              is no base register, we want
11882                <op>     op[0],<sym>($gp)        (BFD_RELOC_GPREL16)
11883              Otherwise, if there is no base register, we want
11884                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
11885                <op>     op[0],<sym>($tempreg)   (BFD_RELOC_LO16)
11886              If we have a constant, we need two instructions anyhow,
11887              so we always use the latter form.
11888
11889              If we have a base register, and this is a reference to a
11890              GP relative symbol, we want
11891                addu     $tempreg,$breg,$gp
11892                <op>     op[0],<sym>($tempreg)   (BFD_RELOC_GPREL16)
11893              Otherwise we want
11894                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
11895                addu     $tempreg,$tempreg,$breg
11896                <op>     op[0],<sym>($tempreg)   (BFD_RELOC_LO16)
11897              With a constant we always use the latter case.
11898
11899              With 64bit address space and no base register and $at usable,
11900              we want
11901                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
11902                lui      $at,<sym>               (BFD_RELOC_HI16_S)
11903                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
11904                dsll32   $tempreg,0
11905                daddu    $tempreg,$at
11906                <op>     op[0],<sym>($tempreg)   (BFD_RELOC_LO16)
11907              If we have a base register, we want
11908                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
11909                lui      $at,<sym>               (BFD_RELOC_HI16_S)
11910                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
11911                daddu    $at,$breg
11912                dsll32   $tempreg,0
11913                daddu    $tempreg,$at
11914                <op>     op[0],<sym>($tempreg)   (BFD_RELOC_LO16)
11915
11916              Without $at we can't generate the optimal path for superscalar
11917              processors here since this would require two temporary registers.
11918                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
11919                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
11920                dsll     $tempreg,16
11921                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
11922                dsll     $tempreg,16
11923                <op>     op[0],<sym>($tempreg)   (BFD_RELOC_LO16)
11924              If we have a base register, we want
11925                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
11926                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
11927                dsll     $tempreg,16
11928                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
11929                dsll     $tempreg,16
11930                daddu    $tempreg,$tempreg,$breg
11931                <op>     op[0],<sym>($tempreg)   (BFD_RELOC_LO16)
11932
11933              For GP relative symbols in 64bit address space we can use
11934              the same sequence as in 32bit address space.  */
11935           if (HAVE_64BIT_SYMBOLS)
11936             {
11937               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
11938                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
11939                 {
11940                   relax_start (offset_expr.X_add_symbol);
11941                   if (breg == 0)
11942                     {
11943                       macro_build (&offset_expr, s, fmt, op[0],
11944                                    BFD_RELOC_GPREL16, mips_gp_register);
11945                     }
11946                   else
11947                     {
11948                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
11949                                    tempreg, breg, mips_gp_register);
11950                       macro_build (&offset_expr, s, fmt, op[0],
11951                                    BFD_RELOC_GPREL16, tempreg);
11952                     }
11953                   relax_switch ();
11954                 }
11955
11956               if (used_at == 0 && mips_opts.at)
11957                 {
11958                   macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
11959                                BFD_RELOC_MIPS_HIGHEST);
11960                   macro_build (&offset_expr, "lui", LUI_FMT, AT,
11961                                BFD_RELOC_HI16_S);
11962                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
11963                                tempreg, BFD_RELOC_MIPS_HIGHER);
11964                   if (breg != 0)
11965                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
11966                   macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
11967                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
11968                   macro_build (&offset_expr, s, fmt, op[0], BFD_RELOC_LO16,
11969                                tempreg);
11970                   used_at = 1;
11971                 }
11972               else
11973                 {
11974                   macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
11975                                BFD_RELOC_MIPS_HIGHEST);
11976                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
11977                                tempreg, BFD_RELOC_MIPS_HIGHER);
11978                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
11979                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
11980                                tempreg, BFD_RELOC_HI16_S);
11981                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
11982                   if (breg != 0)
11983                     macro_build (NULL, "daddu", "d,v,t",
11984                                  tempreg, tempreg, breg);
11985                   macro_build (&offset_expr, s, fmt, op[0],
11986                                BFD_RELOC_LO16, tempreg);
11987                 }
11988
11989               if (mips_relax.sequence)
11990                 relax_end ();
11991               break;
11992             }
11993
11994           if (breg == 0)
11995             {
11996               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
11997                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
11998                 {
11999                   relax_start (offset_expr.X_add_symbol);
12000                   macro_build (&offset_expr, s, fmt, op[0], BFD_RELOC_GPREL16,
12001                                mips_gp_register);
12002                   relax_switch ();
12003                 }
12004               macro_build_lui (&offset_expr, tempreg);
12005               macro_build (&offset_expr, s, fmt, op[0],
12006                            BFD_RELOC_LO16, tempreg);
12007               if (mips_relax.sequence)
12008                 relax_end ();
12009             }
12010           else
12011             {
12012               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
12013                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
12014                 {
12015                   relax_start (offset_expr.X_add_symbol);
12016                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
12017                                tempreg, breg, mips_gp_register);
12018                   macro_build (&offset_expr, s, fmt, op[0],
12019                                BFD_RELOC_GPREL16, tempreg);
12020                   relax_switch ();
12021                 }
12022               macro_build_lui (&offset_expr, tempreg);
12023               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
12024                            tempreg, tempreg, breg);
12025               macro_build (&offset_expr, s, fmt, op[0],
12026                            BFD_RELOC_LO16, tempreg);
12027               if (mips_relax.sequence)
12028                 relax_end ();
12029             }
12030         }
12031       else if (!mips_big_got)
12032         {
12033           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
12034
12035           /* If this is a reference to an external symbol, we want
12036                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
12037                nop
12038                <op>     op[0],0($tempreg)
12039              Otherwise we want
12040                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
12041                nop
12042                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
12043                <op>     op[0],0($tempreg)
12044
12045              For NewABI, we want
12046                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
12047                <op>     op[0],<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
12048
12049              If there is a base register, we add it to $tempreg before
12050              the <op>.  If there is a constant, we stick it in the
12051              <op> instruction.  We don't handle constants larger than
12052              16 bits, because we have no way to load the upper 16 bits
12053              (actually, we could handle them for the subset of cases
12054              in which we are not using $at).  */
12055           gas_assert (offset_expr.X_op == O_symbol);
12056           if (HAVE_NEWABI)
12057             {
12058               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
12059                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
12060               if (breg != 0)
12061                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
12062                              tempreg, tempreg, breg);
12063               macro_build (&offset_expr, s, fmt, op[0],
12064                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
12065               break;
12066             }
12067           expr1.X_add_number = offset_expr.X_add_number;
12068           offset_expr.X_add_number = 0;
12069           if (expr1.X_add_number < -0x8000
12070               || expr1.X_add_number >= 0x8000)
12071             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
12072           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
12073                        lw_reloc_type, mips_gp_register);
12074           load_delay_nop ();
12075           relax_start (offset_expr.X_add_symbol);
12076           relax_switch ();
12077           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
12078                        tempreg, BFD_RELOC_LO16);
12079           relax_end ();
12080           if (breg != 0)
12081             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
12082                          tempreg, tempreg, breg);
12083           macro_build (&expr1, s, fmt, op[0], BFD_RELOC_LO16, tempreg);
12084         }
12085       else if (mips_big_got && !HAVE_NEWABI)
12086         {
12087           int gpdelay;
12088
12089           /* If this is a reference to an external symbol, we want
12090                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
12091                addu     $tempreg,$tempreg,$gp
12092                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
12093                <op>     op[0],0($tempreg)
12094              Otherwise we want
12095                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
12096                nop
12097                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
12098                <op>     op[0],0($tempreg)
12099              If there is a base register, we add it to $tempreg before
12100              the <op>.  If there is a constant, we stick it in the
12101              <op> instruction.  We don't handle constants larger than
12102              16 bits, because we have no way to load the upper 16 bits
12103              (actually, we could handle them for the subset of cases
12104              in which we are not using $at).  */
12105           gas_assert (offset_expr.X_op == O_symbol);
12106           expr1.X_add_number = offset_expr.X_add_number;
12107           offset_expr.X_add_number = 0;
12108           if (expr1.X_add_number < -0x8000
12109               || expr1.X_add_number >= 0x8000)
12110             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
12111           gpdelay = reg_needs_delay (mips_gp_register);
12112           relax_start (offset_expr.X_add_symbol);
12113           macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
12114                        BFD_RELOC_MIPS_GOT_HI16);
12115           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
12116                        mips_gp_register);
12117           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
12118                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
12119           relax_switch ();
12120           if (gpdelay)
12121             macro_build (NULL, "nop", "");
12122           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
12123                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
12124           load_delay_nop ();
12125           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
12126                        tempreg, BFD_RELOC_LO16);
12127           relax_end ();
12128
12129           if (breg != 0)
12130             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
12131                          tempreg, tempreg, breg);
12132           macro_build (&expr1, s, fmt, op[0], BFD_RELOC_LO16, tempreg);
12133         }
12134       else if (mips_big_got && HAVE_NEWABI)
12135         {
12136           /* If this is a reference to an external symbol, we want
12137                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
12138                add      $tempreg,$tempreg,$gp
12139                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
12140                <op>     op[0],<ofst>($tempreg)
12141              Otherwise, for local symbols, we want:
12142                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
12143                <op>     op[0],<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
12144           gas_assert (offset_expr.X_op == O_symbol);
12145           expr1.X_add_number = offset_expr.X_add_number;
12146           offset_expr.X_add_number = 0;
12147           if (expr1.X_add_number < -0x8000
12148               || expr1.X_add_number >= 0x8000)
12149             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
12150           relax_start (offset_expr.X_add_symbol);
12151           macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
12152                        BFD_RELOC_MIPS_GOT_HI16);
12153           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
12154                        mips_gp_register);
12155           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
12156                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
12157           if (breg != 0)
12158             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
12159                          tempreg, tempreg, breg);
12160           macro_build (&expr1, s, fmt, op[0], BFD_RELOC_LO16, tempreg);
12161
12162           relax_switch ();
12163           offset_expr.X_add_number = expr1.X_add_number;
12164           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
12165                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
12166           if (breg != 0)
12167             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
12168                          tempreg, tempreg, breg);
12169           macro_build (&offset_expr, s, fmt, op[0],
12170                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
12171           relax_end ();
12172         }
12173       else
12174         abort ();
12175
12176       break;
12177
12178     case M_JRADDIUSP:
12179       gas_assert (mips_opts.micromips);
12180       gas_assert (mips_opts.insn32);
12181       start_noreorder ();
12182       macro_build (NULL, "jr", "s", RA);
12183       expr1.X_add_number = op[0] << 2;
12184       macro_build (&expr1, "addiu", "t,r,j", SP, SP, BFD_RELOC_LO16);
12185       end_noreorder ();
12186       break;
12187
12188     case M_JRC:
12189       gas_assert (mips_opts.micromips);
12190       gas_assert (mips_opts.insn32);
12191       macro_build (NULL, "jr", "s", op[0]);
12192       if (mips_opts.noreorder)
12193         macro_build (NULL, "nop", "");
12194       break;
12195
12196     case M_LI:
12197     case M_LI_S:
12198       load_register (op[0], &imm_expr, 0);
12199       break;
12200
12201     case M_DLI:
12202       load_register (op[0], &imm_expr, 1);
12203       break;
12204
12205     case M_LI_SS:
12206       if (imm_expr.X_op == O_constant)
12207         {
12208           used_at = 1;
12209           load_register (AT, &imm_expr, 0);
12210           macro_build (NULL, "mtc1", "t,G", AT, op[0]);
12211           break;
12212         }
12213       else
12214         {
12215           gas_assert (imm_expr.X_op == O_absent
12216                       && offset_expr.X_op == O_symbol
12217                       && strcmp (segment_name (S_GET_SEGMENT
12218                                                (offset_expr.X_add_symbol)),
12219                                  ".lit4") == 0
12220                       && offset_expr.X_add_number == 0);
12221           macro_build (&offset_expr, "lwc1", "T,o(b)", op[0],
12222                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
12223           break;
12224         }
12225
12226     case M_LI_D:
12227       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
12228          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
12229          order 32 bits of the value and the low order 32 bits are either
12230          zero or in OFFSET_EXPR.  */
12231       if (imm_expr.X_op == O_constant)
12232         {
12233           if (GPR_SIZE == 64)
12234             load_register (op[0], &imm_expr, 1);
12235           else
12236             {
12237               int hreg, lreg;
12238
12239               if (target_big_endian)
12240                 {
12241                   hreg = op[0];
12242                   lreg = op[0] + 1;
12243                 }
12244               else
12245                 {
12246                   hreg = op[0] + 1;
12247                   lreg = op[0];
12248                 }
12249
12250               if (hreg <= 31)
12251                 load_register (hreg, &imm_expr, 0);
12252               if (lreg <= 31)
12253                 {
12254                   if (offset_expr.X_op == O_absent)
12255                     move_register (lreg, 0);
12256                   else
12257                     {
12258                       gas_assert (offset_expr.X_op == O_constant);
12259                       load_register (lreg, &offset_expr, 0);
12260                     }
12261                 }
12262             }
12263           break;
12264         }
12265       gas_assert (imm_expr.X_op == O_absent);
12266
12267       /* We know that sym is in the .rdata section.  First we get the
12268          upper 16 bits of the address.  */
12269       if (mips_pic == NO_PIC)
12270         {
12271           macro_build_lui (&offset_expr, AT);
12272           used_at = 1;
12273         }
12274       else
12275         {
12276           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
12277                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
12278           used_at = 1;
12279         }
12280
12281       /* Now we load the register(s).  */
12282       if (GPR_SIZE == 64)
12283         {
12284           used_at = 1;
12285           macro_build (&offset_expr, "ld", "t,o(b)", op[0],
12286                        BFD_RELOC_LO16, AT);
12287         }
12288       else
12289         {
12290           used_at = 1;
12291           macro_build (&offset_expr, "lw", "t,o(b)", op[0],
12292                        BFD_RELOC_LO16, AT);
12293           if (op[0] != RA)
12294             {
12295               /* FIXME: How in the world do we deal with the possible
12296                  overflow here?  */
12297               offset_expr.X_add_number += 4;
12298               macro_build (&offset_expr, "lw", "t,o(b)",
12299                            op[0] + 1, BFD_RELOC_LO16, AT);
12300             }
12301         }
12302       break;
12303
12304     case M_LI_DD:
12305       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
12306          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
12307          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
12308          the value and the low order 32 bits are either zero or in
12309          OFFSET_EXPR.  */
12310       if (imm_expr.X_op == O_constant)
12311         {
12312           used_at = 1;
12313           load_register (AT, &imm_expr, FPR_SIZE == 64);
12314           if (FPR_SIZE == 64 && GPR_SIZE == 64)
12315             macro_build (NULL, "dmtc1", "t,S", AT, op[0]);
12316           else
12317             {
12318               if (ISA_HAS_MXHC1 (mips_opts.isa))
12319                 macro_build (NULL, "mthc1", "t,G", AT, op[0]);
12320               else if (FPR_SIZE != 32)
12321                 as_bad (_("Unable to generate `%s' compliant code "
12322                           "without mthc1"),
12323                         (FPR_SIZE == 64) ? "fp64" : "fpxx");
12324               else
12325                 macro_build (NULL, "mtc1", "t,G", AT, op[0] + 1);
12326               if (offset_expr.X_op == O_absent)
12327                 macro_build (NULL, "mtc1", "t,G", 0, op[0]);
12328               else
12329                 {
12330                   gas_assert (offset_expr.X_op == O_constant);
12331                   load_register (AT, &offset_expr, 0);
12332                   macro_build (NULL, "mtc1", "t,G", AT, op[0]);
12333                 }
12334             }
12335           break;
12336         }
12337
12338       gas_assert (imm_expr.X_op == O_absent
12339                   && offset_expr.X_op == O_symbol
12340                   && offset_expr.X_add_number == 0);
12341       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
12342       if (strcmp (s, ".lit8") == 0)
12343         {
12344           op[2] = mips_gp_register;
12345           offset_reloc[0] = BFD_RELOC_MIPS_LITERAL;
12346           offset_reloc[1] = BFD_RELOC_UNUSED;
12347           offset_reloc[2] = BFD_RELOC_UNUSED;
12348         }
12349       else
12350         {
12351           gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
12352           used_at = 1;
12353           if (mips_pic != NO_PIC)
12354             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
12355                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
12356           else
12357             {
12358               /* FIXME: This won't work for a 64 bit address.  */
12359               macro_build_lui (&offset_expr, AT);
12360             }
12361
12362           op[2] = AT;
12363           offset_reloc[0] = BFD_RELOC_LO16;
12364           offset_reloc[1] = BFD_RELOC_UNUSED;
12365           offset_reloc[2] = BFD_RELOC_UNUSED;
12366         }
12367       align = 8;
12368       /* Fall through */
12369
12370     case M_L_DAB:
12371       /*
12372        * The MIPS assembler seems to check for X_add_number not
12373        * being double aligned and generating:
12374        *        lui     at,%hi(foo+1)
12375        *        addu    at,at,v1
12376        *        addiu   at,at,%lo(foo+1)
12377        *        lwc1    f2,0(at)
12378        *        lwc1    f3,4(at)
12379        * But, the resulting address is the same after relocation so why
12380        * generate the extra instruction?
12381        */
12382       /* Itbl support may require additional care here.  */
12383       coproc = 1;
12384       fmt = "T,o(b)";
12385       if (CPU_HAS_LDC1_SDC1 (mips_opts.arch))
12386         {
12387           s = "ldc1";
12388           goto ld_st;
12389         }
12390       s = "lwc1";
12391       goto ldd_std;
12392
12393     case M_S_DAB:
12394       gas_assert (!mips_opts.micromips);
12395       /* Itbl support may require additional care here.  */
12396       coproc = 1;
12397       fmt = "T,o(b)";
12398       if (CPU_HAS_LDC1_SDC1 (mips_opts.arch))
12399         {
12400           s = "sdc1";
12401           goto ld_st;
12402         }
12403       s = "swc1";
12404       goto ldd_std;
12405
12406     case M_LQ_AB:
12407       fmt = "t,o(b)";
12408       s = "lq";
12409       goto ld;
12410
12411     case M_SQ_AB:
12412       fmt = "t,o(b)";
12413       s = "sq";
12414       goto ld_st;
12415
12416     case M_LD_AB:
12417       fmt = "t,o(b)";
12418       if (GPR_SIZE == 64)
12419         {
12420           s = "ld";
12421           goto ld;
12422         }
12423       s = "lw";
12424       goto ldd_std;
12425
12426     case M_SD_AB:
12427       fmt = "t,o(b)";
12428       if (GPR_SIZE == 64)
12429         {
12430           s = "sd";
12431           goto ld_st;
12432         }
12433       s = "sw";
12434
12435     ldd_std:
12436       /* Even on a big endian machine $fn comes before $fn+1.  We have
12437          to adjust when loading from memory.  We set coproc if we must
12438          load $fn+1 first.  */
12439       /* Itbl support may require additional care here.  */
12440       if (!target_big_endian)
12441         coproc = 0;
12442
12443       breg = op[2];
12444       if (small_offset_p (0, align, 16))
12445         {
12446           ep = &offset_expr;
12447           if (!small_offset_p (4, align, 16))
12448             {
12449               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", AT, breg,
12450                            -1, offset_reloc[0], offset_reloc[1],
12451                            offset_reloc[2]);
12452               expr1.X_add_number = 0;
12453               ep = &expr1;
12454               breg = AT;
12455               used_at = 1;
12456               offset_reloc[0] = BFD_RELOC_LO16;
12457               offset_reloc[1] = BFD_RELOC_UNUSED;
12458               offset_reloc[2] = BFD_RELOC_UNUSED;
12459             }
12460           if (strcmp (s, "lw") == 0 && op[0] == breg)
12461             {
12462               ep->X_add_number += 4;
12463               macro_build (ep, s, fmt, op[0] + 1, -1, offset_reloc[0],
12464                            offset_reloc[1], offset_reloc[2], breg);
12465               ep->X_add_number -= 4;
12466               macro_build (ep, s, fmt, op[0], -1, offset_reloc[0],
12467                            offset_reloc[1], offset_reloc[2], breg);
12468             }
12469           else
12470             {
12471               macro_build (ep, s, fmt, coproc ? op[0] + 1 : op[0], -1,
12472                            offset_reloc[0], offset_reloc[1], offset_reloc[2],
12473                            breg);
12474               ep->X_add_number += 4;
12475               macro_build (ep, s, fmt, coproc ? op[0] : op[0] + 1, -1,
12476                            offset_reloc[0], offset_reloc[1], offset_reloc[2],
12477                            breg);
12478             }
12479           break;
12480         }
12481
12482       if (offset_expr.X_op != O_symbol
12483           && offset_expr.X_op != O_constant)
12484         {
12485           as_bad (_("expression too complex"));
12486           offset_expr.X_op = O_constant;
12487         }
12488
12489       if (HAVE_32BIT_ADDRESSES
12490           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
12491         {
12492           char value [32];
12493
12494           sprintf_vma (value, offset_expr.X_add_number);
12495           as_bad (_("number (0x%s) larger than 32 bits"), value);
12496         }
12497
12498       if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
12499         {
12500           /* If this is a reference to a GP relative symbol, we want
12501                <op>     op[0],<sym>($gp)        (BFD_RELOC_GPREL16)
12502                <op>     op[0]+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
12503              If we have a base register, we use this
12504                addu     $at,$breg,$gp
12505                <op>     op[0],<sym>($at)        (BFD_RELOC_GPREL16)
12506                <op>     op[0]+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
12507              If this is not a GP relative symbol, we want
12508                lui      $at,<sym>               (BFD_RELOC_HI16_S)
12509                <op>     op[0],<sym>($at)        (BFD_RELOC_LO16)
12510                <op>     op[0]+1,<sym>+4($at)    (BFD_RELOC_LO16)
12511              If there is a base register, we add it to $at after the
12512              lui instruction.  If there is a constant, we always use
12513              the last case.  */
12514           if (offset_expr.X_op == O_symbol
12515               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
12516               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
12517             {
12518               relax_start (offset_expr.X_add_symbol);
12519               if (breg == 0)
12520                 {
12521                   tempreg = mips_gp_register;
12522                 }
12523               else
12524                 {
12525                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
12526                                AT, breg, mips_gp_register);
12527                   tempreg = AT;
12528                   used_at = 1;
12529                 }
12530
12531               /* Itbl support may require additional care here.  */
12532               macro_build (&offset_expr, s, fmt, coproc ? op[0] + 1 : op[0],
12533                            BFD_RELOC_GPREL16, tempreg);
12534               offset_expr.X_add_number += 4;
12535
12536               /* Set mips_optimize to 2 to avoid inserting an
12537                  undesired nop.  */
12538               hold_mips_optimize = mips_optimize;
12539               mips_optimize = 2;
12540               /* Itbl support may require additional care here.  */
12541               macro_build (&offset_expr, s, fmt, coproc ? op[0] : op[0] + 1,
12542                            BFD_RELOC_GPREL16, tempreg);
12543               mips_optimize = hold_mips_optimize;
12544
12545               relax_switch ();
12546
12547               offset_expr.X_add_number -= 4;
12548             }
12549           used_at = 1;
12550           if (offset_high_part (offset_expr.X_add_number, 16)
12551               != offset_high_part (offset_expr.X_add_number + 4, 16))
12552             {
12553               load_address (AT, &offset_expr, &used_at);
12554               offset_expr.X_op = O_constant;
12555               offset_expr.X_add_number = 0;
12556             }
12557           else
12558             macro_build_lui (&offset_expr, AT);
12559           if (breg != 0)
12560             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
12561           /* Itbl support may require additional care here.  */
12562           macro_build (&offset_expr, s, fmt, coproc ? op[0] + 1 : op[0],
12563                        BFD_RELOC_LO16, AT);
12564           /* FIXME: How do we handle overflow here?  */
12565           offset_expr.X_add_number += 4;
12566           /* Itbl support may require additional care here.  */
12567           macro_build (&offset_expr, s, fmt, coproc ? op[0] : op[0] + 1,
12568                        BFD_RELOC_LO16, AT);
12569           if (mips_relax.sequence)
12570             relax_end ();
12571         }
12572       else if (!mips_big_got)
12573         {
12574           /* If this is a reference to an external symbol, we want
12575                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
12576                nop
12577                <op>     op[0],0($at)
12578                <op>     op[0]+1,4($at)
12579              Otherwise we want
12580                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
12581                nop
12582                <op>     op[0],<sym>($at)        (BFD_RELOC_LO16)
12583                <op>     op[0]+1,<sym>+4($at)    (BFD_RELOC_LO16)
12584              If there is a base register we add it to $at before the
12585              lwc1 instructions.  If there is a constant we include it
12586              in the lwc1 instructions.  */
12587           used_at = 1;
12588           expr1.X_add_number = offset_expr.X_add_number;
12589           if (expr1.X_add_number < -0x8000
12590               || expr1.X_add_number >= 0x8000 - 4)
12591             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
12592           load_got_offset (AT, &offset_expr);
12593           load_delay_nop ();
12594           if (breg != 0)
12595             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
12596
12597           /* Set mips_optimize to 2 to avoid inserting an undesired
12598              nop.  */
12599           hold_mips_optimize = mips_optimize;
12600           mips_optimize = 2;
12601
12602           /* Itbl support may require additional care here.  */
12603           relax_start (offset_expr.X_add_symbol);
12604           macro_build (&expr1, s, fmt, coproc ? op[0] + 1 : op[0],
12605                        BFD_RELOC_LO16, AT);
12606           expr1.X_add_number += 4;
12607           macro_build (&expr1, s, fmt, coproc ? op[0] : op[0] + 1,
12608                        BFD_RELOC_LO16, AT);
12609           relax_switch ();
12610           macro_build (&offset_expr, s, fmt, coproc ? op[0] + 1 : op[0],
12611                        BFD_RELOC_LO16, AT);
12612           offset_expr.X_add_number += 4;
12613           macro_build (&offset_expr, s, fmt, coproc ? op[0] : op[0] + 1,
12614                        BFD_RELOC_LO16, AT);
12615           relax_end ();
12616
12617           mips_optimize = hold_mips_optimize;
12618         }
12619       else if (mips_big_got)
12620         {
12621           int gpdelay;
12622
12623           /* If this is a reference to an external symbol, we want
12624                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
12625                addu     $at,$at,$gp
12626                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
12627                nop
12628                <op>     op[0],0($at)
12629                <op>     op[0]+1,4($at)
12630              Otherwise we want
12631                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
12632                nop
12633                <op>     op[0],<sym>($at)        (BFD_RELOC_LO16)
12634                <op>     op[0]+1,<sym>+4($at)    (BFD_RELOC_LO16)
12635              If there is a base register we add it to $at before the
12636              lwc1 instructions.  If there is a constant we include it
12637              in the lwc1 instructions.  */
12638           used_at = 1;
12639           expr1.X_add_number = offset_expr.X_add_number;
12640           offset_expr.X_add_number = 0;
12641           if (expr1.X_add_number < -0x8000
12642               || expr1.X_add_number >= 0x8000 - 4)
12643             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
12644           gpdelay = reg_needs_delay (mips_gp_register);
12645           relax_start (offset_expr.X_add_symbol);
12646           macro_build (&offset_expr, "lui", LUI_FMT,
12647                        AT, BFD_RELOC_MIPS_GOT_HI16);
12648           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
12649                        AT, AT, mips_gp_register);
12650           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
12651                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
12652           load_delay_nop ();
12653           if (breg != 0)
12654             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
12655           /* Itbl support may require additional care here.  */
12656           macro_build (&expr1, s, fmt, coproc ? op[0] + 1 : op[0],
12657                        BFD_RELOC_LO16, AT);
12658           expr1.X_add_number += 4;
12659
12660           /* Set mips_optimize to 2 to avoid inserting an undesired
12661              nop.  */
12662           hold_mips_optimize = mips_optimize;
12663           mips_optimize = 2;
12664           /* Itbl support may require additional care here.  */
12665           macro_build (&expr1, s, fmt, coproc ? op[0] : op[0] + 1,
12666                        BFD_RELOC_LO16, AT);
12667           mips_optimize = hold_mips_optimize;
12668           expr1.X_add_number -= 4;
12669
12670           relax_switch ();
12671           offset_expr.X_add_number = expr1.X_add_number;
12672           if (gpdelay)
12673             macro_build (NULL, "nop", "");
12674           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
12675                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
12676           load_delay_nop ();
12677           if (breg != 0)
12678             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
12679           /* Itbl support may require additional care here.  */
12680           macro_build (&offset_expr, s, fmt, coproc ? op[0] + 1 : op[0],
12681                        BFD_RELOC_LO16, AT);
12682           offset_expr.X_add_number += 4;
12683
12684           /* Set mips_optimize to 2 to avoid inserting an undesired
12685              nop.  */
12686           hold_mips_optimize = mips_optimize;
12687           mips_optimize = 2;
12688           /* Itbl support may require additional care here.  */
12689           macro_build (&offset_expr, s, fmt, coproc ? op[0] : op[0] + 1,
12690                        BFD_RELOC_LO16, AT);
12691           mips_optimize = hold_mips_optimize;
12692           relax_end ();
12693         }
12694       else
12695         abort ();
12696
12697       break;
12698
12699     case M_SAA_AB:
12700       s = "saa";
12701       goto saa_saad;
12702     case M_SAAD_AB:
12703       s = "saad";
12704     saa_saad:
12705       gas_assert (!mips_opts.micromips);
12706       offbits = 0;
12707       fmt = "t,(b)";
12708       goto ld_st;
12709
12710    /* New code added to support COPZ instructions.
12711       This code builds table entries out of the macros in mip_opcodes.
12712       R4000 uses interlocks to handle coproc delays.
12713       Other chips (like the R3000) require nops to be inserted for delays.
12714
12715       FIXME: Currently, we require that the user handle delays.
12716       In order to fill delay slots for non-interlocked chips,
12717       we must have a way to specify delays based on the coprocessor.
12718       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
12719       What are the side-effects of the cop instruction?
12720       What cache support might we have and what are its effects?
12721       Both coprocessor & memory require delays. how long???
12722       What registers are read/set/modified?
12723
12724       If an itbl is provided to interpret cop instructions,
12725       this knowledge can be encoded in the itbl spec.  */
12726
12727     case M_COP0:
12728       s = "c0";
12729       goto copz;
12730     case M_COP1:
12731       s = "c1";
12732       goto copz;
12733     case M_COP2:
12734       s = "c2";
12735       goto copz;
12736     case M_COP3:
12737       s = "c3";
12738     copz:
12739       gas_assert (!mips_opts.micromips);
12740       /* For now we just do C (same as Cz).  The parameter will be
12741          stored in insn_opcode by mips_ip.  */
12742       macro_build (NULL, s, "C", (int) ip->insn_opcode);
12743       break;
12744
12745     case M_MOVE:
12746       move_register (op[0], op[1]);
12747       break;
12748
12749     case M_MOVEP:
12750       gas_assert (mips_opts.micromips);
12751       gas_assert (mips_opts.insn32);
12752       move_register (micromips_to_32_reg_h_map1[op[0]],
12753                      micromips_to_32_reg_m_map[op[1]]);
12754       move_register (micromips_to_32_reg_h_map2[op[0]],
12755                      micromips_to_32_reg_n_map[op[2]]);
12756       break;
12757
12758     case M_DMUL:
12759       dbl = 1;
12760       /* Fall through.  */
12761     case M_MUL:
12762       if (mips_opts.arch == CPU_R5900)
12763         macro_build (NULL, dbl ? "dmultu" : "multu", "d,s,t", op[0], op[1],
12764                      op[2]);
12765       else
12766         {
12767           macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", op[1], op[2]);
12768           macro_build (NULL, "mflo", MFHL_FMT, op[0]);
12769         }
12770       break;
12771
12772     case M_DMUL_I:
12773       dbl = 1;
12774       /* Fall through.  */
12775     case M_MUL_I:
12776       /* The MIPS assembler some times generates shifts and adds.  I'm
12777          not trying to be that fancy. GCC should do this for us
12778          anyway.  */
12779       used_at = 1;
12780       load_register (AT, &imm_expr, dbl);
12781       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", op[1], AT);
12782       macro_build (NULL, "mflo", MFHL_FMT, op[0]);
12783       break;
12784
12785     case M_DMULO_I:
12786       dbl = 1;
12787       /* Fall through.  */
12788     case M_MULO_I:
12789       imm = 1;
12790       goto do_mulo;
12791
12792     case M_DMULO:
12793       dbl = 1;
12794       /* Fall through.  */
12795     case M_MULO:
12796     do_mulo:
12797       start_noreorder ();
12798       used_at = 1;
12799       if (imm)
12800         load_register (AT, &imm_expr, dbl);
12801       macro_build (NULL, dbl ? "dmult" : "mult", "s,t",
12802                    op[1], imm ? AT : op[2]);
12803       macro_build (NULL, "mflo", MFHL_FMT, op[0]);
12804       macro_build (NULL, dbl ? "dsra32" : "sra", SHFT_FMT, op[0], op[0], 31);
12805       macro_build (NULL, "mfhi", MFHL_FMT, AT);
12806       if (mips_trap)
12807         macro_build (NULL, "tne", TRAP_FMT, op[0], AT, 6);
12808       else
12809         {
12810           if (mips_opts.micromips)
12811             micromips_label_expr (&label_expr);
12812           else
12813             label_expr.X_add_number = 8;
12814           macro_build (&label_expr, "beq", "s,t,p", op[0], AT);
12815           macro_build (NULL, "nop", "");
12816           macro_build (NULL, "break", BRK_FMT, 6);
12817           if (mips_opts.micromips)
12818             micromips_add_label ();
12819         }
12820       end_noreorder ();
12821       macro_build (NULL, "mflo", MFHL_FMT, op[0]);
12822       break;
12823
12824     case M_DMULOU_I:
12825       dbl = 1;
12826       /* Fall through.  */
12827     case M_MULOU_I:
12828       imm = 1;
12829       goto do_mulou;
12830
12831     case M_DMULOU:
12832       dbl = 1;
12833       /* Fall through.  */
12834     case M_MULOU:
12835     do_mulou:
12836       start_noreorder ();
12837       used_at = 1;
12838       if (imm)
12839         load_register (AT, &imm_expr, dbl);
12840       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
12841                    op[1], imm ? AT : op[2]);
12842       macro_build (NULL, "mfhi", MFHL_FMT, AT);
12843       macro_build (NULL, "mflo", MFHL_FMT, op[0]);
12844       if (mips_trap)
12845         macro_build (NULL, "tne", TRAP_FMT, AT, ZERO, 6);
12846       else
12847         {
12848           if (mips_opts.micromips)
12849             micromips_label_expr (&label_expr);
12850           else
12851             label_expr.X_add_number = 8;
12852           macro_build (&label_expr, "beq", "s,t,p", AT, ZERO);
12853           macro_build (NULL, "nop", "");
12854           macro_build (NULL, "break", BRK_FMT, 6);
12855           if (mips_opts.micromips)
12856             micromips_add_label ();
12857         }
12858       end_noreorder ();
12859       break;
12860
12861     case M_DROL:
12862       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
12863         {
12864           if (op[0] == op[1])
12865             {
12866               tempreg = AT;
12867               used_at = 1;
12868             }
12869           else
12870             tempreg = op[0];
12871           macro_build (NULL, "dnegu", "d,w", tempreg, op[2]);
12872           macro_build (NULL, "drorv", "d,t,s", op[0], op[1], tempreg);
12873           break;
12874         }
12875       used_at = 1;
12876       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, op[2]);
12877       macro_build (NULL, "dsrlv", "d,t,s", AT, op[1], AT);
12878       macro_build (NULL, "dsllv", "d,t,s", op[0], op[1], op[2]);
12879       macro_build (NULL, "or", "d,v,t", op[0], op[0], AT);
12880       break;
12881
12882     case M_ROL:
12883       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
12884         {
12885           if (op[0] == op[1])
12886             {
12887               tempreg = AT;
12888               used_at = 1;
12889             }
12890           else
12891             tempreg = op[0];
12892           macro_build (NULL, "negu", "d,w", tempreg, op[2]);
12893           macro_build (NULL, "rorv", "d,t,s", op[0], op[1], tempreg);
12894           break;
12895         }
12896       used_at = 1;
12897       macro_build (NULL, "subu", "d,v,t", AT, ZERO, op[2]);
12898       macro_build (NULL, "srlv", "d,t,s", AT, op[1], AT);
12899       macro_build (NULL, "sllv", "d,t,s", op[0], op[1], op[2]);
12900       macro_build (NULL, "or", "d,v,t", op[0], op[0], AT);
12901       break;
12902
12903     case M_DROL_I:
12904       {
12905         unsigned int rot;
12906         const char *l;
12907         const char *rr;
12908
12909         rot = imm_expr.X_add_number & 0x3f;
12910         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
12911           {
12912             rot = (64 - rot) & 0x3f;
12913             if (rot >= 32)
12914               macro_build (NULL, "dror32", SHFT_FMT, op[0], op[1], rot - 32);
12915             else
12916               macro_build (NULL, "dror", SHFT_FMT, op[0], op[1], rot);
12917             break;
12918           }
12919         if (rot == 0)
12920           {
12921             macro_build (NULL, "dsrl", SHFT_FMT, op[0], op[1], 0);
12922             break;
12923           }
12924         l = (rot < 0x20) ? "dsll" : "dsll32";
12925         rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
12926         rot &= 0x1f;
12927         used_at = 1;
12928         macro_build (NULL, l, SHFT_FMT, AT, op[1], rot);
12929         macro_build (NULL, rr, SHFT_FMT, op[0], op[1], (0x20 - rot) & 0x1f);
12930         macro_build (NULL, "or", "d,v,t", op[0], op[0], AT);
12931       }
12932       break;
12933
12934     case M_ROL_I:
12935       {
12936         unsigned int rot;
12937
12938         rot = imm_expr.X_add_number & 0x1f;
12939         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
12940           {
12941             macro_build (NULL, "ror", SHFT_FMT, op[0], op[1],
12942                          (32 - rot) & 0x1f);
12943             break;
12944           }
12945         if (rot == 0)
12946           {
12947             macro_build (NULL, "srl", SHFT_FMT, op[0], op[1], 0);
12948             break;
12949           }
12950         used_at = 1;
12951         macro_build (NULL, "sll", SHFT_FMT, AT, op[1], rot);
12952         macro_build (NULL, "srl", SHFT_FMT, op[0], op[1], (0x20 - rot) & 0x1f);
12953         macro_build (NULL, "or", "d,v,t", op[0], op[0], AT);
12954       }
12955       break;
12956
12957     case M_DROR:
12958       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
12959         {
12960           macro_build (NULL, "drorv", "d,t,s", op[0], op[1], op[2]);
12961           break;
12962         }
12963       used_at = 1;
12964       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, op[2]);
12965       macro_build (NULL, "dsllv", "d,t,s", AT, op[1], AT);
12966       macro_build (NULL, "dsrlv", "d,t,s", op[0], op[1], op[2]);
12967       macro_build (NULL, "or", "d,v,t", op[0], op[0], AT);
12968       break;
12969
12970     case M_ROR:
12971       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
12972         {
12973           macro_build (NULL, "rorv", "d,t,s", op[0], op[1], op[2]);
12974           break;
12975         }
12976       used_at = 1;
12977       macro_build (NULL, "subu", "d,v,t", AT, ZERO, op[2]);
12978       macro_build (NULL, "sllv", "d,t,s", AT, op[1], AT);
12979       macro_build (NULL, "srlv", "d,t,s", op[0], op[1], op[2]);
12980       macro_build (NULL, "or", "d,v,t", op[0], op[0], AT);
12981       break;
12982
12983     case M_DROR_I:
12984       {
12985         unsigned int rot;
12986         const char *l;
12987         const char *rr;
12988
12989         rot = imm_expr.X_add_number & 0x3f;
12990         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
12991           {
12992             if (rot >= 32)
12993               macro_build (NULL, "dror32", SHFT_FMT, op[0], op[1], rot - 32);
12994             else
12995               macro_build (NULL, "dror", SHFT_FMT, op[0], op[1], rot);
12996             break;
12997           }
12998         if (rot == 0)
12999           {
13000             macro_build (NULL, "dsrl", SHFT_FMT, op[0], op[1], 0);
13001             break;
13002           }
13003         rr = (rot < 0x20) ? "dsrl" : "dsrl32";
13004         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
13005         rot &= 0x1f;
13006         used_at = 1;
13007         macro_build (NULL, rr, SHFT_FMT, AT, op[1], rot);
13008         macro_build (NULL, l, SHFT_FMT, op[0], op[1], (0x20 - rot) & 0x1f);
13009         macro_build (NULL, "or", "d,v,t", op[0], op[0], AT);
13010       }
13011       break;
13012
13013     case M_ROR_I:
13014       {
13015         unsigned int rot;
13016
13017         rot = imm_expr.X_add_number & 0x1f;
13018         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
13019           {
13020             macro_build (NULL, "ror", SHFT_FMT, op[0], op[1], rot);
13021             break;
13022           }
13023         if (rot == 0)
13024           {
13025             macro_build (NULL, "srl", SHFT_FMT, op[0], op[1], 0);
13026             break;
13027           }
13028         used_at = 1;
13029         macro_build (NULL, "srl", SHFT_FMT, AT, op[1], rot);
13030         macro_build (NULL, "sll", SHFT_FMT, op[0], op[1], (0x20 - rot) & 0x1f);
13031         macro_build (NULL, "or", "d,v,t", op[0], op[0], AT);
13032       }
13033       break;
13034
13035     case M_SEQ:
13036       if (op[1] == 0)
13037         macro_build (&expr1, "sltiu", "t,r,j", op[0], op[2], BFD_RELOC_LO16);
13038       else if (op[2] == 0)
13039         macro_build (&expr1, "sltiu", "t,r,j", op[0], op[1], BFD_RELOC_LO16);
13040       else
13041         {
13042           macro_build (NULL, "xor", "d,v,t", op[0], op[1], op[2]);
13043           macro_build (&expr1, "sltiu", "t,r,j", op[0], op[0], BFD_RELOC_LO16);
13044         }
13045       break;
13046
13047     case M_SEQ_I:
13048       if (imm_expr.X_add_number == 0)
13049         {
13050           macro_build (&expr1, "sltiu", "t,r,j", op[0], op[1], BFD_RELOC_LO16);
13051           break;
13052         }
13053       if (op[1] == 0)
13054         {
13055           as_warn (_("instruction %s: result is always false"),
13056                    ip->insn_mo->name);
13057           move_register (op[0], 0);
13058           break;
13059         }
13060       if (CPU_HAS_SEQ (mips_opts.arch)
13061           && -512 <= imm_expr.X_add_number
13062           && imm_expr.X_add_number < 512)
13063         {
13064           macro_build (NULL, "seqi", "t,r,+Q", op[0], op[1],
13065                        (int) imm_expr.X_add_number);
13066           break;
13067         }
13068       if (imm_expr.X_add_number >= 0
13069           && imm_expr.X_add_number < 0x10000)
13070         macro_build (&imm_expr, "xori", "t,r,i", op[0], op[1], BFD_RELOC_LO16);
13071       else if (imm_expr.X_add_number > -0x8000
13072                && imm_expr.X_add_number < 0)
13073         {
13074           imm_expr.X_add_number = -imm_expr.X_add_number;
13075           macro_build (&imm_expr, GPR_SIZE == 32 ? "addiu" : "daddiu",
13076                        "t,r,j", op[0], op[1], BFD_RELOC_LO16);
13077         }
13078       else if (CPU_HAS_SEQ (mips_opts.arch))
13079         {
13080           used_at = 1;
13081           load_register (AT, &imm_expr, GPR_SIZE == 64);
13082           macro_build (NULL, "seq", "d,v,t", op[0], op[1], AT);
13083           break;
13084         }
13085       else
13086         {
13087           load_register (AT, &imm_expr, GPR_SIZE == 64);
13088           macro_build (NULL, "xor", "d,v,t", op[0], op[1], AT);
13089           used_at = 1;
13090         }
13091       macro_build (&expr1, "sltiu", "t,r,j", op[0], op[0], BFD_RELOC_LO16);
13092       break;
13093
13094     case M_SGE:         /* X >= Y  <==>  not (X < Y) */
13095       s = "slt";
13096       goto sge;
13097     case M_SGEU:
13098       s = "sltu";
13099     sge:
13100       macro_build (NULL, s, "d,v,t", op[0], op[1], op[2]);
13101       macro_build (&expr1, "xori", "t,r,i", op[0], op[0], BFD_RELOC_LO16);
13102       break;
13103
13104     case M_SGE_I:       /* X >= I  <==>  not (X < I) */
13105     case M_SGEU_I:
13106       if (imm_expr.X_add_number >= -0x8000
13107           && imm_expr.X_add_number < 0x8000)
13108         macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
13109                      op[0], op[1], BFD_RELOC_LO16);
13110       else
13111         {
13112           load_register (AT, &imm_expr, GPR_SIZE == 64);
13113           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
13114                        op[0], op[1], AT);
13115           used_at = 1;
13116         }
13117       macro_build (&expr1, "xori", "t,r,i", op[0], op[0], BFD_RELOC_LO16);
13118       break;
13119
13120     case M_SGT:         /* X > Y  <==>  Y < X */
13121       s = "slt";
13122       goto sgt;
13123     case M_SGTU:
13124       s = "sltu";
13125     sgt:
13126       macro_build (NULL, s, "d,v,t", op[0], op[2], op[1]);
13127       break;
13128
13129     case M_SGT_I:       /* X > I  <==>  I < X */
13130       s = "slt";
13131       goto sgti;
13132     case M_SGTU_I:
13133       s = "sltu";
13134     sgti:
13135       used_at = 1;
13136       load_register (AT, &imm_expr, GPR_SIZE == 64);
13137       macro_build (NULL, s, "d,v,t", op[0], AT, op[1]);
13138       break;
13139
13140     case M_SLE:         /* X <= Y  <==>  Y >= X  <==>  not (Y < X) */
13141       s = "slt";
13142       goto sle;
13143     case M_SLEU:
13144       s = "sltu";
13145     sle:
13146       macro_build (NULL, s, "d,v,t", op[0], op[2], op[1]);
13147       macro_build (&expr1, "xori", "t,r,i", op[0], op[0], BFD_RELOC_LO16);
13148       break;
13149
13150     case M_SLE_I:       /* X <= I  <==>  I >= X  <==>  not (I < X) */
13151       s = "slt";
13152       goto slei;
13153     case M_SLEU_I:
13154       s = "sltu";
13155     slei:
13156       used_at = 1;
13157       load_register (AT, &imm_expr, GPR_SIZE == 64);
13158       macro_build (NULL, s, "d,v,t", op[0], AT, op[1]);
13159       macro_build (&expr1, "xori", "t,r,i", op[0], op[0], BFD_RELOC_LO16);
13160       break;
13161
13162     case M_SLT_I:
13163       if (imm_expr.X_add_number >= -0x8000
13164           && imm_expr.X_add_number < 0x8000)
13165         {
13166           macro_build (&imm_expr, "slti", "t,r,j", op[0], op[1],
13167                        BFD_RELOC_LO16);
13168           break;
13169         }
13170       used_at = 1;
13171       load_register (AT, &imm_expr, GPR_SIZE == 64);
13172       macro_build (NULL, "slt", "d,v,t", op[0], op[1], AT);
13173       break;
13174
13175     case M_SLTU_I:
13176       if (imm_expr.X_add_number >= -0x8000
13177           && imm_expr.X_add_number < 0x8000)
13178         {
13179           macro_build (&imm_expr, "sltiu", "t,r,j", op[0], op[1],
13180                        BFD_RELOC_LO16);
13181           break;
13182         }
13183       used_at = 1;
13184       load_register (AT, &imm_expr, GPR_SIZE == 64);
13185       macro_build (NULL, "sltu", "d,v,t", op[0], op[1], AT);
13186       break;
13187
13188     case M_SNE:
13189       if (op[1] == 0)
13190         macro_build (NULL, "sltu", "d,v,t", op[0], 0, op[2]);
13191       else if (op[2] == 0)
13192         macro_build (NULL, "sltu", "d,v,t", op[0], 0, op[1]);
13193       else
13194         {
13195           macro_build (NULL, "xor", "d,v,t", op[0], op[1], op[2]);
13196           macro_build (NULL, "sltu", "d,v,t", op[0], 0, op[0]);
13197         }
13198       break;
13199
13200     case M_SNE_I:
13201       if (imm_expr.X_add_number == 0)
13202         {
13203           macro_build (NULL, "sltu", "d,v,t", op[0], 0, op[1]);
13204           break;
13205         }
13206       if (op[1] == 0)
13207         {
13208           as_warn (_("instruction %s: result is always true"),
13209                    ip->insn_mo->name);
13210           macro_build (&expr1, GPR_SIZE == 32 ? "addiu" : "daddiu", "t,r,j",
13211                        op[0], 0, BFD_RELOC_LO16);
13212           break;
13213         }
13214       if (CPU_HAS_SEQ (mips_opts.arch)
13215           && -512 <= imm_expr.X_add_number
13216           && imm_expr.X_add_number < 512)
13217         {
13218           macro_build (NULL, "snei", "t,r,+Q", op[0], op[1],
13219                        (int) imm_expr.X_add_number);
13220           break;
13221         }
13222       if (imm_expr.X_add_number >= 0
13223           && imm_expr.X_add_number < 0x10000)
13224         {
13225           macro_build (&imm_expr, "xori", "t,r,i", op[0], op[1],
13226                        BFD_RELOC_LO16);
13227         }
13228       else if (imm_expr.X_add_number > -0x8000
13229                && imm_expr.X_add_number < 0)
13230         {
13231           imm_expr.X_add_number = -imm_expr.X_add_number;
13232           macro_build (&imm_expr, GPR_SIZE == 32 ? "addiu" : "daddiu",
13233                        "t,r,j", op[0], op[1], BFD_RELOC_LO16);
13234         }
13235       else if (CPU_HAS_SEQ (mips_opts.arch))
13236         {
13237           used_at = 1;
13238           load_register (AT, &imm_expr, GPR_SIZE == 64);
13239           macro_build (NULL, "sne", "d,v,t", op[0], op[1], AT);
13240           break;
13241         }
13242       else
13243         {
13244           load_register (AT, &imm_expr, GPR_SIZE == 64);
13245           macro_build (NULL, "xor", "d,v,t", op[0], op[1], AT);
13246           used_at = 1;
13247         }
13248       macro_build (NULL, "sltu", "d,v,t", op[0], 0, op[0]);
13249       break;
13250
13251     case M_SUB_I:
13252       s = "addi";
13253       s2 = "sub";
13254       goto do_subi;
13255     case M_SUBU_I:
13256       s = "addiu";
13257       s2 = "subu";
13258       goto do_subi;
13259     case M_DSUB_I:
13260       dbl = 1;
13261       s = "daddi";
13262       s2 = "dsub";
13263       if (!mips_opts.micromips)
13264         goto do_subi;
13265       if (imm_expr.X_add_number > -0x200
13266           && imm_expr.X_add_number <= 0x200)
13267         {
13268           macro_build (NULL, s, "t,r,.", op[0], op[1],
13269                        (int) -imm_expr.X_add_number);
13270           break;
13271         }
13272       goto do_subi_i;
13273     case M_DSUBU_I:
13274       dbl = 1;
13275       s = "daddiu";
13276       s2 = "dsubu";
13277     do_subi:
13278       if (imm_expr.X_add_number > -0x8000
13279           && imm_expr.X_add_number <= 0x8000)
13280         {
13281           imm_expr.X_add_number = -imm_expr.X_add_number;
13282           macro_build (&imm_expr, s, "t,r,j", op[0], op[1], BFD_RELOC_LO16);
13283           break;
13284         }
13285     do_subi_i:
13286       used_at = 1;
13287       load_register (AT, &imm_expr, dbl);
13288       macro_build (NULL, s2, "d,v,t", op[0], op[1], AT);
13289       break;
13290
13291     case M_TEQ_I:
13292       s = "teq";
13293       goto trap;
13294     case M_TGE_I:
13295       s = "tge";
13296       goto trap;
13297     case M_TGEU_I:
13298       s = "tgeu";
13299       goto trap;
13300     case M_TLT_I:
13301       s = "tlt";
13302       goto trap;
13303     case M_TLTU_I:
13304       s = "tltu";
13305       goto trap;
13306     case M_TNE_I:
13307       s = "tne";
13308     trap:
13309       used_at = 1;
13310       load_register (AT, &imm_expr, GPR_SIZE == 64);
13311       macro_build (NULL, s, "s,t", op[0], AT);
13312       break;
13313
13314     case M_TRUNCWS:
13315     case M_TRUNCWD:
13316       gas_assert (!mips_opts.micromips);
13317       gas_assert (mips_opts.isa == ISA_MIPS1);
13318       used_at = 1;
13319
13320       /*
13321        * Is the double cfc1 instruction a bug in the mips assembler;
13322        * or is there a reason for it?
13323        */
13324       start_noreorder ();
13325       macro_build (NULL, "cfc1", "t,G", op[2], RA);
13326       macro_build (NULL, "cfc1", "t,G", op[2], RA);
13327       macro_build (NULL, "nop", "");
13328       expr1.X_add_number = 3;
13329       macro_build (&expr1, "ori", "t,r,i", AT, op[2], BFD_RELOC_LO16);
13330       expr1.X_add_number = 2;
13331       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
13332       macro_build (NULL, "ctc1", "t,G", AT, RA);
13333       macro_build (NULL, "nop", "");
13334       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
13335                    op[0], op[1]);
13336       macro_build (NULL, "ctc1", "t,G", op[2], RA);
13337       macro_build (NULL, "nop", "");
13338       end_noreorder ();
13339       break;
13340
13341     case M_ULH_AB:
13342       s = "lb";
13343       s2 = "lbu";
13344       off = 1;
13345       goto uld_st;
13346     case M_ULHU_AB:
13347       s = "lbu";
13348       s2 = "lbu";
13349       off = 1;
13350       goto uld_st;
13351     case M_ULW_AB:
13352       s = "lwl";
13353       s2 = "lwr";
13354       offbits = (mips_opts.micromips ? 12 : 16);
13355       off = 3;
13356       goto uld_st;
13357     case M_ULD_AB:
13358       s = "ldl";
13359       s2 = "ldr";
13360       offbits = (mips_opts.micromips ? 12 : 16);
13361       off = 7;
13362       goto uld_st;
13363     case M_USH_AB:
13364       s = "sb";
13365       s2 = "sb";
13366       off = 1;
13367       ust = 1;
13368       goto uld_st;
13369     case M_USW_AB:
13370       s = "swl";
13371       s2 = "swr";
13372       offbits = (mips_opts.micromips ? 12 : 16);
13373       off = 3;
13374       ust = 1;
13375       goto uld_st;
13376     case M_USD_AB:
13377       s = "sdl";
13378       s2 = "sdr";
13379       offbits = (mips_opts.micromips ? 12 : 16);
13380       off = 7;
13381       ust = 1;
13382
13383     uld_st:
13384       breg = op[2];
13385       large_offset = !small_offset_p (off, align, offbits);
13386       ep = &offset_expr;
13387       expr1.X_add_number = 0;
13388       if (large_offset)
13389         {
13390           used_at = 1;
13391           tempreg = AT;
13392           if (small_offset_p (0, align, 16))
13393             macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", tempreg, breg, -1,
13394                          offset_reloc[0], offset_reloc[1], offset_reloc[2]);
13395           else
13396             {
13397               load_address (tempreg, ep, &used_at);
13398               if (breg != 0)
13399                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
13400                              tempreg, tempreg, breg);
13401             }
13402           offset_reloc[0] = BFD_RELOC_LO16;
13403           offset_reloc[1] = BFD_RELOC_UNUSED;
13404           offset_reloc[2] = BFD_RELOC_UNUSED;
13405           breg = tempreg;
13406           tempreg = op[0];
13407           ep = &expr1;
13408         }
13409       else if (!ust && op[0] == breg)
13410         {
13411           used_at = 1;
13412           tempreg = AT;
13413         }
13414       else
13415         tempreg = op[0];
13416
13417       if (off == 1)
13418         goto ulh_sh;
13419
13420       if (!target_big_endian)
13421         ep->X_add_number += off;
13422       if (offbits == 12)
13423         macro_build (NULL, s, "t,~(b)", tempreg, (int) ep->X_add_number, breg);
13424       else
13425         macro_build (ep, s, "t,o(b)", tempreg, -1,
13426                      offset_reloc[0], offset_reloc[1], offset_reloc[2], breg);
13427
13428       if (!target_big_endian)
13429         ep->X_add_number -= off;
13430       else
13431         ep->X_add_number += off;
13432       if (offbits == 12)
13433         macro_build (NULL, s2, "t,~(b)",
13434                      tempreg, (int) ep->X_add_number, breg);
13435       else
13436         macro_build (ep, s2, "t,o(b)", tempreg, -1,
13437                      offset_reloc[0], offset_reloc[1], offset_reloc[2], breg);
13438
13439       /* If necessary, move the result in tempreg to the final destination.  */
13440       if (!ust && op[0] != tempreg)
13441         {
13442           /* Protect second load's delay slot.  */
13443           load_delay_nop ();
13444           move_register (op[0], tempreg);
13445         }
13446       break;
13447
13448     ulh_sh:
13449       used_at = 1;
13450       if (target_big_endian == ust)
13451         ep->X_add_number += off;
13452       tempreg = ust || large_offset ? op[0] : AT;
13453       macro_build (ep, s, "t,o(b)", tempreg, -1,
13454                    offset_reloc[0], offset_reloc[1], offset_reloc[2], breg);
13455
13456       /* For halfword transfers we need a temporary register to shuffle
13457          bytes.  Unfortunately for M_USH_A we have none available before
13458          the next store as AT holds the base address.  We deal with this
13459          case by clobbering TREG and then restoring it as with ULH.  */
13460       tempreg = ust == large_offset ? op[0] : AT;
13461       if (ust)
13462         macro_build (NULL, "srl", SHFT_FMT, tempreg, op[0], 8);
13463
13464       if (target_big_endian == ust)
13465         ep->X_add_number -= off;
13466       else
13467         ep->X_add_number += off;
13468       macro_build (ep, s2, "t,o(b)", tempreg, -1,
13469                    offset_reloc[0], offset_reloc[1], offset_reloc[2], breg);
13470
13471       /* For M_USH_A re-retrieve the LSB.  */
13472       if (ust && large_offset)
13473         {
13474           if (target_big_endian)
13475             ep->X_add_number += off;
13476           else
13477             ep->X_add_number -= off;
13478           macro_build (&expr1, "lbu", "t,o(b)", AT, -1,
13479                        offset_reloc[0], offset_reloc[1], offset_reloc[2], AT);
13480         }
13481       /* For ULH and M_USH_A OR the LSB in.  */
13482       if (!ust || large_offset)
13483         {
13484           tempreg = !large_offset ? AT : op[0];
13485           macro_build (NULL, "sll", SHFT_FMT, tempreg, tempreg, 8);
13486           macro_build (NULL, "or", "d,v,t", op[0], op[0], AT);
13487         }
13488       break;
13489
13490     default:
13491       /* FIXME: Check if this is one of the itbl macros, since they
13492          are added dynamically.  */
13493       as_bad (_("macro %s not implemented yet"), ip->insn_mo->name);
13494       break;
13495     }
13496   if (!mips_opts.at && used_at)
13497     as_bad (_("macro used $at after \".set noat\""));
13498 }
13499
13500 /* Implement macros in mips16 mode.  */
13501
13502 static void
13503 mips16_macro (struct mips_cl_insn *ip)
13504 {
13505   const struct mips_operand_array *operands;
13506   int mask;
13507   int tmp;
13508   expressionS expr1;
13509   int dbl;
13510   const char *s, *s2, *s3;
13511   unsigned int op[MAX_OPERANDS];
13512   unsigned int i;
13513
13514   mask = ip->insn_mo->mask;
13515
13516   operands = insn_operands (ip);
13517   for (i = 0; i < MAX_OPERANDS; i++)
13518     if (operands->operand[i])
13519       op[i] = insn_extract_operand (ip, operands->operand[i]);
13520     else
13521       op[i] = -1;
13522
13523   expr1.X_op = O_constant;
13524   expr1.X_op_symbol = NULL;
13525   expr1.X_add_symbol = NULL;
13526   expr1.X_add_number = 1;
13527
13528   dbl = 0;
13529
13530   switch (mask)
13531     {
13532     default:
13533       abort ();
13534
13535     case M_DDIV_3:
13536       dbl = 1;
13537       /* Fall through.  */
13538     case M_DIV_3:
13539       s = "mflo";
13540       goto do_div3;
13541     case M_DREM_3:
13542       dbl = 1;
13543       /* Fall through.  */
13544     case M_REM_3:
13545       s = "mfhi";
13546     do_div3:
13547       start_noreorder ();
13548       macro_build (NULL, dbl ? "ddiv" : "div", ".,x,y", op[1], op[2]);
13549       expr1.X_add_number = 2;
13550       macro_build (&expr1, "bnez", "x,p", op[2]);
13551       macro_build (NULL, "break", "6", 7);
13552
13553       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
13554          since that causes an overflow.  We should do that as well,
13555          but I don't see how to do the comparisons without a temporary
13556          register.  */
13557       end_noreorder ();
13558       macro_build (NULL, s, "x", op[0]);
13559       break;
13560
13561     case M_DIVU_3:
13562       s = "divu";
13563       s2 = "mflo";
13564       goto do_divu3;
13565     case M_REMU_3:
13566       s = "divu";
13567       s2 = "mfhi";
13568       goto do_divu3;
13569     case M_DDIVU_3:
13570       s = "ddivu";
13571       s2 = "mflo";
13572       goto do_divu3;
13573     case M_DREMU_3:
13574       s = "ddivu";
13575       s2 = "mfhi";
13576     do_divu3:
13577       start_noreorder ();
13578       macro_build (NULL, s, ".,x,y", op[1], op[2]);
13579       expr1.X_add_number = 2;
13580       macro_build (&expr1, "bnez", "x,p", op[2]);
13581       macro_build (NULL, "break", "6", 7);
13582       end_noreorder ();
13583       macro_build (NULL, s2, "x", op[0]);
13584       break;
13585
13586     case M_DMUL:
13587       dbl = 1;
13588       /* Fall through.  */
13589     case M_MUL:
13590       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", op[1], op[2]);
13591       macro_build (NULL, "mflo", "x", op[0]);
13592       break;
13593
13594     case M_DSUBU_I:
13595       dbl = 1;
13596       goto do_subu;
13597     case M_SUBU_I:
13598     do_subu:
13599       imm_expr.X_add_number = -imm_expr.X_add_number;
13600       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,F", op[0], op[1]);
13601       break;
13602
13603     case M_SUBU_I_2:
13604       imm_expr.X_add_number = -imm_expr.X_add_number;
13605       macro_build (&imm_expr, "addiu", "x,k", op[0]);
13606       break;
13607
13608     case M_DSUBU_I_2:
13609       imm_expr.X_add_number = -imm_expr.X_add_number;
13610       macro_build (&imm_expr, "daddiu", "y,j", op[0]);
13611       break;
13612
13613     case M_BEQ:
13614       s = "cmp";
13615       s2 = "bteqz";
13616       goto do_branch;
13617     case M_BNE:
13618       s = "cmp";
13619       s2 = "btnez";
13620       goto do_branch;
13621     case M_BLT:
13622       s = "slt";
13623       s2 = "btnez";
13624       goto do_branch;
13625     case M_BLTU:
13626       s = "sltu";
13627       s2 = "btnez";
13628       goto do_branch;
13629     case M_BLE:
13630       s = "slt";
13631       s2 = "bteqz";
13632       goto do_reverse_branch;
13633     case M_BLEU:
13634       s = "sltu";
13635       s2 = "bteqz";
13636       goto do_reverse_branch;
13637     case M_BGE:
13638       s = "slt";
13639       s2 = "bteqz";
13640       goto do_branch;
13641     case M_BGEU:
13642       s = "sltu";
13643       s2 = "bteqz";
13644       goto do_branch;
13645     case M_BGT:
13646       s = "slt";
13647       s2 = "btnez";
13648       goto do_reverse_branch;
13649     case M_BGTU:
13650       s = "sltu";
13651       s2 = "btnez";
13652
13653     do_reverse_branch:
13654       tmp = op[1];
13655       op[1] = op[0];
13656       op[0] = tmp;
13657
13658     do_branch:
13659       macro_build (NULL, s, "x,y", op[0], op[1]);
13660       macro_build (&offset_expr, s2, "p");
13661       break;
13662
13663     case M_BEQ_I:
13664       s = "cmpi";
13665       s2 = "bteqz";
13666       s3 = "x,U";
13667       goto do_branch_i;
13668     case M_BNE_I:
13669       s = "cmpi";
13670       s2 = "btnez";
13671       s3 = "x,U";
13672       goto do_branch_i;
13673     case M_BLT_I:
13674       s = "slti";
13675       s2 = "btnez";
13676       s3 = "x,8";
13677       goto do_branch_i;
13678     case M_BLTU_I:
13679       s = "sltiu";
13680       s2 = "btnez";
13681       s3 = "x,8";
13682       goto do_branch_i;
13683     case M_BLE_I:
13684       s = "slti";
13685       s2 = "btnez";
13686       s3 = "x,8";
13687       goto do_addone_branch_i;
13688     case M_BLEU_I:
13689       s = "sltiu";
13690       s2 = "btnez";
13691       s3 = "x,8";
13692       goto do_addone_branch_i;
13693     case M_BGE_I:
13694       s = "slti";
13695       s2 = "bteqz";
13696       s3 = "x,8";
13697       goto do_branch_i;
13698     case M_BGEU_I:
13699       s = "sltiu";
13700       s2 = "bteqz";
13701       s3 = "x,8";
13702       goto do_branch_i;
13703     case M_BGT_I:
13704       s = "slti";
13705       s2 = "bteqz";
13706       s3 = "x,8";
13707       goto do_addone_branch_i;
13708     case M_BGTU_I:
13709       s = "sltiu";
13710       s2 = "bteqz";
13711       s3 = "x,8";
13712
13713     do_addone_branch_i:
13714       ++imm_expr.X_add_number;
13715
13716     do_branch_i:
13717       macro_build (&imm_expr, s, s3, op[0]);
13718       macro_build (&offset_expr, s2, "p");
13719       break;
13720
13721     case M_ABS:
13722       expr1.X_add_number = 0;
13723       macro_build (&expr1, "slti", "x,8", op[1]);
13724       if (op[0] != op[1])
13725         macro_build (NULL, "move", "y,X", op[0], mips16_to_32_reg_map[op[1]]);
13726       expr1.X_add_number = 2;
13727       macro_build (&expr1, "bteqz", "p");
13728       macro_build (NULL, "neg", "x,w", op[0], op[0]);
13729       break;
13730     }
13731 }
13732
13733 /* Look up instruction [START, START + LENGTH) in HASH.  Record any extra
13734    opcode bits in *OPCODE_EXTRA.  */
13735
13736 static struct mips_opcode *
13737 mips_lookup_insn (struct hash_control *hash, const char *start,
13738                   ssize_t length, unsigned int *opcode_extra)
13739 {
13740   char *name, *dot, *p;
13741   unsigned int mask, suffix;
13742   ssize_t opend;
13743   struct mips_opcode *insn;
13744
13745   /* Make a copy of the instruction so that we can fiddle with it.  */
13746   name = xstrndup (start, length);
13747
13748   /* Look up the instruction as-is.  */
13749   insn = (struct mips_opcode *) hash_find (hash, name);
13750   if (insn)
13751     goto end;
13752
13753   dot = strchr (name, '.');
13754   if (dot && dot[1])
13755     {
13756       /* Try to interpret the text after the dot as a VU0 channel suffix.  */
13757       p = mips_parse_vu0_channels (dot + 1, &mask);
13758       if (*p == 0 && mask != 0)
13759         {
13760           *dot = 0;
13761           insn = (struct mips_opcode *) hash_find (hash, name);
13762           *dot = '.';
13763           if (insn && (insn->pinfo2 & INSN2_VU0_CHANNEL_SUFFIX) != 0)
13764             {
13765               *opcode_extra |= mask << mips_vu0_channel_mask.lsb;
13766               goto end;
13767             }
13768         }
13769     }
13770
13771   if (mips_opts.micromips)
13772     {
13773       /* See if there's an instruction size override suffix,
13774          either `16' or `32', at the end of the mnemonic proper,
13775          that defines the operation, i.e. before the first `.'
13776          character if any.  Strip it and retry.  */
13777       opend = dot != NULL ? dot - name : length;
13778       if (opend >= 3 && name[opend - 2] == '1' && name[opend - 1] == '6')
13779         suffix = 2;
13780       else if (name[opend - 2] == '3' && name[opend - 1] == '2')
13781         suffix = 4;
13782       else
13783         suffix = 0;
13784       if (suffix)
13785         {
13786           memcpy (name + opend - 2, name + opend, length - opend + 1);
13787           insn = (struct mips_opcode *) hash_find (hash, name);
13788           if (insn)
13789             {
13790               forced_insn_length = suffix;
13791               goto end;
13792             }
13793         }
13794     }
13795
13796   insn = NULL;
13797  end:
13798   free (name);
13799   return insn;
13800 }
13801
13802 /* Assemble an instruction into its binary format.  If the instruction
13803    is a macro, set imm_expr and offset_expr to the values associated
13804    with "I" and "A" operands respectively.  Otherwise store the value
13805    of the relocatable field (if any) in offset_expr.  In both cases
13806    set offset_reloc to the relocation operators applied to offset_expr.  */
13807
13808 static void
13809 mips_ip (char *str, struct mips_cl_insn *insn)
13810 {
13811   const struct mips_opcode *first, *past;
13812   struct hash_control *hash;
13813   char format;
13814   size_t end;
13815   struct mips_operand_token *tokens;
13816   unsigned int opcode_extra;
13817
13818   if (mips_opts.micromips)
13819     {
13820       hash = micromips_op_hash;
13821       past = &micromips_opcodes[bfd_micromips_num_opcodes];
13822     }
13823   else
13824     {
13825       hash = op_hash;
13826       past = &mips_opcodes[NUMOPCODES];
13827     }
13828   forced_insn_length = 0;
13829   opcode_extra = 0;
13830
13831   /* We first try to match an instruction up to a space or to the end.  */
13832   for (end = 0; str[end] != '\0' && !ISSPACE (str[end]); end++)
13833     continue;
13834
13835   first = mips_lookup_insn (hash, str, end, &opcode_extra);
13836   if (first == NULL)
13837     {
13838       set_insn_error (0, _("unrecognized opcode"));
13839       return;
13840     }
13841
13842   if (strcmp (first->name, "li.s") == 0)
13843     format = 'f';
13844   else if (strcmp (first->name, "li.d") == 0)
13845     format = 'd';
13846   else
13847     format = 0;
13848   tokens = mips_parse_arguments (str + end, format);
13849   if (!tokens)
13850     return;
13851
13852   if (!match_insns (insn, first, past, tokens, opcode_extra, FALSE)
13853       && !match_insns (insn, first, past, tokens, opcode_extra, TRUE))
13854     set_insn_error (0, _("invalid operands"));
13855
13856   obstack_free (&mips_operand_tokens, tokens);
13857 }
13858
13859 /* As for mips_ip, but used when assembling MIPS16 code.
13860    Also set forced_insn_length to the resulting instruction size in
13861    bytes if the user explicitly requested a small or extended instruction.  */
13862
13863 static void
13864 mips16_ip (char *str, struct mips_cl_insn *insn)
13865 {
13866   char *end, *s, c;
13867   struct mips_opcode *first;
13868   struct mips_operand_token *tokens;
13869   unsigned int l;
13870
13871   for (s = str; ISLOWER (*s); ++s)
13872     ;
13873   end = s;
13874   c = *end;
13875
13876   l = 0;
13877   switch (c)
13878     {
13879     case '\0':
13880       break;
13881
13882     case ' ':
13883       s++;
13884       break;
13885
13886     case '.':
13887       s++;
13888       if (*s == 't')
13889         {
13890           l = 2;
13891           s++;
13892         }
13893       else if (*s == 'e')
13894         {
13895           l = 4;
13896           s++;
13897         }
13898       if (*s == '\0')
13899         break;
13900       else if (*s++ == ' ')
13901         break;
13902       /* Fall through.  */
13903     default:
13904       set_insn_error (0, _("unrecognized opcode"));
13905       return;
13906     }
13907   forced_insn_length = l;
13908
13909   *end = 0;
13910   first = (struct mips_opcode *) hash_find (mips16_op_hash, str);
13911   *end = c;
13912
13913   if (!first)
13914     {
13915       set_insn_error (0, _("unrecognized opcode"));
13916       return;
13917     }
13918
13919   tokens = mips_parse_arguments (s, 0);
13920   if (!tokens)
13921     return;
13922
13923   if (!match_mips16_insns (insn, first, tokens))
13924     set_insn_error (0, _("invalid operands"));
13925
13926   obstack_free (&mips_operand_tokens, tokens);
13927 }
13928
13929 /* Marshal immediate value VAL for an extended MIPS16 instruction.
13930    NBITS is the number of significant bits in VAL.  */
13931
13932 static unsigned long
13933 mips16_immed_extend (offsetT val, unsigned int nbits)
13934 {
13935   int extval;
13936   if (nbits == 16)
13937     {
13938       extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
13939       val &= 0x1f;
13940     }
13941   else if (nbits == 15)
13942     {
13943       extval = ((val >> 11) & 0xf) | (val & 0x7f0);
13944       val &= 0xf;
13945     }
13946   else
13947     {
13948       extval = ((val & 0x1f) << 6) | (val & 0x20);
13949       val = 0;
13950     }
13951   return (extval << 16) | val;
13952 }
13953
13954 /* Like decode_mips16_operand, but require the operand to be defined and
13955    require it to be an integer.  */
13956
13957 static const struct mips_int_operand *
13958 mips16_immed_operand (int type, bfd_boolean extended_p)
13959 {
13960   const struct mips_operand *operand;
13961
13962   operand = decode_mips16_operand (type, extended_p);
13963   if (!operand || (operand->type != OP_INT && operand->type != OP_PCREL))
13964     abort ();
13965   return (const struct mips_int_operand *) operand;
13966 }
13967
13968 /* Return true if SVAL fits OPERAND.  RELOC is as for mips16_immed.  */
13969
13970 static bfd_boolean
13971 mips16_immed_in_range_p (const struct mips_int_operand *operand,
13972                          bfd_reloc_code_real_type reloc, offsetT sval)
13973 {
13974   int min_val, max_val;
13975
13976   min_val = mips_int_operand_min (operand);
13977   max_val = mips_int_operand_max (operand);
13978   if (reloc != BFD_RELOC_UNUSED)
13979     {
13980       if (min_val < 0)
13981         sval = SEXT_16BIT (sval);
13982       else
13983         sval &= 0xffff;
13984     }
13985
13986   return (sval >= min_val
13987           && sval <= max_val
13988           && (sval & ((1 << operand->shift) - 1)) == 0);
13989 }
13990
13991 /* Install immediate value VAL into MIPS16 instruction *INSN,
13992    extending it if necessary.  The instruction in *INSN may
13993    already be extended.
13994
13995    RELOC is the relocation that produced VAL, or BFD_RELOC_UNUSED
13996    if none.  In the former case, VAL is a 16-bit number with no
13997    defined signedness.
13998
13999    TYPE is the type of the immediate field.  USER_INSN_LENGTH
14000    is the length that the user requested, or 0 if none.  */
14001
14002 static void
14003 mips16_immed (const char *file, unsigned int line, int type,
14004               bfd_reloc_code_real_type reloc, offsetT val,
14005               unsigned int user_insn_length, unsigned long *insn)
14006 {
14007   const struct mips_int_operand *operand;
14008   unsigned int uval, length;
14009
14010   operand = mips16_immed_operand (type, FALSE);
14011   if (!mips16_immed_in_range_p (operand, reloc, val))
14012     {
14013       /* We need an extended instruction.  */
14014       if (user_insn_length == 2)
14015         as_bad_where (file, line, _("invalid unextended operand value"));
14016       else
14017         *insn |= MIPS16_EXTEND;
14018     }
14019   else if (user_insn_length == 4)
14020     {
14021       /* The operand doesn't force an unextended instruction to be extended.
14022          Warn if the user wanted an extended instruction anyway.  */
14023       *insn |= MIPS16_EXTEND;
14024       as_warn_where (file, line,
14025                      _("extended operand requested but not required"));
14026     }
14027
14028   length = mips16_opcode_length (*insn);
14029   if (length == 4)
14030     {
14031       operand = mips16_immed_operand (type, TRUE);
14032       if (!mips16_immed_in_range_p (operand, reloc, val))
14033         as_bad_where (file, line,
14034                       _("operand value out of range for instruction"));
14035     }
14036   uval = ((unsigned int) val >> operand->shift) - operand->bias;
14037   if (length == 2 || operand->root.lsb != 0)
14038     *insn = mips_insert_operand (&operand->root, *insn, uval);
14039   else
14040     *insn |= mips16_immed_extend (uval, operand->root.size);
14041 }
14042 \f
14043 struct percent_op_match
14044 {
14045   const char *str;
14046   bfd_reloc_code_real_type reloc;
14047 };
14048
14049 static const struct percent_op_match mips_percent_op[] =
14050 {
14051   {"%lo", BFD_RELOC_LO16},
14052   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
14053   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
14054   {"%call16", BFD_RELOC_MIPS_CALL16},
14055   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
14056   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
14057   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
14058   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
14059   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
14060   {"%got", BFD_RELOC_MIPS_GOT16},
14061   {"%gp_rel", BFD_RELOC_GPREL16},
14062   {"%half", BFD_RELOC_16},
14063   {"%highest", BFD_RELOC_MIPS_HIGHEST},
14064   {"%higher", BFD_RELOC_MIPS_HIGHER},
14065   {"%neg", BFD_RELOC_MIPS_SUB},
14066   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
14067   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
14068   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
14069   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
14070   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
14071   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
14072   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
14073   {"%hi", BFD_RELOC_HI16_S},
14074   {"%pcrel_hi", BFD_RELOC_HI16_S_PCREL},
14075   {"%pcrel_lo", BFD_RELOC_LO16_PCREL}
14076 };
14077
14078 static const struct percent_op_match mips16_percent_op[] =
14079 {
14080   {"%lo", BFD_RELOC_MIPS16_LO16},
14081   {"%gprel", BFD_RELOC_MIPS16_GPREL},
14082   {"%got", BFD_RELOC_MIPS16_GOT16},
14083   {"%call16", BFD_RELOC_MIPS16_CALL16},
14084   {"%hi", BFD_RELOC_MIPS16_HI16_S},
14085   {"%tlsgd", BFD_RELOC_MIPS16_TLS_GD},
14086   {"%tlsldm", BFD_RELOC_MIPS16_TLS_LDM},
14087   {"%dtprel_hi", BFD_RELOC_MIPS16_TLS_DTPREL_HI16},
14088   {"%dtprel_lo", BFD_RELOC_MIPS16_TLS_DTPREL_LO16},
14089   {"%tprel_hi", BFD_RELOC_MIPS16_TLS_TPREL_HI16},
14090   {"%tprel_lo", BFD_RELOC_MIPS16_TLS_TPREL_LO16},
14091   {"%gottprel", BFD_RELOC_MIPS16_TLS_GOTTPREL}
14092 };
14093
14094
14095 /* Return true if *STR points to a relocation operator.  When returning true,
14096    move *STR over the operator and store its relocation code in *RELOC.
14097    Leave both *STR and *RELOC alone when returning false.  */
14098
14099 static bfd_boolean
14100 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
14101 {
14102   const struct percent_op_match *percent_op;
14103   size_t limit, i;
14104
14105   if (mips_opts.mips16)
14106     {
14107       percent_op = mips16_percent_op;
14108       limit = ARRAY_SIZE (mips16_percent_op);
14109     }
14110   else
14111     {
14112       percent_op = mips_percent_op;
14113       limit = ARRAY_SIZE (mips_percent_op);
14114     }
14115
14116   for (i = 0; i < limit; i++)
14117     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
14118       {
14119         int len = strlen (percent_op[i].str);
14120
14121         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
14122           continue;
14123
14124         *str += strlen (percent_op[i].str);
14125         *reloc = percent_op[i].reloc;
14126
14127         /* Check whether the output BFD supports this relocation.
14128            If not, issue an error and fall back on something safe.  */
14129         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
14130           {
14131             as_bad (_("relocation %s isn't supported by the current ABI"),
14132                     percent_op[i].str);
14133             *reloc = BFD_RELOC_UNUSED;
14134           }
14135         return TRUE;
14136       }
14137   return FALSE;
14138 }
14139
14140
14141 /* Parse string STR as a 16-bit relocatable operand.  Store the
14142    expression in *EP and the relocations in the array starting
14143    at RELOC.  Return the number of relocation operators used.
14144
14145    On exit, EXPR_END points to the first character after the expression.  */
14146
14147 static size_t
14148 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
14149                        char *str)
14150 {
14151   bfd_reloc_code_real_type reversed_reloc[3];
14152   size_t reloc_index, i;
14153   int crux_depth, str_depth;
14154   char *crux;
14155
14156   /* Search for the start of the main expression, recoding relocations
14157      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
14158      of the main expression and with CRUX_DEPTH containing the number
14159      of open brackets at that point.  */
14160   reloc_index = -1;
14161   str_depth = 0;
14162   do
14163     {
14164       reloc_index++;
14165       crux = str;
14166       crux_depth = str_depth;
14167
14168       /* Skip over whitespace and brackets, keeping count of the number
14169          of brackets.  */
14170       while (*str == ' ' || *str == '\t' || *str == '(')
14171         if (*str++ == '(')
14172           str_depth++;
14173     }
14174   while (*str == '%'
14175          && reloc_index < (HAVE_NEWABI ? 3 : 1)
14176          && parse_relocation (&str, &reversed_reloc[reloc_index]));
14177
14178   my_getExpression (ep, crux);
14179   str = expr_end;
14180
14181   /* Match every open bracket.  */
14182   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
14183     if (*str++ == ')')
14184       crux_depth--;
14185
14186   if (crux_depth > 0)
14187     as_bad (_("unclosed '('"));
14188
14189   expr_end = str;
14190
14191   if (reloc_index != 0)
14192     {
14193       prev_reloc_op_frag = frag_now;
14194       for (i = 0; i < reloc_index; i++)
14195         reloc[i] = reversed_reloc[reloc_index - 1 - i];
14196     }
14197
14198   return reloc_index;
14199 }
14200
14201 static void
14202 my_getExpression (expressionS *ep, char *str)
14203 {
14204   char *save_in;
14205
14206   save_in = input_line_pointer;
14207   input_line_pointer = str;
14208   expression (ep);
14209   expr_end = input_line_pointer;
14210   input_line_pointer = save_in;
14211 }
14212
14213 const char *
14214 md_atof (int type, char *litP, int *sizeP)
14215 {
14216   return ieee_md_atof (type, litP, sizeP, target_big_endian);
14217 }
14218
14219 void
14220 md_number_to_chars (char *buf, valueT val, int n)
14221 {
14222   if (target_big_endian)
14223     number_to_chars_bigendian (buf, val, n);
14224   else
14225     number_to_chars_littleendian (buf, val, n);
14226 }
14227 \f
14228 static int support_64bit_objects(void)
14229 {
14230   const char **list, **l;
14231   int yes;
14232
14233   list = bfd_target_list ();
14234   for (l = list; *l != NULL; l++)
14235     if (strcmp (*l, ELF_TARGET ("elf64-", "big")) == 0
14236         || strcmp (*l, ELF_TARGET ("elf64-", "little")) == 0)
14237       break;
14238   yes = (*l != NULL);
14239   free (list);
14240   return yes;
14241 }
14242
14243 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
14244    NEW_VALUE.  Warn if another value was already specified.  Note:
14245    we have to defer parsing the -march and -mtune arguments in order
14246    to handle 'from-abi' correctly, since the ABI might be specified
14247    in a later argument.  */
14248
14249 static void
14250 mips_set_option_string (const char **string_ptr, const char *new_value)
14251 {
14252   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
14253     as_warn (_("a different %s was already specified, is now %s"),
14254              string_ptr == &mips_arch_string ? "-march" : "-mtune",
14255              new_value);
14256
14257   *string_ptr = new_value;
14258 }
14259
14260 int
14261 md_parse_option (int c, const char *arg)
14262 {
14263   unsigned int i;
14264
14265   for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
14266     if (c == mips_ases[i].option_on || c == mips_ases[i].option_off)
14267       {
14268         file_ase_explicit |= mips_set_ase (&mips_ases[i], &file_mips_opts,
14269                                            c == mips_ases[i].option_on);
14270         return 1;
14271       }
14272
14273   switch (c)
14274     {
14275     case OPTION_CONSTRUCT_FLOATS:
14276       mips_disable_float_construction = 0;
14277       break;
14278
14279     case OPTION_NO_CONSTRUCT_FLOATS:
14280       mips_disable_float_construction = 1;
14281       break;
14282
14283     case OPTION_TRAP:
14284       mips_trap = 1;
14285       break;
14286
14287     case OPTION_BREAK:
14288       mips_trap = 0;
14289       break;
14290
14291     case OPTION_EB:
14292       target_big_endian = 1;
14293       break;
14294
14295     case OPTION_EL:
14296       target_big_endian = 0;
14297       break;
14298
14299     case 'O':
14300       if (arg == NULL)
14301         mips_optimize = 1;
14302       else if (arg[0] == '0')
14303         mips_optimize = 0;
14304       else if (arg[0] == '1')
14305         mips_optimize = 1;
14306       else
14307         mips_optimize = 2;
14308       break;
14309
14310     case 'g':
14311       if (arg == NULL)
14312         mips_debug = 2;
14313       else
14314         mips_debug = atoi (arg);
14315       break;
14316
14317     case OPTION_MIPS1:
14318       file_mips_opts.isa = ISA_MIPS1;
14319       break;
14320
14321     case OPTION_MIPS2:
14322       file_mips_opts.isa = ISA_MIPS2;
14323       break;
14324
14325     case OPTION_MIPS3:
14326       file_mips_opts.isa = ISA_MIPS3;
14327       break;
14328
14329     case OPTION_MIPS4:
14330       file_mips_opts.isa = ISA_MIPS4;
14331       break;
14332
14333     case OPTION_MIPS5:
14334       file_mips_opts.isa = ISA_MIPS5;
14335       break;
14336
14337     case OPTION_MIPS32:
14338       file_mips_opts.isa = ISA_MIPS32;
14339       break;
14340
14341     case OPTION_MIPS32R2:
14342       file_mips_opts.isa = ISA_MIPS32R2;
14343       break;
14344
14345     case OPTION_MIPS32R3:
14346       file_mips_opts.isa = ISA_MIPS32R3;
14347       break;
14348
14349     case OPTION_MIPS32R5:
14350       file_mips_opts.isa = ISA_MIPS32R5;
14351       break;
14352
14353     case OPTION_MIPS32R6:
14354       file_mips_opts.isa = ISA_MIPS32R6;
14355       break;
14356
14357     case OPTION_MIPS64R2:
14358       file_mips_opts.isa = ISA_MIPS64R2;
14359       break;
14360
14361     case OPTION_MIPS64R3:
14362       file_mips_opts.isa = ISA_MIPS64R3;
14363       break;
14364
14365     case OPTION_MIPS64R5:
14366       file_mips_opts.isa = ISA_MIPS64R5;
14367       break;
14368
14369     case OPTION_MIPS64R6:
14370       file_mips_opts.isa = ISA_MIPS64R6;
14371       break;
14372
14373     case OPTION_MIPS64:
14374       file_mips_opts.isa = ISA_MIPS64;
14375       break;
14376
14377     case OPTION_MTUNE:
14378       mips_set_option_string (&mips_tune_string, arg);
14379       break;
14380
14381     case OPTION_MARCH:
14382       mips_set_option_string (&mips_arch_string, arg);
14383       break;
14384
14385     case OPTION_M4650:
14386       mips_set_option_string (&mips_arch_string, "4650");
14387       mips_set_option_string (&mips_tune_string, "4650");
14388       break;
14389
14390     case OPTION_NO_M4650:
14391       break;
14392
14393     case OPTION_M4010:
14394       mips_set_option_string (&mips_arch_string, "4010");
14395       mips_set_option_string (&mips_tune_string, "4010");
14396       break;
14397
14398     case OPTION_NO_M4010:
14399       break;
14400
14401     case OPTION_M4100:
14402       mips_set_option_string (&mips_arch_string, "4100");
14403       mips_set_option_string (&mips_tune_string, "4100");
14404       break;
14405
14406     case OPTION_NO_M4100:
14407       break;
14408
14409     case OPTION_M3900:
14410       mips_set_option_string (&mips_arch_string, "3900");
14411       mips_set_option_string (&mips_tune_string, "3900");
14412       break;
14413
14414     case OPTION_NO_M3900:
14415       break;
14416
14417     case OPTION_MICROMIPS:
14418       if (file_mips_opts.mips16 == 1)
14419         {
14420           as_bad (_("-mmicromips cannot be used with -mips16"));
14421           return 0;
14422         }
14423       file_mips_opts.micromips = 1;
14424       mips_no_prev_insn ();
14425       break;
14426
14427     case OPTION_NO_MICROMIPS:
14428       file_mips_opts.micromips = 0;
14429       mips_no_prev_insn ();
14430       break;
14431
14432     case OPTION_MIPS16:
14433       if (file_mips_opts.micromips == 1)
14434         {
14435           as_bad (_("-mips16 cannot be used with -micromips"));
14436           return 0;
14437         }
14438       file_mips_opts.mips16 = 1;
14439       mips_no_prev_insn ();
14440       break;
14441
14442     case OPTION_NO_MIPS16:
14443       file_mips_opts.mips16 = 0;
14444       mips_no_prev_insn ();
14445       break;
14446
14447     case OPTION_FIX_24K:
14448       mips_fix_24k = 1;
14449       break;
14450
14451     case OPTION_NO_FIX_24K:
14452       mips_fix_24k = 0;
14453       break;
14454
14455     case OPTION_FIX_RM7000:
14456       mips_fix_rm7000 = 1;
14457       break;
14458
14459     case OPTION_NO_FIX_RM7000:
14460       mips_fix_rm7000 = 0;
14461       break;
14462
14463     case OPTION_FIX_LOONGSON2F_JUMP:
14464       mips_fix_loongson2f_jump = TRUE;
14465       break;
14466
14467     case OPTION_NO_FIX_LOONGSON2F_JUMP:
14468       mips_fix_loongson2f_jump = FALSE;
14469       break;
14470
14471     case OPTION_FIX_LOONGSON2F_NOP:
14472       mips_fix_loongson2f_nop = TRUE;
14473       break;
14474
14475     case OPTION_NO_FIX_LOONGSON2F_NOP:
14476       mips_fix_loongson2f_nop = FALSE;
14477       break;
14478
14479     case OPTION_FIX_VR4120:
14480       mips_fix_vr4120 = 1;
14481       break;
14482
14483     case OPTION_NO_FIX_VR4120:
14484       mips_fix_vr4120 = 0;
14485       break;
14486
14487     case OPTION_FIX_VR4130:
14488       mips_fix_vr4130 = 1;
14489       break;
14490
14491     case OPTION_NO_FIX_VR4130:
14492       mips_fix_vr4130 = 0;
14493       break;
14494
14495     case OPTION_FIX_CN63XXP1:
14496       mips_fix_cn63xxp1 = TRUE;
14497       break;
14498
14499     case OPTION_NO_FIX_CN63XXP1:
14500       mips_fix_cn63xxp1 = FALSE;
14501       break;
14502
14503     case OPTION_RELAX_BRANCH:
14504       mips_relax_branch = 1;
14505       break;
14506
14507     case OPTION_NO_RELAX_BRANCH:
14508       mips_relax_branch = 0;
14509       break;
14510
14511     case OPTION_IGNORE_BRANCH_ISA:
14512       mips_ignore_branch_isa = TRUE;
14513       break;
14514
14515     case OPTION_NO_IGNORE_BRANCH_ISA:
14516       mips_ignore_branch_isa = FALSE;
14517       break;
14518
14519     case OPTION_INSN32:
14520       file_mips_opts.insn32 = TRUE;
14521       break;
14522
14523     case OPTION_NO_INSN32:
14524       file_mips_opts.insn32 = FALSE;
14525       break;
14526
14527     case OPTION_MSHARED:
14528       mips_in_shared = TRUE;
14529       break;
14530
14531     case OPTION_MNO_SHARED:
14532       mips_in_shared = FALSE;
14533       break;
14534
14535     case OPTION_MSYM32:
14536       file_mips_opts.sym32 = TRUE;
14537       break;
14538
14539     case OPTION_MNO_SYM32:
14540       file_mips_opts.sym32 = FALSE;
14541       break;
14542
14543       /* When generating ELF code, we permit -KPIC and -call_shared to
14544          select SVR4_PIC, and -non_shared to select no PIC.  This is
14545          intended to be compatible with Irix 5.  */
14546     case OPTION_CALL_SHARED:
14547       mips_pic = SVR4_PIC;
14548       mips_abicalls = TRUE;
14549       break;
14550
14551     case OPTION_CALL_NONPIC:
14552       mips_pic = NO_PIC;
14553       mips_abicalls = TRUE;
14554       break;
14555
14556     case OPTION_NON_SHARED:
14557       mips_pic = NO_PIC;
14558       mips_abicalls = FALSE;
14559       break;
14560
14561       /* The -xgot option tells the assembler to use 32 bit offsets
14562          when accessing the got in SVR4_PIC mode.  It is for Irix
14563          compatibility.  */
14564     case OPTION_XGOT:
14565       mips_big_got = 1;
14566       break;
14567
14568     case 'G':
14569       g_switch_value = atoi (arg);
14570       g_switch_seen = 1;
14571       break;
14572
14573       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
14574          and -mabi=64.  */
14575     case OPTION_32:
14576       mips_abi = O32_ABI;
14577       break;
14578
14579     case OPTION_N32:
14580       mips_abi = N32_ABI;
14581       break;
14582
14583     case OPTION_64:
14584       mips_abi = N64_ABI;
14585       if (!support_64bit_objects())
14586         as_fatal (_("no compiled in support for 64 bit object file format"));
14587       break;
14588
14589     case OPTION_GP32:
14590       file_mips_opts.gp = 32;
14591       break;
14592
14593     case OPTION_GP64:
14594       file_mips_opts.gp = 64;
14595       break;
14596
14597     case OPTION_FP32:
14598       file_mips_opts.fp = 32;
14599       break;
14600
14601     case OPTION_FPXX:
14602       file_mips_opts.fp = 0;
14603       break;
14604
14605     case OPTION_FP64:
14606       file_mips_opts.fp = 64;
14607       break;
14608
14609     case OPTION_ODD_SPREG:
14610       file_mips_opts.oddspreg = 1;
14611       break;
14612
14613     case OPTION_NO_ODD_SPREG:
14614       file_mips_opts.oddspreg = 0;
14615       break;
14616
14617     case OPTION_SINGLE_FLOAT:
14618       file_mips_opts.single_float = 1;
14619       break;
14620
14621     case OPTION_DOUBLE_FLOAT:
14622       file_mips_opts.single_float = 0;
14623       break;
14624
14625     case OPTION_SOFT_FLOAT:
14626       file_mips_opts.soft_float = 1;
14627       break;
14628
14629     case OPTION_HARD_FLOAT:
14630       file_mips_opts.soft_float = 0;
14631       break;
14632
14633     case OPTION_MABI:
14634       if (strcmp (arg, "32") == 0)
14635         mips_abi = O32_ABI;
14636       else if (strcmp (arg, "o64") == 0)
14637         mips_abi = O64_ABI;
14638       else if (strcmp (arg, "n32") == 0)
14639         mips_abi = N32_ABI;
14640       else if (strcmp (arg, "64") == 0)
14641         {
14642           mips_abi = N64_ABI;
14643           if (! support_64bit_objects())
14644             as_fatal (_("no compiled in support for 64 bit object file "
14645                         "format"));
14646         }
14647       else if (strcmp (arg, "eabi") == 0)
14648         mips_abi = EABI_ABI;
14649       else
14650         {
14651           as_fatal (_("invalid abi -mabi=%s"), arg);
14652           return 0;
14653         }
14654       break;
14655
14656     case OPTION_M7000_HILO_FIX:
14657       mips_7000_hilo_fix = TRUE;
14658       break;
14659
14660     case OPTION_MNO_7000_HILO_FIX:
14661       mips_7000_hilo_fix = FALSE;
14662       break;
14663
14664     case OPTION_MDEBUG:
14665       mips_flag_mdebug = TRUE;
14666       break;
14667
14668     case OPTION_NO_MDEBUG:
14669       mips_flag_mdebug = FALSE;
14670       break;
14671
14672     case OPTION_PDR:
14673       mips_flag_pdr = TRUE;
14674       break;
14675
14676     case OPTION_NO_PDR:
14677       mips_flag_pdr = FALSE;
14678       break;
14679
14680     case OPTION_MVXWORKS_PIC:
14681       mips_pic = VXWORKS_PIC;
14682       break;
14683
14684     case OPTION_NAN:
14685       if (strcmp (arg, "2008") == 0)
14686         mips_nan2008 = 1;
14687       else if (strcmp (arg, "legacy") == 0)
14688         mips_nan2008 = 0;
14689       else
14690         {
14691           as_fatal (_("invalid NaN setting -mnan=%s"), arg);
14692           return 0;
14693         }
14694       break;
14695
14696     default:
14697       return 0;
14698     }
14699
14700     mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
14701
14702   return 1;
14703 }
14704 \f
14705 /* Set up globals to tune for the ISA or processor described by INFO.  */
14706
14707 static void
14708 mips_set_tune (const struct mips_cpu_info *info)
14709 {
14710   if (info != 0)
14711     mips_tune = info->cpu;
14712 }
14713
14714
14715 void
14716 mips_after_parse_args (void)
14717 {
14718   const struct mips_cpu_info *arch_info = 0;
14719   const struct mips_cpu_info *tune_info = 0;
14720
14721   /* GP relative stuff not working for PE */
14722   if (strncmp (TARGET_OS, "pe", 2) == 0)
14723     {
14724       if (g_switch_seen && g_switch_value != 0)
14725         as_bad (_("-G not supported in this configuration"));
14726       g_switch_value = 0;
14727     }
14728
14729   if (mips_abi == NO_ABI)
14730     mips_abi = MIPS_DEFAULT_ABI;
14731
14732   /* The following code determines the architecture.
14733      Similar code was added to GCC 3.3 (see override_options() in
14734      config/mips/mips.c).  The GAS and GCC code should be kept in sync
14735      as much as possible.  */
14736
14737   if (mips_arch_string != 0)
14738     arch_info = mips_parse_cpu ("-march", mips_arch_string);
14739
14740   if (file_mips_opts.isa != ISA_UNKNOWN)
14741     {
14742       /* Handle -mipsN.  At this point, file_mips_opts.isa contains the
14743          ISA level specified by -mipsN, while arch_info->isa contains
14744          the -march selection (if any).  */
14745       if (arch_info != 0)
14746         {
14747           /* -march takes precedence over -mipsN, since it is more descriptive.
14748              There's no harm in specifying both as long as the ISA levels
14749              are the same.  */
14750           if (file_mips_opts.isa != arch_info->isa)
14751             as_bad (_("-%s conflicts with the other architecture options,"
14752                       " which imply -%s"),
14753                     mips_cpu_info_from_isa (file_mips_opts.isa)->name,
14754                     mips_cpu_info_from_isa (arch_info->isa)->name);
14755         }
14756       else
14757         arch_info = mips_cpu_info_from_isa (file_mips_opts.isa);
14758     }
14759
14760   if (arch_info == 0)
14761     {
14762       arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
14763       gas_assert (arch_info);
14764     }
14765
14766   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
14767     as_bad (_("-march=%s is not compatible with the selected ABI"),
14768             arch_info->name);
14769
14770   file_mips_opts.arch = arch_info->cpu;
14771   file_mips_opts.isa = arch_info->isa;
14772
14773   /* Set up initial mips_opts state.  */
14774   mips_opts = file_mips_opts;
14775
14776   /* The register size inference code is now placed in
14777      file_mips_check_options.  */
14778
14779   /* Optimize for file_mips_opts.arch, unless -mtune selects a different
14780      processor.  */
14781   if (mips_tune_string != 0)
14782     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
14783
14784   if (tune_info == 0)
14785     mips_set_tune (arch_info);
14786   else
14787     mips_set_tune (tune_info);
14788
14789   if (mips_flag_mdebug < 0)
14790     mips_flag_mdebug = 0;
14791 }
14792 \f
14793 void
14794 mips_init_after_args (void)
14795 {
14796   /* initialize opcodes */
14797   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
14798   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
14799 }
14800
14801 long
14802 md_pcrel_from (fixS *fixP)
14803 {
14804   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
14805   switch (fixP->fx_r_type)
14806     {
14807     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
14808     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
14809       /* Return the address of the delay slot.  */
14810       return addr + 2;
14811
14812     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
14813     case BFD_RELOC_MICROMIPS_JMP:
14814     case BFD_RELOC_MIPS16_16_PCREL_S1:
14815     case BFD_RELOC_16_PCREL_S2:
14816     case BFD_RELOC_MIPS_21_PCREL_S2:
14817     case BFD_RELOC_MIPS_26_PCREL_S2:
14818     case BFD_RELOC_MIPS_JMP:
14819       /* Return the address of the delay slot.  */
14820       return addr + 4;
14821
14822     case BFD_RELOC_MIPS_18_PCREL_S3:
14823       /* Return the aligned address of the doubleword containing
14824          the instruction.  */
14825       return addr & ~7;
14826
14827     default:
14828       return addr;
14829     }
14830 }
14831
14832 /* This is called before the symbol table is processed.  In order to
14833    work with gcc when using mips-tfile, we must keep all local labels.
14834    However, in other cases, we want to discard them.  If we were
14835    called with -g, but we didn't see any debugging information, it may
14836    mean that gcc is smuggling debugging information through to
14837    mips-tfile, in which case we must generate all local labels.  */
14838
14839 void
14840 mips_frob_file_before_adjust (void)
14841 {
14842 #ifndef NO_ECOFF_DEBUGGING
14843   if (ECOFF_DEBUGGING
14844       && mips_debug != 0
14845       && ! ecoff_debugging_seen)
14846     flag_keep_locals = 1;
14847 #endif
14848 }
14849
14850 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
14851    the corresponding LO16 reloc.  This is called before md_apply_fix and
14852    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
14853    relocation operators.
14854
14855    For our purposes, a %lo() expression matches a %got() or %hi()
14856    expression if:
14857
14858       (a) it refers to the same symbol; and
14859       (b) the offset applied in the %lo() expression is no lower than
14860           the offset applied in the %got() or %hi().
14861
14862    (b) allows us to cope with code like:
14863
14864         lui     $4,%hi(foo)
14865         lh      $4,%lo(foo+2)($4)
14866
14867    ...which is legal on RELA targets, and has a well-defined behaviour
14868    if the user knows that adding 2 to "foo" will not induce a carry to
14869    the high 16 bits.
14870
14871    When several %lo()s match a particular %got() or %hi(), we use the
14872    following rules to distinguish them:
14873
14874      (1) %lo()s with smaller offsets are a better match than %lo()s with
14875          higher offsets.
14876
14877      (2) %lo()s with no matching %got() or %hi() are better than those
14878          that already have a matching %got() or %hi().
14879
14880      (3) later %lo()s are better than earlier %lo()s.
14881
14882    These rules are applied in order.
14883
14884    (1) means, among other things, that %lo()s with identical offsets are
14885    chosen if they exist.
14886
14887    (2) means that we won't associate several high-part relocations with
14888    the same low-part relocation unless there's no alternative.  Having
14889    several high parts for the same low part is a GNU extension; this rule
14890    allows careful users to avoid it.
14891
14892    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
14893    with the last high-part relocation being at the front of the list.
14894    It therefore makes sense to choose the last matching low-part
14895    relocation, all other things being equal.  It's also easier
14896    to code that way.  */
14897
14898 void
14899 mips_frob_file (void)
14900 {
14901   struct mips_hi_fixup *l;
14902   bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
14903
14904   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
14905     {
14906       segment_info_type *seginfo;
14907       bfd_boolean matched_lo_p;
14908       fixS **hi_pos, **lo_pos, **pos;
14909
14910       gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
14911
14912       /* If a GOT16 relocation turns out to be against a global symbol,
14913          there isn't supposed to be a matching LO.  Ignore %gots against
14914          constants; we'll report an error for those later.  */
14915       if (got16_reloc_p (l->fixp->fx_r_type)
14916           && !(l->fixp->fx_addsy
14917                && pic_need_relax (l->fixp->fx_addsy)))
14918         continue;
14919
14920       /* Check quickly whether the next fixup happens to be a matching %lo.  */
14921       if (fixup_has_matching_lo_p (l->fixp))
14922         continue;
14923
14924       seginfo = seg_info (l->seg);
14925
14926       /* Set HI_POS to the position of this relocation in the chain.
14927          Set LO_POS to the position of the chosen low-part relocation.
14928          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
14929          relocation that matches an immediately-preceding high-part
14930          relocation.  */
14931       hi_pos = NULL;
14932       lo_pos = NULL;
14933       matched_lo_p = FALSE;
14934       looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
14935
14936       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
14937         {
14938           if (*pos == l->fixp)
14939             hi_pos = pos;
14940
14941           if ((*pos)->fx_r_type == looking_for_rtype
14942               && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
14943               && (*pos)->fx_offset >= l->fixp->fx_offset
14944               && (lo_pos == NULL
14945                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
14946                   || (!matched_lo_p
14947                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
14948             lo_pos = pos;
14949
14950           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
14951                           && fixup_has_matching_lo_p (*pos));
14952         }
14953
14954       /* If we found a match, remove the high-part relocation from its
14955          current position and insert it before the low-part relocation.
14956          Make the offsets match so that fixup_has_matching_lo_p()
14957          will return true.
14958
14959          We don't warn about unmatched high-part relocations since some
14960          versions of gcc have been known to emit dead "lui ...%hi(...)"
14961          instructions.  */
14962       if (lo_pos != NULL)
14963         {
14964           l->fixp->fx_offset = (*lo_pos)->fx_offset;
14965           if (l->fixp->fx_next != *lo_pos)
14966             {
14967               *hi_pos = l->fixp->fx_next;
14968               l->fixp->fx_next = *lo_pos;
14969               *lo_pos = l->fixp;
14970             }
14971         }
14972     }
14973 }
14974
14975 int
14976 mips_force_relocation (fixS *fixp)
14977 {
14978   if (generic_force_reloc (fixp))
14979     return 1;
14980
14981   /* We want to keep BFD_RELOC_MICROMIPS_*_PCREL_S1 relocation,
14982      so that the linker relaxation can update targets.  */
14983   if (fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
14984       || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
14985       || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1)
14986     return 1;
14987
14988   /* We want to keep BFD_RELOC_16_PCREL_S2 BFD_RELOC_MIPS_21_PCREL_S2
14989      and BFD_RELOC_MIPS_26_PCREL_S2 relocations against MIPS16 and
14990      microMIPS symbols so that we can do cross-mode branch diagnostics
14991      and BAL to JALX conversion by the linker.  */
14992   if ((fixp->fx_r_type == BFD_RELOC_16_PCREL_S2
14993        || fixp->fx_r_type == BFD_RELOC_MIPS_21_PCREL_S2
14994        || fixp->fx_r_type == BFD_RELOC_MIPS_26_PCREL_S2)
14995       && fixp->fx_addsy
14996       && ELF_ST_IS_COMPRESSED (S_GET_OTHER (fixp->fx_addsy)))
14997     return 1;
14998
14999   /* We want all PC-relative relocations to be kept for R6 relaxation.  */
15000   if (ISA_IS_R6 (file_mips_opts.isa)
15001       && (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2
15002           || fixp->fx_r_type == BFD_RELOC_MIPS_21_PCREL_S2
15003           || fixp->fx_r_type == BFD_RELOC_MIPS_26_PCREL_S2
15004           || fixp->fx_r_type == BFD_RELOC_MIPS_18_PCREL_S3
15005           || fixp->fx_r_type == BFD_RELOC_MIPS_19_PCREL_S2
15006           || fixp->fx_r_type == BFD_RELOC_HI16_S_PCREL
15007           || fixp->fx_r_type == BFD_RELOC_LO16_PCREL))
15008     return 1;
15009
15010   return 0;
15011 }
15012
15013 /* Implement TC_FORCE_RELOCATION_ABS.  */
15014
15015 bfd_boolean
15016 mips_force_relocation_abs (fixS *fixp)
15017 {
15018   if (generic_force_reloc (fixp))
15019     return TRUE;
15020
15021   /* These relocations do not have enough bits in the in-place addend
15022      to hold an arbitrary absolute section's offset.  */
15023   if (HAVE_IN_PLACE_ADDENDS && limited_pcrel_reloc_p (fixp->fx_r_type))
15024     return TRUE;
15025
15026   return FALSE;
15027 }
15028
15029 /* Read the instruction associated with RELOC from BUF.  */
15030
15031 static unsigned int
15032 read_reloc_insn (char *buf, bfd_reloc_code_real_type reloc)
15033 {
15034   if (mips16_reloc_p (reloc) || micromips_reloc_p (reloc))
15035     return read_compressed_insn (buf, 4);
15036   else
15037     return read_insn (buf);
15038 }
15039
15040 /* Write instruction INSN to BUF, given that it has been relocated
15041    by RELOC.  */
15042
15043 static void
15044 write_reloc_insn (char *buf, bfd_reloc_code_real_type reloc,
15045                   unsigned long insn)
15046 {
15047   if (mips16_reloc_p (reloc) || micromips_reloc_p (reloc))
15048     write_compressed_insn (buf, insn, 4);
15049   else
15050     write_insn (buf, insn);
15051 }
15052
15053 /* Return TRUE if the instruction pointed to by FIXP is an invalid jump
15054    to a symbol in another ISA mode, which cannot be converted to JALX.  */
15055
15056 static bfd_boolean
15057 fix_bad_cross_mode_jump_p (fixS *fixP)
15058 {
15059   unsigned long opcode;
15060   int other;
15061   char *buf;
15062
15063   if (!fixP->fx_addsy || S_FORCE_RELOC (fixP->fx_addsy, TRUE))
15064     return FALSE;
15065
15066   other = S_GET_OTHER (fixP->fx_addsy);
15067   buf = fixP->fx_frag->fr_literal + fixP->fx_where;
15068   opcode = read_reloc_insn (buf, fixP->fx_r_type) >> 26;
15069   switch (fixP->fx_r_type)
15070     {
15071     case BFD_RELOC_MIPS_JMP:
15072       return opcode != 0x1d && opcode != 0x03 && ELF_ST_IS_COMPRESSED (other);
15073     case BFD_RELOC_MICROMIPS_JMP:
15074       return opcode != 0x3c && opcode != 0x3d && !ELF_ST_IS_MICROMIPS (other);
15075     default:
15076       return FALSE;
15077     }
15078 }
15079
15080 /* Return TRUE if the instruction pointed to by FIXP is an invalid JALX
15081    jump to a symbol in the same ISA mode.  */
15082
15083 static bfd_boolean
15084 fix_bad_same_mode_jalx_p (fixS *fixP)
15085 {
15086   unsigned long opcode;
15087   int other;
15088   char *buf;
15089
15090   if (!fixP->fx_addsy || S_FORCE_RELOC (fixP->fx_addsy, TRUE))
15091     return FALSE;
15092
15093   other = S_GET_OTHER (fixP->fx_addsy);
15094   buf = fixP->fx_frag->fr_literal + fixP->fx_where;
15095   opcode = read_reloc_insn (buf, fixP->fx_r_type) >> 26;
15096   switch (fixP->fx_r_type)
15097     {
15098     case BFD_RELOC_MIPS_JMP:
15099       return opcode == 0x1d && !ELF_ST_IS_COMPRESSED (other);
15100     case BFD_RELOC_MIPS16_JMP:
15101       return opcode == 0x07 && ELF_ST_IS_COMPRESSED (other);
15102     case BFD_RELOC_MICROMIPS_JMP:
15103       return opcode == 0x3c && ELF_ST_IS_COMPRESSED (other);
15104     default:
15105       return FALSE;
15106     }
15107 }
15108
15109 /* Return TRUE if the instruction pointed to by FIXP is an invalid jump
15110    to a symbol whose value plus addend is not aligned according to the
15111    ultimate (after linker relaxation) jump instruction's immediate field
15112    requirement, either to (1 << SHIFT), or, for jumps from microMIPS to
15113    regular MIPS code, to (1 << 2).  */
15114
15115 static bfd_boolean
15116 fix_bad_misaligned_jump_p (fixS *fixP, int shift)
15117 {
15118   bfd_boolean micro_to_mips_p;
15119   valueT val;
15120   int other;
15121
15122   if (!fixP->fx_addsy || S_FORCE_RELOC (fixP->fx_addsy, TRUE))
15123     return FALSE;
15124
15125   other = S_GET_OTHER (fixP->fx_addsy);
15126   val = S_GET_VALUE (fixP->fx_addsy) | ELF_ST_IS_COMPRESSED (other);
15127   val += fixP->fx_offset;
15128   micro_to_mips_p = (fixP->fx_r_type == BFD_RELOC_MICROMIPS_JMP
15129                      && !ELF_ST_IS_MICROMIPS (other));
15130   return ((val & ((1 << (micro_to_mips_p ? 2 : shift)) - 1))
15131           != ELF_ST_IS_COMPRESSED (other));
15132 }
15133
15134 /* Return TRUE if the instruction pointed to by FIXP is an invalid branch
15135    to a symbol whose annotation indicates another ISA mode.  For absolute
15136    symbols check the ISA bit instead.
15137
15138    We accept BFD_RELOC_16_PCREL_S2 relocations against MIPS16 and microMIPS
15139    symbols or BFD_RELOC_MICROMIPS_16_PCREL_S1 relocations against regular
15140    MIPS symbols and associated with BAL instructions as these instructions
15141    may be be converted to JALX by the linker.  */
15142
15143 static bfd_boolean
15144 fix_bad_cross_mode_branch_p (fixS *fixP)
15145 {
15146   bfd_boolean absolute_p;
15147   unsigned long opcode;
15148   asection *symsec;
15149   valueT val;
15150   int other;
15151   char *buf;
15152
15153   if (mips_ignore_branch_isa)
15154     return FALSE;
15155
15156   if (!fixP->fx_addsy || S_FORCE_RELOC (fixP->fx_addsy, TRUE))
15157     return FALSE;
15158
15159   symsec = S_GET_SEGMENT (fixP->fx_addsy);
15160   absolute_p = bfd_is_abs_section (symsec);
15161
15162   val = S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset;
15163   other = S_GET_OTHER (fixP->fx_addsy);
15164
15165   buf = fixP->fx_frag->fr_literal + fixP->fx_where;
15166   opcode = read_reloc_insn (buf, fixP->fx_r_type) >> 16;
15167   switch (fixP->fx_r_type)
15168     {
15169     case BFD_RELOC_16_PCREL_S2:
15170       return ((absolute_p ? val & 1 : ELF_ST_IS_COMPRESSED (other))
15171               && opcode != 0x0411);
15172     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15173       return ((absolute_p ? !(val & 1) : !ELF_ST_IS_MICROMIPS (other))
15174               && opcode != 0x4060);
15175     case BFD_RELOC_MIPS_21_PCREL_S2:
15176     case BFD_RELOC_MIPS_26_PCREL_S2:
15177       return absolute_p ? val & 1 : ELF_ST_IS_COMPRESSED (other);
15178     case BFD_RELOC_MIPS16_16_PCREL_S1:
15179       return absolute_p ? !(val & 1) : !ELF_ST_IS_MIPS16 (other);
15180     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15181     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15182       return absolute_p ? !(val & 1) : !ELF_ST_IS_MICROMIPS (other);
15183     default:
15184       abort ();
15185     }
15186 }
15187
15188 /* Return TRUE if the symbol plus addend associated with a regular MIPS
15189    branch instruction pointed to by FIXP is not aligned according to the
15190    branch instruction's immediate field requirement.  We need the addend
15191    to preserve the ISA bit and also the sum must not have bit 2 set.  We
15192    must explicitly OR in the ISA bit from symbol annotation as the bit
15193    won't be set in the symbol's value then.  */
15194
15195 static bfd_boolean
15196 fix_bad_misaligned_branch_p (fixS *fixP)
15197 {
15198   bfd_boolean absolute_p;
15199   asection *symsec;
15200   valueT isa_bit;
15201   valueT val;
15202   valueT off;
15203   int other;
15204
15205   if (!fixP->fx_addsy || S_FORCE_RELOC (fixP->fx_addsy, TRUE))
15206     return FALSE;
15207
15208   symsec = S_GET_SEGMENT (fixP->fx_addsy);
15209   absolute_p = bfd_is_abs_section (symsec);
15210
15211   val = S_GET_VALUE (fixP->fx_addsy);
15212   other = S_GET_OTHER (fixP->fx_addsy);
15213   off = fixP->fx_offset;
15214
15215   isa_bit = absolute_p ? (val + off) & 1 : ELF_ST_IS_COMPRESSED (other);
15216   val |= ELF_ST_IS_COMPRESSED (other);
15217   val += off;
15218   return (val & 0x3) != isa_bit;
15219 }
15220
15221 /* Make the necessary checks on a regular MIPS branch pointed to by FIXP
15222    and its calculated value VAL.  */
15223
15224 static void
15225 fix_validate_branch (fixS *fixP, valueT val)
15226 {
15227   if (fixP->fx_done && (val & 0x3) != 0)
15228     as_bad_where (fixP->fx_file, fixP->fx_line,
15229                   _("branch to misaligned address (0x%lx)"),
15230                   (long) (val + md_pcrel_from (fixP)));
15231   else if (fix_bad_cross_mode_branch_p (fixP))
15232     as_bad_where (fixP->fx_file, fixP->fx_line,
15233                   _("branch to a symbol in another ISA mode"));
15234   else if (fix_bad_misaligned_branch_p (fixP))
15235     as_bad_where (fixP->fx_file, fixP->fx_line,
15236                   _("branch to misaligned address (0x%lx)"),
15237                   (long) (S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset));
15238   else if (HAVE_IN_PLACE_ADDENDS && (fixP->fx_offset & 0x3) != 0)
15239     as_bad_where (fixP->fx_file, fixP->fx_line,
15240                   _("cannot encode misaligned addend "
15241                     "in the relocatable field (0x%lx)"),
15242                   (long) fixP->fx_offset);
15243 }
15244
15245 /* Apply a fixup to the object file.  */
15246
15247 void
15248 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
15249 {
15250   char *buf;
15251   unsigned long insn;
15252   reloc_howto_type *howto;
15253
15254   if (fixP->fx_pcrel)
15255     switch (fixP->fx_r_type)
15256       {
15257       case BFD_RELOC_16_PCREL_S2:
15258       case BFD_RELOC_MIPS16_16_PCREL_S1:
15259       case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15260       case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15261       case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15262       case BFD_RELOC_32_PCREL:
15263       case BFD_RELOC_MIPS_21_PCREL_S2:
15264       case BFD_RELOC_MIPS_26_PCREL_S2:
15265       case BFD_RELOC_MIPS_18_PCREL_S3:
15266       case BFD_RELOC_MIPS_19_PCREL_S2:
15267       case BFD_RELOC_HI16_S_PCREL:
15268       case BFD_RELOC_LO16_PCREL:
15269         break;
15270
15271       case BFD_RELOC_32:
15272         fixP->fx_r_type = BFD_RELOC_32_PCREL;
15273         break;
15274
15275       default:
15276         as_bad_where (fixP->fx_file, fixP->fx_line,
15277                       _("PC-relative reference to a different section"));
15278         break;
15279       }
15280
15281   /* Handle BFD_RELOC_8, since it's easy.  Punt on other bfd relocations
15282      that have no MIPS ELF equivalent.  */
15283   if (fixP->fx_r_type != BFD_RELOC_8)
15284     {
15285       howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
15286       if (!howto)
15287         return;
15288     }
15289
15290   gas_assert (fixP->fx_size == 2
15291               || fixP->fx_size == 4
15292               || fixP->fx_r_type == BFD_RELOC_8
15293               || fixP->fx_r_type == BFD_RELOC_16
15294               || fixP->fx_r_type == BFD_RELOC_64
15295               || fixP->fx_r_type == BFD_RELOC_CTOR
15296               || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
15297               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_SUB
15298               || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
15299               || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
15300               || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64
15301               || fixP->fx_r_type == BFD_RELOC_NONE);
15302
15303   buf = fixP->fx_frag->fr_literal + fixP->fx_where;
15304
15305   /* Don't treat parts of a composite relocation as done.  There are two
15306      reasons for this:
15307
15308      (1) The second and third parts will be against 0 (RSS_UNDEF) but
15309          should nevertheless be emitted if the first part is.
15310
15311      (2) In normal usage, composite relocations are never assembly-time
15312          constants.  The easiest way of dealing with the pathological
15313          exceptions is to generate a relocation against STN_UNDEF and
15314          leave everything up to the linker.  */
15315   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
15316     fixP->fx_done = 1;
15317
15318   switch (fixP->fx_r_type)
15319     {
15320     case BFD_RELOC_MIPS_TLS_GD:
15321     case BFD_RELOC_MIPS_TLS_LDM:
15322     case BFD_RELOC_MIPS_TLS_DTPREL32:
15323     case BFD_RELOC_MIPS_TLS_DTPREL64:
15324     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
15325     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
15326     case BFD_RELOC_MIPS_TLS_GOTTPREL:
15327     case BFD_RELOC_MIPS_TLS_TPREL32:
15328     case BFD_RELOC_MIPS_TLS_TPREL64:
15329     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
15330     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
15331     case BFD_RELOC_MICROMIPS_TLS_GD:
15332     case BFD_RELOC_MICROMIPS_TLS_LDM:
15333     case BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16:
15334     case BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16:
15335     case BFD_RELOC_MICROMIPS_TLS_GOTTPREL:
15336     case BFD_RELOC_MICROMIPS_TLS_TPREL_HI16:
15337     case BFD_RELOC_MICROMIPS_TLS_TPREL_LO16:
15338     case BFD_RELOC_MIPS16_TLS_GD:
15339     case BFD_RELOC_MIPS16_TLS_LDM:
15340     case BFD_RELOC_MIPS16_TLS_DTPREL_HI16:
15341     case BFD_RELOC_MIPS16_TLS_DTPREL_LO16:
15342     case BFD_RELOC_MIPS16_TLS_GOTTPREL:
15343     case BFD_RELOC_MIPS16_TLS_TPREL_HI16:
15344     case BFD_RELOC_MIPS16_TLS_TPREL_LO16:
15345       if (fixP->fx_addsy)
15346         S_SET_THREAD_LOCAL (fixP->fx_addsy);
15347       else
15348         as_bad_where (fixP->fx_file, fixP->fx_line,
15349                       _("TLS relocation against a constant"));
15350       break;
15351
15352     case BFD_RELOC_MIPS_JMP:
15353     case BFD_RELOC_MIPS16_JMP:
15354     case BFD_RELOC_MICROMIPS_JMP:
15355       {
15356         int shift;
15357
15358         gas_assert (!fixP->fx_done);
15359
15360         /* Shift is 2, unusually, for microMIPS JALX.  */
15361         if (fixP->fx_r_type == BFD_RELOC_MICROMIPS_JMP
15362             && (read_compressed_insn (buf, 4) >> 26) != 0x3c)
15363           shift = 1;
15364         else
15365           shift = 2;
15366
15367         if (fix_bad_cross_mode_jump_p (fixP))
15368           as_bad_where (fixP->fx_file, fixP->fx_line,
15369                         _("jump to a symbol in another ISA mode"));
15370         else if (fix_bad_same_mode_jalx_p (fixP))
15371           as_bad_where (fixP->fx_file, fixP->fx_line,
15372                         _("JALX to a symbol in the same ISA mode"));
15373         else if (fix_bad_misaligned_jump_p (fixP, shift))
15374           as_bad_where (fixP->fx_file, fixP->fx_line,
15375                         _("jump to misaligned address (0x%lx)"),
15376                         (long) (S_GET_VALUE (fixP->fx_addsy)
15377                                 + fixP->fx_offset));
15378         else if (HAVE_IN_PLACE_ADDENDS
15379                  && (fixP->fx_offset & ((1 << shift) - 1)) != 0)
15380           as_bad_where (fixP->fx_file, fixP->fx_line,
15381                         _("cannot encode misaligned addend "
15382                           "in the relocatable field (0x%lx)"),
15383                         (long) fixP->fx_offset);
15384       }
15385       /* Fall through.  */
15386
15387     case BFD_RELOC_MIPS_SHIFT5:
15388     case BFD_RELOC_MIPS_SHIFT6:
15389     case BFD_RELOC_MIPS_GOT_DISP:
15390     case BFD_RELOC_MIPS_GOT_PAGE:
15391     case BFD_RELOC_MIPS_GOT_OFST:
15392     case BFD_RELOC_MIPS_SUB:
15393     case BFD_RELOC_MIPS_INSERT_A:
15394     case BFD_RELOC_MIPS_INSERT_B:
15395     case BFD_RELOC_MIPS_DELETE:
15396     case BFD_RELOC_MIPS_HIGHEST:
15397     case BFD_RELOC_MIPS_HIGHER:
15398     case BFD_RELOC_MIPS_SCN_DISP:
15399     case BFD_RELOC_MIPS_REL16:
15400     case BFD_RELOC_MIPS_RELGOT:
15401     case BFD_RELOC_MIPS_JALR:
15402     case BFD_RELOC_HI16:
15403     case BFD_RELOC_HI16_S:
15404     case BFD_RELOC_LO16:
15405     case BFD_RELOC_GPREL16:
15406     case BFD_RELOC_MIPS_LITERAL:
15407     case BFD_RELOC_MIPS_CALL16:
15408     case BFD_RELOC_MIPS_GOT16:
15409     case BFD_RELOC_GPREL32:
15410     case BFD_RELOC_MIPS_GOT_HI16:
15411     case BFD_RELOC_MIPS_GOT_LO16:
15412     case BFD_RELOC_MIPS_CALL_HI16:
15413     case BFD_RELOC_MIPS_CALL_LO16:
15414     case BFD_RELOC_HI16_S_PCREL:
15415     case BFD_RELOC_LO16_PCREL:
15416     case BFD_RELOC_MIPS16_GPREL:
15417     case BFD_RELOC_MIPS16_GOT16:
15418     case BFD_RELOC_MIPS16_CALL16:
15419     case BFD_RELOC_MIPS16_HI16:
15420     case BFD_RELOC_MIPS16_HI16_S:
15421     case BFD_RELOC_MIPS16_LO16:
15422     case BFD_RELOC_MICROMIPS_GOT_DISP:
15423     case BFD_RELOC_MICROMIPS_GOT_PAGE:
15424     case BFD_RELOC_MICROMIPS_GOT_OFST:
15425     case BFD_RELOC_MICROMIPS_SUB:
15426     case BFD_RELOC_MICROMIPS_HIGHEST:
15427     case BFD_RELOC_MICROMIPS_HIGHER:
15428     case BFD_RELOC_MICROMIPS_SCN_DISP:
15429     case BFD_RELOC_MICROMIPS_JALR:
15430     case BFD_RELOC_MICROMIPS_HI16:
15431     case BFD_RELOC_MICROMIPS_HI16_S:
15432     case BFD_RELOC_MICROMIPS_LO16:
15433     case BFD_RELOC_MICROMIPS_GPREL16:
15434     case BFD_RELOC_MICROMIPS_LITERAL:
15435     case BFD_RELOC_MICROMIPS_CALL16:
15436     case BFD_RELOC_MICROMIPS_GOT16:
15437     case BFD_RELOC_MICROMIPS_GOT_HI16:
15438     case BFD_RELOC_MICROMIPS_GOT_LO16:
15439     case BFD_RELOC_MICROMIPS_CALL_HI16:
15440     case BFD_RELOC_MICROMIPS_CALL_LO16:
15441     case BFD_RELOC_MIPS_EH:
15442       if (fixP->fx_done)
15443         {
15444           offsetT value;
15445
15446           if (calculate_reloc (fixP->fx_r_type, *valP, &value))
15447             {
15448               insn = read_reloc_insn (buf, fixP->fx_r_type);
15449               if (mips16_reloc_p (fixP->fx_r_type))
15450                 insn |= mips16_immed_extend (value, 16);
15451               else
15452                 insn |= (value & 0xffff);
15453               write_reloc_insn (buf, fixP->fx_r_type, insn);
15454             }
15455           else
15456             as_bad_where (fixP->fx_file, fixP->fx_line,
15457                           _("unsupported constant in relocation"));
15458         }
15459       break;
15460
15461     case BFD_RELOC_64:
15462       /* This is handled like BFD_RELOC_32, but we output a sign
15463          extended value if we are only 32 bits.  */
15464       if (fixP->fx_done)
15465         {
15466           if (8 <= sizeof (valueT))
15467             md_number_to_chars (buf, *valP, 8);
15468           else
15469             {
15470               valueT hiv;
15471
15472               if ((*valP & 0x80000000) != 0)
15473                 hiv = 0xffffffff;
15474               else
15475                 hiv = 0;
15476               md_number_to_chars (buf + (target_big_endian ? 4 : 0), *valP, 4);
15477               md_number_to_chars (buf + (target_big_endian ? 0 : 4), hiv, 4);
15478             }
15479         }
15480       break;
15481
15482     case BFD_RELOC_RVA:
15483     case BFD_RELOC_32:
15484     case BFD_RELOC_32_PCREL:
15485     case BFD_RELOC_16:
15486     case BFD_RELOC_8:
15487       /* If we are deleting this reloc entry, we must fill in the
15488          value now.  This can happen if we have a .word which is not
15489          resolved when it appears but is later defined.  */
15490       if (fixP->fx_done)
15491         md_number_to_chars (buf, *valP, fixP->fx_size);
15492       break;
15493
15494     case BFD_RELOC_MIPS_21_PCREL_S2:
15495       fix_validate_branch (fixP, *valP);
15496       if (!fixP->fx_done)
15497         break;
15498
15499       if (*valP + 0x400000 <= 0x7fffff)
15500         {
15501           insn = read_insn (buf);
15502           insn |= (*valP >> 2) & 0x1fffff;
15503           write_insn (buf, insn);
15504         }
15505       else
15506         as_bad_where (fixP->fx_file, fixP->fx_line,
15507                       _("branch out of range"));
15508       break;
15509
15510     case BFD_RELOC_MIPS_26_PCREL_S2:
15511       fix_validate_branch (fixP, *valP);
15512       if (!fixP->fx_done)
15513         break;
15514
15515       if (*valP + 0x8000000 <= 0xfffffff)
15516         {
15517           insn = read_insn (buf);
15518           insn |= (*valP >> 2) & 0x3ffffff;
15519           write_insn (buf, insn);
15520         }
15521       else
15522         as_bad_where (fixP->fx_file, fixP->fx_line,
15523                       _("branch out of range"));
15524       break;
15525
15526     case BFD_RELOC_MIPS_18_PCREL_S3:
15527       if (fixP->fx_addsy && (S_GET_VALUE (fixP->fx_addsy) & 0x7) != 0)
15528         as_bad_where (fixP->fx_file, fixP->fx_line,
15529                       _("PC-relative access using misaligned symbol (%lx)"),
15530                       (long) S_GET_VALUE (fixP->fx_addsy));
15531       if ((fixP->fx_offset & 0x7) != 0)
15532         as_bad_where (fixP->fx_file, fixP->fx_line,
15533                       _("PC-relative access using misaligned offset (%lx)"),
15534                       (long) fixP->fx_offset);
15535       if (!fixP->fx_done)
15536         break;
15537
15538       if (*valP + 0x100000 <= 0x1fffff)
15539         {
15540           insn = read_insn (buf);
15541           insn |= (*valP >> 3) & 0x3ffff;
15542           write_insn (buf, insn);
15543         }
15544       else
15545         as_bad_where (fixP->fx_file, fixP->fx_line,
15546                       _("PC-relative access out of range"));
15547       break;
15548
15549     case BFD_RELOC_MIPS_19_PCREL_S2:
15550       if ((*valP & 0x3) != 0)
15551         as_bad_where (fixP->fx_file, fixP->fx_line,
15552                       _("PC-relative access to misaligned address (%lx)"),
15553                       (long) *valP);
15554       if (!fixP->fx_done)
15555         break;
15556
15557       if (*valP + 0x100000 <= 0x1fffff)
15558         {
15559           insn = read_insn (buf);
15560           insn |= (*valP >> 2) & 0x7ffff;
15561           write_insn (buf, insn);
15562         }
15563       else
15564         as_bad_where (fixP->fx_file, fixP->fx_line,
15565                       _("PC-relative access out of range"));
15566       break;
15567
15568     case BFD_RELOC_16_PCREL_S2:
15569       fix_validate_branch (fixP, *valP);
15570
15571       /* We need to save the bits in the instruction since fixup_segment()
15572          might be deleting the relocation entry (i.e., a branch within
15573          the current segment).  */
15574       if (! fixP->fx_done)
15575         break;
15576
15577       /* Update old instruction data.  */
15578       insn = read_insn (buf);
15579
15580       if (*valP + 0x20000 <= 0x3ffff)
15581         {
15582           insn |= (*valP >> 2) & 0xffff;
15583           write_insn (buf, insn);
15584         }
15585       else if (mips_pic == NO_PIC
15586                && fixP->fx_done
15587                && fixP->fx_frag->fr_address >= text_section->vma
15588                && (fixP->fx_frag->fr_address
15589                    < text_section->vma + bfd_get_section_size (text_section))
15590                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
15591                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
15592                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
15593         {
15594           /* The branch offset is too large.  If this is an
15595              unconditional branch, and we are not generating PIC code,
15596              we can convert it to an absolute jump instruction.  */
15597           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
15598             insn = 0x0c000000;  /* jal */
15599           else
15600             insn = 0x08000000;  /* j */
15601           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
15602           fixP->fx_done = 0;
15603           fixP->fx_addsy = section_symbol (text_section);
15604           *valP += md_pcrel_from (fixP);
15605           write_insn (buf, insn);
15606         }
15607       else
15608         {
15609           /* If we got here, we have branch-relaxation disabled,
15610              and there's nothing we can do to fix this instruction
15611              without turning it into a longer sequence.  */
15612           as_bad_where (fixP->fx_file, fixP->fx_line,
15613                         _("branch out of range"));
15614         }
15615       break;
15616
15617     case BFD_RELOC_MIPS16_16_PCREL_S1:
15618     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15619     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15620     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15621       gas_assert (!fixP->fx_done);
15622       if (fix_bad_cross_mode_branch_p (fixP))
15623         as_bad_where (fixP->fx_file, fixP->fx_line,
15624                       _("branch to a symbol in another ISA mode"));
15625       else if (fixP->fx_addsy
15626                && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
15627                && !bfd_is_abs_section (S_GET_SEGMENT (fixP->fx_addsy))
15628                && (fixP->fx_offset & 0x1) != 0)
15629         as_bad_where (fixP->fx_file, fixP->fx_line,
15630                       _("branch to misaligned address (0x%lx)"),
15631                       (long) (S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset));
15632       else if (HAVE_IN_PLACE_ADDENDS && (fixP->fx_offset & 0x1) != 0)
15633         as_bad_where (fixP->fx_file, fixP->fx_line,
15634                       _("cannot encode misaligned addend "
15635                         "in the relocatable field (0x%lx)"),
15636                       (long) fixP->fx_offset);
15637       break;
15638
15639     case BFD_RELOC_VTABLE_INHERIT:
15640       fixP->fx_done = 0;
15641       if (fixP->fx_addsy
15642           && !S_IS_DEFINED (fixP->fx_addsy)
15643           && !S_IS_WEAK (fixP->fx_addsy))
15644         S_SET_WEAK (fixP->fx_addsy);
15645       break;
15646
15647     case BFD_RELOC_NONE:
15648     case BFD_RELOC_VTABLE_ENTRY:
15649       fixP->fx_done = 0;
15650       break;
15651
15652     default:
15653       abort ();
15654     }
15655
15656   /* Remember value for tc_gen_reloc.  */
15657   fixP->fx_addnumber = *valP;
15658 }
15659
15660 static symbolS *
15661 get_symbol (void)
15662 {
15663   int c;
15664   char *name;
15665   symbolS *p;
15666
15667   c = get_symbol_name (&name);
15668   p = (symbolS *) symbol_find_or_make (name);
15669   (void) restore_line_pointer (c);
15670   return p;
15671 }
15672
15673 /* Align the current frag to a given power of two.  If a particular
15674    fill byte should be used, FILL points to an integer that contains
15675    that byte, otherwise FILL is null.
15676
15677    This function used to have the comment:
15678
15679       The MIPS assembler also automatically adjusts any preceding label.
15680
15681    The implementation therefore applied the adjustment to a maximum of
15682    one label.  However, other label adjustments are applied to batches
15683    of labels, and adjusting just one caused problems when new labels
15684    were added for the sake of debugging or unwind information.
15685    We therefore adjust all preceding labels (given as LABELS) instead.  */
15686
15687 static void
15688 mips_align (int to, int *fill, struct insn_label_list *labels)
15689 {
15690   mips_emit_delays ();
15691   mips_record_compressed_mode ();
15692   if (fill == NULL && subseg_text_p (now_seg))
15693     frag_align_code (to, 0);
15694   else
15695     frag_align (to, fill ? *fill : 0, 0);
15696   record_alignment (now_seg, to);
15697   mips_move_labels (labels, FALSE);
15698 }
15699
15700 /* Align to a given power of two.  .align 0 turns off the automatic
15701    alignment used by the data creating pseudo-ops.  */
15702
15703 static void
15704 s_align (int x ATTRIBUTE_UNUSED)
15705 {
15706   int temp, fill_value, *fill_ptr;
15707   long max_alignment = 28;
15708
15709   /* o Note that the assembler pulls down any immediately preceding label
15710        to the aligned address.
15711      o It's not documented but auto alignment is reinstated by
15712        a .align pseudo instruction.
15713      o Note also that after auto alignment is turned off the mips assembler
15714        issues an error on attempt to assemble an improperly aligned data item.
15715        We don't.  */
15716
15717   temp = get_absolute_expression ();
15718   if (temp > max_alignment)
15719     as_bad (_("alignment too large, %d assumed"), temp = max_alignment);
15720   else if (temp < 0)
15721     {
15722       as_warn (_("alignment negative, 0 assumed"));
15723       temp = 0;
15724     }
15725   if (*input_line_pointer == ',')
15726     {
15727       ++input_line_pointer;
15728       fill_value = get_absolute_expression ();
15729       fill_ptr = &fill_value;
15730     }
15731   else
15732     fill_ptr = 0;
15733   if (temp)
15734     {
15735       segment_info_type *si = seg_info (now_seg);
15736       struct insn_label_list *l = si->label_list;
15737       /* Auto alignment should be switched on by next section change.  */
15738       auto_align = 1;
15739       mips_align (temp, fill_ptr, l);
15740     }
15741   else
15742     {
15743       auto_align = 0;
15744     }
15745
15746   demand_empty_rest_of_line ();
15747 }
15748
15749 static void
15750 s_change_sec (int sec)
15751 {
15752   segT seg;
15753
15754   /* The ELF backend needs to know that we are changing sections, so
15755      that .previous works correctly.  We could do something like check
15756      for an obj_section_change_hook macro, but that might be confusing
15757      as it would not be appropriate to use it in the section changing
15758      functions in read.c, since obj-elf.c intercepts those.  FIXME:
15759      This should be cleaner, somehow.  */
15760   obj_elf_section_change_hook ();
15761
15762   mips_emit_delays ();
15763
15764   switch (sec)
15765     {
15766     case 't':
15767       s_text (0);
15768       break;
15769     case 'd':
15770       s_data (0);
15771       break;
15772     case 'b':
15773       subseg_set (bss_section, (subsegT) get_absolute_expression ());
15774       demand_empty_rest_of_line ();
15775       break;
15776
15777     case 'r':
15778       seg = subseg_new (RDATA_SECTION_NAME,
15779                         (subsegT) get_absolute_expression ());
15780       bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
15781                                               | SEC_READONLY | SEC_RELOC
15782                                               | SEC_DATA));
15783       if (strncmp (TARGET_OS, "elf", 3) != 0)
15784         record_alignment (seg, 4);
15785       demand_empty_rest_of_line ();
15786       break;
15787
15788     case 's':
15789       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
15790       bfd_set_section_flags (stdoutput, seg,
15791                              SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
15792       if (strncmp (TARGET_OS, "elf", 3) != 0)
15793         record_alignment (seg, 4);
15794       demand_empty_rest_of_line ();
15795       break;
15796
15797     case 'B':
15798       seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
15799       bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
15800       if (strncmp (TARGET_OS, "elf", 3) != 0)
15801         record_alignment (seg, 4);
15802       demand_empty_rest_of_line ();
15803       break;
15804     }
15805
15806   auto_align = 1;
15807 }
15808
15809 void
15810 s_change_section (int ignore ATTRIBUTE_UNUSED)
15811 {
15812   char *saved_ilp;
15813   char *section_name;
15814   char c, endc;
15815   char next_c = 0;
15816   int section_type;
15817   int section_flag;
15818   int section_entry_size;
15819   int section_alignment;
15820
15821   saved_ilp = input_line_pointer;
15822   endc = get_symbol_name (&section_name);
15823   c = (endc == '"' ? input_line_pointer[1] : endc);
15824   if (c)
15825     next_c = input_line_pointer [(endc == '"' ? 2 : 1)];
15826
15827   /* Do we have .section Name<,"flags">?  */
15828   if (c != ',' || (c == ',' && next_c == '"'))
15829     {
15830       /* Just after name is now '\0'.  */
15831       (void) restore_line_pointer (endc);
15832       input_line_pointer = saved_ilp;
15833       obj_elf_section (ignore);
15834       return;
15835     }
15836
15837   section_name = xstrdup (section_name);
15838   c = restore_line_pointer (endc);
15839
15840   input_line_pointer++;
15841
15842   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
15843   if (c == ',')
15844     section_type = get_absolute_expression ();
15845   else
15846     section_type = 0;
15847
15848   if (*input_line_pointer++ == ',')
15849     section_flag = get_absolute_expression ();
15850   else
15851     section_flag = 0;
15852
15853   if (*input_line_pointer++ == ',')
15854     section_entry_size = get_absolute_expression ();
15855   else
15856     section_entry_size = 0;
15857
15858   if (*input_line_pointer++ == ',')
15859     section_alignment = get_absolute_expression ();
15860   else
15861     section_alignment = 0;
15862
15863   /* FIXME: really ignore?  */
15864   (void) section_alignment;
15865
15866   /* When using the generic form of .section (as implemented by obj-elf.c),
15867      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
15868      traditionally had to fall back on the more common @progbits instead.
15869
15870      There's nothing really harmful in this, since bfd will correct
15871      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
15872      means that, for backwards compatibility, the special_section entries
15873      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
15874
15875      Even so, we shouldn't force users of the MIPS .section syntax to
15876      incorrectly label the sections as SHT_PROGBITS.  The best compromise
15877      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
15878      generic type-checking code.  */
15879   if (section_type == SHT_MIPS_DWARF)
15880     section_type = SHT_PROGBITS;
15881
15882   obj_elf_change_section (section_name, section_type, section_flag,
15883                           section_entry_size, 0, 0, 0);
15884
15885   if (now_seg->name != section_name)
15886     free (section_name);
15887 }
15888
15889 void
15890 mips_enable_auto_align (void)
15891 {
15892   auto_align = 1;
15893 }
15894
15895 static void
15896 s_cons (int log_size)
15897 {
15898   segment_info_type *si = seg_info (now_seg);
15899   struct insn_label_list *l = si->label_list;
15900
15901   mips_emit_delays ();
15902   if (log_size > 0 && auto_align)
15903     mips_align (log_size, 0, l);
15904   cons (1 << log_size);
15905   mips_clear_insn_labels ();
15906 }
15907
15908 static void
15909 s_float_cons (int type)
15910 {
15911   segment_info_type *si = seg_info (now_seg);
15912   struct insn_label_list *l = si->label_list;
15913
15914   mips_emit_delays ();
15915
15916   if (auto_align)
15917     {
15918       if (type == 'd')
15919         mips_align (3, 0, l);
15920       else
15921         mips_align (2, 0, l);
15922     }
15923
15924   float_cons (type);
15925   mips_clear_insn_labels ();
15926 }
15927
15928 /* Handle .globl.  We need to override it because on Irix 5 you are
15929    permitted to say
15930        .globl foo .text
15931    where foo is an undefined symbol, to mean that foo should be
15932    considered to be the address of a function.  */
15933
15934 static void
15935 s_mips_globl (int x ATTRIBUTE_UNUSED)
15936 {
15937   char *name;
15938   int c;
15939   symbolS *symbolP;
15940   flagword flag;
15941
15942   do
15943     {
15944       c = get_symbol_name (&name);
15945       symbolP = symbol_find_or_make (name);
15946       S_SET_EXTERNAL (symbolP);
15947
15948       *input_line_pointer = c;
15949       SKIP_WHITESPACE_AFTER_NAME ();
15950
15951       /* On Irix 5, every global symbol that is not explicitly labelled as
15952          being a function is apparently labelled as being an object.  */
15953       flag = BSF_OBJECT;
15954
15955       if (!is_end_of_line[(unsigned char) *input_line_pointer]
15956           && (*input_line_pointer != ','))
15957         {
15958           char *secname;
15959           asection *sec;
15960
15961           c = get_symbol_name (&secname);
15962           sec = bfd_get_section_by_name (stdoutput, secname);
15963           if (sec == NULL)
15964             as_bad (_("%s: no such section"), secname);
15965           (void) restore_line_pointer (c);
15966
15967           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
15968             flag = BSF_FUNCTION;
15969         }
15970
15971       symbol_get_bfdsym (symbolP)->flags |= flag;
15972
15973       c = *input_line_pointer;
15974       if (c == ',')
15975         {
15976           input_line_pointer++;
15977           SKIP_WHITESPACE ();
15978           if (is_end_of_line[(unsigned char) *input_line_pointer])
15979             c = '\n';
15980         }
15981     }
15982   while (c == ',');
15983
15984   demand_empty_rest_of_line ();
15985 }
15986
15987 static void
15988 s_option (int x ATTRIBUTE_UNUSED)
15989 {
15990   char *opt;
15991   char c;
15992
15993   c = get_symbol_name (&opt);
15994
15995   if (*opt == 'O')
15996     {
15997       /* FIXME: What does this mean?  */
15998     }
15999   else if (strncmp (opt, "pic", 3) == 0 && ISDIGIT (opt[3]) && opt[4] == '\0')
16000     {
16001       int i;
16002
16003       i = atoi (opt + 3);
16004       if (i != 0 && i != 2)
16005         as_bad (_(".option pic%d not supported"), i);
16006       else if (mips_pic == VXWORKS_PIC)
16007         as_bad (_(".option pic%d not supported in VxWorks PIC mode"), i);
16008       else if (i == 0)
16009         mips_pic = NO_PIC;
16010       else if (i == 2)
16011         {
16012           mips_pic = SVR4_PIC;
16013           mips_abicalls = TRUE;
16014         }
16015
16016       if (mips_pic == SVR4_PIC)
16017         {
16018           if (g_switch_seen && g_switch_value != 0)
16019             as_warn (_("-G may not be used with SVR4 PIC code"));
16020           g_switch_value = 0;
16021           bfd_set_gp_size (stdoutput, 0);
16022         }
16023     }
16024   else
16025     as_warn (_("unrecognized option \"%s\""), opt);
16026
16027   (void) restore_line_pointer (c);
16028   demand_empty_rest_of_line ();
16029 }
16030
16031 /* This structure is used to hold a stack of .set values.  */
16032
16033 struct mips_option_stack
16034 {
16035   struct mips_option_stack *next;
16036   struct mips_set_options options;
16037 };
16038
16039 static struct mips_option_stack *mips_opts_stack;
16040
16041 /* Return status for .set/.module option handling.  */
16042
16043 enum code_option_type
16044 {
16045   /* Unrecognized option.  */
16046   OPTION_TYPE_BAD = -1,
16047
16048   /* Ordinary option.  */
16049   OPTION_TYPE_NORMAL,
16050
16051   /* ISA changing option.  */
16052   OPTION_TYPE_ISA
16053 };
16054
16055 /* Handle common .set/.module options.  Return status indicating option
16056    type.  */
16057
16058 static enum code_option_type
16059 parse_code_option (char * name)
16060 {
16061   bfd_boolean isa_set = FALSE;
16062   const struct mips_ase *ase;
16063
16064   if (strncmp (name, "at=", 3) == 0)
16065     {
16066       char *s = name + 3;
16067
16068       if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
16069         as_bad (_("unrecognized register name `%s'"), s);
16070     }
16071   else if (strcmp (name, "at") == 0)
16072     mips_opts.at = ATREG;
16073   else if (strcmp (name, "noat") == 0)
16074     mips_opts.at = ZERO;
16075   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
16076     mips_opts.nomove = 0;
16077   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
16078     mips_opts.nomove = 1;
16079   else if (strcmp (name, "bopt") == 0)
16080     mips_opts.nobopt = 0;
16081   else if (strcmp (name, "nobopt") == 0)
16082     mips_opts.nobopt = 1;
16083   else if (strcmp (name, "gp=32") == 0)
16084     mips_opts.gp = 32;
16085   else if (strcmp (name, "gp=64") == 0)
16086     mips_opts.gp = 64;
16087   else if (strcmp (name, "fp=32") == 0)
16088     mips_opts.fp = 32;
16089   else if (strcmp (name, "fp=xx") == 0)
16090     mips_opts.fp = 0;
16091   else if (strcmp (name, "fp=64") == 0)
16092     mips_opts.fp = 64;
16093   else if (strcmp (name, "softfloat") == 0)
16094     mips_opts.soft_float = 1;
16095   else if (strcmp (name, "hardfloat") == 0)
16096     mips_opts.soft_float = 0;
16097   else if (strcmp (name, "singlefloat") == 0)
16098     mips_opts.single_float = 1;
16099   else if (strcmp (name, "doublefloat") == 0)
16100     mips_opts.single_float = 0;
16101   else if (strcmp (name, "nooddspreg") == 0)
16102     mips_opts.oddspreg = 0;
16103   else if (strcmp (name, "oddspreg") == 0)
16104     mips_opts.oddspreg = 1;
16105   else if (strcmp (name, "mips16") == 0
16106            || strcmp (name, "MIPS-16") == 0)
16107     mips_opts.mips16 = 1;
16108   else if (strcmp (name, "nomips16") == 0
16109            || strcmp (name, "noMIPS-16") == 0)
16110     mips_opts.mips16 = 0;
16111   else if (strcmp (name, "micromips") == 0)
16112     mips_opts.micromips = 1;
16113   else if (strcmp (name, "nomicromips") == 0)
16114     mips_opts.micromips = 0;
16115   else if (name[0] == 'n'
16116            && name[1] == 'o'
16117            && (ase = mips_lookup_ase (name + 2)))
16118     mips_set_ase (ase, &mips_opts, FALSE);
16119   else if ((ase = mips_lookup_ase (name)))
16120     mips_set_ase (ase, &mips_opts, TRUE);
16121   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
16122     {
16123       /* Permit the user to change the ISA and architecture on the fly.
16124          Needless to say, misuse can cause serious problems.  */
16125       if (strncmp (name, "arch=", 5) == 0)
16126         {
16127           const struct mips_cpu_info *p;
16128
16129           p = mips_parse_cpu ("internal use", name + 5);
16130           if (!p)
16131             as_bad (_("unknown architecture %s"), name + 5);
16132           else
16133             {
16134               mips_opts.arch = p->cpu;
16135               mips_opts.isa = p->isa;
16136               isa_set = TRUE;
16137             }
16138         }
16139       else if (strncmp (name, "mips", 4) == 0)
16140         {
16141           const struct mips_cpu_info *p;
16142
16143           p = mips_parse_cpu ("internal use", name);
16144           if (!p)
16145             as_bad (_("unknown ISA level %s"), name + 4);
16146           else
16147             {
16148               mips_opts.arch = p->cpu;
16149               mips_opts.isa = p->isa;
16150               isa_set = TRUE;
16151             }
16152         }
16153       else
16154         as_bad (_("unknown ISA or architecture %s"), name);
16155     }
16156   else if (strcmp (name, "autoextend") == 0)
16157     mips_opts.noautoextend = 0;
16158   else if (strcmp (name, "noautoextend") == 0)
16159     mips_opts.noautoextend = 1;
16160   else if (strcmp (name, "insn32") == 0)
16161     mips_opts.insn32 = TRUE;
16162   else if (strcmp (name, "noinsn32") == 0)
16163     mips_opts.insn32 = FALSE;
16164   else if (strcmp (name, "sym32") == 0)
16165     mips_opts.sym32 = TRUE;
16166   else if (strcmp (name, "nosym32") == 0)
16167     mips_opts.sym32 = FALSE;
16168   else
16169     return OPTION_TYPE_BAD;
16170
16171   return isa_set ? OPTION_TYPE_ISA : OPTION_TYPE_NORMAL;
16172 }
16173
16174 /* Handle the .set pseudo-op.  */
16175
16176 static void
16177 s_mipsset (int x ATTRIBUTE_UNUSED)
16178 {
16179   enum code_option_type type = OPTION_TYPE_NORMAL;
16180   char *name = input_line_pointer, ch;
16181
16182   file_mips_check_options ();
16183
16184   while (!is_end_of_line[(unsigned char) *input_line_pointer])
16185     ++input_line_pointer;
16186   ch = *input_line_pointer;
16187   *input_line_pointer = '\0';
16188
16189   if (strchr (name, ','))
16190     {
16191       /* Generic ".set" directive; use the generic handler.  */
16192       *input_line_pointer = ch;
16193       input_line_pointer = name;
16194       s_set (0);
16195       return;
16196     }
16197
16198   if (strcmp (name, "reorder") == 0)
16199     {
16200       if (mips_opts.noreorder)
16201         end_noreorder ();
16202     }
16203   else if (strcmp (name, "noreorder") == 0)
16204     {
16205       if (!mips_opts.noreorder)
16206         start_noreorder ();
16207     }
16208   else if (strcmp (name, "macro") == 0)
16209     mips_opts.warn_about_macros = 0;
16210   else if (strcmp (name, "nomacro") == 0)
16211     {
16212       if (mips_opts.noreorder == 0)
16213         as_bad (_("`noreorder' must be set before `nomacro'"));
16214       mips_opts.warn_about_macros = 1;
16215     }
16216   else if (strcmp (name, "gp=default") == 0)
16217     mips_opts.gp = file_mips_opts.gp;
16218   else if (strcmp (name, "fp=default") == 0)
16219     mips_opts.fp = file_mips_opts.fp;
16220   else if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
16221     {
16222       mips_opts.isa = file_mips_opts.isa;
16223       mips_opts.arch = file_mips_opts.arch;
16224       mips_opts.gp = file_mips_opts.gp;
16225       mips_opts.fp = file_mips_opts.fp;
16226     }
16227   else if (strcmp (name, "push") == 0)
16228     {
16229       struct mips_option_stack *s;
16230
16231       s = XNEW (struct mips_option_stack);
16232       s->next = mips_opts_stack;
16233       s->options = mips_opts;
16234       mips_opts_stack = s;
16235     }
16236   else if (strcmp (name, "pop") == 0)
16237     {
16238       struct mips_option_stack *s;
16239
16240       s = mips_opts_stack;
16241       if (s == NULL)
16242         as_bad (_(".set pop with no .set push"));
16243       else
16244         {
16245           /* If we're changing the reorder mode we need to handle
16246              delay slots correctly.  */
16247           if (s->options.noreorder && ! mips_opts.noreorder)
16248             start_noreorder ();
16249           else if (! s->options.noreorder && mips_opts.noreorder)
16250             end_noreorder ();
16251
16252           mips_opts = s->options;
16253           mips_opts_stack = s->next;
16254           free (s);
16255         }
16256     }
16257   else
16258     {
16259       type = parse_code_option (name);
16260       if (type == OPTION_TYPE_BAD)
16261         as_warn (_("tried to set unrecognized symbol: %s\n"), name);
16262     }
16263
16264   /* The use of .set [arch|cpu]= historically 'fixes' the width of gp and fp
16265      registers based on what is supported by the arch/cpu.  */
16266   if (type == OPTION_TYPE_ISA)
16267     {
16268       switch (mips_opts.isa)
16269         {
16270         case 0:
16271           break;
16272         case ISA_MIPS1:
16273           /* MIPS I cannot support FPXX.  */
16274           mips_opts.fp = 32;
16275           /* fall-through.  */
16276         case ISA_MIPS2:
16277         case ISA_MIPS32:
16278         case ISA_MIPS32R2:
16279         case ISA_MIPS32R3:
16280         case ISA_MIPS32R5:
16281           mips_opts.gp = 32;
16282           if (mips_opts.fp != 0)
16283             mips_opts.fp = 32;
16284           break;
16285         case ISA_MIPS32R6:
16286           mips_opts.gp = 32;
16287           mips_opts.fp = 64;
16288           break;
16289         case ISA_MIPS3:
16290         case ISA_MIPS4:
16291         case ISA_MIPS5:
16292         case ISA_MIPS64:
16293         case ISA_MIPS64R2:
16294         case ISA_MIPS64R3:
16295         case ISA_MIPS64R5:
16296         case ISA_MIPS64R6:
16297           mips_opts.gp = 64;
16298           if (mips_opts.fp != 0)
16299             {
16300               if (mips_opts.arch == CPU_R5900)
16301                 mips_opts.fp = 32;
16302               else
16303                 mips_opts.fp = 64;
16304             }
16305           break;
16306         default:
16307           as_bad (_("unknown ISA level %s"), name + 4);
16308           break;
16309         }
16310     }
16311
16312   mips_check_options (&mips_opts, FALSE);
16313
16314   mips_check_isa_supports_ases ();
16315   *input_line_pointer = ch;
16316   demand_empty_rest_of_line ();
16317 }
16318
16319 /* Handle the .module pseudo-op.  */
16320
16321 static void
16322 s_module (int ignore ATTRIBUTE_UNUSED)
16323 {
16324   char *name = input_line_pointer, ch;
16325
16326   while (!is_end_of_line[(unsigned char) *input_line_pointer])
16327     ++input_line_pointer;
16328   ch = *input_line_pointer;
16329   *input_line_pointer = '\0';
16330
16331   if (!file_mips_opts_checked)
16332     {
16333       if (parse_code_option (name) == OPTION_TYPE_BAD)
16334         as_bad (_(".module used with unrecognized symbol: %s\n"), name);
16335
16336       /* Update module level settings from mips_opts.  */
16337       file_mips_opts = mips_opts;
16338     }
16339   else
16340     as_bad (_(".module is not permitted after generating code"));
16341
16342   *input_line_pointer = ch;
16343   demand_empty_rest_of_line ();
16344 }
16345
16346 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
16347    .option pic2.  It means to generate SVR4 PIC calls.  */
16348
16349 static void
16350 s_abicalls (int ignore ATTRIBUTE_UNUSED)
16351 {
16352   mips_pic = SVR4_PIC;
16353   mips_abicalls = TRUE;
16354
16355   if (g_switch_seen && g_switch_value != 0)
16356     as_warn (_("-G may not be used with SVR4 PIC code"));
16357   g_switch_value = 0;
16358
16359   bfd_set_gp_size (stdoutput, 0);
16360   demand_empty_rest_of_line ();
16361 }
16362
16363 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
16364    PIC code.  It sets the $gp register for the function based on the
16365    function address, which is in the register named in the argument.
16366    This uses a relocation against _gp_disp, which is handled specially
16367    by the linker.  The result is:
16368         lui     $gp,%hi(_gp_disp)
16369         addiu   $gp,$gp,%lo(_gp_disp)
16370         addu    $gp,$gp,.cpload argument
16371    The .cpload argument is normally $25 == $t9.
16372
16373    The -mno-shared option changes this to:
16374         lui     $gp,%hi(__gnu_local_gp)
16375         addiu   $gp,$gp,%lo(__gnu_local_gp)
16376    and the argument is ignored.  This saves an instruction, but the
16377    resulting code is not position independent; it uses an absolute
16378    address for __gnu_local_gp.  Thus code assembled with -mno-shared
16379    can go into an ordinary executable, but not into a shared library.  */
16380
16381 static void
16382 s_cpload (int ignore ATTRIBUTE_UNUSED)
16383 {
16384   expressionS ex;
16385   int reg;
16386   int in_shared;
16387
16388   file_mips_check_options ();
16389
16390   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16391      .cpload is ignored.  */
16392   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16393     {
16394       s_ignore (0);
16395       return;
16396     }
16397
16398   if (mips_opts.mips16)
16399     {
16400       as_bad (_("%s not supported in MIPS16 mode"), ".cpload");
16401       ignore_rest_of_line ();
16402       return;
16403     }
16404
16405   /* .cpload should be in a .set noreorder section.  */
16406   if (mips_opts.noreorder == 0)
16407     as_warn (_(".cpload not in noreorder section"));
16408
16409   reg = tc_get_register (0);
16410
16411   /* If we need to produce a 64-bit address, we are better off using
16412      the default instruction sequence.  */
16413   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
16414
16415   ex.X_op = O_symbol;
16416   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
16417                                          "__gnu_local_gp");
16418   ex.X_op_symbol = NULL;
16419   ex.X_add_number = 0;
16420
16421   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
16422   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16423
16424   mips_mark_labels ();
16425   mips_assembling_insn = TRUE;
16426
16427   macro_start ();
16428   macro_build_lui (&ex, mips_gp_register);
16429   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16430                mips_gp_register, BFD_RELOC_LO16);
16431   if (in_shared)
16432     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
16433                  mips_gp_register, reg);
16434   macro_end ();
16435
16436   mips_assembling_insn = FALSE;
16437   demand_empty_rest_of_line ();
16438 }
16439
16440 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
16441      .cpsetup $reg1, offset|$reg2, label
16442
16443    If offset is given, this results in:
16444      sd         $gp, offset($sp)
16445      lui        $gp, %hi(%neg(%gp_rel(label)))
16446      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
16447      daddu      $gp, $gp, $reg1
16448
16449    If $reg2 is given, this results in:
16450      or         $reg2, $gp, $0
16451      lui        $gp, %hi(%neg(%gp_rel(label)))
16452      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
16453      daddu      $gp, $gp, $reg1
16454    $reg1 is normally $25 == $t9.
16455
16456    The -mno-shared option replaces the last three instructions with
16457         lui     $gp,%hi(_gp)
16458         addiu   $gp,$gp,%lo(_gp)  */
16459
16460 static void
16461 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
16462 {
16463   expressionS ex_off;
16464   expressionS ex_sym;
16465   int reg1;
16466
16467   file_mips_check_options ();
16468
16469   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
16470      We also need NewABI support.  */
16471   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16472     {
16473       s_ignore (0);
16474       return;
16475     }
16476
16477   if (mips_opts.mips16)
16478     {
16479       as_bad (_("%s not supported in MIPS16 mode"), ".cpsetup");
16480       ignore_rest_of_line ();
16481       return;
16482     }
16483
16484   reg1 = tc_get_register (0);
16485   SKIP_WHITESPACE ();
16486   if (*input_line_pointer != ',')
16487     {
16488       as_bad (_("missing argument separator ',' for .cpsetup"));
16489       return;
16490     }
16491   else
16492     ++input_line_pointer;
16493   SKIP_WHITESPACE ();
16494   if (*input_line_pointer == '$')
16495     {
16496       mips_cpreturn_register = tc_get_register (0);
16497       mips_cpreturn_offset = -1;
16498     }
16499   else
16500     {
16501       mips_cpreturn_offset = get_absolute_expression ();
16502       mips_cpreturn_register = -1;
16503     }
16504   SKIP_WHITESPACE ();
16505   if (*input_line_pointer != ',')
16506     {
16507       as_bad (_("missing argument separator ',' for .cpsetup"));
16508       return;
16509     }
16510   else
16511     ++input_line_pointer;
16512   SKIP_WHITESPACE ();
16513   expression (&ex_sym);
16514
16515   mips_mark_labels ();
16516   mips_assembling_insn = TRUE;
16517
16518   macro_start ();
16519   if (mips_cpreturn_register == -1)
16520     {
16521       ex_off.X_op = O_constant;
16522       ex_off.X_add_symbol = NULL;
16523       ex_off.X_op_symbol = NULL;
16524       ex_off.X_add_number = mips_cpreturn_offset;
16525
16526       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
16527                    BFD_RELOC_LO16, SP);
16528     }
16529   else
16530     move_register (mips_cpreturn_register, mips_gp_register);
16531
16532   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
16533     {
16534       macro_build (&ex_sym, "lui", LUI_FMT, mips_gp_register,
16535                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
16536                    BFD_RELOC_HI16_S);
16537
16538       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
16539                    mips_gp_register, -1, BFD_RELOC_GPREL16,
16540                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
16541
16542       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
16543                    mips_gp_register, reg1);
16544     }
16545   else
16546     {
16547       expressionS ex;
16548
16549       ex.X_op = O_symbol;
16550       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
16551       ex.X_op_symbol = NULL;
16552       ex.X_add_number = 0;
16553
16554       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
16555       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16556
16557       macro_build_lui (&ex, mips_gp_register);
16558       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16559                    mips_gp_register, BFD_RELOC_LO16);
16560     }
16561
16562   macro_end ();
16563
16564   mips_assembling_insn = FALSE;
16565   demand_empty_rest_of_line ();
16566 }
16567
16568 static void
16569 s_cplocal (int ignore ATTRIBUTE_UNUSED)
16570 {
16571   file_mips_check_options ();
16572
16573   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
16574      .cplocal is ignored.  */
16575   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16576     {
16577       s_ignore (0);
16578       return;
16579     }
16580
16581   if (mips_opts.mips16)
16582     {
16583       as_bad (_("%s not supported in MIPS16 mode"), ".cplocal");
16584       ignore_rest_of_line ();
16585       return;
16586     }
16587
16588   mips_gp_register = tc_get_register (0);
16589   demand_empty_rest_of_line ();
16590 }
16591
16592 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
16593    offset from $sp.  The offset is remembered, and after making a PIC
16594    call $gp is restored from that location.  */
16595
16596 static void
16597 s_cprestore (int ignore ATTRIBUTE_UNUSED)
16598 {
16599   expressionS ex;
16600
16601   file_mips_check_options ();
16602
16603   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16604      .cprestore is ignored.  */
16605   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16606     {
16607       s_ignore (0);
16608       return;
16609     }
16610
16611   if (mips_opts.mips16)
16612     {
16613       as_bad (_("%s not supported in MIPS16 mode"), ".cprestore");
16614       ignore_rest_of_line ();
16615       return;
16616     }
16617
16618   mips_cprestore_offset = get_absolute_expression ();
16619   mips_cprestore_valid = 1;
16620
16621   ex.X_op = O_constant;
16622   ex.X_add_symbol = NULL;
16623   ex.X_op_symbol = NULL;
16624   ex.X_add_number = mips_cprestore_offset;
16625
16626   mips_mark_labels ();
16627   mips_assembling_insn = TRUE;
16628
16629   macro_start ();
16630   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
16631                                 SP, HAVE_64BIT_ADDRESSES);
16632   macro_end ();
16633
16634   mips_assembling_insn = FALSE;
16635   demand_empty_rest_of_line ();
16636 }
16637
16638 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
16639    was given in the preceding .cpsetup, it results in:
16640      ld         $gp, offset($sp)
16641
16642    If a register $reg2 was given there, it results in:
16643      or         $gp, $reg2, $0  */
16644
16645 static void
16646 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
16647 {
16648   expressionS ex;
16649
16650   file_mips_check_options ();
16651
16652   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
16653      We also need NewABI support.  */
16654   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16655     {
16656       s_ignore (0);
16657       return;
16658     }
16659
16660   if (mips_opts.mips16)
16661     {
16662       as_bad (_("%s not supported in MIPS16 mode"), ".cpreturn");
16663       ignore_rest_of_line ();
16664       return;
16665     }
16666
16667   mips_mark_labels ();
16668   mips_assembling_insn = TRUE;
16669
16670   macro_start ();
16671   if (mips_cpreturn_register == -1)
16672     {
16673       ex.X_op = O_constant;
16674       ex.X_add_symbol = NULL;
16675       ex.X_op_symbol = NULL;
16676       ex.X_add_number = mips_cpreturn_offset;
16677
16678       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
16679     }
16680   else
16681     move_register (mips_gp_register, mips_cpreturn_register);
16682
16683   macro_end ();
16684
16685   mips_assembling_insn = FALSE;
16686   demand_empty_rest_of_line ();
16687 }
16688
16689 /* Handle a .dtprelword, .dtpreldword, .tprelword, or .tpreldword
16690    pseudo-op; DIRSTR says which. The pseudo-op generates a BYTES-size
16691    DTP- or TP-relative relocation of type RTYPE, for use in either DWARF
16692    debug information or MIPS16 TLS.  */
16693
16694 static void
16695 s_tls_rel_directive (const size_t bytes, const char *dirstr,
16696                      bfd_reloc_code_real_type rtype)
16697 {
16698   expressionS ex;
16699   char *p;
16700
16701   expression (&ex);
16702
16703   if (ex.X_op != O_symbol)
16704     {
16705       as_bad (_("unsupported use of %s"), dirstr);
16706       ignore_rest_of_line ();
16707     }
16708
16709   p = frag_more (bytes);
16710   md_number_to_chars (p, 0, bytes);
16711   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE, rtype);
16712   demand_empty_rest_of_line ();
16713   mips_clear_insn_labels ();
16714 }
16715
16716 /* Handle .dtprelword.  */
16717
16718 static void
16719 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
16720 {
16721   s_tls_rel_directive (4, ".dtprelword", BFD_RELOC_MIPS_TLS_DTPREL32);
16722 }
16723
16724 /* Handle .dtpreldword.  */
16725
16726 static void
16727 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
16728 {
16729   s_tls_rel_directive (8, ".dtpreldword", BFD_RELOC_MIPS_TLS_DTPREL64);
16730 }
16731
16732 /* Handle .tprelword.  */
16733
16734 static void
16735 s_tprelword (int ignore ATTRIBUTE_UNUSED)
16736 {
16737   s_tls_rel_directive (4, ".tprelword", BFD_RELOC_MIPS_TLS_TPREL32);
16738 }
16739
16740 /* Handle .tpreldword.  */
16741
16742 static void
16743 s_tpreldword (int ignore ATTRIBUTE_UNUSED)
16744 {
16745   s_tls_rel_directive (8, ".tpreldword", BFD_RELOC_MIPS_TLS_TPREL64);
16746 }
16747
16748 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
16749    code.  It sets the offset to use in gp_rel relocations.  */
16750
16751 static void
16752 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
16753 {
16754   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
16755      We also need NewABI support.  */
16756   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16757     {
16758       s_ignore (0);
16759       return;
16760     }
16761
16762   mips_gprel_offset = get_absolute_expression ();
16763
16764   demand_empty_rest_of_line ();
16765 }
16766
16767 /* Handle the .gpword pseudo-op.  This is used when generating PIC
16768    code.  It generates a 32 bit GP relative reloc.  */
16769
16770 static void
16771 s_gpword (int ignore ATTRIBUTE_UNUSED)
16772 {
16773   segment_info_type *si;
16774   struct insn_label_list *l;
16775   expressionS ex;
16776   char *p;
16777
16778   /* When not generating PIC code, this is treated as .word.  */
16779   if (mips_pic != SVR4_PIC)
16780     {
16781       s_cons (2);
16782       return;
16783     }
16784
16785   si = seg_info (now_seg);
16786   l = si->label_list;
16787   mips_emit_delays ();
16788   if (auto_align)
16789     mips_align (2, 0, l);
16790
16791   expression (&ex);
16792   mips_clear_insn_labels ();
16793
16794   if (ex.X_op != O_symbol || ex.X_add_number != 0)
16795     {
16796       as_bad (_("unsupported use of .gpword"));
16797       ignore_rest_of_line ();
16798     }
16799
16800   p = frag_more (4);
16801   md_number_to_chars (p, 0, 4);
16802   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
16803                BFD_RELOC_GPREL32);
16804
16805   demand_empty_rest_of_line ();
16806 }
16807
16808 static void
16809 s_gpdword (int ignore ATTRIBUTE_UNUSED)
16810 {
16811   segment_info_type *si;
16812   struct insn_label_list *l;
16813   expressionS ex;
16814   char *p;
16815
16816   /* When not generating PIC code, this is treated as .dword.  */
16817   if (mips_pic != SVR4_PIC)
16818     {
16819       s_cons (3);
16820       return;
16821     }
16822
16823   si = seg_info (now_seg);
16824   l = si->label_list;
16825   mips_emit_delays ();
16826   if (auto_align)
16827     mips_align (3, 0, l);
16828
16829   expression (&ex);
16830   mips_clear_insn_labels ();
16831
16832   if (ex.X_op != O_symbol || ex.X_add_number != 0)
16833     {
16834       as_bad (_("unsupported use of .gpdword"));
16835       ignore_rest_of_line ();
16836     }
16837
16838   p = frag_more (8);
16839   md_number_to_chars (p, 0, 8);
16840   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
16841                BFD_RELOC_GPREL32)->fx_tcbit = 1;
16842
16843   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
16844   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
16845            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
16846
16847   demand_empty_rest_of_line ();
16848 }
16849
16850 /* Handle the .ehword pseudo-op.  This is used when generating unwinding
16851    tables.  It generates a R_MIPS_EH reloc.  */
16852
16853 static void
16854 s_ehword (int ignore ATTRIBUTE_UNUSED)
16855 {
16856   expressionS ex;
16857   char *p;
16858
16859   mips_emit_delays ();
16860
16861   expression (&ex);
16862   mips_clear_insn_labels ();
16863
16864   if (ex.X_op != O_symbol || ex.X_add_number != 0)
16865     {
16866       as_bad (_("unsupported use of .ehword"));
16867       ignore_rest_of_line ();
16868     }
16869
16870   p = frag_more (4);
16871   md_number_to_chars (p, 0, 4);
16872   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
16873                BFD_RELOC_32_PCREL);
16874
16875   demand_empty_rest_of_line ();
16876 }
16877
16878 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
16879    tables in SVR4 PIC code.  */
16880
16881 static void
16882 s_cpadd (int ignore ATTRIBUTE_UNUSED)
16883 {
16884   int reg;
16885
16886   file_mips_check_options ();
16887
16888   /* This is ignored when not generating SVR4 PIC code.  */
16889   if (mips_pic != SVR4_PIC)
16890     {
16891       s_ignore (0);
16892       return;
16893     }
16894
16895   mips_mark_labels ();
16896   mips_assembling_insn = TRUE;
16897
16898   /* Add $gp to the register named as an argument.  */
16899   macro_start ();
16900   reg = tc_get_register (0);
16901   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
16902   macro_end ();
16903
16904   mips_assembling_insn = FALSE;
16905   demand_empty_rest_of_line ();
16906 }
16907
16908 /* Handle the .insn pseudo-op.  This marks instruction labels in
16909    mips16/micromips mode.  This permits the linker to handle them specially,
16910    such as generating jalx instructions when needed.  We also make
16911    them odd for the duration of the assembly, in order to generate the
16912    right sort of code.  We will make them even in the adjust_symtab
16913    routine, while leaving them marked.  This is convenient for the
16914    debugger and the disassembler.  The linker knows to make them odd
16915    again.  */
16916
16917 static void
16918 s_insn (int ignore ATTRIBUTE_UNUSED)
16919 {
16920   file_mips_check_options ();
16921   file_ase_mips16 |= mips_opts.mips16;
16922   file_ase_micromips |= mips_opts.micromips;
16923
16924   mips_mark_labels ();
16925
16926   demand_empty_rest_of_line ();
16927 }
16928
16929 /* Handle the .nan pseudo-op.  */
16930
16931 static void
16932 s_nan (int ignore ATTRIBUTE_UNUSED)
16933 {
16934   static const char str_legacy[] = "legacy";
16935   static const char str_2008[] = "2008";
16936   size_t i;
16937
16938   for (i = 0; !is_end_of_line[(unsigned char) input_line_pointer[i]]; i++);
16939
16940   if (i == sizeof (str_2008) - 1
16941       && memcmp (input_line_pointer, str_2008, i) == 0)
16942     mips_nan2008 = 1;
16943   else if (i == sizeof (str_legacy) - 1
16944            && memcmp (input_line_pointer, str_legacy, i) == 0)
16945     {
16946       if (ISA_HAS_LEGACY_NAN (file_mips_opts.isa))
16947         mips_nan2008 = 0;
16948       else
16949         as_bad (_("`%s' does not support legacy NaN"),
16950                   mips_cpu_info_from_isa (file_mips_opts.isa)->name);
16951     }
16952   else
16953     as_bad (_("bad .nan directive"));
16954
16955   input_line_pointer += i;
16956   demand_empty_rest_of_line ();
16957 }
16958
16959 /* Handle a .stab[snd] directive.  Ideally these directives would be
16960    implemented in a transparent way, so that removing them would not
16961    have any effect on the generated instructions.  However, s_stab
16962    internally changes the section, so in practice we need to decide
16963    now whether the preceding label marks compressed code.  We do not
16964    support changing the compression mode of a label after a .stab*
16965    directive, such as in:
16966
16967    foo:
16968         .stabs ...
16969         .set mips16
16970
16971    so the current mode wins.  */
16972
16973 static void
16974 s_mips_stab (int type)
16975 {
16976   mips_mark_labels ();
16977   s_stab (type);
16978 }
16979
16980 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
16981
16982 static void
16983 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
16984 {
16985   char *name;
16986   int c;
16987   symbolS *symbolP;
16988   expressionS exp;
16989
16990   c = get_symbol_name (&name);
16991   symbolP = symbol_find_or_make (name);
16992   S_SET_WEAK (symbolP);
16993   *input_line_pointer = c;
16994
16995   SKIP_WHITESPACE_AFTER_NAME ();
16996
16997   if (! is_end_of_line[(unsigned char) *input_line_pointer])
16998     {
16999       if (S_IS_DEFINED (symbolP))
17000         {
17001           as_bad (_("ignoring attempt to redefine symbol %s"),
17002                   S_GET_NAME (symbolP));
17003           ignore_rest_of_line ();
17004           return;
17005         }
17006
17007       if (*input_line_pointer == ',')
17008         {
17009           ++input_line_pointer;
17010           SKIP_WHITESPACE ();
17011         }
17012
17013       expression (&exp);
17014       if (exp.X_op != O_symbol)
17015         {
17016           as_bad (_("bad .weakext directive"));
17017           ignore_rest_of_line ();
17018           return;
17019         }
17020       symbol_set_value_expression (symbolP, &exp);
17021     }
17022
17023   demand_empty_rest_of_line ();
17024 }
17025
17026 /* Parse a register string into a number.  Called from the ECOFF code
17027    to parse .frame.  The argument is non-zero if this is the frame
17028    register, so that we can record it in mips_frame_reg.  */
17029
17030 int
17031 tc_get_register (int frame)
17032 {
17033   unsigned int reg;
17034
17035   SKIP_WHITESPACE ();
17036   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
17037     reg = 0;
17038   if (frame)
17039     {
17040       mips_frame_reg = reg != 0 ? reg : SP;
17041       mips_frame_reg_valid = 1;
17042       mips_cprestore_valid = 0;
17043     }
17044   return reg;
17045 }
17046
17047 valueT
17048 md_section_align (asection *seg, valueT addr)
17049 {
17050   int align = bfd_get_section_alignment (stdoutput, seg);
17051
17052   /* We don't need to align ELF sections to the full alignment.
17053      However, Irix 5 may prefer that we align them at least to a 16
17054      byte boundary.  We don't bother to align the sections if we
17055      are targeted for an embedded system.  */
17056   if (strncmp (TARGET_OS, "elf", 3) == 0)
17057     return addr;
17058   if (align > 4)
17059     align = 4;
17060
17061   return ((addr + (1 << align) - 1) & -(1 << align));
17062 }
17063
17064 /* Utility routine, called from above as well.  If called while the
17065    input file is still being read, it's only an approximation.  (For
17066    example, a symbol may later become defined which appeared to be
17067    undefined earlier.)  */
17068
17069 static int
17070 nopic_need_relax (symbolS *sym, int before_relaxing)
17071 {
17072   if (sym == 0)
17073     return 0;
17074
17075   if (g_switch_value > 0)
17076     {
17077       const char *symname;
17078       int change;
17079
17080       /* Find out whether this symbol can be referenced off the $gp
17081          register.  It can be if it is smaller than the -G size or if
17082          it is in the .sdata or .sbss section.  Certain symbols can
17083          not be referenced off the $gp, although it appears as though
17084          they can.  */
17085       symname = S_GET_NAME (sym);
17086       if (symname != (const char *) NULL
17087           && (strcmp (symname, "eprol") == 0
17088               || strcmp (symname, "etext") == 0
17089               || strcmp (symname, "_gp") == 0
17090               || strcmp (symname, "edata") == 0
17091               || strcmp (symname, "_fbss") == 0
17092               || strcmp (symname, "_fdata") == 0
17093               || strcmp (symname, "_ftext") == 0
17094               || strcmp (symname, "end") == 0
17095               || strcmp (symname, "_gp_disp") == 0))
17096         change = 1;
17097       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
17098                && (0
17099 #ifndef NO_ECOFF_DEBUGGING
17100                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
17101                        && (symbol_get_obj (sym)->ecoff_extern_size
17102                            <= g_switch_value))
17103 #endif
17104                    /* We must defer this decision until after the whole
17105                       file has been read, since there might be a .extern
17106                       after the first use of this symbol.  */
17107                    || (before_relaxing
17108 #ifndef NO_ECOFF_DEBUGGING
17109                        && symbol_get_obj (sym)->ecoff_extern_size == 0
17110 #endif
17111                        && S_GET_VALUE (sym) == 0)
17112                    || (S_GET_VALUE (sym) != 0
17113                        && S_GET_VALUE (sym) <= g_switch_value)))
17114         change = 0;
17115       else
17116         {
17117           const char *segname;
17118
17119           segname = segment_name (S_GET_SEGMENT (sym));
17120           gas_assert (strcmp (segname, ".lit8") != 0
17121                   && strcmp (segname, ".lit4") != 0);
17122           change = (strcmp (segname, ".sdata") != 0
17123                     && strcmp (segname, ".sbss") != 0
17124                     && strncmp (segname, ".sdata.", 7) != 0
17125                     && strncmp (segname, ".sbss.", 6) != 0
17126                     && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
17127                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
17128         }
17129       return change;
17130     }
17131   else
17132     /* We are not optimizing for the $gp register.  */
17133     return 1;
17134 }
17135
17136
17137 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
17138
17139 static bfd_boolean
17140 pic_need_relax (symbolS *sym)
17141 {
17142   asection *symsec;
17143
17144   /* Handle the case of a symbol equated to another symbol.  */
17145   while (symbol_equated_reloc_p (sym))
17146     {
17147       symbolS *n;
17148
17149       /* It's possible to get a loop here in a badly written program.  */
17150       n = symbol_get_value_expression (sym)->X_add_symbol;
17151       if (n == sym)
17152         break;
17153       sym = n;
17154     }
17155
17156   if (symbol_section_p (sym))
17157     return TRUE;
17158
17159   symsec = S_GET_SEGMENT (sym);
17160
17161   /* This must duplicate the test in adjust_reloc_syms.  */
17162   return (!bfd_is_und_section (symsec)
17163           && !bfd_is_abs_section (symsec)
17164           && !bfd_is_com_section (symsec)
17165           /* A global or weak symbol is treated as external.  */
17166           && (!S_IS_WEAK (sym) && !S_IS_EXTERNAL (sym)));
17167 }
17168
17169
17170 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
17171    extended opcode.  SEC is the section the frag is in.  */
17172
17173 static int
17174 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
17175 {
17176   int type;
17177   const struct mips_int_operand *operand;
17178   offsetT val;
17179   segT symsec;
17180   fragS *sym_frag;
17181
17182   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
17183     return 0;
17184   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
17185     return 1;
17186
17187   symsec = S_GET_SEGMENT (fragp->fr_symbol);
17188   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
17189   operand = mips16_immed_operand (type, FALSE);
17190   if (S_FORCE_RELOC (fragp->fr_symbol, TRUE)
17191       || (operand->root.type == OP_PCREL
17192           ? sec != symsec
17193           : !bfd_is_abs_section (symsec)))
17194     return 1;
17195
17196   sym_frag = symbol_get_frag (fragp->fr_symbol);
17197   val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17198
17199   if (operand->root.type == OP_PCREL)
17200     {
17201       const struct mips_pcrel_operand *pcrel_op;
17202       addressT addr;
17203       offsetT maxtiny;
17204
17205       if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
17206         return 1;
17207
17208       pcrel_op = (const struct mips_pcrel_operand *) operand;
17209
17210       /* If the relax_marker of the symbol fragment differs from the
17211          relax_marker of this fragment, we have not yet adjusted the
17212          symbol fragment fr_address.  We want to add in STRETCH in
17213          order to get a better estimate of the address.  This
17214          particularly matters because of the shift bits.  */
17215       if (stretch != 0
17216           && sym_frag->relax_marker != fragp->relax_marker)
17217         {
17218           fragS *f;
17219
17220           /* Adjust stretch for any alignment frag.  Note that if have
17221              been expanding the earlier code, the symbol may be
17222              defined in what appears to be an earlier frag.  FIXME:
17223              This doesn't handle the fr_subtype field, which specifies
17224              a maximum number of bytes to skip when doing an
17225              alignment.  */
17226           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
17227             {
17228               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
17229                 {
17230                   if (stretch < 0)
17231                     stretch = - ((- stretch)
17232                                  & ~ ((1 << (int) f->fr_offset) - 1));
17233                   else
17234                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
17235                   if (stretch == 0)
17236                     break;
17237                 }
17238             }
17239           if (f != NULL)
17240             val += stretch;
17241         }
17242
17243       addr = fragp->fr_address + fragp->fr_fix;
17244
17245       /* The base address rules are complicated.  The base address of
17246          a branch is the following instruction.  The base address of a
17247          PC relative load or add is the instruction itself, but if it
17248          is in a delay slot (in which case it can not be extended) use
17249          the address of the instruction whose delay slot it is in.  */
17250       if (pcrel_op->include_isa_bit)
17251         {
17252           addr += 2;
17253
17254           /* If we are currently assuming that this frag should be
17255              extended, then, the current address is two bytes
17256              higher.  */
17257           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17258             addr += 2;
17259
17260           /* Ignore the low bit in the target, since it will be set
17261              for a text label.  */
17262           val &= -2;
17263         }
17264       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
17265         addr -= 4;
17266       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
17267         addr -= 2;
17268
17269       val -= addr & -(1 << pcrel_op->align_log2);
17270
17271       /* If any of the shifted bits are set, we must use an extended
17272          opcode.  If the address depends on the size of this
17273          instruction, this can lead to a loop, so we arrange to always
17274          use an extended opcode.  */
17275       if ((val & ((1 << operand->shift) - 1)) != 0)
17276         {
17277           fragp->fr_subtype =
17278             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17279           return 1;
17280         }
17281
17282       /* If we are about to mark a frag as extended because the value
17283          is precisely the next value above maxtiny, then there is a
17284          chance of an infinite loop as in the following code:
17285              la $4,foo
17286              .skip      1020
17287              .align     2
17288            foo:
17289          In this case when the la is extended, foo is 0x3fc bytes
17290          away, so the la can be shrunk, but then foo is 0x400 away, so
17291          the la must be extended.  To avoid this loop, we mark the
17292          frag as extended if it was small, and is about to become
17293          extended with the next value above maxtiny.  */
17294       maxtiny = mips_int_operand_max (operand);
17295       if (val == maxtiny + (1 << operand->shift)
17296           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17297         {
17298           fragp->fr_subtype =
17299             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17300           return 1;
17301         }
17302     }
17303
17304   return !mips16_immed_in_range_p (operand, BFD_RELOC_UNUSED, val);
17305 }
17306
17307 /* Compute the length of a branch sequence, and adjust the
17308    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
17309    worst-case length is computed, with UPDATE being used to indicate
17310    whether an unconditional (-1), branch-likely (+1) or regular (0)
17311    branch is to be computed.  */
17312 static int
17313 relaxed_branch_length (fragS *fragp, asection *sec, int update)
17314 {
17315   bfd_boolean toofar;
17316   int length;
17317
17318   if (fragp
17319       && S_IS_DEFINED (fragp->fr_symbol)
17320       && !S_IS_WEAK (fragp->fr_symbol)
17321       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17322     {
17323       addressT addr;
17324       offsetT val;
17325
17326       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17327
17328       addr = fragp->fr_address + fragp->fr_fix + 4;
17329
17330       val -= addr;
17331
17332       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
17333     }
17334   else
17335     /* If the symbol is not defined or it's in a different segment,
17336        we emit the long sequence.  */
17337     toofar = TRUE;
17338
17339   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
17340     fragp->fr_subtype
17341       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_AT (fragp->fr_subtype),
17342                              RELAX_BRANCH_UNCOND (fragp->fr_subtype),
17343                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
17344                              RELAX_BRANCH_LINK (fragp->fr_subtype),
17345                              toofar);
17346
17347   length = 4;
17348   if (toofar)
17349     {
17350       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
17351         length += 8;
17352
17353       if (mips_pic != NO_PIC)
17354         {
17355           /* Additional space for PIC loading of target address.  */
17356           length += 8;
17357           if (mips_opts.isa == ISA_MIPS1)
17358             /* Additional space for $at-stabilizing nop.  */
17359             length += 4;
17360         }
17361
17362       /* If branch is conditional.  */
17363       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
17364         length += 8;
17365     }
17366
17367   return length;
17368 }
17369
17370 /* Get a FRAG's branch instruction delay slot size, either from the
17371    short-delay-slot bit of a branch-and-link instruction if AL is TRUE,
17372    or SHORT_INSN_SIZE otherwise.  */
17373
17374 static int
17375 frag_branch_delay_slot_size (fragS *fragp, bfd_boolean al, int short_insn_size)
17376 {
17377   char *buf = fragp->fr_literal + fragp->fr_fix;
17378
17379   if (al)
17380     return (read_compressed_insn (buf, 4) & 0x02000000) ? 2 : 4;
17381   else
17382     return short_insn_size;
17383 }
17384
17385 /* Compute the length of a branch sequence, and adjust the
17386    RELAX_MICROMIPS_TOOFAR32 bit accordingly.  If FRAGP is NULL, the
17387    worst-case length is computed, with UPDATE being used to indicate
17388    whether an unconditional (-1), or regular (0) branch is to be
17389    computed.  */
17390
17391 static int
17392 relaxed_micromips_32bit_branch_length (fragS *fragp, asection *sec, int update)
17393 {
17394   bfd_boolean insn32 = TRUE;
17395   bfd_boolean nods = TRUE;
17396   bfd_boolean al = TRUE;
17397   int short_insn_size;
17398   bfd_boolean toofar;
17399   int length;
17400
17401   if (fragp)
17402     {
17403       insn32 = RELAX_MICROMIPS_INSN32 (fragp->fr_subtype);
17404       nods = RELAX_MICROMIPS_NODS (fragp->fr_subtype);
17405       al = RELAX_MICROMIPS_LINK (fragp->fr_subtype);
17406     }
17407   short_insn_size = insn32 ? 4 : 2;
17408
17409   if (fragp
17410       && S_IS_DEFINED (fragp->fr_symbol)
17411       && !S_IS_WEAK (fragp->fr_symbol)
17412       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17413     {
17414       addressT addr;
17415       offsetT val;
17416
17417       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17418       /* Ignore the low bit in the target, since it will be set
17419          for a text label.  */
17420       if ((val & 1) != 0)
17421         --val;
17422
17423       addr = fragp->fr_address + fragp->fr_fix + 4;
17424
17425       val -= addr;
17426
17427       toofar = val < - (0x8000 << 1) || val >= (0x8000 << 1);
17428     }
17429   else
17430     /* If the symbol is not defined or it's in a different segment,
17431        we emit the long sequence.  */
17432     toofar = TRUE;
17433
17434   if (fragp && update
17435       && toofar != RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
17436     fragp->fr_subtype = (toofar
17437                          ? RELAX_MICROMIPS_MARK_TOOFAR32 (fragp->fr_subtype)
17438                          : RELAX_MICROMIPS_CLEAR_TOOFAR32 (fragp->fr_subtype));
17439
17440   length = 4;
17441   if (toofar)
17442     {
17443       bfd_boolean compact_known = fragp != NULL;
17444       bfd_boolean compact = FALSE;
17445       bfd_boolean uncond;
17446
17447       if (fragp)
17448         {
17449           compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
17450           uncond = RELAX_MICROMIPS_UNCOND (fragp->fr_subtype);
17451         }
17452       else
17453         uncond = update < 0;
17454
17455       /* If label is out of range, we turn branch <br>:
17456
17457                 <br>    label                   # 4 bytes
17458             0:
17459
17460          into:
17461
17462                 j       label                   # 4 bytes
17463                 nop                             # 2/4 bytes if
17464                                                 #  compact && (!PIC || insn32)
17465             0:
17466        */
17467       if ((mips_pic == NO_PIC || insn32) && (!compact_known || compact))
17468         length += short_insn_size;
17469
17470       /* If assembling PIC code, we further turn:
17471
17472                         j       label                   # 4 bytes
17473
17474          into:
17475
17476                         lw/ld   at, %got(label)(gp)     # 4 bytes
17477                         d/addiu at, %lo(label)          # 4 bytes
17478                         jr/c    at                      # 2/4 bytes
17479        */
17480       if (mips_pic != NO_PIC)
17481         length += 4 + short_insn_size;
17482
17483       /* Add an extra nop if the jump has no compact form and we need
17484          to fill the delay slot.  */
17485       if ((mips_pic == NO_PIC || al) && nods)
17486         length += (fragp
17487                    ? frag_branch_delay_slot_size (fragp, al, short_insn_size)
17488                    : short_insn_size);
17489
17490       /* If branch <br> is conditional, we prepend negated branch <brneg>:
17491
17492                         <brneg> 0f                      # 4 bytes
17493                         nop                             # 2/4 bytes if !compact
17494        */
17495       if (!uncond)
17496         length += (compact_known && compact) ? 4 : 4 + short_insn_size;
17497     }
17498   else if (nods)
17499     {
17500       /* Add an extra nop to fill the delay slot.  */
17501       gas_assert (fragp);
17502       length += frag_branch_delay_slot_size (fragp, al, short_insn_size);
17503     }
17504
17505   return length;
17506 }
17507
17508 /* Compute the length of a branch, and adjust the RELAX_MICROMIPS_TOOFAR16
17509    bit accordingly.  */
17510
17511 static int
17512 relaxed_micromips_16bit_branch_length (fragS *fragp, asection *sec, int update)
17513 {
17514   bfd_boolean toofar;
17515
17516   if (fragp
17517       && S_IS_DEFINED (fragp->fr_symbol)
17518       && !S_IS_WEAK (fragp->fr_symbol)
17519       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17520     {
17521       addressT addr;
17522       offsetT val;
17523       int type;
17524
17525       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17526       /* Ignore the low bit in the target, since it will be set
17527          for a text label.  */
17528       if ((val & 1) != 0)
17529         --val;
17530
17531       /* Assume this is a 2-byte branch.  */
17532       addr = fragp->fr_address + fragp->fr_fix + 2;
17533
17534       /* We try to avoid the infinite loop by not adding 2 more bytes for
17535          long branches.  */
17536
17537       val -= addr;
17538
17539       type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
17540       if (type == 'D')
17541         toofar = val < - (0x200 << 1) || val >= (0x200 << 1);
17542       else if (type == 'E')
17543         toofar = val < - (0x40 << 1) || val >= (0x40 << 1);
17544       else
17545         abort ();
17546     }
17547   else
17548     /* If the symbol is not defined or it's in a different segment,
17549        we emit a normal 32-bit branch.  */
17550     toofar = TRUE;
17551
17552   if (fragp && update
17553       && toofar != RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
17554     fragp->fr_subtype
17555       = toofar ? RELAX_MICROMIPS_MARK_TOOFAR16 (fragp->fr_subtype)
17556                : RELAX_MICROMIPS_CLEAR_TOOFAR16 (fragp->fr_subtype);
17557
17558   if (toofar)
17559     return 4;
17560
17561   return 2;
17562 }
17563
17564 /* Estimate the size of a frag before relaxing.  Unless this is the
17565    mips16, we are not really relaxing here, and the final size is
17566    encoded in the subtype information.  For the mips16, we have to
17567    decide whether we are using an extended opcode or not.  */
17568
17569 int
17570 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
17571 {
17572   int change;
17573
17574   if (RELAX_BRANCH_P (fragp->fr_subtype))
17575     {
17576
17577       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
17578
17579       return fragp->fr_var;
17580     }
17581
17582   if (RELAX_MIPS16_P (fragp->fr_subtype))
17583     /* We don't want to modify the EXTENDED bit here; it might get us
17584        into infinite loops.  We change it only in mips_relax_frag().  */
17585     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
17586
17587   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17588     {
17589       int length = 4;
17590
17591       if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
17592         length = relaxed_micromips_16bit_branch_length (fragp, segtype, FALSE);
17593       if (length == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
17594         length = relaxed_micromips_32bit_branch_length (fragp, segtype, FALSE);
17595       fragp->fr_var = length;
17596
17597       return length;
17598     }
17599
17600   if (mips_pic == NO_PIC)
17601     change = nopic_need_relax (fragp->fr_symbol, 0);
17602   else if (mips_pic == SVR4_PIC)
17603     change = pic_need_relax (fragp->fr_symbol);
17604   else if (mips_pic == VXWORKS_PIC)
17605     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
17606     change = 0;
17607   else
17608     abort ();
17609
17610   if (change)
17611     {
17612       fragp->fr_subtype |= RELAX_USE_SECOND;
17613       return -RELAX_FIRST (fragp->fr_subtype);
17614     }
17615   else
17616     return -RELAX_SECOND (fragp->fr_subtype);
17617 }
17618
17619 /* This is called to see whether a reloc against a defined symbol
17620    should be converted into a reloc against a section.  */
17621
17622 int
17623 mips_fix_adjustable (fixS *fixp)
17624 {
17625   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
17626       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17627     return 0;
17628
17629   if (fixp->fx_addsy == NULL)
17630     return 1;
17631
17632   /* Allow relocs used for EH tables.  */
17633   if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
17634     return 1;
17635
17636   /* If symbol SYM is in a mergeable section, relocations of the form
17637      SYM + 0 can usually be made section-relative.  The mergeable data
17638      is then identified by the section offset rather than by the symbol.
17639
17640      However, if we're generating REL LO16 relocations, the offset is split
17641      between the LO16 and partnering high part relocation.  The linker will
17642      need to recalculate the complete offset in order to correctly identify
17643      the merge data.
17644
17645      The linker has traditionally not looked for the partnering high part
17646      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
17647      placed anywhere.  Rather than break backwards compatibility by changing
17648      this, it seems better not to force the issue, and instead keep the
17649      original symbol.  This will work with either linker behavior.  */
17650   if ((lo16_reloc_p (fixp->fx_r_type)
17651        || reloc_needs_lo_p (fixp->fx_r_type))
17652       && HAVE_IN_PLACE_ADDENDS
17653       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
17654     return 0;
17655
17656   /* There is no place to store an in-place offset for JALR relocations.  */
17657   if (jalr_reloc_p (fixp->fx_r_type) && HAVE_IN_PLACE_ADDENDS)
17658     return 0;
17659
17660   /* Likewise an in-range offset of limited PC-relative relocations may
17661      overflow the in-place relocatable field if recalculated against the
17662      start address of the symbol's containing section.
17663
17664      Also, PC relative relocations for MIPS R6 need to be symbol rather than
17665      section relative to allow linker relaxations to be performed later on.  */
17666   if (limited_pcrel_reloc_p (fixp->fx_r_type)
17667       && (HAVE_IN_PLACE_ADDENDS || ISA_IS_R6 (file_mips_opts.isa)))
17668     return 0;
17669
17670   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
17671      to a floating-point stub.  The same is true for non-R_MIPS16_26
17672      relocations against MIPS16 functions; in this case, the stub becomes
17673      the function's canonical address.
17674
17675      Floating-point stubs are stored in unique .mips16.call.* or
17676      .mips16.fn.* sections.  If a stub T for function F is in section S,
17677      the first relocation in section S must be against F; this is how the
17678      linker determines the target function.  All relocations that might
17679      resolve to T must also be against F.  We therefore have the following
17680      restrictions, which are given in an intentionally-redundant way:
17681
17682        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
17683           symbols.
17684
17685        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
17686           if that stub might be used.
17687
17688        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
17689           symbols.
17690
17691        4. We cannot reduce a stub's relocations against MIPS16 symbols if
17692           that stub might be used.
17693
17694      There is a further restriction:
17695
17696        5. We cannot reduce jump relocations (R_MIPS_26, R_MIPS16_26 or
17697           R_MICROMIPS_26_S1) or branch relocations (R_MIPS_PC26_S2,
17698           R_MIPS_PC21_S2, R_MIPS_PC16, R_MIPS16_PC16_S1,
17699           R_MICROMIPS_PC16_S1, R_MICROMIPS_PC10_S1 or R_MICROMIPS_PC7_S1)
17700           against MIPS16 or microMIPS symbols because we need to keep the
17701           MIPS16 or microMIPS symbol for the purpose of mode mismatch
17702           detection and JAL or BAL to JALX instruction conversion in the
17703           linker.
17704
17705      For simplicity, we deal with (3)-(4) by not reducing _any_ relocation
17706      against a MIPS16 symbol.  We deal with (5) by additionally leaving
17707      alone any jump and branch relocations against a microMIPS symbol.
17708
17709      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
17710      relocation against some symbol R, no relocation against R may be
17711      reduced.  (Note that this deals with (2) as well as (1) because
17712      relocations against global symbols will never be reduced on ELF
17713      targets.)  This approach is a little simpler than trying to detect
17714      stub sections, and gives the "all or nothing" per-symbol consistency
17715      that we have for MIPS16 symbols.  */
17716   if (fixp->fx_subsy == NULL
17717       && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
17718           || (ELF_ST_IS_MICROMIPS (S_GET_OTHER (fixp->fx_addsy))
17719               && (jmp_reloc_p (fixp->fx_r_type)
17720                   || b_reloc_p (fixp->fx_r_type)))
17721           || *symbol_get_tc (fixp->fx_addsy)))
17722     return 0;
17723
17724   return 1;
17725 }
17726
17727 /* Translate internal representation of relocation info to BFD target
17728    format.  */
17729
17730 arelent **
17731 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
17732 {
17733   static arelent *retval[4];
17734   arelent *reloc;
17735   bfd_reloc_code_real_type code;
17736
17737   memset (retval, 0, sizeof(retval));
17738   reloc = retval[0] = XCNEW (arelent);
17739   reloc->sym_ptr_ptr = XNEW (asymbol *);
17740   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
17741   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
17742
17743   if (fixp->fx_pcrel)
17744     {
17745       gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2
17746                   || fixp->fx_r_type == BFD_RELOC_MIPS16_16_PCREL_S1
17747                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
17748                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
17749                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1
17750                   || fixp->fx_r_type == BFD_RELOC_32_PCREL
17751                   || fixp->fx_r_type == BFD_RELOC_MIPS_21_PCREL_S2
17752                   || fixp->fx_r_type == BFD_RELOC_MIPS_26_PCREL_S2
17753                   || fixp->fx_r_type == BFD_RELOC_MIPS_18_PCREL_S3
17754                   || fixp->fx_r_type == BFD_RELOC_MIPS_19_PCREL_S2
17755                   || fixp->fx_r_type == BFD_RELOC_HI16_S_PCREL
17756                   || fixp->fx_r_type == BFD_RELOC_LO16_PCREL);
17757
17758       /* At this point, fx_addnumber is "symbol offset - pcrel address".
17759          Relocations want only the symbol offset.  */
17760       switch (fixp->fx_r_type)
17761         {
17762         case BFD_RELOC_MIPS_18_PCREL_S3:
17763           reloc->addend = fixp->fx_addnumber + (reloc->address & ~7);
17764           break;
17765         default:
17766           reloc->addend = fixp->fx_addnumber + reloc->address;
17767           break;
17768         }
17769     }
17770   else if (HAVE_IN_PLACE_ADDENDS
17771            && fixp->fx_r_type == BFD_RELOC_MICROMIPS_JMP
17772            && (read_compressed_insn (fixp->fx_frag->fr_literal
17773                                      + fixp->fx_where, 4) >> 26) == 0x3c)
17774     {
17775       /* Shift is 2, unusually, for microMIPS JALX.  Adjust the in-place
17776          addend accordingly.  */
17777       reloc->addend = fixp->fx_addnumber >> 1;
17778     }
17779   else
17780     reloc->addend = fixp->fx_addnumber;
17781
17782   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
17783      entry to be used in the relocation's section offset.  */
17784   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17785     {
17786       reloc->address = reloc->addend;
17787       reloc->addend = 0;
17788     }
17789
17790   code = fixp->fx_r_type;
17791
17792   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
17793   if (reloc->howto == NULL)
17794     {
17795       as_bad_where (fixp->fx_file, fixp->fx_line,
17796                     _("cannot represent %s relocation in this object file"
17797                       " format"),
17798                     bfd_get_reloc_code_name (code));
17799       retval[0] = NULL;
17800     }
17801
17802   return retval;
17803 }
17804
17805 /* Relax a machine dependent frag.  This returns the amount by which
17806    the current size of the frag should change.  */
17807
17808 int
17809 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
17810 {
17811   if (RELAX_BRANCH_P (fragp->fr_subtype))
17812     {
17813       offsetT old_var = fragp->fr_var;
17814
17815       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
17816
17817       return fragp->fr_var - old_var;
17818     }
17819
17820   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17821     {
17822       offsetT old_var = fragp->fr_var;
17823       offsetT new_var = 4;
17824
17825       if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
17826         new_var = relaxed_micromips_16bit_branch_length (fragp, sec, TRUE);
17827       if (new_var == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
17828         new_var = relaxed_micromips_32bit_branch_length (fragp, sec, TRUE);
17829       fragp->fr_var = new_var;
17830
17831       return new_var - old_var;
17832     }
17833
17834   if (! RELAX_MIPS16_P (fragp->fr_subtype))
17835     return 0;
17836
17837   if (mips16_extended_frag (fragp, sec, stretch))
17838     {
17839       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17840         return 0;
17841       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
17842       return 2;
17843     }
17844   else
17845     {
17846       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17847         return 0;
17848       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
17849       return -2;
17850     }
17851
17852   return 0;
17853 }
17854
17855 /* Convert a machine dependent frag.  */
17856
17857 void
17858 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
17859 {
17860   if (RELAX_BRANCH_P (fragp->fr_subtype))
17861     {
17862       char *buf;
17863       unsigned long insn;
17864       expressionS exp;
17865       fixS *fixp;
17866
17867       buf = fragp->fr_literal + fragp->fr_fix;
17868       insn = read_insn (buf);
17869
17870       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
17871         {
17872           /* We generate a fixup instead of applying it right now
17873              because, if there are linker relaxations, we're going to
17874              need the relocations.  */
17875           exp.X_op = O_symbol;
17876           exp.X_add_symbol = fragp->fr_symbol;
17877           exp.X_add_number = fragp->fr_offset;
17878
17879           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, TRUE,
17880                               BFD_RELOC_16_PCREL_S2);
17881           fixp->fx_file = fragp->fr_file;
17882           fixp->fx_line = fragp->fr_line;
17883
17884           buf = write_insn (buf, insn);
17885         }
17886       else
17887         {
17888           int i;
17889
17890           as_warn_where (fragp->fr_file, fragp->fr_line,
17891                          _("relaxed out-of-range branch into a jump"));
17892
17893           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
17894             goto uncond;
17895
17896           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
17897             {
17898               /* Reverse the branch.  */
17899               switch ((insn >> 28) & 0xf)
17900                 {
17901                 case 4:
17902                   if ((insn & 0xff000000) == 0x47000000
17903                       || (insn & 0xff600000) == 0x45600000)
17904                     {
17905                       /* BZ.df/BNZ.df, BZ.V/BNZ.V can have the condition
17906                          reversed by tweaking bit 23.  */
17907                       insn ^= 0x00800000;
17908                     }
17909                   else
17910                     {
17911                       /* bc[0-3][tf]l? instructions can have the condition
17912                          reversed by tweaking a single TF bit, and their
17913                          opcodes all have 0x4???????.  */
17914                       gas_assert ((insn & 0xf3e00000) == 0x41000000);
17915                       insn ^= 0x00010000;
17916                     }
17917                   break;
17918
17919                 case 0:
17920                   /* bltz       0x04000000      bgez    0x04010000
17921                      bltzal     0x04100000      bgezal  0x04110000  */
17922                   gas_assert ((insn & 0xfc0e0000) == 0x04000000);
17923                   insn ^= 0x00010000;
17924                   break;
17925
17926                 case 1:
17927                   /* beq        0x10000000      bne     0x14000000
17928                      blez       0x18000000      bgtz    0x1c000000  */
17929                   insn ^= 0x04000000;
17930                   break;
17931
17932                 default:
17933                   abort ();
17934                 }
17935             }
17936
17937           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
17938             {
17939               /* Clear the and-link bit.  */
17940               gas_assert ((insn & 0xfc1c0000) == 0x04100000);
17941
17942               /* bltzal         0x04100000      bgezal  0x04110000
17943                  bltzall        0x04120000      bgezall 0x04130000  */
17944               insn &= ~0x00100000;
17945             }
17946
17947           /* Branch over the branch (if the branch was likely) or the
17948              full jump (not likely case).  Compute the offset from the
17949              current instruction to branch to.  */
17950           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
17951             i = 16;
17952           else
17953             {
17954               /* How many bytes in instructions we've already emitted?  */
17955               i = buf - fragp->fr_literal - fragp->fr_fix;
17956               /* How many bytes in instructions from here to the end?  */
17957               i = fragp->fr_var - i;
17958             }
17959           /* Convert to instruction count.  */
17960           i >>= 2;
17961           /* Branch counts from the next instruction.  */
17962           i--;
17963           insn |= i;
17964           /* Branch over the jump.  */
17965           buf = write_insn (buf, insn);
17966
17967           /* nop */
17968           buf = write_insn (buf, 0);
17969
17970           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
17971             {
17972               /* beql $0, $0, 2f */
17973               insn = 0x50000000;
17974               /* Compute the PC offset from the current instruction to
17975                  the end of the variable frag.  */
17976               /* How many bytes in instructions we've already emitted?  */
17977               i = buf - fragp->fr_literal - fragp->fr_fix;
17978               /* How many bytes in instructions from here to the end?  */
17979               i = fragp->fr_var - i;
17980               /* Convert to instruction count.  */
17981               i >>= 2;
17982               /* Don't decrement i, because we want to branch over the
17983                  delay slot.  */
17984               insn |= i;
17985
17986               buf = write_insn (buf, insn);
17987               buf = write_insn (buf, 0);
17988             }
17989
17990         uncond:
17991           if (mips_pic == NO_PIC)
17992             {
17993               /* j or jal.  */
17994               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
17995                       ? 0x0c000000 : 0x08000000);
17996               exp.X_op = O_symbol;
17997               exp.X_add_symbol = fragp->fr_symbol;
17998               exp.X_add_number = fragp->fr_offset;
17999
18000               fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18001                                   FALSE, BFD_RELOC_MIPS_JMP);
18002               fixp->fx_file = fragp->fr_file;
18003               fixp->fx_line = fragp->fr_line;
18004
18005               buf = write_insn (buf, insn);
18006             }
18007           else
18008             {
18009               unsigned long at = RELAX_BRANCH_AT (fragp->fr_subtype);
18010
18011               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
18012               insn = HAVE_64BIT_ADDRESSES ? 0xdf800000 : 0x8f800000;
18013               insn |= at << OP_SH_RT;
18014               exp.X_op = O_symbol;
18015               exp.X_add_symbol = fragp->fr_symbol;
18016               exp.X_add_number = fragp->fr_offset;
18017
18018               if (fragp->fr_offset)
18019                 {
18020                   exp.X_add_symbol = make_expr_symbol (&exp);
18021                   exp.X_add_number = 0;
18022                 }
18023
18024               fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18025                                   FALSE, BFD_RELOC_MIPS_GOT16);
18026               fixp->fx_file = fragp->fr_file;
18027               fixp->fx_line = fragp->fr_line;
18028
18029               buf = write_insn (buf, insn);
18030
18031               if (mips_opts.isa == ISA_MIPS1)
18032                 /* nop */
18033                 buf = write_insn (buf, 0);
18034
18035               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
18036               insn = HAVE_64BIT_ADDRESSES ? 0x64000000 : 0x24000000;
18037               insn |= at << OP_SH_RS | at << OP_SH_RT;
18038
18039               fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18040                                   FALSE, BFD_RELOC_LO16);
18041               fixp->fx_file = fragp->fr_file;
18042               fixp->fx_line = fragp->fr_line;
18043
18044               buf = write_insn (buf, insn);
18045
18046               /* j(al)r $at.  */
18047               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
18048                 insn = 0x0000f809;
18049               else
18050                 insn = 0x00000008;
18051               insn |= at << OP_SH_RS;
18052
18053               buf = write_insn (buf, insn);
18054             }
18055         }
18056
18057       fragp->fr_fix += fragp->fr_var;
18058       gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18059       return;
18060     }
18061
18062   /* Relax microMIPS branches.  */
18063   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
18064     {
18065       char *buf = fragp->fr_literal + fragp->fr_fix;
18066       bfd_boolean compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
18067       bfd_boolean insn32 = RELAX_MICROMIPS_INSN32 (fragp->fr_subtype);
18068       bfd_boolean nods = RELAX_MICROMIPS_NODS (fragp->fr_subtype);
18069       bfd_boolean al = RELAX_MICROMIPS_LINK (fragp->fr_subtype);
18070       int type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
18071       bfd_boolean short_ds;
18072       unsigned long insn;
18073       expressionS exp;
18074       fixS *fixp;
18075
18076       exp.X_op = O_symbol;
18077       exp.X_add_symbol = fragp->fr_symbol;
18078       exp.X_add_number = fragp->fr_offset;
18079
18080       fragp->fr_fix += fragp->fr_var;
18081
18082       /* Handle 16-bit branches that fit or are forced to fit.  */
18083       if (type != 0 && !RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
18084         {
18085           /* We generate a fixup instead of applying it right now,
18086              because if there is linker relaxation, we're going to
18087              need the relocations.  */
18088           if (type == 'D')
18089             fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 2, &exp, TRUE,
18090                                 BFD_RELOC_MICROMIPS_10_PCREL_S1);
18091           else if (type == 'E')
18092             fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 2, &exp, TRUE,
18093                                 BFD_RELOC_MICROMIPS_7_PCREL_S1);
18094           else
18095             abort ();
18096
18097           fixp->fx_file = fragp->fr_file;
18098           fixp->fx_line = fragp->fr_line;
18099
18100           /* These relocations can have an addend that won't fit in
18101              2 octets.  */
18102           fixp->fx_no_overflow = 1;
18103
18104           return;
18105         }
18106
18107       /* Handle 32-bit branches that fit or are forced to fit.  */
18108       if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
18109           || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
18110         {
18111           /* We generate a fixup instead of applying it right now,
18112              because if there is linker relaxation, we're going to
18113              need the relocations.  */
18114           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, TRUE,
18115                               BFD_RELOC_MICROMIPS_16_PCREL_S1);
18116           fixp->fx_file = fragp->fr_file;
18117           fixp->fx_line = fragp->fr_line;
18118
18119           if (type == 0)
18120             {
18121               insn = read_compressed_insn (buf, 4);
18122               buf += 4;
18123
18124               if (nods)
18125                 {
18126                   /* Check the short-delay-slot bit.  */
18127                   if (!al || (insn & 0x02000000) != 0)
18128                     buf = write_compressed_insn (buf, 0x0c00, 2);
18129                   else
18130                     buf = write_compressed_insn (buf, 0x00000000, 4);
18131                 }
18132
18133               gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18134               return;
18135             }
18136         }
18137
18138       /* Relax 16-bit branches to 32-bit branches.  */
18139       if (type != 0)
18140         {
18141           insn = read_compressed_insn (buf, 2);
18142
18143           if ((insn & 0xfc00) == 0xcc00)                /* b16  */
18144             insn = 0x94000000;                          /* beq  */
18145           else if ((insn & 0xdc00) == 0x8c00)           /* beqz16/bnez16  */
18146             {
18147               unsigned long regno;
18148
18149               regno = (insn >> MICROMIPSOP_SH_MD) & MICROMIPSOP_MASK_MD;
18150               regno = micromips_to_32_reg_d_map [regno];
18151               insn = ((insn & 0x2000) << 16) | 0x94000000;      /* beq/bne  */
18152               insn |= regno << MICROMIPSOP_SH_RS;
18153             }
18154           else
18155             abort ();
18156
18157           /* Nothing else to do, just write it out.  */
18158           if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
18159               || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
18160             {
18161               buf = write_compressed_insn (buf, insn, 4);
18162               if (nods)
18163                 buf = write_compressed_insn (buf, 0x0c00, 2);
18164               gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18165               return;
18166             }
18167         }
18168       else
18169         insn = read_compressed_insn (buf, 4);
18170
18171       /* Relax 32-bit branches to a sequence of instructions.  */
18172       as_warn_where (fragp->fr_file, fragp->fr_line,
18173                      _("relaxed out-of-range branch into a jump"));
18174
18175       /* Set the short-delay-slot bit.  */
18176       short_ds = !al || (insn & 0x02000000) != 0;
18177
18178       if (!RELAX_MICROMIPS_UNCOND (fragp->fr_subtype))
18179         {
18180           symbolS *l;
18181
18182           /* Reverse the branch.  */
18183           if ((insn & 0xfc000000) == 0x94000000                 /* beq  */
18184               || (insn & 0xfc000000) == 0xb4000000)             /* bne  */
18185             insn ^= 0x20000000;
18186           else if ((insn & 0xffe00000) == 0x40000000            /* bltz  */
18187                    || (insn & 0xffe00000) == 0x40400000         /* bgez  */
18188                    || (insn & 0xffe00000) == 0x40800000         /* blez  */
18189                    || (insn & 0xffe00000) == 0x40c00000         /* bgtz  */
18190                    || (insn & 0xffe00000) == 0x40a00000         /* bnezc  */
18191                    || (insn & 0xffe00000) == 0x40e00000         /* beqzc  */
18192                    || (insn & 0xffe00000) == 0x40200000         /* bltzal  */
18193                    || (insn & 0xffe00000) == 0x40600000         /* bgezal  */
18194                    || (insn & 0xffe00000) == 0x42200000         /* bltzals  */
18195                    || (insn & 0xffe00000) == 0x42600000)        /* bgezals  */
18196             insn ^= 0x00400000;
18197           else if ((insn & 0xffe30000) == 0x43800000            /* bc1f  */
18198                    || (insn & 0xffe30000) == 0x43a00000         /* bc1t  */
18199                    || (insn & 0xffe30000) == 0x42800000         /* bc2f  */
18200                    || (insn & 0xffe30000) == 0x42a00000)        /* bc2t  */
18201             insn ^= 0x00200000;
18202           else if ((insn & 0xff000000) == 0x83000000            /* BZ.df
18203                                                                    BNZ.df  */
18204                     || (insn & 0xff600000) == 0x81600000)       /* BZ.V
18205                                                                    BNZ.V */
18206             insn ^= 0x00800000;
18207           else
18208             abort ();
18209
18210           if (al)
18211             {
18212               /* Clear the and-link and short-delay-slot bits.  */
18213               gas_assert ((insn & 0xfda00000) == 0x40200000);
18214
18215               /* bltzal  0x40200000     bgezal  0x40600000  */
18216               /* bltzals 0x42200000     bgezals 0x42600000  */
18217               insn &= ~0x02200000;
18218             }
18219
18220           /* Make a label at the end for use with the branch.  */
18221           l = symbol_new (micromips_label_name (), asec, fragp->fr_fix, fragp);
18222           micromips_label_inc ();
18223           S_SET_OTHER (l, ELF_ST_SET_MICROMIPS (S_GET_OTHER (l)));
18224
18225           /* Refer to it.  */
18226           fixp = fix_new (fragp, buf - fragp->fr_literal, 4, l, 0, TRUE,
18227                           BFD_RELOC_MICROMIPS_16_PCREL_S1);
18228           fixp->fx_file = fragp->fr_file;
18229           fixp->fx_line = fragp->fr_line;
18230
18231           /* Branch over the jump.  */
18232           buf = write_compressed_insn (buf, insn, 4);
18233
18234           if (!compact)
18235             {
18236               /* nop  */
18237               if (insn32)
18238                 buf = write_compressed_insn (buf, 0x00000000, 4);
18239               else
18240                 buf = write_compressed_insn (buf, 0x0c00, 2);
18241             }
18242         }
18243
18244       if (mips_pic == NO_PIC)
18245         {
18246           unsigned long jal = (short_ds || nods
18247                                ? 0x74000000 : 0xf4000000);      /* jal/s  */
18248
18249           /* j/jal/jals <sym>  R_MICROMIPS_26_S1  */
18250           insn = al ? jal : 0xd4000000;
18251
18252           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18253                               BFD_RELOC_MICROMIPS_JMP);
18254           fixp->fx_file = fragp->fr_file;
18255           fixp->fx_line = fragp->fr_line;
18256
18257           buf = write_compressed_insn (buf, insn, 4);
18258
18259           if (compact || nods)
18260             {
18261               /* nop  */
18262               if (insn32)
18263                 buf = write_compressed_insn (buf, 0x00000000, 4);
18264               else
18265                 buf = write_compressed_insn (buf, 0x0c00, 2);
18266             }
18267         }
18268       else
18269         {
18270           unsigned long at = RELAX_MICROMIPS_AT (fragp->fr_subtype);
18271
18272           /* lw/ld $at, <sym>($gp)  R_MICROMIPS_GOT16  */
18273           insn = HAVE_64BIT_ADDRESSES ? 0xdc1c0000 : 0xfc1c0000;
18274           insn |= at << MICROMIPSOP_SH_RT;
18275
18276           if (exp.X_add_number)
18277             {
18278               exp.X_add_symbol = make_expr_symbol (&exp);
18279               exp.X_add_number = 0;
18280             }
18281
18282           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18283                               BFD_RELOC_MICROMIPS_GOT16);
18284           fixp->fx_file = fragp->fr_file;
18285           fixp->fx_line = fragp->fr_line;
18286
18287           buf = write_compressed_insn (buf, insn, 4);
18288
18289           /* d/addiu $at, $at, <sym>  R_MICROMIPS_LO16  */
18290           insn = HAVE_64BIT_ADDRESSES ? 0x5c000000 : 0x30000000;
18291           insn |= at << MICROMIPSOP_SH_RT | at << MICROMIPSOP_SH_RS;
18292
18293           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18294                               BFD_RELOC_MICROMIPS_LO16);
18295           fixp->fx_file = fragp->fr_file;
18296           fixp->fx_line = fragp->fr_line;
18297
18298           buf = write_compressed_insn (buf, insn, 4);
18299
18300           if (insn32)
18301             {
18302               /* jr/jalr $at  */
18303               insn = 0x00000f3c | (al ? RA : ZERO) << MICROMIPSOP_SH_RT;
18304               insn |= at << MICROMIPSOP_SH_RS;
18305
18306               buf = write_compressed_insn (buf, insn, 4);
18307
18308               if (compact || nods)
18309                 /* nop  */
18310                 buf = write_compressed_insn (buf, 0x00000000, 4);
18311             }
18312           else
18313             {
18314               /* jr/jrc/jalr/jalrs $at  */
18315               unsigned long jalr = short_ds ? 0x45e0 : 0x45c0;  /* jalr/s  */
18316               unsigned long jr = compact || nods ? 0x45a0 : 0x4580; /* jr/c  */
18317
18318               insn = al ? jalr : jr;
18319               insn |= at << MICROMIPSOP_SH_MJ;
18320
18321               buf = write_compressed_insn (buf, insn, 2);
18322               if (al && nods)
18323                 {
18324                   /* nop  */
18325                   if (short_ds)
18326                     buf = write_compressed_insn (buf, 0x0c00, 2);
18327                   else
18328                     buf = write_compressed_insn (buf, 0x00000000, 4);
18329                 }
18330             }
18331         }
18332
18333       gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18334       return;
18335     }
18336
18337   if (RELAX_MIPS16_P (fragp->fr_subtype))
18338     {
18339       int type;
18340       const struct mips_int_operand *operand;
18341       offsetT val;
18342       char *buf;
18343       unsigned int user_length, length;
18344       bfd_boolean need_reloc;
18345       unsigned long insn;
18346       bfd_boolean ext;
18347       segT symsec;
18348
18349       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
18350       operand = mips16_immed_operand (type, FALSE);
18351
18352       ext = RELAX_MIPS16_EXTENDED (fragp->fr_subtype);
18353       val = resolve_symbol_value (fragp->fr_symbol) + fragp->fr_offset;
18354
18355       symsec = S_GET_SEGMENT (fragp->fr_symbol);
18356       need_reloc = (S_FORCE_RELOC (fragp->fr_symbol, TRUE)
18357                     || (operand->root.type == OP_PCREL
18358                         ? asec != symsec
18359                         : !bfd_is_abs_section (symsec)));
18360
18361       if (operand->root.type == OP_PCREL)
18362         {
18363           const struct mips_pcrel_operand *pcrel_op;
18364           addressT addr;
18365
18366           pcrel_op = (const struct mips_pcrel_operand *) operand;
18367           addr = fragp->fr_address + fragp->fr_fix;
18368
18369           /* The rules for the base address of a PC relative reloc are
18370              complicated; see mips16_extended_frag.  */
18371           if (pcrel_op->include_isa_bit)
18372             {
18373               if (!need_reloc)
18374                 {
18375                   if (!ELF_ST_IS_MIPS16 (S_GET_OTHER (fragp->fr_symbol)))
18376                     as_bad_where (fragp->fr_file, fragp->fr_line,
18377                                   _("branch to a symbol in another ISA mode"));
18378                   else if ((fragp->fr_offset & 0x1) != 0)
18379                     as_bad_where (fragp->fr_file, fragp->fr_line,
18380                                   _("branch to misaligned address (0x%lx)"),
18381                                   (long) val);
18382                 }
18383               addr += 2;
18384               if (ext)
18385                 addr += 2;
18386               /* Ignore the low bit in the target, since it will be
18387                  set for a text label.  */
18388               val &= -2;
18389             }
18390           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
18391             addr -= 4;
18392           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
18393             addr -= 2;
18394
18395           addr &= -(1 << pcrel_op->align_log2);
18396           val -= addr;
18397
18398           /* Make sure the section winds up with the alignment we have
18399              assumed.  */
18400           if (operand->shift > 0)
18401             record_alignment (asec, operand->shift);
18402         }
18403
18404       if (ext
18405           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
18406               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
18407         as_warn_where (fragp->fr_file, fragp->fr_line,
18408                        _("extended instruction in delay slot"));
18409
18410       buf = fragp->fr_literal + fragp->fr_fix;
18411
18412       insn = read_compressed_insn (buf, 2);
18413       if (ext)
18414         insn |= MIPS16_EXTEND;
18415
18416       if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
18417         user_length = 4;
18418       else if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
18419         user_length = 2;
18420       else
18421         user_length = 0;
18422
18423       if (need_reloc)
18424         {
18425           bfd_reloc_code_real_type reloc = BFD_RELOC_NONE;
18426           expressionS exp;
18427           fixS *fixp;
18428
18429           switch (type)
18430             {
18431             case 'p':
18432             case 'q':
18433               reloc = BFD_RELOC_MIPS16_16_PCREL_S1;
18434               break;
18435             default:
18436               as_bad_where (fragp->fr_file, fragp->fr_line,
18437                             _("unsupported relocation"));
18438               break;
18439             }
18440           if (reloc == BFD_RELOC_NONE)
18441             ;
18442           else if (ext)
18443             {
18444               exp.X_op = O_symbol;
18445               exp.X_add_symbol = fragp->fr_symbol;
18446               exp.X_add_number = fragp->fr_offset;
18447
18448               fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 2, &exp,
18449                                   TRUE, reloc);
18450
18451               fixp->fx_file = fragp->fr_file;
18452               fixp->fx_line = fragp->fr_line;
18453
18454               /* These relocations can have an addend that won't fit
18455                  in 2 octets.  */
18456               fixp->fx_no_overflow = 1;
18457             }
18458           else
18459             as_bad_where (fragp->fr_file, fragp->fr_line,
18460                           _("invalid unextended operand value"));
18461         }
18462       else
18463         mips16_immed (fragp->fr_file, fragp->fr_line, type,
18464                       BFD_RELOC_UNUSED, val, user_length, &insn);
18465
18466       length = (ext ? 4 : 2);
18467       gas_assert (mips16_opcode_length (insn) == length);
18468       write_compressed_insn (buf, insn, length);
18469       fragp->fr_fix += length;
18470     }
18471   else
18472     {
18473       relax_substateT subtype = fragp->fr_subtype;
18474       bfd_boolean second_longer = (subtype & RELAX_SECOND_LONGER) != 0;
18475       bfd_boolean use_second = (subtype & RELAX_USE_SECOND) != 0;
18476       int first, second;
18477       fixS *fixp;
18478
18479       first = RELAX_FIRST (subtype);
18480       second = RELAX_SECOND (subtype);
18481       fixp = (fixS *) fragp->fr_opcode;
18482
18483       /* If the delay slot chosen does not match the size of the instruction,
18484          then emit a warning.  */
18485       if ((!use_second && (subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0)
18486            || (use_second && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0))
18487         {
18488           relax_substateT s;
18489           const char *msg;
18490
18491           s = subtype & (RELAX_DELAY_SLOT_16BIT
18492                          | RELAX_DELAY_SLOT_SIZE_FIRST
18493                          | RELAX_DELAY_SLOT_SIZE_SECOND);
18494           msg = macro_warning (s);
18495           if (msg != NULL)
18496             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18497           subtype &= ~s;
18498         }
18499
18500       /* Possibly emit a warning if we've chosen the longer option.  */
18501       if (use_second == second_longer)
18502         {
18503           relax_substateT s;
18504           const char *msg;
18505
18506           s = (subtype
18507                & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT));
18508           msg = macro_warning (s);
18509           if (msg != NULL)
18510             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18511           subtype &= ~s;
18512         }
18513
18514       /* Go through all the fixups for the first sequence.  Disable them
18515          (by marking them as done) if we're going to use the second
18516          sequence instead.  */
18517       while (fixp
18518              && fixp->fx_frag == fragp
18519              && fixp->fx_where < fragp->fr_fix - second)
18520         {
18521           if (subtype & RELAX_USE_SECOND)
18522             fixp->fx_done = 1;
18523           fixp = fixp->fx_next;
18524         }
18525
18526       /* Go through the fixups for the second sequence.  Disable them if
18527          we're going to use the first sequence, otherwise adjust their
18528          addresses to account for the relaxation.  */
18529       while (fixp && fixp->fx_frag == fragp)
18530         {
18531           if (subtype & RELAX_USE_SECOND)
18532             fixp->fx_where -= first;
18533           else
18534             fixp->fx_done = 1;
18535           fixp = fixp->fx_next;
18536         }
18537
18538       /* Now modify the frag contents.  */
18539       if (subtype & RELAX_USE_SECOND)
18540         {
18541           char *start;
18542
18543           start = fragp->fr_literal + fragp->fr_fix - first - second;
18544           memmove (start, start + first, second);
18545           fragp->fr_fix -= first;
18546         }
18547       else
18548         fragp->fr_fix -= second;
18549     }
18550 }
18551
18552 /* This function is called after the relocs have been generated.
18553    We've been storing mips16 text labels as odd.  Here we convert them
18554    back to even for the convenience of the debugger.  */
18555
18556 void
18557 mips_frob_file_after_relocs (void)
18558 {
18559   asymbol **syms;
18560   unsigned int count, i;
18561
18562   syms = bfd_get_outsymbols (stdoutput);
18563   count = bfd_get_symcount (stdoutput);
18564   for (i = 0; i < count; i++, syms++)
18565     if (ELF_ST_IS_COMPRESSED (elf_symbol (*syms)->internal_elf_sym.st_other)
18566         && ((*syms)->value & 1) != 0)
18567       {
18568         (*syms)->value &= ~1;
18569         /* If the symbol has an odd size, it was probably computed
18570            incorrectly, so adjust that as well.  */
18571         if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
18572           ++elf_symbol (*syms)->internal_elf_sym.st_size;
18573       }
18574 }
18575
18576 /* This function is called whenever a label is defined, including fake
18577    labels instantiated off the dot special symbol.  It is used when
18578    handling branch delays; if a branch has a label, we assume we cannot
18579    move it.  This also bumps the value of the symbol by 1 in compressed
18580    code.  */
18581
18582 static void
18583 mips_record_label (symbolS *sym)
18584 {
18585   segment_info_type *si = seg_info (now_seg);
18586   struct insn_label_list *l;
18587
18588   if (free_insn_labels == NULL)
18589     l = XNEW (struct insn_label_list);
18590   else
18591     {
18592       l = free_insn_labels;
18593       free_insn_labels = l->next;
18594     }
18595
18596   l->label = sym;
18597   l->next = si->label_list;
18598   si->label_list = l;
18599 }
18600
18601 /* This function is called as tc_frob_label() whenever a label is defined
18602    and adds a DWARF-2 record we only want for true labels.  */
18603
18604 void
18605 mips_define_label (symbolS *sym)
18606 {
18607   mips_record_label (sym);
18608   dwarf2_emit_label (sym);
18609 }
18610
18611 /* This function is called by tc_new_dot_label whenever a new dot symbol
18612    is defined.  */
18613
18614 void
18615 mips_add_dot_label (symbolS *sym)
18616 {
18617   mips_record_label (sym);
18618   if (mips_assembling_insn && HAVE_CODE_COMPRESSION)
18619     mips_compressed_mark_label (sym);
18620 }
18621 \f
18622 /* Converting ASE flags from internal to .MIPS.abiflags values.  */
18623 static unsigned int
18624 mips_convert_ase_flags (int ase)
18625 {
18626   unsigned int ext_ases = 0;
18627
18628   if (ase & ASE_DSP)
18629     ext_ases |= AFL_ASE_DSP;
18630   if (ase & ASE_DSPR2)
18631     ext_ases |= AFL_ASE_DSPR2;
18632   if (ase & ASE_DSPR3)
18633     ext_ases |= AFL_ASE_DSPR3;
18634   if (ase & ASE_EVA)
18635     ext_ases |= AFL_ASE_EVA;
18636   if (ase & ASE_MCU)
18637     ext_ases |= AFL_ASE_MCU;
18638   if (ase & ASE_MDMX)
18639     ext_ases |= AFL_ASE_MDMX;
18640   if (ase & ASE_MIPS3D)
18641     ext_ases |= AFL_ASE_MIPS3D;
18642   if (ase & ASE_MT)
18643     ext_ases |= AFL_ASE_MT;
18644   if (ase & ASE_SMARTMIPS)
18645     ext_ases |= AFL_ASE_SMARTMIPS;
18646   if (ase & ASE_VIRT)
18647     ext_ases |= AFL_ASE_VIRT;
18648   if (ase & ASE_MSA)
18649     ext_ases |= AFL_ASE_MSA;
18650   if (ase & ASE_XPA)
18651     ext_ases |= AFL_ASE_XPA;
18652
18653   return ext_ases;
18654 }
18655 /* Some special processing for a MIPS ELF file.  */
18656
18657 void
18658 mips_elf_final_processing (void)
18659 {
18660   int fpabi;
18661   Elf_Internal_ABIFlags_v0 flags;
18662
18663   flags.version = 0;
18664   flags.isa_rev = 0;
18665   switch (file_mips_opts.isa)
18666     {
18667     case INSN_ISA1:
18668       flags.isa_level = 1;
18669       break;
18670     case INSN_ISA2:
18671       flags.isa_level = 2;
18672       break;
18673     case INSN_ISA3:
18674       flags.isa_level = 3;
18675       break;
18676     case INSN_ISA4:
18677       flags.isa_level = 4;
18678       break;
18679     case INSN_ISA5:
18680       flags.isa_level = 5;
18681       break;
18682     case INSN_ISA32:
18683       flags.isa_level = 32;
18684       flags.isa_rev = 1;
18685       break;
18686     case INSN_ISA32R2:
18687       flags.isa_level = 32;
18688       flags.isa_rev = 2;
18689       break;
18690     case INSN_ISA32R3:
18691       flags.isa_level = 32;
18692       flags.isa_rev = 3;
18693       break;
18694     case INSN_ISA32R5:
18695       flags.isa_level = 32;
18696       flags.isa_rev = 5;
18697       break;
18698     case INSN_ISA32R6:
18699       flags.isa_level = 32;
18700       flags.isa_rev = 6;
18701       break;
18702     case INSN_ISA64:
18703       flags.isa_level = 64;
18704       flags.isa_rev = 1;
18705       break;
18706     case INSN_ISA64R2:
18707       flags.isa_level = 64;
18708       flags.isa_rev = 2;
18709       break;
18710     case INSN_ISA64R3:
18711       flags.isa_level = 64;
18712       flags.isa_rev = 3;
18713       break;
18714     case INSN_ISA64R5:
18715       flags.isa_level = 64;
18716       flags.isa_rev = 5;
18717       break;
18718     case INSN_ISA64R6:
18719       flags.isa_level = 64;
18720       flags.isa_rev = 6;
18721       break;
18722     }
18723
18724   flags.gpr_size = file_mips_opts.gp == 32 ? AFL_REG_32 : AFL_REG_64;
18725   flags.cpr1_size = file_mips_opts.soft_float ? AFL_REG_NONE
18726                     : (file_mips_opts.ase & ASE_MSA) ? AFL_REG_128
18727                     : (file_mips_opts.fp == 64) ? AFL_REG_64
18728                     : AFL_REG_32;
18729   flags.cpr2_size = AFL_REG_NONE;
18730   flags.fp_abi = bfd_elf_get_obj_attr_int (stdoutput, OBJ_ATTR_GNU,
18731                                            Tag_GNU_MIPS_ABI_FP);
18732   flags.isa_ext = bfd_mips_isa_ext (stdoutput);
18733   flags.ases = mips_convert_ase_flags (file_mips_opts.ase);
18734   if (file_ase_mips16)
18735     flags.ases |= AFL_ASE_MIPS16;
18736   if (file_ase_micromips)
18737     flags.ases |= AFL_ASE_MICROMIPS;
18738   flags.flags1 = 0;
18739   if ((ISA_HAS_ODD_SINGLE_FPR (file_mips_opts.isa, file_mips_opts.arch)
18740        || file_mips_opts.fp == 64)
18741       && file_mips_opts.oddspreg)
18742     flags.flags1 |= AFL_FLAGS1_ODDSPREG;
18743   flags.flags2 = 0;
18744
18745   bfd_mips_elf_swap_abiflags_v0_out (stdoutput, &flags,
18746                                      ((Elf_External_ABIFlags_v0 *)
18747                                      mips_flags_frag));
18748
18749   /* Write out the register information.  */
18750   if (mips_abi != N64_ABI)
18751     {
18752       Elf32_RegInfo s;
18753
18754       s.ri_gprmask = mips_gprmask;
18755       s.ri_cprmask[0] = mips_cprmask[0];
18756       s.ri_cprmask[1] = mips_cprmask[1];
18757       s.ri_cprmask[2] = mips_cprmask[2];
18758       s.ri_cprmask[3] = mips_cprmask[3];
18759       /* The gp_value field is set by the MIPS ELF backend.  */
18760
18761       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
18762                                        ((Elf32_External_RegInfo *)
18763                                         mips_regmask_frag));
18764     }
18765   else
18766     {
18767       Elf64_Internal_RegInfo s;
18768
18769       s.ri_gprmask = mips_gprmask;
18770       s.ri_pad = 0;
18771       s.ri_cprmask[0] = mips_cprmask[0];
18772       s.ri_cprmask[1] = mips_cprmask[1];
18773       s.ri_cprmask[2] = mips_cprmask[2];
18774       s.ri_cprmask[3] = mips_cprmask[3];
18775       /* The gp_value field is set by the MIPS ELF backend.  */
18776
18777       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
18778                                        ((Elf64_External_RegInfo *)
18779                                         mips_regmask_frag));
18780     }
18781
18782   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
18783      sort of BFD interface for this.  */
18784   if (mips_any_noreorder)
18785     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
18786   if (mips_pic != NO_PIC)
18787     {
18788       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
18789       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18790     }
18791   if (mips_abicalls)
18792     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18793
18794   /* Set MIPS ELF flags for ASEs.  Note that not all ASEs have flags
18795      defined at present; this might need to change in future.  */
18796   if (file_ase_mips16)
18797     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
18798   if (file_ase_micromips)
18799     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MICROMIPS;
18800   if (file_mips_opts.ase & ASE_MDMX)
18801     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
18802
18803   /* Set the MIPS ELF ABI flags.  */
18804   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
18805     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
18806   else if (mips_abi == O64_ABI)
18807     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
18808   else if (mips_abi == EABI_ABI)
18809     {
18810       if (file_mips_opts.gp == 64)
18811         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
18812       else
18813         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
18814     }
18815   else if (mips_abi == N32_ABI)
18816     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
18817
18818   /* Nothing to do for N64_ABI.  */
18819
18820   if (mips_32bitmode)
18821     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
18822
18823   if (mips_nan2008 == 1)
18824     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NAN2008;
18825
18826   /* 32 bit code with 64 bit FP registers.  */
18827   fpabi = bfd_elf_get_obj_attr_int (stdoutput, OBJ_ATTR_GNU,
18828                                     Tag_GNU_MIPS_ABI_FP);
18829   if (fpabi == Val_GNU_MIPS_ABI_FP_OLD_64)
18830     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_FP64;
18831 }
18832 \f
18833 typedef struct proc {
18834   symbolS *func_sym;
18835   symbolS *func_end_sym;
18836   unsigned long reg_mask;
18837   unsigned long reg_offset;
18838   unsigned long fpreg_mask;
18839   unsigned long fpreg_offset;
18840   unsigned long frame_offset;
18841   unsigned long frame_reg;
18842   unsigned long pc_reg;
18843 } procS;
18844
18845 static procS cur_proc;
18846 static procS *cur_proc_ptr;
18847 static int numprocs;
18848
18849 /* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1", a microMIPS nop
18850    as "2", and a normal nop as "0".  */
18851
18852 #define NOP_OPCODE_MIPS         0
18853 #define NOP_OPCODE_MIPS16       1
18854 #define NOP_OPCODE_MICROMIPS    2
18855
18856 char
18857 mips_nop_opcode (void)
18858 {
18859   if (seg_info (now_seg)->tc_segment_info_data.micromips)
18860     return NOP_OPCODE_MICROMIPS;
18861   else if (seg_info (now_seg)->tc_segment_info_data.mips16)
18862     return NOP_OPCODE_MIPS16;
18863   else
18864     return NOP_OPCODE_MIPS;
18865 }
18866
18867 /* Fill in an rs_align_code fragment.  Unlike elsewhere we want to use
18868    32-bit microMIPS NOPs here (if applicable).  */
18869
18870 void
18871 mips_handle_align (fragS *fragp)
18872 {
18873   char nop_opcode;
18874   char *p;
18875   int bytes, size, excess;
18876   valueT opcode;
18877
18878   if (fragp->fr_type != rs_align_code)
18879     return;
18880
18881   p = fragp->fr_literal + fragp->fr_fix;
18882   nop_opcode = *p;
18883   switch (nop_opcode)
18884     {
18885     case NOP_OPCODE_MICROMIPS:
18886       opcode = micromips_nop32_insn.insn_opcode;
18887       size = 4;
18888       break;
18889     case NOP_OPCODE_MIPS16:
18890       opcode = mips16_nop_insn.insn_opcode;
18891       size = 2;
18892       break;
18893     case NOP_OPCODE_MIPS:
18894     default:
18895       opcode = nop_insn.insn_opcode;
18896       size = 4;
18897       break;
18898     }
18899
18900   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
18901   excess = bytes % size;
18902
18903   /* Handle the leading part if we're not inserting a whole number of
18904      instructions, and make it the end of the fixed part of the frag.
18905      Try to fit in a short microMIPS NOP if applicable and possible,
18906      and use zeroes otherwise.  */
18907   gas_assert (excess < 4);
18908   fragp->fr_fix += excess;
18909   switch (excess)
18910     {
18911     case 3:
18912       *p++ = '\0';
18913       /* Fall through.  */
18914     case 2:
18915       if (nop_opcode == NOP_OPCODE_MICROMIPS && !mips_opts.insn32)
18916         {
18917           p = write_compressed_insn (p, micromips_nop16_insn.insn_opcode, 2);
18918           break;
18919         }
18920       *p++ = '\0';
18921       /* Fall through.  */
18922     case 1:
18923       *p++ = '\0';
18924       /* Fall through.  */
18925     case 0:
18926       break;
18927     }
18928
18929   md_number_to_chars (p, opcode, size);
18930   fragp->fr_var = size;
18931 }
18932
18933 static long
18934 get_number (void)
18935 {
18936   int negative = 0;
18937   long val = 0;
18938
18939   if (*input_line_pointer == '-')
18940     {
18941       ++input_line_pointer;
18942       negative = 1;
18943     }
18944   if (!ISDIGIT (*input_line_pointer))
18945     as_bad (_("expected simple number"));
18946   if (input_line_pointer[0] == '0')
18947     {
18948       if (input_line_pointer[1] == 'x')
18949         {
18950           input_line_pointer += 2;
18951           while (ISXDIGIT (*input_line_pointer))
18952             {
18953               val <<= 4;
18954               val |= hex_value (*input_line_pointer++);
18955             }
18956           return negative ? -val : val;
18957         }
18958       else
18959         {
18960           ++input_line_pointer;
18961           while (ISDIGIT (*input_line_pointer))
18962             {
18963               val <<= 3;
18964               val |= *input_line_pointer++ - '0';
18965             }
18966           return negative ? -val : val;
18967         }
18968     }
18969   if (!ISDIGIT (*input_line_pointer))
18970     {
18971       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
18972               *input_line_pointer, *input_line_pointer);
18973       as_warn (_("invalid number"));
18974       return -1;
18975     }
18976   while (ISDIGIT (*input_line_pointer))
18977     {
18978       val *= 10;
18979       val += *input_line_pointer++ - '0';
18980     }
18981   return negative ? -val : val;
18982 }
18983
18984 /* The .file directive; just like the usual .file directive, but there
18985    is an initial number which is the ECOFF file index.  In the non-ECOFF
18986    case .file implies DWARF-2.  */
18987
18988 static void
18989 s_mips_file (int x ATTRIBUTE_UNUSED)
18990 {
18991   static int first_file_directive = 0;
18992
18993   if (ECOFF_DEBUGGING)
18994     {
18995       get_number ();
18996       s_app_file (0);
18997     }
18998   else
18999     {
19000       char *filename;
19001
19002       filename = dwarf2_directive_file (0);
19003
19004       /* Versions of GCC up to 3.1 start files with a ".file"
19005          directive even for stabs output.  Make sure that this
19006          ".file" is handled.  Note that you need a version of GCC
19007          after 3.1 in order to support DWARF-2 on MIPS.  */
19008       if (filename != NULL && ! first_file_directive)
19009         {
19010           (void) new_logical_line (filename, -1);
19011           s_app_file_string (filename, 0);
19012         }
19013       first_file_directive = 1;
19014     }
19015 }
19016
19017 /* The .loc directive, implying DWARF-2.  */
19018
19019 static void
19020 s_mips_loc (int x ATTRIBUTE_UNUSED)
19021 {
19022   if (!ECOFF_DEBUGGING)
19023     dwarf2_directive_loc (0);
19024 }
19025
19026 /* The .end directive.  */
19027
19028 static void
19029 s_mips_end (int x ATTRIBUTE_UNUSED)
19030 {
19031   symbolS *p;
19032
19033   /* Following functions need their own .frame and .cprestore directives.  */
19034   mips_frame_reg_valid = 0;
19035   mips_cprestore_valid = 0;
19036
19037   if (!is_end_of_line[(unsigned char) *input_line_pointer])
19038     {
19039       p = get_symbol ();
19040       demand_empty_rest_of_line ();
19041     }
19042   else
19043     p = NULL;
19044
19045   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
19046     as_warn (_(".end not in text section"));
19047
19048   if (!cur_proc_ptr)
19049     {
19050       as_warn (_(".end directive without a preceding .ent directive"));
19051       demand_empty_rest_of_line ();
19052       return;
19053     }
19054
19055   if (p != NULL)
19056     {
19057       gas_assert (S_GET_NAME (p));
19058       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
19059         as_warn (_(".end symbol does not match .ent symbol"));
19060
19061       if (debug_type == DEBUG_STABS)
19062         stabs_generate_asm_endfunc (S_GET_NAME (p),
19063                                     S_GET_NAME (p));
19064     }
19065   else
19066     as_warn (_(".end directive missing or unknown symbol"));
19067
19068   /* Create an expression to calculate the size of the function.  */
19069   if (p && cur_proc_ptr)
19070     {
19071       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
19072       expressionS *exp = XNEW (expressionS);
19073
19074       obj->size = exp;
19075       exp->X_op = O_subtract;
19076       exp->X_add_symbol = symbol_temp_new_now ();
19077       exp->X_op_symbol = p;
19078       exp->X_add_number = 0;
19079
19080       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
19081     }
19082
19083 #ifdef md_flush_pending_output
19084   md_flush_pending_output ();
19085 #endif
19086
19087   /* Generate a .pdr section.  */
19088   if (!ECOFF_DEBUGGING && mips_flag_pdr)
19089     {
19090       segT saved_seg = now_seg;
19091       subsegT saved_subseg = now_subseg;
19092       expressionS exp;
19093       char *fragp;
19094
19095       gas_assert (pdr_seg);
19096       subseg_set (pdr_seg, 0);
19097
19098       /* Write the symbol.  */
19099       exp.X_op = O_symbol;
19100       exp.X_add_symbol = p;
19101       exp.X_add_number = 0;
19102       emit_expr (&exp, 4);
19103
19104       fragp = frag_more (7 * 4);
19105
19106       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
19107       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
19108       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
19109       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
19110       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
19111       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
19112       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
19113
19114       subseg_set (saved_seg, saved_subseg);
19115     }
19116
19117   cur_proc_ptr = NULL;
19118 }
19119
19120 /* The .aent and .ent directives.  */
19121
19122 static void
19123 s_mips_ent (int aent)
19124 {
19125   symbolS *symbolP;
19126
19127   symbolP = get_symbol ();
19128   if (*input_line_pointer == ',')
19129     ++input_line_pointer;
19130   SKIP_WHITESPACE ();
19131   if (ISDIGIT (*input_line_pointer)
19132       || *input_line_pointer == '-')
19133     get_number ();
19134
19135   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
19136     as_warn (_(".ent or .aent not in text section"));
19137
19138   if (!aent && cur_proc_ptr)
19139     as_warn (_("missing .end"));
19140
19141   if (!aent)
19142     {
19143       /* This function needs its own .frame and .cprestore directives.  */
19144       mips_frame_reg_valid = 0;
19145       mips_cprestore_valid = 0;
19146
19147       cur_proc_ptr = &cur_proc;
19148       memset (cur_proc_ptr, '\0', sizeof (procS));
19149
19150       cur_proc_ptr->func_sym = symbolP;
19151
19152       ++numprocs;
19153
19154       if (debug_type == DEBUG_STABS)
19155         stabs_generate_asm_func (S_GET_NAME (symbolP),
19156                                  S_GET_NAME (symbolP));
19157     }
19158
19159   symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
19160
19161   demand_empty_rest_of_line ();
19162 }
19163
19164 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
19165    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
19166    s_mips_frame is used so that we can set the PDR information correctly.
19167    We can't use the ecoff routines because they make reference to the ecoff
19168    symbol table (in the mdebug section).  */
19169
19170 static void
19171 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
19172 {
19173   if (ECOFF_DEBUGGING)
19174     s_ignore (ignore);
19175   else
19176     {
19177       long val;
19178
19179       if (cur_proc_ptr == (procS *) NULL)
19180         {
19181           as_warn (_(".frame outside of .ent"));
19182           demand_empty_rest_of_line ();
19183           return;
19184         }
19185
19186       cur_proc_ptr->frame_reg = tc_get_register (1);
19187
19188       SKIP_WHITESPACE ();
19189       if (*input_line_pointer++ != ','
19190           || get_absolute_expression_and_terminator (&val) != ',')
19191         {
19192           as_warn (_("bad .frame directive"));
19193           --input_line_pointer;
19194           demand_empty_rest_of_line ();
19195           return;
19196         }
19197
19198       cur_proc_ptr->frame_offset = val;
19199       cur_proc_ptr->pc_reg = tc_get_register (0);
19200
19201       demand_empty_rest_of_line ();
19202     }
19203 }
19204
19205 /* The .fmask and .mask directives. If the mdebug section is present
19206    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
19207    embedded targets, s_mips_mask is used so that we can set the PDR
19208    information correctly. We can't use the ecoff routines because they
19209    make reference to the ecoff symbol table (in the mdebug section).  */
19210
19211 static void
19212 s_mips_mask (int reg_type)
19213 {
19214   if (ECOFF_DEBUGGING)
19215     s_ignore (reg_type);
19216   else
19217     {
19218       long mask, off;
19219
19220       if (cur_proc_ptr == (procS *) NULL)
19221         {
19222           as_warn (_(".mask/.fmask outside of .ent"));
19223           demand_empty_rest_of_line ();
19224           return;
19225         }
19226
19227       if (get_absolute_expression_and_terminator (&mask) != ',')
19228         {
19229           as_warn (_("bad .mask/.fmask directive"));
19230           --input_line_pointer;
19231           demand_empty_rest_of_line ();
19232           return;
19233         }
19234
19235       off = get_absolute_expression ();
19236
19237       if (reg_type == 'F')
19238         {
19239           cur_proc_ptr->fpreg_mask = mask;
19240           cur_proc_ptr->fpreg_offset = off;
19241         }
19242       else
19243         {
19244           cur_proc_ptr->reg_mask = mask;
19245           cur_proc_ptr->reg_offset = off;
19246         }
19247
19248       demand_empty_rest_of_line ();
19249     }
19250 }
19251
19252 /* A table describing all the processors gas knows about.  Names are
19253    matched in the order listed.
19254
19255    To ease comparison, please keep this table in the same order as
19256    gcc's mips_cpu_info_table[].  */
19257 static const struct mips_cpu_info mips_cpu_info_table[] =
19258 {
19259   /* Entries for generic ISAs */
19260   { "mips1",          MIPS_CPU_IS_ISA, 0,       ISA_MIPS1,    CPU_R3000 },
19261   { "mips2",          MIPS_CPU_IS_ISA, 0,       ISA_MIPS2,    CPU_R6000 },
19262   { "mips3",          MIPS_CPU_IS_ISA, 0,       ISA_MIPS3,    CPU_R4000 },
19263   { "mips4",          MIPS_CPU_IS_ISA, 0,       ISA_MIPS4,    CPU_R8000 },
19264   { "mips5",          MIPS_CPU_IS_ISA, 0,       ISA_MIPS5,    CPU_MIPS5 },
19265   { "mips32",         MIPS_CPU_IS_ISA, 0,       ISA_MIPS32,   CPU_MIPS32 },
19266   { "mips32r2",       MIPS_CPU_IS_ISA, 0,       ISA_MIPS32R2, CPU_MIPS32R2 },
19267   { "mips32r3",       MIPS_CPU_IS_ISA, 0,       ISA_MIPS32R3, CPU_MIPS32R3 },
19268   { "mips32r5",       MIPS_CPU_IS_ISA, 0,       ISA_MIPS32R5, CPU_MIPS32R5 },
19269   { "mips32r6",       MIPS_CPU_IS_ISA, 0,       ISA_MIPS32R6, CPU_MIPS32R6 },
19270   { "mips64",         MIPS_CPU_IS_ISA, 0,       ISA_MIPS64,   CPU_MIPS64 },
19271   { "mips64r2",       MIPS_CPU_IS_ISA, 0,       ISA_MIPS64R2, CPU_MIPS64R2 },
19272   { "mips64r3",       MIPS_CPU_IS_ISA, 0,       ISA_MIPS64R3, CPU_MIPS64R3 },
19273   { "mips64r5",       MIPS_CPU_IS_ISA, 0,       ISA_MIPS64R5, CPU_MIPS64R5 },
19274   { "mips64r6",       MIPS_CPU_IS_ISA, 0,       ISA_MIPS64R6, CPU_MIPS64R6 },
19275
19276   /* MIPS I */
19277   { "r3000",          0, 0,                     ISA_MIPS1,    CPU_R3000 },
19278   { "r2000",          0, 0,                     ISA_MIPS1,    CPU_R3000 },
19279   { "r3900",          0, 0,                     ISA_MIPS1,    CPU_R3900 },
19280
19281   /* MIPS II */
19282   { "r6000",          0, 0,                     ISA_MIPS2,    CPU_R6000 },
19283
19284   /* MIPS III */
19285   { "r4000",          0, 0,                     ISA_MIPS3,    CPU_R4000 },
19286   { "r4010",          0, 0,                     ISA_MIPS2,    CPU_R4010 },
19287   { "vr4100",         0, 0,                     ISA_MIPS3,    CPU_VR4100 },
19288   { "vr4111",         0, 0,                     ISA_MIPS3,    CPU_R4111 },
19289   { "vr4120",         0, 0,                     ISA_MIPS3,    CPU_VR4120 },
19290   { "vr4130",         0, 0,                     ISA_MIPS3,    CPU_VR4120 },
19291   { "vr4181",         0, 0,                     ISA_MIPS3,    CPU_R4111 },
19292   { "vr4300",         0, 0,                     ISA_MIPS3,    CPU_R4300 },
19293   { "r4400",          0, 0,                     ISA_MIPS3,    CPU_R4400 },
19294   { "r4600",          0, 0,                     ISA_MIPS3,    CPU_R4600 },
19295   { "orion",          0, 0,                     ISA_MIPS3,    CPU_R4600 },
19296   { "r4650",          0, 0,                     ISA_MIPS3,    CPU_R4650 },
19297   { "r5900",          0, 0,                     ISA_MIPS3,    CPU_R5900 },
19298   /* ST Microelectronics Loongson 2E and 2F cores */
19299   { "loongson2e",     0, 0,                     ISA_MIPS3,    CPU_LOONGSON_2E },
19300   { "loongson2f",     0, 0,                     ISA_MIPS3,    CPU_LOONGSON_2F },
19301
19302   /* MIPS IV */
19303   { "r8000",          0, 0,                     ISA_MIPS4,    CPU_R8000 },
19304   { "r10000",         0, 0,                     ISA_MIPS4,    CPU_R10000 },
19305   { "r12000",         0, 0,                     ISA_MIPS4,    CPU_R12000 },
19306   { "r14000",         0, 0,                     ISA_MIPS4,    CPU_R14000 },
19307   { "r16000",         0, 0,                     ISA_MIPS4,    CPU_R16000 },
19308   { "vr5000",         0, 0,                     ISA_MIPS4,    CPU_R5000 },
19309   { "vr5400",         0, 0,                     ISA_MIPS4,    CPU_VR5400 },
19310   { "vr5500",         0, 0,                     ISA_MIPS4,    CPU_VR5500 },
19311   { "rm5200",         0, 0,                     ISA_MIPS4,    CPU_R5000 },
19312   { "rm5230",         0, 0,                     ISA_MIPS4,    CPU_R5000 },
19313   { "rm5231",         0, 0,                     ISA_MIPS4,    CPU_R5000 },
19314   { "rm5261",         0, 0,                     ISA_MIPS4,    CPU_R5000 },
19315   { "rm5721",         0, 0,                     ISA_MIPS4,    CPU_R5000 },
19316   { "rm7000",         0, 0,                     ISA_MIPS4,    CPU_RM7000 },
19317   { "rm9000",         0, 0,                     ISA_MIPS4,    CPU_RM9000 },
19318
19319   /* MIPS 32 */
19320   { "4kc",            0, 0,                     ISA_MIPS32,   CPU_MIPS32 },
19321   { "4km",            0, 0,                     ISA_MIPS32,   CPU_MIPS32 },
19322   { "4kp",            0, 0,                     ISA_MIPS32,   CPU_MIPS32 },
19323   { "4ksc",           0, ASE_SMARTMIPS,         ISA_MIPS32,   CPU_MIPS32 },
19324
19325   /* MIPS 32 Release 2 */
19326   { "4kec",           0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19327   { "4kem",           0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19328   { "4kep",           0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19329   { "4ksd",           0, ASE_SMARTMIPS,         ISA_MIPS32R2, CPU_MIPS32R2 },
19330   { "m4k",            0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19331   { "m4kp",           0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19332   { "m14k",           0, ASE_MCU,               ISA_MIPS32R2, CPU_MIPS32R2 },
19333   { "m14kc",          0, ASE_MCU,               ISA_MIPS32R2, CPU_MIPS32R2 },
19334   { "m14ke",          0, ASE_DSP | ASE_DSPR2 | ASE_MCU,
19335                                                 ISA_MIPS32R2, CPU_MIPS32R2 },
19336   { "m14kec",         0, ASE_DSP | ASE_DSPR2 | ASE_MCU,
19337                                                 ISA_MIPS32R2, CPU_MIPS32R2 },
19338   { "24kc",           0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19339   { "24kf2_1",        0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19340   { "24kf",           0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19341   { "24kf1_1",        0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19342   /* Deprecated forms of the above.  */
19343   { "24kfx",          0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19344   { "24kx",           0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19345   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
19346   { "24kec",          0, ASE_DSP,               ISA_MIPS32R2, CPU_MIPS32R2 },
19347   { "24kef2_1",       0, ASE_DSP,               ISA_MIPS32R2, CPU_MIPS32R2 },
19348   { "24kef",          0, ASE_DSP,               ISA_MIPS32R2, CPU_MIPS32R2 },
19349   { "24kef1_1",       0, ASE_DSP,               ISA_MIPS32R2, CPU_MIPS32R2 },
19350   /* Deprecated forms of the above.  */
19351   { "24kefx",         0, ASE_DSP,               ISA_MIPS32R2, CPU_MIPS32R2 },
19352   { "24kex",          0, ASE_DSP,               ISA_MIPS32R2, CPU_MIPS32R2 },
19353   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
19354   { "34kc",           0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19355   { "34kf2_1",        0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19356   { "34kf",           0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19357   { "34kf1_1",        0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19358   /* Deprecated forms of the above.  */
19359   { "34kfx",          0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19360   { "34kx",           0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19361   /* 34Kn is a 34kc without DSP.  */
19362   { "34kn",           0, ASE_MT,                ISA_MIPS32R2, CPU_MIPS32R2 },
19363   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
19364   { "74kc",           0, ASE_DSP | ASE_DSPR2,   ISA_MIPS32R2, CPU_MIPS32R2 },
19365   { "74kf2_1",        0, ASE_DSP | ASE_DSPR2,   ISA_MIPS32R2, CPU_MIPS32R2 },
19366   { "74kf",           0, ASE_DSP | ASE_DSPR2,   ISA_MIPS32R2, CPU_MIPS32R2 },
19367   { "74kf1_1",        0, ASE_DSP | ASE_DSPR2,   ISA_MIPS32R2, CPU_MIPS32R2 },
19368   { "74kf3_2",        0, ASE_DSP | ASE_DSPR2,   ISA_MIPS32R2, CPU_MIPS32R2 },
19369   /* Deprecated forms of the above.  */
19370   { "74kfx",          0, ASE_DSP | ASE_DSPR2,   ISA_MIPS32R2, CPU_MIPS32R2 },
19371   { "74kx",           0, ASE_DSP | ASE_DSPR2,   ISA_MIPS32R2, CPU_MIPS32R2 },
19372   /* 1004K cores are multiprocessor versions of the 34K.  */
19373   { "1004kc",         0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19374   { "1004kf2_1",      0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19375   { "1004kf",         0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19376   { "1004kf1_1",      0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19377   /* interaptiv is the new name for 1004kf */
19378   { "interaptiv",     0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19379   /* M5100 family */
19380   { "m5100",          0, ASE_MCU,               ISA_MIPS32R5, CPU_MIPS32R5 },
19381   { "m5101",          0, ASE_MCU,               ISA_MIPS32R5, CPU_MIPS32R5 },
19382   /* P5600 with EVA and Virtualization ASEs, other ASEs are optional.  */
19383   { "p5600",          0, ASE_VIRT | ASE_EVA | ASE_XPA,  ISA_MIPS32R5, CPU_MIPS32R5 },
19384
19385   /* MIPS 64 */
19386   { "5kc",            0, 0,                     ISA_MIPS64,   CPU_MIPS64 },
19387   { "5kf",            0, 0,                     ISA_MIPS64,   CPU_MIPS64 },
19388   { "20kc",           0, ASE_MIPS3D,            ISA_MIPS64,   CPU_MIPS64 },
19389   { "25kf",           0, ASE_MIPS3D,            ISA_MIPS64,   CPU_MIPS64 },
19390
19391   /* Broadcom SB-1 CPU core */
19392   { "sb1",            0, ASE_MIPS3D | ASE_MDMX, ISA_MIPS64,   CPU_SB1 },
19393   /* Broadcom SB-1A CPU core */
19394   { "sb1a",           0, ASE_MIPS3D | ASE_MDMX, ISA_MIPS64,   CPU_SB1 },
19395
19396   { "loongson3a",     0, 0,                     ISA_MIPS64R2, CPU_LOONGSON_3A },
19397
19398   /* MIPS 64 Release 2 */
19399
19400   /* Cavium Networks Octeon CPU core */
19401   { "octeon",         0, 0,                     ISA_MIPS64R2, CPU_OCTEON },
19402   { "octeon+",        0, 0,                     ISA_MIPS64R2, CPU_OCTEONP },
19403   { "octeon2",        0, 0,                     ISA_MIPS64R2, CPU_OCTEON2 },
19404   { "octeon3",        0, ASE_VIRT | ASE_VIRT64, ISA_MIPS64R5, CPU_OCTEON3 },
19405
19406   /* RMI Xlr */
19407   { "xlr",            0, 0,                     ISA_MIPS64,   CPU_XLR },
19408
19409   /* Broadcom XLP.
19410      XLP is mostly like XLR, with the prominent exception that it is
19411      MIPS64R2 rather than MIPS64.  */
19412   { "xlp",            0, 0,                     ISA_MIPS64R2, CPU_XLR },
19413
19414   /* MIPS 64 Release 6 */
19415   { "i6400",          0, ASE_MSA,               ISA_MIPS64R6, CPU_MIPS64R6},
19416   { "p6600",          0, ASE_VIRT | ASE_MSA,    ISA_MIPS64R6, CPU_MIPS64R6},
19417
19418   /* End marker */
19419   { NULL, 0, 0, 0, 0 }
19420 };
19421
19422
19423 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
19424    with a final "000" replaced by "k".  Ignore case.
19425
19426    Note: this function is shared between GCC and GAS.  */
19427
19428 static bfd_boolean
19429 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
19430 {
19431   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
19432     given++, canonical++;
19433
19434   return ((*given == 0 && *canonical == 0)
19435           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
19436 }
19437
19438
19439 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
19440    CPU name.  We've traditionally allowed a lot of variation here.
19441
19442    Note: this function is shared between GCC and GAS.  */
19443
19444 static bfd_boolean
19445 mips_matching_cpu_name_p (const char *canonical, const char *given)
19446 {
19447   /* First see if the name matches exactly, or with a final "000"
19448      turned into "k".  */
19449   if (mips_strict_matching_cpu_name_p (canonical, given))
19450     return TRUE;
19451
19452   /* If not, try comparing based on numerical designation alone.
19453      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
19454   if (TOLOWER (*given) == 'r')
19455     given++;
19456   if (!ISDIGIT (*given))
19457     return FALSE;
19458
19459   /* Skip over some well-known prefixes in the canonical name,
19460      hoping to find a number there too.  */
19461   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
19462     canonical += 2;
19463   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
19464     canonical += 2;
19465   else if (TOLOWER (canonical[0]) == 'r')
19466     canonical += 1;
19467
19468   return mips_strict_matching_cpu_name_p (canonical, given);
19469 }
19470
19471
19472 /* Parse an option that takes the name of a processor as its argument.
19473    OPTION is the name of the option and CPU_STRING is the argument.
19474    Return the corresponding processor enumeration if the CPU_STRING is
19475    recognized, otherwise report an error and return null.
19476
19477    A similar function exists in GCC.  */
19478
19479 static const struct mips_cpu_info *
19480 mips_parse_cpu (const char *option, const char *cpu_string)
19481 {
19482   const struct mips_cpu_info *p;
19483
19484   /* 'from-abi' selects the most compatible architecture for the given
19485      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
19486      EABIs, we have to decide whether we're using the 32-bit or 64-bit
19487      version.  Look first at the -mgp options, if given, otherwise base
19488      the choice on MIPS_DEFAULT_64BIT.
19489
19490      Treat NO_ABI like the EABIs.  One reason to do this is that the
19491      plain 'mips' and 'mips64' configs have 'from-abi' as their default
19492      architecture.  This code picks MIPS I for 'mips' and MIPS III for
19493      'mips64', just as we did in the days before 'from-abi'.  */
19494   if (strcasecmp (cpu_string, "from-abi") == 0)
19495     {
19496       if (ABI_NEEDS_32BIT_REGS (mips_abi))
19497         return mips_cpu_info_from_isa (ISA_MIPS1);
19498
19499       if (ABI_NEEDS_64BIT_REGS (mips_abi))
19500         return mips_cpu_info_from_isa (ISA_MIPS3);
19501
19502       if (file_mips_opts.gp >= 0)
19503         return mips_cpu_info_from_isa (file_mips_opts.gp == 32
19504                                        ? ISA_MIPS1 : ISA_MIPS3);
19505
19506       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
19507                                      ? ISA_MIPS3
19508                                      : ISA_MIPS1);
19509     }
19510
19511   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
19512   if (strcasecmp (cpu_string, "default") == 0)
19513     return 0;
19514
19515   for (p = mips_cpu_info_table; p->name != 0; p++)
19516     if (mips_matching_cpu_name_p (p->name, cpu_string))
19517       return p;
19518
19519   as_bad (_("bad value (%s) for %s"), cpu_string, option);
19520   return 0;
19521 }
19522
19523 /* Return the canonical processor information for ISA (a member of the
19524    ISA_MIPS* enumeration).  */
19525
19526 static const struct mips_cpu_info *
19527 mips_cpu_info_from_isa (int isa)
19528 {
19529   int i;
19530
19531   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19532     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
19533         && isa == mips_cpu_info_table[i].isa)
19534       return (&mips_cpu_info_table[i]);
19535
19536   return NULL;
19537 }
19538
19539 static const struct mips_cpu_info *
19540 mips_cpu_info_from_arch (int arch)
19541 {
19542   int i;
19543
19544   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19545     if (arch == mips_cpu_info_table[i].cpu)
19546       return (&mips_cpu_info_table[i]);
19547
19548   return NULL;
19549 }
19550 \f
19551 static void
19552 show (FILE *stream, const char *string, int *col_p, int *first_p)
19553 {
19554   if (*first_p)
19555     {
19556       fprintf (stream, "%24s", "");
19557       *col_p = 24;
19558     }
19559   else
19560     {
19561       fprintf (stream, ", ");
19562       *col_p += 2;
19563     }
19564
19565   if (*col_p + strlen (string) > 72)
19566     {
19567       fprintf (stream, "\n%24s", "");
19568       *col_p = 24;
19569     }
19570
19571   fprintf (stream, "%s", string);
19572   *col_p += strlen (string);
19573
19574   *first_p = 0;
19575 }
19576
19577 void
19578 md_show_usage (FILE *stream)
19579 {
19580   int column, first;
19581   size_t i;
19582
19583   fprintf (stream, _("\
19584 MIPS options:\n\
19585 -EB                     generate big endian output\n\
19586 -EL                     generate little endian output\n\
19587 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
19588 -G NUM                  allow referencing objects up to NUM bytes\n\
19589                         implicitly with the gp register [default 8]\n"));
19590   fprintf (stream, _("\
19591 -mips1                  generate MIPS ISA I instructions\n\
19592 -mips2                  generate MIPS ISA II instructions\n\
19593 -mips3                  generate MIPS ISA III instructions\n\
19594 -mips4                  generate MIPS ISA IV instructions\n\
19595 -mips5                  generate MIPS ISA V instructions\n\
19596 -mips32                 generate MIPS32 ISA instructions\n\
19597 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
19598 -mips32r3               generate MIPS32 release 3 ISA instructions\n\
19599 -mips32r5               generate MIPS32 release 5 ISA instructions\n\
19600 -mips32r6               generate MIPS32 release 6 ISA instructions\n\
19601 -mips64                 generate MIPS64 ISA instructions\n\
19602 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
19603 -mips64r3               generate MIPS64 release 3 ISA instructions\n\
19604 -mips64r5               generate MIPS64 release 5 ISA instructions\n\
19605 -mips64r6               generate MIPS64 release 6 ISA instructions\n\
19606 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
19607
19608   first = 1;
19609
19610   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19611     show (stream, mips_cpu_info_table[i].name, &column, &first);
19612   show (stream, "from-abi", &column, &first);
19613   fputc ('\n', stream);
19614
19615   fprintf (stream, _("\
19616 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
19617 -no-mCPU                don't generate code specific to CPU.\n\
19618                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
19619
19620   first = 1;
19621
19622   show (stream, "3900", &column, &first);
19623   show (stream, "4010", &column, &first);
19624   show (stream, "4100", &column, &first);
19625   show (stream, "4650", &column, &first);
19626   fputc ('\n', stream);
19627
19628   fprintf (stream, _("\
19629 -mips16                 generate mips16 instructions\n\
19630 -no-mips16              do not generate mips16 instructions\n"));
19631   fprintf (stream, _("\
19632 -mmicromips             generate microMIPS instructions\n\
19633 -mno-micromips          do not generate microMIPS instructions\n"));
19634   fprintf (stream, _("\
19635 -msmartmips             generate smartmips instructions\n\
19636 -mno-smartmips          do not generate smartmips instructions\n"));
19637   fprintf (stream, _("\
19638 -mdsp                   generate DSP instructions\n\
19639 -mno-dsp                do not generate DSP instructions\n"));
19640   fprintf (stream, _("\
19641 -mdspr2                 generate DSP R2 instructions\n\
19642 -mno-dspr2              do not generate DSP R2 instructions\n"));
19643   fprintf (stream, _("\
19644 -mdspr3                 generate DSP R3 instructions\n\
19645 -mno-dspr3              do not generate DSP R3 instructions\n"));
19646   fprintf (stream, _("\
19647 -mmt                    generate MT instructions\n\
19648 -mno-mt                 do not generate MT instructions\n"));
19649   fprintf (stream, _("\
19650 -mmcu                   generate MCU instructions\n\
19651 -mno-mcu                do not generate MCU instructions\n"));
19652   fprintf (stream, _("\
19653 -mmsa                   generate MSA instructions\n\
19654 -mno-msa                do not generate MSA instructions\n"));
19655   fprintf (stream, _("\
19656 -mxpa                   generate eXtended Physical Address (XPA) instructions\n\
19657 -mno-xpa                do not generate eXtended Physical Address (XPA) instructions\n"));
19658   fprintf (stream, _("\
19659 -mvirt                  generate Virtualization instructions\n\
19660 -mno-virt               do not generate Virtualization instructions\n"));
19661   fprintf (stream, _("\
19662 -minsn32                only generate 32-bit microMIPS instructions\n\
19663 -mno-insn32             generate all microMIPS instructions\n"));
19664   fprintf (stream, _("\
19665 -mfix-loongson2f-jump   work around Loongson2F JUMP instructions\n\
19666 -mfix-loongson2f-nop    work around Loongson2F NOP errata\n\
19667 -mfix-vr4120            work around certain VR4120 errata\n\
19668 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
19669 -mfix-24k               insert a nop after ERET and DERET instructions\n\
19670 -mfix-cn63xxp1          work around CN63XXP1 PREF errata\n\
19671 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
19672 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
19673 -msym32                 assume all symbols have 32-bit values\n\
19674 -O0                     remove unneeded NOPs, do not swap branches\n\
19675 -O                      remove unneeded NOPs and swap branches\n\
19676 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
19677 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
19678   fprintf (stream, _("\
19679 -mhard-float            allow floating-point instructions\n\
19680 -msoft-float            do not allow floating-point instructions\n\
19681 -msingle-float          only allow 32-bit floating-point operations\n\
19682 -mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
19683 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
19684 --[no-]relax-branch     [dis]allow out-of-range branches to be relaxed\n\
19685 -mignore-branch-isa     accept invalid branches requiring an ISA mode switch\n\
19686 -mno-ignore-branch-isa  reject invalid branches requiring an ISA mode switch\n\
19687 -mnan=ENCODING          select an IEEE 754 NaN encoding convention, either of:\n"));
19688
19689   first = 1;
19690
19691   show (stream, "legacy", &column, &first);
19692   show (stream, "2008", &column, &first);
19693
19694   fputc ('\n', stream);
19695
19696   fprintf (stream, _("\
19697 -KPIC, -call_shared     generate SVR4 position independent code\n\
19698 -call_nonpic            generate non-PIC code that can operate with DSOs\n\
19699 -mvxworks-pic           generate VxWorks position independent code\n\
19700 -non_shared             do not generate code that can operate with DSOs\n\
19701 -xgot                   assume a 32 bit GOT\n\
19702 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
19703 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
19704                         position dependent (non shared) code\n\
19705 -mabi=ABI               create ABI conformant object file for:\n"));
19706
19707   first = 1;
19708
19709   show (stream, "32", &column, &first);
19710   show (stream, "o64", &column, &first);
19711   show (stream, "n32", &column, &first);
19712   show (stream, "64", &column, &first);
19713   show (stream, "eabi", &column, &first);
19714
19715   fputc ('\n', stream);
19716
19717   fprintf (stream, _("\
19718 -32                     create o32 ABI object file (default)\n\
19719 -n32                    create n32 ABI object file\n\
19720 -64                     create 64 ABI object file\n"));
19721 }
19722
19723 #ifdef TE_IRIX
19724 enum dwarf2_format
19725 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
19726 {
19727   if (HAVE_64BIT_SYMBOLS)
19728     return dwarf2_format_64bit_irix;
19729   else
19730     return dwarf2_format_32bit;
19731 }
19732 #endif
19733
19734 int
19735 mips_dwarf2_addr_size (void)
19736 {
19737   if (HAVE_64BIT_OBJECTS)
19738     return 8;
19739   else
19740     return 4;
19741 }
19742
19743 /* Standard calling conventions leave the CFA at SP on entry.  */
19744 void
19745 mips_cfi_frame_initial_instructions (void)
19746 {
19747   cfi_add_CFA_def_cfa_register (SP);
19748 }
19749
19750 int
19751 tc_mips_regname_to_dw2regnum (char *regname)
19752 {
19753   unsigned int regnum = -1;
19754   unsigned int reg;
19755
19756   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
19757     regnum = reg;
19758
19759   return regnum;
19760 }
19761
19762 /* Implement CONVERT_SYMBOLIC_ATTRIBUTE.
19763    Given a symbolic attribute NAME, return the proper integer value.
19764    Returns -1 if the attribute is not known.  */
19765
19766 int
19767 mips_convert_symbolic_attribute (const char *name)
19768 {
19769   static const struct
19770   {
19771     const char * name;
19772     const int    tag;
19773   }
19774   attribute_table[] =
19775     {
19776 #define T(tag) {#tag, tag}
19777       T (Tag_GNU_MIPS_ABI_FP),
19778       T (Tag_GNU_MIPS_ABI_MSA),
19779 #undef T
19780     };
19781   unsigned int i;
19782
19783   if (name == NULL)
19784     return -1;
19785
19786   for (i = 0; i < ARRAY_SIZE (attribute_table); i++)
19787     if (streq (name, attribute_table[i].name))
19788       return attribute_table[i].tag;
19789
19790   return -1;
19791 }
19792
19793 void
19794 md_mips_end (void)
19795 {
19796   int fpabi = Val_GNU_MIPS_ABI_FP_ANY;
19797
19798   mips_emit_delays ();
19799   if (cur_proc_ptr)
19800     as_warn (_("missing .end at end of assembly"));
19801
19802   /* Just in case no code was emitted, do the consistency check.  */
19803   file_mips_check_options ();
19804
19805   /* Set a floating-point ABI if the user did not.  */
19806   if (obj_elf_seen_attribute (OBJ_ATTR_GNU, Tag_GNU_MIPS_ABI_FP))
19807     {
19808       /* Perform consistency checks on the floating-point ABI.  */
19809       fpabi = bfd_elf_get_obj_attr_int (stdoutput, OBJ_ATTR_GNU,
19810                                         Tag_GNU_MIPS_ABI_FP);
19811       if (fpabi != Val_GNU_MIPS_ABI_FP_ANY)
19812         check_fpabi (fpabi);
19813     }
19814   else
19815     {
19816       /* Soft-float gets precedence over single-float, the two options should
19817          not be used together so this should not matter.  */
19818       if (file_mips_opts.soft_float == 1)
19819         fpabi = Val_GNU_MIPS_ABI_FP_SOFT;
19820       /* Single-float gets precedence over all double_float cases.  */
19821       else if (file_mips_opts.single_float == 1)
19822         fpabi = Val_GNU_MIPS_ABI_FP_SINGLE;
19823       else
19824         {
19825           switch (file_mips_opts.fp)
19826             {
19827             case 32:
19828               if (file_mips_opts.gp == 32)
19829                 fpabi = Val_GNU_MIPS_ABI_FP_DOUBLE;
19830               break;
19831             case 0:
19832               fpabi = Val_GNU_MIPS_ABI_FP_XX;
19833               break;
19834             case 64:
19835               if (file_mips_opts.gp == 32 && !file_mips_opts.oddspreg)
19836                 fpabi = Val_GNU_MIPS_ABI_FP_64A;
19837               else if (file_mips_opts.gp == 32)
19838                 fpabi = Val_GNU_MIPS_ABI_FP_64;
19839               else
19840                 fpabi = Val_GNU_MIPS_ABI_FP_DOUBLE;
19841               break;
19842             }
19843         }
19844
19845       bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU,
19846                                 Tag_GNU_MIPS_ABI_FP, fpabi);
19847     }
19848 }
19849
19850 /*  Returns the relocation type required for a particular CFI encoding.  */
19851
19852 bfd_reloc_code_real_type
19853 mips_cfi_reloc_for_encoding (int encoding)
19854 {
19855   if (encoding == (DW_EH_PE_sdata4 | DW_EH_PE_pcrel))
19856     return BFD_RELOC_32_PCREL;
19857   else return BFD_RELOC_NONE;
19858 }