gas/
[external/binutils.git] / gas / config / tc-mips.c
1 /* tc-mips.c -- assemble code for a MIPS chip.
2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3    2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
4    Free Software Foundation, Inc.
5    Contributed by the OSF and Ralph Campbell.
6    Written by Keith Knowles and Ralph Campbell, working independently.
7    Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
8    Support.
9
10    This file is part of GAS.
11
12    GAS is free software; you can redistribute it and/or modify
13    it under the terms of the GNU General Public License as published by
14    the Free Software Foundation; either version 3, or (at your option)
15    any later version.
16
17    GAS is distributed in the hope that it will be useful,
18    but WITHOUT ANY WARRANTY; without even the implied warranty of
19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20    GNU General Public License for more details.
21
22    You should have received a copy of the GNU General Public License
23    along with GAS; see the file COPYING.  If not, write to the Free
24    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
25    02110-1301, USA.  */
26
27 #include "as.h"
28 #include "config.h"
29 #include "subsegs.h"
30 #include "safe-ctype.h"
31
32 #include "opcode/mips.h"
33 #include "itbl-ops.h"
34 #include "dwarf2dbg.h"
35 #include "dw2gencfi.h"
36
37 #ifdef DEBUG
38 #define DBG(x) printf x
39 #else
40 #define DBG(x)
41 #endif
42
43 #ifdef OBJ_MAYBE_ELF
44 /* Clean up namespace so we can include obj-elf.h too.  */
45 static int mips_output_flavor (void);
46 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
47 #undef OBJ_PROCESS_STAB
48 #undef OUTPUT_FLAVOR
49 #undef S_GET_ALIGN
50 #undef S_GET_SIZE
51 #undef S_SET_ALIGN
52 #undef S_SET_SIZE
53 #undef obj_frob_file
54 #undef obj_frob_file_after_relocs
55 #undef obj_frob_symbol
56 #undef obj_pop_insert
57 #undef obj_sec_sym_ok_for_reloc
58 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
59
60 #include "obj-elf.h"
61 /* Fix any of them that we actually care about.  */
62 #undef OUTPUT_FLAVOR
63 #define OUTPUT_FLAVOR mips_output_flavor()
64 #endif
65
66 #if defined (OBJ_ELF)
67 #include "elf/mips.h"
68 #endif
69
70 #ifndef ECOFF_DEBUGGING
71 #define NO_ECOFF_DEBUGGING
72 #define ECOFF_DEBUGGING 0
73 #endif
74
75 int mips_flag_mdebug = -1;
76
77 /* Control generation of .pdr sections.  Off by default on IRIX: the native
78    linker doesn't know about and discards them, but relocations against them
79    remain, leading to rld crashes.  */
80 #ifdef TE_IRIX
81 int mips_flag_pdr = FALSE;
82 #else
83 int mips_flag_pdr = TRUE;
84 #endif
85
86 #include "ecoff.h"
87
88 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
89 static char *mips_regmask_frag;
90 #endif
91
92 #define ZERO 0
93 #define ATREG 1
94 #define S0  16
95 #define S7  23
96 #define TREG 24
97 #define PIC_CALL_REG 25
98 #define KT0 26
99 #define KT1 27
100 #define GP  28
101 #define SP  29
102 #define FP  30
103 #define RA  31
104
105 #define ILLEGAL_REG (32)
106
107 #define AT  mips_opts.at
108
109 /* Allow override of standard little-endian ECOFF format.  */
110
111 #ifndef ECOFF_LITTLE_FORMAT
112 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
113 #endif
114
115 extern int target_big_endian;
116
117 /* The name of the readonly data section.  */
118 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
119                             ? ".rdata" \
120                             : OUTPUT_FLAVOR == bfd_target_coff_flavour \
121                             ? ".rdata" \
122                             : OUTPUT_FLAVOR == bfd_target_elf_flavour \
123                             ? ".rodata" \
124                             : (abort (), ""))
125
126 /* Ways in which an instruction can be "appended" to the output.  */
127 enum append_method {
128   /* Just add it normally.  */
129   APPEND_ADD,
130
131   /* Add it normally and then add a nop.  */
132   APPEND_ADD_WITH_NOP,
133
134   /* Turn an instruction with a delay slot into a "compact" version.  */
135   APPEND_ADD_COMPACT,
136
137   /* Insert the instruction before the last one.  */
138   APPEND_SWAP
139 };
140
141 /* Information about an instruction, including its format, operands
142    and fixups.  */
143 struct mips_cl_insn
144 {
145   /* The opcode's entry in mips_opcodes or mips16_opcodes.  */
146   const struct mips_opcode *insn_mo;
147
148   /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
149      a copy of INSN_MO->match with the operands filled in.  If we have
150      decided to use an extended MIPS16 instruction, this includes the
151      extension.  */
152   unsigned long insn_opcode;
153
154   /* The frag that contains the instruction.  */
155   struct frag *frag;
156
157   /* The offset into FRAG of the first instruction byte.  */
158   long where;
159
160   /* The relocs associated with the instruction, if any.  */
161   fixS *fixp[3];
162
163   /* True if this entry cannot be moved from its current position.  */
164   unsigned int fixed_p : 1;
165
166   /* True if this instruction occurred in a .set noreorder block.  */
167   unsigned int noreorder_p : 1;
168
169   /* True for mips16 instructions that jump to an absolute address.  */
170   unsigned int mips16_absolute_jump_p : 1;
171
172   /* True if this instruction is complete.  */
173   unsigned int complete_p : 1;
174
175   /* True if this instruction is cleared from history by unconditional
176      branch.  */
177   unsigned int cleared_p : 1;
178 };
179
180 /* The ABI to use.  */
181 enum mips_abi_level
182 {
183   NO_ABI = 0,
184   O32_ABI,
185   O64_ABI,
186   N32_ABI,
187   N64_ABI,
188   EABI_ABI
189 };
190
191 /* MIPS ABI we are using for this output file.  */
192 static enum mips_abi_level mips_abi = NO_ABI;
193
194 /* Whether or not we have code that can call pic code.  */
195 int mips_abicalls = FALSE;
196
197 /* Whether or not we have code which can be put into a shared
198    library.  */
199 static bfd_boolean mips_in_shared = TRUE;
200
201 /* This is the set of options which may be modified by the .set
202    pseudo-op.  We use a struct so that .set push and .set pop are more
203    reliable.  */
204
205 struct mips_set_options
206 {
207   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
208      if it has not been initialized.  Changed by `.set mipsN', and the
209      -mipsN command line option, and the default CPU.  */
210   int isa;
211   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
212      if they have not been initialized.  Changed by `.set <asename>', by
213      command line options, and based on the default architecture.  */
214   int ase_mips3d;
215   int ase_mdmx;
216   int ase_smartmips;
217   int ase_dsp;
218   int ase_dspr2;
219   int ase_mt;
220   int ase_mcu;
221   int ase_virt;
222   /* Whether we are assembling for the mips16 processor.  0 if we are
223      not, 1 if we are, and -1 if the value has not been initialized.
224      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
225      -nomips16 command line options, and the default CPU.  */
226   int mips16;
227   /* Whether we are assembling for the mipsMIPS ASE.  0 if we are not,
228      1 if we are, and -1 if the value has not been initialized.  Changed
229      by `.set micromips' and `.set nomicromips', and the -mmicromips
230      and -mno-micromips command line options, and the default CPU.  */
231   int micromips;
232   /* Non-zero if we should not reorder instructions.  Changed by `.set
233      reorder' and `.set noreorder'.  */
234   int noreorder;
235   /* Non-zero if we should not permit the register designated "assembler
236      temporary" to be used in instructions.  The value is the register
237      number, normally $at ($1).  Changed by `.set at=REG', `.set noat'
238      (same as `.set at=$0') and `.set at' (same as `.set at=$1').  */
239   unsigned int at;
240   /* Non-zero if we should warn when a macro instruction expands into
241      more than one machine instruction.  Changed by `.set nomacro' and
242      `.set macro'.  */
243   int warn_about_macros;
244   /* Non-zero if we should not move instructions.  Changed by `.set
245      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
246   int nomove;
247   /* Non-zero if we should not optimize branches by moving the target
248      of the branch into the delay slot.  Actually, we don't perform
249      this optimization anyhow.  Changed by `.set bopt' and `.set
250      nobopt'.  */
251   int nobopt;
252   /* Non-zero if we should not autoextend mips16 instructions.
253      Changed by `.set autoextend' and `.set noautoextend'.  */
254   int noautoextend;
255   /* Restrict general purpose registers and floating point registers
256      to 32 bit.  This is initially determined when -mgp32 or -mfp32
257      is passed but can changed if the assembler code uses .set mipsN.  */
258   int gp32;
259   int fp32;
260   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
261      command line option, and the default CPU.  */
262   int arch;
263   /* True if ".set sym32" is in effect.  */
264   bfd_boolean sym32;
265   /* True if floating-point operations are not allowed.  Changed by .set
266      softfloat or .set hardfloat, by command line options -msoft-float or
267      -mhard-float.  The default is false.  */
268   bfd_boolean soft_float;
269
270   /* True if only single-precision floating-point operations are allowed.
271      Changed by .set singlefloat or .set doublefloat, command-line options
272      -msingle-float or -mdouble-float.  The default is false.  */
273   bfd_boolean single_float;
274 };
275
276 /* This is the struct we use to hold the current set of options.  Note
277    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
278    -1 to indicate that they have not been initialized.  */
279
280 /* True if -mgp32 was passed.  */
281 static int file_mips_gp32 = -1;
282
283 /* True if -mfp32 was passed.  */
284 static int file_mips_fp32 = -1;
285
286 /* 1 if -msoft-float, 0 if -mhard-float.  The default is 0.  */
287 static int file_mips_soft_float = 0;
288
289 /* 1 if -msingle-float, 0 if -mdouble-float.  The default is 0.   */
290 static int file_mips_single_float = 0;
291
292 static struct mips_set_options mips_opts =
293 {
294   /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
295   /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
296   /* ase_mcu */ -1, /* ase_virt */ -1, /* mips16 */ -1,/* micromips */ -1,
297   /* noreorder */ 0,  /* at */ ATREG, /* warn_about_macros */ 0,
298   /* nomove */ 0, /* nobopt */ 0, /* noautoextend */ 0, /* gp32 */ 0,
299   /* fp32 */ 0, /* arch */ CPU_UNKNOWN, /* sym32 */ FALSE,
300   /* soft_float */ FALSE, /* single_float */ FALSE
301 };
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 /* MIPS ISA we are using for this output file.  */
310 static int file_mips_isa = ISA_UNKNOWN;
311
312 /* True if any MIPS16 code was produced.  */
313 static int file_ase_mips16;
314
315 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
316                               || mips_opts.isa == ISA_MIPS32R2          \
317                               || mips_opts.isa == ISA_MIPS64            \
318                               || mips_opts.isa == ISA_MIPS64R2)
319
320 /* True if any microMIPS code was produced.  */
321 static int file_ase_micromips;
322
323 /* True if we want to create R_MIPS_JALR for jalr $25.  */
324 #ifdef TE_IRIX
325 #define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
326 #else
327 /* As a GNU extension, we use R_MIPS_JALR for o32 too.  However,
328    because there's no place for any addend, the only acceptable
329    expression is a bare symbol.  */
330 #define MIPS_JALR_HINT_P(EXPR) \
331   (!HAVE_IN_PLACE_ADDENDS \
332    || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
333 #endif
334
335 /* True if -mips3d was passed or implied by arguments passed on the
336    command line (e.g., by -march).  */
337 static int file_ase_mips3d;
338
339 /* True if -mdmx was passed or implied by arguments passed on the
340    command line (e.g., by -march).  */
341 static int file_ase_mdmx;
342
343 /* True if -msmartmips was passed or implied by arguments passed on the
344    command line (e.g., by -march).  */
345 static int file_ase_smartmips;
346
347 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32             \
348                                 || mips_opts.isa == ISA_MIPS32R2)
349
350 /* True if -mdsp was passed or implied by arguments passed on the
351    command line (e.g., by -march).  */
352 static int file_ase_dsp;
353
354 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2             \
355                               || mips_opts.isa == ISA_MIPS64R2          \
356                               || mips_opts.micromips)
357
358 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
359
360 /* True if -mdspr2 was passed or implied by arguments passed on the
361    command line (e.g., by -march).  */
362 static int file_ase_dspr2;
363
364 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
365                                 || mips_opts.isa == ISA_MIPS64R2        \
366                                 || mips_opts.micromips)
367
368 /* True if -mmt was passed or implied by arguments passed on the
369    command line (e.g., by -march).  */
370 static int file_ase_mt;
371
372 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
373                              || mips_opts.isa == ISA_MIPS64R2)
374
375 #define ISA_SUPPORTS_MCU_ASE (mips_opts.isa == ISA_MIPS32R2             \
376                               || mips_opts.isa == ISA_MIPS64R2          \
377                               || mips_opts.micromips)
378
379 /* True if -mvirt was passed or implied by arguments passed on the
380    command line (e.g., by -march). */
381 static int file_ase_virt;
382
383 #define ISA_SUPPORTS_VIRT_ASE (mips_opts.isa == ISA_MIPS32R2            \
384                                || mips_opts.isa == ISA_MIPS64R2)
385
386 #define ISA_SUPPORTS_VIRT64_ASE (mips_opts.isa == ISA_MIPS64R2)
387
388 /* The argument of the -march= flag.  The architecture we are assembling.  */
389 static int file_mips_arch = CPU_UNKNOWN;
390 static const char *mips_arch_string;
391
392 /* The argument of the -mtune= flag.  The architecture for which we
393    are optimizing.  */
394 static int mips_tune = CPU_UNKNOWN;
395 static const char *mips_tune_string;
396
397 /* True when generating 32-bit code for a 64-bit processor.  */
398 static int mips_32bitmode = 0;
399
400 /* True if the given ABI requires 32-bit registers.  */
401 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
402
403 /* Likewise 64-bit registers.  */
404 #define ABI_NEEDS_64BIT_REGS(ABI)       \
405   ((ABI) == N32_ABI                     \
406    || (ABI) == N64_ABI                  \
407    || (ABI) == O64_ABI)
408
409 /*  Return true if ISA supports 64 bit wide gp registers.  */
410 #define ISA_HAS_64BIT_REGS(ISA)         \
411   ((ISA) == ISA_MIPS3                   \
412    || (ISA) == ISA_MIPS4                \
413    || (ISA) == ISA_MIPS5                \
414    || (ISA) == ISA_MIPS64               \
415    || (ISA) == ISA_MIPS64R2)
416
417 /*  Return true if ISA supports 64 bit wide float registers.  */
418 #define ISA_HAS_64BIT_FPRS(ISA)         \
419   ((ISA) == ISA_MIPS3                   \
420    || (ISA) == ISA_MIPS4                \
421    || (ISA) == ISA_MIPS5                \
422    || (ISA) == ISA_MIPS32R2             \
423    || (ISA) == ISA_MIPS64               \
424    || (ISA) == ISA_MIPS64R2)
425
426 /* Return true if ISA supports 64-bit right rotate (dror et al.)
427    instructions.  */
428 #define ISA_HAS_DROR(ISA)               \
429   ((ISA) == ISA_MIPS64R2                \
430    || (mips_opts.micromips              \
431        && ISA_HAS_64BIT_REGS (ISA))     \
432    )
433
434 /* Return true if ISA supports 32-bit right rotate (ror et al.)
435    instructions.  */
436 #define ISA_HAS_ROR(ISA)                \
437   ((ISA) == ISA_MIPS32R2                \
438    || (ISA) == ISA_MIPS64R2             \
439    || mips_opts.ase_smartmips           \
440    || mips_opts.micromips               \
441    )
442
443 /* Return true if ISA supports single-precision floats in odd registers.  */
444 #define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
445   ((ISA) == ISA_MIPS32                  \
446    || (ISA) == ISA_MIPS32R2             \
447    || (ISA) == ISA_MIPS64               \
448    || (ISA) == ISA_MIPS64R2)
449
450 /* Return true if ISA supports move to/from high part of a 64-bit
451    floating-point register. */
452 #define ISA_HAS_MXHC1(ISA)              \
453   ((ISA) == ISA_MIPS32R2                \
454    || (ISA) == ISA_MIPS64R2)
455
456 #define HAVE_32BIT_GPRS                            \
457     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
458
459 #define HAVE_32BIT_FPRS                            \
460     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
461
462 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
463 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
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   (HAVE_64BIT_GPRS && (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 || (CPU) == CPU_OCTEON2)
514
515 /* True if CPU has seq/sne and seqi/snei instructions.  */
516 #define CPU_HAS_SEQ(CPU)        (CPU_IS_OCTEON (CPU))
517
518 /* True, if CPU has support for ldc1 and sdc1. */
519 #define CPU_HAS_LDC1_SDC1(CPU)  \
520    ((mips_opts.isa != ISA_MIPS1) && ((CPU) != CPU_R5900))
521
522 /* True if mflo and mfhi can be immediately followed by instructions
523    which write to the HI and LO registers.
524
525    According to MIPS specifications, MIPS ISAs I, II, and III need
526    (at least) two instructions between the reads of HI/LO and
527    instructions which write them, and later ISAs do not.  Contradicting
528    the MIPS specifications, some MIPS IV processor user manuals (e.g.
529    the UM for the NEC Vr5000) document needing the instructions between
530    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
531    MIPS64 and later ISAs to have the interlocks, plus any specific
532    earlier-ISA CPUs for which CPU documentation declares that the
533    instructions are really interlocked.  */
534 #define hilo_interlocks \
535   (mips_opts.isa == ISA_MIPS32                        \
536    || mips_opts.isa == ISA_MIPS32R2                   \
537    || mips_opts.isa == ISA_MIPS64                     \
538    || mips_opts.isa == ISA_MIPS64R2                   \
539    || mips_opts.arch == CPU_R4010                     \
540    || mips_opts.arch == CPU_R5900                     \
541    || mips_opts.arch == CPU_R10000                    \
542    || mips_opts.arch == CPU_R12000                    \
543    || mips_opts.arch == CPU_R14000                    \
544    || mips_opts.arch == CPU_R16000                    \
545    || mips_opts.arch == CPU_RM7000                    \
546    || mips_opts.arch == CPU_VR5500                    \
547    || mips_opts.micromips                             \
548    )
549
550 /* Whether the processor uses hardware interlocks to protect reads
551    from the GPRs after they are loaded from memory, and thus does not
552    require nops to be inserted.  This applies to instructions marked
553    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
554    level I and microMIPS mode instructions are always interlocked.  */
555 #define gpr_interlocks                                \
556   (mips_opts.isa != ISA_MIPS1                         \
557    || mips_opts.arch == CPU_R3900                     \
558    || mips_opts.arch == CPU_R5900                     \
559    || mips_opts.micromips                             \
560    )
561
562 /* Whether the processor uses hardware interlocks to avoid delays
563    required by coprocessor instructions, and thus does not require
564    nops to be inserted.  This applies to instructions marked
565    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
566    between instructions marked INSN_WRITE_COND_CODE and ones marked
567    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
568    levels I, II, and III and microMIPS mode instructions are always
569    interlocked.  */
570 /* Itbl support may require additional care here.  */
571 #define cop_interlocks                                \
572   ((mips_opts.isa != ISA_MIPS1                        \
573     && mips_opts.isa != ISA_MIPS2                     \
574     && mips_opts.isa != ISA_MIPS3)                    \
575    || mips_opts.arch == CPU_R4300                     \
576    || mips_opts.micromips                             \
577    )
578
579 /* Whether the processor uses hardware interlocks to protect reads
580    from coprocessor registers after they are loaded from memory, and
581    thus does not require nops to be inserted.  This applies to
582    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
583    requires at MIPS ISA level I and microMIPS mode instructions are
584    always interlocked.  */
585 #define cop_mem_interlocks                            \
586   (mips_opts.isa != ISA_MIPS1                         \
587    || mips_opts.micromips                             \
588    )
589
590 /* Is this a mfhi or mflo instruction?  */
591 #define MF_HILO_INSN(PINFO) \
592   ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
593
594 /* Whether code compression (either of the MIPS16 or the microMIPS ASEs)
595    has been selected.  This implies, in particular, that addresses of text
596    labels have their LSB set.  */
597 #define HAVE_CODE_COMPRESSION                                           \
598   ((mips_opts.mips16 | mips_opts.micromips) != 0)
599
600 /* MIPS PIC level.  */
601
602 enum mips_pic_level mips_pic;
603
604 /* 1 if we should generate 32 bit offsets from the $gp register in
605    SVR4_PIC mode.  Currently has no meaning in other modes.  */
606 static int mips_big_got = 0;
607
608 /* 1 if trap instructions should used for overflow rather than break
609    instructions.  */
610 static int mips_trap = 0;
611
612 /* 1 if double width floating point constants should not be constructed
613    by assembling two single width halves into two single width floating
614    point registers which just happen to alias the double width destination
615    register.  On some architectures this aliasing can be disabled by a bit
616    in the status register, and the setting of this bit cannot be determined
617    automatically at assemble time.  */
618 static int mips_disable_float_construction;
619
620 /* Non-zero if any .set noreorder directives were used.  */
621
622 static int mips_any_noreorder;
623
624 /* Non-zero if nops should be inserted when the register referenced in
625    an mfhi/mflo instruction is read in the next two instructions.  */
626 static int mips_7000_hilo_fix;
627
628 /* The size of objects in the small data section.  */
629 static unsigned int g_switch_value = 8;
630 /* Whether the -G option was used.  */
631 static int g_switch_seen = 0;
632
633 #define N_RMASK 0xc4
634 #define N_VFP   0xd4
635
636 /* If we can determine in advance that GP optimization won't be
637    possible, we can skip the relaxation stuff that tries to produce
638    GP-relative references.  This makes delay slot optimization work
639    better.
640
641    This function can only provide a guess, but it seems to work for
642    gcc output.  It needs to guess right for gcc, otherwise gcc
643    will put what it thinks is a GP-relative instruction in a branch
644    delay slot.
645
646    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
647    fixed it for the non-PIC mode.  KR 95/04/07  */
648 static int nopic_need_relax (symbolS *, int);
649
650 /* handle of the OPCODE hash table */
651 static struct hash_control *op_hash = NULL;
652
653 /* The opcode hash table we use for the mips16.  */
654 static struct hash_control *mips16_op_hash = NULL;
655
656 /* The opcode hash table we use for the microMIPS ASE.  */
657 static struct hash_control *micromips_op_hash = NULL;
658
659 /* This array holds the chars that always start a comment.  If the
660     pre-processor is disabled, these aren't very useful */
661 const char comment_chars[] = "#";
662
663 /* This array holds the chars that only start a comment at the beginning of
664    a line.  If the line seems to have the form '# 123 filename'
665    .line and .file directives will appear in the pre-processed output */
666 /* Note that input_file.c hand checks for '#' at the beginning of the
667    first line of the input file.  This is because the compiler outputs
668    #NO_APP at the beginning of its output.  */
669 /* Also note that C style comments are always supported.  */
670 const char line_comment_chars[] = "#";
671
672 /* This array holds machine specific line separator characters.  */
673 const char line_separator_chars[] = ";";
674
675 /* Chars that can be used to separate mant from exp in floating point nums */
676 const char EXP_CHARS[] = "eE";
677
678 /* Chars that mean this number is a floating point constant */
679 /* As in 0f12.456 */
680 /* or    0d1.2345e12 */
681 const char FLT_CHARS[] = "rRsSfFdDxXpP";
682
683 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
684    changed in read.c .  Ideally it shouldn't have to know about it at all,
685    but nothing is ideal around here.
686  */
687
688 static char *insn_error;
689
690 static int auto_align = 1;
691
692 /* When outputting SVR4 PIC code, the assembler needs to know the
693    offset in the stack frame from which to restore the $gp register.
694    This is set by the .cprestore pseudo-op, and saved in this
695    variable.  */
696 static offsetT mips_cprestore_offset = -1;
697
698 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
699    more optimizations, it can use a register value instead of a memory-saved
700    offset and even an other register than $gp as global pointer.  */
701 static offsetT mips_cpreturn_offset = -1;
702 static int mips_cpreturn_register = -1;
703 static int mips_gp_register = GP;
704 static int mips_gprel_offset = 0;
705
706 /* Whether mips_cprestore_offset has been set in the current function
707    (or whether it has already been warned about, if not).  */
708 static int mips_cprestore_valid = 0;
709
710 /* This is the register which holds the stack frame, as set by the
711    .frame pseudo-op.  This is needed to implement .cprestore.  */
712 static int mips_frame_reg = SP;
713
714 /* Whether mips_frame_reg has been set in the current function
715    (or whether it has already been warned about, if not).  */
716 static int mips_frame_reg_valid = 0;
717
718 /* To output NOP instructions correctly, we need to keep information
719    about the previous two instructions.  */
720
721 /* Whether we are optimizing.  The default value of 2 means to remove
722    unneeded NOPs and swap branch instructions when possible.  A value
723    of 1 means to not swap branches.  A value of 0 means to always
724    insert NOPs.  */
725 static int mips_optimize = 2;
726
727 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
728    equivalent to seeing no -g option at all.  */
729 static int mips_debug = 0;
730
731 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
732 #define MAX_VR4130_NOPS 4
733
734 /* The maximum number of NOPs needed to fill delay slots.  */
735 #define MAX_DELAY_NOPS 2
736
737 /* The maximum number of NOPs needed for any purpose.  */
738 #define MAX_NOPS 4
739
740 /* A list of previous instructions, with index 0 being the most recent.
741    We need to look back MAX_NOPS instructions when filling delay slots
742    or working around processor errata.  We need to look back one
743    instruction further if we're thinking about using history[0] to
744    fill a branch delay slot.  */
745 static struct mips_cl_insn history[1 + MAX_NOPS];
746
747 /* Nop instructions used by emit_nop.  */
748 static struct mips_cl_insn nop_insn;
749 static struct mips_cl_insn mips16_nop_insn;
750 static struct mips_cl_insn micromips_nop16_insn;
751 static struct mips_cl_insn micromips_nop32_insn;
752
753 /* The appropriate nop for the current mode.  */
754 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn \
755                   : (mips_opts.micromips ? &micromips_nop16_insn : &nop_insn))
756
757 /* The size of NOP_INSN in bytes.  */
758 #define NOP_INSN_SIZE (HAVE_CODE_COMPRESSION ? 2 : 4)
759
760 /* If this is set, it points to a frag holding nop instructions which
761    were inserted before the start of a noreorder section.  If those
762    nops turn out to be unnecessary, the size of the frag can be
763    decreased.  */
764 static fragS *prev_nop_frag;
765
766 /* The number of nop instructions we created in prev_nop_frag.  */
767 static int prev_nop_frag_holds;
768
769 /* The number of nop instructions that we know we need in
770    prev_nop_frag.  */
771 static int prev_nop_frag_required;
772
773 /* The number of instructions we've seen since prev_nop_frag.  */
774 static int prev_nop_frag_since;
775
776 /* For ECOFF and ELF, relocations against symbols are done in two
777    parts, with a HI relocation and a LO relocation.  Each relocation
778    has only 16 bits of space to store an addend.  This means that in
779    order for the linker to handle carries correctly, it must be able
780    to locate both the HI and the LO relocation.  This means that the
781    relocations must appear in order in the relocation table.
782
783    In order to implement this, we keep track of each unmatched HI
784    relocation.  We then sort them so that they immediately precede the
785    corresponding LO relocation.  */
786
787 struct mips_hi_fixup
788 {
789   /* Next HI fixup.  */
790   struct mips_hi_fixup *next;
791   /* This fixup.  */
792   fixS *fixp;
793   /* The section this fixup is in.  */
794   segT seg;
795 };
796
797 /* The list of unmatched HI relocs.  */
798
799 static struct mips_hi_fixup *mips_hi_fixup_list;
800
801 /* The frag containing the last explicit relocation operator.
802    Null if explicit relocations have not been used.  */
803
804 static fragS *prev_reloc_op_frag;
805
806 /* Map normal MIPS register numbers to mips16 register numbers.  */
807
808 #define X ILLEGAL_REG
809 static const int mips32_to_16_reg_map[] =
810 {
811   X, X, 2, 3, 4, 5, 6, 7,
812   X, X, X, X, X, X, X, X,
813   0, 1, X, X, X, X, X, X,
814   X, X, X, X, X, X, X, X
815 };
816 #undef X
817
818 /* Map mips16 register numbers to normal MIPS register numbers.  */
819
820 static const unsigned int mips16_to_32_reg_map[] =
821 {
822   16, 17, 2, 3, 4, 5, 6, 7
823 };
824
825 /* Map normal MIPS register numbers to microMIPS register numbers.  */
826
827 #define mips32_to_micromips_reg_b_map   mips32_to_16_reg_map
828 #define mips32_to_micromips_reg_c_map   mips32_to_16_reg_map
829 #define mips32_to_micromips_reg_d_map   mips32_to_16_reg_map
830 #define mips32_to_micromips_reg_e_map   mips32_to_16_reg_map
831 #define mips32_to_micromips_reg_f_map   mips32_to_16_reg_map
832 #define mips32_to_micromips_reg_g_map   mips32_to_16_reg_map
833 #define mips32_to_micromips_reg_l_map   mips32_to_16_reg_map
834
835 #define X ILLEGAL_REG
836 /* reg type h: 4, 5, 6.  */
837 static const int mips32_to_micromips_reg_h_map[] =
838 {
839   X, X, X, X, 4, 5, 6, X,
840   X, X, X, X, X, X, X, X,
841   X, X, X, X, X, X, X, X,
842   X, X, X, X, X, X, X, X
843 };
844
845 /* reg type m: 0, 17, 2, 3, 16, 18, 19, 20.  */
846 static const int mips32_to_micromips_reg_m_map[] =
847 {
848   0, X, 2, 3, X, X, X, X,
849   X, X, X, X, X, X, X, X,
850   4, 1, 5, 6, 7, X, X, X,
851   X, X, X, X, X, X, X, X
852 };
853
854 /* reg type q: 0, 2-7. 17.  */
855 static const int mips32_to_micromips_reg_q_map[] =
856 {
857   0, X, 2, 3, 4, 5, 6, 7,
858   X, X, X, X, X, X, X, X,
859   X, 1, X, X, X, X, X, X,
860   X, X, X, X, X, X, X, X
861 };
862
863 #define mips32_to_micromips_reg_n_map  mips32_to_micromips_reg_m_map
864 #undef X
865
866 /* Map microMIPS register numbers to normal MIPS register numbers.  */
867
868 #define micromips_to_32_reg_b_map       mips16_to_32_reg_map
869 #define micromips_to_32_reg_c_map       mips16_to_32_reg_map
870 #define micromips_to_32_reg_d_map       mips16_to_32_reg_map
871 #define micromips_to_32_reg_e_map       mips16_to_32_reg_map
872 #define micromips_to_32_reg_f_map       mips16_to_32_reg_map
873 #define micromips_to_32_reg_g_map       mips16_to_32_reg_map
874
875 /* The microMIPS registers with type h.  */
876 static const unsigned int micromips_to_32_reg_h_map[] =
877 {
878   5, 5, 6, 4, 4, 4, 4, 4
879 };
880
881 /* The microMIPS registers with type i.  */
882 static const unsigned int micromips_to_32_reg_i_map[] =
883 {
884   6, 7, 7, 21, 22, 5, 6, 7
885 };
886
887 #define micromips_to_32_reg_l_map       mips16_to_32_reg_map
888
889 /* The microMIPS registers with type m.  */
890 static const unsigned int micromips_to_32_reg_m_map[] =
891 {
892   0, 17, 2, 3, 16, 18, 19, 20
893 };
894
895 #define micromips_to_32_reg_n_map      micromips_to_32_reg_m_map
896
897 /* The microMIPS registers with type q.  */
898 static const unsigned int micromips_to_32_reg_q_map[] =
899 {
900   0, 17, 2, 3, 4, 5, 6, 7
901 };
902
903 /* microMIPS imm type B.  */
904 static const int micromips_imm_b_map[] =
905 {
906   1, 4, 8, 12, 16, 20, 24, -1
907 };
908
909 /* microMIPS imm type C.  */
910 static const int micromips_imm_c_map[] =
911 {
912   128, 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 255, 32768, 65535
913 };
914
915 /* Classifies the kind of instructions we're interested in when
916    implementing -mfix-vr4120.  */
917 enum fix_vr4120_class
918 {
919   FIX_VR4120_MACC,
920   FIX_VR4120_DMACC,
921   FIX_VR4120_MULT,
922   FIX_VR4120_DMULT,
923   FIX_VR4120_DIV,
924   FIX_VR4120_MTHILO,
925   NUM_FIX_VR4120_CLASSES
926 };
927
928 /* ...likewise -mfix-loongson2f-jump.  */
929 static bfd_boolean mips_fix_loongson2f_jump;
930
931 /* ...likewise -mfix-loongson2f-nop.  */
932 static bfd_boolean mips_fix_loongson2f_nop;
933
934 /* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed.  */
935 static bfd_boolean mips_fix_loongson2f;
936
937 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
938    there must be at least one other instruction between an instruction
939    of type X and an instruction of type Y.  */
940 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
941
942 /* True if -mfix-vr4120 is in force.  */
943 static int mips_fix_vr4120;
944
945 /* ...likewise -mfix-vr4130.  */
946 static int mips_fix_vr4130;
947
948 /* ...likewise -mfix-24k.  */
949 static int mips_fix_24k;
950
951 /* ...likewise -mfix-cn63xxp1 */
952 static bfd_boolean mips_fix_cn63xxp1;
953
954 /* We don't relax branches by default, since this causes us to expand
955    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
956    fail to compute the offset before expanding the macro to the most
957    efficient expansion.  */
958
959 static int mips_relax_branch;
960 \f
961 /* The expansion of many macros depends on the type of symbol that
962    they refer to.  For example, when generating position-dependent code,
963    a macro that refers to a symbol may have two different expansions,
964    one which uses GP-relative addresses and one which uses absolute
965    addresses.  When generating SVR4-style PIC, a macro may have
966    different expansions for local and global symbols.
967
968    We handle these situations by generating both sequences and putting
969    them in variant frags.  In position-dependent code, the first sequence
970    will be the GP-relative one and the second sequence will be the
971    absolute one.  In SVR4 PIC, the first sequence will be for global
972    symbols and the second will be for local symbols.
973
974    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
975    SECOND are the lengths of the two sequences in bytes.  These fields
976    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
977    the subtype has the following flags:
978
979    RELAX_USE_SECOND
980         Set if it has been decided that we should use the second
981         sequence instead of the first.
982
983    RELAX_SECOND_LONGER
984         Set in the first variant frag if the macro's second implementation
985         is longer than its first.  This refers to the macro as a whole,
986         not an individual relaxation.
987
988    RELAX_NOMACRO
989         Set in the first variant frag if the macro appeared in a .set nomacro
990         block and if one alternative requires a warning but the other does not.
991
992    RELAX_DELAY_SLOT
993         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
994         delay slot.
995
996    RELAX_DELAY_SLOT_16BIT
997         Like RELAX_DELAY_SLOT, but indicates that the delay slot requires a
998         16-bit instruction.
999
1000    RELAX_DELAY_SLOT_SIZE_FIRST
1001         Like RELAX_DELAY_SLOT, but indicates that the first implementation of
1002         the macro is of the wrong size for the branch delay slot.
1003
1004    RELAX_DELAY_SLOT_SIZE_SECOND
1005         Like RELAX_DELAY_SLOT, but indicates that the second implementation of
1006         the macro is of the wrong size for the branch delay slot.
1007
1008    The frag's "opcode" points to the first fixup for relaxable code.
1009
1010    Relaxable macros are generated using a sequence such as:
1011
1012       relax_start (SYMBOL);
1013       ... generate first expansion ...
1014       relax_switch ();
1015       ... generate second expansion ...
1016       relax_end ();
1017
1018    The code and fixups for the unwanted alternative are discarded
1019    by md_convert_frag.  */
1020 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
1021
1022 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
1023 #define RELAX_SECOND(X) ((X) & 0xff)
1024 #define RELAX_USE_SECOND 0x10000
1025 #define RELAX_SECOND_LONGER 0x20000
1026 #define RELAX_NOMACRO 0x40000
1027 #define RELAX_DELAY_SLOT 0x80000
1028 #define RELAX_DELAY_SLOT_16BIT 0x100000
1029 #define RELAX_DELAY_SLOT_SIZE_FIRST 0x200000
1030 #define RELAX_DELAY_SLOT_SIZE_SECOND 0x400000
1031
1032 /* Branch without likely bit.  If label is out of range, we turn:
1033
1034         beq reg1, reg2, label
1035         delay slot
1036
1037    into
1038
1039         bne reg1, reg2, 0f
1040         nop
1041         j label
1042      0: delay slot
1043
1044    with the following opcode replacements:
1045
1046         beq <-> bne
1047         blez <-> bgtz
1048         bltz <-> bgez
1049         bc1f <-> bc1t
1050
1051         bltzal <-> bgezal  (with jal label instead of j label)
1052
1053    Even though keeping the delay slot instruction in the delay slot of
1054    the branch would be more efficient, it would be very tricky to do
1055    correctly, because we'd have to introduce a variable frag *after*
1056    the delay slot instruction, and expand that instead.  Let's do it
1057    the easy way for now, even if the branch-not-taken case now costs
1058    one additional instruction.  Out-of-range branches are not supposed
1059    to be common, anyway.
1060
1061    Branch likely.  If label is out of range, we turn:
1062
1063         beql reg1, reg2, label
1064         delay slot (annulled if branch not taken)
1065
1066    into
1067
1068         beql reg1, reg2, 1f
1069         nop
1070         beql $0, $0, 2f
1071         nop
1072      1: j[al] label
1073         delay slot (executed only if branch taken)
1074      2:
1075
1076    It would be possible to generate a shorter sequence by losing the
1077    likely bit, generating something like:
1078
1079         bne reg1, reg2, 0f
1080         nop
1081         j[al] label
1082         delay slot (executed only if branch taken)
1083      0:
1084
1085         beql -> bne
1086         bnel -> beq
1087         blezl -> bgtz
1088         bgtzl -> blez
1089         bltzl -> bgez
1090         bgezl -> bltz
1091         bc1fl -> bc1t
1092         bc1tl -> bc1f
1093
1094         bltzall -> bgezal  (with jal label instead of j label)
1095         bgezall -> bltzal  (ditto)
1096
1097
1098    but it's not clear that it would actually improve performance.  */
1099 #define RELAX_BRANCH_ENCODE(at, uncond, likely, link, toofar)   \
1100   ((relax_substateT)                                            \
1101    (0xc0000000                                                  \
1102     | ((at) & 0x1f)                                             \
1103     | ((toofar) ? 0x20 : 0)                                     \
1104     | ((link) ? 0x40 : 0)                                       \
1105     | ((likely) ? 0x80 : 0)                                     \
1106     | ((uncond) ? 0x100 : 0)))
1107 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
1108 #define RELAX_BRANCH_UNCOND(i) (((i) & 0x100) != 0)
1109 #define RELAX_BRANCH_LIKELY(i) (((i) & 0x80) != 0)
1110 #define RELAX_BRANCH_LINK(i) (((i) & 0x40) != 0)
1111 #define RELAX_BRANCH_TOOFAR(i) (((i) & 0x20) != 0)
1112 #define RELAX_BRANCH_AT(i) ((i) & 0x1f)
1113
1114 /* For mips16 code, we use an entirely different form of relaxation.
1115    mips16 supports two versions of most instructions which take
1116    immediate values: a small one which takes some small value, and a
1117    larger one which takes a 16 bit value.  Since branches also follow
1118    this pattern, relaxing these values is required.
1119
1120    We can assemble both mips16 and normal MIPS code in a single
1121    object.  Therefore, we need to support this type of relaxation at
1122    the same time that we support the relaxation described above.  We
1123    use the high bit of the subtype field to distinguish these cases.
1124
1125    The information we store for this type of relaxation is the
1126    argument code found in the opcode file for this relocation, whether
1127    the user explicitly requested a small or extended form, and whether
1128    the relocation is in a jump or jal delay slot.  That tells us the
1129    size of the value, and how it should be stored.  We also store
1130    whether the fragment is considered to be extended or not.  We also
1131    store whether this is known to be a branch to a different section,
1132    whether we have tried to relax this frag yet, and whether we have
1133    ever extended a PC relative fragment because of a shift count.  */
1134 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
1135   (0x80000000                                                   \
1136    | ((type) & 0xff)                                            \
1137    | ((small) ? 0x100 : 0)                                      \
1138    | ((ext) ? 0x200 : 0)                                        \
1139    | ((dslot) ? 0x400 : 0)                                      \
1140    | ((jal_dslot) ? 0x800 : 0))
1141 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
1142 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
1143 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
1144 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
1145 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
1146 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
1147 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
1148 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
1149 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
1150 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
1151 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
1152 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
1153
1154 /* For microMIPS code, we use relaxation similar to one we use for
1155    MIPS16 code.  Some instructions that take immediate values support
1156    two encodings: a small one which takes some small value, and a
1157    larger one which takes a 16 bit value.  As some branches also follow
1158    this pattern, relaxing these values is required.
1159
1160    We can assemble both microMIPS and normal MIPS code in a single
1161    object.  Therefore, we need to support this type of relaxation at
1162    the same time that we support the relaxation described above.  We
1163    use one of the high bits of the subtype field to distinguish these
1164    cases.
1165
1166    The information we store for this type of relaxation is the argument
1167    code found in the opcode file for this relocation, the register
1168    selected as the assembler temporary, whether the branch is
1169    unconditional, whether it is compact, whether it stores the link
1170    address implicitly in $ra, whether relaxation of out-of-range 32-bit
1171    branches to a sequence of instructions is enabled, and whether the
1172    displacement of a branch is too large to fit as an immediate argument
1173    of a 16-bit and a 32-bit branch, respectively.  */
1174 #define RELAX_MICROMIPS_ENCODE(type, at, uncond, compact, link, \
1175                                relax32, toofar16, toofar32)     \
1176   (0x40000000                                                   \
1177    | ((type) & 0xff)                                            \
1178    | (((at) & 0x1f) << 8)                                       \
1179    | ((uncond) ? 0x2000 : 0)                                    \
1180    | ((compact) ? 0x4000 : 0)                                   \
1181    | ((link) ? 0x8000 : 0)                                      \
1182    | ((relax32) ? 0x10000 : 0)                                  \
1183    | ((toofar16) ? 0x20000 : 0)                                 \
1184    | ((toofar32) ? 0x40000 : 0))
1185 #define RELAX_MICROMIPS_P(i) (((i) & 0xc0000000) == 0x40000000)
1186 #define RELAX_MICROMIPS_TYPE(i) ((i) & 0xff)
1187 #define RELAX_MICROMIPS_AT(i) (((i) >> 8) & 0x1f)
1188 #define RELAX_MICROMIPS_UNCOND(i) (((i) & 0x2000) != 0)
1189 #define RELAX_MICROMIPS_COMPACT(i) (((i) & 0x4000) != 0)
1190 #define RELAX_MICROMIPS_LINK(i) (((i) & 0x8000) != 0)
1191 #define RELAX_MICROMIPS_RELAX32(i) (((i) & 0x10000) != 0)
1192
1193 #define RELAX_MICROMIPS_TOOFAR16(i) (((i) & 0x20000) != 0)
1194 #define RELAX_MICROMIPS_MARK_TOOFAR16(i) ((i) | 0x20000)
1195 #define RELAX_MICROMIPS_CLEAR_TOOFAR16(i) ((i) & ~0x20000)
1196 #define RELAX_MICROMIPS_TOOFAR32(i) (((i) & 0x40000) != 0)
1197 #define RELAX_MICROMIPS_MARK_TOOFAR32(i) ((i) | 0x40000)
1198 #define RELAX_MICROMIPS_CLEAR_TOOFAR32(i) ((i) & ~0x40000)
1199
1200 /* Sign-extend 16-bit value X.  */
1201 #define SEXT_16BIT(X) ((((X) + 0x8000) & 0xffff) - 0x8000)
1202
1203 /* Is the given value a sign-extended 32-bit value?  */
1204 #define IS_SEXT_32BIT_NUM(x)                                            \
1205   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
1206    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
1207
1208 /* Is the given value a sign-extended 16-bit value?  */
1209 #define IS_SEXT_16BIT_NUM(x)                                            \
1210   (((x) &~ (offsetT) 0x7fff) == 0                                       \
1211    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
1212
1213 /* Is the given value a sign-extended 12-bit value?  */
1214 #define IS_SEXT_12BIT_NUM(x)                                            \
1215   (((((x) & 0xfff) ^ 0x800LL) - 0x800LL) == (x))
1216
1217 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
1218 #define IS_ZEXT_32BIT_NUM(x)                                            \
1219   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
1220    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
1221
1222 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
1223    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
1224 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
1225   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
1226               | (((VALUE) & (MASK)) << (SHIFT)))
1227
1228 /* Extract bits MASK << SHIFT from STRUCT and shift them right
1229    SHIFT places.  */
1230 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
1231   (((STRUCT) >> (SHIFT)) & (MASK))
1232
1233 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1234    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1235
1236    include/opcode/mips.h specifies operand fields using the macros
1237    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
1238    with "MIPS16OP" instead of "OP".  */
1239 #define INSERT_OPERAND(MICROMIPS, FIELD, INSN, VALUE) \
1240   do \
1241     if (!(MICROMIPS)) \
1242       INSERT_BITS ((INSN).insn_opcode, VALUE, \
1243                    OP_MASK_##FIELD, OP_SH_##FIELD); \
1244     else \
1245       INSERT_BITS ((INSN).insn_opcode, VALUE, \
1246                    MICROMIPSOP_MASK_##FIELD, MICROMIPSOP_SH_##FIELD); \
1247   while (0)
1248 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1249   INSERT_BITS ((INSN).insn_opcode, VALUE, \
1250                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1251
1252 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
1253 #define EXTRACT_OPERAND(MICROMIPS, FIELD, INSN) \
1254   (!(MICROMIPS) \
1255    ? EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD) \
1256    : EXTRACT_BITS ((INSN).insn_opcode, \
1257                    MICROMIPSOP_MASK_##FIELD, MICROMIPSOP_SH_##FIELD))
1258 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1259   EXTRACT_BITS ((INSN).insn_opcode, \
1260                 MIPS16OP_MASK_##FIELD, \
1261                 MIPS16OP_SH_##FIELD)
1262
1263 /* The MIPS16 EXTEND opcode, shifted left 16 places.  */
1264 #define MIPS16_EXTEND (0xf000U << 16)
1265 \f
1266 /* Whether or not we are emitting a branch-likely macro.  */
1267 static bfd_boolean emit_branch_likely_macro = FALSE;
1268
1269 /* Global variables used when generating relaxable macros.  See the
1270    comment above RELAX_ENCODE for more details about how relaxation
1271    is used.  */
1272 static struct {
1273   /* 0 if we're not emitting a relaxable macro.
1274      1 if we're emitting the first of the two relaxation alternatives.
1275      2 if we're emitting the second alternative.  */
1276   int sequence;
1277
1278   /* The first relaxable fixup in the current frag.  (In other words,
1279      the first fixup that refers to relaxable code.)  */
1280   fixS *first_fixup;
1281
1282   /* sizes[0] says how many bytes of the first alternative are stored in
1283      the current frag.  Likewise sizes[1] for the second alternative.  */
1284   unsigned int sizes[2];
1285
1286   /* The symbol on which the choice of sequence depends.  */
1287   symbolS *symbol;
1288 } mips_relax;
1289 \f
1290 /* Global variables used to decide whether a macro needs a warning.  */
1291 static struct {
1292   /* True if the macro is in a branch delay slot.  */
1293   bfd_boolean delay_slot_p;
1294
1295   /* Set to the length in bytes required if the macro is in a delay slot
1296      that requires a specific length of instruction, otherwise zero.  */
1297   unsigned int delay_slot_length;
1298
1299   /* For relaxable macros, sizes[0] is the length of the first alternative
1300      in bytes and sizes[1] is the length of the second alternative.
1301      For non-relaxable macros, both elements give the length of the
1302      macro in bytes.  */
1303   unsigned int sizes[2];
1304
1305   /* For relaxable macros, first_insn_sizes[0] is the length of the first
1306      instruction of the first alternative in bytes and first_insn_sizes[1]
1307      is the length of the first instruction of the second alternative.
1308      For non-relaxable macros, both elements give the length of the first
1309      instruction in bytes.
1310
1311      Set to zero if we haven't yet seen the first instruction.  */
1312   unsigned int first_insn_sizes[2];
1313
1314   /* For relaxable macros, insns[0] is the number of instructions for the
1315      first alternative and insns[1] is the number of instructions for the
1316      second alternative.
1317
1318      For non-relaxable macros, both elements give the number of
1319      instructions for the macro.  */
1320   unsigned int insns[2];
1321
1322   /* The first variant frag for this macro.  */
1323   fragS *first_frag;
1324 } mips_macro_warning;
1325 \f
1326 /* Prototypes for static functions.  */
1327
1328 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1329
1330 static void append_insn
1331   (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *,
1332    bfd_boolean expansionp);
1333 static void mips_no_prev_insn (void);
1334 static void macro_build (expressionS *, const char *, const char *, ...);
1335 static void mips16_macro_build
1336   (expressionS *, const char *, const char *, va_list *);
1337 static void load_register (int, expressionS *, int);
1338 static void macro_start (void);
1339 static void macro_end (void);
1340 static void macro (struct mips_cl_insn * ip);
1341 static void mips16_macro (struct mips_cl_insn * ip);
1342 static void mips_ip (char *str, struct mips_cl_insn * ip);
1343 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1344 static void mips16_immed
1345   (char *, unsigned int, int, bfd_reloc_code_real_type, offsetT,
1346    unsigned int, unsigned long *);
1347 static size_t my_getSmallExpression
1348   (expressionS *, bfd_reloc_code_real_type *, char *);
1349 static void my_getExpression (expressionS *, char *);
1350 static void s_align (int);
1351 static void s_change_sec (int);
1352 static void s_change_section (int);
1353 static void s_cons (int);
1354 static void s_float_cons (int);
1355 static void s_mips_globl (int);
1356 static void s_option (int);
1357 static void s_mipsset (int);
1358 static void s_abicalls (int);
1359 static void s_cpload (int);
1360 static void s_cpsetup (int);
1361 static void s_cplocal (int);
1362 static void s_cprestore (int);
1363 static void s_cpreturn (int);
1364 static void s_dtprelword (int);
1365 static void s_dtpreldword (int);
1366 static void s_tprelword (int);
1367 static void s_tpreldword (int);
1368 static void s_gpvalue (int);
1369 static void s_gpword (int);
1370 static void s_gpdword (int);
1371 static void s_cpadd (int);
1372 static void s_insn (int);
1373 static void md_obj_begin (void);
1374 static void md_obj_end (void);
1375 static void s_mips_ent (int);
1376 static void s_mips_end (int);
1377 static void s_mips_frame (int);
1378 static void s_mips_mask (int reg_type);
1379 static void s_mips_stab (int);
1380 static void s_mips_weakext (int);
1381 static void s_mips_file (int);
1382 static void s_mips_loc (int);
1383 static bfd_boolean pic_need_relax (symbolS *, asection *);
1384 static int relaxed_branch_length (fragS *, asection *, int);
1385 static int validate_mips_insn (const struct mips_opcode *);
1386 static int validate_micromips_insn (const struct mips_opcode *);
1387 static int relaxed_micromips_16bit_branch_length (fragS *, asection *, int);
1388 static int relaxed_micromips_32bit_branch_length (fragS *, asection *, int);
1389
1390 /* Table and functions used to map between CPU/ISA names, and
1391    ISA levels, and CPU numbers.  */
1392
1393 struct mips_cpu_info
1394 {
1395   const char *name;           /* CPU or ISA name.  */
1396   int flags;                  /* ASEs available, or ISA flag.  */
1397   int isa;                    /* ISA level.  */
1398   int cpu;                    /* CPU number (default CPU if ISA).  */
1399 };
1400
1401 #define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1402 #define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1403 #define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1404 #define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1405 #define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1406 #define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1407 #define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1408 #define MIPS_CPU_ASE_MCU        0x0080  /* CPU implements MCU ASE */
1409 #define MIPS_CPU_ASE_VIRT       0x0100  /* CPU implements Virtualization ASE */
1410
1411 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1412 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1413 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1414 \f
1415 /* Pseudo-op table.
1416
1417    The following pseudo-ops from the Kane and Heinrich MIPS book
1418    should be defined here, but are currently unsupported: .alias,
1419    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1420
1421    The following pseudo-ops from the Kane and Heinrich MIPS book are
1422    specific to the type of debugging information being generated, and
1423    should be defined by the object format: .aent, .begin, .bend,
1424    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1425    .vreg.
1426
1427    The following pseudo-ops from the Kane and Heinrich MIPS book are
1428    not MIPS CPU specific, but are also not specific to the object file
1429    format.  This file is probably the best place to define them, but
1430    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1431
1432 static const pseudo_typeS mips_pseudo_table[] =
1433 {
1434   /* MIPS specific pseudo-ops.  */
1435   {"option", s_option, 0},
1436   {"set", s_mipsset, 0},
1437   {"rdata", s_change_sec, 'r'},
1438   {"sdata", s_change_sec, 's'},
1439   {"livereg", s_ignore, 0},
1440   {"abicalls", s_abicalls, 0},
1441   {"cpload", s_cpload, 0},
1442   {"cpsetup", s_cpsetup, 0},
1443   {"cplocal", s_cplocal, 0},
1444   {"cprestore", s_cprestore, 0},
1445   {"cpreturn", s_cpreturn, 0},
1446   {"dtprelword", s_dtprelword, 0},
1447   {"dtpreldword", s_dtpreldword, 0},
1448   {"tprelword", s_tprelword, 0},
1449   {"tpreldword", s_tpreldword, 0},
1450   {"gpvalue", s_gpvalue, 0},
1451   {"gpword", s_gpword, 0},
1452   {"gpdword", s_gpdword, 0},
1453   {"cpadd", s_cpadd, 0},
1454   {"insn", s_insn, 0},
1455
1456   /* Relatively generic pseudo-ops that happen to be used on MIPS
1457      chips.  */
1458   {"asciiz", stringer, 8 + 1},
1459   {"bss", s_change_sec, 'b'},
1460   {"err", s_err, 0},
1461   {"half", s_cons, 1},
1462   {"dword", s_cons, 3},
1463   {"weakext", s_mips_weakext, 0},
1464   {"origin", s_org, 0},
1465   {"repeat", s_rept, 0},
1466
1467   /* For MIPS this is non-standard, but we define it for consistency.  */
1468   {"sbss", s_change_sec, 'B'},
1469
1470   /* These pseudo-ops are defined in read.c, but must be overridden
1471      here for one reason or another.  */
1472   {"align", s_align, 0},
1473   {"byte", s_cons, 0},
1474   {"data", s_change_sec, 'd'},
1475   {"double", s_float_cons, 'd'},
1476   {"float", s_float_cons, 'f'},
1477   {"globl", s_mips_globl, 0},
1478   {"global", s_mips_globl, 0},
1479   {"hword", s_cons, 1},
1480   {"int", s_cons, 2},
1481   {"long", s_cons, 2},
1482   {"octa", s_cons, 4},
1483   {"quad", s_cons, 3},
1484   {"section", s_change_section, 0},
1485   {"short", s_cons, 1},
1486   {"single", s_float_cons, 'f'},
1487   {"stabd", s_mips_stab, 'd'},
1488   {"stabn", s_mips_stab, 'n'},
1489   {"stabs", s_mips_stab, 's'},
1490   {"text", s_change_sec, 't'},
1491   {"word", s_cons, 2},
1492
1493   { "extern", ecoff_directive_extern, 0},
1494
1495   { NULL, NULL, 0 },
1496 };
1497
1498 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1499 {
1500   /* These pseudo-ops should be defined by the object file format.
1501      However, a.out doesn't support them, so we have versions here.  */
1502   {"aent", s_mips_ent, 1},
1503   {"bgnb", s_ignore, 0},
1504   {"end", s_mips_end, 0},
1505   {"endb", s_ignore, 0},
1506   {"ent", s_mips_ent, 0},
1507   {"file", s_mips_file, 0},
1508   {"fmask", s_mips_mask, 'F'},
1509   {"frame", s_mips_frame, 0},
1510   {"loc", s_mips_loc, 0},
1511   {"mask", s_mips_mask, 'R'},
1512   {"verstamp", s_ignore, 0},
1513   { NULL, NULL, 0 },
1514 };
1515
1516 /* Export the ABI address size for use by TC_ADDRESS_BYTES for the
1517    purpose of the `.dc.a' internal pseudo-op.  */
1518
1519 int
1520 mips_address_bytes (void)
1521 {
1522   return HAVE_64BIT_ADDRESSES ? 8 : 4;
1523 }
1524
1525 extern void pop_insert (const pseudo_typeS *);
1526
1527 void
1528 mips_pop_insert (void)
1529 {
1530   pop_insert (mips_pseudo_table);
1531   if (! ECOFF_DEBUGGING)
1532     pop_insert (mips_nonecoff_pseudo_table);
1533 }
1534 \f
1535 /* Symbols labelling the current insn.  */
1536
1537 struct insn_label_list
1538 {
1539   struct insn_label_list *next;
1540   symbolS *label;
1541 };
1542
1543 static struct insn_label_list *free_insn_labels;
1544 #define label_list tc_segment_info_data.labels
1545
1546 static void mips_clear_insn_labels (void);
1547 static void mips_mark_labels (void);
1548 static void mips_compressed_mark_labels (void);
1549
1550 static inline void
1551 mips_clear_insn_labels (void)
1552 {
1553   register struct insn_label_list **pl;
1554   segment_info_type *si;
1555
1556   if (now_seg)
1557     {
1558       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1559         ;
1560       
1561       si = seg_info (now_seg);
1562       *pl = si->label_list;
1563       si->label_list = NULL;
1564     }
1565 }
1566
1567 /* Mark instruction labels in MIPS16/microMIPS mode.  */
1568
1569 static inline void
1570 mips_mark_labels (void)
1571 {
1572   if (HAVE_CODE_COMPRESSION)
1573     mips_compressed_mark_labels ();
1574 }
1575 \f
1576 static char *expr_end;
1577
1578 /* Expressions which appear in instructions.  These are set by
1579    mips_ip.  */
1580
1581 static expressionS imm_expr;
1582 static expressionS imm2_expr;
1583 static expressionS offset_expr;
1584
1585 /* Relocs associated with imm_expr and offset_expr.  */
1586
1587 static bfd_reloc_code_real_type imm_reloc[3]
1588   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1589 static bfd_reloc_code_real_type offset_reloc[3]
1590   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1591
1592 /* This is set to the resulting size of the instruction to be produced
1593    by mips16_ip if an explicit extension is used or by mips_ip if an
1594    explicit size is supplied.  */
1595
1596 static unsigned int forced_insn_length;
1597
1598 /* True if we are assembling an instruction.  All dot symbols defined during
1599    this time should be treated as code labels.  */
1600
1601 static bfd_boolean mips_assembling_insn;
1602
1603 #ifdef OBJ_ELF
1604 /* The pdr segment for per procedure frame/regmask info.  Not used for
1605    ECOFF debugging.  */
1606
1607 static segT pdr_seg;
1608 #endif
1609
1610 /* The default target format to use.  */
1611
1612 #if defined (TE_FreeBSD)
1613 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips-freebsd"
1614 #elif defined (TE_TMIPS)
1615 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips"
1616 #else
1617 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX ENDIAN "mips"
1618 #endif
1619
1620 const char *
1621 mips_target_format (void)
1622 {
1623   switch (OUTPUT_FLAVOR)
1624     {
1625     case bfd_target_ecoff_flavour:
1626       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1627     case bfd_target_coff_flavour:
1628       return "pe-mips";
1629     case bfd_target_elf_flavour:
1630 #ifdef TE_VXWORKS
1631       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1632         return (target_big_endian
1633                 ? "elf32-bigmips-vxworks"
1634                 : "elf32-littlemips-vxworks");
1635 #endif
1636       return (target_big_endian
1637               ? (HAVE_64BIT_OBJECTS
1638                  ? ELF_TARGET ("elf64-", "big")
1639                  : (HAVE_NEWABI
1640                     ? ELF_TARGET ("elf32-n", "big")
1641                     : ELF_TARGET ("elf32-", "big")))
1642               : (HAVE_64BIT_OBJECTS
1643                  ? ELF_TARGET ("elf64-", "little")
1644                  : (HAVE_NEWABI
1645                     ? ELF_TARGET ("elf32-n", "little")
1646                     : ELF_TARGET ("elf32-", "little"))));
1647     default:
1648       abort ();
1649       return NULL;
1650     }
1651 }
1652
1653 /* Return the length of a microMIPS instruction in bytes.  If bits of
1654    the mask beyond the low 16 are 0, then it is a 16-bit instruction.
1655    Otherwise assume a 32-bit instruction; 48-bit instructions (0x1f
1656    major opcode) will require further modifications to the opcode
1657    table.  */
1658
1659 static inline unsigned int
1660 micromips_insn_length (const struct mips_opcode *mo)
1661 {
1662   return (mo->mask >> 16) == 0 ? 2 : 4;
1663 }
1664
1665 /* Return the length of MIPS16 instruction OPCODE.  */
1666
1667 static inline unsigned int
1668 mips16_opcode_length (unsigned long opcode)
1669 {
1670   return (opcode >> 16) == 0 ? 2 : 4;
1671 }
1672
1673 /* Return the length of instruction INSN.  */
1674
1675 static inline unsigned int
1676 insn_length (const struct mips_cl_insn *insn)
1677 {
1678   if (mips_opts.micromips)
1679     return micromips_insn_length (insn->insn_mo);
1680   else if (mips_opts.mips16)
1681     return mips16_opcode_length (insn->insn_opcode);
1682   else
1683     return 4;
1684 }
1685
1686 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1687
1688 static void
1689 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1690 {
1691   size_t i;
1692
1693   insn->insn_mo = mo;
1694   insn->insn_opcode = mo->match;
1695   insn->frag = NULL;
1696   insn->where = 0;
1697   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1698     insn->fixp[i] = NULL;
1699   insn->fixed_p = (mips_opts.noreorder > 0);
1700   insn->noreorder_p = (mips_opts.noreorder > 0);
1701   insn->mips16_absolute_jump_p = 0;
1702   insn->complete_p = 0;
1703   insn->cleared_p = 0;
1704 }
1705
1706 /* Record the current MIPS16/microMIPS mode in now_seg.  */
1707
1708 static void
1709 mips_record_compressed_mode (void)
1710 {
1711   segment_info_type *si;
1712
1713   si = seg_info (now_seg);
1714   if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1715     si->tc_segment_info_data.mips16 = mips_opts.mips16;
1716   if (si->tc_segment_info_data.micromips != mips_opts.micromips)
1717     si->tc_segment_info_data.micromips = mips_opts.micromips;
1718 }
1719
1720 /* Read a standard MIPS instruction from BUF.  */
1721
1722 static unsigned long
1723 read_insn (char *buf)
1724 {
1725   if (target_big_endian)
1726     return bfd_getb32 ((bfd_byte *) buf);
1727   else
1728     return bfd_getl32 ((bfd_byte *) buf);
1729 }
1730
1731 /* Write standard MIPS instruction INSN to BUF.  Return a pointer to
1732    the next byte.  */
1733
1734 static char *
1735 write_insn (char *buf, unsigned int insn)
1736 {
1737   md_number_to_chars (buf, insn, 4);
1738   return buf + 4;
1739 }
1740
1741 /* Read a microMIPS or MIPS16 opcode from BUF, given that it
1742    has length LENGTH.  */
1743
1744 static unsigned long
1745 read_compressed_insn (char *buf, unsigned int length)
1746 {
1747   unsigned long insn;
1748   unsigned int i;
1749
1750   insn = 0;
1751   for (i = 0; i < length; i += 2)
1752     {
1753       insn <<= 16;
1754       if (target_big_endian)
1755         insn |= bfd_getb16 ((char *) buf);
1756       else
1757         insn |= bfd_getl16 ((char *) buf);
1758       buf += 2;
1759     }
1760   return insn;
1761 }
1762
1763 /* Write microMIPS or MIPS16 instruction INSN to BUF, given that the
1764    instruction is LENGTH bytes long.  Return a pointer to the next byte.  */
1765
1766 static char *
1767 write_compressed_insn (char *buf, unsigned int insn, unsigned int length)
1768 {
1769   unsigned int i;
1770
1771   for (i = 0; i < length; i += 2)
1772     md_number_to_chars (buf + i, insn >> ((length - i - 2) * 8), 2);
1773   return buf + length;
1774 }
1775
1776 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1777
1778 static void
1779 install_insn (const struct mips_cl_insn *insn)
1780 {
1781   char *f = insn->frag->fr_literal + insn->where;
1782   if (HAVE_CODE_COMPRESSION)
1783     write_compressed_insn (f, insn->insn_opcode, insn_length (insn));
1784   else
1785     write_insn (f, insn->insn_opcode);
1786   mips_record_compressed_mode ();
1787 }
1788
1789 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1790    and install the opcode in the new location.  */
1791
1792 static void
1793 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1794 {
1795   size_t i;
1796
1797   insn->frag = frag;
1798   insn->where = where;
1799   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1800     if (insn->fixp[i] != NULL)
1801       {
1802         insn->fixp[i]->fx_frag = frag;
1803         insn->fixp[i]->fx_where = where;
1804       }
1805   install_insn (insn);
1806 }
1807
1808 /* Add INSN to the end of the output.  */
1809
1810 static void
1811 add_fixed_insn (struct mips_cl_insn *insn)
1812 {
1813   char *f = frag_more (insn_length (insn));
1814   move_insn (insn, frag_now, f - frag_now->fr_literal);
1815 }
1816
1817 /* Start a variant frag and move INSN to the start of the variant part,
1818    marking it as fixed.  The other arguments are as for frag_var.  */
1819
1820 static void
1821 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1822                   relax_substateT subtype, symbolS *symbol, offsetT offset)
1823 {
1824   frag_grow (max_chars);
1825   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1826   insn->fixed_p = 1;
1827   frag_var (rs_machine_dependent, max_chars, var,
1828             subtype, symbol, offset, NULL);
1829 }
1830
1831 /* Insert N copies of INSN into the history buffer, starting at
1832    position FIRST.  Neither FIRST nor N need to be clipped.  */
1833
1834 static void
1835 insert_into_history (unsigned int first, unsigned int n,
1836                      const struct mips_cl_insn *insn)
1837 {
1838   if (mips_relax.sequence != 2)
1839     {
1840       unsigned int i;
1841
1842       for (i = ARRAY_SIZE (history); i-- > first;)
1843         if (i >= first + n)
1844           history[i] = history[i - n];
1845         else
1846           history[i] = *insn;
1847     }
1848 }
1849
1850 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1851    the idea is to make it obvious at a glance that each errata is
1852    included.  */
1853
1854 static void
1855 init_vr4120_conflicts (void)
1856 {
1857 #define CONFLICT(FIRST, SECOND) \
1858     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1859
1860   /* Errata 21 - [D]DIV[U] after [D]MACC */
1861   CONFLICT (MACC, DIV);
1862   CONFLICT (DMACC, DIV);
1863
1864   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1865   CONFLICT (DMULT, DMULT);
1866   CONFLICT (DMULT, DMACC);
1867   CONFLICT (DMACC, DMULT);
1868   CONFLICT (DMACC, DMACC);
1869
1870   /* Errata 24 - MT{LO,HI} after [D]MACC */
1871   CONFLICT (MACC, MTHILO);
1872   CONFLICT (DMACC, MTHILO);
1873
1874   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1875      instruction is executed immediately after a MACC or DMACC
1876      instruction, the result of [either instruction] is incorrect."  */
1877   CONFLICT (MACC, MULT);
1878   CONFLICT (MACC, DMULT);
1879   CONFLICT (DMACC, MULT);
1880   CONFLICT (DMACC, DMULT);
1881
1882   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1883      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1884      DDIV or DDIVU instruction, the result of the MACC or
1885      DMACC instruction is incorrect.".  */
1886   CONFLICT (DMULT, MACC);
1887   CONFLICT (DMULT, DMACC);
1888   CONFLICT (DIV, MACC);
1889   CONFLICT (DIV, DMACC);
1890
1891 #undef CONFLICT
1892 }
1893
1894 struct regname {
1895   const char *name;
1896   unsigned int num;
1897 };
1898
1899 #define RTYPE_MASK      0x1ff00
1900 #define RTYPE_NUM       0x00100
1901 #define RTYPE_FPU       0x00200
1902 #define RTYPE_FCC       0x00400
1903 #define RTYPE_VEC       0x00800
1904 #define RTYPE_GP        0x01000
1905 #define RTYPE_CP0       0x02000
1906 #define RTYPE_PC        0x04000
1907 #define RTYPE_ACC       0x08000
1908 #define RTYPE_CCC       0x10000
1909 #define RNUM_MASK       0x000ff
1910 #define RWARN           0x80000
1911
1912 #define GENERIC_REGISTER_NUMBERS \
1913     {"$0",      RTYPE_NUM | 0},  \
1914     {"$1",      RTYPE_NUM | 1},  \
1915     {"$2",      RTYPE_NUM | 2},  \
1916     {"$3",      RTYPE_NUM | 3},  \
1917     {"$4",      RTYPE_NUM | 4},  \
1918     {"$5",      RTYPE_NUM | 5},  \
1919     {"$6",      RTYPE_NUM | 6},  \
1920     {"$7",      RTYPE_NUM | 7},  \
1921     {"$8",      RTYPE_NUM | 8},  \
1922     {"$9",      RTYPE_NUM | 9},  \
1923     {"$10",     RTYPE_NUM | 10}, \
1924     {"$11",     RTYPE_NUM | 11}, \
1925     {"$12",     RTYPE_NUM | 12}, \
1926     {"$13",     RTYPE_NUM | 13}, \
1927     {"$14",     RTYPE_NUM | 14}, \
1928     {"$15",     RTYPE_NUM | 15}, \
1929     {"$16",     RTYPE_NUM | 16}, \
1930     {"$17",     RTYPE_NUM | 17}, \
1931     {"$18",     RTYPE_NUM | 18}, \
1932     {"$19",     RTYPE_NUM | 19}, \
1933     {"$20",     RTYPE_NUM | 20}, \
1934     {"$21",     RTYPE_NUM | 21}, \
1935     {"$22",     RTYPE_NUM | 22}, \
1936     {"$23",     RTYPE_NUM | 23}, \
1937     {"$24",     RTYPE_NUM | 24}, \
1938     {"$25",     RTYPE_NUM | 25}, \
1939     {"$26",     RTYPE_NUM | 26}, \
1940     {"$27",     RTYPE_NUM | 27}, \
1941     {"$28",     RTYPE_NUM | 28}, \
1942     {"$29",     RTYPE_NUM | 29}, \
1943     {"$30",     RTYPE_NUM | 30}, \
1944     {"$31",     RTYPE_NUM | 31} 
1945
1946 #define FPU_REGISTER_NAMES       \
1947     {"$f0",     RTYPE_FPU | 0},  \
1948     {"$f1",     RTYPE_FPU | 1},  \
1949     {"$f2",     RTYPE_FPU | 2},  \
1950     {"$f3",     RTYPE_FPU | 3},  \
1951     {"$f4",     RTYPE_FPU | 4},  \
1952     {"$f5",     RTYPE_FPU | 5},  \
1953     {"$f6",     RTYPE_FPU | 6},  \
1954     {"$f7",     RTYPE_FPU | 7},  \
1955     {"$f8",     RTYPE_FPU | 8},  \
1956     {"$f9",     RTYPE_FPU | 9},  \
1957     {"$f10",    RTYPE_FPU | 10}, \
1958     {"$f11",    RTYPE_FPU | 11}, \
1959     {"$f12",    RTYPE_FPU | 12}, \
1960     {"$f13",    RTYPE_FPU | 13}, \
1961     {"$f14",    RTYPE_FPU | 14}, \
1962     {"$f15",    RTYPE_FPU | 15}, \
1963     {"$f16",    RTYPE_FPU | 16}, \
1964     {"$f17",    RTYPE_FPU | 17}, \
1965     {"$f18",    RTYPE_FPU | 18}, \
1966     {"$f19",    RTYPE_FPU | 19}, \
1967     {"$f20",    RTYPE_FPU | 20}, \
1968     {"$f21",    RTYPE_FPU | 21}, \
1969     {"$f22",    RTYPE_FPU | 22}, \
1970     {"$f23",    RTYPE_FPU | 23}, \
1971     {"$f24",    RTYPE_FPU | 24}, \
1972     {"$f25",    RTYPE_FPU | 25}, \
1973     {"$f26",    RTYPE_FPU | 26}, \
1974     {"$f27",    RTYPE_FPU | 27}, \
1975     {"$f28",    RTYPE_FPU | 28}, \
1976     {"$f29",    RTYPE_FPU | 29}, \
1977     {"$f30",    RTYPE_FPU | 30}, \
1978     {"$f31",    RTYPE_FPU | 31}
1979
1980 #define FPU_CONDITION_CODE_NAMES \
1981     {"$fcc0",   RTYPE_FCC | 0},  \
1982     {"$fcc1",   RTYPE_FCC | 1},  \
1983     {"$fcc2",   RTYPE_FCC | 2},  \
1984     {"$fcc3",   RTYPE_FCC | 3},  \
1985     {"$fcc4",   RTYPE_FCC | 4},  \
1986     {"$fcc5",   RTYPE_FCC | 5},  \
1987     {"$fcc6",   RTYPE_FCC | 6},  \
1988     {"$fcc7",   RTYPE_FCC | 7}
1989
1990 #define COPROC_CONDITION_CODE_NAMES         \
1991     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1992     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1993     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1994     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1995     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1996     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1997     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1998     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1999
2000 #define N32N64_SYMBOLIC_REGISTER_NAMES \
2001     {"$a4",     RTYPE_GP | 8},  \
2002     {"$a5",     RTYPE_GP | 9},  \
2003     {"$a6",     RTYPE_GP | 10}, \
2004     {"$a7",     RTYPE_GP | 11}, \
2005     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
2006     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
2007     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
2008     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
2009     {"$t0",     RTYPE_GP | 12}, \
2010     {"$t1",     RTYPE_GP | 13}, \
2011     {"$t2",     RTYPE_GP | 14}, \
2012     {"$t3",     RTYPE_GP | 15}
2013
2014 #define O32_SYMBOLIC_REGISTER_NAMES \
2015     {"$t0",     RTYPE_GP | 8},  \
2016     {"$t1",     RTYPE_GP | 9},  \
2017     {"$t2",     RTYPE_GP | 10}, \
2018     {"$t3",     RTYPE_GP | 11}, \
2019     {"$t4",     RTYPE_GP | 12}, \
2020     {"$t5",     RTYPE_GP | 13}, \
2021     {"$t6",     RTYPE_GP | 14}, \
2022     {"$t7",     RTYPE_GP | 15}, \
2023     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
2024     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
2025     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
2026     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */ 
2027
2028 /* Remaining symbolic register names */
2029 #define SYMBOLIC_REGISTER_NAMES \
2030     {"$zero",   RTYPE_GP | 0},  \
2031     {"$at",     RTYPE_GP | 1},  \
2032     {"$AT",     RTYPE_GP | 1},  \
2033     {"$v0",     RTYPE_GP | 2},  \
2034     {"$v1",     RTYPE_GP | 3},  \
2035     {"$a0",     RTYPE_GP | 4},  \
2036     {"$a1",     RTYPE_GP | 5},  \
2037     {"$a2",     RTYPE_GP | 6},  \
2038     {"$a3",     RTYPE_GP | 7},  \
2039     {"$s0",     RTYPE_GP | 16}, \
2040     {"$s1",     RTYPE_GP | 17}, \
2041     {"$s2",     RTYPE_GP | 18}, \
2042     {"$s3",     RTYPE_GP | 19}, \
2043     {"$s4",     RTYPE_GP | 20}, \
2044     {"$s5",     RTYPE_GP | 21}, \
2045     {"$s6",     RTYPE_GP | 22}, \
2046     {"$s7",     RTYPE_GP | 23}, \
2047     {"$t8",     RTYPE_GP | 24}, \
2048     {"$t9",     RTYPE_GP | 25}, \
2049     {"$k0",     RTYPE_GP | 26}, \
2050     {"$kt0",    RTYPE_GP | 26}, \
2051     {"$k1",     RTYPE_GP | 27}, \
2052     {"$kt1",    RTYPE_GP | 27}, \
2053     {"$gp",     RTYPE_GP | 28}, \
2054     {"$sp",     RTYPE_GP | 29}, \
2055     {"$s8",     RTYPE_GP | 30}, \
2056     {"$fp",     RTYPE_GP | 30}, \
2057     {"$ra",     RTYPE_GP | 31}
2058
2059 #define MIPS16_SPECIAL_REGISTER_NAMES \
2060     {"$pc",     RTYPE_PC | 0}
2061
2062 #define MDMX_VECTOR_REGISTER_NAMES \
2063     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
2064     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
2065     {"$v2",     RTYPE_VEC | 2},  \
2066     {"$v3",     RTYPE_VEC | 3},  \
2067     {"$v4",     RTYPE_VEC | 4},  \
2068     {"$v5",     RTYPE_VEC | 5},  \
2069     {"$v6",     RTYPE_VEC | 6},  \
2070     {"$v7",     RTYPE_VEC | 7},  \
2071     {"$v8",     RTYPE_VEC | 8},  \
2072     {"$v9",     RTYPE_VEC | 9},  \
2073     {"$v10",    RTYPE_VEC | 10}, \
2074     {"$v11",    RTYPE_VEC | 11}, \
2075     {"$v12",    RTYPE_VEC | 12}, \
2076     {"$v13",    RTYPE_VEC | 13}, \
2077     {"$v14",    RTYPE_VEC | 14}, \
2078     {"$v15",    RTYPE_VEC | 15}, \
2079     {"$v16",    RTYPE_VEC | 16}, \
2080     {"$v17",    RTYPE_VEC | 17}, \
2081     {"$v18",    RTYPE_VEC | 18}, \
2082     {"$v19",    RTYPE_VEC | 19}, \
2083     {"$v20",    RTYPE_VEC | 20}, \
2084     {"$v21",    RTYPE_VEC | 21}, \
2085     {"$v22",    RTYPE_VEC | 22}, \
2086     {"$v23",    RTYPE_VEC | 23}, \
2087     {"$v24",    RTYPE_VEC | 24}, \
2088     {"$v25",    RTYPE_VEC | 25}, \
2089     {"$v26",    RTYPE_VEC | 26}, \
2090     {"$v27",    RTYPE_VEC | 27}, \
2091     {"$v28",    RTYPE_VEC | 28}, \
2092     {"$v29",    RTYPE_VEC | 29}, \
2093     {"$v30",    RTYPE_VEC | 30}, \
2094     {"$v31",    RTYPE_VEC | 31}
2095
2096 #define MIPS_DSP_ACCUMULATOR_NAMES \
2097     {"$ac0",    RTYPE_ACC | 0}, \
2098     {"$ac1",    RTYPE_ACC | 1}, \
2099     {"$ac2",    RTYPE_ACC | 2}, \
2100     {"$ac3",    RTYPE_ACC | 3}
2101
2102 static const struct regname reg_names[] = {
2103   GENERIC_REGISTER_NUMBERS,
2104   FPU_REGISTER_NAMES,
2105   FPU_CONDITION_CODE_NAMES,
2106   COPROC_CONDITION_CODE_NAMES,
2107
2108   /* The $txx registers depends on the abi,
2109      these will be added later into the symbol table from
2110      one of the tables below once mips_abi is set after 
2111      parsing of arguments from the command line. */
2112   SYMBOLIC_REGISTER_NAMES,
2113
2114   MIPS16_SPECIAL_REGISTER_NAMES,
2115   MDMX_VECTOR_REGISTER_NAMES,
2116   MIPS_DSP_ACCUMULATOR_NAMES,
2117   {0, 0}
2118 };
2119
2120 static const struct regname reg_names_o32[] = {
2121   O32_SYMBOLIC_REGISTER_NAMES,
2122   {0, 0}
2123 };
2124
2125 static const struct regname reg_names_n32n64[] = {
2126   N32N64_SYMBOLIC_REGISTER_NAMES,
2127   {0, 0}
2128 };
2129
2130 /* Check if S points at a valid register specifier according to TYPES.
2131    If so, then return 1, advance S to consume the specifier and store
2132    the register's number in REGNOP, otherwise return 0.  */
2133
2134 static int
2135 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
2136 {
2137   symbolS *symbolP;
2138   char *e;
2139   char save_c;
2140   int reg = -1;
2141
2142   /* Find end of name.  */
2143   e = *s;
2144   if (is_name_beginner (*e))
2145     ++e;
2146   while (is_part_of_name (*e))
2147     ++e;
2148
2149   /* Terminate name.  */
2150   save_c = *e;
2151   *e = '\0';
2152
2153   /* Look for a register symbol.  */
2154   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
2155     {
2156       int r = S_GET_VALUE (symbolP);
2157       if (r & types)
2158         reg = r & RNUM_MASK;
2159       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
2160         /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
2161         reg = (r & RNUM_MASK) - 2;
2162     }
2163   /* Else see if this is a register defined in an itbl entry.  */
2164   else if ((types & RTYPE_GP) && itbl_have_entries)
2165     {
2166       char *n = *s;
2167       unsigned long r;
2168
2169       if (*n == '$')
2170         ++n;
2171       if (itbl_get_reg_val (n, &r))
2172         reg = r & RNUM_MASK;
2173     }
2174
2175   /* Advance to next token if a register was recognised.  */
2176   if (reg >= 0)
2177     *s = e;
2178   else if (types & RWARN)
2179     as_warn (_("Unrecognized register name `%s'"), *s);
2180
2181   *e = save_c;
2182   if (regnop)
2183     *regnop = reg;
2184   return reg >= 0;
2185 }
2186
2187 /* Check if S points at a valid register list according to TYPES.
2188    If so, then return 1, advance S to consume the list and store
2189    the registers present on the list as a bitmask of ones in REGLISTP,
2190    otherwise return 0.  A valid list comprises a comma-separated
2191    enumeration of valid single registers and/or dash-separated
2192    contiguous register ranges as determined by their numbers.
2193
2194    As a special exception if one of s0-s7 registers is specified as
2195    the range's lower delimiter and s8 (fp) is its upper one, then no
2196    registers whose numbers place them between s7 and s8 (i.e. $24-$29)
2197    are selected; they have to be listed separately if needed.  */
2198
2199 static int
2200 reglist_lookup (char **s, unsigned int types, unsigned int *reglistp)
2201 {
2202   unsigned int reglist = 0;
2203   unsigned int lastregno;
2204   bfd_boolean ok = TRUE;
2205   unsigned int regmask;
2206   char *s_endlist = *s;
2207   char *s_reset = *s;
2208   unsigned int regno;
2209
2210   while (reg_lookup (s, types, &regno))
2211     {
2212       lastregno = regno;
2213       if (**s == '-')
2214         {
2215           (*s)++;
2216           ok = reg_lookup (s, types, &lastregno);
2217           if (ok && lastregno < regno)
2218             ok = FALSE;
2219           if (!ok)
2220             break;
2221         }
2222
2223       if (lastregno == FP && regno >= S0 && regno <= S7)
2224         {
2225           lastregno = S7;
2226           reglist |= 1 << FP;
2227         }
2228       regmask = 1 << lastregno;
2229       regmask = (regmask << 1) - 1;
2230       regmask ^= (1 << regno) - 1;
2231       reglist |= regmask;
2232
2233       s_endlist = *s;
2234       if (**s != ',')
2235         break;
2236       (*s)++;
2237     }
2238
2239   if (ok)
2240     *s = s_endlist;
2241   else
2242     *s = s_reset;
2243   if (reglistp)
2244     *reglistp = reglist;
2245   return ok && reglist != 0;
2246 }
2247
2248 /* Return TRUE if opcode MO is valid on the currently selected ISA and
2249    architecture.  Use is_opcode_valid_16 for MIPS16 opcodes.  */
2250
2251 static bfd_boolean
2252 is_opcode_valid (const struct mips_opcode *mo)
2253 {
2254   int isa = mips_opts.isa;
2255   int fp_s, fp_d;
2256
2257   if (mips_opts.ase_mdmx)
2258     isa |= INSN_MDMX;
2259   if (mips_opts.ase_dsp)
2260     isa |= INSN_DSP;
2261   if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
2262     isa |= INSN_DSP64;
2263   if (mips_opts.ase_dspr2)
2264     isa |= INSN_DSPR2;
2265   if (mips_opts.ase_mt)
2266     isa |= INSN_MT;
2267   if (mips_opts.ase_mips3d)
2268     isa |= INSN_MIPS3D;
2269   if (mips_opts.ase_smartmips)
2270     isa |= INSN_SMARTMIPS;
2271   if (mips_opts.ase_mcu)
2272     isa |= INSN_MCU;
2273   if (mips_opts.ase_virt)
2274     isa |= INSN_VIRT;
2275   if (mips_opts.ase_virt && ISA_SUPPORTS_VIRT64_ASE)
2276     isa |= INSN_VIRT64;
2277
2278   if (!opcode_is_member (mo, isa, mips_opts.arch))
2279     return FALSE;
2280
2281   /* Check whether the instruction or macro requires single-precision or
2282      double-precision floating-point support.  Note that this information is
2283      stored differently in the opcode table for insns and macros.  */
2284   if (mo->pinfo == INSN_MACRO)
2285     {
2286       fp_s = mo->pinfo2 & INSN2_M_FP_S;
2287       fp_d = mo->pinfo2 & INSN2_M_FP_D;
2288     }
2289   else
2290     {
2291       fp_s = mo->pinfo & FP_S;
2292       fp_d = mo->pinfo & FP_D;
2293     }
2294
2295   if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
2296     return FALSE;
2297
2298   if (fp_s && mips_opts.soft_float)
2299     return FALSE;
2300
2301   return TRUE;
2302 }
2303
2304 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
2305    selected ISA and architecture.  */
2306
2307 static bfd_boolean
2308 is_opcode_valid_16 (const struct mips_opcode *mo)
2309 {
2310   return opcode_is_member (mo, mips_opts.isa, mips_opts.arch);
2311 }
2312
2313 /* Return TRUE if the size of the microMIPS opcode MO matches one
2314    explicitly requested.  Always TRUE in the standard MIPS mode.  */
2315
2316 static bfd_boolean
2317 is_size_valid (const struct mips_opcode *mo)
2318 {
2319   if (!mips_opts.micromips)
2320     return TRUE;
2321
2322   if (!forced_insn_length)
2323     return TRUE;
2324   if (mo->pinfo == INSN_MACRO)
2325     return FALSE;
2326   return forced_insn_length == micromips_insn_length (mo);
2327 }
2328
2329 /* Return TRUE if the microMIPS opcode MO is valid for the delay slot
2330    of the preceding instruction.  Always TRUE in the standard MIPS mode.
2331
2332    We don't accept macros in 16-bit delay slots to avoid a case where
2333    a macro expansion fails because it relies on a preceding 32-bit real
2334    instruction to have matched and does not handle the operands correctly.
2335    The only macros that may expand to 16-bit instructions are JAL that
2336    cannot be placed in a delay slot anyway, and corner cases of BALIGN
2337    and BGT (that likewise cannot be placed in a delay slot) that decay to
2338    a NOP.  In all these cases the macros precede any corresponding real
2339    instruction definitions in the opcode table, so they will match in the
2340    second pass where the size of the delay slot is ignored and therefore
2341    produce correct code.  */
2342
2343 static bfd_boolean
2344 is_delay_slot_valid (const struct mips_opcode *mo)
2345 {
2346   if (!mips_opts.micromips)
2347     return TRUE;
2348
2349   if (mo->pinfo == INSN_MACRO)
2350     return (history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) == 0;
2351   if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
2352       && micromips_insn_length (mo) != 4)
2353     return FALSE;
2354   if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
2355       && micromips_insn_length (mo) != 2)
2356     return FALSE;
2357
2358   return TRUE;
2359 }
2360
2361 /* This function is called once, at assembler startup time.  It should set up
2362    all the tables, etc. that the MD part of the assembler will need.  */
2363
2364 void
2365 md_begin (void)
2366 {
2367   const char *retval = NULL;
2368   int i = 0;
2369   int broken = 0;
2370
2371   if (mips_pic != NO_PIC)
2372     {
2373       if (g_switch_seen && g_switch_value != 0)
2374         as_bad (_("-G may not be used in position-independent code"));
2375       g_switch_value = 0;
2376     }
2377
2378   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
2379     as_warn (_("Could not set architecture and machine"));
2380
2381   op_hash = hash_new ();
2382
2383   for (i = 0; i < NUMOPCODES;)
2384     {
2385       const char *name = mips_opcodes[i].name;
2386
2387       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
2388       if (retval != NULL)
2389         {
2390           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
2391                    mips_opcodes[i].name, retval);
2392           /* Probably a memory allocation problem?  Give up now.  */
2393           as_fatal (_("Broken assembler.  No assembly attempted."));
2394         }
2395       do
2396         {
2397           if (mips_opcodes[i].pinfo != INSN_MACRO)
2398             {
2399               if (!validate_mips_insn (&mips_opcodes[i]))
2400                 broken = 1;
2401               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2402                 {
2403                   create_insn (&nop_insn, mips_opcodes + i);
2404                   if (mips_fix_loongson2f_nop)
2405                     nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
2406                   nop_insn.fixed_p = 1;
2407                 }
2408             }
2409           ++i;
2410         }
2411       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
2412     }
2413
2414   mips16_op_hash = hash_new ();
2415
2416   i = 0;
2417   while (i < bfd_mips16_num_opcodes)
2418     {
2419       const char *name = mips16_opcodes[i].name;
2420
2421       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
2422       if (retval != NULL)
2423         as_fatal (_("internal: can't hash `%s': %s"),
2424                   mips16_opcodes[i].name, retval);
2425       do
2426         {
2427           if (mips16_opcodes[i].pinfo != INSN_MACRO
2428               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
2429                   != mips16_opcodes[i].match))
2430             {
2431               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
2432                        mips16_opcodes[i].name, mips16_opcodes[i].args);
2433               broken = 1;
2434             }
2435           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2436             {
2437               create_insn (&mips16_nop_insn, mips16_opcodes + i);
2438               mips16_nop_insn.fixed_p = 1;
2439             }
2440           ++i;
2441         }
2442       while (i < bfd_mips16_num_opcodes
2443              && strcmp (mips16_opcodes[i].name, name) == 0);
2444     }
2445
2446   micromips_op_hash = hash_new ();
2447
2448   i = 0;
2449   while (i < bfd_micromips_num_opcodes)
2450     {
2451       const char *name = micromips_opcodes[i].name;
2452
2453       retval = hash_insert (micromips_op_hash, name,
2454                             (void *) &micromips_opcodes[i]);
2455       if (retval != NULL)
2456         as_fatal (_("internal: can't hash `%s': %s"),
2457                   micromips_opcodes[i].name, retval);
2458       do
2459         if (micromips_opcodes[i].pinfo != INSN_MACRO)
2460           {
2461             struct mips_cl_insn *micromips_nop_insn;
2462
2463             if (!validate_micromips_insn (&micromips_opcodes[i]))
2464               broken = 1;
2465
2466             if (micromips_insn_length (micromips_opcodes + i) == 2)
2467               micromips_nop_insn = &micromips_nop16_insn;
2468             else if (micromips_insn_length (micromips_opcodes + i) == 4)
2469               micromips_nop_insn = &micromips_nop32_insn;
2470             else
2471               continue;
2472
2473             if (micromips_nop_insn->insn_mo == NULL
2474                 && strcmp (name, "nop") == 0)
2475               {
2476                 create_insn (micromips_nop_insn, micromips_opcodes + i);
2477                 micromips_nop_insn->fixed_p = 1;
2478               }
2479           }
2480       while (++i < bfd_micromips_num_opcodes
2481              && strcmp (micromips_opcodes[i].name, name) == 0);
2482     }
2483
2484   if (broken)
2485     as_fatal (_("Broken assembler.  No assembly attempted."));
2486
2487   /* We add all the general register names to the symbol table.  This
2488      helps us detect invalid uses of them.  */
2489   for (i = 0; reg_names[i].name; i++) 
2490     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
2491                                      reg_names[i].num, /* & RNUM_MASK, */
2492                                      &zero_address_frag));
2493   if (HAVE_NEWABI)
2494     for (i = 0; reg_names_n32n64[i].name; i++) 
2495       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
2496                                        reg_names_n32n64[i].num, /* & RNUM_MASK, */
2497                                        &zero_address_frag));
2498   else
2499     for (i = 0; reg_names_o32[i].name; i++) 
2500       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
2501                                        reg_names_o32[i].num, /* & RNUM_MASK, */
2502                                        &zero_address_frag));
2503
2504   mips_no_prev_insn ();
2505
2506   mips_gprmask = 0;
2507   mips_cprmask[0] = 0;
2508   mips_cprmask[1] = 0;
2509   mips_cprmask[2] = 0;
2510   mips_cprmask[3] = 0;
2511
2512   /* set the default alignment for the text section (2**2) */
2513   record_alignment (text_section, 2);
2514
2515   bfd_set_gp_size (stdoutput, g_switch_value);
2516
2517 #ifdef OBJ_ELF
2518   if (IS_ELF)
2519     {
2520       /* On a native system other than VxWorks, sections must be aligned
2521          to 16 byte boundaries.  When configured for an embedded ELF
2522          target, we don't bother.  */
2523       if (strncmp (TARGET_OS, "elf", 3) != 0
2524           && strncmp (TARGET_OS, "vxworks", 7) != 0)
2525         {
2526           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2527           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2528           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2529         }
2530
2531       /* Create a .reginfo section for register masks and a .mdebug
2532          section for debugging information.  */
2533       {
2534         segT seg;
2535         subsegT subseg;
2536         flagword flags;
2537         segT sec;
2538
2539         seg = now_seg;
2540         subseg = now_subseg;
2541
2542         /* The ABI says this section should be loaded so that the
2543            running program can access it.  However, we don't load it
2544            if we are configured for an embedded target */
2545         flags = SEC_READONLY | SEC_DATA;
2546         if (strncmp (TARGET_OS, "elf", 3) != 0)
2547           flags |= SEC_ALLOC | SEC_LOAD;
2548
2549         if (mips_abi != N64_ABI)
2550           {
2551             sec = subseg_new (".reginfo", (subsegT) 0);
2552
2553             bfd_set_section_flags (stdoutput, sec, flags);
2554             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2555
2556             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2557           }
2558         else
2559           {
2560             /* The 64-bit ABI uses a .MIPS.options section rather than
2561                .reginfo section.  */
2562             sec = subseg_new (".MIPS.options", (subsegT) 0);
2563             bfd_set_section_flags (stdoutput, sec, flags);
2564             bfd_set_section_alignment (stdoutput, sec, 3);
2565
2566             /* Set up the option header.  */
2567             {
2568               Elf_Internal_Options opthdr;
2569               char *f;
2570
2571               opthdr.kind = ODK_REGINFO;
2572               opthdr.size = (sizeof (Elf_External_Options)
2573                              + sizeof (Elf64_External_RegInfo));
2574               opthdr.section = 0;
2575               opthdr.info = 0;
2576               f = frag_more (sizeof (Elf_External_Options));
2577               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2578                                              (Elf_External_Options *) f);
2579
2580               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2581             }
2582           }
2583
2584         if (ECOFF_DEBUGGING)
2585           {
2586             sec = subseg_new (".mdebug", (subsegT) 0);
2587             (void) bfd_set_section_flags (stdoutput, sec,
2588                                           SEC_HAS_CONTENTS | SEC_READONLY);
2589             (void) bfd_set_section_alignment (stdoutput, sec, 2);
2590           }
2591         else if (mips_flag_pdr)
2592           {
2593             pdr_seg = subseg_new (".pdr", (subsegT) 0);
2594             (void) bfd_set_section_flags (stdoutput, pdr_seg,
2595                                           SEC_READONLY | SEC_RELOC
2596                                           | SEC_DEBUGGING);
2597             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2598           }
2599
2600         subseg_set (seg, subseg);
2601       }
2602     }
2603 #endif /* OBJ_ELF */
2604
2605   if (! ECOFF_DEBUGGING)
2606     md_obj_begin ();
2607
2608   if (mips_fix_vr4120)
2609     init_vr4120_conflicts ();
2610 }
2611
2612 void
2613 md_mips_end (void)
2614 {
2615   mips_emit_delays ();
2616   if (! ECOFF_DEBUGGING)
2617     md_obj_end ();
2618 }
2619
2620 void
2621 md_assemble (char *str)
2622 {
2623   struct mips_cl_insn insn;
2624   bfd_reloc_code_real_type unused_reloc[3]
2625     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2626
2627   imm_expr.X_op = O_absent;
2628   imm2_expr.X_op = O_absent;
2629   offset_expr.X_op = O_absent;
2630   imm_reloc[0] = BFD_RELOC_UNUSED;
2631   imm_reloc[1] = BFD_RELOC_UNUSED;
2632   imm_reloc[2] = BFD_RELOC_UNUSED;
2633   offset_reloc[0] = BFD_RELOC_UNUSED;
2634   offset_reloc[1] = BFD_RELOC_UNUSED;
2635   offset_reloc[2] = BFD_RELOC_UNUSED;
2636
2637   mips_mark_labels ();
2638   mips_assembling_insn = TRUE;
2639
2640   if (mips_opts.mips16)
2641     mips16_ip (str, &insn);
2642   else
2643     {
2644       mips_ip (str, &insn);
2645       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2646             str, insn.insn_opcode));
2647     }
2648
2649   if (insn_error)
2650     as_bad ("%s `%s'", insn_error, str);
2651   else if (insn.insn_mo->pinfo == INSN_MACRO)
2652     {
2653       macro_start ();
2654       if (mips_opts.mips16)
2655         mips16_macro (&insn);
2656       else
2657         macro (&insn);
2658       macro_end ();
2659     }
2660   else
2661     {
2662       if (imm_expr.X_op != O_absent)
2663         append_insn (&insn, &imm_expr, imm_reloc, FALSE);
2664       else if (offset_expr.X_op != O_absent)
2665         append_insn (&insn, &offset_expr, offset_reloc, FALSE);
2666       else
2667         append_insn (&insn, NULL, unused_reloc, FALSE);
2668     }
2669
2670   mips_assembling_insn = FALSE;
2671 }
2672
2673 /* Convenience functions for abstracting away the differences between
2674    MIPS16 and non-MIPS16 relocations.  */
2675
2676 static inline bfd_boolean
2677 mips16_reloc_p (bfd_reloc_code_real_type reloc)
2678 {
2679   switch (reloc)
2680     {
2681     case BFD_RELOC_MIPS16_JMP:
2682     case BFD_RELOC_MIPS16_GPREL:
2683     case BFD_RELOC_MIPS16_GOT16:
2684     case BFD_RELOC_MIPS16_CALL16:
2685     case BFD_RELOC_MIPS16_HI16_S:
2686     case BFD_RELOC_MIPS16_HI16:
2687     case BFD_RELOC_MIPS16_LO16:
2688       return TRUE;
2689
2690     default:
2691       return FALSE;
2692     }
2693 }
2694
2695 static inline bfd_boolean
2696 micromips_reloc_p (bfd_reloc_code_real_type reloc)
2697 {
2698   switch (reloc)
2699     {
2700     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
2701     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
2702     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
2703     case BFD_RELOC_MICROMIPS_GPREL16:
2704     case BFD_RELOC_MICROMIPS_JMP:
2705     case BFD_RELOC_MICROMIPS_HI16:
2706     case BFD_RELOC_MICROMIPS_HI16_S:
2707     case BFD_RELOC_MICROMIPS_LO16:
2708     case BFD_RELOC_MICROMIPS_LITERAL:
2709     case BFD_RELOC_MICROMIPS_GOT16:
2710     case BFD_RELOC_MICROMIPS_CALL16:
2711     case BFD_RELOC_MICROMIPS_GOT_HI16:
2712     case BFD_RELOC_MICROMIPS_GOT_LO16:
2713     case BFD_RELOC_MICROMIPS_CALL_HI16:
2714     case BFD_RELOC_MICROMIPS_CALL_LO16:
2715     case BFD_RELOC_MICROMIPS_SUB:
2716     case BFD_RELOC_MICROMIPS_GOT_PAGE:
2717     case BFD_RELOC_MICROMIPS_GOT_OFST:
2718     case BFD_RELOC_MICROMIPS_GOT_DISP:
2719     case BFD_RELOC_MICROMIPS_HIGHEST:
2720     case BFD_RELOC_MICROMIPS_HIGHER:
2721     case BFD_RELOC_MICROMIPS_SCN_DISP:
2722     case BFD_RELOC_MICROMIPS_JALR:
2723       return TRUE;
2724
2725     default:
2726       return FALSE;
2727     }
2728 }
2729
2730 static inline bfd_boolean
2731 jmp_reloc_p (bfd_reloc_code_real_type reloc)
2732 {
2733   return reloc == BFD_RELOC_MIPS_JMP || reloc == BFD_RELOC_MICROMIPS_JMP;
2734 }
2735
2736 static inline bfd_boolean
2737 got16_reloc_p (bfd_reloc_code_real_type reloc)
2738 {
2739   return (reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16
2740           || reloc == BFD_RELOC_MICROMIPS_GOT16);
2741 }
2742
2743 static inline bfd_boolean
2744 hi16_reloc_p (bfd_reloc_code_real_type reloc)
2745 {
2746   return (reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S
2747           || reloc == BFD_RELOC_MICROMIPS_HI16_S);
2748 }
2749
2750 static inline bfd_boolean
2751 lo16_reloc_p (bfd_reloc_code_real_type reloc)
2752 {
2753   return (reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16
2754           || reloc == BFD_RELOC_MICROMIPS_LO16);
2755 }
2756
2757 static inline bfd_boolean
2758 jalr_reloc_p (bfd_reloc_code_real_type reloc)
2759 {
2760   return reloc == BFD_RELOC_MIPS_JALR || reloc == BFD_RELOC_MICROMIPS_JALR;
2761 }
2762
2763 /* Return true if RELOC is a PC-relative relocation that does not have
2764    full address range.  */
2765
2766 static inline bfd_boolean
2767 limited_pcrel_reloc_p (bfd_reloc_code_real_type reloc)
2768 {
2769   switch (reloc)
2770     {
2771     case BFD_RELOC_16_PCREL_S2:
2772     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
2773     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
2774     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
2775       return TRUE;
2776
2777     case BFD_RELOC_32_PCREL:
2778       return HAVE_64BIT_ADDRESSES;
2779
2780     default:
2781       return FALSE;
2782     }
2783 }
2784
2785 /* Return true if the given relocation might need a matching %lo().
2786    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2787    need a matching %lo() when applied to local symbols.  */
2788
2789 static inline bfd_boolean
2790 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2791 {
2792   return (HAVE_IN_PLACE_ADDENDS
2793           && (hi16_reloc_p (reloc)
2794               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2795                  all GOT16 relocations evaluate to "G".  */
2796               || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2797 }
2798
2799 /* Return the type of %lo() reloc needed by RELOC, given that
2800    reloc_needs_lo_p.  */
2801
2802 static inline bfd_reloc_code_real_type
2803 matching_lo_reloc (bfd_reloc_code_real_type reloc)
2804 {
2805   return (mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16
2806           : (micromips_reloc_p (reloc) ? BFD_RELOC_MICROMIPS_LO16
2807              : BFD_RELOC_LO16));
2808 }
2809
2810 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2811    relocation.  */
2812
2813 static inline bfd_boolean
2814 fixup_has_matching_lo_p (fixS *fixp)
2815 {
2816   return (fixp->fx_next != NULL
2817           && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
2818           && fixp->fx_addsy == fixp->fx_next->fx_addsy
2819           && fixp->fx_offset == fixp->fx_next->fx_offset);
2820 }
2821
2822 /* This function returns true if modifying a register requires a
2823    delay.  */
2824
2825 static int
2826 reg_needs_delay (unsigned int reg)
2827 {
2828   unsigned long prev_pinfo;
2829
2830   prev_pinfo = history[0].insn_mo->pinfo;
2831   if (! mips_opts.noreorder
2832       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2833            && ! gpr_interlocks)
2834           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2835               && ! cop_interlocks)))
2836     {
2837       /* A load from a coprocessor or from memory.  All load delays
2838          delay the use of general register rt for one instruction.  */
2839       /* Itbl support may require additional care here.  */
2840       know (prev_pinfo & INSN_WRITE_GPR_T);
2841       if (reg == EXTRACT_OPERAND (mips_opts.micromips, RT, history[0]))
2842         return 1;
2843     }
2844
2845   return 0;
2846 }
2847
2848 /* Move all labels in LABELS to the current insertion point.  TEXT_P
2849    says whether the labels refer to text or data.  */
2850
2851 static void
2852 mips_move_labels (struct insn_label_list *labels, bfd_boolean text_p)
2853 {
2854   struct insn_label_list *l;
2855   valueT val;
2856
2857   for (l = labels; l != NULL; l = l->next)
2858     {
2859       gas_assert (S_GET_SEGMENT (l->label) == now_seg);
2860       symbol_set_frag (l->label, frag_now);
2861       val = (valueT) frag_now_fix ();
2862       /* MIPS16/microMIPS text labels are stored as odd.  */
2863       if (text_p && HAVE_CODE_COMPRESSION)
2864         ++val;
2865       S_SET_VALUE (l->label, val);
2866     }
2867 }
2868
2869 /* Move all labels in insn_labels to the current insertion point
2870    and treat them as text labels.  */
2871
2872 static void
2873 mips_move_text_labels (void)
2874 {
2875   mips_move_labels (seg_info (now_seg)->label_list, TRUE);
2876 }
2877
2878 static bfd_boolean
2879 s_is_linkonce (symbolS *sym, segT from_seg)
2880 {
2881   bfd_boolean linkonce = FALSE;
2882   segT symseg = S_GET_SEGMENT (sym);
2883
2884   if (symseg != from_seg && !S_IS_LOCAL (sym))
2885     {
2886       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2887         linkonce = TRUE;
2888 #ifdef OBJ_ELF
2889       /* The GNU toolchain uses an extension for ELF: a section
2890          beginning with the magic string .gnu.linkonce is a
2891          linkonce section.  */
2892       if (strncmp (segment_name (symseg), ".gnu.linkonce",
2893                    sizeof ".gnu.linkonce" - 1) == 0)
2894         linkonce = TRUE;
2895 #endif
2896     }
2897   return linkonce;
2898 }
2899
2900 /* Mark MIPS16 or microMIPS instruction label LABEL.  This permits the
2901    linker to handle them specially, such as generating jalx instructions
2902    when needed.  We also make them odd for the duration of the assembly,
2903    in order to generate the right sort of code.  We will make them even
2904    in the adjust_symtab routine, while leaving them marked.  This is
2905    convenient for the debugger and the disassembler.  The linker knows
2906    to make them odd again.  */
2907
2908 static void
2909 mips_compressed_mark_label (symbolS *label)
2910 {
2911   gas_assert (HAVE_CODE_COMPRESSION);
2912
2913 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2914   if (IS_ELF)
2915     {
2916       if (mips_opts.mips16)
2917         S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2918       else
2919         S_SET_OTHER (label, ELF_ST_SET_MICROMIPS (S_GET_OTHER (label)));
2920     }
2921 #endif
2922   if ((S_GET_VALUE (label) & 1) == 0
2923       /* Don't adjust the address if the label is global or weak, or
2924          in a link-once section, since we'll be emitting symbol reloc
2925          references to it which will be patched up by the linker, and
2926          the final value of the symbol may or may not be MIPS16/microMIPS.  */
2927       && !S_IS_WEAK (label)
2928       && !S_IS_EXTERNAL (label)
2929       && !s_is_linkonce (label, now_seg))
2930     S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2931 }
2932
2933 /* Mark preceding MIPS16 or microMIPS instruction labels.  */
2934
2935 static void
2936 mips_compressed_mark_labels (void)
2937 {
2938   struct insn_label_list *l;
2939
2940   for (l = seg_info (now_seg)->label_list; l != NULL; l = l->next)
2941     mips_compressed_mark_label (l->label);
2942 }
2943
2944 /* End the current frag.  Make it a variant frag and record the
2945    relaxation info.  */
2946
2947 static void
2948 relax_close_frag (void)
2949 {
2950   mips_macro_warning.first_frag = frag_now;
2951   frag_var (rs_machine_dependent, 0, 0,
2952             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2953             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2954
2955   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2956   mips_relax.first_fixup = 0;
2957 }
2958
2959 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2960    See the comment above RELAX_ENCODE for more details.  */
2961
2962 static void
2963 relax_start (symbolS *symbol)
2964 {
2965   gas_assert (mips_relax.sequence == 0);
2966   mips_relax.sequence = 1;
2967   mips_relax.symbol = symbol;
2968 }
2969
2970 /* Start generating the second version of a relaxable sequence.
2971    See the comment above RELAX_ENCODE for more details.  */
2972
2973 static void
2974 relax_switch (void)
2975 {
2976   gas_assert (mips_relax.sequence == 1);
2977   mips_relax.sequence = 2;
2978 }
2979
2980 /* End the current relaxable sequence.  */
2981
2982 static void
2983 relax_end (void)
2984 {
2985   gas_assert (mips_relax.sequence == 2);
2986   relax_close_frag ();
2987   mips_relax.sequence = 0;
2988 }
2989
2990 /* Return true if IP is a delayed branch or jump.  */
2991
2992 static inline bfd_boolean
2993 delayed_branch_p (const struct mips_cl_insn *ip)
2994 {
2995   return (ip->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2996                                 | INSN_COND_BRANCH_DELAY
2997                                 | INSN_COND_BRANCH_LIKELY)) != 0;
2998 }
2999
3000 /* Return true if IP is a compact branch or jump.  */
3001
3002 static inline bfd_boolean
3003 compact_branch_p (const struct mips_cl_insn *ip)
3004 {
3005   if (mips_opts.mips16)
3006     return (ip->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
3007                                   | MIPS16_INSN_COND_BRANCH)) != 0;
3008   else
3009     return (ip->insn_mo->pinfo2 & (INSN2_UNCOND_BRANCH
3010                                    | INSN2_COND_BRANCH)) != 0;
3011 }
3012
3013 /* Return true if IP is an unconditional branch or jump.  */
3014
3015 static inline bfd_boolean
3016 uncond_branch_p (const struct mips_cl_insn *ip)
3017 {
3018   return ((ip->insn_mo->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0
3019           || (mips_opts.mips16
3020               ? (ip->insn_mo->pinfo & MIPS16_INSN_UNCOND_BRANCH) != 0
3021               : (ip->insn_mo->pinfo2 & INSN2_UNCOND_BRANCH) != 0));
3022 }
3023
3024 /* Return true if IP is a branch-likely instruction.  */
3025
3026 static inline bfd_boolean
3027 branch_likely_p (const struct mips_cl_insn *ip)
3028 {
3029   return (ip->insn_mo->pinfo & INSN_COND_BRANCH_LIKELY) != 0;
3030 }
3031
3032 /* Return the type of nop that should be used to fill the delay slot
3033    of delayed branch IP.  */
3034
3035 static struct mips_cl_insn *
3036 get_delay_slot_nop (const struct mips_cl_insn *ip)
3037 {
3038   if (mips_opts.micromips
3039       && (ip->insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
3040     return &micromips_nop32_insn;
3041   return NOP_INSN;
3042 }
3043
3044 /* Return the mask of core registers that IP reads or writes.  */
3045
3046 static unsigned int
3047 gpr_mod_mask (const struct mips_cl_insn *ip)
3048 {
3049   unsigned long pinfo2;
3050   unsigned int mask;
3051
3052   mask = 0;
3053   pinfo2 = ip->insn_mo->pinfo2;
3054   if (mips_opts.micromips)
3055     {
3056       if (pinfo2 & INSN2_MOD_GPR_MD)
3057         mask |= 1 << micromips_to_32_reg_d_map[EXTRACT_OPERAND (1, MD, *ip)];
3058       if (pinfo2 & INSN2_MOD_GPR_MF)
3059         mask |= 1 << micromips_to_32_reg_f_map[EXTRACT_OPERAND (1, MF, *ip)];
3060       if (pinfo2 & INSN2_MOD_SP)
3061         mask |= 1 << SP;
3062     }
3063   return mask;
3064 }
3065
3066 /* Return the mask of core registers that IP reads.  */
3067
3068 static unsigned int
3069 gpr_read_mask (const struct mips_cl_insn *ip)
3070 {
3071   unsigned long pinfo, pinfo2;
3072   unsigned int mask;
3073
3074   mask = gpr_mod_mask (ip);
3075   pinfo = ip->insn_mo->pinfo;
3076   pinfo2 = ip->insn_mo->pinfo2;
3077   if (mips_opts.mips16)
3078     {
3079       if (pinfo & MIPS16_INSN_READ_X)
3080         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
3081       if (pinfo & MIPS16_INSN_READ_Y)
3082         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
3083       if (pinfo & MIPS16_INSN_READ_T)
3084         mask |= 1 << TREG;
3085       if (pinfo & MIPS16_INSN_READ_SP)
3086         mask |= 1 << SP;
3087       if (pinfo & MIPS16_INSN_READ_31)
3088         mask |= 1 << RA;
3089       if (pinfo & MIPS16_INSN_READ_Z)
3090         mask |= 1 << (mips16_to_32_reg_map
3091                       [MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]);
3092       if (pinfo & MIPS16_INSN_READ_GPR_X)
3093         mask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3094     }
3095   else
3096     {
3097       if (pinfo2 & INSN2_READ_GPR_D)
3098         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
3099       if (pinfo & INSN_READ_GPR_T)
3100         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
3101       if (pinfo & INSN_READ_GPR_S)
3102         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
3103       if (pinfo2 & INSN2_READ_GP)
3104         mask |= 1 << GP;
3105       if (pinfo2 & INSN2_READ_GPR_31)
3106         mask |= 1 << RA;
3107       if (pinfo2 & INSN2_READ_GPR_Z)
3108         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3109     }
3110   if (mips_opts.micromips)
3111     {
3112       if (pinfo2 & INSN2_READ_GPR_MC)
3113         mask |= 1 << micromips_to_32_reg_c_map[EXTRACT_OPERAND (1, MC, *ip)];
3114       if (pinfo2 & INSN2_READ_GPR_ME)
3115         mask |= 1 << micromips_to_32_reg_e_map[EXTRACT_OPERAND (1, ME, *ip)];
3116       if (pinfo2 & INSN2_READ_GPR_MG)
3117         mask |= 1 << micromips_to_32_reg_g_map[EXTRACT_OPERAND (1, MG, *ip)];
3118       if (pinfo2 & INSN2_READ_GPR_MJ)
3119         mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3120       if (pinfo2 & INSN2_READ_GPR_MMN)
3121         {
3122           mask |= 1 << micromips_to_32_reg_m_map[EXTRACT_OPERAND (1, MM, *ip)];
3123           mask |= 1 << micromips_to_32_reg_n_map[EXTRACT_OPERAND (1, MN, *ip)];
3124         }
3125       if (pinfo2 & INSN2_READ_GPR_MP)
3126         mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3127       if (pinfo2 & INSN2_READ_GPR_MQ)
3128         mask |= 1 << micromips_to_32_reg_q_map[EXTRACT_OPERAND (1, MQ, *ip)];
3129     }
3130   /* Don't include register 0.  */
3131   return mask & ~1;
3132 }
3133
3134 /* Return the mask of core registers that IP writes.  */
3135
3136 static unsigned int
3137 gpr_write_mask (const struct mips_cl_insn *ip)
3138 {
3139   unsigned long pinfo, pinfo2;
3140   unsigned int mask;
3141
3142   mask = gpr_mod_mask (ip);
3143   pinfo = ip->insn_mo->pinfo;
3144   pinfo2 = ip->insn_mo->pinfo2;
3145   if (mips_opts.mips16)
3146     {
3147       if (pinfo & MIPS16_INSN_WRITE_X)
3148         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
3149       if (pinfo & MIPS16_INSN_WRITE_Y)
3150         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
3151       if (pinfo & MIPS16_INSN_WRITE_Z)
3152         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RZ, *ip)];
3153       if (pinfo & MIPS16_INSN_WRITE_T)
3154         mask |= 1 << TREG;
3155       if (pinfo & MIPS16_INSN_WRITE_SP)
3156         mask |= 1 << SP;
3157       if (pinfo & MIPS16_INSN_WRITE_31)
3158         mask |= 1 << RA;
3159       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3160         mask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3161     }
3162   else
3163     {
3164       if (pinfo & INSN_WRITE_GPR_D)
3165         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
3166       if (pinfo & INSN_WRITE_GPR_T)
3167         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
3168       if (pinfo & INSN_WRITE_GPR_S)
3169         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
3170       if (pinfo & INSN_WRITE_GPR_31)
3171         mask |= 1 << RA;
3172       if (pinfo2 & INSN2_WRITE_GPR_Z)
3173         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3174     }
3175   if (mips_opts.micromips)
3176     {
3177       if (pinfo2 & INSN2_WRITE_GPR_MB)
3178         mask |= 1 << micromips_to_32_reg_b_map[EXTRACT_OPERAND (1, MB, *ip)];
3179       if (pinfo2 & INSN2_WRITE_GPR_MHI)
3180         {
3181           mask |= 1 << micromips_to_32_reg_h_map[EXTRACT_OPERAND (1, MH, *ip)];
3182           mask |= 1 << micromips_to_32_reg_i_map[EXTRACT_OPERAND (1, MI, *ip)];
3183         }
3184       if (pinfo2 & INSN2_WRITE_GPR_MJ)
3185         mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3186       if (pinfo2 & INSN2_WRITE_GPR_MP)
3187         mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3188     }
3189   /* Don't include register 0.  */
3190   return mask & ~1;
3191 }
3192
3193 /* Return the mask of floating-point registers that IP reads.  */
3194
3195 static unsigned int
3196 fpr_read_mask (const struct mips_cl_insn *ip)
3197 {
3198   unsigned long pinfo, pinfo2;
3199   unsigned int mask;
3200
3201   mask = 0;
3202   pinfo = ip->insn_mo->pinfo;
3203   pinfo2 = ip->insn_mo->pinfo2;
3204   if (!mips_opts.mips16)
3205     {
3206       if (pinfo2 & INSN2_READ_FPR_D)
3207         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3208       if (pinfo & INSN_READ_FPR_S)
3209         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3210       if (pinfo & INSN_READ_FPR_T)
3211         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3212       if (pinfo & INSN_READ_FPR_R)
3213         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FR, *ip);
3214       if (pinfo2 & INSN2_READ_FPR_Z)
3215         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3216     }
3217   /* Conservatively treat all operands to an FP_D instruction are doubles.
3218      (This is overly pessimistic for things like cvt.d.s.)  */
3219   if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3220     mask |= mask << 1;
3221   return mask;
3222 }
3223
3224 /* Return the mask of floating-point registers that IP writes.  */
3225
3226 static unsigned int
3227 fpr_write_mask (const struct mips_cl_insn *ip)
3228 {
3229   unsigned long pinfo, pinfo2;
3230   unsigned int mask;
3231
3232   mask = 0;
3233   pinfo = ip->insn_mo->pinfo;
3234   pinfo2 = ip->insn_mo->pinfo2;
3235   if (!mips_opts.mips16)
3236     {
3237       if (pinfo & INSN_WRITE_FPR_D)
3238         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3239       if (pinfo & INSN_WRITE_FPR_S)
3240         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3241       if (pinfo & INSN_WRITE_FPR_T)
3242         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3243       if (pinfo2 & INSN2_WRITE_FPR_Z)
3244         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3245     }
3246   /* Conservatively treat all operands to an FP_D instruction are doubles.
3247      (This is overly pessimistic for things like cvt.s.d.)  */
3248   if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3249     mask |= mask << 1;
3250   return mask;
3251 }
3252
3253 /* Classify an instruction according to the FIX_VR4120_* enumeration.
3254    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
3255    by VR4120 errata.  */
3256
3257 static unsigned int
3258 classify_vr4120_insn (const char *name)
3259 {
3260   if (strncmp (name, "macc", 4) == 0)
3261     return FIX_VR4120_MACC;
3262   if (strncmp (name, "dmacc", 5) == 0)
3263     return FIX_VR4120_DMACC;
3264   if (strncmp (name, "mult", 4) == 0)
3265     return FIX_VR4120_MULT;
3266   if (strncmp (name, "dmult", 5) == 0)
3267     return FIX_VR4120_DMULT;
3268   if (strstr (name, "div"))
3269     return FIX_VR4120_DIV;
3270   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
3271     return FIX_VR4120_MTHILO;
3272   return NUM_FIX_VR4120_CLASSES;
3273 }
3274
3275 #define INSN_ERET  0x42000018
3276 #define INSN_DERET 0x4200001f
3277
3278 /* Return the number of instructions that must separate INSN1 and INSN2,
3279    where INSN1 is the earlier instruction.  Return the worst-case value
3280    for any INSN2 if INSN2 is null.  */
3281
3282 static unsigned int
3283 insns_between (const struct mips_cl_insn *insn1,
3284                const struct mips_cl_insn *insn2)
3285 {
3286   unsigned long pinfo1, pinfo2;
3287   unsigned int mask;
3288
3289   /* This function needs to know which pinfo flags are set for INSN2
3290      and which registers INSN2 uses.  The former is stored in PINFO2 and
3291      the latter is tested via INSN2_USES_GPR.  If INSN2 is null, PINFO2
3292      will have every flag set and INSN2_USES_GPR will always return true.  */
3293   pinfo1 = insn1->insn_mo->pinfo;
3294   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
3295
3296 #define INSN2_USES_GPR(REG) \
3297   (insn2 == NULL || (gpr_read_mask (insn2) & (1U << (REG))) != 0)
3298
3299   /* For most targets, write-after-read dependencies on the HI and LO
3300      registers must be separated by at least two instructions.  */
3301   if (!hilo_interlocks)
3302     {
3303       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
3304         return 2;
3305       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
3306         return 2;
3307     }
3308
3309   /* If we're working around r7000 errata, there must be two instructions
3310      between an mfhi or mflo and any instruction that uses the result.  */
3311   if (mips_7000_hilo_fix
3312       && !mips_opts.micromips
3313       && MF_HILO_INSN (pinfo1)
3314       && INSN2_USES_GPR (EXTRACT_OPERAND (0, RD, *insn1)))
3315     return 2;
3316
3317   /* If we're working around 24K errata, one instruction is required
3318      if an ERET or DERET is followed by a branch instruction.  */
3319   if (mips_fix_24k && !mips_opts.micromips)
3320     {
3321       if (insn1->insn_opcode == INSN_ERET
3322           || insn1->insn_opcode == INSN_DERET)
3323         {
3324           if (insn2 == NULL
3325               || insn2->insn_opcode == INSN_ERET
3326               || insn2->insn_opcode == INSN_DERET
3327               || delayed_branch_p (insn2))
3328             return 1;
3329         }
3330     }
3331
3332   /* If working around VR4120 errata, check for combinations that need
3333      a single intervening instruction.  */
3334   if (mips_fix_vr4120 && !mips_opts.micromips)
3335     {
3336       unsigned int class1, class2;
3337
3338       class1 = classify_vr4120_insn (insn1->insn_mo->name);
3339       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
3340         {
3341           if (insn2 == NULL)
3342             return 1;
3343           class2 = classify_vr4120_insn (insn2->insn_mo->name);
3344           if (vr4120_conflicts[class1] & (1 << class2))
3345             return 1;
3346         }
3347     }
3348
3349   if (!HAVE_CODE_COMPRESSION)
3350     {
3351       /* Check for GPR or coprocessor load delays.  All such delays
3352          are on the RT register.  */
3353       /* Itbl support may require additional care here.  */
3354       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
3355           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
3356         {
3357           know (pinfo1 & INSN_WRITE_GPR_T);
3358           if (INSN2_USES_GPR (EXTRACT_OPERAND (0, RT, *insn1)))
3359             return 1;
3360         }
3361
3362       /* Check for generic coprocessor hazards.
3363
3364          This case is not handled very well.  There is no special
3365          knowledge of CP0 handling, and the coprocessors other than
3366          the floating point unit are not distinguished at all.  */
3367       /* Itbl support may require additional care here. FIXME!
3368          Need to modify this to include knowledge about
3369          user specified delays!  */
3370       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
3371                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
3372         {
3373           /* Handle cases where INSN1 writes to a known general coprocessor
3374              register.  There must be a one instruction delay before INSN2
3375              if INSN2 reads that register, otherwise no delay is needed.  */
3376           mask = fpr_write_mask (insn1);
3377           if (mask != 0)
3378             {
3379               if (!insn2 || (mask & fpr_read_mask (insn2)) != 0)
3380                 return 1;
3381             }
3382           else
3383             {
3384               /* Read-after-write dependencies on the control registers
3385                  require a two-instruction gap.  */
3386               if ((pinfo1 & INSN_WRITE_COND_CODE)
3387                   && (pinfo2 & INSN_READ_COND_CODE))
3388                 return 2;
3389
3390               /* We don't know exactly what INSN1 does.  If INSN2 is
3391                  also a coprocessor instruction, assume there must be
3392                  a one instruction gap.  */
3393               if (pinfo2 & INSN_COP)
3394                 return 1;
3395             }
3396         }
3397
3398       /* Check for read-after-write dependencies on the coprocessor
3399          control registers in cases where INSN1 does not need a general
3400          coprocessor delay.  This means that INSN1 is a floating point
3401          comparison instruction.  */
3402       /* Itbl support may require additional care here.  */
3403       else if (!cop_interlocks
3404                && (pinfo1 & INSN_WRITE_COND_CODE)
3405                && (pinfo2 & INSN_READ_COND_CODE))
3406         return 1;
3407     }
3408
3409 #undef INSN2_USES_GPR
3410
3411   return 0;
3412 }
3413
3414 /* Return the number of nops that would be needed to work around the
3415    VR4130 mflo/mfhi errata if instruction INSN immediately followed
3416    the MAX_VR4130_NOPS instructions described by HIST.  Ignore hazards
3417    that are contained within the first IGNORE instructions of HIST.  */
3418
3419 static int
3420 nops_for_vr4130 (int ignore, const struct mips_cl_insn *hist,
3421                  const struct mips_cl_insn *insn)
3422 {
3423   int i, j;
3424   unsigned int mask;
3425
3426   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
3427      are not affected by the errata.  */
3428   if (insn != 0
3429       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
3430           || strcmp (insn->insn_mo->name, "mtlo") == 0
3431           || strcmp (insn->insn_mo->name, "mthi") == 0))
3432     return 0;
3433
3434   /* Search for the first MFLO or MFHI.  */
3435   for (i = 0; i < MAX_VR4130_NOPS; i++)
3436     if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
3437       {
3438         /* Extract the destination register.  */
3439         mask = gpr_write_mask (&hist[i]);
3440
3441         /* No nops are needed if INSN reads that register.  */
3442         if (insn != NULL && (gpr_read_mask (insn) & mask) != 0)
3443           return 0;
3444
3445         /* ...or if any of the intervening instructions do.  */
3446         for (j = 0; j < i; j++)
3447           if (gpr_read_mask (&hist[j]) & mask)
3448             return 0;
3449
3450         if (i >= ignore)
3451           return MAX_VR4130_NOPS - i;
3452       }
3453   return 0;
3454 }
3455
3456 #define BASE_REG_EQ(INSN1, INSN2)       \
3457   ((((INSN1) >> OP_SH_RS) & OP_MASK_RS) \
3458       == (((INSN2) >> OP_SH_RS) & OP_MASK_RS))
3459
3460 /* Return the minimum alignment for this store instruction.  */
3461
3462 static int
3463 fix_24k_align_to (const struct mips_opcode *mo)
3464 {
3465   if (strcmp (mo->name, "sh") == 0)
3466     return 2;
3467
3468   if (strcmp (mo->name, "swc1") == 0
3469       || strcmp (mo->name, "swc2") == 0
3470       || strcmp (mo->name, "sw") == 0
3471       || strcmp (mo->name, "sc") == 0
3472       || strcmp (mo->name, "s.s") == 0)
3473     return 4;
3474
3475   if (strcmp (mo->name, "sdc1") == 0
3476       || strcmp (mo->name, "sdc2") == 0
3477       || strcmp (mo->name, "s.d") == 0)
3478     return 8;
3479
3480   /* sb, swl, swr */
3481   return 1;
3482 }
3483
3484 struct fix_24k_store_info
3485   {
3486     /* Immediate offset, if any, for this store instruction.  */
3487     short off;
3488     /* Alignment required by this store instruction.  */
3489     int align_to;
3490     /* True for register offsets.  */
3491     int register_offset;
3492   };
3493
3494 /* Comparison function used by qsort.  */
3495
3496 static int
3497 fix_24k_sort (const void *a, const void *b)
3498 {
3499   const struct fix_24k_store_info *pos1 = a;
3500   const struct fix_24k_store_info *pos2 = b;
3501
3502   return (pos1->off - pos2->off);
3503 }
3504
3505 /* INSN is a store instruction.  Try to record the store information
3506    in STINFO.  Return false if the information isn't known.  */
3507
3508 static bfd_boolean
3509 fix_24k_record_store_info (struct fix_24k_store_info *stinfo,
3510                            const struct mips_cl_insn *insn)
3511 {
3512   /* The instruction must have a known offset.  */
3513   if (!insn->complete_p || !strstr (insn->insn_mo->args, "o("))
3514     return FALSE;
3515
3516   stinfo->off = (insn->insn_opcode >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE;
3517   stinfo->align_to = fix_24k_align_to (insn->insn_mo);
3518   return TRUE;
3519 }
3520
3521 /* Return the number of nops that would be needed to work around the 24k
3522    "lost data on stores during refill" errata if instruction INSN
3523    immediately followed the 2 instructions described by HIST.
3524    Ignore hazards that are contained within the first IGNORE
3525    instructions of HIST.
3526
3527    Problem: The FSB (fetch store buffer) acts as an intermediate buffer
3528    for the data cache refills and store data. The following describes
3529    the scenario where the store data could be lost.
3530
3531    * A data cache miss, due to either a load or a store, causing fill
3532      data to be supplied by the memory subsystem
3533    * The first three doublewords of fill data are returned and written
3534      into the cache
3535    * A sequence of four stores occurs in consecutive cycles around the
3536      final doubleword of the fill:
3537    * Store A
3538    * Store B
3539    * Store C
3540    * Zero, One or more instructions
3541    * Store D
3542
3543    The four stores A-D must be to different doublewords of the line that
3544    is being filled. The fourth instruction in the sequence above permits
3545    the fill of the final doubleword to be transferred from the FSB into
3546    the cache. In the sequence above, the stores may be either integer
3547    (sb, sh, sw, swr, swl, sc) or coprocessor (swc1/swc2, sdc1/sdc2,
3548    swxc1, sdxc1, suxc1) stores, as long as the four stores are to
3549    different doublewords on the line. If the floating point unit is
3550    running in 1:2 mode, it is not possible to create the sequence above
3551    using only floating point store instructions.
3552
3553    In this case, the cache line being filled is incorrectly marked
3554    invalid, thereby losing the data from any store to the line that
3555    occurs between the original miss and the completion of the five
3556    cycle sequence shown above.
3557
3558    The workarounds are:
3559
3560    * Run the data cache in write-through mode.
3561    * Insert a non-store instruction between
3562      Store A and Store B or Store B and Store C.  */
3563   
3564 static int
3565 nops_for_24k (int ignore, const struct mips_cl_insn *hist,
3566               const struct mips_cl_insn *insn)
3567 {
3568   struct fix_24k_store_info pos[3];
3569   int align, i, base_offset;
3570
3571   if (ignore >= 2)
3572     return 0;
3573
3574   /* If the previous instruction wasn't a store, there's nothing to
3575      worry about.  */
3576   if ((hist[0].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3577     return 0;
3578
3579   /* If the instructions after the previous one are unknown, we have
3580      to assume the worst.  */
3581   if (!insn)
3582     return 1;
3583
3584   /* Check whether we are dealing with three consecutive stores.  */
3585   if ((insn->insn_mo->pinfo & INSN_STORE_MEMORY) == 0
3586       || (hist[1].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3587     return 0;
3588
3589   /* If we don't know the relationship between the store addresses,
3590      assume the worst.  */
3591   if (!BASE_REG_EQ (insn->insn_opcode, hist[0].insn_opcode)
3592       || !BASE_REG_EQ (insn->insn_opcode, hist[1].insn_opcode))
3593     return 1;
3594
3595   if (!fix_24k_record_store_info (&pos[0], insn)
3596       || !fix_24k_record_store_info (&pos[1], &hist[0])
3597       || !fix_24k_record_store_info (&pos[2], &hist[1]))
3598     return 1;
3599
3600   qsort (&pos, 3, sizeof (struct fix_24k_store_info), fix_24k_sort);
3601
3602   /* Pick a value of ALIGN and X such that all offsets are adjusted by
3603      X bytes and such that the base register + X is known to be aligned
3604      to align bytes.  */
3605
3606   if (((insn->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == SP)
3607     align = 8;
3608   else
3609     {
3610       align = pos[0].align_to;
3611       base_offset = pos[0].off;
3612       for (i = 1; i < 3; i++)
3613         if (align < pos[i].align_to)
3614           {
3615             align = pos[i].align_to;
3616             base_offset = pos[i].off;
3617           }
3618       for (i = 0; i < 3; i++)
3619         pos[i].off -= base_offset;
3620     }
3621
3622   pos[0].off &= ~align + 1;
3623   pos[1].off &= ~align + 1;
3624   pos[2].off &= ~align + 1;
3625
3626   /* If any two stores write to the same chunk, they also write to the
3627      same doubleword.  The offsets are still sorted at this point.  */
3628   if (pos[0].off == pos[1].off || pos[1].off == pos[2].off)
3629     return 0;
3630
3631   /* A range of at least 9 bytes is needed for the stores to be in
3632      non-overlapping doublewords.  */
3633   if (pos[2].off - pos[0].off <= 8)
3634     return 0;
3635
3636   if (pos[2].off - pos[1].off >= 24
3637       || pos[1].off - pos[0].off >= 24
3638       || pos[2].off - pos[0].off >= 32)
3639     return 0;
3640
3641   return 1;
3642 }
3643
3644 /* Return the number of nops that would be needed if instruction INSN
3645    immediately followed the MAX_NOPS instructions given by HIST,
3646    where HIST[0] is the most recent instruction.  Ignore hazards
3647    between INSN and the first IGNORE instructions in HIST.
3648
3649    If INSN is null, return the worse-case number of nops for any
3650    instruction.  */
3651
3652 static int
3653 nops_for_insn (int ignore, const struct mips_cl_insn *hist,
3654                const struct mips_cl_insn *insn)
3655 {
3656   int i, nops, tmp_nops;
3657
3658   nops = 0;
3659   for (i = ignore; i < MAX_DELAY_NOPS; i++)
3660     {
3661       tmp_nops = insns_between (hist + i, insn) - i;
3662       if (tmp_nops > nops)
3663         nops = tmp_nops;
3664     }
3665
3666   if (mips_fix_vr4130 && !mips_opts.micromips)
3667     {
3668       tmp_nops = nops_for_vr4130 (ignore, hist, insn);
3669       if (tmp_nops > nops)
3670         nops = tmp_nops;
3671     }
3672
3673   if (mips_fix_24k && !mips_opts.micromips)
3674     {
3675       tmp_nops = nops_for_24k (ignore, hist, insn);
3676       if (tmp_nops > nops)
3677         nops = tmp_nops;
3678     }
3679
3680   return nops;
3681 }
3682
3683 /* The variable arguments provide NUM_INSNS extra instructions that
3684    might be added to HIST.  Return the largest number of nops that
3685    would be needed after the extended sequence, ignoring hazards
3686    in the first IGNORE instructions.  */
3687
3688 static int
3689 nops_for_sequence (int num_insns, int ignore,
3690                    const struct mips_cl_insn *hist, ...)
3691 {
3692   va_list args;
3693   struct mips_cl_insn buffer[MAX_NOPS];
3694   struct mips_cl_insn *cursor;
3695   int nops;
3696
3697   va_start (args, hist);
3698   cursor = buffer + num_insns;
3699   memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
3700   while (cursor > buffer)
3701     *--cursor = *va_arg (args, const struct mips_cl_insn *);
3702
3703   nops = nops_for_insn (ignore, buffer, NULL);
3704   va_end (args);
3705   return nops;
3706 }
3707
3708 /* Like nops_for_insn, but if INSN is a branch, take into account the
3709    worst-case delay for the branch target.  */
3710
3711 static int
3712 nops_for_insn_or_target (int ignore, const struct mips_cl_insn *hist,
3713                          const struct mips_cl_insn *insn)
3714 {
3715   int nops, tmp_nops;
3716
3717   nops = nops_for_insn (ignore, hist, insn);
3718   if (delayed_branch_p (insn))
3719     {
3720       tmp_nops = nops_for_sequence (2, ignore ? ignore + 2 : 0,
3721                                     hist, insn, get_delay_slot_nop (insn));
3722       if (tmp_nops > nops)
3723         nops = tmp_nops;
3724     }
3725   else if (compact_branch_p (insn))
3726     {
3727       tmp_nops = nops_for_sequence (1, ignore ? ignore + 1 : 0, hist, insn);
3728       if (tmp_nops > nops)
3729         nops = tmp_nops;
3730     }
3731   return nops;
3732 }
3733
3734 /* Fix NOP issue: Replace nops by "or at,at,zero".  */
3735
3736 static void
3737 fix_loongson2f_nop (struct mips_cl_insn * ip)
3738 {
3739   gas_assert (!HAVE_CODE_COMPRESSION);
3740   if (strcmp (ip->insn_mo->name, "nop") == 0)
3741     ip->insn_opcode = LOONGSON2F_NOP_INSN;
3742 }
3743
3744 /* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
3745                    jr target pc &= 'hffff_ffff_cfff_ffff.  */
3746
3747 static void
3748 fix_loongson2f_jump (struct mips_cl_insn * ip)
3749 {
3750   gas_assert (!HAVE_CODE_COMPRESSION);
3751   if (strcmp (ip->insn_mo->name, "j") == 0
3752       || strcmp (ip->insn_mo->name, "jr") == 0
3753       || strcmp (ip->insn_mo->name, "jalr") == 0)
3754     {
3755       int sreg;
3756       expressionS ep;
3757
3758       if (! mips_opts.at)
3759         return;
3760
3761       sreg = EXTRACT_OPERAND (0, RS, *ip);
3762       if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
3763         return;
3764
3765       ep.X_op = O_constant;
3766       ep.X_add_number = 0xcfff0000;
3767       macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
3768       ep.X_add_number = 0xffff;
3769       macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
3770       macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
3771     }
3772 }
3773
3774 static void
3775 fix_loongson2f (struct mips_cl_insn * ip)
3776 {
3777   if (mips_fix_loongson2f_nop)
3778     fix_loongson2f_nop (ip);
3779
3780   if (mips_fix_loongson2f_jump)
3781     fix_loongson2f_jump (ip);
3782 }
3783
3784 /* IP is a branch that has a delay slot, and we need to fill it
3785    automatically.   Return true if we can do that by swapping IP
3786    with the previous instruction.
3787    ADDRESS_EXPR is an operand of the instruction to be used with
3788    RELOC_TYPE.  */
3789
3790 static bfd_boolean
3791 can_swap_branch_p (struct mips_cl_insn *ip, expressionS *address_expr,
3792   bfd_reloc_code_real_type *reloc_type)
3793 {
3794   unsigned long pinfo, pinfo2, prev_pinfo, prev_pinfo2;
3795   unsigned int gpr_read, gpr_write, prev_gpr_read, prev_gpr_write;
3796
3797   /* -O2 and above is required for this optimization.  */
3798   if (mips_optimize < 2)
3799     return FALSE;
3800
3801   /* If we have seen .set volatile or .set nomove, don't optimize.  */
3802   if (mips_opts.nomove)
3803     return FALSE;
3804
3805   /* We can't swap if the previous instruction's position is fixed.  */
3806   if (history[0].fixed_p)
3807     return FALSE;
3808
3809   /* If the previous previous insn was in a .set noreorder, we can't
3810      swap.  Actually, the MIPS assembler will swap in this situation.
3811      However, gcc configured -with-gnu-as will generate code like
3812
3813         .set    noreorder
3814         lw      $4,XXX
3815         .set    reorder
3816         INSN
3817         bne     $4,$0,foo
3818
3819      in which we can not swap the bne and INSN.  If gcc is not configured
3820      -with-gnu-as, it does not output the .set pseudo-ops.  */
3821   if (history[1].noreorder_p)
3822     return FALSE;
3823
3824   /* If the previous instruction had a fixup in mips16 mode, we can not swap.
3825      This means that the previous instruction was a 4-byte one anyhow.  */
3826   if (mips_opts.mips16 && history[0].fixp[0])
3827     return FALSE;
3828
3829   /* If the branch is itself the target of a branch, we can not swap.
3830      We cheat on this; all we check for is whether there is a label on
3831      this instruction.  If there are any branches to anything other than
3832      a label, users must use .set noreorder.  */
3833   if (seg_info (now_seg)->label_list)
3834     return FALSE;
3835
3836   /* If the previous instruction is in a variant frag other than this
3837      branch's one, we cannot do the swap.  This does not apply to
3838      MIPS16 code, which uses variant frags for different purposes.  */
3839   if (!mips_opts.mips16
3840       && history[0].frag
3841       && history[0].frag->fr_type == rs_machine_dependent)
3842     return FALSE;
3843
3844   /* We do not swap with instructions that cannot architecturally
3845      be placed in a branch delay slot, such as SYNC or ERET.  We
3846      also refrain from swapping with a trap instruction, since it
3847      complicates trap handlers to have the trap instruction be in
3848      a delay slot.  */
3849   prev_pinfo = history[0].insn_mo->pinfo;
3850   if (prev_pinfo & INSN_NO_DELAY_SLOT)
3851     return FALSE;
3852
3853   /* Check for conflicts between the branch and the instructions
3854      before the candidate delay slot.  */
3855   if (nops_for_insn (0, history + 1, ip) > 0)
3856     return FALSE;
3857
3858   /* Check for conflicts between the swapped sequence and the
3859      target of the branch.  */
3860   if (nops_for_sequence (2, 0, history + 1, ip, history) > 0)
3861     return FALSE;
3862
3863   /* If the branch reads a register that the previous
3864      instruction sets, we can not swap.  */
3865   gpr_read = gpr_read_mask (ip);
3866   prev_gpr_write = gpr_write_mask (&history[0]);
3867   if (gpr_read & prev_gpr_write)
3868     return FALSE;
3869
3870   /* If the branch writes a register that the previous
3871      instruction sets, we can not swap.  */
3872   gpr_write = gpr_write_mask (ip);
3873   if (gpr_write & prev_gpr_write)
3874     return FALSE;
3875
3876   /* If the branch writes a register that the previous
3877      instruction reads, we can not swap.  */
3878   prev_gpr_read = gpr_read_mask (&history[0]);
3879   if (gpr_write & prev_gpr_read)
3880     return FALSE;
3881
3882   /* If one instruction sets a condition code and the
3883      other one uses a condition code, we can not swap.  */
3884   pinfo = ip->insn_mo->pinfo;
3885   if ((pinfo & INSN_READ_COND_CODE)
3886       && (prev_pinfo & INSN_WRITE_COND_CODE))
3887     return FALSE;
3888   if ((pinfo & INSN_WRITE_COND_CODE)
3889       && (prev_pinfo & INSN_READ_COND_CODE))
3890     return FALSE;
3891
3892   /* If the previous instruction uses the PC, we can not swap.  */
3893   prev_pinfo2 = history[0].insn_mo->pinfo2;
3894   if (mips_opts.mips16 && (prev_pinfo & MIPS16_INSN_READ_PC))
3895     return FALSE;
3896   if (mips_opts.micromips && (prev_pinfo2 & INSN2_READ_PC))
3897     return FALSE;
3898
3899   /* If the previous instruction has an incorrect size for a fixed
3900      branch delay slot in microMIPS mode, we cannot swap.  */
3901   pinfo2 = ip->insn_mo->pinfo2;
3902   if (mips_opts.micromips
3903       && (pinfo2 & INSN2_BRANCH_DELAY_16BIT)
3904       && insn_length (history) != 2)
3905     return FALSE;
3906   if (mips_opts.micromips
3907       && (pinfo2 & INSN2_BRANCH_DELAY_32BIT)
3908       && insn_length (history) != 4)
3909     return FALSE;
3910
3911   /* On R5900 short loops need to be fixed by inserting a nop in
3912      the branch delay slots.
3913      A short loop can be terminated too early.  */
3914   if (mips_opts.arch == CPU_R5900
3915       /* Check if instruction has a parameter, ignore "j $31". */
3916       && (address_expr != NULL)
3917       /* Parameter must be 16 bit. */
3918       && (*reloc_type == BFD_RELOC_16_PCREL_S2)
3919       /* Branch to same segment. */
3920       && (S_GET_SEGMENT(address_expr->X_add_symbol) == now_seg)
3921       /* Branch to same code fragment. */
3922       && (symbol_get_frag(address_expr->X_add_symbol) == frag_now)
3923       /* Can only calculate branch offset if value is known. */
3924       && symbol_constant_p(address_expr->X_add_symbol)
3925       /* Check if branch is really conditional. */
3926       && !((ip->insn_opcode & 0xffff0000) == 0x10000000   /* beq $0,$0 */
3927         || (ip->insn_opcode & 0xffff0000) == 0x04010000   /* bgez $0 */
3928         || (ip->insn_opcode & 0xffff0000) == 0x04110000)) /* bgezal $0 */
3929     {
3930       int distance;
3931       /* Check if loop is shorter than 6 instructions including
3932          branch and delay slot.  */
3933       distance = frag_now_fix() - S_GET_VALUE(address_expr->X_add_symbol);
3934       if (distance <= 20)
3935         {
3936           int i;
3937           int rv;
3938
3939           rv = FALSE;
3940           /* When the loop includes branches or jumps,
3941              it is not a short loop. */
3942           for (i = 0; i < (distance / 4); i++)
3943             {
3944               if ((history[i].cleared_p)
3945                   || delayed_branch_p(&history[i]))
3946                 {
3947                   rv = TRUE;
3948                   break;
3949                 }
3950             }
3951           if (rv == FALSE)
3952             {
3953               /* Insert nop after branch to fix short loop. */
3954               return FALSE;
3955             }
3956         }
3957     }
3958
3959   return TRUE;
3960 }
3961
3962 /* Decide how we should add IP to the instruction stream.
3963    ADDRESS_EXPR is an operand of the instruction to be used with
3964    RELOC_TYPE.  */
3965
3966 static enum append_method
3967 get_append_method (struct mips_cl_insn *ip, expressionS *address_expr,
3968   bfd_reloc_code_real_type *reloc_type)
3969 {
3970   unsigned long pinfo;
3971
3972   /* The relaxed version of a macro sequence must be inherently
3973      hazard-free.  */
3974   if (mips_relax.sequence == 2)
3975     return APPEND_ADD;
3976
3977   /* We must not dabble with instructions in a ".set norerorder" block.  */
3978   if (mips_opts.noreorder)
3979     return APPEND_ADD;
3980
3981   /* Otherwise, it's our responsibility to fill branch delay slots.  */
3982   if (delayed_branch_p (ip))
3983     {
3984       if (!branch_likely_p (ip)
3985           && can_swap_branch_p (ip, address_expr, reloc_type))
3986         return APPEND_SWAP;
3987
3988       pinfo = ip->insn_mo->pinfo;
3989       if (mips_opts.mips16
3990           && ISA_SUPPORTS_MIPS16E
3991           && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31)))
3992         return APPEND_ADD_COMPACT;
3993
3994       return APPEND_ADD_WITH_NOP;
3995     }
3996
3997   return APPEND_ADD;
3998 }
3999
4000 /* IP is a MIPS16 instruction whose opcode we have just changed.
4001    Point IP->insn_mo to the new opcode's definition.  */
4002
4003 static void
4004 find_altered_mips16_opcode (struct mips_cl_insn *ip)
4005 {
4006   const struct mips_opcode *mo, *end;
4007
4008   end = &mips16_opcodes[bfd_mips16_num_opcodes];
4009   for (mo = ip->insn_mo; mo < end; mo++)
4010     if ((ip->insn_opcode & mo->mask) == mo->match)
4011       {
4012         ip->insn_mo = mo;
4013         return;
4014       }
4015   abort ();
4016 }
4017
4018 /* For microMIPS macros, we need to generate a local number label
4019    as the target of branches.  */
4020 #define MICROMIPS_LABEL_CHAR            '\037'
4021 static unsigned long micromips_target_label;
4022 static char micromips_target_name[32];
4023
4024 static char *
4025 micromips_label_name (void)
4026 {
4027   char *p = micromips_target_name;
4028   char symbol_name_temporary[24];
4029   unsigned long l;
4030   int i;
4031
4032   if (*p)
4033     return p;
4034
4035   i = 0;
4036   l = micromips_target_label;
4037 #ifdef LOCAL_LABEL_PREFIX
4038   *p++ = LOCAL_LABEL_PREFIX;
4039 #endif
4040   *p++ = 'L';
4041   *p++ = MICROMIPS_LABEL_CHAR;
4042   do
4043     {
4044       symbol_name_temporary[i++] = l % 10 + '0';
4045       l /= 10;
4046     }
4047   while (l != 0);
4048   while (i > 0)
4049     *p++ = symbol_name_temporary[--i];
4050   *p = '\0';
4051
4052   return micromips_target_name;
4053 }
4054
4055 static void
4056 micromips_label_expr (expressionS *label_expr)
4057 {
4058   label_expr->X_op = O_symbol;
4059   label_expr->X_add_symbol = symbol_find_or_make (micromips_label_name ());
4060   label_expr->X_add_number = 0;
4061 }
4062
4063 static void
4064 micromips_label_inc (void)
4065 {
4066   micromips_target_label++;
4067   *micromips_target_name = '\0';
4068 }
4069
4070 static void
4071 micromips_add_label (void)
4072 {
4073   symbolS *s;
4074
4075   s = colon (micromips_label_name ());
4076   micromips_label_inc ();
4077 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
4078   if (IS_ELF)
4079     S_SET_OTHER (s, ELF_ST_SET_MICROMIPS (S_GET_OTHER (s)));
4080 #else
4081   (void) s;
4082 #endif
4083 }
4084
4085 /* If assembling microMIPS code, then return the microMIPS reloc
4086    corresponding to the requested one if any.  Otherwise return
4087    the reloc unchanged.  */
4088
4089 static bfd_reloc_code_real_type
4090 micromips_map_reloc (bfd_reloc_code_real_type reloc)
4091 {
4092   static const bfd_reloc_code_real_type relocs[][2] =
4093     {
4094       /* Keep sorted incrementally by the left-hand key.  */
4095       { BFD_RELOC_16_PCREL_S2, BFD_RELOC_MICROMIPS_16_PCREL_S1 },
4096       { BFD_RELOC_GPREL16, BFD_RELOC_MICROMIPS_GPREL16 },
4097       { BFD_RELOC_MIPS_JMP, BFD_RELOC_MICROMIPS_JMP },
4098       { BFD_RELOC_HI16, BFD_RELOC_MICROMIPS_HI16 },
4099       { BFD_RELOC_HI16_S, BFD_RELOC_MICROMIPS_HI16_S },
4100       { BFD_RELOC_LO16, BFD_RELOC_MICROMIPS_LO16 },
4101       { BFD_RELOC_MIPS_LITERAL, BFD_RELOC_MICROMIPS_LITERAL },
4102       { BFD_RELOC_MIPS_GOT16, BFD_RELOC_MICROMIPS_GOT16 },
4103       { BFD_RELOC_MIPS_CALL16, BFD_RELOC_MICROMIPS_CALL16 },
4104       { BFD_RELOC_MIPS_GOT_HI16, BFD_RELOC_MICROMIPS_GOT_HI16 },
4105       { BFD_RELOC_MIPS_GOT_LO16, BFD_RELOC_MICROMIPS_GOT_LO16 },
4106       { BFD_RELOC_MIPS_CALL_HI16, BFD_RELOC_MICROMIPS_CALL_HI16 },
4107       { BFD_RELOC_MIPS_CALL_LO16, BFD_RELOC_MICROMIPS_CALL_LO16 },
4108       { BFD_RELOC_MIPS_SUB, BFD_RELOC_MICROMIPS_SUB },
4109       { BFD_RELOC_MIPS_GOT_PAGE, BFD_RELOC_MICROMIPS_GOT_PAGE },
4110       { BFD_RELOC_MIPS_GOT_OFST, BFD_RELOC_MICROMIPS_GOT_OFST },
4111       { BFD_RELOC_MIPS_GOT_DISP, BFD_RELOC_MICROMIPS_GOT_DISP },
4112       { BFD_RELOC_MIPS_HIGHEST, BFD_RELOC_MICROMIPS_HIGHEST },
4113       { BFD_RELOC_MIPS_HIGHER, BFD_RELOC_MICROMIPS_HIGHER },
4114       { BFD_RELOC_MIPS_SCN_DISP, BFD_RELOC_MICROMIPS_SCN_DISP },
4115       { BFD_RELOC_MIPS_TLS_GD, BFD_RELOC_MICROMIPS_TLS_GD },
4116       { BFD_RELOC_MIPS_TLS_LDM, BFD_RELOC_MICROMIPS_TLS_LDM },
4117       { BFD_RELOC_MIPS_TLS_DTPREL_HI16, BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16 },
4118       { BFD_RELOC_MIPS_TLS_DTPREL_LO16, BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16 },
4119       { BFD_RELOC_MIPS_TLS_GOTTPREL, BFD_RELOC_MICROMIPS_TLS_GOTTPREL },
4120       { BFD_RELOC_MIPS_TLS_TPREL_HI16, BFD_RELOC_MICROMIPS_TLS_TPREL_HI16 },
4121       { BFD_RELOC_MIPS_TLS_TPREL_LO16, BFD_RELOC_MICROMIPS_TLS_TPREL_LO16 }
4122     };
4123   bfd_reloc_code_real_type r;
4124   size_t i;
4125
4126   if (!mips_opts.micromips)
4127     return reloc;
4128   for (i = 0; i < ARRAY_SIZE (relocs); i++)
4129     {
4130       r = relocs[i][0];
4131       if (r > reloc)
4132         return reloc;
4133       if (r == reloc)
4134         return relocs[i][1];
4135     }
4136   return reloc;
4137 }
4138
4139 /* Try to resolve relocation RELOC against constant OPERAND at assembly time.
4140    Return true on success, storing the resolved value in RESULT.  */
4141
4142 static bfd_boolean
4143 calculate_reloc (bfd_reloc_code_real_type reloc, offsetT operand,
4144                  offsetT *result)
4145 {
4146   switch (reloc)
4147     {
4148     case BFD_RELOC_MIPS_HIGHEST:
4149     case BFD_RELOC_MICROMIPS_HIGHEST:
4150       *result = ((operand + 0x800080008000ull) >> 48) & 0xffff;
4151       return TRUE;
4152
4153     case BFD_RELOC_MIPS_HIGHER:
4154     case BFD_RELOC_MICROMIPS_HIGHER:
4155       *result = ((operand + 0x80008000ull) >> 32) & 0xffff;
4156       return TRUE;
4157
4158     case BFD_RELOC_HI16_S:
4159     case BFD_RELOC_MICROMIPS_HI16_S:
4160     case BFD_RELOC_MIPS16_HI16_S:
4161       *result = ((operand + 0x8000) >> 16) & 0xffff;
4162       return TRUE;
4163
4164     case BFD_RELOC_HI16:
4165     case BFD_RELOC_MICROMIPS_HI16:
4166     case BFD_RELOC_MIPS16_HI16:
4167       *result = (operand >> 16) & 0xffff;
4168       return TRUE;
4169
4170     case BFD_RELOC_LO16:
4171     case BFD_RELOC_MICROMIPS_LO16:
4172     case BFD_RELOC_MIPS16_LO16:
4173       *result = operand & 0xffff;
4174       return TRUE;
4175
4176     case BFD_RELOC_UNUSED:
4177       *result = operand;
4178       return TRUE;
4179
4180     default:
4181       return FALSE;
4182     }
4183 }
4184
4185 /* Output an instruction.  IP is the instruction information.
4186    ADDRESS_EXPR is an operand of the instruction to be used with
4187    RELOC_TYPE.  EXPANSIONP is true if the instruction is part of
4188    a macro expansion.  */
4189
4190 static void
4191 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
4192              bfd_reloc_code_real_type *reloc_type, bfd_boolean expansionp)
4193 {
4194   unsigned long prev_pinfo2, pinfo;
4195   bfd_boolean relaxed_branch = FALSE;
4196   enum append_method method;
4197   bfd_boolean relax32;
4198   int branch_disp;
4199
4200   if (mips_fix_loongson2f && !HAVE_CODE_COMPRESSION)
4201     fix_loongson2f (ip);
4202
4203   file_ase_mips16 |= mips_opts.mips16;
4204   file_ase_micromips |= mips_opts.micromips;
4205
4206   prev_pinfo2 = history[0].insn_mo->pinfo2;
4207   pinfo = ip->insn_mo->pinfo;
4208
4209   if (mips_opts.micromips
4210       && !expansionp
4211       && (((prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
4212            && micromips_insn_length (ip->insn_mo) != 2)
4213           || ((prev_pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
4214               && micromips_insn_length (ip->insn_mo) != 4)))
4215     as_warn (_("Wrong size instruction in a %u-bit branch delay slot"),
4216              (prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0 ? 16 : 32);
4217
4218   if (address_expr == NULL)
4219     ip->complete_p = 1;
4220   else if (reloc_type[0] <= BFD_RELOC_UNUSED
4221            && reloc_type[1] == BFD_RELOC_UNUSED
4222            && reloc_type[2] == BFD_RELOC_UNUSED
4223            && address_expr->X_op == O_constant)
4224     {
4225       switch (*reloc_type)
4226         {
4227         case BFD_RELOC_MIPS_JMP:
4228           {
4229             int shift;
4230
4231             shift = mips_opts.micromips ? 1 : 2;
4232             if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4233               as_bad (_("jump to misaligned address (0x%lx)"),
4234                       (unsigned long) address_expr->X_add_number);
4235             ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4236                                 & 0x3ffffff);
4237             ip->complete_p = 1;
4238           }
4239           break;
4240
4241         case BFD_RELOC_MIPS16_JMP:
4242           if ((address_expr->X_add_number & 3) != 0)
4243             as_bad (_("jump to misaligned address (0x%lx)"),
4244                     (unsigned long) address_expr->X_add_number);
4245           ip->insn_opcode |=
4246             (((address_expr->X_add_number & 0x7c0000) << 3)
4247                | ((address_expr->X_add_number & 0xf800000) >> 7)
4248                | ((address_expr->X_add_number & 0x3fffc) >> 2));
4249           ip->complete_p = 1;
4250           break;
4251
4252         case BFD_RELOC_16_PCREL_S2:
4253           {
4254             int shift;
4255
4256             shift = mips_opts.micromips ? 1 : 2;
4257             if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4258               as_bad (_("branch to misaligned address (0x%lx)"),
4259                       (unsigned long) address_expr->X_add_number);
4260             if (!mips_relax_branch)
4261               {
4262                 if ((address_expr->X_add_number + (1 << (shift + 15)))
4263                     & ~((1 << (shift + 16)) - 1))
4264                   as_bad (_("branch address range overflow (0x%lx)"),
4265                           (unsigned long) address_expr->X_add_number);
4266                 ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4267                                     & 0xffff);
4268               }
4269           }
4270           break;
4271
4272         default:
4273           {
4274             offsetT value;
4275
4276             if (calculate_reloc (*reloc_type, address_expr->X_add_number,
4277                                  &value))
4278               {
4279                 ip->insn_opcode |= value & 0xffff;
4280                 ip->complete_p = 1;
4281               }
4282           }
4283           break;
4284         }
4285     }
4286
4287   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
4288     {
4289       /* There are a lot of optimizations we could do that we don't.
4290          In particular, we do not, in general, reorder instructions.
4291          If you use gcc with optimization, it will reorder
4292          instructions and generally do much more optimization then we
4293          do here; repeating all that work in the assembler would only
4294          benefit hand written assembly code, and does not seem worth
4295          it.  */
4296       int nops = (mips_optimize == 0
4297                   ? nops_for_insn (0, history, NULL)
4298                   : nops_for_insn_or_target (0, history, ip));
4299       if (nops > 0)
4300         {
4301           fragS *old_frag;
4302           unsigned long old_frag_offset;
4303           int i;
4304
4305           old_frag = frag_now;
4306           old_frag_offset = frag_now_fix ();
4307
4308           for (i = 0; i < nops; i++)
4309             add_fixed_insn (NOP_INSN);
4310           insert_into_history (0, nops, NOP_INSN);
4311
4312           if (listing)
4313             {
4314               listing_prev_line ();
4315               /* We may be at the start of a variant frag.  In case we
4316                  are, make sure there is enough space for the frag
4317                  after the frags created by listing_prev_line.  The
4318                  argument to frag_grow here must be at least as large
4319                  as the argument to all other calls to frag_grow in
4320                  this file.  We don't have to worry about being in the
4321                  middle of a variant frag, because the variants insert
4322                  all needed nop instructions themselves.  */
4323               frag_grow (40);
4324             }
4325
4326           mips_move_text_labels ();
4327
4328 #ifndef NO_ECOFF_DEBUGGING
4329           if (ECOFF_DEBUGGING)
4330             ecoff_fix_loc (old_frag, old_frag_offset);
4331 #endif
4332         }
4333     }
4334   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
4335     {
4336       int nops;
4337
4338       /* Work out how many nops in prev_nop_frag are needed by IP,
4339          ignoring hazards generated by the first prev_nop_frag_since
4340          instructions.  */
4341       nops = nops_for_insn_or_target (prev_nop_frag_since, history, ip);
4342       gas_assert (nops <= prev_nop_frag_holds);
4343
4344       /* Enforce NOPS as a minimum.  */
4345       if (nops > prev_nop_frag_required)
4346         prev_nop_frag_required = nops;
4347
4348       if (prev_nop_frag_holds == prev_nop_frag_required)
4349         {
4350           /* Settle for the current number of nops.  Update the history
4351              accordingly (for the benefit of any future .set reorder code).  */
4352           prev_nop_frag = NULL;
4353           insert_into_history (prev_nop_frag_since,
4354                                prev_nop_frag_holds, NOP_INSN);
4355         }
4356       else
4357         {
4358           /* Allow this instruction to replace one of the nops that was
4359              tentatively added to prev_nop_frag.  */
4360           prev_nop_frag->fr_fix -= NOP_INSN_SIZE;
4361           prev_nop_frag_holds--;
4362           prev_nop_frag_since++;
4363         }
4364     }
4365
4366   method = get_append_method (ip, address_expr, reloc_type);
4367   branch_disp = method == APPEND_SWAP ? insn_length (history) : 0;
4368
4369 #ifdef OBJ_ELF
4370   /* The value passed to dwarf2_emit_insn is the distance between
4371      the beginning of the current instruction and the address that
4372      should be recorded in the debug tables.  This is normally the
4373      current address.
4374
4375      For MIPS16/microMIPS debug info we want to use ISA-encoded
4376      addresses, so we use -1 for an address higher by one than the
4377      current one.
4378
4379      If the instruction produced is a branch that we will swap with
4380      the preceding instruction, then we add the displacement by which
4381      the branch will be moved backwards.  This is more appropriate
4382      and for MIPS16/microMIPS code also prevents a debugger from
4383      placing a breakpoint in the middle of the branch (and corrupting
4384      code if software breakpoints are used).  */
4385   dwarf2_emit_insn ((HAVE_CODE_COMPRESSION ? -1 : 0) + branch_disp);
4386 #endif
4387
4388   relax32 = (mips_relax_branch
4389              /* Don't try branch relaxation within .set nomacro, or within
4390                 .set noat if we use $at for PIC computations.  If it turns
4391                 out that the branch was out-of-range, we'll get an error.  */
4392              && !mips_opts.warn_about_macros
4393              && (mips_opts.at || mips_pic == NO_PIC)
4394              /* Don't relax BPOSGE32/64 as they have no complementing
4395                 branches.  */
4396              && !(ip->insn_mo->membership & (INSN_DSP64 | INSN_DSP)));
4397
4398   if (!HAVE_CODE_COMPRESSION
4399       && address_expr
4400       && relax32
4401       && *reloc_type == BFD_RELOC_16_PCREL_S2
4402       && delayed_branch_p (ip))
4403     {
4404       relaxed_branch = TRUE;
4405       add_relaxed_insn (ip, (relaxed_branch_length
4406                              (NULL, NULL,
4407                               uncond_branch_p (ip) ? -1
4408                               : branch_likely_p (ip) ? 1
4409                               : 0)), 4,
4410                         RELAX_BRANCH_ENCODE
4411                         (AT,
4412                          uncond_branch_p (ip),
4413                          branch_likely_p (ip),
4414                          pinfo & INSN_WRITE_GPR_31,
4415                          0),
4416                         address_expr->X_add_symbol,
4417                         address_expr->X_add_number);
4418       *reloc_type = BFD_RELOC_UNUSED;
4419     }
4420   else if (mips_opts.micromips
4421            && address_expr
4422            && ((relax32 && *reloc_type == BFD_RELOC_16_PCREL_S2)
4423                || *reloc_type > BFD_RELOC_UNUSED)
4424            && (delayed_branch_p (ip) || compact_branch_p (ip))
4425            /* Don't try branch relaxation when users specify
4426               16-bit/32-bit instructions.  */
4427            && !forced_insn_length)
4428     {
4429       bfd_boolean relax16 = *reloc_type > BFD_RELOC_UNUSED;
4430       int type = relax16 ? *reloc_type - BFD_RELOC_UNUSED : 0;
4431       int uncond = uncond_branch_p (ip) ? -1 : 0;
4432       int compact = compact_branch_p (ip);
4433       int al = pinfo & INSN_WRITE_GPR_31;
4434       int length32;
4435
4436       gas_assert (address_expr != NULL);
4437       gas_assert (!mips_relax.sequence);
4438
4439       relaxed_branch = TRUE;
4440       length32 = relaxed_micromips_32bit_branch_length (NULL, NULL, uncond);
4441       add_relaxed_insn (ip, relax32 ? length32 : 4, relax16 ? 2 : 4,
4442                         RELAX_MICROMIPS_ENCODE (type, AT, uncond, compact, al,
4443                                                 relax32, 0, 0),
4444                         address_expr->X_add_symbol,
4445                         address_expr->X_add_number);
4446       *reloc_type = BFD_RELOC_UNUSED;
4447     }
4448   else if (mips_opts.mips16 && *reloc_type > BFD_RELOC_UNUSED)
4449     {
4450       /* We need to set up a variant frag.  */
4451       gas_assert (address_expr != NULL);
4452       add_relaxed_insn (ip, 4, 0,
4453                         RELAX_MIPS16_ENCODE
4454                         (*reloc_type - BFD_RELOC_UNUSED,
4455                          forced_insn_length == 2, forced_insn_length == 4,
4456                          delayed_branch_p (&history[0]),
4457                          history[0].mips16_absolute_jump_p),
4458                         make_expr_symbol (address_expr), 0);
4459     }
4460   else if (mips_opts.mips16 && insn_length (ip) == 2)
4461     {
4462       if (!delayed_branch_p (ip))
4463         /* Make sure there is enough room to swap this instruction with
4464            a following jump instruction.  */
4465         frag_grow (6);
4466       add_fixed_insn (ip);
4467     }
4468   else
4469     {
4470       if (mips_opts.mips16
4471           && mips_opts.noreorder
4472           && delayed_branch_p (&history[0]))
4473         as_warn (_("extended instruction in delay slot"));
4474
4475       if (mips_relax.sequence)
4476         {
4477           /* If we've reached the end of this frag, turn it into a variant
4478              frag and record the information for the instructions we've
4479              written so far.  */
4480           if (frag_room () < 4)
4481             relax_close_frag ();
4482           mips_relax.sizes[mips_relax.sequence - 1] += insn_length (ip);
4483         }
4484
4485       if (mips_relax.sequence != 2)
4486         {
4487           if (mips_macro_warning.first_insn_sizes[0] == 0)
4488             mips_macro_warning.first_insn_sizes[0] = insn_length (ip);
4489           mips_macro_warning.sizes[0] += insn_length (ip);
4490           mips_macro_warning.insns[0]++;
4491         }
4492       if (mips_relax.sequence != 1)
4493         {
4494           if (mips_macro_warning.first_insn_sizes[1] == 0)
4495             mips_macro_warning.first_insn_sizes[1] = insn_length (ip);
4496           mips_macro_warning.sizes[1] += insn_length (ip);
4497           mips_macro_warning.insns[1]++;
4498         }
4499
4500       if (mips_opts.mips16)
4501         {
4502           ip->fixed_p = 1;
4503           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
4504         }
4505       add_fixed_insn (ip);
4506     }
4507
4508   if (!ip->complete_p && *reloc_type < BFD_RELOC_UNUSED)
4509     {
4510       bfd_reloc_code_real_type final_type[3];
4511       reloc_howto_type *howto0;
4512       reloc_howto_type *howto;
4513       int i;
4514
4515       /* Perform any necessary conversion to microMIPS relocations
4516          and find out how many relocations there actually are.  */
4517       for (i = 0; i < 3 && reloc_type[i] != BFD_RELOC_UNUSED; i++)
4518         final_type[i] = micromips_map_reloc (reloc_type[i]);
4519
4520       /* In a compound relocation, it is the final (outermost)
4521          operator that determines the relocated field.  */
4522       howto = howto0 = bfd_reloc_type_lookup (stdoutput, final_type[i - 1]);
4523
4524       if (howto == NULL)
4525         {
4526           /* To reproduce this failure try assembling gas/testsuites/
4527              gas/mips/mips16-intermix.s with a mips-ecoff targeted
4528              assembler.  */
4529           as_bad (_("Unsupported MIPS relocation number %d"),
4530                   final_type[i - 1]);
4531           howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
4532         }
4533
4534       if (i > 1)
4535         howto0 = bfd_reloc_type_lookup (stdoutput, final_type[0]);
4536       ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
4537                                  bfd_get_reloc_size (howto),
4538                                  address_expr,
4539                                  howto0 && howto0->pc_relative,
4540                                  final_type[0]);
4541
4542       /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
4543       if (final_type[0] == BFD_RELOC_MIPS16_JMP && ip->fixp[0]->fx_addsy)
4544         *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
4545
4546       /* These relocations can have an addend that won't fit in
4547          4 octets for 64bit assembly.  */
4548       if (HAVE_64BIT_GPRS
4549           && ! howto->partial_inplace
4550           && (reloc_type[0] == BFD_RELOC_16
4551               || reloc_type[0] == BFD_RELOC_32
4552               || reloc_type[0] == BFD_RELOC_MIPS_JMP
4553               || reloc_type[0] == BFD_RELOC_GPREL16
4554               || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
4555               || reloc_type[0] == BFD_RELOC_GPREL32
4556               || reloc_type[0] == BFD_RELOC_64
4557               || reloc_type[0] == BFD_RELOC_CTOR
4558               || reloc_type[0] == BFD_RELOC_MIPS_SUB
4559               || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
4560               || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
4561               || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
4562               || reloc_type[0] == BFD_RELOC_MIPS_REL16
4563               || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
4564               || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
4565               || hi16_reloc_p (reloc_type[0])
4566               || lo16_reloc_p (reloc_type[0])))
4567         ip->fixp[0]->fx_no_overflow = 1;
4568
4569       /* These relocations can have an addend that won't fit in 2 octets.  */
4570       if (reloc_type[0] == BFD_RELOC_MICROMIPS_7_PCREL_S1
4571           || reloc_type[0] == BFD_RELOC_MICROMIPS_10_PCREL_S1)
4572         ip->fixp[0]->fx_no_overflow = 1;
4573
4574       if (mips_relax.sequence)
4575         {
4576           if (mips_relax.first_fixup == 0)
4577             mips_relax.first_fixup = ip->fixp[0];
4578         }
4579       else if (reloc_needs_lo_p (*reloc_type))
4580         {
4581           struct mips_hi_fixup *hi_fixup;
4582
4583           /* Reuse the last entry if it already has a matching %lo.  */
4584           hi_fixup = mips_hi_fixup_list;
4585           if (hi_fixup == 0
4586               || !fixup_has_matching_lo_p (hi_fixup->fixp))
4587             {
4588               hi_fixup = ((struct mips_hi_fixup *)
4589                           xmalloc (sizeof (struct mips_hi_fixup)));
4590               hi_fixup->next = mips_hi_fixup_list;
4591               mips_hi_fixup_list = hi_fixup;
4592             }
4593           hi_fixup->fixp = ip->fixp[0];
4594           hi_fixup->seg = now_seg;
4595         }
4596
4597       /* Add fixups for the second and third relocations, if given.
4598          Note that the ABI allows the second relocation to be
4599          against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
4600          moment we only use RSS_UNDEF, but we could add support
4601          for the others if it ever becomes necessary.  */
4602       for (i = 1; i < 3; i++)
4603         if (reloc_type[i] != BFD_RELOC_UNUSED)
4604           {
4605             ip->fixp[i] = fix_new (ip->frag, ip->where,
4606                                    ip->fixp[0]->fx_size, NULL, 0,
4607                                    FALSE, final_type[i]);
4608
4609             /* Use fx_tcbit to mark compound relocs.  */
4610             ip->fixp[0]->fx_tcbit = 1;
4611             ip->fixp[i]->fx_tcbit = 1;
4612           }
4613     }
4614   install_insn (ip);
4615
4616   /* Update the register mask information.  */
4617   mips_gprmask |= gpr_read_mask (ip) | gpr_write_mask (ip);
4618   mips_cprmask[1] |= fpr_read_mask (ip) | fpr_write_mask (ip);
4619
4620   switch (method)
4621     {
4622     case APPEND_ADD:
4623       insert_into_history (0, 1, ip);
4624       break;
4625
4626     case APPEND_ADD_WITH_NOP:
4627       {
4628         struct mips_cl_insn *nop;
4629
4630         insert_into_history (0, 1, ip);
4631         nop = get_delay_slot_nop (ip);
4632         add_fixed_insn (nop);
4633         insert_into_history (0, 1, nop);
4634         if (mips_relax.sequence)
4635           mips_relax.sizes[mips_relax.sequence - 1] += insn_length (nop);
4636       }
4637       break;
4638
4639     case APPEND_ADD_COMPACT:
4640       /* Convert MIPS16 jr/jalr into a "compact" jump.  */
4641       gas_assert (mips_opts.mips16);
4642       ip->insn_opcode |= 0x0080;
4643       find_altered_mips16_opcode (ip);
4644       install_insn (ip);
4645       insert_into_history (0, 1, ip);
4646       break;
4647
4648     case APPEND_SWAP:
4649       {
4650         struct mips_cl_insn delay = history[0];
4651         if (mips_opts.mips16)
4652           {
4653             know (delay.frag == ip->frag);
4654             move_insn (ip, delay.frag, delay.where);
4655             move_insn (&delay, ip->frag, ip->where + insn_length (ip));
4656           }
4657         else if (relaxed_branch || delay.frag != ip->frag)
4658           {
4659             /* Add the delay slot instruction to the end of the
4660                current frag and shrink the fixed part of the
4661                original frag.  If the branch occupies the tail of
4662                the latter, move it backwards to cover the gap.  */
4663             delay.frag->fr_fix -= branch_disp;
4664             if (delay.frag == ip->frag)
4665               move_insn (ip, ip->frag, ip->where - branch_disp);
4666             add_fixed_insn (&delay);
4667           }
4668         else
4669           {
4670             move_insn (&delay, ip->frag,
4671                        ip->where - branch_disp + insn_length (ip));
4672             move_insn (ip, history[0].frag, history[0].where);
4673           }
4674         history[0] = *ip;
4675         delay.fixed_p = 1;
4676         insert_into_history (0, 1, &delay);
4677       }
4678       break;
4679     }
4680
4681   /* If we have just completed an unconditional branch, clear the history.  */
4682   if ((delayed_branch_p (&history[1]) && uncond_branch_p (&history[1]))
4683       || (compact_branch_p (&history[0]) && uncond_branch_p (&history[0])))
4684     {
4685       unsigned int i;
4686
4687       mips_no_prev_insn ();
4688
4689       for (i = 0; i < ARRAY_SIZE (history); i++)
4690         history[i].cleared_p = 1;
4691     }
4692
4693   /* We need to emit a label at the end of branch-likely macros.  */
4694   if (emit_branch_likely_macro)
4695     {
4696       emit_branch_likely_macro = FALSE;
4697       micromips_add_label ();
4698     }
4699
4700   /* We just output an insn, so the next one doesn't have a label.  */
4701   mips_clear_insn_labels ();
4702 }
4703
4704 /* Forget that there was any previous instruction or label.
4705    When BRANCH is true, the branch history is also flushed.  */
4706
4707 static void
4708 mips_no_prev_insn (void)
4709 {
4710   prev_nop_frag = NULL;
4711   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
4712   mips_clear_insn_labels ();
4713 }
4714
4715 /* This function must be called before we emit something other than
4716    instructions.  It is like mips_no_prev_insn except that it inserts
4717    any NOPS that might be needed by previous instructions.  */
4718
4719 void
4720 mips_emit_delays (void)
4721 {
4722   if (! mips_opts.noreorder)
4723     {
4724       int nops = nops_for_insn (0, history, NULL);
4725       if (nops > 0)
4726         {
4727           while (nops-- > 0)
4728             add_fixed_insn (NOP_INSN);
4729           mips_move_text_labels ();
4730         }
4731     }
4732   mips_no_prev_insn ();
4733 }
4734
4735 /* Start a (possibly nested) noreorder block.  */
4736
4737 static void
4738 start_noreorder (void)
4739 {
4740   if (mips_opts.noreorder == 0)
4741     {
4742       unsigned int i;
4743       int nops;
4744
4745       /* None of the instructions before the .set noreorder can be moved.  */
4746       for (i = 0; i < ARRAY_SIZE (history); i++)
4747         history[i].fixed_p = 1;
4748
4749       /* Insert any nops that might be needed between the .set noreorder
4750          block and the previous instructions.  We will later remove any
4751          nops that turn out not to be needed.  */
4752       nops = nops_for_insn (0, history, NULL);
4753       if (nops > 0)
4754         {
4755           if (mips_optimize != 0)
4756             {
4757               /* Record the frag which holds the nop instructions, so
4758                  that we can remove them if we don't need them.  */
4759               frag_grow (nops * NOP_INSN_SIZE);
4760               prev_nop_frag = frag_now;
4761               prev_nop_frag_holds = nops;
4762               prev_nop_frag_required = 0;
4763               prev_nop_frag_since = 0;
4764             }
4765
4766           for (; nops > 0; --nops)
4767             add_fixed_insn (NOP_INSN);
4768
4769           /* Move on to a new frag, so that it is safe to simply
4770              decrease the size of prev_nop_frag.  */
4771           frag_wane (frag_now);
4772           frag_new (0);
4773           mips_move_text_labels ();
4774         }
4775       mips_mark_labels ();
4776       mips_clear_insn_labels ();
4777     }
4778   mips_opts.noreorder++;
4779   mips_any_noreorder = 1;
4780 }
4781
4782 /* End a nested noreorder block.  */
4783
4784 static void
4785 end_noreorder (void)
4786 {
4787   mips_opts.noreorder--;
4788   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
4789     {
4790       /* Commit to inserting prev_nop_frag_required nops and go back to
4791          handling nop insertion the .set reorder way.  */
4792       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
4793                                 * NOP_INSN_SIZE);
4794       insert_into_history (prev_nop_frag_since,
4795                            prev_nop_frag_required, NOP_INSN);
4796       prev_nop_frag = NULL;
4797     }
4798 }
4799
4800 /* Set up global variables for the start of a new macro.  */
4801
4802 static void
4803 macro_start (void)
4804 {
4805   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
4806   memset (&mips_macro_warning.first_insn_sizes, 0,
4807           sizeof (mips_macro_warning.first_insn_sizes));
4808   memset (&mips_macro_warning.insns, 0, sizeof (mips_macro_warning.insns));
4809   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
4810                                      && delayed_branch_p (&history[0]));
4811   switch (history[0].insn_mo->pinfo2
4812           & (INSN2_BRANCH_DELAY_32BIT | INSN2_BRANCH_DELAY_16BIT))
4813     {
4814     case INSN2_BRANCH_DELAY_32BIT:
4815       mips_macro_warning.delay_slot_length = 4;
4816       break;
4817     case INSN2_BRANCH_DELAY_16BIT:
4818       mips_macro_warning.delay_slot_length = 2;
4819       break;
4820     default:
4821       mips_macro_warning.delay_slot_length = 0;
4822       break;
4823     }
4824   mips_macro_warning.first_frag = NULL;
4825 }
4826
4827 /* Given that a macro is longer than one instruction or of the wrong size,
4828    return the appropriate warning for it.  Return null if no warning is
4829    needed.  SUBTYPE is a bitmask of RELAX_DELAY_SLOT, RELAX_DELAY_SLOT_16BIT,
4830    RELAX_DELAY_SLOT_SIZE_FIRST, RELAX_DELAY_SLOT_SIZE_SECOND,
4831    and RELAX_NOMACRO.  */
4832
4833 static const char *
4834 macro_warning (relax_substateT subtype)
4835 {
4836   if (subtype & RELAX_DELAY_SLOT)
4837     return _("Macro instruction expanded into multiple instructions"
4838              " in a branch delay slot");
4839   else if (subtype & RELAX_NOMACRO)
4840     return _("Macro instruction expanded into multiple instructions");
4841   else if (subtype & (RELAX_DELAY_SLOT_SIZE_FIRST
4842                       | RELAX_DELAY_SLOT_SIZE_SECOND))
4843     return ((subtype & RELAX_DELAY_SLOT_16BIT)
4844             ? _("Macro instruction expanded into a wrong size instruction"
4845                 " in a 16-bit branch delay slot")
4846             : _("Macro instruction expanded into a wrong size instruction"
4847                 " in a 32-bit branch delay slot"));
4848   else
4849     return 0;
4850 }
4851
4852 /* Finish up a macro.  Emit warnings as appropriate.  */
4853
4854 static void
4855 macro_end (void)
4856 {
4857   /* Relaxation warning flags.  */
4858   relax_substateT subtype = 0;
4859
4860   /* Check delay slot size requirements.  */
4861   if (mips_macro_warning.delay_slot_length == 2)
4862     subtype |= RELAX_DELAY_SLOT_16BIT;
4863   if (mips_macro_warning.delay_slot_length != 0)
4864     {
4865       if (mips_macro_warning.delay_slot_length
4866           != mips_macro_warning.first_insn_sizes[0])
4867         subtype |= RELAX_DELAY_SLOT_SIZE_FIRST;
4868       if (mips_macro_warning.delay_slot_length
4869           != mips_macro_warning.first_insn_sizes[1])
4870         subtype |= RELAX_DELAY_SLOT_SIZE_SECOND;
4871     }
4872
4873   /* Check instruction count requirements.  */
4874   if (mips_macro_warning.insns[0] > 1 || mips_macro_warning.insns[1] > 1)
4875     {
4876       if (mips_macro_warning.insns[1] > mips_macro_warning.insns[0])
4877         subtype |= RELAX_SECOND_LONGER;
4878       if (mips_opts.warn_about_macros)
4879         subtype |= RELAX_NOMACRO;
4880       if (mips_macro_warning.delay_slot_p)
4881         subtype |= RELAX_DELAY_SLOT;
4882     }
4883
4884   /* If both alternatives fail to fill a delay slot correctly,
4885      emit the warning now.  */
4886   if ((subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0
4887       && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0)
4888     {
4889       relax_substateT s;
4890       const char *msg;
4891
4892       s = subtype & (RELAX_DELAY_SLOT_16BIT
4893                      | RELAX_DELAY_SLOT_SIZE_FIRST
4894                      | RELAX_DELAY_SLOT_SIZE_SECOND);
4895       msg = macro_warning (s);
4896       if (msg != NULL)
4897         as_warn ("%s", msg);
4898       subtype &= ~s;
4899     }
4900
4901   /* If both implementations are longer than 1 instruction, then emit the
4902      warning now.  */
4903   if (mips_macro_warning.insns[0] > 1 && mips_macro_warning.insns[1] > 1)
4904     {
4905       relax_substateT s;
4906       const char *msg;
4907
4908       s = subtype & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT);
4909       msg = macro_warning (s);
4910       if (msg != NULL)
4911         as_warn ("%s", msg);
4912       subtype &= ~s;
4913     }
4914
4915   /* If any flags still set, then one implementation might need a warning
4916      and the other either will need one of a different kind or none at all.
4917      Pass any remaining flags over to relaxation.  */
4918   if (mips_macro_warning.first_frag != NULL)
4919     mips_macro_warning.first_frag->fr_subtype |= subtype;
4920 }
4921
4922 /* Instruction operand formats used in macros that vary between
4923    standard MIPS and microMIPS code.  */
4924
4925 static const char * const brk_fmt[2] = { "c", "mF" };
4926 static const char * const cop12_fmt[2] = { "E,o(b)", "E,~(b)" };
4927 static const char * const jalr_fmt[2] = { "d,s", "t,s" };
4928 static const char * const lui_fmt[2] = { "t,u", "s,u" };
4929 static const char * const mem12_fmt[2] = { "t,o(b)", "t,~(b)" };
4930 static const char * const mfhl_fmt[2] = { "d", "mj" };
4931 static const char * const shft_fmt[2] = { "d,w,<", "t,r,<" };
4932 static const char * const trap_fmt[2] = { "s,t,q", "s,t,|" };
4933
4934 #define BRK_FMT (brk_fmt[mips_opts.micromips])
4935 #define COP12_FMT (cop12_fmt[mips_opts.micromips])
4936 #define JALR_FMT (jalr_fmt[mips_opts.micromips])
4937 #define LUI_FMT (lui_fmt[mips_opts.micromips])
4938 #define MEM12_FMT (mem12_fmt[mips_opts.micromips])
4939 #define MFHL_FMT (mfhl_fmt[mips_opts.micromips])
4940 #define SHFT_FMT (shft_fmt[mips_opts.micromips])
4941 #define TRAP_FMT (trap_fmt[mips_opts.micromips])
4942
4943 /* Read a macro's relocation codes from *ARGS and store them in *R.
4944    The first argument in *ARGS will be either the code for a single
4945    relocation or -1 followed by the three codes that make up a
4946    composite relocation.  */
4947
4948 static void
4949 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
4950 {
4951   int i, next;
4952
4953   next = va_arg (*args, int);
4954   if (next >= 0)
4955     r[0] = (bfd_reloc_code_real_type) next;
4956   else
4957     for (i = 0; i < 3; i++)
4958       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
4959 }
4960
4961 /* Build an instruction created by a macro expansion.  This is passed
4962    a pointer to the count of instructions created so far, an
4963    expression, the name of the instruction to build, an operand format
4964    string, and corresponding arguments.  */
4965
4966 static void
4967 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
4968 {
4969   const struct mips_opcode *mo = NULL;
4970   bfd_reloc_code_real_type r[3];
4971   const struct mips_opcode *amo;
4972   struct hash_control *hash;
4973   struct mips_cl_insn insn;
4974   va_list args;
4975
4976   va_start (args, fmt);
4977
4978   if (mips_opts.mips16)
4979     {
4980       mips16_macro_build (ep, name, fmt, &args);
4981       va_end (args);
4982       return;
4983     }
4984
4985   r[0] = BFD_RELOC_UNUSED;
4986   r[1] = BFD_RELOC_UNUSED;
4987   r[2] = BFD_RELOC_UNUSED;
4988   hash = mips_opts.micromips ? micromips_op_hash : op_hash;
4989   amo = (struct mips_opcode *) hash_find (hash, name);
4990   gas_assert (amo);
4991   gas_assert (strcmp (name, amo->name) == 0);
4992
4993   do
4994     {
4995       /* Search until we get a match for NAME.  It is assumed here that
4996          macros will never generate MDMX, MIPS-3D, or MT instructions.
4997          We try to match an instruction that fulfils the branch delay
4998          slot instruction length requirement (if any) of the previous
4999          instruction.  While doing this we record the first instruction
5000          seen that matches all the other conditions and use it anyway
5001          if the requirement cannot be met; we will issue an appropriate
5002          warning later on.  */
5003       if (strcmp (fmt, amo->args) == 0
5004           && amo->pinfo != INSN_MACRO
5005           && is_opcode_valid (amo)
5006           && is_size_valid (amo))
5007         {
5008           if (is_delay_slot_valid (amo))
5009             {
5010               mo = amo;
5011               break;
5012             }
5013           else if (!mo)
5014             mo = amo;
5015         }
5016
5017       ++amo;
5018       gas_assert (amo->name);
5019     }
5020   while (strcmp (name, amo->name) == 0);
5021
5022   gas_assert (mo);
5023   create_insn (&insn, mo);
5024   for (;;)
5025     {
5026       switch (*fmt++)
5027         {
5028         case '\0':
5029           break;
5030
5031         case ',':
5032         case '(':
5033         case ')':
5034           continue;
5035
5036         case '+':
5037           switch (*fmt++)
5038             {
5039             case 'A':
5040             case 'E':
5041               INSERT_OPERAND (mips_opts.micromips,
5042                               EXTLSB, insn, va_arg (args, int));
5043               continue;
5044
5045             case 'B':
5046             case 'F':
5047               /* Note that in the macro case, these arguments are already
5048                  in MSB form.  (When handling the instruction in the
5049                  non-macro case, these arguments are sizes from which
5050                  MSB values must be calculated.)  */
5051               INSERT_OPERAND (mips_opts.micromips,
5052                               INSMSB, insn, va_arg (args, int));
5053               continue;
5054
5055             case 'J':
5056               gas_assert (!mips_opts.micromips);
5057               INSERT_OPERAND (0, CODE10, insn, va_arg (args, int));
5058               continue;
5059
5060             case 'C':
5061             case 'G':
5062             case 'H':
5063               /* Note that in the macro case, these arguments are already
5064                  in MSBD form.  (When handling the instruction in the
5065                  non-macro case, these arguments are sizes from which
5066                  MSBD values must be calculated.)  */
5067               INSERT_OPERAND (mips_opts.micromips,
5068                               EXTMSBD, insn, va_arg (args, int));
5069               continue;
5070
5071             case 'Q':
5072               gas_assert (!mips_opts.micromips);
5073               INSERT_OPERAND (0, SEQI, insn, va_arg (args, int));
5074               continue;
5075
5076             default:
5077               abort ();
5078             }
5079           continue;
5080
5081         case '2':
5082           INSERT_OPERAND (mips_opts.micromips, BP, insn, va_arg (args, int));
5083           continue;
5084
5085         case 'n':
5086           gas_assert (mips_opts.micromips);
5087         case 't':
5088         case 'w':
5089         case 'E':
5090           INSERT_OPERAND (mips_opts.micromips, RT, insn, va_arg (args, int));
5091           continue;
5092
5093         case 'c':
5094           gas_assert (!mips_opts.micromips);
5095           INSERT_OPERAND (0, CODE, insn, va_arg (args, int));
5096           continue;
5097
5098         case 'W':
5099           gas_assert (!mips_opts.micromips);
5100         case 'T':
5101           INSERT_OPERAND (mips_opts.micromips, FT, insn, va_arg (args, int));
5102           continue;
5103
5104         case 'G':
5105           if (mips_opts.micromips)
5106             INSERT_OPERAND (1, RS, insn, va_arg (args, int));
5107           else
5108             INSERT_OPERAND (0, RD, insn, va_arg (args, int));
5109           continue;
5110
5111         case 'K':
5112           gas_assert (!mips_opts.micromips);
5113         case 'd':
5114           INSERT_OPERAND (mips_opts.micromips, RD, insn, va_arg (args, int));
5115           continue;
5116
5117         case 'U':
5118           gas_assert (!mips_opts.micromips);
5119           {
5120             int tmp = va_arg (args, int);
5121
5122             INSERT_OPERAND (0, RT, insn, tmp);
5123             INSERT_OPERAND (0, RD, insn, tmp);
5124           }
5125           continue;
5126
5127         case 'V':
5128         case 'S':
5129           gas_assert (!mips_opts.micromips);
5130           INSERT_OPERAND (0, FS, insn, va_arg (args, int));
5131           continue;
5132
5133         case 'z':
5134           continue;
5135
5136         case '<':
5137           INSERT_OPERAND (mips_opts.micromips,
5138                           SHAMT, insn, va_arg (args, int));
5139           continue;
5140
5141         case 'D':
5142           gas_assert (!mips_opts.micromips);
5143           INSERT_OPERAND (0, FD, insn, va_arg (args, int));
5144           continue;
5145
5146         case 'B':
5147           gas_assert (!mips_opts.micromips);
5148           INSERT_OPERAND (0, CODE20, insn, va_arg (args, int));
5149           continue;
5150
5151         case 'J':
5152           gas_assert (!mips_opts.micromips);
5153           INSERT_OPERAND (0, CODE19, insn, va_arg (args, int));
5154           continue;
5155
5156         case 'q':
5157           gas_assert (!mips_opts.micromips);
5158           INSERT_OPERAND (0, CODE2, insn, va_arg (args, int));
5159           continue;
5160
5161         case 'b':
5162         case 's':
5163         case 'r':
5164         case 'v':
5165           INSERT_OPERAND (mips_opts.micromips, RS, insn, va_arg (args, int));
5166           continue;
5167
5168         case 'i':
5169         case 'j':
5170           macro_read_relocs (&args, r);
5171           gas_assert (*r == BFD_RELOC_GPREL16
5172                       || *r == BFD_RELOC_MIPS_HIGHER
5173                       || *r == BFD_RELOC_HI16_S
5174                       || *r == BFD_RELOC_LO16
5175                       || *r == BFD_RELOC_MIPS_GOT_OFST);
5176           continue;
5177
5178         case 'o':
5179           macro_read_relocs (&args, r);
5180           continue;
5181
5182         case 'u':
5183           macro_read_relocs (&args, r);
5184           gas_assert (ep != NULL
5185                       && (ep->X_op == O_constant
5186                           || (ep->X_op == O_symbol
5187                               && (*r == BFD_RELOC_MIPS_HIGHEST
5188                                   || *r == BFD_RELOC_HI16_S
5189                                   || *r == BFD_RELOC_HI16
5190                                   || *r == BFD_RELOC_GPREL16
5191                                   || *r == BFD_RELOC_MIPS_GOT_HI16
5192                                   || *r == BFD_RELOC_MIPS_CALL_HI16))));
5193           continue;
5194
5195         case 'p':
5196           gas_assert (ep != NULL);
5197
5198           /*
5199            * This allows macro() to pass an immediate expression for
5200            * creating short branches without creating a symbol.
5201            *
5202            * We don't allow branch relaxation for these branches, as
5203            * they should only appear in ".set nomacro" anyway.
5204            */
5205           if (ep->X_op == O_constant)
5206             {
5207               /* For microMIPS we always use relocations for branches.
5208                  So we should not resolve immediate values.  */
5209               gas_assert (!mips_opts.micromips);
5210
5211               if ((ep->X_add_number & 3) != 0)
5212                 as_bad (_("branch to misaligned address (0x%lx)"),
5213                         (unsigned long) ep->X_add_number);
5214               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
5215                 as_bad (_("branch address range overflow (0x%lx)"),
5216                         (unsigned long) ep->X_add_number);
5217               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
5218               ep = NULL;
5219             }
5220           else
5221             *r = BFD_RELOC_16_PCREL_S2;
5222           continue;
5223
5224         case 'a':
5225           gas_assert (ep != NULL);
5226           *r = BFD_RELOC_MIPS_JMP;
5227           continue;
5228
5229         case 'C':
5230           gas_assert (!mips_opts.micromips);
5231           INSERT_OPERAND (0, COPZ, insn, va_arg (args, unsigned long));
5232           continue;
5233
5234         case 'k':
5235           INSERT_OPERAND (mips_opts.micromips,
5236                           CACHE, insn, va_arg (args, unsigned long));
5237           continue;
5238
5239         case '|':
5240           gas_assert (mips_opts.micromips);
5241           INSERT_OPERAND (1, TRAP, insn, va_arg (args, int));
5242           continue;
5243
5244         case '.':
5245           gas_assert (mips_opts.micromips);
5246           INSERT_OPERAND (1, OFFSET10, insn, va_arg (args, int));
5247           continue;
5248
5249         case '\\':
5250           INSERT_OPERAND (mips_opts.micromips,
5251                           3BITPOS, insn, va_arg (args, unsigned int));
5252           continue;
5253
5254         case '~':
5255           INSERT_OPERAND (mips_opts.micromips,
5256                           OFFSET12, insn, va_arg (args, unsigned long));
5257           continue;
5258
5259         case 'N':
5260           gas_assert (mips_opts.micromips);
5261           INSERT_OPERAND (1, BCC, insn, va_arg (args, int));
5262           continue;
5263
5264         case 'm':       /* Opcode extension character.  */
5265           gas_assert (mips_opts.micromips);
5266           switch (*fmt++)
5267             {
5268             case 'j':
5269               INSERT_OPERAND (1, MJ, insn, va_arg (args, int));
5270               break;
5271
5272             case 'p':
5273               INSERT_OPERAND (1, MP, insn, va_arg (args, int));
5274               break;
5275
5276             case 'F':
5277               INSERT_OPERAND (1, IMMF, insn, va_arg (args, int));
5278               break;
5279
5280             default:
5281               abort ();
5282             }
5283           continue;
5284
5285         default:
5286           abort ();
5287         }
5288       break;
5289     }
5290   va_end (args);
5291   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5292
5293   append_insn (&insn, ep, r, TRUE);
5294 }
5295
5296 static void
5297 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
5298                     va_list *args)
5299 {
5300   struct mips_opcode *mo;
5301   struct mips_cl_insn insn;
5302   bfd_reloc_code_real_type r[3]
5303     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
5304
5305   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
5306   gas_assert (mo);
5307   gas_assert (strcmp (name, mo->name) == 0);
5308
5309   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
5310     {
5311       ++mo;
5312       gas_assert (mo->name);
5313       gas_assert (strcmp (name, mo->name) == 0);
5314     }
5315
5316   create_insn (&insn, mo);
5317   for (;;)
5318     {
5319       int c;
5320
5321       c = *fmt++;
5322       switch (c)
5323         {
5324         case '\0':
5325           break;
5326
5327         case ',':
5328         case '(':
5329         case ')':
5330           continue;
5331
5332         case 'y':
5333         case 'w':
5334           MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
5335           continue;
5336
5337         case 'x':
5338         case 'v':
5339           MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
5340           continue;
5341
5342         case 'z':
5343           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
5344           continue;
5345
5346         case 'Z':
5347           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
5348           continue;
5349
5350         case '0':
5351         case 'S':
5352         case 'P':
5353         case 'R':
5354           continue;
5355
5356         case 'X':
5357           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
5358           continue;
5359
5360         case 'Y':
5361           {
5362             int regno;
5363
5364             regno = va_arg (*args, int);
5365             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
5366             MIPS16_INSERT_OPERAND (REG32R, insn, regno);
5367           }
5368           continue;
5369
5370         case '<':
5371         case '>':
5372         case '4':
5373         case '5':
5374         case 'H':
5375         case 'W':
5376         case 'D':
5377         case 'j':
5378         case '8':
5379         case 'V':
5380         case 'C':
5381         case 'U':
5382         case 'k':
5383         case 'K':
5384         case 'p':
5385         case 'q':
5386           {
5387             offsetT value;
5388
5389             gas_assert (ep != NULL);
5390
5391             if (ep->X_op != O_constant)
5392               *r = (int) BFD_RELOC_UNUSED + c;
5393             else if (calculate_reloc (*r, ep->X_add_number, &value))
5394               {
5395                 mips16_immed (NULL, 0, c, *r, value, 0, &insn.insn_opcode);
5396                 ep = NULL;
5397                 *r = BFD_RELOC_UNUSED;
5398               }
5399           }
5400           continue;
5401
5402         case '6':
5403           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
5404           continue;
5405         }
5406
5407       break;
5408     }
5409
5410   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5411
5412   append_insn (&insn, ep, r, TRUE);
5413 }
5414
5415 /*
5416  * Sign-extend 32-bit mode constants that have bit 31 set and all
5417  * higher bits unset.
5418  */
5419 static void
5420 normalize_constant_expr (expressionS *ex)
5421 {
5422   if (ex->X_op == O_constant
5423       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5424     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5425                         - 0x80000000);
5426 }
5427
5428 /*
5429  * Sign-extend 32-bit mode address offsets that have bit 31 set and
5430  * all higher bits unset.
5431  */
5432 static void
5433 normalize_address_expr (expressionS *ex)
5434 {
5435   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
5436         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
5437       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5438     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5439                         - 0x80000000);
5440 }
5441
5442 /*
5443  * Generate a "jalr" instruction with a relocation hint to the called
5444  * function.  This occurs in NewABI PIC code.
5445  */
5446 static void
5447 macro_build_jalr (expressionS *ep, int cprestore)
5448 {
5449   static const bfd_reloc_code_real_type jalr_relocs[2]
5450     = { BFD_RELOC_MIPS_JALR, BFD_RELOC_MICROMIPS_JALR };
5451   bfd_reloc_code_real_type jalr_reloc = jalr_relocs[mips_opts.micromips];
5452   const char *jalr;
5453   char *f = NULL;
5454
5455   if (MIPS_JALR_HINT_P (ep))
5456     {
5457       frag_grow (8);
5458       f = frag_more (0);
5459     }
5460   if (mips_opts.micromips)
5461     {
5462       jalr = mips_opts.noreorder && !cprestore ? "jalr" : "jalrs";
5463       if (MIPS_JALR_HINT_P (ep)
5464           || (history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
5465         macro_build (NULL, jalr, "t,s", RA, PIC_CALL_REG);
5466       else
5467         macro_build (NULL, jalr, "mj", PIC_CALL_REG);
5468     }
5469   else
5470     macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
5471   if (MIPS_JALR_HINT_P (ep))
5472     fix_new_exp (frag_now, f - frag_now->fr_literal, 4, ep, FALSE, jalr_reloc);
5473 }
5474
5475 /*
5476  * Generate a "lui" instruction.
5477  */
5478 static void
5479 macro_build_lui (expressionS *ep, int regnum)
5480 {
5481   gas_assert (! mips_opts.mips16);
5482
5483   if (ep->X_op != O_constant)
5484     {
5485       gas_assert (ep->X_op == O_symbol);
5486       /* _gp_disp is a special case, used from s_cpload.
5487          __gnu_local_gp is used if mips_no_shared.  */
5488       gas_assert (mips_pic == NO_PIC
5489               || (! HAVE_NEWABI
5490                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
5491               || (! mips_in_shared
5492                   && strcmp (S_GET_NAME (ep->X_add_symbol),
5493                              "__gnu_local_gp") == 0));
5494     }
5495
5496   macro_build (ep, "lui", LUI_FMT, regnum, BFD_RELOC_HI16_S);
5497 }
5498
5499 /* Generate a sequence of instructions to do a load or store from a constant
5500    offset off of a base register (breg) into/from a target register (treg),
5501    using AT if necessary.  */
5502 static void
5503 macro_build_ldst_constoffset (expressionS *ep, const char *op,
5504                               int treg, int breg, int dbl)
5505 {
5506   gas_assert (ep->X_op == O_constant);
5507
5508   /* Sign-extending 32-bit constants makes their handling easier.  */
5509   if (!dbl)
5510     normalize_constant_expr (ep);
5511
5512   /* Right now, this routine can only handle signed 32-bit constants.  */
5513   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
5514     as_warn (_("operand overflow"));
5515
5516   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
5517     {
5518       /* Signed 16-bit offset will fit in the op.  Easy!  */
5519       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
5520     }
5521   else
5522     {
5523       /* 32-bit offset, need multiple instructions and AT, like:
5524            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
5525            addu     $tempreg,$tempreg,$breg
5526            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
5527          to handle the complete offset.  */
5528       macro_build_lui (ep, AT);
5529       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
5530       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
5531
5532       if (!mips_opts.at)
5533         as_bad (_("Macro used $at after \".set noat\""));
5534     }
5535 }
5536
5537 /*                      set_at()
5538  * Generates code to set the $at register to true (one)
5539  * if reg is less than the immediate expression.
5540  */
5541 static void
5542 set_at (int reg, int unsignedp)
5543 {
5544   if (imm_expr.X_op == O_constant
5545       && imm_expr.X_add_number >= -0x8000
5546       && imm_expr.X_add_number < 0x8000)
5547     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
5548                  AT, reg, BFD_RELOC_LO16);
5549   else
5550     {
5551       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5552       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
5553     }
5554 }
5555
5556 /* Warn if an expression is not a constant.  */
5557
5558 static void
5559 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
5560 {
5561   if (ex->X_op == O_big)
5562     as_bad (_("unsupported large constant"));
5563   else if (ex->X_op != O_constant)
5564     as_bad (_("Instruction %s requires absolute expression"),
5565             ip->insn_mo->name);
5566
5567   if (HAVE_32BIT_GPRS)
5568     normalize_constant_expr (ex);
5569 }
5570
5571 /* Count the leading zeroes by performing a binary chop. This is a
5572    bulky bit of source, but performance is a LOT better for the
5573    majority of values than a simple loop to count the bits:
5574        for (lcnt = 0; (lcnt < 32); lcnt++)
5575          if ((v) & (1 << (31 - lcnt)))
5576            break;
5577   However it is not code size friendly, and the gain will drop a bit
5578   on certain cached systems.
5579 */
5580 #define COUNT_TOP_ZEROES(v)             \
5581   (((v) & ~0xffff) == 0                 \
5582    ? ((v) & ~0xff) == 0                 \
5583      ? ((v) & ~0xf) == 0                \
5584        ? ((v) & ~0x3) == 0              \
5585          ? ((v) & ~0x1) == 0            \
5586            ? !(v)                       \
5587              ? 32                       \
5588              : 31                       \
5589            : 30                         \
5590          : ((v) & ~0x7) == 0            \
5591            ? 29                         \
5592            : 28                         \
5593        : ((v) & ~0x3f) == 0             \
5594          ? ((v) & ~0x1f) == 0           \
5595            ? 27                         \
5596            : 26                         \
5597          : ((v) & ~0x7f) == 0           \
5598            ? 25                         \
5599            : 24                         \
5600      : ((v) & ~0xfff) == 0              \
5601        ? ((v) & ~0x3ff) == 0            \
5602          ? ((v) & ~0x1ff) == 0          \
5603            ? 23                         \
5604            : 22                         \
5605          : ((v) & ~0x7ff) == 0          \
5606            ? 21                         \
5607            : 20                         \
5608        : ((v) & ~0x3fff) == 0           \
5609          ? ((v) & ~0x1fff) == 0         \
5610            ? 19                         \
5611            : 18                         \
5612          : ((v) & ~0x7fff) == 0         \
5613            ? 17                         \
5614            : 16                         \
5615    : ((v) & ~0xffffff) == 0             \
5616      ? ((v) & ~0xfffff) == 0            \
5617        ? ((v) & ~0x3ffff) == 0          \
5618          ? ((v) & ~0x1ffff) == 0        \
5619            ? 15                         \
5620            : 14                         \
5621          : ((v) & ~0x7ffff) == 0        \
5622            ? 13                         \
5623            : 12                         \
5624        : ((v) & ~0x3fffff) == 0         \
5625          ? ((v) & ~0x1fffff) == 0       \
5626            ? 11                         \
5627            : 10                         \
5628          : ((v) & ~0x7fffff) == 0       \
5629            ? 9                          \
5630            : 8                          \
5631      : ((v) & ~0xfffffff) == 0          \
5632        ? ((v) & ~0x3ffffff) == 0        \
5633          ? ((v) & ~0x1ffffff) == 0      \
5634            ? 7                          \
5635            : 6                          \
5636          : ((v) & ~0x7ffffff) == 0      \
5637            ? 5                          \
5638            : 4                          \
5639        : ((v) & ~0x3fffffff) == 0       \
5640          ? ((v) & ~0x1fffffff) == 0     \
5641            ? 3                          \
5642            : 2                          \
5643          : ((v) & ~0x7fffffff) == 0     \
5644            ? 1                          \
5645            : 0)
5646
5647 /*                      load_register()
5648  *  This routine generates the least number of instructions necessary to load
5649  *  an absolute expression value into a register.
5650  */
5651 static void
5652 load_register (int reg, expressionS *ep, int dbl)
5653 {
5654   int freg;
5655   expressionS hi32, lo32;
5656
5657   if (ep->X_op != O_big)
5658     {
5659       gas_assert (ep->X_op == O_constant);
5660
5661       /* Sign-extending 32-bit constants makes their handling easier.  */
5662       if (!dbl)
5663         normalize_constant_expr (ep);
5664
5665       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
5666         {
5667           /* We can handle 16 bit signed values with an addiu to
5668              $zero.  No need to ever use daddiu here, since $zero and
5669              the result are always correct in 32 bit mode.  */
5670           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5671           return;
5672         }
5673       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
5674         {
5675           /* We can handle 16 bit unsigned values with an ori to
5676              $zero.  */
5677           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
5678           return;
5679         }
5680       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
5681         {
5682           /* 32 bit values require an lui.  */
5683           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5684           if ((ep->X_add_number & 0xffff) != 0)
5685             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
5686           return;
5687         }
5688     }
5689
5690   /* The value is larger than 32 bits.  */
5691
5692   if (!dbl || HAVE_32BIT_GPRS)
5693     {
5694       char value[32];
5695
5696       sprintf_vma (value, ep->X_add_number);
5697       as_bad (_("Number (0x%s) larger than 32 bits"), value);
5698       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5699       return;
5700     }
5701
5702   if (ep->X_op != O_big)
5703     {
5704       hi32 = *ep;
5705       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
5706       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
5707       hi32.X_add_number &= 0xffffffff;
5708       lo32 = *ep;
5709       lo32.X_add_number &= 0xffffffff;
5710     }
5711   else
5712     {
5713       gas_assert (ep->X_add_number > 2);
5714       if (ep->X_add_number == 3)
5715         generic_bignum[3] = 0;
5716       else if (ep->X_add_number > 4)
5717         as_bad (_("Number larger than 64 bits"));
5718       lo32.X_op = O_constant;
5719       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
5720       hi32.X_op = O_constant;
5721       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
5722     }
5723
5724   if (hi32.X_add_number == 0)
5725     freg = 0;
5726   else
5727     {
5728       int shift, bit;
5729       unsigned long hi, lo;
5730
5731       if (hi32.X_add_number == (offsetT) 0xffffffff)
5732         {
5733           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
5734             {
5735               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5736               return;
5737             }
5738           if (lo32.X_add_number & 0x80000000)
5739             {
5740               macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5741               if (lo32.X_add_number & 0xffff)
5742                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
5743               return;
5744             }
5745         }
5746
5747       /* Check for 16bit shifted constant.  We know that hi32 is
5748          non-zero, so start the mask on the first bit of the hi32
5749          value.  */
5750       shift = 17;
5751       do
5752         {
5753           unsigned long himask, lomask;
5754
5755           if (shift < 32)
5756             {
5757               himask = 0xffff >> (32 - shift);
5758               lomask = (0xffff << shift) & 0xffffffff;
5759             }
5760           else
5761             {
5762               himask = 0xffff << (shift - 32);
5763               lomask = 0;
5764             }
5765           if ((hi32.X_add_number & ~(offsetT) himask) == 0
5766               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
5767             {
5768               expressionS tmp;
5769
5770               tmp.X_op = O_constant;
5771               if (shift < 32)
5772                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
5773                                     | (lo32.X_add_number >> shift));
5774               else
5775                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
5776               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
5777               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", SHFT_FMT,
5778                            reg, reg, (shift >= 32) ? shift - 32 : shift);
5779               return;
5780             }
5781           ++shift;
5782         }
5783       while (shift <= (64 - 16));
5784
5785       /* Find the bit number of the lowest one bit, and store the
5786          shifted value in hi/lo.  */
5787       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
5788       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
5789       if (lo != 0)
5790         {
5791           bit = 0;
5792           while ((lo & 1) == 0)
5793             {
5794               lo >>= 1;
5795               ++bit;
5796             }
5797           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
5798           hi >>= bit;
5799         }
5800       else
5801         {
5802           bit = 32;
5803           while ((hi & 1) == 0)
5804             {
5805               hi >>= 1;
5806               ++bit;
5807             }
5808           lo = hi;
5809           hi = 0;
5810         }
5811
5812       /* Optimize if the shifted value is a (power of 2) - 1.  */
5813       if ((hi == 0 && ((lo + 1) & lo) == 0)
5814           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
5815         {
5816           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
5817           if (shift != 0)
5818             {
5819               expressionS tmp;
5820
5821               /* This instruction will set the register to be all
5822                  ones.  */
5823               tmp.X_op = O_constant;
5824               tmp.X_add_number = (offsetT) -1;
5825               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5826               if (bit != 0)
5827                 {
5828                   bit += shift;
5829                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", SHFT_FMT,
5830                                reg, reg, (bit >= 32) ? bit - 32 : bit);
5831                 }
5832               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", SHFT_FMT,
5833                            reg, reg, (shift >= 32) ? shift - 32 : shift);
5834               return;
5835             }
5836         }
5837
5838       /* Sign extend hi32 before calling load_register, because we can
5839          generally get better code when we load a sign extended value.  */
5840       if ((hi32.X_add_number & 0x80000000) != 0)
5841         hi32.X_add_number |= ~(offsetT) 0xffffffff;
5842       load_register (reg, &hi32, 0);
5843       freg = reg;
5844     }
5845   if ((lo32.X_add_number & 0xffff0000) == 0)
5846     {
5847       if (freg != 0)
5848         {
5849           macro_build (NULL, "dsll32", SHFT_FMT, reg, freg, 0);
5850           freg = reg;
5851         }
5852     }
5853   else
5854     {
5855       expressionS mid16;
5856
5857       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
5858         {
5859           macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5860           macro_build (NULL, "dsrl32", SHFT_FMT, reg, reg, 0);
5861           return;
5862         }
5863
5864       if (freg != 0)
5865         {
5866           macro_build (NULL, "dsll", SHFT_FMT, reg, freg, 16);
5867           freg = reg;
5868         }
5869       mid16 = lo32;
5870       mid16.X_add_number >>= 16;
5871       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
5872       macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5873       freg = reg;
5874     }
5875   if ((lo32.X_add_number & 0xffff) != 0)
5876     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
5877 }
5878
5879 static inline void
5880 load_delay_nop (void)
5881 {
5882   if (!gpr_interlocks)
5883     macro_build (NULL, "nop", "");
5884 }
5885
5886 /* Load an address into a register.  */
5887
5888 static void
5889 load_address (int reg, expressionS *ep, int *used_at)
5890 {
5891   if (ep->X_op != O_constant
5892       && ep->X_op != O_symbol)
5893     {
5894       as_bad (_("expression too complex"));
5895       ep->X_op = O_constant;
5896     }
5897
5898   if (ep->X_op == O_constant)
5899     {
5900       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
5901       return;
5902     }
5903
5904   if (mips_pic == NO_PIC)
5905     {
5906       /* If this is a reference to a GP relative symbol, we want
5907            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
5908          Otherwise we want
5909            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
5910            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
5911          If we have an addend, we always use the latter form.
5912
5913          With 64bit address space and a usable $at we want
5914            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
5915            lui          $at,<sym>               (BFD_RELOC_HI16_S)
5916            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
5917            daddiu       $at,<sym>               (BFD_RELOC_LO16)
5918            dsll32       $reg,0
5919            daddu        $reg,$reg,$at
5920
5921          If $at is already in use, we use a path which is suboptimal
5922          on superscalar processors.
5923            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
5924            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
5925            dsll         $reg,16
5926            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
5927            dsll         $reg,16
5928            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
5929
5930          For GP relative symbols in 64bit address space we can use
5931          the same sequence as in 32bit address space.  */
5932       if (HAVE_64BIT_SYMBOLS)
5933         {
5934           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
5935               && !nopic_need_relax (ep->X_add_symbol, 1))
5936             {
5937               relax_start (ep->X_add_symbol);
5938               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
5939                            mips_gp_register, BFD_RELOC_GPREL16);
5940               relax_switch ();
5941             }
5942
5943           if (*used_at == 0 && mips_opts.at)
5944             {
5945               macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
5946               macro_build (ep, "lui", LUI_FMT, AT, BFD_RELOC_HI16_S);
5947               macro_build (ep, "daddiu", "t,r,j", reg, reg,
5948                            BFD_RELOC_MIPS_HIGHER);
5949               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
5950               macro_build (NULL, "dsll32", SHFT_FMT, reg, reg, 0);
5951               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
5952               *used_at = 1;
5953             }
5954           else
5955             {
5956               macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
5957               macro_build (ep, "daddiu", "t,r,j", reg, reg,
5958                            BFD_RELOC_MIPS_HIGHER);
5959               macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5960               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
5961               macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5962               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
5963             }
5964
5965           if (mips_relax.sequence)
5966             relax_end ();
5967         }
5968       else
5969         {
5970           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
5971               && !nopic_need_relax (ep->X_add_symbol, 1))
5972             {
5973               relax_start (ep->X_add_symbol);
5974               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
5975                            mips_gp_register, BFD_RELOC_GPREL16);
5976               relax_switch ();
5977             }
5978           macro_build_lui (ep, reg);
5979           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
5980                        reg, reg, BFD_RELOC_LO16);
5981           if (mips_relax.sequence)
5982             relax_end ();
5983         }
5984     }
5985   else if (!mips_big_got)
5986     {
5987       expressionS ex;
5988
5989       /* If this is a reference to an external symbol, we want
5990            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
5991          Otherwise we want
5992            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
5993            nop
5994            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
5995          If there is a constant, it must be added in after.
5996
5997          If we have NewABI, we want
5998            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5999          unless we're referencing a global symbol with a non-zero
6000          offset, in which case cst must be added separately.  */
6001       if (HAVE_NEWABI)
6002         {
6003           if (ep->X_add_number)
6004             {
6005               ex.X_add_number = ep->X_add_number;
6006               ep->X_add_number = 0;
6007               relax_start (ep->X_add_symbol);
6008               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6009                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6010               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6011                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6012               ex.X_op = O_constant;
6013               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
6014                            reg, reg, BFD_RELOC_LO16);
6015               ep->X_add_number = ex.X_add_number;
6016               relax_switch ();
6017             }
6018           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6019                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6020           if (mips_relax.sequence)
6021             relax_end ();
6022         }
6023       else
6024         {
6025           ex.X_add_number = ep->X_add_number;
6026           ep->X_add_number = 0;
6027           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6028                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6029           load_delay_nop ();
6030           relax_start (ep->X_add_symbol);
6031           relax_switch ();
6032           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6033                        BFD_RELOC_LO16);
6034           relax_end ();
6035
6036           if (ex.X_add_number != 0)
6037             {
6038               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6039                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6040               ex.X_op = O_constant;
6041               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
6042                            reg, reg, BFD_RELOC_LO16);
6043             }
6044         }
6045     }
6046   else if (mips_big_got)
6047     {
6048       expressionS ex;
6049
6050       /* This is the large GOT case.  If this is a reference to an
6051          external symbol, we want
6052            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
6053            addu         $reg,$reg,$gp
6054            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
6055
6056          Otherwise, for a reference to a local symbol in old ABI, we want
6057            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
6058            nop
6059            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
6060          If there is a constant, it must be added in after.
6061
6062          In the NewABI, for local symbols, with or without offsets, we want:
6063            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
6064            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
6065       */
6066       if (HAVE_NEWABI)
6067         {
6068           ex.X_add_number = ep->X_add_number;
6069           ep->X_add_number = 0;
6070           relax_start (ep->X_add_symbol);
6071           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
6072           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6073                        reg, reg, mips_gp_register);
6074           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
6075                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
6076           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6077             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6078           else if (ex.X_add_number)
6079             {
6080               ex.X_op = O_constant;
6081               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6082                            BFD_RELOC_LO16);
6083             }
6084
6085           ep->X_add_number = ex.X_add_number;
6086           relax_switch ();
6087           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6088                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6089           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6090                        BFD_RELOC_MIPS_GOT_OFST);
6091           relax_end ();
6092         }
6093       else
6094         {
6095           ex.X_add_number = ep->X_add_number;
6096           ep->X_add_number = 0;
6097           relax_start (ep->X_add_symbol);
6098           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
6099           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6100                        reg, reg, mips_gp_register);
6101           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
6102                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
6103           relax_switch ();
6104           if (reg_needs_delay (mips_gp_register))
6105             {
6106               /* We need a nop before loading from $gp.  This special
6107                  check is required because the lui which starts the main
6108                  instruction stream does not refer to $gp, and so will not
6109                  insert the nop which may be required.  */
6110               macro_build (NULL, "nop", "");
6111             }
6112           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6113                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6114           load_delay_nop ();
6115           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6116                        BFD_RELOC_LO16);
6117           relax_end ();
6118
6119           if (ex.X_add_number != 0)
6120             {
6121               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6122                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6123               ex.X_op = O_constant;
6124               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6125                            BFD_RELOC_LO16);
6126             }
6127         }
6128     }
6129   else
6130     abort ();
6131
6132   if (!mips_opts.at && *used_at == 1)
6133     as_bad (_("Macro used $at after \".set noat\""));
6134 }
6135
6136 /* Move the contents of register SOURCE into register DEST.  */
6137
6138 static void
6139 move_register (int dest, int source)
6140 {
6141   /* Prefer to use a 16-bit microMIPS instruction unless the previous
6142      instruction specifically requires a 32-bit one.  */
6143   if (mips_opts.micromips
6144       && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
6145     macro_build (NULL, "move", "mp,mj", dest, source);
6146   else
6147     macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
6148                  dest, source, 0);
6149 }
6150
6151 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
6152    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
6153    The two alternatives are:
6154
6155    Global symbol                Local sybmol
6156    -------------                ------------
6157    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
6158    ...                          ...
6159    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
6160
6161    load_got_offset emits the first instruction and add_got_offset
6162    emits the second for a 16-bit offset or add_got_offset_hilo emits
6163    a sequence to add a 32-bit offset using a scratch register.  */
6164
6165 static void
6166 load_got_offset (int dest, expressionS *local)
6167 {
6168   expressionS global;
6169
6170   global = *local;
6171   global.X_add_number = 0;
6172
6173   relax_start (local->X_add_symbol);
6174   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
6175                BFD_RELOC_MIPS_GOT16, mips_gp_register);
6176   relax_switch ();
6177   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
6178                BFD_RELOC_MIPS_GOT16, mips_gp_register);
6179   relax_end ();
6180 }
6181
6182 static void
6183 add_got_offset (int dest, expressionS *local)
6184 {
6185   expressionS global;
6186
6187   global.X_op = O_constant;
6188   global.X_op_symbol = NULL;
6189   global.X_add_symbol = NULL;
6190   global.X_add_number = local->X_add_number;
6191
6192   relax_start (local->X_add_symbol);
6193   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
6194                dest, dest, BFD_RELOC_LO16);
6195   relax_switch ();
6196   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
6197   relax_end ();
6198 }
6199
6200 static void
6201 add_got_offset_hilo (int dest, expressionS *local, int tmp)
6202 {
6203   expressionS global;
6204   int hold_mips_optimize;
6205
6206   global.X_op = O_constant;
6207   global.X_op_symbol = NULL;
6208   global.X_add_symbol = NULL;
6209   global.X_add_number = local->X_add_number;
6210
6211   relax_start (local->X_add_symbol);
6212   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
6213   relax_switch ();
6214   /* Set mips_optimize around the lui instruction to avoid
6215      inserting an unnecessary nop after the lw.  */
6216   hold_mips_optimize = mips_optimize;
6217   mips_optimize = 2;
6218   macro_build_lui (&global, tmp);
6219   mips_optimize = hold_mips_optimize;
6220   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
6221   relax_end ();
6222
6223   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
6224 }
6225
6226 /* Emit a sequence of instructions to emulate a branch likely operation.
6227    BR is an ordinary branch corresponding to one to be emulated.  BRNEG
6228    is its complementing branch with the original condition negated.
6229    CALL is set if the original branch specified the link operation.
6230    EP, FMT, SREG and TREG specify the usual macro_build() parameters.
6231
6232    Code like this is produced in the noreorder mode:
6233
6234         BRNEG   <args>, 1f
6235          nop
6236         b       <sym>
6237          delay slot (executed only if branch taken)
6238     1:
6239
6240    or, if CALL is set:
6241
6242         BRNEG   <args>, 1f
6243          nop
6244         bal     <sym>
6245          delay slot (executed only if branch taken)
6246     1:
6247
6248    In the reorder mode the delay slot would be filled with a nop anyway,
6249    so code produced is simply:
6250
6251         BR      <args>, <sym>
6252          nop
6253
6254    This function is used when producing code for the microMIPS ASE that
6255    does not implement branch likely instructions in hardware.  */
6256
6257 static void
6258 macro_build_branch_likely (const char *br, const char *brneg,
6259                            int call, expressionS *ep, const char *fmt,
6260                            unsigned int sreg, unsigned int treg)
6261 {
6262   int noreorder = mips_opts.noreorder;
6263   expressionS expr1;
6264
6265   gas_assert (mips_opts.micromips);
6266   start_noreorder ();
6267   if (noreorder)
6268     {
6269       micromips_label_expr (&expr1);
6270       macro_build (&expr1, brneg, fmt, sreg, treg);
6271       macro_build (NULL, "nop", "");
6272       macro_build (ep, call ? "bal" : "b", "p");
6273
6274       /* Set to true so that append_insn adds a label.  */
6275       emit_branch_likely_macro = TRUE;
6276     }
6277   else
6278     {
6279       macro_build (ep, br, fmt, sreg, treg);
6280       macro_build (NULL, "nop", "");
6281     }
6282   end_noreorder ();
6283 }
6284
6285 /* Emit a coprocessor branch-likely macro specified by TYPE, using CC as
6286    the condition code tested.  EP specifies the branch target.  */
6287
6288 static void
6289 macro_build_branch_ccl (int type, expressionS *ep, unsigned int cc)
6290 {
6291   const int call = 0;
6292   const char *brneg;
6293   const char *br;
6294
6295   switch (type)
6296     {
6297     case M_BC1FL:
6298       br = "bc1f";
6299       brneg = "bc1t";
6300       break;
6301     case M_BC1TL:
6302       br = "bc1t";
6303       brneg = "bc1f";
6304       break;
6305     case M_BC2FL:
6306       br = "bc2f";
6307       brneg = "bc2t";
6308       break;
6309     case M_BC2TL:
6310       br = "bc2t";
6311       brneg = "bc2f";
6312       break;
6313     default:
6314       abort ();
6315     }
6316   macro_build_branch_likely (br, brneg, call, ep, "N,p", cc, ZERO);
6317 }
6318
6319 /* Emit a two-argument branch macro specified by TYPE, using SREG as
6320    the register tested.  EP specifies the branch target.  */
6321
6322 static void
6323 macro_build_branch_rs (int type, expressionS *ep, unsigned int sreg)
6324 {
6325   const char *brneg = NULL;
6326   const char *br;
6327   int call = 0;
6328
6329   switch (type)
6330     {
6331     case M_BGEZ:
6332       br = "bgez";
6333       break;
6334     case M_BGEZL:
6335       br = mips_opts.micromips ? "bgez" : "bgezl";
6336       brneg = "bltz";
6337       break;
6338     case M_BGEZALL:
6339       gas_assert (mips_opts.micromips);
6340       br = "bgezals";
6341       brneg = "bltz";
6342       call = 1;
6343       break;
6344     case M_BGTZ:
6345       br = "bgtz";
6346       break;
6347     case M_BGTZL:
6348       br = mips_opts.micromips ? "bgtz" : "bgtzl";
6349       brneg = "blez";
6350       break;
6351     case M_BLEZ:
6352       br = "blez";
6353       break;
6354     case M_BLEZL:
6355       br = mips_opts.micromips ? "blez" : "blezl";
6356       brneg = "bgtz";
6357       break;
6358     case M_BLTZ:
6359       br = "bltz";
6360       break;
6361     case M_BLTZL:
6362       br = mips_opts.micromips ? "bltz" : "bltzl";
6363       brneg = "bgez";
6364       break;
6365     case M_BLTZALL:
6366       gas_assert (mips_opts.micromips);
6367       br = "bltzals";
6368       brneg = "bgez";
6369       call = 1;
6370       break;
6371     default:
6372       abort ();
6373     }
6374   if (mips_opts.micromips && brneg)
6375     macro_build_branch_likely (br, brneg, call, ep, "s,p", sreg, ZERO);
6376   else
6377     macro_build (ep, br, "s,p", sreg);
6378 }
6379
6380 /* Emit a three-argument branch macro specified by TYPE, using SREG and
6381    TREG as the registers tested.  EP specifies the branch target.  */
6382
6383 static void
6384 macro_build_branch_rsrt (int type, expressionS *ep,
6385                          unsigned int sreg, unsigned int treg)
6386 {
6387   const char *brneg = NULL;
6388   const int call = 0;
6389   const char *br;
6390
6391   switch (type)
6392     {
6393     case M_BEQ:
6394     case M_BEQ_I:
6395       br = "beq";
6396       break;
6397     case M_BEQL:
6398     case M_BEQL_I:
6399       br = mips_opts.micromips ? "beq" : "beql";
6400       brneg = "bne";
6401       break;
6402     case M_BNE:
6403     case M_BNE_I:
6404       br = "bne";
6405       break;
6406     case M_BNEL:
6407     case M_BNEL_I:
6408       br = mips_opts.micromips ? "bne" : "bnel";
6409       brneg = "beq";
6410       break;
6411     default:
6412       abort ();
6413     }
6414   if (mips_opts.micromips && brneg)
6415     macro_build_branch_likely (br, brneg, call, ep, "s,t,p", sreg, treg);
6416   else
6417     macro_build (ep, br, "s,t,p", sreg, treg);
6418 }
6419
6420 /*
6421  *                      Build macros
6422  *   This routine implements the seemingly endless macro or synthesized
6423  * instructions and addressing modes in the mips assembly language. Many
6424  * of these macros are simple and are similar to each other. These could
6425  * probably be handled by some kind of table or grammar approach instead of
6426  * this verbose method. Others are not simple macros but are more like
6427  * optimizing code generation.
6428  *   One interesting optimization is when several store macros appear
6429  * consecutively that would load AT with the upper half of the same address.
6430  * The ensuing load upper instructions are ommited. This implies some kind
6431  * of global optimization. We currently only optimize within a single macro.
6432  *   For many of the load and store macros if the address is specified as a
6433  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
6434  * first load register 'at' with zero and use it as the base register. The
6435  * mips assembler simply uses register $zero. Just one tiny optimization
6436  * we're missing.
6437  */
6438 static void
6439 macro (struct mips_cl_insn *ip)
6440 {
6441   unsigned int treg, sreg, dreg, breg;
6442   unsigned int tempreg;
6443   int mask;
6444   int used_at = 0;
6445   expressionS label_expr;
6446   expressionS expr1;
6447   expressionS *ep;
6448   const char *s;
6449   const char *s2;
6450   const char *fmt;
6451   int likely = 0;
6452   int coproc = 0;
6453   int off12 = 0;
6454   int call = 0;
6455   int jals = 0;
6456   int dbl = 0;
6457   int imm = 0;
6458   int ust = 0;
6459   int lp = 0;
6460   int ab = 0;
6461   int off0 = 0;
6462   int off;
6463   offsetT maxnum;
6464   bfd_reloc_code_real_type r;
6465   int hold_mips_optimize;
6466
6467   gas_assert (! mips_opts.mips16);
6468
6469   treg = EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
6470   dreg = EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
6471   sreg = breg = EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
6472   mask = ip->insn_mo->mask;
6473
6474   label_expr.X_op = O_constant;
6475   label_expr.X_op_symbol = NULL;
6476   label_expr.X_add_symbol = NULL;
6477   label_expr.X_add_number = 0;
6478
6479   expr1.X_op = O_constant;
6480   expr1.X_op_symbol = NULL;
6481   expr1.X_add_symbol = NULL;
6482   expr1.X_add_number = 1;
6483
6484   switch (mask)
6485     {
6486     case M_DABS:
6487       dbl = 1;
6488     case M_ABS:
6489       /*    bgez    $a0,1f
6490             move    v0,$a0
6491             sub     v0,$zero,$a0
6492          1:
6493        */
6494
6495       start_noreorder ();
6496
6497       if (mips_opts.micromips)
6498         micromips_label_expr (&label_expr);
6499       else
6500         label_expr.X_add_number = 8;
6501       macro_build (&label_expr, "bgez", "s,p", sreg);
6502       if (dreg == sreg)
6503         macro_build (NULL, "nop", "");
6504       else
6505         move_register (dreg, sreg);
6506       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
6507       if (mips_opts.micromips)
6508         micromips_add_label ();
6509
6510       end_noreorder ();
6511       break;
6512
6513     case M_ADD_I:
6514       s = "addi";
6515       s2 = "add";
6516       goto do_addi;
6517     case M_ADDU_I:
6518       s = "addiu";
6519       s2 = "addu";
6520       goto do_addi;
6521     case M_DADD_I:
6522       dbl = 1;
6523       s = "daddi";
6524       s2 = "dadd";
6525       if (!mips_opts.micromips)
6526         goto do_addi;
6527       if (imm_expr.X_op == O_constant
6528           && imm_expr.X_add_number >= -0x200
6529           && imm_expr.X_add_number < 0x200)
6530         {
6531           macro_build (NULL, s, "t,r,.", treg, sreg, imm_expr.X_add_number);
6532           break;
6533         }
6534       goto do_addi_i;
6535     case M_DADDU_I:
6536       dbl = 1;
6537       s = "daddiu";
6538       s2 = "daddu";
6539     do_addi:
6540       if (imm_expr.X_op == O_constant
6541           && imm_expr.X_add_number >= -0x8000
6542           && imm_expr.X_add_number < 0x8000)
6543         {
6544           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
6545           break;
6546         }
6547     do_addi_i:
6548       used_at = 1;
6549       load_register (AT, &imm_expr, dbl);
6550       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6551       break;
6552
6553     case M_AND_I:
6554       s = "andi";
6555       s2 = "and";
6556       goto do_bit;
6557     case M_OR_I:
6558       s = "ori";
6559       s2 = "or";
6560       goto do_bit;
6561     case M_NOR_I:
6562       s = "";
6563       s2 = "nor";
6564       goto do_bit;
6565     case M_XOR_I:
6566       s = "xori";
6567       s2 = "xor";
6568     do_bit:
6569       if (imm_expr.X_op == O_constant
6570           && imm_expr.X_add_number >= 0
6571           && imm_expr.X_add_number < 0x10000)
6572         {
6573           if (mask != M_NOR_I)
6574             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
6575           else
6576             {
6577               macro_build (&imm_expr, "ori", "t,r,i",
6578                            treg, sreg, BFD_RELOC_LO16);
6579               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
6580             }
6581           break;
6582         }
6583
6584       used_at = 1;
6585       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
6586       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6587       break;
6588
6589     case M_BALIGN:
6590       switch (imm_expr.X_add_number)
6591         {
6592         case 0:
6593           macro_build (NULL, "nop", "");
6594           break;
6595         case 2:
6596           macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
6597           break;
6598         case 1:
6599         case 3:
6600           macro_build (NULL, "balign", "t,s,2", treg, sreg,
6601                        (int) imm_expr.X_add_number);
6602           break;
6603         default:
6604           as_bad (_("BALIGN immediate not 0, 1, 2 or 3 (%lu)"),
6605                   (unsigned long) imm_expr.X_add_number);
6606           break;
6607         }
6608       break;
6609
6610     case M_BC1FL:
6611     case M_BC1TL:
6612     case M_BC2FL:
6613     case M_BC2TL:
6614       gas_assert (mips_opts.micromips);
6615       macro_build_branch_ccl (mask, &offset_expr,
6616                               EXTRACT_OPERAND (1, BCC, *ip));
6617       break;
6618
6619     case M_BEQ_I:
6620     case M_BEQL_I:
6621     case M_BNE_I:
6622     case M_BNEL_I:
6623       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6624         treg = 0;
6625       else
6626         {
6627           treg = AT;
6628           used_at = 1;
6629           load_register (treg, &imm_expr, HAVE_64BIT_GPRS);
6630         }
6631       /* Fall through.  */
6632     case M_BEQL:
6633     case M_BNEL:
6634       macro_build_branch_rsrt (mask, &offset_expr, sreg, treg);
6635       break;
6636
6637     case M_BGEL:
6638       likely = 1;
6639     case M_BGE:
6640       if (treg == 0)
6641         macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, sreg);
6642       else if (sreg == 0)
6643         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, treg);
6644       else
6645         {
6646           used_at = 1;
6647           macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
6648           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6649                                    &offset_expr, AT, ZERO);
6650         }
6651       break;
6652
6653     case M_BGEZL:
6654     case M_BGEZALL:
6655     case M_BGTZL:
6656     case M_BLEZL:
6657     case M_BLTZL:
6658     case M_BLTZALL:
6659       macro_build_branch_rs (mask, &offset_expr, sreg);
6660       break;
6661
6662     case M_BGTL_I:
6663       likely = 1;
6664     case M_BGT_I:
6665       /* Check for > max integer.  */
6666       maxnum = 0x7fffffff;
6667       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6668         {
6669           maxnum <<= 16;
6670           maxnum |= 0xffff;
6671           maxnum <<= 16;
6672           maxnum |= 0xffff;
6673         }
6674       if (imm_expr.X_op == O_constant
6675           && imm_expr.X_add_number >= maxnum
6676           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6677         {
6678         do_false:
6679           /* Result is always false.  */
6680           if (! likely)
6681             macro_build (NULL, "nop", "");
6682           else
6683             macro_build_branch_rsrt (M_BNEL, &offset_expr, ZERO, ZERO);
6684           break;
6685         }
6686       if (imm_expr.X_op != O_constant)
6687         as_bad (_("Unsupported large constant"));
6688       ++imm_expr.X_add_number;
6689       /* FALLTHROUGH */
6690     case M_BGE_I:
6691     case M_BGEL_I:
6692       if (mask == M_BGEL_I)
6693         likely = 1;
6694       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6695         {
6696           macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ,
6697                                  &offset_expr, sreg);
6698           break;
6699         }
6700       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6701         {
6702           macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ,
6703                                  &offset_expr, sreg);
6704           break;
6705         }
6706       maxnum = 0x7fffffff;
6707       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6708         {
6709           maxnum <<= 16;
6710           maxnum |= 0xffff;
6711           maxnum <<= 16;
6712           maxnum |= 0xffff;
6713         }
6714       maxnum = - maxnum - 1;
6715       if (imm_expr.X_op == O_constant
6716           && imm_expr.X_add_number <= maxnum
6717           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6718         {
6719         do_true:
6720           /* result is always true */
6721           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
6722           macro_build (&offset_expr, "b", "p");
6723           break;
6724         }
6725       used_at = 1;
6726       set_at (sreg, 0);
6727       macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6728                                &offset_expr, AT, ZERO);
6729       break;
6730
6731     case M_BGEUL:
6732       likely = 1;
6733     case M_BGEU:
6734       if (treg == 0)
6735         goto do_true;
6736       else if (sreg == 0)
6737         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6738                                  &offset_expr, ZERO, treg);
6739       else
6740         {
6741           used_at = 1;
6742           macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
6743           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6744                                    &offset_expr, AT, ZERO);
6745         }
6746       break;
6747
6748     case M_BGTUL_I:
6749       likely = 1;
6750     case M_BGTU_I:
6751       if (sreg == 0
6752           || (HAVE_32BIT_GPRS
6753               && imm_expr.X_op == O_constant
6754               && imm_expr.X_add_number == -1))
6755         goto do_false;
6756       if (imm_expr.X_op != O_constant)
6757         as_bad (_("Unsupported large constant"));
6758       ++imm_expr.X_add_number;
6759       /* FALLTHROUGH */
6760     case M_BGEU_I:
6761     case M_BGEUL_I:
6762       if (mask == M_BGEUL_I)
6763         likely = 1;
6764       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6765         goto do_true;
6766       else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6767         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6768                                  &offset_expr, sreg, ZERO);
6769       else
6770         {
6771           used_at = 1;
6772           set_at (sreg, 1);
6773           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6774                                    &offset_expr, AT, ZERO);
6775         }
6776       break;
6777
6778     case M_BGTL:
6779       likely = 1;
6780     case M_BGT:
6781       if (treg == 0)
6782         macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, sreg);
6783       else if (sreg == 0)
6784         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, treg);
6785       else
6786         {
6787           used_at = 1;
6788           macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
6789           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6790                                    &offset_expr, AT, ZERO);
6791         }
6792       break;
6793
6794     case M_BGTUL:
6795       likely = 1;
6796     case M_BGTU:
6797       if (treg == 0)
6798         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6799                                  &offset_expr, sreg, ZERO);
6800       else if (sreg == 0)
6801         goto do_false;
6802       else
6803         {
6804           used_at = 1;
6805           macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
6806           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6807                                    &offset_expr, AT, ZERO);
6808         }
6809       break;
6810
6811     case M_BLEL:
6812       likely = 1;
6813     case M_BLE:
6814       if (treg == 0)
6815         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
6816       else if (sreg == 0)
6817         macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, treg);
6818       else
6819         {
6820           used_at = 1;
6821           macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
6822           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6823                                    &offset_expr, AT, ZERO);
6824         }
6825       break;
6826
6827     case M_BLEL_I:
6828       likely = 1;
6829     case M_BLE_I:
6830       maxnum = 0x7fffffff;
6831       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6832         {
6833           maxnum <<= 16;
6834           maxnum |= 0xffff;
6835           maxnum <<= 16;
6836           maxnum |= 0xffff;
6837         }
6838       if (imm_expr.X_op == O_constant
6839           && imm_expr.X_add_number >= maxnum
6840           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6841         goto do_true;
6842       if (imm_expr.X_op != O_constant)
6843         as_bad (_("Unsupported large constant"));
6844       ++imm_expr.X_add_number;
6845       /* FALLTHROUGH */
6846     case M_BLT_I:
6847     case M_BLTL_I:
6848       if (mask == M_BLTL_I)
6849         likely = 1;
6850       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6851         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
6852       else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6853         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
6854       else
6855         {
6856           used_at = 1;
6857           set_at (sreg, 0);
6858           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6859                                    &offset_expr, AT, ZERO);
6860         }
6861       break;
6862
6863     case M_BLEUL:
6864       likely = 1;
6865     case M_BLEU:
6866       if (treg == 0)
6867         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6868                                  &offset_expr, sreg, ZERO);
6869       else if (sreg == 0)
6870         goto do_true;
6871       else
6872         {
6873           used_at = 1;
6874           macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
6875           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6876                                    &offset_expr, AT, ZERO);
6877         }
6878       break;
6879
6880     case M_BLEUL_I:
6881       likely = 1;
6882     case M_BLEU_I:
6883       if (sreg == 0
6884           || (HAVE_32BIT_GPRS
6885               && imm_expr.X_op == O_constant
6886               && imm_expr.X_add_number == -1))
6887         goto do_true;
6888       if (imm_expr.X_op != O_constant)
6889         as_bad (_("Unsupported large constant"));
6890       ++imm_expr.X_add_number;
6891       /* FALLTHROUGH */
6892     case M_BLTU_I:
6893     case M_BLTUL_I:
6894       if (mask == M_BLTUL_I)
6895         likely = 1;
6896       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6897         goto do_false;
6898       else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6899         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6900                                  &offset_expr, sreg, ZERO);
6901       else
6902         {
6903           used_at = 1;
6904           set_at (sreg, 1);
6905           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6906                                    &offset_expr, AT, ZERO);
6907         }
6908       break;
6909
6910     case M_BLTL:
6911       likely = 1;
6912     case M_BLT:
6913       if (treg == 0)
6914         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
6915       else if (sreg == 0)
6916         macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, treg);
6917       else
6918         {
6919           used_at = 1;
6920           macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
6921           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6922                                    &offset_expr, AT, ZERO);
6923         }
6924       break;
6925
6926     case M_BLTUL:
6927       likely = 1;
6928     case M_BLTU:
6929       if (treg == 0)
6930         goto do_false;
6931       else if (sreg == 0)
6932         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6933                                  &offset_expr, ZERO, treg);
6934       else
6935         {
6936           used_at = 1;
6937           macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
6938           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6939                                    &offset_expr, AT, ZERO);
6940         }
6941       break;
6942
6943     case M_DEXT:
6944       {
6945         /* Use unsigned arithmetic.  */
6946         addressT pos;
6947         addressT size;
6948
6949         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
6950           {
6951             as_bad (_("Unsupported large constant"));
6952             pos = size = 1;
6953           }
6954         else
6955           {
6956             pos = imm_expr.X_add_number;
6957             size = imm2_expr.X_add_number;
6958           }
6959
6960         if (pos > 63)
6961           {
6962             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
6963             pos = 1;
6964           }
6965         if (size == 0 || size > 64 || (pos + size - 1) > 63)
6966           {
6967             as_bad (_("Improper extract size (%lu, position %lu)"),
6968                     (unsigned long) size, (unsigned long) pos);
6969             size = 1;
6970           }
6971
6972         if (size <= 32 && pos < 32)
6973           {
6974             s = "dext";
6975             fmt = "t,r,+A,+C";
6976           }
6977         else if (size <= 32)
6978           {
6979             s = "dextu";
6980             fmt = "t,r,+E,+H";
6981           }
6982         else
6983           {
6984             s = "dextm";
6985             fmt = "t,r,+A,+G";
6986           }
6987         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
6988                      (int) (size - 1));
6989       }
6990       break;
6991
6992     case M_DINS:
6993       {
6994         /* Use unsigned arithmetic.  */
6995         addressT pos;
6996         addressT size;
6997
6998         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
6999           {
7000             as_bad (_("Unsupported large constant"));
7001             pos = size = 1;
7002           }
7003         else
7004           {
7005             pos = imm_expr.X_add_number;
7006             size = imm2_expr.X_add_number;
7007           }
7008
7009         if (pos > 63)
7010           {
7011             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
7012             pos = 1;
7013           }
7014         if (size == 0 || size > 64 || (pos + size - 1) > 63)
7015           {
7016             as_bad (_("Improper insert size (%lu, position %lu)"),
7017                     (unsigned long) size, (unsigned long) pos);
7018             size = 1;
7019           }
7020
7021         if (pos < 32 && (pos + size - 1) < 32)
7022           {
7023             s = "dins";
7024             fmt = "t,r,+A,+B";
7025           }
7026         else if (pos >= 32)
7027           {
7028             s = "dinsu";
7029             fmt = "t,r,+E,+F";
7030           }
7031         else
7032           {
7033             s = "dinsm";
7034             fmt = "t,r,+A,+F";
7035           }
7036         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
7037                      (int) (pos + size - 1));
7038       }
7039       break;
7040
7041     case M_DDIV_3:
7042       dbl = 1;
7043     case M_DIV_3:
7044       s = "mflo";
7045       goto do_div3;
7046     case M_DREM_3:
7047       dbl = 1;
7048     case M_REM_3:
7049       s = "mfhi";
7050     do_div3:
7051       if (treg == 0)
7052         {
7053           as_warn (_("Divide by zero."));
7054           if (mips_trap)
7055             macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
7056           else
7057             macro_build (NULL, "break", BRK_FMT, 7);
7058           break;
7059         }
7060
7061       start_noreorder ();
7062       if (mips_trap)
7063         {
7064           macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
7065           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
7066         }
7067       else
7068         {
7069           if (mips_opts.micromips)
7070             micromips_label_expr (&label_expr);
7071           else
7072             label_expr.X_add_number = 8;
7073           macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
7074           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
7075           macro_build (NULL, "break", BRK_FMT, 7);
7076           if (mips_opts.micromips)
7077             micromips_add_label ();
7078         }
7079       expr1.X_add_number = -1;
7080       used_at = 1;
7081       load_register (AT, &expr1, dbl);
7082       if (mips_opts.micromips)
7083         micromips_label_expr (&label_expr);
7084       else
7085         label_expr.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
7086       macro_build (&label_expr, "bne", "s,t,p", treg, AT);
7087       if (dbl)
7088         {
7089           expr1.X_add_number = 1;
7090           load_register (AT, &expr1, dbl);
7091           macro_build (NULL, "dsll32", SHFT_FMT, AT, AT, 31);
7092         }
7093       else
7094         {
7095           expr1.X_add_number = 0x80000000;
7096           macro_build (&expr1, "lui", LUI_FMT, AT, BFD_RELOC_HI16);
7097         }
7098       if (mips_trap)
7099         {
7100           macro_build (NULL, "teq", TRAP_FMT, sreg, AT, 6);
7101           /* We want to close the noreorder block as soon as possible, so
7102              that later insns are available for delay slot filling.  */
7103           end_noreorder ();
7104         }
7105       else
7106         {
7107           if (mips_opts.micromips)
7108             micromips_label_expr (&label_expr);
7109           else
7110             label_expr.X_add_number = 8;
7111           macro_build (&label_expr, "bne", "s,t,p", sreg, AT);
7112           macro_build (NULL, "nop", "");
7113
7114           /* We want to close the noreorder block as soon as possible, so
7115              that later insns are available for delay slot filling.  */
7116           end_noreorder ();
7117
7118           macro_build (NULL, "break", BRK_FMT, 6);
7119         }
7120       if (mips_opts.micromips)
7121         micromips_add_label ();
7122       macro_build (NULL, s, MFHL_FMT, dreg);
7123       break;
7124
7125     case M_DIV_3I:
7126       s = "div";
7127       s2 = "mflo";
7128       goto do_divi;
7129     case M_DIVU_3I:
7130       s = "divu";
7131       s2 = "mflo";
7132       goto do_divi;
7133     case M_REM_3I:
7134       s = "div";
7135       s2 = "mfhi";
7136       goto do_divi;
7137     case M_REMU_3I:
7138       s = "divu";
7139       s2 = "mfhi";
7140       goto do_divi;
7141     case M_DDIV_3I:
7142       dbl = 1;
7143       s = "ddiv";
7144       s2 = "mflo";
7145       goto do_divi;
7146     case M_DDIVU_3I:
7147       dbl = 1;
7148       s = "ddivu";
7149       s2 = "mflo";
7150       goto do_divi;
7151     case M_DREM_3I:
7152       dbl = 1;
7153       s = "ddiv";
7154       s2 = "mfhi";
7155       goto do_divi;
7156     case M_DREMU_3I:
7157       dbl = 1;
7158       s = "ddivu";
7159       s2 = "mfhi";
7160     do_divi:
7161       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7162         {
7163           as_warn (_("Divide by zero."));
7164           if (mips_trap)
7165             macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
7166           else
7167             macro_build (NULL, "break", BRK_FMT, 7);
7168           break;
7169         }
7170       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7171         {
7172           if (strcmp (s2, "mflo") == 0)
7173             move_register (dreg, sreg);
7174           else
7175             move_register (dreg, ZERO);
7176           break;
7177         }
7178       if (imm_expr.X_op == O_constant
7179           && imm_expr.X_add_number == -1
7180           && s[strlen (s) - 1] != 'u')
7181         {
7182           if (strcmp (s2, "mflo") == 0)
7183             {
7184               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
7185             }
7186           else
7187             move_register (dreg, ZERO);
7188           break;
7189         }
7190
7191       used_at = 1;
7192       load_register (AT, &imm_expr, dbl);
7193       macro_build (NULL, s, "z,s,t", sreg, AT);
7194       macro_build (NULL, s2, MFHL_FMT, dreg);
7195       break;
7196
7197     case M_DIVU_3:
7198       s = "divu";
7199       s2 = "mflo";
7200       goto do_divu3;
7201     case M_REMU_3:
7202       s = "divu";
7203       s2 = "mfhi";
7204       goto do_divu3;
7205     case M_DDIVU_3:
7206       s = "ddivu";
7207       s2 = "mflo";
7208       goto do_divu3;
7209     case M_DREMU_3:
7210       s = "ddivu";
7211       s2 = "mfhi";
7212     do_divu3:
7213       start_noreorder ();
7214       if (mips_trap)
7215         {
7216           macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
7217           macro_build (NULL, s, "z,s,t", sreg, treg);
7218           /* We want to close the noreorder block as soon as possible, so
7219              that later insns are available for delay slot filling.  */
7220           end_noreorder ();
7221         }
7222       else
7223         {
7224           if (mips_opts.micromips)
7225             micromips_label_expr (&label_expr);
7226           else
7227             label_expr.X_add_number = 8;
7228           macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
7229           macro_build (NULL, s, "z,s,t", sreg, treg);
7230
7231           /* We want to close the noreorder block as soon as possible, so
7232              that later insns are available for delay slot filling.  */
7233           end_noreorder ();
7234           macro_build (NULL, "break", BRK_FMT, 7);
7235           if (mips_opts.micromips)
7236             micromips_add_label ();
7237         }
7238       macro_build (NULL, s2, MFHL_FMT, dreg);
7239       break;
7240
7241     case M_DLCA_AB:
7242       dbl = 1;
7243     case M_LCA_AB:
7244       call = 1;
7245       goto do_la;
7246     case M_DLA_AB:
7247       dbl = 1;
7248     case M_LA_AB:
7249     do_la:
7250       /* Load the address of a symbol into a register.  If breg is not
7251          zero, we then add a base register to it.  */
7252
7253       if (dbl && HAVE_32BIT_GPRS)
7254         as_warn (_("dla used to load 32-bit register"));
7255
7256       if (!dbl && HAVE_64BIT_OBJECTS)
7257         as_warn (_("la used to load 64-bit address"));
7258
7259       if (offset_expr.X_op == O_constant
7260           && offset_expr.X_add_number >= -0x8000
7261           && offset_expr.X_add_number < 0x8000)
7262         {
7263           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
7264                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
7265           break;
7266         }
7267
7268       if (mips_opts.at && (treg == breg))
7269         {
7270           tempreg = AT;
7271           used_at = 1;
7272         }
7273       else
7274         {
7275           tempreg = treg;
7276         }
7277
7278       if (offset_expr.X_op != O_symbol
7279           && offset_expr.X_op != O_constant)
7280         {
7281           as_bad (_("Expression too complex"));
7282           offset_expr.X_op = O_constant;
7283         }
7284
7285       if (offset_expr.X_op == O_constant)
7286         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
7287       else if (mips_pic == NO_PIC)
7288         {
7289           /* If this is a reference to a GP relative symbol, we want
7290                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
7291              Otherwise we want
7292                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
7293                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7294              If we have a constant, we need two instructions anyhow,
7295              so we may as well always use the latter form.
7296
7297              With 64bit address space and a usable $at we want
7298                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
7299                lui      $at,<sym>               (BFD_RELOC_HI16_S)
7300                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
7301                daddiu   $at,<sym>               (BFD_RELOC_LO16)
7302                dsll32   $tempreg,0
7303                daddu    $tempreg,$tempreg,$at
7304
7305              If $at is already in use, we use a path which is suboptimal
7306              on superscalar processors.
7307                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
7308                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
7309                dsll     $tempreg,16
7310                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
7311                dsll     $tempreg,16
7312                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
7313
7314              For GP relative symbols in 64bit address space we can use
7315              the same sequence as in 32bit address space.  */
7316           if (HAVE_64BIT_SYMBOLS)
7317             {
7318               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7319                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7320                 {
7321                   relax_start (offset_expr.X_add_symbol);
7322                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7323                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7324                   relax_switch ();
7325                 }
7326
7327               if (used_at == 0 && mips_opts.at)
7328                 {
7329                   macro_build (&offset_expr, "lui", LUI_FMT,
7330                                tempreg, BFD_RELOC_MIPS_HIGHEST);
7331                   macro_build (&offset_expr, "lui", LUI_FMT,
7332                                AT, BFD_RELOC_HI16_S);
7333                   macro_build (&offset_expr, "daddiu", "t,r,j",
7334                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7335                   macro_build (&offset_expr, "daddiu", "t,r,j",
7336                                AT, AT, BFD_RELOC_LO16);
7337                   macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
7338                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
7339                   used_at = 1;
7340                 }
7341               else
7342                 {
7343                   macro_build (&offset_expr, "lui", LUI_FMT,
7344                                tempreg, BFD_RELOC_MIPS_HIGHEST);
7345                   macro_build (&offset_expr, "daddiu", "t,r,j",
7346                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7347                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7348                   macro_build (&offset_expr, "daddiu", "t,r,j",
7349                                tempreg, tempreg, BFD_RELOC_HI16_S);
7350                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7351                   macro_build (&offset_expr, "daddiu", "t,r,j",
7352                                tempreg, tempreg, BFD_RELOC_LO16);
7353                 }
7354
7355               if (mips_relax.sequence)
7356                 relax_end ();
7357             }
7358           else
7359             {
7360               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7361                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7362                 {
7363                   relax_start (offset_expr.X_add_symbol);
7364                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7365                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7366                   relax_switch ();
7367                 }
7368               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7369                 as_bad (_("Offset too large"));
7370               macro_build_lui (&offset_expr, tempreg);
7371               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7372                            tempreg, tempreg, BFD_RELOC_LO16);
7373               if (mips_relax.sequence)
7374                 relax_end ();
7375             }
7376         }
7377       else if (!mips_big_got && !HAVE_NEWABI)
7378         {
7379           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7380
7381           /* If this is a reference to an external symbol, and there
7382              is no constant, we want
7383                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7384              or for lca or if tempreg is PIC_CALL_REG
7385                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
7386              For a local symbol, we want
7387                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7388                nop
7389                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7390
7391              If we have a small constant, and this is a reference to
7392              an external symbol, we want
7393                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7394                nop
7395                addiu    $tempreg,$tempreg,<constant>
7396              For a local symbol, we want the same instruction
7397              sequence, but we output a BFD_RELOC_LO16 reloc on the
7398              addiu instruction.
7399
7400              If we have a large constant, and this is a reference to
7401              an external symbol, we want
7402                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7403                lui      $at,<hiconstant>
7404                addiu    $at,$at,<loconstant>
7405                addu     $tempreg,$tempreg,$at
7406              For a local symbol, we want the same instruction
7407              sequence, but we output a BFD_RELOC_LO16 reloc on the
7408              addiu instruction.
7409            */
7410
7411           if (offset_expr.X_add_number == 0)
7412             {
7413               if (mips_pic == SVR4_PIC
7414                   && breg == 0
7415                   && (call || tempreg == PIC_CALL_REG))
7416                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
7417
7418               relax_start (offset_expr.X_add_symbol);
7419               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7420                            lw_reloc_type, mips_gp_register);
7421               if (breg != 0)
7422                 {
7423                   /* We're going to put in an addu instruction using
7424                      tempreg, so we may as well insert the nop right
7425                      now.  */
7426                   load_delay_nop ();
7427                 }
7428               relax_switch ();
7429               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7430                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
7431               load_delay_nop ();
7432               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7433                            tempreg, tempreg, BFD_RELOC_LO16);
7434               relax_end ();
7435               /* FIXME: If breg == 0, and the next instruction uses
7436                  $tempreg, then if this variant case is used an extra
7437                  nop will be generated.  */
7438             }
7439           else if (offset_expr.X_add_number >= -0x8000
7440                    && offset_expr.X_add_number < 0x8000)
7441             {
7442               load_got_offset (tempreg, &offset_expr);
7443               load_delay_nop ();
7444               add_got_offset (tempreg, &offset_expr);
7445             }
7446           else
7447             {
7448               expr1.X_add_number = offset_expr.X_add_number;
7449               offset_expr.X_add_number =
7450                 SEXT_16BIT (offset_expr.X_add_number);
7451               load_got_offset (tempreg, &offset_expr);
7452               offset_expr.X_add_number = expr1.X_add_number;
7453               /* If we are going to add in a base register, and the
7454                  target register and the base register are the same,
7455                  then we are using AT as a temporary register.  Since
7456                  we want to load the constant into AT, we add our
7457                  current AT (from the global offset table) and the
7458                  register into the register now, and pretend we were
7459                  not using a base register.  */
7460               if (breg == treg)
7461                 {
7462                   load_delay_nop ();
7463                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7464                                treg, AT, breg);
7465                   breg = 0;
7466                   tempreg = treg;
7467                 }
7468               add_got_offset_hilo (tempreg, &offset_expr, AT);
7469               used_at = 1;
7470             }
7471         }
7472       else if (!mips_big_got && HAVE_NEWABI)
7473         {
7474           int add_breg_early = 0;
7475
7476           /* If this is a reference to an external, and there is no
7477              constant, or local symbol (*), with or without a
7478              constant, we want
7479                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7480              or for lca or if tempreg is PIC_CALL_REG
7481                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
7482
7483              If we have a small constant, and this is a reference to
7484              an external symbol, we want
7485                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7486                addiu    $tempreg,$tempreg,<constant>
7487
7488              If we have a large constant, and this is a reference to
7489              an external symbol, we want
7490                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7491                lui      $at,<hiconstant>
7492                addiu    $at,$at,<loconstant>
7493                addu     $tempreg,$tempreg,$at
7494
7495              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
7496              local symbols, even though it introduces an additional
7497              instruction.  */
7498
7499           if (offset_expr.X_add_number)
7500             {
7501               expr1.X_add_number = offset_expr.X_add_number;
7502               offset_expr.X_add_number = 0;
7503
7504               relax_start (offset_expr.X_add_symbol);
7505               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7506                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7507
7508               if (expr1.X_add_number >= -0x8000
7509                   && expr1.X_add_number < 0x8000)
7510                 {
7511                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7512                                tempreg, tempreg, BFD_RELOC_LO16);
7513                 }
7514               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
7515                 {
7516                   /* If we are going to add in a base register, and the
7517                      target register and the base register are the same,
7518                      then we are using AT as a temporary register.  Since
7519                      we want to load the constant into AT, we add our
7520                      current AT (from the global offset table) and the
7521                      register into the register now, and pretend we were
7522                      not using a base register.  */
7523                   if (breg != treg)
7524                     dreg = tempreg;
7525                   else
7526                     {
7527                       gas_assert (tempreg == AT);
7528                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7529                                    treg, AT, breg);
7530                       dreg = treg;
7531                       add_breg_early = 1;
7532                     }
7533
7534                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7535                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7536                                dreg, dreg, AT);
7537
7538                   used_at = 1;
7539                 }
7540               else
7541                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
7542
7543               relax_switch ();
7544               offset_expr.X_add_number = expr1.X_add_number;
7545
7546               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7547                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7548               if (add_breg_early)
7549                 {
7550                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7551                                treg, tempreg, breg);
7552                   breg = 0;
7553                   tempreg = treg;
7554                 }
7555               relax_end ();
7556             }
7557           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
7558             {
7559               relax_start (offset_expr.X_add_symbol);
7560               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7561                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
7562               relax_switch ();
7563               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7564                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7565               relax_end ();
7566             }
7567           else
7568             {
7569               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7570                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7571             }
7572         }
7573       else if (mips_big_got && !HAVE_NEWABI)
7574         {
7575           int gpdelay;
7576           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7577           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7578           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7579
7580           /* This is the large GOT case.  If this is a reference to an
7581              external symbol, and there is no constant, we want
7582                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7583                addu     $tempreg,$tempreg,$gp
7584                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7585              or for lca or if tempreg is PIC_CALL_REG
7586                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
7587                addu     $tempreg,$tempreg,$gp
7588                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
7589              For a local symbol, we want
7590                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7591                nop
7592                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7593
7594              If we have a small constant, and this is a reference to
7595              an external symbol, we want
7596                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7597                addu     $tempreg,$tempreg,$gp
7598                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7599                nop
7600                addiu    $tempreg,$tempreg,<constant>
7601              For a local symbol, we want
7602                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7603                nop
7604                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
7605
7606              If we have a large constant, and this is a reference to
7607              an external symbol, we want
7608                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7609                addu     $tempreg,$tempreg,$gp
7610                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7611                lui      $at,<hiconstant>
7612                addiu    $at,$at,<loconstant>
7613                addu     $tempreg,$tempreg,$at
7614              For a local symbol, we want
7615                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7616                lui      $at,<hiconstant>
7617                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
7618                addu     $tempreg,$tempreg,$at
7619           */
7620
7621           expr1.X_add_number = offset_expr.X_add_number;
7622           offset_expr.X_add_number = 0;
7623           relax_start (offset_expr.X_add_symbol);
7624           gpdelay = reg_needs_delay (mips_gp_register);
7625           if (expr1.X_add_number == 0 && breg == 0
7626               && (call || tempreg == PIC_CALL_REG))
7627             {
7628               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
7629               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
7630             }
7631           macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
7632           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7633                        tempreg, tempreg, mips_gp_register);
7634           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7635                        tempreg, lw_reloc_type, tempreg);
7636           if (expr1.X_add_number == 0)
7637             {
7638               if (breg != 0)
7639                 {
7640                   /* We're going to put in an addu instruction using
7641                      tempreg, so we may as well insert the nop right
7642                      now.  */
7643                   load_delay_nop ();
7644                 }
7645             }
7646           else if (expr1.X_add_number >= -0x8000
7647                    && expr1.X_add_number < 0x8000)
7648             {
7649               load_delay_nop ();
7650               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7651                            tempreg, tempreg, BFD_RELOC_LO16);
7652             }
7653           else
7654             {
7655               /* If we are going to add in a base register, and the
7656                  target register and the base register are the same,
7657                  then we are using AT as a temporary register.  Since
7658                  we want to load the constant into AT, we add our
7659                  current AT (from the global offset table) and the
7660                  register into the register now, and pretend we were
7661                  not using a base register.  */
7662               if (breg != treg)
7663                 dreg = tempreg;
7664               else
7665                 {
7666                   gas_assert (tempreg == AT);
7667                   load_delay_nop ();
7668                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7669                                treg, AT, breg);
7670                   dreg = treg;
7671                 }
7672
7673               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7674               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
7675
7676               used_at = 1;
7677             }
7678           offset_expr.X_add_number = SEXT_16BIT (expr1.X_add_number);
7679           relax_switch ();
7680
7681           if (gpdelay)
7682             {
7683               /* This is needed because this instruction uses $gp, but
7684                  the first instruction on the main stream does not.  */
7685               macro_build (NULL, "nop", "");
7686             }
7687
7688           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7689                        local_reloc_type, mips_gp_register);
7690           if (expr1.X_add_number >= -0x8000
7691               && expr1.X_add_number < 0x8000)
7692             {
7693               load_delay_nop ();
7694               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7695                            tempreg, tempreg, BFD_RELOC_LO16);
7696               /* FIXME: If add_number is 0, and there was no base
7697                  register, the external symbol case ended with a load,
7698                  so if the symbol turns out to not be external, and
7699                  the next instruction uses tempreg, an unnecessary nop
7700                  will be inserted.  */
7701             }
7702           else
7703             {
7704               if (breg == treg)
7705                 {
7706                   /* We must add in the base register now, as in the
7707                      external symbol case.  */
7708                   gas_assert (tempreg == AT);
7709                   load_delay_nop ();
7710                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7711                                treg, AT, breg);
7712                   tempreg = treg;
7713                   /* We set breg to 0 because we have arranged to add
7714                      it in in both cases.  */
7715                   breg = 0;
7716                 }
7717
7718               macro_build_lui (&expr1, AT);
7719               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7720                            AT, AT, BFD_RELOC_LO16);
7721               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7722                            tempreg, tempreg, AT);
7723               used_at = 1;
7724             }
7725           relax_end ();
7726         }
7727       else if (mips_big_got && HAVE_NEWABI)
7728         {
7729           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7730           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7731           int add_breg_early = 0;
7732
7733           /* This is the large GOT case.  If this is a reference to an
7734              external symbol, and there is no constant, we want
7735                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7736                add      $tempreg,$tempreg,$gp
7737                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7738              or for lca or if tempreg is PIC_CALL_REG
7739                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
7740                add      $tempreg,$tempreg,$gp
7741                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
7742
7743              If we have a small constant, and this is a reference to
7744              an external symbol, we want
7745                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7746                add      $tempreg,$tempreg,$gp
7747                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7748                addi     $tempreg,$tempreg,<constant>
7749
7750              If we have a large constant, and this is a reference to
7751              an external symbol, we want
7752                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7753                addu     $tempreg,$tempreg,$gp
7754                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7755                lui      $at,<hiconstant>
7756                addi     $at,$at,<loconstant>
7757                add      $tempreg,$tempreg,$at
7758
7759              If we have NewABI, and we know it's a local symbol, we want
7760                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
7761                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
7762              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
7763
7764           relax_start (offset_expr.X_add_symbol);
7765
7766           expr1.X_add_number = offset_expr.X_add_number;
7767           offset_expr.X_add_number = 0;
7768
7769           if (expr1.X_add_number == 0 && breg == 0
7770               && (call || tempreg == PIC_CALL_REG))
7771             {
7772               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
7773               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
7774             }
7775           macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
7776           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7777                        tempreg, tempreg, mips_gp_register);
7778           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7779                        tempreg, lw_reloc_type, tempreg);
7780
7781           if (expr1.X_add_number == 0)
7782             ;
7783           else if (expr1.X_add_number >= -0x8000
7784                    && expr1.X_add_number < 0x8000)
7785             {
7786               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7787                            tempreg, tempreg, BFD_RELOC_LO16);
7788             }
7789           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
7790             {
7791               /* If we are going to add in a base register, and the
7792                  target register and the base register are the same,
7793                  then we are using AT as a temporary register.  Since
7794                  we want to load the constant into AT, we add our
7795                  current AT (from the global offset table) and the
7796                  register into the register now, and pretend we were
7797                  not using a base register.  */
7798               if (breg != treg)
7799                 dreg = tempreg;
7800               else
7801                 {
7802                   gas_assert (tempreg == AT);
7803                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7804                                treg, AT, breg);
7805                   dreg = treg;
7806                   add_breg_early = 1;
7807                 }
7808
7809               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7810               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
7811
7812               used_at = 1;
7813             }
7814           else
7815             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
7816
7817           relax_switch ();
7818           offset_expr.X_add_number = expr1.X_add_number;
7819           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7820                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
7821           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
7822                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
7823           if (add_breg_early)
7824             {
7825               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7826                            treg, tempreg, breg);
7827               breg = 0;
7828               tempreg = treg;
7829             }
7830           relax_end ();
7831         }
7832       else
7833         abort ();
7834
7835       if (breg != 0)
7836         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
7837       break;
7838
7839     case M_MSGSND:
7840       gas_assert (!mips_opts.micromips);
7841       {
7842         unsigned long temp = (treg << 16) | (0x01);
7843         macro_build (NULL, "c2", "C", temp);
7844       }
7845       break;
7846
7847     case M_MSGLD:
7848       gas_assert (!mips_opts.micromips);
7849       {
7850         unsigned long temp = (0x02);
7851         macro_build (NULL, "c2", "C", temp);
7852       }
7853       break;
7854
7855     case M_MSGLD_T:
7856       gas_assert (!mips_opts.micromips);
7857       {
7858         unsigned long temp = (treg << 16) | (0x02);
7859         macro_build (NULL, "c2", "C", temp);
7860       }
7861       break;
7862
7863     case M_MSGWAIT:
7864       gas_assert (!mips_opts.micromips);
7865       macro_build (NULL, "c2", "C", 3);
7866       break;
7867
7868     case M_MSGWAIT_T:
7869       gas_assert (!mips_opts.micromips);
7870       {
7871         unsigned long temp = (treg << 16) | 0x03;
7872         macro_build (NULL, "c2", "C", temp);
7873       }
7874       break;
7875
7876     case M_J_A:
7877       /* The j instruction may not be used in PIC code, since it
7878          requires an absolute address.  We convert it to a b
7879          instruction.  */
7880       if (mips_pic == NO_PIC)
7881         macro_build (&offset_expr, "j", "a");
7882       else
7883         macro_build (&offset_expr, "b", "p");
7884       break;
7885
7886       /* The jal instructions must be handled as macros because when
7887          generating PIC code they expand to multi-instruction
7888          sequences.  Normally they are simple instructions.  */
7889     case M_JALS_1:
7890       dreg = RA;
7891       /* Fall through.  */
7892     case M_JALS_2:
7893       gas_assert (mips_opts.micromips);
7894       jals = 1;
7895       goto jal;
7896     case M_JAL_1:
7897       dreg = RA;
7898       /* Fall through.  */
7899     case M_JAL_2:
7900     jal:
7901       if (mips_pic == NO_PIC)
7902         {
7903           s = jals ? "jalrs" : "jalr";
7904           if (mips_opts.micromips
7905               && dreg == RA
7906               && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
7907             macro_build (NULL, s, "mj", sreg);
7908           else
7909             macro_build (NULL, s, JALR_FMT, dreg, sreg);
7910         }
7911       else
7912         {
7913           int cprestore = (mips_pic == SVR4_PIC && !HAVE_NEWABI
7914                            && mips_cprestore_offset >= 0);
7915
7916           if (sreg != PIC_CALL_REG)
7917             as_warn (_("MIPS PIC call to register other than $25"));
7918
7919           s = (mips_opts.micromips && (!mips_opts.noreorder || cprestore)
7920                ? "jalrs" : "jalr");
7921           if (mips_opts.micromips
7922               && dreg == RA
7923               && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
7924             macro_build (NULL, s, "mj", sreg);
7925           else
7926             macro_build (NULL, s, JALR_FMT, dreg, sreg);
7927           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
7928             {
7929               if (mips_cprestore_offset < 0)
7930                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
7931               else
7932                 {
7933                   if (!mips_frame_reg_valid)
7934                     {
7935                       as_warn (_("No .frame pseudo-op used in PIC code"));
7936                       /* Quiet this warning.  */
7937                       mips_frame_reg_valid = 1;
7938                     }
7939                   if (!mips_cprestore_valid)
7940                     {
7941                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
7942                       /* Quiet this warning.  */
7943                       mips_cprestore_valid = 1;
7944                     }
7945                   if (mips_opts.noreorder)
7946                     macro_build (NULL, "nop", "");
7947                   expr1.X_add_number = mips_cprestore_offset;
7948                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
7949                                                 mips_gp_register,
7950                                                 mips_frame_reg,
7951                                                 HAVE_64BIT_ADDRESSES);
7952                 }
7953             }
7954         }
7955
7956       break;
7957
7958     case M_JALS_A:
7959       gas_assert (mips_opts.micromips);
7960       jals = 1;
7961       /* Fall through.  */
7962     case M_JAL_A:
7963       if (mips_pic == NO_PIC)
7964         macro_build (&offset_expr, jals ? "jals" : "jal", "a");
7965       else if (mips_pic == SVR4_PIC)
7966         {
7967           /* If this is a reference to an external symbol, and we are
7968              using a small GOT, we want
7969                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
7970                nop
7971                jalr     $ra,$25
7972                nop
7973                lw       $gp,cprestore($sp)
7974              The cprestore value is set using the .cprestore
7975              pseudo-op.  If we are using a big GOT, we want
7976                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
7977                addu     $25,$25,$gp
7978                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
7979                nop
7980                jalr     $ra,$25
7981                nop
7982                lw       $gp,cprestore($sp)
7983              If the symbol is not external, we want
7984                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7985                nop
7986                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
7987                jalr     $ra,$25
7988                nop
7989                lw $gp,cprestore($sp)
7990
7991              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
7992              sequences above, minus nops, unless the symbol is local,
7993              which enables us to use GOT_PAGE/GOT_OFST (big got) or
7994              GOT_DISP.  */
7995           if (HAVE_NEWABI)
7996             {
7997               if (!mips_big_got)
7998                 {
7999                   relax_start (offset_expr.X_add_symbol);
8000                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8001                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
8002                                mips_gp_register);
8003                   relax_switch ();
8004                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8005                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
8006                                mips_gp_register);
8007                   relax_end ();
8008                 }
8009               else
8010                 {
8011                   relax_start (offset_expr.X_add_symbol);
8012                   macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
8013                                BFD_RELOC_MIPS_CALL_HI16);
8014                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
8015                                PIC_CALL_REG, mips_gp_register);
8016                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8017                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
8018                                PIC_CALL_REG);
8019                   relax_switch ();
8020                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8021                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
8022                                mips_gp_register);
8023                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8024                                PIC_CALL_REG, PIC_CALL_REG,
8025                                BFD_RELOC_MIPS_GOT_OFST);
8026                   relax_end ();
8027                 }
8028
8029               macro_build_jalr (&offset_expr, 0);
8030             }
8031           else
8032             {
8033               relax_start (offset_expr.X_add_symbol);
8034               if (!mips_big_got)
8035                 {
8036                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8037                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
8038                                mips_gp_register);
8039                   load_delay_nop ();
8040                   relax_switch ();
8041                 }
8042               else
8043                 {
8044                   int gpdelay;
8045
8046                   gpdelay = reg_needs_delay (mips_gp_register);
8047                   macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
8048                                BFD_RELOC_MIPS_CALL_HI16);
8049                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
8050                                PIC_CALL_REG, mips_gp_register);
8051                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8052                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
8053                                PIC_CALL_REG);
8054                   load_delay_nop ();
8055                   relax_switch ();
8056                   if (gpdelay)
8057                     macro_build (NULL, "nop", "");
8058                 }
8059               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8060                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
8061                            mips_gp_register);
8062               load_delay_nop ();
8063               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8064                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
8065               relax_end ();
8066               macro_build_jalr (&offset_expr, mips_cprestore_offset >= 0);
8067
8068               if (mips_cprestore_offset < 0)
8069                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
8070               else
8071                 {
8072                   if (!mips_frame_reg_valid)
8073                     {
8074                       as_warn (_("No .frame pseudo-op used in PIC code"));
8075                       /* Quiet this warning.  */
8076                       mips_frame_reg_valid = 1;
8077                     }
8078                   if (!mips_cprestore_valid)
8079                     {
8080                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
8081                       /* Quiet this warning.  */
8082                       mips_cprestore_valid = 1;
8083                     }
8084                   if (mips_opts.noreorder)
8085                     macro_build (NULL, "nop", "");
8086                   expr1.X_add_number = mips_cprestore_offset;
8087                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
8088                                                 mips_gp_register,
8089                                                 mips_frame_reg,
8090                                                 HAVE_64BIT_ADDRESSES);
8091                 }
8092             }
8093         }
8094       else if (mips_pic == VXWORKS_PIC)
8095         as_bad (_("Non-PIC jump used in PIC library"));
8096       else
8097         abort ();
8098
8099       break;
8100
8101     case M_ACLR_AB:
8102       ab = 1;
8103     case M_ACLR_OB:
8104       s = "aclr";
8105       treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
8106       fmt = "\\,~(b)";
8107       off12 = 1;
8108       goto ld_st;
8109     case M_ASET_AB:
8110       ab = 1;
8111     case M_ASET_OB:
8112       s = "aset";
8113       treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
8114       fmt = "\\,~(b)";
8115       off12 = 1;
8116       goto ld_st;
8117     case M_LB_AB:
8118       ab = 1;
8119       s = "lb";
8120       fmt = "t,o(b)";
8121       goto ld;
8122     case M_LBU_AB:
8123       ab = 1;
8124       s = "lbu";
8125       fmt = "t,o(b)";
8126       goto ld;
8127     case M_LH_AB:
8128       ab = 1;
8129       s = "lh";
8130       fmt = "t,o(b)";
8131       goto ld;
8132     case M_LHU_AB:
8133       ab = 1;
8134       s = "lhu";
8135       fmt = "t,o(b)";
8136       goto ld;
8137     case M_LW_AB:
8138       ab = 1;
8139       s = "lw";
8140       fmt = "t,o(b)";
8141       goto ld;
8142     case M_LWC0_AB:
8143       ab = 1;
8144       gas_assert (!mips_opts.micromips);
8145       s = "lwc0";
8146       fmt = "E,o(b)";
8147       /* Itbl support may require additional care here.  */
8148       coproc = 1;
8149       goto ld_st;
8150     case M_LWC1_AB:
8151       ab = 1;
8152       s = "lwc1";
8153       fmt = "T,o(b)";
8154       /* Itbl support may require additional care here.  */
8155       coproc = 1;
8156       goto ld_st;
8157     case M_LWC2_AB:
8158       ab = 1;
8159     case M_LWC2_OB:
8160       s = "lwc2";
8161       fmt = COP12_FMT;
8162       off12 = mips_opts.micromips;
8163       /* Itbl support may require additional care here.  */
8164       coproc = 1;
8165       goto ld_st;
8166     case M_LWC3_AB:
8167       ab = 1;
8168       gas_assert (!mips_opts.micromips);
8169       s = "lwc3";
8170       fmt = "E,o(b)";
8171       /* Itbl support may require additional care here.  */
8172       coproc = 1;
8173       goto ld_st;
8174     case M_LWL_AB:
8175       ab = 1;
8176     case M_LWL_OB:
8177       s = "lwl";
8178       fmt = MEM12_FMT;
8179       off12 = mips_opts.micromips;
8180       goto ld_st;
8181     case M_LWR_AB:
8182       ab = 1;
8183     case M_LWR_OB:
8184       s = "lwr";
8185       fmt = MEM12_FMT;
8186       off12 = mips_opts.micromips;
8187       goto ld_st;
8188     case M_LDC1_AB:
8189       ab = 1;
8190       s = "ldc1";
8191       fmt = "T,o(b)";
8192       /* Itbl support may require additional care here.  */
8193       coproc = 1;
8194       goto ld_st;
8195     case M_LDC2_AB:
8196       ab = 1;
8197     case M_LDC2_OB:
8198       s = "ldc2";
8199       fmt = COP12_FMT;
8200       off12 = mips_opts.micromips;
8201       /* Itbl support may require additional care here.  */
8202       coproc = 1;
8203       goto ld_st;
8204     case M_LQC2_AB:
8205       ab = 1;
8206       s = "lqc2";
8207       fmt = "E,o(b)";
8208       /* Itbl support may require additional care here.  */
8209       coproc = 1;
8210       goto ld_st;
8211     case M_LDC3_AB:
8212       ab = 1;
8213       s = "ldc3";
8214       fmt = "E,o(b)";
8215       /* Itbl support may require additional care here.  */
8216       coproc = 1;
8217       goto ld_st;
8218     case M_LDL_AB:
8219       ab = 1;
8220     case M_LDL_OB:
8221       s = "ldl";
8222       fmt = MEM12_FMT;
8223       off12 = mips_opts.micromips;
8224       goto ld_st;
8225     case M_LDR_AB:
8226       ab = 1;
8227     case M_LDR_OB:
8228       s = "ldr";
8229       fmt = MEM12_FMT;
8230       off12 = mips_opts.micromips;
8231       goto ld_st;
8232     case M_LL_AB:
8233       ab = 1;
8234     case M_LL_OB:
8235       s = "ll";
8236       fmt = MEM12_FMT;
8237       off12 = mips_opts.micromips;
8238       goto ld;
8239     case M_LLD_AB:
8240       ab = 1;
8241     case M_LLD_OB:
8242       s = "lld";
8243       fmt = MEM12_FMT;
8244       off12 = mips_opts.micromips;
8245       goto ld;
8246     case M_LWU_AB:
8247       ab = 1;
8248     case M_LWU_OB:
8249       s = "lwu";
8250       fmt = MEM12_FMT;
8251       off12 = mips_opts.micromips;
8252       goto ld;
8253     case M_LWP_AB:
8254       ab = 1;
8255     case M_LWP_OB:
8256       gas_assert (mips_opts.micromips);
8257       s = "lwp";
8258       fmt = "t,~(b)";
8259       off12 = 1;
8260       lp = 1;
8261       goto ld;
8262     case M_LDP_AB:
8263       ab = 1;
8264     case M_LDP_OB:
8265       gas_assert (mips_opts.micromips);
8266       s = "ldp";
8267       fmt = "t,~(b)";
8268       off12 = 1;
8269       lp = 1;
8270       goto ld;
8271     case M_LWM_AB:
8272       ab = 1;
8273     case M_LWM_OB:
8274       gas_assert (mips_opts.micromips);
8275       s = "lwm";
8276       fmt = "n,~(b)";
8277       off12 = 1;
8278       goto ld_st;
8279     case M_LDM_AB:
8280       ab = 1;
8281     case M_LDM_OB:
8282       gas_assert (mips_opts.micromips);
8283       s = "ldm";
8284       fmt = "n,~(b)";
8285       off12 = 1;
8286       goto ld_st;
8287
8288     ld:
8289       /* We don't want to use $0 as tempreg.  */
8290       if (breg == treg + lp || treg + lp == ZERO)
8291         goto ld_st;
8292       else
8293         tempreg = treg + lp;
8294       goto ld_noat;
8295
8296     case M_SB_AB:
8297       ab = 1;
8298       s = "sb";
8299       fmt = "t,o(b)";
8300       goto ld_st;
8301     case M_SH_AB:
8302       ab = 1;
8303       s = "sh";
8304       fmt = "t,o(b)";
8305       goto ld_st;
8306     case M_SW_AB:
8307       ab = 1;
8308       s = "sw";
8309       fmt = "t,o(b)";
8310       goto ld_st;
8311     case M_SWC0_AB:
8312       ab = 1;
8313       gas_assert (!mips_opts.micromips);
8314       s = "swc0";
8315       fmt = "E,o(b)";
8316       /* Itbl support may require additional care here.  */
8317       coproc = 1;
8318       goto ld_st;
8319     case M_SWC1_AB:
8320       ab = 1;
8321       s = "swc1";
8322       fmt = "T,o(b)";
8323       /* Itbl support may require additional care here.  */
8324       coproc = 1;
8325       goto ld_st;
8326     case M_SWC2_AB:
8327       ab = 1;
8328     case M_SWC2_OB:
8329       s = "swc2";
8330       fmt = COP12_FMT;
8331       off12 = mips_opts.micromips;
8332       /* Itbl support may require additional care here.  */
8333       coproc = 1;
8334       goto ld_st;
8335     case M_SWC3_AB:
8336       ab = 1;
8337       gas_assert (!mips_opts.micromips);
8338       s = "swc3";
8339       fmt = "E,o(b)";
8340       /* Itbl support may require additional care here.  */
8341       coproc = 1;
8342       goto ld_st;
8343     case M_SWL_AB:
8344       ab = 1;
8345     case M_SWL_OB:
8346       s = "swl";
8347       fmt = MEM12_FMT;
8348       off12 = mips_opts.micromips;
8349       goto ld_st;
8350     case M_SWR_AB:
8351       ab = 1;
8352     case M_SWR_OB:
8353       s = "swr";
8354       fmt = MEM12_FMT;
8355       off12 = mips_opts.micromips;
8356       goto ld_st;
8357     case M_SC_AB:
8358       ab = 1;
8359     case M_SC_OB:
8360       s = "sc";
8361       fmt = MEM12_FMT;
8362       off12 = mips_opts.micromips;
8363       goto ld_st;
8364     case M_SCD_AB:
8365       ab = 1;
8366     case M_SCD_OB:
8367       s = "scd";
8368       fmt = MEM12_FMT;
8369       off12 = mips_opts.micromips;
8370       goto ld_st;
8371     case M_CACHE_AB:
8372       ab = 1;
8373     case M_CACHE_OB:
8374       s = "cache";
8375       fmt = mips_opts.micromips ? "k,~(b)" : "k,o(b)";
8376       off12 = mips_opts.micromips;
8377       goto ld_st;
8378     case M_PREF_AB:
8379       ab = 1;
8380     case M_PREF_OB:
8381       s = "pref";
8382       fmt = !mips_opts.micromips ? "k,o(b)" : "k,~(b)";
8383       off12 = mips_opts.micromips;
8384       goto ld_st;
8385     case M_SDC1_AB:
8386       ab = 1;
8387       s = "sdc1";
8388       fmt = "T,o(b)";
8389       coproc = 1;
8390       /* Itbl support may require additional care here.  */
8391       goto ld_st;
8392     case M_SDC2_AB:
8393       ab = 1;
8394     case M_SDC2_OB:
8395       s = "sdc2";
8396       fmt = COP12_FMT;
8397       off12 = mips_opts.micromips;
8398       /* Itbl support may require additional care here.  */
8399       coproc = 1;
8400       goto ld_st;
8401     case M_SQC2_AB:
8402       ab = 1;
8403       s = "sqc2";
8404       fmt = "E,o(b)";
8405       /* Itbl support may require additional care here.  */
8406       coproc = 1;
8407       goto ld_st;
8408     case M_SDC3_AB:
8409       ab = 1;
8410       gas_assert (!mips_opts.micromips);
8411       s = "sdc3";
8412       fmt = "E,o(b)";
8413       /* Itbl support may require additional care here.  */
8414       coproc = 1;
8415       goto ld_st;
8416     case M_SDL_AB:
8417       ab = 1;
8418     case M_SDL_OB:
8419       s = "sdl";
8420       fmt = MEM12_FMT;
8421       off12 = mips_opts.micromips;
8422       goto ld_st;
8423     case M_SDR_AB:
8424       ab = 1;
8425     case M_SDR_OB:
8426       s = "sdr";
8427       fmt = MEM12_FMT;
8428       off12 = mips_opts.micromips;
8429       goto ld_st;
8430     case M_SWP_AB:
8431       ab = 1;
8432     case M_SWP_OB:
8433       gas_assert (mips_opts.micromips);
8434       s = "swp";
8435       fmt = "t,~(b)";
8436       off12 = 1;
8437       goto ld_st;
8438     case M_SDP_AB:
8439       ab = 1;
8440     case M_SDP_OB:
8441       gas_assert (mips_opts.micromips);
8442       s = "sdp";
8443       fmt = "t,~(b)";
8444       off12 = 1;
8445       goto ld_st;
8446     case M_SWM_AB:
8447       ab = 1;
8448     case M_SWM_OB:
8449       gas_assert (mips_opts.micromips);
8450       s = "swm";
8451       fmt = "n,~(b)";
8452       off12 = 1;
8453       goto ld_st;
8454     case M_SDM_AB:
8455       ab = 1;
8456     case M_SDM_OB:
8457       gas_assert (mips_opts.micromips);
8458       s = "sdm";
8459       fmt = "n,~(b)";
8460       off12 = 1;
8461
8462     ld_st:
8463       tempreg = AT;
8464       used_at = 1;
8465     ld_noat:
8466       if (offset_expr.X_op != O_constant
8467           && offset_expr.X_op != O_symbol)
8468         {
8469           as_bad (_("Expression too complex"));
8470           offset_expr.X_op = O_constant;
8471         }
8472
8473       if (HAVE_32BIT_ADDRESSES
8474           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
8475         {
8476           char value [32];
8477
8478           sprintf_vma (value, offset_expr.X_add_number);
8479           as_bad (_("Number (0x%s) larger than 32 bits"), value);
8480         }
8481
8482       /* A constant expression in PIC code can be handled just as it
8483          is in non PIC code.  */
8484       if (offset_expr.X_op == O_constant)
8485         {
8486           int hipart = 0;
8487
8488           expr1.X_add_number = offset_expr.X_add_number;
8489           normalize_address_expr (&expr1);
8490           if (!off12 && !IS_SEXT_16BIT_NUM (expr1.X_add_number))
8491             {
8492               expr1.X_add_number = ((expr1.X_add_number + 0x8000)
8493                                     & ~(bfd_vma) 0xffff);
8494               hipart = 1;
8495             }
8496           else if (off12 && !IS_SEXT_12BIT_NUM (expr1.X_add_number))
8497             {
8498               expr1.X_add_number = ((expr1.X_add_number + 0x800)
8499                                     & ~(bfd_vma) 0xfff);
8500               hipart = 1;
8501             }
8502           if (hipart)
8503             {
8504               load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
8505               if (breg != 0)
8506                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8507                              tempreg, tempreg, breg);
8508               breg = tempreg;
8509             }
8510           if (off0)
8511             {
8512               if (offset_expr.X_add_number == 0)
8513                 tempreg = breg;
8514               else
8515                 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
8516                              "t,r,j", tempreg, breg, BFD_RELOC_LO16);
8517               macro_build (NULL, s, fmt, treg, tempreg);
8518             }
8519           else if (!off12)
8520             macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
8521           else
8522             macro_build (NULL, s, fmt,
8523                          treg, (unsigned long) offset_expr.X_add_number, breg);
8524         }
8525       else if (off12 || off0)
8526         {
8527           /* A 12-bit or 0-bit offset field is too narrow to be used
8528              for a low-part relocation, so load the whole address into
8529              the auxillary register.  In the case of "A(b)" addresses,
8530              we first load absolute address "A" into the register and
8531              then add base register "b".  In the case of "o(b)" addresses,
8532              we simply need to add 16-bit offset "o" to base register "b", and
8533              offset_reloc already contains the relocations associated
8534              with "o".  */
8535           if (ab)
8536             {
8537               load_address (tempreg, &offset_expr, &used_at);
8538               if (breg != 0)
8539                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8540                              tempreg, tempreg, breg);
8541             }
8542           else
8543             macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8544                          tempreg, breg, -1,
8545                          offset_reloc[0], offset_reloc[1], offset_reloc[2]);
8546           expr1.X_add_number = 0;
8547           if (off0)
8548             macro_build (NULL, s, fmt, treg, tempreg);
8549           else
8550             macro_build (NULL, s, fmt,
8551                          treg, (unsigned long) expr1.X_add_number, tempreg);
8552         }
8553       else if (mips_pic == NO_PIC)
8554         {
8555           /* If this is a reference to a GP relative symbol, and there
8556              is no base register, we want
8557                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
8558              Otherwise, if there is no base register, we want
8559                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
8560                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8561              If we have a constant, we need two instructions anyhow,
8562              so we always use the latter form.
8563
8564              If we have a base register, and this is a reference to a
8565              GP relative symbol, we want
8566                addu     $tempreg,$breg,$gp
8567                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
8568              Otherwise we want
8569                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
8570                addu     $tempreg,$tempreg,$breg
8571                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8572              With a constant we always use the latter case.
8573
8574              With 64bit address space and no base register and $at usable,
8575              we want
8576                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8577                lui      $at,<sym>               (BFD_RELOC_HI16_S)
8578                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8579                dsll32   $tempreg,0
8580                daddu    $tempreg,$at
8581                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8582              If we have a base register, we want
8583                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8584                lui      $at,<sym>               (BFD_RELOC_HI16_S)
8585                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8586                daddu    $at,$breg
8587                dsll32   $tempreg,0
8588                daddu    $tempreg,$at
8589                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8590
8591              Without $at we can't generate the optimal path for superscalar
8592              processors here since this would require two temporary registers.
8593                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8594                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8595                dsll     $tempreg,16
8596                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
8597                dsll     $tempreg,16
8598                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8599              If we have a base register, we want
8600                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8601                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8602                dsll     $tempreg,16
8603                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
8604                dsll     $tempreg,16
8605                daddu    $tempreg,$tempreg,$breg
8606                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8607
8608              For GP relative symbols in 64bit address space we can use
8609              the same sequence as in 32bit address space.  */
8610           if (HAVE_64BIT_SYMBOLS)
8611             {
8612               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8613                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8614                 {
8615                   relax_start (offset_expr.X_add_symbol);
8616                   if (breg == 0)
8617                     {
8618                       macro_build (&offset_expr, s, fmt, treg,
8619                                    BFD_RELOC_GPREL16, mips_gp_register);
8620                     }
8621                   else
8622                     {
8623                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8624                                    tempreg, breg, mips_gp_register);
8625                       macro_build (&offset_expr, s, fmt, treg,
8626                                    BFD_RELOC_GPREL16, tempreg);
8627                     }
8628                   relax_switch ();
8629                 }
8630
8631               if (used_at == 0 && mips_opts.at)
8632                 {
8633                   macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8634                                BFD_RELOC_MIPS_HIGHEST);
8635                   macro_build (&offset_expr, "lui", LUI_FMT, AT,
8636                                BFD_RELOC_HI16_S);
8637                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8638                                tempreg, BFD_RELOC_MIPS_HIGHER);
8639                   if (breg != 0)
8640                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
8641                   macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
8642                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
8643                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
8644                                tempreg);
8645                   used_at = 1;
8646                 }
8647               else
8648                 {
8649                   macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8650                                BFD_RELOC_MIPS_HIGHEST);
8651                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8652                                tempreg, BFD_RELOC_MIPS_HIGHER);
8653                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
8654                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8655                                tempreg, BFD_RELOC_HI16_S);
8656                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
8657                   if (breg != 0)
8658                     macro_build (NULL, "daddu", "d,v,t",
8659                                  tempreg, tempreg, breg);
8660                   macro_build (&offset_expr, s, fmt, treg,
8661                                BFD_RELOC_LO16, tempreg);
8662                 }
8663
8664               if (mips_relax.sequence)
8665                 relax_end ();
8666               break;
8667             }
8668
8669           if (breg == 0)
8670             {
8671               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8672                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8673                 {
8674                   relax_start (offset_expr.X_add_symbol);
8675                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
8676                                mips_gp_register);
8677                   relax_switch ();
8678                 }
8679               macro_build_lui (&offset_expr, tempreg);
8680               macro_build (&offset_expr, s, fmt, treg,
8681                            BFD_RELOC_LO16, tempreg);
8682               if (mips_relax.sequence)
8683                 relax_end ();
8684             }
8685           else
8686             {
8687               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8688                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8689                 {
8690                   relax_start (offset_expr.X_add_symbol);
8691                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8692                                tempreg, breg, mips_gp_register);
8693                   macro_build (&offset_expr, s, fmt, treg,
8694                                BFD_RELOC_GPREL16, tempreg);
8695                   relax_switch ();
8696                 }
8697               macro_build_lui (&offset_expr, tempreg);
8698               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8699                            tempreg, tempreg, breg);
8700               macro_build (&offset_expr, s, fmt, treg,
8701                            BFD_RELOC_LO16, tempreg);
8702               if (mips_relax.sequence)
8703                 relax_end ();
8704             }
8705         }
8706       else if (!mips_big_got)
8707         {
8708           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
8709
8710           /* If this is a reference to an external symbol, we want
8711                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8712                nop
8713                <op>     $treg,0($tempreg)
8714              Otherwise we want
8715                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8716                nop
8717                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
8718                <op>     $treg,0($tempreg)
8719
8720              For NewABI, we want
8721                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
8722                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
8723
8724              If there is a base register, we add it to $tempreg before
8725              the <op>.  If there is a constant, we stick it in the
8726              <op> instruction.  We don't handle constants larger than
8727              16 bits, because we have no way to load the upper 16 bits
8728              (actually, we could handle them for the subset of cases
8729              in which we are not using $at).  */
8730           gas_assert (offset_expr.X_op == O_symbol);
8731           if (HAVE_NEWABI)
8732             {
8733               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8734                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
8735               if (breg != 0)
8736                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8737                              tempreg, tempreg, breg);
8738               macro_build (&offset_expr, s, fmt, treg,
8739                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
8740               break;
8741             }
8742           expr1.X_add_number = offset_expr.X_add_number;
8743           offset_expr.X_add_number = 0;
8744           if (expr1.X_add_number < -0x8000
8745               || expr1.X_add_number >= 0x8000)
8746             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8747           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8748                        lw_reloc_type, mips_gp_register);
8749           load_delay_nop ();
8750           relax_start (offset_expr.X_add_symbol);
8751           relax_switch ();
8752           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
8753                        tempreg, BFD_RELOC_LO16);
8754           relax_end ();
8755           if (breg != 0)
8756             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8757                          tempreg, tempreg, breg);
8758           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8759         }
8760       else if (mips_big_got && !HAVE_NEWABI)
8761         {
8762           int gpdelay;
8763
8764           /* If this is a reference to an external symbol, we want
8765                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
8766                addu     $tempreg,$tempreg,$gp
8767                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8768                <op>     $treg,0($tempreg)
8769              Otherwise we want
8770                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8771                nop
8772                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
8773                <op>     $treg,0($tempreg)
8774              If there is a base register, we add it to $tempreg before
8775              the <op>.  If there is a constant, we stick it in the
8776              <op> instruction.  We don't handle constants larger than
8777              16 bits, because we have no way to load the upper 16 bits
8778              (actually, we could handle them for the subset of cases
8779              in which we are not using $at).  */
8780           gas_assert (offset_expr.X_op == O_symbol);
8781           expr1.X_add_number = offset_expr.X_add_number;
8782           offset_expr.X_add_number = 0;
8783           if (expr1.X_add_number < -0x8000
8784               || expr1.X_add_number >= 0x8000)
8785             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8786           gpdelay = reg_needs_delay (mips_gp_register);
8787           relax_start (offset_expr.X_add_symbol);
8788           macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8789                        BFD_RELOC_MIPS_GOT_HI16);
8790           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
8791                        mips_gp_register);
8792           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8793                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
8794           relax_switch ();
8795           if (gpdelay)
8796             macro_build (NULL, "nop", "");
8797           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8798                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
8799           load_delay_nop ();
8800           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
8801                        tempreg, BFD_RELOC_LO16);
8802           relax_end ();
8803
8804           if (breg != 0)
8805             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8806                          tempreg, tempreg, breg);
8807           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8808         }
8809       else if (mips_big_got && HAVE_NEWABI)
8810         {
8811           /* If this is a reference to an external symbol, we want
8812                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
8813                add      $tempreg,$tempreg,$gp
8814                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8815                <op>     $treg,<ofst>($tempreg)
8816              Otherwise, for local symbols, we want:
8817                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
8818                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
8819           gas_assert (offset_expr.X_op == O_symbol);
8820           expr1.X_add_number = offset_expr.X_add_number;
8821           offset_expr.X_add_number = 0;
8822           if (expr1.X_add_number < -0x8000
8823               || expr1.X_add_number >= 0x8000)
8824             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8825           relax_start (offset_expr.X_add_symbol);
8826           macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8827                        BFD_RELOC_MIPS_GOT_HI16);
8828           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
8829                        mips_gp_register);
8830           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8831                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
8832           if (breg != 0)
8833             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8834                          tempreg, tempreg, breg);
8835           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8836
8837           relax_switch ();
8838           offset_expr.X_add_number = expr1.X_add_number;
8839           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8840                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
8841           if (breg != 0)
8842             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8843                          tempreg, tempreg, breg);
8844           macro_build (&offset_expr, s, fmt, treg,
8845                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
8846           relax_end ();
8847         }
8848       else
8849         abort ();
8850
8851       break;
8852
8853     case M_LI:
8854     case M_LI_S:
8855       load_register (treg, &imm_expr, 0);
8856       break;
8857
8858     case M_DLI:
8859       load_register (treg, &imm_expr, 1);
8860       break;
8861
8862     case M_LI_SS:
8863       if (imm_expr.X_op == O_constant)
8864         {
8865           used_at = 1;
8866           load_register (AT, &imm_expr, 0);
8867           macro_build (NULL, "mtc1", "t,G", AT, treg);
8868           break;
8869         }
8870       else
8871         {
8872           gas_assert (offset_expr.X_op == O_symbol
8873                       && strcmp (segment_name (S_GET_SEGMENT
8874                                                (offset_expr.X_add_symbol)),
8875                                  ".lit4") == 0
8876                       && offset_expr.X_add_number == 0);
8877           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
8878                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8879           break;
8880         }
8881
8882     case M_LI_D:
8883       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
8884          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
8885          order 32 bits of the value and the low order 32 bits are either
8886          zero or in OFFSET_EXPR.  */
8887       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
8888         {
8889           if (HAVE_64BIT_GPRS)
8890             load_register (treg, &imm_expr, 1);
8891           else
8892             {
8893               int hreg, lreg;
8894
8895               if (target_big_endian)
8896                 {
8897                   hreg = treg;
8898                   lreg = treg + 1;
8899                 }
8900               else
8901                 {
8902                   hreg = treg + 1;
8903                   lreg = treg;
8904                 }
8905
8906               if (hreg <= 31)
8907                 load_register (hreg, &imm_expr, 0);
8908               if (lreg <= 31)
8909                 {
8910                   if (offset_expr.X_op == O_absent)
8911                     move_register (lreg, 0);
8912                   else
8913                     {
8914                       gas_assert (offset_expr.X_op == O_constant);
8915                       load_register (lreg, &offset_expr, 0);
8916                     }
8917                 }
8918             }
8919           break;
8920         }
8921
8922       /* We know that sym is in the .rdata section.  First we get the
8923          upper 16 bits of the address.  */
8924       if (mips_pic == NO_PIC)
8925         {
8926           macro_build_lui (&offset_expr, AT);
8927           used_at = 1;
8928         }
8929       else
8930         {
8931           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
8932                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
8933           used_at = 1;
8934         }
8935
8936       /* Now we load the register(s).  */
8937       if (HAVE_64BIT_GPRS)
8938         {
8939           used_at = 1;
8940           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8941         }
8942       else
8943         {
8944           used_at = 1;
8945           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8946           if (treg != RA)
8947             {
8948               /* FIXME: How in the world do we deal with the possible
8949                  overflow here?  */
8950               offset_expr.X_add_number += 4;
8951               macro_build (&offset_expr, "lw", "t,o(b)",
8952                            treg + 1, BFD_RELOC_LO16, AT);
8953             }
8954         }
8955       break;
8956
8957     case M_LI_DD:
8958       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
8959          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
8960          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
8961          the value and the low order 32 bits are either zero or in
8962          OFFSET_EXPR.  */
8963       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
8964         {
8965           used_at = 1;
8966           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
8967           if (HAVE_64BIT_FPRS)
8968             {
8969               gas_assert (HAVE_64BIT_GPRS);
8970               macro_build (NULL, "dmtc1", "t,S", AT, treg);
8971             }
8972           else
8973             {
8974               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
8975               if (offset_expr.X_op == O_absent)
8976                 macro_build (NULL, "mtc1", "t,G", 0, treg);
8977               else
8978                 {
8979                   gas_assert (offset_expr.X_op == O_constant);
8980                   load_register (AT, &offset_expr, 0);
8981                   macro_build (NULL, "mtc1", "t,G", AT, treg);
8982                 }
8983             }
8984           break;
8985         }
8986
8987       gas_assert (offset_expr.X_op == O_symbol
8988                   && offset_expr.X_add_number == 0);
8989       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
8990       if (strcmp (s, ".lit8") == 0)
8991         {
8992           if (CPU_HAS_LDC1_SDC1 (mips_opts.arch) || mips_opts.micromips)
8993             {
8994               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
8995                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8996               break;
8997             }
8998           breg = mips_gp_register;
8999           r = BFD_RELOC_MIPS_LITERAL;
9000           goto dob;
9001         }
9002       else
9003         {
9004           gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
9005           used_at = 1;
9006           if (mips_pic != NO_PIC)
9007             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9008                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
9009           else
9010             {
9011               /* FIXME: This won't work for a 64 bit address.  */
9012               macro_build_lui (&offset_expr, AT);
9013             }
9014
9015           if (CPU_HAS_LDC1_SDC1 (mips_opts.arch) || mips_opts.micromips)
9016             {
9017               macro_build (&offset_expr, "ldc1", "T,o(b)",
9018                            treg, BFD_RELOC_LO16, AT);
9019               break;
9020             }
9021           breg = AT;
9022           r = BFD_RELOC_LO16;
9023           goto dob;
9024         }
9025
9026     case M_L_DOB:
9027       /* Even on a big endian machine $fn comes before $fn+1.  We have
9028          to adjust when loading from memory.  */
9029       r = BFD_RELOC_LO16;
9030     dob:
9031       gas_assert (!mips_opts.micromips);
9032       gas_assert (!CPU_HAS_LDC1_SDC1 (mips_opts.arch));
9033       macro_build (&offset_expr, "lwc1", "T,o(b)",
9034                    target_big_endian ? treg + 1 : treg, r, breg);
9035       /* FIXME: A possible overflow which I don't know how to deal
9036          with.  */
9037       offset_expr.X_add_number += 4;
9038       macro_build (&offset_expr, "lwc1", "T,o(b)",
9039                    target_big_endian ? treg : treg + 1, r, breg);
9040       break;
9041
9042     case M_S_DOB:
9043       gas_assert (!mips_opts.micromips);
9044       gas_assert (!CPU_HAS_LDC1_SDC1 (mips_opts.arch));
9045       /* Even on a big endian machine $fn comes before $fn+1.  We have
9046          to adjust when storing to memory.  */
9047       macro_build (&offset_expr, "swc1", "T,o(b)",
9048                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
9049       offset_expr.X_add_number += 4;
9050       macro_build (&offset_expr, "swc1", "T,o(b)",
9051                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
9052       break;
9053
9054     case M_L_DAB:
9055       gas_assert (!mips_opts.micromips);
9056       /*
9057        * The MIPS assembler seems to check for X_add_number not
9058        * being double aligned and generating:
9059        *        lui     at,%hi(foo+1)
9060        *        addu    at,at,v1
9061        *        addiu   at,at,%lo(foo+1)
9062        *        lwc1    f2,0(at)
9063        *        lwc1    f3,4(at)
9064        * But, the resulting address is the same after relocation so why
9065        * generate the extra instruction?
9066        */
9067       /* Itbl support may require additional care here.  */
9068       coproc = 1;
9069       fmt = "T,o(b)";
9070       if (CPU_HAS_LDC1_SDC1 (mips_opts.arch))
9071         {
9072           s = "ldc1";
9073           goto ld_st;
9074         }
9075       s = "lwc1";
9076       goto ldd_std;
9077
9078     case M_S_DAB:
9079       gas_assert (!mips_opts.micromips);
9080       /* Itbl support may require additional care here.  */
9081       coproc = 1;
9082       fmt = "T,o(b)";
9083       if (CPU_HAS_LDC1_SDC1 (mips_opts.arch))
9084         {
9085           s = "sdc1";
9086           goto ld_st;
9087         }
9088       s = "swc1";
9089       goto ldd_std;
9090
9091     case M_LQ_AB:
9092       fmt = "t,o(b)";
9093       s = "lq";
9094       goto ld;
9095
9096     case M_SQ_AB:
9097       fmt = "t,o(b)";
9098       s = "sq";
9099       goto ld_st;
9100
9101     case M_LD_AB:
9102       fmt = "t,o(b)";
9103       if (HAVE_64BIT_GPRS)
9104         {
9105           s = "ld";
9106           goto ld;
9107         }
9108       s = "lw";
9109       goto ldd_std;
9110
9111     case M_SD_AB:
9112       fmt = "t,o(b)";
9113       if (HAVE_64BIT_GPRS)
9114         {
9115           s = "sd";
9116           goto ld_st;
9117         }
9118       s = "sw";
9119
9120     ldd_std:
9121       if (offset_expr.X_op != O_symbol
9122           && offset_expr.X_op != O_constant)
9123         {
9124           as_bad (_("Expression too complex"));
9125           offset_expr.X_op = O_constant;
9126         }
9127
9128       if (HAVE_32BIT_ADDRESSES
9129           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
9130         {
9131           char value [32];
9132
9133           sprintf_vma (value, offset_expr.X_add_number);
9134           as_bad (_("Number (0x%s) larger than 32 bits"), value);
9135         }
9136
9137       /* Even on a big endian machine $fn comes before $fn+1.  We have
9138          to adjust when loading from memory.  We set coproc if we must
9139          load $fn+1 first.  */
9140       /* Itbl support may require additional care here.  */
9141       if (!target_big_endian)
9142         coproc = 0;
9143
9144       if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
9145         {
9146           /* If this is a reference to a GP relative symbol, we want
9147                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
9148                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
9149              If we have a base register, we use this
9150                addu     $at,$breg,$gp
9151                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
9152                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
9153              If this is not a GP relative symbol, we want
9154                lui      $at,<sym>               (BFD_RELOC_HI16_S)
9155                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
9156                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
9157              If there is a base register, we add it to $at after the
9158              lui instruction.  If there is a constant, we always use
9159              the last case.  */
9160           if (offset_expr.X_op == O_symbol
9161               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
9162               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
9163             {
9164               relax_start (offset_expr.X_add_symbol);
9165               if (breg == 0)
9166                 {
9167                   tempreg = mips_gp_register;
9168                 }
9169               else
9170                 {
9171                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9172                                AT, breg, mips_gp_register);
9173                   tempreg = AT;
9174                   used_at = 1;
9175                 }
9176
9177               /* Itbl support may require additional care here.  */
9178               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9179                            BFD_RELOC_GPREL16, tempreg);
9180               offset_expr.X_add_number += 4;
9181
9182               /* Set mips_optimize to 2 to avoid inserting an
9183                  undesired nop.  */
9184               hold_mips_optimize = mips_optimize;
9185               mips_optimize = 2;
9186               /* Itbl support may require additional care here.  */
9187               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9188                            BFD_RELOC_GPREL16, tempreg);
9189               mips_optimize = hold_mips_optimize;
9190
9191               relax_switch ();
9192
9193               offset_expr.X_add_number -= 4;
9194             }
9195           used_at = 1;
9196           macro_build_lui (&offset_expr, AT);
9197           if (breg != 0)
9198             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9199           /* Itbl support may require additional care here.  */
9200           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9201                        BFD_RELOC_LO16, AT);
9202           /* FIXME: How do we handle overflow here?  */
9203           offset_expr.X_add_number += 4;
9204           /* Itbl support may require additional care here.  */
9205           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9206                        BFD_RELOC_LO16, AT);
9207           if (mips_relax.sequence)
9208             relax_end ();
9209         }
9210       else if (!mips_big_got)
9211         {
9212           /* If this is a reference to an external symbol, we want
9213                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
9214                nop
9215                <op>     $treg,0($at)
9216                <op>     $treg+1,4($at)
9217              Otherwise we want
9218                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
9219                nop
9220                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
9221                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
9222              If there is a base register we add it to $at before the
9223              lwc1 instructions.  If there is a constant we include it
9224              in the lwc1 instructions.  */
9225           used_at = 1;
9226           expr1.X_add_number = offset_expr.X_add_number;
9227           if (expr1.X_add_number < -0x8000
9228               || expr1.X_add_number >= 0x8000 - 4)
9229             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9230           load_got_offset (AT, &offset_expr);
9231           load_delay_nop ();
9232           if (breg != 0)
9233             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9234
9235           /* Set mips_optimize to 2 to avoid inserting an undesired
9236              nop.  */
9237           hold_mips_optimize = mips_optimize;
9238           mips_optimize = 2;
9239
9240           /* Itbl support may require additional care here.  */
9241           relax_start (offset_expr.X_add_symbol);
9242           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9243                        BFD_RELOC_LO16, AT);
9244           expr1.X_add_number += 4;
9245           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9246                        BFD_RELOC_LO16, AT);
9247           relax_switch ();
9248           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9249                        BFD_RELOC_LO16, AT);
9250           offset_expr.X_add_number += 4;
9251           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9252                        BFD_RELOC_LO16, AT);
9253           relax_end ();
9254
9255           mips_optimize = hold_mips_optimize;
9256         }
9257       else if (mips_big_got)
9258         {
9259           int gpdelay;
9260
9261           /* If this is a reference to an external symbol, we want
9262                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
9263                addu     $at,$at,$gp
9264                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
9265                nop
9266                <op>     $treg,0($at)
9267                <op>     $treg+1,4($at)
9268              Otherwise we want
9269                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
9270                nop
9271                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
9272                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
9273              If there is a base register we add it to $at before the
9274              lwc1 instructions.  If there is a constant we include it
9275              in the lwc1 instructions.  */
9276           used_at = 1;
9277           expr1.X_add_number = offset_expr.X_add_number;
9278           offset_expr.X_add_number = 0;
9279           if (expr1.X_add_number < -0x8000
9280               || expr1.X_add_number >= 0x8000 - 4)
9281             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9282           gpdelay = reg_needs_delay (mips_gp_register);
9283           relax_start (offset_expr.X_add_symbol);
9284           macro_build (&offset_expr, "lui", LUI_FMT,
9285                        AT, BFD_RELOC_MIPS_GOT_HI16);
9286           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9287                        AT, AT, mips_gp_register);
9288           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
9289                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
9290           load_delay_nop ();
9291           if (breg != 0)
9292             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9293           /* Itbl support may require additional care here.  */
9294           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9295                        BFD_RELOC_LO16, AT);
9296           expr1.X_add_number += 4;
9297
9298           /* Set mips_optimize to 2 to avoid inserting an undesired
9299              nop.  */
9300           hold_mips_optimize = mips_optimize;
9301           mips_optimize = 2;
9302           /* Itbl support may require additional care here.  */
9303           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9304                        BFD_RELOC_LO16, AT);
9305           mips_optimize = hold_mips_optimize;
9306           expr1.X_add_number -= 4;
9307
9308           relax_switch ();
9309           offset_expr.X_add_number = expr1.X_add_number;
9310           if (gpdelay)
9311             macro_build (NULL, "nop", "");
9312           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9313                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
9314           load_delay_nop ();
9315           if (breg != 0)
9316             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9317           /* Itbl support may require additional care here.  */
9318           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9319                        BFD_RELOC_LO16, AT);
9320           offset_expr.X_add_number += 4;
9321
9322           /* Set mips_optimize to 2 to avoid inserting an undesired
9323              nop.  */
9324           hold_mips_optimize = mips_optimize;
9325           mips_optimize = 2;
9326           /* Itbl support may require additional care here.  */
9327           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9328                        BFD_RELOC_LO16, AT);
9329           mips_optimize = hold_mips_optimize;
9330           relax_end ();
9331         }
9332       else
9333         abort ();
9334
9335       break;
9336
9337     case M_LD_OB:
9338       s = HAVE_64BIT_GPRS ? "ld" : "lw";
9339       goto sd_ob;
9340     case M_SD_OB:
9341       s = HAVE_64BIT_GPRS ? "sd" : "sw";
9342     sd_ob:
9343       macro_build (&offset_expr, s, "t,o(b)", treg,
9344                    -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9345                    breg);
9346       if (!HAVE_64BIT_GPRS)
9347         {
9348           offset_expr.X_add_number += 4;
9349           macro_build (&offset_expr, s, "t,o(b)", treg + 1,
9350                        -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9351                        breg);
9352         }
9353       break;
9354
9355         
9356     case M_SAA_AB:
9357       ab = 1;
9358     case M_SAA_OB:
9359       s = "saa";
9360       off0 = 1;
9361       fmt = "t,(b)";
9362       goto ld_st;
9363     case M_SAAD_AB:
9364       ab = 1;
9365     case M_SAAD_OB:
9366       s = "saad";
9367       off0 = 1;
9368       fmt = "t,(b)";
9369       goto ld_st;
9370
9371    /* New code added to support COPZ instructions.
9372       This code builds table entries out of the macros in mip_opcodes.
9373       R4000 uses interlocks to handle coproc delays.
9374       Other chips (like the R3000) require nops to be inserted for delays.
9375
9376       FIXME: Currently, we require that the user handle delays.
9377       In order to fill delay slots for non-interlocked chips,
9378       we must have a way to specify delays based on the coprocessor.
9379       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
9380       What are the side-effects of the cop instruction?
9381       What cache support might we have and what are its effects?
9382       Both coprocessor & memory require delays. how long???
9383       What registers are read/set/modified?
9384
9385       If an itbl is provided to interpret cop instructions,
9386       this knowledge can be encoded in the itbl spec.  */
9387
9388     case M_COP0:
9389       s = "c0";
9390       goto copz;
9391     case M_COP1:
9392       s = "c1";
9393       goto copz;
9394     case M_COP2:
9395       s = "c2";
9396       goto copz;
9397     case M_COP3:
9398       s = "c3";
9399     copz:
9400       gas_assert (!mips_opts.micromips);
9401       /* For now we just do C (same as Cz).  The parameter will be
9402          stored in insn_opcode by mips_ip.  */
9403       macro_build (NULL, s, "C", ip->insn_opcode);
9404       break;
9405
9406     case M_MOVE:
9407       move_register (dreg, sreg);
9408       break;
9409
9410     case M_DMUL:
9411       dbl = 1;
9412     case M_MUL:
9413       if (mips_opts.arch == CPU_R5900)
9414         {
9415           macro_build (NULL, dbl ? "dmultu" : "multu", "d,s,t", dreg, sreg, treg);
9416         }
9417       else
9418         {
9419       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
9420       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9421         }
9422       break;
9423
9424     case M_DMUL_I:
9425       dbl = 1;
9426     case M_MUL_I:
9427       /* The MIPS assembler some times generates shifts and adds.  I'm
9428          not trying to be that fancy. GCC should do this for us
9429          anyway.  */
9430       used_at = 1;
9431       load_register (AT, &imm_expr, dbl);
9432       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
9433       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9434       break;
9435
9436     case M_DMULO_I:
9437       dbl = 1;
9438     case M_MULO_I:
9439       imm = 1;
9440       goto do_mulo;
9441
9442     case M_DMULO:
9443       dbl = 1;
9444     case M_MULO:
9445     do_mulo:
9446       start_noreorder ();
9447       used_at = 1;
9448       if (imm)
9449         load_register (AT, &imm_expr, dbl);
9450       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
9451       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9452       macro_build (NULL, dbl ? "dsra32" : "sra", SHFT_FMT, dreg, dreg, RA);
9453       macro_build (NULL, "mfhi", MFHL_FMT, AT);
9454       if (mips_trap)
9455         macro_build (NULL, "tne", TRAP_FMT, dreg, AT, 6);
9456       else
9457         {
9458           if (mips_opts.micromips)
9459             micromips_label_expr (&label_expr);
9460           else
9461             label_expr.X_add_number = 8;
9462           macro_build (&label_expr, "beq", "s,t,p", dreg, AT);
9463           macro_build (NULL, "nop", "");
9464           macro_build (NULL, "break", BRK_FMT, 6);
9465           if (mips_opts.micromips)
9466             micromips_add_label ();
9467         }
9468       end_noreorder ();
9469       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9470       break;
9471
9472     case M_DMULOU_I:
9473       dbl = 1;
9474     case M_MULOU_I:
9475       imm = 1;
9476       goto do_mulou;
9477
9478     case M_DMULOU:
9479       dbl = 1;
9480     case M_MULOU:
9481     do_mulou:
9482       start_noreorder ();
9483       used_at = 1;
9484       if (imm)
9485         load_register (AT, &imm_expr, dbl);
9486       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
9487                    sreg, imm ? AT : treg);
9488       macro_build (NULL, "mfhi", MFHL_FMT, AT);
9489       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9490       if (mips_trap)
9491         macro_build (NULL, "tne", TRAP_FMT, AT, ZERO, 6);
9492       else
9493         {
9494           if (mips_opts.micromips)
9495             micromips_label_expr (&label_expr);
9496           else
9497             label_expr.X_add_number = 8;
9498           macro_build (&label_expr, "beq", "s,t,p", AT, ZERO);
9499           macro_build (NULL, "nop", "");
9500           macro_build (NULL, "break", BRK_FMT, 6);
9501           if (mips_opts.micromips)
9502             micromips_add_label ();
9503         }
9504       end_noreorder ();
9505       break;
9506
9507     case M_DROL:
9508       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9509         {
9510           if (dreg == sreg)
9511             {
9512               tempreg = AT;
9513               used_at = 1;
9514             }
9515           else
9516             {
9517               tempreg = dreg;
9518             }
9519           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
9520           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
9521           break;
9522         }
9523       used_at = 1;
9524       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9525       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
9526       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
9527       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9528       break;
9529
9530     case M_ROL:
9531       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9532         {
9533           if (dreg == sreg)
9534             {
9535               tempreg = AT;
9536               used_at = 1;
9537             }
9538           else
9539             {
9540               tempreg = dreg;
9541             }
9542           macro_build (NULL, "negu", "d,w", tempreg, treg);
9543           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
9544           break;
9545         }
9546       used_at = 1;
9547       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
9548       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
9549       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
9550       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9551       break;
9552
9553     case M_DROL_I:
9554       {
9555         unsigned int rot;
9556         char *l;
9557         char *rr;
9558
9559         if (imm_expr.X_op != O_constant)
9560           as_bad (_("Improper rotate count"));
9561         rot = imm_expr.X_add_number & 0x3f;
9562         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9563           {
9564             rot = (64 - rot) & 0x3f;
9565             if (rot >= 32)
9566               macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
9567             else
9568               macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
9569             break;
9570           }
9571         if (rot == 0)
9572           {
9573             macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
9574             break;
9575           }
9576         l = (rot < 0x20) ? "dsll" : "dsll32";
9577         rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
9578         rot &= 0x1f;
9579         used_at = 1;
9580         macro_build (NULL, l, SHFT_FMT, AT, sreg, rot);
9581         macro_build (NULL, rr, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9582         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9583       }
9584       break;
9585
9586     case M_ROL_I:
9587       {
9588         unsigned int rot;
9589
9590         if (imm_expr.X_op != O_constant)
9591           as_bad (_("Improper rotate count"));
9592         rot = imm_expr.X_add_number & 0x1f;
9593         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9594           {
9595             macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, (32 - rot) & 0x1f);
9596             break;
9597           }
9598         if (rot == 0)
9599           {
9600             macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
9601             break;
9602           }
9603         used_at = 1;
9604         macro_build (NULL, "sll", SHFT_FMT, AT, sreg, rot);
9605         macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9606         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9607       }
9608       break;
9609
9610     case M_DROR:
9611       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9612         {
9613           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
9614           break;
9615         }
9616       used_at = 1;
9617       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9618       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
9619       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
9620       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9621       break;
9622
9623     case M_ROR:
9624       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9625         {
9626           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
9627           break;
9628         }
9629       used_at = 1;
9630       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
9631       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
9632       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
9633       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9634       break;
9635
9636     case M_DROR_I:
9637       {
9638         unsigned int rot;
9639         char *l;
9640         char *rr;
9641
9642         if (imm_expr.X_op != O_constant)
9643           as_bad (_("Improper rotate count"));
9644         rot = imm_expr.X_add_number & 0x3f;
9645         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9646           {
9647             if (rot >= 32)
9648               macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
9649             else
9650               macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
9651             break;
9652           }
9653         if (rot == 0)
9654           {
9655             macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
9656             break;
9657           }
9658         rr = (rot < 0x20) ? "dsrl" : "dsrl32";
9659         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
9660         rot &= 0x1f;
9661         used_at = 1;
9662         macro_build (NULL, rr, SHFT_FMT, AT, sreg, rot);
9663         macro_build (NULL, l, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9664         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9665       }
9666       break;
9667
9668     case M_ROR_I:
9669       {
9670         unsigned int rot;
9671
9672         if (imm_expr.X_op != O_constant)
9673           as_bad (_("Improper rotate count"));
9674         rot = imm_expr.X_add_number & 0x1f;
9675         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9676           {
9677             macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, rot);
9678             break;
9679           }
9680         if (rot == 0)
9681           {
9682             macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
9683             break;
9684           }
9685         used_at = 1;
9686         macro_build (NULL, "srl", SHFT_FMT, AT, sreg, rot);
9687         macro_build (NULL, "sll", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9688         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9689       }
9690       break;
9691
9692     case M_SEQ:
9693       if (sreg == 0)
9694         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
9695       else if (treg == 0)
9696         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9697       else
9698         {
9699           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
9700           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
9701         }
9702       break;
9703
9704     case M_SEQ_I:
9705       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
9706         {
9707           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9708           break;
9709         }
9710       if (sreg == 0)
9711         {
9712           as_warn (_("Instruction %s: result is always false"),
9713                    ip->insn_mo->name);
9714           move_register (dreg, 0);
9715           break;
9716         }
9717       if (CPU_HAS_SEQ (mips_opts.arch)
9718           && -512 <= imm_expr.X_add_number
9719           && imm_expr.X_add_number < 512)
9720         {
9721           macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
9722                        (int) imm_expr.X_add_number);
9723           break;
9724         }
9725       if (imm_expr.X_op == O_constant
9726           && imm_expr.X_add_number >= 0
9727           && imm_expr.X_add_number < 0x10000)
9728         {
9729           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
9730         }
9731       else if (imm_expr.X_op == O_constant
9732                && imm_expr.X_add_number > -0x8000
9733                && imm_expr.X_add_number < 0)
9734         {
9735           imm_expr.X_add_number = -imm_expr.X_add_number;
9736           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
9737                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9738         }
9739       else if (CPU_HAS_SEQ (mips_opts.arch))
9740         {
9741           used_at = 1;
9742           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9743           macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
9744           break;
9745         }
9746       else
9747         {
9748           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9749           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
9750           used_at = 1;
9751         }
9752       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
9753       break;
9754
9755     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
9756       s = "slt";
9757       goto sge;
9758     case M_SGEU:
9759       s = "sltu";
9760     sge:
9761       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
9762       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9763       break;
9764
9765     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
9766     case M_SGEU_I:
9767       if (imm_expr.X_op == O_constant
9768           && imm_expr.X_add_number >= -0x8000
9769           && imm_expr.X_add_number < 0x8000)
9770         {
9771           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
9772                        dreg, sreg, BFD_RELOC_LO16);
9773         }
9774       else
9775         {
9776           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9777           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
9778                        dreg, sreg, AT);
9779           used_at = 1;
9780         }
9781       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9782       break;
9783
9784     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
9785       s = "slt";
9786       goto sgt;
9787     case M_SGTU:
9788       s = "sltu";
9789     sgt:
9790       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
9791       break;
9792
9793     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
9794       s = "slt";
9795       goto sgti;
9796     case M_SGTU_I:
9797       s = "sltu";
9798     sgti:
9799       used_at = 1;
9800       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9801       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
9802       break;
9803
9804     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
9805       s = "slt";
9806       goto sle;
9807     case M_SLEU:
9808       s = "sltu";
9809     sle:
9810       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
9811       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9812       break;
9813
9814     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
9815       s = "slt";
9816       goto slei;
9817     case M_SLEU_I:
9818       s = "sltu";
9819     slei:
9820       used_at = 1;
9821       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9822       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
9823       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9824       break;
9825
9826     case M_SLT_I:
9827       if (imm_expr.X_op == O_constant
9828           && imm_expr.X_add_number >= -0x8000
9829           && imm_expr.X_add_number < 0x8000)
9830         {
9831           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9832           break;
9833         }
9834       used_at = 1;
9835       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9836       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
9837       break;
9838
9839     case M_SLTU_I:
9840       if (imm_expr.X_op == O_constant
9841           && imm_expr.X_add_number >= -0x8000
9842           && imm_expr.X_add_number < 0x8000)
9843         {
9844           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
9845                        BFD_RELOC_LO16);
9846           break;
9847         }
9848       used_at = 1;
9849       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9850       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
9851       break;
9852
9853     case M_SNE:
9854       if (sreg == 0)
9855         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
9856       else if (treg == 0)
9857         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
9858       else
9859         {
9860           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
9861           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
9862         }
9863       break;
9864
9865     case M_SNE_I:
9866       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
9867         {
9868           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
9869           break;
9870         }
9871       if (sreg == 0)
9872         {
9873           as_warn (_("Instruction %s: result is always true"),
9874                    ip->insn_mo->name);
9875           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
9876                        dreg, 0, BFD_RELOC_LO16);
9877           break;
9878         }
9879       if (CPU_HAS_SEQ (mips_opts.arch)
9880           && -512 <= imm_expr.X_add_number
9881           && imm_expr.X_add_number < 512)
9882         {
9883           macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
9884                        (int) imm_expr.X_add_number);
9885           break;
9886         }
9887       if (imm_expr.X_op == O_constant
9888           && imm_expr.X_add_number >= 0
9889           && imm_expr.X_add_number < 0x10000)
9890         {
9891           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
9892         }
9893       else if (imm_expr.X_op == O_constant
9894                && imm_expr.X_add_number > -0x8000
9895                && imm_expr.X_add_number < 0)
9896         {
9897           imm_expr.X_add_number = -imm_expr.X_add_number;
9898           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
9899                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9900         }
9901       else if (CPU_HAS_SEQ (mips_opts.arch))
9902         {
9903           used_at = 1;
9904           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9905           macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
9906           break;
9907         }
9908       else
9909         {
9910           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9911           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
9912           used_at = 1;
9913         }
9914       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
9915       break;
9916
9917     case M_SUB_I:
9918       s = "addi";
9919       s2 = "sub";
9920       goto do_subi;
9921     case M_SUBU_I:
9922       s = "addiu";
9923       s2 = "subu";
9924       goto do_subi;
9925     case M_DSUB_I:
9926       dbl = 1;
9927       s = "daddi";
9928       s2 = "dsub";
9929       if (!mips_opts.micromips)
9930         goto do_subi;
9931       if (imm_expr.X_op == O_constant
9932           && imm_expr.X_add_number > -0x200
9933           && imm_expr.X_add_number <= 0x200)
9934         {
9935           macro_build (NULL, s, "t,r,.", dreg, sreg, -imm_expr.X_add_number);
9936           break;
9937         }
9938       goto do_subi_i;
9939     case M_DSUBU_I:
9940       dbl = 1;
9941       s = "daddiu";
9942       s2 = "dsubu";
9943     do_subi:
9944       if (imm_expr.X_op == O_constant
9945           && imm_expr.X_add_number > -0x8000
9946           && imm_expr.X_add_number <= 0x8000)
9947         {
9948           imm_expr.X_add_number = -imm_expr.X_add_number;
9949           macro_build (&imm_expr, s, "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9950           break;
9951         }
9952     do_subi_i:
9953       used_at = 1;
9954       load_register (AT, &imm_expr, dbl);
9955       macro_build (NULL, s2, "d,v,t", dreg, sreg, AT);
9956       break;
9957
9958     case M_TEQ_I:
9959       s = "teq";
9960       goto trap;
9961     case M_TGE_I:
9962       s = "tge";
9963       goto trap;
9964     case M_TGEU_I:
9965       s = "tgeu";
9966       goto trap;
9967     case M_TLT_I:
9968       s = "tlt";
9969       goto trap;
9970     case M_TLTU_I:
9971       s = "tltu";
9972       goto trap;
9973     case M_TNE_I:
9974       s = "tne";
9975     trap:
9976       used_at = 1;
9977       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9978       macro_build (NULL, s, "s,t", sreg, AT);
9979       break;
9980
9981     case M_TRUNCWS:
9982     case M_TRUNCWD:
9983       gas_assert (!mips_opts.micromips);
9984       gas_assert (mips_opts.isa == ISA_MIPS1);
9985       used_at = 1;
9986       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
9987       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
9988
9989       /*
9990        * Is the double cfc1 instruction a bug in the mips assembler;
9991        * or is there a reason for it?
9992        */
9993       start_noreorder ();
9994       macro_build (NULL, "cfc1", "t,G", treg, RA);
9995       macro_build (NULL, "cfc1", "t,G", treg, RA);
9996       macro_build (NULL, "nop", "");
9997       expr1.X_add_number = 3;
9998       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
9999       expr1.X_add_number = 2;
10000       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
10001       macro_build (NULL, "ctc1", "t,G", AT, RA);
10002       macro_build (NULL, "nop", "");
10003       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
10004                    dreg, sreg);
10005       macro_build (NULL, "ctc1", "t,G", treg, RA);
10006       macro_build (NULL, "nop", "");
10007       end_noreorder ();
10008       break;
10009
10010     case M_ULH_A:
10011       ab = 1;
10012     case M_ULH:
10013       s = "lb";
10014       s2 = "lbu";
10015       off = 1;
10016       goto uld_st;
10017     case M_ULHU_A:
10018       ab = 1;
10019     case M_ULHU:
10020       s = "lbu";
10021       s2 = "lbu";
10022       off = 1;
10023       goto uld_st;
10024     case M_ULW_A:
10025       ab = 1;
10026     case M_ULW:
10027       s = "lwl";
10028       s2 = "lwr";
10029       off12 = mips_opts.micromips;
10030       off = 3;
10031       goto uld_st;
10032     case M_ULD_A:
10033       ab = 1;
10034     case M_ULD:
10035       s = "ldl";
10036       s2 = "ldr";
10037       off12 = mips_opts.micromips;
10038       off = 7;
10039       goto uld_st;
10040     case M_USH_A:
10041       ab = 1;
10042     case M_USH:
10043       s = "sb";
10044       s2 = "sb";
10045       off = 1;
10046       ust = 1;
10047       goto uld_st;
10048     case M_USW_A:
10049       ab = 1;
10050     case M_USW:
10051       s = "swl";
10052       s2 = "swr";
10053       off12 = mips_opts.micromips;
10054       off = 3;
10055       ust = 1;
10056       goto uld_st;
10057     case M_USD_A:
10058       ab = 1;
10059     case M_USD:
10060       s = "sdl";
10061       s2 = "sdr";
10062       off12 = mips_opts.micromips;
10063       off = 7;
10064       ust = 1;
10065
10066     uld_st:
10067       if (!ab && offset_expr.X_add_number >= 0x8000 - off)
10068         as_bad (_("Operand overflow"));
10069
10070       ep = &offset_expr;
10071       expr1.X_add_number = 0;
10072       if (ab)
10073         {
10074           used_at = 1;
10075           tempreg = AT;
10076           load_address (tempreg, ep, &used_at);
10077           if (breg != 0)
10078             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
10079                          tempreg, tempreg, breg);
10080           breg = tempreg;
10081           tempreg = treg;
10082           ep = &expr1;
10083         }
10084       else if (off12
10085                && (offset_expr.X_op != O_constant
10086                    || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number)
10087                    || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number + off)))
10088         {
10089           used_at = 1;
10090           tempreg = AT;
10091           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", tempreg, breg,
10092                        -1, offset_reloc[0], offset_reloc[1], offset_reloc[2]);
10093           breg = tempreg;
10094           tempreg = treg;
10095           ep = &expr1;
10096         }
10097       else if (!ust && treg == breg)
10098         {
10099           used_at = 1;
10100           tempreg = AT;
10101         }
10102       else
10103         tempreg = treg;
10104
10105       if (off == 1)
10106         goto ulh_sh;
10107
10108       if (!target_big_endian)
10109         ep->X_add_number += off;
10110       if (!off12)
10111         macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10112       else
10113         macro_build (NULL, s, "t,~(b)",
10114                      tempreg, (unsigned long) ep->X_add_number, breg);
10115
10116       if (!target_big_endian)
10117         ep->X_add_number -= off;
10118       else
10119         ep->X_add_number += off;
10120       if (!off12)
10121         macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10122       else
10123         macro_build (NULL, s2, "t,~(b)",
10124                      tempreg, (unsigned long) ep->X_add_number, breg);
10125
10126       /* If necessary, move the result in tempreg to the final destination.  */
10127       if (!ust && treg != tempreg)
10128         {
10129           /* Protect second load's delay slot.  */
10130           load_delay_nop ();
10131           move_register (treg, tempreg);
10132         }
10133       break;
10134
10135     ulh_sh:
10136       used_at = 1;
10137       if (target_big_endian == ust)
10138         ep->X_add_number += off;
10139       tempreg = ust || ab ? treg : AT;
10140       macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10141
10142       /* For halfword transfers we need a temporary register to shuffle
10143          bytes.  Unfortunately for M_USH_A we have none available before
10144          the next store as AT holds the base address.  We deal with this
10145          case by clobbering TREG and then restoring it as with ULH.  */
10146       tempreg = ust == ab ? treg : AT;
10147       if (ust)
10148         macro_build (NULL, "srl", SHFT_FMT, tempreg, treg, 8);
10149
10150       if (target_big_endian == ust)
10151         ep->X_add_number -= off;
10152       else
10153         ep->X_add_number += off;
10154       macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10155
10156       /* For M_USH_A re-retrieve the LSB.  */
10157       if (ust && ab)
10158         {
10159           if (target_big_endian)
10160             ep->X_add_number += off;
10161           else
10162             ep->X_add_number -= off;
10163           macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
10164         }
10165       /* For ULH and M_USH_A OR the LSB in.  */
10166       if (!ust || ab)
10167         {
10168           tempreg = !ab ? AT : treg;
10169           macro_build (NULL, "sll", SHFT_FMT, tempreg, tempreg, 8);
10170           macro_build (NULL, "or", "d,v,t", treg, treg, AT);
10171         }
10172       break;
10173
10174     default:
10175       /* FIXME: Check if this is one of the itbl macros, since they
10176          are added dynamically.  */
10177       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
10178       break;
10179     }
10180   if (!mips_opts.at && used_at)
10181     as_bad (_("Macro used $at after \".set noat\""));
10182 }
10183
10184 /* Implement macros in mips16 mode.  */
10185
10186 static void
10187 mips16_macro (struct mips_cl_insn *ip)
10188 {
10189   int mask;
10190   int xreg, yreg, zreg, tmp;
10191   expressionS expr1;
10192   int dbl;
10193   const char *s, *s2, *s3;
10194
10195   mask = ip->insn_mo->mask;
10196
10197   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
10198   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
10199   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
10200
10201   expr1.X_op = O_constant;
10202   expr1.X_op_symbol = NULL;
10203   expr1.X_add_symbol = NULL;
10204   expr1.X_add_number = 1;
10205
10206   dbl = 0;
10207
10208   switch (mask)
10209     {
10210     default:
10211       abort ();
10212
10213     case M_DDIV_3:
10214       dbl = 1;
10215     case M_DIV_3:
10216       s = "mflo";
10217       goto do_div3;
10218     case M_DREM_3:
10219       dbl = 1;
10220     case M_REM_3:
10221       s = "mfhi";
10222     do_div3:
10223       start_noreorder ();
10224       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
10225       expr1.X_add_number = 2;
10226       macro_build (&expr1, "bnez", "x,p", yreg);
10227       macro_build (NULL, "break", "6", 7);
10228
10229       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
10230          since that causes an overflow.  We should do that as well,
10231          but I don't see how to do the comparisons without a temporary
10232          register.  */
10233       end_noreorder ();
10234       macro_build (NULL, s, "x", zreg);
10235       break;
10236
10237     case M_DIVU_3:
10238       s = "divu";
10239       s2 = "mflo";
10240       goto do_divu3;
10241     case M_REMU_3:
10242       s = "divu";
10243       s2 = "mfhi";
10244       goto do_divu3;
10245     case M_DDIVU_3:
10246       s = "ddivu";
10247       s2 = "mflo";
10248       goto do_divu3;
10249     case M_DREMU_3:
10250       s = "ddivu";
10251       s2 = "mfhi";
10252     do_divu3:
10253       start_noreorder ();
10254       macro_build (NULL, s, "0,x,y", xreg, yreg);
10255       expr1.X_add_number = 2;
10256       macro_build (&expr1, "bnez", "x,p", yreg);
10257       macro_build (NULL, "break", "6", 7);
10258       end_noreorder ();
10259       macro_build (NULL, s2, "x", zreg);
10260       break;
10261
10262     case M_DMUL:
10263       dbl = 1;
10264     case M_MUL:
10265       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
10266       macro_build (NULL, "mflo", "x", zreg);
10267       break;
10268
10269     case M_DSUBU_I:
10270       dbl = 1;
10271       goto do_subu;
10272     case M_SUBU_I:
10273     do_subu:
10274       if (imm_expr.X_op != O_constant)
10275         as_bad (_("Unsupported large constant"));
10276       imm_expr.X_add_number = -imm_expr.X_add_number;
10277       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
10278       break;
10279
10280     case M_SUBU_I_2:
10281       if (imm_expr.X_op != O_constant)
10282         as_bad (_("Unsupported large constant"));
10283       imm_expr.X_add_number = -imm_expr.X_add_number;
10284       macro_build (&imm_expr, "addiu", "x,k", xreg);
10285       break;
10286
10287     case M_DSUBU_I_2:
10288       if (imm_expr.X_op != O_constant)
10289         as_bad (_("Unsupported large constant"));
10290       imm_expr.X_add_number = -imm_expr.X_add_number;
10291       macro_build (&imm_expr, "daddiu", "y,j", yreg);
10292       break;
10293
10294     case M_BEQ:
10295       s = "cmp";
10296       s2 = "bteqz";
10297       goto do_branch;
10298     case M_BNE:
10299       s = "cmp";
10300       s2 = "btnez";
10301       goto do_branch;
10302     case M_BLT:
10303       s = "slt";
10304       s2 = "btnez";
10305       goto do_branch;
10306     case M_BLTU:
10307       s = "sltu";
10308       s2 = "btnez";
10309       goto do_branch;
10310     case M_BLE:
10311       s = "slt";
10312       s2 = "bteqz";
10313       goto do_reverse_branch;
10314     case M_BLEU:
10315       s = "sltu";
10316       s2 = "bteqz";
10317       goto do_reverse_branch;
10318     case M_BGE:
10319       s = "slt";
10320       s2 = "bteqz";
10321       goto do_branch;
10322     case M_BGEU:
10323       s = "sltu";
10324       s2 = "bteqz";
10325       goto do_branch;
10326     case M_BGT:
10327       s = "slt";
10328       s2 = "btnez";
10329       goto do_reverse_branch;
10330     case M_BGTU:
10331       s = "sltu";
10332       s2 = "btnez";
10333
10334     do_reverse_branch:
10335       tmp = xreg;
10336       xreg = yreg;
10337       yreg = tmp;
10338
10339     do_branch:
10340       macro_build (NULL, s, "x,y", xreg, yreg);
10341       macro_build (&offset_expr, s2, "p");
10342       break;
10343
10344     case M_BEQ_I:
10345       s = "cmpi";
10346       s2 = "bteqz";
10347       s3 = "x,U";
10348       goto do_branch_i;
10349     case M_BNE_I:
10350       s = "cmpi";
10351       s2 = "btnez";
10352       s3 = "x,U";
10353       goto do_branch_i;
10354     case M_BLT_I:
10355       s = "slti";
10356       s2 = "btnez";
10357       s3 = "x,8";
10358       goto do_branch_i;
10359     case M_BLTU_I:
10360       s = "sltiu";
10361       s2 = "btnez";
10362       s3 = "x,8";
10363       goto do_branch_i;
10364     case M_BLE_I:
10365       s = "slti";
10366       s2 = "btnez";
10367       s3 = "x,8";
10368       goto do_addone_branch_i;
10369     case M_BLEU_I:
10370       s = "sltiu";
10371       s2 = "btnez";
10372       s3 = "x,8";
10373       goto do_addone_branch_i;
10374     case M_BGE_I:
10375       s = "slti";
10376       s2 = "bteqz";
10377       s3 = "x,8";
10378       goto do_branch_i;
10379     case M_BGEU_I:
10380       s = "sltiu";
10381       s2 = "bteqz";
10382       s3 = "x,8";
10383       goto do_branch_i;
10384     case M_BGT_I:
10385       s = "slti";
10386       s2 = "bteqz";
10387       s3 = "x,8";
10388       goto do_addone_branch_i;
10389     case M_BGTU_I:
10390       s = "sltiu";
10391       s2 = "bteqz";
10392       s3 = "x,8";
10393
10394     do_addone_branch_i:
10395       if (imm_expr.X_op != O_constant)
10396         as_bad (_("Unsupported large constant"));
10397       ++imm_expr.X_add_number;
10398
10399     do_branch_i:
10400       macro_build (&imm_expr, s, s3, xreg);
10401       macro_build (&offset_expr, s2, "p");
10402       break;
10403
10404     case M_ABS:
10405       expr1.X_add_number = 0;
10406       macro_build (&expr1, "slti", "x,8", yreg);
10407       if (xreg != yreg)
10408         move_register (xreg, yreg);
10409       expr1.X_add_number = 2;
10410       macro_build (&expr1, "bteqz", "p");
10411       macro_build (NULL, "neg", "x,w", xreg, xreg);
10412     }
10413 }
10414
10415 /* For consistency checking, verify that all bits are specified either
10416    by the match/mask part of the instruction definition, or by the
10417    operand list.  */
10418 static int
10419 validate_mips_insn (const struct mips_opcode *opc)
10420 {
10421   const char *p = opc->args;
10422   char c;
10423   unsigned long used_bits = opc->mask;
10424
10425   if ((used_bits & opc->match) != opc->match)
10426     {
10427       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
10428               opc->name, opc->args);
10429       return 0;
10430     }
10431 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
10432   while (*p)
10433     switch (c = *p++)
10434       {
10435       case ',': break;
10436       case '(': break;
10437       case ')': break;
10438       case '+':
10439         switch (c = *p++)
10440           {
10441           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
10442           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
10443           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
10444           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
10445           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
10446           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
10447           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10448           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
10449                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
10450           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
10451           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
10452           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10453           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10454           case 'I': break;
10455           case 'J': USE_BITS (OP_MASK_CODE10,   OP_SH_CODE10);  break;
10456           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
10457           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
10458                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
10459           case 'x': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
10460           case 'X': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
10461           case 'p': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
10462           case 'P': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
10463           case 'Q': USE_BITS (OP_MASK_SEQI,     OP_SH_SEQI);    break;
10464           case 's': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
10465           case 'S': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
10466           case 'z': USE_BITS (OP_MASK_RZ,       OP_SH_RZ);      break;
10467           case 'Z': USE_BITS (OP_MASK_FZ,       OP_SH_FZ);      break;
10468           case 'a': USE_BITS (OP_MASK_OFFSET_A, OP_SH_OFFSET_A); break;
10469           case 'b': USE_BITS (OP_MASK_OFFSET_B, OP_SH_OFFSET_B); break;
10470           case 'c': USE_BITS (OP_MASK_OFFSET_C, OP_SH_OFFSET_C); break;
10471
10472           default:
10473             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
10474                     c, opc->name, opc->args);
10475             return 0;
10476           }
10477         break;
10478       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10479       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10480       case 'A': break;
10481       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
10482       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
10483       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
10484       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10485       case 'F': break;
10486       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10487       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
10488       case 'I': break;
10489       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
10490       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10491       case 'L': break;
10492       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
10493       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
10494       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
10495       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
10496                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10497       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
10498       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10499       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10500       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10501       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10502       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
10503       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10504       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10505       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
10506       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10507       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
10508       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10509       case 'f': break;
10510       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
10511       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
10512       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10513       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
10514       case 'l': break;
10515       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10516       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10517       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
10518       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10519       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10520       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10521       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
10522       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10523       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10524       case 'x': break;
10525       case 'z': break;
10526       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
10527       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
10528                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10529       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
10530       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
10531       case '[': break;
10532       case ']': break;
10533       case '1': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10534       case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
10535       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
10536       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
10537       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
10538       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10539       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
10540       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
10541       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
10542       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
10543       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
10544       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
10545       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
10546       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
10547       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
10548       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
10549       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
10550       case '\\': USE_BITS (OP_MASK_3BITPOS,     OP_SH_3BITPOS); break;
10551       case '~': USE_BITS (OP_MASK_OFFSET12,     OP_SH_OFFSET12); break;
10552       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10553       default:
10554         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
10555                 c, opc->name, opc->args);
10556         return 0;
10557       }
10558 #undef USE_BITS
10559   if (used_bits != 0xffffffff)
10560     {
10561       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
10562               ~used_bits & 0xffffffff, opc->name, opc->args);
10563       return 0;
10564     }
10565   return 1;
10566 }
10567
10568 /* For consistency checking, verify that the length implied matches the
10569    major opcode and that all bits are specified either by the match/mask
10570    part of the instruction definition, or by the operand list.  */
10571
10572 static int
10573 validate_micromips_insn (const struct mips_opcode *opc)
10574 {
10575   unsigned long match = opc->match;
10576   unsigned long mask = opc->mask;
10577   const char *p = opc->args;
10578   unsigned long insn_bits;
10579   unsigned long used_bits;
10580   unsigned long major;
10581   unsigned int length;
10582   char e;
10583   char c;
10584
10585   if ((mask & match) != match)
10586     {
10587       as_bad (_("Internal error: bad microMIPS opcode (mask error): %s %s"),
10588               opc->name, opc->args);
10589       return 0;
10590     }
10591   length = micromips_insn_length (opc);
10592   if (length != 2 && length != 4)
10593     {
10594       as_bad (_("Internal error: bad microMIPS opcode (incorrect length: %u): "
10595                 "%s %s"), length, opc->name, opc->args);
10596       return 0;
10597     }
10598   major = match >> (10 + 8 * (length - 2));
10599   if ((length == 2 && (major & 7) != 1 && (major & 6) != 2)
10600       || (length == 4 && (major & 7) != 0 && (major & 4) != 4))
10601     {
10602       as_bad (_("Internal error: bad microMIPS opcode "
10603                 "(opcode/length mismatch): %s %s"), opc->name, opc->args);
10604       return 0;
10605     }
10606
10607   /* Shift piecewise to avoid an overflow where unsigned long is 32-bit.  */
10608   insn_bits = 1 << 4 * length;
10609   insn_bits <<= 4 * length;
10610   insn_bits -= 1;
10611   used_bits = mask;
10612 #define USE_BITS(field) \
10613   (used_bits |= MICROMIPSOP_MASK_##field << MICROMIPSOP_SH_##field)
10614   while (*p)
10615     switch (c = *p++)
10616       {
10617       case ',': break;
10618       case '(': break;
10619       case ')': break;
10620       case '+':
10621         e = c;
10622         switch (c = *p++)
10623           {
10624           case 'A': USE_BITS (EXTLSB);  break;
10625           case 'B': USE_BITS (INSMSB);  break;
10626           case 'C': USE_BITS (EXTMSBD); break;
10627           case 'D': USE_BITS (RS);      USE_BITS (SEL); break;
10628           case 'E': USE_BITS (EXTLSB);  break;
10629           case 'F': USE_BITS (INSMSB);  break;
10630           case 'G': USE_BITS (EXTMSBD); break;
10631           case 'H': USE_BITS (EXTMSBD); break;
10632           default:
10633             as_bad (_("Internal error: bad mips opcode "
10634                       "(unknown extension operand type `%c%c'): %s %s"),
10635                     e, c, opc->name, opc->args);
10636             return 0;
10637           }
10638         break;
10639       case 'm':
10640         e = c;
10641         switch (c = *p++)
10642           {
10643           case 'A': USE_BITS (IMMA);    break;
10644           case 'B': USE_BITS (IMMB);    break;
10645           case 'C': USE_BITS (IMMC);    break;
10646           case 'D': USE_BITS (IMMD);    break;
10647           case 'E': USE_BITS (IMME);    break;
10648           case 'F': USE_BITS (IMMF);    break;
10649           case 'G': USE_BITS (IMMG);    break;
10650           case 'H': USE_BITS (IMMH);    break;
10651           case 'I': USE_BITS (IMMI);    break;
10652           case 'J': USE_BITS (IMMJ);    break;
10653           case 'L': USE_BITS (IMML);    break;
10654           case 'M': USE_BITS (IMMM);    break;
10655           case 'N': USE_BITS (IMMN);    break;
10656           case 'O': USE_BITS (IMMO);    break;
10657           case 'P': USE_BITS (IMMP);    break;
10658           case 'Q': USE_BITS (IMMQ);    break;
10659           case 'U': USE_BITS (IMMU);    break;
10660           case 'W': USE_BITS (IMMW);    break;
10661           case 'X': USE_BITS (IMMX);    break;
10662           case 'Y': USE_BITS (IMMY);    break;
10663           case 'Z': break;
10664           case 'a': break;
10665           case 'b': USE_BITS (MB);      break;
10666           case 'c': USE_BITS (MC);      break;
10667           case 'd': USE_BITS (MD);      break;
10668           case 'e': USE_BITS (ME);      break;
10669           case 'f': USE_BITS (MF);      break;
10670           case 'g': USE_BITS (MG);      break;
10671           case 'h': USE_BITS (MH);      break;
10672           case 'i': USE_BITS (MI);      break;
10673           case 'j': USE_BITS (MJ);      break;
10674           case 'l': USE_BITS (ML);      break;
10675           case 'm': USE_BITS (MM);      break;
10676           case 'n': USE_BITS (MN);      break;
10677           case 'p': USE_BITS (MP);      break;
10678           case 'q': USE_BITS (MQ);      break;
10679           case 'r': break;
10680           case 's': break;
10681           case 't': break;
10682           case 'x': break;
10683           case 'y': break;
10684           case 'z': break;
10685           default:
10686             as_bad (_("Internal error: bad mips opcode "
10687                       "(unknown extension operand type `%c%c'): %s %s"),
10688                     e, c, opc->name, opc->args);
10689             return 0;
10690           }
10691         break;
10692       case '.': USE_BITS (OFFSET10);    break;
10693       case '1': USE_BITS (STYPE);       break;
10694       case '2': USE_BITS (BP);          break;
10695       case '3': USE_BITS (SA3);         break;
10696       case '4': USE_BITS (SA4);         break;
10697       case '5': USE_BITS (IMM8);        break;
10698       case '6': USE_BITS (RS);          break;
10699       case '7': USE_BITS (DSPACC);      break;
10700       case '8': USE_BITS (WRDSP);       break;
10701       case '0': USE_BITS (DSPSFT);      break;
10702       case '<': USE_BITS (SHAMT);       break;
10703       case '>': USE_BITS (SHAMT);       break;
10704       case '@': USE_BITS (IMM10);       break;
10705       case 'B': USE_BITS (CODE10);      break;
10706       case 'C': USE_BITS (COPZ);        break;
10707       case 'D': USE_BITS (FD);          break;
10708       case 'E': USE_BITS (RT);          break;
10709       case 'G': USE_BITS (RS);          break;
10710       case 'H': USE_BITS (SEL);         break;
10711       case 'K': USE_BITS (RS);          break;
10712       case 'M': USE_BITS (CCC);         break;
10713       case 'N': USE_BITS (BCC);         break;
10714       case 'R': USE_BITS (FR);          break;
10715       case 'S': USE_BITS (FS);          break;
10716       case 'T': USE_BITS (FT);          break;
10717       case 'V': USE_BITS (FS);          break;
10718       case '\\': USE_BITS (3BITPOS);    break;
10719       case '^': USE_BITS (RD);          break;
10720       case 'a': USE_BITS (TARGET);      break;
10721       case 'b': USE_BITS (RS);          break;
10722       case 'c': USE_BITS (CODE);        break;
10723       case 'd': USE_BITS (RD);          break;
10724       case 'h': USE_BITS (PREFX);       break;
10725       case 'i': USE_BITS (IMMEDIATE);   break;
10726       case 'j': USE_BITS (DELTA);       break;
10727       case 'k': USE_BITS (CACHE);       break;
10728       case 'n': USE_BITS (RT);          break;
10729       case 'o': USE_BITS (DELTA);       break;
10730       case 'p': USE_BITS (DELTA);       break;
10731       case 'q': USE_BITS (CODE2);       break;
10732       case 'r': USE_BITS (RS);          break;
10733       case 's': USE_BITS (RS);          break;
10734       case 't': USE_BITS (RT);          break;
10735       case 'u': USE_BITS (IMMEDIATE);   break;
10736       case 'v': USE_BITS (RS);          break;
10737       case 'w': USE_BITS (RT);          break;
10738       case 'y': USE_BITS (RS3);         break;
10739       case 'z': break;
10740       case '|': USE_BITS (TRAP);        break;
10741       case '~': USE_BITS (OFFSET12);    break;
10742       default:
10743         as_bad (_("Internal error: bad microMIPS opcode "
10744                   "(unknown operand type `%c'): %s %s"),
10745                 c, opc->name, opc->args);
10746         return 0;
10747       }
10748 #undef USE_BITS
10749   if (used_bits != insn_bits)
10750     {
10751       if (~used_bits & insn_bits)
10752         as_bad (_("Internal error: bad microMIPS opcode "
10753                   "(bits 0x%lx undefined): %s %s"),
10754                 ~used_bits & insn_bits, opc->name, opc->args);
10755       if (used_bits & ~insn_bits)
10756         as_bad (_("Internal error: bad microMIPS opcode "
10757                   "(bits 0x%lx defined): %s %s"),
10758                 used_bits & ~insn_bits, opc->name, opc->args);
10759       return 0;
10760     }
10761   return 1;
10762 }
10763
10764 /* UDI immediates.  */
10765 struct mips_immed {
10766   char          type;
10767   unsigned int  shift;
10768   unsigned long mask;
10769   const char *  desc;
10770 };
10771
10772 static const struct mips_immed mips_immed[] = {
10773   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
10774   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
10775   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
10776   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
10777   { 0,0,0,0 }
10778 };
10779
10780 /* Check whether an odd floating-point register is allowed.  */
10781 static int
10782 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
10783 {
10784   const char *s = insn->name;
10785
10786   if (insn->pinfo == INSN_MACRO)
10787     /* Let a macro pass, we'll catch it later when it is expanded.  */
10788     return 1;
10789
10790   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa) || (mips_opts.arch == CPU_R5900))
10791     {
10792       /* Allow odd registers for single-precision ops.  */
10793       switch (insn->pinfo & (FP_S | FP_D))
10794         {
10795         case FP_S:
10796         case 0:
10797           return 1;     /* both single precision - ok */
10798         case FP_D:
10799           return 0;     /* both double precision - fail */
10800         default:
10801           break;
10802         }
10803
10804       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
10805       s = strchr (insn->name, '.');
10806       if (argnum == 2)
10807         s = s != NULL ? strchr (s + 1, '.') : NULL;
10808       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
10809     } 
10810
10811   /* Single-precision coprocessor loads and moves are OK too.  */
10812   if ((insn->pinfo & FP_S)
10813       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
10814                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
10815     return 1;
10816
10817   return 0;
10818 }
10819
10820 /* Check if EXPR is a constant between MIN (inclusive) and MAX (exclusive)
10821    taking bits from BIT up.  */
10822 static int
10823 expr_const_in_range (expressionS *ep, offsetT min, offsetT max, int bit)
10824 {
10825   return (ep->X_op == O_constant
10826           && (ep->X_add_number & ((1 << bit) - 1)) == 0
10827           && ep->X_add_number >= min << bit
10828           && ep->X_add_number < max << bit);
10829 }
10830
10831 /* This routine assembles an instruction into its binary format.  As a
10832    side effect, it sets one of the global variables imm_reloc or
10833    offset_reloc to the type of relocation to do if one of the operands
10834    is an address expression.  */
10835
10836 static void
10837 mips_ip (char *str, struct mips_cl_insn *ip)
10838 {
10839   bfd_boolean wrong_delay_slot_insns = FALSE;
10840   bfd_boolean need_delay_slot_ok = TRUE;
10841   struct mips_opcode *firstinsn = NULL;
10842   const struct mips_opcode *past;
10843   struct hash_control *hash;
10844   char *s;
10845   const char *args;
10846   char c = 0;
10847   struct mips_opcode *insn;
10848   char *argsStart;
10849   unsigned int regno;
10850   unsigned int lastregno;
10851   unsigned int destregno = 0;
10852   unsigned int lastpos = 0;
10853   unsigned int limlo, limhi;
10854   int sizelo;
10855   char *s_reset;
10856   offsetT min_range, max_range;
10857   long opend;
10858   char *name;
10859   int argnum;
10860   unsigned int rtype;
10861   char *dot;
10862   long end;
10863
10864   insn_error = NULL;
10865
10866   if (mips_opts.micromips)
10867     {
10868       hash = micromips_op_hash;
10869       past = &micromips_opcodes[bfd_micromips_num_opcodes];
10870     }
10871   else
10872     {
10873       hash = op_hash;
10874       past = &mips_opcodes[NUMOPCODES];
10875     }
10876   forced_insn_length = 0;
10877   insn = NULL;
10878
10879   /* We first try to match an instruction up to a space or to the end.  */
10880   for (end = 0; str[end] != '\0' && !ISSPACE (str[end]); end++)
10881     continue;
10882
10883   /* Make a copy of the instruction so that we can fiddle with it.  */
10884   name = alloca (end + 1);
10885   memcpy (name, str, end);
10886   name[end] = '\0';
10887
10888   for (;;)
10889     {
10890       insn = (struct mips_opcode *) hash_find (hash, name);
10891
10892       if (insn != NULL || !mips_opts.micromips)
10893         break;
10894       if (forced_insn_length)
10895         break;
10896
10897       /* See if there's an instruction size override suffix,
10898          either `16' or `32', at the end of the mnemonic proper,
10899          that defines the operation, i.e. before the first `.'
10900          character if any.  Strip it and retry.  */
10901       dot = strchr (name, '.');
10902       opend = dot != NULL ? dot - name : end;
10903       if (opend < 3)
10904         break;
10905       if (name[opend - 2] == '1' && name[opend - 1] == '6')
10906         forced_insn_length = 2;
10907       else if (name[opend - 2] == '3' && name[opend - 1] == '2')
10908         forced_insn_length = 4;
10909       else
10910         break;
10911       memcpy (name + opend - 2, name + opend, end - opend + 1);
10912     }
10913   if (insn == NULL)
10914     {
10915       insn_error = _("Unrecognized opcode");
10916       return;
10917     }
10918
10919   /* For microMIPS instructions placed in a fixed-length branch delay slot
10920      we make up to two passes over the relevant fragment of the opcode
10921      table.  First we try instructions that meet the delay slot's length
10922      requirement.  If none matched, then we retry with the remaining ones
10923      and if one matches, then we use it and then issue an appropriate
10924      warning later on.  */
10925   argsStart = s = str + end;
10926   for (;;)
10927     {
10928       bfd_boolean delay_slot_ok;
10929       bfd_boolean size_ok;
10930       bfd_boolean ok;
10931
10932       gas_assert (strcmp (insn->name, name) == 0);
10933
10934       ok = is_opcode_valid (insn);
10935       size_ok = is_size_valid (insn);
10936       delay_slot_ok = is_delay_slot_valid (insn);
10937       if (!delay_slot_ok && !wrong_delay_slot_insns)
10938         {
10939           firstinsn = insn;
10940           wrong_delay_slot_insns = TRUE;
10941         }
10942       if (!ok || !size_ok || delay_slot_ok != need_delay_slot_ok)
10943         {
10944           static char buf[256];
10945
10946           if (insn + 1 < past && strcmp (insn->name, insn[1].name) == 0)
10947             {
10948               ++insn;
10949               continue;
10950             }
10951           if (wrong_delay_slot_insns && need_delay_slot_ok)
10952             {
10953               gas_assert (firstinsn);
10954               need_delay_slot_ok = FALSE;
10955               past = insn + 1;
10956               insn = firstinsn;
10957               continue;
10958             }
10959
10960           if (insn_error)
10961             return;
10962
10963           if (!ok)
10964             sprintf (buf, _("Opcode not supported on this processor: %s (%s)"),
10965                      mips_cpu_info_from_arch (mips_opts.arch)->name,
10966                      mips_cpu_info_from_isa (mips_opts.isa)->name);
10967           else
10968             sprintf (buf, _("Unrecognized %u-bit version of microMIPS opcode"),
10969                      8 * forced_insn_length);
10970           insn_error = buf;
10971
10972           return;
10973         }
10974
10975       create_insn (ip, insn);
10976       insn_error = NULL;
10977       argnum = 1;
10978       lastregno = 0xffffffff;
10979       for (args = insn->args;; ++args)
10980         {
10981           int is_mdmx;
10982
10983           s += strspn (s, " \t");
10984           is_mdmx = 0;
10985           switch (*args)
10986             {
10987             case '\0':          /* end of args */
10988               if (*s == '\0')
10989                 return;
10990               break;
10991
10992             case '2':
10993               /* DSP 2-bit unsigned immediate in bit 11 (for standard MIPS
10994                  code) or 14 (for microMIPS code).  */
10995               my_getExpression (&imm_expr, s);
10996               check_absolute_expr (ip, &imm_expr);
10997               if ((unsigned long) imm_expr.X_add_number != 1
10998                   && (unsigned long) imm_expr.X_add_number != 3)
10999                 {
11000                   as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
11001                           (unsigned long) imm_expr.X_add_number);
11002                 }
11003               INSERT_OPERAND (mips_opts.micromips,
11004                               BP, *ip, imm_expr.X_add_number);
11005               imm_expr.X_op = O_absent;
11006               s = expr_end;
11007               continue;
11008
11009             case '3':
11010               /* DSP 3-bit unsigned immediate in bit 13 (for standard MIPS
11011                  code) or 21 (for microMIPS code).  */
11012               {
11013                 unsigned long mask = (mips_opts.micromips
11014                                       ? MICROMIPSOP_MASK_SA3 : OP_MASK_SA3);
11015
11016                 my_getExpression (&imm_expr, s);
11017                 check_absolute_expr (ip, &imm_expr);
11018                 if ((unsigned long) imm_expr.X_add_number > mask)
11019                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11020                           mask, (unsigned long) imm_expr.X_add_number);
11021                 INSERT_OPERAND (mips_opts.micromips,
11022                                 SA3, *ip, imm_expr.X_add_number);
11023                 imm_expr.X_op = O_absent;
11024                 s = expr_end;
11025               }
11026               continue;
11027
11028             case '4':
11029               /* DSP 4-bit unsigned immediate in bit 12 (for standard MIPS
11030                  code) or 21 (for microMIPS code).  */
11031               {
11032                 unsigned long mask = (mips_opts.micromips
11033                                       ? MICROMIPSOP_MASK_SA4 : OP_MASK_SA4);
11034
11035                 my_getExpression (&imm_expr, s);
11036                 check_absolute_expr (ip, &imm_expr);
11037                 if ((unsigned long) imm_expr.X_add_number > mask)
11038                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11039                           mask, (unsigned long) imm_expr.X_add_number);
11040                 INSERT_OPERAND (mips_opts.micromips,
11041                                 SA4, *ip, imm_expr.X_add_number);
11042                 imm_expr.X_op = O_absent;
11043                 s = expr_end;
11044               }
11045               continue;
11046
11047             case '5':
11048               /* DSP 8-bit unsigned immediate in bit 13 (for standard MIPS
11049                  code) or 16 (for microMIPS code).  */
11050               {
11051                 unsigned long mask = (mips_opts.micromips
11052                                       ? MICROMIPSOP_MASK_IMM8 : OP_MASK_IMM8);
11053
11054                 my_getExpression (&imm_expr, s);
11055                 check_absolute_expr (ip, &imm_expr);
11056                 if ((unsigned long) imm_expr.X_add_number > mask)
11057                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11058                           mask, (unsigned long) imm_expr.X_add_number);
11059                 INSERT_OPERAND (mips_opts.micromips,
11060                                 IMM8, *ip, imm_expr.X_add_number);
11061                 imm_expr.X_op = O_absent;
11062                 s = expr_end;
11063               }
11064               continue;
11065
11066             case '6':
11067               /* DSP 5-bit unsigned immediate in bit 16 (for standard MIPS
11068                  code) or 21 (for microMIPS code).  */
11069               {
11070                 unsigned long mask = (mips_opts.micromips
11071                                       ? MICROMIPSOP_MASK_RS : OP_MASK_RS);
11072
11073                 my_getExpression (&imm_expr, s);
11074                 check_absolute_expr (ip, &imm_expr);
11075                 if ((unsigned long) imm_expr.X_add_number > mask)
11076                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11077                           mask, (unsigned long) imm_expr.X_add_number);
11078                 INSERT_OPERAND (mips_opts.micromips,
11079                                 RS, *ip, imm_expr.X_add_number);
11080                 imm_expr.X_op = O_absent;
11081                 s = expr_end;
11082               }
11083               continue;
11084
11085             case '7': /* Four DSP accumulators in bits 11,12.  */
11086               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c'
11087                   && s[3] >= '0' && s[3] <= '3')
11088                 {
11089                   regno = s[3] - '0';
11090                   s += 4;
11091                   INSERT_OPERAND (mips_opts.micromips, DSPACC, *ip, regno);
11092                   continue;
11093                 }
11094               else
11095                 as_bad (_("Invalid dsp acc register"));
11096               break;
11097
11098             case '8':
11099               /* DSP 6-bit unsigned immediate in bit 11 (for standard MIPS
11100                  code) or 14 (for microMIPS code).  */
11101               {
11102                 unsigned long mask = (mips_opts.micromips
11103                                       ? MICROMIPSOP_MASK_WRDSP
11104                                       : OP_MASK_WRDSP);
11105
11106                 my_getExpression (&imm_expr, s);
11107                 check_absolute_expr (ip, &imm_expr);
11108                 if ((unsigned long) imm_expr.X_add_number > mask)
11109                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11110                           mask, (unsigned long) imm_expr.X_add_number);
11111                 INSERT_OPERAND (mips_opts.micromips,
11112                                 WRDSP, *ip, imm_expr.X_add_number);
11113                 imm_expr.X_op = O_absent;
11114                 s = expr_end;
11115               }
11116               continue;
11117
11118             case '9': /* Four DSP accumulators in bits 21,22.  */
11119               gas_assert (!mips_opts.micromips);
11120               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c'
11121                   && s[3] >= '0' && s[3] <= '3')
11122                 {
11123                   regno = s[3] - '0';
11124                   s += 4;
11125                   INSERT_OPERAND (0, DSPACC_S, *ip, regno);
11126                   continue;
11127                 }
11128               else
11129                 as_bad (_("Invalid dsp acc register"));
11130               break;
11131
11132             case '0':
11133               /* DSP 6-bit signed immediate in bit 16 (for standard MIPS
11134                  code) or 20 (for microMIPS code).  */
11135               {
11136                 long mask = (mips_opts.micromips
11137                              ? MICROMIPSOP_MASK_DSPSFT : OP_MASK_DSPSFT);
11138
11139                 my_getExpression (&imm_expr, s);
11140                 check_absolute_expr (ip, &imm_expr);
11141                 min_range = -((mask + 1) >> 1);
11142                 max_range = ((mask + 1) >> 1) - 1;
11143                 if (imm_expr.X_add_number < min_range
11144                     || imm_expr.X_add_number > max_range)
11145                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11146                           (long) min_range, (long) max_range,
11147                           (long) imm_expr.X_add_number);
11148                 INSERT_OPERAND (mips_opts.micromips,
11149                                 DSPSFT, *ip, imm_expr.X_add_number);
11150                 imm_expr.X_op = O_absent;
11151                 s = expr_end;
11152               }
11153               continue;
11154
11155             case '\'': /* DSP 6-bit unsigned immediate in bit 16.  */
11156               gas_assert (!mips_opts.micromips);
11157               my_getExpression (&imm_expr, s);
11158               check_absolute_expr (ip, &imm_expr);
11159               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
11160                 {
11161                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
11162                           OP_MASK_RDDSP,
11163                           (unsigned long) imm_expr.X_add_number);
11164                 }
11165               INSERT_OPERAND (0, RDDSP, *ip, imm_expr.X_add_number);
11166               imm_expr.X_op = O_absent;
11167               s = expr_end;
11168               continue;
11169
11170             case ':': /* DSP 7-bit signed immediate in bit 19.  */
11171               gas_assert (!mips_opts.micromips);
11172               my_getExpression (&imm_expr, s);
11173               check_absolute_expr (ip, &imm_expr);
11174               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
11175               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
11176               if (imm_expr.X_add_number < min_range ||
11177                   imm_expr.X_add_number > max_range)
11178                 {
11179                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11180                           (long) min_range, (long) max_range,
11181                           (long) imm_expr.X_add_number);
11182                 }
11183               INSERT_OPERAND (0, DSPSFT_7, *ip, imm_expr.X_add_number);
11184               imm_expr.X_op = O_absent;
11185               s = expr_end;
11186               continue;
11187
11188             case '@': /* DSP 10-bit signed immediate in bit 16.  */
11189               {
11190                 long mask = (mips_opts.micromips
11191                              ? MICROMIPSOP_MASK_IMM10 : OP_MASK_IMM10);
11192
11193                 my_getExpression (&imm_expr, s);
11194                 check_absolute_expr (ip, &imm_expr);
11195                 min_range = -((mask + 1) >> 1);
11196                 max_range = ((mask + 1) >> 1) - 1;
11197                 if (imm_expr.X_add_number < min_range
11198                     || imm_expr.X_add_number > max_range)
11199                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11200                           (long) min_range, (long) max_range,
11201                           (long) imm_expr.X_add_number);
11202                 INSERT_OPERAND (mips_opts.micromips,
11203                                 IMM10, *ip, imm_expr.X_add_number);
11204                 imm_expr.X_op = O_absent;
11205                 s = expr_end;
11206               }
11207               continue;
11208
11209             case '^': /* DSP 5-bit unsigned immediate in bit 11.  */
11210               gas_assert (mips_opts.micromips);
11211               my_getExpression (&imm_expr, s);
11212               check_absolute_expr (ip, &imm_expr);
11213               if (imm_expr.X_add_number & ~MICROMIPSOP_MASK_RD)
11214                 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
11215                         MICROMIPSOP_MASK_RD,
11216                         (unsigned long) imm_expr.X_add_number);
11217               INSERT_OPERAND (1, RD, *ip, imm_expr.X_add_number);
11218               imm_expr.X_op = O_absent;
11219               s = expr_end;
11220               continue;
11221
11222             case '!': /* MT usermode flag bit.  */
11223               gas_assert (!mips_opts.micromips);
11224               my_getExpression (&imm_expr, s);
11225               check_absolute_expr (ip, &imm_expr);
11226               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
11227                 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
11228                         (unsigned long) imm_expr.X_add_number);
11229               INSERT_OPERAND (0, MT_U, *ip, imm_expr.X_add_number);
11230               imm_expr.X_op = O_absent;
11231               s = expr_end;
11232               continue;
11233
11234             case '$': /* MT load high flag bit.  */
11235               gas_assert (!mips_opts.micromips);
11236               my_getExpression (&imm_expr, s);
11237               check_absolute_expr (ip, &imm_expr);
11238               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
11239                 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
11240                         (unsigned long) imm_expr.X_add_number);
11241               INSERT_OPERAND (0, MT_H, *ip, imm_expr.X_add_number);
11242               imm_expr.X_op = O_absent;
11243               s = expr_end;
11244               continue;
11245
11246             case '*': /* Four DSP accumulators in bits 18,19.  */
11247               gas_assert (!mips_opts.micromips);
11248               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
11249                   s[3] >= '0' && s[3] <= '3')
11250                 {
11251                   regno = s[3] - '0';
11252                   s += 4;
11253                   INSERT_OPERAND (0, MTACC_T, *ip, regno);
11254                   continue;
11255                 }
11256               else
11257                 as_bad (_("Invalid dsp/smartmips acc register"));
11258               break;
11259
11260             case '&': /* Four DSP accumulators in bits 13,14.  */
11261               gas_assert (!mips_opts.micromips);
11262               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
11263                   s[3] >= '0' && s[3] <= '3')
11264                 {
11265                   regno = s[3] - '0';
11266                   s += 4;
11267                   INSERT_OPERAND (0, MTACC_D, *ip, regno);
11268                   continue;
11269                 }
11270               else
11271                 as_bad (_("Invalid dsp/smartmips acc register"));
11272               break;
11273
11274             case '\\':          /* 3-bit bit position.  */
11275               {
11276                 unsigned long mask = (mips_opts.micromips
11277                                       ? MICROMIPSOP_MASK_3BITPOS
11278                                       : OP_MASK_3BITPOS);
11279
11280                 my_getExpression (&imm_expr, s);
11281                 check_absolute_expr (ip, &imm_expr);
11282                 if ((unsigned long) imm_expr.X_add_number > mask)
11283                   as_warn (_("Bit position for %s not in range 0..%lu (%lu)"),
11284                            ip->insn_mo->name,
11285                            mask, (unsigned long) imm_expr.X_add_number);
11286                 INSERT_OPERAND (mips_opts.micromips,
11287                                 3BITPOS, *ip, imm_expr.X_add_number);
11288                 imm_expr.X_op = O_absent;
11289                 s = expr_end;
11290               }
11291               continue;
11292
11293             case ',':
11294               ++argnum;
11295               if (*s++ == *args)
11296                 continue;
11297               s--;
11298               switch (*++args)
11299                 {
11300                 case 'r':
11301                 case 'v':
11302                   INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
11303                   continue;
11304
11305                 case 'w':
11306                   INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
11307                   continue;
11308
11309                 case 'W':
11310                   gas_assert (!mips_opts.micromips);
11311                   INSERT_OPERAND (0, FT, *ip, lastregno);
11312                   continue;
11313
11314                 case 'V':
11315                   INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
11316                   continue;
11317                 }
11318               break;
11319
11320             case '(':
11321               /* Handle optional base register.
11322                  Either the base register is omitted or
11323                  we must have a left paren.  */
11324               /* This is dependent on the next operand specifier
11325                  is a base register specification.  */
11326               gas_assert (args[1] == 'b'
11327                           || (mips_opts.micromips
11328                               && args[1] == 'm'
11329                               && (args[2] == 'l' || args[2] == 'n'
11330                                   || args[2] == 's' || args[2] == 'a')));
11331               if (*s == '\0' && args[1] == 'b')
11332                 return;
11333               /* Fall through.  */
11334
11335             case ')':           /* These must match exactly.  */
11336               if (*s++ == *args)
11337                 continue;
11338               break;
11339
11340             case '[':           /* These must match exactly.  */
11341             case ']':
11342               gas_assert (!mips_opts.micromips);
11343               if (*s++ == *args)
11344                 continue;
11345               break;
11346
11347             case '+':           /* Opcode extension character.  */
11348               switch (*++args)
11349                 {
11350                 case '1':       /* UDI immediates.  */
11351                 case '2':
11352                 case '3':
11353                 case '4':
11354                   gas_assert (!mips_opts.micromips);
11355                   {
11356                     const struct mips_immed *imm = mips_immed;
11357
11358                     while (imm->type && imm->type != *args)
11359                       ++imm;
11360                     if (! imm->type)
11361                       abort ();
11362                     my_getExpression (&imm_expr, s);
11363                     check_absolute_expr (ip, &imm_expr);
11364                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
11365                       {
11366                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
11367                                  imm->desc ? imm->desc : ip->insn_mo->name,
11368                                  (unsigned long) imm_expr.X_add_number,
11369                                  (unsigned long) imm_expr.X_add_number);
11370                         imm_expr.X_add_number &= imm->mask;
11371                       }
11372                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
11373                                         << imm->shift);
11374                     imm_expr.X_op = O_absent;
11375                     s = expr_end;
11376                   }
11377                   continue;
11378
11379                 case 'J':               /* 10-bit hypcall code.  */
11380                   gas_assert (!mips_opts.micromips);
11381                   {
11382                     unsigned long mask = OP_MASK_CODE10;
11383
11384                     my_getExpression (&imm_expr, s);
11385                     check_absolute_expr (ip, &imm_expr);
11386                     if ((unsigned long) imm_expr.X_add_number > mask)
11387                       as_warn (_("Code for %s not in range 0..%lu (%lu)"),
11388                                ip->insn_mo->name,
11389                                mask, (unsigned long) imm_expr.X_add_number);
11390                     INSERT_OPERAND (0, CODE10, *ip, imm_expr.X_add_number);
11391                     imm_expr.X_op = O_absent;
11392                     s = expr_end;
11393                   }
11394                   continue;
11395
11396                 case 'A':               /* ins/ext position, becomes LSB.  */
11397                   limlo = 0;
11398                   limhi = 31;
11399                   goto do_lsb;
11400                 case 'E':
11401                   limlo = 32;
11402                   limhi = 63;
11403                   goto do_lsb;
11404                 do_lsb:
11405                   my_getExpression (&imm_expr, s);
11406                   check_absolute_expr (ip, &imm_expr);
11407                   if ((unsigned long) imm_expr.X_add_number < limlo
11408                       || (unsigned long) imm_expr.X_add_number > limhi)
11409                     {
11410                       as_bad (_("Improper position (%lu)"),
11411                               (unsigned long) imm_expr.X_add_number);
11412                       imm_expr.X_add_number = limlo;
11413                     }
11414                   lastpos = imm_expr.X_add_number;
11415                   INSERT_OPERAND (mips_opts.micromips,
11416                                   EXTLSB, *ip, imm_expr.X_add_number);
11417                   imm_expr.X_op = O_absent;
11418                   s = expr_end;
11419                   continue;
11420
11421                 case 'B':               /* ins size, becomes MSB.  */
11422                   limlo = 1;
11423                   limhi = 32;
11424                   goto do_msb;
11425                 case 'F':
11426                   limlo = 33;
11427                   limhi = 64;
11428                   goto do_msb;
11429                 do_msb:
11430                   my_getExpression (&imm_expr, s);
11431                   check_absolute_expr (ip, &imm_expr);
11432                   /* Check for negative input so that small negative numbers
11433                      will not succeed incorrectly.  The checks against
11434                      (pos+size) transitively check "size" itself,
11435                      assuming that "pos" is reasonable.  */
11436                   if ((long) imm_expr.X_add_number < 0
11437                       || ((unsigned long) imm_expr.X_add_number
11438                           + lastpos) < limlo
11439                       || ((unsigned long) imm_expr.X_add_number
11440                           + lastpos) > limhi)
11441                     {
11442                       as_bad (_("Improper insert size (%lu, position %lu)"),
11443                               (unsigned long) imm_expr.X_add_number,
11444                               (unsigned long) lastpos);
11445                       imm_expr.X_add_number = limlo - lastpos;
11446                     }
11447                   INSERT_OPERAND (mips_opts.micromips, INSMSB, *ip,
11448                                   lastpos + imm_expr.X_add_number - 1);
11449                   imm_expr.X_op = O_absent;
11450                   s = expr_end;
11451                   continue;
11452
11453                 case 'C':               /* ext size, becomes MSBD.  */
11454                   limlo = 1;
11455                   limhi = 32;
11456                   sizelo = 1;
11457                   goto do_msbd;
11458                 case 'G':
11459                   limlo = 33;
11460                   limhi = 64;
11461                   sizelo = 33;
11462                   goto do_msbd;
11463                 case 'H':
11464                   limlo = 33;
11465                   limhi = 64;
11466                   sizelo = 1;
11467                   goto do_msbd;
11468                 do_msbd:
11469                   my_getExpression (&imm_expr, s);
11470                   check_absolute_expr (ip, &imm_expr);
11471                   /* The checks against (pos+size) don't transitively check
11472                      "size" itself, assuming that "pos" is reasonable.
11473                      We also need to check the lower bound of "size".  */
11474                   if ((long) imm_expr.X_add_number < sizelo
11475                       || ((unsigned long) imm_expr.X_add_number
11476                           + lastpos) < limlo
11477                       || ((unsigned long) imm_expr.X_add_number
11478                           + lastpos) > limhi)
11479                     {
11480                       as_bad (_("Improper extract size (%lu, position %lu)"),
11481                               (unsigned long) imm_expr.X_add_number,
11482                               (unsigned long) lastpos);
11483                       imm_expr.X_add_number = limlo - lastpos;
11484                     }
11485                   INSERT_OPERAND (mips_opts.micromips,
11486                                   EXTMSBD, *ip, imm_expr.X_add_number - 1);
11487                   imm_expr.X_op = O_absent;
11488                   s = expr_end;
11489                   continue;
11490
11491                 case 'D':
11492                   /* +D is for disassembly only; never match.  */
11493                   break;
11494
11495                 case 'I':
11496                   /* "+I" is like "I", except that imm2_expr is used.  */
11497                   my_getExpression (&imm2_expr, s);
11498                   if (imm2_expr.X_op != O_big
11499                       && imm2_expr.X_op != O_constant)
11500                   insn_error = _("absolute expression required");
11501                   if (HAVE_32BIT_GPRS)
11502                     normalize_constant_expr (&imm2_expr);
11503                   s = expr_end;
11504                   continue;
11505
11506                 case 'T': /* Coprocessor register.  */
11507                   gas_assert (!mips_opts.micromips);
11508                   /* +T is for disassembly only; never match.  */
11509                   break;
11510
11511                 case 't': /* Coprocessor register number.  */
11512                   gas_assert (!mips_opts.micromips);
11513                   if (s[0] == '$' && ISDIGIT (s[1]))
11514                     {
11515                       ++s;
11516                       regno = 0;
11517                       do
11518                         {
11519                           regno *= 10;
11520                           regno += *s - '0';
11521                           ++s;
11522                         }
11523                       while (ISDIGIT (*s));
11524                       if (regno > 31)
11525                         as_bad (_("Invalid register number (%d)"), regno);
11526                       else
11527                         {
11528                           INSERT_OPERAND (0, RT, *ip, regno);
11529                           continue;
11530                         }
11531                     }
11532                   else
11533                     as_bad (_("Invalid coprocessor 0 register number"));
11534                   break;
11535
11536                 case 'x':
11537                   /* bbit[01] and bbit[01]32 bit index.  Give error if index
11538                      is not in the valid range.  */
11539                   gas_assert (!mips_opts.micromips);
11540                   my_getExpression (&imm_expr, s);
11541                   check_absolute_expr (ip, &imm_expr);
11542                   if ((unsigned) imm_expr.X_add_number > 31)
11543                     {
11544                       as_bad (_("Improper bit index (%lu)"),
11545                               (unsigned long) imm_expr.X_add_number);
11546                       imm_expr.X_add_number = 0;
11547                     }
11548                   INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number);
11549                   imm_expr.X_op = O_absent;
11550                   s = expr_end;
11551                   continue;
11552
11553                 case 'X':
11554                   /* bbit[01] bit index when bbit is used but we generate
11555                      bbit[01]32 because the index is over 32.  Move to the
11556                      next candidate if index is not in the valid range.  */
11557                   gas_assert (!mips_opts.micromips);
11558                   my_getExpression (&imm_expr, s);
11559                   check_absolute_expr (ip, &imm_expr);
11560                   if ((unsigned) imm_expr.X_add_number < 32
11561                       || (unsigned) imm_expr.X_add_number > 63)
11562                     break;
11563                   INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number - 32);
11564                   imm_expr.X_op = O_absent;
11565                   s = expr_end;
11566                   continue;
11567
11568                 case 'p':
11569                   /* cins, cins32, exts and exts32 position field.  Give error
11570                      if it's not in the valid range.  */
11571                   gas_assert (!mips_opts.micromips);
11572                   my_getExpression (&imm_expr, s);
11573                   check_absolute_expr (ip, &imm_expr);
11574                   if ((unsigned) imm_expr.X_add_number > 31)
11575                     {
11576                       as_bad (_("Improper position (%lu)"),
11577                               (unsigned long) imm_expr.X_add_number);
11578                       imm_expr.X_add_number = 0;
11579                     }
11580                   /* Make the pos explicit to simplify +S.  */
11581                   lastpos = imm_expr.X_add_number + 32;
11582                   INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number);
11583                   imm_expr.X_op = O_absent;
11584                   s = expr_end;
11585                   continue;
11586
11587                 case 'P':
11588                   /* cins, cins32, exts and exts32 position field.  Move to
11589                      the next candidate if it's not in the valid range.  */
11590                   gas_assert (!mips_opts.micromips);
11591                   my_getExpression (&imm_expr, s);
11592                   check_absolute_expr (ip, &imm_expr);
11593                   if ((unsigned) imm_expr.X_add_number < 32
11594                       || (unsigned) imm_expr.X_add_number > 63)
11595                     break;
11596                   lastpos = imm_expr.X_add_number;
11597                   INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number - 32);
11598                   imm_expr.X_op = O_absent;
11599                   s = expr_end;
11600                   continue;
11601
11602                 case 's':
11603                   /* cins and exts length-minus-one field.  */
11604                   gas_assert (!mips_opts.micromips);
11605                   my_getExpression (&imm_expr, s);
11606                   check_absolute_expr (ip, &imm_expr);
11607                   if ((unsigned long) imm_expr.X_add_number > 31)
11608                     {
11609                       as_bad (_("Improper size (%lu)"),
11610                               (unsigned long) imm_expr.X_add_number);
11611                       imm_expr.X_add_number = 0;
11612                     }
11613                   INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
11614                   imm_expr.X_op = O_absent;
11615                   s = expr_end;
11616                   continue;
11617
11618                 case 'S':
11619                   /* cins32/exts32 and cins/exts aliasing cint32/exts32
11620                      length-minus-one field.  */
11621                   gas_assert (!mips_opts.micromips);
11622                   my_getExpression (&imm_expr, s);
11623                   check_absolute_expr (ip, &imm_expr);
11624                   if ((long) imm_expr.X_add_number < 0
11625                       || (unsigned long) imm_expr.X_add_number + lastpos > 63)
11626                     {
11627                       as_bad (_("Improper size (%lu)"),
11628                               (unsigned long) imm_expr.X_add_number);
11629                       imm_expr.X_add_number = 0;
11630                     }
11631                   INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
11632                   imm_expr.X_op = O_absent;
11633                   s = expr_end;
11634                   continue;
11635
11636                 case 'Q':
11637                   /* seqi/snei immediate field.  */
11638                   gas_assert (!mips_opts.micromips);
11639                   my_getExpression (&imm_expr, s);
11640                   check_absolute_expr (ip, &imm_expr);
11641                   if ((long) imm_expr.X_add_number < -512
11642                       || (long) imm_expr.X_add_number >= 512)
11643                     {
11644                       as_bad (_("Improper immediate (%ld)"),
11645                                (long) imm_expr.X_add_number);
11646                       imm_expr.X_add_number = 0;
11647                     }
11648                   INSERT_OPERAND (0, SEQI, *ip, imm_expr.X_add_number);
11649                   imm_expr.X_op = O_absent;
11650                   s = expr_end;
11651                   continue;
11652
11653                 case 'a': /* 8-bit signed offset in bit 6 */
11654                   gas_assert (!mips_opts.micromips);
11655                   my_getExpression (&imm_expr, s);
11656                   check_absolute_expr (ip, &imm_expr);
11657                   min_range = -((OP_MASK_OFFSET_A + 1) >> 1);
11658                   max_range = ((OP_MASK_OFFSET_A + 1) >> 1) - 1;
11659                   if (imm_expr.X_add_number < min_range
11660                       || imm_expr.X_add_number > max_range)
11661                     {
11662                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
11663                               (long) min_range, (long) max_range,
11664                               (long) imm_expr.X_add_number);
11665                     }
11666                   INSERT_OPERAND (0, OFFSET_A, *ip, imm_expr.X_add_number);
11667                   imm_expr.X_op = O_absent;
11668                   s = expr_end;
11669                   continue;
11670
11671                 case 'b': /* 8-bit signed offset in bit 3 */
11672                   gas_assert (!mips_opts.micromips);
11673                   my_getExpression (&imm_expr, s);
11674                   check_absolute_expr (ip, &imm_expr);
11675                   min_range = -((OP_MASK_OFFSET_B + 1) >> 1);
11676                   max_range = ((OP_MASK_OFFSET_B + 1) >> 1) - 1;
11677                   if (imm_expr.X_add_number < min_range
11678                       || imm_expr.X_add_number > max_range)
11679                     {
11680                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
11681                               (long) min_range, (long) max_range,
11682                               (long) imm_expr.X_add_number);
11683                     }
11684                   INSERT_OPERAND (0, OFFSET_B, *ip, imm_expr.X_add_number);
11685                   imm_expr.X_op = O_absent;
11686                   s = expr_end;
11687                   continue;
11688
11689                 case 'c': /* 9-bit signed offset in bit 6 */
11690                   gas_assert (!mips_opts.micromips);
11691                   my_getExpression (&imm_expr, s);
11692                   check_absolute_expr (ip, &imm_expr);
11693                   min_range = -((OP_MASK_OFFSET_C + 1) >> 1);
11694                   max_range = ((OP_MASK_OFFSET_C + 1) >> 1) - 1;
11695                   /* We check the offset range before adjusted.  */
11696                   min_range <<= 4;
11697                   max_range <<= 4;
11698                   if (imm_expr.X_add_number < min_range
11699                       || imm_expr.X_add_number > max_range)
11700                     {
11701                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
11702                               (long) min_range, (long) max_range,
11703                               (long) imm_expr.X_add_number);
11704                     }
11705                   if (imm_expr.X_add_number & 0xf)
11706                     {
11707                       as_bad (_("Offset not 16 bytes alignment (%ld)"),
11708                               (long) imm_expr.X_add_number);
11709                     }
11710                   /* Right shift 4 bits to adjust the offset operand.  */
11711                   INSERT_OPERAND (0, OFFSET_C, *ip,
11712                                   imm_expr.X_add_number >> 4);
11713                   imm_expr.X_op = O_absent;
11714                   s = expr_end;
11715                   continue;
11716
11717                 case 'z':
11718                   gas_assert (!mips_opts.micromips);
11719                   if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
11720                     break;
11721                   if (regno == AT && mips_opts.at)
11722                     {
11723                       if (mips_opts.at == ATREG)
11724                         as_warn (_("used $at without \".set noat\""));
11725                       else
11726                         as_warn (_("used $%u with \".set at=$%u\""),
11727                                  regno, mips_opts.at);
11728                     }
11729                   INSERT_OPERAND (0, RZ, *ip, regno);
11730                   continue;
11731
11732                 case 'Z':
11733                   gas_assert (!mips_opts.micromips);
11734                   if (!reg_lookup (&s, RTYPE_FPU, &regno))
11735                     break;
11736                   INSERT_OPERAND (0, FZ, *ip, regno);
11737                   continue;
11738
11739                 default:
11740                   as_bad (_("Internal error: bad %s opcode "
11741                             "(unknown extension operand type `+%c'): %s %s"),
11742                           mips_opts.micromips ? "microMIPS" : "MIPS",
11743                           *args, insn->name, insn->args);
11744                   /* Further processing is fruitless.  */
11745                   return;
11746                 }
11747               break;
11748
11749             case '.':           /* 10-bit offset.  */
11750               gas_assert (mips_opts.micromips);
11751             case '~':           /* 12-bit offset.  */
11752               {
11753                 int shift = *args == '.' ? 9 : 11;
11754                 size_t i;
11755
11756                 /* Check whether there is only a single bracketed expression
11757                    left.  If so, it must be the base register and the
11758                    constant must be zero.  */
11759                 if (*s == '(' && strchr (s + 1, '(') == 0)
11760                   continue;
11761
11762                 /* If this value won't fit into the offset, then go find
11763                    a macro that will generate a 16- or 32-bit offset code
11764                    pattern.  */
11765                 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
11766                 if ((i == 0 && (imm_expr.X_op != O_constant
11767                                 || imm_expr.X_add_number >= 1 << shift
11768                                 || imm_expr.X_add_number < -1 << shift))
11769                     || i > 0)
11770                   {
11771                     imm_expr.X_op = O_absent;
11772                     break;
11773                   }
11774                 if (shift == 9)
11775                   INSERT_OPERAND (1, OFFSET10, *ip, imm_expr.X_add_number);
11776                 else
11777                   INSERT_OPERAND (mips_opts.micromips,
11778                                   OFFSET12, *ip, imm_expr.X_add_number);
11779                 imm_expr.X_op = O_absent;
11780                 s = expr_end;
11781               }
11782               continue;
11783
11784             case '<':           /* must be at least one digit */
11785               /*
11786                * According to the manual, if the shift amount is greater
11787                * than 31 or less than 0, then the shift amount should be
11788                * mod 32.  In reality the mips assembler issues an error.
11789                * We issue a warning and mask out all but the low 5 bits.
11790                */
11791               my_getExpression (&imm_expr, s);
11792               check_absolute_expr (ip, &imm_expr);
11793               if ((unsigned long) imm_expr.X_add_number > 31)
11794                 as_warn (_("Improper shift amount (%lu)"),
11795                          (unsigned long) imm_expr.X_add_number);
11796               INSERT_OPERAND (mips_opts.micromips,
11797                               SHAMT, *ip, imm_expr.X_add_number);
11798               imm_expr.X_op = O_absent;
11799               s = expr_end;
11800               continue;
11801
11802             case '>':           /* shift amount minus 32 */
11803               my_getExpression (&imm_expr, s);
11804               check_absolute_expr (ip, &imm_expr);
11805               if ((unsigned long) imm_expr.X_add_number < 32
11806                   || (unsigned long) imm_expr.X_add_number > 63)
11807                 break;
11808               INSERT_OPERAND (mips_opts.micromips,
11809                               SHAMT, *ip, imm_expr.X_add_number - 32);
11810               imm_expr.X_op = O_absent;
11811               s = expr_end;
11812               continue;
11813
11814             case 'k':           /* CACHE code.  */
11815             case 'h':           /* PREFX code.  */
11816             case '1':           /* SYNC type.  */
11817               my_getExpression (&imm_expr, s);
11818               check_absolute_expr (ip, &imm_expr);
11819               if ((unsigned long) imm_expr.X_add_number > 31)
11820                 as_warn (_("Invalid value for `%s' (%lu)"),
11821                          ip->insn_mo->name,
11822                          (unsigned long) imm_expr.X_add_number);
11823               switch (*args)
11824                 {
11825                 case 'k':
11826                   if (mips_fix_cn63xxp1
11827                       && !mips_opts.micromips
11828                       && strcmp ("pref", insn->name) == 0)
11829                     switch (imm_expr.X_add_number)
11830                       {
11831                       case 5:
11832                       case 25:
11833                       case 26:
11834                       case 27:
11835                       case 28:
11836                       case 29:
11837                       case 30:
11838                       case 31:  /* These are ok.  */
11839                         break;
11840
11841                       default:  /* The rest must be changed to 28.  */
11842                         imm_expr.X_add_number = 28;
11843                         break;
11844                       }
11845                   INSERT_OPERAND (mips_opts.micromips,
11846                                   CACHE, *ip, imm_expr.X_add_number);
11847                   break;
11848                 case 'h':
11849                   INSERT_OPERAND (mips_opts.micromips,
11850                                   PREFX, *ip, imm_expr.X_add_number);
11851                   break;
11852                 case '1':
11853                   INSERT_OPERAND (mips_opts.micromips,
11854                                   STYPE, *ip, imm_expr.X_add_number);
11855                   break;
11856                 }
11857               imm_expr.X_op = O_absent;
11858               s = expr_end;
11859               continue;
11860
11861             case 'c':           /* BREAK code.  */
11862               {
11863                 unsigned long mask = (mips_opts.micromips
11864                                       ? MICROMIPSOP_MASK_CODE
11865                                       : OP_MASK_CODE);
11866
11867                 my_getExpression (&imm_expr, s);
11868                 check_absolute_expr (ip, &imm_expr);
11869                 if ((unsigned long) imm_expr.X_add_number > mask)
11870                   as_warn (_("Code for %s not in range 0..%lu (%lu)"),
11871                            ip->insn_mo->name,
11872                            mask, (unsigned long) imm_expr.X_add_number);
11873                 INSERT_OPERAND (mips_opts.micromips,
11874                                 CODE, *ip, imm_expr.X_add_number);
11875                 imm_expr.X_op = O_absent;
11876                 s = expr_end;
11877               }
11878               continue;
11879
11880             case 'q':           /* Lower BREAK code.  */
11881               {
11882                 unsigned long mask = (mips_opts.micromips
11883                                       ? MICROMIPSOP_MASK_CODE2
11884                                       : OP_MASK_CODE2);
11885
11886                 my_getExpression (&imm_expr, s);
11887                 check_absolute_expr (ip, &imm_expr);
11888                 if ((unsigned long) imm_expr.X_add_number > mask)
11889                   as_warn (_("Lower code for %s not in range 0..%lu (%lu)"),
11890                            ip->insn_mo->name,
11891                            mask, (unsigned long) imm_expr.X_add_number);
11892                 INSERT_OPERAND (mips_opts.micromips,
11893                                 CODE2, *ip, imm_expr.X_add_number);
11894                 imm_expr.X_op = O_absent;
11895                 s = expr_end;
11896               }
11897               continue;
11898
11899             case 'B':           /* 20- or 10-bit syscall/break/wait code.  */
11900               {
11901                 unsigned long mask = (mips_opts.micromips
11902                                       ? MICROMIPSOP_MASK_CODE10
11903                                       : OP_MASK_CODE20);
11904
11905                 my_getExpression (&imm_expr, s);
11906                 check_absolute_expr (ip, &imm_expr);
11907                 if ((unsigned long) imm_expr.X_add_number > mask)
11908                   as_warn (_("Code for %s not in range 0..%lu (%lu)"),
11909                            ip->insn_mo->name,
11910                            mask, (unsigned long) imm_expr.X_add_number);
11911                 if (mips_opts.micromips)
11912                   INSERT_OPERAND (1, CODE10, *ip, imm_expr.X_add_number);
11913                 else
11914                   INSERT_OPERAND (0, CODE20, *ip, imm_expr.X_add_number);
11915                 imm_expr.X_op = O_absent;
11916                 s = expr_end;
11917               }
11918               continue;
11919
11920             case 'C':           /* 25- or 23-bit coprocessor code.  */
11921               {
11922                 unsigned long mask = (mips_opts.micromips
11923                                       ? MICROMIPSOP_MASK_COPZ
11924                                       : OP_MASK_COPZ);
11925
11926                 my_getExpression (&imm_expr, s);
11927                 check_absolute_expr (ip, &imm_expr);
11928                 if ((unsigned long) imm_expr.X_add_number > mask)
11929                   as_warn (_("Coproccesor code > %u bits (%lu)"),
11930                            mips_opts.micromips ? 23U : 25U,
11931                            (unsigned long) imm_expr.X_add_number);
11932                 INSERT_OPERAND (mips_opts.micromips,
11933                                 COPZ, *ip, imm_expr.X_add_number);
11934                 imm_expr.X_op = O_absent;
11935                 s = expr_end;
11936               }
11937               continue;
11938
11939             case 'J':           /* 19-bit WAIT code.  */
11940               gas_assert (!mips_opts.micromips);
11941               my_getExpression (&imm_expr, s);
11942               check_absolute_expr (ip, &imm_expr);
11943               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
11944                 {
11945                   as_warn (_("Illegal 19-bit code (%lu)"),
11946                            (unsigned long) imm_expr.X_add_number);
11947                   imm_expr.X_add_number &= OP_MASK_CODE19;
11948                 }
11949               INSERT_OPERAND (0, CODE19, *ip, imm_expr.X_add_number);
11950               imm_expr.X_op = O_absent;
11951               s = expr_end;
11952               continue;
11953
11954             case 'P':           /* Performance register.  */
11955               gas_assert (!mips_opts.micromips);
11956               my_getExpression (&imm_expr, s);
11957               check_absolute_expr (ip, &imm_expr);
11958               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
11959                 as_warn (_("Invalid performance register (%lu)"),
11960                          (unsigned long) imm_expr.X_add_number);
11961               if (imm_expr.X_add_number != 0 && mips_opts.arch == CPU_R5900
11962                 && (!strcmp(insn->name,"mfps") || !strcmp(insn->name,"mtps")))
11963                 as_warn (_("Invalid performance register (%lu)"),
11964                   (unsigned long) imm_expr.X_add_number);
11965               INSERT_OPERAND (0, PERFREG, *ip, imm_expr.X_add_number);
11966               imm_expr.X_op = O_absent;
11967               s = expr_end;
11968               continue;
11969
11970             case 'G':           /* Coprocessor destination register.  */
11971               {
11972                 unsigned long opcode = ip->insn_opcode;
11973                 unsigned long mask;
11974                 unsigned int types;
11975                 int cop0;
11976
11977                 if (mips_opts.micromips)
11978                   {
11979                     mask = ~((MICROMIPSOP_MASK_RT << MICROMIPSOP_SH_RT)
11980                              | (MICROMIPSOP_MASK_RS << MICROMIPSOP_SH_RS)
11981                              | (MICROMIPSOP_MASK_SEL << MICROMIPSOP_SH_SEL));
11982                     opcode &= mask;
11983                     switch (opcode)
11984                       {
11985                       case 0x000000fc:                          /* mfc0  */
11986                       case 0x000002fc:                          /* mtc0  */
11987                       case 0x580000fc:                          /* dmfc0 */
11988                       case 0x580002fc:                          /* dmtc0 */
11989                         cop0 = 1;
11990                         break;
11991                       default:
11992                         cop0 = 0;
11993                         break;
11994                       }
11995                   }
11996                 else
11997                   {
11998                     opcode = (opcode >> OP_SH_OP) & OP_MASK_OP;
11999                     cop0 = opcode == OP_OP_COP0;
12000                   }
12001                 types = RTYPE_NUM | (cop0 ? RTYPE_CP0 : RTYPE_GP);
12002                 ok = reg_lookup (&s, types, &regno);
12003                 if (mips_opts.micromips)
12004                   INSERT_OPERAND (1, RS, *ip, regno);
12005                 else
12006                   INSERT_OPERAND (0, RD, *ip, regno);
12007                 if (ok)
12008                   {
12009                     lastregno = regno;
12010                     continue;
12011                   }
12012               }
12013               break;
12014
12015             case 'y':           /* ALNV.PS source register.  */
12016               gas_assert (mips_opts.micromips);
12017               goto do_reg;
12018             case 'x':           /* Ignore register name.  */
12019             case 'U':           /* Destination register (CLO/CLZ).  */
12020             case 'g':           /* Coprocessor destination register.  */
12021               gas_assert (!mips_opts.micromips);
12022             case 'b':           /* Base register.  */
12023             case 'd':           /* Destination register.  */
12024             case 's':           /* Source register.  */
12025             case 't':           /* Target register.  */
12026             case 'r':           /* Both target and source.  */
12027             case 'v':           /* Both dest and source.  */
12028             case 'w':           /* Both dest and target.  */
12029             case 'E':           /* Coprocessor target register.  */
12030             case 'K':           /* RDHWR destination register.  */
12031             case 'z':           /* Must be zero register.  */
12032             do_reg:
12033               s_reset = s;
12034               if (*args == 'E' || *args == 'K')
12035                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
12036               else
12037                 {
12038                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
12039                   if (regno == AT && mips_opts.at)
12040                     {
12041                       if (mips_opts.at == ATREG)
12042                         as_warn (_("Used $at without \".set noat\""));
12043                       else
12044                         as_warn (_("Used $%u with \".set at=$%u\""),
12045                                  regno, mips_opts.at);
12046                     }
12047                 }
12048               if (ok)
12049                 {
12050                   c = *args;
12051                   if (*s == ' ')
12052                     ++s;
12053                   if (args[1] != *s)
12054                     {
12055                       if (c == 'r' || c == 'v' || c == 'w')
12056                         {
12057                           regno = lastregno;
12058                           s = s_reset;
12059                           ++args;
12060                         }
12061                     }
12062                   /* 'z' only matches $0.  */
12063                   if (c == 'z' && regno != 0)
12064                     break;
12065
12066                   if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
12067                     {
12068                       if (regno == lastregno)
12069                         {
12070                           insn_error
12071                             = _("Source and destination must be different");
12072                           continue;
12073                         }
12074                       if (regno == 31 && lastregno == 0xffffffff)
12075                         {
12076                           insn_error
12077                             = _("A destination register must be supplied");
12078                           continue;
12079                         }
12080                     }
12081                   /* Now that we have assembled one operand, we use the args
12082                      string to figure out where it goes in the instruction.  */
12083                   switch (c)
12084                     {
12085                     case 'r':
12086                     case 's':
12087                     case 'v':
12088                     case 'b':
12089                       INSERT_OPERAND (mips_opts.micromips, RS, *ip, regno);
12090                       break;
12091
12092                     case 'K':
12093                       if (mips_opts.micromips)
12094                         INSERT_OPERAND (1, RS, *ip, regno);
12095                       else
12096                         INSERT_OPERAND (0, RD, *ip, regno);
12097                       break;
12098
12099                     case 'd':
12100                     case 'g':
12101                       INSERT_OPERAND (mips_opts.micromips, RD, *ip, regno);
12102                       break;
12103
12104                     case 'U':
12105                       gas_assert (!mips_opts.micromips);
12106                       INSERT_OPERAND (0, RD, *ip, regno);
12107                       INSERT_OPERAND (0, RT, *ip, regno);
12108                       break;
12109
12110                     case 'w':
12111                     case 't':
12112                     case 'E':
12113                       INSERT_OPERAND (mips_opts.micromips, RT, *ip, regno);
12114                       break;
12115
12116                     case 'y':
12117                       gas_assert (mips_opts.micromips);
12118                       INSERT_OPERAND (1, RS3, *ip, regno);
12119                       break;
12120
12121                     case 'x':
12122                       /* This case exists because on the r3000 trunc
12123                          expands into a macro which requires a gp
12124                          register.  On the r6000 or r4000 it is
12125                          assembled into a single instruction which
12126                          ignores the register.  Thus the insn version
12127                          is MIPS_ISA2 and uses 'x', and the macro
12128                          version is MIPS_ISA1 and uses 't'.  */
12129                       break;
12130
12131                     case 'z':
12132                       /* This case is for the div instruction, which
12133                          acts differently if the destination argument
12134                          is $0.  This only matches $0, and is checked
12135                          outside the switch.  */
12136                       break;
12137                     }
12138                   lastregno = regno;
12139                   continue;
12140                 }
12141               switch (*args++)
12142                 {
12143                 case 'r':
12144                 case 'v':
12145                   INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
12146                   continue;
12147
12148                 case 'w':
12149                   INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
12150                   continue;
12151                 }
12152               break;
12153
12154             case 'O':           /* MDMX alignment immediate constant.  */
12155               gas_assert (!mips_opts.micromips);
12156               my_getExpression (&imm_expr, s);
12157               check_absolute_expr (ip, &imm_expr);
12158               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
12159                 as_warn (_("Improper align amount (%ld), using low bits"),
12160                          (long) imm_expr.X_add_number);
12161               INSERT_OPERAND (0, ALN, *ip, imm_expr.X_add_number);
12162               imm_expr.X_op = O_absent;
12163               s = expr_end;
12164               continue;
12165
12166             case 'Q':           /* MDMX vector, element sel, or const.  */
12167               if (s[0] != '$')
12168                 {
12169                   /* MDMX Immediate.  */
12170                   gas_assert (!mips_opts.micromips);
12171                   my_getExpression (&imm_expr, s);
12172                   check_absolute_expr (ip, &imm_expr);
12173                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
12174                     as_warn (_("Invalid MDMX Immediate (%ld)"),
12175                              (long) imm_expr.X_add_number);
12176                   INSERT_OPERAND (0, FT, *ip, imm_expr.X_add_number);
12177                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
12178                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
12179                   else
12180                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
12181                   imm_expr.X_op = O_absent;
12182                   s = expr_end;
12183                   continue;
12184                 }
12185               /* Not MDMX Immediate.  Fall through.  */
12186             case 'X':           /* MDMX destination register.  */
12187             case 'Y':           /* MDMX source register.  */
12188             case 'Z':           /* MDMX target register.  */
12189               is_mdmx = 1;
12190             case 'W':
12191               gas_assert (!mips_opts.micromips);
12192             case 'D':           /* Floating point destination register.  */
12193             case 'S':           /* Floating point source register.  */
12194             case 'T':           /* Floating point target register.  */
12195             case 'R':           /* Floating point source register.  */
12196             case 'V':
12197               rtype = RTYPE_FPU;
12198               if (is_mdmx
12199                   || (mips_opts.ase_mdmx
12200                       && (ip->insn_mo->pinfo & FP_D)
12201                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
12202                                                 | INSN_COPROC_MEMORY_DELAY
12203                                                 | INSN_LOAD_COPROC_DELAY
12204                                                 | INSN_LOAD_MEMORY_DELAY
12205                                                 | INSN_STORE_MEMORY))))
12206                 rtype |= RTYPE_VEC;
12207               s_reset = s;
12208               if (reg_lookup (&s, rtype, &regno))
12209                 {
12210                   if ((regno & 1) != 0
12211                       && HAVE_32BIT_FPRS
12212                       && !mips_oddfpreg_ok (ip->insn_mo, argnum))
12213                     as_warn (_("Float register should be even, was %d"),
12214                              regno);
12215
12216                   c = *args;
12217                   if (*s == ' ')
12218                     ++s;
12219                   if (args[1] != *s)
12220                     {
12221                       if (c == 'V' || c == 'W')
12222                         {
12223                           regno = lastregno;
12224                           s = s_reset;
12225                           ++args;
12226                         }
12227                     }
12228                   switch (c)
12229                     {
12230                     case 'D':
12231                     case 'X':
12232                       INSERT_OPERAND (mips_opts.micromips, FD, *ip, regno);
12233                       break;
12234
12235                     case 'V':
12236                     case 'S':
12237                     case 'Y':
12238                       INSERT_OPERAND (mips_opts.micromips, FS, *ip, regno);
12239                       break;
12240
12241                     case 'Q':
12242                       /* This is like 'Z', but also needs to fix the MDMX
12243                          vector/scalar select bits.  Note that the
12244                          scalar immediate case is handled above.  */
12245                       if (*s == '[')
12246                         {
12247                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
12248                           int max_el = (is_qh ? 3 : 7);
12249                           s++;
12250                           my_getExpression(&imm_expr, s);
12251                           check_absolute_expr (ip, &imm_expr);
12252                           s = expr_end;
12253                           if (imm_expr.X_add_number > max_el)
12254                             as_bad (_("Bad element selector %ld"),
12255                                     (long) imm_expr.X_add_number);
12256                           imm_expr.X_add_number &= max_el;
12257                           ip->insn_opcode |= (imm_expr.X_add_number
12258                                               << (OP_SH_VSEL +
12259                                                   (is_qh ? 2 : 1)));
12260                           imm_expr.X_op = O_absent;
12261                           if (*s != ']')
12262                             as_warn (_("Expecting ']' found '%s'"), s);
12263                           else
12264                             s++;
12265                         }
12266                       else
12267                         {
12268                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
12269                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
12270                                                 << OP_SH_VSEL);
12271                           else
12272                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
12273                                                 OP_SH_VSEL);
12274                         }
12275                       /* Fall through.  */
12276                     case 'W':
12277                     case 'T':
12278                     case 'Z':
12279                       INSERT_OPERAND (mips_opts.micromips, FT, *ip, regno);
12280                       break;
12281
12282                     case 'R':
12283                       INSERT_OPERAND (mips_opts.micromips, FR, *ip, regno);
12284                       break;
12285                     }
12286                   lastregno = regno;
12287                   continue;
12288                 }
12289
12290               switch (*args++)
12291                 {
12292                 case 'V':
12293                   INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
12294                   continue;
12295
12296                 case 'W':
12297                   INSERT_OPERAND (mips_opts.micromips, FT, *ip, lastregno);
12298                   continue;
12299                 }
12300               break;
12301
12302             case 'I':
12303               my_getExpression (&imm_expr, s);
12304               if (imm_expr.X_op != O_big
12305                   && imm_expr.X_op != O_constant)
12306                 insn_error = _("absolute expression required");
12307               if (HAVE_32BIT_GPRS)
12308                 normalize_constant_expr (&imm_expr);
12309               s = expr_end;
12310               continue;
12311
12312             case 'A':
12313               my_getExpression (&offset_expr, s);
12314               normalize_address_expr (&offset_expr);
12315               *imm_reloc = BFD_RELOC_32;
12316               s = expr_end;
12317               continue;
12318
12319             case 'F':
12320             case 'L':
12321             case 'f':
12322             case 'l':
12323               {
12324                 int f64;
12325                 int using_gprs;
12326                 char *save_in;
12327                 char *err;
12328                 unsigned char temp[8];
12329                 int len;
12330                 unsigned int length;
12331                 segT seg;
12332                 subsegT subseg;
12333                 char *p;
12334
12335                 /* These only appear as the last operand in an
12336                    instruction, and every instruction that accepts
12337                    them in any variant accepts them in all variants.
12338                    This means we don't have to worry about backing out
12339                    any changes if the instruction does not match.
12340
12341                    The difference between them is the size of the
12342                    floating point constant and where it goes.  For 'F'
12343                    and 'L' the constant is 64 bits; for 'f' and 'l' it
12344                    is 32 bits.  Where the constant is placed is based
12345                    on how the MIPS assembler does things:
12346                     F -- .rdata
12347                     L -- .lit8
12348                     f -- immediate value
12349                     l -- .lit4
12350
12351                     The .lit4 and .lit8 sections are only used if
12352                     permitted by the -G argument.
12353
12354                     The code below needs to know whether the target register
12355                     is 32 or 64 bits wide.  It relies on the fact 'f' and
12356                     'F' are used with GPR-based instructions and 'l' and
12357                     'L' are used with FPR-based instructions.  */
12358
12359                 f64 = *args == 'F' || *args == 'L';
12360                 using_gprs = *args == 'F' || *args == 'f';
12361
12362                 save_in = input_line_pointer;
12363                 input_line_pointer = s;
12364                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
12365                 length = len;
12366                 s = input_line_pointer;
12367                 input_line_pointer = save_in;
12368                 if (err != NULL && *err != '\0')
12369                   {
12370                     as_bad (_("Bad floating point constant: %s"), err);
12371                     memset (temp, '\0', sizeof temp);
12372                     length = f64 ? 8 : 4;
12373                   }
12374
12375                 gas_assert (length == (unsigned) (f64 ? 8 : 4));
12376
12377                 if (*args == 'f'
12378                     || (*args == 'l'
12379                         && (g_switch_value < 4
12380                             || (temp[0] == 0 && temp[1] == 0)
12381                             || (temp[2] == 0 && temp[3] == 0))))
12382                   {
12383                     imm_expr.X_op = O_constant;
12384                     if (!target_big_endian)
12385                       imm_expr.X_add_number = bfd_getl32 (temp);
12386                     else
12387                       imm_expr.X_add_number = bfd_getb32 (temp);
12388                   }
12389                 else if (length > 4
12390                          && !mips_disable_float_construction
12391                          /* Constants can only be constructed in GPRs and
12392                             copied to FPRs if the GPRs are at least as wide
12393                             as the FPRs.  Force the constant into memory if
12394                             we are using 64-bit FPRs but the GPRs are only
12395                             32 bits wide.  */
12396                          && (using_gprs
12397                              || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
12398                          && ((temp[0] == 0 && temp[1] == 0)
12399                              || (temp[2] == 0 && temp[3] == 0))
12400                          && ((temp[4] == 0 && temp[5] == 0)
12401                              || (temp[6] == 0 && temp[7] == 0)))
12402                   {
12403                     /* The value is simple enough to load with a couple of
12404                        instructions.  If using 32-bit registers, set
12405                        imm_expr to the high order 32 bits and offset_expr to
12406                        the low order 32 bits.  Otherwise, set imm_expr to
12407                        the entire 64 bit constant.  */
12408                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
12409                       {
12410                         imm_expr.X_op = O_constant;
12411                         offset_expr.X_op = O_constant;
12412                         if (!target_big_endian)
12413                           {
12414                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
12415                             offset_expr.X_add_number = bfd_getl32 (temp);
12416                           }
12417                         else
12418                           {
12419                             imm_expr.X_add_number = bfd_getb32 (temp);
12420                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
12421                           }
12422                         if (offset_expr.X_add_number == 0)
12423                           offset_expr.X_op = O_absent;
12424                       }
12425                     else if (sizeof (imm_expr.X_add_number) > 4)
12426                       {
12427                         imm_expr.X_op = O_constant;
12428                         if (!target_big_endian)
12429                           imm_expr.X_add_number = bfd_getl64 (temp);
12430                         else
12431                           imm_expr.X_add_number = bfd_getb64 (temp);
12432                       }
12433                     else
12434                       {
12435                         imm_expr.X_op = O_big;
12436                         imm_expr.X_add_number = 4;
12437                         if (!target_big_endian)
12438                           {
12439                             generic_bignum[0] = bfd_getl16 (temp);
12440                             generic_bignum[1] = bfd_getl16 (temp + 2);
12441                             generic_bignum[2] = bfd_getl16 (temp + 4);
12442                             generic_bignum[3] = bfd_getl16 (temp + 6);
12443                           }
12444                         else
12445                           {
12446                             generic_bignum[0] = bfd_getb16 (temp + 6);
12447                             generic_bignum[1] = bfd_getb16 (temp + 4);
12448                             generic_bignum[2] = bfd_getb16 (temp + 2);
12449                             generic_bignum[3] = bfd_getb16 (temp);
12450                           }
12451                       }
12452                   }
12453                 else
12454                   {
12455                     const char *newname;
12456                     segT new_seg;
12457
12458                     /* Switch to the right section.  */
12459                     seg = now_seg;
12460                     subseg = now_subseg;
12461                     switch (*args)
12462                       {
12463                       default: /* unused default case avoids warnings.  */
12464                       case 'L':
12465                         newname = RDATA_SECTION_NAME;
12466                         if (g_switch_value >= 8)
12467                           newname = ".lit8";
12468                         break;
12469                       case 'F':
12470                         newname = RDATA_SECTION_NAME;
12471                         break;
12472                       case 'l':
12473                         gas_assert (g_switch_value >= 4);
12474                         newname = ".lit4";
12475                         break;
12476                       }
12477                     new_seg = subseg_new (newname, (subsegT) 0);
12478                     if (IS_ELF)
12479                       bfd_set_section_flags (stdoutput, new_seg,
12480                                              (SEC_ALLOC
12481                                               | SEC_LOAD
12482                                               | SEC_READONLY
12483                                               | SEC_DATA));
12484                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
12485                     if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
12486                       record_alignment (new_seg, 4);
12487                     else
12488                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
12489                     if (seg == now_seg)
12490                       as_bad (_("Can't use floating point insn in this section"));
12491
12492                     /* Set the argument to the current address in the
12493                        section.  */
12494                     offset_expr.X_op = O_symbol;
12495                     offset_expr.X_add_symbol = symbol_temp_new_now ();
12496                     offset_expr.X_add_number = 0;
12497
12498                     /* Put the floating point number into the section.  */
12499                     p = frag_more ((int) length);
12500                     memcpy (p, temp, length);
12501
12502                     /* Switch back to the original section.  */
12503                     subseg_set (seg, subseg);
12504                   }
12505               }
12506               continue;
12507
12508             case 'i':           /* 16-bit unsigned immediate.  */
12509             case 'j':           /* 16-bit signed immediate.  */
12510               *imm_reloc = BFD_RELOC_LO16;
12511               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
12512                 {
12513                   int more;
12514                   offsetT minval, maxval;
12515
12516                   more = (insn + 1 < past
12517                           && strcmp (insn->name, insn[1].name) == 0);
12518
12519                   /* If the expression was written as an unsigned number,
12520                      only treat it as signed if there are no more
12521                      alternatives.  */
12522                   if (more
12523                       && *args == 'j'
12524                       && sizeof (imm_expr.X_add_number) <= 4
12525                       && imm_expr.X_op == O_constant
12526                       && imm_expr.X_add_number < 0
12527                       && imm_expr.X_unsigned
12528                       && HAVE_64BIT_GPRS)
12529                     break;
12530
12531                   /* For compatibility with older assemblers, we accept
12532                      0x8000-0xffff as signed 16-bit numbers when only
12533                      signed numbers are allowed.  */
12534                   if (*args == 'i')
12535                     minval = 0, maxval = 0xffff;
12536                   else if (more)
12537                     minval = -0x8000, maxval = 0x7fff;
12538                   else
12539                     minval = -0x8000, maxval = 0xffff;
12540
12541                   if (imm_expr.X_op != O_constant
12542                       || imm_expr.X_add_number < minval
12543                       || imm_expr.X_add_number > maxval)
12544                     {
12545                       if (more)
12546                         break;
12547                       if (imm_expr.X_op == O_constant
12548                           || imm_expr.X_op == O_big)
12549                         as_bad (_("Expression out of range"));
12550                     }
12551                 }
12552               s = expr_end;
12553               continue;
12554
12555             case 'o':           /* 16-bit offset.  */
12556               offset_reloc[0] = BFD_RELOC_LO16;
12557               offset_reloc[1] = BFD_RELOC_UNUSED;
12558               offset_reloc[2] = BFD_RELOC_UNUSED;
12559
12560               /* Check whether there is only a single bracketed expression
12561                  left.  If so, it must be the base register and the
12562                  constant must be zero.  */
12563               if (*s == '(' && strchr (s + 1, '(') == 0)
12564                 {
12565                   offset_expr.X_op = O_constant;
12566                   offset_expr.X_add_number = 0;
12567                   continue;
12568                 }
12569
12570               /* If this value won't fit into a 16 bit offset, then go
12571                  find a macro that will generate the 32 bit offset
12572                  code pattern.  */
12573               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
12574                   && (offset_expr.X_op != O_constant
12575                       || offset_expr.X_add_number >= 0x8000
12576                       || offset_expr.X_add_number < -0x8000))
12577                 break;
12578
12579               s = expr_end;
12580               continue;
12581
12582             case 'p':           /* PC-relative offset.  */
12583               *offset_reloc = BFD_RELOC_16_PCREL_S2;
12584               my_getExpression (&offset_expr, s);
12585               s = expr_end;
12586               continue;
12587
12588             case 'u':           /* Upper 16 bits.  */
12589               *imm_reloc = BFD_RELOC_LO16;
12590               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
12591                   && imm_expr.X_op == O_constant
12592                   && (imm_expr.X_add_number < 0
12593                       || imm_expr.X_add_number >= 0x10000))
12594                 as_bad (_("lui expression (%lu) not in range 0..65535"),
12595                         (unsigned long) imm_expr.X_add_number);
12596               s = expr_end;
12597               continue;
12598
12599             case 'a':           /* 26-bit address.  */
12600               *offset_reloc = BFD_RELOC_MIPS_JMP;
12601               my_getExpression (&offset_expr, s);
12602               s = expr_end;
12603               continue;
12604
12605             case 'N':           /* 3-bit branch condition code.  */
12606             case 'M':           /* 3-bit compare condition code.  */
12607               rtype = RTYPE_CCC;
12608               if (ip->insn_mo->pinfo & (FP_D | FP_S))
12609                 rtype |= RTYPE_FCC;
12610               if (!reg_lookup (&s, rtype, &regno))
12611                 break;
12612               if ((strcmp (str + strlen (str) - 3, ".ps") == 0
12613                    || strcmp (str + strlen (str) - 5, "any2f") == 0
12614                    || strcmp (str + strlen (str) - 5, "any2t") == 0)
12615                   && (regno & 1) != 0)
12616                 as_warn (_("Condition code register should be even for %s, "
12617                            "was %d"),
12618                          str, regno);
12619               if ((strcmp (str + strlen (str) - 5, "any4f") == 0
12620                    || strcmp (str + strlen (str) - 5, "any4t") == 0)
12621                   && (regno & 3) != 0)
12622                 as_warn (_("Condition code register should be 0 or 4 for %s, "
12623                            "was %d"),
12624                          str, regno);
12625               if (*args == 'N')
12626                 INSERT_OPERAND (mips_opts.micromips, BCC, *ip, regno);
12627               else
12628                 INSERT_OPERAND (mips_opts.micromips, CCC, *ip, regno);
12629               continue;
12630
12631             case 'H':
12632               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
12633                 s += 2;
12634               if (ISDIGIT (*s))
12635                 {
12636                   c = 0;
12637                   do
12638                     {
12639                       c *= 10;
12640                       c += *s - '0';
12641                       ++s;
12642                     }
12643                   while (ISDIGIT (*s));
12644                 }
12645               else
12646                 c = 8; /* Invalid sel value.  */
12647
12648               if (c > 7)
12649                 as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
12650               INSERT_OPERAND (mips_opts.micromips, SEL, *ip, c);
12651               continue;
12652
12653             case 'e':
12654               gas_assert (!mips_opts.micromips);
12655               /* Must be at least one digit.  */
12656               my_getExpression (&imm_expr, s);
12657               check_absolute_expr (ip, &imm_expr);
12658
12659               if ((unsigned long) imm_expr.X_add_number
12660                   > (unsigned long) OP_MASK_VECBYTE)
12661                 {
12662                   as_bad (_("bad byte vector index (%ld)"),
12663                            (long) imm_expr.X_add_number);
12664                   imm_expr.X_add_number = 0;
12665                 }
12666
12667               INSERT_OPERAND (0, VECBYTE, *ip, imm_expr.X_add_number);
12668               imm_expr.X_op = O_absent;
12669               s = expr_end;
12670               continue;
12671
12672             case '%':
12673               gas_assert (!mips_opts.micromips);
12674               my_getExpression (&imm_expr, s);
12675               check_absolute_expr (ip, &imm_expr);
12676
12677               if ((unsigned long) imm_expr.X_add_number
12678                   > (unsigned long) OP_MASK_VECALIGN)
12679                 {
12680                   as_bad (_("bad byte vector index (%ld)"),
12681                            (long) imm_expr.X_add_number);
12682                   imm_expr.X_add_number = 0;
12683                 }
12684
12685               INSERT_OPERAND (0, VECALIGN, *ip, imm_expr.X_add_number);
12686               imm_expr.X_op = O_absent;
12687               s = expr_end;
12688               continue;
12689
12690             case 'm':           /* Opcode extension character.  */
12691               gas_assert (mips_opts.micromips);
12692               c = *++args;
12693               switch (c)
12694                 {
12695                 case 'r':
12696                   if (strncmp (s, "$pc", 3) == 0)
12697                     {
12698                       s += 3;
12699                       continue;
12700                     }
12701                   break;
12702
12703                 case 'a':
12704                 case 'b':
12705                 case 'c':
12706                 case 'd':
12707                 case 'e':
12708                 case 'f':
12709                 case 'g':
12710                 case 'h':
12711                 case 'i':
12712                 case 'j':
12713                 case 'l':
12714                 case 'm':
12715                 case 'n':
12716                 case 'p':
12717                 case 'q':
12718                 case 's':
12719                 case 't':
12720                 case 'x':
12721                 case 'y':
12722                 case 'z':
12723                   s_reset = s;
12724                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
12725                   if (regno == AT && mips_opts.at)
12726                     {
12727                       if (mips_opts.at == ATREG)
12728                         as_warn (_("Used $at without \".set noat\""));
12729                       else
12730                         as_warn (_("Used $%u with \".set at=$%u\""),
12731                                  regno, mips_opts.at);
12732                     }
12733                   if (!ok)
12734                     {
12735                       if (c == 'c')
12736                         {
12737                           gas_assert (args[1] == ',');
12738                           regno = lastregno;
12739                           ++args;
12740                         }
12741                       else if (c == 't')
12742                         {
12743                           gas_assert (args[1] == ',');
12744                           ++args;
12745                           continue;                     /* Nothing to do.  */
12746                         }
12747                       else
12748                         break;
12749                     }
12750
12751                   if (c == 'j' && !strncmp (ip->insn_mo->name, "jalr", 4))
12752                     {
12753                       if (regno == lastregno)
12754                         {
12755                           insn_error
12756                             = _("Source and destination must be different");
12757                           continue;
12758                         }
12759                       if (regno == 31 && lastregno == 0xffffffff)
12760                         {
12761                           insn_error
12762                             = _("A destination register must be supplied");
12763                           continue;
12764                         }
12765                     }
12766
12767                   if (*s == ' ')
12768                     ++s;
12769                   if (args[1] != *s)
12770                     {
12771                       if (c == 'e')
12772                         {
12773                           gas_assert (args[1] == ',');
12774                           regno = lastregno;
12775                           s = s_reset;
12776                           ++args;
12777                         }
12778                       else if (c == 't')
12779                         {
12780                           gas_assert (args[1] == ',');
12781                           s = s_reset;
12782                           ++args;
12783                           continue;                     /* Nothing to do.  */
12784                         }
12785                     }
12786
12787                   /* Make sure regno is the same as lastregno.  */
12788                   if (c == 't' && regno != lastregno)
12789                     break;
12790
12791                   /* Make sure regno is the same as destregno.  */
12792                   if (c == 'x' && regno != destregno)
12793                     break;
12794
12795                   /* We need to save regno, before regno maps to the
12796                      microMIPS register encoding.  */
12797                   lastregno = regno;
12798
12799                   if (c == 'f')
12800                     destregno = regno;
12801
12802                   switch (c)
12803                     {
12804                       case 'a':
12805                         if (regno != GP)
12806                           regno = ILLEGAL_REG;
12807                         break;
12808
12809                       case 'b':
12810                         regno = mips32_to_micromips_reg_b_map[regno];
12811                         break;
12812
12813                       case 'c':
12814                         regno = mips32_to_micromips_reg_c_map[regno];
12815                         break;
12816
12817                       case 'd':
12818                         regno = mips32_to_micromips_reg_d_map[regno];
12819                         break;
12820
12821                       case 'e':
12822                         regno = mips32_to_micromips_reg_e_map[regno];
12823                         break;
12824
12825                       case 'f':
12826                         regno = mips32_to_micromips_reg_f_map[regno];
12827                         break;
12828
12829                       case 'g':
12830                         regno = mips32_to_micromips_reg_g_map[regno];
12831                         break;
12832
12833                       case 'h':
12834                         regno = mips32_to_micromips_reg_h_map[regno];
12835                         break;
12836
12837                       case 'i':
12838                         switch (EXTRACT_OPERAND (1, MI, *ip))
12839                           {
12840                             case 4:
12841                               if (regno == 21)
12842                                 regno = 3;
12843                               else if (regno == 22)
12844                                 regno = 4;
12845                               else if (regno == 5)
12846                                 regno = 5;
12847                               else if (regno == 6)
12848                                 regno = 6;
12849                               else if (regno == 7)
12850                                 regno = 7;
12851                               else
12852                                 regno = ILLEGAL_REG;
12853                               break;
12854
12855                             case 5:
12856                               if (regno == 6)
12857                                 regno = 0;
12858                               else if (regno == 7)
12859                                 regno = 1;
12860                               else
12861                                 regno = ILLEGAL_REG;
12862                               break;
12863
12864                             case 6:
12865                               if (regno == 7)
12866                                 regno = 2;
12867                               else
12868                                 regno = ILLEGAL_REG;
12869                               break;
12870
12871                             default:
12872                               regno = ILLEGAL_REG;
12873                               break;
12874                           }
12875                         break;
12876
12877                       case 'l':
12878                         regno = mips32_to_micromips_reg_l_map[regno];
12879                         break;
12880
12881                       case 'm':
12882                         regno = mips32_to_micromips_reg_m_map[regno];
12883                         break;
12884
12885                       case 'n':
12886                         regno = mips32_to_micromips_reg_n_map[regno];
12887                         break;
12888
12889                       case 'q':
12890                         regno = mips32_to_micromips_reg_q_map[regno];
12891                         break;
12892
12893                       case 's':
12894                         if (regno != SP)
12895                           regno = ILLEGAL_REG;
12896                         break;
12897
12898                       case 'y':
12899                         if (regno != 31)
12900                           regno = ILLEGAL_REG;
12901                         break;
12902
12903                       case 'z':
12904                         if (regno != ZERO)
12905                           regno = ILLEGAL_REG;
12906                         break;
12907
12908                       case 'j': /* Do nothing.  */
12909                       case 'p':
12910                       case 't':
12911                       case 'x':
12912                         break;
12913
12914                       default:
12915                         abort ();
12916                     }
12917
12918                   if (regno == ILLEGAL_REG)
12919                     break;
12920
12921                   switch (c)
12922                     {
12923                       case 'b':
12924                         INSERT_OPERAND (1, MB, *ip, regno);
12925                         break;
12926
12927                       case 'c':
12928                         INSERT_OPERAND (1, MC, *ip, regno);
12929                         break;
12930
12931                       case 'd':
12932                         INSERT_OPERAND (1, MD, *ip, regno);
12933                         break;
12934
12935                       case 'e':
12936                         INSERT_OPERAND (1, ME, *ip, regno);
12937                         break;
12938
12939                       case 'f':
12940                         INSERT_OPERAND (1, MF, *ip, regno);
12941                         break;
12942
12943                       case 'g':
12944                         INSERT_OPERAND (1, MG, *ip, regno);
12945                         break;
12946
12947                       case 'h':
12948                         INSERT_OPERAND (1, MH, *ip, regno);
12949                         break;
12950
12951                       case 'i':
12952                         INSERT_OPERAND (1, MI, *ip, regno);
12953                         break;
12954
12955                       case 'j':
12956                         INSERT_OPERAND (1, MJ, *ip, regno);
12957                         break;
12958
12959                       case 'l':
12960                         INSERT_OPERAND (1, ML, *ip, regno);
12961                         break;
12962
12963                       case 'm':
12964                         INSERT_OPERAND (1, MM, *ip, regno);
12965                         break;
12966
12967                       case 'n':
12968                         INSERT_OPERAND (1, MN, *ip, regno);
12969                         break;
12970
12971                       case 'p':
12972                         INSERT_OPERAND (1, MP, *ip, regno);
12973                         break;
12974
12975                       case 'q':
12976                         INSERT_OPERAND (1, MQ, *ip, regno);
12977                         break;
12978
12979                       case 'a': /* Do nothing.  */
12980                       case 's': /* Do nothing.  */
12981                       case 't': /* Do nothing.  */
12982                       case 'x': /* Do nothing.  */
12983                       case 'y': /* Do nothing.  */
12984                       case 'z': /* Do nothing.  */
12985                         break;
12986
12987                       default:
12988                         abort ();
12989                     }
12990                   continue;
12991
12992                 case 'A':
12993                   {
12994                     bfd_reloc_code_real_type r[3];
12995                     expressionS ep;
12996                     int imm;
12997
12998                     /* Check whether there is only a single bracketed
12999                        expression left.  If so, it must be the base register
13000                        and the constant must be zero.  */
13001                     if (*s == '(' && strchr (s + 1, '(') == 0)
13002                       {
13003                         INSERT_OPERAND (1, IMMA, *ip, 0);
13004                         continue;
13005                       }
13006
13007                     if (my_getSmallExpression (&ep, r, s) > 0
13008                         || !expr_const_in_range (&ep, -64, 64, 2))
13009                       break;
13010
13011                     imm = ep.X_add_number >> 2;
13012                     INSERT_OPERAND (1, IMMA, *ip, imm);
13013                   }
13014                   s = expr_end;
13015                   continue;
13016
13017                 case 'B':
13018                   {
13019                     bfd_reloc_code_real_type r[3];
13020                     expressionS ep;
13021                     int imm;
13022
13023                     if (my_getSmallExpression (&ep, r, s) > 0
13024                         || ep.X_op != O_constant)
13025                       break;
13026
13027                     for (imm = 0; imm < 8; imm++)
13028                       if (micromips_imm_b_map[imm] == ep.X_add_number)
13029                         break;
13030                     if (imm >= 8)
13031                       break;
13032
13033                     INSERT_OPERAND (1, IMMB, *ip, imm);
13034                   }
13035                   s = expr_end;
13036                   continue;
13037
13038                 case 'C':
13039                   {
13040                     bfd_reloc_code_real_type r[3];
13041                     expressionS ep;
13042                     int imm;
13043
13044                     if (my_getSmallExpression (&ep, r, s) > 0
13045                         || ep.X_op != O_constant)
13046                       break;
13047
13048                     for (imm = 0; imm < 16; imm++)
13049                       if (micromips_imm_c_map[imm] == ep.X_add_number)
13050                         break;
13051                     if (imm >= 16)
13052                       break;
13053
13054                     INSERT_OPERAND (1, IMMC, *ip, imm);
13055                   }
13056                   s = expr_end;
13057                   continue;
13058
13059                 case 'D':       /* pc relative offset */
13060                 case 'E':       /* pc relative offset */
13061                   my_getExpression (&offset_expr, s);
13062                   if (offset_expr.X_op == O_register)
13063                     break;
13064
13065                   if (!forced_insn_length)
13066                     *offset_reloc = (int) BFD_RELOC_UNUSED + c;
13067                   else if (c == 'D')
13068                     *offset_reloc = BFD_RELOC_MICROMIPS_10_PCREL_S1;
13069                   else
13070                     *offset_reloc = BFD_RELOC_MICROMIPS_7_PCREL_S1;
13071                   s = expr_end;
13072                   continue;
13073
13074                 case 'F':
13075                   {
13076                     bfd_reloc_code_real_type r[3];
13077                     expressionS ep;
13078                     int imm;
13079
13080                     if (my_getSmallExpression (&ep, r, s) > 0
13081                         || !expr_const_in_range (&ep, 0, 16, 0))
13082                       break;
13083
13084                     imm = ep.X_add_number;
13085                     INSERT_OPERAND (1, IMMF, *ip, imm);
13086                   }
13087                   s = expr_end;
13088                   continue;
13089
13090                 case 'G':
13091                   {
13092                     bfd_reloc_code_real_type r[3];
13093                     expressionS ep;
13094                     int imm;
13095
13096                     /* Check whether there is only a single bracketed
13097                        expression left.  If so, it must be the base register
13098                        and the constant must be zero.  */
13099                     if (*s == '(' && strchr (s + 1, '(') == 0)
13100                       {
13101                         INSERT_OPERAND (1, IMMG, *ip, 0);
13102                         continue;
13103                       }
13104
13105                     if (my_getSmallExpression (&ep, r, s) > 0
13106                         || !expr_const_in_range (&ep, -1, 15, 0))
13107                       break;
13108
13109                     imm = ep.X_add_number & 15;
13110                     INSERT_OPERAND (1, IMMG, *ip, imm);
13111                   }
13112                   s = expr_end;
13113                   continue;
13114
13115                 case 'H':
13116                   {
13117                     bfd_reloc_code_real_type r[3];
13118                     expressionS ep;
13119                     int imm;
13120
13121                     /* Check whether there is only a single bracketed
13122                        expression left.  If so, it must be the base register
13123                        and the constant must be zero.  */
13124                     if (*s == '(' && strchr (s + 1, '(') == 0)
13125                       {
13126                         INSERT_OPERAND (1, IMMH, *ip, 0);
13127                         continue;
13128                       }
13129
13130                     if (my_getSmallExpression (&ep, r, s) > 0
13131                         || !expr_const_in_range (&ep, 0, 16, 1))
13132                       break;
13133
13134                     imm = ep.X_add_number >> 1;
13135                     INSERT_OPERAND (1, IMMH, *ip, imm);
13136                   }
13137                   s = expr_end;
13138                   continue;
13139
13140                 case 'I':
13141                   {
13142                     bfd_reloc_code_real_type r[3];
13143                     expressionS ep;
13144                     int imm;
13145
13146                     if (my_getSmallExpression (&ep, r, s) > 0
13147                         || !expr_const_in_range (&ep, -1, 127, 0))
13148                       break;
13149
13150                     imm = ep.X_add_number & 127;
13151                     INSERT_OPERAND (1, IMMI, *ip, imm);
13152                   }
13153                   s = expr_end;
13154                   continue;
13155
13156                 case 'J':
13157                   {
13158                     bfd_reloc_code_real_type r[3];
13159                     expressionS ep;
13160                     int imm;
13161
13162                     /* Check whether there is only a single bracketed
13163                        expression left.  If so, it must be the base register
13164                        and the constant must be zero.  */
13165                     if (*s == '(' && strchr (s + 1, '(') == 0)
13166                       {
13167                         INSERT_OPERAND (1, IMMJ, *ip, 0);
13168                         continue;
13169                       }
13170
13171                     if (my_getSmallExpression (&ep, r, s) > 0
13172                         || !expr_const_in_range (&ep, 0, 16, 2))
13173                       break;
13174
13175                     imm = ep.X_add_number >> 2;
13176                     INSERT_OPERAND (1, IMMJ, *ip, imm);
13177                   }
13178                   s = expr_end;
13179                   continue;
13180
13181                 case 'L':
13182                   {
13183                     bfd_reloc_code_real_type r[3];
13184                     expressionS ep;
13185                     int imm;
13186
13187                     /* Check whether there is only a single bracketed
13188                        expression left.  If so, it must be the base register
13189                        and the constant must be zero.  */
13190                     if (*s == '(' && strchr (s + 1, '(') == 0)
13191                       {
13192                         INSERT_OPERAND (1, IMML, *ip, 0);
13193                         continue;
13194                       }
13195
13196                     if (my_getSmallExpression (&ep, r, s) > 0
13197                         || !expr_const_in_range (&ep, 0, 16, 0))
13198                       break;
13199
13200                     imm = ep.X_add_number;
13201                     INSERT_OPERAND (1, IMML, *ip, imm);
13202                   }
13203                   s = expr_end;
13204                   continue;
13205
13206                 case 'M':
13207                   {
13208                     bfd_reloc_code_real_type r[3];
13209                     expressionS ep;
13210                     int imm;
13211
13212                     if (my_getSmallExpression (&ep, r, s) > 0
13213                         || !expr_const_in_range (&ep, 1, 9, 0))
13214                       break;
13215
13216                     imm = ep.X_add_number & 7;
13217                     INSERT_OPERAND (1, IMMM, *ip, imm);
13218                   }
13219                   s = expr_end;
13220                   continue;
13221
13222                 case 'N':       /* Register list for lwm and swm.  */
13223                   {
13224                     /* A comma-separated list of registers and/or
13225                        dash-separated contiguous ranges including
13226                        both ra and a set of one or more registers
13227                        starting at s0 up to s3 which have to be
13228                        consecutive, e.g.:
13229
13230                        s0, ra
13231                        s0, s1, ra, s2, s3
13232                        s0-s2, ra
13233
13234                        and any permutations of these.  */
13235                     unsigned int reglist;
13236                     int imm;
13237
13238                     if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
13239                       break;
13240
13241                     if ((reglist & 0xfff1ffff) != 0x80010000)
13242                       break;
13243
13244                     reglist = (reglist >> 17) & 7;
13245                     reglist += 1;
13246                     if ((reglist & -reglist) != reglist)
13247                       break;
13248
13249                     imm = ffs (reglist) - 1;
13250                     INSERT_OPERAND (1, IMMN, *ip, imm);
13251                   }
13252                   continue;
13253
13254                 case 'O':       /* sdbbp 4-bit code.  */
13255                   {
13256                     bfd_reloc_code_real_type r[3];
13257                     expressionS ep;
13258                     int imm;
13259
13260                     if (my_getSmallExpression (&ep, r, s) > 0
13261                         || !expr_const_in_range (&ep, 0, 16, 0))
13262                       break;
13263
13264                     imm = ep.X_add_number;
13265                     INSERT_OPERAND (1, IMMO, *ip, imm);
13266                   }
13267                   s = expr_end;
13268                   continue;
13269
13270                 case 'P':
13271                   {
13272                     bfd_reloc_code_real_type r[3];
13273                     expressionS ep;
13274                     int imm;
13275
13276                     if (my_getSmallExpression (&ep, r, s) > 0
13277                         || !expr_const_in_range (&ep, 0, 32, 2))
13278                       break;
13279
13280                     imm = ep.X_add_number >> 2;
13281                     INSERT_OPERAND (1, IMMP, *ip, imm);
13282                   }
13283                   s = expr_end;
13284                   continue;
13285
13286                 case 'Q':
13287                   {
13288                     bfd_reloc_code_real_type r[3];
13289                     expressionS ep;
13290                     int imm;
13291
13292                     if (my_getSmallExpression (&ep, r, s) > 0
13293                         || !expr_const_in_range (&ep, -0x400000, 0x400000, 2))
13294                       break;
13295
13296                     imm = ep.X_add_number >> 2;
13297                     INSERT_OPERAND (1, IMMQ, *ip, imm);
13298                   }
13299                   s = expr_end;
13300                   continue;
13301
13302                 case 'U':
13303                   {
13304                     bfd_reloc_code_real_type r[3];
13305                     expressionS ep;
13306                     int imm;
13307
13308                     /* Check whether there is only a single bracketed
13309                        expression left.  If so, it must be the base register
13310                        and the constant must be zero.  */
13311                     if (*s == '(' && strchr (s + 1, '(') == 0)
13312                       {
13313                         INSERT_OPERAND (1, IMMU, *ip, 0);
13314                         continue;
13315                       }
13316
13317                     if (my_getSmallExpression (&ep, r, s) > 0
13318                         || !expr_const_in_range (&ep, 0, 32, 2))
13319                       break;
13320
13321                     imm = ep.X_add_number >> 2;
13322                     INSERT_OPERAND (1, IMMU, *ip, imm);
13323                   }
13324                   s = expr_end;
13325                   continue;
13326
13327                 case 'W':
13328                   {
13329                     bfd_reloc_code_real_type r[3];
13330                     expressionS ep;
13331                     int imm;
13332
13333                     if (my_getSmallExpression (&ep, r, s) > 0
13334                         || !expr_const_in_range (&ep, 0, 64, 2))
13335                       break;
13336
13337                     imm = ep.X_add_number >> 2;
13338                     INSERT_OPERAND (1, IMMW, *ip, imm);
13339                   }
13340                   s = expr_end;
13341                   continue;
13342
13343                 case 'X':
13344                   {
13345                     bfd_reloc_code_real_type r[3];
13346                     expressionS ep;
13347                     int imm;
13348
13349                     if (my_getSmallExpression (&ep, r, s) > 0
13350                         || !expr_const_in_range (&ep, -8, 8, 0))
13351                       break;
13352
13353                     imm = ep.X_add_number;
13354                     INSERT_OPERAND (1, IMMX, *ip, imm);
13355                   }
13356                   s = expr_end;
13357                   continue;
13358
13359                 case 'Y':
13360                   {
13361                     bfd_reloc_code_real_type r[3];
13362                     expressionS ep;
13363                     int imm;
13364
13365                     if (my_getSmallExpression (&ep, r, s) > 0
13366                         || expr_const_in_range (&ep, -2, 2, 2)
13367                         || !expr_const_in_range (&ep, -258, 258, 2))
13368                       break;
13369
13370                     imm = ep.X_add_number >> 2;
13371                     imm = ((imm >> 1) & ~0xff) | (imm & 0xff);
13372                     INSERT_OPERAND (1, IMMY, *ip, imm);
13373                   }
13374                   s = expr_end;
13375                   continue;
13376
13377                 case 'Z':
13378                   {
13379                     bfd_reloc_code_real_type r[3];
13380                     expressionS ep;
13381
13382                     if (my_getSmallExpression (&ep, r, s) > 0
13383                         || !expr_const_in_range (&ep, 0, 1, 0))
13384                       break;
13385                   }
13386                   s = expr_end;
13387                   continue;
13388
13389                 default:
13390                   as_bad (_("Internal error: bad microMIPS opcode "
13391                             "(unknown extension operand type `m%c'): %s %s"),
13392                           *args, insn->name, insn->args);
13393                   /* Further processing is fruitless.  */
13394                   return;
13395                 }
13396               break;
13397
13398             case 'n':           /* Register list for 32-bit lwm and swm.  */
13399               gas_assert (mips_opts.micromips);
13400               {
13401                 /* A comma-separated list of registers and/or
13402                    dash-separated contiguous ranges including
13403                    at least one of ra and a set of one or more
13404                    registers starting at s0 up to s7 and then
13405                    s8 which have to be consecutive, e.g.:
13406
13407                    ra
13408                    s0
13409                    ra, s0, s1, s2
13410                    s0-s8
13411                    s0-s5, ra
13412
13413                    and any permutations of these.  */
13414                 unsigned int reglist;
13415                 int imm;
13416                 int ra;
13417
13418                 if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
13419                   break;
13420
13421                 if ((reglist & 0x3f00ffff) != 0)
13422                   break;
13423
13424                 ra = (reglist >> 27) & 0x10;
13425                 reglist = ((reglist >> 22) & 0x100) | ((reglist >> 16) & 0xff);
13426                 reglist += 1;
13427                 if ((reglist & -reglist) != reglist)
13428                   break;
13429
13430                 imm = (ffs (reglist) - 1) | ra;
13431                 INSERT_OPERAND (1, RT, *ip, imm);
13432                 imm_expr.X_op = O_absent;
13433               }
13434               continue;
13435
13436             case '|':           /* 4-bit trap code.  */
13437               gas_assert (mips_opts.micromips);
13438               my_getExpression (&imm_expr, s);
13439               check_absolute_expr (ip, &imm_expr);
13440               if ((unsigned long) imm_expr.X_add_number
13441                   > MICROMIPSOP_MASK_TRAP)
13442                 as_bad (_("Trap code (%lu) for %s not in 0..15 range"),
13443                         (unsigned long) imm_expr.X_add_number,
13444                         ip->insn_mo->name);
13445               INSERT_OPERAND (1, TRAP, *ip, imm_expr.X_add_number);
13446               imm_expr.X_op = O_absent;
13447               s = expr_end;
13448               continue;
13449
13450             default:
13451               as_bad (_("Bad char = '%c'\n"), *args);
13452               abort ();
13453             }
13454           break;
13455         }
13456       /* Args don't match.  */
13457       s = argsStart;
13458       insn_error = _("Illegal operands");
13459       if (insn + 1 < past && !strcmp (insn->name, insn[1].name))
13460         {
13461           ++insn;
13462           continue;
13463         }
13464       else if (wrong_delay_slot_insns && need_delay_slot_ok)
13465         {
13466           gas_assert (firstinsn);
13467           need_delay_slot_ok = FALSE;
13468           past = insn + 1;
13469           insn = firstinsn;
13470           continue;
13471         }
13472       return;
13473     }
13474 }
13475
13476 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
13477
13478 /* This routine assembles an instruction into its binary format when
13479    assembling for the mips16.  As a side effect, it sets one of the
13480    global variables imm_reloc or offset_reloc to the type of relocation
13481    to do if one of the operands is an address expression.  It also sets
13482    forced_insn_length to the resulting instruction size in bytes if the
13483    user explicitly requested a small or extended instruction.  */
13484
13485 static void
13486 mips16_ip (char *str, struct mips_cl_insn *ip)
13487 {
13488   char *s;
13489   const char *args;
13490   struct mips_opcode *insn;
13491   char *argsstart;
13492   unsigned int regno;
13493   unsigned int lastregno = 0;
13494   char *s_reset;
13495   size_t i;
13496
13497   insn_error = NULL;
13498
13499   forced_insn_length = 0;
13500
13501   for (s = str; ISLOWER (*s); ++s)
13502     ;
13503   switch (*s)
13504     {
13505     case '\0':
13506       break;
13507
13508     case ' ':
13509       *s++ = '\0';
13510       break;
13511
13512     case '.':
13513       if (s[1] == 't' && s[2] == ' ')
13514         {
13515           *s = '\0';
13516           forced_insn_length = 2;
13517           s += 3;
13518           break;
13519         }
13520       else if (s[1] == 'e' && s[2] == ' ')
13521         {
13522           *s = '\0';
13523           forced_insn_length = 4;
13524           s += 3;
13525           break;
13526         }
13527       /* Fall through.  */
13528     default:
13529       insn_error = _("unknown opcode");
13530       return;
13531     }
13532
13533   if (mips_opts.noautoextend && !forced_insn_length)
13534     forced_insn_length = 2;
13535
13536   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
13537     {
13538       insn_error = _("unrecognized opcode");
13539       return;
13540     }
13541
13542   argsstart = s;
13543   for (;;)
13544     {
13545       bfd_boolean ok;
13546
13547       gas_assert (strcmp (insn->name, str) == 0);
13548
13549       ok = is_opcode_valid_16 (insn);
13550       if (! ok)
13551         {
13552           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
13553               && strcmp (insn->name, insn[1].name) == 0)
13554             {
13555               ++insn;
13556               continue;
13557             }
13558           else
13559             {
13560               if (!insn_error)
13561                 {
13562                   static char buf[100];
13563                   sprintf (buf,
13564                            _("Opcode not supported on this processor: %s (%s)"),
13565                            mips_cpu_info_from_arch (mips_opts.arch)->name,
13566                            mips_cpu_info_from_isa (mips_opts.isa)->name);
13567                   insn_error = buf;
13568                 }
13569               return;
13570             }
13571         }
13572
13573       create_insn (ip, insn);
13574       imm_expr.X_op = O_absent;
13575       imm_reloc[0] = BFD_RELOC_UNUSED;
13576       imm_reloc[1] = BFD_RELOC_UNUSED;
13577       imm_reloc[2] = BFD_RELOC_UNUSED;
13578       imm2_expr.X_op = O_absent;
13579       offset_expr.X_op = O_absent;
13580       offset_reloc[0] = BFD_RELOC_UNUSED;
13581       offset_reloc[1] = BFD_RELOC_UNUSED;
13582       offset_reloc[2] = BFD_RELOC_UNUSED;
13583       for (args = insn->args; 1; ++args)
13584         {
13585           int c;
13586
13587           if (*s == ' ')
13588             ++s;
13589
13590           /* In this switch statement we call break if we did not find
13591              a match, continue if we did find a match, or return if we
13592              are done.  */
13593
13594           c = *args;
13595           switch (c)
13596             {
13597             case '\0':
13598               if (*s == '\0')
13599                 {
13600                   offsetT value;
13601
13602                   /* Stuff the immediate value in now, if we can.  */
13603                   if (imm_expr.X_op == O_constant
13604                       && *imm_reloc > BFD_RELOC_UNUSED
13605                       && insn->pinfo != INSN_MACRO
13606                       && calculate_reloc (*offset_reloc,
13607                                           imm_expr.X_add_number, &value))
13608                     {
13609                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
13610                                     *offset_reloc, value, forced_insn_length,
13611                                     &ip->insn_opcode);
13612                       imm_expr.X_op = O_absent;
13613                       *imm_reloc = BFD_RELOC_UNUSED;
13614                       *offset_reloc = BFD_RELOC_UNUSED;
13615                     }
13616
13617                   return;
13618                 }
13619               break;
13620
13621             case ',':
13622               if (*s++ == c)
13623                 continue;
13624               s--;
13625               switch (*++args)
13626                 {
13627                 case 'v':
13628                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13629                   continue;
13630                 case 'w':
13631                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13632                   continue;
13633                 }
13634               break;
13635
13636             case '(':
13637             case ')':
13638               if (*s++ == c)
13639                 continue;
13640               break;
13641
13642             case 'v':
13643             case 'w':
13644               if (s[0] != '$')
13645                 {
13646                   if (c == 'v')
13647                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13648                   else
13649                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13650                   ++args;
13651                   continue;
13652                 }
13653               /* Fall through.  */
13654             case 'x':
13655             case 'y':
13656             case 'z':
13657             case 'Z':
13658             case '0':
13659             case 'S':
13660             case 'R':
13661             case 'X':
13662             case 'Y':
13663               s_reset = s;
13664               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
13665                 {
13666                   if (c == 'v' || c == 'w')
13667                     {
13668                       if (c == 'v')
13669                         MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13670                       else
13671                         MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13672                       ++args;
13673                       continue;
13674                     }
13675                   break;
13676                 }
13677
13678               if (*s == ' ')
13679                 ++s;
13680               if (args[1] != *s)
13681                 {
13682                   if (c == 'v' || c == 'w')
13683                     {
13684                       regno = mips16_to_32_reg_map[lastregno];
13685                       s = s_reset;
13686                       ++args;
13687                     }
13688                 }
13689
13690               switch (c)
13691                 {
13692                 case 'x':
13693                 case 'y':
13694                 case 'z':
13695                 case 'v':
13696                 case 'w':
13697                 case 'Z':
13698                   regno = mips32_to_16_reg_map[regno];
13699                   break;
13700
13701                 case '0':
13702                   if (regno != 0)
13703                     regno = ILLEGAL_REG;
13704                   break;
13705
13706                 case 'S':
13707                   if (regno != SP)
13708                     regno = ILLEGAL_REG;
13709                   break;
13710
13711                 case 'R':
13712                   if (regno != RA)
13713                     regno = ILLEGAL_REG;
13714                   break;
13715
13716                 case 'X':
13717                 case 'Y':
13718                   if (regno == AT && mips_opts.at)
13719                     {
13720                       if (mips_opts.at == ATREG)
13721                         as_warn (_("used $at without \".set noat\""));
13722                       else
13723                         as_warn (_("used $%u with \".set at=$%u\""),
13724                                  regno, mips_opts.at);
13725                     }
13726                   break;
13727
13728                 default:
13729                   abort ();
13730                 }
13731
13732               if (regno == ILLEGAL_REG)
13733                 break;
13734
13735               switch (c)
13736                 {
13737                 case 'x':
13738                 case 'v':
13739                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
13740                   break;
13741                 case 'y':
13742                 case 'w':
13743                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
13744                   break;
13745                 case 'z':
13746                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
13747                   break;
13748                 case 'Z':
13749                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
13750                 case '0':
13751                 case 'S':
13752                 case 'R':
13753                   break;
13754                 case 'X':
13755                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
13756                   break;
13757                 case 'Y':
13758                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
13759                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
13760                   break;
13761                 default:
13762                   abort ();
13763                 }
13764
13765               lastregno = regno;
13766               continue;
13767
13768             case 'P':
13769               if (strncmp (s, "$pc", 3) == 0)
13770                 {
13771                   s += 3;
13772                   continue;
13773                 }
13774               break;
13775
13776             case '5':
13777             case 'H':
13778             case 'W':
13779             case 'D':
13780             case 'j':
13781             case 'V':
13782             case 'C':
13783             case 'U':
13784             case 'k':
13785             case 'K':
13786               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
13787               if (i > 0)
13788                 {
13789                   if (imm_expr.X_op != O_constant)
13790                     {
13791                       forced_insn_length = 4;
13792                       ip->insn_opcode |= MIPS16_EXTEND;
13793                     }
13794                   else
13795                     {
13796                       /* We need to relax this instruction.  */
13797                       *offset_reloc = *imm_reloc;
13798                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13799                     }
13800                   s = expr_end;
13801                   continue;
13802                 }
13803               *imm_reloc = BFD_RELOC_UNUSED;
13804               /* Fall through.  */
13805             case '<':
13806             case '>':
13807             case '[':
13808             case ']':
13809             case '4':
13810             case '8':
13811               my_getExpression (&imm_expr, s);
13812               if (imm_expr.X_op == O_register)
13813                 {
13814                   /* What we thought was an expression turned out to
13815                      be a register.  */
13816
13817                   if (s[0] == '(' && args[1] == '(')
13818                     {
13819                       /* It looks like the expression was omitted
13820                          before a register indirection, which means
13821                          that the expression is implicitly zero.  We
13822                          still set up imm_expr, so that we handle
13823                          explicit extensions correctly.  */
13824                       imm_expr.X_op = O_constant;
13825                       imm_expr.X_add_number = 0;
13826                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13827                       continue;
13828                     }
13829
13830                   break;
13831                 }
13832
13833               /* We need to relax this instruction.  */
13834               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13835               s = expr_end;
13836               continue;
13837
13838             case 'p':
13839             case 'q':
13840             case 'A':
13841             case 'B':
13842             case 'E':
13843               /* We use offset_reloc rather than imm_reloc for the PC
13844                  relative operands.  This lets macros with both
13845                  immediate and address operands work correctly.  */
13846               my_getExpression (&offset_expr, s);
13847
13848               if (offset_expr.X_op == O_register)
13849                 break;
13850
13851               /* We need to relax this instruction.  */
13852               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
13853               s = expr_end;
13854               continue;
13855
13856             case '6':           /* break code */
13857               my_getExpression (&imm_expr, s);
13858               check_absolute_expr (ip, &imm_expr);
13859               if ((unsigned long) imm_expr.X_add_number > 63)
13860                 as_warn (_("Invalid value for `%s' (%lu)"),
13861                          ip->insn_mo->name,
13862                          (unsigned long) imm_expr.X_add_number);
13863               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
13864               imm_expr.X_op = O_absent;
13865               s = expr_end;
13866               continue;
13867
13868             case 'a':           /* 26 bit address */
13869               my_getExpression (&offset_expr, s);
13870               s = expr_end;
13871               *offset_reloc = BFD_RELOC_MIPS16_JMP;
13872               ip->insn_opcode <<= 16;
13873               continue;
13874
13875             case 'l':           /* register list for entry macro */
13876             case 'L':           /* register list for exit macro */
13877               {
13878                 int mask;
13879
13880                 if (c == 'l')
13881                   mask = 0;
13882                 else
13883                   mask = 7 << 3;
13884                 while (*s != '\0')
13885                   {
13886                     unsigned int freg, reg1, reg2;
13887
13888                     while (*s == ' ' || *s == ',')
13889                       ++s;
13890                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
13891                       freg = 0;
13892                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
13893                       freg = 1;
13894                     else
13895                       {
13896                         as_bad (_("can't parse register list"));
13897                         break;
13898                       }
13899                     if (*s == ' ')
13900                       ++s;
13901                     if (*s != '-')
13902                       reg2 = reg1;
13903                     else
13904                       {
13905                         ++s;
13906                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
13907                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
13908                           {
13909                             as_bad (_("invalid register list"));
13910                             break;
13911                           }
13912                       }
13913                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
13914                       {
13915                         mask &= ~ (7 << 3);
13916                         mask |= 5 << 3;
13917                       }
13918                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
13919                       {
13920                         mask &= ~ (7 << 3);
13921                         mask |= 6 << 3;
13922                       }
13923                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
13924                       mask |= (reg2 - 3) << 3;
13925                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
13926                       mask |= (reg2 - 15) << 1;
13927                     else if (reg1 == RA && reg2 == RA)
13928                       mask |= 1;
13929                     else
13930                       {
13931                         as_bad (_("invalid register list"));
13932                         break;
13933                       }
13934                   }
13935                 /* The mask is filled in in the opcode table for the
13936                    benefit of the disassembler.  We remove it before
13937                    applying the actual mask.  */
13938                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
13939                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
13940               }
13941             continue;
13942
13943             case 'm':           /* Register list for save insn.  */
13944             case 'M':           /* Register list for restore insn.  */
13945               {
13946                 int opcode = ip->insn_opcode;
13947                 int framesz = 0, seen_framesz = 0;
13948                 int nargs = 0, statics = 0, sregs = 0;
13949
13950                 while (*s != '\0')
13951                   {
13952                     unsigned int reg1, reg2;
13953
13954                     SKIP_SPACE_TABS (s);
13955                     while (*s == ',')
13956                       ++s;
13957                     SKIP_SPACE_TABS (s);
13958
13959                     my_getExpression (&imm_expr, s);
13960                     if (imm_expr.X_op == O_constant)
13961                       {
13962                         /* Handle the frame size.  */
13963                         if (seen_framesz)
13964                           {
13965                             as_bad (_("more than one frame size in list"));
13966                             break;
13967                           }
13968                         seen_framesz = 1;
13969                         framesz = imm_expr.X_add_number;
13970                         imm_expr.X_op = O_absent;
13971                         s = expr_end;
13972                         continue;
13973                       }
13974
13975                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
13976                       {
13977                         as_bad (_("can't parse register list"));
13978                         break;
13979                       }
13980
13981                     while (*s == ' ')
13982                       ++s;
13983
13984                     if (*s != '-')
13985                       reg2 = reg1;
13986                     else
13987                       {
13988                         ++s;
13989                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
13990                             || reg2 < reg1)
13991                           {
13992                             as_bad (_("can't parse register list"));
13993                             break;
13994                           }
13995                       }
13996
13997                     while (reg1 <= reg2)
13998                       {
13999                         if (reg1 >= 4 && reg1 <= 7)
14000                           {
14001                             if (!seen_framesz)
14002                                 /* args $a0-$a3 */
14003                                 nargs |= 1 << (reg1 - 4);
14004                             else
14005                                 /* statics $a0-$a3 */
14006                                 statics |= 1 << (reg1 - 4);
14007                           }
14008                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
14009                           {
14010                             /* $s0-$s8 */
14011                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
14012                           }
14013                         else if (reg1 == 31)
14014                           {
14015                             /* Add $ra to insn.  */
14016                             opcode |= 0x40;
14017                           }
14018                         else
14019                           {
14020                             as_bad (_("unexpected register in list"));
14021                             break;
14022                           }
14023                         if (++reg1 == 24)
14024                           reg1 = 30;
14025                       }
14026                   }
14027
14028                 /* Encode args/statics combination.  */
14029                 if (nargs & statics)
14030                   as_bad (_("arg/static registers overlap"));
14031                 else if (nargs == 0xf)
14032                   /* All $a0-$a3 are args.  */
14033                   opcode |= MIPS16_ALL_ARGS << 16;
14034                 else if (statics == 0xf)
14035                   /* All $a0-$a3 are statics.  */
14036                   opcode |= MIPS16_ALL_STATICS << 16;
14037                 else 
14038                   {
14039                     int narg = 0, nstat = 0;
14040
14041                     /* Count arg registers.  */
14042                     while (nargs & 0x1)
14043                       {
14044                         nargs >>= 1;
14045                         narg++;
14046                       }
14047                     if (nargs != 0)
14048                       as_bad (_("invalid arg register list"));
14049
14050                     /* Count static registers.  */
14051                     while (statics & 0x8)
14052                       {
14053                         statics = (statics << 1) & 0xf;
14054                         nstat++;
14055                       }
14056                     if (statics != 0) 
14057                       as_bad (_("invalid static register list"));
14058
14059                     /* Encode args/statics.  */
14060                     opcode |= ((narg << 2) | nstat) << 16;
14061                   }
14062
14063                 /* Encode $s0/$s1.  */
14064                 if (sregs & (1 << 0))           /* $s0 */
14065                   opcode |= 0x20;
14066                 if (sregs & (1 << 1))           /* $s1 */
14067                   opcode |= 0x10;
14068                 sregs >>= 2;
14069
14070                 if (sregs != 0)
14071                   {
14072                     /* Count regs $s2-$s8.  */
14073                     int nsreg = 0;
14074                     while (sregs & 1)
14075                       {
14076                         sregs >>= 1;
14077                         nsreg++;
14078                       }
14079                     if (sregs != 0)
14080                       as_bad (_("invalid static register list"));
14081                     /* Encode $s2-$s8. */
14082                     opcode |= nsreg << 24;
14083                   }
14084
14085                 /* Encode frame size.  */
14086                 if (!seen_framesz)
14087                   as_bad (_("missing frame size"));
14088                 else if ((framesz & 7) != 0 || framesz < 0
14089                          || framesz > 0xff * 8)
14090                   as_bad (_("invalid frame size"));
14091                 else if (framesz != 128 || (opcode >> 16) != 0)
14092                   {
14093                     framesz /= 8;
14094                     opcode |= (((framesz & 0xf0) << 16)
14095                              | (framesz & 0x0f));
14096                   }
14097
14098                 /* Finally build the instruction.  */
14099                 if ((opcode >> 16) != 0 || framesz == 0)
14100                   opcode |= MIPS16_EXTEND;
14101                 ip->insn_opcode = opcode;
14102               }
14103             continue;
14104
14105             case 'e':           /* extend code */
14106               my_getExpression (&imm_expr, s);
14107               check_absolute_expr (ip, &imm_expr);
14108               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
14109                 {
14110                   as_warn (_("Invalid value for `%s' (%lu)"),
14111                            ip->insn_mo->name,
14112                            (unsigned long) imm_expr.X_add_number);
14113                   imm_expr.X_add_number &= 0x7ff;
14114                 }
14115               ip->insn_opcode |= imm_expr.X_add_number;
14116               imm_expr.X_op = O_absent;
14117               s = expr_end;
14118               continue;
14119
14120             default:
14121               abort ();
14122             }
14123           break;
14124         }
14125
14126       /* Args don't match.  */
14127       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
14128           strcmp (insn->name, insn[1].name) == 0)
14129         {
14130           ++insn;
14131           s = argsstart;
14132           continue;
14133         }
14134
14135       insn_error = _("illegal operands");
14136
14137       return;
14138     }
14139 }
14140
14141 /* This structure holds information we know about a mips16 immediate
14142    argument type.  */
14143
14144 struct mips16_immed_operand
14145 {
14146   /* The type code used in the argument string in the opcode table.  */
14147   int type;
14148   /* The number of bits in the short form of the opcode.  */
14149   int nbits;
14150   /* The number of bits in the extended form of the opcode.  */
14151   int extbits;
14152   /* The amount by which the short form is shifted when it is used;
14153      for example, the sw instruction has a shift count of 2.  */
14154   int shift;
14155   /* The amount by which the short form is shifted when it is stored
14156      into the instruction code.  */
14157   int op_shift;
14158   /* Non-zero if the short form is unsigned.  */
14159   int unsp;
14160   /* Non-zero if the extended form is unsigned.  */
14161   int extu;
14162   /* Non-zero if the value is PC relative.  */
14163   int pcrel;
14164 };
14165
14166 /* The mips16 immediate operand types.  */
14167
14168 static const struct mips16_immed_operand mips16_immed_operands[] =
14169 {
14170   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
14171   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
14172   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
14173   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
14174   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
14175   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
14176   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
14177   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
14178   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
14179   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
14180   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
14181   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
14182   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
14183   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
14184   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
14185   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
14186   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
14187   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
14188   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
14189   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
14190   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
14191 };
14192
14193 #define MIPS16_NUM_IMMED \
14194   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
14195
14196 /* Marshal immediate value VAL for an extended MIPS16 instruction.
14197    NBITS is the number of significant bits in VAL.  */
14198
14199 static unsigned long
14200 mips16_immed_extend (offsetT val, unsigned int nbits)
14201 {
14202   int extval;
14203   if (nbits == 16)
14204     {
14205       extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
14206       val &= 0x1f;
14207     }
14208   else if (nbits == 15)
14209     {
14210       extval = ((val >> 11) & 0xf) | (val & 0x7f0);
14211       val &= 0xf;
14212     }
14213   else
14214     {
14215       extval = ((val & 0x1f) << 6) | (val & 0x20);
14216       val = 0;
14217     }
14218   return (extval << 16) | val;
14219 }
14220
14221 /* Install immediate value VAL into MIPS16 instruction *INSN,
14222    extending it if necessary.  The instruction in *INSN may
14223    already be extended.
14224
14225    RELOC is the relocation that produced VAL, or BFD_RELOC_UNUSED
14226    if none.  In the former case, VAL is a 16-bit number with no
14227    defined signedness.
14228
14229    TYPE is the type of the immediate field.  USER_INSN_LENGTH
14230    is the length that the user requested, or 0 if none.  */
14231
14232 static void
14233 mips16_immed (char *file, unsigned int line, int type,
14234               bfd_reloc_code_real_type reloc, offsetT val,
14235               unsigned int user_insn_length, unsigned long *insn)
14236 {
14237   const struct mips16_immed_operand *op;
14238   int mintiny, maxtiny;
14239
14240   op = mips16_immed_operands;
14241   while (op->type != type)
14242     {
14243       ++op;
14244       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
14245     }
14246
14247   if (op->unsp)
14248     {
14249       if (type == '<' || type == '>' || type == '[' || type == ']')
14250         {
14251           mintiny = 1;
14252           maxtiny = 1 << op->nbits;
14253         }
14254       else
14255         {
14256           mintiny = 0;
14257           maxtiny = (1 << op->nbits) - 1;
14258         }
14259       if (reloc != BFD_RELOC_UNUSED)
14260         val &= 0xffff;
14261     }
14262   else
14263     {
14264       mintiny = - (1 << (op->nbits - 1));
14265       maxtiny = (1 << (op->nbits - 1)) - 1;
14266       if (reloc != BFD_RELOC_UNUSED)
14267         val = SEXT_16BIT (val);
14268     }
14269
14270   /* Branch offsets have an implicit 0 in the lowest bit.  */
14271   if (type == 'p' || type == 'q')
14272     val /= 2;
14273
14274   if ((val & ((1 << op->shift) - 1)) != 0
14275       || val < (mintiny << op->shift)
14276       || val > (maxtiny << op->shift))
14277     {
14278       /* We need an extended instruction.  */
14279       if (user_insn_length == 2)
14280         as_bad_where (file, line, _("invalid unextended operand value"));
14281       else
14282         *insn |= MIPS16_EXTEND;
14283     }
14284   else if (user_insn_length == 4)
14285     {
14286       /* The operand doesn't force an unextended instruction to be extended.
14287          Warn if the user wanted an extended instruction anyway.  */
14288       *insn |= MIPS16_EXTEND;
14289       as_warn_where (file, line,
14290                      _("extended operand requested but not required"));
14291     }
14292
14293   if (mips16_opcode_length (*insn) == 2)
14294     {
14295       int insnval;
14296
14297       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
14298       insnval <<= op->op_shift;
14299       *insn |= insnval;
14300     }
14301   else
14302     {
14303       long minext, maxext;
14304
14305       if (reloc == BFD_RELOC_UNUSED)
14306         {
14307           if (op->extu)
14308             {
14309               minext = 0;
14310               maxext = (1 << op->extbits) - 1;
14311             }
14312           else
14313             {
14314               minext = - (1 << (op->extbits - 1));
14315               maxext = (1 << (op->extbits - 1)) - 1;
14316             }
14317           if (val < minext || val > maxext)
14318             as_bad_where (file, line,
14319                           _("operand value out of range for instruction"));
14320         }
14321
14322       *insn |= mips16_immed_extend (val, op->extbits);
14323     }
14324 }
14325 \f
14326 struct percent_op_match
14327 {
14328   const char *str;
14329   bfd_reloc_code_real_type reloc;
14330 };
14331
14332 static const struct percent_op_match mips_percent_op[] =
14333 {
14334   {"%lo", BFD_RELOC_LO16},
14335 #ifdef OBJ_ELF
14336   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
14337   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
14338   {"%call16", BFD_RELOC_MIPS_CALL16},
14339   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
14340   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
14341   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
14342   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
14343   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
14344   {"%got", BFD_RELOC_MIPS_GOT16},
14345   {"%gp_rel", BFD_RELOC_GPREL16},
14346   {"%half", BFD_RELOC_16},
14347   {"%highest", BFD_RELOC_MIPS_HIGHEST},
14348   {"%higher", BFD_RELOC_MIPS_HIGHER},
14349   {"%neg", BFD_RELOC_MIPS_SUB},
14350   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
14351   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
14352   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
14353   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
14354   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
14355   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
14356   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
14357 #endif
14358   {"%hi", BFD_RELOC_HI16_S}
14359 };
14360
14361 static const struct percent_op_match mips16_percent_op[] =
14362 {
14363   {"%lo", BFD_RELOC_MIPS16_LO16},
14364   {"%gprel", BFD_RELOC_MIPS16_GPREL},
14365   {"%got", BFD_RELOC_MIPS16_GOT16},
14366   {"%call16", BFD_RELOC_MIPS16_CALL16},
14367   {"%hi", BFD_RELOC_MIPS16_HI16_S},
14368   {"%tlsgd", BFD_RELOC_MIPS16_TLS_GD},
14369   {"%tlsldm", BFD_RELOC_MIPS16_TLS_LDM},
14370   {"%dtprel_hi", BFD_RELOC_MIPS16_TLS_DTPREL_HI16},
14371   {"%dtprel_lo", BFD_RELOC_MIPS16_TLS_DTPREL_LO16},
14372   {"%tprel_hi", BFD_RELOC_MIPS16_TLS_TPREL_HI16},
14373   {"%tprel_lo", BFD_RELOC_MIPS16_TLS_TPREL_LO16},
14374   {"%gottprel", BFD_RELOC_MIPS16_TLS_GOTTPREL}
14375 };
14376
14377
14378 /* Return true if *STR points to a relocation operator.  When returning true,
14379    move *STR over the operator and store its relocation code in *RELOC.
14380    Leave both *STR and *RELOC alone when returning false.  */
14381
14382 static bfd_boolean
14383 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
14384 {
14385   const struct percent_op_match *percent_op;
14386   size_t limit, i;
14387
14388   if (mips_opts.mips16)
14389     {
14390       percent_op = mips16_percent_op;
14391       limit = ARRAY_SIZE (mips16_percent_op);
14392     }
14393   else
14394     {
14395       percent_op = mips_percent_op;
14396       limit = ARRAY_SIZE (mips_percent_op);
14397     }
14398
14399   for (i = 0; i < limit; i++)
14400     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
14401       {
14402         int len = strlen (percent_op[i].str);
14403
14404         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
14405           continue;
14406
14407         *str += strlen (percent_op[i].str);
14408         *reloc = percent_op[i].reloc;
14409
14410         /* Check whether the output BFD supports this relocation.
14411            If not, issue an error and fall back on something safe.  */
14412         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
14413           {
14414             as_bad (_("relocation %s isn't supported by the current ABI"),
14415                     percent_op[i].str);
14416             *reloc = BFD_RELOC_UNUSED;
14417           }
14418         return TRUE;
14419       }
14420   return FALSE;
14421 }
14422
14423
14424 /* Parse string STR as a 16-bit relocatable operand.  Store the
14425    expression in *EP and the relocations in the array starting
14426    at RELOC.  Return the number of relocation operators used.
14427
14428    On exit, EXPR_END points to the first character after the expression.  */
14429
14430 static size_t
14431 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
14432                        char *str)
14433 {
14434   bfd_reloc_code_real_type reversed_reloc[3];
14435   size_t reloc_index, i;
14436   int crux_depth, str_depth;
14437   char *crux;
14438
14439   /* Search for the start of the main expression, recoding relocations
14440      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
14441      of the main expression and with CRUX_DEPTH containing the number
14442      of open brackets at that point.  */
14443   reloc_index = -1;
14444   str_depth = 0;
14445   do
14446     {
14447       reloc_index++;
14448       crux = str;
14449       crux_depth = str_depth;
14450
14451       /* Skip over whitespace and brackets, keeping count of the number
14452          of brackets.  */
14453       while (*str == ' ' || *str == '\t' || *str == '(')
14454         if (*str++ == '(')
14455           str_depth++;
14456     }
14457   while (*str == '%'
14458          && reloc_index < (HAVE_NEWABI ? 3 : 1)
14459          && parse_relocation (&str, &reversed_reloc[reloc_index]));
14460
14461   my_getExpression (ep, crux);
14462   str = expr_end;
14463
14464   /* Match every open bracket.  */
14465   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
14466     if (*str++ == ')')
14467       crux_depth--;
14468
14469   if (crux_depth > 0)
14470     as_bad (_("unclosed '('"));
14471
14472   expr_end = str;
14473
14474   if (reloc_index != 0)
14475     {
14476       prev_reloc_op_frag = frag_now;
14477       for (i = 0; i < reloc_index; i++)
14478         reloc[i] = reversed_reloc[reloc_index - 1 - i];
14479     }
14480
14481   return reloc_index;
14482 }
14483
14484 static void
14485 my_getExpression (expressionS *ep, char *str)
14486 {
14487   char *save_in;
14488
14489   save_in = input_line_pointer;
14490   input_line_pointer = str;
14491   expression (ep);
14492   expr_end = input_line_pointer;
14493   input_line_pointer = save_in;
14494 }
14495
14496 char *
14497 md_atof (int type, char *litP, int *sizeP)
14498 {
14499   return ieee_md_atof (type, litP, sizeP, target_big_endian);
14500 }
14501
14502 void
14503 md_number_to_chars (char *buf, valueT val, int n)
14504 {
14505   if (target_big_endian)
14506     number_to_chars_bigendian (buf, val, n);
14507   else
14508     number_to_chars_littleendian (buf, val, n);
14509 }
14510 \f
14511 #ifdef OBJ_ELF
14512 static int support_64bit_objects(void)
14513 {
14514   const char **list, **l;
14515   int yes;
14516
14517   list = bfd_target_list ();
14518   for (l = list; *l != NULL; l++)
14519     if (strcmp (*l, ELF_TARGET ("elf64-", "big")) == 0
14520         || strcmp (*l, ELF_TARGET ("elf64-", "little")) == 0)
14521       break;
14522   yes = (*l != NULL);
14523   free (list);
14524   return yes;
14525 }
14526 #endif /* OBJ_ELF */
14527
14528 const char *md_shortopts = "O::g::G:";
14529
14530 enum options
14531   {
14532     OPTION_MARCH = OPTION_MD_BASE,
14533     OPTION_MTUNE,
14534     OPTION_MIPS1,
14535     OPTION_MIPS2,
14536     OPTION_MIPS3,
14537     OPTION_MIPS4,
14538     OPTION_MIPS5,
14539     OPTION_MIPS32,
14540     OPTION_MIPS64,
14541     OPTION_MIPS32R2,
14542     OPTION_MIPS64R2,
14543     OPTION_MIPS16,
14544     OPTION_NO_MIPS16,
14545     OPTION_MIPS3D,
14546     OPTION_NO_MIPS3D,
14547     OPTION_MDMX,
14548     OPTION_NO_MDMX,
14549     OPTION_DSP,
14550     OPTION_NO_DSP,
14551     OPTION_MT,
14552     OPTION_NO_MT,
14553     OPTION_VIRT,
14554     OPTION_NO_VIRT,
14555     OPTION_SMARTMIPS,
14556     OPTION_NO_SMARTMIPS,
14557     OPTION_DSPR2,
14558     OPTION_NO_DSPR2,
14559     OPTION_MICROMIPS,
14560     OPTION_NO_MICROMIPS,
14561     OPTION_MCU,
14562     OPTION_NO_MCU,
14563     OPTION_COMPAT_ARCH_BASE,
14564     OPTION_M4650,
14565     OPTION_NO_M4650,
14566     OPTION_M4010,
14567     OPTION_NO_M4010,
14568     OPTION_M4100,
14569     OPTION_NO_M4100,
14570     OPTION_M3900,
14571     OPTION_NO_M3900,
14572     OPTION_M7000_HILO_FIX,
14573     OPTION_MNO_7000_HILO_FIX, 
14574     OPTION_FIX_24K,
14575     OPTION_NO_FIX_24K,
14576     OPTION_FIX_LOONGSON2F_JUMP,
14577     OPTION_NO_FIX_LOONGSON2F_JUMP,
14578     OPTION_FIX_LOONGSON2F_NOP,
14579     OPTION_NO_FIX_LOONGSON2F_NOP,
14580     OPTION_FIX_VR4120,
14581     OPTION_NO_FIX_VR4120,
14582     OPTION_FIX_VR4130,
14583     OPTION_NO_FIX_VR4130,
14584     OPTION_FIX_CN63XXP1,
14585     OPTION_NO_FIX_CN63XXP1,
14586     OPTION_TRAP,
14587     OPTION_BREAK,
14588     OPTION_EB,
14589     OPTION_EL,
14590     OPTION_FP32,
14591     OPTION_GP32,
14592     OPTION_CONSTRUCT_FLOATS,
14593     OPTION_NO_CONSTRUCT_FLOATS,
14594     OPTION_FP64,
14595     OPTION_GP64,
14596     OPTION_RELAX_BRANCH,
14597     OPTION_NO_RELAX_BRANCH,
14598     OPTION_MSHARED,
14599     OPTION_MNO_SHARED,
14600     OPTION_MSYM32,
14601     OPTION_MNO_SYM32,
14602     OPTION_SOFT_FLOAT,
14603     OPTION_HARD_FLOAT,
14604     OPTION_SINGLE_FLOAT,
14605     OPTION_DOUBLE_FLOAT,
14606     OPTION_32,
14607 #ifdef OBJ_ELF
14608     OPTION_CALL_SHARED,
14609     OPTION_CALL_NONPIC,
14610     OPTION_NON_SHARED,
14611     OPTION_XGOT,
14612     OPTION_MABI,
14613     OPTION_N32,
14614     OPTION_64,
14615     OPTION_MDEBUG,
14616     OPTION_NO_MDEBUG,
14617     OPTION_PDR,
14618     OPTION_NO_PDR,
14619     OPTION_MVXWORKS_PIC,
14620 #endif /* OBJ_ELF */
14621     OPTION_END_OF_ENUM    
14622   };
14623   
14624 struct option md_longopts[] =
14625 {
14626   /* Options which specify architecture.  */
14627   {"march", required_argument, NULL, OPTION_MARCH},
14628   {"mtune", required_argument, NULL, OPTION_MTUNE},
14629   {"mips0", no_argument, NULL, OPTION_MIPS1},
14630   {"mips1", no_argument, NULL, OPTION_MIPS1},
14631   {"mips2", no_argument, NULL, OPTION_MIPS2},
14632   {"mips3", no_argument, NULL, OPTION_MIPS3},
14633   {"mips4", no_argument, NULL, OPTION_MIPS4},
14634   {"mips5", no_argument, NULL, OPTION_MIPS5},
14635   {"mips32", no_argument, NULL, OPTION_MIPS32},
14636   {"mips64", no_argument, NULL, OPTION_MIPS64},
14637   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
14638   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
14639
14640   /* Options which specify Application Specific Extensions (ASEs).  */
14641   {"mips16", no_argument, NULL, OPTION_MIPS16},
14642   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
14643   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
14644   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
14645   {"mdmx", no_argument, NULL, OPTION_MDMX},
14646   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
14647   {"mdsp", no_argument, NULL, OPTION_DSP},
14648   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
14649   {"mmt", no_argument, NULL, OPTION_MT},
14650   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
14651   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
14652   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
14653   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
14654   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
14655   {"mmicromips", no_argument, NULL, OPTION_MICROMIPS},
14656   {"mno-micromips", no_argument, NULL, OPTION_NO_MICROMIPS},
14657   {"mmcu", no_argument, NULL, OPTION_MCU},
14658   {"mno-mcu", no_argument, NULL, OPTION_NO_MCU},
14659   {"mvirt", no_argument, NULL, OPTION_VIRT},
14660   {"mno-virt", no_argument, NULL, OPTION_NO_VIRT},
14661
14662   /* Old-style architecture options.  Don't add more of these.  */
14663   {"m4650", no_argument, NULL, OPTION_M4650},
14664   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
14665   {"m4010", no_argument, NULL, OPTION_M4010},
14666   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
14667   {"m4100", no_argument, NULL, OPTION_M4100},
14668   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
14669   {"m3900", no_argument, NULL, OPTION_M3900},
14670   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
14671
14672   /* Options which enable bug fixes.  */
14673   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
14674   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
14675   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
14676   {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
14677   {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
14678   {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
14679   {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
14680   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
14681   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
14682   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
14683   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
14684   {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
14685   {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
14686   {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
14687   {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
14688
14689   /* Miscellaneous options.  */
14690   {"trap", no_argument, NULL, OPTION_TRAP},
14691   {"no-break", no_argument, NULL, OPTION_TRAP},
14692   {"break", no_argument, NULL, OPTION_BREAK},
14693   {"no-trap", no_argument, NULL, OPTION_BREAK},
14694   {"EB", no_argument, NULL, OPTION_EB},
14695   {"EL", no_argument, NULL, OPTION_EL},
14696   {"mfp32", no_argument, NULL, OPTION_FP32},
14697   {"mgp32", no_argument, NULL, OPTION_GP32},
14698   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
14699   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
14700   {"mfp64", no_argument, NULL, OPTION_FP64},
14701   {"mgp64", no_argument, NULL, OPTION_GP64},
14702   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
14703   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
14704   {"mshared", no_argument, NULL, OPTION_MSHARED},
14705   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
14706   {"msym32", no_argument, NULL, OPTION_MSYM32},
14707   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
14708   {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
14709   {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
14710   {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
14711   {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
14712
14713   /* Strictly speaking this next option is ELF specific,
14714      but we allow it for other ports as well in order to
14715      make testing easier.  */
14716   {"32",          no_argument, NULL, OPTION_32},
14717   
14718   /* ELF-specific options.  */
14719 #ifdef OBJ_ELF
14720   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
14721   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
14722   {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
14723   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
14724   {"xgot",        no_argument, NULL, OPTION_XGOT},
14725   {"mabi", required_argument, NULL, OPTION_MABI},
14726   {"n32",         no_argument, NULL, OPTION_N32},
14727   {"64",          no_argument, NULL, OPTION_64},
14728   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
14729   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
14730   {"mpdr", no_argument, NULL, OPTION_PDR},
14731   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
14732   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
14733 #endif /* OBJ_ELF */
14734
14735   {NULL, no_argument, NULL, 0}
14736 };
14737 size_t md_longopts_size = sizeof (md_longopts);
14738
14739 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
14740    NEW_VALUE.  Warn if another value was already specified.  Note:
14741    we have to defer parsing the -march and -mtune arguments in order
14742    to handle 'from-abi' correctly, since the ABI might be specified
14743    in a later argument.  */
14744
14745 static void
14746 mips_set_option_string (const char **string_ptr, const char *new_value)
14747 {
14748   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
14749     as_warn (_("A different %s was already specified, is now %s"),
14750              string_ptr == &mips_arch_string ? "-march" : "-mtune",
14751              new_value);
14752
14753   *string_ptr = new_value;
14754 }
14755
14756 int
14757 md_parse_option (int c, char *arg)
14758 {
14759   switch (c)
14760     {
14761     case OPTION_CONSTRUCT_FLOATS:
14762       mips_disable_float_construction = 0;
14763       break;
14764
14765     case OPTION_NO_CONSTRUCT_FLOATS:
14766       mips_disable_float_construction = 1;
14767       break;
14768
14769     case OPTION_TRAP:
14770       mips_trap = 1;
14771       break;
14772
14773     case OPTION_BREAK:
14774       mips_trap = 0;
14775       break;
14776
14777     case OPTION_EB:
14778       target_big_endian = 1;
14779       break;
14780
14781     case OPTION_EL:
14782       target_big_endian = 0;
14783       break;
14784
14785     case 'O':
14786       if (arg == NULL)
14787         mips_optimize = 1;
14788       else if (arg[0] == '0')
14789         mips_optimize = 0;
14790       else if (arg[0] == '1')
14791         mips_optimize = 1;
14792       else
14793         mips_optimize = 2;
14794       break;
14795
14796     case 'g':
14797       if (arg == NULL)
14798         mips_debug = 2;
14799       else
14800         mips_debug = atoi (arg);
14801       break;
14802
14803     case OPTION_MIPS1:
14804       file_mips_isa = ISA_MIPS1;
14805       break;
14806
14807     case OPTION_MIPS2:
14808       file_mips_isa = ISA_MIPS2;
14809       break;
14810
14811     case OPTION_MIPS3:
14812       file_mips_isa = ISA_MIPS3;
14813       break;
14814
14815     case OPTION_MIPS4:
14816       file_mips_isa = ISA_MIPS4;
14817       break;
14818
14819     case OPTION_MIPS5:
14820       file_mips_isa = ISA_MIPS5;
14821       break;
14822
14823     case OPTION_MIPS32:
14824       file_mips_isa = ISA_MIPS32;
14825       break;
14826
14827     case OPTION_MIPS32R2:
14828       file_mips_isa = ISA_MIPS32R2;
14829       break;
14830
14831     case OPTION_MIPS64R2:
14832       file_mips_isa = ISA_MIPS64R2;
14833       break;
14834
14835     case OPTION_MIPS64:
14836       file_mips_isa = ISA_MIPS64;
14837       break;
14838
14839     case OPTION_MTUNE:
14840       mips_set_option_string (&mips_tune_string, arg);
14841       break;
14842
14843     case OPTION_MARCH:
14844       mips_set_option_string (&mips_arch_string, arg);
14845       break;
14846
14847     case OPTION_M4650:
14848       mips_set_option_string (&mips_arch_string, "4650");
14849       mips_set_option_string (&mips_tune_string, "4650");
14850       break;
14851
14852     case OPTION_NO_M4650:
14853       break;
14854
14855     case OPTION_M4010:
14856       mips_set_option_string (&mips_arch_string, "4010");
14857       mips_set_option_string (&mips_tune_string, "4010");
14858       break;
14859
14860     case OPTION_NO_M4010:
14861       break;
14862
14863     case OPTION_M4100:
14864       mips_set_option_string (&mips_arch_string, "4100");
14865       mips_set_option_string (&mips_tune_string, "4100");
14866       break;
14867
14868     case OPTION_NO_M4100:
14869       break;
14870
14871     case OPTION_M3900:
14872       mips_set_option_string (&mips_arch_string, "3900");
14873       mips_set_option_string (&mips_tune_string, "3900");
14874       break;
14875
14876     case OPTION_NO_M3900:
14877       break;
14878
14879     case OPTION_MDMX:
14880       mips_opts.ase_mdmx = 1;
14881       break;
14882
14883     case OPTION_NO_MDMX:
14884       mips_opts.ase_mdmx = 0;
14885       break;
14886
14887     case OPTION_DSP:
14888       mips_opts.ase_dsp = 1;
14889       mips_opts.ase_dspr2 = 0;
14890       break;
14891
14892     case OPTION_NO_DSP:
14893       mips_opts.ase_dsp = 0;
14894       mips_opts.ase_dspr2 = 0;
14895       break;
14896
14897     case OPTION_DSPR2:
14898       mips_opts.ase_dspr2 = 1;
14899       mips_opts.ase_dsp = 1;
14900       break;
14901
14902     case OPTION_NO_DSPR2:
14903       mips_opts.ase_dspr2 = 0;
14904       mips_opts.ase_dsp = 0;
14905       break;
14906
14907     case OPTION_MT:
14908       mips_opts.ase_mt = 1;
14909       break;
14910
14911     case OPTION_NO_MT:
14912       mips_opts.ase_mt = 0;
14913       break;
14914
14915     case OPTION_MCU:
14916       mips_opts.ase_mcu = 1;
14917       break;
14918
14919     case OPTION_NO_MCU:
14920       mips_opts.ase_mcu = 0;
14921       break;
14922
14923     case OPTION_MICROMIPS:
14924       if (mips_opts.mips16 == 1)
14925         {
14926           as_bad (_("-mmicromips cannot be used with -mips16"));
14927           return 0;
14928         }
14929       mips_opts.micromips = 1;
14930       mips_no_prev_insn ();
14931       break;
14932
14933     case OPTION_NO_MICROMIPS:
14934       mips_opts.micromips = 0;
14935       mips_no_prev_insn ();
14936       break;
14937
14938     case OPTION_VIRT:
14939       mips_opts.ase_virt = 1;
14940       break;
14941
14942     case OPTION_NO_VIRT:
14943       mips_opts.ase_virt = 0;
14944       break;
14945
14946     case OPTION_MIPS16:
14947       if (mips_opts.micromips == 1)
14948         {
14949           as_bad (_("-mips16 cannot be used with -micromips"));
14950           return 0;
14951         }
14952       mips_opts.mips16 = 1;
14953       mips_no_prev_insn ();
14954       break;
14955
14956     case OPTION_NO_MIPS16:
14957       mips_opts.mips16 = 0;
14958       mips_no_prev_insn ();
14959       break;
14960
14961     case OPTION_MIPS3D:
14962       mips_opts.ase_mips3d = 1;
14963       break;
14964
14965     case OPTION_NO_MIPS3D:
14966       mips_opts.ase_mips3d = 0;
14967       break;
14968
14969     case OPTION_SMARTMIPS:
14970       mips_opts.ase_smartmips = 1;
14971       break;
14972
14973     case OPTION_NO_SMARTMIPS:
14974       mips_opts.ase_smartmips = 0;
14975       break;
14976
14977     case OPTION_FIX_24K:
14978       mips_fix_24k = 1;
14979       break;
14980
14981     case OPTION_NO_FIX_24K:
14982       mips_fix_24k = 0;
14983       break;
14984
14985     case OPTION_FIX_LOONGSON2F_JUMP:
14986       mips_fix_loongson2f_jump = TRUE;
14987       break;
14988
14989     case OPTION_NO_FIX_LOONGSON2F_JUMP:
14990       mips_fix_loongson2f_jump = FALSE;
14991       break;
14992
14993     case OPTION_FIX_LOONGSON2F_NOP:
14994       mips_fix_loongson2f_nop = TRUE;
14995       break;
14996
14997     case OPTION_NO_FIX_LOONGSON2F_NOP:
14998       mips_fix_loongson2f_nop = FALSE;
14999       break;
15000
15001     case OPTION_FIX_VR4120:
15002       mips_fix_vr4120 = 1;
15003       break;
15004
15005     case OPTION_NO_FIX_VR4120:
15006       mips_fix_vr4120 = 0;
15007       break;
15008
15009     case OPTION_FIX_VR4130:
15010       mips_fix_vr4130 = 1;
15011       break;
15012
15013     case OPTION_NO_FIX_VR4130:
15014       mips_fix_vr4130 = 0;
15015       break;
15016
15017     case OPTION_FIX_CN63XXP1:
15018       mips_fix_cn63xxp1 = TRUE;
15019       break;
15020
15021     case OPTION_NO_FIX_CN63XXP1:
15022       mips_fix_cn63xxp1 = FALSE;
15023       break;
15024
15025     case OPTION_RELAX_BRANCH:
15026       mips_relax_branch = 1;
15027       break;
15028
15029     case OPTION_NO_RELAX_BRANCH:
15030       mips_relax_branch = 0;
15031       break;
15032
15033     case OPTION_MSHARED:
15034       mips_in_shared = TRUE;
15035       break;
15036
15037     case OPTION_MNO_SHARED:
15038       mips_in_shared = FALSE;
15039       break;
15040
15041     case OPTION_MSYM32:
15042       mips_opts.sym32 = TRUE;
15043       break;
15044
15045     case OPTION_MNO_SYM32:
15046       mips_opts.sym32 = FALSE;
15047       break;
15048
15049 #ifdef OBJ_ELF
15050       /* When generating ELF code, we permit -KPIC and -call_shared to
15051          select SVR4_PIC, and -non_shared to select no PIC.  This is
15052          intended to be compatible with Irix 5.  */
15053     case OPTION_CALL_SHARED:
15054       if (!IS_ELF)
15055         {
15056           as_bad (_("-call_shared is supported only for ELF format"));
15057           return 0;
15058         }
15059       mips_pic = SVR4_PIC;
15060       mips_abicalls = TRUE;
15061       break;
15062
15063     case OPTION_CALL_NONPIC:
15064       if (!IS_ELF)
15065         {
15066           as_bad (_("-call_nonpic is supported only for ELF format"));
15067           return 0;
15068         }
15069       mips_pic = NO_PIC;
15070       mips_abicalls = TRUE;
15071       break;
15072
15073     case OPTION_NON_SHARED:
15074       if (!IS_ELF)
15075         {
15076           as_bad (_("-non_shared is supported only for ELF format"));
15077           return 0;
15078         }
15079       mips_pic = NO_PIC;
15080       mips_abicalls = FALSE;
15081       break;
15082
15083       /* The -xgot option tells the assembler to use 32 bit offsets
15084          when accessing the got in SVR4_PIC mode.  It is for Irix
15085          compatibility.  */
15086     case OPTION_XGOT:
15087       mips_big_got = 1;
15088       break;
15089 #endif /* OBJ_ELF */
15090
15091     case 'G':
15092       g_switch_value = atoi (arg);
15093       g_switch_seen = 1;
15094       break;
15095
15096       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
15097          and -mabi=64.  */
15098     case OPTION_32:
15099       if (IS_ELF)
15100         mips_abi = O32_ABI;
15101       /* We silently ignore -32 for non-ELF targets.  This greatly
15102          simplifies the construction of the MIPS GAS test cases.  */
15103       break;
15104
15105 #ifdef OBJ_ELF
15106     case OPTION_N32:
15107       if (!IS_ELF)
15108         {
15109           as_bad (_("-n32 is supported for ELF format only"));
15110           return 0;
15111         }
15112       mips_abi = N32_ABI;
15113       break;
15114
15115     case OPTION_64:
15116       if (!IS_ELF)
15117         {
15118           as_bad (_("-64 is supported for ELF format only"));
15119           return 0;
15120         }
15121       mips_abi = N64_ABI;
15122       if (!support_64bit_objects())
15123         as_fatal (_("No compiled in support for 64 bit object file format"));
15124       break;
15125 #endif /* OBJ_ELF */
15126
15127     case OPTION_GP32:
15128       file_mips_gp32 = 1;
15129       break;
15130
15131     case OPTION_GP64:
15132       file_mips_gp32 = 0;
15133       break;
15134
15135     case OPTION_FP32:
15136       file_mips_fp32 = 1;
15137       break;
15138
15139     case OPTION_FP64:
15140       file_mips_fp32 = 0;
15141       break;
15142
15143     case OPTION_SINGLE_FLOAT:
15144       file_mips_single_float = 1;
15145       break;
15146
15147     case OPTION_DOUBLE_FLOAT:
15148       file_mips_single_float = 0;
15149       break;
15150
15151     case OPTION_SOFT_FLOAT:
15152       file_mips_soft_float = 1;
15153       break;
15154
15155     case OPTION_HARD_FLOAT:
15156       file_mips_soft_float = 0;
15157       break;
15158
15159 #ifdef OBJ_ELF
15160     case OPTION_MABI:
15161       if (!IS_ELF)
15162         {
15163           as_bad (_("-mabi is supported for ELF format only"));
15164           return 0;
15165         }
15166       if (strcmp (arg, "32") == 0)
15167         mips_abi = O32_ABI;
15168       else if (strcmp (arg, "o64") == 0)
15169         mips_abi = O64_ABI;
15170       else if (strcmp (arg, "n32") == 0)
15171         mips_abi = N32_ABI;
15172       else if (strcmp (arg, "64") == 0)
15173         {
15174           mips_abi = N64_ABI;
15175           if (! support_64bit_objects())
15176             as_fatal (_("No compiled in support for 64 bit object file "
15177                         "format"));
15178         }
15179       else if (strcmp (arg, "eabi") == 0)
15180         mips_abi = EABI_ABI;
15181       else
15182         {
15183           as_fatal (_("invalid abi -mabi=%s"), arg);
15184           return 0;
15185         }
15186       break;
15187 #endif /* OBJ_ELF */
15188
15189     case OPTION_M7000_HILO_FIX:
15190       mips_7000_hilo_fix = TRUE;
15191       break;
15192
15193     case OPTION_MNO_7000_HILO_FIX:
15194       mips_7000_hilo_fix = FALSE;
15195       break;
15196
15197 #ifdef OBJ_ELF
15198     case OPTION_MDEBUG:
15199       mips_flag_mdebug = TRUE;
15200       break;
15201
15202     case OPTION_NO_MDEBUG:
15203       mips_flag_mdebug = FALSE;
15204       break;
15205
15206     case OPTION_PDR:
15207       mips_flag_pdr = TRUE;
15208       break;
15209
15210     case OPTION_NO_PDR:
15211       mips_flag_pdr = FALSE;
15212       break;
15213
15214     case OPTION_MVXWORKS_PIC:
15215       mips_pic = VXWORKS_PIC;
15216       break;
15217 #endif /* OBJ_ELF */
15218
15219     default:
15220       return 0;
15221     }
15222
15223     mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
15224
15225   return 1;
15226 }
15227 \f
15228 /* Set up globals to generate code for the ISA or processor
15229    described by INFO.  */
15230
15231 static void
15232 mips_set_architecture (const struct mips_cpu_info *info)
15233 {
15234   if (info != 0)
15235     {
15236       file_mips_arch = info->cpu;
15237       mips_opts.arch = info->cpu;
15238       mips_opts.isa = info->isa;
15239     }
15240 }
15241
15242
15243 /* Likewise for tuning.  */
15244
15245 static void
15246 mips_set_tune (const struct mips_cpu_info *info)
15247 {
15248   if (info != 0)
15249     mips_tune = info->cpu;
15250 }
15251
15252
15253 void
15254 mips_after_parse_args (void)
15255 {
15256   const struct mips_cpu_info *arch_info = 0;
15257   const struct mips_cpu_info *tune_info = 0;
15258
15259   /* GP relative stuff not working for PE */
15260   if (strncmp (TARGET_OS, "pe", 2) == 0)
15261     {
15262       if (g_switch_seen && g_switch_value != 0)
15263         as_bad (_("-G not supported in this configuration."));
15264       g_switch_value = 0;
15265     }
15266
15267   if (mips_abi == NO_ABI)
15268     mips_abi = MIPS_DEFAULT_ABI;
15269
15270   /* The following code determines the architecture and register size.
15271      Similar code was added to GCC 3.3 (see override_options() in
15272      config/mips/mips.c).  The GAS and GCC code should be kept in sync
15273      as much as possible.  */
15274
15275   if (mips_arch_string != 0)
15276     arch_info = mips_parse_cpu ("-march", mips_arch_string);
15277
15278   if (file_mips_isa != ISA_UNKNOWN)
15279     {
15280       /* Handle -mipsN.  At this point, file_mips_isa contains the
15281          ISA level specified by -mipsN, while arch_info->isa contains
15282          the -march selection (if any).  */
15283       if (arch_info != 0)
15284         {
15285           /* -march takes precedence over -mipsN, since it is more descriptive.
15286              There's no harm in specifying both as long as the ISA levels
15287              are the same.  */
15288           if (file_mips_isa != arch_info->isa)
15289             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
15290                     mips_cpu_info_from_isa (file_mips_isa)->name,
15291                     mips_cpu_info_from_isa (arch_info->isa)->name);
15292         }
15293       else
15294         arch_info = mips_cpu_info_from_isa (file_mips_isa);
15295     }
15296
15297   if (arch_info == 0)
15298     {
15299       arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
15300       gas_assert (arch_info);
15301     }
15302
15303   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
15304     as_bad (_("-march=%s is not compatible with the selected ABI"),
15305             arch_info->name);
15306
15307   mips_set_architecture (arch_info);
15308
15309   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
15310   if (mips_tune_string != 0)
15311     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
15312
15313   if (tune_info == 0)
15314     mips_set_tune (arch_info);
15315   else
15316     mips_set_tune (tune_info);
15317
15318   if (file_mips_gp32 >= 0)
15319     {
15320       /* The user specified the size of the integer registers.  Make sure
15321          it agrees with the ABI and ISA.  */
15322       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
15323         as_bad (_("-mgp64 used with a 32-bit processor"));
15324       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
15325         as_bad (_("-mgp32 used with a 64-bit ABI"));
15326       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
15327         as_bad (_("-mgp64 used with a 32-bit ABI"));
15328     }
15329   else
15330     {
15331       /* Infer the integer register size from the ABI and processor.
15332          Restrict ourselves to 32-bit registers if that's all the
15333          processor has, or if the ABI cannot handle 64-bit registers.  */
15334       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
15335                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
15336     }
15337
15338   switch (file_mips_fp32)
15339     {
15340     default:
15341     case -1:
15342       /* No user specified float register size.
15343          ??? GAS treats single-float processors as though they had 64-bit
15344          float registers (although it complains when double-precision
15345          instructions are used).  As things stand, saying they have 32-bit
15346          registers would lead to spurious "register must be even" messages.
15347          So here we assume float registers are never smaller than the
15348          integer ones.  */
15349       if (file_mips_gp32 == 0)
15350         /* 64-bit integer registers implies 64-bit float registers.  */
15351         file_mips_fp32 = 0;
15352       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
15353                && ISA_HAS_64BIT_FPRS (mips_opts.isa))
15354         /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
15355         file_mips_fp32 = 0;
15356       else
15357         /* 32-bit float registers.  */
15358         file_mips_fp32 = 1;
15359       break;
15360
15361     /* The user specified the size of the float registers.  Check if it
15362        agrees with the ABI and ISA.  */
15363     case 0:
15364       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
15365         as_bad (_("-mfp64 used with a 32-bit fpu"));
15366       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
15367                && !ISA_HAS_MXHC1 (mips_opts.isa))
15368         as_warn (_("-mfp64 used with a 32-bit ABI"));
15369       break;
15370     case 1:
15371       if (ABI_NEEDS_64BIT_REGS (mips_abi))
15372         as_warn (_("-mfp32 used with a 64-bit ABI"));
15373       break;
15374     }
15375
15376   /* End of GCC-shared inference code.  */
15377
15378   /* This flag is set when we have a 64-bit capable CPU but use only
15379      32-bit wide registers.  Note that EABI does not use it.  */
15380   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
15381       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
15382           || mips_abi == O32_ABI))
15383     mips_32bitmode = 1;
15384
15385   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
15386     as_bad (_("trap exception not supported at ISA 1"));
15387
15388   /* If the selected architecture includes support for ASEs, enable
15389      generation of code for them.  */
15390   if (mips_opts.mips16 == -1)
15391     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
15392   if (mips_opts.micromips == -1)
15393     mips_opts.micromips = (CPU_HAS_MICROMIPS (file_mips_arch)) ? 1 : 0;
15394   if (mips_opts.ase_mips3d == -1)
15395     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
15396                             && file_mips_fp32 == 0) ? 1 : 0;
15397   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
15398     as_bad (_("-mfp32 used with -mips3d"));
15399
15400   if (mips_opts.ase_mdmx == -1)
15401     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
15402                           && file_mips_fp32 == 0) ? 1 : 0;
15403   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
15404     as_bad (_("-mfp32 used with -mdmx"));
15405
15406   if (mips_opts.ase_smartmips == -1)
15407     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
15408   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
15409     as_warn (_("%s ISA does not support SmartMIPS"), 
15410              mips_cpu_info_from_isa (mips_opts.isa)->name);
15411
15412   if (mips_opts.ase_dsp == -1)
15413     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
15414   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
15415     as_warn (_("%s ISA does not support DSP ASE"), 
15416              mips_cpu_info_from_isa (mips_opts.isa)->name);
15417
15418   if (mips_opts.ase_dspr2 == -1)
15419     {
15420       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
15421       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
15422     }
15423   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
15424     as_warn (_("%s ISA does not support DSP R2 ASE"),
15425              mips_cpu_info_from_isa (mips_opts.isa)->name);
15426
15427   if (mips_opts.ase_mt == -1)
15428     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
15429   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
15430     as_warn (_("%s ISA does not support MT ASE"),
15431              mips_cpu_info_from_isa (mips_opts.isa)->name);
15432
15433   if (mips_opts.ase_mcu == -1)
15434     mips_opts.ase_mcu = (arch_info->flags & MIPS_CPU_ASE_MCU) ? 1 : 0;
15435   if (mips_opts.ase_mcu && !ISA_SUPPORTS_MCU_ASE)
15436       as_warn (_("%s ISA does not support MCU ASE"),
15437                mips_cpu_info_from_isa (mips_opts.isa)->name);
15438
15439   if (mips_opts.ase_virt == -1)
15440     mips_opts.ase_virt = (arch_info->flags & MIPS_CPU_ASE_VIRT) ? 1 : 0;
15441   if (mips_opts.ase_virt && !ISA_SUPPORTS_VIRT_ASE)
15442     as_warn (_("%s ISA does not support Virtualization ASE"),
15443              mips_cpu_info_from_isa (mips_opts.isa)->name);
15444
15445   file_mips_isa = mips_opts.isa;
15446   file_ase_mips3d = mips_opts.ase_mips3d;
15447   file_ase_mdmx = mips_opts.ase_mdmx;
15448   file_ase_smartmips = mips_opts.ase_smartmips;
15449   file_ase_dsp = mips_opts.ase_dsp;
15450   file_ase_dspr2 = mips_opts.ase_dspr2;
15451   file_ase_mt = mips_opts.ase_mt;
15452   file_ase_virt = mips_opts.ase_virt;
15453   mips_opts.gp32 = file_mips_gp32;
15454   mips_opts.fp32 = file_mips_fp32;
15455   mips_opts.soft_float = file_mips_soft_float;
15456   mips_opts.single_float = file_mips_single_float;
15457
15458   if (mips_flag_mdebug < 0)
15459     {
15460 #ifdef OBJ_MAYBE_ECOFF
15461       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
15462         mips_flag_mdebug = 1;
15463       else
15464 #endif /* OBJ_MAYBE_ECOFF */
15465         mips_flag_mdebug = 0;
15466     }
15467 }
15468 \f
15469 void
15470 mips_init_after_args (void)
15471 {
15472   /* initialize opcodes */
15473   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
15474   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
15475 }
15476
15477 long
15478 md_pcrel_from (fixS *fixP)
15479 {
15480   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
15481   switch (fixP->fx_r_type)
15482     {
15483     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15484     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15485       /* Return the address of the delay slot.  */
15486       return addr + 2;
15487
15488     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15489     case BFD_RELOC_MICROMIPS_JMP:
15490     case BFD_RELOC_16_PCREL_S2:
15491     case BFD_RELOC_MIPS_JMP:
15492       /* Return the address of the delay slot.  */
15493       return addr + 4;
15494
15495     case BFD_RELOC_32_PCREL:
15496       return addr;
15497
15498     default:
15499       /* We have no relocation type for PC relative MIPS16 instructions.  */
15500       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
15501         as_bad_where (fixP->fx_file, fixP->fx_line,
15502                       _("PC relative MIPS16 instruction references a different section"));
15503       return addr;
15504     }
15505 }
15506
15507 /* This is called before the symbol table is processed.  In order to
15508    work with gcc when using mips-tfile, we must keep all local labels.
15509    However, in other cases, we want to discard them.  If we were
15510    called with -g, but we didn't see any debugging information, it may
15511    mean that gcc is smuggling debugging information through to
15512    mips-tfile, in which case we must generate all local labels.  */
15513
15514 void
15515 mips_frob_file_before_adjust (void)
15516 {
15517 #ifndef NO_ECOFF_DEBUGGING
15518   if (ECOFF_DEBUGGING
15519       && mips_debug != 0
15520       && ! ecoff_debugging_seen)
15521     flag_keep_locals = 1;
15522 #endif
15523 }
15524
15525 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
15526    the corresponding LO16 reloc.  This is called before md_apply_fix and
15527    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
15528    relocation operators.
15529
15530    For our purposes, a %lo() expression matches a %got() or %hi()
15531    expression if:
15532
15533       (a) it refers to the same symbol; and
15534       (b) the offset applied in the %lo() expression is no lower than
15535           the offset applied in the %got() or %hi().
15536
15537    (b) allows us to cope with code like:
15538
15539         lui     $4,%hi(foo)
15540         lh      $4,%lo(foo+2)($4)
15541
15542    ...which is legal on RELA targets, and has a well-defined behaviour
15543    if the user knows that adding 2 to "foo" will not induce a carry to
15544    the high 16 bits.
15545
15546    When several %lo()s match a particular %got() or %hi(), we use the
15547    following rules to distinguish them:
15548
15549      (1) %lo()s with smaller offsets are a better match than %lo()s with
15550          higher offsets.
15551
15552      (2) %lo()s with no matching %got() or %hi() are better than those
15553          that already have a matching %got() or %hi().
15554
15555      (3) later %lo()s are better than earlier %lo()s.
15556
15557    These rules are applied in order.
15558
15559    (1) means, among other things, that %lo()s with identical offsets are
15560    chosen if they exist.
15561
15562    (2) means that we won't associate several high-part relocations with
15563    the same low-part relocation unless there's no alternative.  Having
15564    several high parts for the same low part is a GNU extension; this rule
15565    allows careful users to avoid it.
15566
15567    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
15568    with the last high-part relocation being at the front of the list.
15569    It therefore makes sense to choose the last matching low-part
15570    relocation, all other things being equal.  It's also easier
15571    to code that way.  */
15572
15573 void
15574 mips_frob_file (void)
15575 {
15576   struct mips_hi_fixup *l;
15577   bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
15578
15579   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
15580     {
15581       segment_info_type *seginfo;
15582       bfd_boolean matched_lo_p;
15583       fixS **hi_pos, **lo_pos, **pos;
15584
15585       gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
15586
15587       /* If a GOT16 relocation turns out to be against a global symbol,
15588          there isn't supposed to be a matching LO.  Ignore %gots against
15589          constants; we'll report an error for those later.  */
15590       if (got16_reloc_p (l->fixp->fx_r_type)
15591           && !(l->fixp->fx_addsy
15592                && pic_need_relax (l->fixp->fx_addsy, l->seg)))
15593         continue;
15594
15595       /* Check quickly whether the next fixup happens to be a matching %lo.  */
15596       if (fixup_has_matching_lo_p (l->fixp))
15597         continue;
15598
15599       seginfo = seg_info (l->seg);
15600
15601       /* Set HI_POS to the position of this relocation in the chain.
15602          Set LO_POS to the position of the chosen low-part relocation.
15603          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
15604          relocation that matches an immediately-preceding high-part
15605          relocation.  */
15606       hi_pos = NULL;
15607       lo_pos = NULL;
15608       matched_lo_p = FALSE;
15609       looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
15610
15611       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
15612         {
15613           if (*pos == l->fixp)
15614             hi_pos = pos;
15615
15616           if ((*pos)->fx_r_type == looking_for_rtype
15617               && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
15618               && (*pos)->fx_offset >= l->fixp->fx_offset
15619               && (lo_pos == NULL
15620                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
15621                   || (!matched_lo_p
15622                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
15623             lo_pos = pos;
15624
15625           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
15626                           && fixup_has_matching_lo_p (*pos));
15627         }
15628
15629       /* If we found a match, remove the high-part relocation from its
15630          current position and insert it before the low-part relocation.
15631          Make the offsets match so that fixup_has_matching_lo_p()
15632          will return true.
15633
15634          We don't warn about unmatched high-part relocations since some
15635          versions of gcc have been known to emit dead "lui ...%hi(...)"
15636          instructions.  */
15637       if (lo_pos != NULL)
15638         {
15639           l->fixp->fx_offset = (*lo_pos)->fx_offset;
15640           if (l->fixp->fx_next != *lo_pos)
15641             {
15642               *hi_pos = l->fixp->fx_next;
15643               l->fixp->fx_next = *lo_pos;
15644               *lo_pos = l->fixp;
15645             }
15646         }
15647     }
15648 }
15649
15650 int
15651 mips_force_relocation (fixS *fixp)
15652 {
15653   if (generic_force_reloc (fixp))
15654     return 1;
15655
15656   /* We want to keep BFD_RELOC_MICROMIPS_*_PCREL_S1 relocation,
15657      so that the linker relaxation can update targets.  */
15658   if (fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15659       || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15660       || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1)
15661     return 1;
15662
15663   return 0;
15664 }
15665
15666 /* Read the instruction associated with RELOC from BUF.  */
15667
15668 static unsigned int
15669 read_reloc_insn (char *buf, bfd_reloc_code_real_type reloc)
15670 {
15671   if (mips16_reloc_p (reloc) || micromips_reloc_p (reloc))
15672     return read_compressed_insn (buf, 4);
15673   else
15674     return read_insn (buf);
15675 }
15676
15677 /* Write instruction INSN to BUF, given that it has been relocated
15678    by RELOC.  */
15679
15680 static void
15681 write_reloc_insn (char *buf, bfd_reloc_code_real_type reloc,
15682                   unsigned long insn)
15683 {
15684   if (mips16_reloc_p (reloc) || micromips_reloc_p (reloc))
15685     write_compressed_insn (buf, insn, 4);
15686   else
15687     write_insn (buf, insn);
15688 }
15689
15690 /* Apply a fixup to the object file.  */
15691
15692 void
15693 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
15694 {
15695   char *buf;
15696   unsigned long insn;
15697   reloc_howto_type *howto;
15698
15699   /* We ignore generic BFD relocations we don't know about.  */
15700   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
15701   if (! howto)
15702     return;
15703
15704   gas_assert (fixP->fx_size == 2
15705               || fixP->fx_size == 4
15706               || fixP->fx_r_type == BFD_RELOC_16
15707               || fixP->fx_r_type == BFD_RELOC_64
15708               || fixP->fx_r_type == BFD_RELOC_CTOR
15709               || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
15710               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_SUB
15711               || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
15712               || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
15713               || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
15714
15715   buf = fixP->fx_frag->fr_literal + fixP->fx_where;
15716
15717   gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
15718               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15719               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15720               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1
15721               || fixP->fx_r_type == BFD_RELOC_32_PCREL);
15722
15723   /* Don't treat parts of a composite relocation as done.  There are two
15724      reasons for this:
15725
15726      (1) The second and third parts will be against 0 (RSS_UNDEF) but
15727          should nevertheless be emitted if the first part is.
15728
15729      (2) In normal usage, composite relocations are never assembly-time
15730          constants.  The easiest way of dealing with the pathological
15731          exceptions is to generate a relocation against STN_UNDEF and
15732          leave everything up to the linker.  */
15733   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
15734     fixP->fx_done = 1;
15735
15736   switch (fixP->fx_r_type)
15737     {
15738     case BFD_RELOC_MIPS_TLS_GD:
15739     case BFD_RELOC_MIPS_TLS_LDM:
15740     case BFD_RELOC_MIPS_TLS_DTPREL32:
15741     case BFD_RELOC_MIPS_TLS_DTPREL64:
15742     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
15743     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
15744     case BFD_RELOC_MIPS_TLS_GOTTPREL:
15745     case BFD_RELOC_MIPS_TLS_TPREL32:
15746     case BFD_RELOC_MIPS_TLS_TPREL64:
15747     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
15748     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
15749     case BFD_RELOC_MICROMIPS_TLS_GD:
15750     case BFD_RELOC_MICROMIPS_TLS_LDM:
15751     case BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16:
15752     case BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16:
15753     case BFD_RELOC_MICROMIPS_TLS_GOTTPREL:
15754     case BFD_RELOC_MICROMIPS_TLS_TPREL_HI16:
15755     case BFD_RELOC_MICROMIPS_TLS_TPREL_LO16:
15756     case BFD_RELOC_MIPS16_TLS_GD:
15757     case BFD_RELOC_MIPS16_TLS_LDM:
15758     case BFD_RELOC_MIPS16_TLS_DTPREL_HI16:
15759     case BFD_RELOC_MIPS16_TLS_DTPREL_LO16:
15760     case BFD_RELOC_MIPS16_TLS_GOTTPREL:
15761     case BFD_RELOC_MIPS16_TLS_TPREL_HI16:
15762     case BFD_RELOC_MIPS16_TLS_TPREL_LO16:
15763       if (!fixP->fx_addsy)
15764         {
15765           as_bad_where (fixP->fx_file, fixP->fx_line,
15766                         _("TLS relocation against a constant"));
15767           break;
15768         }
15769       S_SET_THREAD_LOCAL (fixP->fx_addsy);
15770       /* fall through */
15771
15772     case BFD_RELOC_MIPS_JMP:
15773     case BFD_RELOC_MIPS_SHIFT5:
15774     case BFD_RELOC_MIPS_SHIFT6:
15775     case BFD_RELOC_MIPS_GOT_DISP:
15776     case BFD_RELOC_MIPS_GOT_PAGE:
15777     case BFD_RELOC_MIPS_GOT_OFST:
15778     case BFD_RELOC_MIPS_SUB:
15779     case BFD_RELOC_MIPS_INSERT_A:
15780     case BFD_RELOC_MIPS_INSERT_B:
15781     case BFD_RELOC_MIPS_DELETE:
15782     case BFD_RELOC_MIPS_HIGHEST:
15783     case BFD_RELOC_MIPS_HIGHER:
15784     case BFD_RELOC_MIPS_SCN_DISP:
15785     case BFD_RELOC_MIPS_REL16:
15786     case BFD_RELOC_MIPS_RELGOT:
15787     case BFD_RELOC_MIPS_JALR:
15788     case BFD_RELOC_HI16:
15789     case BFD_RELOC_HI16_S:
15790     case BFD_RELOC_LO16:
15791     case BFD_RELOC_GPREL16:
15792     case BFD_RELOC_MIPS_LITERAL:
15793     case BFD_RELOC_MIPS_CALL16:
15794     case BFD_RELOC_MIPS_GOT16:
15795     case BFD_RELOC_GPREL32:
15796     case BFD_RELOC_MIPS_GOT_HI16:
15797     case BFD_RELOC_MIPS_GOT_LO16:
15798     case BFD_RELOC_MIPS_CALL_HI16:
15799     case BFD_RELOC_MIPS_CALL_LO16:
15800     case BFD_RELOC_MIPS16_GPREL:
15801     case BFD_RELOC_MIPS16_GOT16:
15802     case BFD_RELOC_MIPS16_CALL16:
15803     case BFD_RELOC_MIPS16_HI16:
15804     case BFD_RELOC_MIPS16_HI16_S:
15805     case BFD_RELOC_MIPS16_LO16:
15806     case BFD_RELOC_MIPS16_JMP:
15807     case BFD_RELOC_MICROMIPS_JMP:
15808     case BFD_RELOC_MICROMIPS_GOT_DISP:
15809     case BFD_RELOC_MICROMIPS_GOT_PAGE:
15810     case BFD_RELOC_MICROMIPS_GOT_OFST:
15811     case BFD_RELOC_MICROMIPS_SUB:
15812     case BFD_RELOC_MICROMIPS_HIGHEST:
15813     case BFD_RELOC_MICROMIPS_HIGHER:
15814     case BFD_RELOC_MICROMIPS_SCN_DISP:
15815     case BFD_RELOC_MICROMIPS_JALR:
15816     case BFD_RELOC_MICROMIPS_HI16:
15817     case BFD_RELOC_MICROMIPS_HI16_S:
15818     case BFD_RELOC_MICROMIPS_LO16:
15819     case BFD_RELOC_MICROMIPS_GPREL16:
15820     case BFD_RELOC_MICROMIPS_LITERAL:
15821     case BFD_RELOC_MICROMIPS_CALL16:
15822     case BFD_RELOC_MICROMIPS_GOT16:
15823     case BFD_RELOC_MICROMIPS_GOT_HI16:
15824     case BFD_RELOC_MICROMIPS_GOT_LO16:
15825     case BFD_RELOC_MICROMIPS_CALL_HI16:
15826     case BFD_RELOC_MICROMIPS_CALL_LO16:
15827       if (fixP->fx_done)
15828         {
15829           offsetT value;
15830
15831           if (calculate_reloc (fixP->fx_r_type, *valP, &value))
15832             {
15833               insn = read_reloc_insn (buf, fixP->fx_r_type);
15834               if (mips16_reloc_p (fixP->fx_r_type))
15835                 insn |= mips16_immed_extend (value, 16);
15836               else
15837                 insn |= (value & 0xffff);
15838               write_reloc_insn (buf, fixP->fx_r_type, insn);
15839             }
15840           else
15841             as_bad_where (fixP->fx_file, fixP->fx_line,
15842                           _("Unsupported constant in relocation"));
15843         }
15844       break;
15845
15846     case BFD_RELOC_64:
15847       /* This is handled like BFD_RELOC_32, but we output a sign
15848          extended value if we are only 32 bits.  */
15849       if (fixP->fx_done)
15850         {
15851           if (8 <= sizeof (valueT))
15852             md_number_to_chars (buf, *valP, 8);
15853           else
15854             {
15855               valueT hiv;
15856
15857               if ((*valP & 0x80000000) != 0)
15858                 hiv = 0xffffffff;
15859               else
15860                 hiv = 0;
15861               md_number_to_chars (buf + (target_big_endian ? 4 : 0), *valP, 4);
15862               md_number_to_chars (buf + (target_big_endian ? 0 : 4), hiv, 4);
15863             }
15864         }
15865       break;
15866
15867     case BFD_RELOC_RVA:
15868     case BFD_RELOC_32:
15869     case BFD_RELOC_32_PCREL:
15870     case BFD_RELOC_16:
15871       /* If we are deleting this reloc entry, we must fill in the
15872          value now.  This can happen if we have a .word which is not
15873          resolved when it appears but is later defined.  */
15874       if (fixP->fx_done)
15875         md_number_to_chars (buf, *valP, fixP->fx_size);
15876       break;
15877
15878     case BFD_RELOC_16_PCREL_S2:
15879       if ((*valP & 0x3) != 0)
15880         as_bad_where (fixP->fx_file, fixP->fx_line,
15881                       _("Branch to misaligned address (%lx)"), (long) *valP);
15882
15883       /* We need to save the bits in the instruction since fixup_segment()
15884          might be deleting the relocation entry (i.e., a branch within
15885          the current segment).  */
15886       if (! fixP->fx_done)
15887         break;
15888
15889       /* Update old instruction data.  */
15890       insn = read_insn (buf);
15891
15892       if (*valP + 0x20000 <= 0x3ffff)
15893         {
15894           insn |= (*valP >> 2) & 0xffff;
15895           write_insn (buf, insn);
15896         }
15897       else if (mips_pic == NO_PIC
15898                && fixP->fx_done
15899                && fixP->fx_frag->fr_address >= text_section->vma
15900                && (fixP->fx_frag->fr_address
15901                    < text_section->vma + bfd_get_section_size (text_section))
15902                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
15903                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
15904                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
15905         {
15906           /* The branch offset is too large.  If this is an
15907              unconditional branch, and we are not generating PIC code,
15908              we can convert it to an absolute jump instruction.  */
15909           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
15910             insn = 0x0c000000;  /* jal */
15911           else
15912             insn = 0x08000000;  /* j */
15913           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
15914           fixP->fx_done = 0;
15915           fixP->fx_addsy = section_symbol (text_section);
15916           *valP += md_pcrel_from (fixP);
15917           write_insn (buf, insn);
15918         }
15919       else
15920         {
15921           /* If we got here, we have branch-relaxation disabled,
15922              and there's nothing we can do to fix this instruction
15923              without turning it into a longer sequence.  */
15924           as_bad_where (fixP->fx_file, fixP->fx_line,
15925                         _("Branch out of range"));
15926         }
15927       break;
15928
15929     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15930     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15931     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15932       /* We adjust the offset back to even.  */
15933       if ((*valP & 0x1) != 0)
15934         --(*valP);
15935
15936       if (! fixP->fx_done)
15937         break;
15938
15939       /* Should never visit here, because we keep the relocation.  */
15940       abort ();
15941       break;
15942
15943     case BFD_RELOC_VTABLE_INHERIT:
15944       fixP->fx_done = 0;
15945       if (fixP->fx_addsy
15946           && !S_IS_DEFINED (fixP->fx_addsy)
15947           && !S_IS_WEAK (fixP->fx_addsy))
15948         S_SET_WEAK (fixP->fx_addsy);
15949       break;
15950
15951     case BFD_RELOC_VTABLE_ENTRY:
15952       fixP->fx_done = 0;
15953       break;
15954
15955     default:
15956       abort ();
15957     }
15958
15959   /* Remember value for tc_gen_reloc.  */
15960   fixP->fx_addnumber = *valP;
15961 }
15962
15963 static symbolS *
15964 get_symbol (void)
15965 {
15966   int c;
15967   char *name;
15968   symbolS *p;
15969
15970   name = input_line_pointer;
15971   c = get_symbol_end ();
15972   p = (symbolS *) symbol_find_or_make (name);
15973   *input_line_pointer = c;
15974   return p;
15975 }
15976
15977 /* Align the current frag to a given power of two.  If a particular
15978    fill byte should be used, FILL points to an integer that contains
15979    that byte, otherwise FILL is null.
15980
15981    This function used to have the comment:
15982
15983       The MIPS assembler also automatically adjusts any preceding label.
15984
15985    The implementation therefore applied the adjustment to a maximum of
15986    one label.  However, other label adjustments are applied to batches
15987    of labels, and adjusting just one caused problems when new labels
15988    were added for the sake of debugging or unwind information.
15989    We therefore adjust all preceding labels (given as LABELS) instead.  */
15990
15991 static void
15992 mips_align (int to, int *fill, struct insn_label_list *labels)
15993 {
15994   mips_emit_delays ();
15995   mips_record_compressed_mode ();
15996   if (fill == NULL && subseg_text_p (now_seg))
15997     frag_align_code (to, 0);
15998   else
15999     frag_align (to, fill ? *fill : 0, 0);
16000   record_alignment (now_seg, to);
16001   mips_move_labels (labels, FALSE);
16002 }
16003
16004 /* Align to a given power of two.  .align 0 turns off the automatic
16005    alignment used by the data creating pseudo-ops.  */
16006
16007 static void
16008 s_align (int x ATTRIBUTE_UNUSED)
16009 {
16010   int temp, fill_value, *fill_ptr;
16011   long max_alignment = 28;
16012
16013   /* o Note that the assembler pulls down any immediately preceding label
16014        to the aligned address.
16015      o It's not documented but auto alignment is reinstated by
16016        a .align pseudo instruction.
16017      o Note also that after auto alignment is turned off the mips assembler
16018        issues an error on attempt to assemble an improperly aligned data item.
16019        We don't.  */
16020
16021   temp = get_absolute_expression ();
16022   if (temp > max_alignment)
16023     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
16024   else if (temp < 0)
16025     {
16026       as_warn (_("Alignment negative: 0 assumed."));
16027       temp = 0;
16028     }
16029   if (*input_line_pointer == ',')
16030     {
16031       ++input_line_pointer;
16032       fill_value = get_absolute_expression ();
16033       fill_ptr = &fill_value;
16034     }
16035   else
16036     fill_ptr = 0;
16037   if (temp)
16038     {
16039       segment_info_type *si = seg_info (now_seg);
16040       struct insn_label_list *l = si->label_list;
16041       /* Auto alignment should be switched on by next section change.  */
16042       auto_align = 1;
16043       mips_align (temp, fill_ptr, l);
16044     }
16045   else
16046     {
16047       auto_align = 0;
16048     }
16049
16050   demand_empty_rest_of_line ();
16051 }
16052
16053 static void
16054 s_change_sec (int sec)
16055 {
16056   segT seg;
16057
16058 #ifdef OBJ_ELF
16059   /* The ELF backend needs to know that we are changing sections, so
16060      that .previous works correctly.  We could do something like check
16061      for an obj_section_change_hook macro, but that might be confusing
16062      as it would not be appropriate to use it in the section changing
16063      functions in read.c, since obj-elf.c intercepts those.  FIXME:
16064      This should be cleaner, somehow.  */
16065   if (IS_ELF)
16066     obj_elf_section_change_hook ();
16067 #endif
16068
16069   mips_emit_delays ();
16070
16071   switch (sec)
16072     {
16073     case 't':
16074       s_text (0);
16075       break;
16076     case 'd':
16077       s_data (0);
16078       break;
16079     case 'b':
16080       subseg_set (bss_section, (subsegT) get_absolute_expression ());
16081       demand_empty_rest_of_line ();
16082       break;
16083
16084     case 'r':
16085       seg = subseg_new (RDATA_SECTION_NAME,
16086                         (subsegT) get_absolute_expression ());
16087       if (IS_ELF)
16088         {
16089           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
16090                                                   | SEC_READONLY | SEC_RELOC
16091                                                   | SEC_DATA));
16092           if (strncmp (TARGET_OS, "elf", 3) != 0)
16093             record_alignment (seg, 4);
16094         }
16095       demand_empty_rest_of_line ();
16096       break;
16097
16098     case 's':
16099       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
16100       if (IS_ELF)
16101         {
16102           bfd_set_section_flags (stdoutput, seg,
16103                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
16104           if (strncmp (TARGET_OS, "elf", 3) != 0)
16105             record_alignment (seg, 4);
16106         }
16107       demand_empty_rest_of_line ();
16108       break;
16109
16110     case 'B':
16111       seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
16112       if (IS_ELF)
16113         {
16114           bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
16115           if (strncmp (TARGET_OS, "elf", 3) != 0)
16116             record_alignment (seg, 4);
16117         }
16118       demand_empty_rest_of_line ();
16119       break;
16120     }
16121
16122   auto_align = 1;
16123 }
16124
16125 void
16126 s_change_section (int ignore ATTRIBUTE_UNUSED)
16127 {
16128 #ifdef OBJ_ELF
16129   char *section_name;
16130   char c;
16131   char next_c = 0;
16132   int section_type;
16133   int section_flag;
16134   int section_entry_size;
16135   int section_alignment;
16136
16137   if (!IS_ELF)
16138     return;
16139
16140   section_name = input_line_pointer;
16141   c = get_symbol_end ();
16142   if (c)
16143     next_c = *(input_line_pointer + 1);
16144
16145   /* Do we have .section Name<,"flags">?  */
16146   if (c != ',' || (c == ',' && next_c == '"'))
16147     {
16148       /* just after name is now '\0'.  */
16149       *input_line_pointer = c;
16150       input_line_pointer = section_name;
16151       obj_elf_section (ignore);
16152       return;
16153     }
16154   input_line_pointer++;
16155
16156   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
16157   if (c == ',')
16158     section_type = get_absolute_expression ();
16159   else
16160     section_type = 0;
16161   if (*input_line_pointer++ == ',')
16162     section_flag = get_absolute_expression ();
16163   else
16164     section_flag = 0;
16165   if (*input_line_pointer++ == ',')
16166     section_entry_size = get_absolute_expression ();
16167   else
16168     section_entry_size = 0;
16169   if (*input_line_pointer++ == ',')
16170     section_alignment = get_absolute_expression ();
16171   else
16172     section_alignment = 0;
16173   /* FIXME: really ignore?  */
16174   (void) section_alignment;
16175
16176   section_name = xstrdup (section_name);
16177
16178   /* When using the generic form of .section (as implemented by obj-elf.c),
16179      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
16180      traditionally had to fall back on the more common @progbits instead.
16181
16182      There's nothing really harmful in this, since bfd will correct
16183      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
16184      means that, for backwards compatibility, the special_section entries
16185      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
16186
16187      Even so, we shouldn't force users of the MIPS .section syntax to
16188      incorrectly label the sections as SHT_PROGBITS.  The best compromise
16189      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
16190      generic type-checking code.  */
16191   if (section_type == SHT_MIPS_DWARF)
16192     section_type = SHT_PROGBITS;
16193
16194   obj_elf_change_section (section_name, section_type, section_flag,
16195                           section_entry_size, 0, 0, 0);
16196
16197   if (now_seg->name != section_name)
16198     free (section_name);
16199 #endif /* OBJ_ELF */
16200 }
16201
16202 void
16203 mips_enable_auto_align (void)
16204 {
16205   auto_align = 1;
16206 }
16207
16208 static void
16209 s_cons (int log_size)
16210 {
16211   segment_info_type *si = seg_info (now_seg);
16212   struct insn_label_list *l = si->label_list;
16213
16214   mips_emit_delays ();
16215   if (log_size > 0 && auto_align)
16216     mips_align (log_size, 0, l);
16217   cons (1 << log_size);
16218   mips_clear_insn_labels ();
16219 }
16220
16221 static void
16222 s_float_cons (int type)
16223 {
16224   segment_info_type *si = seg_info (now_seg);
16225   struct insn_label_list *l = si->label_list;
16226
16227   mips_emit_delays ();
16228
16229   if (auto_align)
16230     {
16231       if (type == 'd')
16232         mips_align (3, 0, l);
16233       else
16234         mips_align (2, 0, l);
16235     }
16236
16237   float_cons (type);
16238   mips_clear_insn_labels ();
16239 }
16240
16241 /* Handle .globl.  We need to override it because on Irix 5 you are
16242    permitted to say
16243        .globl foo .text
16244    where foo is an undefined symbol, to mean that foo should be
16245    considered to be the address of a function.  */
16246
16247 static void
16248 s_mips_globl (int x ATTRIBUTE_UNUSED)
16249 {
16250   char *name;
16251   int c;
16252   symbolS *symbolP;
16253   flagword flag;
16254
16255   do
16256     {
16257       name = input_line_pointer;
16258       c = get_symbol_end ();
16259       symbolP = symbol_find_or_make (name);
16260       S_SET_EXTERNAL (symbolP);
16261
16262       *input_line_pointer = c;
16263       SKIP_WHITESPACE ();
16264
16265       /* On Irix 5, every global symbol that is not explicitly labelled as
16266          being a function is apparently labelled as being an object.  */
16267       flag = BSF_OBJECT;
16268
16269       if (!is_end_of_line[(unsigned char) *input_line_pointer]
16270           && (*input_line_pointer != ','))
16271         {
16272           char *secname;
16273           asection *sec;
16274
16275           secname = input_line_pointer;
16276           c = get_symbol_end ();
16277           sec = bfd_get_section_by_name (stdoutput, secname);
16278           if (sec == NULL)
16279             as_bad (_("%s: no such section"), secname);
16280           *input_line_pointer = c;
16281
16282           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
16283             flag = BSF_FUNCTION;
16284         }
16285
16286       symbol_get_bfdsym (symbolP)->flags |= flag;
16287
16288       c = *input_line_pointer;
16289       if (c == ',')
16290         {
16291           input_line_pointer++;
16292           SKIP_WHITESPACE ();
16293           if (is_end_of_line[(unsigned char) *input_line_pointer])
16294             c = '\n';
16295         }
16296     }
16297   while (c == ',');
16298
16299   demand_empty_rest_of_line ();
16300 }
16301
16302 static void
16303 s_option (int x ATTRIBUTE_UNUSED)
16304 {
16305   char *opt;
16306   char c;
16307
16308   opt = input_line_pointer;
16309   c = get_symbol_end ();
16310
16311   if (*opt == 'O')
16312     {
16313       /* FIXME: What does this mean?  */
16314     }
16315   else if (strncmp (opt, "pic", 3) == 0)
16316     {
16317       int i;
16318
16319       i = atoi (opt + 3);
16320       if (i == 0)
16321         mips_pic = NO_PIC;
16322       else if (i == 2)
16323         {
16324           mips_pic = SVR4_PIC;
16325           mips_abicalls = TRUE;
16326         }
16327       else
16328         as_bad (_(".option pic%d not supported"), i);
16329
16330       if (mips_pic == SVR4_PIC)
16331         {
16332           if (g_switch_seen && g_switch_value != 0)
16333             as_warn (_("-G may not be used with SVR4 PIC code"));
16334           g_switch_value = 0;
16335           bfd_set_gp_size (stdoutput, 0);
16336         }
16337     }
16338   else
16339     as_warn (_("Unrecognized option \"%s\""), opt);
16340
16341   *input_line_pointer = c;
16342   demand_empty_rest_of_line ();
16343 }
16344
16345 /* This structure is used to hold a stack of .set values.  */
16346
16347 struct mips_option_stack
16348 {
16349   struct mips_option_stack *next;
16350   struct mips_set_options options;
16351 };
16352
16353 static struct mips_option_stack *mips_opts_stack;
16354
16355 /* Handle the .set pseudo-op.  */
16356
16357 static void
16358 s_mipsset (int x ATTRIBUTE_UNUSED)
16359 {
16360   char *name = input_line_pointer, ch;
16361
16362   while (!is_end_of_line[(unsigned char) *input_line_pointer])
16363     ++input_line_pointer;
16364   ch = *input_line_pointer;
16365   *input_line_pointer = '\0';
16366
16367   if (strcmp (name, "reorder") == 0)
16368     {
16369       if (mips_opts.noreorder)
16370         end_noreorder ();
16371     }
16372   else if (strcmp (name, "noreorder") == 0)
16373     {
16374       if (!mips_opts.noreorder)
16375         start_noreorder ();
16376     }
16377   else if (strncmp (name, "at=", 3) == 0)
16378     {
16379       char *s = name + 3;
16380
16381       if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
16382         as_bad (_("Unrecognized register name `%s'"), s);
16383     }
16384   else if (strcmp (name, "at") == 0)
16385     {
16386       mips_opts.at = ATREG;
16387     }
16388   else if (strcmp (name, "noat") == 0)
16389     {
16390       mips_opts.at = ZERO;
16391     }
16392   else if (strcmp (name, "macro") == 0)
16393     {
16394       mips_opts.warn_about_macros = 0;
16395     }
16396   else if (strcmp (name, "nomacro") == 0)
16397     {
16398       if (mips_opts.noreorder == 0)
16399         as_bad (_("`noreorder' must be set before `nomacro'"));
16400       mips_opts.warn_about_macros = 1;
16401     }
16402   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
16403     {
16404       mips_opts.nomove = 0;
16405     }
16406   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
16407     {
16408       mips_opts.nomove = 1;
16409     }
16410   else if (strcmp (name, "bopt") == 0)
16411     {
16412       mips_opts.nobopt = 0;
16413     }
16414   else if (strcmp (name, "nobopt") == 0)
16415     {
16416       mips_opts.nobopt = 1;
16417     }
16418   else if (strcmp (name, "gp=default") == 0)
16419     mips_opts.gp32 = file_mips_gp32;
16420   else if (strcmp (name, "gp=32") == 0)
16421     mips_opts.gp32 = 1;
16422   else if (strcmp (name, "gp=64") == 0)
16423     {
16424       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
16425         as_warn (_("%s isa does not support 64-bit registers"),
16426                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16427       mips_opts.gp32 = 0;
16428     }
16429   else if (strcmp (name, "fp=default") == 0)
16430     mips_opts.fp32 = file_mips_fp32;
16431   else if (strcmp (name, "fp=32") == 0)
16432     mips_opts.fp32 = 1;
16433   else if (strcmp (name, "fp=64") == 0)
16434     {
16435       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
16436         as_warn (_("%s isa does not support 64-bit floating point registers"),
16437                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16438       mips_opts.fp32 = 0;
16439     }
16440   else if (strcmp (name, "softfloat") == 0)
16441     mips_opts.soft_float = 1;
16442   else if (strcmp (name, "hardfloat") == 0)
16443     mips_opts.soft_float = 0;
16444   else if (strcmp (name, "singlefloat") == 0)
16445     mips_opts.single_float = 1;
16446   else if (strcmp (name, "doublefloat") == 0)
16447     mips_opts.single_float = 0;
16448   else if (strcmp (name, "mips16") == 0
16449            || strcmp (name, "MIPS-16") == 0)
16450     {
16451       if (mips_opts.micromips == 1)
16452         as_fatal (_("`mips16' cannot be used with `micromips'"));
16453       mips_opts.mips16 = 1;
16454     }
16455   else if (strcmp (name, "nomips16") == 0
16456            || strcmp (name, "noMIPS-16") == 0)
16457     mips_opts.mips16 = 0;
16458   else if (strcmp (name, "micromips") == 0)
16459     {
16460       if (mips_opts.mips16 == 1)
16461         as_fatal (_("`micromips' cannot be used with `mips16'"));
16462       mips_opts.micromips = 1;
16463     }
16464   else if (strcmp (name, "nomicromips") == 0)
16465     mips_opts.micromips = 0;
16466   else if (strcmp (name, "smartmips") == 0)
16467     {
16468       if (!ISA_SUPPORTS_SMARTMIPS)
16469         as_warn (_("%s ISA does not support SmartMIPS ASE"), 
16470                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16471       mips_opts.ase_smartmips = 1;
16472     }
16473   else if (strcmp (name, "nosmartmips") == 0)
16474     mips_opts.ase_smartmips = 0;
16475   else if (strcmp (name, "mips3d") == 0)
16476     mips_opts.ase_mips3d = 1;
16477   else if (strcmp (name, "nomips3d") == 0)
16478     mips_opts.ase_mips3d = 0;
16479   else if (strcmp (name, "mdmx") == 0)
16480     mips_opts.ase_mdmx = 1;
16481   else if (strcmp (name, "nomdmx") == 0)
16482     mips_opts.ase_mdmx = 0;
16483   else if (strcmp (name, "dsp") == 0)
16484     {
16485       if (!ISA_SUPPORTS_DSP_ASE)
16486         as_warn (_("%s ISA does not support DSP ASE"), 
16487                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16488       mips_opts.ase_dsp = 1;
16489       mips_opts.ase_dspr2 = 0;
16490     }
16491   else if (strcmp (name, "nodsp") == 0)
16492     {
16493       mips_opts.ase_dsp = 0;
16494       mips_opts.ase_dspr2 = 0;
16495     }
16496   else if (strcmp (name, "dspr2") == 0)
16497     {
16498       if (!ISA_SUPPORTS_DSPR2_ASE)
16499         as_warn (_("%s ISA does not support DSP R2 ASE"),
16500                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16501       mips_opts.ase_dspr2 = 1;
16502       mips_opts.ase_dsp = 1;
16503     }
16504   else if (strcmp (name, "nodspr2") == 0)
16505     {
16506       mips_opts.ase_dspr2 = 0;
16507       mips_opts.ase_dsp = 0;
16508     }
16509   else if (strcmp (name, "mt") == 0)
16510     {
16511       if (!ISA_SUPPORTS_MT_ASE)
16512         as_warn (_("%s ISA does not support MT ASE"), 
16513                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16514       mips_opts.ase_mt = 1;
16515     }
16516   else if (strcmp (name, "nomt") == 0)
16517     mips_opts.ase_mt = 0;
16518   else if (strcmp (name, "mcu") == 0)
16519     mips_opts.ase_mcu = 1;
16520   else if (strcmp (name, "nomcu") == 0)
16521     mips_opts.ase_mcu = 0;
16522   else if (strcmp (name, "virt") == 0)
16523     {
16524       if (!ISA_SUPPORTS_VIRT_ASE)
16525         as_warn (_("%s ISA does not support Virtualization ASE"), 
16526                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16527       mips_opts.ase_virt = 1;
16528     }
16529   else if (strcmp (name, "novirt") == 0)
16530     mips_opts.ase_virt = 0;
16531   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
16532     {
16533       int reset = 0;
16534
16535       /* Permit the user to change the ISA and architecture on the fly.
16536          Needless to say, misuse can cause serious problems.  */
16537       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
16538         {
16539           reset = 1;
16540           mips_opts.isa = file_mips_isa;
16541           mips_opts.arch = file_mips_arch;
16542         }
16543       else if (strncmp (name, "arch=", 5) == 0)
16544         {
16545           const struct mips_cpu_info *p;
16546
16547           p = mips_parse_cpu("internal use", name + 5);
16548           if (!p)
16549             as_bad (_("unknown architecture %s"), name + 5);
16550           else
16551             {
16552               mips_opts.arch = p->cpu;
16553               mips_opts.isa = p->isa;
16554             }
16555         }
16556       else if (strncmp (name, "mips", 4) == 0)
16557         {
16558           const struct mips_cpu_info *p;
16559
16560           p = mips_parse_cpu("internal use", name);
16561           if (!p)
16562             as_bad (_("unknown ISA level %s"), name + 4);
16563           else
16564             {
16565               mips_opts.arch = p->cpu;
16566               mips_opts.isa = p->isa;
16567             }
16568         }
16569       else
16570         as_bad (_("unknown ISA or architecture %s"), name);
16571
16572       switch (mips_opts.isa)
16573         {
16574         case  0:
16575           break;
16576         case ISA_MIPS1:
16577         case ISA_MIPS2:
16578         case ISA_MIPS32:
16579         case ISA_MIPS32R2:
16580           mips_opts.gp32 = 1;
16581           mips_opts.fp32 = 1;
16582           break;
16583         case ISA_MIPS3:
16584         case ISA_MIPS4:
16585         case ISA_MIPS5:
16586         case ISA_MIPS64:
16587         case ISA_MIPS64R2:
16588           mips_opts.gp32 = 0;
16589           if (mips_opts.arch == CPU_R5900)
16590             {
16591                 mips_opts.fp32 = 1;
16592             }
16593           else
16594             {
16595           mips_opts.fp32 = 0;
16596             }
16597           break;
16598         default:
16599           as_bad (_("unknown ISA level %s"), name + 4);
16600           break;
16601         }
16602       if (reset)
16603         {
16604           mips_opts.gp32 = file_mips_gp32;
16605           mips_opts.fp32 = file_mips_fp32;
16606         }
16607     }
16608   else if (strcmp (name, "autoextend") == 0)
16609     mips_opts.noautoextend = 0;
16610   else if (strcmp (name, "noautoextend") == 0)
16611     mips_opts.noautoextend = 1;
16612   else if (strcmp (name, "push") == 0)
16613     {
16614       struct mips_option_stack *s;
16615
16616       s = (struct mips_option_stack *) xmalloc (sizeof *s);
16617       s->next = mips_opts_stack;
16618       s->options = mips_opts;
16619       mips_opts_stack = s;
16620     }
16621   else if (strcmp (name, "pop") == 0)
16622     {
16623       struct mips_option_stack *s;
16624
16625       s = mips_opts_stack;
16626       if (s == NULL)
16627         as_bad (_(".set pop with no .set push"));
16628       else
16629         {
16630           /* If we're changing the reorder mode we need to handle
16631              delay slots correctly.  */
16632           if (s->options.noreorder && ! mips_opts.noreorder)
16633             start_noreorder ();
16634           else if (! s->options.noreorder && mips_opts.noreorder)
16635             end_noreorder ();
16636
16637           mips_opts = s->options;
16638           mips_opts_stack = s->next;
16639           free (s);
16640         }
16641     }
16642   else if (strcmp (name, "sym32") == 0)
16643     mips_opts.sym32 = TRUE;
16644   else if (strcmp (name, "nosym32") == 0)
16645     mips_opts.sym32 = FALSE;
16646   else if (strchr (name, ','))
16647     {
16648       /* Generic ".set" directive; use the generic handler.  */
16649       *input_line_pointer = ch;
16650       input_line_pointer = name;
16651       s_set (0);
16652       return;
16653     }
16654   else
16655     {
16656       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
16657     }
16658   *input_line_pointer = ch;
16659   demand_empty_rest_of_line ();
16660 }
16661
16662 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
16663    .option pic2.  It means to generate SVR4 PIC calls.  */
16664
16665 static void
16666 s_abicalls (int ignore ATTRIBUTE_UNUSED)
16667 {
16668   mips_pic = SVR4_PIC;
16669   mips_abicalls = TRUE;
16670
16671   if (g_switch_seen && g_switch_value != 0)
16672     as_warn (_("-G may not be used with SVR4 PIC code"));
16673   g_switch_value = 0;
16674
16675   bfd_set_gp_size (stdoutput, 0);
16676   demand_empty_rest_of_line ();
16677 }
16678
16679 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
16680    PIC code.  It sets the $gp register for the function based on the
16681    function address, which is in the register named in the argument.
16682    This uses a relocation against _gp_disp, which is handled specially
16683    by the linker.  The result is:
16684         lui     $gp,%hi(_gp_disp)
16685         addiu   $gp,$gp,%lo(_gp_disp)
16686         addu    $gp,$gp,.cpload argument
16687    The .cpload argument is normally $25 == $t9.
16688
16689    The -mno-shared option changes this to:
16690         lui     $gp,%hi(__gnu_local_gp)
16691         addiu   $gp,$gp,%lo(__gnu_local_gp)
16692    and the argument is ignored.  This saves an instruction, but the
16693    resulting code is not position independent; it uses an absolute
16694    address for __gnu_local_gp.  Thus code assembled with -mno-shared
16695    can go into an ordinary executable, but not into a shared library.  */
16696
16697 static void
16698 s_cpload (int ignore ATTRIBUTE_UNUSED)
16699 {
16700   expressionS ex;
16701   int reg;
16702   int in_shared;
16703
16704   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16705      .cpload is ignored.  */
16706   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16707     {
16708       s_ignore (0);
16709       return;
16710     }
16711
16712   if (mips_opts.mips16)
16713     {
16714       as_bad (_("%s not supported in MIPS16 mode"), ".cpload");
16715       ignore_rest_of_line ();
16716       return;
16717     }
16718
16719   /* .cpload should be in a .set noreorder section.  */
16720   if (mips_opts.noreorder == 0)
16721     as_warn (_(".cpload not in noreorder section"));
16722
16723   reg = tc_get_register (0);
16724
16725   /* If we need to produce a 64-bit address, we are better off using
16726      the default instruction sequence.  */
16727   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
16728
16729   ex.X_op = O_symbol;
16730   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
16731                                          "__gnu_local_gp");
16732   ex.X_op_symbol = NULL;
16733   ex.X_add_number = 0;
16734
16735   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
16736   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16737
16738   mips_mark_labels ();
16739   mips_assembling_insn = TRUE;
16740
16741   macro_start ();
16742   macro_build_lui (&ex, mips_gp_register);
16743   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16744                mips_gp_register, BFD_RELOC_LO16);
16745   if (in_shared)
16746     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
16747                  mips_gp_register, reg);
16748   macro_end ();
16749
16750   mips_assembling_insn = FALSE;
16751   demand_empty_rest_of_line ();
16752 }
16753
16754 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
16755      .cpsetup $reg1, offset|$reg2, label
16756
16757    If offset is given, this results in:
16758      sd         $gp, offset($sp)
16759      lui        $gp, %hi(%neg(%gp_rel(label)))
16760      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
16761      daddu      $gp, $gp, $reg1
16762
16763    If $reg2 is given, this results in:
16764      daddu      $reg2, $gp, $0
16765      lui        $gp, %hi(%neg(%gp_rel(label)))
16766      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
16767      daddu      $gp, $gp, $reg1
16768    $reg1 is normally $25 == $t9.
16769
16770    The -mno-shared option replaces the last three instructions with
16771         lui     $gp,%hi(_gp)
16772         addiu   $gp,$gp,%lo(_gp)  */
16773
16774 static void
16775 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
16776 {
16777   expressionS ex_off;
16778   expressionS ex_sym;
16779   int reg1;
16780
16781   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
16782      We also need NewABI support.  */
16783   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16784     {
16785       s_ignore (0);
16786       return;
16787     }
16788
16789   if (mips_opts.mips16)
16790     {
16791       as_bad (_("%s not supported in MIPS16 mode"), ".cpsetup");
16792       ignore_rest_of_line ();
16793       return;
16794     }
16795
16796   reg1 = tc_get_register (0);
16797   SKIP_WHITESPACE ();
16798   if (*input_line_pointer != ',')
16799     {
16800       as_bad (_("missing argument separator ',' for .cpsetup"));
16801       return;
16802     }
16803   else
16804     ++input_line_pointer;
16805   SKIP_WHITESPACE ();
16806   if (*input_line_pointer == '$')
16807     {
16808       mips_cpreturn_register = tc_get_register (0);
16809       mips_cpreturn_offset = -1;
16810     }
16811   else
16812     {
16813       mips_cpreturn_offset = get_absolute_expression ();
16814       mips_cpreturn_register = -1;
16815     }
16816   SKIP_WHITESPACE ();
16817   if (*input_line_pointer != ',')
16818     {
16819       as_bad (_("missing argument separator ',' for .cpsetup"));
16820       return;
16821     }
16822   else
16823     ++input_line_pointer;
16824   SKIP_WHITESPACE ();
16825   expression (&ex_sym);
16826
16827   mips_mark_labels ();
16828   mips_assembling_insn = TRUE;
16829
16830   macro_start ();
16831   if (mips_cpreturn_register == -1)
16832     {
16833       ex_off.X_op = O_constant;
16834       ex_off.X_add_symbol = NULL;
16835       ex_off.X_op_symbol = NULL;
16836       ex_off.X_add_number = mips_cpreturn_offset;
16837
16838       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
16839                    BFD_RELOC_LO16, SP);
16840     }
16841   else
16842     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
16843                  mips_gp_register, 0);
16844
16845   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
16846     {
16847       macro_build (&ex_sym, "lui", LUI_FMT, mips_gp_register,
16848                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
16849                    BFD_RELOC_HI16_S);
16850
16851       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
16852                    mips_gp_register, -1, BFD_RELOC_GPREL16,
16853                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
16854
16855       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
16856                    mips_gp_register, reg1);
16857     }
16858   else
16859     {
16860       expressionS ex;
16861
16862       ex.X_op = O_symbol;
16863       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
16864       ex.X_op_symbol = NULL;
16865       ex.X_add_number = 0;
16866
16867       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
16868       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16869
16870       macro_build_lui (&ex, mips_gp_register);
16871       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16872                    mips_gp_register, BFD_RELOC_LO16);
16873     }
16874
16875   macro_end ();
16876
16877   mips_assembling_insn = FALSE;
16878   demand_empty_rest_of_line ();
16879 }
16880
16881 static void
16882 s_cplocal (int ignore ATTRIBUTE_UNUSED)
16883 {
16884   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
16885      .cplocal is ignored.  */
16886   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16887     {
16888       s_ignore (0);
16889       return;
16890     }
16891
16892   if (mips_opts.mips16)
16893     {
16894       as_bad (_("%s not supported in MIPS16 mode"), ".cplocal");
16895       ignore_rest_of_line ();
16896       return;
16897     }
16898
16899   mips_gp_register = tc_get_register (0);
16900   demand_empty_rest_of_line ();
16901 }
16902
16903 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
16904    offset from $sp.  The offset is remembered, and after making a PIC
16905    call $gp is restored from that location.  */
16906
16907 static void
16908 s_cprestore (int ignore ATTRIBUTE_UNUSED)
16909 {
16910   expressionS ex;
16911
16912   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16913      .cprestore is ignored.  */
16914   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16915     {
16916       s_ignore (0);
16917       return;
16918     }
16919
16920   if (mips_opts.mips16)
16921     {
16922       as_bad (_("%s not supported in MIPS16 mode"), ".cprestore");
16923       ignore_rest_of_line ();
16924       return;
16925     }
16926
16927   mips_cprestore_offset = get_absolute_expression ();
16928   mips_cprestore_valid = 1;
16929
16930   ex.X_op = O_constant;
16931   ex.X_add_symbol = NULL;
16932   ex.X_op_symbol = NULL;
16933   ex.X_add_number = mips_cprestore_offset;
16934
16935   mips_mark_labels ();
16936   mips_assembling_insn = TRUE;
16937
16938   macro_start ();
16939   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
16940                                 SP, HAVE_64BIT_ADDRESSES);
16941   macro_end ();
16942
16943   mips_assembling_insn = FALSE;
16944   demand_empty_rest_of_line ();
16945 }
16946
16947 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
16948    was given in the preceding .cpsetup, it results in:
16949      ld         $gp, offset($sp)
16950
16951    If a register $reg2 was given there, it results in:
16952      daddu      $gp, $reg2, $0  */
16953
16954 static void
16955 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
16956 {
16957   expressionS ex;
16958
16959   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
16960      We also need NewABI support.  */
16961   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16962     {
16963       s_ignore (0);
16964       return;
16965     }
16966
16967   if (mips_opts.mips16)
16968     {
16969       as_bad (_("%s not supported in MIPS16 mode"), ".cpreturn");
16970       ignore_rest_of_line ();
16971       return;
16972     }
16973
16974   mips_mark_labels ();
16975   mips_assembling_insn = TRUE;
16976
16977   macro_start ();
16978   if (mips_cpreturn_register == -1)
16979     {
16980       ex.X_op = O_constant;
16981       ex.X_add_symbol = NULL;
16982       ex.X_op_symbol = NULL;
16983       ex.X_add_number = mips_cpreturn_offset;
16984
16985       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
16986     }
16987   else
16988     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
16989                  mips_cpreturn_register, 0);
16990   macro_end ();
16991
16992   mips_assembling_insn = FALSE;
16993   demand_empty_rest_of_line ();
16994 }
16995
16996 /* Handle a .dtprelword, .dtpreldword, .tprelword, or .tpreldword
16997    pseudo-op; DIRSTR says which. The pseudo-op generates a BYTES-size
16998    DTP- or TP-relative relocation of type RTYPE, for use in either DWARF
16999    debug information or MIPS16 TLS.  */
17000
17001 static void
17002 s_tls_rel_directive (const size_t bytes, const char *dirstr,
17003                      bfd_reloc_code_real_type rtype)
17004 {
17005   expressionS ex;
17006   char *p;
17007
17008   expression (&ex);
17009
17010   if (ex.X_op != O_symbol)
17011     {
17012       as_bad (_("Unsupported use of %s"), dirstr);
17013       ignore_rest_of_line ();
17014     }
17015
17016   p = frag_more (bytes);
17017   md_number_to_chars (p, 0, bytes);
17018   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE, rtype);
17019   demand_empty_rest_of_line ();
17020   mips_clear_insn_labels ();
17021 }
17022
17023 /* Handle .dtprelword.  */
17024
17025 static void
17026 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
17027 {
17028   s_tls_rel_directive (4, ".dtprelword", BFD_RELOC_MIPS_TLS_DTPREL32);
17029 }
17030
17031 /* Handle .dtpreldword.  */
17032
17033 static void
17034 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
17035 {
17036   s_tls_rel_directive (8, ".dtpreldword", BFD_RELOC_MIPS_TLS_DTPREL64);
17037 }
17038
17039 /* Handle .tprelword.  */
17040
17041 static void
17042 s_tprelword (int ignore ATTRIBUTE_UNUSED)
17043 {
17044   s_tls_rel_directive (4, ".tprelword", BFD_RELOC_MIPS_TLS_TPREL32);
17045 }
17046
17047 /* Handle .tpreldword.  */
17048
17049 static void
17050 s_tpreldword (int ignore ATTRIBUTE_UNUSED)
17051 {
17052   s_tls_rel_directive (8, ".tpreldword", BFD_RELOC_MIPS_TLS_TPREL64);
17053 }
17054
17055 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
17056    code.  It sets the offset to use in gp_rel relocations.  */
17057
17058 static void
17059 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
17060 {
17061   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
17062      We also need NewABI support.  */
17063   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
17064     {
17065       s_ignore (0);
17066       return;
17067     }
17068
17069   mips_gprel_offset = get_absolute_expression ();
17070
17071   demand_empty_rest_of_line ();
17072 }
17073
17074 /* Handle the .gpword pseudo-op.  This is used when generating PIC
17075    code.  It generates a 32 bit GP relative reloc.  */
17076
17077 static void
17078 s_gpword (int ignore ATTRIBUTE_UNUSED)
17079 {
17080   segment_info_type *si;
17081   struct insn_label_list *l;
17082   expressionS ex;
17083   char *p;
17084
17085   /* When not generating PIC code, this is treated as .word.  */
17086   if (mips_pic != SVR4_PIC)
17087     {
17088       s_cons (2);
17089       return;
17090     }
17091
17092   si = seg_info (now_seg);
17093   l = si->label_list;
17094   mips_emit_delays ();
17095   if (auto_align)
17096     mips_align (2, 0, l);
17097
17098   expression (&ex);
17099   mips_clear_insn_labels ();
17100
17101   if (ex.X_op != O_symbol || ex.X_add_number != 0)
17102     {
17103       as_bad (_("Unsupported use of .gpword"));
17104       ignore_rest_of_line ();
17105     }
17106
17107   p = frag_more (4);
17108   md_number_to_chars (p, 0, 4);
17109   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
17110                BFD_RELOC_GPREL32);
17111
17112   demand_empty_rest_of_line ();
17113 }
17114
17115 static void
17116 s_gpdword (int ignore ATTRIBUTE_UNUSED)
17117 {
17118   segment_info_type *si;
17119   struct insn_label_list *l;
17120   expressionS ex;
17121   char *p;
17122
17123   /* When not generating PIC code, this is treated as .dword.  */
17124   if (mips_pic != SVR4_PIC)
17125     {
17126       s_cons (3);
17127       return;
17128     }
17129
17130   si = seg_info (now_seg);
17131   l = si->label_list;
17132   mips_emit_delays ();
17133   if (auto_align)
17134     mips_align (3, 0, l);
17135
17136   expression (&ex);
17137   mips_clear_insn_labels ();
17138
17139   if (ex.X_op != O_symbol || ex.X_add_number != 0)
17140     {
17141       as_bad (_("Unsupported use of .gpdword"));
17142       ignore_rest_of_line ();
17143     }
17144
17145   p = frag_more (8);
17146   md_number_to_chars (p, 0, 8);
17147   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
17148                BFD_RELOC_GPREL32)->fx_tcbit = 1;
17149
17150   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
17151   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
17152            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
17153
17154   demand_empty_rest_of_line ();
17155 }
17156
17157 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
17158    tables in SVR4 PIC code.  */
17159
17160 static void
17161 s_cpadd (int ignore ATTRIBUTE_UNUSED)
17162 {
17163   int reg;
17164
17165   /* This is ignored when not generating SVR4 PIC code.  */
17166   if (mips_pic != SVR4_PIC)
17167     {
17168       s_ignore (0);
17169       return;
17170     }
17171
17172   mips_mark_labels ();
17173   mips_assembling_insn = TRUE;
17174
17175   /* Add $gp to the register named as an argument.  */
17176   macro_start ();
17177   reg = tc_get_register (0);
17178   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
17179   macro_end ();
17180
17181   mips_assembling_insn = FALSE;
17182   demand_empty_rest_of_line ();
17183 }
17184
17185 /* Handle the .insn pseudo-op.  This marks instruction labels in
17186    mips16/micromips mode.  This permits the linker to handle them specially,
17187    such as generating jalx instructions when needed.  We also make
17188    them odd for the duration of the assembly, in order to generate the
17189    right sort of code.  We will make them even in the adjust_symtab
17190    routine, while leaving them marked.  This is convenient for the
17191    debugger and the disassembler.  The linker knows to make them odd
17192    again.  */
17193
17194 static void
17195 s_insn (int ignore ATTRIBUTE_UNUSED)
17196 {
17197   mips_mark_labels ();
17198
17199   demand_empty_rest_of_line ();
17200 }
17201
17202 /* Handle a .stab[snd] directive.  Ideally these directives would be
17203    implemented in a transparent way, so that removing them would not
17204    have any effect on the generated instructions.  However, s_stab
17205    internally changes the section, so in practice we need to decide
17206    now whether the preceding label marks compressed code.  We do not
17207    support changing the compression mode of a label after a .stab*
17208    directive, such as in:
17209
17210    foo:
17211         .stabs ...
17212         .set mips16
17213
17214    so the current mode wins.  */
17215
17216 static void
17217 s_mips_stab (int type)
17218 {
17219   mips_mark_labels ();
17220   s_stab (type);
17221 }
17222
17223 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
17224
17225 static void
17226 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
17227 {
17228   char *name;
17229   int c;
17230   symbolS *symbolP;
17231   expressionS exp;
17232
17233   name = input_line_pointer;
17234   c = get_symbol_end ();
17235   symbolP = symbol_find_or_make (name);
17236   S_SET_WEAK (symbolP);
17237   *input_line_pointer = c;
17238
17239   SKIP_WHITESPACE ();
17240
17241   if (! is_end_of_line[(unsigned char) *input_line_pointer])
17242     {
17243       if (S_IS_DEFINED (symbolP))
17244         {
17245           as_bad (_("ignoring attempt to redefine symbol %s"),
17246                   S_GET_NAME (symbolP));
17247           ignore_rest_of_line ();
17248           return;
17249         }
17250
17251       if (*input_line_pointer == ',')
17252         {
17253           ++input_line_pointer;
17254           SKIP_WHITESPACE ();
17255         }
17256
17257       expression (&exp);
17258       if (exp.X_op != O_symbol)
17259         {
17260           as_bad (_("bad .weakext directive"));
17261           ignore_rest_of_line ();
17262           return;
17263         }
17264       symbol_set_value_expression (symbolP, &exp);
17265     }
17266
17267   demand_empty_rest_of_line ();
17268 }
17269
17270 /* Parse a register string into a number.  Called from the ECOFF code
17271    to parse .frame.  The argument is non-zero if this is the frame
17272    register, so that we can record it in mips_frame_reg.  */
17273
17274 int
17275 tc_get_register (int frame)
17276 {
17277   unsigned int reg;
17278
17279   SKIP_WHITESPACE ();
17280   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
17281     reg = 0;
17282   if (frame)
17283     {
17284       mips_frame_reg = reg != 0 ? reg : SP;
17285       mips_frame_reg_valid = 1;
17286       mips_cprestore_valid = 0;
17287     }
17288   return reg;
17289 }
17290
17291 valueT
17292 md_section_align (asection *seg, valueT addr)
17293 {
17294   int align = bfd_get_section_alignment (stdoutput, seg);
17295
17296   if (IS_ELF)
17297     {
17298       /* We don't need to align ELF sections to the full alignment.
17299          However, Irix 5 may prefer that we align them at least to a 16
17300          byte boundary.  We don't bother to align the sections if we
17301          are targeted for an embedded system.  */
17302       if (strncmp (TARGET_OS, "elf", 3) == 0)
17303         return addr;
17304       if (align > 4)
17305         align = 4;
17306     }
17307
17308   return ((addr + (1 << align) - 1) & (-1 << align));
17309 }
17310
17311 /* Utility routine, called from above as well.  If called while the
17312    input file is still being read, it's only an approximation.  (For
17313    example, a symbol may later become defined which appeared to be
17314    undefined earlier.)  */
17315
17316 static int
17317 nopic_need_relax (symbolS *sym, int before_relaxing)
17318 {
17319   if (sym == 0)
17320     return 0;
17321
17322   if (g_switch_value > 0)
17323     {
17324       const char *symname;
17325       int change;
17326
17327       /* Find out whether this symbol can be referenced off the $gp
17328          register.  It can be if it is smaller than the -G size or if
17329          it is in the .sdata or .sbss section.  Certain symbols can
17330          not be referenced off the $gp, although it appears as though
17331          they can.  */
17332       symname = S_GET_NAME (sym);
17333       if (symname != (const char *) NULL
17334           && (strcmp (symname, "eprol") == 0
17335               || strcmp (symname, "etext") == 0
17336               || strcmp (symname, "_gp") == 0
17337               || strcmp (symname, "edata") == 0
17338               || strcmp (symname, "_fbss") == 0
17339               || strcmp (symname, "_fdata") == 0
17340               || strcmp (symname, "_ftext") == 0
17341               || strcmp (symname, "end") == 0
17342               || strcmp (symname, "_gp_disp") == 0))
17343         change = 1;
17344       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
17345                && (0
17346 #ifndef NO_ECOFF_DEBUGGING
17347                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
17348                        && (symbol_get_obj (sym)->ecoff_extern_size
17349                            <= g_switch_value))
17350 #endif
17351                    /* We must defer this decision until after the whole
17352                       file has been read, since there might be a .extern
17353                       after the first use of this symbol.  */
17354                    || (before_relaxing
17355 #ifndef NO_ECOFF_DEBUGGING
17356                        && symbol_get_obj (sym)->ecoff_extern_size == 0
17357 #endif
17358                        && S_GET_VALUE (sym) == 0)
17359                    || (S_GET_VALUE (sym) != 0
17360                        && S_GET_VALUE (sym) <= g_switch_value)))
17361         change = 0;
17362       else
17363         {
17364           const char *segname;
17365
17366           segname = segment_name (S_GET_SEGMENT (sym));
17367           gas_assert (strcmp (segname, ".lit8") != 0
17368                   && strcmp (segname, ".lit4") != 0);
17369           change = (strcmp (segname, ".sdata") != 0
17370                     && strcmp (segname, ".sbss") != 0
17371                     && strncmp (segname, ".sdata.", 7) != 0
17372                     && strncmp (segname, ".sbss.", 6) != 0
17373                     && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
17374                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
17375         }
17376       return change;
17377     }
17378   else
17379     /* We are not optimizing for the $gp register.  */
17380     return 1;
17381 }
17382
17383
17384 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
17385
17386 static bfd_boolean
17387 pic_need_relax (symbolS *sym, asection *segtype)
17388 {
17389   asection *symsec;
17390
17391   /* Handle the case of a symbol equated to another symbol.  */
17392   while (symbol_equated_reloc_p (sym))
17393     {
17394       symbolS *n;
17395
17396       /* It's possible to get a loop here in a badly written program.  */
17397       n = symbol_get_value_expression (sym)->X_add_symbol;
17398       if (n == sym)
17399         break;
17400       sym = n;
17401     }
17402
17403   if (symbol_section_p (sym))
17404     return TRUE;
17405
17406   symsec = S_GET_SEGMENT (sym);
17407
17408   /* This must duplicate the test in adjust_reloc_syms.  */
17409   return (!bfd_is_und_section (symsec)
17410           && !bfd_is_abs_section (symsec)
17411           && !bfd_is_com_section (symsec)
17412           && !s_is_linkonce (sym, segtype)
17413 #ifdef OBJ_ELF
17414           /* A global or weak symbol is treated as external.  */
17415           && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
17416 #endif
17417           );
17418 }
17419
17420
17421 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
17422    extended opcode.  SEC is the section the frag is in.  */
17423
17424 static int
17425 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
17426 {
17427   int type;
17428   const struct mips16_immed_operand *op;
17429   offsetT val;
17430   int mintiny, maxtiny;
17431   segT symsec;
17432   fragS *sym_frag;
17433
17434   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
17435     return 0;
17436   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
17437     return 1;
17438
17439   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
17440   op = mips16_immed_operands;
17441   while (op->type != type)
17442     {
17443       ++op;
17444       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
17445     }
17446
17447   if (op->unsp)
17448     {
17449       if (type == '<' || type == '>' || type == '[' || type == ']')
17450         {
17451           mintiny = 1;
17452           maxtiny = 1 << op->nbits;
17453         }
17454       else
17455         {
17456           mintiny = 0;
17457           maxtiny = (1 << op->nbits) - 1;
17458         }
17459     }
17460   else
17461     {
17462       mintiny = - (1 << (op->nbits - 1));
17463       maxtiny = (1 << (op->nbits - 1)) - 1;
17464     }
17465
17466   sym_frag = symbol_get_frag (fragp->fr_symbol);
17467   val = S_GET_VALUE (fragp->fr_symbol);
17468   symsec = S_GET_SEGMENT (fragp->fr_symbol);
17469
17470   if (op->pcrel)
17471     {
17472       addressT addr;
17473
17474       /* We won't have the section when we are called from
17475          mips_relax_frag.  However, we will always have been called
17476          from md_estimate_size_before_relax first.  If this is a
17477          branch to a different section, we mark it as such.  If SEC is
17478          NULL, and the frag is not marked, then it must be a branch to
17479          the same section.  */
17480       if (sec == NULL)
17481         {
17482           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
17483             return 1;
17484         }
17485       else
17486         {
17487           /* Must have been called from md_estimate_size_before_relax.  */
17488           if (symsec != sec)
17489             {
17490               fragp->fr_subtype =
17491                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17492
17493               /* FIXME: We should support this, and let the linker
17494                  catch branches and loads that are out of range.  */
17495               as_bad_where (fragp->fr_file, fragp->fr_line,
17496                             _("unsupported PC relative reference to different section"));
17497
17498               return 1;
17499             }
17500           if (fragp != sym_frag && sym_frag->fr_address == 0)
17501             /* Assume non-extended on the first relaxation pass.
17502                The address we have calculated will be bogus if this is
17503                a forward branch to another frag, as the forward frag
17504                will have fr_address == 0.  */
17505             return 0;
17506         }
17507
17508       /* In this case, we know for sure that the symbol fragment is in
17509          the same section.  If the relax_marker of the symbol fragment
17510          differs from the relax_marker of this fragment, we have not
17511          yet adjusted the symbol fragment fr_address.  We want to add
17512          in STRETCH in order to get a better estimate of the address.
17513          This particularly matters because of the shift bits.  */
17514       if (stretch != 0
17515           && sym_frag->relax_marker != fragp->relax_marker)
17516         {
17517           fragS *f;
17518
17519           /* Adjust stretch for any alignment frag.  Note that if have
17520              been expanding the earlier code, the symbol may be
17521              defined in what appears to be an earlier frag.  FIXME:
17522              This doesn't handle the fr_subtype field, which specifies
17523              a maximum number of bytes to skip when doing an
17524              alignment.  */
17525           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
17526             {
17527               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
17528                 {
17529                   if (stretch < 0)
17530                     stretch = - ((- stretch)
17531                                  & ~ ((1 << (int) f->fr_offset) - 1));
17532                   else
17533                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
17534                   if (stretch == 0)
17535                     break;
17536                 }
17537             }
17538           if (f != NULL)
17539             val += stretch;
17540         }
17541
17542       addr = fragp->fr_address + fragp->fr_fix;
17543
17544       /* The base address rules are complicated.  The base address of
17545          a branch is the following instruction.  The base address of a
17546          PC relative load or add is the instruction itself, but if it
17547          is in a delay slot (in which case it can not be extended) use
17548          the address of the instruction whose delay slot it is in.  */
17549       if (type == 'p' || type == 'q')
17550         {
17551           addr += 2;
17552
17553           /* If we are currently assuming that this frag should be
17554              extended, then, the current address is two bytes
17555              higher.  */
17556           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17557             addr += 2;
17558
17559           /* Ignore the low bit in the target, since it will be set
17560              for a text label.  */
17561           if ((val & 1) != 0)
17562             --val;
17563         }
17564       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
17565         addr -= 4;
17566       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
17567         addr -= 2;
17568
17569       val -= addr & ~ ((1 << op->shift) - 1);
17570
17571       /* Branch offsets have an implicit 0 in the lowest bit.  */
17572       if (type == 'p' || type == 'q')
17573         val /= 2;
17574
17575       /* If any of the shifted bits are set, we must use an extended
17576          opcode.  If the address depends on the size of this
17577          instruction, this can lead to a loop, so we arrange to always
17578          use an extended opcode.  We only check this when we are in
17579          the main relaxation loop, when SEC is NULL.  */
17580       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
17581         {
17582           fragp->fr_subtype =
17583             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17584           return 1;
17585         }
17586
17587       /* If we are about to mark a frag as extended because the value
17588          is precisely maxtiny + 1, then there is a chance of an
17589          infinite loop as in the following code:
17590              la $4,foo
17591              .skip      1020
17592              .align     2
17593            foo:
17594          In this case when the la is extended, foo is 0x3fc bytes
17595          away, so the la can be shrunk, but then foo is 0x400 away, so
17596          the la must be extended.  To avoid this loop, we mark the
17597          frag as extended if it was small, and is about to become
17598          extended with a value of maxtiny + 1.  */
17599       if (val == ((maxtiny + 1) << op->shift)
17600           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
17601           && sec == NULL)
17602         {
17603           fragp->fr_subtype =
17604             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17605           return 1;
17606         }
17607     }
17608   else if (symsec != absolute_section && sec != NULL)
17609     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
17610
17611   if ((val & ((1 << op->shift) - 1)) != 0
17612       || val < (mintiny << op->shift)
17613       || val > (maxtiny << op->shift))
17614     return 1;
17615   else
17616     return 0;
17617 }
17618
17619 /* Compute the length of a branch sequence, and adjust the
17620    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
17621    worst-case length is computed, with UPDATE being used to indicate
17622    whether an unconditional (-1), branch-likely (+1) or regular (0)
17623    branch is to be computed.  */
17624 static int
17625 relaxed_branch_length (fragS *fragp, asection *sec, int update)
17626 {
17627   bfd_boolean toofar;
17628   int length;
17629
17630   if (fragp
17631       && S_IS_DEFINED (fragp->fr_symbol)
17632       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17633     {
17634       addressT addr;
17635       offsetT val;
17636
17637       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17638
17639       addr = fragp->fr_address + fragp->fr_fix + 4;
17640
17641       val -= addr;
17642
17643       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
17644     }
17645   else if (fragp)
17646     /* If the symbol is not defined or it's in a different segment,
17647        assume the user knows what's going on and emit a short
17648        branch.  */
17649     toofar = FALSE;
17650   else
17651     toofar = TRUE;
17652
17653   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
17654     fragp->fr_subtype
17655       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_AT (fragp->fr_subtype),
17656                              RELAX_BRANCH_UNCOND (fragp->fr_subtype),
17657                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
17658                              RELAX_BRANCH_LINK (fragp->fr_subtype),
17659                              toofar);
17660
17661   length = 4;
17662   if (toofar)
17663     {
17664       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
17665         length += 8;
17666
17667       if (mips_pic != NO_PIC)
17668         {
17669           /* Additional space for PIC loading of target address.  */
17670           length += 8;
17671           if (mips_opts.isa == ISA_MIPS1)
17672             /* Additional space for $at-stabilizing nop.  */
17673             length += 4;
17674         }
17675
17676       /* If branch is conditional.  */
17677       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
17678         length += 8;
17679     }
17680
17681   return length;
17682 }
17683
17684 /* Compute the length of a branch sequence, and adjust the
17685    RELAX_MICROMIPS_TOOFAR32 bit accordingly.  If FRAGP is NULL, the
17686    worst-case length is computed, with UPDATE being used to indicate
17687    whether an unconditional (-1), or regular (0) branch is to be
17688    computed.  */
17689
17690 static int
17691 relaxed_micromips_32bit_branch_length (fragS *fragp, asection *sec, int update)
17692 {
17693   bfd_boolean toofar;
17694   int length;
17695
17696   if (fragp
17697       && S_IS_DEFINED (fragp->fr_symbol)
17698       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17699     {
17700       addressT addr;
17701       offsetT val;
17702
17703       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17704       /* Ignore the low bit in the target, since it will be set
17705          for a text label.  */
17706       if ((val & 1) != 0)
17707         --val;
17708
17709       addr = fragp->fr_address + fragp->fr_fix + 4;
17710
17711       val -= addr;
17712
17713       toofar = val < - (0x8000 << 1) || val >= (0x8000 << 1);
17714     }
17715   else if (fragp)
17716     /* If the symbol is not defined or it's in a different segment,
17717        assume the user knows what's going on and emit a short
17718        branch.  */
17719     toofar = FALSE;
17720   else
17721     toofar = TRUE;
17722
17723   if (fragp && update
17724       && toofar != RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
17725     fragp->fr_subtype = (toofar
17726                          ? RELAX_MICROMIPS_MARK_TOOFAR32 (fragp->fr_subtype)
17727                          : RELAX_MICROMIPS_CLEAR_TOOFAR32 (fragp->fr_subtype));
17728
17729   length = 4;
17730   if (toofar)
17731     {
17732       bfd_boolean compact_known = fragp != NULL;
17733       bfd_boolean compact = FALSE;
17734       bfd_boolean uncond;
17735
17736       if (compact_known)
17737         compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
17738       if (fragp)
17739         uncond = RELAX_MICROMIPS_UNCOND (fragp->fr_subtype);
17740       else
17741         uncond = update < 0;
17742
17743       /* If label is out of range, we turn branch <br>:
17744
17745                 <br>    label                   # 4 bytes
17746             0:
17747
17748          into:
17749
17750                 j       label                   # 4 bytes
17751                 nop                             # 2 bytes if compact && !PIC
17752             0:
17753        */
17754       if (mips_pic == NO_PIC && (!compact_known || compact))
17755         length += 2;
17756
17757       /* If assembling PIC code, we further turn:
17758
17759                         j       label                   # 4 bytes
17760
17761          into:
17762
17763                         lw/ld   at, %got(label)(gp)     # 4 bytes
17764                         d/addiu at, %lo(label)          # 4 bytes
17765                         jr/c    at                      # 2 bytes
17766        */
17767       if (mips_pic != NO_PIC)
17768         length += 6;
17769
17770       /* If branch <br> is conditional, we prepend negated branch <brneg>:
17771
17772                         <brneg> 0f                      # 4 bytes
17773                         nop                             # 2 bytes if !compact
17774        */
17775       if (!uncond)
17776         length += (compact_known && compact) ? 4 : 6;
17777     }
17778
17779   return length;
17780 }
17781
17782 /* Compute the length of a branch, and adjust the RELAX_MICROMIPS_TOOFAR16
17783    bit accordingly.  */
17784
17785 static int
17786 relaxed_micromips_16bit_branch_length (fragS *fragp, asection *sec, int update)
17787 {
17788   bfd_boolean toofar;
17789
17790   if (fragp
17791       && S_IS_DEFINED (fragp->fr_symbol)
17792       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17793     {
17794       addressT addr;
17795       offsetT val;
17796       int type;
17797
17798       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17799       /* Ignore the low bit in the target, since it will be set
17800          for a text label.  */
17801       if ((val & 1) != 0)
17802         --val;
17803
17804       /* Assume this is a 2-byte branch.  */
17805       addr = fragp->fr_address + fragp->fr_fix + 2;
17806
17807       /* We try to avoid the infinite loop by not adding 2 more bytes for
17808          long branches.  */
17809
17810       val -= addr;
17811
17812       type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
17813       if (type == 'D')
17814         toofar = val < - (0x200 << 1) || val >= (0x200 << 1);
17815       else if (type == 'E')
17816         toofar = val < - (0x40 << 1) || val >= (0x40 << 1);
17817       else
17818         abort ();
17819     }
17820   else
17821     /* If the symbol is not defined or it's in a different segment,
17822        we emit a normal 32-bit branch.  */
17823     toofar = TRUE;
17824
17825   if (fragp && update
17826       && toofar != RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
17827     fragp->fr_subtype
17828       = toofar ? RELAX_MICROMIPS_MARK_TOOFAR16 (fragp->fr_subtype)
17829                : RELAX_MICROMIPS_CLEAR_TOOFAR16 (fragp->fr_subtype);
17830
17831   if (toofar)
17832     return 4;
17833
17834   return 2;
17835 }
17836
17837 /* Estimate the size of a frag before relaxing.  Unless this is the
17838    mips16, we are not really relaxing here, and the final size is
17839    encoded in the subtype information.  For the mips16, we have to
17840    decide whether we are using an extended opcode or not.  */
17841
17842 int
17843 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
17844 {
17845   int change;
17846
17847   if (RELAX_BRANCH_P (fragp->fr_subtype))
17848     {
17849
17850       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
17851
17852       return fragp->fr_var;
17853     }
17854
17855   if (RELAX_MIPS16_P (fragp->fr_subtype))
17856     /* We don't want to modify the EXTENDED bit here; it might get us
17857        into infinite loops.  We change it only in mips_relax_frag().  */
17858     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
17859
17860   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17861     {
17862       int length = 4;
17863
17864       if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
17865         length = relaxed_micromips_16bit_branch_length (fragp, segtype, FALSE);
17866       if (length == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
17867         length = relaxed_micromips_32bit_branch_length (fragp, segtype, FALSE);
17868       fragp->fr_var = length;
17869
17870       return length;
17871     }
17872
17873   if (mips_pic == NO_PIC)
17874     change = nopic_need_relax (fragp->fr_symbol, 0);
17875   else if (mips_pic == SVR4_PIC)
17876     change = pic_need_relax (fragp->fr_symbol, segtype);
17877   else if (mips_pic == VXWORKS_PIC)
17878     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
17879     change = 0;
17880   else
17881     abort ();
17882
17883   if (change)
17884     {
17885       fragp->fr_subtype |= RELAX_USE_SECOND;
17886       return -RELAX_FIRST (fragp->fr_subtype);
17887     }
17888   else
17889     return -RELAX_SECOND (fragp->fr_subtype);
17890 }
17891
17892 /* This is called to see whether a reloc against a defined symbol
17893    should be converted into a reloc against a section.  */
17894
17895 int
17896 mips_fix_adjustable (fixS *fixp)
17897 {
17898   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
17899       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17900     return 0;
17901
17902   if (fixp->fx_addsy == NULL)
17903     return 1;
17904
17905   /* If symbol SYM is in a mergeable section, relocations of the form
17906      SYM + 0 can usually be made section-relative.  The mergeable data
17907      is then identified by the section offset rather than by the symbol.
17908
17909      However, if we're generating REL LO16 relocations, the offset is split
17910      between the LO16 and parterning high part relocation.  The linker will
17911      need to recalculate the complete offset in order to correctly identify
17912      the merge data.
17913
17914      The linker has traditionally not looked for the parterning high part
17915      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
17916      placed anywhere.  Rather than break backwards compatibility by changing
17917      this, it seems better not to force the issue, and instead keep the
17918      original symbol.  This will work with either linker behavior.  */
17919   if ((lo16_reloc_p (fixp->fx_r_type)
17920        || reloc_needs_lo_p (fixp->fx_r_type))
17921       && HAVE_IN_PLACE_ADDENDS
17922       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
17923     return 0;
17924
17925   /* There is no place to store an in-place offset for JALR relocations.
17926      Likewise an in-range offset of limited PC-relative relocations may
17927      overflow the in-place relocatable field if recalculated against the
17928      start address of the symbol's containing section.  */
17929   if (HAVE_IN_PLACE_ADDENDS
17930       && (limited_pcrel_reloc_p (fixp->fx_r_type)
17931           || jalr_reloc_p (fixp->fx_r_type)))
17932     return 0;
17933
17934 #ifdef OBJ_ELF
17935   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
17936      to a floating-point stub.  The same is true for non-R_MIPS16_26
17937      relocations against MIPS16 functions; in this case, the stub becomes
17938      the function's canonical address.
17939
17940      Floating-point stubs are stored in unique .mips16.call.* or
17941      .mips16.fn.* sections.  If a stub T for function F is in section S,
17942      the first relocation in section S must be against F; this is how the
17943      linker determines the target function.  All relocations that might
17944      resolve to T must also be against F.  We therefore have the following
17945      restrictions, which are given in an intentionally-redundant way:
17946
17947        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
17948           symbols.
17949
17950        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
17951           if that stub might be used.
17952
17953        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
17954           symbols.
17955
17956        4. We cannot reduce a stub's relocations against MIPS16 symbols if
17957           that stub might be used.
17958
17959      There is a further restriction:
17960
17961        5. We cannot reduce jump relocations (R_MIPS_26, R_MIPS16_26 or
17962           R_MICROMIPS_26_S1) against MIPS16 or microMIPS symbols on
17963           targets with in-place addends; the relocation field cannot
17964           encode the low bit.
17965
17966      For simplicity, we deal with (3)-(4) by not reducing _any_ relocation
17967      against a MIPS16 symbol.  We deal with (5) by by not reducing any
17968      such relocations on REL targets.
17969
17970      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
17971      relocation against some symbol R, no relocation against R may be
17972      reduced.  (Note that this deals with (2) as well as (1) because
17973      relocations against global symbols will never be reduced on ELF
17974      targets.)  This approach is a little simpler than trying to detect
17975      stub sections, and gives the "all or nothing" per-symbol consistency
17976      that we have for MIPS16 symbols.  */
17977   if (IS_ELF
17978       && fixp->fx_subsy == NULL
17979       && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
17980           || *symbol_get_tc (fixp->fx_addsy)
17981           || (HAVE_IN_PLACE_ADDENDS
17982               && ELF_ST_IS_MICROMIPS (S_GET_OTHER (fixp->fx_addsy))
17983               && jmp_reloc_p (fixp->fx_r_type))))
17984     return 0;
17985 #endif
17986
17987   return 1;
17988 }
17989
17990 /* Translate internal representation of relocation info to BFD target
17991    format.  */
17992
17993 arelent **
17994 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
17995 {
17996   static arelent *retval[4];
17997   arelent *reloc;
17998   bfd_reloc_code_real_type code;
17999
18000   memset (retval, 0, sizeof(retval));
18001   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
18002   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
18003   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
18004   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
18005
18006   if (fixp->fx_pcrel)
18007     {
18008       gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2
18009                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
18010                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
18011                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1
18012                   || fixp->fx_r_type == BFD_RELOC_32_PCREL);
18013
18014       /* At this point, fx_addnumber is "symbol offset - pcrel address".
18015          Relocations want only the symbol offset.  */
18016       reloc->addend = fixp->fx_addnumber + reloc->address;
18017       if (!IS_ELF)
18018         {
18019           /* A gruesome hack which is a result of the gruesome gas
18020              reloc handling.  What's worse, for COFF (as opposed to
18021              ECOFF), we might need yet another copy of reloc->address.
18022              See bfd_install_relocation.  */
18023           reloc->addend += reloc->address;
18024         }
18025     }
18026   else
18027     reloc->addend = fixp->fx_addnumber;
18028
18029   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
18030      entry to be used in the relocation's section offset.  */
18031   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
18032     {
18033       reloc->address = reloc->addend;
18034       reloc->addend = 0;
18035     }
18036
18037   code = fixp->fx_r_type;
18038
18039   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
18040   if (reloc->howto == NULL)
18041     {
18042       as_bad_where (fixp->fx_file, fixp->fx_line,
18043                     _("Can not represent %s relocation in this object file format"),
18044                     bfd_get_reloc_code_name (code));
18045       retval[0] = NULL;
18046     }
18047
18048   return retval;
18049 }
18050
18051 /* Relax a machine dependent frag.  This returns the amount by which
18052    the current size of the frag should change.  */
18053
18054 int
18055 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
18056 {
18057   if (RELAX_BRANCH_P (fragp->fr_subtype))
18058     {
18059       offsetT old_var = fragp->fr_var;
18060
18061       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
18062
18063       return fragp->fr_var - old_var;
18064     }
18065
18066   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
18067     {
18068       offsetT old_var = fragp->fr_var;
18069       offsetT new_var = 4;
18070
18071       if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
18072         new_var = relaxed_micromips_16bit_branch_length (fragp, sec, TRUE);
18073       if (new_var == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
18074         new_var = relaxed_micromips_32bit_branch_length (fragp, sec, TRUE);
18075       fragp->fr_var = new_var;
18076
18077       return new_var - old_var;
18078     }
18079
18080   if (! RELAX_MIPS16_P (fragp->fr_subtype))
18081     return 0;
18082
18083   if (mips16_extended_frag (fragp, NULL, stretch))
18084     {
18085       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
18086         return 0;
18087       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
18088       return 2;
18089     }
18090   else
18091     {
18092       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
18093         return 0;
18094       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
18095       return -2;
18096     }
18097
18098   return 0;
18099 }
18100
18101 /* Convert a machine dependent frag.  */
18102
18103 void
18104 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
18105 {
18106   if (RELAX_BRANCH_P (fragp->fr_subtype))
18107     {
18108       char *buf;
18109       unsigned long insn;
18110       expressionS exp;
18111       fixS *fixp;
18112
18113       buf = fragp->fr_literal + fragp->fr_fix;
18114       insn = read_insn (buf);
18115
18116       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
18117         {
18118           /* We generate a fixup instead of applying it right now
18119              because, if there are linker relaxations, we're going to
18120              need the relocations.  */
18121           exp.X_op = O_symbol;
18122           exp.X_add_symbol = fragp->fr_symbol;
18123           exp.X_add_number = fragp->fr_offset;
18124
18125           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, TRUE,
18126                               BFD_RELOC_16_PCREL_S2);
18127           fixp->fx_file = fragp->fr_file;
18128           fixp->fx_line = fragp->fr_line;
18129
18130           buf = write_insn (buf, insn);
18131         }
18132       else
18133         {
18134           int i;
18135
18136           as_warn_where (fragp->fr_file, fragp->fr_line,
18137                          _("Relaxed out-of-range branch into a jump"));
18138
18139           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
18140             goto uncond;
18141
18142           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18143             {
18144               /* Reverse the branch.  */
18145               switch ((insn >> 28) & 0xf)
18146                 {
18147                 case 4:
18148                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
18149                      have the condition reversed by tweaking a single
18150                      bit, and their opcodes all have 0x4???????.  */
18151                   gas_assert ((insn & 0xf1000000) == 0x41000000);
18152                   insn ^= 0x00010000;
18153                   break;
18154
18155                 case 0:
18156                   /* bltz       0x04000000      bgez    0x04010000
18157                      bltzal     0x04100000      bgezal  0x04110000  */
18158                   gas_assert ((insn & 0xfc0e0000) == 0x04000000);
18159                   insn ^= 0x00010000;
18160                   break;
18161
18162                 case 1:
18163                   /* beq        0x10000000      bne     0x14000000
18164                      blez       0x18000000      bgtz    0x1c000000  */
18165                   insn ^= 0x04000000;
18166                   break;
18167
18168                 default:
18169                   abort ();
18170                 }
18171             }
18172
18173           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
18174             {
18175               /* Clear the and-link bit.  */
18176               gas_assert ((insn & 0xfc1c0000) == 0x04100000);
18177
18178               /* bltzal         0x04100000      bgezal  0x04110000
18179                  bltzall        0x04120000      bgezall 0x04130000  */
18180               insn &= ~0x00100000;
18181             }
18182
18183           /* Branch over the branch (if the branch was likely) or the
18184              full jump (not likely case).  Compute the offset from the
18185              current instruction to branch to.  */
18186           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18187             i = 16;
18188           else
18189             {
18190               /* How many bytes in instructions we've already emitted?  */
18191               i = buf - fragp->fr_literal - fragp->fr_fix;
18192               /* How many bytes in instructions from here to the end?  */
18193               i = fragp->fr_var - i;
18194             }
18195           /* Convert to instruction count.  */
18196           i >>= 2;
18197           /* Branch counts from the next instruction.  */
18198           i--;
18199           insn |= i;
18200           /* Branch over the jump.  */
18201           buf = write_insn (buf, insn);
18202
18203           /* nop */
18204           buf = write_insn (buf, 0);
18205
18206           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18207             {
18208               /* beql $0, $0, 2f */
18209               insn = 0x50000000;
18210               /* Compute the PC offset from the current instruction to
18211                  the end of the variable frag.  */
18212               /* How many bytes in instructions we've already emitted?  */
18213               i = buf - fragp->fr_literal - fragp->fr_fix;
18214               /* How many bytes in instructions from here to the end?  */
18215               i = fragp->fr_var - i;
18216               /* Convert to instruction count.  */
18217               i >>= 2;
18218               /* Don't decrement i, because we want to branch over the
18219                  delay slot.  */
18220               insn |= i;
18221
18222               buf = write_insn (buf, insn);
18223               buf = write_insn (buf, 0);
18224             }
18225
18226         uncond:
18227           if (mips_pic == NO_PIC)
18228             {
18229               /* j or jal.  */
18230               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
18231                       ? 0x0c000000 : 0x08000000);
18232               exp.X_op = O_symbol;
18233               exp.X_add_symbol = fragp->fr_symbol;
18234               exp.X_add_number = fragp->fr_offset;
18235
18236               fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18237                                   FALSE, BFD_RELOC_MIPS_JMP);
18238               fixp->fx_file = fragp->fr_file;
18239               fixp->fx_line = fragp->fr_line;
18240
18241               buf = write_insn (buf, insn);
18242             }
18243           else
18244             {
18245               unsigned long at = RELAX_BRANCH_AT (fragp->fr_subtype);
18246
18247               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
18248               insn = HAVE_64BIT_ADDRESSES ? 0xdf800000 : 0x8f800000;
18249               insn |= at << OP_SH_RT;
18250               exp.X_op = O_symbol;
18251               exp.X_add_symbol = fragp->fr_symbol;
18252               exp.X_add_number = fragp->fr_offset;
18253
18254               if (fragp->fr_offset)
18255                 {
18256                   exp.X_add_symbol = make_expr_symbol (&exp);
18257                   exp.X_add_number = 0;
18258                 }
18259
18260               fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18261                                   FALSE, BFD_RELOC_MIPS_GOT16);
18262               fixp->fx_file = fragp->fr_file;
18263               fixp->fx_line = fragp->fr_line;
18264
18265               buf = write_insn (buf, insn);
18266
18267               if (mips_opts.isa == ISA_MIPS1)
18268                 /* nop */
18269                 buf = write_insn (buf, 0);
18270
18271               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
18272               insn = HAVE_64BIT_ADDRESSES ? 0x64000000 : 0x24000000;
18273               insn |= at << OP_SH_RS | at << OP_SH_RT;
18274
18275               fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18276                                   FALSE, BFD_RELOC_LO16);
18277               fixp->fx_file = fragp->fr_file;
18278               fixp->fx_line = fragp->fr_line;
18279
18280               buf = write_insn (buf, insn);
18281
18282               /* j(al)r $at.  */
18283               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
18284                 insn = 0x0000f809;
18285               else
18286                 insn = 0x00000008;
18287               insn |= at << OP_SH_RS;
18288
18289               buf = write_insn (buf, insn);
18290             }
18291         }
18292
18293       fragp->fr_fix += fragp->fr_var;
18294       gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18295       return;
18296     }
18297
18298   /* Relax microMIPS branches.  */
18299   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
18300     {
18301       char *buf = fragp->fr_literal + fragp->fr_fix;
18302       bfd_boolean compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
18303       bfd_boolean al = RELAX_MICROMIPS_LINK (fragp->fr_subtype);
18304       int type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
18305       bfd_boolean short_ds;
18306       unsigned long insn;
18307       expressionS exp;
18308       fixS *fixp;
18309
18310       exp.X_op = O_symbol;
18311       exp.X_add_symbol = fragp->fr_symbol;
18312       exp.X_add_number = fragp->fr_offset;
18313
18314       fragp->fr_fix += fragp->fr_var;
18315
18316       /* Handle 16-bit branches that fit or are forced to fit.  */
18317       if (type != 0 && !RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
18318         {
18319           /* We generate a fixup instead of applying it right now,
18320              because if there is linker relaxation, we're going to
18321              need the relocations.  */
18322           if (type == 'D')
18323             fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 2, &exp, TRUE,
18324                                 BFD_RELOC_MICROMIPS_10_PCREL_S1);
18325           else if (type == 'E')
18326             fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 2, &exp, TRUE,
18327                                 BFD_RELOC_MICROMIPS_7_PCREL_S1);
18328           else
18329             abort ();
18330
18331           fixp->fx_file = fragp->fr_file;
18332           fixp->fx_line = fragp->fr_line;
18333
18334           /* These relocations can have an addend that won't fit in
18335              2 octets.  */
18336           fixp->fx_no_overflow = 1;
18337
18338           return;
18339         }
18340
18341       /* Handle 32-bit branches that fit or are forced to fit.  */
18342       if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
18343           || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
18344         {
18345           /* We generate a fixup instead of applying it right now,
18346              because if there is linker relaxation, we're going to
18347              need the relocations.  */
18348           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, TRUE,
18349                               BFD_RELOC_MICROMIPS_16_PCREL_S1);
18350           fixp->fx_file = fragp->fr_file;
18351           fixp->fx_line = fragp->fr_line;
18352
18353           if (type == 0)
18354             return;
18355         }
18356
18357       /* Relax 16-bit branches to 32-bit branches.  */
18358       if (type != 0)
18359         {
18360           insn = read_compressed_insn (buf, 2);
18361
18362           if ((insn & 0xfc00) == 0xcc00)                /* b16  */
18363             insn = 0x94000000;                          /* beq  */
18364           else if ((insn & 0xdc00) == 0x8c00)           /* beqz16/bnez16  */
18365             {
18366               unsigned long regno;
18367
18368               regno = (insn >> MICROMIPSOP_SH_MD) & MICROMIPSOP_MASK_MD;
18369               regno = micromips_to_32_reg_d_map [regno];
18370               insn = ((insn & 0x2000) << 16) | 0x94000000;      /* beq/bne  */
18371               insn |= regno << MICROMIPSOP_SH_RS;
18372             }
18373           else
18374             abort ();
18375
18376           /* Nothing else to do, just write it out.  */
18377           if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
18378               || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
18379             {
18380               buf = write_compressed_insn (buf, insn, 4);
18381               gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18382               return;
18383             }
18384         }
18385       else
18386         insn = read_compressed_insn (buf, 4);
18387
18388       /* Relax 32-bit branches to a sequence of instructions.  */
18389       as_warn_where (fragp->fr_file, fragp->fr_line,
18390                      _("Relaxed out-of-range branch into a jump"));
18391
18392       /* Set the short-delay-slot bit.  */
18393       short_ds = al && (insn & 0x02000000) != 0;
18394
18395       if (!RELAX_MICROMIPS_UNCOND (fragp->fr_subtype))
18396         {
18397           symbolS *l;
18398
18399           /* Reverse the branch.  */
18400           if ((insn & 0xfc000000) == 0x94000000                 /* beq  */
18401               || (insn & 0xfc000000) == 0xb4000000)             /* bne  */
18402             insn ^= 0x20000000;
18403           else if ((insn & 0xffe00000) == 0x40000000            /* bltz  */
18404                    || (insn & 0xffe00000) == 0x40400000         /* bgez  */
18405                    || (insn & 0xffe00000) == 0x40800000         /* blez  */
18406                    || (insn & 0xffe00000) == 0x40c00000         /* bgtz  */
18407                    || (insn & 0xffe00000) == 0x40a00000         /* bnezc  */
18408                    || (insn & 0xffe00000) == 0x40e00000         /* beqzc  */
18409                    || (insn & 0xffe00000) == 0x40200000         /* bltzal  */
18410                    || (insn & 0xffe00000) == 0x40600000         /* bgezal  */
18411                    || (insn & 0xffe00000) == 0x42200000         /* bltzals  */
18412                    || (insn & 0xffe00000) == 0x42600000)        /* bgezals  */
18413             insn ^= 0x00400000;
18414           else if ((insn & 0xffe30000) == 0x43800000            /* bc1f  */
18415                    || (insn & 0xffe30000) == 0x43a00000         /* bc1t  */
18416                    || (insn & 0xffe30000) == 0x42800000         /* bc2f  */
18417                    || (insn & 0xffe30000) == 0x42a00000)        /* bc2t  */
18418             insn ^= 0x00200000;
18419           else
18420             abort ();
18421
18422           if (al)
18423             {
18424               /* Clear the and-link and short-delay-slot bits.  */
18425               gas_assert ((insn & 0xfda00000) == 0x40200000);
18426
18427               /* bltzal  0x40200000     bgezal  0x40600000  */
18428               /* bltzals 0x42200000     bgezals 0x42600000  */
18429               insn &= ~0x02200000;
18430             }
18431
18432           /* Make a label at the end for use with the branch.  */
18433           l = symbol_new (micromips_label_name (), asec, fragp->fr_fix, fragp);
18434           micromips_label_inc ();
18435 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
18436           if (IS_ELF)
18437             S_SET_OTHER (l, ELF_ST_SET_MICROMIPS (S_GET_OTHER (l)));
18438 #endif
18439
18440           /* Refer to it.  */
18441           fixp = fix_new (fragp, buf - fragp->fr_literal, 4, l, 0, TRUE,
18442                           BFD_RELOC_MICROMIPS_16_PCREL_S1);
18443           fixp->fx_file = fragp->fr_file;
18444           fixp->fx_line = fragp->fr_line;
18445
18446           /* Branch over the jump.  */
18447           buf = write_compressed_insn (buf, insn, 4);
18448           if (!compact)
18449             /* nop */
18450             buf = write_compressed_insn (buf, 0x0c00, 2);
18451         }
18452
18453       if (mips_pic == NO_PIC)
18454         {
18455           unsigned long jal = short_ds ? 0x74000000 : 0xf4000000; /* jal/s  */
18456
18457           /* j/jal/jals <sym>  R_MICROMIPS_26_S1  */
18458           insn = al ? jal : 0xd4000000;
18459
18460           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18461                               BFD_RELOC_MICROMIPS_JMP);
18462           fixp->fx_file = fragp->fr_file;
18463           fixp->fx_line = fragp->fr_line;
18464
18465           buf = write_compressed_insn (buf, insn, 4);
18466           if (compact)
18467             /* nop */
18468             buf = write_compressed_insn (buf, 0x0c00, 2);
18469         }
18470       else
18471         {
18472           unsigned long at = RELAX_MICROMIPS_AT (fragp->fr_subtype);
18473           unsigned long jalr = short_ds ? 0x45e0 : 0x45c0;      /* jalr/s  */
18474           unsigned long jr = compact ? 0x45a0 : 0x4580;         /* jr/c  */
18475
18476           /* lw/ld $at, <sym>($gp)  R_MICROMIPS_GOT16  */
18477           insn = HAVE_64BIT_ADDRESSES ? 0xdc1c0000 : 0xfc1c0000;
18478           insn |= at << MICROMIPSOP_SH_RT;
18479
18480           if (exp.X_add_number)
18481             {
18482               exp.X_add_symbol = make_expr_symbol (&exp);
18483               exp.X_add_number = 0;
18484             }
18485
18486           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18487                               BFD_RELOC_MICROMIPS_GOT16);
18488           fixp->fx_file = fragp->fr_file;
18489           fixp->fx_line = fragp->fr_line;
18490
18491           buf = write_compressed_insn (buf, insn, 4);
18492
18493           /* d/addiu $at, $at, <sym>  R_MICROMIPS_LO16  */
18494           insn = HAVE_64BIT_ADDRESSES ? 0x5c000000 : 0x30000000;
18495           insn |= at << MICROMIPSOP_SH_RT | at << MICROMIPSOP_SH_RS;
18496
18497           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18498                               BFD_RELOC_MICROMIPS_LO16);
18499           fixp->fx_file = fragp->fr_file;
18500           fixp->fx_line = fragp->fr_line;
18501
18502           buf = write_compressed_insn (buf, insn, 4);
18503
18504           /* jr/jrc/jalr/jalrs $at  */
18505           insn = al ? jalr : jr;
18506           insn |= at << MICROMIPSOP_SH_MJ;
18507
18508           buf = write_compressed_insn (buf, insn, 2);
18509         }
18510
18511       gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18512       return;
18513     }
18514
18515   if (RELAX_MIPS16_P (fragp->fr_subtype))
18516     {
18517       int type;
18518       const struct mips16_immed_operand *op;
18519       offsetT val;
18520       char *buf;
18521       unsigned int user_length, length;
18522       unsigned long insn;
18523       bfd_boolean ext;
18524
18525       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
18526       op = mips16_immed_operands;
18527       while (op->type != type)
18528         ++op;
18529
18530       ext = RELAX_MIPS16_EXTENDED (fragp->fr_subtype);
18531       val = resolve_symbol_value (fragp->fr_symbol);
18532       if (op->pcrel)
18533         {
18534           addressT addr;
18535
18536           addr = fragp->fr_address + fragp->fr_fix;
18537
18538           /* The rules for the base address of a PC relative reloc are
18539              complicated; see mips16_extended_frag.  */
18540           if (type == 'p' || type == 'q')
18541             {
18542               addr += 2;
18543               if (ext)
18544                 addr += 2;
18545               /* Ignore the low bit in the target, since it will be
18546                  set for a text label.  */
18547               if ((val & 1) != 0)
18548                 --val;
18549             }
18550           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
18551             addr -= 4;
18552           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
18553             addr -= 2;
18554
18555           addr &= ~ (addressT) ((1 << op->shift) - 1);
18556           val -= addr;
18557
18558           /* Make sure the section winds up with the alignment we have
18559              assumed.  */
18560           if (op->shift > 0)
18561             record_alignment (asec, op->shift);
18562         }
18563
18564       if (ext
18565           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
18566               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
18567         as_warn_where (fragp->fr_file, fragp->fr_line,
18568                        _("extended instruction in delay slot"));
18569
18570       buf = fragp->fr_literal + fragp->fr_fix;
18571
18572       insn = read_compressed_insn (buf, 2);
18573       if (ext)
18574         insn |= MIPS16_EXTEND;
18575
18576       if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
18577         user_length = 4;
18578       else if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
18579         user_length = 2;
18580       else
18581         user_length = 0;
18582
18583       mips16_immed (fragp->fr_file, fragp->fr_line, type,
18584                     BFD_RELOC_UNUSED, val, user_length, &insn);
18585
18586       length = (ext ? 4 : 2);
18587       gas_assert (mips16_opcode_length (insn) == length);
18588       write_compressed_insn (buf, insn, length);
18589       fragp->fr_fix += length;
18590     }
18591   else
18592     {
18593       relax_substateT subtype = fragp->fr_subtype;
18594       bfd_boolean second_longer = (subtype & RELAX_SECOND_LONGER) != 0;
18595       bfd_boolean use_second = (subtype & RELAX_USE_SECOND) != 0;
18596       int first, second;
18597       fixS *fixp;
18598
18599       first = RELAX_FIRST (subtype);
18600       second = RELAX_SECOND (subtype);
18601       fixp = (fixS *) fragp->fr_opcode;
18602
18603       /* If the delay slot chosen does not match the size of the instruction,
18604          then emit a warning.  */
18605       if ((!use_second && (subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0)
18606            || (use_second && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0))
18607         {
18608           relax_substateT s;
18609           const char *msg;
18610
18611           s = subtype & (RELAX_DELAY_SLOT_16BIT
18612                          | RELAX_DELAY_SLOT_SIZE_FIRST
18613                          | RELAX_DELAY_SLOT_SIZE_SECOND);
18614           msg = macro_warning (s);
18615           if (msg != NULL)
18616             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18617           subtype &= ~s;
18618         }
18619
18620       /* Possibly emit a warning if we've chosen the longer option.  */
18621       if (use_second == second_longer)
18622         {
18623           relax_substateT s;
18624           const char *msg;
18625
18626           s = (subtype
18627                & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT));
18628           msg = macro_warning (s);
18629           if (msg != NULL)
18630             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18631           subtype &= ~s;
18632         }
18633
18634       /* Go through all the fixups for the first sequence.  Disable them
18635          (by marking them as done) if we're going to use the second
18636          sequence instead.  */
18637       while (fixp
18638              && fixp->fx_frag == fragp
18639              && fixp->fx_where < fragp->fr_fix - second)
18640         {
18641           if (subtype & RELAX_USE_SECOND)
18642             fixp->fx_done = 1;
18643           fixp = fixp->fx_next;
18644         }
18645
18646       /* Go through the fixups for the second sequence.  Disable them if
18647          we're going to use the first sequence, otherwise adjust their
18648          addresses to account for the relaxation.  */
18649       while (fixp && fixp->fx_frag == fragp)
18650         {
18651           if (subtype & RELAX_USE_SECOND)
18652             fixp->fx_where -= first;
18653           else
18654             fixp->fx_done = 1;
18655           fixp = fixp->fx_next;
18656         }
18657
18658       /* Now modify the frag contents.  */
18659       if (subtype & RELAX_USE_SECOND)
18660         {
18661           char *start;
18662
18663           start = fragp->fr_literal + fragp->fr_fix - first - second;
18664           memmove (start, start + first, second);
18665           fragp->fr_fix -= first;
18666         }
18667       else
18668         fragp->fr_fix -= second;
18669     }
18670 }
18671
18672 #ifdef OBJ_ELF
18673
18674 /* This function is called after the relocs have been generated.
18675    We've been storing mips16 text labels as odd.  Here we convert them
18676    back to even for the convenience of the debugger.  */
18677
18678 void
18679 mips_frob_file_after_relocs (void)
18680 {
18681   asymbol **syms;
18682   unsigned int count, i;
18683
18684   if (!IS_ELF)
18685     return;
18686
18687   syms = bfd_get_outsymbols (stdoutput);
18688   count = bfd_get_symcount (stdoutput);
18689   for (i = 0; i < count; i++, syms++)
18690     if (ELF_ST_IS_COMPRESSED (elf_symbol (*syms)->internal_elf_sym.st_other)
18691         && ((*syms)->value & 1) != 0)
18692       {
18693         (*syms)->value &= ~1;
18694         /* If the symbol has an odd size, it was probably computed
18695            incorrectly, so adjust that as well.  */
18696         if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
18697           ++elf_symbol (*syms)->internal_elf_sym.st_size;
18698       }
18699 }
18700
18701 #endif
18702
18703 /* This function is called whenever a label is defined, including fake
18704    labels instantiated off the dot special symbol.  It is used when
18705    handling branch delays; if a branch has a label, we assume we cannot
18706    move it.  This also bumps the value of the symbol by 1 in compressed
18707    code.  */
18708
18709 static void
18710 mips_record_label (symbolS *sym)
18711 {
18712   segment_info_type *si = seg_info (now_seg);
18713   struct insn_label_list *l;
18714
18715   if (free_insn_labels == NULL)
18716     l = (struct insn_label_list *) xmalloc (sizeof *l);
18717   else
18718     {
18719       l = free_insn_labels;
18720       free_insn_labels = l->next;
18721     }
18722
18723   l->label = sym;
18724   l->next = si->label_list;
18725   si->label_list = l;
18726 }
18727
18728 /* This function is called as tc_frob_label() whenever a label is defined
18729    and adds a DWARF-2 record we only want for true labels.  */
18730
18731 void
18732 mips_define_label (symbolS *sym)
18733 {
18734   mips_record_label (sym);
18735 #ifdef OBJ_ELF
18736   dwarf2_emit_label (sym);
18737 #endif
18738 }
18739
18740 /* This function is called by tc_new_dot_label whenever a new dot symbol
18741    is defined.  */
18742
18743 void
18744 mips_add_dot_label (symbolS *sym)
18745 {
18746   mips_record_label (sym);
18747   if (mips_assembling_insn && HAVE_CODE_COMPRESSION)
18748     mips_compressed_mark_label (sym);
18749 }
18750 \f
18751 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
18752
18753 /* Some special processing for a MIPS ELF file.  */
18754
18755 void
18756 mips_elf_final_processing (void)
18757 {
18758   /* Write out the register information.  */
18759   if (mips_abi != N64_ABI)
18760     {
18761       Elf32_RegInfo s;
18762
18763       s.ri_gprmask = mips_gprmask;
18764       s.ri_cprmask[0] = mips_cprmask[0];
18765       s.ri_cprmask[1] = mips_cprmask[1];
18766       s.ri_cprmask[2] = mips_cprmask[2];
18767       s.ri_cprmask[3] = mips_cprmask[3];
18768       /* The gp_value field is set by the MIPS ELF backend.  */
18769
18770       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
18771                                        ((Elf32_External_RegInfo *)
18772                                         mips_regmask_frag));
18773     }
18774   else
18775     {
18776       Elf64_Internal_RegInfo s;
18777
18778       s.ri_gprmask = mips_gprmask;
18779       s.ri_pad = 0;
18780       s.ri_cprmask[0] = mips_cprmask[0];
18781       s.ri_cprmask[1] = mips_cprmask[1];
18782       s.ri_cprmask[2] = mips_cprmask[2];
18783       s.ri_cprmask[3] = mips_cprmask[3];
18784       /* The gp_value field is set by the MIPS ELF backend.  */
18785
18786       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
18787                                        ((Elf64_External_RegInfo *)
18788                                         mips_regmask_frag));
18789     }
18790
18791   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
18792      sort of BFD interface for this.  */
18793   if (mips_any_noreorder)
18794     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
18795   if (mips_pic != NO_PIC)
18796     {
18797       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
18798       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18799     }
18800   if (mips_abicalls)
18801     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18802
18803   /* Set MIPS ELF flags for ASEs.  Note that not all ASEs have flags
18804      defined at present; this might need to change in future.  */
18805   if (file_ase_mips16)
18806     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
18807   if (file_ase_micromips)
18808     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MICROMIPS;
18809 #if 0 /* XXX FIXME */
18810   if (file_ase_mips3d)
18811     elf_elfheader (stdoutput)->e_flags |= ???;
18812 #endif
18813   if (file_ase_mdmx)
18814     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
18815
18816   /* Set the MIPS ELF ABI flags.  */
18817   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
18818     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
18819   else if (mips_abi == O64_ABI)
18820     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
18821   else if (mips_abi == EABI_ABI)
18822     {
18823       if (!file_mips_gp32)
18824         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
18825       else
18826         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
18827     }
18828   else if (mips_abi == N32_ABI)
18829     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
18830
18831   /* Nothing to do for N64_ABI.  */
18832
18833   if (mips_32bitmode)
18834     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
18835
18836 #if 0 /* XXX FIXME */
18837   /* 32 bit code with 64 bit FP registers.  */
18838   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
18839     elf_elfheader (stdoutput)->e_flags |= ???;
18840 #endif
18841 }
18842
18843 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
18844 \f
18845 typedef struct proc {
18846   symbolS *func_sym;
18847   symbolS *func_end_sym;
18848   unsigned long reg_mask;
18849   unsigned long reg_offset;
18850   unsigned long fpreg_mask;
18851   unsigned long fpreg_offset;
18852   unsigned long frame_offset;
18853   unsigned long frame_reg;
18854   unsigned long pc_reg;
18855 } procS;
18856
18857 static procS cur_proc;
18858 static procS *cur_proc_ptr;
18859 static int numprocs;
18860
18861 /* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1", a microMIPS nop
18862    as "2", and a normal nop as "0".  */
18863
18864 #define NOP_OPCODE_MIPS         0
18865 #define NOP_OPCODE_MIPS16       1
18866 #define NOP_OPCODE_MICROMIPS    2
18867
18868 char
18869 mips_nop_opcode (void)
18870 {
18871   if (seg_info (now_seg)->tc_segment_info_data.micromips)
18872     return NOP_OPCODE_MICROMIPS;
18873   else if (seg_info (now_seg)->tc_segment_info_data.mips16)
18874     return NOP_OPCODE_MIPS16;
18875   else
18876     return NOP_OPCODE_MIPS;
18877 }
18878
18879 /* Fill in an rs_align_code fragment.  Unlike elsewhere we want to use
18880    32-bit microMIPS NOPs here (if applicable).  */
18881
18882 void
18883 mips_handle_align (fragS *fragp)
18884 {
18885   char nop_opcode;
18886   char *p;
18887   int bytes, size, excess;
18888   valueT opcode;
18889
18890   if (fragp->fr_type != rs_align_code)
18891     return;
18892
18893   p = fragp->fr_literal + fragp->fr_fix;
18894   nop_opcode = *p;
18895   switch (nop_opcode)
18896     {
18897     case NOP_OPCODE_MICROMIPS:
18898       opcode = micromips_nop32_insn.insn_opcode;
18899       size = 4;
18900       break;
18901     case NOP_OPCODE_MIPS16:
18902       opcode = mips16_nop_insn.insn_opcode;
18903       size = 2;
18904       break;
18905     case NOP_OPCODE_MIPS:
18906     default:
18907       opcode = nop_insn.insn_opcode;
18908       size = 4;
18909       break;
18910     }
18911
18912   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
18913   excess = bytes % size;
18914
18915   /* Handle the leading part if we're not inserting a whole number of
18916      instructions, and make it the end of the fixed part of the frag.
18917      Try to fit in a short microMIPS NOP if applicable and possible,
18918      and use zeroes otherwise.  */
18919   gas_assert (excess < 4);
18920   fragp->fr_fix += excess;
18921   switch (excess)
18922     {
18923     case 3:
18924       *p++ = '\0';
18925       /* Fall through.  */
18926     case 2:
18927       if (nop_opcode == NOP_OPCODE_MICROMIPS)
18928         {
18929           p = write_compressed_insn (p, micromips_nop16_insn.insn_opcode, 2);
18930           break;
18931         }
18932       *p++ = '\0';
18933       /* Fall through.  */
18934     case 1:
18935       *p++ = '\0';
18936       /* Fall through.  */
18937     case 0:
18938       break;
18939     }
18940
18941   md_number_to_chars (p, opcode, size);
18942   fragp->fr_var = size;
18943 }
18944
18945 static void
18946 md_obj_begin (void)
18947 {
18948 }
18949
18950 static void
18951 md_obj_end (void)
18952 {
18953   /* Check for premature end, nesting errors, etc.  */
18954   if (cur_proc_ptr)
18955     as_warn (_("missing .end at end of assembly"));
18956 }
18957
18958 static long
18959 get_number (void)
18960 {
18961   int negative = 0;
18962   long val = 0;
18963
18964   if (*input_line_pointer == '-')
18965     {
18966       ++input_line_pointer;
18967       negative = 1;
18968     }
18969   if (!ISDIGIT (*input_line_pointer))
18970     as_bad (_("expected simple number"));
18971   if (input_line_pointer[0] == '0')
18972     {
18973       if (input_line_pointer[1] == 'x')
18974         {
18975           input_line_pointer += 2;
18976           while (ISXDIGIT (*input_line_pointer))
18977             {
18978               val <<= 4;
18979               val |= hex_value (*input_line_pointer++);
18980             }
18981           return negative ? -val : val;
18982         }
18983       else
18984         {
18985           ++input_line_pointer;
18986           while (ISDIGIT (*input_line_pointer))
18987             {
18988               val <<= 3;
18989               val |= *input_line_pointer++ - '0';
18990             }
18991           return negative ? -val : val;
18992         }
18993     }
18994   if (!ISDIGIT (*input_line_pointer))
18995     {
18996       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
18997               *input_line_pointer, *input_line_pointer);
18998       as_warn (_("invalid number"));
18999       return -1;
19000     }
19001   while (ISDIGIT (*input_line_pointer))
19002     {
19003       val *= 10;
19004       val += *input_line_pointer++ - '0';
19005     }
19006   return negative ? -val : val;
19007 }
19008
19009 /* The .file directive; just like the usual .file directive, but there
19010    is an initial number which is the ECOFF file index.  In the non-ECOFF
19011    case .file implies DWARF-2.  */
19012
19013 static void
19014 s_mips_file (int x ATTRIBUTE_UNUSED)
19015 {
19016   static int first_file_directive = 0;
19017
19018   if (ECOFF_DEBUGGING)
19019     {
19020       get_number ();
19021       s_app_file (0);
19022     }
19023   else
19024     {
19025       char *filename;
19026
19027       filename = dwarf2_directive_file (0);
19028
19029       /* Versions of GCC up to 3.1 start files with a ".file"
19030          directive even for stabs output.  Make sure that this
19031          ".file" is handled.  Note that you need a version of GCC
19032          after 3.1 in order to support DWARF-2 on MIPS.  */
19033       if (filename != NULL && ! first_file_directive)
19034         {
19035           (void) new_logical_line (filename, -1);
19036           s_app_file_string (filename, 0);
19037         }
19038       first_file_directive = 1;
19039     }
19040 }
19041
19042 /* The .loc directive, implying DWARF-2.  */
19043
19044 static void
19045 s_mips_loc (int x ATTRIBUTE_UNUSED)
19046 {
19047   if (!ECOFF_DEBUGGING)
19048     dwarf2_directive_loc (0);
19049 }
19050
19051 /* The .end directive.  */
19052
19053 static void
19054 s_mips_end (int x ATTRIBUTE_UNUSED)
19055 {
19056   symbolS *p;
19057
19058   /* Following functions need their own .frame and .cprestore directives.  */
19059   mips_frame_reg_valid = 0;
19060   mips_cprestore_valid = 0;
19061
19062   if (!is_end_of_line[(unsigned char) *input_line_pointer])
19063     {
19064       p = get_symbol ();
19065       demand_empty_rest_of_line ();
19066     }
19067   else
19068     p = NULL;
19069
19070   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
19071     as_warn (_(".end not in text section"));
19072
19073   if (!cur_proc_ptr)
19074     {
19075       as_warn (_(".end directive without a preceding .ent directive."));
19076       demand_empty_rest_of_line ();
19077       return;
19078     }
19079
19080   if (p != NULL)
19081     {
19082       gas_assert (S_GET_NAME (p));
19083       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
19084         as_warn (_(".end symbol does not match .ent symbol."));
19085
19086       if (debug_type == DEBUG_STABS)
19087         stabs_generate_asm_endfunc (S_GET_NAME (p),
19088                                     S_GET_NAME (p));
19089     }
19090   else
19091     as_warn (_(".end directive missing or unknown symbol"));
19092
19093 #ifdef OBJ_ELF
19094   /* Create an expression to calculate the size of the function.  */
19095   if (p && cur_proc_ptr)
19096     {
19097       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
19098       expressionS *exp = xmalloc (sizeof (expressionS));
19099
19100       obj->size = exp;
19101       exp->X_op = O_subtract;
19102       exp->X_add_symbol = symbol_temp_new_now ();
19103       exp->X_op_symbol = p;
19104       exp->X_add_number = 0;
19105
19106       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
19107     }
19108
19109   /* Generate a .pdr section.  */
19110   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
19111     {
19112       segT saved_seg = now_seg;
19113       subsegT saved_subseg = now_subseg;
19114       expressionS exp;
19115       char *fragp;
19116
19117 #ifdef md_flush_pending_output
19118       md_flush_pending_output ();
19119 #endif
19120
19121       gas_assert (pdr_seg);
19122       subseg_set (pdr_seg, 0);
19123
19124       /* Write the symbol.  */
19125       exp.X_op = O_symbol;
19126       exp.X_add_symbol = p;
19127       exp.X_add_number = 0;
19128       emit_expr (&exp, 4);
19129
19130       fragp = frag_more (7 * 4);
19131
19132       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
19133       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
19134       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
19135       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
19136       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
19137       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
19138       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
19139
19140       subseg_set (saved_seg, saved_subseg);
19141     }
19142 #endif /* OBJ_ELF */
19143
19144   cur_proc_ptr = NULL;
19145 }
19146
19147 /* The .aent and .ent directives.  */
19148
19149 static void
19150 s_mips_ent (int aent)
19151 {
19152   symbolS *symbolP;
19153
19154   symbolP = get_symbol ();
19155   if (*input_line_pointer == ',')
19156     ++input_line_pointer;
19157   SKIP_WHITESPACE ();
19158   if (ISDIGIT (*input_line_pointer)
19159       || *input_line_pointer == '-')
19160     get_number ();
19161
19162   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
19163     as_warn (_(".ent or .aent not in text section."));
19164
19165   if (!aent && cur_proc_ptr)
19166     as_warn (_("missing .end"));
19167
19168   if (!aent)
19169     {
19170       /* This function needs its own .frame and .cprestore directives.  */
19171       mips_frame_reg_valid = 0;
19172       mips_cprestore_valid = 0;
19173
19174       cur_proc_ptr = &cur_proc;
19175       memset (cur_proc_ptr, '\0', sizeof (procS));
19176
19177       cur_proc_ptr->func_sym = symbolP;
19178
19179       ++numprocs;
19180
19181       if (debug_type == DEBUG_STABS)
19182         stabs_generate_asm_func (S_GET_NAME (symbolP),
19183                                  S_GET_NAME (symbolP));
19184     }
19185
19186   symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
19187
19188   demand_empty_rest_of_line ();
19189 }
19190
19191 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
19192    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
19193    s_mips_frame is used so that we can set the PDR information correctly.
19194    We can't use the ecoff routines because they make reference to the ecoff
19195    symbol table (in the mdebug section).  */
19196
19197 static void
19198 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
19199 {
19200 #ifdef OBJ_ELF
19201   if (IS_ELF && !ECOFF_DEBUGGING)
19202     {
19203       long val;
19204
19205       if (cur_proc_ptr == (procS *) NULL)
19206         {
19207           as_warn (_(".frame outside of .ent"));
19208           demand_empty_rest_of_line ();
19209           return;
19210         }
19211
19212       cur_proc_ptr->frame_reg = tc_get_register (1);
19213
19214       SKIP_WHITESPACE ();
19215       if (*input_line_pointer++ != ','
19216           || get_absolute_expression_and_terminator (&val) != ',')
19217         {
19218           as_warn (_("Bad .frame directive"));
19219           --input_line_pointer;
19220           demand_empty_rest_of_line ();
19221           return;
19222         }
19223
19224       cur_proc_ptr->frame_offset = val;
19225       cur_proc_ptr->pc_reg = tc_get_register (0);
19226
19227       demand_empty_rest_of_line ();
19228     }
19229   else
19230 #endif /* OBJ_ELF */
19231     s_ignore (ignore);
19232 }
19233
19234 /* The .fmask and .mask directives. If the mdebug section is present
19235    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
19236    embedded targets, s_mips_mask is used so that we can set the PDR
19237    information correctly. We can't use the ecoff routines because they
19238    make reference to the ecoff symbol table (in the mdebug section).  */
19239
19240 static void
19241 s_mips_mask (int reg_type)
19242 {
19243 #ifdef OBJ_ELF
19244   if (IS_ELF && !ECOFF_DEBUGGING)
19245     {
19246       long mask, off;
19247
19248       if (cur_proc_ptr == (procS *) NULL)
19249         {
19250           as_warn (_(".mask/.fmask outside of .ent"));
19251           demand_empty_rest_of_line ();
19252           return;
19253         }
19254
19255       if (get_absolute_expression_and_terminator (&mask) != ',')
19256         {
19257           as_warn (_("Bad .mask/.fmask directive"));
19258           --input_line_pointer;
19259           demand_empty_rest_of_line ();
19260           return;
19261         }
19262
19263       off = get_absolute_expression ();
19264
19265       if (reg_type == 'F')
19266         {
19267           cur_proc_ptr->fpreg_mask = mask;
19268           cur_proc_ptr->fpreg_offset = off;
19269         }
19270       else
19271         {
19272           cur_proc_ptr->reg_mask = mask;
19273           cur_proc_ptr->reg_offset = off;
19274         }
19275
19276       demand_empty_rest_of_line ();
19277     }
19278   else
19279 #endif /* OBJ_ELF */
19280     s_ignore (reg_type);
19281 }
19282
19283 /* A table describing all the processors gas knows about.  Names are
19284    matched in the order listed.
19285
19286    To ease comparison, please keep this table in the same order as
19287    gcc's mips_cpu_info_table[].  */
19288 static const struct mips_cpu_info mips_cpu_info_table[] =
19289 {
19290   /* Entries for generic ISAs */
19291   { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
19292   { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
19293   { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
19294   { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
19295   { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
19296   { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
19297   { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
19298   { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
19299   { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
19300
19301   /* MIPS I */
19302   { "r3000",          0,                        ISA_MIPS1,      CPU_R3000 },
19303   { "r2000",          0,                        ISA_MIPS1,      CPU_R3000 },
19304   { "r3900",          0,                        ISA_MIPS1,      CPU_R3900 },
19305
19306   /* MIPS II */
19307   { "r6000",          0,                        ISA_MIPS2,      CPU_R6000 },
19308
19309   /* MIPS III */
19310   { "r4000",          0,                        ISA_MIPS3,      CPU_R4000 },
19311   { "r4010",          0,                        ISA_MIPS2,      CPU_R4010 },
19312   { "vr4100",         0,                        ISA_MIPS3,      CPU_VR4100 },
19313   { "vr4111",         0,                        ISA_MIPS3,      CPU_R4111 },
19314   { "vr4120",         0,                        ISA_MIPS3,      CPU_VR4120 },
19315   { "vr4130",         0,                        ISA_MIPS3,      CPU_VR4120 },
19316   { "vr4181",         0,                        ISA_MIPS3,      CPU_R4111 },
19317   { "vr4300",         0,                        ISA_MIPS3,      CPU_R4300 },
19318   { "r4400",          0,                        ISA_MIPS3,      CPU_R4400 },
19319   { "r4600",          0,                        ISA_MIPS3,      CPU_R4600 },
19320   { "orion",          0,                        ISA_MIPS3,      CPU_R4600 },
19321   { "r4650",          0,                        ISA_MIPS3,      CPU_R4650 },
19322   { "r5900",          0,                        ISA_MIPS3,      CPU_R5900 },
19323   /* ST Microelectronics Loongson 2E and 2F cores */
19324   { "loongson2e",     0,                        ISA_MIPS3,   CPU_LOONGSON_2E },
19325   { "loongson2f",     0,                        ISA_MIPS3,   CPU_LOONGSON_2F },
19326
19327   /* MIPS IV */
19328   { "r8000",          0,                        ISA_MIPS4,      CPU_R8000 },
19329   { "r10000",         0,                        ISA_MIPS4,      CPU_R10000 },
19330   { "r12000",         0,                        ISA_MIPS4,      CPU_R12000 },
19331   { "r14000",         0,                        ISA_MIPS4,      CPU_R14000 },
19332   { "r16000",         0,                        ISA_MIPS4,      CPU_R16000 },
19333   { "vr5000",         0,                        ISA_MIPS4,      CPU_R5000 },
19334   { "vr5400",         0,                        ISA_MIPS4,      CPU_VR5400 },
19335   { "vr5500",         0,                        ISA_MIPS4,      CPU_VR5500 },
19336   { "rm5200",         0,                        ISA_MIPS4,      CPU_R5000 },
19337   { "rm5230",         0,                        ISA_MIPS4,      CPU_R5000 },
19338   { "rm5231",         0,                        ISA_MIPS4,      CPU_R5000 },
19339   { "rm5261",         0,                        ISA_MIPS4,      CPU_R5000 },
19340   { "rm5721",         0,                        ISA_MIPS4,      CPU_R5000 },
19341   { "rm7000",         0,                        ISA_MIPS4,      CPU_RM7000 },
19342   { "rm9000",         0,                        ISA_MIPS4,      CPU_RM9000 },
19343
19344   /* MIPS 32 */
19345   { "4kc",            0,                        ISA_MIPS32,     CPU_MIPS32 },
19346   { "4km",            0,                        ISA_MIPS32,     CPU_MIPS32 },
19347   { "4kp",            0,                        ISA_MIPS32,     CPU_MIPS32 },
19348   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
19349
19350   /* MIPS 32 Release 2 */
19351   { "4kec",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19352   { "4kem",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19353   { "4kep",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19354   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
19355   { "m4k",            0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19356   { "m4kp",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19357   { "m14k",           MIPS_CPU_ASE_MCU,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19358   { "m14kc",          MIPS_CPU_ASE_MCU,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19359   { "m14ke",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2 | MIPS_CPU_ASE_MCU,
19360                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19361   { "m14kec",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2 | MIPS_CPU_ASE_MCU,
19362                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19363   { "24kc",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19364   { "24kf2_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19365   { "24kf",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19366   { "24kf1_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19367   /* Deprecated forms of the above.  */
19368   { "24kfx",          0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19369   { "24kx",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19370   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
19371   { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19372   { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19373   { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19374   { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19375   /* Deprecated forms of the above.  */
19376   { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19377   { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19378   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
19379   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19380                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19381   { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19382                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19383   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19384                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19385   { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19386                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19387   /* Deprecated forms of the above.  */
19388   { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19389                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19390   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19391                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19392   /* 34Kn is a 34kc without DSP.  */
19393   { "34kn",           MIPS_CPU_ASE_MT,          ISA_MIPS32R2,   CPU_MIPS32R2 },
19394   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
19395   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19396                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19397   { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19398                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19399   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19400                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19401   { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19402                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19403   { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19404                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19405   /* Deprecated forms of the above.  */
19406   { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19407                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19408   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19409                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19410   /* 1004K cores are multiprocessor versions of the 34K.  */
19411   { "1004kc",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19412                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19413   { "1004kf2_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19414                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19415   { "1004kf",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19416                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19417   { "1004kf1_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19418                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19419
19420   /* MIPS 64 */
19421   { "5kc",            0,                        ISA_MIPS64,     CPU_MIPS64 },
19422   { "5kf",            0,                        ISA_MIPS64,     CPU_MIPS64 },
19423   { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
19424   { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
19425
19426   /* Broadcom SB-1 CPU core */
19427   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
19428                                                 ISA_MIPS64,     CPU_SB1 },
19429   /* Broadcom SB-1A CPU core */
19430   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
19431                                                 ISA_MIPS64,     CPU_SB1 },
19432   
19433   { "loongson3a",     0,                        ISA_MIPS64,     CPU_LOONGSON_3A },
19434
19435   /* MIPS 64 Release 2 */
19436
19437   /* Cavium Networks Octeon CPU core */
19438   { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
19439   { "octeon+",        0,      ISA_MIPS64R2,   CPU_OCTEONP },
19440   { "octeon2",        0,      ISA_MIPS64R2,   CPU_OCTEON2 },
19441
19442   /* RMI Xlr */
19443   { "xlr",            0,      ISA_MIPS64,     CPU_XLR },
19444
19445   /* Broadcom XLP.
19446      XLP is mostly like XLR, with the prominent exception that it is
19447      MIPS64R2 rather than MIPS64.  */
19448   { "xlp",            0,      ISA_MIPS64R2,     CPU_XLR },
19449
19450   /* End marker */
19451   { NULL, 0, 0, 0 }
19452 };
19453
19454
19455 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
19456    with a final "000" replaced by "k".  Ignore case.
19457
19458    Note: this function is shared between GCC and GAS.  */
19459
19460 static bfd_boolean
19461 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
19462 {
19463   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
19464     given++, canonical++;
19465
19466   return ((*given == 0 && *canonical == 0)
19467           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
19468 }
19469
19470
19471 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
19472    CPU name.  We've traditionally allowed a lot of variation here.
19473
19474    Note: this function is shared between GCC and GAS.  */
19475
19476 static bfd_boolean
19477 mips_matching_cpu_name_p (const char *canonical, const char *given)
19478 {
19479   /* First see if the name matches exactly, or with a final "000"
19480      turned into "k".  */
19481   if (mips_strict_matching_cpu_name_p (canonical, given))
19482     return TRUE;
19483
19484   /* If not, try comparing based on numerical designation alone.
19485      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
19486   if (TOLOWER (*given) == 'r')
19487     given++;
19488   if (!ISDIGIT (*given))
19489     return FALSE;
19490
19491   /* Skip over some well-known prefixes in the canonical name,
19492      hoping to find a number there too.  */
19493   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
19494     canonical += 2;
19495   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
19496     canonical += 2;
19497   else if (TOLOWER (canonical[0]) == 'r')
19498     canonical += 1;
19499
19500   return mips_strict_matching_cpu_name_p (canonical, given);
19501 }
19502
19503
19504 /* Parse an option that takes the name of a processor as its argument.
19505    OPTION is the name of the option and CPU_STRING is the argument.
19506    Return the corresponding processor enumeration if the CPU_STRING is
19507    recognized, otherwise report an error and return null.
19508
19509    A similar function exists in GCC.  */
19510
19511 static const struct mips_cpu_info *
19512 mips_parse_cpu (const char *option, const char *cpu_string)
19513 {
19514   const struct mips_cpu_info *p;
19515
19516   /* 'from-abi' selects the most compatible architecture for the given
19517      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
19518      EABIs, we have to decide whether we're using the 32-bit or 64-bit
19519      version.  Look first at the -mgp options, if given, otherwise base
19520      the choice on MIPS_DEFAULT_64BIT.
19521
19522      Treat NO_ABI like the EABIs.  One reason to do this is that the
19523      plain 'mips' and 'mips64' configs have 'from-abi' as their default
19524      architecture.  This code picks MIPS I for 'mips' and MIPS III for
19525      'mips64', just as we did in the days before 'from-abi'.  */
19526   if (strcasecmp (cpu_string, "from-abi") == 0)
19527     {
19528       if (ABI_NEEDS_32BIT_REGS (mips_abi))
19529         return mips_cpu_info_from_isa (ISA_MIPS1);
19530
19531       if (ABI_NEEDS_64BIT_REGS (mips_abi))
19532         return mips_cpu_info_from_isa (ISA_MIPS3);
19533
19534       if (file_mips_gp32 >= 0)
19535         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
19536
19537       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
19538                                      ? ISA_MIPS3
19539                                      : ISA_MIPS1);
19540     }
19541
19542   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
19543   if (strcasecmp (cpu_string, "default") == 0)
19544     return 0;
19545
19546   for (p = mips_cpu_info_table; p->name != 0; p++)
19547     if (mips_matching_cpu_name_p (p->name, cpu_string))
19548       return p;
19549
19550   as_bad (_("Bad value (%s) for %s"), cpu_string, option);
19551   return 0;
19552 }
19553
19554 /* Return the canonical processor information for ISA (a member of the
19555    ISA_MIPS* enumeration).  */
19556
19557 static const struct mips_cpu_info *
19558 mips_cpu_info_from_isa (int isa)
19559 {
19560   int i;
19561
19562   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19563     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
19564         && isa == mips_cpu_info_table[i].isa)
19565       return (&mips_cpu_info_table[i]);
19566
19567   return NULL;
19568 }
19569
19570 static const struct mips_cpu_info *
19571 mips_cpu_info_from_arch (int arch)
19572 {
19573   int i;
19574
19575   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19576     if (arch == mips_cpu_info_table[i].cpu)
19577       return (&mips_cpu_info_table[i]);
19578
19579   return NULL;
19580 }
19581 \f
19582 static void
19583 show (FILE *stream, const char *string, int *col_p, int *first_p)
19584 {
19585   if (*first_p)
19586     {
19587       fprintf (stream, "%24s", "");
19588       *col_p = 24;
19589     }
19590   else
19591     {
19592       fprintf (stream, ", ");
19593       *col_p += 2;
19594     }
19595
19596   if (*col_p + strlen (string) > 72)
19597     {
19598       fprintf (stream, "\n%24s", "");
19599       *col_p = 24;
19600     }
19601
19602   fprintf (stream, "%s", string);
19603   *col_p += strlen (string);
19604
19605   *first_p = 0;
19606 }
19607
19608 void
19609 md_show_usage (FILE *stream)
19610 {
19611   int column, first;
19612   size_t i;
19613
19614   fprintf (stream, _("\
19615 MIPS options:\n\
19616 -EB                     generate big endian output\n\
19617 -EL                     generate little endian output\n\
19618 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
19619 -G NUM                  allow referencing objects up to NUM bytes\n\
19620                         implicitly with the gp register [default 8]\n"));
19621   fprintf (stream, _("\
19622 -mips1                  generate MIPS ISA I instructions\n\
19623 -mips2                  generate MIPS ISA II instructions\n\
19624 -mips3                  generate MIPS ISA III instructions\n\
19625 -mips4                  generate MIPS ISA IV instructions\n\
19626 -mips5                  generate MIPS ISA V instructions\n\
19627 -mips32                 generate MIPS32 ISA instructions\n\
19628 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
19629 -mips64                 generate MIPS64 ISA instructions\n\
19630 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
19631 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
19632
19633   first = 1;
19634
19635   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19636     show (stream, mips_cpu_info_table[i].name, &column, &first);
19637   show (stream, "from-abi", &column, &first);
19638   fputc ('\n', stream);
19639
19640   fprintf (stream, _("\
19641 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
19642 -no-mCPU                don't generate code specific to CPU.\n\
19643                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
19644
19645   first = 1;
19646
19647   show (stream, "3900", &column, &first);
19648   show (stream, "4010", &column, &first);
19649   show (stream, "4100", &column, &first);
19650   show (stream, "4650", &column, &first);
19651   fputc ('\n', stream);
19652
19653   fprintf (stream, _("\
19654 -mips16                 generate mips16 instructions\n\
19655 -no-mips16              do not generate mips16 instructions\n"));
19656   fprintf (stream, _("\
19657 -mmicromips             generate microMIPS instructions\n\
19658 -mno-micromips          do not generate microMIPS instructions\n"));
19659   fprintf (stream, _("\
19660 -msmartmips             generate smartmips instructions\n\
19661 -mno-smartmips          do not generate smartmips instructions\n"));  
19662   fprintf (stream, _("\
19663 -mdsp                   generate DSP instructions\n\
19664 -mno-dsp                do not generate DSP instructions\n"));
19665   fprintf (stream, _("\
19666 -mdspr2                 generate DSP R2 instructions\n\
19667 -mno-dspr2              do not generate DSP R2 instructions\n"));
19668   fprintf (stream, _("\
19669 -mmt                    generate MT instructions\n\
19670 -mno-mt                 do not generate MT instructions\n"));
19671   fprintf (stream, _("\
19672 -mmcu                   generate MCU instructions\n\
19673 -mno-mcu                do not generate MCU instructions\n"));
19674   fprintf (stream, _("\
19675 -mvirt                  generate Virtualization instructions\n\
19676 -mno-virt               do not generate Virtualization instructions\n"));
19677   fprintf (stream, _("\
19678 -mfix-loongson2f-jump   work around Loongson2F JUMP instructions\n\
19679 -mfix-loongson2f-nop    work around Loongson2F NOP errata\n\
19680 -mfix-vr4120            work around certain VR4120 errata\n\
19681 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
19682 -mfix-24k               insert a nop after ERET and DERET instructions\n\
19683 -mfix-cn63xxp1          work around CN63XXP1 PREF errata\n\
19684 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
19685 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
19686 -msym32                 assume all symbols have 32-bit values\n\
19687 -O0                     remove unneeded NOPs, do not swap branches\n\
19688 -O                      remove unneeded NOPs and swap branches\n\
19689 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
19690 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
19691   fprintf (stream, _("\
19692 -mhard-float            allow floating-point instructions\n\
19693 -msoft-float            do not allow floating-point instructions\n\
19694 -msingle-float          only allow 32-bit floating-point operations\n\
19695 -mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
19696 --[no-]construct-floats [dis]allow floating point values to be constructed\n"
19697                      ));
19698 #ifdef OBJ_ELF
19699   fprintf (stream, _("\
19700 -KPIC, -call_shared     generate SVR4 position independent code\n\
19701 -call_nonpic            generate non-PIC code that can operate with DSOs\n\
19702 -mvxworks-pic           generate VxWorks position independent code\n\
19703 -non_shared             do not generate code that can operate with DSOs\n\
19704 -xgot                   assume a 32 bit GOT\n\
19705 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
19706 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
19707                         position dependent (non shared) code\n\
19708 -mabi=ABI               create ABI conformant object file for:\n"));
19709
19710   first = 1;
19711
19712   show (stream, "32", &column, &first);
19713   show (stream, "o64", &column, &first);
19714   show (stream, "n32", &column, &first);
19715   show (stream, "64", &column, &first);
19716   show (stream, "eabi", &column, &first);
19717
19718   fputc ('\n', stream);
19719
19720   fprintf (stream, _("\
19721 -32                     create o32 ABI object file (default)\n\
19722 -n32                    create n32 ABI object file\n\
19723 -64                     create 64 ABI object file\n"));
19724 #endif
19725 }
19726
19727 #ifdef TE_IRIX
19728 enum dwarf2_format
19729 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
19730 {
19731   if (HAVE_64BIT_SYMBOLS)
19732     return dwarf2_format_64bit_irix;
19733   else
19734     return dwarf2_format_32bit;
19735 }
19736 #endif
19737
19738 int
19739 mips_dwarf2_addr_size (void)
19740 {
19741   if (HAVE_64BIT_OBJECTS)
19742     return 8;
19743   else
19744     return 4;
19745 }
19746
19747 /* Standard calling conventions leave the CFA at SP on entry.  */
19748 void
19749 mips_cfi_frame_initial_instructions (void)
19750 {
19751   cfi_add_CFA_def_cfa_register (SP);
19752 }
19753
19754 int
19755 tc_mips_regname_to_dw2regnum (char *regname)
19756 {
19757   unsigned int regnum = -1;
19758   unsigned int reg;
19759
19760   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
19761     regnum = reg;
19762
19763   return regnum;
19764 }