2013-05-06 Paul Brook <paul@codesourcery.com>
[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   /* Whether we are assembling for the mips16 processor.  0 if we are
222      not, 1 if we are, and -1 if the value has not been initialized.
223      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
224      -nomips16 command line options, and the default CPU.  */
225   int mips16;
226   /* Whether we are assembling for the mipsMIPS ASE.  0 if we are not,
227      1 if we are, and -1 if the value has not been initialized.  Changed
228      by `.set micromips' and `.set nomicromips', and the -mmicromips
229      and -mno-micromips command line options, and the default CPU.  */
230   int micromips;
231   /* Non-zero if we should not reorder instructions.  Changed by `.set
232      reorder' and `.set noreorder'.  */
233   int noreorder;
234   /* Non-zero if we should not permit the register designated "assembler
235      temporary" to be used in instructions.  The value is the register
236      number, normally $at ($1).  Changed by `.set at=REG', `.set noat'
237      (same as `.set at=$0') and `.set at' (same as `.set at=$1').  */
238   unsigned int at;
239   /* Non-zero if we should warn when a macro instruction expands into
240      more than one machine instruction.  Changed by `.set nomacro' and
241      `.set macro'.  */
242   int warn_about_macros;
243   /* Non-zero if we should not move instructions.  Changed by `.set
244      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
245   int nomove;
246   /* Non-zero if we should not optimize branches by moving the target
247      of the branch into the delay slot.  Actually, we don't perform
248      this optimization anyhow.  Changed by `.set bopt' and `.set
249      nobopt'.  */
250   int nobopt;
251   /* Non-zero if we should not autoextend mips16 instructions.
252      Changed by `.set autoextend' and `.set noautoextend'.  */
253   int noautoextend;
254   /* Restrict general purpose registers and floating point registers
255      to 32 bit.  This is initially determined when -mgp32 or -mfp32
256      is passed but can changed if the assembler code uses .set mipsN.  */
257   int gp32;
258   int fp32;
259   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
260      command line option, and the default CPU.  */
261   int arch;
262   /* True if ".set sym32" is in effect.  */
263   bfd_boolean sym32;
264   /* True if floating-point operations are not allowed.  Changed by .set
265      softfloat or .set hardfloat, by command line options -msoft-float or
266      -mhard-float.  The default is false.  */
267   bfd_boolean soft_float;
268
269   /* True if only single-precision floating-point operations are allowed.
270      Changed by .set singlefloat or .set doublefloat, command-line options
271      -msingle-float or -mdouble-float.  The default is false.  */
272   bfd_boolean single_float;
273 };
274
275 /* This is the struct we use to hold the current set of options.  Note
276    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
277    -1 to indicate that they have not been initialized.  */
278
279 /* True if -mgp32 was passed.  */
280 static int file_mips_gp32 = -1;
281
282 /* True if -mfp32 was passed.  */
283 static int file_mips_fp32 = -1;
284
285 /* 1 if -msoft-float, 0 if -mhard-float.  The default is 0.  */
286 static int file_mips_soft_float = 0;
287
288 /* 1 if -msingle-float, 0 if -mdouble-float.  The default is 0.   */
289 static int file_mips_single_float = 0;
290
291 static struct mips_set_options mips_opts =
292 {
293   /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
294   /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
295   /* ase_mcu */ -1, /* mips16 */ -1, /* micromips */ -1, /* noreorder */ 0,
296   /* at */ ATREG, /* warn_about_macros */ 0, /* nomove */ 0, /* nobopt */ 0,
297   /* noautoextend */ 0, /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN,
298   /* sym32 */ FALSE, /* soft_float */ FALSE, /* single_float */ FALSE
299 };
300
301 /* These variables are filled in with the masks of registers used.
302    The object format code reads them and puts them in the appropriate
303    place.  */
304 unsigned long mips_gprmask;
305 unsigned long mips_cprmask[4];
306
307 /* MIPS ISA we are using for this output file.  */
308 static int file_mips_isa = ISA_UNKNOWN;
309
310 /* True if any MIPS16 code was produced.  */
311 static int file_ase_mips16;
312
313 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
314                               || mips_opts.isa == ISA_MIPS32R2          \
315                               || mips_opts.isa == ISA_MIPS64            \
316                               || mips_opts.isa == ISA_MIPS64R2)
317
318 /* True if any microMIPS code was produced.  */
319 static int file_ase_micromips;
320
321 /* True if we want to create R_MIPS_JALR for jalr $25.  */
322 #ifdef TE_IRIX
323 #define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
324 #else
325 /* As a GNU extension, we use R_MIPS_JALR for o32 too.  However,
326    because there's no place for any addend, the only acceptable
327    expression is a bare symbol.  */
328 #define MIPS_JALR_HINT_P(EXPR) \
329   (!HAVE_IN_PLACE_ADDENDS \
330    || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
331 #endif
332
333 /* True if -mips3d was passed or implied by arguments passed on the
334    command line (e.g., by -march).  */
335 static int file_ase_mips3d;
336
337 /* True if -mdmx was passed or implied by arguments passed on the
338    command line (e.g., by -march).  */
339 static int file_ase_mdmx;
340
341 /* True if -msmartmips was passed or implied by arguments passed on the
342    command line (e.g., by -march).  */
343 static int file_ase_smartmips;
344
345 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32             \
346                                 || mips_opts.isa == ISA_MIPS32R2)
347
348 /* True if -mdsp was passed or implied by arguments passed on the
349    command line (e.g., by -march).  */
350 static int file_ase_dsp;
351
352 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2             \
353                               || mips_opts.isa == ISA_MIPS64R2          \
354                               || mips_opts.micromips)
355
356 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
357
358 /* True if -mdspr2 was passed or implied by arguments passed on the
359    command line (e.g., by -march).  */
360 static int file_ase_dspr2;
361
362 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
363                                 || mips_opts.isa == ISA_MIPS64R2        \
364                                 || mips_opts.micromips)
365
366 /* True if -mmt was passed or implied by arguments passed on the
367    command line (e.g., by -march).  */
368 static int file_ase_mt;
369
370 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
371                              || mips_opts.isa == ISA_MIPS64R2)
372
373 #define ISA_SUPPORTS_MCU_ASE (mips_opts.isa == ISA_MIPS32R2             \
374                               || mips_opts.isa == ISA_MIPS64R2          \
375                               || mips_opts.micromips)
376
377 /* The argument of the -march= flag.  The architecture we are assembling.  */
378 static int file_mips_arch = CPU_UNKNOWN;
379 static const char *mips_arch_string;
380
381 /* The argument of the -mtune= flag.  The architecture for which we
382    are optimizing.  */
383 static int mips_tune = CPU_UNKNOWN;
384 static const char *mips_tune_string;
385
386 /* True when generating 32-bit code for a 64-bit processor.  */
387 static int mips_32bitmode = 0;
388
389 /* True if the given ABI requires 32-bit registers.  */
390 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
391
392 /* Likewise 64-bit registers.  */
393 #define ABI_NEEDS_64BIT_REGS(ABI)       \
394   ((ABI) == N32_ABI                     \
395    || (ABI) == N64_ABI                  \
396    || (ABI) == O64_ABI)
397
398 /*  Return true if ISA supports 64 bit wide gp registers.  */
399 #define ISA_HAS_64BIT_REGS(ISA)         \
400   ((ISA) == ISA_MIPS3                   \
401    || (ISA) == ISA_MIPS4                \
402    || (ISA) == ISA_MIPS5                \
403    || (ISA) == ISA_MIPS64               \
404    || (ISA) == ISA_MIPS64R2)
405
406 /*  Return true if ISA supports 64 bit wide float registers.  */
407 #define ISA_HAS_64BIT_FPRS(ISA)         \
408   ((ISA) == ISA_MIPS3                   \
409    || (ISA) == ISA_MIPS4                \
410    || (ISA) == ISA_MIPS5                \
411    || (ISA) == ISA_MIPS32R2             \
412    || (ISA) == ISA_MIPS64               \
413    || (ISA) == ISA_MIPS64R2)
414
415 /* Return true if ISA supports 64-bit right rotate (dror et al.)
416    instructions.  */
417 #define ISA_HAS_DROR(ISA)               \
418   ((ISA) == ISA_MIPS64R2                \
419    || (mips_opts.micromips              \
420        && ISA_HAS_64BIT_REGS (ISA))     \
421    )
422
423 /* Return true if ISA supports 32-bit right rotate (ror et al.)
424    instructions.  */
425 #define ISA_HAS_ROR(ISA)                \
426   ((ISA) == ISA_MIPS32R2                \
427    || (ISA) == ISA_MIPS64R2             \
428    || mips_opts.ase_smartmips           \
429    || mips_opts.micromips               \
430    )
431
432 /* Return true if ISA supports single-precision floats in odd registers.  */
433 #define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
434   ((ISA) == ISA_MIPS32                  \
435    || (ISA) == ISA_MIPS32R2             \
436    || (ISA) == ISA_MIPS64               \
437    || (ISA) == ISA_MIPS64R2)
438
439 /* Return true if ISA supports move to/from high part of a 64-bit
440    floating-point register. */
441 #define ISA_HAS_MXHC1(ISA)              \
442   ((ISA) == ISA_MIPS32R2                \
443    || (ISA) == ISA_MIPS64R2)
444
445 #define HAVE_32BIT_GPRS                            \
446     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
447
448 #define HAVE_32BIT_FPRS                            \
449     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
450
451 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
452 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
453
454 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
455
456 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
457
458 /* True if relocations are stored in-place.  */
459 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
460
461 /* The ABI-derived address size.  */
462 #define HAVE_64BIT_ADDRESSES \
463   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
464 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
465
466 /* The size of symbolic constants (i.e., expressions of the form
467    "SYMBOL" or "SYMBOL + OFFSET").  */
468 #define HAVE_32BIT_SYMBOLS \
469   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
470 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
471
472 /* Addresses are loaded in different ways, depending on the address size
473    in use.  The n32 ABI Documentation also mandates the use of additions
474    with overflow checking, but existing implementations don't follow it.  */
475 #define ADDRESS_ADD_INSN                                                \
476    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
477
478 #define ADDRESS_ADDI_INSN                                               \
479    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
480
481 #define ADDRESS_LOAD_INSN                                               \
482    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
483
484 #define ADDRESS_STORE_INSN                                              \
485    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
486
487 /* Return true if the given CPU supports the MIPS16 ASE.  */
488 #define CPU_HAS_MIPS16(cpu)                                             \
489    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
490     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
491
492 /* Return true if the given CPU supports the microMIPS ASE.  */
493 #define CPU_HAS_MICROMIPS(cpu)  0
494
495 /* True if CPU has a dror instruction.  */
496 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
497
498 /* True if CPU has a ror instruction.  */
499 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
500
501 /* True if CPU is in the Octeon family */
502 #define CPU_IS_OCTEON(CPU) ((CPU) == CPU_OCTEON || (CPU) == CPU_OCTEONP || (CPU) == CPU_OCTEON2)
503
504 /* True if CPU has seq/sne and seqi/snei instructions.  */
505 #define CPU_HAS_SEQ(CPU)        (CPU_IS_OCTEON (CPU))
506
507 /* True, if CPU has support for ldc1 and sdc1. */
508 #define CPU_HAS_LDC1_SDC1(CPU)  \
509    ((mips_opts.isa != ISA_MIPS1) && ((CPU) != CPU_R5900))
510
511 /* True if mflo and mfhi can be immediately followed by instructions
512    which write to the HI and LO registers.
513
514    According to MIPS specifications, MIPS ISAs I, II, and III need
515    (at least) two instructions between the reads of HI/LO and
516    instructions which write them, and later ISAs do not.  Contradicting
517    the MIPS specifications, some MIPS IV processor user manuals (e.g.
518    the UM for the NEC Vr5000) document needing the instructions between
519    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
520    MIPS64 and later ISAs to have the interlocks, plus any specific
521    earlier-ISA CPUs for which CPU documentation declares that the
522    instructions are really interlocked.  */
523 #define hilo_interlocks \
524   (mips_opts.isa == ISA_MIPS32                        \
525    || mips_opts.isa == ISA_MIPS32R2                   \
526    || mips_opts.isa == ISA_MIPS64                     \
527    || mips_opts.isa == ISA_MIPS64R2                   \
528    || mips_opts.arch == CPU_R4010                     \
529    || mips_opts.arch == CPU_R5900                     \
530    || mips_opts.arch == CPU_R10000                    \
531    || mips_opts.arch == CPU_R12000                    \
532    || mips_opts.arch == CPU_R14000                    \
533    || mips_opts.arch == CPU_R16000                    \
534    || mips_opts.arch == CPU_RM7000                    \
535    || mips_opts.arch == CPU_VR5500                    \
536    || mips_opts.micromips                             \
537    )
538
539 /* Whether the processor uses hardware interlocks to protect reads
540    from the GPRs after they are loaded from memory, and thus does not
541    require nops to be inserted.  This applies to instructions marked
542    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
543    level I and microMIPS mode instructions are always interlocked.  */
544 #define gpr_interlocks                                \
545   (mips_opts.isa != ISA_MIPS1                         \
546    || mips_opts.arch == CPU_R3900                     \
547    || mips_opts.arch == CPU_R5900                     \
548    || mips_opts.micromips                             \
549    )
550
551 /* Whether the processor uses hardware interlocks to avoid delays
552    required by coprocessor instructions, and thus does not require
553    nops to be inserted.  This applies to instructions marked
554    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
555    between instructions marked INSN_WRITE_COND_CODE and ones marked
556    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
557    levels I, II, and III and microMIPS mode instructions are always
558    interlocked.  */
559 /* Itbl support may require additional care here.  */
560 #define cop_interlocks                                \
561   ((mips_opts.isa != ISA_MIPS1                        \
562     && mips_opts.isa != ISA_MIPS2                     \
563     && mips_opts.isa != ISA_MIPS3)                    \
564    || mips_opts.arch == CPU_R4300                     \
565    || mips_opts.micromips                             \
566    )
567
568 /* Whether the processor uses hardware interlocks to protect reads
569    from coprocessor registers after they are loaded from memory, and
570    thus does not require nops to be inserted.  This applies to
571    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
572    requires at MIPS ISA level I and microMIPS mode instructions are
573    always interlocked.  */
574 #define cop_mem_interlocks                            \
575   (mips_opts.isa != ISA_MIPS1                         \
576    || mips_opts.micromips                             \
577    )
578
579 /* Is this a mfhi or mflo instruction?  */
580 #define MF_HILO_INSN(PINFO) \
581   ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
582
583 /* Whether code compression (either of the MIPS16 or the microMIPS ASEs)
584    has been selected.  This implies, in particular, that addresses of text
585    labels have their LSB set.  */
586 #define HAVE_CODE_COMPRESSION                                           \
587   ((mips_opts.mips16 | mips_opts.micromips) != 0)
588
589 /* MIPS PIC level.  */
590
591 enum mips_pic_level mips_pic;
592
593 /* 1 if we should generate 32 bit offsets from the $gp register in
594    SVR4_PIC mode.  Currently has no meaning in other modes.  */
595 static int mips_big_got = 0;
596
597 /* 1 if trap instructions should used for overflow rather than break
598    instructions.  */
599 static int mips_trap = 0;
600
601 /* 1 if double width floating point constants should not be constructed
602    by assembling two single width halves into two single width floating
603    point registers which just happen to alias the double width destination
604    register.  On some architectures this aliasing can be disabled by a bit
605    in the status register, and the setting of this bit cannot be determined
606    automatically at assemble time.  */
607 static int mips_disable_float_construction;
608
609 /* Non-zero if any .set noreorder directives were used.  */
610
611 static int mips_any_noreorder;
612
613 /* Non-zero if nops should be inserted when the register referenced in
614    an mfhi/mflo instruction is read in the next two instructions.  */
615 static int mips_7000_hilo_fix;
616
617 /* The size of objects in the small data section.  */
618 static unsigned int g_switch_value = 8;
619 /* Whether the -G option was used.  */
620 static int g_switch_seen = 0;
621
622 #define N_RMASK 0xc4
623 #define N_VFP   0xd4
624
625 /* If we can determine in advance that GP optimization won't be
626    possible, we can skip the relaxation stuff that tries to produce
627    GP-relative references.  This makes delay slot optimization work
628    better.
629
630    This function can only provide a guess, but it seems to work for
631    gcc output.  It needs to guess right for gcc, otherwise gcc
632    will put what it thinks is a GP-relative instruction in a branch
633    delay slot.
634
635    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
636    fixed it for the non-PIC mode.  KR 95/04/07  */
637 static int nopic_need_relax (symbolS *, int);
638
639 /* handle of the OPCODE hash table */
640 static struct hash_control *op_hash = NULL;
641
642 /* The opcode hash table we use for the mips16.  */
643 static struct hash_control *mips16_op_hash = NULL;
644
645 /* The opcode hash table we use for the microMIPS ASE.  */
646 static struct hash_control *micromips_op_hash = NULL;
647
648 /* This array holds the chars that always start a comment.  If the
649     pre-processor is disabled, these aren't very useful */
650 const char comment_chars[] = "#";
651
652 /* This array holds the chars that only start a comment at the beginning of
653    a line.  If the line seems to have the form '# 123 filename'
654    .line and .file directives will appear in the pre-processed output */
655 /* Note that input_file.c hand checks for '#' at the beginning of the
656    first line of the input file.  This is because the compiler outputs
657    #NO_APP at the beginning of its output.  */
658 /* Also note that C style comments are always supported.  */
659 const char line_comment_chars[] = "#";
660
661 /* This array holds machine specific line separator characters.  */
662 const char line_separator_chars[] = ";";
663
664 /* Chars that can be used to separate mant from exp in floating point nums */
665 const char EXP_CHARS[] = "eE";
666
667 /* Chars that mean this number is a floating point constant */
668 /* As in 0f12.456 */
669 /* or    0d1.2345e12 */
670 const char FLT_CHARS[] = "rRsSfFdDxXpP";
671
672 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
673    changed in read.c .  Ideally it shouldn't have to know about it at all,
674    but nothing is ideal around here.
675  */
676
677 static char *insn_error;
678
679 static int auto_align = 1;
680
681 /* When outputting SVR4 PIC code, the assembler needs to know the
682    offset in the stack frame from which to restore the $gp register.
683    This is set by the .cprestore pseudo-op, and saved in this
684    variable.  */
685 static offsetT mips_cprestore_offset = -1;
686
687 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
688    more optimizations, it can use a register value instead of a memory-saved
689    offset and even an other register than $gp as global pointer.  */
690 static offsetT mips_cpreturn_offset = -1;
691 static int mips_cpreturn_register = -1;
692 static int mips_gp_register = GP;
693 static int mips_gprel_offset = 0;
694
695 /* Whether mips_cprestore_offset has been set in the current function
696    (or whether it has already been warned about, if not).  */
697 static int mips_cprestore_valid = 0;
698
699 /* This is the register which holds the stack frame, as set by the
700    .frame pseudo-op.  This is needed to implement .cprestore.  */
701 static int mips_frame_reg = SP;
702
703 /* Whether mips_frame_reg has been set in the current function
704    (or whether it has already been warned about, if not).  */
705 static int mips_frame_reg_valid = 0;
706
707 /* To output NOP instructions correctly, we need to keep information
708    about the previous two instructions.  */
709
710 /* Whether we are optimizing.  The default value of 2 means to remove
711    unneeded NOPs and swap branch instructions when possible.  A value
712    of 1 means to not swap branches.  A value of 0 means to always
713    insert NOPs.  */
714 static int mips_optimize = 2;
715
716 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
717    equivalent to seeing no -g option at all.  */
718 static int mips_debug = 0;
719
720 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
721 #define MAX_VR4130_NOPS 4
722
723 /* The maximum number of NOPs needed to fill delay slots.  */
724 #define MAX_DELAY_NOPS 2
725
726 /* The maximum number of NOPs needed for any purpose.  */
727 #define MAX_NOPS 4
728
729 /* A list of previous instructions, with index 0 being the most recent.
730    We need to look back MAX_NOPS instructions when filling delay slots
731    or working around processor errata.  We need to look back one
732    instruction further if we're thinking about using history[0] to
733    fill a branch delay slot.  */
734 static struct mips_cl_insn history[1 + MAX_NOPS];
735
736 /* Nop instructions used by emit_nop.  */
737 static struct mips_cl_insn nop_insn;
738 static struct mips_cl_insn mips16_nop_insn;
739 static struct mips_cl_insn micromips_nop16_insn;
740 static struct mips_cl_insn micromips_nop32_insn;
741
742 /* The appropriate nop for the current mode.  */
743 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn \
744                   : (mips_opts.micromips ? &micromips_nop16_insn : &nop_insn))
745
746 /* The size of NOP_INSN in bytes.  */
747 #define NOP_INSN_SIZE (HAVE_CODE_COMPRESSION ? 2 : 4)
748
749 /* If this is set, it points to a frag holding nop instructions which
750    were inserted before the start of a noreorder section.  If those
751    nops turn out to be unnecessary, the size of the frag can be
752    decreased.  */
753 static fragS *prev_nop_frag;
754
755 /* The number of nop instructions we created in prev_nop_frag.  */
756 static int prev_nop_frag_holds;
757
758 /* The number of nop instructions that we know we need in
759    prev_nop_frag.  */
760 static int prev_nop_frag_required;
761
762 /* The number of instructions we've seen since prev_nop_frag.  */
763 static int prev_nop_frag_since;
764
765 /* For ECOFF and ELF, relocations against symbols are done in two
766    parts, with a HI relocation and a LO relocation.  Each relocation
767    has only 16 bits of space to store an addend.  This means that in
768    order for the linker to handle carries correctly, it must be able
769    to locate both the HI and the LO relocation.  This means that the
770    relocations must appear in order in the relocation table.
771
772    In order to implement this, we keep track of each unmatched HI
773    relocation.  We then sort them so that they immediately precede the
774    corresponding LO relocation.  */
775
776 struct mips_hi_fixup
777 {
778   /* Next HI fixup.  */
779   struct mips_hi_fixup *next;
780   /* This fixup.  */
781   fixS *fixp;
782   /* The section this fixup is in.  */
783   segT seg;
784 };
785
786 /* The list of unmatched HI relocs.  */
787
788 static struct mips_hi_fixup *mips_hi_fixup_list;
789
790 /* The frag containing the last explicit relocation operator.
791    Null if explicit relocations have not been used.  */
792
793 static fragS *prev_reloc_op_frag;
794
795 /* Map normal MIPS register numbers to mips16 register numbers.  */
796
797 #define X ILLEGAL_REG
798 static const int mips32_to_16_reg_map[] =
799 {
800   X, X, 2, 3, 4, 5, 6, 7,
801   X, X, X, X, X, X, X, X,
802   0, 1, X, X, X, X, X, X,
803   X, X, X, X, X, X, X, X
804 };
805 #undef X
806
807 /* Map mips16 register numbers to normal MIPS register numbers.  */
808
809 static const unsigned int mips16_to_32_reg_map[] =
810 {
811   16, 17, 2, 3, 4, 5, 6, 7
812 };
813
814 /* Map normal MIPS register numbers to microMIPS register numbers.  */
815
816 #define mips32_to_micromips_reg_b_map   mips32_to_16_reg_map
817 #define mips32_to_micromips_reg_c_map   mips32_to_16_reg_map
818 #define mips32_to_micromips_reg_d_map   mips32_to_16_reg_map
819 #define mips32_to_micromips_reg_e_map   mips32_to_16_reg_map
820 #define mips32_to_micromips_reg_f_map   mips32_to_16_reg_map
821 #define mips32_to_micromips_reg_g_map   mips32_to_16_reg_map
822 #define mips32_to_micromips_reg_l_map   mips32_to_16_reg_map
823
824 #define X ILLEGAL_REG
825 /* reg type h: 4, 5, 6.  */
826 static const int mips32_to_micromips_reg_h_map[] =
827 {
828   X, X, X, X, 4, 5, 6, X,
829   X, X, X, X, X, X, X, X,
830   X, X, X, X, X, X, X, X,
831   X, X, X, X, X, X, X, X
832 };
833
834 /* reg type m: 0, 17, 2, 3, 16, 18, 19, 20.  */
835 static const int mips32_to_micromips_reg_m_map[] =
836 {
837   0, X, 2, 3, X, X, X, X,
838   X, X, X, X, X, X, X, X,
839   4, 1, 5, 6, 7, X, X, X,
840   X, X, X, X, X, X, X, X
841 };
842
843 /* reg type q: 0, 2-7. 17.  */
844 static const int mips32_to_micromips_reg_q_map[] =
845 {
846   0, X, 2, 3, 4, 5, 6, 7,
847   X, X, X, X, X, X, X, X,
848   X, 1, X, X, X, X, X, X,
849   X, X, X, X, X, X, X, X
850 };
851
852 #define mips32_to_micromips_reg_n_map  mips32_to_micromips_reg_m_map
853 #undef X
854
855 /* Map microMIPS register numbers to normal MIPS register numbers.  */
856
857 #define micromips_to_32_reg_b_map       mips16_to_32_reg_map
858 #define micromips_to_32_reg_c_map       mips16_to_32_reg_map
859 #define micromips_to_32_reg_d_map       mips16_to_32_reg_map
860 #define micromips_to_32_reg_e_map       mips16_to_32_reg_map
861 #define micromips_to_32_reg_f_map       mips16_to_32_reg_map
862 #define micromips_to_32_reg_g_map       mips16_to_32_reg_map
863
864 /* The microMIPS registers with type h.  */
865 static const unsigned int micromips_to_32_reg_h_map[] =
866 {
867   5, 5, 6, 4, 4, 4, 4, 4
868 };
869
870 /* The microMIPS registers with type i.  */
871 static const unsigned int micromips_to_32_reg_i_map[] =
872 {
873   6, 7, 7, 21, 22, 5, 6, 7
874 };
875
876 #define micromips_to_32_reg_l_map       mips16_to_32_reg_map
877
878 /* The microMIPS registers with type m.  */
879 static const unsigned int micromips_to_32_reg_m_map[] =
880 {
881   0, 17, 2, 3, 16, 18, 19, 20
882 };
883
884 #define micromips_to_32_reg_n_map      micromips_to_32_reg_m_map
885
886 /* The microMIPS registers with type q.  */
887 static const unsigned int micromips_to_32_reg_q_map[] =
888 {
889   0, 17, 2, 3, 4, 5, 6, 7
890 };
891
892 /* microMIPS imm type B.  */
893 static const int micromips_imm_b_map[] =
894 {
895   1, 4, 8, 12, 16, 20, 24, -1
896 };
897
898 /* microMIPS imm type C.  */
899 static const int micromips_imm_c_map[] =
900 {
901   128, 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 255, 32768, 65535
902 };
903
904 /* Classifies the kind of instructions we're interested in when
905    implementing -mfix-vr4120.  */
906 enum fix_vr4120_class
907 {
908   FIX_VR4120_MACC,
909   FIX_VR4120_DMACC,
910   FIX_VR4120_MULT,
911   FIX_VR4120_DMULT,
912   FIX_VR4120_DIV,
913   FIX_VR4120_MTHILO,
914   NUM_FIX_VR4120_CLASSES
915 };
916
917 /* ...likewise -mfix-loongson2f-jump.  */
918 static bfd_boolean mips_fix_loongson2f_jump;
919
920 /* ...likewise -mfix-loongson2f-nop.  */
921 static bfd_boolean mips_fix_loongson2f_nop;
922
923 /* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed.  */
924 static bfd_boolean mips_fix_loongson2f;
925
926 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
927    there must be at least one other instruction between an instruction
928    of type X and an instruction of type Y.  */
929 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
930
931 /* True if -mfix-vr4120 is in force.  */
932 static int mips_fix_vr4120;
933
934 /* ...likewise -mfix-vr4130.  */
935 static int mips_fix_vr4130;
936
937 /* ...likewise -mfix-24k.  */
938 static int mips_fix_24k;
939
940 /* ...likewise -mfix-cn63xxp1 */
941 static bfd_boolean mips_fix_cn63xxp1;
942
943 /* We don't relax branches by default, since this causes us to expand
944    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
945    fail to compute the offset before expanding the macro to the most
946    efficient expansion.  */
947
948 static int mips_relax_branch;
949 \f
950 /* The expansion of many macros depends on the type of symbol that
951    they refer to.  For example, when generating position-dependent code,
952    a macro that refers to a symbol may have two different expansions,
953    one which uses GP-relative addresses and one which uses absolute
954    addresses.  When generating SVR4-style PIC, a macro may have
955    different expansions for local and global symbols.
956
957    We handle these situations by generating both sequences and putting
958    them in variant frags.  In position-dependent code, the first sequence
959    will be the GP-relative one and the second sequence will be the
960    absolute one.  In SVR4 PIC, the first sequence will be for global
961    symbols and the second will be for local symbols.
962
963    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
964    SECOND are the lengths of the two sequences in bytes.  These fields
965    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
966    the subtype has the following flags:
967
968    RELAX_USE_SECOND
969         Set if it has been decided that we should use the second
970         sequence instead of the first.
971
972    RELAX_SECOND_LONGER
973         Set in the first variant frag if the macro's second implementation
974         is longer than its first.  This refers to the macro as a whole,
975         not an individual relaxation.
976
977    RELAX_NOMACRO
978         Set in the first variant frag if the macro appeared in a .set nomacro
979         block and if one alternative requires a warning but the other does not.
980
981    RELAX_DELAY_SLOT
982         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
983         delay slot.
984
985    RELAX_DELAY_SLOT_16BIT
986         Like RELAX_DELAY_SLOT, but indicates that the delay slot requires a
987         16-bit instruction.
988
989    RELAX_DELAY_SLOT_SIZE_FIRST
990         Like RELAX_DELAY_SLOT, but indicates that the first implementation of
991         the macro is of the wrong size for the branch delay slot.
992
993    RELAX_DELAY_SLOT_SIZE_SECOND
994         Like RELAX_DELAY_SLOT, but indicates that the second implementation of
995         the macro is of the wrong size for the branch delay slot.
996
997    The frag's "opcode" points to the first fixup for relaxable code.
998
999    Relaxable macros are generated using a sequence such as:
1000
1001       relax_start (SYMBOL);
1002       ... generate first expansion ...
1003       relax_switch ();
1004       ... generate second expansion ...
1005       relax_end ();
1006
1007    The code and fixups for the unwanted alternative are discarded
1008    by md_convert_frag.  */
1009 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
1010
1011 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
1012 #define RELAX_SECOND(X) ((X) & 0xff)
1013 #define RELAX_USE_SECOND 0x10000
1014 #define RELAX_SECOND_LONGER 0x20000
1015 #define RELAX_NOMACRO 0x40000
1016 #define RELAX_DELAY_SLOT 0x80000
1017 #define RELAX_DELAY_SLOT_16BIT 0x100000
1018 #define RELAX_DELAY_SLOT_SIZE_FIRST 0x200000
1019 #define RELAX_DELAY_SLOT_SIZE_SECOND 0x400000
1020
1021 /* Branch without likely bit.  If label is out of range, we turn:
1022
1023         beq reg1, reg2, label
1024         delay slot
1025
1026    into
1027
1028         bne reg1, reg2, 0f
1029         nop
1030         j label
1031      0: delay slot
1032
1033    with the following opcode replacements:
1034
1035         beq <-> bne
1036         blez <-> bgtz
1037         bltz <-> bgez
1038         bc1f <-> bc1t
1039
1040         bltzal <-> bgezal  (with jal label instead of j label)
1041
1042    Even though keeping the delay slot instruction in the delay slot of
1043    the branch would be more efficient, it would be very tricky to do
1044    correctly, because we'd have to introduce a variable frag *after*
1045    the delay slot instruction, and expand that instead.  Let's do it
1046    the easy way for now, even if the branch-not-taken case now costs
1047    one additional instruction.  Out-of-range branches are not supposed
1048    to be common, anyway.
1049
1050    Branch likely.  If label is out of range, we turn:
1051
1052         beql reg1, reg2, label
1053         delay slot (annulled if branch not taken)
1054
1055    into
1056
1057         beql reg1, reg2, 1f
1058         nop
1059         beql $0, $0, 2f
1060         nop
1061      1: j[al] label
1062         delay slot (executed only if branch taken)
1063      2:
1064
1065    It would be possible to generate a shorter sequence by losing the
1066    likely bit, generating something like:
1067
1068         bne reg1, reg2, 0f
1069         nop
1070         j[al] label
1071         delay slot (executed only if branch taken)
1072      0:
1073
1074         beql -> bne
1075         bnel -> beq
1076         blezl -> bgtz
1077         bgtzl -> blez
1078         bltzl -> bgez
1079         bgezl -> bltz
1080         bc1fl -> bc1t
1081         bc1tl -> bc1f
1082
1083         bltzall -> bgezal  (with jal label instead of j label)
1084         bgezall -> bltzal  (ditto)
1085
1086
1087    but it's not clear that it would actually improve performance.  */
1088 #define RELAX_BRANCH_ENCODE(at, uncond, likely, link, toofar)   \
1089   ((relax_substateT)                                            \
1090    (0xc0000000                                                  \
1091     | ((at) & 0x1f)                                             \
1092     | ((toofar) ? 0x20 : 0)                                     \
1093     | ((link) ? 0x40 : 0)                                       \
1094     | ((likely) ? 0x80 : 0)                                     \
1095     | ((uncond) ? 0x100 : 0)))
1096 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
1097 #define RELAX_BRANCH_UNCOND(i) (((i) & 0x100) != 0)
1098 #define RELAX_BRANCH_LIKELY(i) (((i) & 0x80) != 0)
1099 #define RELAX_BRANCH_LINK(i) (((i) & 0x40) != 0)
1100 #define RELAX_BRANCH_TOOFAR(i) (((i) & 0x20) != 0)
1101 #define RELAX_BRANCH_AT(i) ((i) & 0x1f)
1102
1103 /* For mips16 code, we use an entirely different form of relaxation.
1104    mips16 supports two versions of most instructions which take
1105    immediate values: a small one which takes some small value, and a
1106    larger one which takes a 16 bit value.  Since branches also follow
1107    this pattern, relaxing these values is required.
1108
1109    We can assemble both mips16 and normal MIPS code in a single
1110    object.  Therefore, we need to support this type of relaxation at
1111    the same time that we support the relaxation described above.  We
1112    use the high bit of the subtype field to distinguish these cases.
1113
1114    The information we store for this type of relaxation is the
1115    argument code found in the opcode file for this relocation, whether
1116    the user explicitly requested a small or extended form, and whether
1117    the relocation is in a jump or jal delay slot.  That tells us the
1118    size of the value, and how it should be stored.  We also store
1119    whether the fragment is considered to be extended or not.  We also
1120    store whether this is known to be a branch to a different section,
1121    whether we have tried to relax this frag yet, and whether we have
1122    ever extended a PC relative fragment because of a shift count.  */
1123 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
1124   (0x80000000                                                   \
1125    | ((type) & 0xff)                                            \
1126    | ((small) ? 0x100 : 0)                                      \
1127    | ((ext) ? 0x200 : 0)                                        \
1128    | ((dslot) ? 0x400 : 0)                                      \
1129    | ((jal_dslot) ? 0x800 : 0))
1130 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
1131 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
1132 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
1133 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
1134 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
1135 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
1136 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
1137 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
1138 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
1139 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
1140 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
1141 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
1142
1143 /* For microMIPS code, we use relaxation similar to one we use for
1144    MIPS16 code.  Some instructions that take immediate values support
1145    two encodings: a small one which takes some small value, and a
1146    larger one which takes a 16 bit value.  As some branches also follow
1147    this pattern, relaxing these values is required.
1148
1149    We can assemble both microMIPS and normal MIPS code in a single
1150    object.  Therefore, we need to support this type of relaxation at
1151    the same time that we support the relaxation described above.  We
1152    use one of the high bits of the subtype field to distinguish these
1153    cases.
1154
1155    The information we store for this type of relaxation is the argument
1156    code found in the opcode file for this relocation, the register
1157    selected as the assembler temporary, whether the branch is
1158    unconditional, whether it is compact, whether it stores the link
1159    address implicitly in $ra, whether relaxation of out-of-range 32-bit
1160    branches to a sequence of instructions is enabled, and whether the
1161    displacement of a branch is too large to fit as an immediate argument
1162    of a 16-bit and a 32-bit branch, respectively.  */
1163 #define RELAX_MICROMIPS_ENCODE(type, at, uncond, compact, link, \
1164                                relax32, toofar16, toofar32)     \
1165   (0x40000000                                                   \
1166    | ((type) & 0xff)                                            \
1167    | (((at) & 0x1f) << 8)                                       \
1168    | ((uncond) ? 0x2000 : 0)                                    \
1169    | ((compact) ? 0x4000 : 0)                                   \
1170    | ((link) ? 0x8000 : 0)                                      \
1171    | ((relax32) ? 0x10000 : 0)                                  \
1172    | ((toofar16) ? 0x20000 : 0)                                 \
1173    | ((toofar32) ? 0x40000 : 0))
1174 #define RELAX_MICROMIPS_P(i) (((i) & 0xc0000000) == 0x40000000)
1175 #define RELAX_MICROMIPS_TYPE(i) ((i) & 0xff)
1176 #define RELAX_MICROMIPS_AT(i) (((i) >> 8) & 0x1f)
1177 #define RELAX_MICROMIPS_UNCOND(i) (((i) & 0x2000) != 0)
1178 #define RELAX_MICROMIPS_COMPACT(i) (((i) & 0x4000) != 0)
1179 #define RELAX_MICROMIPS_LINK(i) (((i) & 0x8000) != 0)
1180 #define RELAX_MICROMIPS_RELAX32(i) (((i) & 0x10000) != 0)
1181
1182 #define RELAX_MICROMIPS_TOOFAR16(i) (((i) & 0x20000) != 0)
1183 #define RELAX_MICROMIPS_MARK_TOOFAR16(i) ((i) | 0x20000)
1184 #define RELAX_MICROMIPS_CLEAR_TOOFAR16(i) ((i) & ~0x20000)
1185 #define RELAX_MICROMIPS_TOOFAR32(i) (((i) & 0x40000) != 0)
1186 #define RELAX_MICROMIPS_MARK_TOOFAR32(i) ((i) | 0x40000)
1187 #define RELAX_MICROMIPS_CLEAR_TOOFAR32(i) ((i) & ~0x40000)
1188
1189 /* Sign-extend 16-bit value X.  */
1190 #define SEXT_16BIT(X) ((((X) + 0x8000) & 0xffff) - 0x8000)
1191
1192 /* Is the given value a sign-extended 32-bit value?  */
1193 #define IS_SEXT_32BIT_NUM(x)                                            \
1194   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
1195    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
1196
1197 /* Is the given value a sign-extended 16-bit value?  */
1198 #define IS_SEXT_16BIT_NUM(x)                                            \
1199   (((x) &~ (offsetT) 0x7fff) == 0                                       \
1200    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
1201
1202 /* Is the given value a sign-extended 12-bit value?  */
1203 #define IS_SEXT_12BIT_NUM(x)                                            \
1204   (((((x) & 0xfff) ^ 0x800LL) - 0x800LL) == (x))
1205
1206 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
1207 #define IS_ZEXT_32BIT_NUM(x)                                            \
1208   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
1209    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
1210
1211 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
1212    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
1213 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
1214   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
1215               | (((VALUE) & (MASK)) << (SHIFT)))
1216
1217 /* Extract bits MASK << SHIFT from STRUCT and shift them right
1218    SHIFT places.  */
1219 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
1220   (((STRUCT) >> (SHIFT)) & (MASK))
1221
1222 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1223    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1224
1225    include/opcode/mips.h specifies operand fields using the macros
1226    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
1227    with "MIPS16OP" instead of "OP".  */
1228 #define INSERT_OPERAND(MICROMIPS, FIELD, INSN, VALUE) \
1229   do \
1230     if (!(MICROMIPS)) \
1231       INSERT_BITS ((INSN).insn_opcode, VALUE, \
1232                    OP_MASK_##FIELD, OP_SH_##FIELD); \
1233     else \
1234       INSERT_BITS ((INSN).insn_opcode, VALUE, \
1235                    MICROMIPSOP_MASK_##FIELD, MICROMIPSOP_SH_##FIELD); \
1236   while (0)
1237 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1238   INSERT_BITS ((INSN).insn_opcode, VALUE, \
1239                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1240
1241 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
1242 #define EXTRACT_OPERAND(MICROMIPS, FIELD, INSN) \
1243   (!(MICROMIPS) \
1244    ? EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD) \
1245    : EXTRACT_BITS ((INSN).insn_opcode, \
1246                    MICROMIPSOP_MASK_##FIELD, MICROMIPSOP_SH_##FIELD))
1247 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1248   EXTRACT_BITS ((INSN).insn_opcode, \
1249                 MIPS16OP_MASK_##FIELD, \
1250                 MIPS16OP_SH_##FIELD)
1251
1252 /* The MIPS16 EXTEND opcode, shifted left 16 places.  */
1253 #define MIPS16_EXTEND (0xf000U << 16)
1254 \f
1255 /* Whether or not we are emitting a branch-likely macro.  */
1256 static bfd_boolean emit_branch_likely_macro = FALSE;
1257
1258 /* Global variables used when generating relaxable macros.  See the
1259    comment above RELAX_ENCODE for more details about how relaxation
1260    is used.  */
1261 static struct {
1262   /* 0 if we're not emitting a relaxable macro.
1263      1 if we're emitting the first of the two relaxation alternatives.
1264      2 if we're emitting the second alternative.  */
1265   int sequence;
1266
1267   /* The first relaxable fixup in the current frag.  (In other words,
1268      the first fixup that refers to relaxable code.)  */
1269   fixS *first_fixup;
1270
1271   /* sizes[0] says how many bytes of the first alternative are stored in
1272      the current frag.  Likewise sizes[1] for the second alternative.  */
1273   unsigned int sizes[2];
1274
1275   /* The symbol on which the choice of sequence depends.  */
1276   symbolS *symbol;
1277 } mips_relax;
1278 \f
1279 /* Global variables used to decide whether a macro needs a warning.  */
1280 static struct {
1281   /* True if the macro is in a branch delay slot.  */
1282   bfd_boolean delay_slot_p;
1283
1284   /* Set to the length in bytes required if the macro is in a delay slot
1285      that requires a specific length of instruction, otherwise zero.  */
1286   unsigned int delay_slot_length;
1287
1288   /* For relaxable macros, sizes[0] is the length of the first alternative
1289      in bytes and sizes[1] is the length of the second alternative.
1290      For non-relaxable macros, both elements give the length of the
1291      macro in bytes.  */
1292   unsigned int sizes[2];
1293
1294   /* For relaxable macros, first_insn_sizes[0] is the length of the first
1295      instruction of the first alternative in bytes and first_insn_sizes[1]
1296      is the length of the first instruction of the second alternative.
1297      For non-relaxable macros, both elements give the length of the first
1298      instruction in bytes.
1299
1300      Set to zero if we haven't yet seen the first instruction.  */
1301   unsigned int first_insn_sizes[2];
1302
1303   /* For relaxable macros, insns[0] is the number of instructions for the
1304      first alternative and insns[1] is the number of instructions for the
1305      second alternative.
1306
1307      For non-relaxable macros, both elements give the number of
1308      instructions for the macro.  */
1309   unsigned int insns[2];
1310
1311   /* The first variant frag for this macro.  */
1312   fragS *first_frag;
1313 } mips_macro_warning;
1314 \f
1315 /* Prototypes for static functions.  */
1316
1317 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1318
1319 static void append_insn
1320   (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *,
1321    bfd_boolean expansionp);
1322 static void mips_no_prev_insn (void);
1323 static void macro_build (expressionS *, const char *, const char *, ...);
1324 static void mips16_macro_build
1325   (expressionS *, const char *, const char *, va_list *);
1326 static void load_register (int, expressionS *, int);
1327 static void macro_start (void);
1328 static void macro_end (void);
1329 static void macro (struct mips_cl_insn * ip);
1330 static void mips16_macro (struct mips_cl_insn * ip);
1331 static void mips_ip (char *str, struct mips_cl_insn * ip);
1332 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1333 static void mips16_immed
1334   (char *, unsigned int, int, bfd_reloc_code_real_type, offsetT,
1335    unsigned int, unsigned long *);
1336 static size_t my_getSmallExpression
1337   (expressionS *, bfd_reloc_code_real_type *, char *);
1338 static void my_getExpression (expressionS *, char *);
1339 static void s_align (int);
1340 static void s_change_sec (int);
1341 static void s_change_section (int);
1342 static void s_cons (int);
1343 static void s_float_cons (int);
1344 static void s_mips_globl (int);
1345 static void s_option (int);
1346 static void s_mipsset (int);
1347 static void s_abicalls (int);
1348 static void s_cpload (int);
1349 static void s_cpsetup (int);
1350 static void s_cplocal (int);
1351 static void s_cprestore (int);
1352 static void s_cpreturn (int);
1353 static void s_dtprelword (int);
1354 static void s_dtpreldword (int);
1355 static void s_tprelword (int);
1356 static void s_tpreldword (int);
1357 static void s_gpvalue (int);
1358 static void s_gpword (int);
1359 static void s_gpdword (int);
1360 static void s_cpadd (int);
1361 static void s_insn (int);
1362 static void md_obj_begin (void);
1363 static void md_obj_end (void);
1364 static void s_mips_ent (int);
1365 static void s_mips_end (int);
1366 static void s_mips_frame (int);
1367 static void s_mips_mask (int reg_type);
1368 static void s_mips_stab (int);
1369 static void s_mips_weakext (int);
1370 static void s_mips_file (int);
1371 static void s_mips_loc (int);
1372 static bfd_boolean pic_need_relax (symbolS *, asection *);
1373 static int relaxed_branch_length (fragS *, asection *, int);
1374 static int validate_mips_insn (const struct mips_opcode *);
1375 static int validate_micromips_insn (const struct mips_opcode *);
1376 static int relaxed_micromips_16bit_branch_length (fragS *, asection *, int);
1377 static int relaxed_micromips_32bit_branch_length (fragS *, asection *, int);
1378
1379 /* Table and functions used to map between CPU/ISA names, and
1380    ISA levels, and CPU numbers.  */
1381
1382 struct mips_cpu_info
1383 {
1384   const char *name;           /* CPU or ISA name.  */
1385   int flags;                  /* ASEs available, or ISA flag.  */
1386   int isa;                    /* ISA level.  */
1387   int cpu;                    /* CPU number (default CPU if ISA).  */
1388 };
1389
1390 #define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1391 #define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1392 #define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1393 #define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1394 #define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1395 #define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1396 #define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1397 #define MIPS_CPU_ASE_MCU        0x0080  /* CPU implements MCU ASE */
1398
1399 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1400 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1401 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1402 \f
1403 /* Pseudo-op table.
1404
1405    The following pseudo-ops from the Kane and Heinrich MIPS book
1406    should be defined here, but are currently unsupported: .alias,
1407    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1408
1409    The following pseudo-ops from the Kane and Heinrich MIPS book are
1410    specific to the type of debugging information being generated, and
1411    should be defined by the object format: .aent, .begin, .bend,
1412    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1413    .vreg.
1414
1415    The following pseudo-ops from the Kane and Heinrich MIPS book are
1416    not MIPS CPU specific, but are also not specific to the object file
1417    format.  This file is probably the best place to define them, but
1418    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1419
1420 static const pseudo_typeS mips_pseudo_table[] =
1421 {
1422   /* MIPS specific pseudo-ops.  */
1423   {"option", s_option, 0},
1424   {"set", s_mipsset, 0},
1425   {"rdata", s_change_sec, 'r'},
1426   {"sdata", s_change_sec, 's'},
1427   {"livereg", s_ignore, 0},
1428   {"abicalls", s_abicalls, 0},
1429   {"cpload", s_cpload, 0},
1430   {"cpsetup", s_cpsetup, 0},
1431   {"cplocal", s_cplocal, 0},
1432   {"cprestore", s_cprestore, 0},
1433   {"cpreturn", s_cpreturn, 0},
1434   {"dtprelword", s_dtprelword, 0},
1435   {"dtpreldword", s_dtpreldword, 0},
1436   {"tprelword", s_tprelword, 0},
1437   {"tpreldword", s_tpreldword, 0},
1438   {"gpvalue", s_gpvalue, 0},
1439   {"gpword", s_gpword, 0},
1440   {"gpdword", s_gpdword, 0},
1441   {"cpadd", s_cpadd, 0},
1442   {"insn", s_insn, 0},
1443
1444   /* Relatively generic pseudo-ops that happen to be used on MIPS
1445      chips.  */
1446   {"asciiz", stringer, 8 + 1},
1447   {"bss", s_change_sec, 'b'},
1448   {"err", s_err, 0},
1449   {"half", s_cons, 1},
1450   {"dword", s_cons, 3},
1451   {"weakext", s_mips_weakext, 0},
1452   {"origin", s_org, 0},
1453   {"repeat", s_rept, 0},
1454
1455   /* For MIPS this is non-standard, but we define it for consistency.  */
1456   {"sbss", s_change_sec, 'B'},
1457
1458   /* These pseudo-ops are defined in read.c, but must be overridden
1459      here for one reason or another.  */
1460   {"align", s_align, 0},
1461   {"byte", s_cons, 0},
1462   {"data", s_change_sec, 'd'},
1463   {"double", s_float_cons, 'd'},
1464   {"float", s_float_cons, 'f'},
1465   {"globl", s_mips_globl, 0},
1466   {"global", s_mips_globl, 0},
1467   {"hword", s_cons, 1},
1468   {"int", s_cons, 2},
1469   {"long", s_cons, 2},
1470   {"octa", s_cons, 4},
1471   {"quad", s_cons, 3},
1472   {"section", s_change_section, 0},
1473   {"short", s_cons, 1},
1474   {"single", s_float_cons, 'f'},
1475   {"stabd", s_mips_stab, 'd'},
1476   {"stabn", s_mips_stab, 'n'},
1477   {"stabs", s_mips_stab, 's'},
1478   {"text", s_change_sec, 't'},
1479   {"word", s_cons, 2},
1480
1481   { "extern", ecoff_directive_extern, 0},
1482
1483   { NULL, NULL, 0 },
1484 };
1485
1486 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1487 {
1488   /* These pseudo-ops should be defined by the object file format.
1489      However, a.out doesn't support them, so we have versions here.  */
1490   {"aent", s_mips_ent, 1},
1491   {"bgnb", s_ignore, 0},
1492   {"end", s_mips_end, 0},
1493   {"endb", s_ignore, 0},
1494   {"ent", s_mips_ent, 0},
1495   {"file", s_mips_file, 0},
1496   {"fmask", s_mips_mask, 'F'},
1497   {"frame", s_mips_frame, 0},
1498   {"loc", s_mips_loc, 0},
1499   {"mask", s_mips_mask, 'R'},
1500   {"verstamp", s_ignore, 0},
1501   { NULL, NULL, 0 },
1502 };
1503
1504 /* Export the ABI address size for use by TC_ADDRESS_BYTES for the
1505    purpose of the `.dc.a' internal pseudo-op.  */
1506
1507 int
1508 mips_address_bytes (void)
1509 {
1510   return HAVE_64BIT_ADDRESSES ? 8 : 4;
1511 }
1512
1513 extern void pop_insert (const pseudo_typeS *);
1514
1515 void
1516 mips_pop_insert (void)
1517 {
1518   pop_insert (mips_pseudo_table);
1519   if (! ECOFF_DEBUGGING)
1520     pop_insert (mips_nonecoff_pseudo_table);
1521 }
1522 \f
1523 /* Symbols labelling the current insn.  */
1524
1525 struct insn_label_list
1526 {
1527   struct insn_label_list *next;
1528   symbolS *label;
1529 };
1530
1531 static struct insn_label_list *free_insn_labels;
1532 #define label_list tc_segment_info_data.labels
1533
1534 static void mips_clear_insn_labels (void);
1535 static void mips_mark_labels (void);
1536 static void mips_compressed_mark_labels (void);
1537
1538 static inline void
1539 mips_clear_insn_labels (void)
1540 {
1541   register struct insn_label_list **pl;
1542   segment_info_type *si;
1543
1544   if (now_seg)
1545     {
1546       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1547         ;
1548       
1549       si = seg_info (now_seg);
1550       *pl = si->label_list;
1551       si->label_list = NULL;
1552     }
1553 }
1554
1555 /* Mark instruction labels in MIPS16/microMIPS mode.  */
1556
1557 static inline void
1558 mips_mark_labels (void)
1559 {
1560   if (HAVE_CODE_COMPRESSION)
1561     mips_compressed_mark_labels ();
1562 }
1563 \f
1564 static char *expr_end;
1565
1566 /* Expressions which appear in instructions.  These are set by
1567    mips_ip.  */
1568
1569 static expressionS imm_expr;
1570 static expressionS imm2_expr;
1571 static expressionS offset_expr;
1572
1573 /* Relocs associated with imm_expr and offset_expr.  */
1574
1575 static bfd_reloc_code_real_type imm_reloc[3]
1576   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1577 static bfd_reloc_code_real_type offset_reloc[3]
1578   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1579
1580 /* This is set to the resulting size of the instruction to be produced
1581    by mips16_ip if an explicit extension is used or by mips_ip if an
1582    explicit size is supplied.  */
1583
1584 static unsigned int forced_insn_length;
1585
1586 /* True if we are assembling an instruction.  All dot symbols defined during
1587    this time should be treated as code labels.  */
1588
1589 static bfd_boolean mips_assembling_insn;
1590
1591 #ifdef OBJ_ELF
1592 /* The pdr segment for per procedure frame/regmask info.  Not used for
1593    ECOFF debugging.  */
1594
1595 static segT pdr_seg;
1596 #endif
1597
1598 /* The default target format to use.  */
1599
1600 #if defined (TE_FreeBSD)
1601 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips-freebsd"
1602 #elif defined (TE_TMIPS)
1603 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips"
1604 #else
1605 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX ENDIAN "mips"
1606 #endif
1607
1608 const char *
1609 mips_target_format (void)
1610 {
1611   switch (OUTPUT_FLAVOR)
1612     {
1613     case bfd_target_ecoff_flavour:
1614       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1615     case bfd_target_coff_flavour:
1616       return "pe-mips";
1617     case bfd_target_elf_flavour:
1618 #ifdef TE_VXWORKS
1619       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1620         return (target_big_endian
1621                 ? "elf32-bigmips-vxworks"
1622                 : "elf32-littlemips-vxworks");
1623 #endif
1624       return (target_big_endian
1625               ? (HAVE_64BIT_OBJECTS
1626                  ? ELF_TARGET ("elf64-", "big")
1627                  : (HAVE_NEWABI
1628                     ? ELF_TARGET ("elf32-n", "big")
1629                     : ELF_TARGET ("elf32-", "big")))
1630               : (HAVE_64BIT_OBJECTS
1631                  ? ELF_TARGET ("elf64-", "little")
1632                  : (HAVE_NEWABI
1633                     ? ELF_TARGET ("elf32-n", "little")
1634                     : ELF_TARGET ("elf32-", "little"))));
1635     default:
1636       abort ();
1637       return NULL;
1638     }
1639 }
1640
1641 /* Return the length of a microMIPS instruction in bytes.  If bits of
1642    the mask beyond the low 16 are 0, then it is a 16-bit instruction.
1643    Otherwise assume a 32-bit instruction; 48-bit instructions (0x1f
1644    major opcode) will require further modifications to the opcode
1645    table.  */
1646
1647 static inline unsigned int
1648 micromips_insn_length (const struct mips_opcode *mo)
1649 {
1650   return (mo->mask >> 16) == 0 ? 2 : 4;
1651 }
1652
1653 /* Return the length of MIPS16 instruction OPCODE.  */
1654
1655 static inline unsigned int
1656 mips16_opcode_length (unsigned long opcode)
1657 {
1658   return (opcode >> 16) == 0 ? 2 : 4;
1659 }
1660
1661 /* Return the length of instruction INSN.  */
1662
1663 static inline unsigned int
1664 insn_length (const struct mips_cl_insn *insn)
1665 {
1666   if (mips_opts.micromips)
1667     return micromips_insn_length (insn->insn_mo);
1668   else if (mips_opts.mips16)
1669     return mips16_opcode_length (insn->insn_opcode);
1670   else
1671     return 4;
1672 }
1673
1674 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1675
1676 static void
1677 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1678 {
1679   size_t i;
1680
1681   insn->insn_mo = mo;
1682   insn->insn_opcode = mo->match;
1683   insn->frag = NULL;
1684   insn->where = 0;
1685   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1686     insn->fixp[i] = NULL;
1687   insn->fixed_p = (mips_opts.noreorder > 0);
1688   insn->noreorder_p = (mips_opts.noreorder > 0);
1689   insn->mips16_absolute_jump_p = 0;
1690   insn->complete_p = 0;
1691   insn->cleared_p = 0;
1692 }
1693
1694 /* Record the current MIPS16/microMIPS mode in now_seg.  */
1695
1696 static void
1697 mips_record_compressed_mode (void)
1698 {
1699   segment_info_type *si;
1700
1701   si = seg_info (now_seg);
1702   if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1703     si->tc_segment_info_data.mips16 = mips_opts.mips16;
1704   if (si->tc_segment_info_data.micromips != mips_opts.micromips)
1705     si->tc_segment_info_data.micromips = mips_opts.micromips;
1706 }
1707
1708 /* Read a standard MIPS instruction from BUF.  */
1709
1710 static unsigned long
1711 read_insn (char *buf)
1712 {
1713   if (target_big_endian)
1714     return bfd_getb32 ((bfd_byte *) buf);
1715   else
1716     return bfd_getl32 ((bfd_byte *) buf);
1717 }
1718
1719 /* Write standard MIPS instruction INSN to BUF.  Return a pointer to
1720    the next byte.  */
1721
1722 static char *
1723 write_insn (char *buf, unsigned int insn)
1724 {
1725   md_number_to_chars (buf, insn, 4);
1726   return buf + 4;
1727 }
1728
1729 /* Read a microMIPS or MIPS16 opcode from BUF, given that it
1730    has length LENGTH.  */
1731
1732 static unsigned long
1733 read_compressed_insn (char *buf, unsigned int length)
1734 {
1735   unsigned long insn;
1736   unsigned int i;
1737
1738   insn = 0;
1739   for (i = 0; i < length; i += 2)
1740     {
1741       insn <<= 16;
1742       if (target_big_endian)
1743         insn |= bfd_getb16 ((char *) buf);
1744       else
1745         insn |= bfd_getl16 ((char *) buf);
1746       buf += 2;
1747     }
1748   return insn;
1749 }
1750
1751 /* Write microMIPS or MIPS16 instruction INSN to BUF, given that the
1752    instruction is LENGTH bytes long.  Return a pointer to the next byte.  */
1753
1754 static char *
1755 write_compressed_insn (char *buf, unsigned int insn, unsigned int length)
1756 {
1757   unsigned int i;
1758
1759   for (i = 0; i < length; i += 2)
1760     md_number_to_chars (buf + i, insn >> ((length - i - 2) * 8), 2);
1761   return buf + length;
1762 }
1763
1764 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1765
1766 static void
1767 install_insn (const struct mips_cl_insn *insn)
1768 {
1769   char *f = insn->frag->fr_literal + insn->where;
1770   if (HAVE_CODE_COMPRESSION)
1771     write_compressed_insn (f, insn->insn_opcode, insn_length (insn));
1772   else
1773     write_insn (f, insn->insn_opcode);
1774   mips_record_compressed_mode ();
1775 }
1776
1777 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1778    and install the opcode in the new location.  */
1779
1780 static void
1781 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1782 {
1783   size_t i;
1784
1785   insn->frag = frag;
1786   insn->where = where;
1787   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1788     if (insn->fixp[i] != NULL)
1789       {
1790         insn->fixp[i]->fx_frag = frag;
1791         insn->fixp[i]->fx_where = where;
1792       }
1793   install_insn (insn);
1794 }
1795
1796 /* Add INSN to the end of the output.  */
1797
1798 static void
1799 add_fixed_insn (struct mips_cl_insn *insn)
1800 {
1801   char *f = frag_more (insn_length (insn));
1802   move_insn (insn, frag_now, f - frag_now->fr_literal);
1803 }
1804
1805 /* Start a variant frag and move INSN to the start of the variant part,
1806    marking it as fixed.  The other arguments are as for frag_var.  */
1807
1808 static void
1809 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1810                   relax_substateT subtype, symbolS *symbol, offsetT offset)
1811 {
1812   frag_grow (max_chars);
1813   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1814   insn->fixed_p = 1;
1815   frag_var (rs_machine_dependent, max_chars, var,
1816             subtype, symbol, offset, NULL);
1817 }
1818
1819 /* Insert N copies of INSN into the history buffer, starting at
1820    position FIRST.  Neither FIRST nor N need to be clipped.  */
1821
1822 static void
1823 insert_into_history (unsigned int first, unsigned int n,
1824                      const struct mips_cl_insn *insn)
1825 {
1826   if (mips_relax.sequence != 2)
1827     {
1828       unsigned int i;
1829
1830       for (i = ARRAY_SIZE (history); i-- > first;)
1831         if (i >= first + n)
1832           history[i] = history[i - n];
1833         else
1834           history[i] = *insn;
1835     }
1836 }
1837
1838 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1839    the idea is to make it obvious at a glance that each errata is
1840    included.  */
1841
1842 static void
1843 init_vr4120_conflicts (void)
1844 {
1845 #define CONFLICT(FIRST, SECOND) \
1846     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1847
1848   /* Errata 21 - [D]DIV[U] after [D]MACC */
1849   CONFLICT (MACC, DIV);
1850   CONFLICT (DMACC, DIV);
1851
1852   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1853   CONFLICT (DMULT, DMULT);
1854   CONFLICT (DMULT, DMACC);
1855   CONFLICT (DMACC, DMULT);
1856   CONFLICT (DMACC, DMACC);
1857
1858   /* Errata 24 - MT{LO,HI} after [D]MACC */
1859   CONFLICT (MACC, MTHILO);
1860   CONFLICT (DMACC, MTHILO);
1861
1862   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1863      instruction is executed immediately after a MACC or DMACC
1864      instruction, the result of [either instruction] is incorrect."  */
1865   CONFLICT (MACC, MULT);
1866   CONFLICT (MACC, DMULT);
1867   CONFLICT (DMACC, MULT);
1868   CONFLICT (DMACC, DMULT);
1869
1870   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1871      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1872      DDIV or DDIVU instruction, the result of the MACC or
1873      DMACC instruction is incorrect.".  */
1874   CONFLICT (DMULT, MACC);
1875   CONFLICT (DMULT, DMACC);
1876   CONFLICT (DIV, MACC);
1877   CONFLICT (DIV, DMACC);
1878
1879 #undef CONFLICT
1880 }
1881
1882 struct regname {
1883   const char *name;
1884   unsigned int num;
1885 };
1886
1887 #define RTYPE_MASK      0x1ff00
1888 #define RTYPE_NUM       0x00100
1889 #define RTYPE_FPU       0x00200
1890 #define RTYPE_FCC       0x00400
1891 #define RTYPE_VEC       0x00800
1892 #define RTYPE_GP        0x01000
1893 #define RTYPE_CP0       0x02000
1894 #define RTYPE_PC        0x04000
1895 #define RTYPE_ACC       0x08000
1896 #define RTYPE_CCC       0x10000
1897 #define RNUM_MASK       0x000ff
1898 #define RWARN           0x80000
1899
1900 #define GENERIC_REGISTER_NUMBERS \
1901     {"$0",      RTYPE_NUM | 0},  \
1902     {"$1",      RTYPE_NUM | 1},  \
1903     {"$2",      RTYPE_NUM | 2},  \
1904     {"$3",      RTYPE_NUM | 3},  \
1905     {"$4",      RTYPE_NUM | 4},  \
1906     {"$5",      RTYPE_NUM | 5},  \
1907     {"$6",      RTYPE_NUM | 6},  \
1908     {"$7",      RTYPE_NUM | 7},  \
1909     {"$8",      RTYPE_NUM | 8},  \
1910     {"$9",      RTYPE_NUM | 9},  \
1911     {"$10",     RTYPE_NUM | 10}, \
1912     {"$11",     RTYPE_NUM | 11}, \
1913     {"$12",     RTYPE_NUM | 12}, \
1914     {"$13",     RTYPE_NUM | 13}, \
1915     {"$14",     RTYPE_NUM | 14}, \
1916     {"$15",     RTYPE_NUM | 15}, \
1917     {"$16",     RTYPE_NUM | 16}, \
1918     {"$17",     RTYPE_NUM | 17}, \
1919     {"$18",     RTYPE_NUM | 18}, \
1920     {"$19",     RTYPE_NUM | 19}, \
1921     {"$20",     RTYPE_NUM | 20}, \
1922     {"$21",     RTYPE_NUM | 21}, \
1923     {"$22",     RTYPE_NUM | 22}, \
1924     {"$23",     RTYPE_NUM | 23}, \
1925     {"$24",     RTYPE_NUM | 24}, \
1926     {"$25",     RTYPE_NUM | 25}, \
1927     {"$26",     RTYPE_NUM | 26}, \
1928     {"$27",     RTYPE_NUM | 27}, \
1929     {"$28",     RTYPE_NUM | 28}, \
1930     {"$29",     RTYPE_NUM | 29}, \
1931     {"$30",     RTYPE_NUM | 30}, \
1932     {"$31",     RTYPE_NUM | 31} 
1933
1934 #define FPU_REGISTER_NAMES       \
1935     {"$f0",     RTYPE_FPU | 0},  \
1936     {"$f1",     RTYPE_FPU | 1},  \
1937     {"$f2",     RTYPE_FPU | 2},  \
1938     {"$f3",     RTYPE_FPU | 3},  \
1939     {"$f4",     RTYPE_FPU | 4},  \
1940     {"$f5",     RTYPE_FPU | 5},  \
1941     {"$f6",     RTYPE_FPU | 6},  \
1942     {"$f7",     RTYPE_FPU | 7},  \
1943     {"$f8",     RTYPE_FPU | 8},  \
1944     {"$f9",     RTYPE_FPU | 9},  \
1945     {"$f10",    RTYPE_FPU | 10}, \
1946     {"$f11",    RTYPE_FPU | 11}, \
1947     {"$f12",    RTYPE_FPU | 12}, \
1948     {"$f13",    RTYPE_FPU | 13}, \
1949     {"$f14",    RTYPE_FPU | 14}, \
1950     {"$f15",    RTYPE_FPU | 15}, \
1951     {"$f16",    RTYPE_FPU | 16}, \
1952     {"$f17",    RTYPE_FPU | 17}, \
1953     {"$f18",    RTYPE_FPU | 18}, \
1954     {"$f19",    RTYPE_FPU | 19}, \
1955     {"$f20",    RTYPE_FPU | 20}, \
1956     {"$f21",    RTYPE_FPU | 21}, \
1957     {"$f22",    RTYPE_FPU | 22}, \
1958     {"$f23",    RTYPE_FPU | 23}, \
1959     {"$f24",    RTYPE_FPU | 24}, \
1960     {"$f25",    RTYPE_FPU | 25}, \
1961     {"$f26",    RTYPE_FPU | 26}, \
1962     {"$f27",    RTYPE_FPU | 27}, \
1963     {"$f28",    RTYPE_FPU | 28}, \
1964     {"$f29",    RTYPE_FPU | 29}, \
1965     {"$f30",    RTYPE_FPU | 30}, \
1966     {"$f31",    RTYPE_FPU | 31}
1967
1968 #define FPU_CONDITION_CODE_NAMES \
1969     {"$fcc0",   RTYPE_FCC | 0},  \
1970     {"$fcc1",   RTYPE_FCC | 1},  \
1971     {"$fcc2",   RTYPE_FCC | 2},  \
1972     {"$fcc3",   RTYPE_FCC | 3},  \
1973     {"$fcc4",   RTYPE_FCC | 4},  \
1974     {"$fcc5",   RTYPE_FCC | 5},  \
1975     {"$fcc6",   RTYPE_FCC | 6},  \
1976     {"$fcc7",   RTYPE_FCC | 7}
1977
1978 #define COPROC_CONDITION_CODE_NAMES         \
1979     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1980     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1981     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1982     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1983     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1984     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1985     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1986     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1987
1988 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1989     {"$a4",     RTYPE_GP | 8},  \
1990     {"$a5",     RTYPE_GP | 9},  \
1991     {"$a6",     RTYPE_GP | 10}, \
1992     {"$a7",     RTYPE_GP | 11}, \
1993     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1994     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1995     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1996     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1997     {"$t0",     RTYPE_GP | 12}, \
1998     {"$t1",     RTYPE_GP | 13}, \
1999     {"$t2",     RTYPE_GP | 14}, \
2000     {"$t3",     RTYPE_GP | 15}
2001
2002 #define O32_SYMBOLIC_REGISTER_NAMES \
2003     {"$t0",     RTYPE_GP | 8},  \
2004     {"$t1",     RTYPE_GP | 9},  \
2005     {"$t2",     RTYPE_GP | 10}, \
2006     {"$t3",     RTYPE_GP | 11}, \
2007     {"$t4",     RTYPE_GP | 12}, \
2008     {"$t5",     RTYPE_GP | 13}, \
2009     {"$t6",     RTYPE_GP | 14}, \
2010     {"$t7",     RTYPE_GP | 15}, \
2011     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
2012     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
2013     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
2014     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */ 
2015
2016 /* Remaining symbolic register names */
2017 #define SYMBOLIC_REGISTER_NAMES \
2018     {"$zero",   RTYPE_GP | 0},  \
2019     {"$at",     RTYPE_GP | 1},  \
2020     {"$AT",     RTYPE_GP | 1},  \
2021     {"$v0",     RTYPE_GP | 2},  \
2022     {"$v1",     RTYPE_GP | 3},  \
2023     {"$a0",     RTYPE_GP | 4},  \
2024     {"$a1",     RTYPE_GP | 5},  \
2025     {"$a2",     RTYPE_GP | 6},  \
2026     {"$a3",     RTYPE_GP | 7},  \
2027     {"$s0",     RTYPE_GP | 16}, \
2028     {"$s1",     RTYPE_GP | 17}, \
2029     {"$s2",     RTYPE_GP | 18}, \
2030     {"$s3",     RTYPE_GP | 19}, \
2031     {"$s4",     RTYPE_GP | 20}, \
2032     {"$s5",     RTYPE_GP | 21}, \
2033     {"$s6",     RTYPE_GP | 22}, \
2034     {"$s7",     RTYPE_GP | 23}, \
2035     {"$t8",     RTYPE_GP | 24}, \
2036     {"$t9",     RTYPE_GP | 25}, \
2037     {"$k0",     RTYPE_GP | 26}, \
2038     {"$kt0",    RTYPE_GP | 26}, \
2039     {"$k1",     RTYPE_GP | 27}, \
2040     {"$kt1",    RTYPE_GP | 27}, \
2041     {"$gp",     RTYPE_GP | 28}, \
2042     {"$sp",     RTYPE_GP | 29}, \
2043     {"$s8",     RTYPE_GP | 30}, \
2044     {"$fp",     RTYPE_GP | 30}, \
2045     {"$ra",     RTYPE_GP | 31}
2046
2047 #define MIPS16_SPECIAL_REGISTER_NAMES \
2048     {"$pc",     RTYPE_PC | 0}
2049
2050 #define MDMX_VECTOR_REGISTER_NAMES \
2051     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
2052     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
2053     {"$v2",     RTYPE_VEC | 2},  \
2054     {"$v3",     RTYPE_VEC | 3},  \
2055     {"$v4",     RTYPE_VEC | 4},  \
2056     {"$v5",     RTYPE_VEC | 5},  \
2057     {"$v6",     RTYPE_VEC | 6},  \
2058     {"$v7",     RTYPE_VEC | 7},  \
2059     {"$v8",     RTYPE_VEC | 8},  \
2060     {"$v9",     RTYPE_VEC | 9},  \
2061     {"$v10",    RTYPE_VEC | 10}, \
2062     {"$v11",    RTYPE_VEC | 11}, \
2063     {"$v12",    RTYPE_VEC | 12}, \
2064     {"$v13",    RTYPE_VEC | 13}, \
2065     {"$v14",    RTYPE_VEC | 14}, \
2066     {"$v15",    RTYPE_VEC | 15}, \
2067     {"$v16",    RTYPE_VEC | 16}, \
2068     {"$v17",    RTYPE_VEC | 17}, \
2069     {"$v18",    RTYPE_VEC | 18}, \
2070     {"$v19",    RTYPE_VEC | 19}, \
2071     {"$v20",    RTYPE_VEC | 20}, \
2072     {"$v21",    RTYPE_VEC | 21}, \
2073     {"$v22",    RTYPE_VEC | 22}, \
2074     {"$v23",    RTYPE_VEC | 23}, \
2075     {"$v24",    RTYPE_VEC | 24}, \
2076     {"$v25",    RTYPE_VEC | 25}, \
2077     {"$v26",    RTYPE_VEC | 26}, \
2078     {"$v27",    RTYPE_VEC | 27}, \
2079     {"$v28",    RTYPE_VEC | 28}, \
2080     {"$v29",    RTYPE_VEC | 29}, \
2081     {"$v30",    RTYPE_VEC | 30}, \
2082     {"$v31",    RTYPE_VEC | 31}
2083
2084 #define MIPS_DSP_ACCUMULATOR_NAMES \
2085     {"$ac0",    RTYPE_ACC | 0}, \
2086     {"$ac1",    RTYPE_ACC | 1}, \
2087     {"$ac2",    RTYPE_ACC | 2}, \
2088     {"$ac3",    RTYPE_ACC | 3}
2089
2090 static const struct regname reg_names[] = {
2091   GENERIC_REGISTER_NUMBERS,
2092   FPU_REGISTER_NAMES,
2093   FPU_CONDITION_CODE_NAMES,
2094   COPROC_CONDITION_CODE_NAMES,
2095
2096   /* The $txx registers depends on the abi,
2097      these will be added later into the symbol table from
2098      one of the tables below once mips_abi is set after 
2099      parsing of arguments from the command line. */
2100   SYMBOLIC_REGISTER_NAMES,
2101
2102   MIPS16_SPECIAL_REGISTER_NAMES,
2103   MDMX_VECTOR_REGISTER_NAMES,
2104   MIPS_DSP_ACCUMULATOR_NAMES,
2105   {0, 0}
2106 };
2107
2108 static const struct regname reg_names_o32[] = {
2109   O32_SYMBOLIC_REGISTER_NAMES,
2110   {0, 0}
2111 };
2112
2113 static const struct regname reg_names_n32n64[] = {
2114   N32N64_SYMBOLIC_REGISTER_NAMES,
2115   {0, 0}
2116 };
2117
2118 /* Check if S points at a valid register specifier according to TYPES.
2119    If so, then return 1, advance S to consume the specifier and store
2120    the register's number in REGNOP, otherwise return 0.  */
2121
2122 static int
2123 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
2124 {
2125   symbolS *symbolP;
2126   char *e;
2127   char save_c;
2128   int reg = -1;
2129
2130   /* Find end of name.  */
2131   e = *s;
2132   if (is_name_beginner (*e))
2133     ++e;
2134   while (is_part_of_name (*e))
2135     ++e;
2136
2137   /* Terminate name.  */
2138   save_c = *e;
2139   *e = '\0';
2140
2141   /* Look for a register symbol.  */
2142   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
2143     {
2144       int r = S_GET_VALUE (symbolP);
2145       if (r & types)
2146         reg = r & RNUM_MASK;
2147       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
2148         /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
2149         reg = (r & RNUM_MASK) - 2;
2150     }
2151   /* Else see if this is a register defined in an itbl entry.  */
2152   else if ((types & RTYPE_GP) && itbl_have_entries)
2153     {
2154       char *n = *s;
2155       unsigned long r;
2156
2157       if (*n == '$')
2158         ++n;
2159       if (itbl_get_reg_val (n, &r))
2160         reg = r & RNUM_MASK;
2161     }
2162
2163   /* Advance to next token if a register was recognised.  */
2164   if (reg >= 0)
2165     *s = e;
2166   else if (types & RWARN)
2167     as_warn (_("Unrecognized register name `%s'"), *s);
2168
2169   *e = save_c;
2170   if (regnop)
2171     *regnop = reg;
2172   return reg >= 0;
2173 }
2174
2175 /* Check if S points at a valid register list according to TYPES.
2176    If so, then return 1, advance S to consume the list and store
2177    the registers present on the list as a bitmask of ones in REGLISTP,
2178    otherwise return 0.  A valid list comprises a comma-separated
2179    enumeration of valid single registers and/or dash-separated
2180    contiguous register ranges as determined by their numbers.
2181
2182    As a special exception if one of s0-s7 registers is specified as
2183    the range's lower delimiter and s8 (fp) is its upper one, then no
2184    registers whose numbers place them between s7 and s8 (i.e. $24-$29)
2185    are selected; they have to be listed separately if needed.  */
2186
2187 static int
2188 reglist_lookup (char **s, unsigned int types, unsigned int *reglistp)
2189 {
2190   unsigned int reglist = 0;
2191   unsigned int lastregno;
2192   bfd_boolean ok = TRUE;
2193   unsigned int regmask;
2194   char *s_endlist = *s;
2195   char *s_reset = *s;
2196   unsigned int regno;
2197
2198   while (reg_lookup (s, types, &regno))
2199     {
2200       lastregno = regno;
2201       if (**s == '-')
2202         {
2203           (*s)++;
2204           ok = reg_lookup (s, types, &lastregno);
2205           if (ok && lastregno < regno)
2206             ok = FALSE;
2207           if (!ok)
2208             break;
2209         }
2210
2211       if (lastregno == FP && regno >= S0 && regno <= S7)
2212         {
2213           lastregno = S7;
2214           reglist |= 1 << FP;
2215         }
2216       regmask = 1 << lastregno;
2217       regmask = (regmask << 1) - 1;
2218       regmask ^= (1 << regno) - 1;
2219       reglist |= regmask;
2220
2221       s_endlist = *s;
2222       if (**s != ',')
2223         break;
2224       (*s)++;
2225     }
2226
2227   if (ok)
2228     *s = s_endlist;
2229   else
2230     *s = s_reset;
2231   if (reglistp)
2232     *reglistp = reglist;
2233   return ok && reglist != 0;
2234 }
2235
2236 /* Return TRUE if opcode MO is valid on the currently selected ISA and
2237    architecture.  Use is_opcode_valid_16 for MIPS16 opcodes.  */
2238
2239 static bfd_boolean
2240 is_opcode_valid (const struct mips_opcode *mo)
2241 {
2242   int isa = mips_opts.isa;
2243   int fp_s, fp_d;
2244
2245   if (mips_opts.ase_mdmx)
2246     isa |= INSN_MDMX;
2247   if (mips_opts.ase_dsp)
2248     isa |= INSN_DSP;
2249   if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
2250     isa |= INSN_DSP64;
2251   if (mips_opts.ase_dspr2)
2252     isa |= INSN_DSPR2;
2253   if (mips_opts.ase_mt)
2254     isa |= INSN_MT;
2255   if (mips_opts.ase_mips3d)
2256     isa |= INSN_MIPS3D;
2257   if (mips_opts.ase_smartmips)
2258     isa |= INSN_SMARTMIPS;
2259   if (mips_opts.ase_mcu)
2260     isa |= INSN_MCU;
2261
2262   if (!opcode_is_member (mo, isa, mips_opts.arch))
2263     return FALSE;
2264
2265   /* Check whether the instruction or macro requires single-precision or
2266      double-precision floating-point support.  Note that this information is
2267      stored differently in the opcode table for insns and macros.  */
2268   if (mo->pinfo == INSN_MACRO)
2269     {
2270       fp_s = mo->pinfo2 & INSN2_M_FP_S;
2271       fp_d = mo->pinfo2 & INSN2_M_FP_D;
2272     }
2273   else
2274     {
2275       fp_s = mo->pinfo & FP_S;
2276       fp_d = mo->pinfo & FP_D;
2277     }
2278
2279   if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
2280     return FALSE;
2281
2282   if (fp_s && mips_opts.soft_float)
2283     return FALSE;
2284
2285   return TRUE;
2286 }
2287
2288 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
2289    selected ISA and architecture.  */
2290
2291 static bfd_boolean
2292 is_opcode_valid_16 (const struct mips_opcode *mo)
2293 {
2294   return opcode_is_member (mo, mips_opts.isa, mips_opts.arch);
2295 }
2296
2297 /* Return TRUE if the size of the microMIPS opcode MO matches one
2298    explicitly requested.  Always TRUE in the standard MIPS mode.  */
2299
2300 static bfd_boolean
2301 is_size_valid (const struct mips_opcode *mo)
2302 {
2303   if (!mips_opts.micromips)
2304     return TRUE;
2305
2306   if (!forced_insn_length)
2307     return TRUE;
2308   if (mo->pinfo == INSN_MACRO)
2309     return FALSE;
2310   return forced_insn_length == micromips_insn_length (mo);
2311 }
2312
2313 /* Return TRUE if the microMIPS opcode MO is valid for the delay slot
2314    of the preceding instruction.  Always TRUE in the standard MIPS mode.
2315
2316    We don't accept macros in 16-bit delay slots to avoid a case where
2317    a macro expansion fails because it relies on a preceding 32-bit real
2318    instruction to have matched and does not handle the operands correctly.
2319    The only macros that may expand to 16-bit instructions are JAL that
2320    cannot be placed in a delay slot anyway, and corner cases of BALIGN
2321    and BGT (that likewise cannot be placed in a delay slot) that decay to
2322    a NOP.  In all these cases the macros precede any corresponding real
2323    instruction definitions in the opcode table, so they will match in the
2324    second pass where the size of the delay slot is ignored and therefore
2325    produce correct code.  */
2326
2327 static bfd_boolean
2328 is_delay_slot_valid (const struct mips_opcode *mo)
2329 {
2330   if (!mips_opts.micromips)
2331     return TRUE;
2332
2333   if (mo->pinfo == INSN_MACRO)
2334     return (history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) == 0;
2335   if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
2336       && micromips_insn_length (mo) != 4)
2337     return FALSE;
2338   if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
2339       && micromips_insn_length (mo) != 2)
2340     return FALSE;
2341
2342   return TRUE;
2343 }
2344
2345 /* This function is called once, at assembler startup time.  It should set up
2346    all the tables, etc. that the MD part of the assembler will need.  */
2347
2348 void
2349 md_begin (void)
2350 {
2351   const char *retval = NULL;
2352   int i = 0;
2353   int broken = 0;
2354
2355   if (mips_pic != NO_PIC)
2356     {
2357       if (g_switch_seen && g_switch_value != 0)
2358         as_bad (_("-G may not be used in position-independent code"));
2359       g_switch_value = 0;
2360     }
2361
2362   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
2363     as_warn (_("Could not set architecture and machine"));
2364
2365   op_hash = hash_new ();
2366
2367   for (i = 0; i < NUMOPCODES;)
2368     {
2369       const char *name = mips_opcodes[i].name;
2370
2371       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
2372       if (retval != NULL)
2373         {
2374           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
2375                    mips_opcodes[i].name, retval);
2376           /* Probably a memory allocation problem?  Give up now.  */
2377           as_fatal (_("Broken assembler.  No assembly attempted."));
2378         }
2379       do
2380         {
2381           if (mips_opcodes[i].pinfo != INSN_MACRO)
2382             {
2383               if (!validate_mips_insn (&mips_opcodes[i]))
2384                 broken = 1;
2385               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2386                 {
2387                   create_insn (&nop_insn, mips_opcodes + i);
2388                   if (mips_fix_loongson2f_nop)
2389                     nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
2390                   nop_insn.fixed_p = 1;
2391                 }
2392             }
2393           ++i;
2394         }
2395       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
2396     }
2397
2398   mips16_op_hash = hash_new ();
2399
2400   i = 0;
2401   while (i < bfd_mips16_num_opcodes)
2402     {
2403       const char *name = mips16_opcodes[i].name;
2404
2405       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
2406       if (retval != NULL)
2407         as_fatal (_("internal: can't hash `%s': %s"),
2408                   mips16_opcodes[i].name, retval);
2409       do
2410         {
2411           if (mips16_opcodes[i].pinfo != INSN_MACRO
2412               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
2413                   != mips16_opcodes[i].match))
2414             {
2415               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
2416                        mips16_opcodes[i].name, mips16_opcodes[i].args);
2417               broken = 1;
2418             }
2419           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2420             {
2421               create_insn (&mips16_nop_insn, mips16_opcodes + i);
2422               mips16_nop_insn.fixed_p = 1;
2423             }
2424           ++i;
2425         }
2426       while (i < bfd_mips16_num_opcodes
2427              && strcmp (mips16_opcodes[i].name, name) == 0);
2428     }
2429
2430   micromips_op_hash = hash_new ();
2431
2432   i = 0;
2433   while (i < bfd_micromips_num_opcodes)
2434     {
2435       const char *name = micromips_opcodes[i].name;
2436
2437       retval = hash_insert (micromips_op_hash, name,
2438                             (void *) &micromips_opcodes[i]);
2439       if (retval != NULL)
2440         as_fatal (_("internal: can't hash `%s': %s"),
2441                   micromips_opcodes[i].name, retval);
2442       do
2443         if (micromips_opcodes[i].pinfo != INSN_MACRO)
2444           {
2445             struct mips_cl_insn *micromips_nop_insn;
2446
2447             if (!validate_micromips_insn (&micromips_opcodes[i]))
2448               broken = 1;
2449
2450             if (micromips_insn_length (micromips_opcodes + i) == 2)
2451               micromips_nop_insn = &micromips_nop16_insn;
2452             else if (micromips_insn_length (micromips_opcodes + i) == 4)
2453               micromips_nop_insn = &micromips_nop32_insn;
2454             else
2455               continue;
2456
2457             if (micromips_nop_insn->insn_mo == NULL
2458                 && strcmp (name, "nop") == 0)
2459               {
2460                 create_insn (micromips_nop_insn, micromips_opcodes + i);
2461                 micromips_nop_insn->fixed_p = 1;
2462               }
2463           }
2464       while (++i < bfd_micromips_num_opcodes
2465              && strcmp (micromips_opcodes[i].name, name) == 0);
2466     }
2467
2468   if (broken)
2469     as_fatal (_("Broken assembler.  No assembly attempted."));
2470
2471   /* We add all the general register names to the symbol table.  This
2472      helps us detect invalid uses of them.  */
2473   for (i = 0; reg_names[i].name; i++) 
2474     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
2475                                      reg_names[i].num, /* & RNUM_MASK, */
2476                                      &zero_address_frag));
2477   if (HAVE_NEWABI)
2478     for (i = 0; reg_names_n32n64[i].name; i++) 
2479       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
2480                                        reg_names_n32n64[i].num, /* & RNUM_MASK, */
2481                                        &zero_address_frag));
2482   else
2483     for (i = 0; reg_names_o32[i].name; i++) 
2484       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
2485                                        reg_names_o32[i].num, /* & RNUM_MASK, */
2486                                        &zero_address_frag));
2487
2488   mips_no_prev_insn ();
2489
2490   mips_gprmask = 0;
2491   mips_cprmask[0] = 0;
2492   mips_cprmask[1] = 0;
2493   mips_cprmask[2] = 0;
2494   mips_cprmask[3] = 0;
2495
2496   /* set the default alignment for the text section (2**2) */
2497   record_alignment (text_section, 2);
2498
2499   bfd_set_gp_size (stdoutput, g_switch_value);
2500
2501 #ifdef OBJ_ELF
2502   if (IS_ELF)
2503     {
2504       /* On a native system other than VxWorks, sections must be aligned
2505          to 16 byte boundaries.  When configured for an embedded ELF
2506          target, we don't bother.  */
2507       if (strncmp (TARGET_OS, "elf", 3) != 0
2508           && strncmp (TARGET_OS, "vxworks", 7) != 0)
2509         {
2510           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2511           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2512           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2513         }
2514
2515       /* Create a .reginfo section for register masks and a .mdebug
2516          section for debugging information.  */
2517       {
2518         segT seg;
2519         subsegT subseg;
2520         flagword flags;
2521         segT sec;
2522
2523         seg = now_seg;
2524         subseg = now_subseg;
2525
2526         /* The ABI says this section should be loaded so that the
2527            running program can access it.  However, we don't load it
2528            if we are configured for an embedded target */
2529         flags = SEC_READONLY | SEC_DATA;
2530         if (strncmp (TARGET_OS, "elf", 3) != 0)
2531           flags |= SEC_ALLOC | SEC_LOAD;
2532
2533         if (mips_abi != N64_ABI)
2534           {
2535             sec = subseg_new (".reginfo", (subsegT) 0);
2536
2537             bfd_set_section_flags (stdoutput, sec, flags);
2538             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2539
2540             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2541           }
2542         else
2543           {
2544             /* The 64-bit ABI uses a .MIPS.options section rather than
2545                .reginfo section.  */
2546             sec = subseg_new (".MIPS.options", (subsegT) 0);
2547             bfd_set_section_flags (stdoutput, sec, flags);
2548             bfd_set_section_alignment (stdoutput, sec, 3);
2549
2550             /* Set up the option header.  */
2551             {
2552               Elf_Internal_Options opthdr;
2553               char *f;
2554
2555               opthdr.kind = ODK_REGINFO;
2556               opthdr.size = (sizeof (Elf_External_Options)
2557                              + sizeof (Elf64_External_RegInfo));
2558               opthdr.section = 0;
2559               opthdr.info = 0;
2560               f = frag_more (sizeof (Elf_External_Options));
2561               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2562                                              (Elf_External_Options *) f);
2563
2564               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2565             }
2566           }
2567
2568         if (ECOFF_DEBUGGING)
2569           {
2570             sec = subseg_new (".mdebug", (subsegT) 0);
2571             (void) bfd_set_section_flags (stdoutput, sec,
2572                                           SEC_HAS_CONTENTS | SEC_READONLY);
2573             (void) bfd_set_section_alignment (stdoutput, sec, 2);
2574           }
2575         else if (mips_flag_pdr)
2576           {
2577             pdr_seg = subseg_new (".pdr", (subsegT) 0);
2578             (void) bfd_set_section_flags (stdoutput, pdr_seg,
2579                                           SEC_READONLY | SEC_RELOC
2580                                           | SEC_DEBUGGING);
2581             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2582           }
2583
2584         subseg_set (seg, subseg);
2585       }
2586     }
2587 #endif /* OBJ_ELF */
2588
2589   if (! ECOFF_DEBUGGING)
2590     md_obj_begin ();
2591
2592   if (mips_fix_vr4120)
2593     init_vr4120_conflicts ();
2594 }
2595
2596 void
2597 md_mips_end (void)
2598 {
2599   mips_emit_delays ();
2600   if (! ECOFF_DEBUGGING)
2601     md_obj_end ();
2602 }
2603
2604 void
2605 md_assemble (char *str)
2606 {
2607   struct mips_cl_insn insn;
2608   bfd_reloc_code_real_type unused_reloc[3]
2609     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2610
2611   imm_expr.X_op = O_absent;
2612   imm2_expr.X_op = O_absent;
2613   offset_expr.X_op = O_absent;
2614   imm_reloc[0] = BFD_RELOC_UNUSED;
2615   imm_reloc[1] = BFD_RELOC_UNUSED;
2616   imm_reloc[2] = BFD_RELOC_UNUSED;
2617   offset_reloc[0] = BFD_RELOC_UNUSED;
2618   offset_reloc[1] = BFD_RELOC_UNUSED;
2619   offset_reloc[2] = BFD_RELOC_UNUSED;
2620
2621   mips_mark_labels ();
2622   mips_assembling_insn = TRUE;
2623
2624   if (mips_opts.mips16)
2625     mips16_ip (str, &insn);
2626   else
2627     {
2628       mips_ip (str, &insn);
2629       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2630             str, insn.insn_opcode));
2631     }
2632
2633   if (insn_error)
2634     as_bad ("%s `%s'", insn_error, str);
2635   else if (insn.insn_mo->pinfo == INSN_MACRO)
2636     {
2637       macro_start ();
2638       if (mips_opts.mips16)
2639         mips16_macro (&insn);
2640       else
2641         macro (&insn);
2642       macro_end ();
2643     }
2644   else
2645     {
2646       if (imm_expr.X_op != O_absent)
2647         append_insn (&insn, &imm_expr, imm_reloc, FALSE);
2648       else if (offset_expr.X_op != O_absent)
2649         append_insn (&insn, &offset_expr, offset_reloc, FALSE);
2650       else
2651         append_insn (&insn, NULL, unused_reloc, FALSE);
2652     }
2653
2654   mips_assembling_insn = FALSE;
2655 }
2656
2657 /* Convenience functions for abstracting away the differences between
2658    MIPS16 and non-MIPS16 relocations.  */
2659
2660 static inline bfd_boolean
2661 mips16_reloc_p (bfd_reloc_code_real_type reloc)
2662 {
2663   switch (reloc)
2664     {
2665     case BFD_RELOC_MIPS16_JMP:
2666     case BFD_RELOC_MIPS16_GPREL:
2667     case BFD_RELOC_MIPS16_GOT16:
2668     case BFD_RELOC_MIPS16_CALL16:
2669     case BFD_RELOC_MIPS16_HI16_S:
2670     case BFD_RELOC_MIPS16_HI16:
2671     case BFD_RELOC_MIPS16_LO16:
2672       return TRUE;
2673
2674     default:
2675       return FALSE;
2676     }
2677 }
2678
2679 static inline bfd_boolean
2680 micromips_reloc_p (bfd_reloc_code_real_type reloc)
2681 {
2682   switch (reloc)
2683     {
2684     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
2685     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
2686     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
2687     case BFD_RELOC_MICROMIPS_GPREL16:
2688     case BFD_RELOC_MICROMIPS_JMP:
2689     case BFD_RELOC_MICROMIPS_HI16:
2690     case BFD_RELOC_MICROMIPS_HI16_S:
2691     case BFD_RELOC_MICROMIPS_LO16:
2692     case BFD_RELOC_MICROMIPS_LITERAL:
2693     case BFD_RELOC_MICROMIPS_GOT16:
2694     case BFD_RELOC_MICROMIPS_CALL16:
2695     case BFD_RELOC_MICROMIPS_GOT_HI16:
2696     case BFD_RELOC_MICROMIPS_GOT_LO16:
2697     case BFD_RELOC_MICROMIPS_CALL_HI16:
2698     case BFD_RELOC_MICROMIPS_CALL_LO16:
2699     case BFD_RELOC_MICROMIPS_SUB:
2700     case BFD_RELOC_MICROMIPS_GOT_PAGE:
2701     case BFD_RELOC_MICROMIPS_GOT_OFST:
2702     case BFD_RELOC_MICROMIPS_GOT_DISP:
2703     case BFD_RELOC_MICROMIPS_HIGHEST:
2704     case BFD_RELOC_MICROMIPS_HIGHER:
2705     case BFD_RELOC_MICROMIPS_SCN_DISP:
2706     case BFD_RELOC_MICROMIPS_JALR:
2707       return TRUE;
2708
2709     default:
2710       return FALSE;
2711     }
2712 }
2713
2714 static inline bfd_boolean
2715 jmp_reloc_p (bfd_reloc_code_real_type reloc)
2716 {
2717   return reloc == BFD_RELOC_MIPS_JMP || reloc == BFD_RELOC_MICROMIPS_JMP;
2718 }
2719
2720 static inline bfd_boolean
2721 got16_reloc_p (bfd_reloc_code_real_type reloc)
2722 {
2723   return (reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16
2724           || reloc == BFD_RELOC_MICROMIPS_GOT16);
2725 }
2726
2727 static inline bfd_boolean
2728 hi16_reloc_p (bfd_reloc_code_real_type reloc)
2729 {
2730   return (reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S
2731           || reloc == BFD_RELOC_MICROMIPS_HI16_S);
2732 }
2733
2734 static inline bfd_boolean
2735 lo16_reloc_p (bfd_reloc_code_real_type reloc)
2736 {
2737   return (reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16
2738           || reloc == BFD_RELOC_MICROMIPS_LO16);
2739 }
2740
2741 static inline bfd_boolean
2742 jalr_reloc_p (bfd_reloc_code_real_type reloc)
2743 {
2744   return reloc == BFD_RELOC_MIPS_JALR || reloc == BFD_RELOC_MICROMIPS_JALR;
2745 }
2746
2747 /* Return true if RELOC is a PC-relative relocation that does not have
2748    full address range.  */
2749
2750 static inline bfd_boolean
2751 limited_pcrel_reloc_p (bfd_reloc_code_real_type reloc)
2752 {
2753   switch (reloc)
2754     {
2755     case BFD_RELOC_16_PCREL_S2:
2756     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
2757     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
2758     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
2759       return TRUE;
2760
2761     case BFD_RELOC_32_PCREL:
2762       return HAVE_64BIT_ADDRESSES;
2763
2764     default:
2765       return FALSE;
2766     }
2767 }
2768
2769 /* Return true if the given relocation might need a matching %lo().
2770    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2771    need a matching %lo() when applied to local symbols.  */
2772
2773 static inline bfd_boolean
2774 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2775 {
2776   return (HAVE_IN_PLACE_ADDENDS
2777           && (hi16_reloc_p (reloc)
2778               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2779                  all GOT16 relocations evaluate to "G".  */
2780               || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2781 }
2782
2783 /* Return the type of %lo() reloc needed by RELOC, given that
2784    reloc_needs_lo_p.  */
2785
2786 static inline bfd_reloc_code_real_type
2787 matching_lo_reloc (bfd_reloc_code_real_type reloc)
2788 {
2789   return (mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16
2790           : (micromips_reloc_p (reloc) ? BFD_RELOC_MICROMIPS_LO16
2791              : BFD_RELOC_LO16));
2792 }
2793
2794 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2795    relocation.  */
2796
2797 static inline bfd_boolean
2798 fixup_has_matching_lo_p (fixS *fixp)
2799 {
2800   return (fixp->fx_next != NULL
2801           && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
2802           && fixp->fx_addsy == fixp->fx_next->fx_addsy
2803           && fixp->fx_offset == fixp->fx_next->fx_offset);
2804 }
2805
2806 /* This function returns true if modifying a register requires a
2807    delay.  */
2808
2809 static int
2810 reg_needs_delay (unsigned int reg)
2811 {
2812   unsigned long prev_pinfo;
2813
2814   prev_pinfo = history[0].insn_mo->pinfo;
2815   if (! mips_opts.noreorder
2816       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2817            && ! gpr_interlocks)
2818           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2819               && ! cop_interlocks)))
2820     {
2821       /* A load from a coprocessor or from memory.  All load delays
2822          delay the use of general register rt for one instruction.  */
2823       /* Itbl support may require additional care here.  */
2824       know (prev_pinfo & INSN_WRITE_GPR_T);
2825       if (reg == EXTRACT_OPERAND (mips_opts.micromips, RT, history[0]))
2826         return 1;
2827     }
2828
2829   return 0;
2830 }
2831
2832 /* Move all labels in LABELS to the current insertion point.  TEXT_P
2833    says whether the labels refer to text or data.  */
2834
2835 static void
2836 mips_move_labels (struct insn_label_list *labels, bfd_boolean text_p)
2837 {
2838   struct insn_label_list *l;
2839   valueT val;
2840
2841   for (l = labels; l != NULL; l = l->next)
2842     {
2843       gas_assert (S_GET_SEGMENT (l->label) == now_seg);
2844       symbol_set_frag (l->label, frag_now);
2845       val = (valueT) frag_now_fix ();
2846       /* MIPS16/microMIPS text labels are stored as odd.  */
2847       if (text_p && HAVE_CODE_COMPRESSION)
2848         ++val;
2849       S_SET_VALUE (l->label, val);
2850     }
2851 }
2852
2853 /* Move all labels in insn_labels to the current insertion point
2854    and treat them as text labels.  */
2855
2856 static void
2857 mips_move_text_labels (void)
2858 {
2859   mips_move_labels (seg_info (now_seg)->label_list, TRUE);
2860 }
2861
2862 static bfd_boolean
2863 s_is_linkonce (symbolS *sym, segT from_seg)
2864 {
2865   bfd_boolean linkonce = FALSE;
2866   segT symseg = S_GET_SEGMENT (sym);
2867
2868   if (symseg != from_seg && !S_IS_LOCAL (sym))
2869     {
2870       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2871         linkonce = TRUE;
2872 #ifdef OBJ_ELF
2873       /* The GNU toolchain uses an extension for ELF: a section
2874          beginning with the magic string .gnu.linkonce is a
2875          linkonce section.  */
2876       if (strncmp (segment_name (symseg), ".gnu.linkonce",
2877                    sizeof ".gnu.linkonce" - 1) == 0)
2878         linkonce = TRUE;
2879 #endif
2880     }
2881   return linkonce;
2882 }
2883
2884 /* Mark MIPS16 or microMIPS instruction label LABEL.  This permits the
2885    linker to handle them specially, such as generating jalx instructions
2886    when needed.  We also make them odd for the duration of the assembly,
2887    in order to generate the right sort of code.  We will make them even
2888    in the adjust_symtab routine, while leaving them marked.  This is
2889    convenient for the debugger and the disassembler.  The linker knows
2890    to make them odd again.  */
2891
2892 static void
2893 mips_compressed_mark_label (symbolS *label)
2894 {
2895   gas_assert (HAVE_CODE_COMPRESSION);
2896
2897 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2898   if (IS_ELF)
2899     {
2900       if (mips_opts.mips16)
2901         S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2902       else
2903         S_SET_OTHER (label, ELF_ST_SET_MICROMIPS (S_GET_OTHER (label)));
2904     }
2905 #endif
2906   if ((S_GET_VALUE (label) & 1) == 0
2907       /* Don't adjust the address if the label is global or weak, or
2908          in a link-once section, since we'll be emitting symbol reloc
2909          references to it which will be patched up by the linker, and
2910          the final value of the symbol may or may not be MIPS16/microMIPS.  */
2911       && !S_IS_WEAK (label)
2912       && !S_IS_EXTERNAL (label)
2913       && !s_is_linkonce (label, now_seg))
2914     S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2915 }
2916
2917 /* Mark preceding MIPS16 or microMIPS instruction labels.  */
2918
2919 static void
2920 mips_compressed_mark_labels (void)
2921 {
2922   struct insn_label_list *l;
2923
2924   for (l = seg_info (now_seg)->label_list; l != NULL; l = l->next)
2925     mips_compressed_mark_label (l->label);
2926 }
2927
2928 /* End the current frag.  Make it a variant frag and record the
2929    relaxation info.  */
2930
2931 static void
2932 relax_close_frag (void)
2933 {
2934   mips_macro_warning.first_frag = frag_now;
2935   frag_var (rs_machine_dependent, 0, 0,
2936             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2937             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2938
2939   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2940   mips_relax.first_fixup = 0;
2941 }
2942
2943 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2944    See the comment above RELAX_ENCODE for more details.  */
2945
2946 static void
2947 relax_start (symbolS *symbol)
2948 {
2949   gas_assert (mips_relax.sequence == 0);
2950   mips_relax.sequence = 1;
2951   mips_relax.symbol = symbol;
2952 }
2953
2954 /* Start generating the second version of a relaxable sequence.
2955    See the comment above RELAX_ENCODE for more details.  */
2956
2957 static void
2958 relax_switch (void)
2959 {
2960   gas_assert (mips_relax.sequence == 1);
2961   mips_relax.sequence = 2;
2962 }
2963
2964 /* End the current relaxable sequence.  */
2965
2966 static void
2967 relax_end (void)
2968 {
2969   gas_assert (mips_relax.sequence == 2);
2970   relax_close_frag ();
2971   mips_relax.sequence = 0;
2972 }
2973
2974 /* Return true if IP is a delayed branch or jump.  */
2975
2976 static inline bfd_boolean
2977 delayed_branch_p (const struct mips_cl_insn *ip)
2978 {
2979   return (ip->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2980                                 | INSN_COND_BRANCH_DELAY
2981                                 | INSN_COND_BRANCH_LIKELY)) != 0;
2982 }
2983
2984 /* Return true if IP is a compact branch or jump.  */
2985
2986 static inline bfd_boolean
2987 compact_branch_p (const struct mips_cl_insn *ip)
2988 {
2989   if (mips_opts.mips16)
2990     return (ip->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
2991                                   | MIPS16_INSN_COND_BRANCH)) != 0;
2992   else
2993     return (ip->insn_mo->pinfo2 & (INSN2_UNCOND_BRANCH
2994                                    | INSN2_COND_BRANCH)) != 0;
2995 }
2996
2997 /* Return true if IP is an unconditional branch or jump.  */
2998
2999 static inline bfd_boolean
3000 uncond_branch_p (const struct mips_cl_insn *ip)
3001 {
3002   return ((ip->insn_mo->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0
3003           || (mips_opts.mips16
3004               ? (ip->insn_mo->pinfo & MIPS16_INSN_UNCOND_BRANCH) != 0
3005               : (ip->insn_mo->pinfo2 & INSN2_UNCOND_BRANCH) != 0));
3006 }
3007
3008 /* Return true if IP is a branch-likely instruction.  */
3009
3010 static inline bfd_boolean
3011 branch_likely_p (const struct mips_cl_insn *ip)
3012 {
3013   return (ip->insn_mo->pinfo & INSN_COND_BRANCH_LIKELY) != 0;
3014 }
3015
3016 /* Return the type of nop that should be used to fill the delay slot
3017    of delayed branch IP.  */
3018
3019 static struct mips_cl_insn *
3020 get_delay_slot_nop (const struct mips_cl_insn *ip)
3021 {
3022   if (mips_opts.micromips
3023       && (ip->insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
3024     return &micromips_nop32_insn;
3025   return NOP_INSN;
3026 }
3027
3028 /* Return the mask of core registers that IP reads or writes.  */
3029
3030 static unsigned int
3031 gpr_mod_mask (const struct mips_cl_insn *ip)
3032 {
3033   unsigned long pinfo2;
3034   unsigned int mask;
3035
3036   mask = 0;
3037   pinfo2 = ip->insn_mo->pinfo2;
3038   if (mips_opts.micromips)
3039     {
3040       if (pinfo2 & INSN2_MOD_GPR_MD)
3041         mask |= 1 << micromips_to_32_reg_d_map[EXTRACT_OPERAND (1, MD, *ip)];
3042       if (pinfo2 & INSN2_MOD_GPR_MF)
3043         mask |= 1 << micromips_to_32_reg_f_map[EXTRACT_OPERAND (1, MF, *ip)];
3044       if (pinfo2 & INSN2_MOD_SP)
3045         mask |= 1 << SP;
3046     }
3047   return mask;
3048 }
3049
3050 /* Return the mask of core registers that IP reads.  */
3051
3052 static unsigned int
3053 gpr_read_mask (const struct mips_cl_insn *ip)
3054 {
3055   unsigned long pinfo, pinfo2;
3056   unsigned int mask;
3057
3058   mask = gpr_mod_mask (ip);
3059   pinfo = ip->insn_mo->pinfo;
3060   pinfo2 = ip->insn_mo->pinfo2;
3061   if (mips_opts.mips16)
3062     {
3063       if (pinfo & MIPS16_INSN_READ_X)
3064         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
3065       if (pinfo & MIPS16_INSN_READ_Y)
3066         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
3067       if (pinfo & MIPS16_INSN_READ_T)
3068         mask |= 1 << TREG;
3069       if (pinfo & MIPS16_INSN_READ_SP)
3070         mask |= 1 << SP;
3071       if (pinfo & MIPS16_INSN_READ_31)
3072         mask |= 1 << RA;
3073       if (pinfo & MIPS16_INSN_READ_Z)
3074         mask |= 1 << (mips16_to_32_reg_map
3075                       [MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]);
3076       if (pinfo & MIPS16_INSN_READ_GPR_X)
3077         mask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3078     }
3079   else
3080     {
3081       if (pinfo2 & INSN2_READ_GPR_D)
3082         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
3083       if (pinfo & INSN_READ_GPR_T)
3084         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
3085       if (pinfo & INSN_READ_GPR_S)
3086         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
3087       if (pinfo2 & INSN2_READ_GP)
3088         mask |= 1 << GP;
3089       if (pinfo2 & INSN2_READ_GPR_31)
3090         mask |= 1 << RA;
3091       if (pinfo2 & INSN2_READ_GPR_Z)
3092         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3093     }
3094   if (mips_opts.micromips)
3095     {
3096       if (pinfo2 & INSN2_READ_GPR_MC)
3097         mask |= 1 << micromips_to_32_reg_c_map[EXTRACT_OPERAND (1, MC, *ip)];
3098       if (pinfo2 & INSN2_READ_GPR_ME)
3099         mask |= 1 << micromips_to_32_reg_e_map[EXTRACT_OPERAND (1, ME, *ip)];
3100       if (pinfo2 & INSN2_READ_GPR_MG)
3101         mask |= 1 << micromips_to_32_reg_g_map[EXTRACT_OPERAND (1, MG, *ip)];
3102       if (pinfo2 & INSN2_READ_GPR_MJ)
3103         mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3104       if (pinfo2 & INSN2_READ_GPR_MMN)
3105         {
3106           mask |= 1 << micromips_to_32_reg_m_map[EXTRACT_OPERAND (1, MM, *ip)];
3107           mask |= 1 << micromips_to_32_reg_n_map[EXTRACT_OPERAND (1, MN, *ip)];
3108         }
3109       if (pinfo2 & INSN2_READ_GPR_MP)
3110         mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3111       if (pinfo2 & INSN2_READ_GPR_MQ)
3112         mask |= 1 << micromips_to_32_reg_q_map[EXTRACT_OPERAND (1, MQ, *ip)];
3113     }
3114   /* Don't include register 0.  */
3115   return mask & ~1;
3116 }
3117
3118 /* Return the mask of core registers that IP writes.  */
3119
3120 static unsigned int
3121 gpr_write_mask (const struct mips_cl_insn *ip)
3122 {
3123   unsigned long pinfo, pinfo2;
3124   unsigned int mask;
3125
3126   mask = gpr_mod_mask (ip);
3127   pinfo = ip->insn_mo->pinfo;
3128   pinfo2 = ip->insn_mo->pinfo2;
3129   if (mips_opts.mips16)
3130     {
3131       if (pinfo & MIPS16_INSN_WRITE_X)
3132         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
3133       if (pinfo & MIPS16_INSN_WRITE_Y)
3134         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
3135       if (pinfo & MIPS16_INSN_WRITE_Z)
3136         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RZ, *ip)];
3137       if (pinfo & MIPS16_INSN_WRITE_T)
3138         mask |= 1 << TREG;
3139       if (pinfo & MIPS16_INSN_WRITE_SP)
3140         mask |= 1 << SP;
3141       if (pinfo & MIPS16_INSN_WRITE_31)
3142         mask |= 1 << RA;
3143       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3144         mask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3145     }
3146   else
3147     {
3148       if (pinfo & INSN_WRITE_GPR_D)
3149         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
3150       if (pinfo & INSN_WRITE_GPR_T)
3151         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
3152       if (pinfo & INSN_WRITE_GPR_S)
3153         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
3154       if (pinfo & INSN_WRITE_GPR_31)
3155         mask |= 1 << RA;
3156       if (pinfo2 & INSN2_WRITE_GPR_Z)
3157         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3158     }
3159   if (mips_opts.micromips)
3160     {
3161       if (pinfo2 & INSN2_WRITE_GPR_MB)
3162         mask |= 1 << micromips_to_32_reg_b_map[EXTRACT_OPERAND (1, MB, *ip)];
3163       if (pinfo2 & INSN2_WRITE_GPR_MHI)
3164         {
3165           mask |= 1 << micromips_to_32_reg_h_map[EXTRACT_OPERAND (1, MH, *ip)];
3166           mask |= 1 << micromips_to_32_reg_i_map[EXTRACT_OPERAND (1, MI, *ip)];
3167         }
3168       if (pinfo2 & INSN2_WRITE_GPR_MJ)
3169         mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3170       if (pinfo2 & INSN2_WRITE_GPR_MP)
3171         mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3172     }
3173   /* Don't include register 0.  */
3174   return mask & ~1;
3175 }
3176
3177 /* Return the mask of floating-point registers that IP reads.  */
3178
3179 static unsigned int
3180 fpr_read_mask (const struct mips_cl_insn *ip)
3181 {
3182   unsigned long pinfo, pinfo2;
3183   unsigned int mask;
3184
3185   mask = 0;
3186   pinfo = ip->insn_mo->pinfo;
3187   pinfo2 = ip->insn_mo->pinfo2;
3188   if (!mips_opts.mips16)
3189     {
3190       if (pinfo2 & INSN2_READ_FPR_D)
3191         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3192       if (pinfo & INSN_READ_FPR_S)
3193         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3194       if (pinfo & INSN_READ_FPR_T)
3195         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3196       if (pinfo & INSN_READ_FPR_R)
3197         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FR, *ip);
3198       if (pinfo2 & INSN2_READ_FPR_Z)
3199         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3200     }
3201   /* Conservatively treat all operands to an FP_D instruction are doubles.
3202      (This is overly pessimistic for things like cvt.d.s.)  */
3203   if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3204     mask |= mask << 1;
3205   return mask;
3206 }
3207
3208 /* Return the mask of floating-point registers that IP writes.  */
3209
3210 static unsigned int
3211 fpr_write_mask (const struct mips_cl_insn *ip)
3212 {
3213   unsigned long pinfo, pinfo2;
3214   unsigned int mask;
3215
3216   mask = 0;
3217   pinfo = ip->insn_mo->pinfo;
3218   pinfo2 = ip->insn_mo->pinfo2;
3219   if (!mips_opts.mips16)
3220     {
3221       if (pinfo & INSN_WRITE_FPR_D)
3222         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3223       if (pinfo & INSN_WRITE_FPR_S)
3224         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3225       if (pinfo & INSN_WRITE_FPR_T)
3226         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3227       if (pinfo2 & INSN2_WRITE_FPR_Z)
3228         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3229     }
3230   /* Conservatively treat all operands to an FP_D instruction are doubles.
3231      (This is overly pessimistic for things like cvt.s.d.)  */
3232   if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3233     mask |= mask << 1;
3234   return mask;
3235 }
3236
3237 /* Classify an instruction according to the FIX_VR4120_* enumeration.
3238    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
3239    by VR4120 errata.  */
3240
3241 static unsigned int
3242 classify_vr4120_insn (const char *name)
3243 {
3244   if (strncmp (name, "macc", 4) == 0)
3245     return FIX_VR4120_MACC;
3246   if (strncmp (name, "dmacc", 5) == 0)
3247     return FIX_VR4120_DMACC;
3248   if (strncmp (name, "mult", 4) == 0)
3249     return FIX_VR4120_MULT;
3250   if (strncmp (name, "dmult", 5) == 0)
3251     return FIX_VR4120_DMULT;
3252   if (strstr (name, "div"))
3253     return FIX_VR4120_DIV;
3254   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
3255     return FIX_VR4120_MTHILO;
3256   return NUM_FIX_VR4120_CLASSES;
3257 }
3258
3259 #define INSN_ERET  0x42000018
3260 #define INSN_DERET 0x4200001f
3261
3262 /* Return the number of instructions that must separate INSN1 and INSN2,
3263    where INSN1 is the earlier instruction.  Return the worst-case value
3264    for any INSN2 if INSN2 is null.  */
3265
3266 static unsigned int
3267 insns_between (const struct mips_cl_insn *insn1,
3268                const struct mips_cl_insn *insn2)
3269 {
3270   unsigned long pinfo1, pinfo2;
3271   unsigned int mask;
3272
3273   /* This function needs to know which pinfo flags are set for INSN2
3274      and which registers INSN2 uses.  The former is stored in PINFO2 and
3275      the latter is tested via INSN2_USES_GPR.  If INSN2 is null, PINFO2
3276      will have every flag set and INSN2_USES_GPR will always return true.  */
3277   pinfo1 = insn1->insn_mo->pinfo;
3278   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
3279
3280 #define INSN2_USES_GPR(REG) \
3281   (insn2 == NULL || (gpr_read_mask (insn2) & (1U << (REG))) != 0)
3282
3283   /* For most targets, write-after-read dependencies on the HI and LO
3284      registers must be separated by at least two instructions.  */
3285   if (!hilo_interlocks)
3286     {
3287       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
3288         return 2;
3289       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
3290         return 2;
3291     }
3292
3293   /* If we're working around r7000 errata, there must be two instructions
3294      between an mfhi or mflo and any instruction that uses the result.  */
3295   if (mips_7000_hilo_fix
3296       && !mips_opts.micromips
3297       && MF_HILO_INSN (pinfo1)
3298       && INSN2_USES_GPR (EXTRACT_OPERAND (0, RD, *insn1)))
3299     return 2;
3300
3301   /* If we're working around 24K errata, one instruction is required
3302      if an ERET or DERET is followed by a branch instruction.  */
3303   if (mips_fix_24k && !mips_opts.micromips)
3304     {
3305       if (insn1->insn_opcode == INSN_ERET
3306           || insn1->insn_opcode == INSN_DERET)
3307         {
3308           if (insn2 == NULL
3309               || insn2->insn_opcode == INSN_ERET
3310               || insn2->insn_opcode == INSN_DERET
3311               || delayed_branch_p (insn2))
3312             return 1;
3313         }
3314     }
3315
3316   /* If working around VR4120 errata, check for combinations that need
3317      a single intervening instruction.  */
3318   if (mips_fix_vr4120 && !mips_opts.micromips)
3319     {
3320       unsigned int class1, class2;
3321
3322       class1 = classify_vr4120_insn (insn1->insn_mo->name);
3323       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
3324         {
3325           if (insn2 == NULL)
3326             return 1;
3327           class2 = classify_vr4120_insn (insn2->insn_mo->name);
3328           if (vr4120_conflicts[class1] & (1 << class2))
3329             return 1;
3330         }
3331     }
3332
3333   if (!HAVE_CODE_COMPRESSION)
3334     {
3335       /* Check for GPR or coprocessor load delays.  All such delays
3336          are on the RT register.  */
3337       /* Itbl support may require additional care here.  */
3338       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
3339           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
3340         {
3341           know (pinfo1 & INSN_WRITE_GPR_T);
3342           if (INSN2_USES_GPR (EXTRACT_OPERAND (0, RT, *insn1)))
3343             return 1;
3344         }
3345
3346       /* Check for generic coprocessor hazards.
3347
3348          This case is not handled very well.  There is no special
3349          knowledge of CP0 handling, and the coprocessors other than
3350          the floating point unit are not distinguished at all.  */
3351       /* Itbl support may require additional care here. FIXME!
3352          Need to modify this to include knowledge about
3353          user specified delays!  */
3354       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
3355                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
3356         {
3357           /* Handle cases where INSN1 writes to a known general coprocessor
3358              register.  There must be a one instruction delay before INSN2
3359              if INSN2 reads that register, otherwise no delay is needed.  */
3360           mask = fpr_write_mask (insn1);
3361           if (mask != 0)
3362             {
3363               if (!insn2 || (mask & fpr_read_mask (insn2)) != 0)
3364                 return 1;
3365             }
3366           else
3367             {
3368               /* Read-after-write dependencies on the control registers
3369                  require a two-instruction gap.  */
3370               if ((pinfo1 & INSN_WRITE_COND_CODE)
3371                   && (pinfo2 & INSN_READ_COND_CODE))
3372                 return 2;
3373
3374               /* We don't know exactly what INSN1 does.  If INSN2 is
3375                  also a coprocessor instruction, assume there must be
3376                  a one instruction gap.  */
3377               if (pinfo2 & INSN_COP)
3378                 return 1;
3379             }
3380         }
3381
3382       /* Check for read-after-write dependencies on the coprocessor
3383          control registers in cases where INSN1 does not need a general
3384          coprocessor delay.  This means that INSN1 is a floating point
3385          comparison instruction.  */
3386       /* Itbl support may require additional care here.  */
3387       else if (!cop_interlocks
3388                && (pinfo1 & INSN_WRITE_COND_CODE)
3389                && (pinfo2 & INSN_READ_COND_CODE))
3390         return 1;
3391     }
3392
3393 #undef INSN2_USES_GPR
3394
3395   return 0;
3396 }
3397
3398 /* Return the number of nops that would be needed to work around the
3399    VR4130 mflo/mfhi errata if instruction INSN immediately followed
3400    the MAX_VR4130_NOPS instructions described by HIST.  Ignore hazards
3401    that are contained within the first IGNORE instructions of HIST.  */
3402
3403 static int
3404 nops_for_vr4130 (int ignore, const struct mips_cl_insn *hist,
3405                  const struct mips_cl_insn *insn)
3406 {
3407   int i, j;
3408   unsigned int mask;
3409
3410   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
3411      are not affected by the errata.  */
3412   if (insn != 0
3413       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
3414           || strcmp (insn->insn_mo->name, "mtlo") == 0
3415           || strcmp (insn->insn_mo->name, "mthi") == 0))
3416     return 0;
3417
3418   /* Search for the first MFLO or MFHI.  */
3419   for (i = 0; i < MAX_VR4130_NOPS; i++)
3420     if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
3421       {
3422         /* Extract the destination register.  */
3423         mask = gpr_write_mask (&hist[i]);
3424
3425         /* No nops are needed if INSN reads that register.  */
3426         if (insn != NULL && (gpr_read_mask (insn) & mask) != 0)
3427           return 0;
3428
3429         /* ...or if any of the intervening instructions do.  */
3430         for (j = 0; j < i; j++)
3431           if (gpr_read_mask (&hist[j]) & mask)
3432             return 0;
3433
3434         if (i >= ignore)
3435           return MAX_VR4130_NOPS - i;
3436       }
3437   return 0;
3438 }
3439
3440 #define BASE_REG_EQ(INSN1, INSN2)       \
3441   ((((INSN1) >> OP_SH_RS) & OP_MASK_RS) \
3442       == (((INSN2) >> OP_SH_RS) & OP_MASK_RS))
3443
3444 /* Return the minimum alignment for this store instruction.  */
3445
3446 static int
3447 fix_24k_align_to (const struct mips_opcode *mo)
3448 {
3449   if (strcmp (mo->name, "sh") == 0)
3450     return 2;
3451
3452   if (strcmp (mo->name, "swc1") == 0
3453       || strcmp (mo->name, "swc2") == 0
3454       || strcmp (mo->name, "sw") == 0
3455       || strcmp (mo->name, "sc") == 0
3456       || strcmp (mo->name, "s.s") == 0)
3457     return 4;
3458
3459   if (strcmp (mo->name, "sdc1") == 0
3460       || strcmp (mo->name, "sdc2") == 0
3461       || strcmp (mo->name, "s.d") == 0)
3462     return 8;
3463
3464   /* sb, swl, swr */
3465   return 1;
3466 }
3467
3468 struct fix_24k_store_info
3469   {
3470     /* Immediate offset, if any, for this store instruction.  */
3471     short off;
3472     /* Alignment required by this store instruction.  */
3473     int align_to;
3474     /* True for register offsets.  */
3475     int register_offset;
3476   };
3477
3478 /* Comparison function used by qsort.  */
3479
3480 static int
3481 fix_24k_sort (const void *a, const void *b)
3482 {
3483   const struct fix_24k_store_info *pos1 = a;
3484   const struct fix_24k_store_info *pos2 = b;
3485
3486   return (pos1->off - pos2->off);
3487 }
3488
3489 /* INSN is a store instruction.  Try to record the store information
3490    in STINFO.  Return false if the information isn't known.  */
3491
3492 static bfd_boolean
3493 fix_24k_record_store_info (struct fix_24k_store_info *stinfo,
3494                            const struct mips_cl_insn *insn)
3495 {
3496   /* The instruction must have a known offset.  */
3497   if (!insn->complete_p || !strstr (insn->insn_mo->args, "o("))
3498     return FALSE;
3499
3500   stinfo->off = (insn->insn_opcode >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE;
3501   stinfo->align_to = fix_24k_align_to (insn->insn_mo);
3502   return TRUE;
3503 }
3504
3505 /* Return the number of nops that would be needed to work around the 24k
3506    "lost data on stores during refill" errata if instruction INSN
3507    immediately followed the 2 instructions described by HIST.
3508    Ignore hazards that are contained within the first IGNORE
3509    instructions of HIST.
3510
3511    Problem: The FSB (fetch store buffer) acts as an intermediate buffer
3512    for the data cache refills and store data. The following describes
3513    the scenario where the store data could be lost.
3514
3515    * A data cache miss, due to either a load or a store, causing fill
3516      data to be supplied by the memory subsystem
3517    * The first three doublewords of fill data are returned and written
3518      into the cache
3519    * A sequence of four stores occurs in consecutive cycles around the
3520      final doubleword of the fill:
3521    * Store A
3522    * Store B
3523    * Store C
3524    * Zero, One or more instructions
3525    * Store D
3526
3527    The four stores A-D must be to different doublewords of the line that
3528    is being filled. The fourth instruction in the sequence above permits
3529    the fill of the final doubleword to be transferred from the FSB into
3530    the cache. In the sequence above, the stores may be either integer
3531    (sb, sh, sw, swr, swl, sc) or coprocessor (swc1/swc2, sdc1/sdc2,
3532    swxc1, sdxc1, suxc1) stores, as long as the four stores are to
3533    different doublewords on the line. If the floating point unit is
3534    running in 1:2 mode, it is not possible to create the sequence above
3535    using only floating point store instructions.
3536
3537    In this case, the cache line being filled is incorrectly marked
3538    invalid, thereby losing the data from any store to the line that
3539    occurs between the original miss and the completion of the five
3540    cycle sequence shown above.
3541
3542    The workarounds are:
3543
3544    * Run the data cache in write-through mode.
3545    * Insert a non-store instruction between
3546      Store A and Store B or Store B and Store C.  */
3547   
3548 static int
3549 nops_for_24k (int ignore, const struct mips_cl_insn *hist,
3550               const struct mips_cl_insn *insn)
3551 {
3552   struct fix_24k_store_info pos[3];
3553   int align, i, base_offset;
3554
3555   if (ignore >= 2)
3556     return 0;
3557
3558   /* If the previous instruction wasn't a store, there's nothing to
3559      worry about.  */
3560   if ((hist[0].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3561     return 0;
3562
3563   /* If the instructions after the previous one are unknown, we have
3564      to assume the worst.  */
3565   if (!insn)
3566     return 1;
3567
3568   /* Check whether we are dealing with three consecutive stores.  */
3569   if ((insn->insn_mo->pinfo & INSN_STORE_MEMORY) == 0
3570       || (hist[1].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3571     return 0;
3572
3573   /* If we don't know the relationship between the store addresses,
3574      assume the worst.  */
3575   if (!BASE_REG_EQ (insn->insn_opcode, hist[0].insn_opcode)
3576       || !BASE_REG_EQ (insn->insn_opcode, hist[1].insn_opcode))
3577     return 1;
3578
3579   if (!fix_24k_record_store_info (&pos[0], insn)
3580       || !fix_24k_record_store_info (&pos[1], &hist[0])
3581       || !fix_24k_record_store_info (&pos[2], &hist[1]))
3582     return 1;
3583
3584   qsort (&pos, 3, sizeof (struct fix_24k_store_info), fix_24k_sort);
3585
3586   /* Pick a value of ALIGN and X such that all offsets are adjusted by
3587      X bytes and such that the base register + X is known to be aligned
3588      to align bytes.  */
3589
3590   if (((insn->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == SP)
3591     align = 8;
3592   else
3593     {
3594       align = pos[0].align_to;
3595       base_offset = pos[0].off;
3596       for (i = 1; i < 3; i++)
3597         if (align < pos[i].align_to)
3598           {
3599             align = pos[i].align_to;
3600             base_offset = pos[i].off;
3601           }
3602       for (i = 0; i < 3; i++)
3603         pos[i].off -= base_offset;
3604     }
3605
3606   pos[0].off &= ~align + 1;
3607   pos[1].off &= ~align + 1;
3608   pos[2].off &= ~align + 1;
3609
3610   /* If any two stores write to the same chunk, they also write to the
3611      same doubleword.  The offsets are still sorted at this point.  */
3612   if (pos[0].off == pos[1].off || pos[1].off == pos[2].off)
3613     return 0;
3614
3615   /* A range of at least 9 bytes is needed for the stores to be in
3616      non-overlapping doublewords.  */
3617   if (pos[2].off - pos[0].off <= 8)
3618     return 0;
3619
3620   if (pos[2].off - pos[1].off >= 24
3621       || pos[1].off - pos[0].off >= 24
3622       || pos[2].off - pos[0].off >= 32)
3623     return 0;
3624
3625   return 1;
3626 }
3627
3628 /* Return the number of nops that would be needed if instruction INSN
3629    immediately followed the MAX_NOPS instructions given by HIST,
3630    where HIST[0] is the most recent instruction.  Ignore hazards
3631    between INSN and the first IGNORE instructions in HIST.
3632
3633    If INSN is null, return the worse-case number of nops for any
3634    instruction.  */
3635
3636 static int
3637 nops_for_insn (int ignore, const struct mips_cl_insn *hist,
3638                const struct mips_cl_insn *insn)
3639 {
3640   int i, nops, tmp_nops;
3641
3642   nops = 0;
3643   for (i = ignore; i < MAX_DELAY_NOPS; i++)
3644     {
3645       tmp_nops = insns_between (hist + i, insn) - i;
3646       if (tmp_nops > nops)
3647         nops = tmp_nops;
3648     }
3649
3650   if (mips_fix_vr4130 && !mips_opts.micromips)
3651     {
3652       tmp_nops = nops_for_vr4130 (ignore, hist, insn);
3653       if (tmp_nops > nops)
3654         nops = tmp_nops;
3655     }
3656
3657   if (mips_fix_24k && !mips_opts.micromips)
3658     {
3659       tmp_nops = nops_for_24k (ignore, hist, insn);
3660       if (tmp_nops > nops)
3661         nops = tmp_nops;
3662     }
3663
3664   return nops;
3665 }
3666
3667 /* The variable arguments provide NUM_INSNS extra instructions that
3668    might be added to HIST.  Return the largest number of nops that
3669    would be needed after the extended sequence, ignoring hazards
3670    in the first IGNORE instructions.  */
3671
3672 static int
3673 nops_for_sequence (int num_insns, int ignore,
3674                    const struct mips_cl_insn *hist, ...)
3675 {
3676   va_list args;
3677   struct mips_cl_insn buffer[MAX_NOPS];
3678   struct mips_cl_insn *cursor;
3679   int nops;
3680
3681   va_start (args, hist);
3682   cursor = buffer + num_insns;
3683   memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
3684   while (cursor > buffer)
3685     *--cursor = *va_arg (args, const struct mips_cl_insn *);
3686
3687   nops = nops_for_insn (ignore, buffer, NULL);
3688   va_end (args);
3689   return nops;
3690 }
3691
3692 /* Like nops_for_insn, but if INSN is a branch, take into account the
3693    worst-case delay for the branch target.  */
3694
3695 static int
3696 nops_for_insn_or_target (int ignore, const struct mips_cl_insn *hist,
3697                          const struct mips_cl_insn *insn)
3698 {
3699   int nops, tmp_nops;
3700
3701   nops = nops_for_insn (ignore, hist, insn);
3702   if (delayed_branch_p (insn))
3703     {
3704       tmp_nops = nops_for_sequence (2, ignore ? ignore + 2 : 0,
3705                                     hist, insn, get_delay_slot_nop (insn));
3706       if (tmp_nops > nops)
3707         nops = tmp_nops;
3708     }
3709   else if (compact_branch_p (insn))
3710     {
3711       tmp_nops = nops_for_sequence (1, ignore ? ignore + 1 : 0, hist, insn);
3712       if (tmp_nops > nops)
3713         nops = tmp_nops;
3714     }
3715   return nops;
3716 }
3717
3718 /* Fix NOP issue: Replace nops by "or at,at,zero".  */
3719
3720 static void
3721 fix_loongson2f_nop (struct mips_cl_insn * ip)
3722 {
3723   gas_assert (!HAVE_CODE_COMPRESSION);
3724   if (strcmp (ip->insn_mo->name, "nop") == 0)
3725     ip->insn_opcode = LOONGSON2F_NOP_INSN;
3726 }
3727
3728 /* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
3729                    jr target pc &= 'hffff_ffff_cfff_ffff.  */
3730
3731 static void
3732 fix_loongson2f_jump (struct mips_cl_insn * ip)
3733 {
3734   gas_assert (!HAVE_CODE_COMPRESSION);
3735   if (strcmp (ip->insn_mo->name, "j") == 0
3736       || strcmp (ip->insn_mo->name, "jr") == 0
3737       || strcmp (ip->insn_mo->name, "jalr") == 0)
3738     {
3739       int sreg;
3740       expressionS ep;
3741
3742       if (! mips_opts.at)
3743         return;
3744
3745       sreg = EXTRACT_OPERAND (0, RS, *ip);
3746       if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
3747         return;
3748
3749       ep.X_op = O_constant;
3750       ep.X_add_number = 0xcfff0000;
3751       macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
3752       ep.X_add_number = 0xffff;
3753       macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
3754       macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
3755     }
3756 }
3757
3758 static void
3759 fix_loongson2f (struct mips_cl_insn * ip)
3760 {
3761   if (mips_fix_loongson2f_nop)
3762     fix_loongson2f_nop (ip);
3763
3764   if (mips_fix_loongson2f_jump)
3765     fix_loongson2f_jump (ip);
3766 }
3767
3768 /* IP is a branch that has a delay slot, and we need to fill it
3769    automatically.   Return true if we can do that by swapping IP
3770    with the previous instruction.
3771    ADDRESS_EXPR is an operand of the instruction to be used with
3772    RELOC_TYPE.  */
3773
3774 static bfd_boolean
3775 can_swap_branch_p (struct mips_cl_insn *ip, expressionS *address_expr,
3776   bfd_reloc_code_real_type *reloc_type)
3777 {
3778   unsigned long pinfo, pinfo2, prev_pinfo, prev_pinfo2;
3779   unsigned int gpr_read, gpr_write, prev_gpr_read, prev_gpr_write;
3780
3781   /* -O2 and above is required for this optimization.  */
3782   if (mips_optimize < 2)
3783     return FALSE;
3784
3785   /* If we have seen .set volatile or .set nomove, don't optimize.  */
3786   if (mips_opts.nomove)
3787     return FALSE;
3788
3789   /* We can't swap if the previous instruction's position is fixed.  */
3790   if (history[0].fixed_p)
3791     return FALSE;
3792
3793   /* If the previous previous insn was in a .set noreorder, we can't
3794      swap.  Actually, the MIPS assembler will swap in this situation.
3795      However, gcc configured -with-gnu-as will generate code like
3796
3797         .set    noreorder
3798         lw      $4,XXX
3799         .set    reorder
3800         INSN
3801         bne     $4,$0,foo
3802
3803      in which we can not swap the bne and INSN.  If gcc is not configured
3804      -with-gnu-as, it does not output the .set pseudo-ops.  */
3805   if (history[1].noreorder_p)
3806     return FALSE;
3807
3808   /* If the previous instruction had a fixup in mips16 mode, we can not swap.
3809      This means that the previous instruction was a 4-byte one anyhow.  */
3810   if (mips_opts.mips16 && history[0].fixp[0])
3811     return FALSE;
3812
3813   /* If the branch is itself the target of a branch, we can not swap.
3814      We cheat on this; all we check for is whether there is a label on
3815      this instruction.  If there are any branches to anything other than
3816      a label, users must use .set noreorder.  */
3817   if (seg_info (now_seg)->label_list)
3818     return FALSE;
3819
3820   /* If the previous instruction is in a variant frag other than this
3821      branch's one, we cannot do the swap.  This does not apply to
3822      MIPS16 code, which uses variant frags for different purposes.  */
3823   if (!mips_opts.mips16
3824       && history[0].frag
3825       && history[0].frag->fr_type == rs_machine_dependent)
3826     return FALSE;
3827
3828   /* We do not swap with instructions that cannot architecturally
3829      be placed in a branch delay slot, such as SYNC or ERET.  We
3830      also refrain from swapping with a trap instruction, since it
3831      complicates trap handlers to have the trap instruction be in
3832      a delay slot.  */
3833   prev_pinfo = history[0].insn_mo->pinfo;
3834   if (prev_pinfo & INSN_NO_DELAY_SLOT)
3835     return FALSE;
3836
3837   /* Check for conflicts between the branch and the instructions
3838      before the candidate delay slot.  */
3839   if (nops_for_insn (0, history + 1, ip) > 0)
3840     return FALSE;
3841
3842   /* Check for conflicts between the swapped sequence and the
3843      target of the branch.  */
3844   if (nops_for_sequence (2, 0, history + 1, ip, history) > 0)
3845     return FALSE;
3846
3847   /* If the branch reads a register that the previous
3848      instruction sets, we can not swap.  */
3849   gpr_read = gpr_read_mask (ip);
3850   prev_gpr_write = gpr_write_mask (&history[0]);
3851   if (gpr_read & prev_gpr_write)
3852     return FALSE;
3853
3854   /* If the branch writes a register that the previous
3855      instruction sets, we can not swap.  */
3856   gpr_write = gpr_write_mask (ip);
3857   if (gpr_write & prev_gpr_write)
3858     return FALSE;
3859
3860   /* If the branch writes a register that the previous
3861      instruction reads, we can not swap.  */
3862   prev_gpr_read = gpr_read_mask (&history[0]);
3863   if (gpr_write & prev_gpr_read)
3864     return FALSE;
3865
3866   /* If one instruction sets a condition code and the
3867      other one uses a condition code, we can not swap.  */
3868   pinfo = ip->insn_mo->pinfo;
3869   if ((pinfo & INSN_READ_COND_CODE)
3870       && (prev_pinfo & INSN_WRITE_COND_CODE))
3871     return FALSE;
3872   if ((pinfo & INSN_WRITE_COND_CODE)
3873       && (prev_pinfo & INSN_READ_COND_CODE))
3874     return FALSE;
3875
3876   /* If the previous instruction uses the PC, we can not swap.  */
3877   prev_pinfo2 = history[0].insn_mo->pinfo2;
3878   if (mips_opts.mips16 && (prev_pinfo & MIPS16_INSN_READ_PC))
3879     return FALSE;
3880   if (mips_opts.micromips && (prev_pinfo2 & INSN2_READ_PC))
3881     return FALSE;
3882
3883   /* If the previous instruction has an incorrect size for a fixed
3884      branch delay slot in microMIPS mode, we cannot swap.  */
3885   pinfo2 = ip->insn_mo->pinfo2;
3886   if (mips_opts.micromips
3887       && (pinfo2 & INSN2_BRANCH_DELAY_16BIT)
3888       && insn_length (history) != 2)
3889     return FALSE;
3890   if (mips_opts.micromips
3891       && (pinfo2 & INSN2_BRANCH_DELAY_32BIT)
3892       && insn_length (history) != 4)
3893     return FALSE;
3894
3895   /* On R5900 short loops need to be fixed by inserting a nop in
3896      the branch delay slots.
3897      A short loop can be terminated too early.  */
3898   if (mips_opts.arch == CPU_R5900
3899       /* Check if instruction has a parameter, ignore "j $31". */
3900       && (address_expr != NULL)
3901       /* Parameter must be 16 bit. */
3902       && (*reloc_type == BFD_RELOC_16_PCREL_S2)
3903       /* Branch to same segment. */
3904       && (S_GET_SEGMENT(address_expr->X_add_symbol) == now_seg)
3905       /* Branch to same code fragment. */
3906       && (symbol_get_frag(address_expr->X_add_symbol) == frag_now)
3907       /* Can only calculate branch offset if value is known. */
3908       && symbol_constant_p(address_expr->X_add_symbol)
3909       /* Check if branch is really conditional. */
3910       && !((ip->insn_opcode & 0xffff0000) == 0x10000000   /* beq $0,$0 */
3911         || (ip->insn_opcode & 0xffff0000) == 0x04010000   /* bgez $0 */
3912         || (ip->insn_opcode & 0xffff0000) == 0x04110000)) /* bgezal $0 */
3913     {
3914       int distance;
3915       /* Check if loop is shorter than 6 instructions including
3916          branch and delay slot.  */
3917       distance = frag_now_fix() - S_GET_VALUE(address_expr->X_add_symbol);
3918       if (distance <= 20)
3919         {
3920           int i;
3921           int rv;
3922
3923           rv = FALSE;
3924           /* When the loop includes branches or jumps,
3925              it is not a short loop. */
3926           for (i = 0; i < (distance / 4); i++)
3927             {
3928               if ((history[i].cleared_p)
3929                   || delayed_branch_p(&history[i]))
3930                 {
3931                   rv = TRUE;
3932                   break;
3933                 }
3934             }
3935           if (rv == FALSE)
3936             {
3937               /* Insert nop after branch to fix short loop. */
3938               return FALSE;
3939             }
3940         }
3941     }
3942
3943   return TRUE;
3944 }
3945
3946 /* Decide how we should add IP to the instruction stream.
3947    ADDRESS_EXPR is an operand of the instruction to be used with
3948    RELOC_TYPE.  */
3949
3950 static enum append_method
3951 get_append_method (struct mips_cl_insn *ip, expressionS *address_expr,
3952   bfd_reloc_code_real_type *reloc_type)
3953 {
3954   unsigned long pinfo;
3955
3956   /* The relaxed version of a macro sequence must be inherently
3957      hazard-free.  */
3958   if (mips_relax.sequence == 2)
3959     return APPEND_ADD;
3960
3961   /* We must not dabble with instructions in a ".set norerorder" block.  */
3962   if (mips_opts.noreorder)
3963     return APPEND_ADD;
3964
3965   /* Otherwise, it's our responsibility to fill branch delay slots.  */
3966   if (delayed_branch_p (ip))
3967     {
3968       if (!branch_likely_p (ip)
3969           && can_swap_branch_p (ip, address_expr, reloc_type))
3970         return APPEND_SWAP;
3971
3972       pinfo = ip->insn_mo->pinfo;
3973       if (mips_opts.mips16
3974           && ISA_SUPPORTS_MIPS16E
3975           && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31)))
3976         return APPEND_ADD_COMPACT;
3977
3978       return APPEND_ADD_WITH_NOP;
3979     }
3980
3981   return APPEND_ADD;
3982 }
3983
3984 /* IP is a MIPS16 instruction whose opcode we have just changed.
3985    Point IP->insn_mo to the new opcode's definition.  */
3986
3987 static void
3988 find_altered_mips16_opcode (struct mips_cl_insn *ip)
3989 {
3990   const struct mips_opcode *mo, *end;
3991
3992   end = &mips16_opcodes[bfd_mips16_num_opcodes];
3993   for (mo = ip->insn_mo; mo < end; mo++)
3994     if ((ip->insn_opcode & mo->mask) == mo->match)
3995       {
3996         ip->insn_mo = mo;
3997         return;
3998       }
3999   abort ();
4000 }
4001
4002 /* For microMIPS macros, we need to generate a local number label
4003    as the target of branches.  */
4004 #define MICROMIPS_LABEL_CHAR            '\037'
4005 static unsigned long micromips_target_label;
4006 static char micromips_target_name[32];
4007
4008 static char *
4009 micromips_label_name (void)
4010 {
4011   char *p = micromips_target_name;
4012   char symbol_name_temporary[24];
4013   unsigned long l;
4014   int i;
4015
4016   if (*p)
4017     return p;
4018
4019   i = 0;
4020   l = micromips_target_label;
4021 #ifdef LOCAL_LABEL_PREFIX
4022   *p++ = LOCAL_LABEL_PREFIX;
4023 #endif
4024   *p++ = 'L';
4025   *p++ = MICROMIPS_LABEL_CHAR;
4026   do
4027     {
4028       symbol_name_temporary[i++] = l % 10 + '0';
4029       l /= 10;
4030     }
4031   while (l != 0);
4032   while (i > 0)
4033     *p++ = symbol_name_temporary[--i];
4034   *p = '\0';
4035
4036   return micromips_target_name;
4037 }
4038
4039 static void
4040 micromips_label_expr (expressionS *label_expr)
4041 {
4042   label_expr->X_op = O_symbol;
4043   label_expr->X_add_symbol = symbol_find_or_make (micromips_label_name ());
4044   label_expr->X_add_number = 0;
4045 }
4046
4047 static void
4048 micromips_label_inc (void)
4049 {
4050   micromips_target_label++;
4051   *micromips_target_name = '\0';
4052 }
4053
4054 static void
4055 micromips_add_label (void)
4056 {
4057   symbolS *s;
4058
4059   s = colon (micromips_label_name ());
4060   micromips_label_inc ();
4061 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
4062   if (IS_ELF)
4063     S_SET_OTHER (s, ELF_ST_SET_MICROMIPS (S_GET_OTHER (s)));
4064 #else
4065   (void) s;
4066 #endif
4067 }
4068
4069 /* If assembling microMIPS code, then return the microMIPS reloc
4070    corresponding to the requested one if any.  Otherwise return
4071    the reloc unchanged.  */
4072
4073 static bfd_reloc_code_real_type
4074 micromips_map_reloc (bfd_reloc_code_real_type reloc)
4075 {
4076   static const bfd_reloc_code_real_type relocs[][2] =
4077     {
4078       /* Keep sorted incrementally by the left-hand key.  */
4079       { BFD_RELOC_16_PCREL_S2, BFD_RELOC_MICROMIPS_16_PCREL_S1 },
4080       { BFD_RELOC_GPREL16, BFD_RELOC_MICROMIPS_GPREL16 },
4081       { BFD_RELOC_MIPS_JMP, BFD_RELOC_MICROMIPS_JMP },
4082       { BFD_RELOC_HI16, BFD_RELOC_MICROMIPS_HI16 },
4083       { BFD_RELOC_HI16_S, BFD_RELOC_MICROMIPS_HI16_S },
4084       { BFD_RELOC_LO16, BFD_RELOC_MICROMIPS_LO16 },
4085       { BFD_RELOC_MIPS_LITERAL, BFD_RELOC_MICROMIPS_LITERAL },
4086       { BFD_RELOC_MIPS_GOT16, BFD_RELOC_MICROMIPS_GOT16 },
4087       { BFD_RELOC_MIPS_CALL16, BFD_RELOC_MICROMIPS_CALL16 },
4088       { BFD_RELOC_MIPS_GOT_HI16, BFD_RELOC_MICROMIPS_GOT_HI16 },
4089       { BFD_RELOC_MIPS_GOT_LO16, BFD_RELOC_MICROMIPS_GOT_LO16 },
4090       { BFD_RELOC_MIPS_CALL_HI16, BFD_RELOC_MICROMIPS_CALL_HI16 },
4091       { BFD_RELOC_MIPS_CALL_LO16, BFD_RELOC_MICROMIPS_CALL_LO16 },
4092       { BFD_RELOC_MIPS_SUB, BFD_RELOC_MICROMIPS_SUB },
4093       { BFD_RELOC_MIPS_GOT_PAGE, BFD_RELOC_MICROMIPS_GOT_PAGE },
4094       { BFD_RELOC_MIPS_GOT_OFST, BFD_RELOC_MICROMIPS_GOT_OFST },
4095       { BFD_RELOC_MIPS_GOT_DISP, BFD_RELOC_MICROMIPS_GOT_DISP },
4096       { BFD_RELOC_MIPS_HIGHEST, BFD_RELOC_MICROMIPS_HIGHEST },
4097       { BFD_RELOC_MIPS_HIGHER, BFD_RELOC_MICROMIPS_HIGHER },
4098       { BFD_RELOC_MIPS_SCN_DISP, BFD_RELOC_MICROMIPS_SCN_DISP },
4099       { BFD_RELOC_MIPS_TLS_GD, BFD_RELOC_MICROMIPS_TLS_GD },
4100       { BFD_RELOC_MIPS_TLS_LDM, BFD_RELOC_MICROMIPS_TLS_LDM },
4101       { BFD_RELOC_MIPS_TLS_DTPREL_HI16, BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16 },
4102       { BFD_RELOC_MIPS_TLS_DTPREL_LO16, BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16 },
4103       { BFD_RELOC_MIPS_TLS_GOTTPREL, BFD_RELOC_MICROMIPS_TLS_GOTTPREL },
4104       { BFD_RELOC_MIPS_TLS_TPREL_HI16, BFD_RELOC_MICROMIPS_TLS_TPREL_HI16 },
4105       { BFD_RELOC_MIPS_TLS_TPREL_LO16, BFD_RELOC_MICROMIPS_TLS_TPREL_LO16 }
4106     };
4107   bfd_reloc_code_real_type r;
4108   size_t i;
4109
4110   if (!mips_opts.micromips)
4111     return reloc;
4112   for (i = 0; i < ARRAY_SIZE (relocs); i++)
4113     {
4114       r = relocs[i][0];
4115       if (r > reloc)
4116         return reloc;
4117       if (r == reloc)
4118         return relocs[i][1];
4119     }
4120   return reloc;
4121 }
4122
4123 /* Try to resolve relocation RELOC against constant OPERAND at assembly time.
4124    Return true on success, storing the resolved value in RESULT.  */
4125
4126 static bfd_boolean
4127 calculate_reloc (bfd_reloc_code_real_type reloc, offsetT operand,
4128                  offsetT *result)
4129 {
4130   switch (reloc)
4131     {
4132     case BFD_RELOC_MIPS_HIGHEST:
4133     case BFD_RELOC_MICROMIPS_HIGHEST:
4134       *result = ((operand + 0x800080008000ull) >> 48) & 0xffff;
4135       return TRUE;
4136
4137     case BFD_RELOC_MIPS_HIGHER:
4138     case BFD_RELOC_MICROMIPS_HIGHER:
4139       *result = ((operand + 0x80008000ull) >> 32) & 0xffff;
4140       return TRUE;
4141
4142     case BFD_RELOC_HI16_S:
4143     case BFD_RELOC_MICROMIPS_HI16_S:
4144     case BFD_RELOC_MIPS16_HI16_S:
4145       *result = ((operand + 0x8000) >> 16) & 0xffff;
4146       return TRUE;
4147
4148     case BFD_RELOC_HI16:
4149     case BFD_RELOC_MICROMIPS_HI16:
4150     case BFD_RELOC_MIPS16_HI16:
4151       *result = (operand >> 16) & 0xffff;
4152       return TRUE;
4153
4154     case BFD_RELOC_LO16:
4155     case BFD_RELOC_MICROMIPS_LO16:
4156     case BFD_RELOC_MIPS16_LO16:
4157       *result = operand & 0xffff;
4158       return TRUE;
4159
4160     case BFD_RELOC_UNUSED:
4161       *result = operand;
4162       return TRUE;
4163
4164     default:
4165       return FALSE;
4166     }
4167 }
4168
4169 /* Output an instruction.  IP is the instruction information.
4170    ADDRESS_EXPR is an operand of the instruction to be used with
4171    RELOC_TYPE.  EXPANSIONP is true if the instruction is part of
4172    a macro expansion.  */
4173
4174 static void
4175 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
4176              bfd_reloc_code_real_type *reloc_type, bfd_boolean expansionp)
4177 {
4178   unsigned long prev_pinfo2, pinfo;
4179   bfd_boolean relaxed_branch = FALSE;
4180   enum append_method method;
4181   bfd_boolean relax32;
4182   int branch_disp;
4183
4184   if (mips_fix_loongson2f && !HAVE_CODE_COMPRESSION)
4185     fix_loongson2f (ip);
4186
4187   file_ase_mips16 |= mips_opts.mips16;
4188   file_ase_micromips |= mips_opts.micromips;
4189
4190   prev_pinfo2 = history[0].insn_mo->pinfo2;
4191   pinfo = ip->insn_mo->pinfo;
4192
4193   if (mips_opts.micromips
4194       && !expansionp
4195       && (((prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
4196            && micromips_insn_length (ip->insn_mo) != 2)
4197           || ((prev_pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
4198               && micromips_insn_length (ip->insn_mo) != 4)))
4199     as_warn (_("Wrong size instruction in a %u-bit branch delay slot"),
4200              (prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0 ? 16 : 32);
4201
4202   if (address_expr == NULL)
4203     ip->complete_p = 1;
4204   else if (reloc_type[0] <= BFD_RELOC_UNUSED
4205            && reloc_type[1] == BFD_RELOC_UNUSED
4206            && reloc_type[2] == BFD_RELOC_UNUSED
4207            && address_expr->X_op == O_constant)
4208     {
4209       switch (*reloc_type)
4210         {
4211         case BFD_RELOC_MIPS_JMP:
4212           {
4213             int shift;
4214
4215             shift = mips_opts.micromips ? 1 : 2;
4216             if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4217               as_bad (_("jump to misaligned address (0x%lx)"),
4218                       (unsigned long) address_expr->X_add_number);
4219             ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4220                                 & 0x3ffffff);
4221             ip->complete_p = 1;
4222           }
4223           break;
4224
4225         case BFD_RELOC_MIPS16_JMP:
4226           if ((address_expr->X_add_number & 3) != 0)
4227             as_bad (_("jump to misaligned address (0x%lx)"),
4228                     (unsigned long) address_expr->X_add_number);
4229           ip->insn_opcode |=
4230             (((address_expr->X_add_number & 0x7c0000) << 3)
4231                | ((address_expr->X_add_number & 0xf800000) >> 7)
4232                | ((address_expr->X_add_number & 0x3fffc) >> 2));
4233           ip->complete_p = 1;
4234           break;
4235
4236         case BFD_RELOC_16_PCREL_S2:
4237           {
4238             int shift;
4239
4240             shift = mips_opts.micromips ? 1 : 2;
4241             if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4242               as_bad (_("branch to misaligned address (0x%lx)"),
4243                       (unsigned long) address_expr->X_add_number);
4244             if (!mips_relax_branch)
4245               {
4246                 if ((address_expr->X_add_number + (1 << (shift + 15)))
4247                     & ~((1 << (shift + 16)) - 1))
4248                   as_bad (_("branch address range overflow (0x%lx)"),
4249                           (unsigned long) address_expr->X_add_number);
4250                 ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4251                                     & 0xffff);
4252               }
4253           }
4254           break;
4255
4256         default:
4257           {
4258             offsetT value;
4259
4260             if (calculate_reloc (*reloc_type, address_expr->X_add_number,
4261                                  &value))
4262               {
4263                 ip->insn_opcode |= value & 0xffff;
4264                 ip->complete_p = 1;
4265               }
4266           }
4267           break;
4268         }
4269     }
4270
4271   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
4272     {
4273       /* There are a lot of optimizations we could do that we don't.
4274          In particular, we do not, in general, reorder instructions.
4275          If you use gcc with optimization, it will reorder
4276          instructions and generally do much more optimization then we
4277          do here; repeating all that work in the assembler would only
4278          benefit hand written assembly code, and does not seem worth
4279          it.  */
4280       int nops = (mips_optimize == 0
4281                   ? nops_for_insn (0, history, NULL)
4282                   : nops_for_insn_or_target (0, history, ip));
4283       if (nops > 0)
4284         {
4285           fragS *old_frag;
4286           unsigned long old_frag_offset;
4287           int i;
4288
4289           old_frag = frag_now;
4290           old_frag_offset = frag_now_fix ();
4291
4292           for (i = 0; i < nops; i++)
4293             add_fixed_insn (NOP_INSN);
4294           insert_into_history (0, nops, NOP_INSN);
4295
4296           if (listing)
4297             {
4298               listing_prev_line ();
4299               /* We may be at the start of a variant frag.  In case we
4300                  are, make sure there is enough space for the frag
4301                  after the frags created by listing_prev_line.  The
4302                  argument to frag_grow here must be at least as large
4303                  as the argument to all other calls to frag_grow in
4304                  this file.  We don't have to worry about being in the
4305                  middle of a variant frag, because the variants insert
4306                  all needed nop instructions themselves.  */
4307               frag_grow (40);
4308             }
4309
4310           mips_move_text_labels ();
4311
4312 #ifndef NO_ECOFF_DEBUGGING
4313           if (ECOFF_DEBUGGING)
4314             ecoff_fix_loc (old_frag, old_frag_offset);
4315 #endif
4316         }
4317     }
4318   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
4319     {
4320       int nops;
4321
4322       /* Work out how many nops in prev_nop_frag are needed by IP,
4323          ignoring hazards generated by the first prev_nop_frag_since
4324          instructions.  */
4325       nops = nops_for_insn_or_target (prev_nop_frag_since, history, ip);
4326       gas_assert (nops <= prev_nop_frag_holds);
4327
4328       /* Enforce NOPS as a minimum.  */
4329       if (nops > prev_nop_frag_required)
4330         prev_nop_frag_required = nops;
4331
4332       if (prev_nop_frag_holds == prev_nop_frag_required)
4333         {
4334           /* Settle for the current number of nops.  Update the history
4335              accordingly (for the benefit of any future .set reorder code).  */
4336           prev_nop_frag = NULL;
4337           insert_into_history (prev_nop_frag_since,
4338                                prev_nop_frag_holds, NOP_INSN);
4339         }
4340       else
4341         {
4342           /* Allow this instruction to replace one of the nops that was
4343              tentatively added to prev_nop_frag.  */
4344           prev_nop_frag->fr_fix -= NOP_INSN_SIZE;
4345           prev_nop_frag_holds--;
4346           prev_nop_frag_since++;
4347         }
4348     }
4349
4350   method = get_append_method (ip, address_expr, reloc_type);
4351   branch_disp = method == APPEND_SWAP ? insn_length (history) : 0;
4352
4353 #ifdef OBJ_ELF
4354   /* The value passed to dwarf2_emit_insn is the distance between
4355      the beginning of the current instruction and the address that
4356      should be recorded in the debug tables.  This is normally the
4357      current address.
4358
4359      For MIPS16/microMIPS debug info we want to use ISA-encoded
4360      addresses, so we use -1 for an address higher by one than the
4361      current one.
4362
4363      If the instruction produced is a branch that we will swap with
4364      the preceding instruction, then we add the displacement by which
4365      the branch will be moved backwards.  This is more appropriate
4366      and for MIPS16/microMIPS code also prevents a debugger from
4367      placing a breakpoint in the middle of the branch (and corrupting
4368      code if software breakpoints are used).  */
4369   dwarf2_emit_insn ((HAVE_CODE_COMPRESSION ? -1 : 0) + branch_disp);
4370 #endif
4371
4372   relax32 = (mips_relax_branch
4373              /* Don't try branch relaxation within .set nomacro, or within
4374                 .set noat if we use $at for PIC computations.  If it turns
4375                 out that the branch was out-of-range, we'll get an error.  */
4376              && !mips_opts.warn_about_macros
4377              && (mips_opts.at || mips_pic == NO_PIC)
4378              /* Don't relax BPOSGE32/64 as they have no complementing
4379                 branches.  */
4380              && !(ip->insn_mo->membership & (INSN_DSP64 | INSN_DSP)));
4381
4382   if (!HAVE_CODE_COMPRESSION
4383       && address_expr
4384       && relax32
4385       && *reloc_type == BFD_RELOC_16_PCREL_S2
4386       && delayed_branch_p (ip))
4387     {
4388       relaxed_branch = TRUE;
4389       add_relaxed_insn (ip, (relaxed_branch_length
4390                              (NULL, NULL,
4391                               uncond_branch_p (ip) ? -1
4392                               : branch_likely_p (ip) ? 1
4393                               : 0)), 4,
4394                         RELAX_BRANCH_ENCODE
4395                         (AT,
4396                          uncond_branch_p (ip),
4397                          branch_likely_p (ip),
4398                          pinfo & INSN_WRITE_GPR_31,
4399                          0),
4400                         address_expr->X_add_symbol,
4401                         address_expr->X_add_number);
4402       *reloc_type = BFD_RELOC_UNUSED;
4403     }
4404   else if (mips_opts.micromips
4405            && address_expr
4406            && ((relax32 && *reloc_type == BFD_RELOC_16_PCREL_S2)
4407                || *reloc_type > BFD_RELOC_UNUSED)
4408            && (delayed_branch_p (ip) || compact_branch_p (ip))
4409            /* Don't try branch relaxation when users specify
4410               16-bit/32-bit instructions.  */
4411            && !forced_insn_length)
4412     {
4413       bfd_boolean relax16 = *reloc_type > BFD_RELOC_UNUSED;
4414       int type = relax16 ? *reloc_type - BFD_RELOC_UNUSED : 0;
4415       int uncond = uncond_branch_p (ip) ? -1 : 0;
4416       int compact = compact_branch_p (ip);
4417       int al = pinfo & INSN_WRITE_GPR_31;
4418       int length32;
4419
4420       gas_assert (address_expr != NULL);
4421       gas_assert (!mips_relax.sequence);
4422
4423       relaxed_branch = TRUE;
4424       length32 = relaxed_micromips_32bit_branch_length (NULL, NULL, uncond);
4425       add_relaxed_insn (ip, relax32 ? length32 : 4, relax16 ? 2 : 4,
4426                         RELAX_MICROMIPS_ENCODE (type, AT, uncond, compact, al,
4427                                                 relax32, 0, 0),
4428                         address_expr->X_add_symbol,
4429                         address_expr->X_add_number);
4430       *reloc_type = BFD_RELOC_UNUSED;
4431     }
4432   else if (mips_opts.mips16 && *reloc_type > BFD_RELOC_UNUSED)
4433     {
4434       /* We need to set up a variant frag.  */
4435       gas_assert (address_expr != NULL);
4436       add_relaxed_insn (ip, 4, 0,
4437                         RELAX_MIPS16_ENCODE
4438                         (*reloc_type - BFD_RELOC_UNUSED,
4439                          forced_insn_length == 2, forced_insn_length == 4,
4440                          delayed_branch_p (&history[0]),
4441                          history[0].mips16_absolute_jump_p),
4442                         make_expr_symbol (address_expr), 0);
4443     }
4444   else if (mips_opts.mips16 && insn_length (ip) == 2)
4445     {
4446       if (!delayed_branch_p (ip))
4447         /* Make sure there is enough room to swap this instruction with
4448            a following jump instruction.  */
4449         frag_grow (6);
4450       add_fixed_insn (ip);
4451     }
4452   else
4453     {
4454       if (mips_opts.mips16
4455           && mips_opts.noreorder
4456           && delayed_branch_p (&history[0]))
4457         as_warn (_("extended instruction in delay slot"));
4458
4459       if (mips_relax.sequence)
4460         {
4461           /* If we've reached the end of this frag, turn it into a variant
4462              frag and record the information for the instructions we've
4463              written so far.  */
4464           if (frag_room () < 4)
4465             relax_close_frag ();
4466           mips_relax.sizes[mips_relax.sequence - 1] += insn_length (ip);
4467         }
4468
4469       if (mips_relax.sequence != 2)
4470         {
4471           if (mips_macro_warning.first_insn_sizes[0] == 0)
4472             mips_macro_warning.first_insn_sizes[0] = insn_length (ip);
4473           mips_macro_warning.sizes[0] += insn_length (ip);
4474           mips_macro_warning.insns[0]++;
4475         }
4476       if (mips_relax.sequence != 1)
4477         {
4478           if (mips_macro_warning.first_insn_sizes[1] == 0)
4479             mips_macro_warning.first_insn_sizes[1] = insn_length (ip);
4480           mips_macro_warning.sizes[1] += insn_length (ip);
4481           mips_macro_warning.insns[1]++;
4482         }
4483
4484       if (mips_opts.mips16)
4485         {
4486           ip->fixed_p = 1;
4487           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
4488         }
4489       add_fixed_insn (ip);
4490     }
4491
4492   if (!ip->complete_p && *reloc_type < BFD_RELOC_UNUSED)
4493     {
4494       bfd_reloc_code_real_type final_type[3];
4495       reloc_howto_type *howto0;
4496       reloc_howto_type *howto;
4497       int i;
4498
4499       /* Perform any necessary conversion to microMIPS relocations
4500          and find out how many relocations there actually are.  */
4501       for (i = 0; i < 3 && reloc_type[i] != BFD_RELOC_UNUSED; i++)
4502         final_type[i] = micromips_map_reloc (reloc_type[i]);
4503
4504       /* In a compound relocation, it is the final (outermost)
4505          operator that determines the relocated field.  */
4506       howto = howto0 = bfd_reloc_type_lookup (stdoutput, final_type[i - 1]);
4507
4508       if (howto == NULL)
4509         {
4510           /* To reproduce this failure try assembling gas/testsuites/
4511              gas/mips/mips16-intermix.s with a mips-ecoff targeted
4512              assembler.  */
4513           as_bad (_("Unsupported MIPS relocation number %d"),
4514                   final_type[i - 1]);
4515           howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
4516         }
4517
4518       if (i > 1)
4519         howto0 = bfd_reloc_type_lookup (stdoutput, final_type[0]);
4520       ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
4521                                  bfd_get_reloc_size (howto),
4522                                  address_expr,
4523                                  howto0 && howto0->pc_relative,
4524                                  final_type[0]);
4525
4526       /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
4527       if (final_type[0] == BFD_RELOC_MIPS16_JMP && ip->fixp[0]->fx_addsy)
4528         *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
4529
4530       /* These relocations can have an addend that won't fit in
4531          4 octets for 64bit assembly.  */
4532       if (HAVE_64BIT_GPRS
4533           && ! howto->partial_inplace
4534           && (reloc_type[0] == BFD_RELOC_16
4535               || reloc_type[0] == BFD_RELOC_32
4536               || reloc_type[0] == BFD_RELOC_MIPS_JMP
4537               || reloc_type[0] == BFD_RELOC_GPREL16
4538               || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
4539               || reloc_type[0] == BFD_RELOC_GPREL32
4540               || reloc_type[0] == BFD_RELOC_64
4541               || reloc_type[0] == BFD_RELOC_CTOR
4542               || reloc_type[0] == BFD_RELOC_MIPS_SUB
4543               || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
4544               || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
4545               || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
4546               || reloc_type[0] == BFD_RELOC_MIPS_REL16
4547               || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
4548               || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
4549               || hi16_reloc_p (reloc_type[0])
4550               || lo16_reloc_p (reloc_type[0])))
4551         ip->fixp[0]->fx_no_overflow = 1;
4552
4553       /* These relocations can have an addend that won't fit in 2 octets.  */
4554       if (reloc_type[0] == BFD_RELOC_MICROMIPS_7_PCREL_S1
4555           || reloc_type[0] == BFD_RELOC_MICROMIPS_10_PCREL_S1)
4556         ip->fixp[0]->fx_no_overflow = 1;
4557
4558       if (mips_relax.sequence)
4559         {
4560           if (mips_relax.first_fixup == 0)
4561             mips_relax.first_fixup = ip->fixp[0];
4562         }
4563       else if (reloc_needs_lo_p (*reloc_type))
4564         {
4565           struct mips_hi_fixup *hi_fixup;
4566
4567           /* Reuse the last entry if it already has a matching %lo.  */
4568           hi_fixup = mips_hi_fixup_list;
4569           if (hi_fixup == 0
4570               || !fixup_has_matching_lo_p (hi_fixup->fixp))
4571             {
4572               hi_fixup = ((struct mips_hi_fixup *)
4573                           xmalloc (sizeof (struct mips_hi_fixup)));
4574               hi_fixup->next = mips_hi_fixup_list;
4575               mips_hi_fixup_list = hi_fixup;
4576             }
4577           hi_fixup->fixp = ip->fixp[0];
4578           hi_fixup->seg = now_seg;
4579         }
4580
4581       /* Add fixups for the second and third relocations, if given.
4582          Note that the ABI allows the second relocation to be
4583          against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
4584          moment we only use RSS_UNDEF, but we could add support
4585          for the others if it ever becomes necessary.  */
4586       for (i = 1; i < 3; i++)
4587         if (reloc_type[i] != BFD_RELOC_UNUSED)
4588           {
4589             ip->fixp[i] = fix_new (ip->frag, ip->where,
4590                                    ip->fixp[0]->fx_size, NULL, 0,
4591                                    FALSE, final_type[i]);
4592
4593             /* Use fx_tcbit to mark compound relocs.  */
4594             ip->fixp[0]->fx_tcbit = 1;
4595             ip->fixp[i]->fx_tcbit = 1;
4596           }
4597     }
4598   install_insn (ip);
4599
4600   /* Update the register mask information.  */
4601   mips_gprmask |= gpr_read_mask (ip) | gpr_write_mask (ip);
4602   mips_cprmask[1] |= fpr_read_mask (ip) | fpr_write_mask (ip);
4603
4604   switch (method)
4605     {
4606     case APPEND_ADD:
4607       insert_into_history (0, 1, ip);
4608       break;
4609
4610     case APPEND_ADD_WITH_NOP:
4611       {
4612         struct mips_cl_insn *nop;
4613
4614         insert_into_history (0, 1, ip);
4615         nop = get_delay_slot_nop (ip);
4616         add_fixed_insn (nop);
4617         insert_into_history (0, 1, nop);
4618         if (mips_relax.sequence)
4619           mips_relax.sizes[mips_relax.sequence - 1] += insn_length (nop);
4620       }
4621       break;
4622
4623     case APPEND_ADD_COMPACT:
4624       /* Convert MIPS16 jr/jalr into a "compact" jump.  */
4625       gas_assert (mips_opts.mips16);
4626       ip->insn_opcode |= 0x0080;
4627       find_altered_mips16_opcode (ip);
4628       install_insn (ip);
4629       insert_into_history (0, 1, ip);
4630       break;
4631
4632     case APPEND_SWAP:
4633       {
4634         struct mips_cl_insn delay = history[0];
4635         if (mips_opts.mips16)
4636           {
4637             know (delay.frag == ip->frag);
4638             move_insn (ip, delay.frag, delay.where);
4639             move_insn (&delay, ip->frag, ip->where + insn_length (ip));
4640           }
4641         else if (relaxed_branch || delay.frag != ip->frag)
4642           {
4643             /* Add the delay slot instruction to the end of the
4644                current frag and shrink the fixed part of the
4645                original frag.  If the branch occupies the tail of
4646                the latter, move it backwards to cover the gap.  */
4647             delay.frag->fr_fix -= branch_disp;
4648             if (delay.frag == ip->frag)
4649               move_insn (ip, ip->frag, ip->where - branch_disp);
4650             add_fixed_insn (&delay);
4651           }
4652         else
4653           {
4654             move_insn (&delay, ip->frag,
4655                        ip->where - branch_disp + insn_length (ip));
4656             move_insn (ip, history[0].frag, history[0].where);
4657           }
4658         history[0] = *ip;
4659         delay.fixed_p = 1;
4660         insert_into_history (0, 1, &delay);
4661       }
4662       break;
4663     }
4664
4665   /* If we have just completed an unconditional branch, clear the history.  */
4666   if ((delayed_branch_p (&history[1]) && uncond_branch_p (&history[1]))
4667       || (compact_branch_p (&history[0]) && uncond_branch_p (&history[0])))
4668     {
4669       unsigned int i;
4670
4671       mips_no_prev_insn ();
4672
4673       for (i = 0; i < ARRAY_SIZE (history); i++)
4674         history[i].cleared_p = 1;
4675     }
4676
4677   /* We need to emit a label at the end of branch-likely macros.  */
4678   if (emit_branch_likely_macro)
4679     {
4680       emit_branch_likely_macro = FALSE;
4681       micromips_add_label ();
4682     }
4683
4684   /* We just output an insn, so the next one doesn't have a label.  */
4685   mips_clear_insn_labels ();
4686 }
4687
4688 /* Forget that there was any previous instruction or label.
4689    When BRANCH is true, the branch history is also flushed.  */
4690
4691 static void
4692 mips_no_prev_insn (void)
4693 {
4694   prev_nop_frag = NULL;
4695   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
4696   mips_clear_insn_labels ();
4697 }
4698
4699 /* This function must be called before we emit something other than
4700    instructions.  It is like mips_no_prev_insn except that it inserts
4701    any NOPS that might be needed by previous instructions.  */
4702
4703 void
4704 mips_emit_delays (void)
4705 {
4706   if (! mips_opts.noreorder)
4707     {
4708       int nops = nops_for_insn (0, history, NULL);
4709       if (nops > 0)
4710         {
4711           while (nops-- > 0)
4712             add_fixed_insn (NOP_INSN);
4713           mips_move_text_labels ();
4714         }
4715     }
4716   mips_no_prev_insn ();
4717 }
4718
4719 /* Start a (possibly nested) noreorder block.  */
4720
4721 static void
4722 start_noreorder (void)
4723 {
4724   if (mips_opts.noreorder == 0)
4725     {
4726       unsigned int i;
4727       int nops;
4728
4729       /* None of the instructions before the .set noreorder can be moved.  */
4730       for (i = 0; i < ARRAY_SIZE (history); i++)
4731         history[i].fixed_p = 1;
4732
4733       /* Insert any nops that might be needed between the .set noreorder
4734          block and the previous instructions.  We will later remove any
4735          nops that turn out not to be needed.  */
4736       nops = nops_for_insn (0, history, NULL);
4737       if (nops > 0)
4738         {
4739           if (mips_optimize != 0)
4740             {
4741               /* Record the frag which holds the nop instructions, so
4742                  that we can remove them if we don't need them.  */
4743               frag_grow (nops * NOP_INSN_SIZE);
4744               prev_nop_frag = frag_now;
4745               prev_nop_frag_holds = nops;
4746               prev_nop_frag_required = 0;
4747               prev_nop_frag_since = 0;
4748             }
4749
4750           for (; nops > 0; --nops)
4751             add_fixed_insn (NOP_INSN);
4752
4753           /* Move on to a new frag, so that it is safe to simply
4754              decrease the size of prev_nop_frag.  */
4755           frag_wane (frag_now);
4756           frag_new (0);
4757           mips_move_text_labels ();
4758         }
4759       mips_mark_labels ();
4760       mips_clear_insn_labels ();
4761     }
4762   mips_opts.noreorder++;
4763   mips_any_noreorder = 1;
4764 }
4765
4766 /* End a nested noreorder block.  */
4767
4768 static void
4769 end_noreorder (void)
4770 {
4771   mips_opts.noreorder--;
4772   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
4773     {
4774       /* Commit to inserting prev_nop_frag_required nops and go back to
4775          handling nop insertion the .set reorder way.  */
4776       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
4777                                 * NOP_INSN_SIZE);
4778       insert_into_history (prev_nop_frag_since,
4779                            prev_nop_frag_required, NOP_INSN);
4780       prev_nop_frag = NULL;
4781     }
4782 }
4783
4784 /* Set up global variables for the start of a new macro.  */
4785
4786 static void
4787 macro_start (void)
4788 {
4789   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
4790   memset (&mips_macro_warning.first_insn_sizes, 0,
4791           sizeof (mips_macro_warning.first_insn_sizes));
4792   memset (&mips_macro_warning.insns, 0, sizeof (mips_macro_warning.insns));
4793   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
4794                                      && delayed_branch_p (&history[0]));
4795   switch (history[0].insn_mo->pinfo2
4796           & (INSN2_BRANCH_DELAY_32BIT | INSN2_BRANCH_DELAY_16BIT))
4797     {
4798     case INSN2_BRANCH_DELAY_32BIT:
4799       mips_macro_warning.delay_slot_length = 4;
4800       break;
4801     case INSN2_BRANCH_DELAY_16BIT:
4802       mips_macro_warning.delay_slot_length = 2;
4803       break;
4804     default:
4805       mips_macro_warning.delay_slot_length = 0;
4806       break;
4807     }
4808   mips_macro_warning.first_frag = NULL;
4809 }
4810
4811 /* Given that a macro is longer than one instruction or of the wrong size,
4812    return the appropriate warning for it.  Return null if no warning is
4813    needed.  SUBTYPE is a bitmask of RELAX_DELAY_SLOT, RELAX_DELAY_SLOT_16BIT,
4814    RELAX_DELAY_SLOT_SIZE_FIRST, RELAX_DELAY_SLOT_SIZE_SECOND,
4815    and RELAX_NOMACRO.  */
4816
4817 static const char *
4818 macro_warning (relax_substateT subtype)
4819 {
4820   if (subtype & RELAX_DELAY_SLOT)
4821     return _("Macro instruction expanded into multiple instructions"
4822              " in a branch delay slot");
4823   else if (subtype & RELAX_NOMACRO)
4824     return _("Macro instruction expanded into multiple instructions");
4825   else if (subtype & (RELAX_DELAY_SLOT_SIZE_FIRST
4826                       | RELAX_DELAY_SLOT_SIZE_SECOND))
4827     return ((subtype & RELAX_DELAY_SLOT_16BIT)
4828             ? _("Macro instruction expanded into a wrong size instruction"
4829                 " in a 16-bit branch delay slot")
4830             : _("Macro instruction expanded into a wrong size instruction"
4831                 " in a 32-bit branch delay slot"));
4832   else
4833     return 0;
4834 }
4835
4836 /* Finish up a macro.  Emit warnings as appropriate.  */
4837
4838 static void
4839 macro_end (void)
4840 {
4841   /* Relaxation warning flags.  */
4842   relax_substateT subtype = 0;
4843
4844   /* Check delay slot size requirements.  */
4845   if (mips_macro_warning.delay_slot_length == 2)
4846     subtype |= RELAX_DELAY_SLOT_16BIT;
4847   if (mips_macro_warning.delay_slot_length != 0)
4848     {
4849       if (mips_macro_warning.delay_slot_length
4850           != mips_macro_warning.first_insn_sizes[0])
4851         subtype |= RELAX_DELAY_SLOT_SIZE_FIRST;
4852       if (mips_macro_warning.delay_slot_length
4853           != mips_macro_warning.first_insn_sizes[1])
4854         subtype |= RELAX_DELAY_SLOT_SIZE_SECOND;
4855     }
4856
4857   /* Check instruction count requirements.  */
4858   if (mips_macro_warning.insns[0] > 1 || mips_macro_warning.insns[1] > 1)
4859     {
4860       if (mips_macro_warning.insns[1] > mips_macro_warning.insns[0])
4861         subtype |= RELAX_SECOND_LONGER;
4862       if (mips_opts.warn_about_macros)
4863         subtype |= RELAX_NOMACRO;
4864       if (mips_macro_warning.delay_slot_p)
4865         subtype |= RELAX_DELAY_SLOT;
4866     }
4867
4868   /* If both alternatives fail to fill a delay slot correctly,
4869      emit the warning now.  */
4870   if ((subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0
4871       && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0)
4872     {
4873       relax_substateT s;
4874       const char *msg;
4875
4876       s = subtype & (RELAX_DELAY_SLOT_16BIT
4877                      | RELAX_DELAY_SLOT_SIZE_FIRST
4878                      | RELAX_DELAY_SLOT_SIZE_SECOND);
4879       msg = macro_warning (s);
4880       if (msg != NULL)
4881         as_warn ("%s", msg);
4882       subtype &= ~s;
4883     }
4884
4885   /* If both implementations are longer than 1 instruction, then emit the
4886      warning now.  */
4887   if (mips_macro_warning.insns[0] > 1 && mips_macro_warning.insns[1] > 1)
4888     {
4889       relax_substateT s;
4890       const char *msg;
4891
4892       s = subtype & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT);
4893       msg = macro_warning (s);
4894       if (msg != NULL)
4895         as_warn ("%s", msg);
4896       subtype &= ~s;
4897     }
4898
4899   /* If any flags still set, then one implementation might need a warning
4900      and the other either will need one of a different kind or none at all.
4901      Pass any remaining flags over to relaxation.  */
4902   if (mips_macro_warning.first_frag != NULL)
4903     mips_macro_warning.first_frag->fr_subtype |= subtype;
4904 }
4905
4906 /* Instruction operand formats used in macros that vary between
4907    standard MIPS and microMIPS code.  */
4908
4909 static const char * const brk_fmt[2] = { "c", "mF" };
4910 static const char * const cop12_fmt[2] = { "E,o(b)", "E,~(b)" };
4911 static const char * const jalr_fmt[2] = { "d,s", "t,s" };
4912 static const char * const lui_fmt[2] = { "t,u", "s,u" };
4913 static const char * const mem12_fmt[2] = { "t,o(b)", "t,~(b)" };
4914 static const char * const mfhl_fmt[2] = { "d", "mj" };
4915 static const char * const shft_fmt[2] = { "d,w,<", "t,r,<" };
4916 static const char * const trap_fmt[2] = { "s,t,q", "s,t,|" };
4917
4918 #define BRK_FMT (brk_fmt[mips_opts.micromips])
4919 #define COP12_FMT (cop12_fmt[mips_opts.micromips])
4920 #define JALR_FMT (jalr_fmt[mips_opts.micromips])
4921 #define LUI_FMT (lui_fmt[mips_opts.micromips])
4922 #define MEM12_FMT (mem12_fmt[mips_opts.micromips])
4923 #define MFHL_FMT (mfhl_fmt[mips_opts.micromips])
4924 #define SHFT_FMT (shft_fmt[mips_opts.micromips])
4925 #define TRAP_FMT (trap_fmt[mips_opts.micromips])
4926
4927 /* Read a macro's relocation codes from *ARGS and store them in *R.
4928    The first argument in *ARGS will be either the code for a single
4929    relocation or -1 followed by the three codes that make up a
4930    composite relocation.  */
4931
4932 static void
4933 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
4934 {
4935   int i, next;
4936
4937   next = va_arg (*args, int);
4938   if (next >= 0)
4939     r[0] = (bfd_reloc_code_real_type) next;
4940   else
4941     for (i = 0; i < 3; i++)
4942       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
4943 }
4944
4945 /* Build an instruction created by a macro expansion.  This is passed
4946    a pointer to the count of instructions created so far, an
4947    expression, the name of the instruction to build, an operand format
4948    string, and corresponding arguments.  */
4949
4950 static void
4951 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
4952 {
4953   const struct mips_opcode *mo = NULL;
4954   bfd_reloc_code_real_type r[3];
4955   const struct mips_opcode *amo;
4956   struct hash_control *hash;
4957   struct mips_cl_insn insn;
4958   va_list args;
4959
4960   va_start (args, fmt);
4961
4962   if (mips_opts.mips16)
4963     {
4964       mips16_macro_build (ep, name, fmt, &args);
4965       va_end (args);
4966       return;
4967     }
4968
4969   r[0] = BFD_RELOC_UNUSED;
4970   r[1] = BFD_RELOC_UNUSED;
4971   r[2] = BFD_RELOC_UNUSED;
4972   hash = mips_opts.micromips ? micromips_op_hash : op_hash;
4973   amo = (struct mips_opcode *) hash_find (hash, name);
4974   gas_assert (amo);
4975   gas_assert (strcmp (name, amo->name) == 0);
4976
4977   do
4978     {
4979       /* Search until we get a match for NAME.  It is assumed here that
4980          macros will never generate MDMX, MIPS-3D, or MT instructions.
4981          We try to match an instruction that fulfils the branch delay
4982          slot instruction length requirement (if any) of the previous
4983          instruction.  While doing this we record the first instruction
4984          seen that matches all the other conditions and use it anyway
4985          if the requirement cannot be met; we will issue an appropriate
4986          warning later on.  */
4987       if (strcmp (fmt, amo->args) == 0
4988           && amo->pinfo != INSN_MACRO
4989           && is_opcode_valid (amo)
4990           && is_size_valid (amo))
4991         {
4992           if (is_delay_slot_valid (amo))
4993             {
4994               mo = amo;
4995               break;
4996             }
4997           else if (!mo)
4998             mo = amo;
4999         }
5000
5001       ++amo;
5002       gas_assert (amo->name);
5003     }
5004   while (strcmp (name, amo->name) == 0);
5005
5006   gas_assert (mo);
5007   create_insn (&insn, mo);
5008   for (;;)
5009     {
5010       switch (*fmt++)
5011         {
5012         case '\0':
5013           break;
5014
5015         case ',':
5016         case '(':
5017         case ')':
5018           continue;
5019
5020         case '+':
5021           switch (*fmt++)
5022             {
5023             case 'A':
5024             case 'E':
5025               INSERT_OPERAND (mips_opts.micromips,
5026                               EXTLSB, insn, va_arg (args, int));
5027               continue;
5028
5029             case 'B':
5030             case 'F':
5031               /* Note that in the macro case, these arguments are already
5032                  in MSB form.  (When handling the instruction in the
5033                  non-macro case, these arguments are sizes from which
5034                  MSB values must be calculated.)  */
5035               INSERT_OPERAND (mips_opts.micromips,
5036                               INSMSB, insn, va_arg (args, int));
5037               continue;
5038
5039             case 'C':
5040             case 'G':
5041             case 'H':
5042               /* Note that in the macro case, these arguments are already
5043                  in MSBD form.  (When handling the instruction in the
5044                  non-macro case, these arguments are sizes from which
5045                  MSBD values must be calculated.)  */
5046               INSERT_OPERAND (mips_opts.micromips,
5047                               EXTMSBD, insn, va_arg (args, int));
5048               continue;
5049
5050             case 'Q':
5051               gas_assert (!mips_opts.micromips);
5052               INSERT_OPERAND (0, SEQI, insn, va_arg (args, int));
5053               continue;
5054
5055             default:
5056               abort ();
5057             }
5058           continue;
5059
5060         case '2':
5061           INSERT_OPERAND (mips_opts.micromips, BP, insn, va_arg (args, int));
5062           continue;
5063
5064         case 'n':
5065           gas_assert (mips_opts.micromips);
5066         case 't':
5067         case 'w':
5068         case 'E':
5069           INSERT_OPERAND (mips_opts.micromips, RT, insn, va_arg (args, int));
5070           continue;
5071
5072         case 'c':
5073           gas_assert (!mips_opts.micromips);
5074           INSERT_OPERAND (0, CODE, insn, va_arg (args, int));
5075           continue;
5076
5077         case 'W':
5078           gas_assert (!mips_opts.micromips);
5079         case 'T':
5080           INSERT_OPERAND (mips_opts.micromips, FT, insn, va_arg (args, int));
5081           continue;
5082
5083         case 'G':
5084           if (mips_opts.micromips)
5085             INSERT_OPERAND (1, RS, insn, va_arg (args, int));
5086           else
5087             INSERT_OPERAND (0, RD, insn, va_arg (args, int));
5088           continue;
5089
5090         case 'K':
5091           gas_assert (!mips_opts.micromips);
5092         case 'd':
5093           INSERT_OPERAND (mips_opts.micromips, RD, insn, va_arg (args, int));
5094           continue;
5095
5096         case 'U':
5097           gas_assert (!mips_opts.micromips);
5098           {
5099             int tmp = va_arg (args, int);
5100
5101             INSERT_OPERAND (0, RT, insn, tmp);
5102             INSERT_OPERAND (0, RD, insn, tmp);
5103           }
5104           continue;
5105
5106         case 'V':
5107         case 'S':
5108           gas_assert (!mips_opts.micromips);
5109           INSERT_OPERAND (0, FS, insn, va_arg (args, int));
5110           continue;
5111
5112         case 'z':
5113           continue;
5114
5115         case '<':
5116           INSERT_OPERAND (mips_opts.micromips,
5117                           SHAMT, insn, va_arg (args, int));
5118           continue;
5119
5120         case 'D':
5121           gas_assert (!mips_opts.micromips);
5122           INSERT_OPERAND (0, FD, insn, va_arg (args, int));
5123           continue;
5124
5125         case 'B':
5126           gas_assert (!mips_opts.micromips);
5127           INSERT_OPERAND (0, CODE20, insn, va_arg (args, int));
5128           continue;
5129
5130         case 'J':
5131           gas_assert (!mips_opts.micromips);
5132           INSERT_OPERAND (0, CODE19, insn, va_arg (args, int));
5133           continue;
5134
5135         case 'q':
5136           gas_assert (!mips_opts.micromips);
5137           INSERT_OPERAND (0, CODE2, insn, va_arg (args, int));
5138           continue;
5139
5140         case 'b':
5141         case 's':
5142         case 'r':
5143         case 'v':
5144           INSERT_OPERAND (mips_opts.micromips, RS, insn, va_arg (args, int));
5145           continue;
5146
5147         case 'i':
5148         case 'j':
5149           macro_read_relocs (&args, r);
5150           gas_assert (*r == BFD_RELOC_GPREL16
5151                       || *r == BFD_RELOC_MIPS_HIGHER
5152                       || *r == BFD_RELOC_HI16_S
5153                       || *r == BFD_RELOC_LO16
5154                       || *r == BFD_RELOC_MIPS_GOT_OFST);
5155           continue;
5156
5157         case 'o':
5158           macro_read_relocs (&args, r);
5159           continue;
5160
5161         case 'u':
5162           macro_read_relocs (&args, r);
5163           gas_assert (ep != NULL
5164                       && (ep->X_op == O_constant
5165                           || (ep->X_op == O_symbol
5166                               && (*r == BFD_RELOC_MIPS_HIGHEST
5167                                   || *r == BFD_RELOC_HI16_S
5168                                   || *r == BFD_RELOC_HI16
5169                                   || *r == BFD_RELOC_GPREL16
5170                                   || *r == BFD_RELOC_MIPS_GOT_HI16
5171                                   || *r == BFD_RELOC_MIPS_CALL_HI16))));
5172           continue;
5173
5174         case 'p':
5175           gas_assert (ep != NULL);
5176
5177           /*
5178            * This allows macro() to pass an immediate expression for
5179            * creating short branches without creating a symbol.
5180            *
5181            * We don't allow branch relaxation for these branches, as
5182            * they should only appear in ".set nomacro" anyway.
5183            */
5184           if (ep->X_op == O_constant)
5185             {
5186               /* For microMIPS we always use relocations for branches.
5187                  So we should not resolve immediate values.  */
5188               gas_assert (!mips_opts.micromips);
5189
5190               if ((ep->X_add_number & 3) != 0)
5191                 as_bad (_("branch to misaligned address (0x%lx)"),
5192                         (unsigned long) ep->X_add_number);
5193               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
5194                 as_bad (_("branch address range overflow (0x%lx)"),
5195                         (unsigned long) ep->X_add_number);
5196               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
5197               ep = NULL;
5198             }
5199           else
5200             *r = BFD_RELOC_16_PCREL_S2;
5201           continue;
5202
5203         case 'a':
5204           gas_assert (ep != NULL);
5205           *r = BFD_RELOC_MIPS_JMP;
5206           continue;
5207
5208         case 'C':
5209           gas_assert (!mips_opts.micromips);
5210           INSERT_OPERAND (0, COPZ, insn, va_arg (args, unsigned long));
5211           continue;
5212
5213         case 'k':
5214           INSERT_OPERAND (mips_opts.micromips,
5215                           CACHE, insn, va_arg (args, unsigned long));
5216           continue;
5217
5218         case '|':
5219           gas_assert (mips_opts.micromips);
5220           INSERT_OPERAND (1, TRAP, insn, va_arg (args, int));
5221           continue;
5222
5223         case '.':
5224           gas_assert (mips_opts.micromips);
5225           INSERT_OPERAND (1, OFFSET10, insn, va_arg (args, int));
5226           continue;
5227
5228         case '\\':
5229           INSERT_OPERAND (mips_opts.micromips,
5230                           3BITPOS, insn, va_arg (args, unsigned int));
5231           continue;
5232
5233         case '~':
5234           INSERT_OPERAND (mips_opts.micromips,
5235                           OFFSET12, insn, va_arg (args, unsigned long));
5236           continue;
5237
5238         case 'N':
5239           gas_assert (mips_opts.micromips);
5240           INSERT_OPERAND (1, BCC, insn, va_arg (args, int));
5241           continue;
5242
5243         case 'm':       /* Opcode extension character.  */
5244           gas_assert (mips_opts.micromips);
5245           switch (*fmt++)
5246             {
5247             case 'j':
5248               INSERT_OPERAND (1, MJ, insn, va_arg (args, int));
5249               break;
5250
5251             case 'p':
5252               INSERT_OPERAND (1, MP, insn, va_arg (args, int));
5253               break;
5254
5255             case 'F':
5256               INSERT_OPERAND (1, IMMF, insn, va_arg (args, int));
5257               break;
5258
5259             default:
5260               abort ();
5261             }
5262           continue;
5263
5264         default:
5265           abort ();
5266         }
5267       break;
5268     }
5269   va_end (args);
5270   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5271
5272   append_insn (&insn, ep, r, TRUE);
5273 }
5274
5275 static void
5276 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
5277                     va_list *args)
5278 {
5279   struct mips_opcode *mo;
5280   struct mips_cl_insn insn;
5281   bfd_reloc_code_real_type r[3]
5282     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
5283
5284   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
5285   gas_assert (mo);
5286   gas_assert (strcmp (name, mo->name) == 0);
5287
5288   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
5289     {
5290       ++mo;
5291       gas_assert (mo->name);
5292       gas_assert (strcmp (name, mo->name) == 0);
5293     }
5294
5295   create_insn (&insn, mo);
5296   for (;;)
5297     {
5298       int c;
5299
5300       c = *fmt++;
5301       switch (c)
5302         {
5303         case '\0':
5304           break;
5305
5306         case ',':
5307         case '(':
5308         case ')':
5309           continue;
5310
5311         case 'y':
5312         case 'w':
5313           MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
5314           continue;
5315
5316         case 'x':
5317         case 'v':
5318           MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
5319           continue;
5320
5321         case 'z':
5322           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
5323           continue;
5324
5325         case 'Z':
5326           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
5327           continue;
5328
5329         case '0':
5330         case 'S':
5331         case 'P':
5332         case 'R':
5333           continue;
5334
5335         case 'X':
5336           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
5337           continue;
5338
5339         case 'Y':
5340           {
5341             int regno;
5342
5343             regno = va_arg (*args, int);
5344             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
5345             MIPS16_INSERT_OPERAND (REG32R, insn, regno);
5346           }
5347           continue;
5348
5349         case '<':
5350         case '>':
5351         case '4':
5352         case '5':
5353         case 'H':
5354         case 'W':
5355         case 'D':
5356         case 'j':
5357         case '8':
5358         case 'V':
5359         case 'C':
5360         case 'U':
5361         case 'k':
5362         case 'K':
5363         case 'p':
5364         case 'q':
5365           {
5366             offsetT value;
5367
5368             gas_assert (ep != NULL);
5369
5370             if (ep->X_op != O_constant)
5371               *r = (int) BFD_RELOC_UNUSED + c;
5372             else if (calculate_reloc (*r, ep->X_add_number, &value))
5373               {
5374                 mips16_immed (NULL, 0, c, *r, value, 0, &insn.insn_opcode);
5375                 ep = NULL;
5376                 *r = BFD_RELOC_UNUSED;
5377               }
5378           }
5379           continue;
5380
5381         case '6':
5382           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
5383           continue;
5384         }
5385
5386       break;
5387     }
5388
5389   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5390
5391   append_insn (&insn, ep, r, TRUE);
5392 }
5393
5394 /*
5395  * Sign-extend 32-bit mode constants that have bit 31 set and all
5396  * higher bits unset.
5397  */
5398 static void
5399 normalize_constant_expr (expressionS *ex)
5400 {
5401   if (ex->X_op == O_constant
5402       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5403     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5404                         - 0x80000000);
5405 }
5406
5407 /*
5408  * Sign-extend 32-bit mode address offsets that have bit 31 set and
5409  * all higher bits unset.
5410  */
5411 static void
5412 normalize_address_expr (expressionS *ex)
5413 {
5414   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
5415         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
5416       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5417     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5418                         - 0x80000000);
5419 }
5420
5421 /*
5422  * Generate a "jalr" instruction with a relocation hint to the called
5423  * function.  This occurs in NewABI PIC code.
5424  */
5425 static void
5426 macro_build_jalr (expressionS *ep, int cprestore)
5427 {
5428   static const bfd_reloc_code_real_type jalr_relocs[2]
5429     = { BFD_RELOC_MIPS_JALR, BFD_RELOC_MICROMIPS_JALR };
5430   bfd_reloc_code_real_type jalr_reloc = jalr_relocs[mips_opts.micromips];
5431   const char *jalr;
5432   char *f = NULL;
5433
5434   if (MIPS_JALR_HINT_P (ep))
5435     {
5436       frag_grow (8);
5437       f = frag_more (0);
5438     }
5439   if (mips_opts.micromips)
5440     {
5441       jalr = mips_opts.noreorder && !cprestore ? "jalr" : "jalrs";
5442       if (MIPS_JALR_HINT_P (ep)
5443           || (history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
5444         macro_build (NULL, jalr, "t,s", RA, PIC_CALL_REG);
5445       else
5446         macro_build (NULL, jalr, "mj", PIC_CALL_REG);
5447     }
5448   else
5449     macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
5450   if (MIPS_JALR_HINT_P (ep))
5451     fix_new_exp (frag_now, f - frag_now->fr_literal, 4, ep, FALSE, jalr_reloc);
5452 }
5453
5454 /*
5455  * Generate a "lui" instruction.
5456  */
5457 static void
5458 macro_build_lui (expressionS *ep, int regnum)
5459 {
5460   gas_assert (! mips_opts.mips16);
5461
5462   if (ep->X_op != O_constant)
5463     {
5464       gas_assert (ep->X_op == O_symbol);
5465       /* _gp_disp is a special case, used from s_cpload.
5466          __gnu_local_gp is used if mips_no_shared.  */
5467       gas_assert (mips_pic == NO_PIC
5468               || (! HAVE_NEWABI
5469                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
5470               || (! mips_in_shared
5471                   && strcmp (S_GET_NAME (ep->X_add_symbol),
5472                              "__gnu_local_gp") == 0));
5473     }
5474
5475   macro_build (ep, "lui", LUI_FMT, regnum, BFD_RELOC_HI16_S);
5476 }
5477
5478 /* Generate a sequence of instructions to do a load or store from a constant
5479    offset off of a base register (breg) into/from a target register (treg),
5480    using AT if necessary.  */
5481 static void
5482 macro_build_ldst_constoffset (expressionS *ep, const char *op,
5483                               int treg, int breg, int dbl)
5484 {
5485   gas_assert (ep->X_op == O_constant);
5486
5487   /* Sign-extending 32-bit constants makes their handling easier.  */
5488   if (!dbl)
5489     normalize_constant_expr (ep);
5490
5491   /* Right now, this routine can only handle signed 32-bit constants.  */
5492   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
5493     as_warn (_("operand overflow"));
5494
5495   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
5496     {
5497       /* Signed 16-bit offset will fit in the op.  Easy!  */
5498       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
5499     }
5500   else
5501     {
5502       /* 32-bit offset, need multiple instructions and AT, like:
5503            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
5504            addu     $tempreg,$tempreg,$breg
5505            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
5506          to handle the complete offset.  */
5507       macro_build_lui (ep, AT);
5508       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
5509       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
5510
5511       if (!mips_opts.at)
5512         as_bad (_("Macro used $at after \".set noat\""));
5513     }
5514 }
5515
5516 /*                      set_at()
5517  * Generates code to set the $at register to true (one)
5518  * if reg is less than the immediate expression.
5519  */
5520 static void
5521 set_at (int reg, int unsignedp)
5522 {
5523   if (imm_expr.X_op == O_constant
5524       && imm_expr.X_add_number >= -0x8000
5525       && imm_expr.X_add_number < 0x8000)
5526     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
5527                  AT, reg, BFD_RELOC_LO16);
5528   else
5529     {
5530       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5531       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
5532     }
5533 }
5534
5535 /* Warn if an expression is not a constant.  */
5536
5537 static void
5538 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
5539 {
5540   if (ex->X_op == O_big)
5541     as_bad (_("unsupported large constant"));
5542   else if (ex->X_op != O_constant)
5543     as_bad (_("Instruction %s requires absolute expression"),
5544             ip->insn_mo->name);
5545
5546   if (HAVE_32BIT_GPRS)
5547     normalize_constant_expr (ex);
5548 }
5549
5550 /* Count the leading zeroes by performing a binary chop. This is a
5551    bulky bit of source, but performance is a LOT better for the
5552    majority of values than a simple loop to count the bits:
5553        for (lcnt = 0; (lcnt < 32); lcnt++)
5554          if ((v) & (1 << (31 - lcnt)))
5555            break;
5556   However it is not code size friendly, and the gain will drop a bit
5557   on certain cached systems.
5558 */
5559 #define COUNT_TOP_ZEROES(v)             \
5560   (((v) & ~0xffff) == 0                 \
5561    ? ((v) & ~0xff) == 0                 \
5562      ? ((v) & ~0xf) == 0                \
5563        ? ((v) & ~0x3) == 0              \
5564          ? ((v) & ~0x1) == 0            \
5565            ? !(v)                       \
5566              ? 32                       \
5567              : 31                       \
5568            : 30                         \
5569          : ((v) & ~0x7) == 0            \
5570            ? 29                         \
5571            : 28                         \
5572        : ((v) & ~0x3f) == 0             \
5573          ? ((v) & ~0x1f) == 0           \
5574            ? 27                         \
5575            : 26                         \
5576          : ((v) & ~0x7f) == 0           \
5577            ? 25                         \
5578            : 24                         \
5579      : ((v) & ~0xfff) == 0              \
5580        ? ((v) & ~0x3ff) == 0            \
5581          ? ((v) & ~0x1ff) == 0          \
5582            ? 23                         \
5583            : 22                         \
5584          : ((v) & ~0x7ff) == 0          \
5585            ? 21                         \
5586            : 20                         \
5587        : ((v) & ~0x3fff) == 0           \
5588          ? ((v) & ~0x1fff) == 0         \
5589            ? 19                         \
5590            : 18                         \
5591          : ((v) & ~0x7fff) == 0         \
5592            ? 17                         \
5593            : 16                         \
5594    : ((v) & ~0xffffff) == 0             \
5595      ? ((v) & ~0xfffff) == 0            \
5596        ? ((v) & ~0x3ffff) == 0          \
5597          ? ((v) & ~0x1ffff) == 0        \
5598            ? 15                         \
5599            : 14                         \
5600          : ((v) & ~0x7ffff) == 0        \
5601            ? 13                         \
5602            : 12                         \
5603        : ((v) & ~0x3fffff) == 0         \
5604          ? ((v) & ~0x1fffff) == 0       \
5605            ? 11                         \
5606            : 10                         \
5607          : ((v) & ~0x7fffff) == 0       \
5608            ? 9                          \
5609            : 8                          \
5610      : ((v) & ~0xfffffff) == 0          \
5611        ? ((v) & ~0x3ffffff) == 0        \
5612          ? ((v) & ~0x1ffffff) == 0      \
5613            ? 7                          \
5614            : 6                          \
5615          : ((v) & ~0x7ffffff) == 0      \
5616            ? 5                          \
5617            : 4                          \
5618        : ((v) & ~0x3fffffff) == 0       \
5619          ? ((v) & ~0x1fffffff) == 0     \
5620            ? 3                          \
5621            : 2                          \
5622          : ((v) & ~0x7fffffff) == 0     \
5623            ? 1                          \
5624            : 0)
5625
5626 /*                      load_register()
5627  *  This routine generates the least number of instructions necessary to load
5628  *  an absolute expression value into a register.
5629  */
5630 static void
5631 load_register (int reg, expressionS *ep, int dbl)
5632 {
5633   int freg;
5634   expressionS hi32, lo32;
5635
5636   if (ep->X_op != O_big)
5637     {
5638       gas_assert (ep->X_op == O_constant);
5639
5640       /* Sign-extending 32-bit constants makes their handling easier.  */
5641       if (!dbl)
5642         normalize_constant_expr (ep);
5643
5644       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
5645         {
5646           /* We can handle 16 bit signed values with an addiu to
5647              $zero.  No need to ever use daddiu here, since $zero and
5648              the result are always correct in 32 bit mode.  */
5649           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5650           return;
5651         }
5652       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
5653         {
5654           /* We can handle 16 bit unsigned values with an ori to
5655              $zero.  */
5656           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
5657           return;
5658         }
5659       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
5660         {
5661           /* 32 bit values require an lui.  */
5662           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5663           if ((ep->X_add_number & 0xffff) != 0)
5664             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
5665           return;
5666         }
5667     }
5668
5669   /* The value is larger than 32 bits.  */
5670
5671   if (!dbl || HAVE_32BIT_GPRS)
5672     {
5673       char value[32];
5674
5675       sprintf_vma (value, ep->X_add_number);
5676       as_bad (_("Number (0x%s) larger than 32 bits"), value);
5677       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5678       return;
5679     }
5680
5681   if (ep->X_op != O_big)
5682     {
5683       hi32 = *ep;
5684       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
5685       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
5686       hi32.X_add_number &= 0xffffffff;
5687       lo32 = *ep;
5688       lo32.X_add_number &= 0xffffffff;
5689     }
5690   else
5691     {
5692       gas_assert (ep->X_add_number > 2);
5693       if (ep->X_add_number == 3)
5694         generic_bignum[3] = 0;
5695       else if (ep->X_add_number > 4)
5696         as_bad (_("Number larger than 64 bits"));
5697       lo32.X_op = O_constant;
5698       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
5699       hi32.X_op = O_constant;
5700       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
5701     }
5702
5703   if (hi32.X_add_number == 0)
5704     freg = 0;
5705   else
5706     {
5707       int shift, bit;
5708       unsigned long hi, lo;
5709
5710       if (hi32.X_add_number == (offsetT) 0xffffffff)
5711         {
5712           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
5713             {
5714               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5715               return;
5716             }
5717           if (lo32.X_add_number & 0x80000000)
5718             {
5719               macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5720               if (lo32.X_add_number & 0xffff)
5721                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
5722               return;
5723             }
5724         }
5725
5726       /* Check for 16bit shifted constant.  We know that hi32 is
5727          non-zero, so start the mask on the first bit of the hi32
5728          value.  */
5729       shift = 17;
5730       do
5731         {
5732           unsigned long himask, lomask;
5733
5734           if (shift < 32)
5735             {
5736               himask = 0xffff >> (32 - shift);
5737               lomask = (0xffff << shift) & 0xffffffff;
5738             }
5739           else
5740             {
5741               himask = 0xffff << (shift - 32);
5742               lomask = 0;
5743             }
5744           if ((hi32.X_add_number & ~(offsetT) himask) == 0
5745               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
5746             {
5747               expressionS tmp;
5748
5749               tmp.X_op = O_constant;
5750               if (shift < 32)
5751                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
5752                                     | (lo32.X_add_number >> shift));
5753               else
5754                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
5755               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
5756               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", SHFT_FMT,
5757                            reg, reg, (shift >= 32) ? shift - 32 : shift);
5758               return;
5759             }
5760           ++shift;
5761         }
5762       while (shift <= (64 - 16));
5763
5764       /* Find the bit number of the lowest one bit, and store the
5765          shifted value in hi/lo.  */
5766       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
5767       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
5768       if (lo != 0)
5769         {
5770           bit = 0;
5771           while ((lo & 1) == 0)
5772             {
5773               lo >>= 1;
5774               ++bit;
5775             }
5776           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
5777           hi >>= bit;
5778         }
5779       else
5780         {
5781           bit = 32;
5782           while ((hi & 1) == 0)
5783             {
5784               hi >>= 1;
5785               ++bit;
5786             }
5787           lo = hi;
5788           hi = 0;
5789         }
5790
5791       /* Optimize if the shifted value is a (power of 2) - 1.  */
5792       if ((hi == 0 && ((lo + 1) & lo) == 0)
5793           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
5794         {
5795           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
5796           if (shift != 0)
5797             {
5798               expressionS tmp;
5799
5800               /* This instruction will set the register to be all
5801                  ones.  */
5802               tmp.X_op = O_constant;
5803               tmp.X_add_number = (offsetT) -1;
5804               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5805               if (bit != 0)
5806                 {
5807                   bit += shift;
5808                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", SHFT_FMT,
5809                                reg, reg, (bit >= 32) ? bit - 32 : bit);
5810                 }
5811               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", SHFT_FMT,
5812                            reg, reg, (shift >= 32) ? shift - 32 : shift);
5813               return;
5814             }
5815         }
5816
5817       /* Sign extend hi32 before calling load_register, because we can
5818          generally get better code when we load a sign extended value.  */
5819       if ((hi32.X_add_number & 0x80000000) != 0)
5820         hi32.X_add_number |= ~(offsetT) 0xffffffff;
5821       load_register (reg, &hi32, 0);
5822       freg = reg;
5823     }
5824   if ((lo32.X_add_number & 0xffff0000) == 0)
5825     {
5826       if (freg != 0)
5827         {
5828           macro_build (NULL, "dsll32", SHFT_FMT, reg, freg, 0);
5829           freg = reg;
5830         }
5831     }
5832   else
5833     {
5834       expressionS mid16;
5835
5836       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
5837         {
5838           macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5839           macro_build (NULL, "dsrl32", SHFT_FMT, reg, reg, 0);
5840           return;
5841         }
5842
5843       if (freg != 0)
5844         {
5845           macro_build (NULL, "dsll", SHFT_FMT, reg, freg, 16);
5846           freg = reg;
5847         }
5848       mid16 = lo32;
5849       mid16.X_add_number >>= 16;
5850       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
5851       macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5852       freg = reg;
5853     }
5854   if ((lo32.X_add_number & 0xffff) != 0)
5855     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
5856 }
5857
5858 static inline void
5859 load_delay_nop (void)
5860 {
5861   if (!gpr_interlocks)
5862     macro_build (NULL, "nop", "");
5863 }
5864
5865 /* Load an address into a register.  */
5866
5867 static void
5868 load_address (int reg, expressionS *ep, int *used_at)
5869 {
5870   if (ep->X_op != O_constant
5871       && ep->X_op != O_symbol)
5872     {
5873       as_bad (_("expression too complex"));
5874       ep->X_op = O_constant;
5875     }
5876
5877   if (ep->X_op == O_constant)
5878     {
5879       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
5880       return;
5881     }
5882
5883   if (mips_pic == NO_PIC)
5884     {
5885       /* If this is a reference to a GP relative symbol, we want
5886            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
5887          Otherwise we want
5888            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
5889            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
5890          If we have an addend, we always use the latter form.
5891
5892          With 64bit address space and a usable $at we want
5893            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
5894            lui          $at,<sym>               (BFD_RELOC_HI16_S)
5895            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
5896            daddiu       $at,<sym>               (BFD_RELOC_LO16)
5897            dsll32       $reg,0
5898            daddu        $reg,$reg,$at
5899
5900          If $at is already in use, we use a path which is suboptimal
5901          on superscalar processors.
5902            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
5903            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
5904            dsll         $reg,16
5905            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
5906            dsll         $reg,16
5907            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
5908
5909          For GP relative symbols in 64bit address space we can use
5910          the same sequence as in 32bit address space.  */
5911       if (HAVE_64BIT_SYMBOLS)
5912         {
5913           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
5914               && !nopic_need_relax (ep->X_add_symbol, 1))
5915             {
5916               relax_start (ep->X_add_symbol);
5917               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
5918                            mips_gp_register, BFD_RELOC_GPREL16);
5919               relax_switch ();
5920             }
5921
5922           if (*used_at == 0 && mips_opts.at)
5923             {
5924               macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
5925               macro_build (ep, "lui", LUI_FMT, AT, BFD_RELOC_HI16_S);
5926               macro_build (ep, "daddiu", "t,r,j", reg, reg,
5927                            BFD_RELOC_MIPS_HIGHER);
5928               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
5929               macro_build (NULL, "dsll32", SHFT_FMT, reg, reg, 0);
5930               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
5931               *used_at = 1;
5932             }
5933           else
5934             {
5935               macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
5936               macro_build (ep, "daddiu", "t,r,j", reg, reg,
5937                            BFD_RELOC_MIPS_HIGHER);
5938               macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5939               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
5940               macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5941               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
5942             }
5943
5944           if (mips_relax.sequence)
5945             relax_end ();
5946         }
5947       else
5948         {
5949           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
5950               && !nopic_need_relax (ep->X_add_symbol, 1))
5951             {
5952               relax_start (ep->X_add_symbol);
5953               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
5954                            mips_gp_register, BFD_RELOC_GPREL16);
5955               relax_switch ();
5956             }
5957           macro_build_lui (ep, reg);
5958           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
5959                        reg, reg, BFD_RELOC_LO16);
5960           if (mips_relax.sequence)
5961             relax_end ();
5962         }
5963     }
5964   else if (!mips_big_got)
5965     {
5966       expressionS ex;
5967
5968       /* If this is a reference to an external symbol, we want
5969            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
5970          Otherwise we want
5971            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
5972            nop
5973            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
5974          If there is a constant, it must be added in after.
5975
5976          If we have NewABI, we want
5977            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5978          unless we're referencing a global symbol with a non-zero
5979          offset, in which case cst must be added separately.  */
5980       if (HAVE_NEWABI)
5981         {
5982           if (ep->X_add_number)
5983             {
5984               ex.X_add_number = ep->X_add_number;
5985               ep->X_add_number = 0;
5986               relax_start (ep->X_add_symbol);
5987               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5988                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5989               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
5990                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5991               ex.X_op = O_constant;
5992               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
5993                            reg, reg, BFD_RELOC_LO16);
5994               ep->X_add_number = ex.X_add_number;
5995               relax_switch ();
5996             }
5997           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5998                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5999           if (mips_relax.sequence)
6000             relax_end ();
6001         }
6002       else
6003         {
6004           ex.X_add_number = ep->X_add_number;
6005           ep->X_add_number = 0;
6006           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6007                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6008           load_delay_nop ();
6009           relax_start (ep->X_add_symbol);
6010           relax_switch ();
6011           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6012                        BFD_RELOC_LO16);
6013           relax_end ();
6014
6015           if (ex.X_add_number != 0)
6016             {
6017               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6018                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6019               ex.X_op = O_constant;
6020               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
6021                            reg, reg, BFD_RELOC_LO16);
6022             }
6023         }
6024     }
6025   else if (mips_big_got)
6026     {
6027       expressionS ex;
6028
6029       /* This is the large GOT case.  If this is a reference to an
6030          external symbol, we want
6031            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
6032            addu         $reg,$reg,$gp
6033            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
6034
6035          Otherwise, for a reference to a local symbol in old ABI, we want
6036            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
6037            nop
6038            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
6039          If there is a constant, it must be added in after.
6040
6041          In the NewABI, for local symbols, with or without offsets, we want:
6042            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
6043            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
6044       */
6045       if (HAVE_NEWABI)
6046         {
6047           ex.X_add_number = ep->X_add_number;
6048           ep->X_add_number = 0;
6049           relax_start (ep->X_add_symbol);
6050           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
6051           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6052                        reg, reg, mips_gp_register);
6053           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
6054                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
6055           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6056             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6057           else if (ex.X_add_number)
6058             {
6059               ex.X_op = O_constant;
6060               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6061                            BFD_RELOC_LO16);
6062             }
6063
6064           ep->X_add_number = ex.X_add_number;
6065           relax_switch ();
6066           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6067                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6068           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6069                        BFD_RELOC_MIPS_GOT_OFST);
6070           relax_end ();
6071         }
6072       else
6073         {
6074           ex.X_add_number = ep->X_add_number;
6075           ep->X_add_number = 0;
6076           relax_start (ep->X_add_symbol);
6077           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
6078           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6079                        reg, reg, mips_gp_register);
6080           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
6081                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
6082           relax_switch ();
6083           if (reg_needs_delay (mips_gp_register))
6084             {
6085               /* We need a nop before loading from $gp.  This special
6086                  check is required because the lui which starts the main
6087                  instruction stream does not refer to $gp, and so will not
6088                  insert the nop which may be required.  */
6089               macro_build (NULL, "nop", "");
6090             }
6091           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6092                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6093           load_delay_nop ();
6094           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6095                        BFD_RELOC_LO16);
6096           relax_end ();
6097
6098           if (ex.X_add_number != 0)
6099             {
6100               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6101                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6102               ex.X_op = O_constant;
6103               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6104                            BFD_RELOC_LO16);
6105             }
6106         }
6107     }
6108   else
6109     abort ();
6110
6111   if (!mips_opts.at && *used_at == 1)
6112     as_bad (_("Macro used $at after \".set noat\""));
6113 }
6114
6115 /* Move the contents of register SOURCE into register DEST.  */
6116
6117 static void
6118 move_register (int dest, int source)
6119 {
6120   /* Prefer to use a 16-bit microMIPS instruction unless the previous
6121      instruction specifically requires a 32-bit one.  */
6122   if (mips_opts.micromips
6123       && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
6124     macro_build (NULL, "move", "mp,mj", dest, source);
6125   else
6126     macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
6127                  dest, source, 0);
6128 }
6129
6130 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
6131    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
6132    The two alternatives are:
6133
6134    Global symbol                Local sybmol
6135    -------------                ------------
6136    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
6137    ...                          ...
6138    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
6139
6140    load_got_offset emits the first instruction and add_got_offset
6141    emits the second for a 16-bit offset or add_got_offset_hilo emits
6142    a sequence to add a 32-bit offset using a scratch register.  */
6143
6144 static void
6145 load_got_offset (int dest, expressionS *local)
6146 {
6147   expressionS global;
6148
6149   global = *local;
6150   global.X_add_number = 0;
6151
6152   relax_start (local->X_add_symbol);
6153   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
6154                BFD_RELOC_MIPS_GOT16, mips_gp_register);
6155   relax_switch ();
6156   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
6157                BFD_RELOC_MIPS_GOT16, mips_gp_register);
6158   relax_end ();
6159 }
6160
6161 static void
6162 add_got_offset (int dest, expressionS *local)
6163 {
6164   expressionS global;
6165
6166   global.X_op = O_constant;
6167   global.X_op_symbol = NULL;
6168   global.X_add_symbol = NULL;
6169   global.X_add_number = local->X_add_number;
6170
6171   relax_start (local->X_add_symbol);
6172   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
6173                dest, dest, BFD_RELOC_LO16);
6174   relax_switch ();
6175   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
6176   relax_end ();
6177 }
6178
6179 static void
6180 add_got_offset_hilo (int dest, expressionS *local, int tmp)
6181 {
6182   expressionS global;
6183   int hold_mips_optimize;
6184
6185   global.X_op = O_constant;
6186   global.X_op_symbol = NULL;
6187   global.X_add_symbol = NULL;
6188   global.X_add_number = local->X_add_number;
6189
6190   relax_start (local->X_add_symbol);
6191   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
6192   relax_switch ();
6193   /* Set mips_optimize around the lui instruction to avoid
6194      inserting an unnecessary nop after the lw.  */
6195   hold_mips_optimize = mips_optimize;
6196   mips_optimize = 2;
6197   macro_build_lui (&global, tmp);
6198   mips_optimize = hold_mips_optimize;
6199   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
6200   relax_end ();
6201
6202   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
6203 }
6204
6205 /* Emit a sequence of instructions to emulate a branch likely operation.
6206    BR is an ordinary branch corresponding to one to be emulated.  BRNEG
6207    is its complementing branch with the original condition negated.
6208    CALL is set if the original branch specified the link operation.
6209    EP, FMT, SREG and TREG specify the usual macro_build() parameters.
6210
6211    Code like this is produced in the noreorder mode:
6212
6213         BRNEG   <args>, 1f
6214          nop
6215         b       <sym>
6216          delay slot (executed only if branch taken)
6217     1:
6218
6219    or, if CALL is set:
6220
6221         BRNEG   <args>, 1f
6222          nop
6223         bal     <sym>
6224          delay slot (executed only if branch taken)
6225     1:
6226
6227    In the reorder mode the delay slot would be filled with a nop anyway,
6228    so code produced is simply:
6229
6230         BR      <args>, <sym>
6231          nop
6232
6233    This function is used when producing code for the microMIPS ASE that
6234    does not implement branch likely instructions in hardware.  */
6235
6236 static void
6237 macro_build_branch_likely (const char *br, const char *brneg,
6238                            int call, expressionS *ep, const char *fmt,
6239                            unsigned int sreg, unsigned int treg)
6240 {
6241   int noreorder = mips_opts.noreorder;
6242   expressionS expr1;
6243
6244   gas_assert (mips_opts.micromips);
6245   start_noreorder ();
6246   if (noreorder)
6247     {
6248       micromips_label_expr (&expr1);
6249       macro_build (&expr1, brneg, fmt, sreg, treg);
6250       macro_build (NULL, "nop", "");
6251       macro_build (ep, call ? "bal" : "b", "p");
6252
6253       /* Set to true so that append_insn adds a label.  */
6254       emit_branch_likely_macro = TRUE;
6255     }
6256   else
6257     {
6258       macro_build (ep, br, fmt, sreg, treg);
6259       macro_build (NULL, "nop", "");
6260     }
6261   end_noreorder ();
6262 }
6263
6264 /* Emit a coprocessor branch-likely macro specified by TYPE, using CC as
6265    the condition code tested.  EP specifies the branch target.  */
6266
6267 static void
6268 macro_build_branch_ccl (int type, expressionS *ep, unsigned int cc)
6269 {
6270   const int call = 0;
6271   const char *brneg;
6272   const char *br;
6273
6274   switch (type)
6275     {
6276     case M_BC1FL:
6277       br = "bc1f";
6278       brneg = "bc1t";
6279       break;
6280     case M_BC1TL:
6281       br = "bc1t";
6282       brneg = "bc1f";
6283       break;
6284     case M_BC2FL:
6285       br = "bc2f";
6286       brneg = "bc2t";
6287       break;
6288     case M_BC2TL:
6289       br = "bc2t";
6290       brneg = "bc2f";
6291       break;
6292     default:
6293       abort ();
6294     }
6295   macro_build_branch_likely (br, brneg, call, ep, "N,p", cc, ZERO);
6296 }
6297
6298 /* Emit a two-argument branch macro specified by TYPE, using SREG as
6299    the register tested.  EP specifies the branch target.  */
6300
6301 static void
6302 macro_build_branch_rs (int type, expressionS *ep, unsigned int sreg)
6303 {
6304   const char *brneg = NULL;
6305   const char *br;
6306   int call = 0;
6307
6308   switch (type)
6309     {
6310     case M_BGEZ:
6311       br = "bgez";
6312       break;
6313     case M_BGEZL:
6314       br = mips_opts.micromips ? "bgez" : "bgezl";
6315       brneg = "bltz";
6316       break;
6317     case M_BGEZALL:
6318       gas_assert (mips_opts.micromips);
6319       br = "bgezals";
6320       brneg = "bltz";
6321       call = 1;
6322       break;
6323     case M_BGTZ:
6324       br = "bgtz";
6325       break;
6326     case M_BGTZL:
6327       br = mips_opts.micromips ? "bgtz" : "bgtzl";
6328       brneg = "blez";
6329       break;
6330     case M_BLEZ:
6331       br = "blez";
6332       break;
6333     case M_BLEZL:
6334       br = mips_opts.micromips ? "blez" : "blezl";
6335       brneg = "bgtz";
6336       break;
6337     case M_BLTZ:
6338       br = "bltz";
6339       break;
6340     case M_BLTZL:
6341       br = mips_opts.micromips ? "bltz" : "bltzl";
6342       brneg = "bgez";
6343       break;
6344     case M_BLTZALL:
6345       gas_assert (mips_opts.micromips);
6346       br = "bltzals";
6347       brneg = "bgez";
6348       call = 1;
6349       break;
6350     default:
6351       abort ();
6352     }
6353   if (mips_opts.micromips && brneg)
6354     macro_build_branch_likely (br, brneg, call, ep, "s,p", sreg, ZERO);
6355   else
6356     macro_build (ep, br, "s,p", sreg);
6357 }
6358
6359 /* Emit a three-argument branch macro specified by TYPE, using SREG and
6360    TREG as the registers tested.  EP specifies the branch target.  */
6361
6362 static void
6363 macro_build_branch_rsrt (int type, expressionS *ep,
6364                          unsigned int sreg, unsigned int treg)
6365 {
6366   const char *brneg = NULL;
6367   const int call = 0;
6368   const char *br;
6369
6370   switch (type)
6371     {
6372     case M_BEQ:
6373     case M_BEQ_I:
6374       br = "beq";
6375       break;
6376     case M_BEQL:
6377     case M_BEQL_I:
6378       br = mips_opts.micromips ? "beq" : "beql";
6379       brneg = "bne";
6380       break;
6381     case M_BNE:
6382     case M_BNE_I:
6383       br = "bne";
6384       break;
6385     case M_BNEL:
6386     case M_BNEL_I:
6387       br = mips_opts.micromips ? "bne" : "bnel";
6388       brneg = "beq";
6389       break;
6390     default:
6391       abort ();
6392     }
6393   if (mips_opts.micromips && brneg)
6394     macro_build_branch_likely (br, brneg, call, ep, "s,t,p", sreg, treg);
6395   else
6396     macro_build (ep, br, "s,t,p", sreg, treg);
6397 }
6398
6399 /*
6400  *                      Build macros
6401  *   This routine implements the seemingly endless macro or synthesized
6402  * instructions and addressing modes in the mips assembly language. Many
6403  * of these macros are simple and are similar to each other. These could
6404  * probably be handled by some kind of table or grammar approach instead of
6405  * this verbose method. Others are not simple macros but are more like
6406  * optimizing code generation.
6407  *   One interesting optimization is when several store macros appear
6408  * consecutively that would load AT with the upper half of the same address.
6409  * The ensuing load upper instructions are ommited. This implies some kind
6410  * of global optimization. We currently only optimize within a single macro.
6411  *   For many of the load and store macros if the address is specified as a
6412  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
6413  * first load register 'at' with zero and use it as the base register. The
6414  * mips assembler simply uses register $zero. Just one tiny optimization
6415  * we're missing.
6416  */
6417 static void
6418 macro (struct mips_cl_insn *ip)
6419 {
6420   unsigned int treg, sreg, dreg, breg;
6421   unsigned int tempreg;
6422   int mask;
6423   int used_at = 0;
6424   expressionS label_expr;
6425   expressionS expr1;
6426   expressionS *ep;
6427   const char *s;
6428   const char *s2;
6429   const char *fmt;
6430   int likely = 0;
6431   int coproc = 0;
6432   int off12 = 0;
6433   int call = 0;
6434   int jals = 0;
6435   int dbl = 0;
6436   int imm = 0;
6437   int ust = 0;
6438   int lp = 0;
6439   int ab = 0;
6440   int off0 = 0;
6441   int off;
6442   offsetT maxnum;
6443   bfd_reloc_code_real_type r;
6444   int hold_mips_optimize;
6445
6446   gas_assert (! mips_opts.mips16);
6447
6448   treg = EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
6449   dreg = EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
6450   sreg = breg = EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
6451   mask = ip->insn_mo->mask;
6452
6453   label_expr.X_op = O_constant;
6454   label_expr.X_op_symbol = NULL;
6455   label_expr.X_add_symbol = NULL;
6456   label_expr.X_add_number = 0;
6457
6458   expr1.X_op = O_constant;
6459   expr1.X_op_symbol = NULL;
6460   expr1.X_add_symbol = NULL;
6461   expr1.X_add_number = 1;
6462
6463   switch (mask)
6464     {
6465     case M_DABS:
6466       dbl = 1;
6467     case M_ABS:
6468       /*    bgez    $a0,1f
6469             move    v0,$a0
6470             sub     v0,$zero,$a0
6471          1:
6472        */
6473
6474       start_noreorder ();
6475
6476       if (mips_opts.micromips)
6477         micromips_label_expr (&label_expr);
6478       else
6479         label_expr.X_add_number = 8;
6480       macro_build (&label_expr, "bgez", "s,p", sreg);
6481       if (dreg == sreg)
6482         macro_build (NULL, "nop", "");
6483       else
6484         move_register (dreg, sreg);
6485       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
6486       if (mips_opts.micromips)
6487         micromips_add_label ();
6488
6489       end_noreorder ();
6490       break;
6491
6492     case M_ADD_I:
6493       s = "addi";
6494       s2 = "add";
6495       goto do_addi;
6496     case M_ADDU_I:
6497       s = "addiu";
6498       s2 = "addu";
6499       goto do_addi;
6500     case M_DADD_I:
6501       dbl = 1;
6502       s = "daddi";
6503       s2 = "dadd";
6504       if (!mips_opts.micromips)
6505         goto do_addi;
6506       if (imm_expr.X_op == O_constant
6507           && imm_expr.X_add_number >= -0x200
6508           && imm_expr.X_add_number < 0x200)
6509         {
6510           macro_build (NULL, s, "t,r,.", treg, sreg, imm_expr.X_add_number);
6511           break;
6512         }
6513       goto do_addi_i;
6514     case M_DADDU_I:
6515       dbl = 1;
6516       s = "daddiu";
6517       s2 = "daddu";
6518     do_addi:
6519       if (imm_expr.X_op == O_constant
6520           && imm_expr.X_add_number >= -0x8000
6521           && imm_expr.X_add_number < 0x8000)
6522         {
6523           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
6524           break;
6525         }
6526     do_addi_i:
6527       used_at = 1;
6528       load_register (AT, &imm_expr, dbl);
6529       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6530       break;
6531
6532     case M_AND_I:
6533       s = "andi";
6534       s2 = "and";
6535       goto do_bit;
6536     case M_OR_I:
6537       s = "ori";
6538       s2 = "or";
6539       goto do_bit;
6540     case M_NOR_I:
6541       s = "";
6542       s2 = "nor";
6543       goto do_bit;
6544     case M_XOR_I:
6545       s = "xori";
6546       s2 = "xor";
6547     do_bit:
6548       if (imm_expr.X_op == O_constant
6549           && imm_expr.X_add_number >= 0
6550           && imm_expr.X_add_number < 0x10000)
6551         {
6552           if (mask != M_NOR_I)
6553             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
6554           else
6555             {
6556               macro_build (&imm_expr, "ori", "t,r,i",
6557                            treg, sreg, BFD_RELOC_LO16);
6558               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
6559             }
6560           break;
6561         }
6562
6563       used_at = 1;
6564       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
6565       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6566       break;
6567
6568     case M_BALIGN:
6569       switch (imm_expr.X_add_number)
6570         {
6571         case 0:
6572           macro_build (NULL, "nop", "");
6573           break;
6574         case 2:
6575           macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
6576           break;
6577         case 1:
6578         case 3:
6579           macro_build (NULL, "balign", "t,s,2", treg, sreg,
6580                        (int) imm_expr.X_add_number);
6581           break;
6582         default:
6583           as_bad (_("BALIGN immediate not 0, 1, 2 or 3 (%lu)"),
6584                   (unsigned long) imm_expr.X_add_number);
6585           break;
6586         }
6587       break;
6588
6589     case M_BC1FL:
6590     case M_BC1TL:
6591     case M_BC2FL:
6592     case M_BC2TL:
6593       gas_assert (mips_opts.micromips);
6594       macro_build_branch_ccl (mask, &offset_expr,
6595                               EXTRACT_OPERAND (1, BCC, *ip));
6596       break;
6597
6598     case M_BEQ_I:
6599     case M_BEQL_I:
6600     case M_BNE_I:
6601     case M_BNEL_I:
6602       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6603         treg = 0;
6604       else
6605         {
6606           treg = AT;
6607           used_at = 1;
6608           load_register (treg, &imm_expr, HAVE_64BIT_GPRS);
6609         }
6610       /* Fall through.  */
6611     case M_BEQL:
6612     case M_BNEL:
6613       macro_build_branch_rsrt (mask, &offset_expr, sreg, treg);
6614       break;
6615
6616     case M_BGEL:
6617       likely = 1;
6618     case M_BGE:
6619       if (treg == 0)
6620         macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, sreg);
6621       else if (sreg == 0)
6622         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, treg);
6623       else
6624         {
6625           used_at = 1;
6626           macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
6627           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6628                                    &offset_expr, AT, ZERO);
6629         }
6630       break;
6631
6632     case M_BGEZL:
6633     case M_BGEZALL:
6634     case M_BGTZL:
6635     case M_BLEZL:
6636     case M_BLTZL:
6637     case M_BLTZALL:
6638       macro_build_branch_rs (mask, &offset_expr, sreg);
6639       break;
6640
6641     case M_BGTL_I:
6642       likely = 1;
6643     case M_BGT_I:
6644       /* Check for > max integer.  */
6645       maxnum = 0x7fffffff;
6646       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6647         {
6648           maxnum <<= 16;
6649           maxnum |= 0xffff;
6650           maxnum <<= 16;
6651           maxnum |= 0xffff;
6652         }
6653       if (imm_expr.X_op == O_constant
6654           && imm_expr.X_add_number >= maxnum
6655           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6656         {
6657         do_false:
6658           /* Result is always false.  */
6659           if (! likely)
6660             macro_build (NULL, "nop", "");
6661           else
6662             macro_build_branch_rsrt (M_BNEL, &offset_expr, ZERO, ZERO);
6663           break;
6664         }
6665       if (imm_expr.X_op != O_constant)
6666         as_bad (_("Unsupported large constant"));
6667       ++imm_expr.X_add_number;
6668       /* FALLTHROUGH */
6669     case M_BGE_I:
6670     case M_BGEL_I:
6671       if (mask == M_BGEL_I)
6672         likely = 1;
6673       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6674         {
6675           macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ,
6676                                  &offset_expr, sreg);
6677           break;
6678         }
6679       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6680         {
6681           macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ,
6682                                  &offset_expr, sreg);
6683           break;
6684         }
6685       maxnum = 0x7fffffff;
6686       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6687         {
6688           maxnum <<= 16;
6689           maxnum |= 0xffff;
6690           maxnum <<= 16;
6691           maxnum |= 0xffff;
6692         }
6693       maxnum = - maxnum - 1;
6694       if (imm_expr.X_op == O_constant
6695           && imm_expr.X_add_number <= maxnum
6696           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6697         {
6698         do_true:
6699           /* result is always true */
6700           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
6701           macro_build (&offset_expr, "b", "p");
6702           break;
6703         }
6704       used_at = 1;
6705       set_at (sreg, 0);
6706       macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6707                                &offset_expr, AT, ZERO);
6708       break;
6709
6710     case M_BGEUL:
6711       likely = 1;
6712     case M_BGEU:
6713       if (treg == 0)
6714         goto do_true;
6715       else if (sreg == 0)
6716         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6717                                  &offset_expr, ZERO, treg);
6718       else
6719         {
6720           used_at = 1;
6721           macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
6722           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6723                                    &offset_expr, AT, ZERO);
6724         }
6725       break;
6726
6727     case M_BGTUL_I:
6728       likely = 1;
6729     case M_BGTU_I:
6730       if (sreg == 0
6731           || (HAVE_32BIT_GPRS
6732               && imm_expr.X_op == O_constant
6733               && imm_expr.X_add_number == -1))
6734         goto do_false;
6735       if (imm_expr.X_op != O_constant)
6736         as_bad (_("Unsupported large constant"));
6737       ++imm_expr.X_add_number;
6738       /* FALLTHROUGH */
6739     case M_BGEU_I:
6740     case M_BGEUL_I:
6741       if (mask == M_BGEUL_I)
6742         likely = 1;
6743       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6744         goto do_true;
6745       else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6746         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6747                                  &offset_expr, sreg, ZERO);
6748       else
6749         {
6750           used_at = 1;
6751           set_at (sreg, 1);
6752           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6753                                    &offset_expr, AT, ZERO);
6754         }
6755       break;
6756
6757     case M_BGTL:
6758       likely = 1;
6759     case M_BGT:
6760       if (treg == 0)
6761         macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, sreg);
6762       else if (sreg == 0)
6763         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, treg);
6764       else
6765         {
6766           used_at = 1;
6767           macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
6768           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6769                                    &offset_expr, AT, ZERO);
6770         }
6771       break;
6772
6773     case M_BGTUL:
6774       likely = 1;
6775     case M_BGTU:
6776       if (treg == 0)
6777         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6778                                  &offset_expr, sreg, ZERO);
6779       else if (sreg == 0)
6780         goto do_false;
6781       else
6782         {
6783           used_at = 1;
6784           macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
6785           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6786                                    &offset_expr, AT, ZERO);
6787         }
6788       break;
6789
6790     case M_BLEL:
6791       likely = 1;
6792     case M_BLE:
6793       if (treg == 0)
6794         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
6795       else if (sreg == 0)
6796         macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, treg);
6797       else
6798         {
6799           used_at = 1;
6800           macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
6801           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6802                                    &offset_expr, AT, ZERO);
6803         }
6804       break;
6805
6806     case M_BLEL_I:
6807       likely = 1;
6808     case M_BLE_I:
6809       maxnum = 0x7fffffff;
6810       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6811         {
6812           maxnum <<= 16;
6813           maxnum |= 0xffff;
6814           maxnum <<= 16;
6815           maxnum |= 0xffff;
6816         }
6817       if (imm_expr.X_op == O_constant
6818           && imm_expr.X_add_number >= maxnum
6819           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6820         goto do_true;
6821       if (imm_expr.X_op != O_constant)
6822         as_bad (_("Unsupported large constant"));
6823       ++imm_expr.X_add_number;
6824       /* FALLTHROUGH */
6825     case M_BLT_I:
6826     case M_BLTL_I:
6827       if (mask == M_BLTL_I)
6828         likely = 1;
6829       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6830         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
6831       else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6832         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
6833       else
6834         {
6835           used_at = 1;
6836           set_at (sreg, 0);
6837           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6838                                    &offset_expr, AT, ZERO);
6839         }
6840       break;
6841
6842     case M_BLEUL:
6843       likely = 1;
6844     case M_BLEU:
6845       if (treg == 0)
6846         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6847                                  &offset_expr, sreg, ZERO);
6848       else if (sreg == 0)
6849         goto do_true;
6850       else
6851         {
6852           used_at = 1;
6853           macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
6854           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6855                                    &offset_expr, AT, ZERO);
6856         }
6857       break;
6858
6859     case M_BLEUL_I:
6860       likely = 1;
6861     case M_BLEU_I:
6862       if (sreg == 0
6863           || (HAVE_32BIT_GPRS
6864               && imm_expr.X_op == O_constant
6865               && imm_expr.X_add_number == -1))
6866         goto do_true;
6867       if (imm_expr.X_op != O_constant)
6868         as_bad (_("Unsupported large constant"));
6869       ++imm_expr.X_add_number;
6870       /* FALLTHROUGH */
6871     case M_BLTU_I:
6872     case M_BLTUL_I:
6873       if (mask == M_BLTUL_I)
6874         likely = 1;
6875       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6876         goto do_false;
6877       else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6878         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6879                                  &offset_expr, sreg, ZERO);
6880       else
6881         {
6882           used_at = 1;
6883           set_at (sreg, 1);
6884           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6885                                    &offset_expr, AT, ZERO);
6886         }
6887       break;
6888
6889     case M_BLTL:
6890       likely = 1;
6891     case M_BLT:
6892       if (treg == 0)
6893         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
6894       else if (sreg == 0)
6895         macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, treg);
6896       else
6897         {
6898           used_at = 1;
6899           macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
6900           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6901                                    &offset_expr, AT, ZERO);
6902         }
6903       break;
6904
6905     case M_BLTUL:
6906       likely = 1;
6907     case M_BLTU:
6908       if (treg == 0)
6909         goto do_false;
6910       else if (sreg == 0)
6911         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6912                                  &offset_expr, ZERO, treg);
6913       else
6914         {
6915           used_at = 1;
6916           macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
6917           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6918                                    &offset_expr, AT, ZERO);
6919         }
6920       break;
6921
6922     case M_DEXT:
6923       {
6924         /* Use unsigned arithmetic.  */
6925         addressT pos;
6926         addressT size;
6927
6928         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
6929           {
6930             as_bad (_("Unsupported large constant"));
6931             pos = size = 1;
6932           }
6933         else
6934           {
6935             pos = imm_expr.X_add_number;
6936             size = imm2_expr.X_add_number;
6937           }
6938
6939         if (pos > 63)
6940           {
6941             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
6942             pos = 1;
6943           }
6944         if (size == 0 || size > 64 || (pos + size - 1) > 63)
6945           {
6946             as_bad (_("Improper extract size (%lu, position %lu)"),
6947                     (unsigned long) size, (unsigned long) pos);
6948             size = 1;
6949           }
6950
6951         if (size <= 32 && pos < 32)
6952           {
6953             s = "dext";
6954             fmt = "t,r,+A,+C";
6955           }
6956         else if (size <= 32)
6957           {
6958             s = "dextu";
6959             fmt = "t,r,+E,+H";
6960           }
6961         else
6962           {
6963             s = "dextm";
6964             fmt = "t,r,+A,+G";
6965           }
6966         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
6967                      (int) (size - 1));
6968       }
6969       break;
6970
6971     case M_DINS:
6972       {
6973         /* Use unsigned arithmetic.  */
6974         addressT pos;
6975         addressT size;
6976
6977         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
6978           {
6979             as_bad (_("Unsupported large constant"));
6980             pos = size = 1;
6981           }
6982         else
6983           {
6984             pos = imm_expr.X_add_number;
6985             size = imm2_expr.X_add_number;
6986           }
6987
6988         if (pos > 63)
6989           {
6990             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
6991             pos = 1;
6992           }
6993         if (size == 0 || size > 64 || (pos + size - 1) > 63)
6994           {
6995             as_bad (_("Improper insert size (%lu, position %lu)"),
6996                     (unsigned long) size, (unsigned long) pos);
6997             size = 1;
6998           }
6999
7000         if (pos < 32 && (pos + size - 1) < 32)
7001           {
7002             s = "dins";
7003             fmt = "t,r,+A,+B";
7004           }
7005         else if (pos >= 32)
7006           {
7007             s = "dinsu";
7008             fmt = "t,r,+E,+F";
7009           }
7010         else
7011           {
7012             s = "dinsm";
7013             fmt = "t,r,+A,+F";
7014           }
7015         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
7016                      (int) (pos + size - 1));
7017       }
7018       break;
7019
7020     case M_DDIV_3:
7021       dbl = 1;
7022     case M_DIV_3:
7023       s = "mflo";
7024       goto do_div3;
7025     case M_DREM_3:
7026       dbl = 1;
7027     case M_REM_3:
7028       s = "mfhi";
7029     do_div3:
7030       if (treg == 0)
7031         {
7032           as_warn (_("Divide by zero."));
7033           if (mips_trap)
7034             macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
7035           else
7036             macro_build (NULL, "break", BRK_FMT, 7);
7037           break;
7038         }
7039
7040       start_noreorder ();
7041       if (mips_trap)
7042         {
7043           macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
7044           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
7045         }
7046       else
7047         {
7048           if (mips_opts.micromips)
7049             micromips_label_expr (&label_expr);
7050           else
7051             label_expr.X_add_number = 8;
7052           macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
7053           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
7054           macro_build (NULL, "break", BRK_FMT, 7);
7055           if (mips_opts.micromips)
7056             micromips_add_label ();
7057         }
7058       expr1.X_add_number = -1;
7059       used_at = 1;
7060       load_register (AT, &expr1, dbl);
7061       if (mips_opts.micromips)
7062         micromips_label_expr (&label_expr);
7063       else
7064         label_expr.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
7065       macro_build (&label_expr, "bne", "s,t,p", treg, AT);
7066       if (dbl)
7067         {
7068           expr1.X_add_number = 1;
7069           load_register (AT, &expr1, dbl);
7070           macro_build (NULL, "dsll32", SHFT_FMT, AT, AT, 31);
7071         }
7072       else
7073         {
7074           expr1.X_add_number = 0x80000000;
7075           macro_build (&expr1, "lui", LUI_FMT, AT, BFD_RELOC_HI16);
7076         }
7077       if (mips_trap)
7078         {
7079           macro_build (NULL, "teq", TRAP_FMT, sreg, AT, 6);
7080           /* We want to close the noreorder block as soon as possible, so
7081              that later insns are available for delay slot filling.  */
7082           end_noreorder ();
7083         }
7084       else
7085         {
7086           if (mips_opts.micromips)
7087             micromips_label_expr (&label_expr);
7088           else
7089             label_expr.X_add_number = 8;
7090           macro_build (&label_expr, "bne", "s,t,p", sreg, AT);
7091           macro_build (NULL, "nop", "");
7092
7093           /* We want to close the noreorder block as soon as possible, so
7094              that later insns are available for delay slot filling.  */
7095           end_noreorder ();
7096
7097           macro_build (NULL, "break", BRK_FMT, 6);
7098         }
7099       if (mips_opts.micromips)
7100         micromips_add_label ();
7101       macro_build (NULL, s, MFHL_FMT, dreg);
7102       break;
7103
7104     case M_DIV_3I:
7105       s = "div";
7106       s2 = "mflo";
7107       goto do_divi;
7108     case M_DIVU_3I:
7109       s = "divu";
7110       s2 = "mflo";
7111       goto do_divi;
7112     case M_REM_3I:
7113       s = "div";
7114       s2 = "mfhi";
7115       goto do_divi;
7116     case M_REMU_3I:
7117       s = "divu";
7118       s2 = "mfhi";
7119       goto do_divi;
7120     case M_DDIV_3I:
7121       dbl = 1;
7122       s = "ddiv";
7123       s2 = "mflo";
7124       goto do_divi;
7125     case M_DDIVU_3I:
7126       dbl = 1;
7127       s = "ddivu";
7128       s2 = "mflo";
7129       goto do_divi;
7130     case M_DREM_3I:
7131       dbl = 1;
7132       s = "ddiv";
7133       s2 = "mfhi";
7134       goto do_divi;
7135     case M_DREMU_3I:
7136       dbl = 1;
7137       s = "ddivu";
7138       s2 = "mfhi";
7139     do_divi:
7140       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7141         {
7142           as_warn (_("Divide by zero."));
7143           if (mips_trap)
7144             macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
7145           else
7146             macro_build (NULL, "break", BRK_FMT, 7);
7147           break;
7148         }
7149       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7150         {
7151           if (strcmp (s2, "mflo") == 0)
7152             move_register (dreg, sreg);
7153           else
7154             move_register (dreg, ZERO);
7155           break;
7156         }
7157       if (imm_expr.X_op == O_constant
7158           && imm_expr.X_add_number == -1
7159           && s[strlen (s) - 1] != 'u')
7160         {
7161           if (strcmp (s2, "mflo") == 0)
7162             {
7163               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
7164             }
7165           else
7166             move_register (dreg, ZERO);
7167           break;
7168         }
7169
7170       used_at = 1;
7171       load_register (AT, &imm_expr, dbl);
7172       macro_build (NULL, s, "z,s,t", sreg, AT);
7173       macro_build (NULL, s2, MFHL_FMT, dreg);
7174       break;
7175
7176     case M_DIVU_3:
7177       s = "divu";
7178       s2 = "mflo";
7179       goto do_divu3;
7180     case M_REMU_3:
7181       s = "divu";
7182       s2 = "mfhi";
7183       goto do_divu3;
7184     case M_DDIVU_3:
7185       s = "ddivu";
7186       s2 = "mflo";
7187       goto do_divu3;
7188     case M_DREMU_3:
7189       s = "ddivu";
7190       s2 = "mfhi";
7191     do_divu3:
7192       start_noreorder ();
7193       if (mips_trap)
7194         {
7195           macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
7196           macro_build (NULL, s, "z,s,t", sreg, treg);
7197           /* We want to close the noreorder block as soon as possible, so
7198              that later insns are available for delay slot filling.  */
7199           end_noreorder ();
7200         }
7201       else
7202         {
7203           if (mips_opts.micromips)
7204             micromips_label_expr (&label_expr);
7205           else
7206             label_expr.X_add_number = 8;
7207           macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
7208           macro_build (NULL, s, "z,s,t", sreg, treg);
7209
7210           /* We want to close the noreorder block as soon as possible, so
7211              that later insns are available for delay slot filling.  */
7212           end_noreorder ();
7213           macro_build (NULL, "break", BRK_FMT, 7);
7214           if (mips_opts.micromips)
7215             micromips_add_label ();
7216         }
7217       macro_build (NULL, s2, MFHL_FMT, dreg);
7218       break;
7219
7220     case M_DLCA_AB:
7221       dbl = 1;
7222     case M_LCA_AB:
7223       call = 1;
7224       goto do_la;
7225     case M_DLA_AB:
7226       dbl = 1;
7227     case M_LA_AB:
7228     do_la:
7229       /* Load the address of a symbol into a register.  If breg is not
7230          zero, we then add a base register to it.  */
7231
7232       if (dbl && HAVE_32BIT_GPRS)
7233         as_warn (_("dla used to load 32-bit register"));
7234
7235       if (!dbl && HAVE_64BIT_OBJECTS)
7236         as_warn (_("la used to load 64-bit address"));
7237
7238       if (offset_expr.X_op == O_constant
7239           && offset_expr.X_add_number >= -0x8000
7240           && offset_expr.X_add_number < 0x8000)
7241         {
7242           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
7243                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
7244           break;
7245         }
7246
7247       if (mips_opts.at && (treg == breg))
7248         {
7249           tempreg = AT;
7250           used_at = 1;
7251         }
7252       else
7253         {
7254           tempreg = treg;
7255         }
7256
7257       if (offset_expr.X_op != O_symbol
7258           && offset_expr.X_op != O_constant)
7259         {
7260           as_bad (_("Expression too complex"));
7261           offset_expr.X_op = O_constant;
7262         }
7263
7264       if (offset_expr.X_op == O_constant)
7265         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
7266       else if (mips_pic == NO_PIC)
7267         {
7268           /* If this is a reference to a GP relative symbol, we want
7269                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
7270              Otherwise we want
7271                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
7272                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7273              If we have a constant, we need two instructions anyhow,
7274              so we may as well always use the latter form.
7275
7276              With 64bit address space and a usable $at we want
7277                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
7278                lui      $at,<sym>               (BFD_RELOC_HI16_S)
7279                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
7280                daddiu   $at,<sym>               (BFD_RELOC_LO16)
7281                dsll32   $tempreg,0
7282                daddu    $tempreg,$tempreg,$at
7283
7284              If $at is already in use, we use a path which is suboptimal
7285              on superscalar processors.
7286                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
7287                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
7288                dsll     $tempreg,16
7289                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
7290                dsll     $tempreg,16
7291                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
7292
7293              For GP relative symbols in 64bit address space we can use
7294              the same sequence as in 32bit address space.  */
7295           if (HAVE_64BIT_SYMBOLS)
7296             {
7297               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7298                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7299                 {
7300                   relax_start (offset_expr.X_add_symbol);
7301                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7302                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7303                   relax_switch ();
7304                 }
7305
7306               if (used_at == 0 && mips_opts.at)
7307                 {
7308                   macro_build (&offset_expr, "lui", LUI_FMT,
7309                                tempreg, BFD_RELOC_MIPS_HIGHEST);
7310                   macro_build (&offset_expr, "lui", LUI_FMT,
7311                                AT, BFD_RELOC_HI16_S);
7312                   macro_build (&offset_expr, "daddiu", "t,r,j",
7313                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7314                   macro_build (&offset_expr, "daddiu", "t,r,j",
7315                                AT, AT, BFD_RELOC_LO16);
7316                   macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
7317                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
7318                   used_at = 1;
7319                 }
7320               else
7321                 {
7322                   macro_build (&offset_expr, "lui", LUI_FMT,
7323                                tempreg, BFD_RELOC_MIPS_HIGHEST);
7324                   macro_build (&offset_expr, "daddiu", "t,r,j",
7325                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7326                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7327                   macro_build (&offset_expr, "daddiu", "t,r,j",
7328                                tempreg, tempreg, BFD_RELOC_HI16_S);
7329                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7330                   macro_build (&offset_expr, "daddiu", "t,r,j",
7331                                tempreg, tempreg, BFD_RELOC_LO16);
7332                 }
7333
7334               if (mips_relax.sequence)
7335                 relax_end ();
7336             }
7337           else
7338             {
7339               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7340                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7341                 {
7342                   relax_start (offset_expr.X_add_symbol);
7343                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7344                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7345                   relax_switch ();
7346                 }
7347               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7348                 as_bad (_("Offset too large"));
7349               macro_build_lui (&offset_expr, tempreg);
7350               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7351                            tempreg, tempreg, BFD_RELOC_LO16);
7352               if (mips_relax.sequence)
7353                 relax_end ();
7354             }
7355         }
7356       else if (!mips_big_got && !HAVE_NEWABI)
7357         {
7358           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7359
7360           /* If this is a reference to an external symbol, and there
7361              is no constant, we want
7362                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7363              or for lca or if tempreg is PIC_CALL_REG
7364                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
7365              For a local symbol, we want
7366                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7367                nop
7368                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7369
7370              If we have a small constant, and this is a reference to
7371              an external symbol, we want
7372                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7373                nop
7374                addiu    $tempreg,$tempreg,<constant>
7375              For a local symbol, we want the same instruction
7376              sequence, but we output a BFD_RELOC_LO16 reloc on the
7377              addiu instruction.
7378
7379              If we have a large constant, and this is a reference to
7380              an external symbol, we want
7381                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7382                lui      $at,<hiconstant>
7383                addiu    $at,$at,<loconstant>
7384                addu     $tempreg,$tempreg,$at
7385              For a local symbol, we want the same instruction
7386              sequence, but we output a BFD_RELOC_LO16 reloc on the
7387              addiu instruction.
7388            */
7389
7390           if (offset_expr.X_add_number == 0)
7391             {
7392               if (mips_pic == SVR4_PIC
7393                   && breg == 0
7394                   && (call || tempreg == PIC_CALL_REG))
7395                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
7396
7397               relax_start (offset_expr.X_add_symbol);
7398               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7399                            lw_reloc_type, mips_gp_register);
7400               if (breg != 0)
7401                 {
7402                   /* We're going to put in an addu instruction using
7403                      tempreg, so we may as well insert the nop right
7404                      now.  */
7405                   load_delay_nop ();
7406                 }
7407               relax_switch ();
7408               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7409                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
7410               load_delay_nop ();
7411               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7412                            tempreg, tempreg, BFD_RELOC_LO16);
7413               relax_end ();
7414               /* FIXME: If breg == 0, and the next instruction uses
7415                  $tempreg, then if this variant case is used an extra
7416                  nop will be generated.  */
7417             }
7418           else if (offset_expr.X_add_number >= -0x8000
7419                    && offset_expr.X_add_number < 0x8000)
7420             {
7421               load_got_offset (tempreg, &offset_expr);
7422               load_delay_nop ();
7423               add_got_offset (tempreg, &offset_expr);
7424             }
7425           else
7426             {
7427               expr1.X_add_number = offset_expr.X_add_number;
7428               offset_expr.X_add_number =
7429                 SEXT_16BIT (offset_expr.X_add_number);
7430               load_got_offset (tempreg, &offset_expr);
7431               offset_expr.X_add_number = expr1.X_add_number;
7432               /* If we are going to add in a base register, and the
7433                  target register and the base register are the same,
7434                  then we are using AT as a temporary register.  Since
7435                  we want to load the constant into AT, we add our
7436                  current AT (from the global offset table) and the
7437                  register into the register now, and pretend we were
7438                  not using a base register.  */
7439               if (breg == treg)
7440                 {
7441                   load_delay_nop ();
7442                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7443                                treg, AT, breg);
7444                   breg = 0;
7445                   tempreg = treg;
7446                 }
7447               add_got_offset_hilo (tempreg, &offset_expr, AT);
7448               used_at = 1;
7449             }
7450         }
7451       else if (!mips_big_got && HAVE_NEWABI)
7452         {
7453           int add_breg_early = 0;
7454
7455           /* If this is a reference to an external, and there is no
7456              constant, or local symbol (*), with or without a
7457              constant, we want
7458                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7459              or for lca or if tempreg is PIC_CALL_REG
7460                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
7461
7462              If we have a small constant, and this is a reference to
7463              an external symbol, we want
7464                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7465                addiu    $tempreg,$tempreg,<constant>
7466
7467              If we have a large constant, and this is a reference to
7468              an external symbol, we want
7469                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7470                lui      $at,<hiconstant>
7471                addiu    $at,$at,<loconstant>
7472                addu     $tempreg,$tempreg,$at
7473
7474              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
7475              local symbols, even though it introduces an additional
7476              instruction.  */
7477
7478           if (offset_expr.X_add_number)
7479             {
7480               expr1.X_add_number = offset_expr.X_add_number;
7481               offset_expr.X_add_number = 0;
7482
7483               relax_start (offset_expr.X_add_symbol);
7484               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7485                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7486
7487               if (expr1.X_add_number >= -0x8000
7488                   && expr1.X_add_number < 0x8000)
7489                 {
7490                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7491                                tempreg, tempreg, BFD_RELOC_LO16);
7492                 }
7493               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
7494                 {
7495                   /* If we are going to add in a base register, and the
7496                      target register and the base register are the same,
7497                      then we are using AT as a temporary register.  Since
7498                      we want to load the constant into AT, we add our
7499                      current AT (from the global offset table) and the
7500                      register into the register now, and pretend we were
7501                      not using a base register.  */
7502                   if (breg != treg)
7503                     dreg = tempreg;
7504                   else
7505                     {
7506                       gas_assert (tempreg == AT);
7507                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7508                                    treg, AT, breg);
7509                       dreg = treg;
7510                       add_breg_early = 1;
7511                     }
7512
7513                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7514                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7515                                dreg, dreg, AT);
7516
7517                   used_at = 1;
7518                 }
7519               else
7520                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
7521
7522               relax_switch ();
7523               offset_expr.X_add_number = expr1.X_add_number;
7524
7525               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7526                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7527               if (add_breg_early)
7528                 {
7529                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7530                                treg, tempreg, breg);
7531                   breg = 0;
7532                   tempreg = treg;
7533                 }
7534               relax_end ();
7535             }
7536           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
7537             {
7538               relax_start (offset_expr.X_add_symbol);
7539               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7540                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
7541               relax_switch ();
7542               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7543                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7544               relax_end ();
7545             }
7546           else
7547             {
7548               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7549                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7550             }
7551         }
7552       else if (mips_big_got && !HAVE_NEWABI)
7553         {
7554           int gpdelay;
7555           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7556           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7557           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7558
7559           /* This is the large GOT case.  If this is a reference to an
7560              external symbol, and there is no constant, we want
7561                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7562                addu     $tempreg,$tempreg,$gp
7563                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7564              or for lca or if tempreg is PIC_CALL_REG
7565                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
7566                addu     $tempreg,$tempreg,$gp
7567                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
7568              For a local symbol, we want
7569                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7570                nop
7571                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7572
7573              If we have a small constant, and this is a reference to
7574              an external symbol, we want
7575                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7576                addu     $tempreg,$tempreg,$gp
7577                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7578                nop
7579                addiu    $tempreg,$tempreg,<constant>
7580              For a local symbol, we want
7581                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7582                nop
7583                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
7584
7585              If we have a large constant, and this is a reference to
7586              an external symbol, we want
7587                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7588                addu     $tempreg,$tempreg,$gp
7589                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7590                lui      $at,<hiconstant>
7591                addiu    $at,$at,<loconstant>
7592                addu     $tempreg,$tempreg,$at
7593              For a local symbol, we want
7594                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7595                lui      $at,<hiconstant>
7596                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
7597                addu     $tempreg,$tempreg,$at
7598           */
7599
7600           expr1.X_add_number = offset_expr.X_add_number;
7601           offset_expr.X_add_number = 0;
7602           relax_start (offset_expr.X_add_symbol);
7603           gpdelay = reg_needs_delay (mips_gp_register);
7604           if (expr1.X_add_number == 0 && breg == 0
7605               && (call || tempreg == PIC_CALL_REG))
7606             {
7607               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
7608               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
7609             }
7610           macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
7611           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7612                        tempreg, tempreg, mips_gp_register);
7613           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7614                        tempreg, lw_reloc_type, tempreg);
7615           if (expr1.X_add_number == 0)
7616             {
7617               if (breg != 0)
7618                 {
7619                   /* We're going to put in an addu instruction using
7620                      tempreg, so we may as well insert the nop right
7621                      now.  */
7622                   load_delay_nop ();
7623                 }
7624             }
7625           else if (expr1.X_add_number >= -0x8000
7626                    && expr1.X_add_number < 0x8000)
7627             {
7628               load_delay_nop ();
7629               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7630                            tempreg, tempreg, BFD_RELOC_LO16);
7631             }
7632           else
7633             {
7634               /* If we are going to add in a base register, and the
7635                  target register and the base register are the same,
7636                  then we are using AT as a temporary register.  Since
7637                  we want to load the constant into AT, we add our
7638                  current AT (from the global offset table) and the
7639                  register into the register now, and pretend we were
7640                  not using a base register.  */
7641               if (breg != treg)
7642                 dreg = tempreg;
7643               else
7644                 {
7645                   gas_assert (tempreg == AT);
7646                   load_delay_nop ();
7647                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7648                                treg, AT, breg);
7649                   dreg = treg;
7650                 }
7651
7652               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7653               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
7654
7655               used_at = 1;
7656             }
7657           offset_expr.X_add_number = SEXT_16BIT (expr1.X_add_number);
7658           relax_switch ();
7659
7660           if (gpdelay)
7661             {
7662               /* This is needed because this instruction uses $gp, but
7663                  the first instruction on the main stream does not.  */
7664               macro_build (NULL, "nop", "");
7665             }
7666
7667           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7668                        local_reloc_type, mips_gp_register);
7669           if (expr1.X_add_number >= -0x8000
7670               && expr1.X_add_number < 0x8000)
7671             {
7672               load_delay_nop ();
7673               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7674                            tempreg, tempreg, BFD_RELOC_LO16);
7675               /* FIXME: If add_number is 0, and there was no base
7676                  register, the external symbol case ended with a load,
7677                  so if the symbol turns out to not be external, and
7678                  the next instruction uses tempreg, an unnecessary nop
7679                  will be inserted.  */
7680             }
7681           else
7682             {
7683               if (breg == treg)
7684                 {
7685                   /* We must add in the base register now, as in the
7686                      external symbol case.  */
7687                   gas_assert (tempreg == AT);
7688                   load_delay_nop ();
7689                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7690                                treg, AT, breg);
7691                   tempreg = treg;
7692                   /* We set breg to 0 because we have arranged to add
7693                      it in in both cases.  */
7694                   breg = 0;
7695                 }
7696
7697               macro_build_lui (&expr1, AT);
7698               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7699                            AT, AT, BFD_RELOC_LO16);
7700               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7701                            tempreg, tempreg, AT);
7702               used_at = 1;
7703             }
7704           relax_end ();
7705         }
7706       else if (mips_big_got && HAVE_NEWABI)
7707         {
7708           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7709           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7710           int add_breg_early = 0;
7711
7712           /* This is the large GOT case.  If this is a reference to an
7713              external symbol, and there is no constant, we want
7714                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7715                add      $tempreg,$tempreg,$gp
7716                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7717              or for lca or if tempreg is PIC_CALL_REG
7718                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
7719                add      $tempreg,$tempreg,$gp
7720                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
7721
7722              If we have a small constant, and this is a reference to
7723              an external symbol, we want
7724                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7725                add      $tempreg,$tempreg,$gp
7726                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7727                addi     $tempreg,$tempreg,<constant>
7728
7729              If we have a large constant, and this is a reference to
7730              an external symbol, we want
7731                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7732                addu     $tempreg,$tempreg,$gp
7733                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7734                lui      $at,<hiconstant>
7735                addi     $at,$at,<loconstant>
7736                add      $tempreg,$tempreg,$at
7737
7738              If we have NewABI, and we know it's a local symbol, we want
7739                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
7740                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
7741              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
7742
7743           relax_start (offset_expr.X_add_symbol);
7744
7745           expr1.X_add_number = offset_expr.X_add_number;
7746           offset_expr.X_add_number = 0;
7747
7748           if (expr1.X_add_number == 0 && breg == 0
7749               && (call || tempreg == PIC_CALL_REG))
7750             {
7751               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
7752               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
7753             }
7754           macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
7755           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7756                        tempreg, tempreg, mips_gp_register);
7757           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7758                        tempreg, lw_reloc_type, tempreg);
7759
7760           if (expr1.X_add_number == 0)
7761             ;
7762           else if (expr1.X_add_number >= -0x8000
7763                    && expr1.X_add_number < 0x8000)
7764             {
7765               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7766                            tempreg, tempreg, BFD_RELOC_LO16);
7767             }
7768           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
7769             {
7770               /* If we are going to add in a base register, and the
7771                  target register and the base register are the same,
7772                  then we are using AT as a temporary register.  Since
7773                  we want to load the constant into AT, we add our
7774                  current AT (from the global offset table) and the
7775                  register into the register now, and pretend we were
7776                  not using a base register.  */
7777               if (breg != treg)
7778                 dreg = tempreg;
7779               else
7780                 {
7781                   gas_assert (tempreg == AT);
7782                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7783                                treg, AT, breg);
7784                   dreg = treg;
7785                   add_breg_early = 1;
7786                 }
7787
7788               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7789               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
7790
7791               used_at = 1;
7792             }
7793           else
7794             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
7795
7796           relax_switch ();
7797           offset_expr.X_add_number = expr1.X_add_number;
7798           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7799                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
7800           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
7801                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
7802           if (add_breg_early)
7803             {
7804               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7805                            treg, tempreg, breg);
7806               breg = 0;
7807               tempreg = treg;
7808             }
7809           relax_end ();
7810         }
7811       else
7812         abort ();
7813
7814       if (breg != 0)
7815         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
7816       break;
7817
7818     case M_MSGSND:
7819       gas_assert (!mips_opts.micromips);
7820       {
7821         unsigned long temp = (treg << 16) | (0x01);
7822         macro_build (NULL, "c2", "C", temp);
7823       }
7824       break;
7825
7826     case M_MSGLD:
7827       gas_assert (!mips_opts.micromips);
7828       {
7829         unsigned long temp = (0x02);
7830         macro_build (NULL, "c2", "C", temp);
7831       }
7832       break;
7833
7834     case M_MSGLD_T:
7835       gas_assert (!mips_opts.micromips);
7836       {
7837         unsigned long temp = (treg << 16) | (0x02);
7838         macro_build (NULL, "c2", "C", temp);
7839       }
7840       break;
7841
7842     case M_MSGWAIT:
7843       gas_assert (!mips_opts.micromips);
7844       macro_build (NULL, "c2", "C", 3);
7845       break;
7846
7847     case M_MSGWAIT_T:
7848       gas_assert (!mips_opts.micromips);
7849       {
7850         unsigned long temp = (treg << 16) | 0x03;
7851         macro_build (NULL, "c2", "C", temp);
7852       }
7853       break;
7854
7855     case M_J_A:
7856       /* The j instruction may not be used in PIC code, since it
7857          requires an absolute address.  We convert it to a b
7858          instruction.  */
7859       if (mips_pic == NO_PIC)
7860         macro_build (&offset_expr, "j", "a");
7861       else
7862         macro_build (&offset_expr, "b", "p");
7863       break;
7864
7865       /* The jal instructions must be handled as macros because when
7866          generating PIC code they expand to multi-instruction
7867          sequences.  Normally they are simple instructions.  */
7868     case M_JALS_1:
7869       dreg = RA;
7870       /* Fall through.  */
7871     case M_JALS_2:
7872       gas_assert (mips_opts.micromips);
7873       jals = 1;
7874       goto jal;
7875     case M_JAL_1:
7876       dreg = RA;
7877       /* Fall through.  */
7878     case M_JAL_2:
7879     jal:
7880       if (mips_pic == NO_PIC)
7881         {
7882           s = jals ? "jalrs" : "jalr";
7883           if (mips_opts.micromips
7884               && dreg == RA
7885               && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
7886             macro_build (NULL, s, "mj", sreg);
7887           else
7888             macro_build (NULL, s, JALR_FMT, dreg, sreg);
7889         }
7890       else
7891         {
7892           int cprestore = (mips_pic == SVR4_PIC && !HAVE_NEWABI
7893                            && mips_cprestore_offset >= 0);
7894
7895           if (sreg != PIC_CALL_REG)
7896             as_warn (_("MIPS PIC call to register other than $25"));
7897
7898           s = (mips_opts.micromips && (!mips_opts.noreorder || cprestore)
7899                ? "jalrs" : "jalr");
7900           if (mips_opts.micromips
7901               && dreg == RA
7902               && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
7903             macro_build (NULL, s, "mj", sreg);
7904           else
7905             macro_build (NULL, s, JALR_FMT, dreg, sreg);
7906           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
7907             {
7908               if (mips_cprestore_offset < 0)
7909                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
7910               else
7911                 {
7912                   if (!mips_frame_reg_valid)
7913                     {
7914                       as_warn (_("No .frame pseudo-op used in PIC code"));
7915                       /* Quiet this warning.  */
7916                       mips_frame_reg_valid = 1;
7917                     }
7918                   if (!mips_cprestore_valid)
7919                     {
7920                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
7921                       /* Quiet this warning.  */
7922                       mips_cprestore_valid = 1;
7923                     }
7924                   if (mips_opts.noreorder)
7925                     macro_build (NULL, "nop", "");
7926                   expr1.X_add_number = mips_cprestore_offset;
7927                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
7928                                                 mips_gp_register,
7929                                                 mips_frame_reg,
7930                                                 HAVE_64BIT_ADDRESSES);
7931                 }
7932             }
7933         }
7934
7935       break;
7936
7937     case M_JALS_A:
7938       gas_assert (mips_opts.micromips);
7939       jals = 1;
7940       /* Fall through.  */
7941     case M_JAL_A:
7942       if (mips_pic == NO_PIC)
7943         macro_build (&offset_expr, jals ? "jals" : "jal", "a");
7944       else if (mips_pic == SVR4_PIC)
7945         {
7946           /* If this is a reference to an external symbol, and we are
7947              using a small GOT, we want
7948                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
7949                nop
7950                jalr     $ra,$25
7951                nop
7952                lw       $gp,cprestore($sp)
7953              The cprestore value is set using the .cprestore
7954              pseudo-op.  If we are using a big GOT, we want
7955                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
7956                addu     $25,$25,$gp
7957                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
7958                nop
7959                jalr     $ra,$25
7960                nop
7961                lw       $gp,cprestore($sp)
7962              If the symbol is not external, we want
7963                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7964                nop
7965                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
7966                jalr     $ra,$25
7967                nop
7968                lw $gp,cprestore($sp)
7969
7970              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
7971              sequences above, minus nops, unless the symbol is local,
7972              which enables us to use GOT_PAGE/GOT_OFST (big got) or
7973              GOT_DISP.  */
7974           if (HAVE_NEWABI)
7975             {
7976               if (!mips_big_got)
7977                 {
7978                   relax_start (offset_expr.X_add_symbol);
7979                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7980                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
7981                                mips_gp_register);
7982                   relax_switch ();
7983                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7984                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
7985                                mips_gp_register);
7986                   relax_end ();
7987                 }
7988               else
7989                 {
7990                   relax_start (offset_expr.X_add_symbol);
7991                   macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
7992                                BFD_RELOC_MIPS_CALL_HI16);
7993                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
7994                                PIC_CALL_REG, mips_gp_register);
7995                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7996                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
7997                                PIC_CALL_REG);
7998                   relax_switch ();
7999                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8000                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
8001                                mips_gp_register);
8002                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8003                                PIC_CALL_REG, PIC_CALL_REG,
8004                                BFD_RELOC_MIPS_GOT_OFST);
8005                   relax_end ();
8006                 }
8007
8008               macro_build_jalr (&offset_expr, 0);
8009             }
8010           else
8011             {
8012               relax_start (offset_expr.X_add_symbol);
8013               if (!mips_big_got)
8014                 {
8015                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8016                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
8017                                mips_gp_register);
8018                   load_delay_nop ();
8019                   relax_switch ();
8020                 }
8021               else
8022                 {
8023                   int gpdelay;
8024
8025                   gpdelay = reg_needs_delay (mips_gp_register);
8026                   macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
8027                                BFD_RELOC_MIPS_CALL_HI16);
8028                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
8029                                PIC_CALL_REG, mips_gp_register);
8030                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8031                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
8032                                PIC_CALL_REG);
8033                   load_delay_nop ();
8034                   relax_switch ();
8035                   if (gpdelay)
8036                     macro_build (NULL, "nop", "");
8037                 }
8038               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8039                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
8040                            mips_gp_register);
8041               load_delay_nop ();
8042               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8043                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
8044               relax_end ();
8045               macro_build_jalr (&offset_expr, mips_cprestore_offset >= 0);
8046
8047               if (mips_cprestore_offset < 0)
8048                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
8049               else
8050                 {
8051                   if (!mips_frame_reg_valid)
8052                     {
8053                       as_warn (_("No .frame pseudo-op used in PIC code"));
8054                       /* Quiet this warning.  */
8055                       mips_frame_reg_valid = 1;
8056                     }
8057                   if (!mips_cprestore_valid)
8058                     {
8059                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
8060                       /* Quiet this warning.  */
8061                       mips_cprestore_valid = 1;
8062                     }
8063                   if (mips_opts.noreorder)
8064                     macro_build (NULL, "nop", "");
8065                   expr1.X_add_number = mips_cprestore_offset;
8066                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
8067                                                 mips_gp_register,
8068                                                 mips_frame_reg,
8069                                                 HAVE_64BIT_ADDRESSES);
8070                 }
8071             }
8072         }
8073       else if (mips_pic == VXWORKS_PIC)
8074         as_bad (_("Non-PIC jump used in PIC library"));
8075       else
8076         abort ();
8077
8078       break;
8079
8080     case M_ACLR_AB:
8081       ab = 1;
8082     case M_ACLR_OB:
8083       s = "aclr";
8084       treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
8085       fmt = "\\,~(b)";
8086       off12 = 1;
8087       goto ld_st;
8088     case M_ASET_AB:
8089       ab = 1;
8090     case M_ASET_OB:
8091       s = "aset";
8092       treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
8093       fmt = "\\,~(b)";
8094       off12 = 1;
8095       goto ld_st;
8096     case M_LB_AB:
8097       ab = 1;
8098       s = "lb";
8099       fmt = "t,o(b)";
8100       goto ld;
8101     case M_LBU_AB:
8102       ab = 1;
8103       s = "lbu";
8104       fmt = "t,o(b)";
8105       goto ld;
8106     case M_LH_AB:
8107       ab = 1;
8108       s = "lh";
8109       fmt = "t,o(b)";
8110       goto ld;
8111     case M_LHU_AB:
8112       ab = 1;
8113       s = "lhu";
8114       fmt = "t,o(b)";
8115       goto ld;
8116     case M_LW_AB:
8117       ab = 1;
8118       s = "lw";
8119       fmt = "t,o(b)";
8120       goto ld;
8121     case M_LWC0_AB:
8122       ab = 1;
8123       gas_assert (!mips_opts.micromips);
8124       s = "lwc0";
8125       fmt = "E,o(b)";
8126       /* Itbl support may require additional care here.  */
8127       coproc = 1;
8128       goto ld_st;
8129     case M_LWC1_AB:
8130       ab = 1;
8131       s = "lwc1";
8132       fmt = "T,o(b)";
8133       /* Itbl support may require additional care here.  */
8134       coproc = 1;
8135       goto ld_st;
8136     case M_LWC2_AB:
8137       ab = 1;
8138     case M_LWC2_OB:
8139       s = "lwc2";
8140       fmt = COP12_FMT;
8141       off12 = mips_opts.micromips;
8142       /* Itbl support may require additional care here.  */
8143       coproc = 1;
8144       goto ld_st;
8145     case M_LWC3_AB:
8146       ab = 1;
8147       gas_assert (!mips_opts.micromips);
8148       s = "lwc3";
8149       fmt = "E,o(b)";
8150       /* Itbl support may require additional care here.  */
8151       coproc = 1;
8152       goto ld_st;
8153     case M_LWL_AB:
8154       ab = 1;
8155     case M_LWL_OB:
8156       s = "lwl";
8157       fmt = MEM12_FMT;
8158       off12 = mips_opts.micromips;
8159       goto ld_st;
8160     case M_LWR_AB:
8161       ab = 1;
8162     case M_LWR_OB:
8163       s = "lwr";
8164       fmt = MEM12_FMT;
8165       off12 = mips_opts.micromips;
8166       goto ld_st;
8167     case M_LDC1_AB:
8168       ab = 1;
8169       s = "ldc1";
8170       fmt = "T,o(b)";
8171       /* Itbl support may require additional care here.  */
8172       coproc = 1;
8173       goto ld_st;
8174     case M_LDC2_AB:
8175       ab = 1;
8176     case M_LDC2_OB:
8177       s = "ldc2";
8178       fmt = COP12_FMT;
8179       off12 = mips_opts.micromips;
8180       /* Itbl support may require additional care here.  */
8181       coproc = 1;
8182       goto ld_st;
8183     case M_LDC3_AB:
8184       ab = 1;
8185       s = "ldc3";
8186       fmt = "E,o(b)";
8187       /* Itbl support may require additional care here.  */
8188       coproc = 1;
8189       goto ld_st;
8190     case M_LDL_AB:
8191       ab = 1;
8192     case M_LDL_OB:
8193       s = "ldl";
8194       fmt = MEM12_FMT;
8195       off12 = mips_opts.micromips;
8196       goto ld_st;
8197     case M_LDR_AB:
8198       ab = 1;
8199     case M_LDR_OB:
8200       s = "ldr";
8201       fmt = MEM12_FMT;
8202       off12 = mips_opts.micromips;
8203       goto ld_st;
8204     case M_LL_AB:
8205       ab = 1;
8206     case M_LL_OB:
8207       s = "ll";
8208       fmt = MEM12_FMT;
8209       off12 = mips_opts.micromips;
8210       goto ld;
8211     case M_LLD_AB:
8212       ab = 1;
8213     case M_LLD_OB:
8214       s = "lld";
8215       fmt = MEM12_FMT;
8216       off12 = mips_opts.micromips;
8217       goto ld;
8218     case M_LWU_AB:
8219       ab = 1;
8220     case M_LWU_OB:
8221       s = "lwu";
8222       fmt = MEM12_FMT;
8223       off12 = mips_opts.micromips;
8224       goto ld;
8225     case M_LWP_AB:
8226       ab = 1;
8227     case M_LWP_OB:
8228       gas_assert (mips_opts.micromips);
8229       s = "lwp";
8230       fmt = "t,~(b)";
8231       off12 = 1;
8232       lp = 1;
8233       goto ld;
8234     case M_LDP_AB:
8235       ab = 1;
8236     case M_LDP_OB:
8237       gas_assert (mips_opts.micromips);
8238       s = "ldp";
8239       fmt = "t,~(b)";
8240       off12 = 1;
8241       lp = 1;
8242       goto ld;
8243     case M_LWM_AB:
8244       ab = 1;
8245     case M_LWM_OB:
8246       gas_assert (mips_opts.micromips);
8247       s = "lwm";
8248       fmt = "n,~(b)";
8249       off12 = 1;
8250       goto ld_st;
8251     case M_LDM_AB:
8252       ab = 1;
8253     case M_LDM_OB:
8254       gas_assert (mips_opts.micromips);
8255       s = "ldm";
8256       fmt = "n,~(b)";
8257       off12 = 1;
8258       goto ld_st;
8259
8260     ld:
8261       if (breg == treg + lp)
8262         goto ld_st;
8263       else
8264         tempreg = treg + lp;
8265       goto ld_noat;
8266
8267     case M_SB_AB:
8268       ab = 1;
8269       s = "sb";
8270       fmt = "t,o(b)";
8271       goto ld_st;
8272     case M_SH_AB:
8273       ab = 1;
8274       s = "sh";
8275       fmt = "t,o(b)";
8276       goto ld_st;
8277     case M_SW_AB:
8278       ab = 1;
8279       s = "sw";
8280       fmt = "t,o(b)";
8281       goto ld_st;
8282     case M_SWC0_AB:
8283       ab = 1;
8284       gas_assert (!mips_opts.micromips);
8285       s = "swc0";
8286       fmt = "E,o(b)";
8287       /* Itbl support may require additional care here.  */
8288       coproc = 1;
8289       goto ld_st;
8290     case M_SWC1_AB:
8291       ab = 1;
8292       s = "swc1";
8293       fmt = "T,o(b)";
8294       /* Itbl support may require additional care here.  */
8295       coproc = 1;
8296       goto ld_st;
8297     case M_SWC2_AB:
8298       ab = 1;
8299     case M_SWC2_OB:
8300       s = "swc2";
8301       fmt = COP12_FMT;
8302       off12 = mips_opts.micromips;
8303       /* Itbl support may require additional care here.  */
8304       coproc = 1;
8305       goto ld_st;
8306     case M_SWC3_AB:
8307       ab = 1;
8308       gas_assert (!mips_opts.micromips);
8309       s = "swc3";
8310       fmt = "E,o(b)";
8311       /* Itbl support may require additional care here.  */
8312       coproc = 1;
8313       goto ld_st;
8314     case M_SWL_AB:
8315       ab = 1;
8316     case M_SWL_OB:
8317       s = "swl";
8318       fmt = MEM12_FMT;
8319       off12 = mips_opts.micromips;
8320       goto ld_st;
8321     case M_SWR_AB:
8322       ab = 1;
8323     case M_SWR_OB:
8324       s = "swr";
8325       fmt = MEM12_FMT;
8326       off12 = mips_opts.micromips;
8327       goto ld_st;
8328     case M_SC_AB:
8329       ab = 1;
8330     case M_SC_OB:
8331       s = "sc";
8332       fmt = MEM12_FMT;
8333       off12 = mips_opts.micromips;
8334       goto ld_st;
8335     case M_SCD_AB:
8336       ab = 1;
8337     case M_SCD_OB:
8338       s = "scd";
8339       fmt = MEM12_FMT;
8340       off12 = mips_opts.micromips;
8341       goto ld_st;
8342     case M_CACHE_AB:
8343       ab = 1;
8344     case M_CACHE_OB:
8345       s = "cache";
8346       fmt = mips_opts.micromips ? "k,~(b)" : "k,o(b)";
8347       off12 = mips_opts.micromips;
8348       goto ld_st;
8349     case M_PREF_AB:
8350       ab = 1;
8351     case M_PREF_OB:
8352       s = "pref";
8353       fmt = !mips_opts.micromips ? "k,o(b)" : "k,~(b)";
8354       off12 = mips_opts.micromips;
8355       goto ld_st;
8356     case M_SDC1_AB:
8357       ab = 1;
8358       s = "sdc1";
8359       fmt = "T,o(b)";
8360       coproc = 1;
8361       /* Itbl support may require additional care here.  */
8362       goto ld_st;
8363     case M_SDC2_AB:
8364       ab = 1;
8365     case M_SDC2_OB:
8366       s = "sdc2";
8367       fmt = COP12_FMT;
8368       off12 = mips_opts.micromips;
8369       /* Itbl support may require additional care here.  */
8370       coproc = 1;
8371       goto ld_st;
8372     case M_SDC3_AB:
8373       ab = 1;
8374       gas_assert (!mips_opts.micromips);
8375       s = "sdc3";
8376       fmt = "E,o(b)";
8377       /* Itbl support may require additional care here.  */
8378       coproc = 1;
8379       goto ld_st;
8380     case M_SDL_AB:
8381       ab = 1;
8382     case M_SDL_OB:
8383       s = "sdl";
8384       fmt = MEM12_FMT;
8385       off12 = mips_opts.micromips;
8386       goto ld_st;
8387     case M_SDR_AB:
8388       ab = 1;
8389     case M_SDR_OB:
8390       s = "sdr";
8391       fmt = MEM12_FMT;
8392       off12 = mips_opts.micromips;
8393       goto ld_st;
8394     case M_SWP_AB:
8395       ab = 1;
8396     case M_SWP_OB:
8397       gas_assert (mips_opts.micromips);
8398       s = "swp";
8399       fmt = "t,~(b)";
8400       off12 = 1;
8401       goto ld_st;
8402     case M_SDP_AB:
8403       ab = 1;
8404     case M_SDP_OB:
8405       gas_assert (mips_opts.micromips);
8406       s = "sdp";
8407       fmt = "t,~(b)";
8408       off12 = 1;
8409       goto ld_st;
8410     case M_SWM_AB:
8411       ab = 1;
8412     case M_SWM_OB:
8413       gas_assert (mips_opts.micromips);
8414       s = "swm";
8415       fmt = "n,~(b)";
8416       off12 = 1;
8417       goto ld_st;
8418     case M_SDM_AB:
8419       ab = 1;
8420     case M_SDM_OB:
8421       gas_assert (mips_opts.micromips);
8422       s = "sdm";
8423       fmt = "n,~(b)";
8424       off12 = 1;
8425
8426     ld_st:
8427       tempreg = AT;
8428       used_at = 1;
8429     ld_noat:
8430       if (offset_expr.X_op != O_constant
8431           && offset_expr.X_op != O_symbol)
8432         {
8433           as_bad (_("Expression too complex"));
8434           offset_expr.X_op = O_constant;
8435         }
8436
8437       if (HAVE_32BIT_ADDRESSES
8438           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
8439         {
8440           char value [32];
8441
8442           sprintf_vma (value, offset_expr.X_add_number);
8443           as_bad (_("Number (0x%s) larger than 32 bits"), value);
8444         }
8445
8446       /* A constant expression in PIC code can be handled just as it
8447          is in non PIC code.  */
8448       if (offset_expr.X_op == O_constant)
8449         {
8450           int hipart = 0;
8451
8452           expr1.X_add_number = offset_expr.X_add_number;
8453           normalize_address_expr (&expr1);
8454           if (!off12 && !IS_SEXT_16BIT_NUM (expr1.X_add_number))
8455             {
8456               expr1.X_add_number = ((expr1.X_add_number + 0x8000)
8457                                     & ~(bfd_vma) 0xffff);
8458               hipart = 1;
8459             }
8460           else if (off12 && !IS_SEXT_12BIT_NUM (expr1.X_add_number))
8461             {
8462               expr1.X_add_number = ((expr1.X_add_number + 0x800)
8463                                     & ~(bfd_vma) 0xfff);
8464               hipart = 1;
8465             }
8466           if (hipart)
8467             {
8468               load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
8469               if (breg != 0)
8470                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8471                              tempreg, tempreg, breg);
8472               breg = tempreg;
8473             }
8474           if (off0)
8475             {
8476               if (offset_expr.X_add_number == 0)
8477                 tempreg = breg;
8478               else
8479                 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
8480                              "t,r,j", tempreg, breg, BFD_RELOC_LO16);
8481               macro_build (NULL, s, fmt, treg, tempreg);
8482             }
8483           else if (!off12)
8484             macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
8485           else
8486             macro_build (NULL, s, fmt,
8487                          treg, (unsigned long) offset_expr.X_add_number, breg);
8488         }
8489       else if (off12 || off0)
8490         {
8491           /* A 12-bit or 0-bit offset field is too narrow to be used
8492              for a low-part relocation, so load the whole address into
8493              the auxillary register.  In the case of "A(b)" addresses,
8494              we first load absolute address "A" into the register and
8495              then add base register "b".  In the case of "o(b)" addresses,
8496              we simply need to add 16-bit offset "o" to base register "b", and
8497              offset_reloc already contains the relocations associated
8498              with "o".  */
8499           if (ab)
8500             {
8501               load_address (tempreg, &offset_expr, &used_at);
8502               if (breg != 0)
8503                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8504                              tempreg, tempreg, breg);
8505             }
8506           else
8507             macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8508                          tempreg, breg, -1,
8509                          offset_reloc[0], offset_reloc[1], offset_reloc[2]);
8510           expr1.X_add_number = 0;
8511           if (off0)
8512             macro_build (NULL, s, fmt, treg, tempreg);
8513           else
8514             macro_build (NULL, s, fmt,
8515                          treg, (unsigned long) expr1.X_add_number, tempreg);
8516         }
8517       else if (mips_pic == NO_PIC)
8518         {
8519           /* If this is a reference to a GP relative symbol, and there
8520              is no base register, we want
8521                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
8522              Otherwise, if there is no base register, we want
8523                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
8524                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8525              If we have a constant, we need two instructions anyhow,
8526              so we always use the latter form.
8527
8528              If we have a base register, and this is a reference to a
8529              GP relative symbol, we want
8530                addu     $tempreg,$breg,$gp
8531                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
8532              Otherwise we want
8533                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
8534                addu     $tempreg,$tempreg,$breg
8535                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8536              With a constant we always use the latter case.
8537
8538              With 64bit address space and no base register and $at usable,
8539              we want
8540                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8541                lui      $at,<sym>               (BFD_RELOC_HI16_S)
8542                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8543                dsll32   $tempreg,0
8544                daddu    $tempreg,$at
8545                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8546              If we have a base register, we want
8547                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8548                lui      $at,<sym>               (BFD_RELOC_HI16_S)
8549                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8550                daddu    $at,$breg
8551                dsll32   $tempreg,0
8552                daddu    $tempreg,$at
8553                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8554
8555              Without $at we can't generate the optimal path for superscalar
8556              processors here since this would require two temporary registers.
8557                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8558                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8559                dsll     $tempreg,16
8560                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
8561                dsll     $tempreg,16
8562                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8563              If we have a base register, we want
8564                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8565                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8566                dsll     $tempreg,16
8567                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
8568                dsll     $tempreg,16
8569                daddu    $tempreg,$tempreg,$breg
8570                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8571
8572              For GP relative symbols in 64bit address space we can use
8573              the same sequence as in 32bit address space.  */
8574           if (HAVE_64BIT_SYMBOLS)
8575             {
8576               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8577                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8578                 {
8579                   relax_start (offset_expr.X_add_symbol);
8580                   if (breg == 0)
8581                     {
8582                       macro_build (&offset_expr, s, fmt, treg,
8583                                    BFD_RELOC_GPREL16, mips_gp_register);
8584                     }
8585                   else
8586                     {
8587                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8588                                    tempreg, breg, mips_gp_register);
8589                       macro_build (&offset_expr, s, fmt, treg,
8590                                    BFD_RELOC_GPREL16, tempreg);
8591                     }
8592                   relax_switch ();
8593                 }
8594
8595               if (used_at == 0 && mips_opts.at)
8596                 {
8597                   macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8598                                BFD_RELOC_MIPS_HIGHEST);
8599                   macro_build (&offset_expr, "lui", LUI_FMT, AT,
8600                                BFD_RELOC_HI16_S);
8601                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8602                                tempreg, BFD_RELOC_MIPS_HIGHER);
8603                   if (breg != 0)
8604                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
8605                   macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
8606                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
8607                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
8608                                tempreg);
8609                   used_at = 1;
8610                 }
8611               else
8612                 {
8613                   macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8614                                BFD_RELOC_MIPS_HIGHEST);
8615                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8616                                tempreg, BFD_RELOC_MIPS_HIGHER);
8617                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
8618                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8619                                tempreg, BFD_RELOC_HI16_S);
8620                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
8621                   if (breg != 0)
8622                     macro_build (NULL, "daddu", "d,v,t",
8623                                  tempreg, tempreg, breg);
8624                   macro_build (&offset_expr, s, fmt, treg,
8625                                BFD_RELOC_LO16, tempreg);
8626                 }
8627
8628               if (mips_relax.sequence)
8629                 relax_end ();
8630               break;
8631             }
8632
8633           if (breg == 0)
8634             {
8635               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8636                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8637                 {
8638                   relax_start (offset_expr.X_add_symbol);
8639                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
8640                                mips_gp_register);
8641                   relax_switch ();
8642                 }
8643               macro_build_lui (&offset_expr, tempreg);
8644               macro_build (&offset_expr, s, fmt, treg,
8645                            BFD_RELOC_LO16, tempreg);
8646               if (mips_relax.sequence)
8647                 relax_end ();
8648             }
8649           else
8650             {
8651               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8652                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8653                 {
8654                   relax_start (offset_expr.X_add_symbol);
8655                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8656                                tempreg, breg, mips_gp_register);
8657                   macro_build (&offset_expr, s, fmt, treg,
8658                                BFD_RELOC_GPREL16, tempreg);
8659                   relax_switch ();
8660                 }
8661               macro_build_lui (&offset_expr, tempreg);
8662               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8663                            tempreg, tempreg, breg);
8664               macro_build (&offset_expr, s, fmt, treg,
8665                            BFD_RELOC_LO16, tempreg);
8666               if (mips_relax.sequence)
8667                 relax_end ();
8668             }
8669         }
8670       else if (!mips_big_got)
8671         {
8672           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
8673
8674           /* If this is a reference to an external symbol, we want
8675                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8676                nop
8677                <op>     $treg,0($tempreg)
8678              Otherwise we want
8679                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8680                nop
8681                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
8682                <op>     $treg,0($tempreg)
8683
8684              For NewABI, we want
8685                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
8686                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
8687
8688              If there is a base register, we add it to $tempreg before
8689              the <op>.  If there is a constant, we stick it in the
8690              <op> instruction.  We don't handle constants larger than
8691              16 bits, because we have no way to load the upper 16 bits
8692              (actually, we could handle them for the subset of cases
8693              in which we are not using $at).  */
8694           gas_assert (offset_expr.X_op == O_symbol);
8695           if (HAVE_NEWABI)
8696             {
8697               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8698                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
8699               if (breg != 0)
8700                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8701                              tempreg, tempreg, breg);
8702               macro_build (&offset_expr, s, fmt, treg,
8703                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
8704               break;
8705             }
8706           expr1.X_add_number = offset_expr.X_add_number;
8707           offset_expr.X_add_number = 0;
8708           if (expr1.X_add_number < -0x8000
8709               || expr1.X_add_number >= 0x8000)
8710             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8711           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8712                        lw_reloc_type, mips_gp_register);
8713           load_delay_nop ();
8714           relax_start (offset_expr.X_add_symbol);
8715           relax_switch ();
8716           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
8717                        tempreg, BFD_RELOC_LO16);
8718           relax_end ();
8719           if (breg != 0)
8720             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8721                          tempreg, tempreg, breg);
8722           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8723         }
8724       else if (mips_big_got && !HAVE_NEWABI)
8725         {
8726           int gpdelay;
8727
8728           /* If this is a reference to an external symbol, we want
8729                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
8730                addu     $tempreg,$tempreg,$gp
8731                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8732                <op>     $treg,0($tempreg)
8733              Otherwise we want
8734                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8735                nop
8736                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
8737                <op>     $treg,0($tempreg)
8738              If there is a base register, we add it to $tempreg before
8739              the <op>.  If there is a constant, we stick it in the
8740              <op> instruction.  We don't handle constants larger than
8741              16 bits, because we have no way to load the upper 16 bits
8742              (actually, we could handle them for the subset of cases
8743              in which we are not using $at).  */
8744           gas_assert (offset_expr.X_op == O_symbol);
8745           expr1.X_add_number = offset_expr.X_add_number;
8746           offset_expr.X_add_number = 0;
8747           if (expr1.X_add_number < -0x8000
8748               || expr1.X_add_number >= 0x8000)
8749             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8750           gpdelay = reg_needs_delay (mips_gp_register);
8751           relax_start (offset_expr.X_add_symbol);
8752           macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8753                        BFD_RELOC_MIPS_GOT_HI16);
8754           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
8755                        mips_gp_register);
8756           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8757                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
8758           relax_switch ();
8759           if (gpdelay)
8760             macro_build (NULL, "nop", "");
8761           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8762                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
8763           load_delay_nop ();
8764           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
8765                        tempreg, BFD_RELOC_LO16);
8766           relax_end ();
8767
8768           if (breg != 0)
8769             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8770                          tempreg, tempreg, breg);
8771           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8772         }
8773       else if (mips_big_got && HAVE_NEWABI)
8774         {
8775           /* If this is a reference to an external symbol, we want
8776                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
8777                add      $tempreg,$tempreg,$gp
8778                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8779                <op>     $treg,<ofst>($tempreg)
8780              Otherwise, for local symbols, we want:
8781                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
8782                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
8783           gas_assert (offset_expr.X_op == O_symbol);
8784           expr1.X_add_number = offset_expr.X_add_number;
8785           offset_expr.X_add_number = 0;
8786           if (expr1.X_add_number < -0x8000
8787               || expr1.X_add_number >= 0x8000)
8788             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8789           relax_start (offset_expr.X_add_symbol);
8790           macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8791                        BFD_RELOC_MIPS_GOT_HI16);
8792           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
8793                        mips_gp_register);
8794           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8795                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
8796           if (breg != 0)
8797             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8798                          tempreg, tempreg, breg);
8799           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8800
8801           relax_switch ();
8802           offset_expr.X_add_number = expr1.X_add_number;
8803           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8804                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
8805           if (breg != 0)
8806             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8807                          tempreg, tempreg, breg);
8808           macro_build (&offset_expr, s, fmt, treg,
8809                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
8810           relax_end ();
8811         }
8812       else
8813         abort ();
8814
8815       break;
8816
8817     case M_LI:
8818     case M_LI_S:
8819       load_register (treg, &imm_expr, 0);
8820       break;
8821
8822     case M_DLI:
8823       load_register (treg, &imm_expr, 1);
8824       break;
8825
8826     case M_LI_SS:
8827       if (imm_expr.X_op == O_constant)
8828         {
8829           used_at = 1;
8830           load_register (AT, &imm_expr, 0);
8831           macro_build (NULL, "mtc1", "t,G", AT, treg);
8832           break;
8833         }
8834       else
8835         {
8836           gas_assert (offset_expr.X_op == O_symbol
8837                       && strcmp (segment_name (S_GET_SEGMENT
8838                                                (offset_expr.X_add_symbol)),
8839                                  ".lit4") == 0
8840                       && offset_expr.X_add_number == 0);
8841           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
8842                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8843           break;
8844         }
8845
8846     case M_LI_D:
8847       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
8848          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
8849          order 32 bits of the value and the low order 32 bits are either
8850          zero or in OFFSET_EXPR.  */
8851       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
8852         {
8853           if (HAVE_64BIT_GPRS)
8854             load_register (treg, &imm_expr, 1);
8855           else
8856             {
8857               int hreg, lreg;
8858
8859               if (target_big_endian)
8860                 {
8861                   hreg = treg;
8862                   lreg = treg + 1;
8863                 }
8864               else
8865                 {
8866                   hreg = treg + 1;
8867                   lreg = treg;
8868                 }
8869
8870               if (hreg <= 31)
8871                 load_register (hreg, &imm_expr, 0);
8872               if (lreg <= 31)
8873                 {
8874                   if (offset_expr.X_op == O_absent)
8875                     move_register (lreg, 0);
8876                   else
8877                     {
8878                       gas_assert (offset_expr.X_op == O_constant);
8879                       load_register (lreg, &offset_expr, 0);
8880                     }
8881                 }
8882             }
8883           break;
8884         }
8885
8886       /* We know that sym is in the .rdata section.  First we get the
8887          upper 16 bits of the address.  */
8888       if (mips_pic == NO_PIC)
8889         {
8890           macro_build_lui (&offset_expr, AT);
8891           used_at = 1;
8892         }
8893       else
8894         {
8895           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
8896                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
8897           used_at = 1;
8898         }
8899
8900       /* Now we load the register(s).  */
8901       if (HAVE_64BIT_GPRS)
8902         {
8903           used_at = 1;
8904           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8905         }
8906       else
8907         {
8908           used_at = 1;
8909           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8910           if (treg != RA)
8911             {
8912               /* FIXME: How in the world do we deal with the possible
8913                  overflow here?  */
8914               offset_expr.X_add_number += 4;
8915               macro_build (&offset_expr, "lw", "t,o(b)",
8916                            treg + 1, BFD_RELOC_LO16, AT);
8917             }
8918         }
8919       break;
8920
8921     case M_LI_DD:
8922       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
8923          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
8924          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
8925          the value and the low order 32 bits are either zero or in
8926          OFFSET_EXPR.  */
8927       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
8928         {
8929           used_at = 1;
8930           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
8931           if (HAVE_64BIT_FPRS)
8932             {
8933               gas_assert (HAVE_64BIT_GPRS);
8934               macro_build (NULL, "dmtc1", "t,S", AT, treg);
8935             }
8936           else
8937             {
8938               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
8939               if (offset_expr.X_op == O_absent)
8940                 macro_build (NULL, "mtc1", "t,G", 0, treg);
8941               else
8942                 {
8943                   gas_assert (offset_expr.X_op == O_constant);
8944                   load_register (AT, &offset_expr, 0);
8945                   macro_build (NULL, "mtc1", "t,G", AT, treg);
8946                 }
8947             }
8948           break;
8949         }
8950
8951       gas_assert (offset_expr.X_op == O_symbol
8952                   && offset_expr.X_add_number == 0);
8953       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
8954       if (strcmp (s, ".lit8") == 0)
8955         {
8956           if (CPU_HAS_LDC1_SDC1 (mips_opts.arch) || mips_opts.micromips)
8957             {
8958               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
8959                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8960               break;
8961             }
8962           breg = mips_gp_register;
8963           r = BFD_RELOC_MIPS_LITERAL;
8964           goto dob;
8965         }
8966       else
8967         {
8968           gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
8969           used_at = 1;
8970           if (mips_pic != NO_PIC)
8971             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
8972                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
8973           else
8974             {
8975               /* FIXME: This won't work for a 64 bit address.  */
8976               macro_build_lui (&offset_expr, AT);
8977             }
8978
8979           if (CPU_HAS_LDC1_SDC1 (mips_opts.arch) || mips_opts.micromips)
8980             {
8981               macro_build (&offset_expr, "ldc1", "T,o(b)",
8982                            treg, BFD_RELOC_LO16, AT);
8983               break;
8984             }
8985           breg = AT;
8986           r = BFD_RELOC_LO16;
8987           goto dob;
8988         }
8989
8990     case M_L_DOB:
8991       /* Even on a big endian machine $fn comes before $fn+1.  We have
8992          to adjust when loading from memory.  */
8993       r = BFD_RELOC_LO16;
8994     dob:
8995       gas_assert (!mips_opts.micromips);
8996       gas_assert (!CPU_HAS_LDC1_SDC1 (mips_opts.arch));
8997       macro_build (&offset_expr, "lwc1", "T,o(b)",
8998                    target_big_endian ? treg + 1 : treg, r, breg);
8999       /* FIXME: A possible overflow which I don't know how to deal
9000          with.  */
9001       offset_expr.X_add_number += 4;
9002       macro_build (&offset_expr, "lwc1", "T,o(b)",
9003                    target_big_endian ? treg : treg + 1, r, breg);
9004       break;
9005
9006     case M_S_DOB:
9007       gas_assert (!mips_opts.micromips);
9008       gas_assert (!CPU_HAS_LDC1_SDC1 (mips_opts.arch));
9009       /* Even on a big endian machine $fn comes before $fn+1.  We have
9010          to adjust when storing to memory.  */
9011       macro_build (&offset_expr, "swc1", "T,o(b)",
9012                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
9013       offset_expr.X_add_number += 4;
9014       macro_build (&offset_expr, "swc1", "T,o(b)",
9015                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
9016       break;
9017
9018     case M_L_DAB:
9019       gas_assert (!mips_opts.micromips);
9020       /*
9021        * The MIPS assembler seems to check for X_add_number not
9022        * being double aligned and generating:
9023        *        lui     at,%hi(foo+1)
9024        *        addu    at,at,v1
9025        *        addiu   at,at,%lo(foo+1)
9026        *        lwc1    f2,0(at)
9027        *        lwc1    f3,4(at)
9028        * But, the resulting address is the same after relocation so why
9029        * generate the extra instruction?
9030        */
9031       /* Itbl support may require additional care here.  */
9032       coproc = 1;
9033       fmt = "T,o(b)";
9034       if (CPU_HAS_LDC1_SDC1 (mips_opts.arch))
9035         {
9036           s = "ldc1";
9037           goto ld_st;
9038         }
9039       s = "lwc1";
9040       goto ldd_std;
9041
9042     case M_S_DAB:
9043       gas_assert (!mips_opts.micromips);
9044       /* Itbl support may require additional care here.  */
9045       coproc = 1;
9046       fmt = "T,o(b)";
9047       if (CPU_HAS_LDC1_SDC1 (mips_opts.arch))
9048         {
9049           s = "sdc1";
9050           goto ld_st;
9051         }
9052       s = "swc1";
9053       goto ldd_std;
9054
9055     case M_LQ_AB:
9056       fmt = "t,o(b)";
9057       s = "lq";
9058       goto ld;
9059
9060     case M_SQ_AB:
9061       fmt = "t,o(b)";
9062       s = "sq";
9063       goto ld_st;
9064
9065     case M_LD_AB:
9066       fmt = "t,o(b)";
9067       if (HAVE_64BIT_GPRS)
9068         {
9069           s = "ld";
9070           goto ld;
9071         }
9072       s = "lw";
9073       goto ldd_std;
9074
9075     case M_SD_AB:
9076       fmt = "t,o(b)";
9077       if (HAVE_64BIT_GPRS)
9078         {
9079           s = "sd";
9080           goto ld_st;
9081         }
9082       s = "sw";
9083
9084     ldd_std:
9085       if (offset_expr.X_op != O_symbol
9086           && offset_expr.X_op != O_constant)
9087         {
9088           as_bad (_("Expression too complex"));
9089           offset_expr.X_op = O_constant;
9090         }
9091
9092       if (HAVE_32BIT_ADDRESSES
9093           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
9094         {
9095           char value [32];
9096
9097           sprintf_vma (value, offset_expr.X_add_number);
9098           as_bad (_("Number (0x%s) larger than 32 bits"), value);
9099         }
9100
9101       /* Even on a big endian machine $fn comes before $fn+1.  We have
9102          to adjust when loading from memory.  We set coproc if we must
9103          load $fn+1 first.  */
9104       /* Itbl support may require additional care here.  */
9105       if (!target_big_endian)
9106         coproc = 0;
9107
9108       if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
9109         {
9110           /* If this is a reference to a GP relative symbol, we want
9111                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
9112                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
9113              If we have a base register, we use this
9114                addu     $at,$breg,$gp
9115                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
9116                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
9117              If this is not a GP relative symbol, we want
9118                lui      $at,<sym>               (BFD_RELOC_HI16_S)
9119                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
9120                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
9121              If there is a base register, we add it to $at after the
9122              lui instruction.  If there is a constant, we always use
9123              the last case.  */
9124           if (offset_expr.X_op == O_symbol
9125               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
9126               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
9127             {
9128               relax_start (offset_expr.X_add_symbol);
9129               if (breg == 0)
9130                 {
9131                   tempreg = mips_gp_register;
9132                 }
9133               else
9134                 {
9135                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9136                                AT, breg, mips_gp_register);
9137                   tempreg = AT;
9138                   used_at = 1;
9139                 }
9140
9141               /* Itbl support may require additional care here.  */
9142               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9143                            BFD_RELOC_GPREL16, tempreg);
9144               offset_expr.X_add_number += 4;
9145
9146               /* Set mips_optimize to 2 to avoid inserting an
9147                  undesired nop.  */
9148               hold_mips_optimize = mips_optimize;
9149               mips_optimize = 2;
9150               /* Itbl support may require additional care here.  */
9151               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9152                            BFD_RELOC_GPREL16, tempreg);
9153               mips_optimize = hold_mips_optimize;
9154
9155               relax_switch ();
9156
9157               offset_expr.X_add_number -= 4;
9158             }
9159           used_at = 1;
9160           macro_build_lui (&offset_expr, AT);
9161           if (breg != 0)
9162             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9163           /* Itbl support may require additional care here.  */
9164           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9165                        BFD_RELOC_LO16, AT);
9166           /* FIXME: How do we handle overflow here?  */
9167           offset_expr.X_add_number += 4;
9168           /* Itbl support may require additional care here.  */
9169           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9170                        BFD_RELOC_LO16, AT);
9171           if (mips_relax.sequence)
9172             relax_end ();
9173         }
9174       else if (!mips_big_got)
9175         {
9176           /* If this is a reference to an external symbol, we want
9177                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
9178                nop
9179                <op>     $treg,0($at)
9180                <op>     $treg+1,4($at)
9181              Otherwise we want
9182                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
9183                nop
9184                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
9185                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
9186              If there is a base register we add it to $at before the
9187              lwc1 instructions.  If there is a constant we include it
9188              in the lwc1 instructions.  */
9189           used_at = 1;
9190           expr1.X_add_number = offset_expr.X_add_number;
9191           if (expr1.X_add_number < -0x8000
9192               || expr1.X_add_number >= 0x8000 - 4)
9193             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9194           load_got_offset (AT, &offset_expr);
9195           load_delay_nop ();
9196           if (breg != 0)
9197             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9198
9199           /* Set mips_optimize to 2 to avoid inserting an undesired
9200              nop.  */
9201           hold_mips_optimize = mips_optimize;
9202           mips_optimize = 2;
9203
9204           /* Itbl support may require additional care here.  */
9205           relax_start (offset_expr.X_add_symbol);
9206           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9207                        BFD_RELOC_LO16, AT);
9208           expr1.X_add_number += 4;
9209           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9210                        BFD_RELOC_LO16, AT);
9211           relax_switch ();
9212           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9213                        BFD_RELOC_LO16, AT);
9214           offset_expr.X_add_number += 4;
9215           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9216                        BFD_RELOC_LO16, AT);
9217           relax_end ();
9218
9219           mips_optimize = hold_mips_optimize;
9220         }
9221       else if (mips_big_got)
9222         {
9223           int gpdelay;
9224
9225           /* If this is a reference to an external symbol, we want
9226                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
9227                addu     $at,$at,$gp
9228                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
9229                nop
9230                <op>     $treg,0($at)
9231                <op>     $treg+1,4($at)
9232              Otherwise we want
9233                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
9234                nop
9235                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
9236                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
9237              If there is a base register we add it to $at before the
9238              lwc1 instructions.  If there is a constant we include it
9239              in the lwc1 instructions.  */
9240           used_at = 1;
9241           expr1.X_add_number = offset_expr.X_add_number;
9242           offset_expr.X_add_number = 0;
9243           if (expr1.X_add_number < -0x8000
9244               || expr1.X_add_number >= 0x8000 - 4)
9245             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9246           gpdelay = reg_needs_delay (mips_gp_register);
9247           relax_start (offset_expr.X_add_symbol);
9248           macro_build (&offset_expr, "lui", LUI_FMT,
9249                        AT, BFD_RELOC_MIPS_GOT_HI16);
9250           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9251                        AT, AT, mips_gp_register);
9252           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
9253                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
9254           load_delay_nop ();
9255           if (breg != 0)
9256             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9257           /* Itbl support may require additional care here.  */
9258           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9259                        BFD_RELOC_LO16, AT);
9260           expr1.X_add_number += 4;
9261
9262           /* Set mips_optimize to 2 to avoid inserting an undesired
9263              nop.  */
9264           hold_mips_optimize = mips_optimize;
9265           mips_optimize = 2;
9266           /* Itbl support may require additional care here.  */
9267           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9268                        BFD_RELOC_LO16, AT);
9269           mips_optimize = hold_mips_optimize;
9270           expr1.X_add_number -= 4;
9271
9272           relax_switch ();
9273           offset_expr.X_add_number = expr1.X_add_number;
9274           if (gpdelay)
9275             macro_build (NULL, "nop", "");
9276           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9277                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
9278           load_delay_nop ();
9279           if (breg != 0)
9280             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9281           /* Itbl support may require additional care here.  */
9282           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9283                        BFD_RELOC_LO16, AT);
9284           offset_expr.X_add_number += 4;
9285
9286           /* Set mips_optimize to 2 to avoid inserting an undesired
9287              nop.  */
9288           hold_mips_optimize = mips_optimize;
9289           mips_optimize = 2;
9290           /* Itbl support may require additional care here.  */
9291           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9292                        BFD_RELOC_LO16, AT);
9293           mips_optimize = hold_mips_optimize;
9294           relax_end ();
9295         }
9296       else
9297         abort ();
9298
9299       break;
9300
9301     case M_LD_OB:
9302       s = HAVE_64BIT_GPRS ? "ld" : "lw";
9303       goto sd_ob;
9304     case M_SD_OB:
9305       s = HAVE_64BIT_GPRS ? "sd" : "sw";
9306     sd_ob:
9307       macro_build (&offset_expr, s, "t,o(b)", treg,
9308                    -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9309                    breg);
9310       if (!HAVE_64BIT_GPRS)
9311         {
9312           offset_expr.X_add_number += 4;
9313           macro_build (&offset_expr, s, "t,o(b)", treg + 1,
9314                        -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9315                        breg);
9316         }
9317       break;
9318
9319         
9320     case M_SAA_AB:
9321       ab = 1;
9322     case M_SAA_OB:
9323       s = "saa";
9324       off0 = 1;
9325       fmt = "t,(b)";
9326       goto ld_st;
9327     case M_SAAD_AB:
9328       ab = 1;
9329     case M_SAAD_OB:
9330       s = "saad";
9331       off0 = 1;
9332       fmt = "t,(b)";
9333       goto ld_st;
9334
9335    /* New code added to support COPZ instructions.
9336       This code builds table entries out of the macros in mip_opcodes.
9337       R4000 uses interlocks to handle coproc delays.
9338       Other chips (like the R3000) require nops to be inserted for delays.
9339
9340       FIXME: Currently, we require that the user handle delays.
9341       In order to fill delay slots for non-interlocked chips,
9342       we must have a way to specify delays based on the coprocessor.
9343       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
9344       What are the side-effects of the cop instruction?
9345       What cache support might we have and what are its effects?
9346       Both coprocessor & memory require delays. how long???
9347       What registers are read/set/modified?
9348
9349       If an itbl is provided to interpret cop instructions,
9350       this knowledge can be encoded in the itbl spec.  */
9351
9352     case M_COP0:
9353       s = "c0";
9354       goto copz;
9355     case M_COP1:
9356       s = "c1";
9357       goto copz;
9358     case M_COP2:
9359       s = "c2";
9360       goto copz;
9361     case M_COP3:
9362       s = "c3";
9363     copz:
9364       gas_assert (!mips_opts.micromips);
9365       /* For now we just do C (same as Cz).  The parameter will be
9366          stored in insn_opcode by mips_ip.  */
9367       macro_build (NULL, s, "C", ip->insn_opcode);
9368       break;
9369
9370     case M_MOVE:
9371       move_register (dreg, sreg);
9372       break;
9373
9374     case M_DMUL:
9375       dbl = 1;
9376     case M_MUL:
9377       if (mips_opts.arch == CPU_R5900)
9378         {
9379           macro_build (NULL, dbl ? "dmultu" : "multu", "d,s,t", dreg, sreg, treg);
9380         }
9381       else
9382         {
9383       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
9384       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9385         }
9386       break;
9387
9388     case M_DMUL_I:
9389       dbl = 1;
9390     case M_MUL_I:
9391       /* The MIPS assembler some times generates shifts and adds.  I'm
9392          not trying to be that fancy. GCC should do this for us
9393          anyway.  */
9394       used_at = 1;
9395       load_register (AT, &imm_expr, dbl);
9396       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
9397       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9398       break;
9399
9400     case M_DMULO_I:
9401       dbl = 1;
9402     case M_MULO_I:
9403       imm = 1;
9404       goto do_mulo;
9405
9406     case M_DMULO:
9407       dbl = 1;
9408     case M_MULO:
9409     do_mulo:
9410       start_noreorder ();
9411       used_at = 1;
9412       if (imm)
9413         load_register (AT, &imm_expr, dbl);
9414       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
9415       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9416       macro_build (NULL, dbl ? "dsra32" : "sra", SHFT_FMT, dreg, dreg, RA);
9417       macro_build (NULL, "mfhi", MFHL_FMT, AT);
9418       if (mips_trap)
9419         macro_build (NULL, "tne", TRAP_FMT, dreg, AT, 6);
9420       else
9421         {
9422           if (mips_opts.micromips)
9423             micromips_label_expr (&label_expr);
9424           else
9425             label_expr.X_add_number = 8;
9426           macro_build (&label_expr, "beq", "s,t,p", dreg, AT);
9427           macro_build (NULL, "nop", "");
9428           macro_build (NULL, "break", BRK_FMT, 6);
9429           if (mips_opts.micromips)
9430             micromips_add_label ();
9431         }
9432       end_noreorder ();
9433       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9434       break;
9435
9436     case M_DMULOU_I:
9437       dbl = 1;
9438     case M_MULOU_I:
9439       imm = 1;
9440       goto do_mulou;
9441
9442     case M_DMULOU:
9443       dbl = 1;
9444     case M_MULOU:
9445     do_mulou:
9446       start_noreorder ();
9447       used_at = 1;
9448       if (imm)
9449         load_register (AT, &imm_expr, dbl);
9450       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
9451                    sreg, imm ? AT : treg);
9452       macro_build (NULL, "mfhi", MFHL_FMT, AT);
9453       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9454       if (mips_trap)
9455         macro_build (NULL, "tne", TRAP_FMT, AT, ZERO, 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", AT, ZERO);
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       break;
9470
9471     case M_DROL:
9472       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9473         {
9474           if (dreg == sreg)
9475             {
9476               tempreg = AT;
9477               used_at = 1;
9478             }
9479           else
9480             {
9481               tempreg = dreg;
9482             }
9483           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
9484           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
9485           break;
9486         }
9487       used_at = 1;
9488       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9489       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
9490       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
9491       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9492       break;
9493
9494     case M_ROL:
9495       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9496         {
9497           if (dreg == sreg)
9498             {
9499               tempreg = AT;
9500               used_at = 1;
9501             }
9502           else
9503             {
9504               tempreg = dreg;
9505             }
9506           macro_build (NULL, "negu", "d,w", tempreg, treg);
9507           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
9508           break;
9509         }
9510       used_at = 1;
9511       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
9512       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
9513       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
9514       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9515       break;
9516
9517     case M_DROL_I:
9518       {
9519         unsigned int rot;
9520         char *l;
9521         char *rr;
9522
9523         if (imm_expr.X_op != O_constant)
9524           as_bad (_("Improper rotate count"));
9525         rot = imm_expr.X_add_number & 0x3f;
9526         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9527           {
9528             rot = (64 - rot) & 0x3f;
9529             if (rot >= 32)
9530               macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
9531             else
9532               macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
9533             break;
9534           }
9535         if (rot == 0)
9536           {
9537             macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
9538             break;
9539           }
9540         l = (rot < 0x20) ? "dsll" : "dsll32";
9541         rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
9542         rot &= 0x1f;
9543         used_at = 1;
9544         macro_build (NULL, l, SHFT_FMT, AT, sreg, rot);
9545         macro_build (NULL, rr, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9546         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9547       }
9548       break;
9549
9550     case M_ROL_I:
9551       {
9552         unsigned int rot;
9553
9554         if (imm_expr.X_op != O_constant)
9555           as_bad (_("Improper rotate count"));
9556         rot = imm_expr.X_add_number & 0x1f;
9557         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9558           {
9559             macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, (32 - rot) & 0x1f);
9560             break;
9561           }
9562         if (rot == 0)
9563           {
9564             macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
9565             break;
9566           }
9567         used_at = 1;
9568         macro_build (NULL, "sll", SHFT_FMT, AT, sreg, rot);
9569         macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9570         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9571       }
9572       break;
9573
9574     case M_DROR:
9575       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9576         {
9577           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
9578           break;
9579         }
9580       used_at = 1;
9581       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9582       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
9583       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
9584       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9585       break;
9586
9587     case M_ROR:
9588       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9589         {
9590           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
9591           break;
9592         }
9593       used_at = 1;
9594       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
9595       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
9596       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
9597       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9598       break;
9599
9600     case M_DROR_I:
9601       {
9602         unsigned int rot;
9603         char *l;
9604         char *rr;
9605
9606         if (imm_expr.X_op != O_constant)
9607           as_bad (_("Improper rotate count"));
9608         rot = imm_expr.X_add_number & 0x3f;
9609         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9610           {
9611             if (rot >= 32)
9612               macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
9613             else
9614               macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
9615             break;
9616           }
9617         if (rot == 0)
9618           {
9619             macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
9620             break;
9621           }
9622         rr = (rot < 0x20) ? "dsrl" : "dsrl32";
9623         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
9624         rot &= 0x1f;
9625         used_at = 1;
9626         macro_build (NULL, rr, SHFT_FMT, AT, sreg, rot);
9627         macro_build (NULL, l, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9628         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9629       }
9630       break;
9631
9632     case M_ROR_I:
9633       {
9634         unsigned int rot;
9635
9636         if (imm_expr.X_op != O_constant)
9637           as_bad (_("Improper rotate count"));
9638         rot = imm_expr.X_add_number & 0x1f;
9639         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9640           {
9641             macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, rot);
9642             break;
9643           }
9644         if (rot == 0)
9645           {
9646             macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
9647             break;
9648           }
9649         used_at = 1;
9650         macro_build (NULL, "srl", SHFT_FMT, AT, sreg, rot);
9651         macro_build (NULL, "sll", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9652         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9653       }
9654       break;
9655
9656     case M_SEQ:
9657       if (sreg == 0)
9658         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
9659       else if (treg == 0)
9660         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9661       else
9662         {
9663           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
9664           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
9665         }
9666       break;
9667
9668     case M_SEQ_I:
9669       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
9670         {
9671           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9672           break;
9673         }
9674       if (sreg == 0)
9675         {
9676           as_warn (_("Instruction %s: result is always false"),
9677                    ip->insn_mo->name);
9678           move_register (dreg, 0);
9679           break;
9680         }
9681       if (CPU_HAS_SEQ (mips_opts.arch)
9682           && -512 <= imm_expr.X_add_number
9683           && imm_expr.X_add_number < 512)
9684         {
9685           macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
9686                        (int) imm_expr.X_add_number);
9687           break;
9688         }
9689       if (imm_expr.X_op == O_constant
9690           && imm_expr.X_add_number >= 0
9691           && imm_expr.X_add_number < 0x10000)
9692         {
9693           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
9694         }
9695       else if (imm_expr.X_op == O_constant
9696                && imm_expr.X_add_number > -0x8000
9697                && imm_expr.X_add_number < 0)
9698         {
9699           imm_expr.X_add_number = -imm_expr.X_add_number;
9700           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
9701                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9702         }
9703       else if (CPU_HAS_SEQ (mips_opts.arch))
9704         {
9705           used_at = 1;
9706           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9707           macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
9708           break;
9709         }
9710       else
9711         {
9712           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9713           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
9714           used_at = 1;
9715         }
9716       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
9717       break;
9718
9719     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
9720       s = "slt";
9721       goto sge;
9722     case M_SGEU:
9723       s = "sltu";
9724     sge:
9725       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
9726       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9727       break;
9728
9729     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
9730     case M_SGEU_I:
9731       if (imm_expr.X_op == O_constant
9732           && imm_expr.X_add_number >= -0x8000
9733           && imm_expr.X_add_number < 0x8000)
9734         {
9735           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
9736                        dreg, sreg, BFD_RELOC_LO16);
9737         }
9738       else
9739         {
9740           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9741           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
9742                        dreg, sreg, AT);
9743           used_at = 1;
9744         }
9745       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9746       break;
9747
9748     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
9749       s = "slt";
9750       goto sgt;
9751     case M_SGTU:
9752       s = "sltu";
9753     sgt:
9754       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
9755       break;
9756
9757     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
9758       s = "slt";
9759       goto sgti;
9760     case M_SGTU_I:
9761       s = "sltu";
9762     sgti:
9763       used_at = 1;
9764       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9765       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
9766       break;
9767
9768     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
9769       s = "slt";
9770       goto sle;
9771     case M_SLEU:
9772       s = "sltu";
9773     sle:
9774       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
9775       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9776       break;
9777
9778     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
9779       s = "slt";
9780       goto slei;
9781     case M_SLEU_I:
9782       s = "sltu";
9783     slei:
9784       used_at = 1;
9785       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9786       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
9787       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9788       break;
9789
9790     case M_SLT_I:
9791       if (imm_expr.X_op == O_constant
9792           && imm_expr.X_add_number >= -0x8000
9793           && imm_expr.X_add_number < 0x8000)
9794         {
9795           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9796           break;
9797         }
9798       used_at = 1;
9799       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9800       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
9801       break;
9802
9803     case M_SLTU_I:
9804       if (imm_expr.X_op == O_constant
9805           && imm_expr.X_add_number >= -0x8000
9806           && imm_expr.X_add_number < 0x8000)
9807         {
9808           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
9809                        BFD_RELOC_LO16);
9810           break;
9811         }
9812       used_at = 1;
9813       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9814       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
9815       break;
9816
9817     case M_SNE:
9818       if (sreg == 0)
9819         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
9820       else if (treg == 0)
9821         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
9822       else
9823         {
9824           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
9825           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
9826         }
9827       break;
9828
9829     case M_SNE_I:
9830       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
9831         {
9832           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
9833           break;
9834         }
9835       if (sreg == 0)
9836         {
9837           as_warn (_("Instruction %s: result is always true"),
9838                    ip->insn_mo->name);
9839           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
9840                        dreg, 0, BFD_RELOC_LO16);
9841           break;
9842         }
9843       if (CPU_HAS_SEQ (mips_opts.arch)
9844           && -512 <= imm_expr.X_add_number
9845           && imm_expr.X_add_number < 512)
9846         {
9847           macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
9848                        (int) imm_expr.X_add_number);
9849           break;
9850         }
9851       if (imm_expr.X_op == O_constant
9852           && imm_expr.X_add_number >= 0
9853           && imm_expr.X_add_number < 0x10000)
9854         {
9855           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
9856         }
9857       else if (imm_expr.X_op == O_constant
9858                && imm_expr.X_add_number > -0x8000
9859                && imm_expr.X_add_number < 0)
9860         {
9861           imm_expr.X_add_number = -imm_expr.X_add_number;
9862           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
9863                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9864         }
9865       else if (CPU_HAS_SEQ (mips_opts.arch))
9866         {
9867           used_at = 1;
9868           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9869           macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
9870           break;
9871         }
9872       else
9873         {
9874           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9875           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
9876           used_at = 1;
9877         }
9878       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
9879       break;
9880
9881     case M_SUB_I:
9882       s = "addi";
9883       s2 = "sub";
9884       goto do_subi;
9885     case M_SUBU_I:
9886       s = "addiu";
9887       s2 = "subu";
9888       goto do_subi;
9889     case M_DSUB_I:
9890       dbl = 1;
9891       s = "daddi";
9892       s2 = "dsub";
9893       if (!mips_opts.micromips)
9894         goto do_subi;
9895       if (imm_expr.X_op == O_constant
9896           && imm_expr.X_add_number > -0x200
9897           && imm_expr.X_add_number <= 0x200)
9898         {
9899           macro_build (NULL, s, "t,r,.", dreg, sreg, -imm_expr.X_add_number);
9900           break;
9901         }
9902       goto do_subi_i;
9903     case M_DSUBU_I:
9904       dbl = 1;
9905       s = "daddiu";
9906       s2 = "dsubu";
9907     do_subi:
9908       if (imm_expr.X_op == O_constant
9909           && imm_expr.X_add_number > -0x8000
9910           && imm_expr.X_add_number <= 0x8000)
9911         {
9912           imm_expr.X_add_number = -imm_expr.X_add_number;
9913           macro_build (&imm_expr, s, "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9914           break;
9915         }
9916     do_subi_i:
9917       used_at = 1;
9918       load_register (AT, &imm_expr, dbl);
9919       macro_build (NULL, s2, "d,v,t", dreg, sreg, AT);
9920       break;
9921
9922     case M_TEQ_I:
9923       s = "teq";
9924       goto trap;
9925     case M_TGE_I:
9926       s = "tge";
9927       goto trap;
9928     case M_TGEU_I:
9929       s = "tgeu";
9930       goto trap;
9931     case M_TLT_I:
9932       s = "tlt";
9933       goto trap;
9934     case M_TLTU_I:
9935       s = "tltu";
9936       goto trap;
9937     case M_TNE_I:
9938       s = "tne";
9939     trap:
9940       used_at = 1;
9941       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9942       macro_build (NULL, s, "s,t", sreg, AT);
9943       break;
9944
9945     case M_TRUNCWS:
9946     case M_TRUNCWD:
9947       gas_assert (!mips_opts.micromips);
9948       gas_assert (mips_opts.isa == ISA_MIPS1);
9949       used_at = 1;
9950       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
9951       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
9952
9953       /*
9954        * Is the double cfc1 instruction a bug in the mips assembler;
9955        * or is there a reason for it?
9956        */
9957       start_noreorder ();
9958       macro_build (NULL, "cfc1", "t,G", treg, RA);
9959       macro_build (NULL, "cfc1", "t,G", treg, RA);
9960       macro_build (NULL, "nop", "");
9961       expr1.X_add_number = 3;
9962       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
9963       expr1.X_add_number = 2;
9964       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
9965       macro_build (NULL, "ctc1", "t,G", AT, RA);
9966       macro_build (NULL, "nop", "");
9967       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
9968                    dreg, sreg);
9969       macro_build (NULL, "ctc1", "t,G", treg, RA);
9970       macro_build (NULL, "nop", "");
9971       end_noreorder ();
9972       break;
9973
9974     case M_ULH_A:
9975       ab = 1;
9976     case M_ULH:
9977       s = "lb";
9978       s2 = "lbu";
9979       off = 1;
9980       goto uld_st;
9981     case M_ULHU_A:
9982       ab = 1;
9983     case M_ULHU:
9984       s = "lbu";
9985       s2 = "lbu";
9986       off = 1;
9987       goto uld_st;
9988     case M_ULW_A:
9989       ab = 1;
9990     case M_ULW:
9991       s = "lwl";
9992       s2 = "lwr";
9993       off12 = mips_opts.micromips;
9994       off = 3;
9995       goto uld_st;
9996     case M_ULD_A:
9997       ab = 1;
9998     case M_ULD:
9999       s = "ldl";
10000       s2 = "ldr";
10001       off12 = mips_opts.micromips;
10002       off = 7;
10003       goto uld_st;
10004     case M_USH_A:
10005       ab = 1;
10006     case M_USH:
10007       s = "sb";
10008       s2 = "sb";
10009       off = 1;
10010       ust = 1;
10011       goto uld_st;
10012     case M_USW_A:
10013       ab = 1;
10014     case M_USW:
10015       s = "swl";
10016       s2 = "swr";
10017       off12 = mips_opts.micromips;
10018       off = 3;
10019       ust = 1;
10020       goto uld_st;
10021     case M_USD_A:
10022       ab = 1;
10023     case M_USD:
10024       s = "sdl";
10025       s2 = "sdr";
10026       off12 = mips_opts.micromips;
10027       off = 7;
10028       ust = 1;
10029
10030     uld_st:
10031       if (!ab && offset_expr.X_add_number >= 0x8000 - off)
10032         as_bad (_("Operand overflow"));
10033
10034       ep = &offset_expr;
10035       expr1.X_add_number = 0;
10036       if (ab)
10037         {
10038           used_at = 1;
10039           tempreg = AT;
10040           load_address (tempreg, ep, &used_at);
10041           if (breg != 0)
10042             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
10043                          tempreg, tempreg, breg);
10044           breg = tempreg;
10045           tempreg = treg;
10046           ep = &expr1;
10047         }
10048       else if (off12
10049                && (offset_expr.X_op != O_constant
10050                    || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number)
10051                    || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number + off)))
10052         {
10053           used_at = 1;
10054           tempreg = AT;
10055           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", tempreg, breg,
10056                        -1, offset_reloc[0], offset_reloc[1], offset_reloc[2]);
10057           breg = tempreg;
10058           tempreg = treg;
10059           ep = &expr1;
10060         }
10061       else if (!ust && treg == breg)
10062         {
10063           used_at = 1;
10064           tempreg = AT;
10065         }
10066       else
10067         tempreg = treg;
10068
10069       if (off == 1)
10070         goto ulh_sh;
10071
10072       if (!target_big_endian)
10073         ep->X_add_number += off;
10074       if (!off12)
10075         macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10076       else
10077         macro_build (NULL, s, "t,~(b)",
10078                      tempreg, (unsigned long) ep->X_add_number, breg);
10079
10080       if (!target_big_endian)
10081         ep->X_add_number -= off;
10082       else
10083         ep->X_add_number += off;
10084       if (!off12)
10085         macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10086       else
10087         macro_build (NULL, s2, "t,~(b)",
10088                      tempreg, (unsigned long) ep->X_add_number, breg);
10089
10090       /* If necessary, move the result in tempreg to the final destination.  */
10091       if (!ust && treg != tempreg)
10092         {
10093           /* Protect second load's delay slot.  */
10094           load_delay_nop ();
10095           move_register (treg, tempreg);
10096         }
10097       break;
10098
10099     ulh_sh:
10100       used_at = 1;
10101       if (target_big_endian == ust)
10102         ep->X_add_number += off;
10103       tempreg = ust || ab ? treg : AT;
10104       macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10105
10106       /* For halfword transfers we need a temporary register to shuffle
10107          bytes.  Unfortunately for M_USH_A we have none available before
10108          the next store as AT holds the base address.  We deal with this
10109          case by clobbering TREG and then restoring it as with ULH.  */
10110       tempreg = ust == ab ? treg : AT;
10111       if (ust)
10112         macro_build (NULL, "srl", SHFT_FMT, tempreg, treg, 8);
10113
10114       if (target_big_endian == ust)
10115         ep->X_add_number -= off;
10116       else
10117         ep->X_add_number += off;
10118       macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10119
10120       /* For M_USH_A re-retrieve the LSB.  */
10121       if (ust && ab)
10122         {
10123           if (target_big_endian)
10124             ep->X_add_number += off;
10125           else
10126             ep->X_add_number -= off;
10127           macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
10128         }
10129       /* For ULH and M_USH_A OR the LSB in.  */
10130       if (!ust || ab)
10131         {
10132           tempreg = !ab ? AT : treg;
10133           macro_build (NULL, "sll", SHFT_FMT, tempreg, tempreg, 8);
10134           macro_build (NULL, "or", "d,v,t", treg, treg, AT);
10135         }
10136       break;
10137
10138     default:
10139       /* FIXME: Check if this is one of the itbl macros, since they
10140          are added dynamically.  */
10141       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
10142       break;
10143     }
10144   if (!mips_opts.at && used_at)
10145     as_bad (_("Macro used $at after \".set noat\""));
10146 }
10147
10148 /* Implement macros in mips16 mode.  */
10149
10150 static void
10151 mips16_macro (struct mips_cl_insn *ip)
10152 {
10153   int mask;
10154   int xreg, yreg, zreg, tmp;
10155   expressionS expr1;
10156   int dbl;
10157   const char *s, *s2, *s3;
10158
10159   mask = ip->insn_mo->mask;
10160
10161   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
10162   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
10163   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
10164
10165   expr1.X_op = O_constant;
10166   expr1.X_op_symbol = NULL;
10167   expr1.X_add_symbol = NULL;
10168   expr1.X_add_number = 1;
10169
10170   dbl = 0;
10171
10172   switch (mask)
10173     {
10174     default:
10175       abort ();
10176
10177     case M_DDIV_3:
10178       dbl = 1;
10179     case M_DIV_3:
10180       s = "mflo";
10181       goto do_div3;
10182     case M_DREM_3:
10183       dbl = 1;
10184     case M_REM_3:
10185       s = "mfhi";
10186     do_div3:
10187       start_noreorder ();
10188       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
10189       expr1.X_add_number = 2;
10190       macro_build (&expr1, "bnez", "x,p", yreg);
10191       macro_build (NULL, "break", "6", 7);
10192
10193       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
10194          since that causes an overflow.  We should do that as well,
10195          but I don't see how to do the comparisons without a temporary
10196          register.  */
10197       end_noreorder ();
10198       macro_build (NULL, s, "x", zreg);
10199       break;
10200
10201     case M_DIVU_3:
10202       s = "divu";
10203       s2 = "mflo";
10204       goto do_divu3;
10205     case M_REMU_3:
10206       s = "divu";
10207       s2 = "mfhi";
10208       goto do_divu3;
10209     case M_DDIVU_3:
10210       s = "ddivu";
10211       s2 = "mflo";
10212       goto do_divu3;
10213     case M_DREMU_3:
10214       s = "ddivu";
10215       s2 = "mfhi";
10216     do_divu3:
10217       start_noreorder ();
10218       macro_build (NULL, s, "0,x,y", xreg, yreg);
10219       expr1.X_add_number = 2;
10220       macro_build (&expr1, "bnez", "x,p", yreg);
10221       macro_build (NULL, "break", "6", 7);
10222       end_noreorder ();
10223       macro_build (NULL, s2, "x", zreg);
10224       break;
10225
10226     case M_DMUL:
10227       dbl = 1;
10228     case M_MUL:
10229       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
10230       macro_build (NULL, "mflo", "x", zreg);
10231       break;
10232
10233     case M_DSUBU_I:
10234       dbl = 1;
10235       goto do_subu;
10236     case M_SUBU_I:
10237     do_subu:
10238       if (imm_expr.X_op != O_constant)
10239         as_bad (_("Unsupported large constant"));
10240       imm_expr.X_add_number = -imm_expr.X_add_number;
10241       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
10242       break;
10243
10244     case M_SUBU_I_2:
10245       if (imm_expr.X_op != O_constant)
10246         as_bad (_("Unsupported large constant"));
10247       imm_expr.X_add_number = -imm_expr.X_add_number;
10248       macro_build (&imm_expr, "addiu", "x,k", xreg);
10249       break;
10250
10251     case M_DSUBU_I_2:
10252       if (imm_expr.X_op != O_constant)
10253         as_bad (_("Unsupported large constant"));
10254       imm_expr.X_add_number = -imm_expr.X_add_number;
10255       macro_build (&imm_expr, "daddiu", "y,j", yreg);
10256       break;
10257
10258     case M_BEQ:
10259       s = "cmp";
10260       s2 = "bteqz";
10261       goto do_branch;
10262     case M_BNE:
10263       s = "cmp";
10264       s2 = "btnez";
10265       goto do_branch;
10266     case M_BLT:
10267       s = "slt";
10268       s2 = "btnez";
10269       goto do_branch;
10270     case M_BLTU:
10271       s = "sltu";
10272       s2 = "btnez";
10273       goto do_branch;
10274     case M_BLE:
10275       s = "slt";
10276       s2 = "bteqz";
10277       goto do_reverse_branch;
10278     case M_BLEU:
10279       s = "sltu";
10280       s2 = "bteqz";
10281       goto do_reverse_branch;
10282     case M_BGE:
10283       s = "slt";
10284       s2 = "bteqz";
10285       goto do_branch;
10286     case M_BGEU:
10287       s = "sltu";
10288       s2 = "bteqz";
10289       goto do_branch;
10290     case M_BGT:
10291       s = "slt";
10292       s2 = "btnez";
10293       goto do_reverse_branch;
10294     case M_BGTU:
10295       s = "sltu";
10296       s2 = "btnez";
10297
10298     do_reverse_branch:
10299       tmp = xreg;
10300       xreg = yreg;
10301       yreg = tmp;
10302
10303     do_branch:
10304       macro_build (NULL, s, "x,y", xreg, yreg);
10305       macro_build (&offset_expr, s2, "p");
10306       break;
10307
10308     case M_BEQ_I:
10309       s = "cmpi";
10310       s2 = "bteqz";
10311       s3 = "x,U";
10312       goto do_branch_i;
10313     case M_BNE_I:
10314       s = "cmpi";
10315       s2 = "btnez";
10316       s3 = "x,U";
10317       goto do_branch_i;
10318     case M_BLT_I:
10319       s = "slti";
10320       s2 = "btnez";
10321       s3 = "x,8";
10322       goto do_branch_i;
10323     case M_BLTU_I:
10324       s = "sltiu";
10325       s2 = "btnez";
10326       s3 = "x,8";
10327       goto do_branch_i;
10328     case M_BLE_I:
10329       s = "slti";
10330       s2 = "btnez";
10331       s3 = "x,8";
10332       goto do_addone_branch_i;
10333     case M_BLEU_I:
10334       s = "sltiu";
10335       s2 = "btnez";
10336       s3 = "x,8";
10337       goto do_addone_branch_i;
10338     case M_BGE_I:
10339       s = "slti";
10340       s2 = "bteqz";
10341       s3 = "x,8";
10342       goto do_branch_i;
10343     case M_BGEU_I:
10344       s = "sltiu";
10345       s2 = "bteqz";
10346       s3 = "x,8";
10347       goto do_branch_i;
10348     case M_BGT_I:
10349       s = "slti";
10350       s2 = "bteqz";
10351       s3 = "x,8";
10352       goto do_addone_branch_i;
10353     case M_BGTU_I:
10354       s = "sltiu";
10355       s2 = "bteqz";
10356       s3 = "x,8";
10357
10358     do_addone_branch_i:
10359       if (imm_expr.X_op != O_constant)
10360         as_bad (_("Unsupported large constant"));
10361       ++imm_expr.X_add_number;
10362
10363     do_branch_i:
10364       macro_build (&imm_expr, s, s3, xreg);
10365       macro_build (&offset_expr, s2, "p");
10366       break;
10367
10368     case M_ABS:
10369       expr1.X_add_number = 0;
10370       macro_build (&expr1, "slti", "x,8", yreg);
10371       if (xreg != yreg)
10372         move_register (xreg, yreg);
10373       expr1.X_add_number = 2;
10374       macro_build (&expr1, "bteqz", "p");
10375       macro_build (NULL, "neg", "x,w", xreg, xreg);
10376     }
10377 }
10378
10379 /* For consistency checking, verify that all bits are specified either
10380    by the match/mask part of the instruction definition, or by the
10381    operand list.  */
10382 static int
10383 validate_mips_insn (const struct mips_opcode *opc)
10384 {
10385   const char *p = opc->args;
10386   char c;
10387   unsigned long used_bits = opc->mask;
10388
10389   if ((used_bits & opc->match) != opc->match)
10390     {
10391       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
10392               opc->name, opc->args);
10393       return 0;
10394     }
10395 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
10396   while (*p)
10397     switch (c = *p++)
10398       {
10399       case ',': break;
10400       case '(': break;
10401       case ')': break;
10402       case '+':
10403         switch (c = *p++)
10404           {
10405           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
10406           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
10407           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
10408           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
10409           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
10410           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
10411           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10412           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
10413                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
10414           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
10415           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
10416           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10417           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10418           case 'I': break;
10419           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
10420           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
10421                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
10422           case 'x': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
10423           case 'X': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
10424           case 'p': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
10425           case 'P': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
10426           case 'Q': USE_BITS (OP_MASK_SEQI,     OP_SH_SEQI);    break;
10427           case 's': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
10428           case 'S': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
10429           case 'z': USE_BITS (OP_MASK_RZ,       OP_SH_RZ);      break;
10430           case 'Z': USE_BITS (OP_MASK_FZ,       OP_SH_FZ);      break;
10431           case 'a': USE_BITS (OP_MASK_OFFSET_A, OP_SH_OFFSET_A); break;
10432           case 'b': USE_BITS (OP_MASK_OFFSET_B, OP_SH_OFFSET_B); break;
10433           case 'c': USE_BITS (OP_MASK_OFFSET_C, OP_SH_OFFSET_C); break;
10434
10435           default:
10436             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
10437                     c, opc->name, opc->args);
10438             return 0;
10439           }
10440         break;
10441       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10442       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10443       case 'A': break;
10444       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
10445       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
10446       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
10447       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10448       case 'F': break;
10449       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10450       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
10451       case 'I': break;
10452       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
10453       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10454       case 'L': break;
10455       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
10456       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
10457       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
10458       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
10459                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10460       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
10461       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10462       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10463       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10464       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10465       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
10466       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10467       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10468       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
10469       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10470       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
10471       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10472       case 'f': break;
10473       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
10474       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
10475       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10476       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
10477       case 'l': break;
10478       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10479       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10480       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
10481       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10482       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10483       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10484       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
10485       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10486       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10487       case 'x': break;
10488       case 'z': break;
10489       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
10490       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
10491                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10492       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
10493       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
10494       case '[': break;
10495       case ']': break;
10496       case '1': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10497       case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
10498       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
10499       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
10500       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
10501       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10502       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
10503       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
10504       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
10505       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
10506       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
10507       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
10508       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
10509       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
10510       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
10511       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
10512       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
10513       case '\\': USE_BITS (OP_MASK_3BITPOS,     OP_SH_3BITPOS); break;
10514       case '~': USE_BITS (OP_MASK_OFFSET12,     OP_SH_OFFSET12); break;
10515       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10516       default:
10517         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
10518                 c, opc->name, opc->args);
10519         return 0;
10520       }
10521 #undef USE_BITS
10522   if (used_bits != 0xffffffff)
10523     {
10524       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
10525               ~used_bits & 0xffffffff, opc->name, opc->args);
10526       return 0;
10527     }
10528   return 1;
10529 }
10530
10531 /* For consistency checking, verify that the length implied matches the
10532    major opcode and that all bits are specified either by the match/mask
10533    part of the instruction definition, or by the operand list.  */
10534
10535 static int
10536 validate_micromips_insn (const struct mips_opcode *opc)
10537 {
10538   unsigned long match = opc->match;
10539   unsigned long mask = opc->mask;
10540   const char *p = opc->args;
10541   unsigned long insn_bits;
10542   unsigned long used_bits;
10543   unsigned long major;
10544   unsigned int length;
10545   char e;
10546   char c;
10547
10548   if ((mask & match) != match)
10549     {
10550       as_bad (_("Internal error: bad microMIPS opcode (mask error): %s %s"),
10551               opc->name, opc->args);
10552       return 0;
10553     }
10554   length = micromips_insn_length (opc);
10555   if (length != 2 && length != 4)
10556     {
10557       as_bad (_("Internal error: bad microMIPS opcode (incorrect length: %u): "
10558                 "%s %s"), length, opc->name, opc->args);
10559       return 0;
10560     }
10561   major = match >> (10 + 8 * (length - 2));
10562   if ((length == 2 && (major & 7) != 1 && (major & 6) != 2)
10563       || (length == 4 && (major & 7) != 0 && (major & 4) != 4))
10564     {
10565       as_bad (_("Internal error: bad microMIPS opcode "
10566                 "(opcode/length mismatch): %s %s"), opc->name, opc->args);
10567       return 0;
10568     }
10569
10570   /* Shift piecewise to avoid an overflow where unsigned long is 32-bit.  */
10571   insn_bits = 1 << 4 * length;
10572   insn_bits <<= 4 * length;
10573   insn_bits -= 1;
10574   used_bits = mask;
10575 #define USE_BITS(field) \
10576   (used_bits |= MICROMIPSOP_MASK_##field << MICROMIPSOP_SH_##field)
10577   while (*p)
10578     switch (c = *p++)
10579       {
10580       case ',': break;
10581       case '(': break;
10582       case ')': break;
10583       case '+':
10584         e = c;
10585         switch (c = *p++)
10586           {
10587           case 'A': USE_BITS (EXTLSB);  break;
10588           case 'B': USE_BITS (INSMSB);  break;
10589           case 'C': USE_BITS (EXTMSBD); break;
10590           case 'D': USE_BITS (RS);      USE_BITS (SEL); break;
10591           case 'E': USE_BITS (EXTLSB);  break;
10592           case 'F': USE_BITS (INSMSB);  break;
10593           case 'G': USE_BITS (EXTMSBD); break;
10594           case 'H': USE_BITS (EXTMSBD); break;
10595           default:
10596             as_bad (_("Internal error: bad mips opcode "
10597                       "(unknown extension operand type `%c%c'): %s %s"),
10598                     e, c, opc->name, opc->args);
10599             return 0;
10600           }
10601         break;
10602       case 'm':
10603         e = c;
10604         switch (c = *p++)
10605           {
10606           case 'A': USE_BITS (IMMA);    break;
10607           case 'B': USE_BITS (IMMB);    break;
10608           case 'C': USE_BITS (IMMC);    break;
10609           case 'D': USE_BITS (IMMD);    break;
10610           case 'E': USE_BITS (IMME);    break;
10611           case 'F': USE_BITS (IMMF);    break;
10612           case 'G': USE_BITS (IMMG);    break;
10613           case 'H': USE_BITS (IMMH);    break;
10614           case 'I': USE_BITS (IMMI);    break;
10615           case 'J': USE_BITS (IMMJ);    break;
10616           case 'L': USE_BITS (IMML);    break;
10617           case 'M': USE_BITS (IMMM);    break;
10618           case 'N': USE_BITS (IMMN);    break;
10619           case 'O': USE_BITS (IMMO);    break;
10620           case 'P': USE_BITS (IMMP);    break;
10621           case 'Q': USE_BITS (IMMQ);    break;
10622           case 'U': USE_BITS (IMMU);    break;
10623           case 'W': USE_BITS (IMMW);    break;
10624           case 'X': USE_BITS (IMMX);    break;
10625           case 'Y': USE_BITS (IMMY);    break;
10626           case 'Z': break;
10627           case 'a': break;
10628           case 'b': USE_BITS (MB);      break;
10629           case 'c': USE_BITS (MC);      break;
10630           case 'd': USE_BITS (MD);      break;
10631           case 'e': USE_BITS (ME);      break;
10632           case 'f': USE_BITS (MF);      break;
10633           case 'g': USE_BITS (MG);      break;
10634           case 'h': USE_BITS (MH);      break;
10635           case 'i': USE_BITS (MI);      break;
10636           case 'j': USE_BITS (MJ);      break;
10637           case 'l': USE_BITS (ML);      break;
10638           case 'm': USE_BITS (MM);      break;
10639           case 'n': USE_BITS (MN);      break;
10640           case 'p': USE_BITS (MP);      break;
10641           case 'q': USE_BITS (MQ);      break;
10642           case 'r': break;
10643           case 's': break;
10644           case 't': break;
10645           case 'x': break;
10646           case 'y': break;
10647           case 'z': break;
10648           default:
10649             as_bad (_("Internal error: bad mips opcode "
10650                       "(unknown extension operand type `%c%c'): %s %s"),
10651                     e, c, opc->name, opc->args);
10652             return 0;
10653           }
10654         break;
10655       case '.': USE_BITS (OFFSET10);    break;
10656       case '1': USE_BITS (STYPE);       break;
10657       case '2': USE_BITS (BP);          break;
10658       case '3': USE_BITS (SA3);         break;
10659       case '4': USE_BITS (SA4);         break;
10660       case '5': USE_BITS (IMM8);        break;
10661       case '6': USE_BITS (RS);          break;
10662       case '7': USE_BITS (DSPACC);      break;
10663       case '8': USE_BITS (WRDSP);       break;
10664       case '0': USE_BITS (DSPSFT);      break;
10665       case '<': USE_BITS (SHAMT);       break;
10666       case '>': USE_BITS (SHAMT);       break;
10667       case '@': USE_BITS (IMM10);       break;
10668       case 'B': USE_BITS (CODE10);      break;
10669       case 'C': USE_BITS (COPZ);        break;
10670       case 'D': USE_BITS (FD);          break;
10671       case 'E': USE_BITS (RT);          break;
10672       case 'G': USE_BITS (RS);          break;
10673       case 'H': USE_BITS (SEL);         break;
10674       case 'K': USE_BITS (RS);          break;
10675       case 'M': USE_BITS (CCC);         break;
10676       case 'N': USE_BITS (BCC);         break;
10677       case 'R': USE_BITS (FR);          break;
10678       case 'S': USE_BITS (FS);          break;
10679       case 'T': USE_BITS (FT);          break;
10680       case 'V': USE_BITS (FS);          break;
10681       case '\\': USE_BITS (3BITPOS);    break;
10682       case '^': USE_BITS (RD);          break;
10683       case 'a': USE_BITS (TARGET);      break;
10684       case 'b': USE_BITS (RS);          break;
10685       case 'c': USE_BITS (CODE);        break;
10686       case 'd': USE_BITS (RD);          break;
10687       case 'h': USE_BITS (PREFX);       break;
10688       case 'i': USE_BITS (IMMEDIATE);   break;
10689       case 'j': USE_BITS (DELTA);       break;
10690       case 'k': USE_BITS (CACHE);       break;
10691       case 'n': USE_BITS (RT);          break;
10692       case 'o': USE_BITS (DELTA);       break;
10693       case 'p': USE_BITS (DELTA);       break;
10694       case 'q': USE_BITS (CODE2);       break;
10695       case 'r': USE_BITS (RS);          break;
10696       case 's': USE_BITS (RS);          break;
10697       case 't': USE_BITS (RT);          break;
10698       case 'u': USE_BITS (IMMEDIATE);   break;
10699       case 'v': USE_BITS (RS);          break;
10700       case 'w': USE_BITS (RT);          break;
10701       case 'y': USE_BITS (RS3);         break;
10702       case 'z': break;
10703       case '|': USE_BITS (TRAP);        break;
10704       case '~': USE_BITS (OFFSET12);    break;
10705       default:
10706         as_bad (_("Internal error: bad microMIPS opcode "
10707                   "(unknown operand type `%c'): %s %s"),
10708                 c, opc->name, opc->args);
10709         return 0;
10710       }
10711 #undef USE_BITS
10712   if (used_bits != insn_bits)
10713     {
10714       if (~used_bits & insn_bits)
10715         as_bad (_("Internal error: bad microMIPS opcode "
10716                   "(bits 0x%lx undefined): %s %s"),
10717                 ~used_bits & insn_bits, opc->name, opc->args);
10718       if (used_bits & ~insn_bits)
10719         as_bad (_("Internal error: bad microMIPS opcode "
10720                   "(bits 0x%lx defined): %s %s"),
10721                 used_bits & ~insn_bits, opc->name, opc->args);
10722       return 0;
10723     }
10724   return 1;
10725 }
10726
10727 /* UDI immediates.  */
10728 struct mips_immed {
10729   char          type;
10730   unsigned int  shift;
10731   unsigned long mask;
10732   const char *  desc;
10733 };
10734
10735 static const struct mips_immed mips_immed[] = {
10736   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
10737   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
10738   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
10739   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
10740   { 0,0,0,0 }
10741 };
10742
10743 /* Check whether an odd floating-point register is allowed.  */
10744 static int
10745 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
10746 {
10747   const char *s = insn->name;
10748
10749   if (insn->pinfo == INSN_MACRO)
10750     /* Let a macro pass, we'll catch it later when it is expanded.  */
10751     return 1;
10752
10753   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa) || (mips_opts.arch == CPU_R5900))
10754     {
10755       /* Allow odd registers for single-precision ops.  */
10756       switch (insn->pinfo & (FP_S | FP_D))
10757         {
10758         case FP_S:
10759         case 0:
10760           return 1;     /* both single precision - ok */
10761         case FP_D:
10762           return 0;     /* both double precision - fail */
10763         default:
10764           break;
10765         }
10766
10767       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
10768       s = strchr (insn->name, '.');
10769       if (argnum == 2)
10770         s = s != NULL ? strchr (s + 1, '.') : NULL;
10771       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
10772     } 
10773
10774   /* Single-precision coprocessor loads and moves are OK too.  */
10775   if ((insn->pinfo & FP_S)
10776       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
10777                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
10778     return 1;
10779
10780   return 0;
10781 }
10782
10783 /* Check if EXPR is a constant between MIN (inclusive) and MAX (exclusive)
10784    taking bits from BIT up.  */
10785 static int
10786 expr_const_in_range (expressionS *ep, offsetT min, offsetT max, int bit)
10787 {
10788   return (ep->X_op == O_constant
10789           && (ep->X_add_number & ((1 << bit) - 1)) == 0
10790           && ep->X_add_number >= min << bit
10791           && ep->X_add_number < max << bit);
10792 }
10793
10794 /* This routine assembles an instruction into its binary format.  As a
10795    side effect, it sets one of the global variables imm_reloc or
10796    offset_reloc to the type of relocation to do if one of the operands
10797    is an address expression.  */
10798
10799 static void
10800 mips_ip (char *str, struct mips_cl_insn *ip)
10801 {
10802   bfd_boolean wrong_delay_slot_insns = FALSE;
10803   bfd_boolean need_delay_slot_ok = TRUE;
10804   struct mips_opcode *firstinsn = NULL;
10805   const struct mips_opcode *past;
10806   struct hash_control *hash;
10807   char *s;
10808   const char *args;
10809   char c = 0;
10810   struct mips_opcode *insn;
10811   char *argsStart;
10812   unsigned int regno;
10813   unsigned int lastregno;
10814   unsigned int destregno = 0;
10815   unsigned int lastpos = 0;
10816   unsigned int limlo, limhi;
10817   int sizelo;
10818   char *s_reset;
10819   offsetT min_range, max_range;
10820   long opend;
10821   char *name;
10822   int argnum;
10823   unsigned int rtype;
10824   char *dot;
10825   long end;
10826
10827   insn_error = NULL;
10828
10829   if (mips_opts.micromips)
10830     {
10831       hash = micromips_op_hash;
10832       past = &micromips_opcodes[bfd_micromips_num_opcodes];
10833     }
10834   else
10835     {
10836       hash = op_hash;
10837       past = &mips_opcodes[NUMOPCODES];
10838     }
10839   forced_insn_length = 0;
10840   insn = NULL;
10841
10842   /* We first try to match an instruction up to a space or to the end.  */
10843   for (end = 0; str[end] != '\0' && !ISSPACE (str[end]); end++)
10844     continue;
10845
10846   /* Make a copy of the instruction so that we can fiddle with it.  */
10847   name = alloca (end + 1);
10848   memcpy (name, str, end);
10849   name[end] = '\0';
10850
10851   for (;;)
10852     {
10853       insn = (struct mips_opcode *) hash_find (hash, name);
10854
10855       if (insn != NULL || !mips_opts.micromips)
10856         break;
10857       if (forced_insn_length)
10858         break;
10859
10860       /* See if there's an instruction size override suffix,
10861          either `16' or `32', at the end of the mnemonic proper,
10862          that defines the operation, i.e. before the first `.'
10863          character if any.  Strip it and retry.  */
10864       dot = strchr (name, '.');
10865       opend = dot != NULL ? dot - name : end;
10866       if (opend < 3)
10867         break;
10868       if (name[opend - 2] == '1' && name[opend - 1] == '6')
10869         forced_insn_length = 2;
10870       else if (name[opend - 2] == '3' && name[opend - 1] == '2')
10871         forced_insn_length = 4;
10872       else
10873         break;
10874       memcpy (name + opend - 2, name + opend, end - opend + 1);
10875     }
10876   if (insn == NULL)
10877     {
10878       insn_error = _("Unrecognized opcode");
10879       return;
10880     }
10881
10882   /* For microMIPS instructions placed in a fixed-length branch delay slot
10883      we make up to two passes over the relevant fragment of the opcode
10884      table.  First we try instructions that meet the delay slot's length
10885      requirement.  If none matched, then we retry with the remaining ones
10886      and if one matches, then we use it and then issue an appropriate
10887      warning later on.  */
10888   argsStart = s = str + end;
10889   for (;;)
10890     {
10891       bfd_boolean delay_slot_ok;
10892       bfd_boolean size_ok;
10893       bfd_boolean ok;
10894
10895       gas_assert (strcmp (insn->name, name) == 0);
10896
10897       ok = is_opcode_valid (insn);
10898       size_ok = is_size_valid (insn);
10899       delay_slot_ok = is_delay_slot_valid (insn);
10900       if (!delay_slot_ok && !wrong_delay_slot_insns)
10901         {
10902           firstinsn = insn;
10903           wrong_delay_slot_insns = TRUE;
10904         }
10905       if (!ok || !size_ok || delay_slot_ok != need_delay_slot_ok)
10906         {
10907           static char buf[256];
10908
10909           if (insn + 1 < past && strcmp (insn->name, insn[1].name) == 0)
10910             {
10911               ++insn;
10912               continue;
10913             }
10914           if (wrong_delay_slot_insns && need_delay_slot_ok)
10915             {
10916               gas_assert (firstinsn);
10917               need_delay_slot_ok = FALSE;
10918               past = insn + 1;
10919               insn = firstinsn;
10920               continue;
10921             }
10922
10923           if (insn_error)
10924             return;
10925
10926           if (!ok)
10927             sprintf (buf, _("Opcode not supported on this processor: %s (%s)"),
10928                      mips_cpu_info_from_arch (mips_opts.arch)->name,
10929                      mips_cpu_info_from_isa (mips_opts.isa)->name);
10930           else
10931             sprintf (buf, _("Unrecognized %u-bit version of microMIPS opcode"),
10932                      8 * forced_insn_length);
10933           insn_error = buf;
10934
10935           return;
10936         }
10937
10938       create_insn (ip, insn);
10939       insn_error = NULL;
10940       argnum = 1;
10941       lastregno = 0xffffffff;
10942       for (args = insn->args;; ++args)
10943         {
10944           int is_mdmx;
10945
10946           s += strspn (s, " \t");
10947           is_mdmx = 0;
10948           switch (*args)
10949             {
10950             case '\0':          /* end of args */
10951               if (*s == '\0')
10952                 return;
10953               break;
10954
10955             case '2':
10956               /* DSP 2-bit unsigned immediate in bit 11 (for standard MIPS
10957                  code) or 14 (for microMIPS code).  */
10958               my_getExpression (&imm_expr, s);
10959               check_absolute_expr (ip, &imm_expr);
10960               if ((unsigned long) imm_expr.X_add_number != 1
10961                   && (unsigned long) imm_expr.X_add_number != 3)
10962                 {
10963                   as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
10964                           (unsigned long) imm_expr.X_add_number);
10965                 }
10966               INSERT_OPERAND (mips_opts.micromips,
10967                               BP, *ip, imm_expr.X_add_number);
10968               imm_expr.X_op = O_absent;
10969               s = expr_end;
10970               continue;
10971
10972             case '3':
10973               /* DSP 3-bit unsigned immediate in bit 13 (for standard MIPS
10974                  code) or 21 (for microMIPS code).  */
10975               {
10976                 unsigned long mask = (mips_opts.micromips
10977                                       ? MICROMIPSOP_MASK_SA3 : OP_MASK_SA3);
10978
10979                 my_getExpression (&imm_expr, s);
10980                 check_absolute_expr (ip, &imm_expr);
10981                 if ((unsigned long) imm_expr.X_add_number > mask)
10982                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
10983                           mask, (unsigned long) imm_expr.X_add_number);
10984                 INSERT_OPERAND (mips_opts.micromips,
10985                                 SA3, *ip, imm_expr.X_add_number);
10986                 imm_expr.X_op = O_absent;
10987                 s = expr_end;
10988               }
10989               continue;
10990
10991             case '4':
10992               /* DSP 4-bit unsigned immediate in bit 12 (for standard MIPS
10993                  code) or 21 (for microMIPS code).  */
10994               {
10995                 unsigned long mask = (mips_opts.micromips
10996                                       ? MICROMIPSOP_MASK_SA4 : OP_MASK_SA4);
10997
10998                 my_getExpression (&imm_expr, s);
10999                 check_absolute_expr (ip, &imm_expr);
11000                 if ((unsigned long) imm_expr.X_add_number > mask)
11001                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11002                           mask, (unsigned long) imm_expr.X_add_number);
11003                 INSERT_OPERAND (mips_opts.micromips,
11004                                 SA4, *ip, imm_expr.X_add_number);
11005                 imm_expr.X_op = O_absent;
11006                 s = expr_end;
11007               }
11008               continue;
11009
11010             case '5':
11011               /* DSP 8-bit unsigned immediate in bit 13 (for standard MIPS
11012                  code) or 16 (for microMIPS code).  */
11013               {
11014                 unsigned long mask = (mips_opts.micromips
11015                                       ? MICROMIPSOP_MASK_IMM8 : OP_MASK_IMM8);
11016
11017                 my_getExpression (&imm_expr, s);
11018                 check_absolute_expr (ip, &imm_expr);
11019                 if ((unsigned long) imm_expr.X_add_number > mask)
11020                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11021                           mask, (unsigned long) imm_expr.X_add_number);
11022                 INSERT_OPERAND (mips_opts.micromips,
11023                                 IMM8, *ip, imm_expr.X_add_number);
11024                 imm_expr.X_op = O_absent;
11025                 s = expr_end;
11026               }
11027               continue;
11028
11029             case '6':
11030               /* DSP 5-bit unsigned immediate in bit 16 (for standard MIPS
11031                  code) or 21 (for microMIPS code).  */
11032               {
11033                 unsigned long mask = (mips_opts.micromips
11034                                       ? MICROMIPSOP_MASK_RS : OP_MASK_RS);
11035
11036                 my_getExpression (&imm_expr, s);
11037                 check_absolute_expr (ip, &imm_expr);
11038                 if ((unsigned long) imm_expr.X_add_number > mask)
11039                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11040                           mask, (unsigned long) imm_expr.X_add_number);
11041                 INSERT_OPERAND (mips_opts.micromips,
11042                                 RS, *ip, imm_expr.X_add_number);
11043                 imm_expr.X_op = O_absent;
11044                 s = expr_end;
11045               }
11046               continue;
11047
11048             case '7': /* Four DSP accumulators in bits 11,12.  */
11049               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c'
11050                   && s[3] >= '0' && s[3] <= '3')
11051                 {
11052                   regno = s[3] - '0';
11053                   s += 4;
11054                   INSERT_OPERAND (mips_opts.micromips, DSPACC, *ip, regno);
11055                   continue;
11056                 }
11057               else
11058                 as_bad (_("Invalid dsp acc register"));
11059               break;
11060
11061             case '8':
11062               /* DSP 6-bit unsigned immediate in bit 11 (for standard MIPS
11063                  code) or 14 (for microMIPS code).  */
11064               {
11065                 unsigned long mask = (mips_opts.micromips
11066                                       ? MICROMIPSOP_MASK_WRDSP
11067                                       : OP_MASK_WRDSP);
11068
11069                 my_getExpression (&imm_expr, s);
11070                 check_absolute_expr (ip, &imm_expr);
11071                 if ((unsigned long) imm_expr.X_add_number > mask)
11072                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11073                           mask, (unsigned long) imm_expr.X_add_number);
11074                 INSERT_OPERAND (mips_opts.micromips,
11075                                 WRDSP, *ip, imm_expr.X_add_number);
11076                 imm_expr.X_op = O_absent;
11077                 s = expr_end;
11078               }
11079               continue;
11080
11081             case '9': /* Four DSP accumulators in bits 21,22.  */
11082               gas_assert (!mips_opts.micromips);
11083               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c'
11084                   && s[3] >= '0' && s[3] <= '3')
11085                 {
11086                   regno = s[3] - '0';
11087                   s += 4;
11088                   INSERT_OPERAND (0, DSPACC_S, *ip, regno);
11089                   continue;
11090                 }
11091               else
11092                 as_bad (_("Invalid dsp acc register"));
11093               break;
11094
11095             case '0':
11096               /* DSP 6-bit signed immediate in bit 16 (for standard MIPS
11097                  code) or 20 (for microMIPS code).  */
11098               {
11099                 long mask = (mips_opts.micromips
11100                              ? MICROMIPSOP_MASK_DSPSFT : OP_MASK_DSPSFT);
11101
11102                 my_getExpression (&imm_expr, s);
11103                 check_absolute_expr (ip, &imm_expr);
11104                 min_range = -((mask + 1) >> 1);
11105                 max_range = ((mask + 1) >> 1) - 1;
11106                 if (imm_expr.X_add_number < min_range
11107                     || imm_expr.X_add_number > max_range)
11108                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11109                           (long) min_range, (long) max_range,
11110                           (long) imm_expr.X_add_number);
11111                 INSERT_OPERAND (mips_opts.micromips,
11112                                 DSPSFT, *ip, imm_expr.X_add_number);
11113                 imm_expr.X_op = O_absent;
11114                 s = expr_end;
11115               }
11116               continue;
11117
11118             case '\'': /* DSP 6-bit unsigned immediate in bit 16.  */
11119               gas_assert (!mips_opts.micromips);
11120               my_getExpression (&imm_expr, s);
11121               check_absolute_expr (ip, &imm_expr);
11122               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
11123                 {
11124                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
11125                           OP_MASK_RDDSP,
11126                           (unsigned long) imm_expr.X_add_number);
11127                 }
11128               INSERT_OPERAND (0, RDDSP, *ip, imm_expr.X_add_number);
11129               imm_expr.X_op = O_absent;
11130               s = expr_end;
11131               continue;
11132
11133             case ':': /* DSP 7-bit signed immediate in bit 19.  */
11134               gas_assert (!mips_opts.micromips);
11135               my_getExpression (&imm_expr, s);
11136               check_absolute_expr (ip, &imm_expr);
11137               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
11138               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
11139               if (imm_expr.X_add_number < min_range ||
11140                   imm_expr.X_add_number > max_range)
11141                 {
11142                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11143                           (long) min_range, (long) max_range,
11144                           (long) imm_expr.X_add_number);
11145                 }
11146               INSERT_OPERAND (0, DSPSFT_7, *ip, imm_expr.X_add_number);
11147               imm_expr.X_op = O_absent;
11148               s = expr_end;
11149               continue;
11150
11151             case '@': /* DSP 10-bit signed immediate in bit 16.  */
11152               {
11153                 long mask = (mips_opts.micromips
11154                              ? MICROMIPSOP_MASK_IMM10 : OP_MASK_IMM10);
11155
11156                 my_getExpression (&imm_expr, s);
11157                 check_absolute_expr (ip, &imm_expr);
11158                 min_range = -((mask + 1) >> 1);
11159                 max_range = ((mask + 1) >> 1) - 1;
11160                 if (imm_expr.X_add_number < min_range
11161                     || imm_expr.X_add_number > max_range)
11162                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11163                           (long) min_range, (long) max_range,
11164                           (long) imm_expr.X_add_number);
11165                 INSERT_OPERAND (mips_opts.micromips,
11166                                 IMM10, *ip, imm_expr.X_add_number);
11167                 imm_expr.X_op = O_absent;
11168                 s = expr_end;
11169               }
11170               continue;
11171
11172             case '^': /* DSP 5-bit unsigned immediate in bit 11.  */
11173               gas_assert (mips_opts.micromips);
11174               my_getExpression (&imm_expr, s);
11175               check_absolute_expr (ip, &imm_expr);
11176               if (imm_expr.X_add_number & ~MICROMIPSOP_MASK_RD)
11177                 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
11178                         MICROMIPSOP_MASK_RD,
11179                         (unsigned long) imm_expr.X_add_number);
11180               INSERT_OPERAND (1, RD, *ip, imm_expr.X_add_number);
11181               imm_expr.X_op = O_absent;
11182               s = expr_end;
11183               continue;
11184
11185             case '!': /* MT usermode flag bit.  */
11186               gas_assert (!mips_opts.micromips);
11187               my_getExpression (&imm_expr, s);
11188               check_absolute_expr (ip, &imm_expr);
11189               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
11190                 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
11191                         (unsigned long) imm_expr.X_add_number);
11192               INSERT_OPERAND (0, MT_U, *ip, imm_expr.X_add_number);
11193               imm_expr.X_op = O_absent;
11194               s = expr_end;
11195               continue;
11196
11197             case '$': /* MT load high flag bit.  */
11198               gas_assert (!mips_opts.micromips);
11199               my_getExpression (&imm_expr, s);
11200               check_absolute_expr (ip, &imm_expr);
11201               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
11202                 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
11203                         (unsigned long) imm_expr.X_add_number);
11204               INSERT_OPERAND (0, MT_H, *ip, imm_expr.X_add_number);
11205               imm_expr.X_op = O_absent;
11206               s = expr_end;
11207               continue;
11208
11209             case '*': /* Four DSP accumulators in bits 18,19.  */
11210               gas_assert (!mips_opts.micromips);
11211               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
11212                   s[3] >= '0' && s[3] <= '3')
11213                 {
11214                   regno = s[3] - '0';
11215                   s += 4;
11216                   INSERT_OPERAND (0, MTACC_T, *ip, regno);
11217                   continue;
11218                 }
11219               else
11220                 as_bad (_("Invalid dsp/smartmips acc register"));
11221               break;
11222
11223             case '&': /* Four DSP accumulators in bits 13,14.  */
11224               gas_assert (!mips_opts.micromips);
11225               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
11226                   s[3] >= '0' && s[3] <= '3')
11227                 {
11228                   regno = s[3] - '0';
11229                   s += 4;
11230                   INSERT_OPERAND (0, MTACC_D, *ip, regno);
11231                   continue;
11232                 }
11233               else
11234                 as_bad (_("Invalid dsp/smartmips acc register"));
11235               break;
11236
11237             case '\\':          /* 3-bit bit position.  */
11238               {
11239                 unsigned long mask = (mips_opts.micromips
11240                                       ? MICROMIPSOP_MASK_3BITPOS
11241                                       : OP_MASK_3BITPOS);
11242
11243                 my_getExpression (&imm_expr, s);
11244                 check_absolute_expr (ip, &imm_expr);
11245                 if ((unsigned long) imm_expr.X_add_number > mask)
11246                   as_warn (_("Bit position for %s not in range 0..%lu (%lu)"),
11247                            ip->insn_mo->name,
11248                            mask, (unsigned long) imm_expr.X_add_number);
11249                 INSERT_OPERAND (mips_opts.micromips,
11250                                 3BITPOS, *ip, imm_expr.X_add_number);
11251                 imm_expr.X_op = O_absent;
11252                 s = expr_end;
11253               }
11254               continue;
11255
11256             case ',':
11257               ++argnum;
11258               if (*s++ == *args)
11259                 continue;
11260               s--;
11261               switch (*++args)
11262                 {
11263                 case 'r':
11264                 case 'v':
11265                   INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
11266                   continue;
11267
11268                 case 'w':
11269                   INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
11270                   continue;
11271
11272                 case 'W':
11273                   gas_assert (!mips_opts.micromips);
11274                   INSERT_OPERAND (0, FT, *ip, lastregno);
11275                   continue;
11276
11277                 case 'V':
11278                   INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
11279                   continue;
11280                 }
11281               break;
11282
11283             case '(':
11284               /* Handle optional base register.
11285                  Either the base register is omitted or
11286                  we must have a left paren.  */
11287               /* This is dependent on the next operand specifier
11288                  is a base register specification.  */
11289               gas_assert (args[1] == 'b'
11290                           || (mips_opts.micromips
11291                               && args[1] == 'm'
11292                               && (args[2] == 'l' || args[2] == 'n'
11293                                   || args[2] == 's' || args[2] == 'a')));
11294               if (*s == '\0' && args[1] == 'b')
11295                 return;
11296               /* Fall through.  */
11297
11298             case ')':           /* These must match exactly.  */
11299               if (*s++ == *args)
11300                 continue;
11301               break;
11302
11303             case '[':           /* These must match exactly.  */
11304             case ']':
11305               gas_assert (!mips_opts.micromips);
11306               if (*s++ == *args)
11307                 continue;
11308               break;
11309
11310             case '+':           /* Opcode extension character.  */
11311               switch (*++args)
11312                 {
11313                 case '1':       /* UDI immediates.  */
11314                 case '2':
11315                 case '3':
11316                 case '4':
11317                   gas_assert (!mips_opts.micromips);
11318                   {
11319                     const struct mips_immed *imm = mips_immed;
11320
11321                     while (imm->type && imm->type != *args)
11322                       ++imm;
11323                     if (! imm->type)
11324                       abort ();
11325                     my_getExpression (&imm_expr, s);
11326                     check_absolute_expr (ip, &imm_expr);
11327                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
11328                       {
11329                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
11330                                  imm->desc ? imm->desc : ip->insn_mo->name,
11331                                  (unsigned long) imm_expr.X_add_number,
11332                                  (unsigned long) imm_expr.X_add_number);
11333                         imm_expr.X_add_number &= imm->mask;
11334                       }
11335                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
11336                                         << imm->shift);
11337                     imm_expr.X_op = O_absent;
11338                     s = expr_end;
11339                   }
11340                   continue;
11341
11342                 case 'A':               /* ins/ext position, becomes LSB.  */
11343                   limlo = 0;
11344                   limhi = 31;
11345                   goto do_lsb;
11346                 case 'E':
11347                   limlo = 32;
11348                   limhi = 63;
11349                   goto do_lsb;
11350                 do_lsb:
11351                   my_getExpression (&imm_expr, s);
11352                   check_absolute_expr (ip, &imm_expr);
11353                   if ((unsigned long) imm_expr.X_add_number < limlo
11354                       || (unsigned long) imm_expr.X_add_number > limhi)
11355                     {
11356                       as_bad (_("Improper position (%lu)"),
11357                               (unsigned long) imm_expr.X_add_number);
11358                       imm_expr.X_add_number = limlo;
11359                     }
11360                   lastpos = imm_expr.X_add_number;
11361                   INSERT_OPERAND (mips_opts.micromips,
11362                                   EXTLSB, *ip, imm_expr.X_add_number);
11363                   imm_expr.X_op = O_absent;
11364                   s = expr_end;
11365                   continue;
11366
11367                 case 'B':               /* ins size, becomes MSB.  */
11368                   limlo = 1;
11369                   limhi = 32;
11370                   goto do_msb;
11371                 case 'F':
11372                   limlo = 33;
11373                   limhi = 64;
11374                   goto do_msb;
11375                 do_msb:
11376                   my_getExpression (&imm_expr, s);
11377                   check_absolute_expr (ip, &imm_expr);
11378                   /* Check for negative input so that small negative numbers
11379                      will not succeed incorrectly.  The checks against
11380                      (pos+size) transitively check "size" itself,
11381                      assuming that "pos" is reasonable.  */
11382                   if ((long) imm_expr.X_add_number < 0
11383                       || ((unsigned long) imm_expr.X_add_number
11384                           + lastpos) < limlo
11385                       || ((unsigned long) imm_expr.X_add_number
11386                           + lastpos) > limhi)
11387                     {
11388                       as_bad (_("Improper insert size (%lu, position %lu)"),
11389                               (unsigned long) imm_expr.X_add_number,
11390                               (unsigned long) lastpos);
11391                       imm_expr.X_add_number = limlo - lastpos;
11392                     }
11393                   INSERT_OPERAND (mips_opts.micromips, INSMSB, *ip,
11394                                   lastpos + imm_expr.X_add_number - 1);
11395                   imm_expr.X_op = O_absent;
11396                   s = expr_end;
11397                   continue;
11398
11399                 case 'C':               /* ext size, becomes MSBD.  */
11400                   limlo = 1;
11401                   limhi = 32;
11402                   sizelo = 1;
11403                   goto do_msbd;
11404                 case 'G':
11405                   limlo = 33;
11406                   limhi = 64;
11407                   sizelo = 33;
11408                   goto do_msbd;
11409                 case 'H':
11410                   limlo = 33;
11411                   limhi = 64;
11412                   sizelo = 1;
11413                   goto do_msbd;
11414                 do_msbd:
11415                   my_getExpression (&imm_expr, s);
11416                   check_absolute_expr (ip, &imm_expr);
11417                   /* The checks against (pos+size) don't transitively check
11418                      "size" itself, assuming that "pos" is reasonable.
11419                      We also need to check the lower bound of "size".  */
11420                   if ((long) imm_expr.X_add_number < sizelo
11421                       || ((unsigned long) imm_expr.X_add_number
11422                           + lastpos) < limlo
11423                       || ((unsigned long) imm_expr.X_add_number
11424                           + lastpos) > limhi)
11425                     {
11426                       as_bad (_("Improper extract size (%lu, position %lu)"),
11427                               (unsigned long) imm_expr.X_add_number,
11428                               (unsigned long) lastpos);
11429                       imm_expr.X_add_number = limlo - lastpos;
11430                     }
11431                   INSERT_OPERAND (mips_opts.micromips,
11432                                   EXTMSBD, *ip, imm_expr.X_add_number - 1);
11433                   imm_expr.X_op = O_absent;
11434                   s = expr_end;
11435                   continue;
11436
11437                 case 'D':
11438                   /* +D is for disassembly only; never match.  */
11439                   break;
11440
11441                 case 'I':
11442                   /* "+I" is like "I", except that imm2_expr is used.  */
11443                   my_getExpression (&imm2_expr, s);
11444                   if (imm2_expr.X_op != O_big
11445                       && imm2_expr.X_op != O_constant)
11446                   insn_error = _("absolute expression required");
11447                   if (HAVE_32BIT_GPRS)
11448                     normalize_constant_expr (&imm2_expr);
11449                   s = expr_end;
11450                   continue;
11451
11452                 case 'T': /* Coprocessor register.  */
11453                   gas_assert (!mips_opts.micromips);
11454                   /* +T is for disassembly only; never match.  */
11455                   break;
11456
11457                 case 't': /* Coprocessor register number.  */
11458                   gas_assert (!mips_opts.micromips);
11459                   if (s[0] == '$' && ISDIGIT (s[1]))
11460                     {
11461                       ++s;
11462                       regno = 0;
11463                       do
11464                         {
11465                           regno *= 10;
11466                           regno += *s - '0';
11467                           ++s;
11468                         }
11469                       while (ISDIGIT (*s));
11470                       if (regno > 31)
11471                         as_bad (_("Invalid register number (%d)"), regno);
11472                       else
11473                         {
11474                           INSERT_OPERAND (0, RT, *ip, regno);
11475                           continue;
11476                         }
11477                     }
11478                   else
11479                     as_bad (_("Invalid coprocessor 0 register number"));
11480                   break;
11481
11482                 case 'x':
11483                   /* bbit[01] and bbit[01]32 bit index.  Give error if index
11484                      is not in the valid range.  */
11485                   gas_assert (!mips_opts.micromips);
11486                   my_getExpression (&imm_expr, s);
11487                   check_absolute_expr (ip, &imm_expr);
11488                   if ((unsigned) imm_expr.X_add_number > 31)
11489                     {
11490                       as_bad (_("Improper bit index (%lu)"),
11491                               (unsigned long) imm_expr.X_add_number);
11492                       imm_expr.X_add_number = 0;
11493                     }
11494                   INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number);
11495                   imm_expr.X_op = O_absent;
11496                   s = expr_end;
11497                   continue;
11498
11499                 case 'X':
11500                   /* bbit[01] bit index when bbit is used but we generate
11501                      bbit[01]32 because the index is over 32.  Move to the
11502                      next candidate if index is not in the valid range.  */
11503                   gas_assert (!mips_opts.micromips);
11504                   my_getExpression (&imm_expr, s);
11505                   check_absolute_expr (ip, &imm_expr);
11506                   if ((unsigned) imm_expr.X_add_number < 32
11507                       || (unsigned) imm_expr.X_add_number > 63)
11508                     break;
11509                   INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number - 32);
11510                   imm_expr.X_op = O_absent;
11511                   s = expr_end;
11512                   continue;
11513
11514                 case 'p':
11515                   /* cins, cins32, exts and exts32 position field.  Give error
11516                      if it's not in the valid range.  */
11517                   gas_assert (!mips_opts.micromips);
11518                   my_getExpression (&imm_expr, s);
11519                   check_absolute_expr (ip, &imm_expr);
11520                   if ((unsigned) imm_expr.X_add_number > 31)
11521                     {
11522                       as_bad (_("Improper position (%lu)"),
11523                               (unsigned long) imm_expr.X_add_number);
11524                       imm_expr.X_add_number = 0;
11525                     }
11526                   /* Make the pos explicit to simplify +S.  */
11527                   lastpos = imm_expr.X_add_number + 32;
11528                   INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number);
11529                   imm_expr.X_op = O_absent;
11530                   s = expr_end;
11531                   continue;
11532
11533                 case 'P':
11534                   /* cins, cins32, exts and exts32 position field.  Move to
11535                      the next candidate if it's not in the valid range.  */
11536                   gas_assert (!mips_opts.micromips);
11537                   my_getExpression (&imm_expr, s);
11538                   check_absolute_expr (ip, &imm_expr);
11539                   if ((unsigned) imm_expr.X_add_number < 32
11540                       || (unsigned) imm_expr.X_add_number > 63)
11541                     break;
11542                   lastpos = imm_expr.X_add_number;
11543                   INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number - 32);
11544                   imm_expr.X_op = O_absent;
11545                   s = expr_end;
11546                   continue;
11547
11548                 case 's':
11549                   /* cins and exts length-minus-one field.  */
11550                   gas_assert (!mips_opts.micromips);
11551                   my_getExpression (&imm_expr, s);
11552                   check_absolute_expr (ip, &imm_expr);
11553                   if ((unsigned long) imm_expr.X_add_number > 31)
11554                     {
11555                       as_bad (_("Improper size (%lu)"),
11556                               (unsigned long) imm_expr.X_add_number);
11557                       imm_expr.X_add_number = 0;
11558                     }
11559                   INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
11560                   imm_expr.X_op = O_absent;
11561                   s = expr_end;
11562                   continue;
11563
11564                 case 'S':
11565                   /* cins32/exts32 and cins/exts aliasing cint32/exts32
11566                      length-minus-one field.  */
11567                   gas_assert (!mips_opts.micromips);
11568                   my_getExpression (&imm_expr, s);
11569                   check_absolute_expr (ip, &imm_expr);
11570                   if ((long) imm_expr.X_add_number < 0
11571                       || (unsigned long) imm_expr.X_add_number + lastpos > 63)
11572                     {
11573                       as_bad (_("Improper size (%lu)"),
11574                               (unsigned long) imm_expr.X_add_number);
11575                       imm_expr.X_add_number = 0;
11576                     }
11577                   INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
11578                   imm_expr.X_op = O_absent;
11579                   s = expr_end;
11580                   continue;
11581
11582                 case 'Q':
11583                   /* seqi/snei immediate field.  */
11584                   gas_assert (!mips_opts.micromips);
11585                   my_getExpression (&imm_expr, s);
11586                   check_absolute_expr (ip, &imm_expr);
11587                   if ((long) imm_expr.X_add_number < -512
11588                       || (long) imm_expr.X_add_number >= 512)
11589                     {
11590                       as_bad (_("Improper immediate (%ld)"),
11591                                (long) imm_expr.X_add_number);
11592                       imm_expr.X_add_number = 0;
11593                     }
11594                   INSERT_OPERAND (0, SEQI, *ip, imm_expr.X_add_number);
11595                   imm_expr.X_op = O_absent;
11596                   s = expr_end;
11597                   continue;
11598
11599                 case 'a': /* 8-bit signed offset in bit 6 */
11600                   gas_assert (!mips_opts.micromips);
11601                   my_getExpression (&imm_expr, s);
11602                   check_absolute_expr (ip, &imm_expr);
11603                   min_range = -((OP_MASK_OFFSET_A + 1) >> 1);
11604                   max_range = ((OP_MASK_OFFSET_A + 1) >> 1) - 1;
11605                   if (imm_expr.X_add_number < min_range
11606                       || imm_expr.X_add_number > max_range)
11607                     {
11608                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
11609                               (long) min_range, (long) max_range,
11610                               (long) imm_expr.X_add_number);
11611                     }
11612                   INSERT_OPERAND (0, OFFSET_A, *ip, imm_expr.X_add_number);
11613                   imm_expr.X_op = O_absent;
11614                   s = expr_end;
11615                   continue;
11616
11617                 case 'b': /* 8-bit signed offset in bit 3 */
11618                   gas_assert (!mips_opts.micromips);
11619                   my_getExpression (&imm_expr, s);
11620                   check_absolute_expr (ip, &imm_expr);
11621                   min_range = -((OP_MASK_OFFSET_B + 1) >> 1);
11622                   max_range = ((OP_MASK_OFFSET_B + 1) >> 1) - 1;
11623                   if (imm_expr.X_add_number < min_range
11624                       || imm_expr.X_add_number > max_range)
11625                     {
11626                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
11627                               (long) min_range, (long) max_range,
11628                               (long) imm_expr.X_add_number);
11629                     }
11630                   INSERT_OPERAND (0, OFFSET_B, *ip, imm_expr.X_add_number);
11631                   imm_expr.X_op = O_absent;
11632                   s = expr_end;
11633                   continue;
11634
11635                 case 'c': /* 9-bit signed offset in bit 6 */
11636                   gas_assert (!mips_opts.micromips);
11637                   my_getExpression (&imm_expr, s);
11638                   check_absolute_expr (ip, &imm_expr);
11639                   min_range = -((OP_MASK_OFFSET_C + 1) >> 1);
11640                   max_range = ((OP_MASK_OFFSET_C + 1) >> 1) - 1;
11641                   /* We check the offset range before adjusted.  */
11642                   min_range <<= 4;
11643                   max_range <<= 4;
11644                   if (imm_expr.X_add_number < min_range
11645                       || imm_expr.X_add_number > max_range)
11646                     {
11647                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
11648                               (long) min_range, (long) max_range,
11649                               (long) imm_expr.X_add_number);
11650                     }
11651                   if (imm_expr.X_add_number & 0xf)
11652                     {
11653                       as_bad (_("Offset not 16 bytes alignment (%ld)"),
11654                               (long) imm_expr.X_add_number);
11655                     }
11656                   /* Right shift 4 bits to adjust the offset operand.  */
11657                   INSERT_OPERAND (0, OFFSET_C, *ip,
11658                                   imm_expr.X_add_number >> 4);
11659                   imm_expr.X_op = O_absent;
11660                   s = expr_end;
11661                   continue;
11662
11663                 case 'z':
11664                   gas_assert (!mips_opts.micromips);
11665                   if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
11666                     break;
11667                   if (regno == AT && mips_opts.at)
11668                     {
11669                       if (mips_opts.at == ATREG)
11670                         as_warn (_("used $at without \".set noat\""));
11671                       else
11672                         as_warn (_("used $%u with \".set at=$%u\""),
11673                                  regno, mips_opts.at);
11674                     }
11675                   INSERT_OPERAND (0, RZ, *ip, regno);
11676                   continue;
11677
11678                 case 'Z':
11679                   gas_assert (!mips_opts.micromips);
11680                   if (!reg_lookup (&s, RTYPE_FPU, &regno))
11681                     break;
11682                   INSERT_OPERAND (0, FZ, *ip, regno);
11683                   continue;
11684
11685                 default:
11686                   as_bad (_("Internal error: bad %s opcode "
11687                             "(unknown extension operand type `+%c'): %s %s"),
11688                           mips_opts.micromips ? "microMIPS" : "MIPS",
11689                           *args, insn->name, insn->args);
11690                   /* Further processing is fruitless.  */
11691                   return;
11692                 }
11693               break;
11694
11695             case '.':           /* 10-bit offset.  */
11696               gas_assert (mips_opts.micromips);
11697             case '~':           /* 12-bit offset.  */
11698               {
11699                 int shift = *args == '.' ? 9 : 11;
11700                 size_t i;
11701
11702                 /* Check whether there is only a single bracketed expression
11703                    left.  If so, it must be the base register and the
11704                    constant must be zero.  */
11705                 if (*s == '(' && strchr (s + 1, '(') == 0)
11706                   continue;
11707
11708                 /* If this value won't fit into the offset, then go find
11709                    a macro that will generate a 16- or 32-bit offset code
11710                    pattern.  */
11711                 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
11712                 if ((i == 0 && (imm_expr.X_op != O_constant
11713                                 || imm_expr.X_add_number >= 1 << shift
11714                                 || imm_expr.X_add_number < -1 << shift))
11715                     || i > 0)
11716                   {
11717                     imm_expr.X_op = O_absent;
11718                     break;
11719                   }
11720                 if (shift == 9)
11721                   INSERT_OPERAND (1, OFFSET10, *ip, imm_expr.X_add_number);
11722                 else
11723                   INSERT_OPERAND (mips_opts.micromips,
11724                                   OFFSET12, *ip, imm_expr.X_add_number);
11725                 imm_expr.X_op = O_absent;
11726                 s = expr_end;
11727               }
11728               continue;
11729
11730             case '<':           /* must be at least one digit */
11731               /*
11732                * According to the manual, if the shift amount is greater
11733                * than 31 or less than 0, then the shift amount should be
11734                * mod 32.  In reality the mips assembler issues an error.
11735                * We issue a warning and mask out all but the low 5 bits.
11736                */
11737               my_getExpression (&imm_expr, s);
11738               check_absolute_expr (ip, &imm_expr);
11739               if ((unsigned long) imm_expr.X_add_number > 31)
11740                 as_warn (_("Improper shift amount (%lu)"),
11741                          (unsigned long) imm_expr.X_add_number);
11742               INSERT_OPERAND (mips_opts.micromips,
11743                               SHAMT, *ip, imm_expr.X_add_number);
11744               imm_expr.X_op = O_absent;
11745               s = expr_end;
11746               continue;
11747
11748             case '>':           /* shift amount minus 32 */
11749               my_getExpression (&imm_expr, s);
11750               check_absolute_expr (ip, &imm_expr);
11751               if ((unsigned long) imm_expr.X_add_number < 32
11752                   || (unsigned long) imm_expr.X_add_number > 63)
11753                 break;
11754               INSERT_OPERAND (mips_opts.micromips,
11755                               SHAMT, *ip, imm_expr.X_add_number - 32);
11756               imm_expr.X_op = O_absent;
11757               s = expr_end;
11758               continue;
11759
11760             case 'k':           /* CACHE code.  */
11761             case 'h':           /* PREFX code.  */
11762             case '1':           /* SYNC type.  */
11763               my_getExpression (&imm_expr, s);
11764               check_absolute_expr (ip, &imm_expr);
11765               if ((unsigned long) imm_expr.X_add_number > 31)
11766                 as_warn (_("Invalid value for `%s' (%lu)"),
11767                          ip->insn_mo->name,
11768                          (unsigned long) imm_expr.X_add_number);
11769               switch (*args)
11770                 {
11771                 case 'k':
11772                   if (mips_fix_cn63xxp1
11773                       && !mips_opts.micromips
11774                       && strcmp ("pref", insn->name) == 0)
11775                     switch (imm_expr.X_add_number)
11776                       {
11777                       case 5:
11778                       case 25:
11779                       case 26:
11780                       case 27:
11781                       case 28:
11782                       case 29:
11783                       case 30:
11784                       case 31:  /* These are ok.  */
11785                         break;
11786
11787                       default:  /* The rest must be changed to 28.  */
11788                         imm_expr.X_add_number = 28;
11789                         break;
11790                       }
11791                   INSERT_OPERAND (mips_opts.micromips,
11792                                   CACHE, *ip, imm_expr.X_add_number);
11793                   break;
11794                 case 'h':
11795                   INSERT_OPERAND (mips_opts.micromips,
11796                                   PREFX, *ip, imm_expr.X_add_number);
11797                   break;
11798                 case '1':
11799                   INSERT_OPERAND (mips_opts.micromips,
11800                                   STYPE, *ip, imm_expr.X_add_number);
11801                   break;
11802                 }
11803               imm_expr.X_op = O_absent;
11804               s = expr_end;
11805               continue;
11806
11807             case 'c':           /* BREAK code.  */
11808               {
11809                 unsigned long mask = (mips_opts.micromips
11810                                       ? MICROMIPSOP_MASK_CODE
11811                                       : OP_MASK_CODE);
11812
11813                 my_getExpression (&imm_expr, s);
11814                 check_absolute_expr (ip, &imm_expr);
11815                 if ((unsigned long) imm_expr.X_add_number > mask)
11816                   as_warn (_("Code for %s not in range 0..%lu (%lu)"),
11817                            ip->insn_mo->name,
11818                            mask, (unsigned long) imm_expr.X_add_number);
11819                 INSERT_OPERAND (mips_opts.micromips,
11820                                 CODE, *ip, imm_expr.X_add_number);
11821                 imm_expr.X_op = O_absent;
11822                 s = expr_end;
11823               }
11824               continue;
11825
11826             case 'q':           /* Lower BREAK code.  */
11827               {
11828                 unsigned long mask = (mips_opts.micromips
11829                                       ? MICROMIPSOP_MASK_CODE2
11830                                       : OP_MASK_CODE2);
11831
11832                 my_getExpression (&imm_expr, s);
11833                 check_absolute_expr (ip, &imm_expr);
11834                 if ((unsigned long) imm_expr.X_add_number > mask)
11835                   as_warn (_("Lower code for %s not in range 0..%lu (%lu)"),
11836                            ip->insn_mo->name,
11837                            mask, (unsigned long) imm_expr.X_add_number);
11838                 INSERT_OPERAND (mips_opts.micromips,
11839                                 CODE2, *ip, imm_expr.X_add_number);
11840                 imm_expr.X_op = O_absent;
11841                 s = expr_end;
11842               }
11843               continue;
11844
11845             case 'B':           /* 20- or 10-bit syscall/break/wait code.  */
11846               {
11847                 unsigned long mask = (mips_opts.micromips
11848                                       ? MICROMIPSOP_MASK_CODE10
11849                                       : OP_MASK_CODE20);
11850
11851                 my_getExpression (&imm_expr, s);
11852                 check_absolute_expr (ip, &imm_expr);
11853                 if ((unsigned long) imm_expr.X_add_number > mask)
11854                   as_warn (_("Code for %s not in range 0..%lu (%lu)"),
11855                            ip->insn_mo->name,
11856                            mask, (unsigned long) imm_expr.X_add_number);
11857                 if (mips_opts.micromips)
11858                   INSERT_OPERAND (1, CODE10, *ip, imm_expr.X_add_number);
11859                 else
11860                   INSERT_OPERAND (0, CODE20, *ip, imm_expr.X_add_number);
11861                 imm_expr.X_op = O_absent;
11862                 s = expr_end;
11863               }
11864               continue;
11865
11866             case 'C':           /* 25- or 23-bit coprocessor code.  */
11867               {
11868                 unsigned long mask = (mips_opts.micromips
11869                                       ? MICROMIPSOP_MASK_COPZ
11870                                       : OP_MASK_COPZ);
11871
11872                 my_getExpression (&imm_expr, s);
11873                 check_absolute_expr (ip, &imm_expr);
11874                 if ((unsigned long) imm_expr.X_add_number > mask)
11875                   as_warn (_("Coproccesor code > %u bits (%lu)"),
11876                            mips_opts.micromips ? 23U : 25U,
11877                            (unsigned long) imm_expr.X_add_number);
11878                 INSERT_OPERAND (mips_opts.micromips,
11879                                 COPZ, *ip, imm_expr.X_add_number);
11880                 imm_expr.X_op = O_absent;
11881                 s = expr_end;
11882               }
11883               continue;
11884
11885             case 'J':           /* 19-bit WAIT code.  */
11886               gas_assert (!mips_opts.micromips);
11887               my_getExpression (&imm_expr, s);
11888               check_absolute_expr (ip, &imm_expr);
11889               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
11890                 {
11891                   as_warn (_("Illegal 19-bit code (%lu)"),
11892                            (unsigned long) imm_expr.X_add_number);
11893                   imm_expr.X_add_number &= OP_MASK_CODE19;
11894                 }
11895               INSERT_OPERAND (0, CODE19, *ip, imm_expr.X_add_number);
11896               imm_expr.X_op = O_absent;
11897               s = expr_end;
11898               continue;
11899
11900             case 'P':           /* Performance register.  */
11901               gas_assert (!mips_opts.micromips);
11902               my_getExpression (&imm_expr, s);
11903               check_absolute_expr (ip, &imm_expr);
11904               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
11905                 as_warn (_("Invalid performance register (%lu)"),
11906                          (unsigned long) imm_expr.X_add_number);
11907               if (imm_expr.X_add_number != 0 && mips_opts.arch == CPU_R5900
11908                 && (!strcmp(insn->name,"mfps") || !strcmp(insn->name,"mtps")))
11909                 as_warn (_("Invalid performance register (%lu)"),
11910                   (unsigned long) imm_expr.X_add_number);
11911               INSERT_OPERAND (0, PERFREG, *ip, imm_expr.X_add_number);
11912               imm_expr.X_op = O_absent;
11913               s = expr_end;
11914               continue;
11915
11916             case 'G':           /* Coprocessor destination register.  */
11917               {
11918                 unsigned long opcode = ip->insn_opcode;
11919                 unsigned long mask;
11920                 unsigned int types;
11921                 int cop0;
11922
11923                 if (mips_opts.micromips)
11924                   {
11925                     mask = ~((MICROMIPSOP_MASK_RT << MICROMIPSOP_SH_RT)
11926                              | (MICROMIPSOP_MASK_RS << MICROMIPSOP_SH_RS)
11927                              | (MICROMIPSOP_MASK_SEL << MICROMIPSOP_SH_SEL));
11928                     opcode &= mask;
11929                     switch (opcode)
11930                       {
11931                       case 0x000000fc:                          /* mfc0  */
11932                       case 0x000002fc:                          /* mtc0  */
11933                       case 0x580000fc:                          /* dmfc0 */
11934                       case 0x580002fc:                          /* dmtc0 */
11935                         cop0 = 1;
11936                         break;
11937                       default:
11938                         cop0 = 0;
11939                         break;
11940                       }
11941                   }
11942                 else
11943                   {
11944                     opcode = (opcode >> OP_SH_OP) & OP_MASK_OP;
11945                     cop0 = opcode == OP_OP_COP0;
11946                   }
11947                 types = RTYPE_NUM | (cop0 ? RTYPE_CP0 : RTYPE_GP);
11948                 ok = reg_lookup (&s, types, &regno);
11949                 if (mips_opts.micromips)
11950                   INSERT_OPERAND (1, RS, *ip, regno);
11951                 else
11952                   INSERT_OPERAND (0, RD, *ip, regno);
11953                 if (ok)
11954                   {
11955                     lastregno = regno;
11956                     continue;
11957                   }
11958               }
11959               break;
11960
11961             case 'y':           /* ALNV.PS source register.  */
11962               gas_assert (mips_opts.micromips);
11963               goto do_reg;
11964             case 'x':           /* Ignore register name.  */
11965             case 'U':           /* Destination register (CLO/CLZ).  */
11966             case 'g':           /* Coprocessor destination register.  */
11967               gas_assert (!mips_opts.micromips);
11968             case 'b':           /* Base register.  */
11969             case 'd':           /* Destination register.  */
11970             case 's':           /* Source register.  */
11971             case 't':           /* Target register.  */
11972             case 'r':           /* Both target and source.  */
11973             case 'v':           /* Both dest and source.  */
11974             case 'w':           /* Both dest and target.  */
11975             case 'E':           /* Coprocessor target register.  */
11976             case 'K':           /* RDHWR destination register.  */
11977             case 'z':           /* Must be zero register.  */
11978             do_reg:
11979               s_reset = s;
11980               if (*args == 'E' || *args == 'K')
11981                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
11982               else
11983                 {
11984                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
11985                   if (regno == AT && mips_opts.at)
11986                     {
11987                       if (mips_opts.at == ATREG)
11988                         as_warn (_("Used $at without \".set noat\""));
11989                       else
11990                         as_warn (_("Used $%u with \".set at=$%u\""),
11991                                  regno, mips_opts.at);
11992                     }
11993                 }
11994               if (ok)
11995                 {
11996                   c = *args;
11997                   if (*s == ' ')
11998                     ++s;
11999                   if (args[1] != *s)
12000                     {
12001                       if (c == 'r' || c == 'v' || c == 'w')
12002                         {
12003                           regno = lastregno;
12004                           s = s_reset;
12005                           ++args;
12006                         }
12007                     }
12008                   /* 'z' only matches $0.  */
12009                   if (c == 'z' && regno != 0)
12010                     break;
12011
12012                   if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
12013                     {
12014                       if (regno == lastregno)
12015                         {
12016                           insn_error
12017                             = _("Source and destination must be different");
12018                           continue;
12019                         }
12020                       if (regno == 31 && lastregno == 0xffffffff)
12021                         {
12022                           insn_error
12023                             = _("A destination register must be supplied");
12024                           continue;
12025                         }
12026                     }
12027                   /* Now that we have assembled one operand, we use the args
12028                      string to figure out where it goes in the instruction.  */
12029                   switch (c)
12030                     {
12031                     case 'r':
12032                     case 's':
12033                     case 'v':
12034                     case 'b':
12035                       INSERT_OPERAND (mips_opts.micromips, RS, *ip, regno);
12036                       break;
12037
12038                     case 'K':
12039                       if (mips_opts.micromips)
12040                         INSERT_OPERAND (1, RS, *ip, regno);
12041                       else
12042                         INSERT_OPERAND (0, RD, *ip, regno);
12043                       break;
12044
12045                     case 'd':
12046                     case 'g':
12047                       INSERT_OPERAND (mips_opts.micromips, RD, *ip, regno);
12048                       break;
12049
12050                     case 'U':
12051                       gas_assert (!mips_opts.micromips);
12052                       INSERT_OPERAND (0, RD, *ip, regno);
12053                       INSERT_OPERAND (0, RT, *ip, regno);
12054                       break;
12055
12056                     case 'w':
12057                     case 't':
12058                     case 'E':
12059                       INSERT_OPERAND (mips_opts.micromips, RT, *ip, regno);
12060                       break;
12061
12062                     case 'y':
12063                       gas_assert (mips_opts.micromips);
12064                       INSERT_OPERAND (1, RS3, *ip, regno);
12065                       break;
12066
12067                     case 'x':
12068                       /* This case exists because on the r3000 trunc
12069                          expands into a macro which requires a gp
12070                          register.  On the r6000 or r4000 it is
12071                          assembled into a single instruction which
12072                          ignores the register.  Thus the insn version
12073                          is MIPS_ISA2 and uses 'x', and the macro
12074                          version is MIPS_ISA1 and uses 't'.  */
12075                       break;
12076
12077                     case 'z':
12078                       /* This case is for the div instruction, which
12079                          acts differently if the destination argument
12080                          is $0.  This only matches $0, and is checked
12081                          outside the switch.  */
12082                       break;
12083                     }
12084                   lastregno = regno;
12085                   continue;
12086                 }
12087               switch (*args++)
12088                 {
12089                 case 'r':
12090                 case 'v':
12091                   INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
12092                   continue;
12093
12094                 case 'w':
12095                   INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
12096                   continue;
12097                 }
12098               break;
12099
12100             case 'O':           /* MDMX alignment immediate constant.  */
12101               gas_assert (!mips_opts.micromips);
12102               my_getExpression (&imm_expr, s);
12103               check_absolute_expr (ip, &imm_expr);
12104               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
12105                 as_warn (_("Improper align amount (%ld), using low bits"),
12106                          (long) imm_expr.X_add_number);
12107               INSERT_OPERAND (0, ALN, *ip, imm_expr.X_add_number);
12108               imm_expr.X_op = O_absent;
12109               s = expr_end;
12110               continue;
12111
12112             case 'Q':           /* MDMX vector, element sel, or const.  */
12113               if (s[0] != '$')
12114                 {
12115                   /* MDMX Immediate.  */
12116                   gas_assert (!mips_opts.micromips);
12117                   my_getExpression (&imm_expr, s);
12118                   check_absolute_expr (ip, &imm_expr);
12119                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
12120                     as_warn (_("Invalid MDMX Immediate (%ld)"),
12121                              (long) imm_expr.X_add_number);
12122                   INSERT_OPERAND (0, FT, *ip, imm_expr.X_add_number);
12123                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
12124                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
12125                   else
12126                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
12127                   imm_expr.X_op = O_absent;
12128                   s = expr_end;
12129                   continue;
12130                 }
12131               /* Not MDMX Immediate.  Fall through.  */
12132             case 'X':           /* MDMX destination register.  */
12133             case 'Y':           /* MDMX source register.  */
12134             case 'Z':           /* MDMX target register.  */
12135               is_mdmx = 1;
12136             case 'W':
12137               gas_assert (!mips_opts.micromips);
12138             case 'D':           /* Floating point destination register.  */
12139             case 'S':           /* Floating point source register.  */
12140             case 'T':           /* Floating point target register.  */
12141             case 'R':           /* Floating point source register.  */
12142             case 'V':
12143               rtype = RTYPE_FPU;
12144               if (is_mdmx
12145                   || (mips_opts.ase_mdmx
12146                       && (ip->insn_mo->pinfo & FP_D)
12147                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
12148                                                 | INSN_COPROC_MEMORY_DELAY
12149                                                 | INSN_LOAD_COPROC_DELAY
12150                                                 | INSN_LOAD_MEMORY_DELAY
12151                                                 | INSN_STORE_MEMORY))))
12152                 rtype |= RTYPE_VEC;
12153               s_reset = s;
12154               if (reg_lookup (&s, rtype, &regno))
12155                 {
12156                   if ((regno & 1) != 0
12157                       && HAVE_32BIT_FPRS
12158                       && !mips_oddfpreg_ok (ip->insn_mo, argnum))
12159                     as_warn (_("Float register should be even, was %d"),
12160                              regno);
12161
12162                   c = *args;
12163                   if (*s == ' ')
12164                     ++s;
12165                   if (args[1] != *s)
12166                     {
12167                       if (c == 'V' || c == 'W')
12168                         {
12169                           regno = lastregno;
12170                           s = s_reset;
12171                           ++args;
12172                         }
12173                     }
12174                   switch (c)
12175                     {
12176                     case 'D':
12177                     case 'X':
12178                       INSERT_OPERAND (mips_opts.micromips, FD, *ip, regno);
12179                       break;
12180
12181                     case 'V':
12182                     case 'S':
12183                     case 'Y':
12184                       INSERT_OPERAND (mips_opts.micromips, FS, *ip, regno);
12185                       break;
12186
12187                     case 'Q':
12188                       /* This is like 'Z', but also needs to fix the MDMX
12189                          vector/scalar select bits.  Note that the
12190                          scalar immediate case is handled above.  */
12191                       if (*s == '[')
12192                         {
12193                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
12194                           int max_el = (is_qh ? 3 : 7);
12195                           s++;
12196                           my_getExpression(&imm_expr, s);
12197                           check_absolute_expr (ip, &imm_expr);
12198                           s = expr_end;
12199                           if (imm_expr.X_add_number > max_el)
12200                             as_bad (_("Bad element selector %ld"),
12201                                     (long) imm_expr.X_add_number);
12202                           imm_expr.X_add_number &= max_el;
12203                           ip->insn_opcode |= (imm_expr.X_add_number
12204                                               << (OP_SH_VSEL +
12205                                                   (is_qh ? 2 : 1)));
12206                           imm_expr.X_op = O_absent;
12207                           if (*s != ']')
12208                             as_warn (_("Expecting ']' found '%s'"), s);
12209                           else
12210                             s++;
12211                         }
12212                       else
12213                         {
12214                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
12215                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
12216                                                 << OP_SH_VSEL);
12217                           else
12218                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
12219                                                 OP_SH_VSEL);
12220                         }
12221                       /* Fall through.  */
12222                     case 'W':
12223                     case 'T':
12224                     case 'Z':
12225                       INSERT_OPERAND (mips_opts.micromips, FT, *ip, regno);
12226                       break;
12227
12228                     case 'R':
12229                       INSERT_OPERAND (mips_opts.micromips, FR, *ip, regno);
12230                       break;
12231                     }
12232                   lastregno = regno;
12233                   continue;
12234                 }
12235
12236               switch (*args++)
12237                 {
12238                 case 'V':
12239                   INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
12240                   continue;
12241
12242                 case 'W':
12243                   INSERT_OPERAND (mips_opts.micromips, FT, *ip, lastregno);
12244                   continue;
12245                 }
12246               break;
12247
12248             case 'I':
12249               my_getExpression (&imm_expr, s);
12250               if (imm_expr.X_op != O_big
12251                   && imm_expr.X_op != O_constant)
12252                 insn_error = _("absolute expression required");
12253               if (HAVE_32BIT_GPRS)
12254                 normalize_constant_expr (&imm_expr);
12255               s = expr_end;
12256               continue;
12257
12258             case 'A':
12259               my_getExpression (&offset_expr, s);
12260               normalize_address_expr (&offset_expr);
12261               *imm_reloc = BFD_RELOC_32;
12262               s = expr_end;
12263               continue;
12264
12265             case 'F':
12266             case 'L':
12267             case 'f':
12268             case 'l':
12269               {
12270                 int f64;
12271                 int using_gprs;
12272                 char *save_in;
12273                 char *err;
12274                 unsigned char temp[8];
12275                 int len;
12276                 unsigned int length;
12277                 segT seg;
12278                 subsegT subseg;
12279                 char *p;
12280
12281                 /* These only appear as the last operand in an
12282                    instruction, and every instruction that accepts
12283                    them in any variant accepts them in all variants.
12284                    This means we don't have to worry about backing out
12285                    any changes if the instruction does not match.
12286
12287                    The difference between them is the size of the
12288                    floating point constant and where it goes.  For 'F'
12289                    and 'L' the constant is 64 bits; for 'f' and 'l' it
12290                    is 32 bits.  Where the constant is placed is based
12291                    on how the MIPS assembler does things:
12292                     F -- .rdata
12293                     L -- .lit8
12294                     f -- immediate value
12295                     l -- .lit4
12296
12297                     The .lit4 and .lit8 sections are only used if
12298                     permitted by the -G argument.
12299
12300                     The code below needs to know whether the target register
12301                     is 32 or 64 bits wide.  It relies on the fact 'f' and
12302                     'F' are used with GPR-based instructions and 'l' and
12303                     'L' are used with FPR-based instructions.  */
12304
12305                 f64 = *args == 'F' || *args == 'L';
12306                 using_gprs = *args == 'F' || *args == 'f';
12307
12308                 save_in = input_line_pointer;
12309                 input_line_pointer = s;
12310                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
12311                 length = len;
12312                 s = input_line_pointer;
12313                 input_line_pointer = save_in;
12314                 if (err != NULL && *err != '\0')
12315                   {
12316                     as_bad (_("Bad floating point constant: %s"), err);
12317                     memset (temp, '\0', sizeof temp);
12318                     length = f64 ? 8 : 4;
12319                   }
12320
12321                 gas_assert (length == (unsigned) (f64 ? 8 : 4));
12322
12323                 if (*args == 'f'
12324                     || (*args == 'l'
12325                         && (g_switch_value < 4
12326                             || (temp[0] == 0 && temp[1] == 0)
12327                             || (temp[2] == 0 && temp[3] == 0))))
12328                   {
12329                     imm_expr.X_op = O_constant;
12330                     if (!target_big_endian)
12331                       imm_expr.X_add_number = bfd_getl32 (temp);
12332                     else
12333                       imm_expr.X_add_number = bfd_getb32 (temp);
12334                   }
12335                 else if (length > 4
12336                          && !mips_disable_float_construction
12337                          /* Constants can only be constructed in GPRs and
12338                             copied to FPRs if the GPRs are at least as wide
12339                             as the FPRs.  Force the constant into memory if
12340                             we are using 64-bit FPRs but the GPRs are only
12341                             32 bits wide.  */
12342                          && (using_gprs
12343                              || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
12344                          && ((temp[0] == 0 && temp[1] == 0)
12345                              || (temp[2] == 0 && temp[3] == 0))
12346                          && ((temp[4] == 0 && temp[5] == 0)
12347                              || (temp[6] == 0 && temp[7] == 0)))
12348                   {
12349                     /* The value is simple enough to load with a couple of
12350                        instructions.  If using 32-bit registers, set
12351                        imm_expr to the high order 32 bits and offset_expr to
12352                        the low order 32 bits.  Otherwise, set imm_expr to
12353                        the entire 64 bit constant.  */
12354                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
12355                       {
12356                         imm_expr.X_op = O_constant;
12357                         offset_expr.X_op = O_constant;
12358                         if (!target_big_endian)
12359                           {
12360                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
12361                             offset_expr.X_add_number = bfd_getl32 (temp);
12362                           }
12363                         else
12364                           {
12365                             imm_expr.X_add_number = bfd_getb32 (temp);
12366                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
12367                           }
12368                         if (offset_expr.X_add_number == 0)
12369                           offset_expr.X_op = O_absent;
12370                       }
12371                     else if (sizeof (imm_expr.X_add_number) > 4)
12372                       {
12373                         imm_expr.X_op = O_constant;
12374                         if (!target_big_endian)
12375                           imm_expr.X_add_number = bfd_getl64 (temp);
12376                         else
12377                           imm_expr.X_add_number = bfd_getb64 (temp);
12378                       }
12379                     else
12380                       {
12381                         imm_expr.X_op = O_big;
12382                         imm_expr.X_add_number = 4;
12383                         if (!target_big_endian)
12384                           {
12385                             generic_bignum[0] = bfd_getl16 (temp);
12386                             generic_bignum[1] = bfd_getl16 (temp + 2);
12387                             generic_bignum[2] = bfd_getl16 (temp + 4);
12388                             generic_bignum[3] = bfd_getl16 (temp + 6);
12389                           }
12390                         else
12391                           {
12392                             generic_bignum[0] = bfd_getb16 (temp + 6);
12393                             generic_bignum[1] = bfd_getb16 (temp + 4);
12394                             generic_bignum[2] = bfd_getb16 (temp + 2);
12395                             generic_bignum[3] = bfd_getb16 (temp);
12396                           }
12397                       }
12398                   }
12399                 else
12400                   {
12401                     const char *newname;
12402                     segT new_seg;
12403
12404                     /* Switch to the right section.  */
12405                     seg = now_seg;
12406                     subseg = now_subseg;
12407                     switch (*args)
12408                       {
12409                       default: /* unused default case avoids warnings.  */
12410                       case 'L':
12411                         newname = RDATA_SECTION_NAME;
12412                         if (g_switch_value >= 8)
12413                           newname = ".lit8";
12414                         break;
12415                       case 'F':
12416                         newname = RDATA_SECTION_NAME;
12417                         break;
12418                       case 'l':
12419                         gas_assert (g_switch_value >= 4);
12420                         newname = ".lit4";
12421                         break;
12422                       }
12423                     new_seg = subseg_new (newname, (subsegT) 0);
12424                     if (IS_ELF)
12425                       bfd_set_section_flags (stdoutput, new_seg,
12426                                              (SEC_ALLOC
12427                                               | SEC_LOAD
12428                                               | SEC_READONLY
12429                                               | SEC_DATA));
12430                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
12431                     if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
12432                       record_alignment (new_seg, 4);
12433                     else
12434                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
12435                     if (seg == now_seg)
12436                       as_bad (_("Can't use floating point insn in this section"));
12437
12438                     /* Set the argument to the current address in the
12439                        section.  */
12440                     offset_expr.X_op = O_symbol;
12441                     offset_expr.X_add_symbol = symbol_temp_new_now ();
12442                     offset_expr.X_add_number = 0;
12443
12444                     /* Put the floating point number into the section.  */
12445                     p = frag_more ((int) length);
12446                     memcpy (p, temp, length);
12447
12448                     /* Switch back to the original section.  */
12449                     subseg_set (seg, subseg);
12450                   }
12451               }
12452               continue;
12453
12454             case 'i':           /* 16-bit unsigned immediate.  */
12455             case 'j':           /* 16-bit signed immediate.  */
12456               *imm_reloc = BFD_RELOC_LO16;
12457               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
12458                 {
12459                   int more;
12460                   offsetT minval, maxval;
12461
12462                   more = (insn + 1 < past
12463                           && strcmp (insn->name, insn[1].name) == 0);
12464
12465                   /* If the expression was written as an unsigned number,
12466                      only treat it as signed if there are no more
12467                      alternatives.  */
12468                   if (more
12469                       && *args == 'j'
12470                       && sizeof (imm_expr.X_add_number) <= 4
12471                       && imm_expr.X_op == O_constant
12472                       && imm_expr.X_add_number < 0
12473                       && imm_expr.X_unsigned
12474                       && HAVE_64BIT_GPRS)
12475                     break;
12476
12477                   /* For compatibility with older assemblers, we accept
12478                      0x8000-0xffff as signed 16-bit numbers when only
12479                      signed numbers are allowed.  */
12480                   if (*args == 'i')
12481                     minval = 0, maxval = 0xffff;
12482                   else if (more)
12483                     minval = -0x8000, maxval = 0x7fff;
12484                   else
12485                     minval = -0x8000, maxval = 0xffff;
12486
12487                   if (imm_expr.X_op != O_constant
12488                       || imm_expr.X_add_number < minval
12489                       || imm_expr.X_add_number > maxval)
12490                     {
12491                       if (more)
12492                         break;
12493                       if (imm_expr.X_op == O_constant
12494                           || imm_expr.X_op == O_big)
12495                         as_bad (_("Expression out of range"));
12496                     }
12497                 }
12498               s = expr_end;
12499               continue;
12500
12501             case 'o':           /* 16-bit offset.  */
12502               offset_reloc[0] = BFD_RELOC_LO16;
12503               offset_reloc[1] = BFD_RELOC_UNUSED;
12504               offset_reloc[2] = BFD_RELOC_UNUSED;
12505
12506               /* Check whether there is only a single bracketed expression
12507                  left.  If so, it must be the base register and the
12508                  constant must be zero.  */
12509               if (*s == '(' && strchr (s + 1, '(') == 0)
12510                 {
12511                   offset_expr.X_op = O_constant;
12512                   offset_expr.X_add_number = 0;
12513                   continue;
12514                 }
12515
12516               /* If this value won't fit into a 16 bit offset, then go
12517                  find a macro that will generate the 32 bit offset
12518                  code pattern.  */
12519               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
12520                   && (offset_expr.X_op != O_constant
12521                       || offset_expr.X_add_number >= 0x8000
12522                       || offset_expr.X_add_number < -0x8000))
12523                 break;
12524
12525               s = expr_end;
12526               continue;
12527
12528             case 'p':           /* PC-relative offset.  */
12529               *offset_reloc = BFD_RELOC_16_PCREL_S2;
12530               my_getExpression (&offset_expr, s);
12531               s = expr_end;
12532               continue;
12533
12534             case 'u':           /* Upper 16 bits.  */
12535               *imm_reloc = BFD_RELOC_LO16;
12536               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
12537                   && imm_expr.X_op == O_constant
12538                   && (imm_expr.X_add_number < 0
12539                       || imm_expr.X_add_number >= 0x10000))
12540                 as_bad (_("lui expression (%lu) not in range 0..65535"),
12541                         (unsigned long) imm_expr.X_add_number);
12542               s = expr_end;
12543               continue;
12544
12545             case 'a':           /* 26-bit address.  */
12546               *offset_reloc = BFD_RELOC_MIPS_JMP;
12547               my_getExpression (&offset_expr, s);
12548               s = expr_end;
12549               continue;
12550
12551             case 'N':           /* 3-bit branch condition code.  */
12552             case 'M':           /* 3-bit compare condition code.  */
12553               rtype = RTYPE_CCC;
12554               if (ip->insn_mo->pinfo & (FP_D | FP_S))
12555                 rtype |= RTYPE_FCC;
12556               if (!reg_lookup (&s, rtype, &regno))
12557                 break;
12558               if ((strcmp (str + strlen (str) - 3, ".ps") == 0
12559                    || strcmp (str + strlen (str) - 5, "any2f") == 0
12560                    || strcmp (str + strlen (str) - 5, "any2t") == 0)
12561                   && (regno & 1) != 0)
12562                 as_warn (_("Condition code register should be even for %s, "
12563                            "was %d"),
12564                          str, regno);
12565               if ((strcmp (str + strlen (str) - 5, "any4f") == 0
12566                    || strcmp (str + strlen (str) - 5, "any4t") == 0)
12567                   && (regno & 3) != 0)
12568                 as_warn (_("Condition code register should be 0 or 4 for %s, "
12569                            "was %d"),
12570                          str, regno);
12571               if (*args == 'N')
12572                 INSERT_OPERAND (mips_opts.micromips, BCC, *ip, regno);
12573               else
12574                 INSERT_OPERAND (mips_opts.micromips, CCC, *ip, regno);
12575               continue;
12576
12577             case 'H':
12578               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
12579                 s += 2;
12580               if (ISDIGIT (*s))
12581                 {
12582                   c = 0;
12583                   do
12584                     {
12585                       c *= 10;
12586                       c += *s - '0';
12587                       ++s;
12588                     }
12589                   while (ISDIGIT (*s));
12590                 }
12591               else
12592                 c = 8; /* Invalid sel value.  */
12593
12594               if (c > 7)
12595                 as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
12596               INSERT_OPERAND (mips_opts.micromips, SEL, *ip, c);
12597               continue;
12598
12599             case 'e':
12600               gas_assert (!mips_opts.micromips);
12601               /* Must be at least one digit.  */
12602               my_getExpression (&imm_expr, s);
12603               check_absolute_expr (ip, &imm_expr);
12604
12605               if ((unsigned long) imm_expr.X_add_number
12606                   > (unsigned long) OP_MASK_VECBYTE)
12607                 {
12608                   as_bad (_("bad byte vector index (%ld)"),
12609                            (long) imm_expr.X_add_number);
12610                   imm_expr.X_add_number = 0;
12611                 }
12612
12613               INSERT_OPERAND (0, VECBYTE, *ip, imm_expr.X_add_number);
12614               imm_expr.X_op = O_absent;
12615               s = expr_end;
12616               continue;
12617
12618             case '%':
12619               gas_assert (!mips_opts.micromips);
12620               my_getExpression (&imm_expr, s);
12621               check_absolute_expr (ip, &imm_expr);
12622
12623               if ((unsigned long) imm_expr.X_add_number
12624                   > (unsigned long) OP_MASK_VECALIGN)
12625                 {
12626                   as_bad (_("bad byte vector index (%ld)"),
12627                            (long) imm_expr.X_add_number);
12628                   imm_expr.X_add_number = 0;
12629                 }
12630
12631               INSERT_OPERAND (0, VECALIGN, *ip, imm_expr.X_add_number);
12632               imm_expr.X_op = O_absent;
12633               s = expr_end;
12634               continue;
12635
12636             case 'm':           /* Opcode extension character.  */
12637               gas_assert (mips_opts.micromips);
12638               c = *++args;
12639               switch (c)
12640                 {
12641                 case 'r':
12642                   if (strncmp (s, "$pc", 3) == 0)
12643                     {
12644                       s += 3;
12645                       continue;
12646                     }
12647                   break;
12648
12649                 case 'a':
12650                 case 'b':
12651                 case 'c':
12652                 case 'd':
12653                 case 'e':
12654                 case 'f':
12655                 case 'g':
12656                 case 'h':
12657                 case 'i':
12658                 case 'j':
12659                 case 'l':
12660                 case 'm':
12661                 case 'n':
12662                 case 'p':
12663                 case 'q':
12664                 case 's':
12665                 case 't':
12666                 case 'x':
12667                 case 'y':
12668                 case 'z':
12669                   s_reset = s;
12670                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
12671                   if (regno == AT && mips_opts.at)
12672                     {
12673                       if (mips_opts.at == ATREG)
12674                         as_warn (_("Used $at without \".set noat\""));
12675                       else
12676                         as_warn (_("Used $%u with \".set at=$%u\""),
12677                                  regno, mips_opts.at);
12678                     }
12679                   if (!ok)
12680                     {
12681                       if (c == 'c')
12682                         {
12683                           gas_assert (args[1] == ',');
12684                           regno = lastregno;
12685                           ++args;
12686                         }
12687                       else if (c == 't')
12688                         {
12689                           gas_assert (args[1] == ',');
12690                           ++args;
12691                           continue;                     /* Nothing to do.  */
12692                         }
12693                       else
12694                         break;
12695                     }
12696
12697                   if (c == 'j' && !strncmp (ip->insn_mo->name, "jalr", 4))
12698                     {
12699                       if (regno == lastregno)
12700                         {
12701                           insn_error
12702                             = _("Source and destination must be different");
12703                           continue;
12704                         }
12705                       if (regno == 31 && lastregno == 0xffffffff)
12706                         {
12707                           insn_error
12708                             = _("A destination register must be supplied");
12709                           continue;
12710                         }
12711                     }
12712
12713                   if (*s == ' ')
12714                     ++s;
12715                   if (args[1] != *s)
12716                     {
12717                       if (c == 'e')
12718                         {
12719                           gas_assert (args[1] == ',');
12720                           regno = lastregno;
12721                           s = s_reset;
12722                           ++args;
12723                         }
12724                       else if (c == 't')
12725                         {
12726                           gas_assert (args[1] == ',');
12727                           s = s_reset;
12728                           ++args;
12729                           continue;                     /* Nothing to do.  */
12730                         }
12731                     }
12732
12733                   /* Make sure regno is the same as lastregno.  */
12734                   if (c == 't' && regno != lastregno)
12735                     break;
12736
12737                   /* Make sure regno is the same as destregno.  */
12738                   if (c == 'x' && regno != destregno)
12739                     break;
12740
12741                   /* We need to save regno, before regno maps to the
12742                      microMIPS register encoding.  */
12743                   lastregno = regno;
12744
12745                   if (c == 'f')
12746                     destregno = regno;
12747
12748                   switch (c)
12749                     {
12750                       case 'a':
12751                         if (regno != GP)
12752                           regno = ILLEGAL_REG;
12753                         break;
12754
12755                       case 'b':
12756                         regno = mips32_to_micromips_reg_b_map[regno];
12757                         break;
12758
12759                       case 'c':
12760                         regno = mips32_to_micromips_reg_c_map[regno];
12761                         break;
12762
12763                       case 'd':
12764                         regno = mips32_to_micromips_reg_d_map[regno];
12765                         break;
12766
12767                       case 'e':
12768                         regno = mips32_to_micromips_reg_e_map[regno];
12769                         break;
12770
12771                       case 'f':
12772                         regno = mips32_to_micromips_reg_f_map[regno];
12773                         break;
12774
12775                       case 'g':
12776                         regno = mips32_to_micromips_reg_g_map[regno];
12777                         break;
12778
12779                       case 'h':
12780                         regno = mips32_to_micromips_reg_h_map[regno];
12781                         break;
12782
12783                       case 'i':
12784                         switch (EXTRACT_OPERAND (1, MI, *ip))
12785                           {
12786                             case 4:
12787                               if (regno == 21)
12788                                 regno = 3;
12789                               else if (regno == 22)
12790                                 regno = 4;
12791                               else if (regno == 5)
12792                                 regno = 5;
12793                               else if (regno == 6)
12794                                 regno = 6;
12795                               else if (regno == 7)
12796                                 regno = 7;
12797                               else
12798                                 regno = ILLEGAL_REG;
12799                               break;
12800
12801                             case 5:
12802                               if (regno == 6)
12803                                 regno = 0;
12804                               else if (regno == 7)
12805                                 regno = 1;
12806                               else
12807                                 regno = ILLEGAL_REG;
12808                               break;
12809
12810                             case 6:
12811                               if (regno == 7)
12812                                 regno = 2;
12813                               else
12814                                 regno = ILLEGAL_REG;
12815                               break;
12816
12817                             default:
12818                               regno = ILLEGAL_REG;
12819                               break;
12820                           }
12821                         break;
12822
12823                       case 'l':
12824                         regno = mips32_to_micromips_reg_l_map[regno];
12825                         break;
12826
12827                       case 'm':
12828                         regno = mips32_to_micromips_reg_m_map[regno];
12829                         break;
12830
12831                       case 'n':
12832                         regno = mips32_to_micromips_reg_n_map[regno];
12833                         break;
12834
12835                       case 'q':
12836                         regno = mips32_to_micromips_reg_q_map[regno];
12837                         break;
12838
12839                       case 's':
12840                         if (regno != SP)
12841                           regno = ILLEGAL_REG;
12842                         break;
12843
12844                       case 'y':
12845                         if (regno != 31)
12846                           regno = ILLEGAL_REG;
12847                         break;
12848
12849                       case 'z':
12850                         if (regno != ZERO)
12851                           regno = ILLEGAL_REG;
12852                         break;
12853
12854                       case 'j': /* Do nothing.  */
12855                       case 'p':
12856                       case 't':
12857                       case 'x':
12858                         break;
12859
12860                       default:
12861                         abort ();
12862                     }
12863
12864                   if (regno == ILLEGAL_REG)
12865                     break;
12866
12867                   switch (c)
12868                     {
12869                       case 'b':
12870                         INSERT_OPERAND (1, MB, *ip, regno);
12871                         break;
12872
12873                       case 'c':
12874                         INSERT_OPERAND (1, MC, *ip, regno);
12875                         break;
12876
12877                       case 'd':
12878                         INSERT_OPERAND (1, MD, *ip, regno);
12879                         break;
12880
12881                       case 'e':
12882                         INSERT_OPERAND (1, ME, *ip, regno);
12883                         break;
12884
12885                       case 'f':
12886                         INSERT_OPERAND (1, MF, *ip, regno);
12887                         break;
12888
12889                       case 'g':
12890                         INSERT_OPERAND (1, MG, *ip, regno);
12891                         break;
12892
12893                       case 'h':
12894                         INSERT_OPERAND (1, MH, *ip, regno);
12895                         break;
12896
12897                       case 'i':
12898                         INSERT_OPERAND (1, MI, *ip, regno);
12899                         break;
12900
12901                       case 'j':
12902                         INSERT_OPERAND (1, MJ, *ip, regno);
12903                         break;
12904
12905                       case 'l':
12906                         INSERT_OPERAND (1, ML, *ip, regno);
12907                         break;
12908
12909                       case 'm':
12910                         INSERT_OPERAND (1, MM, *ip, regno);
12911                         break;
12912
12913                       case 'n':
12914                         INSERT_OPERAND (1, MN, *ip, regno);
12915                         break;
12916
12917                       case 'p':
12918                         INSERT_OPERAND (1, MP, *ip, regno);
12919                         break;
12920
12921                       case 'q':
12922                         INSERT_OPERAND (1, MQ, *ip, regno);
12923                         break;
12924
12925                       case 'a': /* Do nothing.  */
12926                       case 's': /* Do nothing.  */
12927                       case 't': /* Do nothing.  */
12928                       case 'x': /* Do nothing.  */
12929                       case 'y': /* Do nothing.  */
12930                       case 'z': /* Do nothing.  */
12931                         break;
12932
12933                       default:
12934                         abort ();
12935                     }
12936                   continue;
12937
12938                 case 'A':
12939                   {
12940                     bfd_reloc_code_real_type r[3];
12941                     expressionS ep;
12942                     int imm;
12943
12944                     /* Check whether there is only a single bracketed
12945                        expression left.  If so, it must be the base register
12946                        and the constant must be zero.  */
12947                     if (*s == '(' && strchr (s + 1, '(') == 0)
12948                       {
12949                         INSERT_OPERAND (1, IMMA, *ip, 0);
12950                         continue;
12951                       }
12952
12953                     if (my_getSmallExpression (&ep, r, s) > 0
12954                         || !expr_const_in_range (&ep, -64, 64, 2))
12955                       break;
12956
12957                     imm = ep.X_add_number >> 2;
12958                     INSERT_OPERAND (1, IMMA, *ip, imm);
12959                   }
12960                   s = expr_end;
12961                   continue;
12962
12963                 case 'B':
12964                   {
12965                     bfd_reloc_code_real_type r[3];
12966                     expressionS ep;
12967                     int imm;
12968
12969                     if (my_getSmallExpression (&ep, r, s) > 0
12970                         || ep.X_op != O_constant)
12971                       break;
12972
12973                     for (imm = 0; imm < 8; imm++)
12974                       if (micromips_imm_b_map[imm] == ep.X_add_number)
12975                         break;
12976                     if (imm >= 8)
12977                       break;
12978
12979                     INSERT_OPERAND (1, IMMB, *ip, imm);
12980                   }
12981                   s = expr_end;
12982                   continue;
12983
12984                 case 'C':
12985                   {
12986                     bfd_reloc_code_real_type r[3];
12987                     expressionS ep;
12988                     int imm;
12989
12990                     if (my_getSmallExpression (&ep, r, s) > 0
12991                         || ep.X_op != O_constant)
12992                       break;
12993
12994                     for (imm = 0; imm < 16; imm++)
12995                       if (micromips_imm_c_map[imm] == ep.X_add_number)
12996                         break;
12997                     if (imm >= 16)
12998                       break;
12999
13000                     INSERT_OPERAND (1, IMMC, *ip, imm);
13001                   }
13002                   s = expr_end;
13003                   continue;
13004
13005                 case 'D':       /* pc relative offset */
13006                 case 'E':       /* pc relative offset */
13007                   my_getExpression (&offset_expr, s);
13008                   if (offset_expr.X_op == O_register)
13009                     break;
13010
13011                   if (!forced_insn_length)
13012                     *offset_reloc = (int) BFD_RELOC_UNUSED + c;
13013                   else if (c == 'D')
13014                     *offset_reloc = BFD_RELOC_MICROMIPS_10_PCREL_S1;
13015                   else
13016                     *offset_reloc = BFD_RELOC_MICROMIPS_7_PCREL_S1;
13017                   s = expr_end;
13018                   continue;
13019
13020                 case 'F':
13021                   {
13022                     bfd_reloc_code_real_type r[3];
13023                     expressionS ep;
13024                     int imm;
13025
13026                     if (my_getSmallExpression (&ep, r, s) > 0
13027                         || !expr_const_in_range (&ep, 0, 16, 0))
13028                       break;
13029
13030                     imm = ep.X_add_number;
13031                     INSERT_OPERAND (1, IMMF, *ip, imm);
13032                   }
13033                   s = expr_end;
13034                   continue;
13035
13036                 case 'G':
13037                   {
13038                     bfd_reloc_code_real_type r[3];
13039                     expressionS ep;
13040                     int imm;
13041
13042                     /* Check whether there is only a single bracketed
13043                        expression left.  If so, it must be the base register
13044                        and the constant must be zero.  */
13045                     if (*s == '(' && strchr (s + 1, '(') == 0)
13046                       {
13047                         INSERT_OPERAND (1, IMMG, *ip, 0);
13048                         continue;
13049                       }
13050
13051                     if (my_getSmallExpression (&ep, r, s) > 0
13052                         || !expr_const_in_range (&ep, -1, 15, 0))
13053                       break;
13054
13055                     imm = ep.X_add_number & 15;
13056                     INSERT_OPERAND (1, IMMG, *ip, imm);
13057                   }
13058                   s = expr_end;
13059                   continue;
13060
13061                 case 'H':
13062                   {
13063                     bfd_reloc_code_real_type r[3];
13064                     expressionS ep;
13065                     int imm;
13066
13067                     /* Check whether there is only a single bracketed
13068                        expression left.  If so, it must be the base register
13069                        and the constant must be zero.  */
13070                     if (*s == '(' && strchr (s + 1, '(') == 0)
13071                       {
13072                         INSERT_OPERAND (1, IMMH, *ip, 0);
13073                         continue;
13074                       }
13075
13076                     if (my_getSmallExpression (&ep, r, s) > 0
13077                         || !expr_const_in_range (&ep, 0, 16, 1))
13078                       break;
13079
13080                     imm = ep.X_add_number >> 1;
13081                     INSERT_OPERAND (1, IMMH, *ip, imm);
13082                   }
13083                   s = expr_end;
13084                   continue;
13085
13086                 case 'I':
13087                   {
13088                     bfd_reloc_code_real_type r[3];
13089                     expressionS ep;
13090                     int imm;
13091
13092                     if (my_getSmallExpression (&ep, r, s) > 0
13093                         || !expr_const_in_range (&ep, -1, 127, 0))
13094                       break;
13095
13096                     imm = ep.X_add_number & 127;
13097                     INSERT_OPERAND (1, IMMI, *ip, imm);
13098                   }
13099                   s = expr_end;
13100                   continue;
13101
13102                 case 'J':
13103                   {
13104                     bfd_reloc_code_real_type r[3];
13105                     expressionS ep;
13106                     int imm;
13107
13108                     /* Check whether there is only a single bracketed
13109                        expression left.  If so, it must be the base register
13110                        and the constant must be zero.  */
13111                     if (*s == '(' && strchr (s + 1, '(') == 0)
13112                       {
13113                         INSERT_OPERAND (1, IMMJ, *ip, 0);
13114                         continue;
13115                       }
13116
13117                     if (my_getSmallExpression (&ep, r, s) > 0
13118                         || !expr_const_in_range (&ep, 0, 16, 2))
13119                       break;
13120
13121                     imm = ep.X_add_number >> 2;
13122                     INSERT_OPERAND (1, IMMJ, *ip, imm);
13123                   }
13124                   s = expr_end;
13125                   continue;
13126
13127                 case 'L':
13128                   {
13129                     bfd_reloc_code_real_type r[3];
13130                     expressionS ep;
13131                     int imm;
13132
13133                     /* Check whether there is only a single bracketed
13134                        expression left.  If so, it must be the base register
13135                        and the constant must be zero.  */
13136                     if (*s == '(' && strchr (s + 1, '(') == 0)
13137                       {
13138                         INSERT_OPERAND (1, IMML, *ip, 0);
13139                         continue;
13140                       }
13141
13142                     if (my_getSmallExpression (&ep, r, s) > 0
13143                         || !expr_const_in_range (&ep, 0, 16, 0))
13144                       break;
13145
13146                     imm = ep.X_add_number;
13147                     INSERT_OPERAND (1, IMML, *ip, imm);
13148                   }
13149                   s = expr_end;
13150                   continue;
13151
13152                 case 'M':
13153                   {
13154                     bfd_reloc_code_real_type r[3];
13155                     expressionS ep;
13156                     int imm;
13157
13158                     if (my_getSmallExpression (&ep, r, s) > 0
13159                         || !expr_const_in_range (&ep, 1, 9, 0))
13160                       break;
13161
13162                     imm = ep.X_add_number & 7;
13163                     INSERT_OPERAND (1, IMMM, *ip, imm);
13164                   }
13165                   s = expr_end;
13166                   continue;
13167
13168                 case 'N':       /* Register list for lwm and swm.  */
13169                   {
13170                     /* A comma-separated list of registers and/or
13171                        dash-separated contiguous ranges including
13172                        both ra and a set of one or more registers
13173                        starting at s0 up to s3 which have to be
13174                        consecutive, e.g.:
13175
13176                        s0, ra
13177                        s0, s1, ra, s2, s3
13178                        s0-s2, ra
13179
13180                        and any permutations of these.  */
13181                     unsigned int reglist;
13182                     int imm;
13183
13184                     if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
13185                       break;
13186
13187                     if ((reglist & 0xfff1ffff) != 0x80010000)
13188                       break;
13189
13190                     reglist = (reglist >> 17) & 7;
13191                     reglist += 1;
13192                     if ((reglist & -reglist) != reglist)
13193                       break;
13194
13195                     imm = ffs (reglist) - 1;
13196                     INSERT_OPERAND (1, IMMN, *ip, imm);
13197                   }
13198                   continue;
13199
13200                 case 'O':       /* sdbbp 4-bit code.  */
13201                   {
13202                     bfd_reloc_code_real_type r[3];
13203                     expressionS ep;
13204                     int imm;
13205
13206                     if (my_getSmallExpression (&ep, r, s) > 0
13207                         || !expr_const_in_range (&ep, 0, 16, 0))
13208                       break;
13209
13210                     imm = ep.X_add_number;
13211                     INSERT_OPERAND (1, IMMO, *ip, imm);
13212                   }
13213                   s = expr_end;
13214                   continue;
13215
13216                 case 'P':
13217                   {
13218                     bfd_reloc_code_real_type r[3];
13219                     expressionS ep;
13220                     int imm;
13221
13222                     if (my_getSmallExpression (&ep, r, s) > 0
13223                         || !expr_const_in_range (&ep, 0, 32, 2))
13224                       break;
13225
13226                     imm = ep.X_add_number >> 2;
13227                     INSERT_OPERAND (1, IMMP, *ip, imm);
13228                   }
13229                   s = expr_end;
13230                   continue;
13231
13232                 case 'Q':
13233                   {
13234                     bfd_reloc_code_real_type r[3];
13235                     expressionS ep;
13236                     int imm;
13237
13238                     if (my_getSmallExpression (&ep, r, s) > 0
13239                         || !expr_const_in_range (&ep, -0x400000, 0x400000, 2))
13240                       break;
13241
13242                     imm = ep.X_add_number >> 2;
13243                     INSERT_OPERAND (1, IMMQ, *ip, imm);
13244                   }
13245                   s = expr_end;
13246                   continue;
13247
13248                 case 'U':
13249                   {
13250                     bfd_reloc_code_real_type r[3];
13251                     expressionS ep;
13252                     int imm;
13253
13254                     /* Check whether there is only a single bracketed
13255                        expression left.  If so, it must be the base register
13256                        and the constant must be zero.  */
13257                     if (*s == '(' && strchr (s + 1, '(') == 0)
13258                       {
13259                         INSERT_OPERAND (1, IMMU, *ip, 0);
13260                         continue;
13261                       }
13262
13263                     if (my_getSmallExpression (&ep, r, s) > 0
13264                         || !expr_const_in_range (&ep, 0, 32, 2))
13265                       break;
13266
13267                     imm = ep.X_add_number >> 2;
13268                     INSERT_OPERAND (1, IMMU, *ip, imm);
13269                   }
13270                   s = expr_end;
13271                   continue;
13272
13273                 case 'W':
13274                   {
13275                     bfd_reloc_code_real_type r[3];
13276                     expressionS ep;
13277                     int imm;
13278
13279                     if (my_getSmallExpression (&ep, r, s) > 0
13280                         || !expr_const_in_range (&ep, 0, 64, 2))
13281                       break;
13282
13283                     imm = ep.X_add_number >> 2;
13284                     INSERT_OPERAND (1, IMMW, *ip, imm);
13285                   }
13286                   s = expr_end;
13287                   continue;
13288
13289                 case 'X':
13290                   {
13291                     bfd_reloc_code_real_type r[3];
13292                     expressionS ep;
13293                     int imm;
13294
13295                     if (my_getSmallExpression (&ep, r, s) > 0
13296                         || !expr_const_in_range (&ep, -8, 8, 0))
13297                       break;
13298
13299                     imm = ep.X_add_number;
13300                     INSERT_OPERAND (1, IMMX, *ip, imm);
13301                   }
13302                   s = expr_end;
13303                   continue;
13304
13305                 case 'Y':
13306                   {
13307                     bfd_reloc_code_real_type r[3];
13308                     expressionS ep;
13309                     int imm;
13310
13311                     if (my_getSmallExpression (&ep, r, s) > 0
13312                         || expr_const_in_range (&ep, -2, 2, 2)
13313                         || !expr_const_in_range (&ep, -258, 258, 2))
13314                       break;
13315
13316                     imm = ep.X_add_number >> 2;
13317                     imm = ((imm >> 1) & ~0xff) | (imm & 0xff);
13318                     INSERT_OPERAND (1, IMMY, *ip, imm);
13319                   }
13320                   s = expr_end;
13321                   continue;
13322
13323                 case 'Z':
13324                   {
13325                     bfd_reloc_code_real_type r[3];
13326                     expressionS ep;
13327
13328                     if (my_getSmallExpression (&ep, r, s) > 0
13329                         || !expr_const_in_range (&ep, 0, 1, 0))
13330                       break;
13331                   }
13332                   s = expr_end;
13333                   continue;
13334
13335                 default:
13336                   as_bad (_("Internal error: bad microMIPS opcode "
13337                             "(unknown extension operand type `m%c'): %s %s"),
13338                           *args, insn->name, insn->args);
13339                   /* Further processing is fruitless.  */
13340                   return;
13341                 }
13342               break;
13343
13344             case 'n':           /* Register list for 32-bit lwm and swm.  */
13345               gas_assert (mips_opts.micromips);
13346               {
13347                 /* A comma-separated list of registers and/or
13348                    dash-separated contiguous ranges including
13349                    at least one of ra and a set of one or more
13350                    registers starting at s0 up to s7 and then
13351                    s8 which have to be consecutive, e.g.:
13352
13353                    ra
13354                    s0
13355                    ra, s0, s1, s2
13356                    s0-s8
13357                    s0-s5, ra
13358
13359                    and any permutations of these.  */
13360                 unsigned int reglist;
13361                 int imm;
13362                 int ra;
13363
13364                 if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
13365                   break;
13366
13367                 if ((reglist & 0x3f00ffff) != 0)
13368                   break;
13369
13370                 ra = (reglist >> 27) & 0x10;
13371                 reglist = ((reglist >> 22) & 0x100) | ((reglist >> 16) & 0xff);
13372                 reglist += 1;
13373                 if ((reglist & -reglist) != reglist)
13374                   break;
13375
13376                 imm = (ffs (reglist) - 1) | ra;
13377                 INSERT_OPERAND (1, RT, *ip, imm);
13378                 imm_expr.X_op = O_absent;
13379               }
13380               continue;
13381
13382             case '|':           /* 4-bit trap code.  */
13383               gas_assert (mips_opts.micromips);
13384               my_getExpression (&imm_expr, s);
13385               check_absolute_expr (ip, &imm_expr);
13386               if ((unsigned long) imm_expr.X_add_number
13387                   > MICROMIPSOP_MASK_TRAP)
13388                 as_bad (_("Trap code (%lu) for %s not in 0..15 range"),
13389                         (unsigned long) imm_expr.X_add_number,
13390                         ip->insn_mo->name);
13391               INSERT_OPERAND (1, TRAP, *ip, imm_expr.X_add_number);
13392               imm_expr.X_op = O_absent;
13393               s = expr_end;
13394               continue;
13395
13396             default:
13397               as_bad (_("Bad char = '%c'\n"), *args);
13398               abort ();
13399             }
13400           break;
13401         }
13402       /* Args don't match.  */
13403       s = argsStart;
13404       insn_error = _("Illegal operands");
13405       if (insn + 1 < past && !strcmp (insn->name, insn[1].name))
13406         {
13407           ++insn;
13408           continue;
13409         }
13410       else if (wrong_delay_slot_insns && need_delay_slot_ok)
13411         {
13412           gas_assert (firstinsn);
13413           need_delay_slot_ok = FALSE;
13414           past = insn + 1;
13415           insn = firstinsn;
13416           continue;
13417         }
13418       return;
13419     }
13420 }
13421
13422 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
13423
13424 /* This routine assembles an instruction into its binary format when
13425    assembling for the mips16.  As a side effect, it sets one of the
13426    global variables imm_reloc or offset_reloc to the type of relocation
13427    to do if one of the operands is an address expression.  It also sets
13428    forced_insn_length to the resulting instruction size in bytes if the
13429    user explicitly requested a small or extended instruction.  */
13430
13431 static void
13432 mips16_ip (char *str, struct mips_cl_insn *ip)
13433 {
13434   char *s;
13435   const char *args;
13436   struct mips_opcode *insn;
13437   char *argsstart;
13438   unsigned int regno;
13439   unsigned int lastregno = 0;
13440   char *s_reset;
13441   size_t i;
13442
13443   insn_error = NULL;
13444
13445   forced_insn_length = 0;
13446
13447   for (s = str; ISLOWER (*s); ++s)
13448     ;
13449   switch (*s)
13450     {
13451     case '\0':
13452       break;
13453
13454     case ' ':
13455       *s++ = '\0';
13456       break;
13457
13458     case '.':
13459       if (s[1] == 't' && s[2] == ' ')
13460         {
13461           *s = '\0';
13462           forced_insn_length = 2;
13463           s += 3;
13464           break;
13465         }
13466       else if (s[1] == 'e' && s[2] == ' ')
13467         {
13468           *s = '\0';
13469           forced_insn_length = 4;
13470           s += 3;
13471           break;
13472         }
13473       /* Fall through.  */
13474     default:
13475       insn_error = _("unknown opcode");
13476       return;
13477     }
13478
13479   if (mips_opts.noautoextend && !forced_insn_length)
13480     forced_insn_length = 2;
13481
13482   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
13483     {
13484       insn_error = _("unrecognized opcode");
13485       return;
13486     }
13487
13488   argsstart = s;
13489   for (;;)
13490     {
13491       bfd_boolean ok;
13492
13493       gas_assert (strcmp (insn->name, str) == 0);
13494
13495       ok = is_opcode_valid_16 (insn);
13496       if (! ok)
13497         {
13498           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
13499               && strcmp (insn->name, insn[1].name) == 0)
13500             {
13501               ++insn;
13502               continue;
13503             }
13504           else
13505             {
13506               if (!insn_error)
13507                 {
13508                   static char buf[100];
13509                   sprintf (buf,
13510                            _("Opcode not supported on this processor: %s (%s)"),
13511                            mips_cpu_info_from_arch (mips_opts.arch)->name,
13512                            mips_cpu_info_from_isa (mips_opts.isa)->name);
13513                   insn_error = buf;
13514                 }
13515               return;
13516             }
13517         }
13518
13519       create_insn (ip, insn);
13520       imm_expr.X_op = O_absent;
13521       imm_reloc[0] = BFD_RELOC_UNUSED;
13522       imm_reloc[1] = BFD_RELOC_UNUSED;
13523       imm_reloc[2] = BFD_RELOC_UNUSED;
13524       imm2_expr.X_op = O_absent;
13525       offset_expr.X_op = O_absent;
13526       offset_reloc[0] = BFD_RELOC_UNUSED;
13527       offset_reloc[1] = BFD_RELOC_UNUSED;
13528       offset_reloc[2] = BFD_RELOC_UNUSED;
13529       for (args = insn->args; 1; ++args)
13530         {
13531           int c;
13532
13533           if (*s == ' ')
13534             ++s;
13535
13536           /* In this switch statement we call break if we did not find
13537              a match, continue if we did find a match, or return if we
13538              are done.  */
13539
13540           c = *args;
13541           switch (c)
13542             {
13543             case '\0':
13544               if (*s == '\0')
13545                 {
13546                   offsetT value;
13547
13548                   /* Stuff the immediate value in now, if we can.  */
13549                   if (imm_expr.X_op == O_constant
13550                       && *imm_reloc > BFD_RELOC_UNUSED
13551                       && insn->pinfo != INSN_MACRO
13552                       && calculate_reloc (*offset_reloc,
13553                                           imm_expr.X_add_number, &value))
13554                     {
13555                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
13556                                     *offset_reloc, value, forced_insn_length,
13557                                     &ip->insn_opcode);
13558                       imm_expr.X_op = O_absent;
13559                       *imm_reloc = BFD_RELOC_UNUSED;
13560                       *offset_reloc = BFD_RELOC_UNUSED;
13561                     }
13562
13563                   return;
13564                 }
13565               break;
13566
13567             case ',':
13568               if (*s++ == c)
13569                 continue;
13570               s--;
13571               switch (*++args)
13572                 {
13573                 case 'v':
13574                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13575                   continue;
13576                 case 'w':
13577                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13578                   continue;
13579                 }
13580               break;
13581
13582             case '(':
13583             case ')':
13584               if (*s++ == c)
13585                 continue;
13586               break;
13587
13588             case 'v':
13589             case 'w':
13590               if (s[0] != '$')
13591                 {
13592                   if (c == 'v')
13593                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13594                   else
13595                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13596                   ++args;
13597                   continue;
13598                 }
13599               /* Fall through.  */
13600             case 'x':
13601             case 'y':
13602             case 'z':
13603             case 'Z':
13604             case '0':
13605             case 'S':
13606             case 'R':
13607             case 'X':
13608             case 'Y':
13609               s_reset = s;
13610               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
13611                 {
13612                   if (c == 'v' || c == 'w')
13613                     {
13614                       if (c == 'v')
13615                         MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13616                       else
13617                         MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13618                       ++args;
13619                       continue;
13620                     }
13621                   break;
13622                 }
13623
13624               if (*s == ' ')
13625                 ++s;
13626               if (args[1] != *s)
13627                 {
13628                   if (c == 'v' || c == 'w')
13629                     {
13630                       regno = mips16_to_32_reg_map[lastregno];
13631                       s = s_reset;
13632                       ++args;
13633                     }
13634                 }
13635
13636               switch (c)
13637                 {
13638                 case 'x':
13639                 case 'y':
13640                 case 'z':
13641                 case 'v':
13642                 case 'w':
13643                 case 'Z':
13644                   regno = mips32_to_16_reg_map[regno];
13645                   break;
13646
13647                 case '0':
13648                   if (regno != 0)
13649                     regno = ILLEGAL_REG;
13650                   break;
13651
13652                 case 'S':
13653                   if (regno != SP)
13654                     regno = ILLEGAL_REG;
13655                   break;
13656
13657                 case 'R':
13658                   if (regno != RA)
13659                     regno = ILLEGAL_REG;
13660                   break;
13661
13662                 case 'X':
13663                 case 'Y':
13664                   if (regno == AT && mips_opts.at)
13665                     {
13666                       if (mips_opts.at == ATREG)
13667                         as_warn (_("used $at without \".set noat\""));
13668                       else
13669                         as_warn (_("used $%u with \".set at=$%u\""),
13670                                  regno, mips_opts.at);
13671                     }
13672                   break;
13673
13674                 default:
13675                   abort ();
13676                 }
13677
13678               if (regno == ILLEGAL_REG)
13679                 break;
13680
13681               switch (c)
13682                 {
13683                 case 'x':
13684                 case 'v':
13685                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
13686                   break;
13687                 case 'y':
13688                 case 'w':
13689                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
13690                   break;
13691                 case 'z':
13692                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
13693                   break;
13694                 case 'Z':
13695                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
13696                 case '0':
13697                 case 'S':
13698                 case 'R':
13699                   break;
13700                 case 'X':
13701                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
13702                   break;
13703                 case 'Y':
13704                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
13705                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
13706                   break;
13707                 default:
13708                   abort ();
13709                 }
13710
13711               lastregno = regno;
13712               continue;
13713
13714             case 'P':
13715               if (strncmp (s, "$pc", 3) == 0)
13716                 {
13717                   s += 3;
13718                   continue;
13719                 }
13720               break;
13721
13722             case '5':
13723             case 'H':
13724             case 'W':
13725             case 'D':
13726             case 'j':
13727             case 'V':
13728             case 'C':
13729             case 'U':
13730             case 'k':
13731             case 'K':
13732               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
13733               if (i > 0)
13734                 {
13735                   if (imm_expr.X_op != O_constant)
13736                     {
13737                       forced_insn_length = 4;
13738                       ip->insn_opcode |= MIPS16_EXTEND;
13739                     }
13740                   else
13741                     {
13742                       /* We need to relax this instruction.  */
13743                       *offset_reloc = *imm_reloc;
13744                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13745                     }
13746                   s = expr_end;
13747                   continue;
13748                 }
13749               *imm_reloc = BFD_RELOC_UNUSED;
13750               /* Fall through.  */
13751             case '<':
13752             case '>':
13753             case '[':
13754             case ']':
13755             case '4':
13756             case '8':
13757               my_getExpression (&imm_expr, s);
13758               if (imm_expr.X_op == O_register)
13759                 {
13760                   /* What we thought was an expression turned out to
13761                      be a register.  */
13762
13763                   if (s[0] == '(' && args[1] == '(')
13764                     {
13765                       /* It looks like the expression was omitted
13766                          before a register indirection, which means
13767                          that the expression is implicitly zero.  We
13768                          still set up imm_expr, so that we handle
13769                          explicit extensions correctly.  */
13770                       imm_expr.X_op = O_constant;
13771                       imm_expr.X_add_number = 0;
13772                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13773                       continue;
13774                     }
13775
13776                   break;
13777                 }
13778
13779               /* We need to relax this instruction.  */
13780               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13781               s = expr_end;
13782               continue;
13783
13784             case 'p':
13785             case 'q':
13786             case 'A':
13787             case 'B':
13788             case 'E':
13789               /* We use offset_reloc rather than imm_reloc for the PC
13790                  relative operands.  This lets macros with both
13791                  immediate and address operands work correctly.  */
13792               my_getExpression (&offset_expr, s);
13793
13794               if (offset_expr.X_op == O_register)
13795                 break;
13796
13797               /* We need to relax this instruction.  */
13798               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
13799               s = expr_end;
13800               continue;
13801
13802             case '6':           /* break code */
13803               my_getExpression (&imm_expr, s);
13804               check_absolute_expr (ip, &imm_expr);
13805               if ((unsigned long) imm_expr.X_add_number > 63)
13806                 as_warn (_("Invalid value for `%s' (%lu)"),
13807                          ip->insn_mo->name,
13808                          (unsigned long) imm_expr.X_add_number);
13809               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
13810               imm_expr.X_op = O_absent;
13811               s = expr_end;
13812               continue;
13813
13814             case 'a':           /* 26 bit address */
13815               my_getExpression (&offset_expr, s);
13816               s = expr_end;
13817               *offset_reloc = BFD_RELOC_MIPS16_JMP;
13818               ip->insn_opcode <<= 16;
13819               continue;
13820
13821             case 'l':           /* register list for entry macro */
13822             case 'L':           /* register list for exit macro */
13823               {
13824                 int mask;
13825
13826                 if (c == 'l')
13827                   mask = 0;
13828                 else
13829                   mask = 7 << 3;
13830                 while (*s != '\0')
13831                   {
13832                     unsigned int freg, reg1, reg2;
13833
13834                     while (*s == ' ' || *s == ',')
13835                       ++s;
13836                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
13837                       freg = 0;
13838                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
13839                       freg = 1;
13840                     else
13841                       {
13842                         as_bad (_("can't parse register list"));
13843                         break;
13844                       }
13845                     if (*s == ' ')
13846                       ++s;
13847                     if (*s != '-')
13848                       reg2 = reg1;
13849                     else
13850                       {
13851                         ++s;
13852                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
13853                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
13854                           {
13855                             as_bad (_("invalid register list"));
13856                             break;
13857                           }
13858                       }
13859                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
13860                       {
13861                         mask &= ~ (7 << 3);
13862                         mask |= 5 << 3;
13863                       }
13864                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
13865                       {
13866                         mask &= ~ (7 << 3);
13867                         mask |= 6 << 3;
13868                       }
13869                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
13870                       mask |= (reg2 - 3) << 3;
13871                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
13872                       mask |= (reg2 - 15) << 1;
13873                     else if (reg1 == RA && reg2 == RA)
13874                       mask |= 1;
13875                     else
13876                       {
13877                         as_bad (_("invalid register list"));
13878                         break;
13879                       }
13880                   }
13881                 /* The mask is filled in in the opcode table for the
13882                    benefit of the disassembler.  We remove it before
13883                    applying the actual mask.  */
13884                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
13885                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
13886               }
13887             continue;
13888
13889             case 'm':           /* Register list for save insn.  */
13890             case 'M':           /* Register list for restore insn.  */
13891               {
13892                 int opcode = ip->insn_opcode;
13893                 int framesz = 0, seen_framesz = 0;
13894                 int nargs = 0, statics = 0, sregs = 0;
13895
13896                 while (*s != '\0')
13897                   {
13898                     unsigned int reg1, reg2;
13899
13900                     SKIP_SPACE_TABS (s);
13901                     while (*s == ',')
13902                       ++s;
13903                     SKIP_SPACE_TABS (s);
13904
13905                     my_getExpression (&imm_expr, s);
13906                     if (imm_expr.X_op == O_constant)
13907                       {
13908                         /* Handle the frame size.  */
13909                         if (seen_framesz)
13910                           {
13911                             as_bad (_("more than one frame size in list"));
13912                             break;
13913                           }
13914                         seen_framesz = 1;
13915                         framesz = imm_expr.X_add_number;
13916                         imm_expr.X_op = O_absent;
13917                         s = expr_end;
13918                         continue;
13919                       }
13920
13921                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
13922                       {
13923                         as_bad (_("can't parse register list"));
13924                         break;
13925                       }
13926
13927                     while (*s == ' ')
13928                       ++s;
13929
13930                     if (*s != '-')
13931                       reg2 = reg1;
13932                     else
13933                       {
13934                         ++s;
13935                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
13936                             || reg2 < reg1)
13937                           {
13938                             as_bad (_("can't parse register list"));
13939                             break;
13940                           }
13941                       }
13942
13943                     while (reg1 <= reg2)
13944                       {
13945                         if (reg1 >= 4 && reg1 <= 7)
13946                           {
13947                             if (!seen_framesz)
13948                                 /* args $a0-$a3 */
13949                                 nargs |= 1 << (reg1 - 4);
13950                             else
13951                                 /* statics $a0-$a3 */
13952                                 statics |= 1 << (reg1 - 4);
13953                           }
13954                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
13955                           {
13956                             /* $s0-$s8 */
13957                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
13958                           }
13959                         else if (reg1 == 31)
13960                           {
13961                             /* Add $ra to insn.  */
13962                             opcode |= 0x40;
13963                           }
13964                         else
13965                           {
13966                             as_bad (_("unexpected register in list"));
13967                             break;
13968                           }
13969                         if (++reg1 == 24)
13970                           reg1 = 30;
13971                       }
13972                   }
13973
13974                 /* Encode args/statics combination.  */
13975                 if (nargs & statics)
13976                   as_bad (_("arg/static registers overlap"));
13977                 else if (nargs == 0xf)
13978                   /* All $a0-$a3 are args.  */
13979                   opcode |= MIPS16_ALL_ARGS << 16;
13980                 else if (statics == 0xf)
13981                   /* All $a0-$a3 are statics.  */
13982                   opcode |= MIPS16_ALL_STATICS << 16;
13983                 else 
13984                   {
13985                     int narg = 0, nstat = 0;
13986
13987                     /* Count arg registers.  */
13988                     while (nargs & 0x1)
13989                       {
13990                         nargs >>= 1;
13991                         narg++;
13992                       }
13993                     if (nargs != 0)
13994                       as_bad (_("invalid arg register list"));
13995
13996                     /* Count static registers.  */
13997                     while (statics & 0x8)
13998                       {
13999                         statics = (statics << 1) & 0xf;
14000                         nstat++;
14001                       }
14002                     if (statics != 0) 
14003                       as_bad (_("invalid static register list"));
14004
14005                     /* Encode args/statics.  */
14006                     opcode |= ((narg << 2) | nstat) << 16;
14007                   }
14008
14009                 /* Encode $s0/$s1.  */
14010                 if (sregs & (1 << 0))           /* $s0 */
14011                   opcode |= 0x20;
14012                 if (sregs & (1 << 1))           /* $s1 */
14013                   opcode |= 0x10;
14014                 sregs >>= 2;
14015
14016                 if (sregs != 0)
14017                   {
14018                     /* Count regs $s2-$s8.  */
14019                     int nsreg = 0;
14020                     while (sregs & 1)
14021                       {
14022                         sregs >>= 1;
14023                         nsreg++;
14024                       }
14025                     if (sregs != 0)
14026                       as_bad (_("invalid static register list"));
14027                     /* Encode $s2-$s8. */
14028                     opcode |= nsreg << 24;
14029                   }
14030
14031                 /* Encode frame size.  */
14032                 if (!seen_framesz)
14033                   as_bad (_("missing frame size"));
14034                 else if ((framesz & 7) != 0 || framesz < 0
14035                          || framesz > 0xff * 8)
14036                   as_bad (_("invalid frame size"));
14037                 else if (framesz != 128 || (opcode >> 16) != 0)
14038                   {
14039                     framesz /= 8;
14040                     opcode |= (((framesz & 0xf0) << 16)
14041                              | (framesz & 0x0f));
14042                   }
14043
14044                 /* Finally build the instruction.  */
14045                 if ((opcode >> 16) != 0 || framesz == 0)
14046                   opcode |= MIPS16_EXTEND;
14047                 ip->insn_opcode = opcode;
14048               }
14049             continue;
14050
14051             case 'e':           /* extend code */
14052               my_getExpression (&imm_expr, s);
14053               check_absolute_expr (ip, &imm_expr);
14054               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
14055                 {
14056                   as_warn (_("Invalid value for `%s' (%lu)"),
14057                            ip->insn_mo->name,
14058                            (unsigned long) imm_expr.X_add_number);
14059                   imm_expr.X_add_number &= 0x7ff;
14060                 }
14061               ip->insn_opcode |= imm_expr.X_add_number;
14062               imm_expr.X_op = O_absent;
14063               s = expr_end;
14064               continue;
14065
14066             default:
14067               abort ();
14068             }
14069           break;
14070         }
14071
14072       /* Args don't match.  */
14073       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
14074           strcmp (insn->name, insn[1].name) == 0)
14075         {
14076           ++insn;
14077           s = argsstart;
14078           continue;
14079         }
14080
14081       insn_error = _("illegal operands");
14082
14083       return;
14084     }
14085 }
14086
14087 /* This structure holds information we know about a mips16 immediate
14088    argument type.  */
14089
14090 struct mips16_immed_operand
14091 {
14092   /* The type code used in the argument string in the opcode table.  */
14093   int type;
14094   /* The number of bits in the short form of the opcode.  */
14095   int nbits;
14096   /* The number of bits in the extended form of the opcode.  */
14097   int extbits;
14098   /* The amount by which the short form is shifted when it is used;
14099      for example, the sw instruction has a shift count of 2.  */
14100   int shift;
14101   /* The amount by which the short form is shifted when it is stored
14102      into the instruction code.  */
14103   int op_shift;
14104   /* Non-zero if the short form is unsigned.  */
14105   int unsp;
14106   /* Non-zero if the extended form is unsigned.  */
14107   int extu;
14108   /* Non-zero if the value is PC relative.  */
14109   int pcrel;
14110 };
14111
14112 /* The mips16 immediate operand types.  */
14113
14114 static const struct mips16_immed_operand mips16_immed_operands[] =
14115 {
14116   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
14117   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
14118   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
14119   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
14120   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
14121   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
14122   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
14123   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
14124   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
14125   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
14126   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
14127   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
14128   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
14129   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
14130   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
14131   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
14132   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
14133   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
14134   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
14135   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
14136   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
14137 };
14138
14139 #define MIPS16_NUM_IMMED \
14140   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
14141
14142 /* Marshal immediate value VAL for an extended MIPS16 instruction.
14143    NBITS is the number of significant bits in VAL.  */
14144
14145 static unsigned long
14146 mips16_immed_extend (offsetT val, unsigned int nbits)
14147 {
14148   int extval;
14149   if (nbits == 16)
14150     {
14151       extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
14152       val &= 0x1f;
14153     }
14154   else if (nbits == 15)
14155     {
14156       extval = ((val >> 11) & 0xf) | (val & 0x7f0);
14157       val &= 0xf;
14158     }
14159   else
14160     {
14161       extval = ((val & 0x1f) << 6) | (val & 0x20);
14162       val = 0;
14163     }
14164   return (extval << 16) | val;
14165 }
14166
14167 /* Install immediate value VAL into MIPS16 instruction *INSN,
14168    extending it if necessary.  The instruction in *INSN may
14169    already be extended.
14170
14171    RELOC is the relocation that produced VAL, or BFD_RELOC_UNUSED
14172    if none.  In the former case, VAL is a 16-bit number with no
14173    defined signedness.
14174
14175    TYPE is the type of the immediate field.  USER_INSN_LENGTH
14176    is the length that the user requested, or 0 if none.  */
14177
14178 static void
14179 mips16_immed (char *file, unsigned int line, int type,
14180               bfd_reloc_code_real_type reloc, offsetT val,
14181               unsigned int user_insn_length, unsigned long *insn)
14182 {
14183   const struct mips16_immed_operand *op;
14184   int mintiny, maxtiny;
14185
14186   op = mips16_immed_operands;
14187   while (op->type != type)
14188     {
14189       ++op;
14190       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
14191     }
14192
14193   if (op->unsp)
14194     {
14195       if (type == '<' || type == '>' || type == '[' || type == ']')
14196         {
14197           mintiny = 1;
14198           maxtiny = 1 << op->nbits;
14199         }
14200       else
14201         {
14202           mintiny = 0;
14203           maxtiny = (1 << op->nbits) - 1;
14204         }
14205       if (reloc != BFD_RELOC_UNUSED)
14206         val &= 0xffff;
14207     }
14208   else
14209     {
14210       mintiny = - (1 << (op->nbits - 1));
14211       maxtiny = (1 << (op->nbits - 1)) - 1;
14212       if (reloc != BFD_RELOC_UNUSED)
14213         val = SEXT_16BIT (val);
14214     }
14215
14216   /* Branch offsets have an implicit 0 in the lowest bit.  */
14217   if (type == 'p' || type == 'q')
14218     val /= 2;
14219
14220   if ((val & ((1 << op->shift) - 1)) != 0
14221       || val < (mintiny << op->shift)
14222       || val > (maxtiny << op->shift))
14223     {
14224       /* We need an extended instruction.  */
14225       if (user_insn_length == 2)
14226         as_bad_where (file, line, _("invalid unextended operand value"));
14227       else
14228         *insn |= MIPS16_EXTEND;
14229     }
14230   else if (user_insn_length == 4)
14231     {
14232       /* The operand doesn't force an unextended instruction to be extended.
14233          Warn if the user wanted an extended instruction anyway.  */
14234       *insn |= MIPS16_EXTEND;
14235       as_warn_where (file, line,
14236                      _("extended operand requested but not required"));
14237     }
14238
14239   if (mips16_opcode_length (*insn) == 2)
14240     {
14241       int insnval;
14242
14243       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
14244       insnval <<= op->op_shift;
14245       *insn |= insnval;
14246     }
14247   else
14248     {
14249       long minext, maxext;
14250
14251       if (reloc == BFD_RELOC_UNUSED)
14252         {
14253           if (op->extu)
14254             {
14255               minext = 0;
14256               maxext = (1 << op->extbits) - 1;
14257             }
14258           else
14259             {
14260               minext = - (1 << (op->extbits - 1));
14261               maxext = (1 << (op->extbits - 1)) - 1;
14262             }
14263           if (val < minext || val > maxext)
14264             as_bad_where (file, line,
14265                           _("operand value out of range for instruction"));
14266         }
14267
14268       *insn |= mips16_immed_extend (val, op->extbits);
14269     }
14270 }
14271 \f
14272 struct percent_op_match
14273 {
14274   const char *str;
14275   bfd_reloc_code_real_type reloc;
14276 };
14277
14278 static const struct percent_op_match mips_percent_op[] =
14279 {
14280   {"%lo", BFD_RELOC_LO16},
14281 #ifdef OBJ_ELF
14282   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
14283   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
14284   {"%call16", BFD_RELOC_MIPS_CALL16},
14285   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
14286   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
14287   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
14288   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
14289   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
14290   {"%got", BFD_RELOC_MIPS_GOT16},
14291   {"%gp_rel", BFD_RELOC_GPREL16},
14292   {"%half", BFD_RELOC_16},
14293   {"%highest", BFD_RELOC_MIPS_HIGHEST},
14294   {"%higher", BFD_RELOC_MIPS_HIGHER},
14295   {"%neg", BFD_RELOC_MIPS_SUB},
14296   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
14297   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
14298   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
14299   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
14300   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
14301   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
14302   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
14303 #endif
14304   {"%hi", BFD_RELOC_HI16_S}
14305 };
14306
14307 static const struct percent_op_match mips16_percent_op[] =
14308 {
14309   {"%lo", BFD_RELOC_MIPS16_LO16},
14310   {"%gprel", BFD_RELOC_MIPS16_GPREL},
14311   {"%got", BFD_RELOC_MIPS16_GOT16},
14312   {"%call16", BFD_RELOC_MIPS16_CALL16},
14313   {"%hi", BFD_RELOC_MIPS16_HI16_S},
14314   {"%tlsgd", BFD_RELOC_MIPS16_TLS_GD},
14315   {"%tlsldm", BFD_RELOC_MIPS16_TLS_LDM},
14316   {"%dtprel_hi", BFD_RELOC_MIPS16_TLS_DTPREL_HI16},
14317   {"%dtprel_lo", BFD_RELOC_MIPS16_TLS_DTPREL_LO16},
14318   {"%tprel_hi", BFD_RELOC_MIPS16_TLS_TPREL_HI16},
14319   {"%tprel_lo", BFD_RELOC_MIPS16_TLS_TPREL_LO16},
14320   {"%gottprel", BFD_RELOC_MIPS16_TLS_GOTTPREL}
14321 };
14322
14323
14324 /* Return true if *STR points to a relocation operator.  When returning true,
14325    move *STR over the operator and store its relocation code in *RELOC.
14326    Leave both *STR and *RELOC alone when returning false.  */
14327
14328 static bfd_boolean
14329 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
14330 {
14331   const struct percent_op_match *percent_op;
14332   size_t limit, i;
14333
14334   if (mips_opts.mips16)
14335     {
14336       percent_op = mips16_percent_op;
14337       limit = ARRAY_SIZE (mips16_percent_op);
14338     }
14339   else
14340     {
14341       percent_op = mips_percent_op;
14342       limit = ARRAY_SIZE (mips_percent_op);
14343     }
14344
14345   for (i = 0; i < limit; i++)
14346     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
14347       {
14348         int len = strlen (percent_op[i].str);
14349
14350         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
14351           continue;
14352
14353         *str += strlen (percent_op[i].str);
14354         *reloc = percent_op[i].reloc;
14355
14356         /* Check whether the output BFD supports this relocation.
14357            If not, issue an error and fall back on something safe.  */
14358         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
14359           {
14360             as_bad (_("relocation %s isn't supported by the current ABI"),
14361                     percent_op[i].str);
14362             *reloc = BFD_RELOC_UNUSED;
14363           }
14364         return TRUE;
14365       }
14366   return FALSE;
14367 }
14368
14369
14370 /* Parse string STR as a 16-bit relocatable operand.  Store the
14371    expression in *EP and the relocations in the array starting
14372    at RELOC.  Return the number of relocation operators used.
14373
14374    On exit, EXPR_END points to the first character after the expression.  */
14375
14376 static size_t
14377 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
14378                        char *str)
14379 {
14380   bfd_reloc_code_real_type reversed_reloc[3];
14381   size_t reloc_index, i;
14382   int crux_depth, str_depth;
14383   char *crux;
14384
14385   /* Search for the start of the main expression, recoding relocations
14386      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
14387      of the main expression and with CRUX_DEPTH containing the number
14388      of open brackets at that point.  */
14389   reloc_index = -1;
14390   str_depth = 0;
14391   do
14392     {
14393       reloc_index++;
14394       crux = str;
14395       crux_depth = str_depth;
14396
14397       /* Skip over whitespace and brackets, keeping count of the number
14398          of brackets.  */
14399       while (*str == ' ' || *str == '\t' || *str == '(')
14400         if (*str++ == '(')
14401           str_depth++;
14402     }
14403   while (*str == '%'
14404          && reloc_index < (HAVE_NEWABI ? 3 : 1)
14405          && parse_relocation (&str, &reversed_reloc[reloc_index]));
14406
14407   my_getExpression (ep, crux);
14408   str = expr_end;
14409
14410   /* Match every open bracket.  */
14411   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
14412     if (*str++ == ')')
14413       crux_depth--;
14414
14415   if (crux_depth > 0)
14416     as_bad (_("unclosed '('"));
14417
14418   expr_end = str;
14419
14420   if (reloc_index != 0)
14421     {
14422       prev_reloc_op_frag = frag_now;
14423       for (i = 0; i < reloc_index; i++)
14424         reloc[i] = reversed_reloc[reloc_index - 1 - i];
14425     }
14426
14427   return reloc_index;
14428 }
14429
14430 static void
14431 my_getExpression (expressionS *ep, char *str)
14432 {
14433   char *save_in;
14434
14435   save_in = input_line_pointer;
14436   input_line_pointer = str;
14437   expression (ep);
14438   expr_end = input_line_pointer;
14439   input_line_pointer = save_in;
14440 }
14441
14442 char *
14443 md_atof (int type, char *litP, int *sizeP)
14444 {
14445   return ieee_md_atof (type, litP, sizeP, target_big_endian);
14446 }
14447
14448 void
14449 md_number_to_chars (char *buf, valueT val, int n)
14450 {
14451   if (target_big_endian)
14452     number_to_chars_bigendian (buf, val, n);
14453   else
14454     number_to_chars_littleendian (buf, val, n);
14455 }
14456 \f
14457 #ifdef OBJ_ELF
14458 static int support_64bit_objects(void)
14459 {
14460   const char **list, **l;
14461   int yes;
14462
14463   list = bfd_target_list ();
14464   for (l = list; *l != NULL; l++)
14465     if (strcmp (*l, ELF_TARGET ("elf64-", "big")) == 0
14466         || strcmp (*l, ELF_TARGET ("elf64-", "little")) == 0)
14467       break;
14468   yes = (*l != NULL);
14469   free (list);
14470   return yes;
14471 }
14472 #endif /* OBJ_ELF */
14473
14474 const char *md_shortopts = "O::g::G:";
14475
14476 enum options
14477   {
14478     OPTION_MARCH = OPTION_MD_BASE,
14479     OPTION_MTUNE,
14480     OPTION_MIPS1,
14481     OPTION_MIPS2,
14482     OPTION_MIPS3,
14483     OPTION_MIPS4,
14484     OPTION_MIPS5,
14485     OPTION_MIPS32,
14486     OPTION_MIPS64,
14487     OPTION_MIPS32R2,
14488     OPTION_MIPS64R2,
14489     OPTION_MIPS16,
14490     OPTION_NO_MIPS16,
14491     OPTION_MIPS3D,
14492     OPTION_NO_MIPS3D,
14493     OPTION_MDMX,
14494     OPTION_NO_MDMX,
14495     OPTION_DSP,
14496     OPTION_NO_DSP,
14497     OPTION_MT,
14498     OPTION_NO_MT,
14499     OPTION_SMARTMIPS,
14500     OPTION_NO_SMARTMIPS,
14501     OPTION_DSPR2,
14502     OPTION_NO_DSPR2,
14503     OPTION_MICROMIPS,
14504     OPTION_NO_MICROMIPS,
14505     OPTION_MCU,
14506     OPTION_NO_MCU,
14507     OPTION_COMPAT_ARCH_BASE,
14508     OPTION_M4650,
14509     OPTION_NO_M4650,
14510     OPTION_M4010,
14511     OPTION_NO_M4010,
14512     OPTION_M4100,
14513     OPTION_NO_M4100,
14514     OPTION_M3900,
14515     OPTION_NO_M3900,
14516     OPTION_M7000_HILO_FIX,
14517     OPTION_MNO_7000_HILO_FIX, 
14518     OPTION_FIX_24K,
14519     OPTION_NO_FIX_24K,
14520     OPTION_FIX_LOONGSON2F_JUMP,
14521     OPTION_NO_FIX_LOONGSON2F_JUMP,
14522     OPTION_FIX_LOONGSON2F_NOP,
14523     OPTION_NO_FIX_LOONGSON2F_NOP,
14524     OPTION_FIX_VR4120,
14525     OPTION_NO_FIX_VR4120,
14526     OPTION_FIX_VR4130,
14527     OPTION_NO_FIX_VR4130,
14528     OPTION_FIX_CN63XXP1,
14529     OPTION_NO_FIX_CN63XXP1,
14530     OPTION_TRAP,
14531     OPTION_BREAK,
14532     OPTION_EB,
14533     OPTION_EL,
14534     OPTION_FP32,
14535     OPTION_GP32,
14536     OPTION_CONSTRUCT_FLOATS,
14537     OPTION_NO_CONSTRUCT_FLOATS,
14538     OPTION_FP64,
14539     OPTION_GP64,
14540     OPTION_RELAX_BRANCH,
14541     OPTION_NO_RELAX_BRANCH,
14542     OPTION_MSHARED,
14543     OPTION_MNO_SHARED,
14544     OPTION_MSYM32,
14545     OPTION_MNO_SYM32,
14546     OPTION_SOFT_FLOAT,
14547     OPTION_HARD_FLOAT,
14548     OPTION_SINGLE_FLOAT,
14549     OPTION_DOUBLE_FLOAT,
14550     OPTION_32,
14551 #ifdef OBJ_ELF
14552     OPTION_CALL_SHARED,
14553     OPTION_CALL_NONPIC,
14554     OPTION_NON_SHARED,
14555     OPTION_XGOT,
14556     OPTION_MABI,
14557     OPTION_N32,
14558     OPTION_64,
14559     OPTION_MDEBUG,
14560     OPTION_NO_MDEBUG,
14561     OPTION_PDR,
14562     OPTION_NO_PDR,
14563     OPTION_MVXWORKS_PIC,
14564 #endif /* OBJ_ELF */
14565     OPTION_END_OF_ENUM    
14566   };
14567   
14568 struct option md_longopts[] =
14569 {
14570   /* Options which specify architecture.  */
14571   {"march", required_argument, NULL, OPTION_MARCH},
14572   {"mtune", required_argument, NULL, OPTION_MTUNE},
14573   {"mips0", no_argument, NULL, OPTION_MIPS1},
14574   {"mips1", no_argument, NULL, OPTION_MIPS1},
14575   {"mips2", no_argument, NULL, OPTION_MIPS2},
14576   {"mips3", no_argument, NULL, OPTION_MIPS3},
14577   {"mips4", no_argument, NULL, OPTION_MIPS4},
14578   {"mips5", no_argument, NULL, OPTION_MIPS5},
14579   {"mips32", no_argument, NULL, OPTION_MIPS32},
14580   {"mips64", no_argument, NULL, OPTION_MIPS64},
14581   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
14582   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
14583
14584   /* Options which specify Application Specific Extensions (ASEs).  */
14585   {"mips16", no_argument, NULL, OPTION_MIPS16},
14586   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
14587   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
14588   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
14589   {"mdmx", no_argument, NULL, OPTION_MDMX},
14590   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
14591   {"mdsp", no_argument, NULL, OPTION_DSP},
14592   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
14593   {"mmt", no_argument, NULL, OPTION_MT},
14594   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
14595   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
14596   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
14597   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
14598   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
14599   {"mmicromips", no_argument, NULL, OPTION_MICROMIPS},
14600   {"mno-micromips", no_argument, NULL, OPTION_NO_MICROMIPS},
14601   {"mmcu", no_argument, NULL, OPTION_MCU},
14602   {"mno-mcu", no_argument, NULL, OPTION_NO_MCU},
14603
14604   /* Old-style architecture options.  Don't add more of these.  */
14605   {"m4650", no_argument, NULL, OPTION_M4650},
14606   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
14607   {"m4010", no_argument, NULL, OPTION_M4010},
14608   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
14609   {"m4100", no_argument, NULL, OPTION_M4100},
14610   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
14611   {"m3900", no_argument, NULL, OPTION_M3900},
14612   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
14613
14614   /* Options which enable bug fixes.  */
14615   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
14616   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
14617   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
14618   {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
14619   {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
14620   {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
14621   {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
14622   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
14623   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
14624   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
14625   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
14626   {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
14627   {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
14628   {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
14629   {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
14630
14631   /* Miscellaneous options.  */
14632   {"trap", no_argument, NULL, OPTION_TRAP},
14633   {"no-break", no_argument, NULL, OPTION_TRAP},
14634   {"break", no_argument, NULL, OPTION_BREAK},
14635   {"no-trap", no_argument, NULL, OPTION_BREAK},
14636   {"EB", no_argument, NULL, OPTION_EB},
14637   {"EL", no_argument, NULL, OPTION_EL},
14638   {"mfp32", no_argument, NULL, OPTION_FP32},
14639   {"mgp32", no_argument, NULL, OPTION_GP32},
14640   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
14641   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
14642   {"mfp64", no_argument, NULL, OPTION_FP64},
14643   {"mgp64", no_argument, NULL, OPTION_GP64},
14644   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
14645   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
14646   {"mshared", no_argument, NULL, OPTION_MSHARED},
14647   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
14648   {"msym32", no_argument, NULL, OPTION_MSYM32},
14649   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
14650   {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
14651   {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
14652   {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
14653   {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
14654
14655   /* Strictly speaking this next option is ELF specific,
14656      but we allow it for other ports as well in order to
14657      make testing easier.  */
14658   {"32",          no_argument, NULL, OPTION_32},
14659   
14660   /* ELF-specific options.  */
14661 #ifdef OBJ_ELF
14662   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
14663   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
14664   {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
14665   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
14666   {"xgot",        no_argument, NULL, OPTION_XGOT},
14667   {"mabi", required_argument, NULL, OPTION_MABI},
14668   {"n32",         no_argument, NULL, OPTION_N32},
14669   {"64",          no_argument, NULL, OPTION_64},
14670   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
14671   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
14672   {"mpdr", no_argument, NULL, OPTION_PDR},
14673   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
14674   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
14675 #endif /* OBJ_ELF */
14676
14677   {NULL, no_argument, NULL, 0}
14678 };
14679 size_t md_longopts_size = sizeof (md_longopts);
14680
14681 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
14682    NEW_VALUE.  Warn if another value was already specified.  Note:
14683    we have to defer parsing the -march and -mtune arguments in order
14684    to handle 'from-abi' correctly, since the ABI might be specified
14685    in a later argument.  */
14686
14687 static void
14688 mips_set_option_string (const char **string_ptr, const char *new_value)
14689 {
14690   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
14691     as_warn (_("A different %s was already specified, is now %s"),
14692              string_ptr == &mips_arch_string ? "-march" : "-mtune",
14693              new_value);
14694
14695   *string_ptr = new_value;
14696 }
14697
14698 int
14699 md_parse_option (int c, char *arg)
14700 {
14701   switch (c)
14702     {
14703     case OPTION_CONSTRUCT_FLOATS:
14704       mips_disable_float_construction = 0;
14705       break;
14706
14707     case OPTION_NO_CONSTRUCT_FLOATS:
14708       mips_disable_float_construction = 1;
14709       break;
14710
14711     case OPTION_TRAP:
14712       mips_trap = 1;
14713       break;
14714
14715     case OPTION_BREAK:
14716       mips_trap = 0;
14717       break;
14718
14719     case OPTION_EB:
14720       target_big_endian = 1;
14721       break;
14722
14723     case OPTION_EL:
14724       target_big_endian = 0;
14725       break;
14726
14727     case 'O':
14728       if (arg == NULL)
14729         mips_optimize = 1;
14730       else if (arg[0] == '0')
14731         mips_optimize = 0;
14732       else if (arg[0] == '1')
14733         mips_optimize = 1;
14734       else
14735         mips_optimize = 2;
14736       break;
14737
14738     case 'g':
14739       if (arg == NULL)
14740         mips_debug = 2;
14741       else
14742         mips_debug = atoi (arg);
14743       break;
14744
14745     case OPTION_MIPS1:
14746       file_mips_isa = ISA_MIPS1;
14747       break;
14748
14749     case OPTION_MIPS2:
14750       file_mips_isa = ISA_MIPS2;
14751       break;
14752
14753     case OPTION_MIPS3:
14754       file_mips_isa = ISA_MIPS3;
14755       break;
14756
14757     case OPTION_MIPS4:
14758       file_mips_isa = ISA_MIPS4;
14759       break;
14760
14761     case OPTION_MIPS5:
14762       file_mips_isa = ISA_MIPS5;
14763       break;
14764
14765     case OPTION_MIPS32:
14766       file_mips_isa = ISA_MIPS32;
14767       break;
14768
14769     case OPTION_MIPS32R2:
14770       file_mips_isa = ISA_MIPS32R2;
14771       break;
14772
14773     case OPTION_MIPS64R2:
14774       file_mips_isa = ISA_MIPS64R2;
14775       break;
14776
14777     case OPTION_MIPS64:
14778       file_mips_isa = ISA_MIPS64;
14779       break;
14780
14781     case OPTION_MTUNE:
14782       mips_set_option_string (&mips_tune_string, arg);
14783       break;
14784
14785     case OPTION_MARCH:
14786       mips_set_option_string (&mips_arch_string, arg);
14787       break;
14788
14789     case OPTION_M4650:
14790       mips_set_option_string (&mips_arch_string, "4650");
14791       mips_set_option_string (&mips_tune_string, "4650");
14792       break;
14793
14794     case OPTION_NO_M4650:
14795       break;
14796
14797     case OPTION_M4010:
14798       mips_set_option_string (&mips_arch_string, "4010");
14799       mips_set_option_string (&mips_tune_string, "4010");
14800       break;
14801
14802     case OPTION_NO_M4010:
14803       break;
14804
14805     case OPTION_M4100:
14806       mips_set_option_string (&mips_arch_string, "4100");
14807       mips_set_option_string (&mips_tune_string, "4100");
14808       break;
14809
14810     case OPTION_NO_M4100:
14811       break;
14812
14813     case OPTION_M3900:
14814       mips_set_option_string (&mips_arch_string, "3900");
14815       mips_set_option_string (&mips_tune_string, "3900");
14816       break;
14817
14818     case OPTION_NO_M3900:
14819       break;
14820
14821     case OPTION_MDMX:
14822       mips_opts.ase_mdmx = 1;
14823       break;
14824
14825     case OPTION_NO_MDMX:
14826       mips_opts.ase_mdmx = 0;
14827       break;
14828
14829     case OPTION_DSP:
14830       mips_opts.ase_dsp = 1;
14831       mips_opts.ase_dspr2 = 0;
14832       break;
14833
14834     case OPTION_NO_DSP:
14835       mips_opts.ase_dsp = 0;
14836       mips_opts.ase_dspr2 = 0;
14837       break;
14838
14839     case OPTION_DSPR2:
14840       mips_opts.ase_dspr2 = 1;
14841       mips_opts.ase_dsp = 1;
14842       break;
14843
14844     case OPTION_NO_DSPR2:
14845       mips_opts.ase_dspr2 = 0;
14846       mips_opts.ase_dsp = 0;
14847       break;
14848
14849     case OPTION_MT:
14850       mips_opts.ase_mt = 1;
14851       break;
14852
14853     case OPTION_NO_MT:
14854       mips_opts.ase_mt = 0;
14855       break;
14856
14857     case OPTION_MCU:
14858       mips_opts.ase_mcu = 1;
14859       break;
14860
14861     case OPTION_NO_MCU:
14862       mips_opts.ase_mcu = 0;
14863       break;
14864
14865     case OPTION_MICROMIPS:
14866       if (mips_opts.mips16 == 1)
14867         {
14868           as_bad (_("-mmicromips cannot be used with -mips16"));
14869           return 0;
14870         }
14871       mips_opts.micromips = 1;
14872       mips_no_prev_insn ();
14873       break;
14874
14875     case OPTION_NO_MICROMIPS:
14876       mips_opts.micromips = 0;
14877       mips_no_prev_insn ();
14878       break;
14879
14880     case OPTION_MIPS16:
14881       if (mips_opts.micromips == 1)
14882         {
14883           as_bad (_("-mips16 cannot be used with -micromips"));
14884           return 0;
14885         }
14886       mips_opts.mips16 = 1;
14887       mips_no_prev_insn ();
14888       break;
14889
14890     case OPTION_NO_MIPS16:
14891       mips_opts.mips16 = 0;
14892       mips_no_prev_insn ();
14893       break;
14894
14895     case OPTION_MIPS3D:
14896       mips_opts.ase_mips3d = 1;
14897       break;
14898
14899     case OPTION_NO_MIPS3D:
14900       mips_opts.ase_mips3d = 0;
14901       break;
14902
14903     case OPTION_SMARTMIPS:
14904       mips_opts.ase_smartmips = 1;
14905       break;
14906
14907     case OPTION_NO_SMARTMIPS:
14908       mips_opts.ase_smartmips = 0;
14909       break;
14910
14911     case OPTION_FIX_24K:
14912       mips_fix_24k = 1;
14913       break;
14914
14915     case OPTION_NO_FIX_24K:
14916       mips_fix_24k = 0;
14917       break;
14918
14919     case OPTION_FIX_LOONGSON2F_JUMP:
14920       mips_fix_loongson2f_jump = TRUE;
14921       break;
14922
14923     case OPTION_NO_FIX_LOONGSON2F_JUMP:
14924       mips_fix_loongson2f_jump = FALSE;
14925       break;
14926
14927     case OPTION_FIX_LOONGSON2F_NOP:
14928       mips_fix_loongson2f_nop = TRUE;
14929       break;
14930
14931     case OPTION_NO_FIX_LOONGSON2F_NOP:
14932       mips_fix_loongson2f_nop = FALSE;
14933       break;
14934
14935     case OPTION_FIX_VR4120:
14936       mips_fix_vr4120 = 1;
14937       break;
14938
14939     case OPTION_NO_FIX_VR4120:
14940       mips_fix_vr4120 = 0;
14941       break;
14942
14943     case OPTION_FIX_VR4130:
14944       mips_fix_vr4130 = 1;
14945       break;
14946
14947     case OPTION_NO_FIX_VR4130:
14948       mips_fix_vr4130 = 0;
14949       break;
14950
14951     case OPTION_FIX_CN63XXP1:
14952       mips_fix_cn63xxp1 = TRUE;
14953       break;
14954
14955     case OPTION_NO_FIX_CN63XXP1:
14956       mips_fix_cn63xxp1 = FALSE;
14957       break;
14958
14959     case OPTION_RELAX_BRANCH:
14960       mips_relax_branch = 1;
14961       break;
14962
14963     case OPTION_NO_RELAX_BRANCH:
14964       mips_relax_branch = 0;
14965       break;
14966
14967     case OPTION_MSHARED:
14968       mips_in_shared = TRUE;
14969       break;
14970
14971     case OPTION_MNO_SHARED:
14972       mips_in_shared = FALSE;
14973       break;
14974
14975     case OPTION_MSYM32:
14976       mips_opts.sym32 = TRUE;
14977       break;
14978
14979     case OPTION_MNO_SYM32:
14980       mips_opts.sym32 = FALSE;
14981       break;
14982
14983 #ifdef OBJ_ELF
14984       /* When generating ELF code, we permit -KPIC and -call_shared to
14985          select SVR4_PIC, and -non_shared to select no PIC.  This is
14986          intended to be compatible with Irix 5.  */
14987     case OPTION_CALL_SHARED:
14988       if (!IS_ELF)
14989         {
14990           as_bad (_("-call_shared is supported only for ELF format"));
14991           return 0;
14992         }
14993       mips_pic = SVR4_PIC;
14994       mips_abicalls = TRUE;
14995       break;
14996
14997     case OPTION_CALL_NONPIC:
14998       if (!IS_ELF)
14999         {
15000           as_bad (_("-call_nonpic is supported only for ELF format"));
15001           return 0;
15002         }
15003       mips_pic = NO_PIC;
15004       mips_abicalls = TRUE;
15005       break;
15006
15007     case OPTION_NON_SHARED:
15008       if (!IS_ELF)
15009         {
15010           as_bad (_("-non_shared is supported only for ELF format"));
15011           return 0;
15012         }
15013       mips_pic = NO_PIC;
15014       mips_abicalls = FALSE;
15015       break;
15016
15017       /* The -xgot option tells the assembler to use 32 bit offsets
15018          when accessing the got in SVR4_PIC mode.  It is for Irix
15019          compatibility.  */
15020     case OPTION_XGOT:
15021       mips_big_got = 1;
15022       break;
15023 #endif /* OBJ_ELF */
15024
15025     case 'G':
15026       g_switch_value = atoi (arg);
15027       g_switch_seen = 1;
15028       break;
15029
15030       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
15031          and -mabi=64.  */
15032     case OPTION_32:
15033       if (IS_ELF)
15034         mips_abi = O32_ABI;
15035       /* We silently ignore -32 for non-ELF targets.  This greatly
15036          simplifies the construction of the MIPS GAS test cases.  */
15037       break;
15038
15039 #ifdef OBJ_ELF
15040     case OPTION_N32:
15041       if (!IS_ELF)
15042         {
15043           as_bad (_("-n32 is supported for ELF format only"));
15044           return 0;
15045         }
15046       mips_abi = N32_ABI;
15047       break;
15048
15049     case OPTION_64:
15050       if (!IS_ELF)
15051         {
15052           as_bad (_("-64 is supported for ELF format only"));
15053           return 0;
15054         }
15055       mips_abi = N64_ABI;
15056       if (!support_64bit_objects())
15057         as_fatal (_("No compiled in support for 64 bit object file format"));
15058       break;
15059 #endif /* OBJ_ELF */
15060
15061     case OPTION_GP32:
15062       file_mips_gp32 = 1;
15063       break;
15064
15065     case OPTION_GP64:
15066       file_mips_gp32 = 0;
15067       break;
15068
15069     case OPTION_FP32:
15070       file_mips_fp32 = 1;
15071       break;
15072
15073     case OPTION_FP64:
15074       file_mips_fp32 = 0;
15075       break;
15076
15077     case OPTION_SINGLE_FLOAT:
15078       file_mips_single_float = 1;
15079       break;
15080
15081     case OPTION_DOUBLE_FLOAT:
15082       file_mips_single_float = 0;
15083       break;
15084
15085     case OPTION_SOFT_FLOAT:
15086       file_mips_soft_float = 1;
15087       break;
15088
15089     case OPTION_HARD_FLOAT:
15090       file_mips_soft_float = 0;
15091       break;
15092
15093 #ifdef OBJ_ELF
15094     case OPTION_MABI:
15095       if (!IS_ELF)
15096         {
15097           as_bad (_("-mabi is supported for ELF format only"));
15098           return 0;
15099         }
15100       if (strcmp (arg, "32") == 0)
15101         mips_abi = O32_ABI;
15102       else if (strcmp (arg, "o64") == 0)
15103         mips_abi = O64_ABI;
15104       else if (strcmp (arg, "n32") == 0)
15105         mips_abi = N32_ABI;
15106       else if (strcmp (arg, "64") == 0)
15107         {
15108           mips_abi = N64_ABI;
15109           if (! support_64bit_objects())
15110             as_fatal (_("No compiled in support for 64 bit object file "
15111                         "format"));
15112         }
15113       else if (strcmp (arg, "eabi") == 0)
15114         mips_abi = EABI_ABI;
15115       else
15116         {
15117           as_fatal (_("invalid abi -mabi=%s"), arg);
15118           return 0;
15119         }
15120       break;
15121 #endif /* OBJ_ELF */
15122
15123     case OPTION_M7000_HILO_FIX:
15124       mips_7000_hilo_fix = TRUE;
15125       break;
15126
15127     case OPTION_MNO_7000_HILO_FIX:
15128       mips_7000_hilo_fix = FALSE;
15129       break;
15130
15131 #ifdef OBJ_ELF
15132     case OPTION_MDEBUG:
15133       mips_flag_mdebug = TRUE;
15134       break;
15135
15136     case OPTION_NO_MDEBUG:
15137       mips_flag_mdebug = FALSE;
15138       break;
15139
15140     case OPTION_PDR:
15141       mips_flag_pdr = TRUE;
15142       break;
15143
15144     case OPTION_NO_PDR:
15145       mips_flag_pdr = FALSE;
15146       break;
15147
15148     case OPTION_MVXWORKS_PIC:
15149       mips_pic = VXWORKS_PIC;
15150       break;
15151 #endif /* OBJ_ELF */
15152
15153     default:
15154       return 0;
15155     }
15156
15157     mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
15158
15159   return 1;
15160 }
15161 \f
15162 /* Set up globals to generate code for the ISA or processor
15163    described by INFO.  */
15164
15165 static void
15166 mips_set_architecture (const struct mips_cpu_info *info)
15167 {
15168   if (info != 0)
15169     {
15170       file_mips_arch = info->cpu;
15171       mips_opts.arch = info->cpu;
15172       mips_opts.isa = info->isa;
15173     }
15174 }
15175
15176
15177 /* Likewise for tuning.  */
15178
15179 static void
15180 mips_set_tune (const struct mips_cpu_info *info)
15181 {
15182   if (info != 0)
15183     mips_tune = info->cpu;
15184 }
15185
15186
15187 void
15188 mips_after_parse_args (void)
15189 {
15190   const struct mips_cpu_info *arch_info = 0;
15191   const struct mips_cpu_info *tune_info = 0;
15192
15193   /* GP relative stuff not working for PE */
15194   if (strncmp (TARGET_OS, "pe", 2) == 0)
15195     {
15196       if (g_switch_seen && g_switch_value != 0)
15197         as_bad (_("-G not supported in this configuration."));
15198       g_switch_value = 0;
15199     }
15200
15201   if (mips_abi == NO_ABI)
15202     mips_abi = MIPS_DEFAULT_ABI;
15203
15204   /* The following code determines the architecture and register size.
15205      Similar code was added to GCC 3.3 (see override_options() in
15206      config/mips/mips.c).  The GAS and GCC code should be kept in sync
15207      as much as possible.  */
15208
15209   if (mips_arch_string != 0)
15210     arch_info = mips_parse_cpu ("-march", mips_arch_string);
15211
15212   if (file_mips_isa != ISA_UNKNOWN)
15213     {
15214       /* Handle -mipsN.  At this point, file_mips_isa contains the
15215          ISA level specified by -mipsN, while arch_info->isa contains
15216          the -march selection (if any).  */
15217       if (arch_info != 0)
15218         {
15219           /* -march takes precedence over -mipsN, since it is more descriptive.
15220              There's no harm in specifying both as long as the ISA levels
15221              are the same.  */
15222           if (file_mips_isa != arch_info->isa)
15223             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
15224                     mips_cpu_info_from_isa (file_mips_isa)->name,
15225                     mips_cpu_info_from_isa (arch_info->isa)->name);
15226         }
15227       else
15228         arch_info = mips_cpu_info_from_isa (file_mips_isa);
15229     }
15230
15231   if (arch_info == 0)
15232     {
15233       arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
15234       gas_assert (arch_info);
15235     }
15236
15237   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
15238     as_bad (_("-march=%s is not compatible with the selected ABI"),
15239             arch_info->name);
15240
15241   mips_set_architecture (arch_info);
15242
15243   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
15244   if (mips_tune_string != 0)
15245     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
15246
15247   if (tune_info == 0)
15248     mips_set_tune (arch_info);
15249   else
15250     mips_set_tune (tune_info);
15251
15252   if (file_mips_gp32 >= 0)
15253     {
15254       /* The user specified the size of the integer registers.  Make sure
15255          it agrees with the ABI and ISA.  */
15256       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
15257         as_bad (_("-mgp64 used with a 32-bit processor"));
15258       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
15259         as_bad (_("-mgp32 used with a 64-bit ABI"));
15260       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
15261         as_bad (_("-mgp64 used with a 32-bit ABI"));
15262     }
15263   else
15264     {
15265       /* Infer the integer register size from the ABI and processor.
15266          Restrict ourselves to 32-bit registers if that's all the
15267          processor has, or if the ABI cannot handle 64-bit registers.  */
15268       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
15269                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
15270     }
15271
15272   switch (file_mips_fp32)
15273     {
15274     default:
15275     case -1:
15276       /* No user specified float register size.
15277          ??? GAS treats single-float processors as though they had 64-bit
15278          float registers (although it complains when double-precision
15279          instructions are used).  As things stand, saying they have 32-bit
15280          registers would lead to spurious "register must be even" messages.
15281          So here we assume float registers are never smaller than the
15282          integer ones.  */
15283       if (file_mips_gp32 == 0)
15284         /* 64-bit integer registers implies 64-bit float registers.  */
15285         file_mips_fp32 = 0;
15286       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
15287                && ISA_HAS_64BIT_FPRS (mips_opts.isa))
15288         /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
15289         file_mips_fp32 = 0;
15290       else
15291         /* 32-bit float registers.  */
15292         file_mips_fp32 = 1;
15293       break;
15294
15295     /* The user specified the size of the float registers.  Check if it
15296        agrees with the ABI and ISA.  */
15297     case 0:
15298       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
15299         as_bad (_("-mfp64 used with a 32-bit fpu"));
15300       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
15301                && !ISA_HAS_MXHC1 (mips_opts.isa))
15302         as_warn (_("-mfp64 used with a 32-bit ABI"));
15303       break;
15304     case 1:
15305       if (ABI_NEEDS_64BIT_REGS (mips_abi))
15306         as_warn (_("-mfp32 used with a 64-bit ABI"));
15307       break;
15308     }
15309
15310   /* End of GCC-shared inference code.  */
15311
15312   /* This flag is set when we have a 64-bit capable CPU but use only
15313      32-bit wide registers.  Note that EABI does not use it.  */
15314   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
15315       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
15316           || mips_abi == O32_ABI))
15317     mips_32bitmode = 1;
15318
15319   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
15320     as_bad (_("trap exception not supported at ISA 1"));
15321
15322   /* If the selected architecture includes support for ASEs, enable
15323      generation of code for them.  */
15324   if (mips_opts.mips16 == -1)
15325     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
15326   if (mips_opts.micromips == -1)
15327     mips_opts.micromips = (CPU_HAS_MICROMIPS (file_mips_arch)) ? 1 : 0;
15328   if (mips_opts.ase_mips3d == -1)
15329     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
15330                             && file_mips_fp32 == 0) ? 1 : 0;
15331   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
15332     as_bad (_("-mfp32 used with -mips3d"));
15333
15334   if (mips_opts.ase_mdmx == -1)
15335     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
15336                           && file_mips_fp32 == 0) ? 1 : 0;
15337   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
15338     as_bad (_("-mfp32 used with -mdmx"));
15339
15340   if (mips_opts.ase_smartmips == -1)
15341     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
15342   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
15343     as_warn (_("%s ISA does not support SmartMIPS"), 
15344              mips_cpu_info_from_isa (mips_opts.isa)->name);
15345
15346   if (mips_opts.ase_dsp == -1)
15347     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
15348   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
15349     as_warn (_("%s ISA does not support DSP ASE"), 
15350              mips_cpu_info_from_isa (mips_opts.isa)->name);
15351
15352   if (mips_opts.ase_dspr2 == -1)
15353     {
15354       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
15355       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
15356     }
15357   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
15358     as_warn (_("%s ISA does not support DSP R2 ASE"),
15359              mips_cpu_info_from_isa (mips_opts.isa)->name);
15360
15361   if (mips_opts.ase_mt == -1)
15362     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
15363   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
15364     as_warn (_("%s ISA does not support MT ASE"),
15365              mips_cpu_info_from_isa (mips_opts.isa)->name);
15366
15367   if (mips_opts.ase_mcu == -1)
15368     mips_opts.ase_mcu = (arch_info->flags & MIPS_CPU_ASE_MCU) ? 1 : 0;
15369   if (mips_opts.ase_mcu && !ISA_SUPPORTS_MCU_ASE)
15370       as_warn (_("%s ISA does not support MCU ASE"),
15371                mips_cpu_info_from_isa (mips_opts.isa)->name);
15372
15373   file_mips_isa = mips_opts.isa;
15374   file_ase_mips3d = mips_opts.ase_mips3d;
15375   file_ase_mdmx = mips_opts.ase_mdmx;
15376   file_ase_smartmips = mips_opts.ase_smartmips;
15377   file_ase_dsp = mips_opts.ase_dsp;
15378   file_ase_dspr2 = mips_opts.ase_dspr2;
15379   file_ase_mt = mips_opts.ase_mt;
15380   mips_opts.gp32 = file_mips_gp32;
15381   mips_opts.fp32 = file_mips_fp32;
15382   mips_opts.soft_float = file_mips_soft_float;
15383   mips_opts.single_float = file_mips_single_float;
15384
15385   if (mips_flag_mdebug < 0)
15386     {
15387 #ifdef OBJ_MAYBE_ECOFF
15388       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
15389         mips_flag_mdebug = 1;
15390       else
15391 #endif /* OBJ_MAYBE_ECOFF */
15392         mips_flag_mdebug = 0;
15393     }
15394 }
15395 \f
15396 void
15397 mips_init_after_args (void)
15398 {
15399   /* initialize opcodes */
15400   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
15401   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
15402 }
15403
15404 long
15405 md_pcrel_from (fixS *fixP)
15406 {
15407   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
15408   switch (fixP->fx_r_type)
15409     {
15410     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15411     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15412       /* Return the address of the delay slot.  */
15413       return addr + 2;
15414
15415     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15416     case BFD_RELOC_MICROMIPS_JMP:
15417     case BFD_RELOC_16_PCREL_S2:
15418     case BFD_RELOC_MIPS_JMP:
15419       /* Return the address of the delay slot.  */
15420       return addr + 4;
15421
15422     case BFD_RELOC_32_PCREL:
15423       return addr;
15424
15425     default:
15426       /* We have no relocation type for PC relative MIPS16 instructions.  */
15427       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
15428         as_bad_where (fixP->fx_file, fixP->fx_line,
15429                       _("PC relative MIPS16 instruction references a different section"));
15430       return addr;
15431     }
15432 }
15433
15434 /* This is called before the symbol table is processed.  In order to
15435    work with gcc when using mips-tfile, we must keep all local labels.
15436    However, in other cases, we want to discard them.  If we were
15437    called with -g, but we didn't see any debugging information, it may
15438    mean that gcc is smuggling debugging information through to
15439    mips-tfile, in which case we must generate all local labels.  */
15440
15441 void
15442 mips_frob_file_before_adjust (void)
15443 {
15444 #ifndef NO_ECOFF_DEBUGGING
15445   if (ECOFF_DEBUGGING
15446       && mips_debug != 0
15447       && ! ecoff_debugging_seen)
15448     flag_keep_locals = 1;
15449 #endif
15450 }
15451
15452 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
15453    the corresponding LO16 reloc.  This is called before md_apply_fix and
15454    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
15455    relocation operators.
15456
15457    For our purposes, a %lo() expression matches a %got() or %hi()
15458    expression if:
15459
15460       (a) it refers to the same symbol; and
15461       (b) the offset applied in the %lo() expression is no lower than
15462           the offset applied in the %got() or %hi().
15463
15464    (b) allows us to cope with code like:
15465
15466         lui     $4,%hi(foo)
15467         lh      $4,%lo(foo+2)($4)
15468
15469    ...which is legal on RELA targets, and has a well-defined behaviour
15470    if the user knows that adding 2 to "foo" will not induce a carry to
15471    the high 16 bits.
15472
15473    When several %lo()s match a particular %got() or %hi(), we use the
15474    following rules to distinguish them:
15475
15476      (1) %lo()s with smaller offsets are a better match than %lo()s with
15477          higher offsets.
15478
15479      (2) %lo()s with no matching %got() or %hi() are better than those
15480          that already have a matching %got() or %hi().
15481
15482      (3) later %lo()s are better than earlier %lo()s.
15483
15484    These rules are applied in order.
15485
15486    (1) means, among other things, that %lo()s with identical offsets are
15487    chosen if they exist.
15488
15489    (2) means that we won't associate several high-part relocations with
15490    the same low-part relocation unless there's no alternative.  Having
15491    several high parts for the same low part is a GNU extension; this rule
15492    allows careful users to avoid it.
15493
15494    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
15495    with the last high-part relocation being at the front of the list.
15496    It therefore makes sense to choose the last matching low-part
15497    relocation, all other things being equal.  It's also easier
15498    to code that way.  */
15499
15500 void
15501 mips_frob_file (void)
15502 {
15503   struct mips_hi_fixup *l;
15504   bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
15505
15506   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
15507     {
15508       segment_info_type *seginfo;
15509       bfd_boolean matched_lo_p;
15510       fixS **hi_pos, **lo_pos, **pos;
15511
15512       gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
15513
15514       /* If a GOT16 relocation turns out to be against a global symbol,
15515          there isn't supposed to be a matching LO.  Ignore %gots against
15516          constants; we'll report an error for those later.  */
15517       if (got16_reloc_p (l->fixp->fx_r_type)
15518           && !(l->fixp->fx_addsy
15519                && pic_need_relax (l->fixp->fx_addsy, l->seg)))
15520         continue;
15521
15522       /* Check quickly whether the next fixup happens to be a matching %lo.  */
15523       if (fixup_has_matching_lo_p (l->fixp))
15524         continue;
15525
15526       seginfo = seg_info (l->seg);
15527
15528       /* Set HI_POS to the position of this relocation in the chain.
15529          Set LO_POS to the position of the chosen low-part relocation.
15530          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
15531          relocation that matches an immediately-preceding high-part
15532          relocation.  */
15533       hi_pos = NULL;
15534       lo_pos = NULL;
15535       matched_lo_p = FALSE;
15536       looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
15537
15538       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
15539         {
15540           if (*pos == l->fixp)
15541             hi_pos = pos;
15542
15543           if ((*pos)->fx_r_type == looking_for_rtype
15544               && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
15545               && (*pos)->fx_offset >= l->fixp->fx_offset
15546               && (lo_pos == NULL
15547                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
15548                   || (!matched_lo_p
15549                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
15550             lo_pos = pos;
15551
15552           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
15553                           && fixup_has_matching_lo_p (*pos));
15554         }
15555
15556       /* If we found a match, remove the high-part relocation from its
15557          current position and insert it before the low-part relocation.
15558          Make the offsets match so that fixup_has_matching_lo_p()
15559          will return true.
15560
15561          We don't warn about unmatched high-part relocations since some
15562          versions of gcc have been known to emit dead "lui ...%hi(...)"
15563          instructions.  */
15564       if (lo_pos != NULL)
15565         {
15566           l->fixp->fx_offset = (*lo_pos)->fx_offset;
15567           if (l->fixp->fx_next != *lo_pos)
15568             {
15569               *hi_pos = l->fixp->fx_next;
15570               l->fixp->fx_next = *lo_pos;
15571               *lo_pos = l->fixp;
15572             }
15573         }
15574     }
15575 }
15576
15577 int
15578 mips_force_relocation (fixS *fixp)
15579 {
15580   if (generic_force_reloc (fixp))
15581     return 1;
15582
15583   /* We want to keep BFD_RELOC_MICROMIPS_*_PCREL_S1 relocation,
15584      so that the linker relaxation can update targets.  */
15585   if (fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15586       || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15587       || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1)
15588     return 1;
15589
15590   return 0;
15591 }
15592
15593 /* Read the instruction associated with RELOC from BUF.  */
15594
15595 static unsigned int
15596 read_reloc_insn (char *buf, bfd_reloc_code_real_type reloc)
15597 {
15598   if (mips16_reloc_p (reloc) || micromips_reloc_p (reloc))
15599     return read_compressed_insn (buf, 4);
15600   else
15601     return read_insn (buf);
15602 }
15603
15604 /* Write instruction INSN to BUF, given that it has been relocated
15605    by RELOC.  */
15606
15607 static void
15608 write_reloc_insn (char *buf, bfd_reloc_code_real_type reloc,
15609                   unsigned long insn)
15610 {
15611   if (mips16_reloc_p (reloc) || micromips_reloc_p (reloc))
15612     write_compressed_insn (buf, insn, 4);
15613   else
15614     write_insn (buf, insn);
15615 }
15616
15617 /* Apply a fixup to the object file.  */
15618
15619 void
15620 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
15621 {
15622   char *buf;
15623   unsigned long insn;
15624   reloc_howto_type *howto;
15625
15626   /* We ignore generic BFD relocations we don't know about.  */
15627   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
15628   if (! howto)
15629     return;
15630
15631   gas_assert (fixP->fx_size == 2
15632               || fixP->fx_size == 4
15633               || fixP->fx_r_type == BFD_RELOC_16
15634               || fixP->fx_r_type == BFD_RELOC_64
15635               || fixP->fx_r_type == BFD_RELOC_CTOR
15636               || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
15637               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_SUB
15638               || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
15639               || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
15640               || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
15641
15642   buf = fixP->fx_frag->fr_literal + fixP->fx_where;
15643
15644   gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
15645               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15646               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15647               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1
15648               || fixP->fx_r_type == BFD_RELOC_32_PCREL);
15649
15650   /* Don't treat parts of a composite relocation as done.  There are two
15651      reasons for this:
15652
15653      (1) The second and third parts will be against 0 (RSS_UNDEF) but
15654          should nevertheless be emitted if the first part is.
15655
15656      (2) In normal usage, composite relocations are never assembly-time
15657          constants.  The easiest way of dealing with the pathological
15658          exceptions is to generate a relocation against STN_UNDEF and
15659          leave everything up to the linker.  */
15660   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
15661     fixP->fx_done = 1;
15662
15663   switch (fixP->fx_r_type)
15664     {
15665     case BFD_RELOC_MIPS_TLS_GD:
15666     case BFD_RELOC_MIPS_TLS_LDM:
15667     case BFD_RELOC_MIPS_TLS_DTPREL32:
15668     case BFD_RELOC_MIPS_TLS_DTPREL64:
15669     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
15670     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
15671     case BFD_RELOC_MIPS_TLS_GOTTPREL:
15672     case BFD_RELOC_MIPS_TLS_TPREL32:
15673     case BFD_RELOC_MIPS_TLS_TPREL64:
15674     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
15675     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
15676     case BFD_RELOC_MICROMIPS_TLS_GD:
15677     case BFD_RELOC_MICROMIPS_TLS_LDM:
15678     case BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16:
15679     case BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16:
15680     case BFD_RELOC_MICROMIPS_TLS_GOTTPREL:
15681     case BFD_RELOC_MICROMIPS_TLS_TPREL_HI16:
15682     case BFD_RELOC_MICROMIPS_TLS_TPREL_LO16:
15683     case BFD_RELOC_MIPS16_TLS_GD:
15684     case BFD_RELOC_MIPS16_TLS_LDM:
15685     case BFD_RELOC_MIPS16_TLS_DTPREL_HI16:
15686     case BFD_RELOC_MIPS16_TLS_DTPREL_LO16:
15687     case BFD_RELOC_MIPS16_TLS_GOTTPREL:
15688     case BFD_RELOC_MIPS16_TLS_TPREL_HI16:
15689     case BFD_RELOC_MIPS16_TLS_TPREL_LO16:
15690       if (!fixP->fx_addsy)
15691         {
15692           as_bad_where (fixP->fx_file, fixP->fx_line,
15693                         _("TLS relocation against a constant"));
15694           break;
15695         }
15696       S_SET_THREAD_LOCAL (fixP->fx_addsy);
15697       /* fall through */
15698
15699     case BFD_RELOC_MIPS_JMP:
15700     case BFD_RELOC_MIPS_SHIFT5:
15701     case BFD_RELOC_MIPS_SHIFT6:
15702     case BFD_RELOC_MIPS_GOT_DISP:
15703     case BFD_RELOC_MIPS_GOT_PAGE:
15704     case BFD_RELOC_MIPS_GOT_OFST:
15705     case BFD_RELOC_MIPS_SUB:
15706     case BFD_RELOC_MIPS_INSERT_A:
15707     case BFD_RELOC_MIPS_INSERT_B:
15708     case BFD_RELOC_MIPS_DELETE:
15709     case BFD_RELOC_MIPS_HIGHEST:
15710     case BFD_RELOC_MIPS_HIGHER:
15711     case BFD_RELOC_MIPS_SCN_DISP:
15712     case BFD_RELOC_MIPS_REL16:
15713     case BFD_RELOC_MIPS_RELGOT:
15714     case BFD_RELOC_MIPS_JALR:
15715     case BFD_RELOC_HI16:
15716     case BFD_RELOC_HI16_S:
15717     case BFD_RELOC_LO16:
15718     case BFD_RELOC_GPREL16:
15719     case BFD_RELOC_MIPS_LITERAL:
15720     case BFD_RELOC_MIPS_CALL16:
15721     case BFD_RELOC_MIPS_GOT16:
15722     case BFD_RELOC_GPREL32:
15723     case BFD_RELOC_MIPS_GOT_HI16:
15724     case BFD_RELOC_MIPS_GOT_LO16:
15725     case BFD_RELOC_MIPS_CALL_HI16:
15726     case BFD_RELOC_MIPS_CALL_LO16:
15727     case BFD_RELOC_MIPS16_GPREL:
15728     case BFD_RELOC_MIPS16_GOT16:
15729     case BFD_RELOC_MIPS16_CALL16:
15730     case BFD_RELOC_MIPS16_HI16:
15731     case BFD_RELOC_MIPS16_HI16_S:
15732     case BFD_RELOC_MIPS16_LO16:
15733     case BFD_RELOC_MIPS16_JMP:
15734     case BFD_RELOC_MICROMIPS_JMP:
15735     case BFD_RELOC_MICROMIPS_GOT_DISP:
15736     case BFD_RELOC_MICROMIPS_GOT_PAGE:
15737     case BFD_RELOC_MICROMIPS_GOT_OFST:
15738     case BFD_RELOC_MICROMIPS_SUB:
15739     case BFD_RELOC_MICROMIPS_HIGHEST:
15740     case BFD_RELOC_MICROMIPS_HIGHER:
15741     case BFD_RELOC_MICROMIPS_SCN_DISP:
15742     case BFD_RELOC_MICROMIPS_JALR:
15743     case BFD_RELOC_MICROMIPS_HI16:
15744     case BFD_RELOC_MICROMIPS_HI16_S:
15745     case BFD_RELOC_MICROMIPS_LO16:
15746     case BFD_RELOC_MICROMIPS_GPREL16:
15747     case BFD_RELOC_MICROMIPS_LITERAL:
15748     case BFD_RELOC_MICROMIPS_CALL16:
15749     case BFD_RELOC_MICROMIPS_GOT16:
15750     case BFD_RELOC_MICROMIPS_GOT_HI16:
15751     case BFD_RELOC_MICROMIPS_GOT_LO16:
15752     case BFD_RELOC_MICROMIPS_CALL_HI16:
15753     case BFD_RELOC_MICROMIPS_CALL_LO16:
15754       if (fixP->fx_done)
15755         {
15756           offsetT value;
15757
15758           if (calculate_reloc (fixP->fx_r_type, *valP, &value))
15759             {
15760               insn = read_reloc_insn (buf, fixP->fx_r_type);
15761               if (mips16_reloc_p (fixP->fx_r_type))
15762                 insn |= mips16_immed_extend (value, 16);
15763               else
15764                 insn |= (value & 0xffff);
15765               write_reloc_insn (buf, fixP->fx_r_type, insn);
15766             }
15767           else
15768             as_bad_where (fixP->fx_file, fixP->fx_line,
15769                           _("Unsupported constant in relocation"));
15770         }
15771       break;
15772
15773     case BFD_RELOC_64:
15774       /* This is handled like BFD_RELOC_32, but we output a sign
15775          extended value if we are only 32 bits.  */
15776       if (fixP->fx_done)
15777         {
15778           if (8 <= sizeof (valueT))
15779             md_number_to_chars (buf, *valP, 8);
15780           else
15781             {
15782               valueT hiv;
15783
15784               if ((*valP & 0x80000000) != 0)
15785                 hiv = 0xffffffff;
15786               else
15787                 hiv = 0;
15788               md_number_to_chars (buf + (target_big_endian ? 4 : 0), *valP, 4);
15789               md_number_to_chars (buf + (target_big_endian ? 0 : 4), hiv, 4);
15790             }
15791         }
15792       break;
15793
15794     case BFD_RELOC_RVA:
15795     case BFD_RELOC_32:
15796     case BFD_RELOC_32_PCREL:
15797     case BFD_RELOC_16:
15798       /* If we are deleting this reloc entry, we must fill in the
15799          value now.  This can happen if we have a .word which is not
15800          resolved when it appears but is later defined.  */
15801       if (fixP->fx_done)
15802         md_number_to_chars (buf, *valP, fixP->fx_size);
15803       break;
15804
15805     case BFD_RELOC_16_PCREL_S2:
15806       if ((*valP & 0x3) != 0)
15807         as_bad_where (fixP->fx_file, fixP->fx_line,
15808                       _("Branch to misaligned address (%lx)"), (long) *valP);
15809
15810       /* We need to save the bits in the instruction since fixup_segment()
15811          might be deleting the relocation entry (i.e., a branch within
15812          the current segment).  */
15813       if (! fixP->fx_done)
15814         break;
15815
15816       /* Update old instruction data.  */
15817       insn = read_insn (buf);
15818
15819       if (*valP + 0x20000 <= 0x3ffff)
15820         {
15821           insn |= (*valP >> 2) & 0xffff;
15822           write_insn (buf, insn);
15823         }
15824       else if (mips_pic == NO_PIC
15825                && fixP->fx_done
15826                && fixP->fx_frag->fr_address >= text_section->vma
15827                && (fixP->fx_frag->fr_address
15828                    < text_section->vma + bfd_get_section_size (text_section))
15829                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
15830                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
15831                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
15832         {
15833           /* The branch offset is too large.  If this is an
15834              unconditional branch, and we are not generating PIC code,
15835              we can convert it to an absolute jump instruction.  */
15836           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
15837             insn = 0x0c000000;  /* jal */
15838           else
15839             insn = 0x08000000;  /* j */
15840           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
15841           fixP->fx_done = 0;
15842           fixP->fx_addsy = section_symbol (text_section);
15843           *valP += md_pcrel_from (fixP);
15844           write_insn (buf, insn);
15845         }
15846       else
15847         {
15848           /* If we got here, we have branch-relaxation disabled,
15849              and there's nothing we can do to fix this instruction
15850              without turning it into a longer sequence.  */
15851           as_bad_where (fixP->fx_file, fixP->fx_line,
15852                         _("Branch out of range"));
15853         }
15854       break;
15855
15856     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15857     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15858     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15859       /* We adjust the offset back to even.  */
15860       if ((*valP & 0x1) != 0)
15861         --(*valP);
15862
15863       if (! fixP->fx_done)
15864         break;
15865
15866       /* Should never visit here, because we keep the relocation.  */
15867       abort ();
15868       break;
15869
15870     case BFD_RELOC_VTABLE_INHERIT:
15871       fixP->fx_done = 0;
15872       if (fixP->fx_addsy
15873           && !S_IS_DEFINED (fixP->fx_addsy)
15874           && !S_IS_WEAK (fixP->fx_addsy))
15875         S_SET_WEAK (fixP->fx_addsy);
15876       break;
15877
15878     case BFD_RELOC_VTABLE_ENTRY:
15879       fixP->fx_done = 0;
15880       break;
15881
15882     default:
15883       abort ();
15884     }
15885
15886   /* Remember value for tc_gen_reloc.  */
15887   fixP->fx_addnumber = *valP;
15888 }
15889
15890 static symbolS *
15891 get_symbol (void)
15892 {
15893   int c;
15894   char *name;
15895   symbolS *p;
15896
15897   name = input_line_pointer;
15898   c = get_symbol_end ();
15899   p = (symbolS *) symbol_find_or_make (name);
15900   *input_line_pointer = c;
15901   return p;
15902 }
15903
15904 /* Align the current frag to a given power of two.  If a particular
15905    fill byte should be used, FILL points to an integer that contains
15906    that byte, otherwise FILL is null.
15907
15908    This function used to have the comment:
15909
15910       The MIPS assembler also automatically adjusts any preceding label.
15911
15912    The implementation therefore applied the adjustment to a maximum of
15913    one label.  However, other label adjustments are applied to batches
15914    of labels, and adjusting just one caused problems when new labels
15915    were added for the sake of debugging or unwind information.
15916    We therefore adjust all preceding labels (given as LABELS) instead.  */
15917
15918 static void
15919 mips_align (int to, int *fill, struct insn_label_list *labels)
15920 {
15921   mips_emit_delays ();
15922   mips_record_compressed_mode ();
15923   if (fill == NULL && subseg_text_p (now_seg))
15924     frag_align_code (to, 0);
15925   else
15926     frag_align (to, fill ? *fill : 0, 0);
15927   record_alignment (now_seg, to);
15928   mips_move_labels (labels, FALSE);
15929 }
15930
15931 /* Align to a given power of two.  .align 0 turns off the automatic
15932    alignment used by the data creating pseudo-ops.  */
15933
15934 static void
15935 s_align (int x ATTRIBUTE_UNUSED)
15936 {
15937   int temp, fill_value, *fill_ptr;
15938   long max_alignment = 28;
15939
15940   /* o Note that the assembler pulls down any immediately preceding label
15941        to the aligned address.
15942      o It's not documented but auto alignment is reinstated by
15943        a .align pseudo instruction.
15944      o Note also that after auto alignment is turned off the mips assembler
15945        issues an error on attempt to assemble an improperly aligned data item.
15946        We don't.  */
15947
15948   temp = get_absolute_expression ();
15949   if (temp > max_alignment)
15950     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
15951   else if (temp < 0)
15952     {
15953       as_warn (_("Alignment negative: 0 assumed."));
15954       temp = 0;
15955     }
15956   if (*input_line_pointer == ',')
15957     {
15958       ++input_line_pointer;
15959       fill_value = get_absolute_expression ();
15960       fill_ptr = &fill_value;
15961     }
15962   else
15963     fill_ptr = 0;
15964   if (temp)
15965     {
15966       segment_info_type *si = seg_info (now_seg);
15967       struct insn_label_list *l = si->label_list;
15968       /* Auto alignment should be switched on by next section change.  */
15969       auto_align = 1;
15970       mips_align (temp, fill_ptr, l);
15971     }
15972   else
15973     {
15974       auto_align = 0;
15975     }
15976
15977   demand_empty_rest_of_line ();
15978 }
15979
15980 static void
15981 s_change_sec (int sec)
15982 {
15983   segT seg;
15984
15985 #ifdef OBJ_ELF
15986   /* The ELF backend needs to know that we are changing sections, so
15987      that .previous works correctly.  We could do something like check
15988      for an obj_section_change_hook macro, but that might be confusing
15989      as it would not be appropriate to use it in the section changing
15990      functions in read.c, since obj-elf.c intercepts those.  FIXME:
15991      This should be cleaner, somehow.  */
15992   if (IS_ELF)
15993     obj_elf_section_change_hook ();
15994 #endif
15995
15996   mips_emit_delays ();
15997
15998   switch (sec)
15999     {
16000     case 't':
16001       s_text (0);
16002       break;
16003     case 'd':
16004       s_data (0);
16005       break;
16006     case 'b':
16007       subseg_set (bss_section, (subsegT) get_absolute_expression ());
16008       demand_empty_rest_of_line ();
16009       break;
16010
16011     case 'r':
16012       seg = subseg_new (RDATA_SECTION_NAME,
16013                         (subsegT) get_absolute_expression ());
16014       if (IS_ELF)
16015         {
16016           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
16017                                                   | SEC_READONLY | SEC_RELOC
16018                                                   | SEC_DATA));
16019           if (strncmp (TARGET_OS, "elf", 3) != 0)
16020             record_alignment (seg, 4);
16021         }
16022       demand_empty_rest_of_line ();
16023       break;
16024
16025     case 's':
16026       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
16027       if (IS_ELF)
16028         {
16029           bfd_set_section_flags (stdoutput, seg,
16030                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
16031           if (strncmp (TARGET_OS, "elf", 3) != 0)
16032             record_alignment (seg, 4);
16033         }
16034       demand_empty_rest_of_line ();
16035       break;
16036
16037     case 'B':
16038       seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
16039       if (IS_ELF)
16040         {
16041           bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
16042           if (strncmp (TARGET_OS, "elf", 3) != 0)
16043             record_alignment (seg, 4);
16044         }
16045       demand_empty_rest_of_line ();
16046       break;
16047     }
16048
16049   auto_align = 1;
16050 }
16051
16052 void
16053 s_change_section (int ignore ATTRIBUTE_UNUSED)
16054 {
16055 #ifdef OBJ_ELF
16056   char *section_name;
16057   char c;
16058   char next_c = 0;
16059   int section_type;
16060   int section_flag;
16061   int section_entry_size;
16062   int section_alignment;
16063
16064   if (!IS_ELF)
16065     return;
16066
16067   section_name = input_line_pointer;
16068   c = get_symbol_end ();
16069   if (c)
16070     next_c = *(input_line_pointer + 1);
16071
16072   /* Do we have .section Name<,"flags">?  */
16073   if (c != ',' || (c == ',' && next_c == '"'))
16074     {
16075       /* just after name is now '\0'.  */
16076       *input_line_pointer = c;
16077       input_line_pointer = section_name;
16078       obj_elf_section (ignore);
16079       return;
16080     }
16081   input_line_pointer++;
16082
16083   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
16084   if (c == ',')
16085     section_type = get_absolute_expression ();
16086   else
16087     section_type = 0;
16088   if (*input_line_pointer++ == ',')
16089     section_flag = get_absolute_expression ();
16090   else
16091     section_flag = 0;
16092   if (*input_line_pointer++ == ',')
16093     section_entry_size = get_absolute_expression ();
16094   else
16095     section_entry_size = 0;
16096   if (*input_line_pointer++ == ',')
16097     section_alignment = get_absolute_expression ();
16098   else
16099     section_alignment = 0;
16100   /* FIXME: really ignore?  */
16101   (void) section_alignment;
16102
16103   section_name = xstrdup (section_name);
16104
16105   /* When using the generic form of .section (as implemented by obj-elf.c),
16106      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
16107      traditionally had to fall back on the more common @progbits instead.
16108
16109      There's nothing really harmful in this, since bfd will correct
16110      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
16111      means that, for backwards compatibility, the special_section entries
16112      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
16113
16114      Even so, we shouldn't force users of the MIPS .section syntax to
16115      incorrectly label the sections as SHT_PROGBITS.  The best compromise
16116      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
16117      generic type-checking code.  */
16118   if (section_type == SHT_MIPS_DWARF)
16119     section_type = SHT_PROGBITS;
16120
16121   obj_elf_change_section (section_name, section_type, section_flag,
16122                           section_entry_size, 0, 0, 0);
16123
16124   if (now_seg->name != section_name)
16125     free (section_name);
16126 #endif /* OBJ_ELF */
16127 }
16128
16129 void
16130 mips_enable_auto_align (void)
16131 {
16132   auto_align = 1;
16133 }
16134
16135 static void
16136 s_cons (int log_size)
16137 {
16138   segment_info_type *si = seg_info (now_seg);
16139   struct insn_label_list *l = si->label_list;
16140
16141   mips_emit_delays ();
16142   if (log_size > 0 && auto_align)
16143     mips_align (log_size, 0, l);
16144   cons (1 << log_size);
16145   mips_clear_insn_labels ();
16146 }
16147
16148 static void
16149 s_float_cons (int type)
16150 {
16151   segment_info_type *si = seg_info (now_seg);
16152   struct insn_label_list *l = si->label_list;
16153
16154   mips_emit_delays ();
16155
16156   if (auto_align)
16157     {
16158       if (type == 'd')
16159         mips_align (3, 0, l);
16160       else
16161         mips_align (2, 0, l);
16162     }
16163
16164   float_cons (type);
16165   mips_clear_insn_labels ();
16166 }
16167
16168 /* Handle .globl.  We need to override it because on Irix 5 you are
16169    permitted to say
16170        .globl foo .text
16171    where foo is an undefined symbol, to mean that foo should be
16172    considered to be the address of a function.  */
16173
16174 static void
16175 s_mips_globl (int x ATTRIBUTE_UNUSED)
16176 {
16177   char *name;
16178   int c;
16179   symbolS *symbolP;
16180   flagword flag;
16181
16182   do
16183     {
16184       name = input_line_pointer;
16185       c = get_symbol_end ();
16186       symbolP = symbol_find_or_make (name);
16187       S_SET_EXTERNAL (symbolP);
16188
16189       *input_line_pointer = c;
16190       SKIP_WHITESPACE ();
16191
16192       /* On Irix 5, every global symbol that is not explicitly labelled as
16193          being a function is apparently labelled as being an object.  */
16194       flag = BSF_OBJECT;
16195
16196       if (!is_end_of_line[(unsigned char) *input_line_pointer]
16197           && (*input_line_pointer != ','))
16198         {
16199           char *secname;
16200           asection *sec;
16201
16202           secname = input_line_pointer;
16203           c = get_symbol_end ();
16204           sec = bfd_get_section_by_name (stdoutput, secname);
16205           if (sec == NULL)
16206             as_bad (_("%s: no such section"), secname);
16207           *input_line_pointer = c;
16208
16209           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
16210             flag = BSF_FUNCTION;
16211         }
16212
16213       symbol_get_bfdsym (symbolP)->flags |= flag;
16214
16215       c = *input_line_pointer;
16216       if (c == ',')
16217         {
16218           input_line_pointer++;
16219           SKIP_WHITESPACE ();
16220           if (is_end_of_line[(unsigned char) *input_line_pointer])
16221             c = '\n';
16222         }
16223     }
16224   while (c == ',');
16225
16226   demand_empty_rest_of_line ();
16227 }
16228
16229 static void
16230 s_option (int x ATTRIBUTE_UNUSED)
16231 {
16232   char *opt;
16233   char c;
16234
16235   opt = input_line_pointer;
16236   c = get_symbol_end ();
16237
16238   if (*opt == 'O')
16239     {
16240       /* FIXME: What does this mean?  */
16241     }
16242   else if (strncmp (opt, "pic", 3) == 0)
16243     {
16244       int i;
16245
16246       i = atoi (opt + 3);
16247       if (i == 0)
16248         mips_pic = NO_PIC;
16249       else if (i == 2)
16250         {
16251           mips_pic = SVR4_PIC;
16252           mips_abicalls = TRUE;
16253         }
16254       else
16255         as_bad (_(".option pic%d not supported"), i);
16256
16257       if (mips_pic == SVR4_PIC)
16258         {
16259           if (g_switch_seen && g_switch_value != 0)
16260             as_warn (_("-G may not be used with SVR4 PIC code"));
16261           g_switch_value = 0;
16262           bfd_set_gp_size (stdoutput, 0);
16263         }
16264     }
16265   else
16266     as_warn (_("Unrecognized option \"%s\""), opt);
16267
16268   *input_line_pointer = c;
16269   demand_empty_rest_of_line ();
16270 }
16271
16272 /* This structure is used to hold a stack of .set values.  */
16273
16274 struct mips_option_stack
16275 {
16276   struct mips_option_stack *next;
16277   struct mips_set_options options;
16278 };
16279
16280 static struct mips_option_stack *mips_opts_stack;
16281
16282 /* Handle the .set pseudo-op.  */
16283
16284 static void
16285 s_mipsset (int x ATTRIBUTE_UNUSED)
16286 {
16287   char *name = input_line_pointer, ch;
16288
16289   while (!is_end_of_line[(unsigned char) *input_line_pointer])
16290     ++input_line_pointer;
16291   ch = *input_line_pointer;
16292   *input_line_pointer = '\0';
16293
16294   if (strcmp (name, "reorder") == 0)
16295     {
16296       if (mips_opts.noreorder)
16297         end_noreorder ();
16298     }
16299   else if (strcmp (name, "noreorder") == 0)
16300     {
16301       if (!mips_opts.noreorder)
16302         start_noreorder ();
16303     }
16304   else if (strncmp (name, "at=", 3) == 0)
16305     {
16306       char *s = name + 3;
16307
16308       if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
16309         as_bad (_("Unrecognized register name `%s'"), s);
16310     }
16311   else if (strcmp (name, "at") == 0)
16312     {
16313       mips_opts.at = ATREG;
16314     }
16315   else if (strcmp (name, "noat") == 0)
16316     {
16317       mips_opts.at = ZERO;
16318     }
16319   else if (strcmp (name, "macro") == 0)
16320     {
16321       mips_opts.warn_about_macros = 0;
16322     }
16323   else if (strcmp (name, "nomacro") == 0)
16324     {
16325       if (mips_opts.noreorder == 0)
16326         as_bad (_("`noreorder' must be set before `nomacro'"));
16327       mips_opts.warn_about_macros = 1;
16328     }
16329   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
16330     {
16331       mips_opts.nomove = 0;
16332     }
16333   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
16334     {
16335       mips_opts.nomove = 1;
16336     }
16337   else if (strcmp (name, "bopt") == 0)
16338     {
16339       mips_opts.nobopt = 0;
16340     }
16341   else if (strcmp (name, "nobopt") == 0)
16342     {
16343       mips_opts.nobopt = 1;
16344     }
16345   else if (strcmp (name, "gp=default") == 0)
16346     mips_opts.gp32 = file_mips_gp32;
16347   else if (strcmp (name, "gp=32") == 0)
16348     mips_opts.gp32 = 1;
16349   else if (strcmp (name, "gp=64") == 0)
16350     {
16351       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
16352         as_warn (_("%s isa does not support 64-bit registers"),
16353                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16354       mips_opts.gp32 = 0;
16355     }
16356   else if (strcmp (name, "fp=default") == 0)
16357     mips_opts.fp32 = file_mips_fp32;
16358   else if (strcmp (name, "fp=32") == 0)
16359     mips_opts.fp32 = 1;
16360   else if (strcmp (name, "fp=64") == 0)
16361     {
16362       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
16363         as_warn (_("%s isa does not support 64-bit floating point registers"),
16364                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16365       mips_opts.fp32 = 0;
16366     }
16367   else if (strcmp (name, "softfloat") == 0)
16368     mips_opts.soft_float = 1;
16369   else if (strcmp (name, "hardfloat") == 0)
16370     mips_opts.soft_float = 0;
16371   else if (strcmp (name, "singlefloat") == 0)
16372     mips_opts.single_float = 1;
16373   else if (strcmp (name, "doublefloat") == 0)
16374     mips_opts.single_float = 0;
16375   else if (strcmp (name, "mips16") == 0
16376            || strcmp (name, "MIPS-16") == 0)
16377     {
16378       if (mips_opts.micromips == 1)
16379         as_fatal (_("`mips16' cannot be used with `micromips'"));
16380       mips_opts.mips16 = 1;
16381     }
16382   else if (strcmp (name, "nomips16") == 0
16383            || strcmp (name, "noMIPS-16") == 0)
16384     mips_opts.mips16 = 0;
16385   else if (strcmp (name, "micromips") == 0)
16386     {
16387       if (mips_opts.mips16 == 1)
16388         as_fatal (_("`micromips' cannot be used with `mips16'"));
16389       mips_opts.micromips = 1;
16390     }
16391   else if (strcmp (name, "nomicromips") == 0)
16392     mips_opts.micromips = 0;
16393   else if (strcmp (name, "smartmips") == 0)
16394     {
16395       if (!ISA_SUPPORTS_SMARTMIPS)
16396         as_warn (_("%s ISA does not support SmartMIPS ASE"), 
16397                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16398       mips_opts.ase_smartmips = 1;
16399     }
16400   else if (strcmp (name, "nosmartmips") == 0)
16401     mips_opts.ase_smartmips = 0;
16402   else if (strcmp (name, "mips3d") == 0)
16403     mips_opts.ase_mips3d = 1;
16404   else if (strcmp (name, "nomips3d") == 0)
16405     mips_opts.ase_mips3d = 0;
16406   else if (strcmp (name, "mdmx") == 0)
16407     mips_opts.ase_mdmx = 1;
16408   else if (strcmp (name, "nomdmx") == 0)
16409     mips_opts.ase_mdmx = 0;
16410   else if (strcmp (name, "dsp") == 0)
16411     {
16412       if (!ISA_SUPPORTS_DSP_ASE)
16413         as_warn (_("%s ISA does not support DSP ASE"), 
16414                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16415       mips_opts.ase_dsp = 1;
16416       mips_opts.ase_dspr2 = 0;
16417     }
16418   else if (strcmp (name, "nodsp") == 0)
16419     {
16420       mips_opts.ase_dsp = 0;
16421       mips_opts.ase_dspr2 = 0;
16422     }
16423   else if (strcmp (name, "dspr2") == 0)
16424     {
16425       if (!ISA_SUPPORTS_DSPR2_ASE)
16426         as_warn (_("%s ISA does not support DSP R2 ASE"),
16427                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16428       mips_opts.ase_dspr2 = 1;
16429       mips_opts.ase_dsp = 1;
16430     }
16431   else if (strcmp (name, "nodspr2") == 0)
16432     {
16433       mips_opts.ase_dspr2 = 0;
16434       mips_opts.ase_dsp = 0;
16435     }
16436   else if (strcmp (name, "mt") == 0)
16437     {
16438       if (!ISA_SUPPORTS_MT_ASE)
16439         as_warn (_("%s ISA does not support MT ASE"), 
16440                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16441       mips_opts.ase_mt = 1;
16442     }
16443   else if (strcmp (name, "nomt") == 0)
16444     mips_opts.ase_mt = 0;
16445   else if (strcmp (name, "mcu") == 0)
16446     mips_opts.ase_mcu = 1;
16447   else if (strcmp (name, "nomcu") == 0)
16448     mips_opts.ase_mcu = 0;
16449   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
16450     {
16451       int reset = 0;
16452
16453       /* Permit the user to change the ISA and architecture on the fly.
16454          Needless to say, misuse can cause serious problems.  */
16455       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
16456         {
16457           reset = 1;
16458           mips_opts.isa = file_mips_isa;
16459           mips_opts.arch = file_mips_arch;
16460         }
16461       else if (strncmp (name, "arch=", 5) == 0)
16462         {
16463           const struct mips_cpu_info *p;
16464
16465           p = mips_parse_cpu("internal use", name + 5);
16466           if (!p)
16467             as_bad (_("unknown architecture %s"), name + 5);
16468           else
16469             {
16470               mips_opts.arch = p->cpu;
16471               mips_opts.isa = p->isa;
16472             }
16473         }
16474       else if (strncmp (name, "mips", 4) == 0)
16475         {
16476           const struct mips_cpu_info *p;
16477
16478           p = mips_parse_cpu("internal use", name);
16479           if (!p)
16480             as_bad (_("unknown ISA level %s"), name + 4);
16481           else
16482             {
16483               mips_opts.arch = p->cpu;
16484               mips_opts.isa = p->isa;
16485             }
16486         }
16487       else
16488         as_bad (_("unknown ISA or architecture %s"), name);
16489
16490       switch (mips_opts.isa)
16491         {
16492         case  0:
16493           break;
16494         case ISA_MIPS1:
16495         case ISA_MIPS2:
16496         case ISA_MIPS32:
16497         case ISA_MIPS32R2:
16498           mips_opts.gp32 = 1;
16499           mips_opts.fp32 = 1;
16500           break;
16501         case ISA_MIPS3:
16502         case ISA_MIPS4:
16503         case ISA_MIPS5:
16504         case ISA_MIPS64:
16505         case ISA_MIPS64R2:
16506           mips_opts.gp32 = 0;
16507           if (mips_opts.arch == CPU_R5900)
16508             {
16509                 mips_opts.fp32 = 1;
16510             }
16511           else
16512             {
16513           mips_opts.fp32 = 0;
16514             }
16515           break;
16516         default:
16517           as_bad (_("unknown ISA level %s"), name + 4);
16518           break;
16519         }
16520       if (reset)
16521         {
16522           mips_opts.gp32 = file_mips_gp32;
16523           mips_opts.fp32 = file_mips_fp32;
16524         }
16525     }
16526   else if (strcmp (name, "autoextend") == 0)
16527     mips_opts.noautoextend = 0;
16528   else if (strcmp (name, "noautoextend") == 0)
16529     mips_opts.noautoextend = 1;
16530   else if (strcmp (name, "push") == 0)
16531     {
16532       struct mips_option_stack *s;
16533
16534       s = (struct mips_option_stack *) xmalloc (sizeof *s);
16535       s->next = mips_opts_stack;
16536       s->options = mips_opts;
16537       mips_opts_stack = s;
16538     }
16539   else if (strcmp (name, "pop") == 0)
16540     {
16541       struct mips_option_stack *s;
16542
16543       s = mips_opts_stack;
16544       if (s == NULL)
16545         as_bad (_(".set pop with no .set push"));
16546       else
16547         {
16548           /* If we're changing the reorder mode we need to handle
16549              delay slots correctly.  */
16550           if (s->options.noreorder && ! mips_opts.noreorder)
16551             start_noreorder ();
16552           else if (! s->options.noreorder && mips_opts.noreorder)
16553             end_noreorder ();
16554
16555           mips_opts = s->options;
16556           mips_opts_stack = s->next;
16557           free (s);
16558         }
16559     }
16560   else if (strcmp (name, "sym32") == 0)
16561     mips_opts.sym32 = TRUE;
16562   else if (strcmp (name, "nosym32") == 0)
16563     mips_opts.sym32 = FALSE;
16564   else if (strchr (name, ','))
16565     {
16566       /* Generic ".set" directive; use the generic handler.  */
16567       *input_line_pointer = ch;
16568       input_line_pointer = name;
16569       s_set (0);
16570       return;
16571     }
16572   else
16573     {
16574       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
16575     }
16576   *input_line_pointer = ch;
16577   demand_empty_rest_of_line ();
16578 }
16579
16580 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
16581    .option pic2.  It means to generate SVR4 PIC calls.  */
16582
16583 static void
16584 s_abicalls (int ignore ATTRIBUTE_UNUSED)
16585 {
16586   mips_pic = SVR4_PIC;
16587   mips_abicalls = TRUE;
16588
16589   if (g_switch_seen && g_switch_value != 0)
16590     as_warn (_("-G may not be used with SVR4 PIC code"));
16591   g_switch_value = 0;
16592
16593   bfd_set_gp_size (stdoutput, 0);
16594   demand_empty_rest_of_line ();
16595 }
16596
16597 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
16598    PIC code.  It sets the $gp register for the function based on the
16599    function address, which is in the register named in the argument.
16600    This uses a relocation against _gp_disp, which is handled specially
16601    by the linker.  The result is:
16602         lui     $gp,%hi(_gp_disp)
16603         addiu   $gp,$gp,%lo(_gp_disp)
16604         addu    $gp,$gp,.cpload argument
16605    The .cpload argument is normally $25 == $t9.
16606
16607    The -mno-shared option changes this to:
16608         lui     $gp,%hi(__gnu_local_gp)
16609         addiu   $gp,$gp,%lo(__gnu_local_gp)
16610    and the argument is ignored.  This saves an instruction, but the
16611    resulting code is not position independent; it uses an absolute
16612    address for __gnu_local_gp.  Thus code assembled with -mno-shared
16613    can go into an ordinary executable, but not into a shared library.  */
16614
16615 static void
16616 s_cpload (int ignore ATTRIBUTE_UNUSED)
16617 {
16618   expressionS ex;
16619   int reg;
16620   int in_shared;
16621
16622   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16623      .cpload is ignored.  */
16624   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16625     {
16626       s_ignore (0);
16627       return;
16628     }
16629
16630   if (mips_opts.mips16)
16631     {
16632       as_bad (_("%s not supported in MIPS16 mode"), ".cpload");
16633       ignore_rest_of_line ();
16634       return;
16635     }
16636
16637   /* .cpload should be in a .set noreorder section.  */
16638   if (mips_opts.noreorder == 0)
16639     as_warn (_(".cpload not in noreorder section"));
16640
16641   reg = tc_get_register (0);
16642
16643   /* If we need to produce a 64-bit address, we are better off using
16644      the default instruction sequence.  */
16645   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
16646
16647   ex.X_op = O_symbol;
16648   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
16649                                          "__gnu_local_gp");
16650   ex.X_op_symbol = NULL;
16651   ex.X_add_number = 0;
16652
16653   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
16654   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16655
16656   mips_mark_labels ();
16657   mips_assembling_insn = TRUE;
16658
16659   macro_start ();
16660   macro_build_lui (&ex, mips_gp_register);
16661   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16662                mips_gp_register, BFD_RELOC_LO16);
16663   if (in_shared)
16664     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
16665                  mips_gp_register, reg);
16666   macro_end ();
16667
16668   mips_assembling_insn = FALSE;
16669   demand_empty_rest_of_line ();
16670 }
16671
16672 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
16673      .cpsetup $reg1, offset|$reg2, label
16674
16675    If offset is given, this results in:
16676      sd         $gp, offset($sp)
16677      lui        $gp, %hi(%neg(%gp_rel(label)))
16678      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
16679      daddu      $gp, $gp, $reg1
16680
16681    If $reg2 is given, this results in:
16682      daddu      $reg2, $gp, $0
16683      lui        $gp, %hi(%neg(%gp_rel(label)))
16684      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
16685      daddu      $gp, $gp, $reg1
16686    $reg1 is normally $25 == $t9.
16687
16688    The -mno-shared option replaces the last three instructions with
16689         lui     $gp,%hi(_gp)
16690         addiu   $gp,$gp,%lo(_gp)  */
16691
16692 static void
16693 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
16694 {
16695   expressionS ex_off;
16696   expressionS ex_sym;
16697   int reg1;
16698
16699   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
16700      We also need NewABI support.  */
16701   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16702     {
16703       s_ignore (0);
16704       return;
16705     }
16706
16707   if (mips_opts.mips16)
16708     {
16709       as_bad (_("%s not supported in MIPS16 mode"), ".cpsetup");
16710       ignore_rest_of_line ();
16711       return;
16712     }
16713
16714   reg1 = tc_get_register (0);
16715   SKIP_WHITESPACE ();
16716   if (*input_line_pointer != ',')
16717     {
16718       as_bad (_("missing argument separator ',' for .cpsetup"));
16719       return;
16720     }
16721   else
16722     ++input_line_pointer;
16723   SKIP_WHITESPACE ();
16724   if (*input_line_pointer == '$')
16725     {
16726       mips_cpreturn_register = tc_get_register (0);
16727       mips_cpreturn_offset = -1;
16728     }
16729   else
16730     {
16731       mips_cpreturn_offset = get_absolute_expression ();
16732       mips_cpreturn_register = -1;
16733     }
16734   SKIP_WHITESPACE ();
16735   if (*input_line_pointer != ',')
16736     {
16737       as_bad (_("missing argument separator ',' for .cpsetup"));
16738       return;
16739     }
16740   else
16741     ++input_line_pointer;
16742   SKIP_WHITESPACE ();
16743   expression (&ex_sym);
16744
16745   mips_mark_labels ();
16746   mips_assembling_insn = TRUE;
16747
16748   macro_start ();
16749   if (mips_cpreturn_register == -1)
16750     {
16751       ex_off.X_op = O_constant;
16752       ex_off.X_add_symbol = NULL;
16753       ex_off.X_op_symbol = NULL;
16754       ex_off.X_add_number = mips_cpreturn_offset;
16755
16756       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
16757                    BFD_RELOC_LO16, SP);
16758     }
16759   else
16760     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
16761                  mips_gp_register, 0);
16762
16763   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
16764     {
16765       macro_build (&ex_sym, "lui", LUI_FMT, mips_gp_register,
16766                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
16767                    BFD_RELOC_HI16_S);
16768
16769       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
16770                    mips_gp_register, -1, BFD_RELOC_GPREL16,
16771                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
16772
16773       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
16774                    mips_gp_register, reg1);
16775     }
16776   else
16777     {
16778       expressionS ex;
16779
16780       ex.X_op = O_symbol;
16781       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
16782       ex.X_op_symbol = NULL;
16783       ex.X_add_number = 0;
16784
16785       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
16786       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16787
16788       macro_build_lui (&ex, mips_gp_register);
16789       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16790                    mips_gp_register, BFD_RELOC_LO16);
16791     }
16792
16793   macro_end ();
16794
16795   mips_assembling_insn = FALSE;
16796   demand_empty_rest_of_line ();
16797 }
16798
16799 static void
16800 s_cplocal (int ignore ATTRIBUTE_UNUSED)
16801 {
16802   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
16803      .cplocal is ignored.  */
16804   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16805     {
16806       s_ignore (0);
16807       return;
16808     }
16809
16810   if (mips_opts.mips16)
16811     {
16812       as_bad (_("%s not supported in MIPS16 mode"), ".cplocal");
16813       ignore_rest_of_line ();
16814       return;
16815     }
16816
16817   mips_gp_register = tc_get_register (0);
16818   demand_empty_rest_of_line ();
16819 }
16820
16821 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
16822    offset from $sp.  The offset is remembered, and after making a PIC
16823    call $gp is restored from that location.  */
16824
16825 static void
16826 s_cprestore (int ignore ATTRIBUTE_UNUSED)
16827 {
16828   expressionS ex;
16829
16830   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16831      .cprestore is ignored.  */
16832   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16833     {
16834       s_ignore (0);
16835       return;
16836     }
16837
16838   if (mips_opts.mips16)
16839     {
16840       as_bad (_("%s not supported in MIPS16 mode"), ".cprestore");
16841       ignore_rest_of_line ();
16842       return;
16843     }
16844
16845   mips_cprestore_offset = get_absolute_expression ();
16846   mips_cprestore_valid = 1;
16847
16848   ex.X_op = O_constant;
16849   ex.X_add_symbol = NULL;
16850   ex.X_op_symbol = NULL;
16851   ex.X_add_number = mips_cprestore_offset;
16852
16853   mips_mark_labels ();
16854   mips_assembling_insn = TRUE;
16855
16856   macro_start ();
16857   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
16858                                 SP, HAVE_64BIT_ADDRESSES);
16859   macro_end ();
16860
16861   mips_assembling_insn = FALSE;
16862   demand_empty_rest_of_line ();
16863 }
16864
16865 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
16866    was given in the preceding .cpsetup, it results in:
16867      ld         $gp, offset($sp)
16868
16869    If a register $reg2 was given there, it results in:
16870      daddu      $gp, $reg2, $0  */
16871
16872 static void
16873 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
16874 {
16875   expressionS ex;
16876
16877   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
16878      We also need NewABI support.  */
16879   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16880     {
16881       s_ignore (0);
16882       return;
16883     }
16884
16885   if (mips_opts.mips16)
16886     {
16887       as_bad (_("%s not supported in MIPS16 mode"), ".cpreturn");
16888       ignore_rest_of_line ();
16889       return;
16890     }
16891
16892   mips_mark_labels ();
16893   mips_assembling_insn = TRUE;
16894
16895   macro_start ();
16896   if (mips_cpreturn_register == -1)
16897     {
16898       ex.X_op = O_constant;
16899       ex.X_add_symbol = NULL;
16900       ex.X_op_symbol = NULL;
16901       ex.X_add_number = mips_cpreturn_offset;
16902
16903       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
16904     }
16905   else
16906     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
16907                  mips_cpreturn_register, 0);
16908   macro_end ();
16909
16910   mips_assembling_insn = FALSE;
16911   demand_empty_rest_of_line ();
16912 }
16913
16914 /* Handle a .dtprelword, .dtpreldword, .tprelword, or .tpreldword
16915    pseudo-op; DIRSTR says which. The pseudo-op generates a BYTES-size
16916    DTP- or TP-relative relocation of type RTYPE, for use in either DWARF
16917    debug information or MIPS16 TLS.  */
16918
16919 static void
16920 s_tls_rel_directive (const size_t bytes, const char *dirstr,
16921                      bfd_reloc_code_real_type rtype)
16922 {
16923   expressionS ex;
16924   char *p;
16925
16926   expression (&ex);
16927
16928   if (ex.X_op != O_symbol)
16929     {
16930       as_bad (_("Unsupported use of %s"), dirstr);
16931       ignore_rest_of_line ();
16932     }
16933
16934   p = frag_more (bytes);
16935   md_number_to_chars (p, 0, bytes);
16936   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE, rtype);
16937   demand_empty_rest_of_line ();
16938   mips_clear_insn_labels ();
16939 }
16940
16941 /* Handle .dtprelword.  */
16942
16943 static void
16944 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
16945 {
16946   s_tls_rel_directive (4, ".dtprelword", BFD_RELOC_MIPS_TLS_DTPREL32);
16947 }
16948
16949 /* Handle .dtpreldword.  */
16950
16951 static void
16952 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
16953 {
16954   s_tls_rel_directive (8, ".dtpreldword", BFD_RELOC_MIPS_TLS_DTPREL64);
16955 }
16956
16957 /* Handle .tprelword.  */
16958
16959 static void
16960 s_tprelword (int ignore ATTRIBUTE_UNUSED)
16961 {
16962   s_tls_rel_directive (4, ".tprelword", BFD_RELOC_MIPS_TLS_TPREL32);
16963 }
16964
16965 /* Handle .tpreldword.  */
16966
16967 static void
16968 s_tpreldword (int ignore ATTRIBUTE_UNUSED)
16969 {
16970   s_tls_rel_directive (8, ".tpreldword", BFD_RELOC_MIPS_TLS_TPREL64);
16971 }
16972
16973 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
16974    code.  It sets the offset to use in gp_rel relocations.  */
16975
16976 static void
16977 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
16978 {
16979   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
16980      We also need NewABI support.  */
16981   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16982     {
16983       s_ignore (0);
16984       return;
16985     }
16986
16987   mips_gprel_offset = get_absolute_expression ();
16988
16989   demand_empty_rest_of_line ();
16990 }
16991
16992 /* Handle the .gpword pseudo-op.  This is used when generating PIC
16993    code.  It generates a 32 bit GP relative reloc.  */
16994
16995 static void
16996 s_gpword (int ignore ATTRIBUTE_UNUSED)
16997 {
16998   segment_info_type *si;
16999   struct insn_label_list *l;
17000   expressionS ex;
17001   char *p;
17002
17003   /* When not generating PIC code, this is treated as .word.  */
17004   if (mips_pic != SVR4_PIC)
17005     {
17006       s_cons (2);
17007       return;
17008     }
17009
17010   si = seg_info (now_seg);
17011   l = si->label_list;
17012   mips_emit_delays ();
17013   if (auto_align)
17014     mips_align (2, 0, l);
17015
17016   expression (&ex);
17017   mips_clear_insn_labels ();
17018
17019   if (ex.X_op != O_symbol || ex.X_add_number != 0)
17020     {
17021       as_bad (_("Unsupported use of .gpword"));
17022       ignore_rest_of_line ();
17023     }
17024
17025   p = frag_more (4);
17026   md_number_to_chars (p, 0, 4);
17027   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
17028                BFD_RELOC_GPREL32);
17029
17030   demand_empty_rest_of_line ();
17031 }
17032
17033 static void
17034 s_gpdword (int ignore ATTRIBUTE_UNUSED)
17035 {
17036   segment_info_type *si;
17037   struct insn_label_list *l;
17038   expressionS ex;
17039   char *p;
17040
17041   /* When not generating PIC code, this is treated as .dword.  */
17042   if (mips_pic != SVR4_PIC)
17043     {
17044       s_cons (3);
17045       return;
17046     }
17047
17048   si = seg_info (now_seg);
17049   l = si->label_list;
17050   mips_emit_delays ();
17051   if (auto_align)
17052     mips_align (3, 0, l);
17053
17054   expression (&ex);
17055   mips_clear_insn_labels ();
17056
17057   if (ex.X_op != O_symbol || ex.X_add_number != 0)
17058     {
17059       as_bad (_("Unsupported use of .gpdword"));
17060       ignore_rest_of_line ();
17061     }
17062
17063   p = frag_more (8);
17064   md_number_to_chars (p, 0, 8);
17065   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
17066                BFD_RELOC_GPREL32)->fx_tcbit = 1;
17067
17068   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
17069   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
17070            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
17071
17072   demand_empty_rest_of_line ();
17073 }
17074
17075 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
17076    tables in SVR4 PIC code.  */
17077
17078 static void
17079 s_cpadd (int ignore ATTRIBUTE_UNUSED)
17080 {
17081   int reg;
17082
17083   /* This is ignored when not generating SVR4 PIC code.  */
17084   if (mips_pic != SVR4_PIC)
17085     {
17086       s_ignore (0);
17087       return;
17088     }
17089
17090   mips_mark_labels ();
17091   mips_assembling_insn = TRUE;
17092
17093   /* Add $gp to the register named as an argument.  */
17094   macro_start ();
17095   reg = tc_get_register (0);
17096   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
17097   macro_end ();
17098
17099   mips_assembling_insn = FALSE;
17100   demand_empty_rest_of_line ();
17101 }
17102
17103 /* Handle the .insn pseudo-op.  This marks instruction labels in
17104    mips16/micromips mode.  This permits the linker to handle them specially,
17105    such as generating jalx instructions when needed.  We also make
17106    them odd for the duration of the assembly, in order to generate the
17107    right sort of code.  We will make them even in the adjust_symtab
17108    routine, while leaving them marked.  This is convenient for the
17109    debugger and the disassembler.  The linker knows to make them odd
17110    again.  */
17111
17112 static void
17113 s_insn (int ignore ATTRIBUTE_UNUSED)
17114 {
17115   mips_mark_labels ();
17116
17117   demand_empty_rest_of_line ();
17118 }
17119
17120 /* Handle a .stab[snd] directive.  Ideally these directives would be
17121    implemented in a transparent way, so that removing them would not
17122    have any effect on the generated instructions.  However, s_stab
17123    internally changes the section, so in practice we need to decide
17124    now whether the preceding label marks compressed code.  We do not
17125    support changing the compression mode of a label after a .stab*
17126    directive, such as in:
17127
17128    foo:
17129         .stabs ...
17130         .set mips16
17131
17132    so the current mode wins.  */
17133
17134 static void
17135 s_mips_stab (int type)
17136 {
17137   mips_mark_labels ();
17138   s_stab (type);
17139 }
17140
17141 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
17142
17143 static void
17144 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
17145 {
17146   char *name;
17147   int c;
17148   symbolS *symbolP;
17149   expressionS exp;
17150
17151   name = input_line_pointer;
17152   c = get_symbol_end ();
17153   symbolP = symbol_find_or_make (name);
17154   S_SET_WEAK (symbolP);
17155   *input_line_pointer = c;
17156
17157   SKIP_WHITESPACE ();
17158
17159   if (! is_end_of_line[(unsigned char) *input_line_pointer])
17160     {
17161       if (S_IS_DEFINED (symbolP))
17162         {
17163           as_bad (_("ignoring attempt to redefine symbol %s"),
17164                   S_GET_NAME (symbolP));
17165           ignore_rest_of_line ();
17166           return;
17167         }
17168
17169       if (*input_line_pointer == ',')
17170         {
17171           ++input_line_pointer;
17172           SKIP_WHITESPACE ();
17173         }
17174
17175       expression (&exp);
17176       if (exp.X_op != O_symbol)
17177         {
17178           as_bad (_("bad .weakext directive"));
17179           ignore_rest_of_line ();
17180           return;
17181         }
17182       symbol_set_value_expression (symbolP, &exp);
17183     }
17184
17185   demand_empty_rest_of_line ();
17186 }
17187
17188 /* Parse a register string into a number.  Called from the ECOFF code
17189    to parse .frame.  The argument is non-zero if this is the frame
17190    register, so that we can record it in mips_frame_reg.  */
17191
17192 int
17193 tc_get_register (int frame)
17194 {
17195   unsigned int reg;
17196
17197   SKIP_WHITESPACE ();
17198   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
17199     reg = 0;
17200   if (frame)
17201     {
17202       mips_frame_reg = reg != 0 ? reg : SP;
17203       mips_frame_reg_valid = 1;
17204       mips_cprestore_valid = 0;
17205     }
17206   return reg;
17207 }
17208
17209 valueT
17210 md_section_align (asection *seg, valueT addr)
17211 {
17212   int align = bfd_get_section_alignment (stdoutput, seg);
17213
17214   if (IS_ELF)
17215     {
17216       /* We don't need to align ELF sections to the full alignment.
17217          However, Irix 5 may prefer that we align them at least to a 16
17218          byte boundary.  We don't bother to align the sections if we
17219          are targeted for an embedded system.  */
17220       if (strncmp (TARGET_OS, "elf", 3) == 0)
17221         return addr;
17222       if (align > 4)
17223         align = 4;
17224     }
17225
17226   return ((addr + (1 << align) - 1) & (-1 << align));
17227 }
17228
17229 /* Utility routine, called from above as well.  If called while the
17230    input file is still being read, it's only an approximation.  (For
17231    example, a symbol may later become defined which appeared to be
17232    undefined earlier.)  */
17233
17234 static int
17235 nopic_need_relax (symbolS *sym, int before_relaxing)
17236 {
17237   if (sym == 0)
17238     return 0;
17239
17240   if (g_switch_value > 0)
17241     {
17242       const char *symname;
17243       int change;
17244
17245       /* Find out whether this symbol can be referenced off the $gp
17246          register.  It can be if it is smaller than the -G size or if
17247          it is in the .sdata or .sbss section.  Certain symbols can
17248          not be referenced off the $gp, although it appears as though
17249          they can.  */
17250       symname = S_GET_NAME (sym);
17251       if (symname != (const char *) NULL
17252           && (strcmp (symname, "eprol") == 0
17253               || strcmp (symname, "etext") == 0
17254               || strcmp (symname, "_gp") == 0
17255               || strcmp (symname, "edata") == 0
17256               || strcmp (symname, "_fbss") == 0
17257               || strcmp (symname, "_fdata") == 0
17258               || strcmp (symname, "_ftext") == 0
17259               || strcmp (symname, "end") == 0
17260               || strcmp (symname, "_gp_disp") == 0))
17261         change = 1;
17262       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
17263                && (0
17264 #ifndef NO_ECOFF_DEBUGGING
17265                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
17266                        && (symbol_get_obj (sym)->ecoff_extern_size
17267                            <= g_switch_value))
17268 #endif
17269                    /* We must defer this decision until after the whole
17270                       file has been read, since there might be a .extern
17271                       after the first use of this symbol.  */
17272                    || (before_relaxing
17273 #ifndef NO_ECOFF_DEBUGGING
17274                        && symbol_get_obj (sym)->ecoff_extern_size == 0
17275 #endif
17276                        && S_GET_VALUE (sym) == 0)
17277                    || (S_GET_VALUE (sym) != 0
17278                        && S_GET_VALUE (sym) <= g_switch_value)))
17279         change = 0;
17280       else
17281         {
17282           const char *segname;
17283
17284           segname = segment_name (S_GET_SEGMENT (sym));
17285           gas_assert (strcmp (segname, ".lit8") != 0
17286                   && strcmp (segname, ".lit4") != 0);
17287           change = (strcmp (segname, ".sdata") != 0
17288                     && strcmp (segname, ".sbss") != 0
17289                     && strncmp (segname, ".sdata.", 7) != 0
17290                     && strncmp (segname, ".sbss.", 6) != 0
17291                     && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
17292                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
17293         }
17294       return change;
17295     }
17296   else
17297     /* We are not optimizing for the $gp register.  */
17298     return 1;
17299 }
17300
17301
17302 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
17303
17304 static bfd_boolean
17305 pic_need_relax (symbolS *sym, asection *segtype)
17306 {
17307   asection *symsec;
17308
17309   /* Handle the case of a symbol equated to another symbol.  */
17310   while (symbol_equated_reloc_p (sym))
17311     {
17312       symbolS *n;
17313
17314       /* It's possible to get a loop here in a badly written program.  */
17315       n = symbol_get_value_expression (sym)->X_add_symbol;
17316       if (n == sym)
17317         break;
17318       sym = n;
17319     }
17320
17321   if (symbol_section_p (sym))
17322     return TRUE;
17323
17324   symsec = S_GET_SEGMENT (sym);
17325
17326   /* This must duplicate the test in adjust_reloc_syms.  */
17327   return (!bfd_is_und_section (symsec)
17328           && !bfd_is_abs_section (symsec)
17329           && !bfd_is_com_section (symsec)
17330           && !s_is_linkonce (sym, segtype)
17331 #ifdef OBJ_ELF
17332           /* A global or weak symbol is treated as external.  */
17333           && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
17334 #endif
17335           );
17336 }
17337
17338
17339 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
17340    extended opcode.  SEC is the section the frag is in.  */
17341
17342 static int
17343 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
17344 {
17345   int type;
17346   const struct mips16_immed_operand *op;
17347   offsetT val;
17348   int mintiny, maxtiny;
17349   segT symsec;
17350   fragS *sym_frag;
17351
17352   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
17353     return 0;
17354   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
17355     return 1;
17356
17357   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
17358   op = mips16_immed_operands;
17359   while (op->type != type)
17360     {
17361       ++op;
17362       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
17363     }
17364
17365   if (op->unsp)
17366     {
17367       if (type == '<' || type == '>' || type == '[' || type == ']')
17368         {
17369           mintiny = 1;
17370           maxtiny = 1 << op->nbits;
17371         }
17372       else
17373         {
17374           mintiny = 0;
17375           maxtiny = (1 << op->nbits) - 1;
17376         }
17377     }
17378   else
17379     {
17380       mintiny = - (1 << (op->nbits - 1));
17381       maxtiny = (1 << (op->nbits - 1)) - 1;
17382     }
17383
17384   sym_frag = symbol_get_frag (fragp->fr_symbol);
17385   val = S_GET_VALUE (fragp->fr_symbol);
17386   symsec = S_GET_SEGMENT (fragp->fr_symbol);
17387
17388   if (op->pcrel)
17389     {
17390       addressT addr;
17391
17392       /* We won't have the section when we are called from
17393          mips_relax_frag.  However, we will always have been called
17394          from md_estimate_size_before_relax first.  If this is a
17395          branch to a different section, we mark it as such.  If SEC is
17396          NULL, and the frag is not marked, then it must be a branch to
17397          the same section.  */
17398       if (sec == NULL)
17399         {
17400           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
17401             return 1;
17402         }
17403       else
17404         {
17405           /* Must have been called from md_estimate_size_before_relax.  */
17406           if (symsec != sec)
17407             {
17408               fragp->fr_subtype =
17409                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17410
17411               /* FIXME: We should support this, and let the linker
17412                  catch branches and loads that are out of range.  */
17413               as_bad_where (fragp->fr_file, fragp->fr_line,
17414                             _("unsupported PC relative reference to different section"));
17415
17416               return 1;
17417             }
17418           if (fragp != sym_frag && sym_frag->fr_address == 0)
17419             /* Assume non-extended on the first relaxation pass.
17420                The address we have calculated will be bogus if this is
17421                a forward branch to another frag, as the forward frag
17422                will have fr_address == 0.  */
17423             return 0;
17424         }
17425
17426       /* In this case, we know for sure that the symbol fragment is in
17427          the same section.  If the relax_marker of the symbol fragment
17428          differs from the relax_marker of this fragment, we have not
17429          yet adjusted the symbol fragment fr_address.  We want to add
17430          in STRETCH in order to get a better estimate of the address.
17431          This particularly matters because of the shift bits.  */
17432       if (stretch != 0
17433           && sym_frag->relax_marker != fragp->relax_marker)
17434         {
17435           fragS *f;
17436
17437           /* Adjust stretch for any alignment frag.  Note that if have
17438              been expanding the earlier code, the symbol may be
17439              defined in what appears to be an earlier frag.  FIXME:
17440              This doesn't handle the fr_subtype field, which specifies
17441              a maximum number of bytes to skip when doing an
17442              alignment.  */
17443           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
17444             {
17445               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
17446                 {
17447                   if (stretch < 0)
17448                     stretch = - ((- stretch)
17449                                  & ~ ((1 << (int) f->fr_offset) - 1));
17450                   else
17451                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
17452                   if (stretch == 0)
17453                     break;
17454                 }
17455             }
17456           if (f != NULL)
17457             val += stretch;
17458         }
17459
17460       addr = fragp->fr_address + fragp->fr_fix;
17461
17462       /* The base address rules are complicated.  The base address of
17463          a branch is the following instruction.  The base address of a
17464          PC relative load or add is the instruction itself, but if it
17465          is in a delay slot (in which case it can not be extended) use
17466          the address of the instruction whose delay slot it is in.  */
17467       if (type == 'p' || type == 'q')
17468         {
17469           addr += 2;
17470
17471           /* If we are currently assuming that this frag should be
17472              extended, then, the current address is two bytes
17473              higher.  */
17474           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17475             addr += 2;
17476
17477           /* Ignore the low bit in the target, since it will be set
17478              for a text label.  */
17479           if ((val & 1) != 0)
17480             --val;
17481         }
17482       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
17483         addr -= 4;
17484       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
17485         addr -= 2;
17486
17487       val -= addr & ~ ((1 << op->shift) - 1);
17488
17489       /* Branch offsets have an implicit 0 in the lowest bit.  */
17490       if (type == 'p' || type == 'q')
17491         val /= 2;
17492
17493       /* If any of the shifted bits are set, we must use an extended
17494          opcode.  If the address depends on the size of this
17495          instruction, this can lead to a loop, so we arrange to always
17496          use an extended opcode.  We only check this when we are in
17497          the main relaxation loop, when SEC is NULL.  */
17498       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
17499         {
17500           fragp->fr_subtype =
17501             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17502           return 1;
17503         }
17504
17505       /* If we are about to mark a frag as extended because the value
17506          is precisely maxtiny + 1, then there is a chance of an
17507          infinite loop as in the following code:
17508              la $4,foo
17509              .skip      1020
17510              .align     2
17511            foo:
17512          In this case when the la is extended, foo is 0x3fc bytes
17513          away, so the la can be shrunk, but then foo is 0x400 away, so
17514          the la must be extended.  To avoid this loop, we mark the
17515          frag as extended if it was small, and is about to become
17516          extended with a value of maxtiny + 1.  */
17517       if (val == ((maxtiny + 1) << op->shift)
17518           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
17519           && sec == NULL)
17520         {
17521           fragp->fr_subtype =
17522             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17523           return 1;
17524         }
17525     }
17526   else if (symsec != absolute_section && sec != NULL)
17527     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
17528
17529   if ((val & ((1 << op->shift) - 1)) != 0
17530       || val < (mintiny << op->shift)
17531       || val > (maxtiny << op->shift))
17532     return 1;
17533   else
17534     return 0;
17535 }
17536
17537 /* Compute the length of a branch sequence, and adjust the
17538    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
17539    worst-case length is computed, with UPDATE being used to indicate
17540    whether an unconditional (-1), branch-likely (+1) or regular (0)
17541    branch is to be computed.  */
17542 static int
17543 relaxed_branch_length (fragS *fragp, asection *sec, int update)
17544 {
17545   bfd_boolean toofar;
17546   int length;
17547
17548   if (fragp
17549       && S_IS_DEFINED (fragp->fr_symbol)
17550       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17551     {
17552       addressT addr;
17553       offsetT val;
17554
17555       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17556
17557       addr = fragp->fr_address + fragp->fr_fix + 4;
17558
17559       val -= addr;
17560
17561       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
17562     }
17563   else if (fragp)
17564     /* If the symbol is not defined or it's in a different segment,
17565        assume the user knows what's going on and emit a short
17566        branch.  */
17567     toofar = FALSE;
17568   else
17569     toofar = TRUE;
17570
17571   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
17572     fragp->fr_subtype
17573       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_AT (fragp->fr_subtype),
17574                              RELAX_BRANCH_UNCOND (fragp->fr_subtype),
17575                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
17576                              RELAX_BRANCH_LINK (fragp->fr_subtype),
17577                              toofar);
17578
17579   length = 4;
17580   if (toofar)
17581     {
17582       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
17583         length += 8;
17584
17585       if (mips_pic != NO_PIC)
17586         {
17587           /* Additional space for PIC loading of target address.  */
17588           length += 8;
17589           if (mips_opts.isa == ISA_MIPS1)
17590             /* Additional space for $at-stabilizing nop.  */
17591             length += 4;
17592         }
17593
17594       /* If branch is conditional.  */
17595       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
17596         length += 8;
17597     }
17598
17599   return length;
17600 }
17601
17602 /* Compute the length of a branch sequence, and adjust the
17603    RELAX_MICROMIPS_TOOFAR32 bit accordingly.  If FRAGP is NULL, the
17604    worst-case length is computed, with UPDATE being used to indicate
17605    whether an unconditional (-1), or regular (0) branch is to be
17606    computed.  */
17607
17608 static int
17609 relaxed_micromips_32bit_branch_length (fragS *fragp, asection *sec, int update)
17610 {
17611   bfd_boolean toofar;
17612   int length;
17613
17614   if (fragp
17615       && S_IS_DEFINED (fragp->fr_symbol)
17616       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17617     {
17618       addressT addr;
17619       offsetT val;
17620
17621       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17622       /* Ignore the low bit in the target, since it will be set
17623          for a text label.  */
17624       if ((val & 1) != 0)
17625         --val;
17626
17627       addr = fragp->fr_address + fragp->fr_fix + 4;
17628
17629       val -= addr;
17630
17631       toofar = val < - (0x8000 << 1) || val >= (0x8000 << 1);
17632     }
17633   else if (fragp)
17634     /* If the symbol is not defined or it's in a different segment,
17635        assume the user knows what's going on and emit a short
17636        branch.  */
17637     toofar = FALSE;
17638   else
17639     toofar = TRUE;
17640
17641   if (fragp && update
17642       && toofar != RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
17643     fragp->fr_subtype = (toofar
17644                          ? RELAX_MICROMIPS_MARK_TOOFAR32 (fragp->fr_subtype)
17645                          : RELAX_MICROMIPS_CLEAR_TOOFAR32 (fragp->fr_subtype));
17646
17647   length = 4;
17648   if (toofar)
17649     {
17650       bfd_boolean compact_known = fragp != NULL;
17651       bfd_boolean compact = FALSE;
17652       bfd_boolean uncond;
17653
17654       if (compact_known)
17655         compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
17656       if (fragp)
17657         uncond = RELAX_MICROMIPS_UNCOND (fragp->fr_subtype);
17658       else
17659         uncond = update < 0;
17660
17661       /* If label is out of range, we turn branch <br>:
17662
17663                 <br>    label                   # 4 bytes
17664             0:
17665
17666          into:
17667
17668                 j       label                   # 4 bytes
17669                 nop                             # 2 bytes if compact && !PIC
17670             0:
17671        */
17672       if (mips_pic == NO_PIC && (!compact_known || compact))
17673         length += 2;
17674
17675       /* If assembling PIC code, we further turn:
17676
17677                         j       label                   # 4 bytes
17678
17679          into:
17680
17681                         lw/ld   at, %got(label)(gp)     # 4 bytes
17682                         d/addiu at, %lo(label)          # 4 bytes
17683                         jr/c    at                      # 2 bytes
17684        */
17685       if (mips_pic != NO_PIC)
17686         length += 6;
17687
17688       /* If branch <br> is conditional, we prepend negated branch <brneg>:
17689
17690                         <brneg> 0f                      # 4 bytes
17691                         nop                             # 2 bytes if !compact
17692        */
17693       if (!uncond)
17694         length += (compact_known && compact) ? 4 : 6;
17695     }
17696
17697   return length;
17698 }
17699
17700 /* Compute the length of a branch, and adjust the RELAX_MICROMIPS_TOOFAR16
17701    bit accordingly.  */
17702
17703 static int
17704 relaxed_micromips_16bit_branch_length (fragS *fragp, asection *sec, int update)
17705 {
17706   bfd_boolean toofar;
17707
17708   if (fragp
17709       && S_IS_DEFINED (fragp->fr_symbol)
17710       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17711     {
17712       addressT addr;
17713       offsetT val;
17714       int type;
17715
17716       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17717       /* Ignore the low bit in the target, since it will be set
17718          for a text label.  */
17719       if ((val & 1) != 0)
17720         --val;
17721
17722       /* Assume this is a 2-byte branch.  */
17723       addr = fragp->fr_address + fragp->fr_fix + 2;
17724
17725       /* We try to avoid the infinite loop by not adding 2 more bytes for
17726          long branches.  */
17727
17728       val -= addr;
17729
17730       type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
17731       if (type == 'D')
17732         toofar = val < - (0x200 << 1) || val >= (0x200 << 1);
17733       else if (type == 'E')
17734         toofar = val < - (0x40 << 1) || val >= (0x40 << 1);
17735       else
17736         abort ();
17737     }
17738   else
17739     /* If the symbol is not defined or it's in a different segment,
17740        we emit a normal 32-bit branch.  */
17741     toofar = TRUE;
17742
17743   if (fragp && update
17744       && toofar != RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
17745     fragp->fr_subtype
17746       = toofar ? RELAX_MICROMIPS_MARK_TOOFAR16 (fragp->fr_subtype)
17747                : RELAX_MICROMIPS_CLEAR_TOOFAR16 (fragp->fr_subtype);
17748
17749   if (toofar)
17750     return 4;
17751
17752   return 2;
17753 }
17754
17755 /* Estimate the size of a frag before relaxing.  Unless this is the
17756    mips16, we are not really relaxing here, and the final size is
17757    encoded in the subtype information.  For the mips16, we have to
17758    decide whether we are using an extended opcode or not.  */
17759
17760 int
17761 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
17762 {
17763   int change;
17764
17765   if (RELAX_BRANCH_P (fragp->fr_subtype))
17766     {
17767
17768       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
17769
17770       return fragp->fr_var;
17771     }
17772
17773   if (RELAX_MIPS16_P (fragp->fr_subtype))
17774     /* We don't want to modify the EXTENDED bit here; it might get us
17775        into infinite loops.  We change it only in mips_relax_frag().  */
17776     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
17777
17778   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17779     {
17780       int length = 4;
17781
17782       if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
17783         length = relaxed_micromips_16bit_branch_length (fragp, segtype, FALSE);
17784       if (length == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
17785         length = relaxed_micromips_32bit_branch_length (fragp, segtype, FALSE);
17786       fragp->fr_var = length;
17787
17788       return length;
17789     }
17790
17791   if (mips_pic == NO_PIC)
17792     change = nopic_need_relax (fragp->fr_symbol, 0);
17793   else if (mips_pic == SVR4_PIC)
17794     change = pic_need_relax (fragp->fr_symbol, segtype);
17795   else if (mips_pic == VXWORKS_PIC)
17796     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
17797     change = 0;
17798   else
17799     abort ();
17800
17801   if (change)
17802     {
17803       fragp->fr_subtype |= RELAX_USE_SECOND;
17804       return -RELAX_FIRST (fragp->fr_subtype);
17805     }
17806   else
17807     return -RELAX_SECOND (fragp->fr_subtype);
17808 }
17809
17810 /* This is called to see whether a reloc against a defined symbol
17811    should be converted into a reloc against a section.  */
17812
17813 int
17814 mips_fix_adjustable (fixS *fixp)
17815 {
17816   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
17817       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17818     return 0;
17819
17820   if (fixp->fx_addsy == NULL)
17821     return 1;
17822
17823   /* If symbol SYM is in a mergeable section, relocations of the form
17824      SYM + 0 can usually be made section-relative.  The mergeable data
17825      is then identified by the section offset rather than by the symbol.
17826
17827      However, if we're generating REL LO16 relocations, the offset is split
17828      between the LO16 and parterning high part relocation.  The linker will
17829      need to recalculate the complete offset in order to correctly identify
17830      the merge data.
17831
17832      The linker has traditionally not looked for the parterning high part
17833      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
17834      placed anywhere.  Rather than break backwards compatibility by changing
17835      this, it seems better not to force the issue, and instead keep the
17836      original symbol.  This will work with either linker behavior.  */
17837   if ((lo16_reloc_p (fixp->fx_r_type)
17838        || reloc_needs_lo_p (fixp->fx_r_type))
17839       && HAVE_IN_PLACE_ADDENDS
17840       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
17841     return 0;
17842
17843   /* There is no place to store an in-place offset for JALR relocations.
17844      Likewise an in-range offset of limited PC-relative relocations may
17845      overflow the in-place relocatable field if recalculated against the
17846      start address of the symbol's containing section.  */
17847   if (HAVE_IN_PLACE_ADDENDS
17848       && (limited_pcrel_reloc_p (fixp->fx_r_type)
17849           || jalr_reloc_p (fixp->fx_r_type)))
17850     return 0;
17851
17852 #ifdef OBJ_ELF
17853   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
17854      to a floating-point stub.  The same is true for non-R_MIPS16_26
17855      relocations against MIPS16 functions; in this case, the stub becomes
17856      the function's canonical address.
17857
17858      Floating-point stubs are stored in unique .mips16.call.* or
17859      .mips16.fn.* sections.  If a stub T for function F is in section S,
17860      the first relocation in section S must be against F; this is how the
17861      linker determines the target function.  All relocations that might
17862      resolve to T must also be against F.  We therefore have the following
17863      restrictions, which are given in an intentionally-redundant way:
17864
17865        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
17866           symbols.
17867
17868        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
17869           if that stub might be used.
17870
17871        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
17872           symbols.
17873
17874        4. We cannot reduce a stub's relocations against MIPS16 symbols if
17875           that stub might be used.
17876
17877      There is a further restriction:
17878
17879        5. We cannot reduce jump relocations (R_MIPS_26, R_MIPS16_26 or
17880           R_MICROMIPS_26_S1) against MIPS16 or microMIPS symbols on
17881           targets with in-place addends; the relocation field cannot
17882           encode the low bit.
17883
17884      For simplicity, we deal with (3)-(4) by not reducing _any_ relocation
17885      against a MIPS16 symbol.  We deal with (5) by by not reducing any
17886      such relocations on REL targets.
17887
17888      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
17889      relocation against some symbol R, no relocation against R may be
17890      reduced.  (Note that this deals with (2) as well as (1) because
17891      relocations against global symbols will never be reduced on ELF
17892      targets.)  This approach is a little simpler than trying to detect
17893      stub sections, and gives the "all or nothing" per-symbol consistency
17894      that we have for MIPS16 symbols.  */
17895   if (IS_ELF
17896       && fixp->fx_subsy == NULL
17897       && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
17898           || *symbol_get_tc (fixp->fx_addsy)
17899           || (HAVE_IN_PLACE_ADDENDS
17900               && ELF_ST_IS_MICROMIPS (S_GET_OTHER (fixp->fx_addsy))
17901               && jmp_reloc_p (fixp->fx_r_type))))
17902     return 0;
17903 #endif
17904
17905   return 1;
17906 }
17907
17908 /* Translate internal representation of relocation info to BFD target
17909    format.  */
17910
17911 arelent **
17912 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
17913 {
17914   static arelent *retval[4];
17915   arelent *reloc;
17916   bfd_reloc_code_real_type code;
17917
17918   memset (retval, 0, sizeof(retval));
17919   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
17920   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
17921   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
17922   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
17923
17924   if (fixp->fx_pcrel)
17925     {
17926       gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2
17927                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
17928                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
17929                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1
17930                   || fixp->fx_r_type == BFD_RELOC_32_PCREL);
17931
17932       /* At this point, fx_addnumber is "symbol offset - pcrel address".
17933          Relocations want only the symbol offset.  */
17934       reloc->addend = fixp->fx_addnumber + reloc->address;
17935       if (!IS_ELF)
17936         {
17937           /* A gruesome hack which is a result of the gruesome gas
17938              reloc handling.  What's worse, for COFF (as opposed to
17939              ECOFF), we might need yet another copy of reloc->address.
17940              See bfd_install_relocation.  */
17941           reloc->addend += reloc->address;
17942         }
17943     }
17944   else
17945     reloc->addend = fixp->fx_addnumber;
17946
17947   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
17948      entry to be used in the relocation's section offset.  */
17949   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17950     {
17951       reloc->address = reloc->addend;
17952       reloc->addend = 0;
17953     }
17954
17955   code = fixp->fx_r_type;
17956
17957   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
17958   if (reloc->howto == NULL)
17959     {
17960       as_bad_where (fixp->fx_file, fixp->fx_line,
17961                     _("Can not represent %s relocation in this object file format"),
17962                     bfd_get_reloc_code_name (code));
17963       retval[0] = NULL;
17964     }
17965
17966   return retval;
17967 }
17968
17969 /* Relax a machine dependent frag.  This returns the amount by which
17970    the current size of the frag should change.  */
17971
17972 int
17973 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
17974 {
17975   if (RELAX_BRANCH_P (fragp->fr_subtype))
17976     {
17977       offsetT old_var = fragp->fr_var;
17978
17979       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
17980
17981       return fragp->fr_var - old_var;
17982     }
17983
17984   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17985     {
17986       offsetT old_var = fragp->fr_var;
17987       offsetT new_var = 4;
17988
17989       if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
17990         new_var = relaxed_micromips_16bit_branch_length (fragp, sec, TRUE);
17991       if (new_var == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
17992         new_var = relaxed_micromips_32bit_branch_length (fragp, sec, TRUE);
17993       fragp->fr_var = new_var;
17994
17995       return new_var - old_var;
17996     }
17997
17998   if (! RELAX_MIPS16_P (fragp->fr_subtype))
17999     return 0;
18000
18001   if (mips16_extended_frag (fragp, NULL, stretch))
18002     {
18003       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
18004         return 0;
18005       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
18006       return 2;
18007     }
18008   else
18009     {
18010       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
18011         return 0;
18012       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
18013       return -2;
18014     }
18015
18016   return 0;
18017 }
18018
18019 /* Convert a machine dependent frag.  */
18020
18021 void
18022 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
18023 {
18024   if (RELAX_BRANCH_P (fragp->fr_subtype))
18025     {
18026       char *buf;
18027       unsigned long insn;
18028       expressionS exp;
18029       fixS *fixp;
18030
18031       buf = fragp->fr_literal + fragp->fr_fix;
18032       insn = read_insn (buf);
18033
18034       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
18035         {
18036           /* We generate a fixup instead of applying it right now
18037              because, if there are linker relaxations, we're going to
18038              need the relocations.  */
18039           exp.X_op = O_symbol;
18040           exp.X_add_symbol = fragp->fr_symbol;
18041           exp.X_add_number = fragp->fr_offset;
18042
18043           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, TRUE,
18044                               BFD_RELOC_16_PCREL_S2);
18045           fixp->fx_file = fragp->fr_file;
18046           fixp->fx_line = fragp->fr_line;
18047
18048           buf = write_insn (buf, insn);
18049         }
18050       else
18051         {
18052           int i;
18053
18054           as_warn_where (fragp->fr_file, fragp->fr_line,
18055                          _("Relaxed out-of-range branch into a jump"));
18056
18057           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
18058             goto uncond;
18059
18060           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18061             {
18062               /* Reverse the branch.  */
18063               switch ((insn >> 28) & 0xf)
18064                 {
18065                 case 4:
18066                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
18067                      have the condition reversed by tweaking a single
18068                      bit, and their opcodes all have 0x4???????.  */
18069                   gas_assert ((insn & 0xf1000000) == 0x41000000);
18070                   insn ^= 0x00010000;
18071                   break;
18072
18073                 case 0:
18074                   /* bltz       0x04000000      bgez    0x04010000
18075                      bltzal     0x04100000      bgezal  0x04110000  */
18076                   gas_assert ((insn & 0xfc0e0000) == 0x04000000);
18077                   insn ^= 0x00010000;
18078                   break;
18079
18080                 case 1:
18081                   /* beq        0x10000000      bne     0x14000000
18082                      blez       0x18000000      bgtz    0x1c000000  */
18083                   insn ^= 0x04000000;
18084                   break;
18085
18086                 default:
18087                   abort ();
18088                 }
18089             }
18090
18091           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
18092             {
18093               /* Clear the and-link bit.  */
18094               gas_assert ((insn & 0xfc1c0000) == 0x04100000);
18095
18096               /* bltzal         0x04100000      bgezal  0x04110000
18097                  bltzall        0x04120000      bgezall 0x04130000  */
18098               insn &= ~0x00100000;
18099             }
18100
18101           /* Branch over the branch (if the branch was likely) or the
18102              full jump (not likely case).  Compute the offset from the
18103              current instruction to branch to.  */
18104           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18105             i = 16;
18106           else
18107             {
18108               /* How many bytes in instructions we've already emitted?  */
18109               i = buf - fragp->fr_literal - fragp->fr_fix;
18110               /* How many bytes in instructions from here to the end?  */
18111               i = fragp->fr_var - i;
18112             }
18113           /* Convert to instruction count.  */
18114           i >>= 2;
18115           /* Branch counts from the next instruction.  */
18116           i--;
18117           insn |= i;
18118           /* Branch over the jump.  */
18119           buf = write_insn (buf, insn);
18120
18121           /* nop */
18122           buf = write_insn (buf, 0);
18123
18124           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18125             {
18126               /* beql $0, $0, 2f */
18127               insn = 0x50000000;
18128               /* Compute the PC offset from the current instruction to
18129                  the end of the variable frag.  */
18130               /* How many bytes in instructions we've already emitted?  */
18131               i = buf - fragp->fr_literal - fragp->fr_fix;
18132               /* How many bytes in instructions from here to the end?  */
18133               i = fragp->fr_var - i;
18134               /* Convert to instruction count.  */
18135               i >>= 2;
18136               /* Don't decrement i, because we want to branch over the
18137                  delay slot.  */
18138               insn |= i;
18139
18140               buf = write_insn (buf, insn);
18141               buf = write_insn (buf, 0);
18142             }
18143
18144         uncond:
18145           if (mips_pic == NO_PIC)
18146             {
18147               /* j or jal.  */
18148               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
18149                       ? 0x0c000000 : 0x08000000);
18150               exp.X_op = O_symbol;
18151               exp.X_add_symbol = fragp->fr_symbol;
18152               exp.X_add_number = fragp->fr_offset;
18153
18154               fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18155                                   FALSE, BFD_RELOC_MIPS_JMP);
18156               fixp->fx_file = fragp->fr_file;
18157               fixp->fx_line = fragp->fr_line;
18158
18159               buf = write_insn (buf, insn);
18160             }
18161           else
18162             {
18163               unsigned long at = RELAX_BRANCH_AT (fragp->fr_subtype);
18164
18165               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
18166               insn = HAVE_64BIT_ADDRESSES ? 0xdf800000 : 0x8f800000;
18167               insn |= at << OP_SH_RT;
18168               exp.X_op = O_symbol;
18169               exp.X_add_symbol = fragp->fr_symbol;
18170               exp.X_add_number = fragp->fr_offset;
18171
18172               if (fragp->fr_offset)
18173                 {
18174                   exp.X_add_symbol = make_expr_symbol (&exp);
18175                   exp.X_add_number = 0;
18176                 }
18177
18178               fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18179                                   FALSE, BFD_RELOC_MIPS_GOT16);
18180               fixp->fx_file = fragp->fr_file;
18181               fixp->fx_line = fragp->fr_line;
18182
18183               buf = write_insn (buf, insn);
18184
18185               if (mips_opts.isa == ISA_MIPS1)
18186                 /* nop */
18187                 buf = write_insn (buf, 0);
18188
18189               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
18190               insn = HAVE_64BIT_ADDRESSES ? 0x64000000 : 0x24000000;
18191               insn |= at << OP_SH_RS | at << OP_SH_RT;
18192
18193               fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18194                                   FALSE, BFD_RELOC_LO16);
18195               fixp->fx_file = fragp->fr_file;
18196               fixp->fx_line = fragp->fr_line;
18197
18198               buf = write_insn (buf, insn);
18199
18200               /* j(al)r $at.  */
18201               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
18202                 insn = 0x0000f809;
18203               else
18204                 insn = 0x00000008;
18205               insn |= at << OP_SH_RS;
18206
18207               buf = write_insn (buf, insn);
18208             }
18209         }
18210
18211       fragp->fr_fix += fragp->fr_var;
18212       gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18213       return;
18214     }
18215
18216   /* Relax microMIPS branches.  */
18217   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
18218     {
18219       char *buf = fragp->fr_literal + fragp->fr_fix;
18220       bfd_boolean compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
18221       bfd_boolean al = RELAX_MICROMIPS_LINK (fragp->fr_subtype);
18222       int type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
18223       bfd_boolean short_ds;
18224       unsigned long insn;
18225       expressionS exp;
18226       fixS *fixp;
18227
18228       exp.X_op = O_symbol;
18229       exp.X_add_symbol = fragp->fr_symbol;
18230       exp.X_add_number = fragp->fr_offset;
18231
18232       fragp->fr_fix += fragp->fr_var;
18233
18234       /* Handle 16-bit branches that fit or are forced to fit.  */
18235       if (type != 0 && !RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
18236         {
18237           /* We generate a fixup instead of applying it right now,
18238              because if there is linker relaxation, we're going to
18239              need the relocations.  */
18240           if (type == 'D')
18241             fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 2, &exp, TRUE,
18242                                 BFD_RELOC_MICROMIPS_10_PCREL_S1);
18243           else if (type == 'E')
18244             fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 2, &exp, TRUE,
18245                                 BFD_RELOC_MICROMIPS_7_PCREL_S1);
18246           else
18247             abort ();
18248
18249           fixp->fx_file = fragp->fr_file;
18250           fixp->fx_line = fragp->fr_line;
18251
18252           /* These relocations can have an addend that won't fit in
18253              2 octets.  */
18254           fixp->fx_no_overflow = 1;
18255
18256           return;
18257         }
18258
18259       /* Handle 32-bit branches that fit or are forced to fit.  */
18260       if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
18261           || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
18262         {
18263           /* We generate a fixup instead of applying it right now,
18264              because if there is linker relaxation, we're going to
18265              need the relocations.  */
18266           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, TRUE,
18267                               BFD_RELOC_MICROMIPS_16_PCREL_S1);
18268           fixp->fx_file = fragp->fr_file;
18269           fixp->fx_line = fragp->fr_line;
18270
18271           if (type == 0)
18272             return;
18273         }
18274
18275       /* Relax 16-bit branches to 32-bit branches.  */
18276       if (type != 0)
18277         {
18278           insn = read_compressed_insn (buf, 2);
18279
18280           if ((insn & 0xfc00) == 0xcc00)                /* b16  */
18281             insn = 0x94000000;                          /* beq  */
18282           else if ((insn & 0xdc00) == 0x8c00)           /* beqz16/bnez16  */
18283             {
18284               unsigned long regno;
18285
18286               regno = (insn >> MICROMIPSOP_SH_MD) & MICROMIPSOP_MASK_MD;
18287               regno = micromips_to_32_reg_d_map [regno];
18288               insn = ((insn & 0x2000) << 16) | 0x94000000;      /* beq/bne  */
18289               insn |= regno << MICROMIPSOP_SH_RS;
18290             }
18291           else
18292             abort ();
18293
18294           /* Nothing else to do, just write it out.  */
18295           if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
18296               || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
18297             {
18298               buf = write_compressed_insn (buf, insn, 4);
18299               gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18300               return;
18301             }
18302         }
18303       else
18304         insn = read_compressed_insn (buf, 4);
18305
18306       /* Relax 32-bit branches to a sequence of instructions.  */
18307       as_warn_where (fragp->fr_file, fragp->fr_line,
18308                      _("Relaxed out-of-range branch into a jump"));
18309
18310       /* Set the short-delay-slot bit.  */
18311       short_ds = al && (insn & 0x02000000) != 0;
18312
18313       if (!RELAX_MICROMIPS_UNCOND (fragp->fr_subtype))
18314         {
18315           symbolS *l;
18316
18317           /* Reverse the branch.  */
18318           if ((insn & 0xfc000000) == 0x94000000                 /* beq  */
18319               || (insn & 0xfc000000) == 0xb4000000)             /* bne  */
18320             insn ^= 0x20000000;
18321           else if ((insn & 0xffe00000) == 0x40000000            /* bltz  */
18322                    || (insn & 0xffe00000) == 0x40400000         /* bgez  */
18323                    || (insn & 0xffe00000) == 0x40800000         /* blez  */
18324                    || (insn & 0xffe00000) == 0x40c00000         /* bgtz  */
18325                    || (insn & 0xffe00000) == 0x40a00000         /* bnezc  */
18326                    || (insn & 0xffe00000) == 0x40e00000         /* beqzc  */
18327                    || (insn & 0xffe00000) == 0x40200000         /* bltzal  */
18328                    || (insn & 0xffe00000) == 0x40600000         /* bgezal  */
18329                    || (insn & 0xffe00000) == 0x42200000         /* bltzals  */
18330                    || (insn & 0xffe00000) == 0x42600000)        /* bgezals  */
18331             insn ^= 0x00400000;
18332           else if ((insn & 0xffe30000) == 0x43800000            /* bc1f  */
18333                    || (insn & 0xffe30000) == 0x43a00000         /* bc1t  */
18334                    || (insn & 0xffe30000) == 0x42800000         /* bc2f  */
18335                    || (insn & 0xffe30000) == 0x42a00000)        /* bc2t  */
18336             insn ^= 0x00200000;
18337           else
18338             abort ();
18339
18340           if (al)
18341             {
18342               /* Clear the and-link and short-delay-slot bits.  */
18343               gas_assert ((insn & 0xfda00000) == 0x40200000);
18344
18345               /* bltzal  0x40200000     bgezal  0x40600000  */
18346               /* bltzals 0x42200000     bgezals 0x42600000  */
18347               insn &= ~0x02200000;
18348             }
18349
18350           /* Make a label at the end for use with the branch.  */
18351           l = symbol_new (micromips_label_name (), asec, fragp->fr_fix, fragp);
18352           micromips_label_inc ();
18353 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
18354           if (IS_ELF)
18355             S_SET_OTHER (l, ELF_ST_SET_MICROMIPS (S_GET_OTHER (l)));
18356 #endif
18357
18358           /* Refer to it.  */
18359           fixp = fix_new (fragp, buf - fragp->fr_literal, 4, l, 0, TRUE,
18360                           BFD_RELOC_MICROMIPS_16_PCREL_S1);
18361           fixp->fx_file = fragp->fr_file;
18362           fixp->fx_line = fragp->fr_line;
18363
18364           /* Branch over the jump.  */
18365           buf = write_compressed_insn (buf, insn, 4);
18366           if (!compact)
18367             /* nop */
18368             buf = write_compressed_insn (buf, 0x0c00, 2);
18369         }
18370
18371       if (mips_pic == NO_PIC)
18372         {
18373           unsigned long jal = short_ds ? 0x74000000 : 0xf4000000; /* jal/s  */
18374
18375           /* j/jal/jals <sym>  R_MICROMIPS_26_S1  */
18376           insn = al ? jal : 0xd4000000;
18377
18378           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18379                               BFD_RELOC_MICROMIPS_JMP);
18380           fixp->fx_file = fragp->fr_file;
18381           fixp->fx_line = fragp->fr_line;
18382
18383           buf = write_compressed_insn (buf, insn, 4);
18384           if (compact)
18385             /* nop */
18386             buf = write_compressed_insn (buf, 0x0c00, 2);
18387         }
18388       else
18389         {
18390           unsigned long at = RELAX_MICROMIPS_AT (fragp->fr_subtype);
18391           unsigned long jalr = short_ds ? 0x45e0 : 0x45c0;      /* jalr/s  */
18392           unsigned long jr = compact ? 0x45a0 : 0x4580;         /* jr/c  */
18393
18394           /* lw/ld $at, <sym>($gp)  R_MICROMIPS_GOT16  */
18395           insn = HAVE_64BIT_ADDRESSES ? 0xdc1c0000 : 0xfc1c0000;
18396           insn |= at << MICROMIPSOP_SH_RT;
18397
18398           if (exp.X_add_number)
18399             {
18400               exp.X_add_symbol = make_expr_symbol (&exp);
18401               exp.X_add_number = 0;
18402             }
18403
18404           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18405                               BFD_RELOC_MICROMIPS_GOT16);
18406           fixp->fx_file = fragp->fr_file;
18407           fixp->fx_line = fragp->fr_line;
18408
18409           buf = write_compressed_insn (buf, insn, 4);
18410
18411           /* d/addiu $at, $at, <sym>  R_MICROMIPS_LO16  */
18412           insn = HAVE_64BIT_ADDRESSES ? 0x5c000000 : 0x30000000;
18413           insn |= at << MICROMIPSOP_SH_RT | at << MICROMIPSOP_SH_RS;
18414
18415           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18416                               BFD_RELOC_MICROMIPS_LO16);
18417           fixp->fx_file = fragp->fr_file;
18418           fixp->fx_line = fragp->fr_line;
18419
18420           buf = write_compressed_insn (buf, insn, 4);
18421
18422           /* jr/jrc/jalr/jalrs $at  */
18423           insn = al ? jalr : jr;
18424           insn |= at << MICROMIPSOP_SH_MJ;
18425
18426           buf = write_compressed_insn (buf, insn, 2);
18427         }
18428
18429       gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18430       return;
18431     }
18432
18433   if (RELAX_MIPS16_P (fragp->fr_subtype))
18434     {
18435       int type;
18436       const struct mips16_immed_operand *op;
18437       offsetT val;
18438       char *buf;
18439       unsigned int user_length, length;
18440       unsigned long insn;
18441       bfd_boolean ext;
18442
18443       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
18444       op = mips16_immed_operands;
18445       while (op->type != type)
18446         ++op;
18447
18448       ext = RELAX_MIPS16_EXTENDED (fragp->fr_subtype);
18449       val = resolve_symbol_value (fragp->fr_symbol);
18450       if (op->pcrel)
18451         {
18452           addressT addr;
18453
18454           addr = fragp->fr_address + fragp->fr_fix;
18455
18456           /* The rules for the base address of a PC relative reloc are
18457              complicated; see mips16_extended_frag.  */
18458           if (type == 'p' || type == 'q')
18459             {
18460               addr += 2;
18461               if (ext)
18462                 addr += 2;
18463               /* Ignore the low bit in the target, since it will be
18464                  set for a text label.  */
18465               if ((val & 1) != 0)
18466                 --val;
18467             }
18468           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
18469             addr -= 4;
18470           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
18471             addr -= 2;
18472
18473           addr &= ~ (addressT) ((1 << op->shift) - 1);
18474           val -= addr;
18475
18476           /* Make sure the section winds up with the alignment we have
18477              assumed.  */
18478           if (op->shift > 0)
18479             record_alignment (asec, op->shift);
18480         }
18481
18482       if (ext
18483           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
18484               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
18485         as_warn_where (fragp->fr_file, fragp->fr_line,
18486                        _("extended instruction in delay slot"));
18487
18488       buf = fragp->fr_literal + fragp->fr_fix;
18489
18490       insn = read_compressed_insn (buf, 2);
18491       if (ext)
18492         insn |= MIPS16_EXTEND;
18493
18494       if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
18495         user_length = 4;
18496       else if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
18497         user_length = 2;
18498       else
18499         user_length = 0;
18500
18501       mips16_immed (fragp->fr_file, fragp->fr_line, type,
18502                     BFD_RELOC_UNUSED, val, user_length, &insn);
18503
18504       length = (ext ? 4 : 2);
18505       gas_assert (mips16_opcode_length (insn) == length);
18506       write_compressed_insn (buf, insn, length);
18507       fragp->fr_fix += length;
18508     }
18509   else
18510     {
18511       relax_substateT subtype = fragp->fr_subtype;
18512       bfd_boolean second_longer = (subtype & RELAX_SECOND_LONGER) != 0;
18513       bfd_boolean use_second = (subtype & RELAX_USE_SECOND) != 0;
18514       int first, second;
18515       fixS *fixp;
18516
18517       first = RELAX_FIRST (subtype);
18518       second = RELAX_SECOND (subtype);
18519       fixp = (fixS *) fragp->fr_opcode;
18520
18521       /* If the delay slot chosen does not match the size of the instruction,
18522          then emit a warning.  */
18523       if ((!use_second && (subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0)
18524            || (use_second && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0))
18525         {
18526           relax_substateT s;
18527           const char *msg;
18528
18529           s = subtype & (RELAX_DELAY_SLOT_16BIT
18530                          | RELAX_DELAY_SLOT_SIZE_FIRST
18531                          | RELAX_DELAY_SLOT_SIZE_SECOND);
18532           msg = macro_warning (s);
18533           if (msg != NULL)
18534             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18535           subtype &= ~s;
18536         }
18537
18538       /* Possibly emit a warning if we've chosen the longer option.  */
18539       if (use_second == second_longer)
18540         {
18541           relax_substateT s;
18542           const char *msg;
18543
18544           s = (subtype
18545                & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT));
18546           msg = macro_warning (s);
18547           if (msg != NULL)
18548             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18549           subtype &= ~s;
18550         }
18551
18552       /* Go through all the fixups for the first sequence.  Disable them
18553          (by marking them as done) if we're going to use the second
18554          sequence instead.  */
18555       while (fixp
18556              && fixp->fx_frag == fragp
18557              && fixp->fx_where < fragp->fr_fix - second)
18558         {
18559           if (subtype & RELAX_USE_SECOND)
18560             fixp->fx_done = 1;
18561           fixp = fixp->fx_next;
18562         }
18563
18564       /* Go through the fixups for the second sequence.  Disable them if
18565          we're going to use the first sequence, otherwise adjust their
18566          addresses to account for the relaxation.  */
18567       while (fixp && fixp->fx_frag == fragp)
18568         {
18569           if (subtype & RELAX_USE_SECOND)
18570             fixp->fx_where -= first;
18571           else
18572             fixp->fx_done = 1;
18573           fixp = fixp->fx_next;
18574         }
18575
18576       /* Now modify the frag contents.  */
18577       if (subtype & RELAX_USE_SECOND)
18578         {
18579           char *start;
18580
18581           start = fragp->fr_literal + fragp->fr_fix - first - second;
18582           memmove (start, start + first, second);
18583           fragp->fr_fix -= first;
18584         }
18585       else
18586         fragp->fr_fix -= second;
18587     }
18588 }
18589
18590 #ifdef OBJ_ELF
18591
18592 /* This function is called after the relocs have been generated.
18593    We've been storing mips16 text labels as odd.  Here we convert them
18594    back to even for the convenience of the debugger.  */
18595
18596 void
18597 mips_frob_file_after_relocs (void)
18598 {
18599   asymbol **syms;
18600   unsigned int count, i;
18601
18602   if (!IS_ELF)
18603     return;
18604
18605   syms = bfd_get_outsymbols (stdoutput);
18606   count = bfd_get_symcount (stdoutput);
18607   for (i = 0; i < count; i++, syms++)
18608     if (ELF_ST_IS_COMPRESSED (elf_symbol (*syms)->internal_elf_sym.st_other)
18609         && ((*syms)->value & 1) != 0)
18610       {
18611         (*syms)->value &= ~1;
18612         /* If the symbol has an odd size, it was probably computed
18613            incorrectly, so adjust that as well.  */
18614         if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
18615           ++elf_symbol (*syms)->internal_elf_sym.st_size;
18616       }
18617 }
18618
18619 #endif
18620
18621 /* This function is called whenever a label is defined, including fake
18622    labels instantiated off the dot special symbol.  It is used when
18623    handling branch delays; if a branch has a label, we assume we cannot
18624    move it.  This also bumps the value of the symbol by 1 in compressed
18625    code.  */
18626
18627 static void
18628 mips_record_label (symbolS *sym)
18629 {
18630   segment_info_type *si = seg_info (now_seg);
18631   struct insn_label_list *l;
18632
18633   if (free_insn_labels == NULL)
18634     l = (struct insn_label_list *) xmalloc (sizeof *l);
18635   else
18636     {
18637       l = free_insn_labels;
18638       free_insn_labels = l->next;
18639     }
18640
18641   l->label = sym;
18642   l->next = si->label_list;
18643   si->label_list = l;
18644 }
18645
18646 /* This function is called as tc_frob_label() whenever a label is defined
18647    and adds a DWARF-2 record we only want for true labels.  */
18648
18649 void
18650 mips_define_label (symbolS *sym)
18651 {
18652   mips_record_label (sym);
18653 #ifdef OBJ_ELF
18654   dwarf2_emit_label (sym);
18655 #endif
18656 }
18657
18658 /* This function is called by tc_new_dot_label whenever a new dot symbol
18659    is defined.  */
18660
18661 void
18662 mips_add_dot_label (symbolS *sym)
18663 {
18664   mips_record_label (sym);
18665   if (mips_assembling_insn && HAVE_CODE_COMPRESSION)
18666     mips_compressed_mark_label (sym);
18667 }
18668 \f
18669 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
18670
18671 /* Some special processing for a MIPS ELF file.  */
18672
18673 void
18674 mips_elf_final_processing (void)
18675 {
18676   /* Write out the register information.  */
18677   if (mips_abi != N64_ABI)
18678     {
18679       Elf32_RegInfo s;
18680
18681       s.ri_gprmask = mips_gprmask;
18682       s.ri_cprmask[0] = mips_cprmask[0];
18683       s.ri_cprmask[1] = mips_cprmask[1];
18684       s.ri_cprmask[2] = mips_cprmask[2];
18685       s.ri_cprmask[3] = mips_cprmask[3];
18686       /* The gp_value field is set by the MIPS ELF backend.  */
18687
18688       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
18689                                        ((Elf32_External_RegInfo *)
18690                                         mips_regmask_frag));
18691     }
18692   else
18693     {
18694       Elf64_Internal_RegInfo s;
18695
18696       s.ri_gprmask = mips_gprmask;
18697       s.ri_pad = 0;
18698       s.ri_cprmask[0] = mips_cprmask[0];
18699       s.ri_cprmask[1] = mips_cprmask[1];
18700       s.ri_cprmask[2] = mips_cprmask[2];
18701       s.ri_cprmask[3] = mips_cprmask[3];
18702       /* The gp_value field is set by the MIPS ELF backend.  */
18703
18704       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
18705                                        ((Elf64_External_RegInfo *)
18706                                         mips_regmask_frag));
18707     }
18708
18709   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
18710      sort of BFD interface for this.  */
18711   if (mips_any_noreorder)
18712     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
18713   if (mips_pic != NO_PIC)
18714     {
18715       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
18716       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18717     }
18718   if (mips_abicalls)
18719     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18720
18721   /* Set MIPS ELF flags for ASEs.  */
18722   /* We may need to define a new flag for DSP ASE, and set this flag when
18723      file_ase_dsp is true.  */
18724   /* Same for DSP R2.  */
18725   /* We may need to define a new flag for MT ASE, and set this flag when
18726      file_ase_mt is true.  */
18727   if (file_ase_mips16)
18728     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
18729   if (file_ase_micromips)
18730     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MICROMIPS;
18731 #if 0 /* XXX FIXME */
18732   if (file_ase_mips3d)
18733     elf_elfheader (stdoutput)->e_flags |= ???;
18734 #endif
18735   if (file_ase_mdmx)
18736     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
18737
18738   /* Set the MIPS ELF ABI flags.  */
18739   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
18740     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
18741   else if (mips_abi == O64_ABI)
18742     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
18743   else if (mips_abi == EABI_ABI)
18744     {
18745       if (!file_mips_gp32)
18746         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
18747       else
18748         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
18749     }
18750   else if (mips_abi == N32_ABI)
18751     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
18752
18753   /* Nothing to do for N64_ABI.  */
18754
18755   if (mips_32bitmode)
18756     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
18757
18758 #if 0 /* XXX FIXME */
18759   /* 32 bit code with 64 bit FP registers.  */
18760   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
18761     elf_elfheader (stdoutput)->e_flags |= ???;
18762 #endif
18763 }
18764
18765 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
18766 \f
18767 typedef struct proc {
18768   symbolS *func_sym;
18769   symbolS *func_end_sym;
18770   unsigned long reg_mask;
18771   unsigned long reg_offset;
18772   unsigned long fpreg_mask;
18773   unsigned long fpreg_offset;
18774   unsigned long frame_offset;
18775   unsigned long frame_reg;
18776   unsigned long pc_reg;
18777 } procS;
18778
18779 static procS cur_proc;
18780 static procS *cur_proc_ptr;
18781 static int numprocs;
18782
18783 /* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1", a microMIPS nop
18784    as "2", and a normal nop as "0".  */
18785
18786 #define NOP_OPCODE_MIPS         0
18787 #define NOP_OPCODE_MIPS16       1
18788 #define NOP_OPCODE_MICROMIPS    2
18789
18790 char
18791 mips_nop_opcode (void)
18792 {
18793   if (seg_info (now_seg)->tc_segment_info_data.micromips)
18794     return NOP_OPCODE_MICROMIPS;
18795   else if (seg_info (now_seg)->tc_segment_info_data.mips16)
18796     return NOP_OPCODE_MIPS16;
18797   else
18798     return NOP_OPCODE_MIPS;
18799 }
18800
18801 /* Fill in an rs_align_code fragment.  Unlike elsewhere we want to use
18802    32-bit microMIPS NOPs here (if applicable).  */
18803
18804 void
18805 mips_handle_align (fragS *fragp)
18806 {
18807   char nop_opcode;
18808   char *p;
18809   int bytes, size, excess;
18810   valueT opcode;
18811
18812   if (fragp->fr_type != rs_align_code)
18813     return;
18814
18815   p = fragp->fr_literal + fragp->fr_fix;
18816   nop_opcode = *p;
18817   switch (nop_opcode)
18818     {
18819     case NOP_OPCODE_MICROMIPS:
18820       opcode = micromips_nop32_insn.insn_opcode;
18821       size = 4;
18822       break;
18823     case NOP_OPCODE_MIPS16:
18824       opcode = mips16_nop_insn.insn_opcode;
18825       size = 2;
18826       break;
18827     case NOP_OPCODE_MIPS:
18828     default:
18829       opcode = nop_insn.insn_opcode;
18830       size = 4;
18831       break;
18832     }
18833
18834   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
18835   excess = bytes % size;
18836
18837   /* Handle the leading part if we're not inserting a whole number of
18838      instructions, and make it the end of the fixed part of the frag.
18839      Try to fit in a short microMIPS NOP if applicable and possible,
18840      and use zeroes otherwise.  */
18841   gas_assert (excess < 4);
18842   fragp->fr_fix += excess;
18843   switch (excess)
18844     {
18845     case 3:
18846       *p++ = '\0';
18847       /* Fall through.  */
18848     case 2:
18849       if (nop_opcode == NOP_OPCODE_MICROMIPS)
18850         {
18851           p = write_compressed_insn (p, micromips_nop16_insn.insn_opcode, 2);
18852           break;
18853         }
18854       *p++ = '\0';
18855       /* Fall through.  */
18856     case 1:
18857       *p++ = '\0';
18858       /* Fall through.  */
18859     case 0:
18860       break;
18861     }
18862
18863   md_number_to_chars (p, opcode, size);
18864   fragp->fr_var = size;
18865 }
18866
18867 static void
18868 md_obj_begin (void)
18869 {
18870 }
18871
18872 static void
18873 md_obj_end (void)
18874 {
18875   /* Check for premature end, nesting errors, etc.  */
18876   if (cur_proc_ptr)
18877     as_warn (_("missing .end at end of assembly"));
18878 }
18879
18880 static long
18881 get_number (void)
18882 {
18883   int negative = 0;
18884   long val = 0;
18885
18886   if (*input_line_pointer == '-')
18887     {
18888       ++input_line_pointer;
18889       negative = 1;
18890     }
18891   if (!ISDIGIT (*input_line_pointer))
18892     as_bad (_("expected simple number"));
18893   if (input_line_pointer[0] == '0')
18894     {
18895       if (input_line_pointer[1] == 'x')
18896         {
18897           input_line_pointer += 2;
18898           while (ISXDIGIT (*input_line_pointer))
18899             {
18900               val <<= 4;
18901               val |= hex_value (*input_line_pointer++);
18902             }
18903           return negative ? -val : val;
18904         }
18905       else
18906         {
18907           ++input_line_pointer;
18908           while (ISDIGIT (*input_line_pointer))
18909             {
18910               val <<= 3;
18911               val |= *input_line_pointer++ - '0';
18912             }
18913           return negative ? -val : val;
18914         }
18915     }
18916   if (!ISDIGIT (*input_line_pointer))
18917     {
18918       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
18919               *input_line_pointer, *input_line_pointer);
18920       as_warn (_("invalid number"));
18921       return -1;
18922     }
18923   while (ISDIGIT (*input_line_pointer))
18924     {
18925       val *= 10;
18926       val += *input_line_pointer++ - '0';
18927     }
18928   return negative ? -val : val;
18929 }
18930
18931 /* The .file directive; just like the usual .file directive, but there
18932    is an initial number which is the ECOFF file index.  In the non-ECOFF
18933    case .file implies DWARF-2.  */
18934
18935 static void
18936 s_mips_file (int x ATTRIBUTE_UNUSED)
18937 {
18938   static int first_file_directive = 0;
18939
18940   if (ECOFF_DEBUGGING)
18941     {
18942       get_number ();
18943       s_app_file (0);
18944     }
18945   else
18946     {
18947       char *filename;
18948
18949       filename = dwarf2_directive_file (0);
18950
18951       /* Versions of GCC up to 3.1 start files with a ".file"
18952          directive even for stabs output.  Make sure that this
18953          ".file" is handled.  Note that you need a version of GCC
18954          after 3.1 in order to support DWARF-2 on MIPS.  */
18955       if (filename != NULL && ! first_file_directive)
18956         {
18957           (void) new_logical_line (filename, -1);
18958           s_app_file_string (filename, 0);
18959         }
18960       first_file_directive = 1;
18961     }
18962 }
18963
18964 /* The .loc directive, implying DWARF-2.  */
18965
18966 static void
18967 s_mips_loc (int x ATTRIBUTE_UNUSED)
18968 {
18969   if (!ECOFF_DEBUGGING)
18970     dwarf2_directive_loc (0);
18971 }
18972
18973 /* The .end directive.  */
18974
18975 static void
18976 s_mips_end (int x ATTRIBUTE_UNUSED)
18977 {
18978   symbolS *p;
18979
18980   /* Following functions need their own .frame and .cprestore directives.  */
18981   mips_frame_reg_valid = 0;
18982   mips_cprestore_valid = 0;
18983
18984   if (!is_end_of_line[(unsigned char) *input_line_pointer])
18985     {
18986       p = get_symbol ();
18987       demand_empty_rest_of_line ();
18988     }
18989   else
18990     p = NULL;
18991
18992   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
18993     as_warn (_(".end not in text section"));
18994
18995   if (!cur_proc_ptr)
18996     {
18997       as_warn (_(".end directive without a preceding .ent directive."));
18998       demand_empty_rest_of_line ();
18999       return;
19000     }
19001
19002   if (p != NULL)
19003     {
19004       gas_assert (S_GET_NAME (p));
19005       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
19006         as_warn (_(".end symbol does not match .ent symbol."));
19007
19008       if (debug_type == DEBUG_STABS)
19009         stabs_generate_asm_endfunc (S_GET_NAME (p),
19010                                     S_GET_NAME (p));
19011     }
19012   else
19013     as_warn (_(".end directive missing or unknown symbol"));
19014
19015 #ifdef OBJ_ELF
19016   /* Create an expression to calculate the size of the function.  */
19017   if (p && cur_proc_ptr)
19018     {
19019       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
19020       expressionS *exp = xmalloc (sizeof (expressionS));
19021
19022       obj->size = exp;
19023       exp->X_op = O_subtract;
19024       exp->X_add_symbol = symbol_temp_new_now ();
19025       exp->X_op_symbol = p;
19026       exp->X_add_number = 0;
19027
19028       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
19029     }
19030
19031   /* Generate a .pdr section.  */
19032   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
19033     {
19034       segT saved_seg = now_seg;
19035       subsegT saved_subseg = now_subseg;
19036       expressionS exp;
19037       char *fragp;
19038
19039 #ifdef md_flush_pending_output
19040       md_flush_pending_output ();
19041 #endif
19042
19043       gas_assert (pdr_seg);
19044       subseg_set (pdr_seg, 0);
19045
19046       /* Write the symbol.  */
19047       exp.X_op = O_symbol;
19048       exp.X_add_symbol = p;
19049       exp.X_add_number = 0;
19050       emit_expr (&exp, 4);
19051
19052       fragp = frag_more (7 * 4);
19053
19054       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
19055       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
19056       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
19057       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
19058       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
19059       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
19060       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
19061
19062       subseg_set (saved_seg, saved_subseg);
19063     }
19064 #endif /* OBJ_ELF */
19065
19066   cur_proc_ptr = NULL;
19067 }
19068
19069 /* The .aent and .ent directives.  */
19070
19071 static void
19072 s_mips_ent (int aent)
19073 {
19074   symbolS *symbolP;
19075
19076   symbolP = get_symbol ();
19077   if (*input_line_pointer == ',')
19078     ++input_line_pointer;
19079   SKIP_WHITESPACE ();
19080   if (ISDIGIT (*input_line_pointer)
19081       || *input_line_pointer == '-')
19082     get_number ();
19083
19084   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
19085     as_warn (_(".ent or .aent not in text section."));
19086
19087   if (!aent && cur_proc_ptr)
19088     as_warn (_("missing .end"));
19089
19090   if (!aent)
19091     {
19092       /* This function needs its own .frame and .cprestore directives.  */
19093       mips_frame_reg_valid = 0;
19094       mips_cprestore_valid = 0;
19095
19096       cur_proc_ptr = &cur_proc;
19097       memset (cur_proc_ptr, '\0', sizeof (procS));
19098
19099       cur_proc_ptr->func_sym = symbolP;
19100
19101       ++numprocs;
19102
19103       if (debug_type == DEBUG_STABS)
19104         stabs_generate_asm_func (S_GET_NAME (symbolP),
19105                                  S_GET_NAME (symbolP));
19106     }
19107
19108   symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
19109
19110   demand_empty_rest_of_line ();
19111 }
19112
19113 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
19114    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
19115    s_mips_frame is used so that we can set the PDR information correctly.
19116    We can't use the ecoff routines because they make reference to the ecoff
19117    symbol table (in the mdebug section).  */
19118
19119 static void
19120 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
19121 {
19122 #ifdef OBJ_ELF
19123   if (IS_ELF && !ECOFF_DEBUGGING)
19124     {
19125       long val;
19126
19127       if (cur_proc_ptr == (procS *) NULL)
19128         {
19129           as_warn (_(".frame outside of .ent"));
19130           demand_empty_rest_of_line ();
19131           return;
19132         }
19133
19134       cur_proc_ptr->frame_reg = tc_get_register (1);
19135
19136       SKIP_WHITESPACE ();
19137       if (*input_line_pointer++ != ','
19138           || get_absolute_expression_and_terminator (&val) != ',')
19139         {
19140           as_warn (_("Bad .frame directive"));
19141           --input_line_pointer;
19142           demand_empty_rest_of_line ();
19143           return;
19144         }
19145
19146       cur_proc_ptr->frame_offset = val;
19147       cur_proc_ptr->pc_reg = tc_get_register (0);
19148
19149       demand_empty_rest_of_line ();
19150     }
19151   else
19152 #endif /* OBJ_ELF */
19153     s_ignore (ignore);
19154 }
19155
19156 /* The .fmask and .mask directives. If the mdebug section is present
19157    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
19158    embedded targets, s_mips_mask is used so that we can set the PDR
19159    information correctly. We can't use the ecoff routines because they
19160    make reference to the ecoff symbol table (in the mdebug section).  */
19161
19162 static void
19163 s_mips_mask (int reg_type)
19164 {
19165 #ifdef OBJ_ELF
19166   if (IS_ELF && !ECOFF_DEBUGGING)
19167     {
19168       long mask, off;
19169
19170       if (cur_proc_ptr == (procS *) NULL)
19171         {
19172           as_warn (_(".mask/.fmask outside of .ent"));
19173           demand_empty_rest_of_line ();
19174           return;
19175         }
19176
19177       if (get_absolute_expression_and_terminator (&mask) != ',')
19178         {
19179           as_warn (_("Bad .mask/.fmask directive"));
19180           --input_line_pointer;
19181           demand_empty_rest_of_line ();
19182           return;
19183         }
19184
19185       off = get_absolute_expression ();
19186
19187       if (reg_type == 'F')
19188         {
19189           cur_proc_ptr->fpreg_mask = mask;
19190           cur_proc_ptr->fpreg_offset = off;
19191         }
19192       else
19193         {
19194           cur_proc_ptr->reg_mask = mask;
19195           cur_proc_ptr->reg_offset = off;
19196         }
19197
19198       demand_empty_rest_of_line ();
19199     }
19200   else
19201 #endif /* OBJ_ELF */
19202     s_ignore (reg_type);
19203 }
19204
19205 /* A table describing all the processors gas knows about.  Names are
19206    matched in the order listed.
19207
19208    To ease comparison, please keep this table in the same order as
19209    gcc's mips_cpu_info_table[].  */
19210 static const struct mips_cpu_info mips_cpu_info_table[] =
19211 {
19212   /* Entries for generic ISAs */
19213   { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
19214   { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
19215   { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
19216   { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
19217   { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
19218   { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
19219   { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
19220   { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
19221   { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
19222
19223   /* MIPS I */
19224   { "r3000",          0,                        ISA_MIPS1,      CPU_R3000 },
19225   { "r2000",          0,                        ISA_MIPS1,      CPU_R3000 },
19226   { "r3900",          0,                        ISA_MIPS1,      CPU_R3900 },
19227
19228   /* MIPS II */
19229   { "r6000",          0,                        ISA_MIPS2,      CPU_R6000 },
19230
19231   /* MIPS III */
19232   { "r4000",          0,                        ISA_MIPS3,      CPU_R4000 },
19233   { "r4010",          0,                        ISA_MIPS2,      CPU_R4010 },
19234   { "vr4100",         0,                        ISA_MIPS3,      CPU_VR4100 },
19235   { "vr4111",         0,                        ISA_MIPS3,      CPU_R4111 },
19236   { "vr4120",         0,                        ISA_MIPS3,      CPU_VR4120 },
19237   { "vr4130",         0,                        ISA_MIPS3,      CPU_VR4120 },
19238   { "vr4181",         0,                        ISA_MIPS3,      CPU_R4111 },
19239   { "vr4300",         0,                        ISA_MIPS3,      CPU_R4300 },
19240   { "r4400",          0,                        ISA_MIPS3,      CPU_R4400 },
19241   { "r4600",          0,                        ISA_MIPS3,      CPU_R4600 },
19242   { "orion",          0,                        ISA_MIPS3,      CPU_R4600 },
19243   { "r4650",          0,                        ISA_MIPS3,      CPU_R4650 },
19244   { "r5900",          0,                        ISA_MIPS3,      CPU_R5900 },
19245   /* ST Microelectronics Loongson 2E and 2F cores */
19246   { "loongson2e",     0,                        ISA_MIPS3,   CPU_LOONGSON_2E },
19247   { "loongson2f",     0,                        ISA_MIPS3,   CPU_LOONGSON_2F },
19248
19249   /* MIPS IV */
19250   { "r8000",          0,                        ISA_MIPS4,      CPU_R8000 },
19251   { "r10000",         0,                        ISA_MIPS4,      CPU_R10000 },
19252   { "r12000",         0,                        ISA_MIPS4,      CPU_R12000 },
19253   { "r14000",         0,                        ISA_MIPS4,      CPU_R14000 },
19254   { "r16000",         0,                        ISA_MIPS4,      CPU_R16000 },
19255   { "vr5000",         0,                        ISA_MIPS4,      CPU_R5000 },
19256   { "vr5400",         0,                        ISA_MIPS4,      CPU_VR5400 },
19257   { "vr5500",         0,                        ISA_MIPS4,      CPU_VR5500 },
19258   { "rm5200",         0,                        ISA_MIPS4,      CPU_R5000 },
19259   { "rm5230",         0,                        ISA_MIPS4,      CPU_R5000 },
19260   { "rm5231",         0,                        ISA_MIPS4,      CPU_R5000 },
19261   { "rm5261",         0,                        ISA_MIPS4,      CPU_R5000 },
19262   { "rm5721",         0,                        ISA_MIPS4,      CPU_R5000 },
19263   { "rm7000",         0,                        ISA_MIPS4,      CPU_RM7000 },
19264   { "rm9000",         0,                        ISA_MIPS4,      CPU_RM9000 },
19265
19266   /* MIPS 32 */
19267   { "4kc",            0,                        ISA_MIPS32,     CPU_MIPS32 },
19268   { "4km",            0,                        ISA_MIPS32,     CPU_MIPS32 },
19269   { "4kp",            0,                        ISA_MIPS32,     CPU_MIPS32 },
19270   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
19271
19272   /* MIPS 32 Release 2 */
19273   { "4kec",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19274   { "4kem",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19275   { "4kep",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19276   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
19277   { "m4k",            0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19278   { "m4kp",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19279   { "m14k",           MIPS_CPU_ASE_MCU,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19280   { "m14kc",          MIPS_CPU_ASE_MCU,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19281   { "m14ke",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2 | MIPS_CPU_ASE_MCU,
19282                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19283   { "m14kec",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2 | MIPS_CPU_ASE_MCU,
19284                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19285   { "24kc",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19286   { "24kf2_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19287   { "24kf",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19288   { "24kf1_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19289   /* Deprecated forms of the above.  */
19290   { "24kfx",          0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19291   { "24kx",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19292   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
19293   { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19294   { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19295   { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19296   { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19297   /* Deprecated forms of the above.  */
19298   { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19299   { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19300   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
19301   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19302                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19303   { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19304                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19305   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19306                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19307   { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19308                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19309   /* Deprecated forms of the above.  */
19310   { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19311                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19312   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19313                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19314   /* 34Kn is a 34kc without DSP.  */
19315   { "34kn",           MIPS_CPU_ASE_MT,          ISA_MIPS32R2,   CPU_MIPS32R2 },
19316   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
19317   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19318                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19319   { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19320                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19321   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19322                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19323   { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19324                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19325   { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19326                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19327   /* Deprecated forms of the above.  */
19328   { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19329                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19330   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19331                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19332   /* 1004K cores are multiprocessor versions of the 34K.  */
19333   { "1004kc",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19334                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19335   { "1004kf2_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19336                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19337   { "1004kf",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19338                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19339   { "1004kf1_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19340                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19341
19342   /* MIPS 64 */
19343   { "5kc",            0,                        ISA_MIPS64,     CPU_MIPS64 },
19344   { "5kf",            0,                        ISA_MIPS64,     CPU_MIPS64 },
19345   { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
19346   { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
19347
19348   /* Broadcom SB-1 CPU core */
19349   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
19350                                                 ISA_MIPS64,     CPU_SB1 },
19351   /* Broadcom SB-1A CPU core */
19352   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
19353                                                 ISA_MIPS64,     CPU_SB1 },
19354   
19355   { "loongson3a",     0,                        ISA_MIPS64,     CPU_LOONGSON_3A },
19356
19357   /* MIPS 64 Release 2 */
19358
19359   /* Cavium Networks Octeon CPU core */
19360   { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
19361   { "octeon+",        0,      ISA_MIPS64R2,   CPU_OCTEONP },
19362   { "octeon2",        0,      ISA_MIPS64R2,   CPU_OCTEON2 },
19363
19364   /* RMI Xlr */
19365   { "xlr",            0,      ISA_MIPS64,     CPU_XLR },
19366
19367   /* Broadcom XLP.
19368      XLP is mostly like XLR, with the prominent exception that it is
19369      MIPS64R2 rather than MIPS64.  */
19370   { "xlp",            0,      ISA_MIPS64R2,     CPU_XLR },
19371
19372   /* End marker */
19373   { NULL, 0, 0, 0 }
19374 };
19375
19376
19377 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
19378    with a final "000" replaced by "k".  Ignore case.
19379
19380    Note: this function is shared between GCC and GAS.  */
19381
19382 static bfd_boolean
19383 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
19384 {
19385   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
19386     given++, canonical++;
19387
19388   return ((*given == 0 && *canonical == 0)
19389           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
19390 }
19391
19392
19393 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
19394    CPU name.  We've traditionally allowed a lot of variation here.
19395
19396    Note: this function is shared between GCC and GAS.  */
19397
19398 static bfd_boolean
19399 mips_matching_cpu_name_p (const char *canonical, const char *given)
19400 {
19401   /* First see if the name matches exactly, or with a final "000"
19402      turned into "k".  */
19403   if (mips_strict_matching_cpu_name_p (canonical, given))
19404     return TRUE;
19405
19406   /* If not, try comparing based on numerical designation alone.
19407      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
19408   if (TOLOWER (*given) == 'r')
19409     given++;
19410   if (!ISDIGIT (*given))
19411     return FALSE;
19412
19413   /* Skip over some well-known prefixes in the canonical name,
19414      hoping to find a number there too.  */
19415   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
19416     canonical += 2;
19417   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
19418     canonical += 2;
19419   else if (TOLOWER (canonical[0]) == 'r')
19420     canonical += 1;
19421
19422   return mips_strict_matching_cpu_name_p (canonical, given);
19423 }
19424
19425
19426 /* Parse an option that takes the name of a processor as its argument.
19427    OPTION is the name of the option and CPU_STRING is the argument.
19428    Return the corresponding processor enumeration if the CPU_STRING is
19429    recognized, otherwise report an error and return null.
19430
19431    A similar function exists in GCC.  */
19432
19433 static const struct mips_cpu_info *
19434 mips_parse_cpu (const char *option, const char *cpu_string)
19435 {
19436   const struct mips_cpu_info *p;
19437
19438   /* 'from-abi' selects the most compatible architecture for the given
19439      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
19440      EABIs, we have to decide whether we're using the 32-bit or 64-bit
19441      version.  Look first at the -mgp options, if given, otherwise base
19442      the choice on MIPS_DEFAULT_64BIT.
19443
19444      Treat NO_ABI like the EABIs.  One reason to do this is that the
19445      plain 'mips' and 'mips64' configs have 'from-abi' as their default
19446      architecture.  This code picks MIPS I for 'mips' and MIPS III for
19447      'mips64', just as we did in the days before 'from-abi'.  */
19448   if (strcasecmp (cpu_string, "from-abi") == 0)
19449     {
19450       if (ABI_NEEDS_32BIT_REGS (mips_abi))
19451         return mips_cpu_info_from_isa (ISA_MIPS1);
19452
19453       if (ABI_NEEDS_64BIT_REGS (mips_abi))
19454         return mips_cpu_info_from_isa (ISA_MIPS3);
19455
19456       if (file_mips_gp32 >= 0)
19457         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
19458
19459       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
19460                                      ? ISA_MIPS3
19461                                      : ISA_MIPS1);
19462     }
19463
19464   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
19465   if (strcasecmp (cpu_string, "default") == 0)
19466     return 0;
19467
19468   for (p = mips_cpu_info_table; p->name != 0; p++)
19469     if (mips_matching_cpu_name_p (p->name, cpu_string))
19470       return p;
19471
19472   as_bad (_("Bad value (%s) for %s"), cpu_string, option);
19473   return 0;
19474 }
19475
19476 /* Return the canonical processor information for ISA (a member of the
19477    ISA_MIPS* enumeration).  */
19478
19479 static const struct mips_cpu_info *
19480 mips_cpu_info_from_isa (int isa)
19481 {
19482   int i;
19483
19484   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19485     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
19486         && isa == mips_cpu_info_table[i].isa)
19487       return (&mips_cpu_info_table[i]);
19488
19489   return NULL;
19490 }
19491
19492 static const struct mips_cpu_info *
19493 mips_cpu_info_from_arch (int arch)
19494 {
19495   int i;
19496
19497   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19498     if (arch == mips_cpu_info_table[i].cpu)
19499       return (&mips_cpu_info_table[i]);
19500
19501   return NULL;
19502 }
19503 \f
19504 static void
19505 show (FILE *stream, const char *string, int *col_p, int *first_p)
19506 {
19507   if (*first_p)
19508     {
19509       fprintf (stream, "%24s", "");
19510       *col_p = 24;
19511     }
19512   else
19513     {
19514       fprintf (stream, ", ");
19515       *col_p += 2;
19516     }
19517
19518   if (*col_p + strlen (string) > 72)
19519     {
19520       fprintf (stream, "\n%24s", "");
19521       *col_p = 24;
19522     }
19523
19524   fprintf (stream, "%s", string);
19525   *col_p += strlen (string);
19526
19527   *first_p = 0;
19528 }
19529
19530 void
19531 md_show_usage (FILE *stream)
19532 {
19533   int column, first;
19534   size_t i;
19535
19536   fprintf (stream, _("\
19537 MIPS options:\n\
19538 -EB                     generate big endian output\n\
19539 -EL                     generate little endian output\n\
19540 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
19541 -G NUM                  allow referencing objects up to NUM bytes\n\
19542                         implicitly with the gp register [default 8]\n"));
19543   fprintf (stream, _("\
19544 -mips1                  generate MIPS ISA I instructions\n\
19545 -mips2                  generate MIPS ISA II instructions\n\
19546 -mips3                  generate MIPS ISA III instructions\n\
19547 -mips4                  generate MIPS ISA IV instructions\n\
19548 -mips5                  generate MIPS ISA V instructions\n\
19549 -mips32                 generate MIPS32 ISA instructions\n\
19550 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
19551 -mips64                 generate MIPS64 ISA instructions\n\
19552 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
19553 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
19554
19555   first = 1;
19556
19557   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19558     show (stream, mips_cpu_info_table[i].name, &column, &first);
19559   show (stream, "from-abi", &column, &first);
19560   fputc ('\n', stream);
19561
19562   fprintf (stream, _("\
19563 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
19564 -no-mCPU                don't generate code specific to CPU.\n\
19565                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
19566
19567   first = 1;
19568
19569   show (stream, "3900", &column, &first);
19570   show (stream, "4010", &column, &first);
19571   show (stream, "4100", &column, &first);
19572   show (stream, "4650", &column, &first);
19573   fputc ('\n', stream);
19574
19575   fprintf (stream, _("\
19576 -mips16                 generate mips16 instructions\n\
19577 -no-mips16              do not generate mips16 instructions\n"));
19578   fprintf (stream, _("\
19579 -mmicromips             generate microMIPS instructions\n\
19580 -mno-micromips          do not generate microMIPS instructions\n"));
19581   fprintf (stream, _("\
19582 -msmartmips             generate smartmips instructions\n\
19583 -mno-smartmips          do not generate smartmips instructions\n"));  
19584   fprintf (stream, _("\
19585 -mdsp                   generate DSP instructions\n\
19586 -mno-dsp                do not generate DSP instructions\n"));
19587   fprintf (stream, _("\
19588 -mdspr2                 generate DSP R2 instructions\n\
19589 -mno-dspr2              do not generate DSP R2 instructions\n"));
19590   fprintf (stream, _("\
19591 -mmt                    generate MT instructions\n\
19592 -mno-mt                 do not generate MT instructions\n"));
19593   fprintf (stream, _("\
19594 -mmcu                   generate MCU instructions\n\
19595 -mno-mcu                do not generate MCU instructions\n"));
19596   fprintf (stream, _("\
19597 -mfix-loongson2f-jump   work around Loongson2F JUMP instructions\n\
19598 -mfix-loongson2f-nop    work around Loongson2F NOP errata\n\
19599 -mfix-vr4120            work around certain VR4120 errata\n\
19600 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
19601 -mfix-24k               insert a nop after ERET and DERET instructions\n\
19602 -mfix-cn63xxp1          work around CN63XXP1 PREF errata\n\
19603 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
19604 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
19605 -msym32                 assume all symbols have 32-bit values\n\
19606 -O0                     remove unneeded NOPs, do not swap branches\n\
19607 -O                      remove unneeded NOPs and swap branches\n\
19608 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
19609 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
19610   fprintf (stream, _("\
19611 -mhard-float            allow floating-point instructions\n\
19612 -msoft-float            do not allow floating-point instructions\n\
19613 -msingle-float          only allow 32-bit floating-point operations\n\
19614 -mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
19615 --[no-]construct-floats [dis]allow floating point values to be constructed\n"
19616                      ));
19617 #ifdef OBJ_ELF
19618   fprintf (stream, _("\
19619 -KPIC, -call_shared     generate SVR4 position independent code\n\
19620 -call_nonpic            generate non-PIC code that can operate with DSOs\n\
19621 -mvxworks-pic           generate VxWorks position independent code\n\
19622 -non_shared             do not generate code that can operate with DSOs\n\
19623 -xgot                   assume a 32 bit GOT\n\
19624 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
19625 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
19626                         position dependent (non shared) code\n\
19627 -mabi=ABI               create ABI conformant object file for:\n"));
19628
19629   first = 1;
19630
19631   show (stream, "32", &column, &first);
19632   show (stream, "o64", &column, &first);
19633   show (stream, "n32", &column, &first);
19634   show (stream, "64", &column, &first);
19635   show (stream, "eabi", &column, &first);
19636
19637   fputc ('\n', stream);
19638
19639   fprintf (stream, _("\
19640 -32                     create o32 ABI object file (default)\n\
19641 -n32                    create n32 ABI object file\n\
19642 -64                     create 64 ABI object file\n"));
19643 #endif
19644 }
19645
19646 #ifdef TE_IRIX
19647 enum dwarf2_format
19648 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
19649 {
19650   if (HAVE_64BIT_SYMBOLS)
19651     return dwarf2_format_64bit_irix;
19652   else
19653     return dwarf2_format_32bit;
19654 }
19655 #endif
19656
19657 int
19658 mips_dwarf2_addr_size (void)
19659 {
19660   if (HAVE_64BIT_OBJECTS)
19661     return 8;
19662   else
19663     return 4;
19664 }
19665
19666 /* Standard calling conventions leave the CFA at SP on entry.  */
19667 void
19668 mips_cfi_frame_initial_instructions (void)
19669 {
19670   cfi_add_CFA_def_cfa_register (SP);
19671 }
19672
19673 int
19674 tc_mips_regname_to_dw2regnum (char *regname)
19675 {
19676   unsigned int regnum = -1;
19677   unsigned int reg;
19678
19679   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
19680     regnum = reg;
19681
19682   return regnum;
19683 }