2012-08-01 Catherine Moore <clm@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
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   /* True if this is a mips16 instruction and if we want the extended
149      form of INSN_MO.  */
150   bfd_boolean use_extend;
151
152   /* The 16-bit extension instruction to use when USE_EXTEND is true.  */
153   unsigned short extend;
154
155   /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
156      a copy of INSN_MO->match with the operands filled in.  */
157   unsigned long insn_opcode;
158
159   /* The frag that contains the instruction.  */
160   struct frag *frag;
161
162   /* The offset into FRAG of the first instruction byte.  */
163   long where;
164
165   /* The relocs associated with the instruction, if any.  */
166   fixS *fixp[3];
167
168   /* True if this entry cannot be moved from its current position.  */
169   unsigned int fixed_p : 1;
170
171   /* True if this instruction occurred in a .set noreorder block.  */
172   unsigned int noreorder_p : 1;
173
174   /* True for mips16 instructions that jump to an absolute address.  */
175   unsigned int mips16_absolute_jump_p : 1;
176
177   /* True if this instruction is complete.  */
178   unsigned int complete_p : 1;
179 };
180
181 /* The ABI to use.  */
182 enum mips_abi_level
183 {
184   NO_ABI = 0,
185   O32_ABI,
186   O64_ABI,
187   N32_ABI,
188   N64_ABI,
189   EABI_ABI
190 };
191
192 /* MIPS ABI we are using for this output file.  */
193 static enum mips_abi_level mips_abi = NO_ABI;
194
195 /* Whether or not we have code that can call pic code.  */
196 int mips_abicalls = FALSE;
197
198 /* Whether or not we have code which can be put into a shared
199    library.  */
200 static bfd_boolean mips_in_shared = TRUE;
201
202 /* This is the set of options which may be modified by the .set
203    pseudo-op.  We use a struct so that .set push and .set pop are more
204    reliable.  */
205
206 struct mips_set_options
207 {
208   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
209      if it has not been initialized.  Changed by `.set mipsN', and the
210      -mipsN command line option, and the default CPU.  */
211   int isa;
212   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
213      if they have not been initialized.  Changed by `.set <asename>', by
214      command line options, and based on the default architecture.  */
215   int ase_mips3d;
216   int ase_mdmx;
217   int ase_smartmips;
218   int ase_dsp;
219   int ase_dspr2;
220   int ase_mt;
221   int ase_mcu;
222   /* Whether we are assembling for the mips16 processor.  0 if we are
223      not, 1 if we are, and -1 if the value has not been initialized.
224      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
225      -nomips16 command line options, and the default CPU.  */
226   int mips16;
227   /* Whether we are assembling for the mipsMIPS ASE.  0 if we are not,
228      1 if we are, and -1 if the value has not been initialized.  Changed
229      by `.set micromips' and `.set nomicromips', and the -mmicromips
230      and -mno-micromips command line options, and the default CPU.  */
231   int micromips;
232   /* Non-zero if we should not reorder instructions.  Changed by `.set
233      reorder' and `.set noreorder'.  */
234   int noreorder;
235   /* Non-zero if we should not permit the register designated "assembler
236      temporary" to be used in instructions.  The value is the register
237      number, normally $at ($1).  Changed by `.set at=REG', `.set noat'
238      (same as `.set at=$0') and `.set at' (same as `.set at=$1').  */
239   unsigned int at;
240   /* Non-zero if we should warn when a macro instruction expands into
241      more than one machine instruction.  Changed by `.set nomacro' and
242      `.set macro'.  */
243   int warn_about_macros;
244   /* Non-zero if we should not move instructions.  Changed by `.set
245      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
246   int nomove;
247   /* Non-zero if we should not optimize branches by moving the target
248      of the branch into the delay slot.  Actually, we don't perform
249      this optimization anyhow.  Changed by `.set bopt' and `.set
250      nobopt'.  */
251   int nobopt;
252   /* Non-zero if we should not autoextend mips16 instructions.
253      Changed by `.set autoextend' and `.set noautoextend'.  */
254   int noautoextend;
255   /* Restrict general purpose registers and floating point registers
256      to 32 bit.  This is initially determined when -mgp32 or -mfp32
257      is passed but can changed if the assembler code uses .set mipsN.  */
258   int gp32;
259   int fp32;
260   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
261      command line option, and the default CPU.  */
262   int arch;
263   /* True if ".set sym32" is in effect.  */
264   bfd_boolean sym32;
265   /* True if floating-point operations are not allowed.  Changed by .set
266      softfloat or .set hardfloat, by command line options -msoft-float or
267      -mhard-float.  The default is false.  */
268   bfd_boolean soft_float;
269
270   /* True if only single-precision floating-point operations are allowed.
271      Changed by .set singlefloat or .set doublefloat, command-line options
272      -msingle-float or -mdouble-float.  The default is false.  */
273   bfd_boolean single_float;
274 };
275
276 /* This is the struct we use to hold the current set of options.  Note
277    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
278    -1 to indicate that they have not been initialized.  */
279
280 /* True if -mgp32 was passed.  */
281 static int file_mips_gp32 = -1;
282
283 /* True if -mfp32 was passed.  */
284 static int file_mips_fp32 = -1;
285
286 /* 1 if -msoft-float, 0 if -mhard-float.  The default is 0.  */
287 static int file_mips_soft_float = 0;
288
289 /* 1 if -msingle-float, 0 if -mdouble-float.  The default is 0.   */
290 static int file_mips_single_float = 0;
291
292 static struct mips_set_options mips_opts =
293 {
294   /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
295   /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
296   /* ase_mcu */ -1, /* mips16 */ -1, /* micromips */ -1, /* noreorder */ 0,
297   /* at */ ATREG, /* warn_about_macros */ 0, /* nomove */ 0, /* nobopt */ 0,
298   /* noautoextend */ 0, /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN,
299   /* sym32 */ FALSE, /* soft_float */ FALSE, /* single_float */ FALSE
300 };
301
302 /* These variables are filled in with the masks of registers used.
303    The object format code reads them and puts them in the appropriate
304    place.  */
305 unsigned long mips_gprmask;
306 unsigned long mips_cprmask[4];
307
308 /* MIPS ISA we are using for this output file.  */
309 static int file_mips_isa = ISA_UNKNOWN;
310
311 /* True if any MIPS16 code was produced.  */
312 static int file_ase_mips16;
313
314 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
315                               || mips_opts.isa == ISA_MIPS32R2          \
316                               || mips_opts.isa == ISA_MIPS64            \
317                               || mips_opts.isa == ISA_MIPS64R2)
318
319 /* True if any microMIPS code was produced.  */
320 static int file_ase_micromips;
321
322 /* True if we want to create R_MIPS_JALR for jalr $25.  */
323 #ifdef TE_IRIX
324 #define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
325 #else
326 /* As a GNU extension, we use R_MIPS_JALR for o32 too.  However,
327    because there's no place for any addend, the only acceptable
328    expression is a bare symbol.  */
329 #define MIPS_JALR_HINT_P(EXPR) \
330   (!HAVE_IN_PLACE_ADDENDS \
331    || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
332 #endif
333
334 /* True if -mips3d was passed or implied by arguments passed on the
335    command line (e.g., by -march).  */
336 static int file_ase_mips3d;
337
338 /* True if -mdmx was passed or implied by arguments passed on the
339    command line (e.g., by -march).  */
340 static int file_ase_mdmx;
341
342 /* True if -msmartmips was passed or implied by arguments passed on the
343    command line (e.g., by -march).  */
344 static int file_ase_smartmips;
345
346 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32             \
347                                 || mips_opts.isa == ISA_MIPS32R2)
348
349 /* True if -mdsp was passed or implied by arguments passed on the
350    command line (e.g., by -march).  */
351 static int file_ase_dsp;
352
353 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2             \
354                               || mips_opts.isa == ISA_MIPS64R2          \
355                               || mips_opts.micromips)
356
357 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
358
359 /* True if -mdspr2 was passed or implied by arguments passed on the
360    command line (e.g., by -march).  */
361 static int file_ase_dspr2;
362
363 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
364                                 || mips_opts.isa == ISA_MIPS64R2        \
365                                 || mips_opts.micromips)
366
367 /* True if -mmt was passed or implied by arguments passed on the
368    command line (e.g., by -march).  */
369 static int file_ase_mt;
370
371 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
372                              || mips_opts.isa == ISA_MIPS64R2)
373
374 #define ISA_SUPPORTS_MCU_ASE (mips_opts.isa == ISA_MIPS32R2             \
375                               || mips_opts.isa == ISA_MIPS64R2          \
376                               || mips_opts.micromips)
377
378 /* The argument of the -march= flag.  The architecture we are assembling.  */
379 static int file_mips_arch = CPU_UNKNOWN;
380 static const char *mips_arch_string;
381
382 /* The argument of the -mtune= flag.  The architecture for which we
383    are optimizing.  */
384 static int mips_tune = CPU_UNKNOWN;
385 static const char *mips_tune_string;
386
387 /* True when generating 32-bit code for a 64-bit processor.  */
388 static int mips_32bitmode = 0;
389
390 /* True if the given ABI requires 32-bit registers.  */
391 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
392
393 /* Likewise 64-bit registers.  */
394 #define ABI_NEEDS_64BIT_REGS(ABI)       \
395   ((ABI) == N32_ABI                     \
396    || (ABI) == N64_ABI                  \
397    || (ABI) == O64_ABI)
398
399 /*  Return true if ISA supports 64 bit wide gp registers.  */
400 #define ISA_HAS_64BIT_REGS(ISA)         \
401   ((ISA) == ISA_MIPS3                   \
402    || (ISA) == ISA_MIPS4                \
403    || (ISA) == ISA_MIPS5                \
404    || (ISA) == ISA_MIPS64               \
405    || (ISA) == ISA_MIPS64R2)
406
407 /*  Return true if ISA supports 64 bit wide float registers.  */
408 #define ISA_HAS_64BIT_FPRS(ISA)         \
409   ((ISA) == ISA_MIPS3                   \
410    || (ISA) == ISA_MIPS4                \
411    || (ISA) == ISA_MIPS5                \
412    || (ISA) == ISA_MIPS32R2             \
413    || (ISA) == ISA_MIPS64               \
414    || (ISA) == ISA_MIPS64R2)
415
416 /* Return true if ISA supports 64-bit right rotate (dror et al.)
417    instructions.  */
418 #define ISA_HAS_DROR(ISA)               \
419   ((ISA) == ISA_MIPS64R2                \
420    || (mips_opts.micromips              \
421        && ISA_HAS_64BIT_REGS (ISA))     \
422    )
423
424 /* Return true if ISA supports 32-bit right rotate (ror et al.)
425    instructions.  */
426 #define ISA_HAS_ROR(ISA)                \
427   ((ISA) == ISA_MIPS32R2                \
428    || (ISA) == ISA_MIPS64R2             \
429    || mips_opts.ase_smartmips           \
430    || mips_opts.micromips               \
431    )
432
433 /* Return true if ISA supports single-precision floats in odd registers.  */
434 #define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
435   ((ISA) == ISA_MIPS32                  \
436    || (ISA) == ISA_MIPS32R2             \
437    || (ISA) == ISA_MIPS64               \
438    || (ISA) == ISA_MIPS64R2)
439
440 /* Return true if ISA supports move to/from high part of a 64-bit
441    floating-point register. */
442 #define ISA_HAS_MXHC1(ISA)              \
443   ((ISA) == ISA_MIPS32R2                \
444    || (ISA) == ISA_MIPS64R2)
445
446 #define HAVE_32BIT_GPRS                            \
447     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
448
449 #define HAVE_32BIT_FPRS                            \
450     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
451
452 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
453 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
454
455 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
456
457 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
458
459 /* True if relocations are stored in-place.  */
460 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
461
462 /* The ABI-derived address size.  */
463 #define HAVE_64BIT_ADDRESSES \
464   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
465 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
466
467 /* The size of symbolic constants (i.e., expressions of the form
468    "SYMBOL" or "SYMBOL + OFFSET").  */
469 #define HAVE_32BIT_SYMBOLS \
470   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
471 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
472
473 /* Addresses are loaded in different ways, depending on the address size
474    in use.  The n32 ABI Documentation also mandates the use of additions
475    with overflow checking, but existing implementations don't follow it.  */
476 #define ADDRESS_ADD_INSN                                                \
477    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
478
479 #define ADDRESS_ADDI_INSN                                               \
480    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
481
482 #define ADDRESS_LOAD_INSN                                               \
483    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
484
485 #define ADDRESS_STORE_INSN                                              \
486    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
487
488 /* Return true if the given CPU supports the MIPS16 ASE.  */
489 #define CPU_HAS_MIPS16(cpu)                                             \
490    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
491     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
492
493 /* Return true if the given CPU supports the microMIPS ASE.  */
494 #define CPU_HAS_MICROMIPS(cpu)  0
495
496 /* True if CPU has a dror instruction.  */
497 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
498
499 /* True if CPU has a ror instruction.  */
500 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
501
502 /* True if CPU is in the Octeon family */
503 #define CPU_IS_OCTEON(CPU) ((CPU) == CPU_OCTEON || (CPU) == CPU_OCTEONP || (CPU) == CPU_OCTEON2)
504
505 /* True if CPU has seq/sne and seqi/snei instructions.  */
506 #define CPU_HAS_SEQ(CPU)        (CPU_IS_OCTEON (CPU))
507
508 /* True if CPU does not implement the all the coprocessor insns.  For these
509    CPUs only those COP insns are accepted that are explicitly marked to be
510    available on the CPU.  ISA membership for COP insns is ignored.  */
511 #define NO_ISA_COP(CPU)         (CPU_IS_OCTEON (CPU))
512
513 /* True if mflo and mfhi can be immediately followed by instructions
514    which write to the HI and LO registers.
515
516    According to MIPS specifications, MIPS ISAs I, II, and III need
517    (at least) two instructions between the reads of HI/LO and
518    instructions which write them, and later ISAs do not.  Contradicting
519    the MIPS specifications, some MIPS IV processor user manuals (e.g.
520    the UM for the NEC Vr5000) document needing the instructions between
521    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
522    MIPS64 and later ISAs to have the interlocks, plus any specific
523    earlier-ISA CPUs for which CPU documentation declares that the
524    instructions are really interlocked.  */
525 #define hilo_interlocks \
526   (mips_opts.isa == ISA_MIPS32                        \
527    || mips_opts.isa == ISA_MIPS32R2                   \
528    || mips_opts.isa == ISA_MIPS64                     \
529    || mips_opts.isa == ISA_MIPS64R2                   \
530    || mips_opts.arch == CPU_R4010                     \
531    || mips_opts.arch == CPU_R10000                    \
532    || mips_opts.arch == CPU_R12000                    \
533    || mips_opts.arch == CPU_R14000                    \
534    || mips_opts.arch == CPU_R16000                    \
535    || mips_opts.arch == CPU_RM7000                    \
536    || mips_opts.arch == CPU_VR5500                    \
537    || mips_opts.micromips                             \
538    )
539
540 /* Whether the processor uses hardware interlocks to protect reads
541    from the GPRs after they are loaded from memory, and thus does not
542    require nops to be inserted.  This applies to instructions marked
543    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
544    level I and microMIPS mode instructions are always interlocked.  */
545 #define gpr_interlocks                                \
546   (mips_opts.isa != ISA_MIPS1                         \
547    || mips_opts.arch == CPU_R3900                     \
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 /* Returns true for a (non floating-point) coprocessor instruction.  Reading
584    or writing the condition code is only possible on the coprocessors and
585    these insns are not marked with INSN_COP.  Thus for these insns use the
586    condition-code flags.  */
587 #define COP_INSN(PINFO)                                                 \
588   (PINFO != INSN_MACRO                                                  \
589    && ((PINFO) & (FP_S | FP_D)) == 0                                    \
590    && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
591
592 /* Whether code compression (either of the MIPS16 or the microMIPS ASEs)
593    has been selected.  This implies, in particular, that addresses of text
594    labels have their LSB set.  */
595 #define HAVE_CODE_COMPRESSION                                           \
596   ((mips_opts.mips16 | mips_opts.micromips) != 0)
597
598 /* MIPS PIC level.  */
599
600 enum mips_pic_level mips_pic;
601
602 /* 1 if we should generate 32 bit offsets from the $gp register in
603    SVR4_PIC mode.  Currently has no meaning in other modes.  */
604 static int mips_big_got = 0;
605
606 /* 1 if trap instructions should used for overflow rather than break
607    instructions.  */
608 static int mips_trap = 0;
609
610 /* 1 if double width floating point constants should not be constructed
611    by assembling two single width halves into two single width floating
612    point registers which just happen to alias the double width destination
613    register.  On some architectures this aliasing can be disabled by a bit
614    in the status register, and the setting of this bit cannot be determined
615    automatically at assemble time.  */
616 static int mips_disable_float_construction;
617
618 /* Non-zero if any .set noreorder directives were used.  */
619
620 static int mips_any_noreorder;
621
622 /* Non-zero if nops should be inserted when the register referenced in
623    an mfhi/mflo instruction is read in the next two instructions.  */
624 static int mips_7000_hilo_fix;
625
626 /* The size of objects in the small data section.  */
627 static unsigned int g_switch_value = 8;
628 /* Whether the -G option was used.  */
629 static int g_switch_seen = 0;
630
631 #define N_RMASK 0xc4
632 #define N_VFP   0xd4
633
634 /* If we can determine in advance that GP optimization won't be
635    possible, we can skip the relaxation stuff that tries to produce
636    GP-relative references.  This makes delay slot optimization work
637    better.
638
639    This function can only provide a guess, but it seems to work for
640    gcc output.  It needs to guess right for gcc, otherwise gcc
641    will put what it thinks is a GP-relative instruction in a branch
642    delay slot.
643
644    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
645    fixed it for the non-PIC mode.  KR 95/04/07  */
646 static int nopic_need_relax (symbolS *, int);
647
648 /* handle of the OPCODE hash table */
649 static struct hash_control *op_hash = NULL;
650
651 /* The opcode hash table we use for the mips16.  */
652 static struct hash_control *mips16_op_hash = NULL;
653
654 /* The opcode hash table we use for the microMIPS ASE.  */
655 static struct hash_control *micromips_op_hash = NULL;
656
657 /* This array holds the chars that always start a comment.  If the
658     pre-processor is disabled, these aren't very useful */
659 const char comment_chars[] = "#";
660
661 /* This array holds the chars that only start a comment at the beginning of
662    a line.  If the line seems to have the form '# 123 filename'
663    .line and .file directives will appear in the pre-processed output */
664 /* Note that input_file.c hand checks for '#' at the beginning of the
665    first line of the input file.  This is because the compiler outputs
666    #NO_APP at the beginning of its output.  */
667 /* Also note that C style comments are always supported.  */
668 const char line_comment_chars[] = "#";
669
670 /* This array holds machine specific line separator characters.  */
671 const char line_separator_chars[] = ";";
672
673 /* Chars that can be used to separate mant from exp in floating point nums */
674 const char EXP_CHARS[] = "eE";
675
676 /* Chars that mean this number is a floating point constant */
677 /* As in 0f12.456 */
678 /* or    0d1.2345e12 */
679 const char FLT_CHARS[] = "rRsSfFdDxXpP";
680
681 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
682    changed in read.c .  Ideally it shouldn't have to know about it at all,
683    but nothing is ideal around here.
684  */
685
686 static char *insn_error;
687
688 static int auto_align = 1;
689
690 /* When outputting SVR4 PIC code, the assembler needs to know the
691    offset in the stack frame from which to restore the $gp register.
692    This is set by the .cprestore pseudo-op, and saved in this
693    variable.  */
694 static offsetT mips_cprestore_offset = -1;
695
696 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
697    more optimizations, it can use a register value instead of a memory-saved
698    offset and even an other register than $gp as global pointer.  */
699 static offsetT mips_cpreturn_offset = -1;
700 static int mips_cpreturn_register = -1;
701 static int mips_gp_register = GP;
702 static int mips_gprel_offset = 0;
703
704 /* Whether mips_cprestore_offset has been set in the current function
705    (or whether it has already been warned about, if not).  */
706 static int mips_cprestore_valid = 0;
707
708 /* This is the register which holds the stack frame, as set by the
709    .frame pseudo-op.  This is needed to implement .cprestore.  */
710 static int mips_frame_reg = SP;
711
712 /* Whether mips_frame_reg has been set in the current function
713    (or whether it has already been warned about, if not).  */
714 static int mips_frame_reg_valid = 0;
715
716 /* To output NOP instructions correctly, we need to keep information
717    about the previous two instructions.  */
718
719 /* Whether we are optimizing.  The default value of 2 means to remove
720    unneeded NOPs and swap branch instructions when possible.  A value
721    of 1 means to not swap branches.  A value of 0 means to always
722    insert NOPs.  */
723 static int mips_optimize = 2;
724
725 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
726    equivalent to seeing no -g option at all.  */
727 static int mips_debug = 0;
728
729 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
730 #define MAX_VR4130_NOPS 4
731
732 /* The maximum number of NOPs needed to fill delay slots.  */
733 #define MAX_DELAY_NOPS 2
734
735 /* The maximum number of NOPs needed for any purpose.  */
736 #define MAX_NOPS 4
737
738 /* A list of previous instructions, with index 0 being the most recent.
739    We need to look back MAX_NOPS instructions when filling delay slots
740    or working around processor errata.  We need to look back one
741    instruction further if we're thinking about using history[0] to
742    fill a branch delay slot.  */
743 static struct mips_cl_insn history[1 + MAX_NOPS];
744
745 /* Nop instructions used by emit_nop.  */
746 static struct mips_cl_insn nop_insn;
747 static struct mips_cl_insn mips16_nop_insn;
748 static struct mips_cl_insn micromips_nop16_insn;
749 static struct mips_cl_insn micromips_nop32_insn;
750
751 /* The appropriate nop for the current mode.  */
752 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn \
753                   : (mips_opts.micromips ? &micromips_nop16_insn : &nop_insn))
754
755 /* The size of NOP_INSN in bytes.  */
756 #define NOP_INSN_SIZE (HAVE_CODE_COMPRESSION ? 2 : 4)
757
758 /* If this is set, it points to a frag holding nop instructions which
759    were inserted before the start of a noreorder section.  If those
760    nops turn out to be unnecessary, the size of the frag can be
761    decreased.  */
762 static fragS *prev_nop_frag;
763
764 /* The number of nop instructions we created in prev_nop_frag.  */
765 static int prev_nop_frag_holds;
766
767 /* The number of nop instructions that we know we need in
768    prev_nop_frag.  */
769 static int prev_nop_frag_required;
770
771 /* The number of instructions we've seen since prev_nop_frag.  */
772 static int prev_nop_frag_since;
773
774 /* For ECOFF and ELF, relocations against symbols are done in two
775    parts, with a HI relocation and a LO relocation.  Each relocation
776    has only 16 bits of space to store an addend.  This means that in
777    order for the linker to handle carries correctly, it must be able
778    to locate both the HI and the LO relocation.  This means that the
779    relocations must appear in order in the relocation table.
780
781    In order to implement this, we keep track of each unmatched HI
782    relocation.  We then sort them so that they immediately precede the
783    corresponding LO relocation.  */
784
785 struct mips_hi_fixup
786 {
787   /* Next HI fixup.  */
788   struct mips_hi_fixup *next;
789   /* This fixup.  */
790   fixS *fixp;
791   /* The section this fixup is in.  */
792   segT seg;
793 };
794
795 /* The list of unmatched HI relocs.  */
796
797 static struct mips_hi_fixup *mips_hi_fixup_list;
798
799 /* The frag containing the last explicit relocation operator.
800    Null if explicit relocations have not been used.  */
801
802 static fragS *prev_reloc_op_frag;
803
804 /* Map normal MIPS register numbers to mips16 register numbers.  */
805
806 #define X ILLEGAL_REG
807 static const int mips32_to_16_reg_map[] =
808 {
809   X, X, 2, 3, 4, 5, 6, 7,
810   X, X, X, X, X, X, X, X,
811   0, 1, X, X, X, X, X, X,
812   X, X, X, X, X, X, X, X
813 };
814 #undef X
815
816 /* Map mips16 register numbers to normal MIPS register numbers.  */
817
818 static const unsigned int mips16_to_32_reg_map[] =
819 {
820   16, 17, 2, 3, 4, 5, 6, 7
821 };
822
823 /* Map normal MIPS register numbers to microMIPS register numbers.  */
824
825 #define mips32_to_micromips_reg_b_map   mips32_to_16_reg_map
826 #define mips32_to_micromips_reg_c_map   mips32_to_16_reg_map
827 #define mips32_to_micromips_reg_d_map   mips32_to_16_reg_map
828 #define mips32_to_micromips_reg_e_map   mips32_to_16_reg_map
829 #define mips32_to_micromips_reg_f_map   mips32_to_16_reg_map
830 #define mips32_to_micromips_reg_g_map   mips32_to_16_reg_map
831 #define mips32_to_micromips_reg_l_map   mips32_to_16_reg_map
832
833 #define X ILLEGAL_REG
834 /* reg type h: 4, 5, 6.  */
835 static const int mips32_to_micromips_reg_h_map[] =
836 {
837   X, X, X, X, 4, 5, 6, X,
838   X, X, X, X, X, X, X, X,
839   X, X, X, X, X, X, X, X,
840   X, X, X, X, X, X, X, X
841 };
842
843 /* reg type m: 0, 17, 2, 3, 16, 18, 19, 20.  */
844 static const int mips32_to_micromips_reg_m_map[] =
845 {
846   0, X, 2, 3, X, X, X, X,
847   X, X, X, X, X, X, X, X,
848   4, 1, 5, 6, 7, X, X, X,
849   X, X, X, X, X, X, X, X
850 };
851
852 /* reg type q: 0, 2-7. 17.  */
853 static const int mips32_to_micromips_reg_q_map[] =
854 {
855   0, X, 2, 3, 4, 5, 6, 7,
856   X, X, X, X, X, X, X, X,
857   X, 1, X, X, X, X, X, X,
858   X, X, X, X, X, X, X, X
859 };
860
861 #define mips32_to_micromips_reg_n_map  mips32_to_micromips_reg_m_map
862 #undef X
863
864 /* Map microMIPS register numbers to normal MIPS register numbers.  */
865
866 #define micromips_to_32_reg_b_map       mips16_to_32_reg_map
867 #define micromips_to_32_reg_c_map       mips16_to_32_reg_map
868 #define micromips_to_32_reg_d_map       mips16_to_32_reg_map
869 #define micromips_to_32_reg_e_map       mips16_to_32_reg_map
870 #define micromips_to_32_reg_f_map       mips16_to_32_reg_map
871 #define micromips_to_32_reg_g_map       mips16_to_32_reg_map
872
873 /* The microMIPS registers with type h.  */
874 static const unsigned int micromips_to_32_reg_h_map[] =
875 {
876   5, 5, 6, 4, 4, 4, 4, 4
877 };
878
879 /* The microMIPS registers with type i.  */
880 static const unsigned int micromips_to_32_reg_i_map[] =
881 {
882   6, 7, 7, 21, 22, 5, 6, 7
883 };
884
885 #define micromips_to_32_reg_l_map       mips16_to_32_reg_map
886
887 /* The microMIPS registers with type m.  */
888 static const unsigned int micromips_to_32_reg_m_map[] =
889 {
890   0, 17, 2, 3, 16, 18, 19, 20
891 };
892
893 #define micromips_to_32_reg_n_map      micromips_to_32_reg_m_map
894
895 /* The microMIPS registers with type q.  */
896 static const unsigned int micromips_to_32_reg_q_map[] =
897 {
898   0, 17, 2, 3, 4, 5, 6, 7
899 };
900
901 /* microMIPS imm type B.  */
902 static const int micromips_imm_b_map[] =
903 {
904   1, 4, 8, 12, 16, 20, 24, -1
905 };
906
907 /* microMIPS imm type C.  */
908 static const int micromips_imm_c_map[] =
909 {
910   128, 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 255, 32768, 65535
911 };
912
913 /* Classifies the kind of instructions we're interested in when
914    implementing -mfix-vr4120.  */
915 enum fix_vr4120_class
916 {
917   FIX_VR4120_MACC,
918   FIX_VR4120_DMACC,
919   FIX_VR4120_MULT,
920   FIX_VR4120_DMULT,
921   FIX_VR4120_DIV,
922   FIX_VR4120_MTHILO,
923   NUM_FIX_VR4120_CLASSES
924 };
925
926 /* ...likewise -mfix-loongson2f-jump.  */
927 static bfd_boolean mips_fix_loongson2f_jump;
928
929 /* ...likewise -mfix-loongson2f-nop.  */
930 static bfd_boolean mips_fix_loongson2f_nop;
931
932 /* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed.  */
933 static bfd_boolean mips_fix_loongson2f;
934
935 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
936    there must be at least one other instruction between an instruction
937    of type X and an instruction of type Y.  */
938 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
939
940 /* True if -mfix-vr4120 is in force.  */
941 static int mips_fix_vr4120;
942
943 /* ...likewise -mfix-vr4130.  */
944 static int mips_fix_vr4130;
945
946 /* ...likewise -mfix-24k.  */
947 static int mips_fix_24k;
948
949 /* ...likewise -mfix-cn63xxp1 */
950 static bfd_boolean mips_fix_cn63xxp1;
951
952 /* We don't relax branches by default, since this causes us to expand
953    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
954    fail to compute the offset before expanding the macro to the most
955    efficient expansion.  */
956
957 static int mips_relax_branch;
958 \f
959 /* The expansion of many macros depends on the type of symbol that
960    they refer to.  For example, when generating position-dependent code,
961    a macro that refers to a symbol may have two different expansions,
962    one which uses GP-relative addresses and one which uses absolute
963    addresses.  When generating SVR4-style PIC, a macro may have
964    different expansions for local and global symbols.
965
966    We handle these situations by generating both sequences and putting
967    them in variant frags.  In position-dependent code, the first sequence
968    will be the GP-relative one and the second sequence will be the
969    absolute one.  In SVR4 PIC, the first sequence will be for global
970    symbols and the second will be for local symbols.
971
972    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
973    SECOND are the lengths of the two sequences in bytes.  These fields
974    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
975    the subtype has the following flags:
976
977    RELAX_USE_SECOND
978         Set if it has been decided that we should use the second
979         sequence instead of the first.
980
981    RELAX_SECOND_LONGER
982         Set in the first variant frag if the macro's second implementation
983         is longer than its first.  This refers to the macro as a whole,
984         not an individual relaxation.
985
986    RELAX_NOMACRO
987         Set in the first variant frag if the macro appeared in a .set nomacro
988         block and if one alternative requires a warning but the other does not.
989
990    RELAX_DELAY_SLOT
991         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
992         delay slot.
993
994    RELAX_DELAY_SLOT_16BIT
995         Like RELAX_DELAY_SLOT, but indicates that the delay slot requires a
996         16-bit instruction.
997
998    RELAX_DELAY_SLOT_SIZE_FIRST
999         Like RELAX_DELAY_SLOT, but indicates that the first implementation of
1000         the macro is of the wrong size for the branch delay slot.
1001
1002    RELAX_DELAY_SLOT_SIZE_SECOND
1003         Like RELAX_DELAY_SLOT, but indicates that the second implementation of
1004         the macro is of the wrong size for the branch delay slot.
1005
1006    The frag's "opcode" points to the first fixup for relaxable code.
1007
1008    Relaxable macros are generated using a sequence such as:
1009
1010       relax_start (SYMBOL);
1011       ... generate first expansion ...
1012       relax_switch ();
1013       ... generate second expansion ...
1014       relax_end ();
1015
1016    The code and fixups for the unwanted alternative are discarded
1017    by md_convert_frag.  */
1018 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
1019
1020 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
1021 #define RELAX_SECOND(X) ((X) & 0xff)
1022 #define RELAX_USE_SECOND 0x10000
1023 #define RELAX_SECOND_LONGER 0x20000
1024 #define RELAX_NOMACRO 0x40000
1025 #define RELAX_DELAY_SLOT 0x80000
1026 #define RELAX_DELAY_SLOT_16BIT 0x100000
1027 #define RELAX_DELAY_SLOT_SIZE_FIRST 0x200000
1028 #define RELAX_DELAY_SLOT_SIZE_SECOND 0x400000
1029
1030 /* Branch without likely bit.  If label is out of range, we turn:
1031
1032         beq reg1, reg2, label
1033         delay slot
1034
1035    into
1036
1037         bne reg1, reg2, 0f
1038         nop
1039         j label
1040      0: delay slot
1041
1042    with the following opcode replacements:
1043
1044         beq <-> bne
1045         blez <-> bgtz
1046         bltz <-> bgez
1047         bc1f <-> bc1t
1048
1049         bltzal <-> bgezal  (with jal label instead of j label)
1050
1051    Even though keeping the delay slot instruction in the delay slot of
1052    the branch would be more efficient, it would be very tricky to do
1053    correctly, because we'd have to introduce a variable frag *after*
1054    the delay slot instruction, and expand that instead.  Let's do it
1055    the easy way for now, even if the branch-not-taken case now costs
1056    one additional instruction.  Out-of-range branches are not supposed
1057    to be common, anyway.
1058
1059    Branch likely.  If label is out of range, we turn:
1060
1061         beql reg1, reg2, label
1062         delay slot (annulled if branch not taken)
1063
1064    into
1065
1066         beql reg1, reg2, 1f
1067         nop
1068         beql $0, $0, 2f
1069         nop
1070      1: j[al] label
1071         delay slot (executed only if branch taken)
1072      2:
1073
1074    It would be possible to generate a shorter sequence by losing the
1075    likely bit, generating something like:
1076
1077         bne reg1, reg2, 0f
1078         nop
1079         j[al] label
1080         delay slot (executed only if branch taken)
1081      0:
1082
1083         beql -> bne
1084         bnel -> beq
1085         blezl -> bgtz
1086         bgtzl -> blez
1087         bltzl -> bgez
1088         bgezl -> bltz
1089         bc1fl -> bc1t
1090         bc1tl -> bc1f
1091
1092         bltzall -> bgezal  (with jal label instead of j label)
1093         bgezall -> bltzal  (ditto)
1094
1095
1096    but it's not clear that it would actually improve performance.  */
1097 #define RELAX_BRANCH_ENCODE(at, uncond, likely, link, toofar)   \
1098   ((relax_substateT)                                            \
1099    (0xc0000000                                                  \
1100     | ((at) & 0x1f)                                             \
1101     | ((toofar) ? 0x20 : 0)                                     \
1102     | ((link) ? 0x40 : 0)                                       \
1103     | ((likely) ? 0x80 : 0)                                     \
1104     | ((uncond) ? 0x100 : 0)))
1105 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
1106 #define RELAX_BRANCH_UNCOND(i) (((i) & 0x100) != 0)
1107 #define RELAX_BRANCH_LIKELY(i) (((i) & 0x80) != 0)
1108 #define RELAX_BRANCH_LINK(i) (((i) & 0x40) != 0)
1109 #define RELAX_BRANCH_TOOFAR(i) (((i) & 0x20) != 0)
1110 #define RELAX_BRANCH_AT(i) ((i) & 0x1f)
1111
1112 /* For mips16 code, we use an entirely different form of relaxation.
1113    mips16 supports two versions of most instructions which take
1114    immediate values: a small one which takes some small value, and a
1115    larger one which takes a 16 bit value.  Since branches also follow
1116    this pattern, relaxing these values is required.
1117
1118    We can assemble both mips16 and normal MIPS code in a single
1119    object.  Therefore, we need to support this type of relaxation at
1120    the same time that we support the relaxation described above.  We
1121    use the high bit of the subtype field to distinguish these cases.
1122
1123    The information we store for this type of relaxation is the
1124    argument code found in the opcode file for this relocation, whether
1125    the user explicitly requested a small or extended form, and whether
1126    the relocation is in a jump or jal delay slot.  That tells us the
1127    size of the value, and how it should be stored.  We also store
1128    whether the fragment is considered to be extended or not.  We also
1129    store whether this is known to be a branch to a different section,
1130    whether we have tried to relax this frag yet, and whether we have
1131    ever extended a PC relative fragment because of a shift count.  */
1132 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
1133   (0x80000000                                                   \
1134    | ((type) & 0xff)                                            \
1135    | ((small) ? 0x100 : 0)                                      \
1136    | ((ext) ? 0x200 : 0)                                        \
1137    | ((dslot) ? 0x400 : 0)                                      \
1138    | ((jal_dslot) ? 0x800 : 0))
1139 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
1140 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
1141 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
1142 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
1143 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
1144 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
1145 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
1146 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
1147 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
1148 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
1149 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
1150 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
1151
1152 /* For microMIPS code, we use relaxation similar to one we use for
1153    MIPS16 code.  Some instructions that take immediate values support
1154    two encodings: a small one which takes some small value, and a
1155    larger one which takes a 16 bit value.  As some branches also follow
1156    this pattern, relaxing these values is required.
1157
1158    We can assemble both microMIPS and normal MIPS code in a single
1159    object.  Therefore, we need to support this type of relaxation at
1160    the same time that we support the relaxation described above.  We
1161    use one of the high bits of the subtype field to distinguish these
1162    cases.
1163
1164    The information we store for this type of relaxation is the argument
1165    code found in the opcode file for this relocation, the register
1166    selected as the assembler temporary, whether the branch is
1167    unconditional, whether it is compact, whether it stores the link
1168    address implicitly in $ra, whether relaxation of out-of-range 32-bit
1169    branches to a sequence of instructions is enabled, and whether the
1170    displacement of a branch is too large to fit as an immediate argument
1171    of a 16-bit and a 32-bit branch, respectively.  */
1172 #define RELAX_MICROMIPS_ENCODE(type, at, uncond, compact, link, \
1173                                relax32, toofar16, toofar32)     \
1174   (0x40000000                                                   \
1175    | ((type) & 0xff)                                            \
1176    | (((at) & 0x1f) << 8)                                       \
1177    | ((uncond) ? 0x2000 : 0)                                    \
1178    | ((compact) ? 0x4000 : 0)                                   \
1179    | ((link) ? 0x8000 : 0)                                      \
1180    | ((relax32) ? 0x10000 : 0)                                  \
1181    | ((toofar16) ? 0x20000 : 0)                                 \
1182    | ((toofar32) ? 0x40000 : 0))
1183 #define RELAX_MICROMIPS_P(i) (((i) & 0xc0000000) == 0x40000000)
1184 #define RELAX_MICROMIPS_TYPE(i) ((i) & 0xff)
1185 #define RELAX_MICROMIPS_AT(i) (((i) >> 8) & 0x1f)
1186 #define RELAX_MICROMIPS_UNCOND(i) (((i) & 0x2000) != 0)
1187 #define RELAX_MICROMIPS_COMPACT(i) (((i) & 0x4000) != 0)
1188 #define RELAX_MICROMIPS_LINK(i) (((i) & 0x8000) != 0)
1189 #define RELAX_MICROMIPS_RELAX32(i) (((i) & 0x10000) != 0)
1190
1191 #define RELAX_MICROMIPS_TOOFAR16(i) (((i) & 0x20000) != 0)
1192 #define RELAX_MICROMIPS_MARK_TOOFAR16(i) ((i) | 0x20000)
1193 #define RELAX_MICROMIPS_CLEAR_TOOFAR16(i) ((i) & ~0x20000)
1194 #define RELAX_MICROMIPS_TOOFAR32(i) (((i) & 0x40000) != 0)
1195 #define RELAX_MICROMIPS_MARK_TOOFAR32(i) ((i) | 0x40000)
1196 #define RELAX_MICROMIPS_CLEAR_TOOFAR32(i) ((i) & ~0x40000)
1197
1198 /* Is the given value a sign-extended 32-bit value?  */
1199 #define IS_SEXT_32BIT_NUM(x)                                            \
1200   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
1201    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
1202
1203 /* Is the given value a sign-extended 16-bit value?  */
1204 #define IS_SEXT_16BIT_NUM(x)                                            \
1205   (((x) &~ (offsetT) 0x7fff) == 0                                       \
1206    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
1207
1208 /* Is the given value a sign-extended 12-bit value?  */
1209 #define IS_SEXT_12BIT_NUM(x)                                            \
1210   (((((x) & 0xfff) ^ 0x800LL) - 0x800LL) == (x))
1211
1212 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
1213 #define IS_ZEXT_32BIT_NUM(x)                                            \
1214   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
1215    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
1216
1217 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
1218    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
1219 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
1220   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
1221               | (((VALUE) & (MASK)) << (SHIFT)))
1222
1223 /* Extract bits MASK << SHIFT from STRUCT and shift them right
1224    SHIFT places.  */
1225 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
1226   (((STRUCT) >> (SHIFT)) & (MASK))
1227
1228 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1229    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1230
1231    include/opcode/mips.h specifies operand fields using the macros
1232    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
1233    with "MIPS16OP" instead of "OP".  */
1234 #define INSERT_OPERAND(MICROMIPS, FIELD, INSN, VALUE) \
1235   do \
1236     if (!(MICROMIPS)) \
1237       INSERT_BITS ((INSN).insn_opcode, VALUE, \
1238                    OP_MASK_##FIELD, OP_SH_##FIELD); \
1239     else \
1240       INSERT_BITS ((INSN).insn_opcode, VALUE, \
1241                    MICROMIPSOP_MASK_##FIELD, MICROMIPSOP_SH_##FIELD); \
1242   while (0)
1243 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1244   INSERT_BITS ((INSN).insn_opcode, VALUE, \
1245                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1246
1247 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
1248 #define EXTRACT_OPERAND(MICROMIPS, FIELD, INSN) \
1249   (!(MICROMIPS) \
1250    ? EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD) \
1251    : EXTRACT_BITS ((INSN).insn_opcode, \
1252                    MICROMIPSOP_MASK_##FIELD, MICROMIPSOP_SH_##FIELD))
1253 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1254   EXTRACT_BITS ((INSN).insn_opcode, \
1255                 MIPS16OP_MASK_##FIELD, \
1256                 MIPS16OP_SH_##FIELD)
1257 \f
1258 /* Whether or not we are emitting a branch-likely macro.  */
1259 static bfd_boolean emit_branch_likely_macro = FALSE;
1260
1261 /* Global variables used when generating relaxable macros.  See the
1262    comment above RELAX_ENCODE for more details about how relaxation
1263    is used.  */
1264 static struct {
1265   /* 0 if we're not emitting a relaxable macro.
1266      1 if we're emitting the first of the two relaxation alternatives.
1267      2 if we're emitting the second alternative.  */
1268   int sequence;
1269
1270   /* The first relaxable fixup in the current frag.  (In other words,
1271      the first fixup that refers to relaxable code.)  */
1272   fixS *first_fixup;
1273
1274   /* sizes[0] says how many bytes of the first alternative are stored in
1275      the current frag.  Likewise sizes[1] for the second alternative.  */
1276   unsigned int sizes[2];
1277
1278   /* The symbol on which the choice of sequence depends.  */
1279   symbolS *symbol;
1280 } mips_relax;
1281 \f
1282 /* Global variables used to decide whether a macro needs a warning.  */
1283 static struct {
1284   /* True if the macro is in a branch delay slot.  */
1285   bfd_boolean delay_slot_p;
1286
1287   /* Set to the length in bytes required if the macro is in a delay slot
1288      that requires a specific length of instruction, otherwise zero.  */
1289   unsigned int delay_slot_length;
1290
1291   /* For relaxable macros, sizes[0] is the length of the first alternative
1292      in bytes and sizes[1] is the length of the second alternative.
1293      For non-relaxable macros, both elements give the length of the
1294      macro in bytes.  */
1295   unsigned int sizes[2];
1296
1297   /* For relaxable macros, first_insn_sizes[0] is the length of the first
1298      instruction of the first alternative in bytes and first_insn_sizes[1]
1299      is the length of the first instruction of the second alternative.
1300      For non-relaxable macros, both elements give the length of the first
1301      instruction in bytes.
1302
1303      Set to zero if we haven't yet seen the first instruction.  */
1304   unsigned int first_insn_sizes[2];
1305
1306   /* For relaxable macros, insns[0] is the number of instructions for the
1307      first alternative and insns[1] is the number of instructions for the
1308      second alternative.
1309
1310      For non-relaxable macros, both elements give the number of
1311      instructions for the macro.  */
1312   unsigned int insns[2];
1313
1314   /* The first variant frag for this macro.  */
1315   fragS *first_frag;
1316 } mips_macro_warning;
1317 \f
1318 /* Prototypes for static functions.  */
1319
1320 #define internalError()                                                 \
1321     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1322
1323 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1324
1325 static void append_insn
1326   (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *,
1327    bfd_boolean expansionp);
1328 static void mips_no_prev_insn (void);
1329 static void macro_build (expressionS *, const char *, const char *, ...);
1330 static void mips16_macro_build
1331   (expressionS *, const char *, const char *, va_list *);
1332 static void load_register (int, expressionS *, int);
1333 static void macro_start (void);
1334 static void macro_end (void);
1335 static void macro (struct mips_cl_insn * ip);
1336 static void mips16_macro (struct mips_cl_insn * ip);
1337 static void mips_ip (char *str, struct mips_cl_insn * ip);
1338 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1339 static void mips16_immed
1340   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1341    unsigned long *, bfd_boolean *, unsigned short *);
1342 static size_t my_getSmallExpression
1343   (expressionS *, bfd_reloc_code_real_type *, char *);
1344 static void my_getExpression (expressionS *, char *);
1345 static void s_align (int);
1346 static void s_change_sec (int);
1347 static void s_change_section (int);
1348 static void s_cons (int);
1349 static void s_float_cons (int);
1350 static void s_mips_globl (int);
1351 static void s_option (int);
1352 static void s_mipsset (int);
1353 static void s_abicalls (int);
1354 static void s_cpload (int);
1355 static void s_cpsetup (int);
1356 static void s_cplocal (int);
1357 static void s_cprestore (int);
1358 static void s_cpreturn (int);
1359 static void s_dtprelword (int);
1360 static void s_dtpreldword (int);
1361 static void s_tprelword (int);
1362 static void s_tpreldword (int);
1363 static void s_gpvalue (int);
1364 static void s_gpword (int);
1365 static void s_gpdword (int);
1366 static void s_cpadd (int);
1367 static void s_insn (int);
1368 static void md_obj_begin (void);
1369 static void md_obj_end (void);
1370 static void s_mips_ent (int);
1371 static void s_mips_end (int);
1372 static void s_mips_frame (int);
1373 static void s_mips_mask (int reg_type);
1374 static void s_mips_stab (int);
1375 static void s_mips_weakext (int);
1376 static void s_mips_file (int);
1377 static void s_mips_loc (int);
1378 static bfd_boolean pic_need_relax (symbolS *, asection *);
1379 static int relaxed_branch_length (fragS *, asection *, int);
1380 static int validate_mips_insn (const struct mips_opcode *);
1381 static int validate_micromips_insn (const struct mips_opcode *);
1382 static int relaxed_micromips_16bit_branch_length (fragS *, asection *, int);
1383 static int relaxed_micromips_32bit_branch_length (fragS *, asection *, int);
1384
1385 /* Table and functions used to map between CPU/ISA names, and
1386    ISA levels, and CPU numbers.  */
1387
1388 struct mips_cpu_info
1389 {
1390   const char *name;           /* CPU or ISA name.  */
1391   int flags;                  /* ASEs available, or ISA flag.  */
1392   int isa;                    /* ISA level.  */
1393   int cpu;                    /* CPU number (default CPU if ISA).  */
1394 };
1395
1396 #define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1397 #define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1398 #define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1399 #define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1400 #define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1401 #define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1402 #define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1403 #define MIPS_CPU_ASE_MCU        0x0080  /* CPU implements MCU ASE */
1404
1405 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1406 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1407 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1408 \f
1409 /* Pseudo-op table.
1410
1411    The following pseudo-ops from the Kane and Heinrich MIPS book
1412    should be defined here, but are currently unsupported: .alias,
1413    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1414
1415    The following pseudo-ops from the Kane and Heinrich MIPS book are
1416    specific to the type of debugging information being generated, and
1417    should be defined by the object format: .aent, .begin, .bend,
1418    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1419    .vreg.
1420
1421    The following pseudo-ops from the Kane and Heinrich MIPS book are
1422    not MIPS CPU specific, but are also not specific to the object file
1423    format.  This file is probably the best place to define them, but
1424    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1425
1426 static const pseudo_typeS mips_pseudo_table[] =
1427 {
1428   /* MIPS specific pseudo-ops.  */
1429   {"option", s_option, 0},
1430   {"set", s_mipsset, 0},
1431   {"rdata", s_change_sec, 'r'},
1432   {"sdata", s_change_sec, 's'},
1433   {"livereg", s_ignore, 0},
1434   {"abicalls", s_abicalls, 0},
1435   {"cpload", s_cpload, 0},
1436   {"cpsetup", s_cpsetup, 0},
1437   {"cplocal", s_cplocal, 0},
1438   {"cprestore", s_cprestore, 0},
1439   {"cpreturn", s_cpreturn, 0},
1440   {"dtprelword", s_dtprelword, 0},
1441   {"dtpreldword", s_dtpreldword, 0},
1442   {"tprelword", s_tprelword, 0},
1443   {"tpreldword", s_tpreldword, 0},
1444   {"gpvalue", s_gpvalue, 0},
1445   {"gpword", s_gpword, 0},
1446   {"gpdword", s_gpdword, 0},
1447   {"cpadd", s_cpadd, 0},
1448   {"insn", s_insn, 0},
1449
1450   /* Relatively generic pseudo-ops that happen to be used on MIPS
1451      chips.  */
1452   {"asciiz", stringer, 8 + 1},
1453   {"bss", s_change_sec, 'b'},
1454   {"err", s_err, 0},
1455   {"half", s_cons, 1},
1456   {"dword", s_cons, 3},
1457   {"weakext", s_mips_weakext, 0},
1458   {"origin", s_org, 0},
1459   {"repeat", s_rept, 0},
1460
1461   /* For MIPS this is non-standard, but we define it for consistency.  */
1462   {"sbss", s_change_sec, 'B'},
1463
1464   /* These pseudo-ops are defined in read.c, but must be overridden
1465      here for one reason or another.  */
1466   {"align", s_align, 0},
1467   {"byte", s_cons, 0},
1468   {"data", s_change_sec, 'd'},
1469   {"double", s_float_cons, 'd'},
1470   {"float", s_float_cons, 'f'},
1471   {"globl", s_mips_globl, 0},
1472   {"global", s_mips_globl, 0},
1473   {"hword", s_cons, 1},
1474   {"int", s_cons, 2},
1475   {"long", s_cons, 2},
1476   {"octa", s_cons, 4},
1477   {"quad", s_cons, 3},
1478   {"section", s_change_section, 0},
1479   {"short", s_cons, 1},
1480   {"single", s_float_cons, 'f'},
1481   {"stabn", s_mips_stab, 'n'},
1482   {"text", s_change_sec, 't'},
1483   {"word", s_cons, 2},
1484
1485   { "extern", ecoff_directive_extern, 0},
1486
1487   { NULL, NULL, 0 },
1488 };
1489
1490 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1491 {
1492   /* These pseudo-ops should be defined by the object file format.
1493      However, a.out doesn't support them, so we have versions here.  */
1494   {"aent", s_mips_ent, 1},
1495   {"bgnb", s_ignore, 0},
1496   {"end", s_mips_end, 0},
1497   {"endb", s_ignore, 0},
1498   {"ent", s_mips_ent, 0},
1499   {"file", s_mips_file, 0},
1500   {"fmask", s_mips_mask, 'F'},
1501   {"frame", s_mips_frame, 0},
1502   {"loc", s_mips_loc, 0},
1503   {"mask", s_mips_mask, 'R'},
1504   {"verstamp", s_ignore, 0},
1505   { NULL, NULL, 0 },
1506 };
1507
1508 /* Export the ABI address size for use by TC_ADDRESS_BYTES for the
1509    purpose of the `.dc.a' internal pseudo-op.  */
1510
1511 int
1512 mips_address_bytes (void)
1513 {
1514   return HAVE_64BIT_ADDRESSES ? 8 : 4;
1515 }
1516
1517 extern void pop_insert (const pseudo_typeS *);
1518
1519 void
1520 mips_pop_insert (void)
1521 {
1522   pop_insert (mips_pseudo_table);
1523   if (! ECOFF_DEBUGGING)
1524     pop_insert (mips_nonecoff_pseudo_table);
1525 }
1526 \f
1527 /* Symbols labelling the current insn.  */
1528
1529 struct insn_label_list
1530 {
1531   struct insn_label_list *next;
1532   symbolS *label;
1533 };
1534
1535 static struct insn_label_list *free_insn_labels;
1536 #define label_list tc_segment_info_data.labels
1537
1538 static void mips_clear_insn_labels (void);
1539 static void mips_mark_labels (void);
1540 static void mips_compressed_mark_labels (void);
1541
1542 static inline void
1543 mips_clear_insn_labels (void)
1544 {
1545   register struct insn_label_list **pl;
1546   segment_info_type *si;
1547
1548   if (now_seg)
1549     {
1550       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1551         ;
1552       
1553       si = seg_info (now_seg);
1554       *pl = si->label_list;
1555       si->label_list = NULL;
1556     }
1557 }
1558
1559 /* Mark instruction labels in MIPS16/microMIPS mode.  */
1560
1561 static inline void
1562 mips_mark_labels (void)
1563 {
1564   if (HAVE_CODE_COMPRESSION)
1565     mips_compressed_mark_labels ();
1566 }
1567 \f
1568 static char *expr_end;
1569
1570 /* Expressions which appear in instructions.  These are set by
1571    mips_ip.  */
1572
1573 static expressionS imm_expr;
1574 static expressionS imm2_expr;
1575 static expressionS offset_expr;
1576
1577 /* Relocs associated with imm_expr and offset_expr.  */
1578
1579 static bfd_reloc_code_real_type imm_reloc[3]
1580   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1581 static bfd_reloc_code_real_type offset_reloc[3]
1582   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1583
1584 /* This is set to the resulting size of the instruction to be produced
1585    by mips16_ip if an explicit extension is used or by mips_ip if an
1586    explicit size is supplied.  */
1587
1588 static unsigned int forced_insn_length;
1589
1590 #ifdef OBJ_ELF
1591 /* The pdr segment for per procedure frame/regmask info.  Not used for
1592    ECOFF debugging.  */
1593
1594 static segT pdr_seg;
1595 #endif
1596
1597 /* The default target format to use.  */
1598
1599 #if defined (TE_FreeBSD)
1600 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips-freebsd"
1601 #elif defined (TE_TMIPS)
1602 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips"
1603 #else
1604 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX ENDIAN "mips"
1605 #endif
1606
1607 const char *
1608 mips_target_format (void)
1609 {
1610   switch (OUTPUT_FLAVOR)
1611     {
1612     case bfd_target_ecoff_flavour:
1613       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1614     case bfd_target_coff_flavour:
1615       return "pe-mips";
1616     case bfd_target_elf_flavour:
1617 #ifdef TE_VXWORKS
1618       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1619         return (target_big_endian
1620                 ? "elf32-bigmips-vxworks"
1621                 : "elf32-littlemips-vxworks");
1622 #endif
1623       return (target_big_endian
1624               ? (HAVE_64BIT_OBJECTS
1625                  ? ELF_TARGET ("elf64-", "big")
1626                  : (HAVE_NEWABI
1627                     ? ELF_TARGET ("elf32-n", "big")
1628                     : ELF_TARGET ("elf32-", "big")))
1629               : (HAVE_64BIT_OBJECTS
1630                  ? ELF_TARGET ("elf64-", "little")
1631                  : (HAVE_NEWABI
1632                     ? ELF_TARGET ("elf32-n", "little")
1633                     : ELF_TARGET ("elf32-", "little"))));
1634     default:
1635       abort ();
1636       return NULL;
1637     }
1638 }
1639
1640 /* Return the length of a microMIPS instruction in bytes.  If bits of
1641    the mask beyond the low 16 are 0, then it is a 16-bit instruction.
1642    Otherwise assume a 32-bit instruction; 48-bit instructions (0x1f
1643    major opcode) will require further modifications to the opcode
1644    table.  */
1645
1646 static inline unsigned int
1647 micromips_insn_length (const struct mips_opcode *mo)
1648 {
1649   return (mo->mask >> 16) == 0 ? 2 : 4;
1650 }
1651
1652 /* Return the length of instruction INSN.  */
1653
1654 static inline unsigned int
1655 insn_length (const struct mips_cl_insn *insn)
1656 {
1657   if (mips_opts.micromips)
1658     return micromips_insn_length (insn->insn_mo);
1659   else if (mips_opts.mips16)
1660     return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1661   else
1662     return 4;
1663 }
1664
1665 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1666
1667 static void
1668 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1669 {
1670   size_t i;
1671
1672   insn->insn_mo = mo;
1673   insn->use_extend = FALSE;
1674   insn->extend = 0;
1675   insn->insn_opcode = mo->match;
1676   insn->frag = NULL;
1677   insn->where = 0;
1678   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1679     insn->fixp[i] = NULL;
1680   insn->fixed_p = (mips_opts.noreorder > 0);
1681   insn->noreorder_p = (mips_opts.noreorder > 0);
1682   insn->mips16_absolute_jump_p = 0;
1683   insn->complete_p = 0;
1684 }
1685
1686 /* Record the current MIPS16/microMIPS mode in now_seg.  */
1687
1688 static void
1689 mips_record_compressed_mode (void)
1690 {
1691   segment_info_type *si;
1692
1693   si = seg_info (now_seg);
1694   if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1695     si->tc_segment_info_data.mips16 = mips_opts.mips16;
1696   if (si->tc_segment_info_data.micromips != mips_opts.micromips)
1697     si->tc_segment_info_data.micromips = mips_opts.micromips;
1698 }
1699
1700 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1701
1702 static void
1703 install_insn (const struct mips_cl_insn *insn)
1704 {
1705   char *f = insn->frag->fr_literal + insn->where;
1706   if (!HAVE_CODE_COMPRESSION)
1707     md_number_to_chars (f, insn->insn_opcode, 4);
1708   else if (mips_opts.micromips)
1709     {
1710       unsigned int length = insn_length (insn);
1711       if (length == 2)
1712         md_number_to_chars (f, insn->insn_opcode, 2);
1713       else if (length == 4)
1714         {
1715           md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1716           f += 2;
1717           md_number_to_chars (f, insn->insn_opcode & 0xffff, 2);
1718         }
1719       else
1720         as_bad (_("48-bit microMIPS instructions are not supported"));
1721     }
1722   else if (insn->mips16_absolute_jump_p)
1723     {
1724       md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1725       md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1726     }
1727   else
1728     {
1729       if (insn->use_extend)
1730         {
1731           md_number_to_chars (f, 0xf000 | insn->extend, 2);
1732           f += 2;
1733         }
1734       md_number_to_chars (f, insn->insn_opcode, 2);
1735     }
1736   mips_record_compressed_mode ();
1737 }
1738
1739 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1740    and install the opcode in the new location.  */
1741
1742 static void
1743 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1744 {
1745   size_t i;
1746
1747   insn->frag = frag;
1748   insn->where = where;
1749   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1750     if (insn->fixp[i] != NULL)
1751       {
1752         insn->fixp[i]->fx_frag = frag;
1753         insn->fixp[i]->fx_where = where;
1754       }
1755   install_insn (insn);
1756 }
1757
1758 /* Add INSN to the end of the output.  */
1759
1760 static void
1761 add_fixed_insn (struct mips_cl_insn *insn)
1762 {
1763   char *f = frag_more (insn_length (insn));
1764   move_insn (insn, frag_now, f - frag_now->fr_literal);
1765 }
1766
1767 /* Start a variant frag and move INSN to the start of the variant part,
1768    marking it as fixed.  The other arguments are as for frag_var.  */
1769
1770 static void
1771 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1772                   relax_substateT subtype, symbolS *symbol, offsetT offset)
1773 {
1774   frag_grow (max_chars);
1775   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1776   insn->fixed_p = 1;
1777   frag_var (rs_machine_dependent, max_chars, var,
1778             subtype, symbol, offset, NULL);
1779 }
1780
1781 /* Insert N copies of INSN into the history buffer, starting at
1782    position FIRST.  Neither FIRST nor N need to be clipped.  */
1783
1784 static void
1785 insert_into_history (unsigned int first, unsigned int n,
1786                      const struct mips_cl_insn *insn)
1787 {
1788   if (mips_relax.sequence != 2)
1789     {
1790       unsigned int i;
1791
1792       for (i = ARRAY_SIZE (history); i-- > first;)
1793         if (i >= first + n)
1794           history[i] = history[i - n];
1795         else
1796           history[i] = *insn;
1797     }
1798 }
1799
1800 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1801    the idea is to make it obvious at a glance that each errata is
1802    included.  */
1803
1804 static void
1805 init_vr4120_conflicts (void)
1806 {
1807 #define CONFLICT(FIRST, SECOND) \
1808     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1809
1810   /* Errata 21 - [D]DIV[U] after [D]MACC */
1811   CONFLICT (MACC, DIV);
1812   CONFLICT (DMACC, DIV);
1813
1814   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1815   CONFLICT (DMULT, DMULT);
1816   CONFLICT (DMULT, DMACC);
1817   CONFLICT (DMACC, DMULT);
1818   CONFLICT (DMACC, DMACC);
1819
1820   /* Errata 24 - MT{LO,HI} after [D]MACC */
1821   CONFLICT (MACC, MTHILO);
1822   CONFLICT (DMACC, MTHILO);
1823
1824   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1825      instruction is executed immediately after a MACC or DMACC
1826      instruction, the result of [either instruction] is incorrect."  */
1827   CONFLICT (MACC, MULT);
1828   CONFLICT (MACC, DMULT);
1829   CONFLICT (DMACC, MULT);
1830   CONFLICT (DMACC, DMULT);
1831
1832   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1833      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1834      DDIV or DDIVU instruction, the result of the MACC or
1835      DMACC instruction is incorrect.".  */
1836   CONFLICT (DMULT, MACC);
1837   CONFLICT (DMULT, DMACC);
1838   CONFLICT (DIV, MACC);
1839   CONFLICT (DIV, DMACC);
1840
1841 #undef CONFLICT
1842 }
1843
1844 struct regname {
1845   const char *name;
1846   unsigned int num;
1847 };
1848
1849 #define RTYPE_MASK      0x1ff00
1850 #define RTYPE_NUM       0x00100
1851 #define RTYPE_FPU       0x00200
1852 #define RTYPE_FCC       0x00400
1853 #define RTYPE_VEC       0x00800
1854 #define RTYPE_GP        0x01000
1855 #define RTYPE_CP0       0x02000
1856 #define RTYPE_PC        0x04000
1857 #define RTYPE_ACC       0x08000
1858 #define RTYPE_CCC       0x10000
1859 #define RNUM_MASK       0x000ff
1860 #define RWARN           0x80000
1861
1862 #define GENERIC_REGISTER_NUMBERS \
1863     {"$0",      RTYPE_NUM | 0},  \
1864     {"$1",      RTYPE_NUM | 1},  \
1865     {"$2",      RTYPE_NUM | 2},  \
1866     {"$3",      RTYPE_NUM | 3},  \
1867     {"$4",      RTYPE_NUM | 4},  \
1868     {"$5",      RTYPE_NUM | 5},  \
1869     {"$6",      RTYPE_NUM | 6},  \
1870     {"$7",      RTYPE_NUM | 7},  \
1871     {"$8",      RTYPE_NUM | 8},  \
1872     {"$9",      RTYPE_NUM | 9},  \
1873     {"$10",     RTYPE_NUM | 10}, \
1874     {"$11",     RTYPE_NUM | 11}, \
1875     {"$12",     RTYPE_NUM | 12}, \
1876     {"$13",     RTYPE_NUM | 13}, \
1877     {"$14",     RTYPE_NUM | 14}, \
1878     {"$15",     RTYPE_NUM | 15}, \
1879     {"$16",     RTYPE_NUM | 16}, \
1880     {"$17",     RTYPE_NUM | 17}, \
1881     {"$18",     RTYPE_NUM | 18}, \
1882     {"$19",     RTYPE_NUM | 19}, \
1883     {"$20",     RTYPE_NUM | 20}, \
1884     {"$21",     RTYPE_NUM | 21}, \
1885     {"$22",     RTYPE_NUM | 22}, \
1886     {"$23",     RTYPE_NUM | 23}, \
1887     {"$24",     RTYPE_NUM | 24}, \
1888     {"$25",     RTYPE_NUM | 25}, \
1889     {"$26",     RTYPE_NUM | 26}, \
1890     {"$27",     RTYPE_NUM | 27}, \
1891     {"$28",     RTYPE_NUM | 28}, \
1892     {"$29",     RTYPE_NUM | 29}, \
1893     {"$30",     RTYPE_NUM | 30}, \
1894     {"$31",     RTYPE_NUM | 31} 
1895
1896 #define FPU_REGISTER_NAMES       \
1897     {"$f0",     RTYPE_FPU | 0},  \
1898     {"$f1",     RTYPE_FPU | 1},  \
1899     {"$f2",     RTYPE_FPU | 2},  \
1900     {"$f3",     RTYPE_FPU | 3},  \
1901     {"$f4",     RTYPE_FPU | 4},  \
1902     {"$f5",     RTYPE_FPU | 5},  \
1903     {"$f6",     RTYPE_FPU | 6},  \
1904     {"$f7",     RTYPE_FPU | 7},  \
1905     {"$f8",     RTYPE_FPU | 8},  \
1906     {"$f9",     RTYPE_FPU | 9},  \
1907     {"$f10",    RTYPE_FPU | 10}, \
1908     {"$f11",    RTYPE_FPU | 11}, \
1909     {"$f12",    RTYPE_FPU | 12}, \
1910     {"$f13",    RTYPE_FPU | 13}, \
1911     {"$f14",    RTYPE_FPU | 14}, \
1912     {"$f15",    RTYPE_FPU | 15}, \
1913     {"$f16",    RTYPE_FPU | 16}, \
1914     {"$f17",    RTYPE_FPU | 17}, \
1915     {"$f18",    RTYPE_FPU | 18}, \
1916     {"$f19",    RTYPE_FPU | 19}, \
1917     {"$f20",    RTYPE_FPU | 20}, \
1918     {"$f21",    RTYPE_FPU | 21}, \
1919     {"$f22",    RTYPE_FPU | 22}, \
1920     {"$f23",    RTYPE_FPU | 23}, \
1921     {"$f24",    RTYPE_FPU | 24}, \
1922     {"$f25",    RTYPE_FPU | 25}, \
1923     {"$f26",    RTYPE_FPU | 26}, \
1924     {"$f27",    RTYPE_FPU | 27}, \
1925     {"$f28",    RTYPE_FPU | 28}, \
1926     {"$f29",    RTYPE_FPU | 29}, \
1927     {"$f30",    RTYPE_FPU | 30}, \
1928     {"$f31",    RTYPE_FPU | 31}
1929
1930 #define FPU_CONDITION_CODE_NAMES \
1931     {"$fcc0",   RTYPE_FCC | 0},  \
1932     {"$fcc1",   RTYPE_FCC | 1},  \
1933     {"$fcc2",   RTYPE_FCC | 2},  \
1934     {"$fcc3",   RTYPE_FCC | 3},  \
1935     {"$fcc4",   RTYPE_FCC | 4},  \
1936     {"$fcc5",   RTYPE_FCC | 5},  \
1937     {"$fcc6",   RTYPE_FCC | 6},  \
1938     {"$fcc7",   RTYPE_FCC | 7}
1939
1940 #define COPROC_CONDITION_CODE_NAMES         \
1941     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1942     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1943     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1944     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1945     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1946     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1947     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1948     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1949
1950 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1951     {"$a4",     RTYPE_GP | 8},  \
1952     {"$a5",     RTYPE_GP | 9},  \
1953     {"$a6",     RTYPE_GP | 10}, \
1954     {"$a7",     RTYPE_GP | 11}, \
1955     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1956     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1957     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1958     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1959     {"$t0",     RTYPE_GP | 12}, \
1960     {"$t1",     RTYPE_GP | 13}, \
1961     {"$t2",     RTYPE_GP | 14}, \
1962     {"$t3",     RTYPE_GP | 15}
1963
1964 #define O32_SYMBOLIC_REGISTER_NAMES \
1965     {"$t0",     RTYPE_GP | 8},  \
1966     {"$t1",     RTYPE_GP | 9},  \
1967     {"$t2",     RTYPE_GP | 10}, \
1968     {"$t3",     RTYPE_GP | 11}, \
1969     {"$t4",     RTYPE_GP | 12}, \
1970     {"$t5",     RTYPE_GP | 13}, \
1971     {"$t6",     RTYPE_GP | 14}, \
1972     {"$t7",     RTYPE_GP | 15}, \
1973     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
1974     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
1975     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
1976     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */ 
1977
1978 /* Remaining symbolic register names */
1979 #define SYMBOLIC_REGISTER_NAMES \
1980     {"$zero",   RTYPE_GP | 0},  \
1981     {"$at",     RTYPE_GP | 1},  \
1982     {"$AT",     RTYPE_GP | 1},  \
1983     {"$v0",     RTYPE_GP | 2},  \
1984     {"$v1",     RTYPE_GP | 3},  \
1985     {"$a0",     RTYPE_GP | 4},  \
1986     {"$a1",     RTYPE_GP | 5},  \
1987     {"$a2",     RTYPE_GP | 6},  \
1988     {"$a3",     RTYPE_GP | 7},  \
1989     {"$s0",     RTYPE_GP | 16}, \
1990     {"$s1",     RTYPE_GP | 17}, \
1991     {"$s2",     RTYPE_GP | 18}, \
1992     {"$s3",     RTYPE_GP | 19}, \
1993     {"$s4",     RTYPE_GP | 20}, \
1994     {"$s5",     RTYPE_GP | 21}, \
1995     {"$s6",     RTYPE_GP | 22}, \
1996     {"$s7",     RTYPE_GP | 23}, \
1997     {"$t8",     RTYPE_GP | 24}, \
1998     {"$t9",     RTYPE_GP | 25}, \
1999     {"$k0",     RTYPE_GP | 26}, \
2000     {"$kt0",    RTYPE_GP | 26}, \
2001     {"$k1",     RTYPE_GP | 27}, \
2002     {"$kt1",    RTYPE_GP | 27}, \
2003     {"$gp",     RTYPE_GP | 28}, \
2004     {"$sp",     RTYPE_GP | 29}, \
2005     {"$s8",     RTYPE_GP | 30}, \
2006     {"$fp",     RTYPE_GP | 30}, \
2007     {"$ra",     RTYPE_GP | 31}
2008
2009 #define MIPS16_SPECIAL_REGISTER_NAMES \
2010     {"$pc",     RTYPE_PC | 0}
2011
2012 #define MDMX_VECTOR_REGISTER_NAMES \
2013     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
2014     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
2015     {"$v2",     RTYPE_VEC | 2},  \
2016     {"$v3",     RTYPE_VEC | 3},  \
2017     {"$v4",     RTYPE_VEC | 4},  \
2018     {"$v5",     RTYPE_VEC | 5},  \
2019     {"$v6",     RTYPE_VEC | 6},  \
2020     {"$v7",     RTYPE_VEC | 7},  \
2021     {"$v8",     RTYPE_VEC | 8},  \
2022     {"$v9",     RTYPE_VEC | 9},  \
2023     {"$v10",    RTYPE_VEC | 10}, \
2024     {"$v11",    RTYPE_VEC | 11}, \
2025     {"$v12",    RTYPE_VEC | 12}, \
2026     {"$v13",    RTYPE_VEC | 13}, \
2027     {"$v14",    RTYPE_VEC | 14}, \
2028     {"$v15",    RTYPE_VEC | 15}, \
2029     {"$v16",    RTYPE_VEC | 16}, \
2030     {"$v17",    RTYPE_VEC | 17}, \
2031     {"$v18",    RTYPE_VEC | 18}, \
2032     {"$v19",    RTYPE_VEC | 19}, \
2033     {"$v20",    RTYPE_VEC | 20}, \
2034     {"$v21",    RTYPE_VEC | 21}, \
2035     {"$v22",    RTYPE_VEC | 22}, \
2036     {"$v23",    RTYPE_VEC | 23}, \
2037     {"$v24",    RTYPE_VEC | 24}, \
2038     {"$v25",    RTYPE_VEC | 25}, \
2039     {"$v26",    RTYPE_VEC | 26}, \
2040     {"$v27",    RTYPE_VEC | 27}, \
2041     {"$v28",    RTYPE_VEC | 28}, \
2042     {"$v29",    RTYPE_VEC | 29}, \
2043     {"$v30",    RTYPE_VEC | 30}, \
2044     {"$v31",    RTYPE_VEC | 31}
2045
2046 #define MIPS_DSP_ACCUMULATOR_NAMES \
2047     {"$ac0",    RTYPE_ACC | 0}, \
2048     {"$ac1",    RTYPE_ACC | 1}, \
2049     {"$ac2",    RTYPE_ACC | 2}, \
2050     {"$ac3",    RTYPE_ACC | 3}
2051
2052 static const struct regname reg_names[] = {
2053   GENERIC_REGISTER_NUMBERS,
2054   FPU_REGISTER_NAMES,
2055   FPU_CONDITION_CODE_NAMES,
2056   COPROC_CONDITION_CODE_NAMES,
2057
2058   /* The $txx registers depends on the abi,
2059      these will be added later into the symbol table from
2060      one of the tables below once mips_abi is set after 
2061      parsing of arguments from the command line. */
2062   SYMBOLIC_REGISTER_NAMES,
2063
2064   MIPS16_SPECIAL_REGISTER_NAMES,
2065   MDMX_VECTOR_REGISTER_NAMES,
2066   MIPS_DSP_ACCUMULATOR_NAMES,
2067   {0, 0}
2068 };
2069
2070 static const struct regname reg_names_o32[] = {
2071   O32_SYMBOLIC_REGISTER_NAMES,
2072   {0, 0}
2073 };
2074
2075 static const struct regname reg_names_n32n64[] = {
2076   N32N64_SYMBOLIC_REGISTER_NAMES,
2077   {0, 0}
2078 };
2079
2080 /* Check if S points at a valid register specifier according to TYPES.
2081    If so, then return 1, advance S to consume the specifier and store
2082    the register's number in REGNOP, otherwise return 0.  */
2083
2084 static int
2085 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
2086 {
2087   symbolS *symbolP;
2088   char *e;
2089   char save_c;
2090   int reg = -1;
2091
2092   /* Find end of name.  */
2093   e = *s;
2094   if (is_name_beginner (*e))
2095     ++e;
2096   while (is_part_of_name (*e))
2097     ++e;
2098
2099   /* Terminate name.  */
2100   save_c = *e;
2101   *e = '\0';
2102
2103   /* Look for a register symbol.  */
2104   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
2105     {
2106       int r = S_GET_VALUE (symbolP);
2107       if (r & types)
2108         reg = r & RNUM_MASK;
2109       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
2110         /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
2111         reg = (r & RNUM_MASK) - 2;
2112     }
2113   /* Else see if this is a register defined in an itbl entry.  */
2114   else if ((types & RTYPE_GP) && itbl_have_entries)
2115     {
2116       char *n = *s;
2117       unsigned long r;
2118
2119       if (*n == '$')
2120         ++n;
2121       if (itbl_get_reg_val (n, &r))
2122         reg = r & RNUM_MASK;
2123     }
2124
2125   /* Advance to next token if a register was recognised.  */
2126   if (reg >= 0)
2127     *s = e;
2128   else if (types & RWARN)
2129     as_warn (_("Unrecognized register name `%s'"), *s);
2130
2131   *e = save_c;
2132   if (regnop)
2133     *regnop = reg;
2134   return reg >= 0;
2135 }
2136
2137 /* Check if S points at a valid register list according to TYPES.
2138    If so, then return 1, advance S to consume the list and store
2139    the registers present on the list as a bitmask of ones in REGLISTP,
2140    otherwise return 0.  A valid list comprises a comma-separated
2141    enumeration of valid single registers and/or dash-separated
2142    contiguous register ranges as determined by their numbers.
2143
2144    As a special exception if one of s0-s7 registers is specified as
2145    the range's lower delimiter and s8 (fp) is its upper one, then no
2146    registers whose numbers place them between s7 and s8 (i.e. $24-$29)
2147    are selected; they have to be listed separately if needed.  */
2148
2149 static int
2150 reglist_lookup (char **s, unsigned int types, unsigned int *reglistp)
2151 {
2152   unsigned int reglist = 0;
2153   unsigned int lastregno;
2154   bfd_boolean ok = TRUE;
2155   unsigned int regmask;
2156   char *s_endlist = *s;
2157   char *s_reset = *s;
2158   unsigned int regno;
2159
2160   while (reg_lookup (s, types, &regno))
2161     {
2162       lastregno = regno;
2163       if (**s == '-')
2164         {
2165           (*s)++;
2166           ok = reg_lookup (s, types, &lastregno);
2167           if (ok && lastregno < regno)
2168             ok = FALSE;
2169           if (!ok)
2170             break;
2171         }
2172
2173       if (lastregno == FP && regno >= S0 && regno <= S7)
2174         {
2175           lastregno = S7;
2176           reglist |= 1 << FP;
2177         }
2178       regmask = 1 << lastregno;
2179       regmask = (regmask << 1) - 1;
2180       regmask ^= (1 << regno) - 1;
2181       reglist |= regmask;
2182
2183       s_endlist = *s;
2184       if (**s != ',')
2185         break;
2186       (*s)++;
2187     }
2188
2189   if (ok)
2190     *s = s_endlist;
2191   else
2192     *s = s_reset;
2193   if (reglistp)
2194     *reglistp = reglist;
2195   return ok && reglist != 0;
2196 }
2197
2198 /* Return TRUE if opcode MO is valid on the currently selected ISA and
2199    architecture.  Use is_opcode_valid_16 for MIPS16 opcodes.  */
2200
2201 static bfd_boolean
2202 is_opcode_valid (const struct mips_opcode *mo)
2203 {
2204   int isa = mips_opts.isa;
2205   int fp_s, fp_d;
2206
2207   if (mips_opts.ase_mdmx)
2208     isa |= INSN_MDMX;
2209   if (mips_opts.ase_dsp)
2210     isa |= INSN_DSP;
2211   if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
2212     isa |= INSN_DSP64;
2213   if (mips_opts.ase_dspr2)
2214     isa |= INSN_DSPR2;
2215   if (mips_opts.ase_mt)
2216     isa |= INSN_MT;
2217   if (mips_opts.ase_mips3d)
2218     isa |= INSN_MIPS3D;
2219   if (mips_opts.ase_smartmips)
2220     isa |= INSN_SMARTMIPS;
2221   if (mips_opts.ase_mcu)
2222     isa |= INSN_MCU;
2223
2224   /* Don't accept instructions based on the ISA if the CPU does not implement
2225      all the coprocessor insns. */
2226   if (NO_ISA_COP (mips_opts.arch)
2227       && COP_INSN (mo->pinfo))
2228     isa = 0;
2229
2230   if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
2231     return FALSE;
2232
2233   /* Check whether the instruction or macro requires single-precision or
2234      double-precision floating-point support.  Note that this information is
2235      stored differently in the opcode table for insns and macros.  */
2236   if (mo->pinfo == INSN_MACRO)
2237     {
2238       fp_s = mo->pinfo2 & INSN2_M_FP_S;
2239       fp_d = mo->pinfo2 & INSN2_M_FP_D;
2240     }
2241   else
2242     {
2243       fp_s = mo->pinfo & FP_S;
2244       fp_d = mo->pinfo & FP_D;
2245     }
2246
2247   if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
2248     return FALSE;
2249
2250   if (fp_s && mips_opts.soft_float)
2251     return FALSE;
2252
2253   return TRUE;
2254 }
2255
2256 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
2257    selected ISA and architecture.  */
2258
2259 static bfd_boolean
2260 is_opcode_valid_16 (const struct mips_opcode *mo)
2261 {
2262   return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
2263 }
2264
2265 /* Return TRUE if the size of the microMIPS opcode MO matches one
2266    explicitly requested.  Always TRUE in the standard MIPS mode.  */
2267
2268 static bfd_boolean
2269 is_size_valid (const struct mips_opcode *mo)
2270 {
2271   if (!mips_opts.micromips)
2272     return TRUE;
2273
2274   if (!forced_insn_length)
2275     return TRUE;
2276   if (mo->pinfo == INSN_MACRO)
2277     return FALSE;
2278   return forced_insn_length == micromips_insn_length (mo);
2279 }
2280
2281 /* Return TRUE if the microMIPS opcode MO is valid for the delay slot
2282    of the preceding instruction.  Always TRUE in the standard MIPS mode.  */
2283
2284 static bfd_boolean
2285 is_delay_slot_valid (const struct mips_opcode *mo)
2286 {
2287   if (!mips_opts.micromips)
2288     return TRUE;
2289
2290   if (mo->pinfo == INSN_MACRO)
2291     return TRUE;
2292   if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
2293       && micromips_insn_length (mo) != 4)
2294     return FALSE;
2295   if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
2296       && micromips_insn_length (mo) != 2)
2297     return FALSE;
2298
2299   return TRUE;
2300 }
2301
2302 /* This function is called once, at assembler startup time.  It should set up
2303    all the tables, etc. that the MD part of the assembler will need.  */
2304
2305 void
2306 md_begin (void)
2307 {
2308   const char *retval = NULL;
2309   int i = 0;
2310   int broken = 0;
2311
2312   if (mips_pic != NO_PIC)
2313     {
2314       if (g_switch_seen && g_switch_value != 0)
2315         as_bad (_("-G may not be used in position-independent code"));
2316       g_switch_value = 0;
2317     }
2318
2319   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
2320     as_warn (_("Could not set architecture and machine"));
2321
2322   op_hash = hash_new ();
2323
2324   for (i = 0; i < NUMOPCODES;)
2325     {
2326       const char *name = mips_opcodes[i].name;
2327
2328       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
2329       if (retval != NULL)
2330         {
2331           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
2332                    mips_opcodes[i].name, retval);
2333           /* Probably a memory allocation problem?  Give up now.  */
2334           as_fatal (_("Broken assembler.  No assembly attempted."));
2335         }
2336       do
2337         {
2338           if (mips_opcodes[i].pinfo != INSN_MACRO)
2339             {
2340               if (!validate_mips_insn (&mips_opcodes[i]))
2341                 broken = 1;
2342               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2343                 {
2344                   create_insn (&nop_insn, mips_opcodes + i);
2345                   if (mips_fix_loongson2f_nop)
2346                     nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
2347                   nop_insn.fixed_p = 1;
2348                 }
2349             }
2350           ++i;
2351         }
2352       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
2353     }
2354
2355   mips16_op_hash = hash_new ();
2356
2357   i = 0;
2358   while (i < bfd_mips16_num_opcodes)
2359     {
2360       const char *name = mips16_opcodes[i].name;
2361
2362       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
2363       if (retval != NULL)
2364         as_fatal (_("internal: can't hash `%s': %s"),
2365                   mips16_opcodes[i].name, retval);
2366       do
2367         {
2368           if (mips16_opcodes[i].pinfo != INSN_MACRO
2369               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
2370                   != mips16_opcodes[i].match))
2371             {
2372               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
2373                        mips16_opcodes[i].name, mips16_opcodes[i].args);
2374               broken = 1;
2375             }
2376           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2377             {
2378               create_insn (&mips16_nop_insn, mips16_opcodes + i);
2379               mips16_nop_insn.fixed_p = 1;
2380             }
2381           ++i;
2382         }
2383       while (i < bfd_mips16_num_opcodes
2384              && strcmp (mips16_opcodes[i].name, name) == 0);
2385     }
2386
2387   micromips_op_hash = hash_new ();
2388
2389   i = 0;
2390   while (i < bfd_micromips_num_opcodes)
2391     {
2392       const char *name = micromips_opcodes[i].name;
2393
2394       retval = hash_insert (micromips_op_hash, name,
2395                             (void *) &micromips_opcodes[i]);
2396       if (retval != NULL)
2397         as_fatal (_("internal: can't hash `%s': %s"),
2398                   micromips_opcodes[i].name, retval);
2399       do
2400         if (micromips_opcodes[i].pinfo != INSN_MACRO)
2401           {
2402             struct mips_cl_insn *micromips_nop_insn;
2403
2404             if (!validate_micromips_insn (&micromips_opcodes[i]))
2405               broken = 1;
2406
2407             if (micromips_insn_length (micromips_opcodes + i) == 2)
2408               micromips_nop_insn = &micromips_nop16_insn;
2409             else if (micromips_insn_length (micromips_opcodes + i) == 4)
2410               micromips_nop_insn = &micromips_nop32_insn;
2411             else
2412               continue;
2413
2414             if (micromips_nop_insn->insn_mo == NULL
2415                 && strcmp (name, "nop") == 0)
2416               {
2417                 create_insn (micromips_nop_insn, micromips_opcodes + i);
2418                 micromips_nop_insn->fixed_p = 1;
2419               }
2420           }
2421       while (++i < bfd_micromips_num_opcodes
2422              && strcmp (micromips_opcodes[i].name, name) == 0);
2423     }
2424
2425   if (broken)
2426     as_fatal (_("Broken assembler.  No assembly attempted."));
2427
2428   /* We add all the general register names to the symbol table.  This
2429      helps us detect invalid uses of them.  */
2430   for (i = 0; reg_names[i].name; i++) 
2431     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
2432                                      reg_names[i].num, /* & RNUM_MASK, */
2433                                      &zero_address_frag));
2434   if (HAVE_NEWABI)
2435     for (i = 0; reg_names_n32n64[i].name; i++) 
2436       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
2437                                        reg_names_n32n64[i].num, /* & RNUM_MASK, */
2438                                        &zero_address_frag));
2439   else
2440     for (i = 0; reg_names_o32[i].name; i++) 
2441       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
2442                                        reg_names_o32[i].num, /* & RNUM_MASK, */
2443                                        &zero_address_frag));
2444
2445   mips_no_prev_insn ();
2446
2447   mips_gprmask = 0;
2448   mips_cprmask[0] = 0;
2449   mips_cprmask[1] = 0;
2450   mips_cprmask[2] = 0;
2451   mips_cprmask[3] = 0;
2452
2453   /* set the default alignment for the text section (2**2) */
2454   record_alignment (text_section, 2);
2455
2456   bfd_set_gp_size (stdoutput, g_switch_value);
2457
2458 #ifdef OBJ_ELF
2459   if (IS_ELF)
2460     {
2461       /* On a native system other than VxWorks, sections must be aligned
2462          to 16 byte boundaries.  When configured for an embedded ELF
2463          target, we don't bother.  */
2464       if (strncmp (TARGET_OS, "elf", 3) != 0
2465           && strncmp (TARGET_OS, "vxworks", 7) != 0)
2466         {
2467           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2468           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2469           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2470         }
2471
2472       /* Create a .reginfo section for register masks and a .mdebug
2473          section for debugging information.  */
2474       {
2475         segT seg;
2476         subsegT subseg;
2477         flagword flags;
2478         segT sec;
2479
2480         seg = now_seg;
2481         subseg = now_subseg;
2482
2483         /* The ABI says this section should be loaded so that the
2484            running program can access it.  However, we don't load it
2485            if we are configured for an embedded target */
2486         flags = SEC_READONLY | SEC_DATA;
2487         if (strncmp (TARGET_OS, "elf", 3) != 0)
2488           flags |= SEC_ALLOC | SEC_LOAD;
2489
2490         if (mips_abi != N64_ABI)
2491           {
2492             sec = subseg_new (".reginfo", (subsegT) 0);
2493
2494             bfd_set_section_flags (stdoutput, sec, flags);
2495             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2496
2497             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2498           }
2499         else
2500           {
2501             /* The 64-bit ABI uses a .MIPS.options section rather than
2502                .reginfo section.  */
2503             sec = subseg_new (".MIPS.options", (subsegT) 0);
2504             bfd_set_section_flags (stdoutput, sec, flags);
2505             bfd_set_section_alignment (stdoutput, sec, 3);
2506
2507             /* Set up the option header.  */
2508             {
2509               Elf_Internal_Options opthdr;
2510               char *f;
2511
2512               opthdr.kind = ODK_REGINFO;
2513               opthdr.size = (sizeof (Elf_External_Options)
2514                              + sizeof (Elf64_External_RegInfo));
2515               opthdr.section = 0;
2516               opthdr.info = 0;
2517               f = frag_more (sizeof (Elf_External_Options));
2518               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2519                                              (Elf_External_Options *) f);
2520
2521               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2522             }
2523           }
2524
2525         if (ECOFF_DEBUGGING)
2526           {
2527             sec = subseg_new (".mdebug", (subsegT) 0);
2528             (void) bfd_set_section_flags (stdoutput, sec,
2529                                           SEC_HAS_CONTENTS | SEC_READONLY);
2530             (void) bfd_set_section_alignment (stdoutput, sec, 2);
2531           }
2532         else if (mips_flag_pdr)
2533           {
2534             pdr_seg = subseg_new (".pdr", (subsegT) 0);
2535             (void) bfd_set_section_flags (stdoutput, pdr_seg,
2536                                           SEC_READONLY | SEC_RELOC
2537                                           | SEC_DEBUGGING);
2538             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2539           }
2540
2541         subseg_set (seg, subseg);
2542       }
2543     }
2544 #endif /* OBJ_ELF */
2545
2546   if (! ECOFF_DEBUGGING)
2547     md_obj_begin ();
2548
2549   if (mips_fix_vr4120)
2550     init_vr4120_conflicts ();
2551 }
2552
2553 void
2554 md_mips_end (void)
2555 {
2556   mips_emit_delays ();
2557   if (! ECOFF_DEBUGGING)
2558     md_obj_end ();
2559 }
2560
2561 void
2562 md_assemble (char *str)
2563 {
2564   struct mips_cl_insn insn;
2565   bfd_reloc_code_real_type unused_reloc[3]
2566     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2567
2568   imm_expr.X_op = O_absent;
2569   imm2_expr.X_op = O_absent;
2570   offset_expr.X_op = O_absent;
2571   imm_reloc[0] = BFD_RELOC_UNUSED;
2572   imm_reloc[1] = BFD_RELOC_UNUSED;
2573   imm_reloc[2] = BFD_RELOC_UNUSED;
2574   offset_reloc[0] = BFD_RELOC_UNUSED;
2575   offset_reloc[1] = BFD_RELOC_UNUSED;
2576   offset_reloc[2] = BFD_RELOC_UNUSED;
2577
2578   if (mips_opts.mips16)
2579     mips16_ip (str, &insn);
2580   else
2581     {
2582       mips_ip (str, &insn);
2583       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2584             str, insn.insn_opcode));
2585     }
2586
2587   if (insn_error)
2588     {
2589       as_bad ("%s `%s'", insn_error, str);
2590       return;
2591     }
2592
2593   if (insn.insn_mo->pinfo == INSN_MACRO)
2594     {
2595       macro_start ();
2596       if (mips_opts.mips16)
2597         mips16_macro (&insn);
2598       else
2599         macro (&insn);
2600       macro_end ();
2601     }
2602   else
2603     {
2604       if (imm_expr.X_op != O_absent)
2605         append_insn (&insn, &imm_expr, imm_reloc, FALSE);
2606       else if (offset_expr.X_op != O_absent)
2607         append_insn (&insn, &offset_expr, offset_reloc, FALSE);
2608       else
2609         append_insn (&insn, NULL, unused_reloc, FALSE);
2610     }
2611 }
2612
2613 /* Convenience functions for abstracting away the differences between
2614    MIPS16 and non-MIPS16 relocations.  */
2615
2616 static inline bfd_boolean
2617 mips16_reloc_p (bfd_reloc_code_real_type reloc)
2618 {
2619   switch (reloc)
2620     {
2621     case BFD_RELOC_MIPS16_JMP:
2622     case BFD_RELOC_MIPS16_GPREL:
2623     case BFD_RELOC_MIPS16_GOT16:
2624     case BFD_RELOC_MIPS16_CALL16:
2625     case BFD_RELOC_MIPS16_HI16_S:
2626     case BFD_RELOC_MIPS16_HI16:
2627     case BFD_RELOC_MIPS16_LO16:
2628       return TRUE;
2629
2630     default:
2631       return FALSE;
2632     }
2633 }
2634
2635 static inline bfd_boolean
2636 micromips_reloc_p (bfd_reloc_code_real_type reloc)
2637 {
2638   switch (reloc)
2639     {
2640     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
2641     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
2642     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
2643     case BFD_RELOC_MICROMIPS_GPREL16:
2644     case BFD_RELOC_MICROMIPS_JMP:
2645     case BFD_RELOC_MICROMIPS_HI16:
2646     case BFD_RELOC_MICROMIPS_HI16_S:
2647     case BFD_RELOC_MICROMIPS_LO16:
2648     case BFD_RELOC_MICROMIPS_LITERAL:
2649     case BFD_RELOC_MICROMIPS_GOT16:
2650     case BFD_RELOC_MICROMIPS_CALL16:
2651     case BFD_RELOC_MICROMIPS_GOT_HI16:
2652     case BFD_RELOC_MICROMIPS_GOT_LO16:
2653     case BFD_RELOC_MICROMIPS_CALL_HI16:
2654     case BFD_RELOC_MICROMIPS_CALL_LO16:
2655     case BFD_RELOC_MICROMIPS_SUB:
2656     case BFD_RELOC_MICROMIPS_GOT_PAGE:
2657     case BFD_RELOC_MICROMIPS_GOT_OFST:
2658     case BFD_RELOC_MICROMIPS_GOT_DISP:
2659     case BFD_RELOC_MICROMIPS_HIGHEST:
2660     case BFD_RELOC_MICROMIPS_HIGHER:
2661     case BFD_RELOC_MICROMIPS_SCN_DISP:
2662     case BFD_RELOC_MICROMIPS_JALR:
2663       return TRUE;
2664
2665     default:
2666       return FALSE;
2667     }
2668 }
2669
2670 static inline bfd_boolean
2671 jmp_reloc_p (bfd_reloc_code_real_type reloc)
2672 {
2673   return reloc == BFD_RELOC_MIPS_JMP || reloc == BFD_RELOC_MICROMIPS_JMP;
2674 }
2675
2676 static inline bfd_boolean
2677 got16_reloc_p (bfd_reloc_code_real_type reloc)
2678 {
2679   return (reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16
2680           || reloc == BFD_RELOC_MICROMIPS_GOT16);
2681 }
2682
2683 static inline bfd_boolean
2684 hi16_reloc_p (bfd_reloc_code_real_type reloc)
2685 {
2686   return (reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S
2687           || reloc == BFD_RELOC_MICROMIPS_HI16_S);
2688 }
2689
2690 static inline bfd_boolean
2691 lo16_reloc_p (bfd_reloc_code_real_type reloc)
2692 {
2693   return (reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16
2694           || reloc == BFD_RELOC_MICROMIPS_LO16);
2695 }
2696
2697 static inline bfd_boolean
2698 jalr_reloc_p (bfd_reloc_code_real_type reloc)
2699 {
2700   return reloc == BFD_RELOC_MIPS_JALR || reloc == BFD_RELOC_MICROMIPS_JALR;
2701 }
2702
2703 /* Return true if the given relocation might need a matching %lo().
2704    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2705    need a matching %lo() when applied to local symbols.  */
2706
2707 static inline bfd_boolean
2708 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2709 {
2710   return (HAVE_IN_PLACE_ADDENDS
2711           && (hi16_reloc_p (reloc)
2712               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2713                  all GOT16 relocations evaluate to "G".  */
2714               || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2715 }
2716
2717 /* Return the type of %lo() reloc needed by RELOC, given that
2718    reloc_needs_lo_p.  */
2719
2720 static inline bfd_reloc_code_real_type
2721 matching_lo_reloc (bfd_reloc_code_real_type reloc)
2722 {
2723   return (mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16
2724           : (micromips_reloc_p (reloc) ? BFD_RELOC_MICROMIPS_LO16
2725              : BFD_RELOC_LO16));
2726 }
2727
2728 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2729    relocation.  */
2730
2731 static inline bfd_boolean
2732 fixup_has_matching_lo_p (fixS *fixp)
2733 {
2734   return (fixp->fx_next != NULL
2735           && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
2736           && fixp->fx_addsy == fixp->fx_next->fx_addsy
2737           && fixp->fx_offset == fixp->fx_next->fx_offset);
2738 }
2739
2740 /* This function returns true if modifying a register requires a
2741    delay.  */
2742
2743 static int
2744 reg_needs_delay (unsigned int reg)
2745 {
2746   unsigned long prev_pinfo;
2747
2748   prev_pinfo = history[0].insn_mo->pinfo;
2749   if (! mips_opts.noreorder
2750       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2751            && ! gpr_interlocks)
2752           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2753               && ! cop_interlocks)))
2754     {
2755       /* A load from a coprocessor or from memory.  All load delays
2756          delay the use of general register rt for one instruction.  */
2757       /* Itbl support may require additional care here.  */
2758       know (prev_pinfo & INSN_WRITE_GPR_T);
2759       if (reg == EXTRACT_OPERAND (mips_opts.micromips, RT, history[0]))
2760         return 1;
2761     }
2762
2763   return 0;
2764 }
2765
2766 /* Move all labels in LABELS to the current insertion point.  TEXT_P
2767    says whether the labels refer to text or data.  */
2768
2769 static void
2770 mips_move_labels (struct insn_label_list *labels, bfd_boolean text_p)
2771 {
2772   struct insn_label_list *l;
2773   valueT val;
2774
2775   for (l = labels; l != NULL; l = l->next)
2776     {
2777       gas_assert (S_GET_SEGMENT (l->label) == now_seg);
2778       symbol_set_frag (l->label, frag_now);
2779       val = (valueT) frag_now_fix ();
2780       /* MIPS16/microMIPS text labels are stored as odd.  */
2781       if (text_p && HAVE_CODE_COMPRESSION)
2782         ++val;
2783       S_SET_VALUE (l->label, val);
2784     }
2785 }
2786
2787 /* Move all labels in insn_labels to the current insertion point
2788    and treat them as text labels.  */
2789
2790 static void
2791 mips_move_text_labels (void)
2792 {
2793   mips_move_labels (seg_info (now_seg)->label_list, TRUE);
2794 }
2795
2796 static bfd_boolean
2797 s_is_linkonce (symbolS *sym, segT from_seg)
2798 {
2799   bfd_boolean linkonce = FALSE;
2800   segT symseg = S_GET_SEGMENT (sym);
2801
2802   if (symseg != from_seg && !S_IS_LOCAL (sym))
2803     {
2804       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2805         linkonce = TRUE;
2806 #ifdef OBJ_ELF
2807       /* The GNU toolchain uses an extension for ELF: a section
2808          beginning with the magic string .gnu.linkonce is a
2809          linkonce section.  */
2810       if (strncmp (segment_name (symseg), ".gnu.linkonce",
2811                    sizeof ".gnu.linkonce" - 1) == 0)
2812         linkonce = TRUE;
2813 #endif
2814     }
2815   return linkonce;
2816 }
2817
2818 /* Mark instruction labels in MIPS16/microMIPS mode.  This permits the
2819    linker to handle them specially, such as generating jalx instructions
2820    when needed.  We also make them odd for the duration of the assembly,
2821    in order to generate the right sort of code.  We will make them even
2822    in the adjust_symtab routine, while leaving them marked.  This is
2823    convenient for the debugger and the disassembler.  The linker knows
2824    to make them odd again.  */
2825
2826 static void
2827 mips_compressed_mark_labels (void)
2828 {
2829   segment_info_type *si = seg_info (now_seg);
2830   struct insn_label_list *l;
2831
2832   gas_assert (HAVE_CODE_COMPRESSION);
2833
2834   for (l = si->label_list; l != NULL; l = l->next)
2835    {
2836       symbolS *label = l->label;
2837
2838 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2839       if (IS_ELF)
2840         {
2841           if (mips_opts.mips16)
2842             S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2843           else
2844             S_SET_OTHER (label, ELF_ST_SET_MICROMIPS (S_GET_OTHER (label)));
2845         }
2846 #endif
2847       if ((S_GET_VALUE (label) & 1) == 0
2848         /* Don't adjust the address if the label is global or weak, or
2849            in a link-once section, since we'll be emitting symbol reloc
2850            references to it which will be patched up by the linker, and
2851            the final value of the symbol may or may not be MIPS16/microMIPS.  */
2852           && ! S_IS_WEAK (label)
2853           && ! S_IS_EXTERNAL (label)
2854           && ! s_is_linkonce (label, now_seg))
2855         S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2856     }
2857 }
2858
2859 /* End the current frag.  Make it a variant frag and record the
2860    relaxation info.  */
2861
2862 static void
2863 relax_close_frag (void)
2864 {
2865   mips_macro_warning.first_frag = frag_now;
2866   frag_var (rs_machine_dependent, 0, 0,
2867             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2868             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2869
2870   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2871   mips_relax.first_fixup = 0;
2872 }
2873
2874 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2875    See the comment above RELAX_ENCODE for more details.  */
2876
2877 static void
2878 relax_start (symbolS *symbol)
2879 {
2880   gas_assert (mips_relax.sequence == 0);
2881   mips_relax.sequence = 1;
2882   mips_relax.symbol = symbol;
2883 }
2884
2885 /* Start generating the second version of a relaxable sequence.
2886    See the comment above RELAX_ENCODE for more details.  */
2887
2888 static void
2889 relax_switch (void)
2890 {
2891   gas_assert (mips_relax.sequence == 1);
2892   mips_relax.sequence = 2;
2893 }
2894
2895 /* End the current relaxable sequence.  */
2896
2897 static void
2898 relax_end (void)
2899 {
2900   gas_assert (mips_relax.sequence == 2);
2901   relax_close_frag ();
2902   mips_relax.sequence = 0;
2903 }
2904
2905 /* Return true if IP is a delayed branch or jump.  */
2906
2907 static inline bfd_boolean
2908 delayed_branch_p (const struct mips_cl_insn *ip)
2909 {
2910   return (ip->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2911                                 | INSN_COND_BRANCH_DELAY
2912                                 | INSN_COND_BRANCH_LIKELY)) != 0;
2913 }
2914
2915 /* Return true if IP is a compact branch or jump.  */
2916
2917 static inline bfd_boolean
2918 compact_branch_p (const struct mips_cl_insn *ip)
2919 {
2920   if (mips_opts.mips16)
2921     return (ip->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
2922                                   | MIPS16_INSN_COND_BRANCH)) != 0;
2923   else
2924     return (ip->insn_mo->pinfo2 & (INSN2_UNCOND_BRANCH
2925                                    | INSN2_COND_BRANCH)) != 0;
2926 }
2927
2928 /* Return true if IP is an unconditional branch or jump.  */
2929
2930 static inline bfd_boolean
2931 uncond_branch_p (const struct mips_cl_insn *ip)
2932 {
2933   return ((ip->insn_mo->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0
2934           || (mips_opts.mips16
2935               ? (ip->insn_mo->pinfo & MIPS16_INSN_UNCOND_BRANCH) != 0
2936               : (ip->insn_mo->pinfo2 & INSN2_UNCOND_BRANCH) != 0));
2937 }
2938
2939 /* Return true if IP is a branch-likely instruction.  */
2940
2941 static inline bfd_boolean
2942 branch_likely_p (const struct mips_cl_insn *ip)
2943 {
2944   return (ip->insn_mo->pinfo & INSN_COND_BRANCH_LIKELY) != 0;
2945 }
2946
2947 /* Return the type of nop that should be used to fill the delay slot
2948    of delayed branch IP.  */
2949
2950 static struct mips_cl_insn *
2951 get_delay_slot_nop (const struct mips_cl_insn *ip)
2952 {
2953   if (mips_opts.micromips
2954       && (ip->insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
2955     return &micromips_nop32_insn;
2956   return NOP_INSN;
2957 }
2958
2959 /* Return the mask of core registers that IP reads or writes.  */
2960
2961 static unsigned int
2962 gpr_mod_mask (const struct mips_cl_insn *ip)
2963 {
2964   unsigned long pinfo2;
2965   unsigned int mask;
2966
2967   mask = 0;
2968   pinfo2 = ip->insn_mo->pinfo2;
2969   if (mips_opts.micromips)
2970     {
2971       if (pinfo2 & INSN2_MOD_GPR_MD)
2972         mask |= 1 << micromips_to_32_reg_d_map[EXTRACT_OPERAND (1, MD, *ip)];
2973       if (pinfo2 & INSN2_MOD_GPR_MF)
2974         mask |= 1 << micromips_to_32_reg_f_map[EXTRACT_OPERAND (1, MF, *ip)];
2975       if (pinfo2 & INSN2_MOD_SP)
2976         mask |= 1 << SP;
2977     }
2978   return mask;
2979 }
2980
2981 /* Return the mask of core registers that IP reads.  */
2982
2983 static unsigned int
2984 gpr_read_mask (const struct mips_cl_insn *ip)
2985 {
2986   unsigned long pinfo, pinfo2;
2987   unsigned int mask;
2988
2989   mask = gpr_mod_mask (ip);
2990   pinfo = ip->insn_mo->pinfo;
2991   pinfo2 = ip->insn_mo->pinfo2;
2992   if (mips_opts.mips16)
2993     {
2994       if (pinfo & MIPS16_INSN_READ_X)
2995         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
2996       if (pinfo & MIPS16_INSN_READ_Y)
2997         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
2998       if (pinfo & MIPS16_INSN_READ_T)
2999         mask |= 1 << TREG;
3000       if (pinfo & MIPS16_INSN_READ_SP)
3001         mask |= 1 << SP;
3002       if (pinfo & MIPS16_INSN_READ_31)
3003         mask |= 1 << RA;
3004       if (pinfo & MIPS16_INSN_READ_Z)
3005         mask |= 1 << (mips16_to_32_reg_map
3006                       [MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]);
3007       if (pinfo & MIPS16_INSN_READ_GPR_X)
3008         mask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3009     }
3010   else
3011     {
3012       if (pinfo2 & INSN2_READ_GPR_D)
3013         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
3014       if (pinfo & INSN_READ_GPR_T)
3015         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
3016       if (pinfo & INSN_READ_GPR_S)
3017         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
3018       if (pinfo2 & INSN2_READ_GP)
3019         mask |= 1 << GP;
3020       if (pinfo2 & INSN2_READ_GPR_31)
3021         mask |= 1 << RA;
3022       if (pinfo2 & INSN2_READ_GPR_Z)
3023         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3024     }
3025   if (mips_opts.micromips)
3026     {
3027       if (pinfo2 & INSN2_READ_GPR_MC)
3028         mask |= 1 << micromips_to_32_reg_c_map[EXTRACT_OPERAND (1, MC, *ip)];
3029       if (pinfo2 & INSN2_READ_GPR_ME)
3030         mask |= 1 << micromips_to_32_reg_e_map[EXTRACT_OPERAND (1, ME, *ip)];
3031       if (pinfo2 & INSN2_READ_GPR_MG)
3032         mask |= 1 << micromips_to_32_reg_g_map[EXTRACT_OPERAND (1, MG, *ip)];
3033       if (pinfo2 & INSN2_READ_GPR_MJ)
3034         mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3035       if (pinfo2 & INSN2_READ_GPR_MMN)
3036         {
3037           mask |= 1 << micromips_to_32_reg_m_map[EXTRACT_OPERAND (1, MM, *ip)];
3038           mask |= 1 << micromips_to_32_reg_n_map[EXTRACT_OPERAND (1, MN, *ip)];
3039         }
3040       if (pinfo2 & INSN2_READ_GPR_MP)
3041         mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3042       if (pinfo2 & INSN2_READ_GPR_MQ)
3043         mask |= 1 << micromips_to_32_reg_q_map[EXTRACT_OPERAND (1, MQ, *ip)];
3044     }
3045   /* Don't include register 0.  */
3046   return mask & ~1;
3047 }
3048
3049 /* Return the mask of core registers that IP writes.  */
3050
3051 static unsigned int
3052 gpr_write_mask (const struct mips_cl_insn *ip)
3053 {
3054   unsigned long pinfo, pinfo2;
3055   unsigned int mask;
3056
3057   mask = gpr_mod_mask (ip);
3058   pinfo = ip->insn_mo->pinfo;
3059   pinfo2 = ip->insn_mo->pinfo2;
3060   if (mips_opts.mips16)
3061     {
3062       if (pinfo & MIPS16_INSN_WRITE_X)
3063         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
3064       if (pinfo & MIPS16_INSN_WRITE_Y)
3065         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
3066       if (pinfo & MIPS16_INSN_WRITE_Z)
3067         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RZ, *ip)];
3068       if (pinfo & MIPS16_INSN_WRITE_T)
3069         mask |= 1 << TREG;
3070       if (pinfo & MIPS16_INSN_WRITE_SP)
3071         mask |= 1 << SP;
3072       if (pinfo & MIPS16_INSN_WRITE_31)
3073         mask |= 1 << RA;
3074       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3075         mask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3076     }
3077   else
3078     {
3079       if (pinfo & INSN_WRITE_GPR_D)
3080         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
3081       if (pinfo & INSN_WRITE_GPR_T)
3082         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
3083       if (pinfo & INSN_WRITE_GPR_S)
3084         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
3085       if (pinfo & INSN_WRITE_GPR_31)
3086         mask |= 1 << RA;
3087       if (pinfo2 & INSN2_WRITE_GPR_Z)
3088         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3089     }
3090   if (mips_opts.micromips)
3091     {
3092       if (pinfo2 & INSN2_WRITE_GPR_MB)
3093         mask |= 1 << micromips_to_32_reg_b_map[EXTRACT_OPERAND (1, MB, *ip)];
3094       if (pinfo2 & INSN2_WRITE_GPR_MHI)
3095         {
3096           mask |= 1 << micromips_to_32_reg_h_map[EXTRACT_OPERAND (1, MH, *ip)];
3097           mask |= 1 << micromips_to_32_reg_i_map[EXTRACT_OPERAND (1, MI, *ip)];
3098         }
3099       if (pinfo2 & INSN2_WRITE_GPR_MJ)
3100         mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3101       if (pinfo2 & INSN2_WRITE_GPR_MP)
3102         mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3103     }
3104   /* Don't include register 0.  */
3105   return mask & ~1;
3106 }
3107
3108 /* Return the mask of floating-point registers that IP reads.  */
3109
3110 static unsigned int
3111 fpr_read_mask (const struct mips_cl_insn *ip)
3112 {
3113   unsigned long pinfo, pinfo2;
3114   unsigned int mask;
3115
3116   mask = 0;
3117   pinfo = ip->insn_mo->pinfo;
3118   pinfo2 = ip->insn_mo->pinfo2;
3119   if (!mips_opts.mips16)
3120     {
3121       if (pinfo2 & INSN2_READ_FPR_D)
3122         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3123       if (pinfo & INSN_READ_FPR_S)
3124         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3125       if (pinfo & INSN_READ_FPR_T)
3126         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3127       if (pinfo & INSN_READ_FPR_R)
3128         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FR, *ip);
3129       if (pinfo2 & INSN2_READ_FPR_Z)
3130         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3131     }
3132   /* Conservatively treat all operands to an FP_D instruction are doubles.
3133      (This is overly pessimistic for things like cvt.d.s.)  */
3134   if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3135     mask |= mask << 1;
3136   return mask;
3137 }
3138
3139 /* Return the mask of floating-point registers that IP writes.  */
3140
3141 static unsigned int
3142 fpr_write_mask (const struct mips_cl_insn *ip)
3143 {
3144   unsigned long pinfo, pinfo2;
3145   unsigned int mask;
3146
3147   mask = 0;
3148   pinfo = ip->insn_mo->pinfo;
3149   pinfo2 = ip->insn_mo->pinfo2;
3150   if (!mips_opts.mips16)
3151     {
3152       if (pinfo & INSN_WRITE_FPR_D)
3153         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3154       if (pinfo & INSN_WRITE_FPR_S)
3155         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3156       if (pinfo & INSN_WRITE_FPR_T)
3157         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3158       if (pinfo2 & INSN2_WRITE_FPR_Z)
3159         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3160     }
3161   /* Conservatively treat all operands to an FP_D instruction are doubles.
3162      (This is overly pessimistic for things like cvt.s.d.)  */
3163   if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3164     mask |= mask << 1;
3165   return mask;
3166 }
3167
3168 /* Classify an instruction according to the FIX_VR4120_* enumeration.
3169    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
3170    by VR4120 errata.  */
3171
3172 static unsigned int
3173 classify_vr4120_insn (const char *name)
3174 {
3175   if (strncmp (name, "macc", 4) == 0)
3176     return FIX_VR4120_MACC;
3177   if (strncmp (name, "dmacc", 5) == 0)
3178     return FIX_VR4120_DMACC;
3179   if (strncmp (name, "mult", 4) == 0)
3180     return FIX_VR4120_MULT;
3181   if (strncmp (name, "dmult", 5) == 0)
3182     return FIX_VR4120_DMULT;
3183   if (strstr (name, "div"))
3184     return FIX_VR4120_DIV;
3185   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
3186     return FIX_VR4120_MTHILO;
3187   return NUM_FIX_VR4120_CLASSES;
3188 }
3189
3190 #define INSN_ERET  0x42000018
3191 #define INSN_DERET 0x4200001f
3192
3193 /* Return the number of instructions that must separate INSN1 and INSN2,
3194    where INSN1 is the earlier instruction.  Return the worst-case value
3195    for any INSN2 if INSN2 is null.  */
3196
3197 static unsigned int
3198 insns_between (const struct mips_cl_insn *insn1,
3199                const struct mips_cl_insn *insn2)
3200 {
3201   unsigned long pinfo1, pinfo2;
3202   unsigned int mask;
3203
3204   /* This function needs to know which pinfo flags are set for INSN2
3205      and which registers INSN2 uses.  The former is stored in PINFO2 and
3206      the latter is tested via INSN2_USES_GPR.  If INSN2 is null, PINFO2
3207      will have every flag set and INSN2_USES_GPR will always return true.  */
3208   pinfo1 = insn1->insn_mo->pinfo;
3209   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
3210
3211 #define INSN2_USES_GPR(REG) \
3212   (insn2 == NULL || (gpr_read_mask (insn2) & (1U << (REG))) != 0)
3213
3214   /* For most targets, write-after-read dependencies on the HI and LO
3215      registers must be separated by at least two instructions.  */
3216   if (!hilo_interlocks)
3217     {
3218       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
3219         return 2;
3220       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
3221         return 2;
3222     }
3223
3224   /* If we're working around r7000 errata, there must be two instructions
3225      between an mfhi or mflo and any instruction that uses the result.  */
3226   if (mips_7000_hilo_fix
3227       && !mips_opts.micromips
3228       && MF_HILO_INSN (pinfo1)
3229       && INSN2_USES_GPR (EXTRACT_OPERAND (0, RD, *insn1)))
3230     return 2;
3231
3232   /* If we're working around 24K errata, one instruction is required
3233      if an ERET or DERET is followed by a branch instruction.  */
3234   if (mips_fix_24k && !mips_opts.micromips)
3235     {
3236       if (insn1->insn_opcode == INSN_ERET
3237           || insn1->insn_opcode == INSN_DERET)
3238         {
3239           if (insn2 == NULL
3240               || insn2->insn_opcode == INSN_ERET
3241               || insn2->insn_opcode == INSN_DERET
3242               || delayed_branch_p (insn2))
3243             return 1;
3244         }
3245     }
3246
3247   /* If working around VR4120 errata, check for combinations that need
3248      a single intervening instruction.  */
3249   if (mips_fix_vr4120 && !mips_opts.micromips)
3250     {
3251       unsigned int class1, class2;
3252
3253       class1 = classify_vr4120_insn (insn1->insn_mo->name);
3254       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
3255         {
3256           if (insn2 == NULL)
3257             return 1;
3258           class2 = classify_vr4120_insn (insn2->insn_mo->name);
3259           if (vr4120_conflicts[class1] & (1 << class2))
3260             return 1;
3261         }
3262     }
3263
3264   if (!HAVE_CODE_COMPRESSION)
3265     {
3266       /* Check for GPR or coprocessor load delays.  All such delays
3267          are on the RT register.  */
3268       /* Itbl support may require additional care here.  */
3269       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
3270           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
3271         {
3272           know (pinfo1 & INSN_WRITE_GPR_T);
3273           if (INSN2_USES_GPR (EXTRACT_OPERAND (0, RT, *insn1)))
3274             return 1;
3275         }
3276
3277       /* Check for generic coprocessor hazards.
3278
3279          This case is not handled very well.  There is no special
3280          knowledge of CP0 handling, and the coprocessors other than
3281          the floating point unit are not distinguished at all.  */
3282       /* Itbl support may require additional care here. FIXME!
3283          Need to modify this to include knowledge about
3284          user specified delays!  */
3285       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
3286                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
3287         {
3288           /* Handle cases where INSN1 writes to a known general coprocessor
3289              register.  There must be a one instruction delay before INSN2
3290              if INSN2 reads that register, otherwise no delay is needed.  */
3291           mask = fpr_write_mask (insn1);
3292           if (mask != 0)
3293             {
3294               if (!insn2 || (mask & fpr_read_mask (insn2)) != 0)
3295                 return 1;
3296             }
3297           else
3298             {
3299               /* Read-after-write dependencies on the control registers
3300                  require a two-instruction gap.  */
3301               if ((pinfo1 & INSN_WRITE_COND_CODE)
3302                   && (pinfo2 & INSN_READ_COND_CODE))
3303                 return 2;
3304
3305               /* We don't know exactly what INSN1 does.  If INSN2 is
3306                  also a coprocessor instruction, assume there must be
3307                  a one instruction gap.  */
3308               if (pinfo2 & INSN_COP)
3309                 return 1;
3310             }
3311         }
3312
3313       /* Check for read-after-write dependencies on the coprocessor
3314          control registers in cases where INSN1 does not need a general
3315          coprocessor delay.  This means that INSN1 is a floating point
3316          comparison instruction.  */
3317       /* Itbl support may require additional care here.  */
3318       else if (!cop_interlocks
3319                && (pinfo1 & INSN_WRITE_COND_CODE)
3320                && (pinfo2 & INSN_READ_COND_CODE))
3321         return 1;
3322     }
3323
3324 #undef INSN2_USES_GPR
3325
3326   return 0;
3327 }
3328
3329 /* Return the number of nops that would be needed to work around the
3330    VR4130 mflo/mfhi errata if instruction INSN immediately followed
3331    the MAX_VR4130_NOPS instructions described by HIST.  Ignore hazards
3332    that are contained within the first IGNORE instructions of HIST.  */
3333
3334 static int
3335 nops_for_vr4130 (int ignore, const struct mips_cl_insn *hist,
3336                  const struct mips_cl_insn *insn)
3337 {
3338   int i, j;
3339   unsigned int mask;
3340
3341   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
3342      are not affected by the errata.  */
3343   if (insn != 0
3344       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
3345           || strcmp (insn->insn_mo->name, "mtlo") == 0
3346           || strcmp (insn->insn_mo->name, "mthi") == 0))
3347     return 0;
3348
3349   /* Search for the first MFLO or MFHI.  */
3350   for (i = 0; i < MAX_VR4130_NOPS; i++)
3351     if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
3352       {
3353         /* Extract the destination register.  */
3354         mask = gpr_write_mask (&hist[i]);
3355
3356         /* No nops are needed if INSN reads that register.  */
3357         if (insn != NULL && (gpr_read_mask (insn) & mask) != 0)
3358           return 0;
3359
3360         /* ...or if any of the intervening instructions do.  */
3361         for (j = 0; j < i; j++)
3362           if (gpr_read_mask (&hist[j]) & mask)
3363             return 0;
3364
3365         if (i >= ignore)
3366           return MAX_VR4130_NOPS - i;
3367       }
3368   return 0;
3369 }
3370
3371 #define BASE_REG_EQ(INSN1, INSN2)       \
3372   ((((INSN1) >> OP_SH_RS) & OP_MASK_RS) \
3373       == (((INSN2) >> OP_SH_RS) & OP_MASK_RS))
3374
3375 /* Return the minimum alignment for this store instruction.  */
3376
3377 static int
3378 fix_24k_align_to (const struct mips_opcode *mo)
3379 {
3380   if (strcmp (mo->name, "sh") == 0)
3381     return 2;
3382
3383   if (strcmp (mo->name, "swc1") == 0
3384       || strcmp (mo->name, "swc2") == 0
3385       || strcmp (mo->name, "sw") == 0
3386       || strcmp (mo->name, "sc") == 0
3387       || strcmp (mo->name, "s.s") == 0)
3388     return 4;
3389
3390   if (strcmp (mo->name, "sdc1") == 0
3391       || strcmp (mo->name, "sdc2") == 0
3392       || strcmp (mo->name, "s.d") == 0)
3393     return 8;
3394
3395   /* sb, swl, swr */
3396   return 1;
3397 }
3398
3399 struct fix_24k_store_info
3400   {
3401     /* Immediate offset, if any, for this store instruction.  */
3402     short off;
3403     /* Alignment required by this store instruction.  */
3404     int align_to;
3405     /* True for register offsets.  */
3406     int register_offset;
3407   };
3408
3409 /* Comparison function used by qsort.  */
3410
3411 static int
3412 fix_24k_sort (const void *a, const void *b)
3413 {
3414   const struct fix_24k_store_info *pos1 = a;
3415   const struct fix_24k_store_info *pos2 = b;
3416
3417   return (pos1->off - pos2->off);
3418 }
3419
3420 /* INSN is a store instruction.  Try to record the store information
3421    in STINFO.  Return false if the information isn't known.  */
3422
3423 static bfd_boolean
3424 fix_24k_record_store_info (struct fix_24k_store_info *stinfo,
3425                            const struct mips_cl_insn *insn)
3426 {
3427   /* The instruction must have a known offset.  */
3428   if (!insn->complete_p || !strstr (insn->insn_mo->args, "o("))
3429     return FALSE;
3430
3431   stinfo->off = (insn->insn_opcode >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE;
3432   stinfo->align_to = fix_24k_align_to (insn->insn_mo);
3433   return TRUE;
3434 }
3435
3436 /* Return the number of nops that would be needed to work around the 24k
3437    "lost data on stores during refill" errata if instruction INSN
3438    immediately followed the 2 instructions described by HIST.
3439    Ignore hazards that are contained within the first IGNORE
3440    instructions of HIST.
3441
3442    Problem: The FSB (fetch store buffer) acts as an intermediate buffer
3443    for the data cache refills and store data. The following describes
3444    the scenario where the store data could be lost.
3445
3446    * A data cache miss, due to either a load or a store, causing fill
3447      data to be supplied by the memory subsystem
3448    * The first three doublewords of fill data are returned and written
3449      into the cache
3450    * A sequence of four stores occurs in consecutive cycles around the
3451      final doubleword of the fill:
3452    * Store A
3453    * Store B
3454    * Store C
3455    * Zero, One or more instructions
3456    * Store D
3457
3458    The four stores A-D must be to different doublewords of the line that
3459    is being filled. The fourth instruction in the sequence above permits
3460    the fill of the final doubleword to be transferred from the FSB into
3461    the cache. In the sequence above, the stores may be either integer
3462    (sb, sh, sw, swr, swl, sc) or coprocessor (swc1/swc2, sdc1/sdc2,
3463    swxc1, sdxc1, suxc1) stores, as long as the four stores are to
3464    different doublewords on the line. If the floating point unit is
3465    running in 1:2 mode, it is not possible to create the sequence above
3466    using only floating point store instructions.
3467
3468    In this case, the cache line being filled is incorrectly marked
3469    invalid, thereby losing the data from any store to the line that
3470    occurs between the original miss and the completion of the five
3471    cycle sequence shown above.
3472
3473    The workarounds are:
3474
3475    * Run the data cache in write-through mode.
3476    * Insert a non-store instruction between
3477      Store A and Store B or Store B and Store C.  */
3478   
3479 static int
3480 nops_for_24k (int ignore, const struct mips_cl_insn *hist,
3481               const struct mips_cl_insn *insn)
3482 {
3483   struct fix_24k_store_info pos[3];
3484   int align, i, base_offset;
3485
3486   if (ignore >= 2)
3487     return 0;
3488
3489   /* If the previous instruction wasn't a store, there's nothing to
3490      worry about.  */
3491   if ((hist[0].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3492     return 0;
3493
3494   /* If the instructions after the previous one are unknown, we have
3495      to assume the worst.  */
3496   if (!insn)
3497     return 1;
3498
3499   /* Check whether we are dealing with three consecutive stores.  */
3500   if ((insn->insn_mo->pinfo & INSN_STORE_MEMORY) == 0
3501       || (hist[1].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3502     return 0;
3503
3504   /* If we don't know the relationship between the store addresses,
3505      assume the worst.  */
3506   if (!BASE_REG_EQ (insn->insn_opcode, hist[0].insn_opcode)
3507       || !BASE_REG_EQ (insn->insn_opcode, hist[1].insn_opcode))
3508     return 1;
3509
3510   if (!fix_24k_record_store_info (&pos[0], insn)
3511       || !fix_24k_record_store_info (&pos[1], &hist[0])
3512       || !fix_24k_record_store_info (&pos[2], &hist[1]))
3513     return 1;
3514
3515   qsort (&pos, 3, sizeof (struct fix_24k_store_info), fix_24k_sort);
3516
3517   /* Pick a value of ALIGN and X such that all offsets are adjusted by
3518      X bytes and such that the base register + X is known to be aligned
3519      to align bytes.  */
3520
3521   if (((insn->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == SP)
3522     align = 8;
3523   else
3524     {
3525       align = pos[0].align_to;
3526       base_offset = pos[0].off;
3527       for (i = 1; i < 3; i++)
3528         if (align < pos[i].align_to)
3529           {
3530             align = pos[i].align_to;
3531             base_offset = pos[i].off;
3532           }
3533       for (i = 0; i < 3; i++)
3534         pos[i].off -= base_offset;
3535     }
3536
3537   pos[0].off &= ~align + 1;
3538   pos[1].off &= ~align + 1;
3539   pos[2].off &= ~align + 1;
3540
3541   /* If any two stores write to the same chunk, they also write to the
3542      same doubleword.  The offsets are still sorted at this point.  */
3543   if (pos[0].off == pos[1].off || pos[1].off == pos[2].off)
3544     return 0;
3545
3546   /* A range of at least 9 bytes is needed for the stores to be in
3547      non-overlapping doublewords.  */
3548   if (pos[2].off - pos[0].off <= 8)
3549     return 0;
3550
3551   if (pos[2].off - pos[1].off >= 24
3552       || pos[1].off - pos[0].off >= 24
3553       || pos[2].off - pos[0].off >= 32)
3554     return 0;
3555
3556   return 1;
3557 }
3558
3559 /* Return the number of nops that would be needed if instruction INSN
3560    immediately followed the MAX_NOPS instructions given by HIST,
3561    where HIST[0] is the most recent instruction.  Ignore hazards
3562    between INSN and the first IGNORE instructions in HIST.
3563
3564    If INSN is null, return the worse-case number of nops for any
3565    instruction.  */
3566
3567 static int
3568 nops_for_insn (int ignore, const struct mips_cl_insn *hist,
3569                const struct mips_cl_insn *insn)
3570 {
3571   int i, nops, tmp_nops;
3572
3573   nops = 0;
3574   for (i = ignore; i < MAX_DELAY_NOPS; i++)
3575     {
3576       tmp_nops = insns_between (hist + i, insn) - i;
3577       if (tmp_nops > nops)
3578         nops = tmp_nops;
3579     }
3580
3581   if (mips_fix_vr4130 && !mips_opts.micromips)
3582     {
3583       tmp_nops = nops_for_vr4130 (ignore, hist, insn);
3584       if (tmp_nops > nops)
3585         nops = tmp_nops;
3586     }
3587
3588   if (mips_fix_24k && !mips_opts.micromips)
3589     {
3590       tmp_nops = nops_for_24k (ignore, hist, insn);
3591       if (tmp_nops > nops)
3592         nops = tmp_nops;
3593     }
3594
3595   return nops;
3596 }
3597
3598 /* The variable arguments provide NUM_INSNS extra instructions that
3599    might be added to HIST.  Return the largest number of nops that
3600    would be needed after the extended sequence, ignoring hazards
3601    in the first IGNORE instructions.  */
3602
3603 static int
3604 nops_for_sequence (int num_insns, int ignore,
3605                    const struct mips_cl_insn *hist, ...)
3606 {
3607   va_list args;
3608   struct mips_cl_insn buffer[MAX_NOPS];
3609   struct mips_cl_insn *cursor;
3610   int nops;
3611
3612   va_start (args, hist);
3613   cursor = buffer + num_insns;
3614   memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
3615   while (cursor > buffer)
3616     *--cursor = *va_arg (args, const struct mips_cl_insn *);
3617
3618   nops = nops_for_insn (ignore, buffer, NULL);
3619   va_end (args);
3620   return nops;
3621 }
3622
3623 /* Like nops_for_insn, but if INSN is a branch, take into account the
3624    worst-case delay for the branch target.  */
3625
3626 static int
3627 nops_for_insn_or_target (int ignore, const struct mips_cl_insn *hist,
3628                          const struct mips_cl_insn *insn)
3629 {
3630   int nops, tmp_nops;
3631
3632   nops = nops_for_insn (ignore, hist, insn);
3633   if (delayed_branch_p (insn))
3634     {
3635       tmp_nops = nops_for_sequence (2, ignore ? ignore + 2 : 0,
3636                                     hist, insn, get_delay_slot_nop (insn));
3637       if (tmp_nops > nops)
3638         nops = tmp_nops;
3639     }
3640   else if (compact_branch_p (insn))
3641     {
3642       tmp_nops = nops_for_sequence (1, ignore ? ignore + 1 : 0, hist, insn);
3643       if (tmp_nops > nops)
3644         nops = tmp_nops;
3645     }
3646   return nops;
3647 }
3648
3649 /* Fix NOP issue: Replace nops by "or at,at,zero".  */
3650
3651 static void
3652 fix_loongson2f_nop (struct mips_cl_insn * ip)
3653 {
3654   gas_assert (!HAVE_CODE_COMPRESSION);
3655   if (strcmp (ip->insn_mo->name, "nop") == 0)
3656     ip->insn_opcode = LOONGSON2F_NOP_INSN;
3657 }
3658
3659 /* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
3660                    jr target pc &= 'hffff_ffff_cfff_ffff.  */
3661
3662 static void
3663 fix_loongson2f_jump (struct mips_cl_insn * ip)
3664 {
3665   gas_assert (!HAVE_CODE_COMPRESSION);
3666   if (strcmp (ip->insn_mo->name, "j") == 0
3667       || strcmp (ip->insn_mo->name, "jr") == 0
3668       || strcmp (ip->insn_mo->name, "jalr") == 0)
3669     {
3670       int sreg;
3671       expressionS ep;
3672
3673       if (! mips_opts.at)
3674         return;
3675
3676       sreg = EXTRACT_OPERAND (0, RS, *ip);
3677       if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
3678         return;
3679
3680       ep.X_op = O_constant;
3681       ep.X_add_number = 0xcfff0000;
3682       macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
3683       ep.X_add_number = 0xffff;
3684       macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
3685       macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
3686     }
3687 }
3688
3689 static void
3690 fix_loongson2f (struct mips_cl_insn * ip)
3691 {
3692   if (mips_fix_loongson2f_nop)
3693     fix_loongson2f_nop (ip);
3694
3695   if (mips_fix_loongson2f_jump)
3696     fix_loongson2f_jump (ip);
3697 }
3698
3699 /* IP is a branch that has a delay slot, and we need to fill it
3700    automatically.   Return true if we can do that by swapping IP
3701    with the previous instruction.  */
3702
3703 static bfd_boolean
3704 can_swap_branch_p (struct mips_cl_insn *ip)
3705 {
3706   unsigned long pinfo, pinfo2, prev_pinfo, prev_pinfo2;
3707   unsigned int gpr_read, gpr_write, prev_gpr_read, prev_gpr_write;
3708
3709   /* -O2 and above is required for this optimization.  */
3710   if (mips_optimize < 2)
3711     return FALSE;
3712
3713   /* If we have seen .set volatile or .set nomove, don't optimize.  */
3714   if (mips_opts.nomove)
3715     return FALSE;
3716
3717   /* We can't swap if the previous instruction's position is fixed.  */
3718   if (history[0].fixed_p)
3719     return FALSE;
3720
3721   /* If the previous previous insn was in a .set noreorder, we can't
3722      swap.  Actually, the MIPS assembler will swap in this situation.
3723      However, gcc configured -with-gnu-as will generate code like
3724
3725         .set    noreorder
3726         lw      $4,XXX
3727         .set    reorder
3728         INSN
3729         bne     $4,$0,foo
3730
3731      in which we can not swap the bne and INSN.  If gcc is not configured
3732      -with-gnu-as, it does not output the .set pseudo-ops.  */
3733   if (history[1].noreorder_p)
3734     return FALSE;
3735
3736   /* If the previous instruction had a fixup in mips16 mode, we can not swap.
3737      This means that the previous instruction was a 4-byte one anyhow.  */
3738   if (mips_opts.mips16 && history[0].fixp[0])
3739     return FALSE;
3740
3741   /* If the branch is itself the target of a branch, we can not swap.
3742      We cheat on this; all we check for is whether there is a label on
3743      this instruction.  If there are any branches to anything other than
3744      a label, users must use .set noreorder.  */
3745   if (seg_info (now_seg)->label_list)
3746     return FALSE;
3747
3748   /* If the previous instruction is in a variant frag other than this
3749      branch's one, we cannot do the swap.  This does not apply to
3750      MIPS16 code, which uses variant frags for different purposes.  */
3751   if (!mips_opts.mips16
3752       && history[0].frag
3753       && history[0].frag->fr_type == rs_machine_dependent)
3754     return FALSE;
3755
3756   /* We do not swap with instructions that cannot architecturally
3757      be placed in a branch delay slot, such as SYNC or ERET.  We
3758      also refrain from swapping with a trap instruction, since it
3759      complicates trap handlers to have the trap instruction be in
3760      a delay slot.  */
3761   prev_pinfo = history[0].insn_mo->pinfo;
3762   if (prev_pinfo & INSN_NO_DELAY_SLOT)
3763     return FALSE;
3764
3765   /* Check for conflicts between the branch and the instructions
3766      before the candidate delay slot.  */
3767   if (nops_for_insn (0, history + 1, ip) > 0)
3768     return FALSE;
3769
3770   /* Check for conflicts between the swapped sequence and the
3771      target of the branch.  */
3772   if (nops_for_sequence (2, 0, history + 1, ip, history) > 0)
3773     return FALSE;
3774
3775   /* If the branch reads a register that the previous
3776      instruction sets, we can not swap.  */
3777   gpr_read = gpr_read_mask (ip);
3778   prev_gpr_write = gpr_write_mask (&history[0]);
3779   if (gpr_read & prev_gpr_write)
3780     return FALSE;
3781
3782   /* If the branch writes a register that the previous
3783      instruction sets, we can not swap.  */
3784   gpr_write = gpr_write_mask (ip);
3785   if (gpr_write & prev_gpr_write)
3786     return FALSE;
3787
3788   /* If the branch writes a register that the previous
3789      instruction reads, we can not swap.  */
3790   prev_gpr_read = gpr_read_mask (&history[0]);
3791   if (gpr_write & prev_gpr_read)
3792     return FALSE;
3793
3794   /* If one instruction sets a condition code and the
3795      other one uses a condition code, we can not swap.  */
3796   pinfo = ip->insn_mo->pinfo;
3797   if ((pinfo & INSN_READ_COND_CODE)
3798       && (prev_pinfo & INSN_WRITE_COND_CODE))
3799     return FALSE;
3800   if ((pinfo & INSN_WRITE_COND_CODE)
3801       && (prev_pinfo & INSN_READ_COND_CODE))
3802     return FALSE;
3803
3804   /* If the previous instruction uses the PC, we can not swap.  */
3805   prev_pinfo2 = history[0].insn_mo->pinfo2;
3806   if (mips_opts.mips16 && (prev_pinfo & MIPS16_INSN_READ_PC))
3807     return FALSE;
3808   if (mips_opts.micromips && (prev_pinfo2 & INSN2_READ_PC))
3809     return FALSE;
3810
3811   /* If the previous instruction has an incorrect size for a fixed
3812      branch delay slot in microMIPS mode, we cannot swap.  */
3813   pinfo2 = ip->insn_mo->pinfo2;
3814   if (mips_opts.micromips
3815       && (pinfo2 & INSN2_BRANCH_DELAY_16BIT)
3816       && insn_length (history) != 2)
3817     return FALSE;
3818   if (mips_opts.micromips
3819       && (pinfo2 & INSN2_BRANCH_DELAY_32BIT)
3820       && insn_length (history) != 4)
3821     return FALSE;
3822
3823   return TRUE;
3824 }
3825
3826 /* Decide how we should add IP to the instruction stream.  */
3827
3828 static enum append_method
3829 get_append_method (struct mips_cl_insn *ip)
3830 {
3831   unsigned long pinfo;
3832
3833   /* The relaxed version of a macro sequence must be inherently
3834      hazard-free.  */
3835   if (mips_relax.sequence == 2)
3836     return APPEND_ADD;
3837
3838   /* We must not dabble with instructions in a ".set norerorder" block.  */
3839   if (mips_opts.noreorder)
3840     return APPEND_ADD;
3841
3842   /* Otherwise, it's our responsibility to fill branch delay slots.  */
3843   if (delayed_branch_p (ip))
3844     {
3845       if (!branch_likely_p (ip) && can_swap_branch_p (ip))
3846         return APPEND_SWAP;
3847
3848       pinfo = ip->insn_mo->pinfo;
3849       if (mips_opts.mips16
3850           && ISA_SUPPORTS_MIPS16E
3851           && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31)))
3852         return APPEND_ADD_COMPACT;
3853
3854       return APPEND_ADD_WITH_NOP;
3855     }
3856
3857   return APPEND_ADD;
3858 }
3859
3860 /* IP is a MIPS16 instruction whose opcode we have just changed.
3861    Point IP->insn_mo to the new opcode's definition.  */
3862
3863 static void
3864 find_altered_mips16_opcode (struct mips_cl_insn *ip)
3865 {
3866   const struct mips_opcode *mo, *end;
3867
3868   end = &mips16_opcodes[bfd_mips16_num_opcodes];
3869   for (mo = ip->insn_mo; mo < end; mo++)
3870     if ((ip->insn_opcode & mo->mask) == mo->match)
3871       {
3872         ip->insn_mo = mo;
3873         return;
3874       }
3875   abort ();
3876 }
3877
3878 /* For microMIPS macros, we need to generate a local number label
3879    as the target of branches.  */
3880 #define MICROMIPS_LABEL_CHAR            '\037'
3881 static unsigned long micromips_target_label;
3882 static char micromips_target_name[32];
3883
3884 static char *
3885 micromips_label_name (void)
3886 {
3887   char *p = micromips_target_name;
3888   char symbol_name_temporary[24];
3889   unsigned long l;
3890   int i;
3891
3892   if (*p)
3893     return p;
3894
3895   i = 0;
3896   l = micromips_target_label;
3897 #ifdef LOCAL_LABEL_PREFIX
3898   *p++ = LOCAL_LABEL_PREFIX;
3899 #endif
3900   *p++ = 'L';
3901   *p++ = MICROMIPS_LABEL_CHAR;
3902   do
3903     {
3904       symbol_name_temporary[i++] = l % 10 + '0';
3905       l /= 10;
3906     }
3907   while (l != 0);
3908   while (i > 0)
3909     *p++ = symbol_name_temporary[--i];
3910   *p = '\0';
3911
3912   return micromips_target_name;
3913 }
3914
3915 static void
3916 micromips_label_expr (expressionS *label_expr)
3917 {
3918   label_expr->X_op = O_symbol;
3919   label_expr->X_add_symbol = symbol_find_or_make (micromips_label_name ());
3920   label_expr->X_add_number = 0;
3921 }
3922
3923 static void
3924 micromips_label_inc (void)
3925 {
3926   micromips_target_label++;
3927   *micromips_target_name = '\0';
3928 }
3929
3930 static void
3931 micromips_add_label (void)
3932 {
3933   symbolS *s;
3934
3935   s = colon (micromips_label_name ());
3936   micromips_label_inc ();
3937 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
3938   if (IS_ELF)
3939     S_SET_OTHER (s, ELF_ST_SET_MICROMIPS (S_GET_OTHER (s)));
3940 #else
3941   (void) s;
3942 #endif
3943 }
3944
3945 /* If assembling microMIPS code, then return the microMIPS reloc
3946    corresponding to the requested one if any.  Otherwise return
3947    the reloc unchanged.  */
3948
3949 static bfd_reloc_code_real_type
3950 micromips_map_reloc (bfd_reloc_code_real_type reloc)
3951 {
3952   static const bfd_reloc_code_real_type relocs[][2] =
3953     {
3954       /* Keep sorted incrementally by the left-hand key.  */
3955       { BFD_RELOC_16_PCREL_S2, BFD_RELOC_MICROMIPS_16_PCREL_S1 },
3956       { BFD_RELOC_GPREL16, BFD_RELOC_MICROMIPS_GPREL16 },
3957       { BFD_RELOC_MIPS_JMP, BFD_RELOC_MICROMIPS_JMP },
3958       { BFD_RELOC_HI16, BFD_RELOC_MICROMIPS_HI16 },
3959       { BFD_RELOC_HI16_S, BFD_RELOC_MICROMIPS_HI16_S },
3960       { BFD_RELOC_LO16, BFD_RELOC_MICROMIPS_LO16 },
3961       { BFD_RELOC_MIPS_LITERAL, BFD_RELOC_MICROMIPS_LITERAL },
3962       { BFD_RELOC_MIPS_GOT16, BFD_RELOC_MICROMIPS_GOT16 },
3963       { BFD_RELOC_MIPS_CALL16, BFD_RELOC_MICROMIPS_CALL16 },
3964       { BFD_RELOC_MIPS_GOT_HI16, BFD_RELOC_MICROMIPS_GOT_HI16 },
3965       { BFD_RELOC_MIPS_GOT_LO16, BFD_RELOC_MICROMIPS_GOT_LO16 },
3966       { BFD_RELOC_MIPS_CALL_HI16, BFD_RELOC_MICROMIPS_CALL_HI16 },
3967       { BFD_RELOC_MIPS_CALL_LO16, BFD_RELOC_MICROMIPS_CALL_LO16 },
3968       { BFD_RELOC_MIPS_SUB, BFD_RELOC_MICROMIPS_SUB },
3969       { BFD_RELOC_MIPS_GOT_PAGE, BFD_RELOC_MICROMIPS_GOT_PAGE },
3970       { BFD_RELOC_MIPS_GOT_OFST, BFD_RELOC_MICROMIPS_GOT_OFST },
3971       { BFD_RELOC_MIPS_GOT_DISP, BFD_RELOC_MICROMIPS_GOT_DISP },
3972       { BFD_RELOC_MIPS_HIGHEST, BFD_RELOC_MICROMIPS_HIGHEST },
3973       { BFD_RELOC_MIPS_HIGHER, BFD_RELOC_MICROMIPS_HIGHER },
3974       { BFD_RELOC_MIPS_SCN_DISP, BFD_RELOC_MICROMIPS_SCN_DISP },
3975       { BFD_RELOC_MIPS_TLS_GD, BFD_RELOC_MICROMIPS_TLS_GD },
3976       { BFD_RELOC_MIPS_TLS_LDM, BFD_RELOC_MICROMIPS_TLS_LDM },
3977       { BFD_RELOC_MIPS_TLS_DTPREL_HI16, BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16 },
3978       { BFD_RELOC_MIPS_TLS_DTPREL_LO16, BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16 },
3979       { BFD_RELOC_MIPS_TLS_GOTTPREL, BFD_RELOC_MICROMIPS_TLS_GOTTPREL },
3980       { BFD_RELOC_MIPS_TLS_TPREL_HI16, BFD_RELOC_MICROMIPS_TLS_TPREL_HI16 },
3981       { BFD_RELOC_MIPS_TLS_TPREL_LO16, BFD_RELOC_MICROMIPS_TLS_TPREL_LO16 }
3982     };
3983   bfd_reloc_code_real_type r;
3984   size_t i;
3985
3986   if (!mips_opts.micromips)
3987     return reloc;
3988   for (i = 0; i < ARRAY_SIZE (relocs); i++)
3989     {
3990       r = relocs[i][0];
3991       if (r > reloc)
3992         return reloc;
3993       if (r == reloc)
3994         return relocs[i][1];
3995     }
3996   return reloc;
3997 }
3998
3999 /* Output an instruction.  IP is the instruction information.
4000    ADDRESS_EXPR is an operand of the instruction to be used with
4001    RELOC_TYPE.  EXPANSIONP is true if the instruction is part of
4002    a macro expansion.  */
4003
4004 static void
4005 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
4006              bfd_reloc_code_real_type *reloc_type, bfd_boolean expansionp)
4007 {
4008   unsigned long prev_pinfo2, pinfo;
4009   bfd_boolean relaxed_branch = FALSE;
4010   enum append_method method;
4011   bfd_boolean relax32;
4012   int branch_disp;
4013
4014   if (mips_fix_loongson2f && !HAVE_CODE_COMPRESSION)
4015     fix_loongson2f (ip);
4016
4017   mips_mark_labels ();
4018
4019   file_ase_mips16 |= mips_opts.mips16;
4020   file_ase_micromips |= mips_opts.micromips;
4021
4022   prev_pinfo2 = history[0].insn_mo->pinfo2;
4023   pinfo = ip->insn_mo->pinfo;
4024
4025   if (mips_opts.micromips
4026       && !expansionp
4027       && (((prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
4028            && micromips_insn_length (ip->insn_mo) != 2)
4029           || ((prev_pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
4030               && micromips_insn_length (ip->insn_mo) != 4)))
4031     as_warn (_("Wrong size instruction in a %u-bit branch delay slot"),
4032              (prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0 ? 16 : 32);
4033
4034   if (address_expr == NULL)
4035     ip->complete_p = 1;
4036   else if (*reloc_type <= BFD_RELOC_UNUSED
4037            && address_expr->X_op == O_constant)
4038     {
4039       unsigned int tmp;
4040
4041       ip->complete_p = 1;
4042       switch (*reloc_type)
4043         {
4044         case BFD_RELOC_32:
4045           ip->insn_opcode |= address_expr->X_add_number;
4046           break;
4047
4048         case BFD_RELOC_MIPS_HIGHEST:
4049           tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
4050           ip->insn_opcode |= tmp & 0xffff;
4051           break;
4052
4053         case BFD_RELOC_MIPS_HIGHER:
4054           tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
4055           ip->insn_opcode |= tmp & 0xffff;
4056           break;
4057
4058         case BFD_RELOC_HI16_S:
4059           tmp = (address_expr->X_add_number + 0x8000) >> 16;
4060           ip->insn_opcode |= tmp & 0xffff;
4061           break;
4062
4063         case BFD_RELOC_HI16:
4064           ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
4065           break;
4066
4067         case BFD_RELOC_UNUSED:
4068         case BFD_RELOC_LO16:
4069         case BFD_RELOC_MIPS_GOT_DISP:
4070           ip->insn_opcode |= address_expr->X_add_number & 0xffff;
4071           break;
4072
4073         case BFD_RELOC_MIPS_JMP:
4074           {
4075             int shift;
4076
4077             shift = mips_opts.micromips ? 1 : 2;
4078             if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4079               as_bad (_("jump to misaligned address (0x%lx)"),
4080                       (unsigned long) address_expr->X_add_number);
4081             ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4082                                 & 0x3ffffff);
4083             ip->complete_p = 0;
4084           }
4085           break;
4086
4087         case BFD_RELOC_MIPS16_JMP:
4088           if ((address_expr->X_add_number & 3) != 0)
4089             as_bad (_("jump to misaligned address (0x%lx)"),
4090                     (unsigned long) address_expr->X_add_number);
4091           ip->insn_opcode |=
4092             (((address_expr->X_add_number & 0x7c0000) << 3)
4093                | ((address_expr->X_add_number & 0xf800000) >> 7)
4094                | ((address_expr->X_add_number & 0x3fffc) >> 2));
4095           ip->complete_p = 0;
4096           break;
4097
4098         case BFD_RELOC_16_PCREL_S2:
4099           {
4100             int shift;
4101
4102             shift = mips_opts.micromips ? 1 : 2;
4103             if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4104               as_bad (_("branch to misaligned address (0x%lx)"),
4105                       (unsigned long) address_expr->X_add_number);
4106             if (!mips_relax_branch)
4107               {
4108                 if ((address_expr->X_add_number + (1 << (shift + 15)))
4109                     & ~((1 << (shift + 16)) - 1))
4110                   as_bad (_("branch address range overflow (0x%lx)"),
4111                           (unsigned long) address_expr->X_add_number);
4112                 ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4113                                     & 0xffff);
4114               }
4115             ip->complete_p = 0;
4116           }
4117           break;
4118
4119         default:
4120           internalError ();
4121         }       
4122     }
4123
4124   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
4125     {
4126       /* There are a lot of optimizations we could do that we don't.
4127          In particular, we do not, in general, reorder instructions.
4128          If you use gcc with optimization, it will reorder
4129          instructions and generally do much more optimization then we
4130          do here; repeating all that work in the assembler would only
4131          benefit hand written assembly code, and does not seem worth
4132          it.  */
4133       int nops = (mips_optimize == 0
4134                   ? nops_for_insn (0, history, NULL)
4135                   : nops_for_insn_or_target (0, history, ip));
4136       if (nops > 0)
4137         {
4138           fragS *old_frag;
4139           unsigned long old_frag_offset;
4140           int i;
4141
4142           old_frag = frag_now;
4143           old_frag_offset = frag_now_fix ();
4144
4145           for (i = 0; i < nops; i++)
4146             add_fixed_insn (NOP_INSN);
4147           insert_into_history (0, nops, NOP_INSN);
4148
4149           if (listing)
4150             {
4151               listing_prev_line ();
4152               /* We may be at the start of a variant frag.  In case we
4153                  are, make sure there is enough space for the frag
4154                  after the frags created by listing_prev_line.  The
4155                  argument to frag_grow here must be at least as large
4156                  as the argument to all other calls to frag_grow in
4157                  this file.  We don't have to worry about being in the
4158                  middle of a variant frag, because the variants insert
4159                  all needed nop instructions themselves.  */
4160               frag_grow (40);
4161             }
4162
4163           mips_move_text_labels ();
4164
4165 #ifndef NO_ECOFF_DEBUGGING
4166           if (ECOFF_DEBUGGING)
4167             ecoff_fix_loc (old_frag, old_frag_offset);
4168 #endif
4169         }
4170     }
4171   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
4172     {
4173       int nops;
4174
4175       /* Work out how many nops in prev_nop_frag are needed by IP,
4176          ignoring hazards generated by the first prev_nop_frag_since
4177          instructions.  */
4178       nops = nops_for_insn_or_target (prev_nop_frag_since, history, ip);
4179       gas_assert (nops <= prev_nop_frag_holds);
4180
4181       /* Enforce NOPS as a minimum.  */
4182       if (nops > prev_nop_frag_required)
4183         prev_nop_frag_required = nops;
4184
4185       if (prev_nop_frag_holds == prev_nop_frag_required)
4186         {
4187           /* Settle for the current number of nops.  Update the history
4188              accordingly (for the benefit of any future .set reorder code).  */
4189           prev_nop_frag = NULL;
4190           insert_into_history (prev_nop_frag_since,
4191                                prev_nop_frag_holds, NOP_INSN);
4192         }
4193       else
4194         {
4195           /* Allow this instruction to replace one of the nops that was
4196              tentatively added to prev_nop_frag.  */
4197           prev_nop_frag->fr_fix -= NOP_INSN_SIZE;
4198           prev_nop_frag_holds--;
4199           prev_nop_frag_since++;
4200         }
4201     }
4202
4203   method = get_append_method (ip);
4204   branch_disp = method == APPEND_SWAP ? insn_length (history) : 0;
4205
4206 #ifdef OBJ_ELF
4207   /* The value passed to dwarf2_emit_insn is the distance between
4208      the beginning of the current instruction and the address that
4209      should be recorded in the debug tables.  This is normally the
4210      current address.
4211
4212      For MIPS16/microMIPS debug info we want to use ISA-encoded
4213      addresses, so we use -1 for an address higher by one than the
4214      current one.
4215
4216      If the instruction produced is a branch that we will swap with
4217      the preceding instruction, then we add the displacement by which
4218      the branch will be moved backwards.  This is more appropriate
4219      and for MIPS16/microMIPS code also prevents a debugger from
4220      placing a breakpoint in the middle of the branch (and corrupting
4221      code if software breakpoints are used).  */
4222   dwarf2_emit_insn ((HAVE_CODE_COMPRESSION ? -1 : 0) + branch_disp);
4223 #endif
4224
4225   relax32 = (mips_relax_branch
4226              /* Don't try branch relaxation within .set nomacro, or within
4227                 .set noat if we use $at for PIC computations.  If it turns
4228                 out that the branch was out-of-range, we'll get an error.  */
4229              && !mips_opts.warn_about_macros
4230              && (mips_opts.at || mips_pic == NO_PIC)
4231              /* Don't relax BPOSGE32/64 as they have no complementing
4232                 branches.  */
4233              && !(ip->insn_mo->membership & (INSN_DSP64 | INSN_DSP)));
4234
4235   if (!HAVE_CODE_COMPRESSION
4236       && address_expr
4237       && relax32
4238       && *reloc_type == BFD_RELOC_16_PCREL_S2
4239       && delayed_branch_p (ip))
4240     {
4241       relaxed_branch = TRUE;
4242       add_relaxed_insn (ip, (relaxed_branch_length
4243                              (NULL, NULL,
4244                               uncond_branch_p (ip) ? -1
4245                               : branch_likely_p (ip) ? 1
4246                               : 0)), 4,
4247                         RELAX_BRANCH_ENCODE
4248                         (AT,
4249                          uncond_branch_p (ip),
4250                          branch_likely_p (ip),
4251                          pinfo & INSN_WRITE_GPR_31,
4252                          0),
4253                         address_expr->X_add_symbol,
4254                         address_expr->X_add_number);
4255       *reloc_type = BFD_RELOC_UNUSED;
4256     }
4257   else if (mips_opts.micromips
4258            && address_expr
4259            && ((relax32 && *reloc_type == BFD_RELOC_16_PCREL_S2)
4260                || *reloc_type > BFD_RELOC_UNUSED)
4261            && (delayed_branch_p (ip) || compact_branch_p (ip))
4262            /* Don't try branch relaxation when users specify
4263               16-bit/32-bit instructions.  */
4264            && !forced_insn_length)
4265     {
4266       bfd_boolean relax16 = *reloc_type > BFD_RELOC_UNUSED;
4267       int type = relax16 ? *reloc_type - BFD_RELOC_UNUSED : 0;
4268       int uncond = uncond_branch_p (ip) ? -1 : 0;
4269       int compact = compact_branch_p (ip);
4270       int al = pinfo & INSN_WRITE_GPR_31;
4271       int length32;
4272
4273       gas_assert (address_expr != NULL);
4274       gas_assert (!mips_relax.sequence);
4275
4276       relaxed_branch = TRUE;
4277       length32 = relaxed_micromips_32bit_branch_length (NULL, NULL, uncond);
4278       add_relaxed_insn (ip, relax32 ? length32 : 4, relax16 ? 2 : 4,
4279                         RELAX_MICROMIPS_ENCODE (type, AT, uncond, compact, al,
4280                                                 relax32, 0, 0),
4281                         address_expr->X_add_symbol,
4282                         address_expr->X_add_number);
4283       *reloc_type = BFD_RELOC_UNUSED;
4284     }
4285   else if (mips_opts.mips16 && *reloc_type > BFD_RELOC_UNUSED)
4286     {
4287       /* We need to set up a variant frag.  */
4288       gas_assert (address_expr != NULL);
4289       add_relaxed_insn (ip, 4, 0,
4290                         RELAX_MIPS16_ENCODE
4291                         (*reloc_type - BFD_RELOC_UNUSED,
4292                          forced_insn_length == 2, forced_insn_length == 4,
4293                          delayed_branch_p (&history[0]),
4294                          history[0].mips16_absolute_jump_p),
4295                         make_expr_symbol (address_expr), 0);
4296     }
4297   else if (mips_opts.mips16
4298            && ! ip->use_extend
4299            && *reloc_type != BFD_RELOC_MIPS16_JMP)
4300     {
4301       if (!delayed_branch_p (ip))
4302         /* Make sure there is enough room to swap this instruction with
4303            a following jump instruction.  */
4304         frag_grow (6);
4305       add_fixed_insn (ip);
4306     }
4307   else
4308     {
4309       if (mips_opts.mips16
4310           && mips_opts.noreorder
4311           && delayed_branch_p (&history[0]))
4312         as_warn (_("extended instruction in delay slot"));
4313
4314       if (mips_relax.sequence)
4315         {
4316           /* If we've reached the end of this frag, turn it into a variant
4317              frag and record the information for the instructions we've
4318              written so far.  */
4319           if (frag_room () < 4)
4320             relax_close_frag ();
4321           mips_relax.sizes[mips_relax.sequence - 1] += insn_length (ip);
4322         }
4323
4324       if (mips_relax.sequence != 2)
4325         {
4326           if (mips_macro_warning.first_insn_sizes[0] == 0)
4327             mips_macro_warning.first_insn_sizes[0] = insn_length (ip);
4328           mips_macro_warning.sizes[0] += insn_length (ip);
4329           mips_macro_warning.insns[0]++;
4330         }
4331       if (mips_relax.sequence != 1)
4332         {
4333           if (mips_macro_warning.first_insn_sizes[1] == 0)
4334             mips_macro_warning.first_insn_sizes[1] = insn_length (ip);
4335           mips_macro_warning.sizes[1] += insn_length (ip);
4336           mips_macro_warning.insns[1]++;
4337         }
4338
4339       if (mips_opts.mips16)
4340         {
4341           ip->fixed_p = 1;
4342           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
4343         }
4344       add_fixed_insn (ip);
4345     }
4346
4347   if (!ip->complete_p && *reloc_type < BFD_RELOC_UNUSED)
4348     {
4349       bfd_reloc_code_real_type final_type[3];
4350       reloc_howto_type *howto0;
4351       reloc_howto_type *howto;
4352       int i;
4353
4354       /* Perform any necessary conversion to microMIPS relocations
4355          and find out how many relocations there actually are.  */
4356       for (i = 0; i < 3 && reloc_type[i] != BFD_RELOC_UNUSED; i++)
4357         final_type[i] = micromips_map_reloc (reloc_type[i]);
4358
4359       /* In a compound relocation, it is the final (outermost)
4360          operator that determines the relocated field.  */
4361       howto = howto0 = bfd_reloc_type_lookup (stdoutput, final_type[i - 1]);
4362
4363       if (howto == NULL)
4364         {
4365           /* To reproduce this failure try assembling gas/testsuites/
4366              gas/mips/mips16-intermix.s with a mips-ecoff targeted
4367              assembler.  */
4368           as_bad (_("Unsupported MIPS relocation number %d"),
4369                   final_type[i - 1]);
4370           howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
4371         }
4372
4373       if (i > 1)
4374         howto0 = bfd_reloc_type_lookup (stdoutput, final_type[0]);
4375       ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
4376                                  bfd_get_reloc_size (howto),
4377                                  address_expr,
4378                                  howto0 && howto0->pc_relative,
4379                                  final_type[0]);
4380
4381       /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
4382       if (final_type[0] == BFD_RELOC_MIPS16_JMP && ip->fixp[0]->fx_addsy)
4383         *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
4384
4385       /* These relocations can have an addend that won't fit in
4386          4 octets for 64bit assembly.  */
4387       if (HAVE_64BIT_GPRS
4388           && ! howto->partial_inplace
4389           && (reloc_type[0] == BFD_RELOC_16
4390               || reloc_type[0] == BFD_RELOC_32
4391               || reloc_type[0] == BFD_RELOC_MIPS_JMP
4392               || reloc_type[0] == BFD_RELOC_GPREL16
4393               || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
4394               || reloc_type[0] == BFD_RELOC_GPREL32
4395               || reloc_type[0] == BFD_RELOC_64
4396               || reloc_type[0] == BFD_RELOC_CTOR
4397               || reloc_type[0] == BFD_RELOC_MIPS_SUB
4398               || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
4399               || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
4400               || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
4401               || reloc_type[0] == BFD_RELOC_MIPS_REL16
4402               || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
4403               || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
4404               || hi16_reloc_p (reloc_type[0])
4405               || lo16_reloc_p (reloc_type[0])))
4406         ip->fixp[0]->fx_no_overflow = 1;
4407
4408       if (mips_relax.sequence)
4409         {
4410           if (mips_relax.first_fixup == 0)
4411             mips_relax.first_fixup = ip->fixp[0];
4412         }
4413       else if (reloc_needs_lo_p (*reloc_type))
4414         {
4415           struct mips_hi_fixup *hi_fixup;
4416
4417           /* Reuse the last entry if it already has a matching %lo.  */
4418           hi_fixup = mips_hi_fixup_list;
4419           if (hi_fixup == 0
4420               || !fixup_has_matching_lo_p (hi_fixup->fixp))
4421             {
4422               hi_fixup = ((struct mips_hi_fixup *)
4423                           xmalloc (sizeof (struct mips_hi_fixup)));
4424               hi_fixup->next = mips_hi_fixup_list;
4425               mips_hi_fixup_list = hi_fixup;
4426             }
4427           hi_fixup->fixp = ip->fixp[0];
4428           hi_fixup->seg = now_seg;
4429         }
4430
4431       /* Add fixups for the second and third relocations, if given.
4432          Note that the ABI allows the second relocation to be
4433          against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
4434          moment we only use RSS_UNDEF, but we could add support
4435          for the others if it ever becomes necessary.  */
4436       for (i = 1; i < 3; i++)
4437         if (reloc_type[i] != BFD_RELOC_UNUSED)
4438           {
4439             ip->fixp[i] = fix_new (ip->frag, ip->where,
4440                                    ip->fixp[0]->fx_size, NULL, 0,
4441                                    FALSE, final_type[i]);
4442
4443             /* Use fx_tcbit to mark compound relocs.  */
4444             ip->fixp[0]->fx_tcbit = 1;
4445             ip->fixp[i]->fx_tcbit = 1;
4446           }
4447     }
4448   install_insn (ip);
4449
4450   /* Update the register mask information.  */
4451   mips_gprmask |= gpr_read_mask (ip) | gpr_write_mask (ip);
4452   mips_cprmask[1] |= fpr_read_mask (ip) | fpr_write_mask (ip);
4453
4454   switch (method)
4455     {
4456     case APPEND_ADD:
4457       insert_into_history (0, 1, ip);
4458       break;
4459
4460     case APPEND_ADD_WITH_NOP:
4461       {
4462         struct mips_cl_insn *nop;
4463
4464         insert_into_history (0, 1, ip);
4465         nop = get_delay_slot_nop (ip);
4466         add_fixed_insn (nop);
4467         insert_into_history (0, 1, nop);
4468         if (mips_relax.sequence)
4469           mips_relax.sizes[mips_relax.sequence - 1] += insn_length (nop);
4470       }
4471       break;
4472
4473     case APPEND_ADD_COMPACT:
4474       /* Convert MIPS16 jr/jalr into a "compact" jump.  */
4475       gas_assert (mips_opts.mips16);
4476       ip->insn_opcode |= 0x0080;
4477       find_altered_mips16_opcode (ip);
4478       install_insn (ip);
4479       insert_into_history (0, 1, ip);
4480       break;
4481
4482     case APPEND_SWAP:
4483       {
4484         struct mips_cl_insn delay = history[0];
4485         if (mips_opts.mips16)
4486           {
4487             know (delay.frag == ip->frag);
4488             move_insn (ip, delay.frag, delay.where);
4489             move_insn (&delay, ip->frag, ip->where + insn_length (ip));
4490           }
4491         else if (relaxed_branch)
4492           {
4493             /* Add the delay slot instruction to the end of the
4494                current frag and shrink the fixed part of the
4495                original frag.  If the branch occupies the tail of
4496                the latter, move it backwards to cover the gap.  */
4497             delay.frag->fr_fix -= branch_disp;
4498             if (delay.frag == ip->frag)
4499               move_insn (ip, ip->frag, ip->where - branch_disp);
4500             add_fixed_insn (&delay);
4501           }
4502         else
4503           {
4504             move_insn (&delay, ip->frag,
4505                        ip->where - branch_disp + insn_length (ip));
4506             move_insn (ip, history[0].frag, history[0].where);
4507           }
4508         history[0] = *ip;
4509         delay.fixed_p = 1;
4510         insert_into_history (0, 1, &delay);
4511       }
4512       break;
4513     }
4514
4515   /* If we have just completed an unconditional branch, clear the history.  */
4516   if ((delayed_branch_p (&history[1]) && uncond_branch_p (&history[1]))
4517       || (compact_branch_p (&history[0]) && uncond_branch_p (&history[0])))
4518     mips_no_prev_insn ();
4519
4520   /* We need to emit a label at the end of branch-likely macros.  */
4521   if (emit_branch_likely_macro)
4522     {
4523       emit_branch_likely_macro = FALSE;
4524       micromips_add_label ();
4525     }
4526
4527   /* We just output an insn, so the next one doesn't have a label.  */
4528   mips_clear_insn_labels ();
4529 }
4530
4531 /* Forget that there was any previous instruction or label.  */
4532
4533 static void
4534 mips_no_prev_insn (void)
4535 {
4536   prev_nop_frag = NULL;
4537   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
4538   mips_clear_insn_labels ();
4539 }
4540
4541 /* This function must be called before we emit something other than
4542    instructions.  It is like mips_no_prev_insn except that it inserts
4543    any NOPS that might be needed by previous instructions.  */
4544
4545 void
4546 mips_emit_delays (void)
4547 {
4548   if (! mips_opts.noreorder)
4549     {
4550       int nops = nops_for_insn (0, history, NULL);
4551       if (nops > 0)
4552         {
4553           while (nops-- > 0)
4554             add_fixed_insn (NOP_INSN);
4555           mips_move_text_labels ();
4556         }
4557     }
4558   mips_no_prev_insn ();
4559 }
4560
4561 /* Start a (possibly nested) noreorder block.  */
4562
4563 static void
4564 start_noreorder (void)
4565 {
4566   if (mips_opts.noreorder == 0)
4567     {
4568       unsigned int i;
4569       int nops;
4570
4571       /* None of the instructions before the .set noreorder can be moved.  */
4572       for (i = 0; i < ARRAY_SIZE (history); i++)
4573         history[i].fixed_p = 1;
4574
4575       /* Insert any nops that might be needed between the .set noreorder
4576          block and the previous instructions.  We will later remove any
4577          nops that turn out not to be needed.  */
4578       nops = nops_for_insn (0, history, NULL);
4579       if (nops > 0)
4580         {
4581           if (mips_optimize != 0)
4582             {
4583               /* Record the frag which holds the nop instructions, so
4584                  that we can remove them if we don't need them.  */
4585               frag_grow (nops * NOP_INSN_SIZE);
4586               prev_nop_frag = frag_now;
4587               prev_nop_frag_holds = nops;
4588               prev_nop_frag_required = 0;
4589               prev_nop_frag_since = 0;
4590             }
4591
4592           for (; nops > 0; --nops)
4593             add_fixed_insn (NOP_INSN);
4594
4595           /* Move on to a new frag, so that it is safe to simply
4596              decrease the size of prev_nop_frag.  */
4597           frag_wane (frag_now);
4598           frag_new (0);
4599           mips_move_text_labels ();
4600         }
4601       mips_mark_labels ();
4602       mips_clear_insn_labels ();
4603     }
4604   mips_opts.noreorder++;
4605   mips_any_noreorder = 1;
4606 }
4607
4608 /* End a nested noreorder block.  */
4609
4610 static void
4611 end_noreorder (void)
4612 {
4613   mips_opts.noreorder--;
4614   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
4615     {
4616       /* Commit to inserting prev_nop_frag_required nops and go back to
4617          handling nop insertion the .set reorder way.  */
4618       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
4619                                 * NOP_INSN_SIZE);
4620       insert_into_history (prev_nop_frag_since,
4621                            prev_nop_frag_required, NOP_INSN);
4622       prev_nop_frag = NULL;
4623     }
4624 }
4625
4626 /* Set up global variables for the start of a new macro.  */
4627
4628 static void
4629 macro_start (void)
4630 {
4631   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
4632   memset (&mips_macro_warning.first_insn_sizes, 0,
4633           sizeof (mips_macro_warning.first_insn_sizes));
4634   memset (&mips_macro_warning.insns, 0, sizeof (mips_macro_warning.insns));
4635   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
4636                                      && delayed_branch_p (&history[0]));
4637   switch (history[0].insn_mo->pinfo2
4638           & (INSN2_BRANCH_DELAY_32BIT | INSN2_BRANCH_DELAY_16BIT))
4639     {
4640     case INSN2_BRANCH_DELAY_32BIT:
4641       mips_macro_warning.delay_slot_length = 4;
4642       break;
4643     case INSN2_BRANCH_DELAY_16BIT:
4644       mips_macro_warning.delay_slot_length = 2;
4645       break;
4646     default:
4647       mips_macro_warning.delay_slot_length = 0;
4648       break;
4649     }
4650   mips_macro_warning.first_frag = NULL;
4651 }
4652
4653 /* Given that a macro is longer than one instruction or of the wrong size,
4654    return the appropriate warning for it.  Return null if no warning is
4655    needed.  SUBTYPE is a bitmask of RELAX_DELAY_SLOT, RELAX_DELAY_SLOT_16BIT,
4656    RELAX_DELAY_SLOT_SIZE_FIRST, RELAX_DELAY_SLOT_SIZE_SECOND,
4657    and RELAX_NOMACRO.  */
4658
4659 static const char *
4660 macro_warning (relax_substateT subtype)
4661 {
4662   if (subtype & RELAX_DELAY_SLOT)
4663     return _("Macro instruction expanded into multiple instructions"
4664              " in a branch delay slot");
4665   else if (subtype & RELAX_NOMACRO)
4666     return _("Macro instruction expanded into multiple instructions");
4667   else if (subtype & (RELAX_DELAY_SLOT_SIZE_FIRST
4668                       | RELAX_DELAY_SLOT_SIZE_SECOND))
4669     return ((subtype & RELAX_DELAY_SLOT_16BIT)
4670             ? _("Macro instruction expanded into a wrong size instruction"
4671                 " in a 16-bit branch delay slot")
4672             : _("Macro instruction expanded into a wrong size instruction"
4673                 " in a 32-bit branch delay slot"));
4674   else
4675     return 0;
4676 }
4677
4678 /* Finish up a macro.  Emit warnings as appropriate.  */
4679
4680 static void
4681 macro_end (void)
4682 {
4683   /* Relaxation warning flags.  */
4684   relax_substateT subtype = 0;
4685
4686   /* Check delay slot size requirements.  */
4687   if (mips_macro_warning.delay_slot_length == 2)
4688     subtype |= RELAX_DELAY_SLOT_16BIT;
4689   if (mips_macro_warning.delay_slot_length != 0)
4690     {
4691       if (mips_macro_warning.delay_slot_length
4692           != mips_macro_warning.first_insn_sizes[0])
4693         subtype |= RELAX_DELAY_SLOT_SIZE_FIRST;
4694       if (mips_macro_warning.delay_slot_length
4695           != mips_macro_warning.first_insn_sizes[1])
4696         subtype |= RELAX_DELAY_SLOT_SIZE_SECOND;
4697     }
4698
4699   /* Check instruction count requirements.  */
4700   if (mips_macro_warning.insns[0] > 1 || mips_macro_warning.insns[1] > 1)
4701     {
4702       if (mips_macro_warning.insns[1] > mips_macro_warning.insns[0])
4703         subtype |= RELAX_SECOND_LONGER;
4704       if (mips_opts.warn_about_macros)
4705         subtype |= RELAX_NOMACRO;
4706       if (mips_macro_warning.delay_slot_p)
4707         subtype |= RELAX_DELAY_SLOT;
4708     }
4709
4710   /* If both alternatives fail to fill a delay slot correctly,
4711      emit the warning now.  */
4712   if ((subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0
4713       && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0)
4714     {
4715       relax_substateT s;
4716       const char *msg;
4717
4718       s = subtype & (RELAX_DELAY_SLOT_16BIT
4719                      | RELAX_DELAY_SLOT_SIZE_FIRST
4720                      | RELAX_DELAY_SLOT_SIZE_SECOND);
4721       msg = macro_warning (s);
4722       if (msg != NULL)
4723         as_warn ("%s", msg);
4724       subtype &= ~s;
4725     }
4726
4727   /* If both implementations are longer than 1 instruction, then emit the
4728      warning now.  */
4729   if (mips_macro_warning.insns[0] > 1 && mips_macro_warning.insns[1] > 1)
4730     {
4731       relax_substateT s;
4732       const char *msg;
4733
4734       s = subtype & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT);
4735       msg = macro_warning (s);
4736       if (msg != NULL)
4737         as_warn ("%s", msg);
4738       subtype &= ~s;
4739     }
4740
4741   /* If any flags still set, then one implementation might need a warning
4742      and the other either will need one of a different kind or none at all.
4743      Pass any remaining flags over to relaxation.  */
4744   if (mips_macro_warning.first_frag != NULL)
4745     mips_macro_warning.first_frag->fr_subtype |= subtype;
4746 }
4747
4748 /* Instruction operand formats used in macros that vary between
4749    standard MIPS and microMIPS code.  */
4750
4751 static const char * const brk_fmt[2] = { "c", "mF" };
4752 static const char * const cop12_fmt[2] = { "E,o(b)", "E,~(b)" };
4753 static const char * const jalr_fmt[2] = { "d,s", "t,s" };
4754 static const char * const lui_fmt[2] = { "t,u", "s,u" };
4755 static const char * const mem12_fmt[2] = { "t,o(b)", "t,~(b)" };
4756 static const char * const mfhl_fmt[2] = { "d", "mj" };
4757 static const char * const shft_fmt[2] = { "d,w,<", "t,r,<" };
4758 static const char * const trap_fmt[2] = { "s,t,q", "s,t,|" };
4759
4760 #define BRK_FMT (brk_fmt[mips_opts.micromips])
4761 #define COP12_FMT (cop12_fmt[mips_opts.micromips])
4762 #define JALR_FMT (jalr_fmt[mips_opts.micromips])
4763 #define LUI_FMT (lui_fmt[mips_opts.micromips])
4764 #define MEM12_FMT (mem12_fmt[mips_opts.micromips])
4765 #define MFHL_FMT (mfhl_fmt[mips_opts.micromips])
4766 #define SHFT_FMT (shft_fmt[mips_opts.micromips])
4767 #define TRAP_FMT (trap_fmt[mips_opts.micromips])
4768
4769 /* Read a macro's relocation codes from *ARGS and store them in *R.
4770    The first argument in *ARGS will be either the code for a single
4771    relocation or -1 followed by the three codes that make up a
4772    composite relocation.  */
4773
4774 static void
4775 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
4776 {
4777   int i, next;
4778
4779   next = va_arg (*args, int);
4780   if (next >= 0)
4781     r[0] = (bfd_reloc_code_real_type) next;
4782   else
4783     for (i = 0; i < 3; i++)
4784       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
4785 }
4786
4787 /* Build an instruction created by a macro expansion.  This is passed
4788    a pointer to the count of instructions created so far, an
4789    expression, the name of the instruction to build, an operand format
4790    string, and corresponding arguments.  */
4791
4792 static void
4793 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
4794 {
4795   const struct mips_opcode *mo = NULL;
4796   bfd_reloc_code_real_type r[3];
4797   const struct mips_opcode *amo;
4798   struct hash_control *hash;
4799   struct mips_cl_insn insn;
4800   va_list args;
4801
4802   va_start (args, fmt);
4803
4804   if (mips_opts.mips16)
4805     {
4806       mips16_macro_build (ep, name, fmt, &args);
4807       va_end (args);
4808       return;
4809     }
4810
4811   r[0] = BFD_RELOC_UNUSED;
4812   r[1] = BFD_RELOC_UNUSED;
4813   r[2] = BFD_RELOC_UNUSED;
4814   hash = mips_opts.micromips ? micromips_op_hash : op_hash;
4815   amo = (struct mips_opcode *) hash_find (hash, name);
4816   gas_assert (amo);
4817   gas_assert (strcmp (name, amo->name) == 0);
4818
4819   do
4820     {
4821       /* Search until we get a match for NAME.  It is assumed here that
4822          macros will never generate MDMX, MIPS-3D, or MT instructions.
4823          We try to match an instruction that fulfils the branch delay
4824          slot instruction length requirement (if any) of the previous
4825          instruction.  While doing this we record the first instruction
4826          seen that matches all the other conditions and use it anyway
4827          if the requirement cannot be met; we will issue an appropriate
4828          warning later on.  */
4829       if (strcmp (fmt, amo->args) == 0
4830           && amo->pinfo != INSN_MACRO
4831           && is_opcode_valid (amo)
4832           && is_size_valid (amo))
4833         {
4834           if (is_delay_slot_valid (amo))
4835             {
4836               mo = amo;
4837               break;
4838             }
4839           else if (!mo)
4840             mo = amo;
4841         }
4842
4843       ++amo;
4844       gas_assert (amo->name);
4845     }
4846   while (strcmp (name, amo->name) == 0);
4847
4848   gas_assert (mo);
4849   create_insn (&insn, mo);
4850   for (;;)
4851     {
4852       switch (*fmt++)
4853         {
4854         case '\0':
4855           break;
4856
4857         case ',':
4858         case '(':
4859         case ')':
4860           continue;
4861
4862         case '+':
4863           switch (*fmt++)
4864             {
4865             case 'A':
4866             case 'E':
4867               INSERT_OPERAND (mips_opts.micromips,
4868                               EXTLSB, insn, va_arg (args, int));
4869               continue;
4870
4871             case 'B':
4872             case 'F':
4873               /* Note that in the macro case, these arguments are already
4874                  in MSB form.  (When handling the instruction in the
4875                  non-macro case, these arguments are sizes from which
4876                  MSB values must be calculated.)  */
4877               INSERT_OPERAND (mips_opts.micromips,
4878                               INSMSB, insn, va_arg (args, int));
4879               continue;
4880
4881             case 'C':
4882             case 'G':
4883             case 'H':
4884               /* Note that in the macro case, these arguments are already
4885                  in MSBD form.  (When handling the instruction in the
4886                  non-macro case, these arguments are sizes from which
4887                  MSBD values must be calculated.)  */
4888               INSERT_OPERAND (mips_opts.micromips,
4889                               EXTMSBD, insn, va_arg (args, int));
4890               continue;
4891
4892             case 'Q':
4893               gas_assert (!mips_opts.micromips);
4894               INSERT_OPERAND (0, SEQI, insn, va_arg (args, int));
4895               continue;
4896
4897             default:
4898               internalError ();
4899             }
4900           continue;
4901
4902         case '2':
4903           INSERT_OPERAND (mips_opts.micromips, BP, insn, va_arg (args, int));
4904           continue;
4905
4906         case 'n':
4907           gas_assert (mips_opts.micromips);
4908         case 't':
4909         case 'w':
4910         case 'E':
4911           INSERT_OPERAND (mips_opts.micromips, RT, insn, va_arg (args, int));
4912           continue;
4913
4914         case 'c':
4915           gas_assert (!mips_opts.micromips);
4916           INSERT_OPERAND (0, CODE, insn, va_arg (args, int));
4917           continue;
4918
4919         case 'W':
4920           gas_assert (!mips_opts.micromips);
4921         case 'T':
4922           INSERT_OPERAND (mips_opts.micromips, FT, insn, va_arg (args, int));
4923           continue;
4924
4925         case 'G':
4926           if (mips_opts.micromips)
4927             INSERT_OPERAND (1, RS, insn, va_arg (args, int));
4928           else
4929             INSERT_OPERAND (0, RD, insn, va_arg (args, int));
4930           continue;
4931
4932         case 'K':
4933           gas_assert (!mips_opts.micromips);
4934         case 'd':
4935           INSERT_OPERAND (mips_opts.micromips, RD, insn, va_arg (args, int));
4936           continue;
4937
4938         case 'U':
4939           gas_assert (!mips_opts.micromips);
4940           {
4941             int tmp = va_arg (args, int);
4942
4943             INSERT_OPERAND (0, RT, insn, tmp);
4944             INSERT_OPERAND (0, RD, insn, tmp);
4945           }
4946           continue;
4947
4948         case 'V':
4949         case 'S':
4950           gas_assert (!mips_opts.micromips);
4951           INSERT_OPERAND (0, FS, insn, va_arg (args, int));
4952           continue;
4953
4954         case 'z':
4955           continue;
4956
4957         case '<':
4958           INSERT_OPERAND (mips_opts.micromips,
4959                           SHAMT, insn, va_arg (args, int));
4960           continue;
4961
4962         case 'D':
4963           gas_assert (!mips_opts.micromips);
4964           INSERT_OPERAND (0, FD, insn, va_arg (args, int));
4965           continue;
4966
4967         case 'B':
4968           gas_assert (!mips_opts.micromips);
4969           INSERT_OPERAND (0, CODE20, insn, va_arg (args, int));
4970           continue;
4971
4972         case 'J':
4973           gas_assert (!mips_opts.micromips);
4974           INSERT_OPERAND (0, CODE19, insn, va_arg (args, int));
4975           continue;
4976
4977         case 'q':
4978           gas_assert (!mips_opts.micromips);
4979           INSERT_OPERAND (0, CODE2, insn, va_arg (args, int));
4980           continue;
4981
4982         case 'b':
4983         case 's':
4984         case 'r':
4985         case 'v':
4986           INSERT_OPERAND (mips_opts.micromips, RS, insn, va_arg (args, int));
4987           continue;
4988
4989         case 'i':
4990         case 'j':
4991           macro_read_relocs (&args, r);
4992           gas_assert (*r == BFD_RELOC_GPREL16
4993                       || *r == BFD_RELOC_MIPS_HIGHER
4994                       || *r == BFD_RELOC_HI16_S
4995                       || *r == BFD_RELOC_LO16
4996                       || *r == BFD_RELOC_MIPS_GOT_OFST);
4997           continue;
4998
4999         case 'o':
5000           macro_read_relocs (&args, r);
5001           continue;
5002
5003         case 'u':
5004           macro_read_relocs (&args, r);
5005           gas_assert (ep != NULL
5006                       && (ep->X_op == O_constant
5007                           || (ep->X_op == O_symbol
5008                               && (*r == BFD_RELOC_MIPS_HIGHEST
5009                                   || *r == BFD_RELOC_HI16_S
5010                                   || *r == BFD_RELOC_HI16
5011                                   || *r == BFD_RELOC_GPREL16
5012                                   || *r == BFD_RELOC_MIPS_GOT_HI16
5013                                   || *r == BFD_RELOC_MIPS_CALL_HI16))));
5014           continue;
5015
5016         case 'p':
5017           gas_assert (ep != NULL);
5018
5019           /*
5020            * This allows macro() to pass an immediate expression for
5021            * creating short branches without creating a symbol.
5022            *
5023            * We don't allow branch relaxation for these branches, as
5024            * they should only appear in ".set nomacro" anyway.
5025            */
5026           if (ep->X_op == O_constant)
5027             {
5028               /* For microMIPS we always use relocations for branches.
5029                  So we should not resolve immediate values.  */
5030               gas_assert (!mips_opts.micromips);
5031
5032               if ((ep->X_add_number & 3) != 0)
5033                 as_bad (_("branch to misaligned address (0x%lx)"),
5034                         (unsigned long) ep->X_add_number);
5035               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
5036                 as_bad (_("branch address range overflow (0x%lx)"),
5037                         (unsigned long) ep->X_add_number);
5038               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
5039               ep = NULL;
5040             }
5041           else
5042             *r = BFD_RELOC_16_PCREL_S2;
5043           continue;
5044
5045         case 'a':
5046           gas_assert (ep != NULL);
5047           *r = BFD_RELOC_MIPS_JMP;
5048           continue;
5049
5050         case 'C':
5051           gas_assert (!mips_opts.micromips);
5052           INSERT_OPERAND (0, COPZ, insn, va_arg (args, unsigned long));
5053           continue;
5054
5055         case 'k':
5056           INSERT_OPERAND (mips_opts.micromips,
5057                           CACHE, insn, va_arg (args, unsigned long));
5058           continue;
5059
5060         case '|':
5061           gas_assert (mips_opts.micromips);
5062           INSERT_OPERAND (1, TRAP, insn, va_arg (args, int));
5063           continue;
5064
5065         case '.':
5066           gas_assert (mips_opts.micromips);
5067           INSERT_OPERAND (1, OFFSET10, insn, va_arg (args, int));
5068           continue;
5069
5070         case '\\':
5071           INSERT_OPERAND (mips_opts.micromips,
5072                           3BITPOS, insn, va_arg (args, unsigned int));
5073           continue;
5074
5075         case '~':
5076           INSERT_OPERAND (mips_opts.micromips,
5077                           OFFSET12, insn, va_arg (args, unsigned long));
5078           continue;
5079
5080         case 'N':
5081           gas_assert (mips_opts.micromips);
5082           INSERT_OPERAND (1, BCC, insn, va_arg (args, int));
5083           continue;
5084
5085         case 'm':       /* Opcode extension character.  */
5086           gas_assert (mips_opts.micromips);
5087           switch (*fmt++)
5088             {
5089             case 'j':
5090               INSERT_OPERAND (1, MJ, insn, va_arg (args, int));
5091               break;
5092
5093             case 'p':
5094               INSERT_OPERAND (1, MP, insn, va_arg (args, int));
5095               break;
5096
5097             case 'F':
5098               INSERT_OPERAND (1, IMMF, insn, va_arg (args, int));
5099               break;
5100
5101             default:
5102               internalError ();
5103             }
5104           continue;
5105
5106         default:
5107           internalError ();
5108         }
5109       break;
5110     }
5111   va_end (args);
5112   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5113
5114   append_insn (&insn, ep, r, TRUE);
5115 }
5116
5117 static void
5118 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
5119                     va_list *args)
5120 {
5121   struct mips_opcode *mo;
5122   struct mips_cl_insn insn;
5123   bfd_reloc_code_real_type r[3]
5124     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
5125
5126   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
5127   gas_assert (mo);
5128   gas_assert (strcmp (name, mo->name) == 0);
5129
5130   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
5131     {
5132       ++mo;
5133       gas_assert (mo->name);
5134       gas_assert (strcmp (name, mo->name) == 0);
5135     }
5136
5137   create_insn (&insn, mo);
5138   for (;;)
5139     {
5140       int c;
5141
5142       c = *fmt++;
5143       switch (c)
5144         {
5145         case '\0':
5146           break;
5147
5148         case ',':
5149         case '(':
5150         case ')':
5151           continue;
5152
5153         case 'y':
5154         case 'w':
5155           MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
5156           continue;
5157
5158         case 'x':
5159         case 'v':
5160           MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
5161           continue;
5162
5163         case 'z':
5164           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
5165           continue;
5166
5167         case 'Z':
5168           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
5169           continue;
5170
5171         case '0':
5172         case 'S':
5173         case 'P':
5174         case 'R':
5175           continue;
5176
5177         case 'X':
5178           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
5179           continue;
5180
5181         case 'Y':
5182           {
5183             int regno;
5184
5185             regno = va_arg (*args, int);
5186             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
5187             MIPS16_INSERT_OPERAND (REG32R, insn, regno);
5188           }
5189           continue;
5190
5191         case '<':
5192         case '>':
5193         case '4':
5194         case '5':
5195         case 'H':
5196         case 'W':
5197         case 'D':
5198         case 'j':
5199         case '8':
5200         case 'V':
5201         case 'C':
5202         case 'U':
5203         case 'k':
5204         case 'K':
5205         case 'p':
5206         case 'q':
5207           {
5208             gas_assert (ep != NULL);
5209
5210             if (ep->X_op != O_constant)
5211               *r = (int) BFD_RELOC_UNUSED + c;
5212             else
5213               {
5214                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
5215                               FALSE, &insn.insn_opcode, &insn.use_extend,
5216                               &insn.extend);
5217                 ep = NULL;
5218                 *r = BFD_RELOC_UNUSED;
5219               }
5220           }
5221           continue;
5222
5223         case '6':
5224           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
5225           continue;
5226         }
5227
5228       break;
5229     }
5230
5231   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5232
5233   append_insn (&insn, ep, r, TRUE);
5234 }
5235
5236 /*
5237  * Sign-extend 32-bit mode constants that have bit 31 set and all
5238  * higher bits unset.
5239  */
5240 static void
5241 normalize_constant_expr (expressionS *ex)
5242 {
5243   if (ex->X_op == O_constant
5244       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5245     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5246                         - 0x80000000);
5247 }
5248
5249 /*
5250  * Sign-extend 32-bit mode address offsets that have bit 31 set and
5251  * all higher bits unset.
5252  */
5253 static void
5254 normalize_address_expr (expressionS *ex)
5255 {
5256   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
5257         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
5258       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5259     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5260                         - 0x80000000);
5261 }
5262
5263 /*
5264  * Generate a "jalr" instruction with a relocation hint to the called
5265  * function.  This occurs in NewABI PIC code.
5266  */
5267 static void
5268 macro_build_jalr (expressionS *ep, int cprestore)
5269 {
5270   static const bfd_reloc_code_real_type jalr_relocs[2]
5271     = { BFD_RELOC_MIPS_JALR, BFD_RELOC_MICROMIPS_JALR };
5272   bfd_reloc_code_real_type jalr_reloc = jalr_relocs[mips_opts.micromips];
5273   const char *jalr;
5274   char *f = NULL;
5275
5276   if (MIPS_JALR_HINT_P (ep))
5277     {
5278       frag_grow (8);
5279       f = frag_more (0);
5280     }
5281   if (mips_opts.micromips)
5282     {
5283       jalr = mips_opts.noreorder && !cprestore ? "jalr" : "jalrs";
5284       if (MIPS_JALR_HINT_P (ep))
5285         macro_build (NULL, jalr, "t,s", RA, PIC_CALL_REG);
5286       else
5287         macro_build (NULL, jalr, "mj", PIC_CALL_REG);
5288     }
5289   else
5290     macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
5291   if (MIPS_JALR_HINT_P (ep))
5292     fix_new_exp (frag_now, f - frag_now->fr_literal, 4, ep, FALSE, jalr_reloc);
5293 }
5294
5295 /*
5296  * Generate a "lui" instruction.
5297  */
5298 static void
5299 macro_build_lui (expressionS *ep, int regnum)
5300 {
5301   gas_assert (! mips_opts.mips16);
5302
5303   if (ep->X_op != O_constant)
5304     {
5305       gas_assert (ep->X_op == O_symbol);
5306       /* _gp_disp is a special case, used from s_cpload.
5307          __gnu_local_gp is used if mips_no_shared.  */
5308       gas_assert (mips_pic == NO_PIC
5309               || (! HAVE_NEWABI
5310                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
5311               || (! mips_in_shared
5312                   && strcmp (S_GET_NAME (ep->X_add_symbol),
5313                              "__gnu_local_gp") == 0));
5314     }
5315
5316   macro_build (ep, "lui", LUI_FMT, regnum, BFD_RELOC_HI16_S);
5317 }
5318
5319 /* Generate a sequence of instructions to do a load or store from a constant
5320    offset off of a base register (breg) into/from a target register (treg),
5321    using AT if necessary.  */
5322 static void
5323 macro_build_ldst_constoffset (expressionS *ep, const char *op,
5324                               int treg, int breg, int dbl)
5325 {
5326   gas_assert (ep->X_op == O_constant);
5327
5328   /* Sign-extending 32-bit constants makes their handling easier.  */
5329   if (!dbl)
5330     normalize_constant_expr (ep);
5331
5332   /* Right now, this routine can only handle signed 32-bit constants.  */
5333   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
5334     as_warn (_("operand overflow"));
5335
5336   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
5337     {
5338       /* Signed 16-bit offset will fit in the op.  Easy!  */
5339       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
5340     }
5341   else
5342     {
5343       /* 32-bit offset, need multiple instructions and AT, like:
5344            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
5345            addu     $tempreg,$tempreg,$breg
5346            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
5347          to handle the complete offset.  */
5348       macro_build_lui (ep, AT);
5349       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
5350       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
5351
5352       if (!mips_opts.at)
5353         as_bad (_("Macro used $at after \".set noat\""));
5354     }
5355 }
5356
5357 /*                      set_at()
5358  * Generates code to set the $at register to true (one)
5359  * if reg is less than the immediate expression.
5360  */
5361 static void
5362 set_at (int reg, int unsignedp)
5363 {
5364   if (imm_expr.X_op == O_constant
5365       && imm_expr.X_add_number >= -0x8000
5366       && imm_expr.X_add_number < 0x8000)
5367     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
5368                  AT, reg, BFD_RELOC_LO16);
5369   else
5370     {
5371       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5372       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
5373     }
5374 }
5375
5376 /* Warn if an expression is not a constant.  */
5377
5378 static void
5379 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
5380 {
5381   if (ex->X_op == O_big)
5382     as_bad (_("unsupported large constant"));
5383   else if (ex->X_op != O_constant)
5384     as_bad (_("Instruction %s requires absolute expression"),
5385             ip->insn_mo->name);
5386
5387   if (HAVE_32BIT_GPRS)
5388     normalize_constant_expr (ex);
5389 }
5390
5391 /* Count the leading zeroes by performing a binary chop. This is a
5392    bulky bit of source, but performance is a LOT better for the
5393    majority of values than a simple loop to count the bits:
5394        for (lcnt = 0; (lcnt < 32); lcnt++)
5395          if ((v) & (1 << (31 - lcnt)))
5396            break;
5397   However it is not code size friendly, and the gain will drop a bit
5398   on certain cached systems.
5399 */
5400 #define COUNT_TOP_ZEROES(v)             \
5401   (((v) & ~0xffff) == 0                 \
5402    ? ((v) & ~0xff) == 0                 \
5403      ? ((v) & ~0xf) == 0                \
5404        ? ((v) & ~0x3) == 0              \
5405          ? ((v) & ~0x1) == 0            \
5406            ? !(v)                       \
5407              ? 32                       \
5408              : 31                       \
5409            : 30                         \
5410          : ((v) & ~0x7) == 0            \
5411            ? 29                         \
5412            : 28                         \
5413        : ((v) & ~0x3f) == 0             \
5414          ? ((v) & ~0x1f) == 0           \
5415            ? 27                         \
5416            : 26                         \
5417          : ((v) & ~0x7f) == 0           \
5418            ? 25                         \
5419            : 24                         \
5420      : ((v) & ~0xfff) == 0              \
5421        ? ((v) & ~0x3ff) == 0            \
5422          ? ((v) & ~0x1ff) == 0          \
5423            ? 23                         \
5424            : 22                         \
5425          : ((v) & ~0x7ff) == 0          \
5426            ? 21                         \
5427            : 20                         \
5428        : ((v) & ~0x3fff) == 0           \
5429          ? ((v) & ~0x1fff) == 0         \
5430            ? 19                         \
5431            : 18                         \
5432          : ((v) & ~0x7fff) == 0         \
5433            ? 17                         \
5434            : 16                         \
5435    : ((v) & ~0xffffff) == 0             \
5436      ? ((v) & ~0xfffff) == 0            \
5437        ? ((v) & ~0x3ffff) == 0          \
5438          ? ((v) & ~0x1ffff) == 0        \
5439            ? 15                         \
5440            : 14                         \
5441          : ((v) & ~0x7ffff) == 0        \
5442            ? 13                         \
5443            : 12                         \
5444        : ((v) & ~0x3fffff) == 0         \
5445          ? ((v) & ~0x1fffff) == 0       \
5446            ? 11                         \
5447            : 10                         \
5448          : ((v) & ~0x7fffff) == 0       \
5449            ? 9                          \
5450            : 8                          \
5451      : ((v) & ~0xfffffff) == 0          \
5452        ? ((v) & ~0x3ffffff) == 0        \
5453          ? ((v) & ~0x1ffffff) == 0      \
5454            ? 7                          \
5455            : 6                          \
5456          : ((v) & ~0x7ffffff) == 0      \
5457            ? 5                          \
5458            : 4                          \
5459        : ((v) & ~0x3fffffff) == 0       \
5460          ? ((v) & ~0x1fffffff) == 0     \
5461            ? 3                          \
5462            : 2                          \
5463          : ((v) & ~0x7fffffff) == 0     \
5464            ? 1                          \
5465            : 0)
5466
5467 /*                      load_register()
5468  *  This routine generates the least number of instructions necessary to load
5469  *  an absolute expression value into a register.
5470  */
5471 static void
5472 load_register (int reg, expressionS *ep, int dbl)
5473 {
5474   int freg;
5475   expressionS hi32, lo32;
5476
5477   if (ep->X_op != O_big)
5478     {
5479       gas_assert (ep->X_op == O_constant);
5480
5481       /* Sign-extending 32-bit constants makes their handling easier.  */
5482       if (!dbl)
5483         normalize_constant_expr (ep);
5484
5485       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
5486         {
5487           /* We can handle 16 bit signed values with an addiu to
5488              $zero.  No need to ever use daddiu here, since $zero and
5489              the result are always correct in 32 bit mode.  */
5490           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5491           return;
5492         }
5493       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
5494         {
5495           /* We can handle 16 bit unsigned values with an ori to
5496              $zero.  */
5497           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
5498           return;
5499         }
5500       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
5501         {
5502           /* 32 bit values require an lui.  */
5503           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5504           if ((ep->X_add_number & 0xffff) != 0)
5505             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
5506           return;
5507         }
5508     }
5509
5510   /* The value is larger than 32 bits.  */
5511
5512   if (!dbl || HAVE_32BIT_GPRS)
5513     {
5514       char value[32];
5515
5516       sprintf_vma (value, ep->X_add_number);
5517       as_bad (_("Number (0x%s) larger than 32 bits"), value);
5518       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5519       return;
5520     }
5521
5522   if (ep->X_op != O_big)
5523     {
5524       hi32 = *ep;
5525       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
5526       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
5527       hi32.X_add_number &= 0xffffffff;
5528       lo32 = *ep;
5529       lo32.X_add_number &= 0xffffffff;
5530     }
5531   else
5532     {
5533       gas_assert (ep->X_add_number > 2);
5534       if (ep->X_add_number == 3)
5535         generic_bignum[3] = 0;
5536       else if (ep->X_add_number > 4)
5537         as_bad (_("Number larger than 64 bits"));
5538       lo32.X_op = O_constant;
5539       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
5540       hi32.X_op = O_constant;
5541       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
5542     }
5543
5544   if (hi32.X_add_number == 0)
5545     freg = 0;
5546   else
5547     {
5548       int shift, bit;
5549       unsigned long hi, lo;
5550
5551       if (hi32.X_add_number == (offsetT) 0xffffffff)
5552         {
5553           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
5554             {
5555               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5556               return;
5557             }
5558           if (lo32.X_add_number & 0x80000000)
5559             {
5560               macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5561               if (lo32.X_add_number & 0xffff)
5562                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
5563               return;
5564             }
5565         }
5566
5567       /* Check for 16bit shifted constant.  We know that hi32 is
5568          non-zero, so start the mask on the first bit of the hi32
5569          value.  */
5570       shift = 17;
5571       do
5572         {
5573           unsigned long himask, lomask;
5574
5575           if (shift < 32)
5576             {
5577               himask = 0xffff >> (32 - shift);
5578               lomask = (0xffff << shift) & 0xffffffff;
5579             }
5580           else
5581             {
5582               himask = 0xffff << (shift - 32);
5583               lomask = 0;
5584             }
5585           if ((hi32.X_add_number & ~(offsetT) himask) == 0
5586               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
5587             {
5588               expressionS tmp;
5589
5590               tmp.X_op = O_constant;
5591               if (shift < 32)
5592                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
5593                                     | (lo32.X_add_number >> shift));
5594               else
5595                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
5596               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
5597               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", SHFT_FMT,
5598                            reg, reg, (shift >= 32) ? shift - 32 : shift);
5599               return;
5600             }
5601           ++shift;
5602         }
5603       while (shift <= (64 - 16));
5604
5605       /* Find the bit number of the lowest one bit, and store the
5606          shifted value in hi/lo.  */
5607       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
5608       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
5609       if (lo != 0)
5610         {
5611           bit = 0;
5612           while ((lo & 1) == 0)
5613             {
5614               lo >>= 1;
5615               ++bit;
5616             }
5617           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
5618           hi >>= bit;
5619         }
5620       else
5621         {
5622           bit = 32;
5623           while ((hi & 1) == 0)
5624             {
5625               hi >>= 1;
5626               ++bit;
5627             }
5628           lo = hi;
5629           hi = 0;
5630         }
5631
5632       /* Optimize if the shifted value is a (power of 2) - 1.  */
5633       if ((hi == 0 && ((lo + 1) & lo) == 0)
5634           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
5635         {
5636           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
5637           if (shift != 0)
5638             {
5639               expressionS tmp;
5640
5641               /* This instruction will set the register to be all
5642                  ones.  */
5643               tmp.X_op = O_constant;
5644               tmp.X_add_number = (offsetT) -1;
5645               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5646               if (bit != 0)
5647                 {
5648                   bit += shift;
5649                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", SHFT_FMT,
5650                                reg, reg, (bit >= 32) ? bit - 32 : bit);
5651                 }
5652               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", SHFT_FMT,
5653                            reg, reg, (shift >= 32) ? shift - 32 : shift);
5654               return;
5655             }
5656         }
5657
5658       /* Sign extend hi32 before calling load_register, because we can
5659          generally get better code when we load a sign extended value.  */
5660       if ((hi32.X_add_number & 0x80000000) != 0)
5661         hi32.X_add_number |= ~(offsetT) 0xffffffff;
5662       load_register (reg, &hi32, 0);
5663       freg = reg;
5664     }
5665   if ((lo32.X_add_number & 0xffff0000) == 0)
5666     {
5667       if (freg != 0)
5668         {
5669           macro_build (NULL, "dsll32", SHFT_FMT, reg, freg, 0);
5670           freg = reg;
5671         }
5672     }
5673   else
5674     {
5675       expressionS mid16;
5676
5677       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
5678         {
5679           macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5680           macro_build (NULL, "dsrl32", SHFT_FMT, reg, reg, 0);
5681           return;
5682         }
5683
5684       if (freg != 0)
5685         {
5686           macro_build (NULL, "dsll", SHFT_FMT, reg, freg, 16);
5687           freg = reg;
5688         }
5689       mid16 = lo32;
5690       mid16.X_add_number >>= 16;
5691       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
5692       macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5693       freg = reg;
5694     }
5695   if ((lo32.X_add_number & 0xffff) != 0)
5696     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
5697 }
5698
5699 static inline void
5700 load_delay_nop (void)
5701 {
5702   if (!gpr_interlocks)
5703     macro_build (NULL, "nop", "");
5704 }
5705
5706 /* Load an address into a register.  */
5707
5708 static void
5709 load_address (int reg, expressionS *ep, int *used_at)
5710 {
5711   if (ep->X_op != O_constant
5712       && ep->X_op != O_symbol)
5713     {
5714       as_bad (_("expression too complex"));
5715       ep->X_op = O_constant;
5716     }
5717
5718   if (ep->X_op == O_constant)
5719     {
5720       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
5721       return;
5722     }
5723
5724   if (mips_pic == NO_PIC)
5725     {
5726       /* If this is a reference to a GP relative symbol, we want
5727            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
5728          Otherwise we want
5729            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
5730            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
5731          If we have an addend, we always use the latter form.
5732
5733          With 64bit address space and a usable $at we want
5734            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
5735            lui          $at,<sym>               (BFD_RELOC_HI16_S)
5736            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
5737            daddiu       $at,<sym>               (BFD_RELOC_LO16)
5738            dsll32       $reg,0
5739            daddu        $reg,$reg,$at
5740
5741          If $at is already in use, we use a path which is suboptimal
5742          on superscalar processors.
5743            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
5744            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
5745            dsll         $reg,16
5746            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
5747            dsll         $reg,16
5748            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
5749
5750          For GP relative symbols in 64bit address space we can use
5751          the same sequence as in 32bit address space.  */
5752       if (HAVE_64BIT_SYMBOLS)
5753         {
5754           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
5755               && !nopic_need_relax (ep->X_add_symbol, 1))
5756             {
5757               relax_start (ep->X_add_symbol);
5758               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
5759                            mips_gp_register, BFD_RELOC_GPREL16);
5760               relax_switch ();
5761             }
5762
5763           if (*used_at == 0 && mips_opts.at)
5764             {
5765               macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
5766               macro_build (ep, "lui", LUI_FMT, AT, BFD_RELOC_HI16_S);
5767               macro_build (ep, "daddiu", "t,r,j", reg, reg,
5768                            BFD_RELOC_MIPS_HIGHER);
5769               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
5770               macro_build (NULL, "dsll32", SHFT_FMT, reg, reg, 0);
5771               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
5772               *used_at = 1;
5773             }
5774           else
5775             {
5776               macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
5777               macro_build (ep, "daddiu", "t,r,j", reg, reg,
5778                            BFD_RELOC_MIPS_HIGHER);
5779               macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5780               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
5781               macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5782               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
5783             }
5784
5785           if (mips_relax.sequence)
5786             relax_end ();
5787         }
5788       else
5789         {
5790           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
5791               && !nopic_need_relax (ep->X_add_symbol, 1))
5792             {
5793               relax_start (ep->X_add_symbol);
5794               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
5795                            mips_gp_register, BFD_RELOC_GPREL16);
5796               relax_switch ();
5797             }
5798           macro_build_lui (ep, reg);
5799           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
5800                        reg, reg, BFD_RELOC_LO16);
5801           if (mips_relax.sequence)
5802             relax_end ();
5803         }
5804     }
5805   else if (!mips_big_got)
5806     {
5807       expressionS ex;
5808
5809       /* If this is a reference to an external symbol, we want
5810            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
5811          Otherwise we want
5812            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
5813            nop
5814            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
5815          If there is a constant, it must be added in after.
5816
5817          If we have NewABI, we want
5818            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5819          unless we're referencing a global symbol with a non-zero
5820          offset, in which case cst must be added separately.  */
5821       if (HAVE_NEWABI)
5822         {
5823           if (ep->X_add_number)
5824             {
5825               ex.X_add_number = ep->X_add_number;
5826               ep->X_add_number = 0;
5827               relax_start (ep->X_add_symbol);
5828               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5829                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5830               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
5831                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5832               ex.X_op = O_constant;
5833               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
5834                            reg, reg, BFD_RELOC_LO16);
5835               ep->X_add_number = ex.X_add_number;
5836               relax_switch ();
5837             }
5838           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5839                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5840           if (mips_relax.sequence)
5841             relax_end ();
5842         }
5843       else
5844         {
5845           ex.X_add_number = ep->X_add_number;
5846           ep->X_add_number = 0;
5847           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5848                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
5849           load_delay_nop ();
5850           relax_start (ep->X_add_symbol);
5851           relax_switch ();
5852           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5853                        BFD_RELOC_LO16);
5854           relax_end ();
5855
5856           if (ex.X_add_number != 0)
5857             {
5858               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
5859                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5860               ex.X_op = O_constant;
5861               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
5862                            reg, reg, BFD_RELOC_LO16);
5863             }
5864         }
5865     }
5866   else if (mips_big_got)
5867     {
5868       expressionS ex;
5869
5870       /* This is the large GOT case.  If this is a reference to an
5871          external symbol, we want
5872            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
5873            addu         $reg,$reg,$gp
5874            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
5875
5876          Otherwise, for a reference to a local symbol in old ABI, we want
5877            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
5878            nop
5879            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
5880          If there is a constant, it must be added in after.
5881
5882          In the NewABI, for local symbols, with or without offsets, we want:
5883            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
5884            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
5885       */
5886       if (HAVE_NEWABI)
5887         {
5888           ex.X_add_number = ep->X_add_number;
5889           ep->X_add_number = 0;
5890           relax_start (ep->X_add_symbol);
5891           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
5892           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5893                        reg, reg, mips_gp_register);
5894           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
5895                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
5896           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
5897             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5898           else if (ex.X_add_number)
5899             {
5900               ex.X_op = O_constant;
5901               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5902                            BFD_RELOC_LO16);
5903             }
5904
5905           ep->X_add_number = ex.X_add_number;
5906           relax_switch ();
5907           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5908                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5909           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5910                        BFD_RELOC_MIPS_GOT_OFST);
5911           relax_end ();
5912         }
5913       else
5914         {
5915           ex.X_add_number = ep->X_add_number;
5916           ep->X_add_number = 0;
5917           relax_start (ep->X_add_symbol);
5918           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
5919           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5920                        reg, reg, mips_gp_register);
5921           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
5922                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
5923           relax_switch ();
5924           if (reg_needs_delay (mips_gp_register))
5925             {
5926               /* We need a nop before loading from $gp.  This special
5927                  check is required because the lui which starts the main
5928                  instruction stream does not refer to $gp, and so will not
5929                  insert the nop which may be required.  */
5930               macro_build (NULL, "nop", "");
5931             }
5932           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5933                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
5934           load_delay_nop ();
5935           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5936                        BFD_RELOC_LO16);
5937           relax_end ();
5938
5939           if (ex.X_add_number != 0)
5940             {
5941               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
5942                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5943               ex.X_op = O_constant;
5944               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5945                            BFD_RELOC_LO16);
5946             }
5947         }
5948     }
5949   else
5950     abort ();
5951
5952   if (!mips_opts.at && *used_at == 1)
5953     as_bad (_("Macro used $at after \".set noat\""));
5954 }
5955
5956 /* Move the contents of register SOURCE into register DEST.  */
5957
5958 static void
5959 move_register (int dest, int source)
5960 {
5961   /* Prefer to use a 16-bit microMIPS instruction unless the previous
5962      instruction specifically requires a 32-bit one.  */
5963   if (mips_opts.micromips
5964       && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
5965     macro_build (NULL, "move", "mp,mj", dest, source);
5966   else
5967     macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
5968                  dest, source, 0);
5969 }
5970
5971 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
5972    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
5973    The two alternatives are:
5974
5975    Global symbol                Local sybmol
5976    -------------                ------------
5977    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
5978    ...                          ...
5979    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
5980
5981    load_got_offset emits the first instruction and add_got_offset
5982    emits the second for a 16-bit offset or add_got_offset_hilo emits
5983    a sequence to add a 32-bit offset using a scratch register.  */
5984
5985 static void
5986 load_got_offset (int dest, expressionS *local)
5987 {
5988   expressionS global;
5989
5990   global = *local;
5991   global.X_add_number = 0;
5992
5993   relax_start (local->X_add_symbol);
5994   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
5995                BFD_RELOC_MIPS_GOT16, mips_gp_register);
5996   relax_switch ();
5997   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
5998                BFD_RELOC_MIPS_GOT16, mips_gp_register);
5999   relax_end ();
6000 }
6001
6002 static void
6003 add_got_offset (int dest, expressionS *local)
6004 {
6005   expressionS global;
6006
6007   global.X_op = O_constant;
6008   global.X_op_symbol = NULL;
6009   global.X_add_symbol = NULL;
6010   global.X_add_number = local->X_add_number;
6011
6012   relax_start (local->X_add_symbol);
6013   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
6014                dest, dest, BFD_RELOC_LO16);
6015   relax_switch ();
6016   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
6017   relax_end ();
6018 }
6019
6020 static void
6021 add_got_offset_hilo (int dest, expressionS *local, int tmp)
6022 {
6023   expressionS global;
6024   int hold_mips_optimize;
6025
6026   global.X_op = O_constant;
6027   global.X_op_symbol = NULL;
6028   global.X_add_symbol = NULL;
6029   global.X_add_number = local->X_add_number;
6030
6031   relax_start (local->X_add_symbol);
6032   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
6033   relax_switch ();
6034   /* Set mips_optimize around the lui instruction to avoid
6035      inserting an unnecessary nop after the lw.  */
6036   hold_mips_optimize = mips_optimize;
6037   mips_optimize = 2;
6038   macro_build_lui (&global, tmp);
6039   mips_optimize = hold_mips_optimize;
6040   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
6041   relax_end ();
6042
6043   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
6044 }
6045
6046 /* Emit a sequence of instructions to emulate a branch likely operation.
6047    BR is an ordinary branch corresponding to one to be emulated.  BRNEG
6048    is its complementing branch with the original condition negated.
6049    CALL is set if the original branch specified the link operation.
6050    EP, FMT, SREG and TREG specify the usual macro_build() parameters.
6051
6052    Code like this is produced in the noreorder mode:
6053
6054         BRNEG   <args>, 1f
6055          nop
6056         b       <sym>
6057          delay slot (executed only if branch taken)
6058     1:
6059
6060    or, if CALL is set:
6061
6062         BRNEG   <args>, 1f
6063          nop
6064         bal     <sym>
6065          delay slot (executed only if branch taken)
6066     1:
6067
6068    In the reorder mode the delay slot would be filled with a nop anyway,
6069    so code produced is simply:
6070
6071         BR      <args>, <sym>
6072          nop
6073
6074    This function is used when producing code for the microMIPS ASE that
6075    does not implement branch likely instructions in hardware.  */
6076
6077 static void
6078 macro_build_branch_likely (const char *br, const char *brneg,
6079                            int call, expressionS *ep, const char *fmt,
6080                            unsigned int sreg, unsigned int treg)
6081 {
6082   int noreorder = mips_opts.noreorder;
6083   expressionS expr1;
6084
6085   gas_assert (mips_opts.micromips);
6086   start_noreorder ();
6087   if (noreorder)
6088     {
6089       micromips_label_expr (&expr1);
6090       macro_build (&expr1, brneg, fmt, sreg, treg);
6091       macro_build (NULL, "nop", "");
6092       macro_build (ep, call ? "bal" : "b", "p");
6093
6094       /* Set to true so that append_insn adds a label.  */
6095       emit_branch_likely_macro = TRUE;
6096     }
6097   else
6098     {
6099       macro_build (ep, br, fmt, sreg, treg);
6100       macro_build (NULL, "nop", "");
6101     }
6102   end_noreorder ();
6103 }
6104
6105 /* Emit a coprocessor branch-likely macro specified by TYPE, using CC as
6106    the condition code tested.  EP specifies the branch target.  */
6107
6108 static void
6109 macro_build_branch_ccl (int type, expressionS *ep, unsigned int cc)
6110 {
6111   const int call = 0;
6112   const char *brneg;
6113   const char *br;
6114
6115   switch (type)
6116     {
6117     case M_BC1FL:
6118       br = "bc1f";
6119       brneg = "bc1t";
6120       break;
6121     case M_BC1TL:
6122       br = "bc1t";
6123       brneg = "bc1f";
6124       break;
6125     case M_BC2FL:
6126       br = "bc2f";
6127       brneg = "bc2t";
6128       break;
6129     case M_BC2TL:
6130       br = "bc2t";
6131       brneg = "bc2f";
6132       break;
6133     default:
6134       abort ();
6135     }
6136   macro_build_branch_likely (br, brneg, call, ep, "N,p", cc, ZERO);
6137 }
6138
6139 /* Emit a two-argument branch macro specified by TYPE, using SREG as
6140    the register tested.  EP specifies the branch target.  */
6141
6142 static void
6143 macro_build_branch_rs (int type, expressionS *ep, unsigned int sreg)
6144 {
6145   const char *brneg = NULL;
6146   const char *br;
6147   int call = 0;
6148
6149   switch (type)
6150     {
6151     case M_BGEZ:
6152       br = "bgez";
6153       break;
6154     case M_BGEZL:
6155       br = mips_opts.micromips ? "bgez" : "bgezl";
6156       brneg = "bltz";
6157       break;
6158     case M_BGEZALL:
6159       gas_assert (mips_opts.micromips);
6160       br = "bgezals";
6161       brneg = "bltz";
6162       call = 1;
6163       break;
6164     case M_BGTZ:
6165       br = "bgtz";
6166       break;
6167     case M_BGTZL:
6168       br = mips_opts.micromips ? "bgtz" : "bgtzl";
6169       brneg = "blez";
6170       break;
6171     case M_BLEZ:
6172       br = "blez";
6173       break;
6174     case M_BLEZL:
6175       br = mips_opts.micromips ? "blez" : "blezl";
6176       brneg = "bgtz";
6177       break;
6178     case M_BLTZ:
6179       br = "bltz";
6180       break;
6181     case M_BLTZL:
6182       br = mips_opts.micromips ? "bltz" : "bltzl";
6183       brneg = "bgez";
6184       break;
6185     case M_BLTZALL:
6186       gas_assert (mips_opts.micromips);
6187       br = "bltzals";
6188       brneg = "bgez";
6189       call = 1;
6190       break;
6191     default:
6192       abort ();
6193     }
6194   if (mips_opts.micromips && brneg)
6195     macro_build_branch_likely (br, brneg, call, ep, "s,p", sreg, ZERO);
6196   else
6197     macro_build (ep, br, "s,p", sreg);
6198 }
6199
6200 /* Emit a three-argument branch macro specified by TYPE, using SREG and
6201    TREG as the registers tested.  EP specifies the branch target.  */
6202
6203 static void
6204 macro_build_branch_rsrt (int type, expressionS *ep,
6205                          unsigned int sreg, unsigned int treg)
6206 {
6207   const char *brneg = NULL;
6208   const int call = 0;
6209   const char *br;
6210
6211   switch (type)
6212     {
6213     case M_BEQ:
6214     case M_BEQ_I:
6215       br = "beq";
6216       break;
6217     case M_BEQL:
6218     case M_BEQL_I:
6219       br = mips_opts.micromips ? "beq" : "beql";
6220       brneg = "bne";
6221       break;
6222     case M_BNE:
6223     case M_BNE_I:
6224       br = "bne";
6225       break;
6226     case M_BNEL:
6227     case M_BNEL_I:
6228       br = mips_opts.micromips ? "bne" : "bnel";
6229       brneg = "beq";
6230       break;
6231     default:
6232       abort ();
6233     }
6234   if (mips_opts.micromips && brneg)
6235     macro_build_branch_likely (br, brneg, call, ep, "s,t,p", sreg, treg);
6236   else
6237     macro_build (ep, br, "s,t,p", sreg, treg);
6238 }
6239
6240 /*
6241  *                      Build macros
6242  *   This routine implements the seemingly endless macro or synthesized
6243  * instructions and addressing modes in the mips assembly language. Many
6244  * of these macros are simple and are similar to each other. These could
6245  * probably be handled by some kind of table or grammar approach instead of
6246  * this verbose method. Others are not simple macros but are more like
6247  * optimizing code generation.
6248  *   One interesting optimization is when several store macros appear
6249  * consecutively that would load AT with the upper half of the same address.
6250  * The ensuing load upper instructions are ommited. This implies some kind
6251  * of global optimization. We currently only optimize within a single macro.
6252  *   For many of the load and store macros if the address is specified as a
6253  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
6254  * first load register 'at' with zero and use it as the base register. The
6255  * mips assembler simply uses register $zero. Just one tiny optimization
6256  * we're missing.
6257  */
6258 static void
6259 macro (struct mips_cl_insn *ip)
6260 {
6261   unsigned int treg, sreg, dreg, breg;
6262   unsigned int tempreg;
6263   int mask;
6264   int used_at = 0;
6265   expressionS label_expr;
6266   expressionS expr1;
6267   expressionS *ep;
6268   const char *s;
6269   const char *s2;
6270   const char *fmt;
6271   int likely = 0;
6272   int coproc = 0;
6273   int off12 = 0;
6274   int call = 0;
6275   int jals = 0;
6276   int dbl = 0;
6277   int imm = 0;
6278   int ust = 0;
6279   int lp = 0;
6280   int ab = 0;
6281   int off0 = 0;
6282   int off;
6283   offsetT maxnum;
6284   bfd_reloc_code_real_type r;
6285   int hold_mips_optimize;
6286
6287   gas_assert (! mips_opts.mips16);
6288
6289   treg = EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
6290   dreg = EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
6291   sreg = breg = EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
6292   mask = ip->insn_mo->mask;
6293
6294   label_expr.X_op = O_constant;
6295   label_expr.X_op_symbol = NULL;
6296   label_expr.X_add_symbol = NULL;
6297   label_expr.X_add_number = 0;
6298
6299   expr1.X_op = O_constant;
6300   expr1.X_op_symbol = NULL;
6301   expr1.X_add_symbol = NULL;
6302   expr1.X_add_number = 1;
6303
6304   switch (mask)
6305     {
6306     case M_DABS:
6307       dbl = 1;
6308     case M_ABS:
6309       /*    bgez    $a0,1f
6310             move    v0,$a0
6311             sub     v0,$zero,$a0
6312          1:
6313        */
6314
6315       start_noreorder ();
6316
6317       if (mips_opts.micromips)
6318         micromips_label_expr (&label_expr);
6319       else
6320         label_expr.X_add_number = 8;
6321       macro_build (&label_expr, "bgez", "s,p", sreg);
6322       if (dreg == sreg)
6323         macro_build (NULL, "nop", "");
6324       else
6325         move_register (dreg, sreg);
6326       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
6327       if (mips_opts.micromips)
6328         micromips_add_label ();
6329
6330       end_noreorder ();
6331       break;
6332
6333     case M_ADD_I:
6334       s = "addi";
6335       s2 = "add";
6336       goto do_addi;
6337     case M_ADDU_I:
6338       s = "addiu";
6339       s2 = "addu";
6340       goto do_addi;
6341     case M_DADD_I:
6342       dbl = 1;
6343       s = "daddi";
6344       s2 = "dadd";
6345       if (!mips_opts.micromips)
6346         goto do_addi;
6347       if (imm_expr.X_op == O_constant
6348           && imm_expr.X_add_number >= -0x200
6349           && imm_expr.X_add_number < 0x200)
6350         {
6351           macro_build (NULL, s, "t,r,.", treg, sreg, imm_expr.X_add_number);
6352           break;
6353         }
6354       goto do_addi_i;
6355     case M_DADDU_I:
6356       dbl = 1;
6357       s = "daddiu";
6358       s2 = "daddu";
6359     do_addi:
6360       if (imm_expr.X_op == O_constant
6361           && imm_expr.X_add_number >= -0x8000
6362           && imm_expr.X_add_number < 0x8000)
6363         {
6364           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
6365           break;
6366         }
6367     do_addi_i:
6368       used_at = 1;
6369       load_register (AT, &imm_expr, dbl);
6370       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6371       break;
6372
6373     case M_AND_I:
6374       s = "andi";
6375       s2 = "and";
6376       goto do_bit;
6377     case M_OR_I:
6378       s = "ori";
6379       s2 = "or";
6380       goto do_bit;
6381     case M_NOR_I:
6382       s = "";
6383       s2 = "nor";
6384       goto do_bit;
6385     case M_XOR_I:
6386       s = "xori";
6387       s2 = "xor";
6388     do_bit:
6389       if (imm_expr.X_op == O_constant
6390           && imm_expr.X_add_number >= 0
6391           && imm_expr.X_add_number < 0x10000)
6392         {
6393           if (mask != M_NOR_I)
6394             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
6395           else
6396             {
6397               macro_build (&imm_expr, "ori", "t,r,i",
6398                            treg, sreg, BFD_RELOC_LO16);
6399               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
6400             }
6401           break;
6402         }
6403
6404       used_at = 1;
6405       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
6406       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6407       break;
6408
6409     case M_BALIGN:
6410       switch (imm_expr.X_add_number)
6411         {
6412         case 0:
6413           macro_build (NULL, "nop", "");
6414           break;
6415         case 2:
6416           macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
6417           break;
6418         case 1:
6419         case 3:
6420           macro_build (NULL, "balign", "t,s,2", treg, sreg,
6421                        (int) imm_expr.X_add_number);
6422           break;
6423         default:
6424           as_bad (_("BALIGN immediate not 0, 1, 2 or 3 (%lu)"),
6425                   (unsigned long) imm_expr.X_add_number);
6426           break;
6427         }
6428       break;
6429
6430     case M_BC1FL:
6431     case M_BC1TL:
6432     case M_BC2FL:
6433     case M_BC2TL:
6434       gas_assert (mips_opts.micromips);
6435       macro_build_branch_ccl (mask, &offset_expr,
6436                               EXTRACT_OPERAND (1, BCC, *ip));
6437       break;
6438
6439     case M_BEQ_I:
6440     case M_BEQL_I:
6441     case M_BNE_I:
6442     case M_BNEL_I:
6443       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6444         treg = 0;
6445       else
6446         {
6447           treg = AT;
6448           used_at = 1;
6449           load_register (treg, &imm_expr, HAVE_64BIT_GPRS);
6450         }
6451       /* Fall through.  */
6452     case M_BEQL:
6453     case M_BNEL:
6454       macro_build_branch_rsrt (mask, &offset_expr, sreg, treg);
6455       break;
6456
6457     case M_BGEL:
6458       likely = 1;
6459     case M_BGE:
6460       if (treg == 0)
6461         macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, sreg);
6462       else if (sreg == 0)
6463         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, treg);
6464       else
6465         {
6466           used_at = 1;
6467           macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
6468           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6469                                    &offset_expr, AT, ZERO);
6470         }
6471       break;
6472
6473     case M_BGEZL:
6474     case M_BGEZALL:
6475     case M_BGTZL:
6476     case M_BLEZL:
6477     case M_BLTZL:
6478     case M_BLTZALL:
6479       macro_build_branch_rs (mask, &offset_expr, sreg);
6480       break;
6481
6482     case M_BGTL_I:
6483       likely = 1;
6484     case M_BGT_I:
6485       /* Check for > max integer.  */
6486       maxnum = 0x7fffffff;
6487       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6488         {
6489           maxnum <<= 16;
6490           maxnum |= 0xffff;
6491           maxnum <<= 16;
6492           maxnum |= 0xffff;
6493         }
6494       if (imm_expr.X_op == O_constant
6495           && imm_expr.X_add_number >= maxnum
6496           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6497         {
6498         do_false:
6499           /* Result is always false.  */
6500           if (! likely)
6501             macro_build (NULL, "nop", "");
6502           else
6503             macro_build_branch_rsrt (M_BNEL, &offset_expr, ZERO, ZERO);
6504           break;
6505         }
6506       if (imm_expr.X_op != O_constant)
6507         as_bad (_("Unsupported large constant"));
6508       ++imm_expr.X_add_number;
6509       /* FALLTHROUGH */
6510     case M_BGE_I:
6511     case M_BGEL_I:
6512       if (mask == M_BGEL_I)
6513         likely = 1;
6514       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6515         {
6516           macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ,
6517                                  &offset_expr, sreg);
6518           break;
6519         }
6520       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6521         {
6522           macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ,
6523                                  &offset_expr, sreg);
6524           break;
6525         }
6526       maxnum = 0x7fffffff;
6527       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6528         {
6529           maxnum <<= 16;
6530           maxnum |= 0xffff;
6531           maxnum <<= 16;
6532           maxnum |= 0xffff;
6533         }
6534       maxnum = - maxnum - 1;
6535       if (imm_expr.X_op == O_constant
6536           && imm_expr.X_add_number <= maxnum
6537           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6538         {
6539         do_true:
6540           /* result is always true */
6541           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
6542           macro_build (&offset_expr, "b", "p");
6543           break;
6544         }
6545       used_at = 1;
6546       set_at (sreg, 0);
6547       macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6548                                &offset_expr, AT, ZERO);
6549       break;
6550
6551     case M_BGEUL:
6552       likely = 1;
6553     case M_BGEU:
6554       if (treg == 0)
6555         goto do_true;
6556       else if (sreg == 0)
6557         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6558                                  &offset_expr, ZERO, treg);
6559       else
6560         {
6561           used_at = 1;
6562           macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
6563           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6564                                    &offset_expr, AT, ZERO);
6565         }
6566       break;
6567
6568     case M_BGTUL_I:
6569       likely = 1;
6570     case M_BGTU_I:
6571       if (sreg == 0
6572           || (HAVE_32BIT_GPRS
6573               && imm_expr.X_op == O_constant
6574               && imm_expr.X_add_number == -1))
6575         goto do_false;
6576       if (imm_expr.X_op != O_constant)
6577         as_bad (_("Unsupported large constant"));
6578       ++imm_expr.X_add_number;
6579       /* FALLTHROUGH */
6580     case M_BGEU_I:
6581     case M_BGEUL_I:
6582       if (mask == M_BGEUL_I)
6583         likely = 1;
6584       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6585         goto do_true;
6586       else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6587         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6588                                  &offset_expr, sreg, ZERO);
6589       else
6590         {
6591           used_at = 1;
6592           set_at (sreg, 1);
6593           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6594                                    &offset_expr, AT, ZERO);
6595         }
6596       break;
6597
6598     case M_BGTL:
6599       likely = 1;
6600     case M_BGT:
6601       if (treg == 0)
6602         macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, sreg);
6603       else if (sreg == 0)
6604         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, treg);
6605       else
6606         {
6607           used_at = 1;
6608           macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
6609           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6610                                    &offset_expr, AT, ZERO);
6611         }
6612       break;
6613
6614     case M_BGTUL:
6615       likely = 1;
6616     case M_BGTU:
6617       if (treg == 0)
6618         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6619                                  &offset_expr, sreg, ZERO);
6620       else if (sreg == 0)
6621         goto do_false;
6622       else
6623         {
6624           used_at = 1;
6625           macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
6626           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6627                                    &offset_expr, AT, ZERO);
6628         }
6629       break;
6630
6631     case M_BLEL:
6632       likely = 1;
6633     case M_BLE:
6634       if (treg == 0)
6635         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
6636       else if (sreg == 0)
6637         macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, treg);
6638       else
6639         {
6640           used_at = 1;
6641           macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
6642           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6643                                    &offset_expr, AT, ZERO);
6644         }
6645       break;
6646
6647     case M_BLEL_I:
6648       likely = 1;
6649     case M_BLE_I:
6650       maxnum = 0x7fffffff;
6651       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6652         {
6653           maxnum <<= 16;
6654           maxnum |= 0xffff;
6655           maxnum <<= 16;
6656           maxnum |= 0xffff;
6657         }
6658       if (imm_expr.X_op == O_constant
6659           && imm_expr.X_add_number >= maxnum
6660           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6661         goto do_true;
6662       if (imm_expr.X_op != O_constant)
6663         as_bad (_("Unsupported large constant"));
6664       ++imm_expr.X_add_number;
6665       /* FALLTHROUGH */
6666     case M_BLT_I:
6667     case M_BLTL_I:
6668       if (mask == M_BLTL_I)
6669         likely = 1;
6670       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6671         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
6672       else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6673         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
6674       else
6675         {
6676           used_at = 1;
6677           set_at (sreg, 0);
6678           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6679                                    &offset_expr, AT, ZERO);
6680         }
6681       break;
6682
6683     case M_BLEUL:
6684       likely = 1;
6685     case M_BLEU:
6686       if (treg == 0)
6687         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6688                                  &offset_expr, sreg, ZERO);
6689       else if (sreg == 0)
6690         goto do_true;
6691       else
6692         {
6693           used_at = 1;
6694           macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
6695           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6696                                    &offset_expr, AT, ZERO);
6697         }
6698       break;
6699
6700     case M_BLEUL_I:
6701       likely = 1;
6702     case M_BLEU_I:
6703       if (sreg == 0
6704           || (HAVE_32BIT_GPRS
6705               && imm_expr.X_op == O_constant
6706               && imm_expr.X_add_number == -1))
6707         goto do_true;
6708       if (imm_expr.X_op != O_constant)
6709         as_bad (_("Unsupported large constant"));
6710       ++imm_expr.X_add_number;
6711       /* FALLTHROUGH */
6712     case M_BLTU_I:
6713     case M_BLTUL_I:
6714       if (mask == M_BLTUL_I)
6715         likely = 1;
6716       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6717         goto do_false;
6718       else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6719         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6720                                  &offset_expr, sreg, ZERO);
6721       else
6722         {
6723           used_at = 1;
6724           set_at (sreg, 1);
6725           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6726                                    &offset_expr, AT, ZERO);
6727         }
6728       break;
6729
6730     case M_BLTL:
6731       likely = 1;
6732     case M_BLT:
6733       if (treg == 0)
6734         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
6735       else if (sreg == 0)
6736         macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, treg);
6737       else
6738         {
6739           used_at = 1;
6740           macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
6741           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6742                                    &offset_expr, AT, ZERO);
6743         }
6744       break;
6745
6746     case M_BLTUL:
6747       likely = 1;
6748     case M_BLTU:
6749       if (treg == 0)
6750         goto do_false;
6751       else if (sreg == 0)
6752         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6753                                  &offset_expr, ZERO, treg);
6754       else
6755         {
6756           used_at = 1;
6757           macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
6758           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6759                                    &offset_expr, AT, ZERO);
6760         }
6761       break;
6762
6763     case M_DEXT:
6764       {
6765         /* Use unsigned arithmetic.  */
6766         addressT pos;
6767         addressT size;
6768
6769         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
6770           {
6771             as_bad (_("Unsupported large constant"));
6772             pos = size = 1;
6773           }
6774         else
6775           {
6776             pos = imm_expr.X_add_number;
6777             size = imm2_expr.X_add_number;
6778           }
6779
6780         if (pos > 63)
6781           {
6782             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
6783             pos = 1;
6784           }
6785         if (size == 0 || size > 64 || (pos + size - 1) > 63)
6786           {
6787             as_bad (_("Improper extract size (%lu, position %lu)"),
6788                     (unsigned long) size, (unsigned long) pos);
6789             size = 1;
6790           }
6791
6792         if (size <= 32 && pos < 32)
6793           {
6794             s = "dext";
6795             fmt = "t,r,+A,+C";
6796           }
6797         else if (size <= 32)
6798           {
6799             s = "dextu";
6800             fmt = "t,r,+E,+H";
6801           }
6802         else
6803           {
6804             s = "dextm";
6805             fmt = "t,r,+A,+G";
6806           }
6807         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
6808                      (int) (size - 1));
6809       }
6810       break;
6811
6812     case M_DINS:
6813       {
6814         /* Use unsigned arithmetic.  */
6815         addressT pos;
6816         addressT size;
6817
6818         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
6819           {
6820             as_bad (_("Unsupported large constant"));
6821             pos = size = 1;
6822           }
6823         else
6824           {
6825             pos = imm_expr.X_add_number;
6826             size = imm2_expr.X_add_number;
6827           }
6828
6829         if (pos > 63)
6830           {
6831             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
6832             pos = 1;
6833           }
6834         if (size == 0 || size > 64 || (pos + size - 1) > 63)
6835           {
6836             as_bad (_("Improper insert size (%lu, position %lu)"),
6837                     (unsigned long) size, (unsigned long) pos);
6838             size = 1;
6839           }
6840
6841         if (pos < 32 && (pos + size - 1) < 32)
6842           {
6843             s = "dins";
6844             fmt = "t,r,+A,+B";
6845           }
6846         else if (pos >= 32)
6847           {
6848             s = "dinsu";
6849             fmt = "t,r,+E,+F";
6850           }
6851         else
6852           {
6853             s = "dinsm";
6854             fmt = "t,r,+A,+F";
6855           }
6856         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
6857                      (int) (pos + size - 1));
6858       }
6859       break;
6860
6861     case M_DDIV_3:
6862       dbl = 1;
6863     case M_DIV_3:
6864       s = "mflo";
6865       goto do_div3;
6866     case M_DREM_3:
6867       dbl = 1;
6868     case M_REM_3:
6869       s = "mfhi";
6870     do_div3:
6871       if (treg == 0)
6872         {
6873           as_warn (_("Divide by zero."));
6874           if (mips_trap)
6875             macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
6876           else
6877             macro_build (NULL, "break", BRK_FMT, 7);
6878           break;
6879         }
6880
6881       start_noreorder ();
6882       if (mips_trap)
6883         {
6884           macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
6885           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
6886         }
6887       else
6888         {
6889           if (mips_opts.micromips)
6890             micromips_label_expr (&label_expr);
6891           else
6892             label_expr.X_add_number = 8;
6893           macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
6894           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
6895           macro_build (NULL, "break", BRK_FMT, 7);
6896           if (mips_opts.micromips)
6897             micromips_add_label ();
6898         }
6899       expr1.X_add_number = -1;
6900       used_at = 1;
6901       load_register (AT, &expr1, dbl);
6902       if (mips_opts.micromips)
6903         micromips_label_expr (&label_expr);
6904       else
6905         label_expr.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
6906       macro_build (&label_expr, "bne", "s,t,p", treg, AT);
6907       if (dbl)
6908         {
6909           expr1.X_add_number = 1;
6910           load_register (AT, &expr1, dbl);
6911           macro_build (NULL, "dsll32", SHFT_FMT, AT, AT, 31);
6912         }
6913       else
6914         {
6915           expr1.X_add_number = 0x80000000;
6916           macro_build (&expr1, "lui", LUI_FMT, AT, BFD_RELOC_HI16);
6917         }
6918       if (mips_trap)
6919         {
6920           macro_build (NULL, "teq", TRAP_FMT, sreg, AT, 6);
6921           /* We want to close the noreorder block as soon as possible, so
6922              that later insns are available for delay slot filling.  */
6923           end_noreorder ();
6924         }
6925       else
6926         {
6927           if (mips_opts.micromips)
6928             micromips_label_expr (&label_expr);
6929           else
6930             label_expr.X_add_number = 8;
6931           macro_build (&label_expr, "bne", "s,t,p", sreg, AT);
6932           macro_build (NULL, "nop", "");
6933
6934           /* We want to close the noreorder block as soon as possible, so
6935              that later insns are available for delay slot filling.  */
6936           end_noreorder ();
6937
6938           macro_build (NULL, "break", BRK_FMT, 6);
6939         }
6940       if (mips_opts.micromips)
6941         micromips_add_label ();
6942       macro_build (NULL, s, MFHL_FMT, dreg);
6943       break;
6944
6945     case M_DIV_3I:
6946       s = "div";
6947       s2 = "mflo";
6948       goto do_divi;
6949     case M_DIVU_3I:
6950       s = "divu";
6951       s2 = "mflo";
6952       goto do_divi;
6953     case M_REM_3I:
6954       s = "div";
6955       s2 = "mfhi";
6956       goto do_divi;
6957     case M_REMU_3I:
6958       s = "divu";
6959       s2 = "mfhi";
6960       goto do_divi;
6961     case M_DDIV_3I:
6962       dbl = 1;
6963       s = "ddiv";
6964       s2 = "mflo";
6965       goto do_divi;
6966     case M_DDIVU_3I:
6967       dbl = 1;
6968       s = "ddivu";
6969       s2 = "mflo";
6970       goto do_divi;
6971     case M_DREM_3I:
6972       dbl = 1;
6973       s = "ddiv";
6974       s2 = "mfhi";
6975       goto do_divi;
6976     case M_DREMU_3I:
6977       dbl = 1;
6978       s = "ddivu";
6979       s2 = "mfhi";
6980     do_divi:
6981       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6982         {
6983           as_warn (_("Divide by zero."));
6984           if (mips_trap)
6985             macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
6986           else
6987             macro_build (NULL, "break", BRK_FMT, 7);
6988           break;
6989         }
6990       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6991         {
6992           if (strcmp (s2, "mflo") == 0)
6993             move_register (dreg, sreg);
6994           else
6995             move_register (dreg, ZERO);
6996           break;
6997         }
6998       if (imm_expr.X_op == O_constant
6999           && imm_expr.X_add_number == -1
7000           && s[strlen (s) - 1] != 'u')
7001         {
7002           if (strcmp (s2, "mflo") == 0)
7003             {
7004               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
7005             }
7006           else
7007             move_register (dreg, ZERO);
7008           break;
7009         }
7010
7011       used_at = 1;
7012       load_register (AT, &imm_expr, dbl);
7013       macro_build (NULL, s, "z,s,t", sreg, AT);
7014       macro_build (NULL, s2, MFHL_FMT, dreg);
7015       break;
7016
7017     case M_DIVU_3:
7018       s = "divu";
7019       s2 = "mflo";
7020       goto do_divu3;
7021     case M_REMU_3:
7022       s = "divu";
7023       s2 = "mfhi";
7024       goto do_divu3;
7025     case M_DDIVU_3:
7026       s = "ddivu";
7027       s2 = "mflo";
7028       goto do_divu3;
7029     case M_DREMU_3:
7030       s = "ddivu";
7031       s2 = "mfhi";
7032     do_divu3:
7033       start_noreorder ();
7034       if (mips_trap)
7035         {
7036           macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
7037           macro_build (NULL, s, "z,s,t", sreg, treg);
7038           /* We want to close the noreorder block as soon as possible, so
7039              that later insns are available for delay slot filling.  */
7040           end_noreorder ();
7041         }
7042       else
7043         {
7044           if (mips_opts.micromips)
7045             micromips_label_expr (&label_expr);
7046           else
7047             label_expr.X_add_number = 8;
7048           macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
7049           macro_build (NULL, s, "z,s,t", sreg, treg);
7050
7051           /* We want to close the noreorder block as soon as possible, so
7052              that later insns are available for delay slot filling.  */
7053           end_noreorder ();
7054           macro_build (NULL, "break", BRK_FMT, 7);
7055           if (mips_opts.micromips)
7056             micromips_add_label ();
7057         }
7058       macro_build (NULL, s2, MFHL_FMT, dreg);
7059       break;
7060
7061     case M_DLCA_AB:
7062       dbl = 1;
7063     case M_LCA_AB:
7064       call = 1;
7065       goto do_la;
7066     case M_DLA_AB:
7067       dbl = 1;
7068     case M_LA_AB:
7069     do_la:
7070       /* Load the address of a symbol into a register.  If breg is not
7071          zero, we then add a base register to it.  */
7072
7073       if (dbl && HAVE_32BIT_GPRS)
7074         as_warn (_("dla used to load 32-bit register"));
7075
7076       if (!dbl && HAVE_64BIT_OBJECTS)
7077         as_warn (_("la used to load 64-bit address"));
7078
7079       if (offset_expr.X_op == O_constant
7080           && offset_expr.X_add_number >= -0x8000
7081           && offset_expr.X_add_number < 0x8000)
7082         {
7083           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
7084                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
7085           break;
7086         }
7087
7088       if (mips_opts.at && (treg == breg))
7089         {
7090           tempreg = AT;
7091           used_at = 1;
7092         }
7093       else
7094         {
7095           tempreg = treg;
7096         }
7097
7098       if (offset_expr.X_op != O_symbol
7099           && offset_expr.X_op != O_constant)
7100         {
7101           as_bad (_("Expression too complex"));
7102           offset_expr.X_op = O_constant;
7103         }
7104
7105       if (offset_expr.X_op == O_constant)
7106         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
7107       else if (mips_pic == NO_PIC)
7108         {
7109           /* If this is a reference to a GP relative symbol, we want
7110                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
7111              Otherwise we want
7112                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
7113                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7114              If we have a constant, we need two instructions anyhow,
7115              so we may as well always use the latter form.
7116
7117              With 64bit address space and a usable $at we want
7118                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
7119                lui      $at,<sym>               (BFD_RELOC_HI16_S)
7120                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
7121                daddiu   $at,<sym>               (BFD_RELOC_LO16)
7122                dsll32   $tempreg,0
7123                daddu    $tempreg,$tempreg,$at
7124
7125              If $at is already in use, we use a path which is suboptimal
7126              on superscalar processors.
7127                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
7128                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
7129                dsll     $tempreg,16
7130                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
7131                dsll     $tempreg,16
7132                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
7133
7134              For GP relative symbols in 64bit address space we can use
7135              the same sequence as in 32bit address space.  */
7136           if (HAVE_64BIT_SYMBOLS)
7137             {
7138               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7139                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7140                 {
7141                   relax_start (offset_expr.X_add_symbol);
7142                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7143                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7144                   relax_switch ();
7145                 }
7146
7147               if (used_at == 0 && mips_opts.at)
7148                 {
7149                   macro_build (&offset_expr, "lui", LUI_FMT,
7150                                tempreg, BFD_RELOC_MIPS_HIGHEST);
7151                   macro_build (&offset_expr, "lui", LUI_FMT,
7152                                AT, BFD_RELOC_HI16_S);
7153                   macro_build (&offset_expr, "daddiu", "t,r,j",
7154                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7155                   macro_build (&offset_expr, "daddiu", "t,r,j",
7156                                AT, AT, BFD_RELOC_LO16);
7157                   macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
7158                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
7159                   used_at = 1;
7160                 }
7161               else
7162                 {
7163                   macro_build (&offset_expr, "lui", LUI_FMT,
7164                                tempreg, BFD_RELOC_MIPS_HIGHEST);
7165                   macro_build (&offset_expr, "daddiu", "t,r,j",
7166                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7167                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7168                   macro_build (&offset_expr, "daddiu", "t,r,j",
7169                                tempreg, tempreg, BFD_RELOC_HI16_S);
7170                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7171                   macro_build (&offset_expr, "daddiu", "t,r,j",
7172                                tempreg, tempreg, BFD_RELOC_LO16);
7173                 }
7174
7175               if (mips_relax.sequence)
7176                 relax_end ();
7177             }
7178           else
7179             {
7180               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7181                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7182                 {
7183                   relax_start (offset_expr.X_add_symbol);
7184                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7185                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7186                   relax_switch ();
7187                 }
7188               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7189                 as_bad (_("Offset too large"));
7190               macro_build_lui (&offset_expr, tempreg);
7191               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7192                            tempreg, tempreg, BFD_RELOC_LO16);
7193               if (mips_relax.sequence)
7194                 relax_end ();
7195             }
7196         }
7197       else if (!mips_big_got && !HAVE_NEWABI)
7198         {
7199           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7200
7201           /* If this is a reference to an external symbol, and there
7202              is no constant, we want
7203                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7204              or for lca or if tempreg is PIC_CALL_REG
7205                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
7206              For a local symbol, we want
7207                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7208                nop
7209                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7210
7211              If we have a small constant, and this is a reference to
7212              an external symbol, we want
7213                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7214                nop
7215                addiu    $tempreg,$tempreg,<constant>
7216              For a local symbol, we want the same instruction
7217              sequence, but we output a BFD_RELOC_LO16 reloc on the
7218              addiu instruction.
7219
7220              If we have a large constant, and this is a reference to
7221              an external symbol, we want
7222                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7223                lui      $at,<hiconstant>
7224                addiu    $at,$at,<loconstant>
7225                addu     $tempreg,$tempreg,$at
7226              For a local symbol, we want the same instruction
7227              sequence, but we output a BFD_RELOC_LO16 reloc on the
7228              addiu instruction.
7229            */
7230
7231           if (offset_expr.X_add_number == 0)
7232             {
7233               if (mips_pic == SVR4_PIC
7234                   && breg == 0
7235                   && (call || tempreg == PIC_CALL_REG))
7236                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
7237
7238               relax_start (offset_expr.X_add_symbol);
7239               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7240                            lw_reloc_type, mips_gp_register);
7241               if (breg != 0)
7242                 {
7243                   /* We're going to put in an addu instruction using
7244                      tempreg, so we may as well insert the nop right
7245                      now.  */
7246                   load_delay_nop ();
7247                 }
7248               relax_switch ();
7249               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7250                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
7251               load_delay_nop ();
7252               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7253                            tempreg, tempreg, BFD_RELOC_LO16);
7254               relax_end ();
7255               /* FIXME: If breg == 0, and the next instruction uses
7256                  $tempreg, then if this variant case is used an extra
7257                  nop will be generated.  */
7258             }
7259           else if (offset_expr.X_add_number >= -0x8000
7260                    && offset_expr.X_add_number < 0x8000)
7261             {
7262               load_got_offset (tempreg, &offset_expr);
7263               load_delay_nop ();
7264               add_got_offset (tempreg, &offset_expr);
7265             }
7266           else
7267             {
7268               expr1.X_add_number = offset_expr.X_add_number;
7269               offset_expr.X_add_number =
7270                 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
7271               load_got_offset (tempreg, &offset_expr);
7272               offset_expr.X_add_number = expr1.X_add_number;
7273               /* If we are going to add in a base register, and the
7274                  target register and the base register are the same,
7275                  then we are using AT as a temporary register.  Since
7276                  we want to load the constant into AT, we add our
7277                  current AT (from the global offset table) and the
7278                  register into the register now, and pretend we were
7279                  not using a base register.  */
7280               if (breg == treg)
7281                 {
7282                   load_delay_nop ();
7283                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7284                                treg, AT, breg);
7285                   breg = 0;
7286                   tempreg = treg;
7287                 }
7288               add_got_offset_hilo (tempreg, &offset_expr, AT);
7289               used_at = 1;
7290             }
7291         }
7292       else if (!mips_big_got && HAVE_NEWABI)
7293         {
7294           int add_breg_early = 0;
7295
7296           /* If this is a reference to an external, and there is no
7297              constant, or local symbol (*), with or without a
7298              constant, we want
7299                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7300              or for lca or if tempreg is PIC_CALL_REG
7301                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
7302
7303              If we have a small constant, and this is a reference to
7304              an external symbol, we want
7305                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7306                addiu    $tempreg,$tempreg,<constant>
7307
7308              If we have a large constant, and this is a reference to
7309              an external symbol, we want
7310                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7311                lui      $at,<hiconstant>
7312                addiu    $at,$at,<loconstant>
7313                addu     $tempreg,$tempreg,$at
7314
7315              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
7316              local symbols, even though it introduces an additional
7317              instruction.  */
7318
7319           if (offset_expr.X_add_number)
7320             {
7321               expr1.X_add_number = offset_expr.X_add_number;
7322               offset_expr.X_add_number = 0;
7323
7324               relax_start (offset_expr.X_add_symbol);
7325               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7326                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7327
7328               if (expr1.X_add_number >= -0x8000
7329                   && expr1.X_add_number < 0x8000)
7330                 {
7331                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7332                                tempreg, tempreg, BFD_RELOC_LO16);
7333                 }
7334               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
7335                 {
7336                   /* If we are going to add in a base register, and the
7337                      target register and the base register are the same,
7338                      then we are using AT as a temporary register.  Since
7339                      we want to load the constant into AT, we add our
7340                      current AT (from the global offset table) and the
7341                      register into the register now, and pretend we were
7342                      not using a base register.  */
7343                   if (breg != treg)
7344                     dreg = tempreg;
7345                   else
7346                     {
7347                       gas_assert (tempreg == AT);
7348                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7349                                    treg, AT, breg);
7350                       dreg = treg;
7351                       add_breg_early = 1;
7352                     }
7353
7354                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7355                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7356                                dreg, dreg, AT);
7357
7358                   used_at = 1;
7359                 }
7360               else
7361                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
7362
7363               relax_switch ();
7364               offset_expr.X_add_number = expr1.X_add_number;
7365
7366               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7367                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7368               if (add_breg_early)
7369                 {
7370                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7371                                treg, tempreg, breg);
7372                   breg = 0;
7373                   tempreg = treg;
7374                 }
7375               relax_end ();
7376             }
7377           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
7378             {
7379               relax_start (offset_expr.X_add_symbol);
7380               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7381                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
7382               relax_switch ();
7383               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7384                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7385               relax_end ();
7386             }
7387           else
7388             {
7389               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7390                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7391             }
7392         }
7393       else if (mips_big_got && !HAVE_NEWABI)
7394         {
7395           int gpdelay;
7396           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7397           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7398           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7399
7400           /* This is the large GOT case.  If this is a reference to an
7401              external symbol, and there is no constant, we want
7402                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7403                addu     $tempreg,$tempreg,$gp
7404                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7405              or for lca or if tempreg is PIC_CALL_REG
7406                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
7407                addu     $tempreg,$tempreg,$gp
7408                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
7409              For a local symbol, we want
7410                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7411                nop
7412                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7413
7414              If we have a small constant, and this is a reference to
7415              an external symbol, we want
7416                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7417                addu     $tempreg,$tempreg,$gp
7418                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7419                nop
7420                addiu    $tempreg,$tempreg,<constant>
7421              For a local symbol, we want
7422                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7423                nop
7424                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
7425
7426              If we have a large constant, and this is a reference to
7427              an external symbol, we want
7428                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7429                addu     $tempreg,$tempreg,$gp
7430                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7431                lui      $at,<hiconstant>
7432                addiu    $at,$at,<loconstant>
7433                addu     $tempreg,$tempreg,$at
7434              For a local symbol, we want
7435                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7436                lui      $at,<hiconstant>
7437                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
7438                addu     $tempreg,$tempreg,$at
7439           */
7440
7441           expr1.X_add_number = offset_expr.X_add_number;
7442           offset_expr.X_add_number = 0;
7443           relax_start (offset_expr.X_add_symbol);
7444           gpdelay = reg_needs_delay (mips_gp_register);
7445           if (expr1.X_add_number == 0 && breg == 0
7446               && (call || tempreg == PIC_CALL_REG))
7447             {
7448               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
7449               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
7450             }
7451           macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
7452           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7453                        tempreg, tempreg, mips_gp_register);
7454           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7455                        tempreg, lw_reloc_type, tempreg);
7456           if (expr1.X_add_number == 0)
7457             {
7458               if (breg != 0)
7459                 {
7460                   /* We're going to put in an addu instruction using
7461                      tempreg, so we may as well insert the nop right
7462                      now.  */
7463                   load_delay_nop ();
7464                 }
7465             }
7466           else if (expr1.X_add_number >= -0x8000
7467                    && expr1.X_add_number < 0x8000)
7468             {
7469               load_delay_nop ();
7470               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7471                            tempreg, tempreg, BFD_RELOC_LO16);
7472             }
7473           else
7474             {
7475               /* If we are going to add in a base register, and the
7476                  target register and the base register are the same,
7477                  then we are using AT as a temporary register.  Since
7478                  we want to load the constant into AT, we add our
7479                  current AT (from the global offset table) and the
7480                  register into the register now, and pretend we were
7481                  not using a base register.  */
7482               if (breg != treg)
7483                 dreg = tempreg;
7484               else
7485                 {
7486                   gas_assert (tempreg == AT);
7487                   load_delay_nop ();
7488                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7489                                treg, AT, breg);
7490                   dreg = treg;
7491                 }
7492
7493               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7494               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
7495
7496               used_at = 1;
7497             }
7498           offset_expr.X_add_number =
7499             ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
7500           relax_switch ();
7501
7502           if (gpdelay)
7503             {
7504               /* This is needed because this instruction uses $gp, but
7505                  the first instruction on the main stream does not.  */
7506               macro_build (NULL, "nop", "");
7507             }
7508
7509           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7510                        local_reloc_type, mips_gp_register);
7511           if (expr1.X_add_number >= -0x8000
7512               && expr1.X_add_number < 0x8000)
7513             {
7514               load_delay_nop ();
7515               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7516                            tempreg, tempreg, BFD_RELOC_LO16);
7517               /* FIXME: If add_number is 0, and there was no base
7518                  register, the external symbol case ended with a load,
7519                  so if the symbol turns out to not be external, and
7520                  the next instruction uses tempreg, an unnecessary nop
7521                  will be inserted.  */
7522             }
7523           else
7524             {
7525               if (breg == treg)
7526                 {
7527                   /* We must add in the base register now, as in the
7528                      external symbol case.  */
7529                   gas_assert (tempreg == AT);
7530                   load_delay_nop ();
7531                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7532                                treg, AT, breg);
7533                   tempreg = treg;
7534                   /* We set breg to 0 because we have arranged to add
7535                      it in in both cases.  */
7536                   breg = 0;
7537                 }
7538
7539               macro_build_lui (&expr1, AT);
7540               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7541                            AT, AT, BFD_RELOC_LO16);
7542               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7543                            tempreg, tempreg, AT);
7544               used_at = 1;
7545             }
7546           relax_end ();
7547         }
7548       else if (mips_big_got && HAVE_NEWABI)
7549         {
7550           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7551           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7552           int add_breg_early = 0;
7553
7554           /* This is the large GOT case.  If this is a reference to an
7555              external symbol, and there is no constant, we want
7556                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7557                add      $tempreg,$tempreg,$gp
7558                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7559              or for lca or if tempreg is PIC_CALL_REG
7560                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
7561                add      $tempreg,$tempreg,$gp
7562                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
7563
7564              If we have a small constant, and this is a reference to
7565              an external symbol, we want
7566                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7567                add      $tempreg,$tempreg,$gp
7568                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7569                addi     $tempreg,$tempreg,<constant>
7570
7571              If we have a large constant, and this is a reference to
7572              an external symbol, we want
7573                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7574                addu     $tempreg,$tempreg,$gp
7575                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7576                lui      $at,<hiconstant>
7577                addi     $at,$at,<loconstant>
7578                add      $tempreg,$tempreg,$at
7579
7580              If we have NewABI, and we know it's a local symbol, we want
7581                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
7582                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
7583              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
7584
7585           relax_start (offset_expr.X_add_symbol);
7586
7587           expr1.X_add_number = offset_expr.X_add_number;
7588           offset_expr.X_add_number = 0;
7589
7590           if (expr1.X_add_number == 0 && breg == 0
7591               && (call || tempreg == PIC_CALL_REG))
7592             {
7593               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
7594               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
7595             }
7596           macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
7597           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7598                        tempreg, tempreg, mips_gp_register);
7599           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7600                        tempreg, lw_reloc_type, tempreg);
7601
7602           if (expr1.X_add_number == 0)
7603             ;
7604           else if (expr1.X_add_number >= -0x8000
7605                    && expr1.X_add_number < 0x8000)
7606             {
7607               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7608                            tempreg, tempreg, BFD_RELOC_LO16);
7609             }
7610           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
7611             {
7612               /* If we are going to add in a base register, and the
7613                  target register and the base register are the same,
7614                  then we are using AT as a temporary register.  Since
7615                  we want to load the constant into AT, we add our
7616                  current AT (from the global offset table) and the
7617                  register into the register now, and pretend we were
7618                  not using a base register.  */
7619               if (breg != treg)
7620                 dreg = tempreg;
7621               else
7622                 {
7623                   gas_assert (tempreg == AT);
7624                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7625                                treg, AT, breg);
7626                   dreg = treg;
7627                   add_breg_early = 1;
7628                 }
7629
7630               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7631               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
7632
7633               used_at = 1;
7634             }
7635           else
7636             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
7637
7638           relax_switch ();
7639           offset_expr.X_add_number = expr1.X_add_number;
7640           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7641                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
7642           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
7643                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
7644           if (add_breg_early)
7645             {
7646               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7647                            treg, tempreg, breg);
7648               breg = 0;
7649               tempreg = treg;
7650             }
7651           relax_end ();
7652         }
7653       else
7654         abort ();
7655
7656       if (breg != 0)
7657         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
7658       break;
7659
7660     case M_MSGSND:
7661       gas_assert (!mips_opts.micromips);
7662       {
7663         unsigned long temp = (treg << 16) | (0x01);
7664         macro_build (NULL, "c2", "C", temp);
7665       }
7666       break;
7667
7668     case M_MSGLD:
7669       gas_assert (!mips_opts.micromips);
7670       {
7671         unsigned long temp = (0x02);
7672         macro_build (NULL, "c2", "C", temp);
7673       }
7674       break;
7675
7676     case M_MSGLD_T:
7677       gas_assert (!mips_opts.micromips);
7678       {
7679         unsigned long temp = (treg << 16) | (0x02);
7680         macro_build (NULL, "c2", "C", temp);
7681       }
7682       break;
7683
7684     case M_MSGWAIT:
7685       gas_assert (!mips_opts.micromips);
7686       macro_build (NULL, "c2", "C", 3);
7687       break;
7688
7689     case M_MSGWAIT_T:
7690       gas_assert (!mips_opts.micromips);
7691       {
7692         unsigned long temp = (treg << 16) | 0x03;
7693         macro_build (NULL, "c2", "C", temp);
7694       }
7695       break;
7696
7697     case M_J_A:
7698       /* The j instruction may not be used in PIC code, since it
7699          requires an absolute address.  We convert it to a b
7700          instruction.  */
7701       if (mips_pic == NO_PIC)
7702         macro_build (&offset_expr, "j", "a");
7703       else
7704         macro_build (&offset_expr, "b", "p");
7705       break;
7706
7707       /* The jal instructions must be handled as macros because when
7708          generating PIC code they expand to multi-instruction
7709          sequences.  Normally they are simple instructions.  */
7710     case M_JALS_1:
7711       dreg = RA;
7712       /* Fall through.  */
7713     case M_JALS_2:
7714       gas_assert (mips_opts.micromips);
7715       jals = 1;
7716       goto jal;
7717     case M_JAL_1:
7718       dreg = RA;
7719       /* Fall through.  */
7720     case M_JAL_2:
7721     jal:
7722       if (mips_pic == NO_PIC)
7723         {
7724           s = jals ? "jalrs" : "jalr";
7725           if (mips_opts.micromips && dreg == RA)
7726             macro_build (NULL, s, "mj", sreg);
7727           else
7728             macro_build (NULL, s, JALR_FMT, dreg, sreg);
7729         }
7730       else
7731         {
7732           int cprestore = (mips_pic == SVR4_PIC && !HAVE_NEWABI
7733                            && mips_cprestore_offset >= 0);
7734
7735           if (sreg != PIC_CALL_REG)
7736             as_warn (_("MIPS PIC call to register other than $25"));
7737
7738           s = (mips_opts.micromips && (!mips_opts.noreorder || cprestore)
7739                ? "jalrs" : "jalr");
7740           if (mips_opts.micromips && dreg == RA)
7741             macro_build (NULL, s, "mj", sreg);
7742           else
7743             macro_build (NULL, s, JALR_FMT, dreg, sreg);
7744           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
7745             {
7746               if (mips_cprestore_offset < 0)
7747                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
7748               else
7749                 {
7750                   if (!mips_frame_reg_valid)
7751                     {
7752                       as_warn (_("No .frame pseudo-op used in PIC code"));
7753                       /* Quiet this warning.  */
7754                       mips_frame_reg_valid = 1;
7755                     }
7756                   if (!mips_cprestore_valid)
7757                     {
7758                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
7759                       /* Quiet this warning.  */
7760                       mips_cprestore_valid = 1;
7761                     }
7762                   if (mips_opts.noreorder)
7763                     macro_build (NULL, "nop", "");
7764                   expr1.X_add_number = mips_cprestore_offset;
7765                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
7766                                                 mips_gp_register,
7767                                                 mips_frame_reg,
7768                                                 HAVE_64BIT_ADDRESSES);
7769                 }
7770             }
7771         }
7772
7773       break;
7774
7775     case M_JALS_A:
7776       gas_assert (mips_opts.micromips);
7777       jals = 1;
7778       /* Fall through.  */
7779     case M_JAL_A:
7780       if (mips_pic == NO_PIC)
7781         macro_build (&offset_expr, jals ? "jals" : "jal", "a");
7782       else if (mips_pic == SVR4_PIC)
7783         {
7784           /* If this is a reference to an external symbol, and we are
7785              using a small GOT, we want
7786                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
7787                nop
7788                jalr     $ra,$25
7789                nop
7790                lw       $gp,cprestore($sp)
7791              The cprestore value is set using the .cprestore
7792              pseudo-op.  If we are using a big GOT, we want
7793                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
7794                addu     $25,$25,$gp
7795                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
7796                nop
7797                jalr     $ra,$25
7798                nop
7799                lw       $gp,cprestore($sp)
7800              If the symbol is not external, we want
7801                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7802                nop
7803                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
7804                jalr     $ra,$25
7805                nop
7806                lw $gp,cprestore($sp)
7807
7808              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
7809              sequences above, minus nops, unless the symbol is local,
7810              which enables us to use GOT_PAGE/GOT_OFST (big got) or
7811              GOT_DISP.  */
7812           if (HAVE_NEWABI)
7813             {
7814               if (!mips_big_got)
7815                 {
7816                   relax_start (offset_expr.X_add_symbol);
7817                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7818                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
7819                                mips_gp_register);
7820                   relax_switch ();
7821                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7822                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
7823                                mips_gp_register);
7824                   relax_end ();
7825                 }
7826               else
7827                 {
7828                   relax_start (offset_expr.X_add_symbol);
7829                   macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
7830                                BFD_RELOC_MIPS_CALL_HI16);
7831                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
7832                                PIC_CALL_REG, mips_gp_register);
7833                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7834                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
7835                                PIC_CALL_REG);
7836                   relax_switch ();
7837                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7838                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
7839                                mips_gp_register);
7840                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7841                                PIC_CALL_REG, PIC_CALL_REG,
7842                                BFD_RELOC_MIPS_GOT_OFST);
7843                   relax_end ();
7844                 }
7845
7846               macro_build_jalr (&offset_expr, 0);
7847             }
7848           else
7849             {
7850               relax_start (offset_expr.X_add_symbol);
7851               if (!mips_big_got)
7852                 {
7853                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7854                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
7855                                mips_gp_register);
7856                   load_delay_nop ();
7857                   relax_switch ();
7858                 }
7859               else
7860                 {
7861                   int gpdelay;
7862
7863                   gpdelay = reg_needs_delay (mips_gp_register);
7864                   macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
7865                                BFD_RELOC_MIPS_CALL_HI16);
7866                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
7867                                PIC_CALL_REG, mips_gp_register);
7868                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7869                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
7870                                PIC_CALL_REG);
7871                   load_delay_nop ();
7872                   relax_switch ();
7873                   if (gpdelay)
7874                     macro_build (NULL, "nop", "");
7875                 }
7876               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7877                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
7878                            mips_gp_register);
7879               load_delay_nop ();
7880               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7881                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
7882               relax_end ();
7883               macro_build_jalr (&offset_expr, mips_cprestore_offset >= 0);
7884
7885               if (mips_cprestore_offset < 0)
7886                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
7887               else
7888                 {
7889                   if (!mips_frame_reg_valid)
7890                     {
7891                       as_warn (_("No .frame pseudo-op used in PIC code"));
7892                       /* Quiet this warning.  */
7893                       mips_frame_reg_valid = 1;
7894                     }
7895                   if (!mips_cprestore_valid)
7896                     {
7897                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
7898                       /* Quiet this warning.  */
7899                       mips_cprestore_valid = 1;
7900                     }
7901                   if (mips_opts.noreorder)
7902                     macro_build (NULL, "nop", "");
7903                   expr1.X_add_number = mips_cprestore_offset;
7904                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
7905                                                 mips_gp_register,
7906                                                 mips_frame_reg,
7907                                                 HAVE_64BIT_ADDRESSES);
7908                 }
7909             }
7910         }
7911       else if (mips_pic == VXWORKS_PIC)
7912         as_bad (_("Non-PIC jump used in PIC library"));
7913       else
7914         abort ();
7915
7916       break;
7917
7918     case M_ACLR_AB:
7919       ab = 1;
7920     case M_ACLR_OB:
7921       s = "aclr";
7922       treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
7923       fmt = "\\,~(b)";
7924       off12 = 1;
7925       goto ld_st;
7926     case M_ASET_AB:
7927       ab = 1;
7928     case M_ASET_OB:
7929       s = "aset";
7930       treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
7931       fmt = "\\,~(b)";
7932       off12 = 1;
7933       goto ld_st;
7934     case M_LB_AB:
7935       ab = 1;
7936       s = "lb";
7937       fmt = "t,o(b)";
7938       goto ld;
7939     case M_LBU_AB:
7940       ab = 1;
7941       s = "lbu";
7942       fmt = "t,o(b)";
7943       goto ld;
7944     case M_LH_AB:
7945       ab = 1;
7946       s = "lh";
7947       fmt = "t,o(b)";
7948       goto ld;
7949     case M_LHU_AB:
7950       ab = 1;
7951       s = "lhu";
7952       fmt = "t,o(b)";
7953       goto ld;
7954     case M_LW_AB:
7955       ab = 1;
7956       s = "lw";
7957       fmt = "t,o(b)";
7958       goto ld;
7959     case M_LWC0_AB:
7960       ab = 1;
7961       gas_assert (!mips_opts.micromips);
7962       s = "lwc0";
7963       fmt = "E,o(b)";
7964       /* Itbl support may require additional care here.  */
7965       coproc = 1;
7966       goto ld_st;
7967     case M_LWC1_AB:
7968       ab = 1;
7969       s = "lwc1";
7970       fmt = "T,o(b)";
7971       /* Itbl support may require additional care here.  */
7972       coproc = 1;
7973       goto ld_st;
7974     case M_LWC2_AB:
7975       ab = 1;
7976     case M_LWC2_OB:
7977       s = "lwc2";
7978       fmt = COP12_FMT;
7979       off12 = mips_opts.micromips;
7980       /* Itbl support may require additional care here.  */
7981       coproc = 1;
7982       goto ld_st;
7983     case M_LWC3_AB:
7984       ab = 1;
7985       gas_assert (!mips_opts.micromips);
7986       s = "lwc3";
7987       fmt = "E,o(b)";
7988       /* Itbl support may require additional care here.  */
7989       coproc = 1;
7990       goto ld_st;
7991     case M_LWL_AB:
7992       ab = 1;
7993     case M_LWL_OB:
7994       s = "lwl";
7995       fmt = MEM12_FMT;
7996       off12 = mips_opts.micromips;
7997       goto ld_st;
7998     case M_LWR_AB:
7999       ab = 1;
8000     case M_LWR_OB:
8001       s = "lwr";
8002       fmt = MEM12_FMT;
8003       off12 = mips_opts.micromips;
8004       goto ld_st;
8005     case M_LDC1_AB:
8006       ab = 1;
8007       s = "ldc1";
8008       fmt = "T,o(b)";
8009       /* Itbl support may require additional care here.  */
8010       coproc = 1;
8011       goto ld_st;
8012     case M_LDC2_AB:
8013       ab = 1;
8014     case M_LDC2_OB:
8015       s = "ldc2";
8016       fmt = COP12_FMT;
8017       off12 = mips_opts.micromips;
8018       /* Itbl support may require additional care here.  */
8019       coproc = 1;
8020       goto ld_st;
8021     case M_LDC3_AB:
8022       ab = 1;
8023       s = "ldc3";
8024       fmt = "E,o(b)";
8025       /* Itbl support may require additional care here.  */
8026       coproc = 1;
8027       goto ld_st;
8028     case M_LDL_AB:
8029       ab = 1;
8030     case M_LDL_OB:
8031       s = "ldl";
8032       fmt = MEM12_FMT;
8033       off12 = mips_opts.micromips;
8034       goto ld_st;
8035     case M_LDR_AB:
8036       ab = 1;
8037     case M_LDR_OB:
8038       s = "ldr";
8039       fmt = MEM12_FMT;
8040       off12 = mips_opts.micromips;
8041       goto ld_st;
8042     case M_LL_AB:
8043       ab = 1;
8044     case M_LL_OB:
8045       s = "ll";
8046       fmt = MEM12_FMT;
8047       off12 = mips_opts.micromips;
8048       goto ld;
8049     case M_LLD_AB:
8050       ab = 1;
8051     case M_LLD_OB:
8052       s = "lld";
8053       fmt = MEM12_FMT;
8054       off12 = mips_opts.micromips;
8055       goto ld;
8056     case M_LWU_AB:
8057       ab = 1;
8058     case M_LWU_OB:
8059       s = "lwu";
8060       fmt = MEM12_FMT;
8061       off12 = mips_opts.micromips;
8062       goto ld;
8063     case M_LWP_AB:
8064       ab = 1;
8065     case M_LWP_OB:
8066       gas_assert (mips_opts.micromips);
8067       s = "lwp";
8068       fmt = "t,~(b)";
8069       off12 = 1;
8070       lp = 1;
8071       goto ld;
8072     case M_LDP_AB:
8073       ab = 1;
8074     case M_LDP_OB:
8075       gas_assert (mips_opts.micromips);
8076       s = "ldp";
8077       fmt = "t,~(b)";
8078       off12 = 1;
8079       lp = 1;
8080       goto ld;
8081     case M_LWM_AB:
8082       ab = 1;
8083     case M_LWM_OB:
8084       gas_assert (mips_opts.micromips);
8085       s = "lwm";
8086       fmt = "n,~(b)";
8087       off12 = 1;
8088       goto ld_st;
8089     case M_LDM_AB:
8090       ab = 1;
8091     case M_LDM_OB:
8092       gas_assert (mips_opts.micromips);
8093       s = "ldm";
8094       fmt = "n,~(b)";
8095       off12 = 1;
8096       goto ld_st;
8097
8098     ld:
8099       if (breg == treg + lp)
8100         goto ld_st;
8101       else
8102         tempreg = treg + lp;
8103       goto ld_noat;
8104
8105     case M_SB_AB:
8106       ab = 1;
8107       s = "sb";
8108       fmt = "t,o(b)";
8109       goto ld_st;
8110     case M_SH_AB:
8111       ab = 1;
8112       s = "sh";
8113       fmt = "t,o(b)";
8114       goto ld_st;
8115     case M_SW_AB:
8116       ab = 1;
8117       s = "sw";
8118       fmt = "t,o(b)";
8119       goto ld_st;
8120     case M_SWC0_AB:
8121       ab = 1;
8122       gas_assert (!mips_opts.micromips);
8123       s = "swc0";
8124       fmt = "E,o(b)";
8125       /* Itbl support may require additional care here.  */
8126       coproc = 1;
8127       goto ld_st;
8128     case M_SWC1_AB:
8129       ab = 1;
8130       s = "swc1";
8131       fmt = "T,o(b)";
8132       /* Itbl support may require additional care here.  */
8133       coproc = 1;
8134       goto ld_st;
8135     case M_SWC2_AB:
8136       ab = 1;
8137     case M_SWC2_OB:
8138       s = "swc2";
8139       fmt = COP12_FMT;
8140       off12 = mips_opts.micromips;
8141       /* Itbl support may require additional care here.  */
8142       coproc = 1;
8143       goto ld_st;
8144     case M_SWC3_AB:
8145       ab = 1;
8146       gas_assert (!mips_opts.micromips);
8147       s = "swc3";
8148       fmt = "E,o(b)";
8149       /* Itbl support may require additional care here.  */
8150       coproc = 1;
8151       goto ld_st;
8152     case M_SWL_AB:
8153       ab = 1;
8154     case M_SWL_OB:
8155       s = "swl";
8156       fmt = MEM12_FMT;
8157       off12 = mips_opts.micromips;
8158       goto ld_st;
8159     case M_SWR_AB:
8160       ab = 1;
8161     case M_SWR_OB:
8162       s = "swr";
8163       fmt = MEM12_FMT;
8164       off12 = mips_opts.micromips;
8165       goto ld_st;
8166     case M_SC_AB:
8167       ab = 1;
8168     case M_SC_OB:
8169       s = "sc";
8170       fmt = MEM12_FMT;
8171       off12 = mips_opts.micromips;
8172       goto ld_st;
8173     case M_SCD_AB:
8174       ab = 1;
8175     case M_SCD_OB:
8176       s = "scd";
8177       fmt = MEM12_FMT;
8178       off12 = mips_opts.micromips;
8179       goto ld_st;
8180     case M_CACHE_AB:
8181       ab = 1;
8182     case M_CACHE_OB:
8183       s = "cache";
8184       fmt = mips_opts.micromips ? "k,~(b)" : "k,o(b)";
8185       off12 = mips_opts.micromips;
8186       goto ld_st;
8187     case M_PREF_AB:
8188       ab = 1;
8189     case M_PREF_OB:
8190       s = "pref";
8191       fmt = !mips_opts.micromips ? "k,o(b)" : "k,~(b)";
8192       off12 = mips_opts.micromips;
8193       goto ld_st;
8194     case M_SDC1_AB:
8195       ab = 1;
8196       s = "sdc1";
8197       fmt = "T,o(b)";
8198       coproc = 1;
8199       /* Itbl support may require additional care here.  */
8200       goto ld_st;
8201     case M_SDC2_AB:
8202       ab = 1;
8203     case M_SDC2_OB:
8204       s = "sdc2";
8205       fmt = COP12_FMT;
8206       off12 = mips_opts.micromips;
8207       /* Itbl support may require additional care here.  */
8208       coproc = 1;
8209       goto ld_st;
8210     case M_SDC3_AB:
8211       ab = 1;
8212       gas_assert (!mips_opts.micromips);
8213       s = "sdc3";
8214       fmt = "E,o(b)";
8215       /* Itbl support may require additional care here.  */
8216       coproc = 1;
8217       goto ld_st;
8218     case M_SDL_AB:
8219       ab = 1;
8220     case M_SDL_OB:
8221       s = "sdl";
8222       fmt = MEM12_FMT;
8223       off12 = mips_opts.micromips;
8224       goto ld_st;
8225     case M_SDR_AB:
8226       ab = 1;
8227     case M_SDR_OB:
8228       s = "sdr";
8229       fmt = MEM12_FMT;
8230       off12 = mips_opts.micromips;
8231       goto ld_st;
8232     case M_SWP_AB:
8233       ab = 1;
8234     case M_SWP_OB:
8235       gas_assert (mips_opts.micromips);
8236       s = "swp";
8237       fmt = "t,~(b)";
8238       off12 = 1;
8239       goto ld_st;
8240     case M_SDP_AB:
8241       ab = 1;
8242     case M_SDP_OB:
8243       gas_assert (mips_opts.micromips);
8244       s = "sdp";
8245       fmt = "t,~(b)";
8246       off12 = 1;
8247       goto ld_st;
8248     case M_SWM_AB:
8249       ab = 1;
8250     case M_SWM_OB:
8251       gas_assert (mips_opts.micromips);
8252       s = "swm";
8253       fmt = "n,~(b)";
8254       off12 = 1;
8255       goto ld_st;
8256     case M_SDM_AB:
8257       ab = 1;
8258     case M_SDM_OB:
8259       gas_assert (mips_opts.micromips);
8260       s = "sdm";
8261       fmt = "n,~(b)";
8262       off12 = 1;
8263
8264     ld_st:
8265       tempreg = AT;
8266       used_at = 1;
8267     ld_noat:
8268       if (coproc
8269           && NO_ISA_COP (mips_opts.arch)
8270           && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
8271         {
8272           as_bad (_("Opcode not supported on this processor: %s"),
8273                   mips_cpu_info_from_arch (mips_opts.arch)->name);
8274           break;
8275         }
8276
8277       if (offset_expr.X_op != O_constant
8278           && offset_expr.X_op != O_symbol)
8279         {
8280           as_bad (_("Expression too complex"));
8281           offset_expr.X_op = O_constant;
8282         }
8283
8284       if (HAVE_32BIT_ADDRESSES
8285           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
8286         {
8287           char value [32];
8288
8289           sprintf_vma (value, offset_expr.X_add_number);
8290           as_bad (_("Number (0x%s) larger than 32 bits"), value);
8291         }
8292
8293       /* A constant expression in PIC code can be handled just as it
8294          is in non PIC code.  */
8295       if (offset_expr.X_op == O_constant)
8296         {
8297           int hipart = 0;
8298
8299           expr1.X_add_number = offset_expr.X_add_number;
8300           normalize_address_expr (&expr1);
8301           if (!off12 && !IS_SEXT_16BIT_NUM (expr1.X_add_number))
8302             {
8303               expr1.X_add_number = ((expr1.X_add_number + 0x8000)
8304                                     & ~(bfd_vma) 0xffff);
8305               hipart = 1;
8306             }
8307           else if (off12 && !IS_SEXT_12BIT_NUM (expr1.X_add_number))
8308             {
8309               expr1.X_add_number = ((expr1.X_add_number + 0x800)
8310                                     & ~(bfd_vma) 0xfff);
8311               hipart = 1;
8312             }
8313           if (hipart)
8314             {
8315               load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
8316               if (breg != 0)
8317                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8318                              tempreg, tempreg, breg);
8319               breg = tempreg;
8320             }
8321           if (off0)
8322             {
8323               if (offset_expr.X_add_number == 0)
8324                 tempreg = breg;
8325               else
8326                 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
8327                              "t,r,j", tempreg, breg, BFD_RELOC_LO16);
8328               macro_build (NULL, s, fmt, treg, tempreg);
8329             }
8330           else if (!off12)
8331             macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
8332           else
8333             macro_build (NULL, s, fmt,
8334                          treg, (unsigned long) offset_expr.X_add_number, breg);
8335         }
8336       else if (off12 || off0)
8337         {
8338           /* A 12-bit or 0-bit offset field is too narrow to be used
8339              for a low-part relocation, so load the whole address into
8340              the auxillary register.  In the case of "A(b)" addresses,
8341              we first load absolute address "A" into the register and
8342              then add base register "b".  In the case of "o(b)" addresses,
8343              we simply need to add 16-bit offset "o" to base register "b", and
8344              offset_reloc already contains the relocations associated
8345              with "o".  */
8346           if (ab)
8347             {
8348               load_address (tempreg, &offset_expr, &used_at);
8349               if (breg != 0)
8350                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8351                              tempreg, tempreg, breg);
8352             }
8353           else
8354             macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8355                          tempreg, breg, -1,
8356                          offset_reloc[0], offset_reloc[1], offset_reloc[2]);
8357           expr1.X_add_number = 0;
8358           if (off0)
8359             macro_build (NULL, s, fmt, treg, tempreg);
8360           else
8361             macro_build (NULL, s, fmt,
8362                          treg, (unsigned long) expr1.X_add_number, tempreg);
8363         }
8364       else if (mips_pic == NO_PIC)
8365         {
8366           /* If this is a reference to a GP relative symbol, and there
8367              is no base register, we want
8368                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
8369              Otherwise, if there is no base register, we want
8370                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
8371                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8372              If we have a constant, we need two instructions anyhow,
8373              so we always use the latter form.
8374
8375              If we have a base register, and this is a reference to a
8376              GP relative symbol, we want
8377                addu     $tempreg,$breg,$gp
8378                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
8379              Otherwise we want
8380                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
8381                addu     $tempreg,$tempreg,$breg
8382                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8383              With a constant we always use the latter case.
8384
8385              With 64bit address space and no base register and $at usable,
8386              we want
8387                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8388                lui      $at,<sym>               (BFD_RELOC_HI16_S)
8389                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8390                dsll32   $tempreg,0
8391                daddu    $tempreg,$at
8392                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8393              If we have a base register, we want
8394                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8395                lui      $at,<sym>               (BFD_RELOC_HI16_S)
8396                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8397                daddu    $at,$breg
8398                dsll32   $tempreg,0
8399                daddu    $tempreg,$at
8400                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8401
8402              Without $at we can't generate the optimal path for superscalar
8403              processors here since this would require two temporary registers.
8404                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8405                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8406                dsll     $tempreg,16
8407                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
8408                dsll     $tempreg,16
8409                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8410              If we have a base register, we want
8411                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8412                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8413                dsll     $tempreg,16
8414                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
8415                dsll     $tempreg,16
8416                daddu    $tempreg,$tempreg,$breg
8417                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8418
8419              For GP relative symbols in 64bit address space we can use
8420              the same sequence as in 32bit address space.  */
8421           if (HAVE_64BIT_SYMBOLS)
8422             {
8423               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8424                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8425                 {
8426                   relax_start (offset_expr.X_add_symbol);
8427                   if (breg == 0)
8428                     {
8429                       macro_build (&offset_expr, s, fmt, treg,
8430                                    BFD_RELOC_GPREL16, mips_gp_register);
8431                     }
8432                   else
8433                     {
8434                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8435                                    tempreg, breg, mips_gp_register);
8436                       macro_build (&offset_expr, s, fmt, treg,
8437                                    BFD_RELOC_GPREL16, tempreg);
8438                     }
8439                   relax_switch ();
8440                 }
8441
8442               if (used_at == 0 && mips_opts.at)
8443                 {
8444                   macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8445                                BFD_RELOC_MIPS_HIGHEST);
8446                   macro_build (&offset_expr, "lui", LUI_FMT, AT,
8447                                BFD_RELOC_HI16_S);
8448                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8449                                tempreg, BFD_RELOC_MIPS_HIGHER);
8450                   if (breg != 0)
8451                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
8452                   macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
8453                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
8454                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
8455                                tempreg);
8456                   used_at = 1;
8457                 }
8458               else
8459                 {
8460                   macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8461                                BFD_RELOC_MIPS_HIGHEST);
8462                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8463                                tempreg, BFD_RELOC_MIPS_HIGHER);
8464                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
8465                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8466                                tempreg, BFD_RELOC_HI16_S);
8467                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
8468                   if (breg != 0)
8469                     macro_build (NULL, "daddu", "d,v,t",
8470                                  tempreg, tempreg, breg);
8471                   macro_build (&offset_expr, s, fmt, treg,
8472                                BFD_RELOC_LO16, tempreg);
8473                 }
8474
8475               if (mips_relax.sequence)
8476                 relax_end ();
8477               break;
8478             }
8479
8480           if (breg == 0)
8481             {
8482               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8483                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8484                 {
8485                   relax_start (offset_expr.X_add_symbol);
8486                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
8487                                mips_gp_register);
8488                   relax_switch ();
8489                 }
8490               macro_build_lui (&offset_expr, tempreg);
8491               macro_build (&offset_expr, s, fmt, treg,
8492                            BFD_RELOC_LO16, tempreg);
8493               if (mips_relax.sequence)
8494                 relax_end ();
8495             }
8496           else
8497             {
8498               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8499                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8500                 {
8501                   relax_start (offset_expr.X_add_symbol);
8502                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8503                                tempreg, breg, mips_gp_register);
8504                   macro_build (&offset_expr, s, fmt, treg,
8505                                BFD_RELOC_GPREL16, tempreg);
8506                   relax_switch ();
8507                 }
8508               macro_build_lui (&offset_expr, tempreg);
8509               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8510                            tempreg, tempreg, breg);
8511               macro_build (&offset_expr, s, fmt, treg,
8512                            BFD_RELOC_LO16, tempreg);
8513               if (mips_relax.sequence)
8514                 relax_end ();
8515             }
8516         }
8517       else if (!mips_big_got)
8518         {
8519           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
8520
8521           /* If this is a reference to an external symbol, we want
8522                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8523                nop
8524                <op>     $treg,0($tempreg)
8525              Otherwise we want
8526                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8527                nop
8528                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
8529                <op>     $treg,0($tempreg)
8530
8531              For NewABI, we want
8532                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
8533                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
8534
8535              If there is a base register, we add it to $tempreg before
8536              the <op>.  If there is a constant, we stick it in the
8537              <op> instruction.  We don't handle constants larger than
8538              16 bits, because we have no way to load the upper 16 bits
8539              (actually, we could handle them for the subset of cases
8540              in which we are not using $at).  */
8541           gas_assert (offset_expr.X_op == O_symbol);
8542           if (HAVE_NEWABI)
8543             {
8544               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8545                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
8546               if (breg != 0)
8547                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8548                              tempreg, tempreg, breg);
8549               macro_build (&offset_expr, s, fmt, treg,
8550                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
8551               break;
8552             }
8553           expr1.X_add_number = offset_expr.X_add_number;
8554           offset_expr.X_add_number = 0;
8555           if (expr1.X_add_number < -0x8000
8556               || expr1.X_add_number >= 0x8000)
8557             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8558           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8559                        lw_reloc_type, mips_gp_register);
8560           load_delay_nop ();
8561           relax_start (offset_expr.X_add_symbol);
8562           relax_switch ();
8563           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
8564                        tempreg, BFD_RELOC_LO16);
8565           relax_end ();
8566           if (breg != 0)
8567             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8568                          tempreg, tempreg, breg);
8569           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8570         }
8571       else if (mips_big_got && !HAVE_NEWABI)
8572         {
8573           int gpdelay;
8574
8575           /* If this is a reference to an external symbol, we want
8576                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
8577                addu     $tempreg,$tempreg,$gp
8578                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8579                <op>     $treg,0($tempreg)
8580              Otherwise we want
8581                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8582                nop
8583                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
8584                <op>     $treg,0($tempreg)
8585              If there is a base register, we add it to $tempreg before
8586              the <op>.  If there is a constant, we stick it in the
8587              <op> instruction.  We don't handle constants larger than
8588              16 bits, because we have no way to load the upper 16 bits
8589              (actually, we could handle them for the subset of cases
8590              in which we are not using $at).  */
8591           gas_assert (offset_expr.X_op == O_symbol);
8592           expr1.X_add_number = offset_expr.X_add_number;
8593           offset_expr.X_add_number = 0;
8594           if (expr1.X_add_number < -0x8000
8595               || expr1.X_add_number >= 0x8000)
8596             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8597           gpdelay = reg_needs_delay (mips_gp_register);
8598           relax_start (offset_expr.X_add_symbol);
8599           macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8600                        BFD_RELOC_MIPS_GOT_HI16);
8601           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
8602                        mips_gp_register);
8603           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8604                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
8605           relax_switch ();
8606           if (gpdelay)
8607             macro_build (NULL, "nop", "");
8608           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8609                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
8610           load_delay_nop ();
8611           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
8612                        tempreg, BFD_RELOC_LO16);
8613           relax_end ();
8614
8615           if (breg != 0)
8616             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8617                          tempreg, tempreg, breg);
8618           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8619         }
8620       else if (mips_big_got && HAVE_NEWABI)
8621         {
8622           /* If this is a reference to an external symbol, we want
8623                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
8624                add      $tempreg,$tempreg,$gp
8625                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8626                <op>     $treg,<ofst>($tempreg)
8627              Otherwise, for local symbols, we want:
8628                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
8629                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
8630           gas_assert (offset_expr.X_op == O_symbol);
8631           expr1.X_add_number = offset_expr.X_add_number;
8632           offset_expr.X_add_number = 0;
8633           if (expr1.X_add_number < -0x8000
8634               || expr1.X_add_number >= 0x8000)
8635             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8636           relax_start (offset_expr.X_add_symbol);
8637           macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8638                        BFD_RELOC_MIPS_GOT_HI16);
8639           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
8640                        mips_gp_register);
8641           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8642                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
8643           if (breg != 0)
8644             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8645                          tempreg, tempreg, breg);
8646           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8647
8648           relax_switch ();
8649           offset_expr.X_add_number = expr1.X_add_number;
8650           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8651                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
8652           if (breg != 0)
8653             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8654                          tempreg, tempreg, breg);
8655           macro_build (&offset_expr, s, fmt, treg,
8656                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
8657           relax_end ();
8658         }
8659       else
8660         abort ();
8661
8662       break;
8663
8664     case M_LI:
8665     case M_LI_S:
8666       load_register (treg, &imm_expr, 0);
8667       break;
8668
8669     case M_DLI:
8670       load_register (treg, &imm_expr, 1);
8671       break;
8672
8673     case M_LI_SS:
8674       if (imm_expr.X_op == O_constant)
8675         {
8676           used_at = 1;
8677           load_register (AT, &imm_expr, 0);
8678           macro_build (NULL, "mtc1", "t,G", AT, treg);
8679           break;
8680         }
8681       else
8682         {
8683           gas_assert (offset_expr.X_op == O_symbol
8684                       && strcmp (segment_name (S_GET_SEGMENT
8685                                                (offset_expr.X_add_symbol)),
8686                                  ".lit4") == 0
8687                       && offset_expr.X_add_number == 0);
8688           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
8689                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8690           break;
8691         }
8692
8693     case M_LI_D:
8694       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
8695          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
8696          order 32 bits of the value and the low order 32 bits are either
8697          zero or in OFFSET_EXPR.  */
8698       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
8699         {
8700           if (HAVE_64BIT_GPRS)
8701             load_register (treg, &imm_expr, 1);
8702           else
8703             {
8704               int hreg, lreg;
8705
8706               if (target_big_endian)
8707                 {
8708                   hreg = treg;
8709                   lreg = treg + 1;
8710                 }
8711               else
8712                 {
8713                   hreg = treg + 1;
8714                   lreg = treg;
8715                 }
8716
8717               if (hreg <= 31)
8718                 load_register (hreg, &imm_expr, 0);
8719               if (lreg <= 31)
8720                 {
8721                   if (offset_expr.X_op == O_absent)
8722                     move_register (lreg, 0);
8723                   else
8724                     {
8725                       gas_assert (offset_expr.X_op == O_constant);
8726                       load_register (lreg, &offset_expr, 0);
8727                     }
8728                 }
8729             }
8730           break;
8731         }
8732
8733       /* We know that sym is in the .rdata section.  First we get the
8734          upper 16 bits of the address.  */
8735       if (mips_pic == NO_PIC)
8736         {
8737           macro_build_lui (&offset_expr, AT);
8738           used_at = 1;
8739         }
8740       else
8741         {
8742           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
8743                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
8744           used_at = 1;
8745         }
8746
8747       /* Now we load the register(s).  */
8748       if (HAVE_64BIT_GPRS)
8749         {
8750           used_at = 1;
8751           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8752         }
8753       else
8754         {
8755           used_at = 1;
8756           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8757           if (treg != RA)
8758             {
8759               /* FIXME: How in the world do we deal with the possible
8760                  overflow here?  */
8761               offset_expr.X_add_number += 4;
8762               macro_build (&offset_expr, "lw", "t,o(b)",
8763                            treg + 1, BFD_RELOC_LO16, AT);
8764             }
8765         }
8766       break;
8767
8768     case M_LI_DD:
8769       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
8770          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
8771          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
8772          the value and the low order 32 bits are either zero or in
8773          OFFSET_EXPR.  */
8774       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
8775         {
8776           used_at = 1;
8777           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
8778           if (HAVE_64BIT_FPRS)
8779             {
8780               gas_assert (HAVE_64BIT_GPRS);
8781               macro_build (NULL, "dmtc1", "t,S", AT, treg);
8782             }
8783           else
8784             {
8785               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
8786               if (offset_expr.X_op == O_absent)
8787                 macro_build (NULL, "mtc1", "t,G", 0, treg);
8788               else
8789                 {
8790                   gas_assert (offset_expr.X_op == O_constant);
8791                   load_register (AT, &offset_expr, 0);
8792                   macro_build (NULL, "mtc1", "t,G", AT, treg);
8793                 }
8794             }
8795           break;
8796         }
8797
8798       gas_assert (offset_expr.X_op == O_symbol
8799                   && offset_expr.X_add_number == 0);
8800       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
8801       if (strcmp (s, ".lit8") == 0)
8802         {
8803           if (mips_opts.isa != ISA_MIPS1 || mips_opts.micromips)
8804             {
8805               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
8806                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8807               break;
8808             }
8809           breg = mips_gp_register;
8810           r = BFD_RELOC_MIPS_LITERAL;
8811           goto dob;
8812         }
8813       else
8814         {
8815           gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
8816           used_at = 1;
8817           if (mips_pic != NO_PIC)
8818             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
8819                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
8820           else
8821             {
8822               /* FIXME: This won't work for a 64 bit address.  */
8823               macro_build_lui (&offset_expr, AT);
8824             }
8825
8826           if (mips_opts.isa != ISA_MIPS1 || mips_opts.micromips)
8827             {
8828               macro_build (&offset_expr, "ldc1", "T,o(b)",
8829                            treg, BFD_RELOC_LO16, AT);
8830               break;
8831             }
8832           breg = AT;
8833           r = BFD_RELOC_LO16;
8834           goto dob;
8835         }
8836
8837     case M_L_DOB:
8838       /* Even on a big endian machine $fn comes before $fn+1.  We have
8839          to adjust when loading from memory.  */
8840       r = BFD_RELOC_LO16;
8841     dob:
8842       gas_assert (!mips_opts.micromips);
8843       gas_assert (mips_opts.isa == ISA_MIPS1);
8844       macro_build (&offset_expr, "lwc1", "T,o(b)",
8845                    target_big_endian ? treg + 1 : treg, r, breg);
8846       /* FIXME: A possible overflow which I don't know how to deal
8847          with.  */
8848       offset_expr.X_add_number += 4;
8849       macro_build (&offset_expr, "lwc1", "T,o(b)",
8850                    target_big_endian ? treg : treg + 1, r, breg);
8851       break;
8852
8853     case M_S_DOB:
8854       gas_assert (!mips_opts.micromips);
8855       gas_assert (mips_opts.isa == ISA_MIPS1);
8856       /* Even on a big endian machine $fn comes before $fn+1.  We have
8857          to adjust when storing to memory.  */
8858       macro_build (&offset_expr, "swc1", "T,o(b)",
8859                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
8860       offset_expr.X_add_number += 4;
8861       macro_build (&offset_expr, "swc1", "T,o(b)",
8862                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
8863       break;
8864
8865     case M_L_DAB:
8866       gas_assert (!mips_opts.micromips);
8867       /*
8868        * The MIPS assembler seems to check for X_add_number not
8869        * being double aligned and generating:
8870        *        lui     at,%hi(foo+1)
8871        *        addu    at,at,v1
8872        *        addiu   at,at,%lo(foo+1)
8873        *        lwc1    f2,0(at)
8874        *        lwc1    f3,4(at)
8875        * But, the resulting address is the same after relocation so why
8876        * generate the extra instruction?
8877        */
8878       /* Itbl support may require additional care here.  */
8879       coproc = 1;
8880       fmt = "T,o(b)";
8881       if (mips_opts.isa != ISA_MIPS1)
8882         {
8883           s = "ldc1";
8884           goto ld_st;
8885         }
8886       s = "lwc1";
8887       goto ldd_std;
8888
8889     case M_S_DAB:
8890       gas_assert (!mips_opts.micromips);
8891       /* Itbl support may require additional care here.  */
8892       coproc = 1;
8893       fmt = "T,o(b)";
8894       if (mips_opts.isa != ISA_MIPS1)
8895         {
8896           s = "sdc1";
8897           goto ld_st;
8898         }
8899       s = "swc1";
8900       goto ldd_std;
8901
8902     case M_LD_AB:
8903       fmt = "t,o(b)";
8904       if (HAVE_64BIT_GPRS)
8905         {
8906           s = "ld";
8907           goto ld;
8908         }
8909       s = "lw";
8910       goto ldd_std;
8911
8912     case M_SD_AB:
8913       fmt = "t,o(b)";
8914       if (HAVE_64BIT_GPRS)
8915         {
8916           s = "sd";
8917           goto ld_st;
8918         }
8919       s = "sw";
8920
8921     ldd_std:
8922       if (offset_expr.X_op != O_symbol
8923           && offset_expr.X_op != O_constant)
8924         {
8925           as_bad (_("Expression too complex"));
8926           offset_expr.X_op = O_constant;
8927         }
8928
8929       if (HAVE_32BIT_ADDRESSES
8930           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
8931         {
8932           char value [32];
8933
8934           sprintf_vma (value, offset_expr.X_add_number);
8935           as_bad (_("Number (0x%s) larger than 32 bits"), value);
8936         }
8937
8938       /* Even on a big endian machine $fn comes before $fn+1.  We have
8939          to adjust when loading from memory.  We set coproc if we must
8940          load $fn+1 first.  */
8941       /* Itbl support may require additional care here.  */
8942       if (!target_big_endian)
8943         coproc = 0;
8944
8945       if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
8946         {
8947           /* If this is a reference to a GP relative symbol, we want
8948                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
8949                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
8950              If we have a base register, we use this
8951                addu     $at,$breg,$gp
8952                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
8953                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
8954              If this is not a GP relative symbol, we want
8955                lui      $at,<sym>               (BFD_RELOC_HI16_S)
8956                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
8957                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
8958              If there is a base register, we add it to $at after the
8959              lui instruction.  If there is a constant, we always use
8960              the last case.  */
8961           if (offset_expr.X_op == O_symbol
8962               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8963               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8964             {
8965               relax_start (offset_expr.X_add_symbol);
8966               if (breg == 0)
8967                 {
8968                   tempreg = mips_gp_register;
8969                 }
8970               else
8971                 {
8972                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8973                                AT, breg, mips_gp_register);
8974                   tempreg = AT;
8975                   used_at = 1;
8976                 }
8977
8978               /* Itbl support may require additional care here.  */
8979               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
8980                            BFD_RELOC_GPREL16, tempreg);
8981               offset_expr.X_add_number += 4;
8982
8983               /* Set mips_optimize to 2 to avoid inserting an
8984                  undesired nop.  */
8985               hold_mips_optimize = mips_optimize;
8986               mips_optimize = 2;
8987               /* Itbl support may require additional care here.  */
8988               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
8989                            BFD_RELOC_GPREL16, tempreg);
8990               mips_optimize = hold_mips_optimize;
8991
8992               relax_switch ();
8993
8994               offset_expr.X_add_number -= 4;
8995             }
8996           used_at = 1;
8997           macro_build_lui (&offset_expr, AT);
8998           if (breg != 0)
8999             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9000           /* Itbl support may require additional care here.  */
9001           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9002                        BFD_RELOC_LO16, AT);
9003           /* FIXME: How do we handle overflow here?  */
9004           offset_expr.X_add_number += 4;
9005           /* Itbl support may require additional care here.  */
9006           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9007                        BFD_RELOC_LO16, AT);
9008           if (mips_relax.sequence)
9009             relax_end ();
9010         }
9011       else if (!mips_big_got)
9012         {
9013           /* If this is a reference to an external symbol, we want
9014                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
9015                nop
9016                <op>     $treg,0($at)
9017                <op>     $treg+1,4($at)
9018              Otherwise we want
9019                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
9020                nop
9021                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
9022                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
9023              If there is a base register we add it to $at before the
9024              lwc1 instructions.  If there is a constant we include it
9025              in the lwc1 instructions.  */
9026           used_at = 1;
9027           expr1.X_add_number = offset_expr.X_add_number;
9028           if (expr1.X_add_number < -0x8000
9029               || expr1.X_add_number >= 0x8000 - 4)
9030             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9031           load_got_offset (AT, &offset_expr);
9032           load_delay_nop ();
9033           if (breg != 0)
9034             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9035
9036           /* Set mips_optimize to 2 to avoid inserting an undesired
9037              nop.  */
9038           hold_mips_optimize = mips_optimize;
9039           mips_optimize = 2;
9040
9041           /* Itbl support may require additional care here.  */
9042           relax_start (offset_expr.X_add_symbol);
9043           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9044                        BFD_RELOC_LO16, AT);
9045           expr1.X_add_number += 4;
9046           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9047                        BFD_RELOC_LO16, AT);
9048           relax_switch ();
9049           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9050                        BFD_RELOC_LO16, AT);
9051           offset_expr.X_add_number += 4;
9052           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9053                        BFD_RELOC_LO16, AT);
9054           relax_end ();
9055
9056           mips_optimize = hold_mips_optimize;
9057         }
9058       else if (mips_big_got)
9059         {
9060           int gpdelay;
9061
9062           /* If this is a reference to an external symbol, we want
9063                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
9064                addu     $at,$at,$gp
9065                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
9066                nop
9067                <op>     $treg,0($at)
9068                <op>     $treg+1,4($at)
9069              Otherwise we want
9070                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
9071                nop
9072                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
9073                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
9074              If there is a base register we add it to $at before the
9075              lwc1 instructions.  If there is a constant we include it
9076              in the lwc1 instructions.  */
9077           used_at = 1;
9078           expr1.X_add_number = offset_expr.X_add_number;
9079           offset_expr.X_add_number = 0;
9080           if (expr1.X_add_number < -0x8000
9081               || expr1.X_add_number >= 0x8000 - 4)
9082             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9083           gpdelay = reg_needs_delay (mips_gp_register);
9084           relax_start (offset_expr.X_add_symbol);
9085           macro_build (&offset_expr, "lui", LUI_FMT,
9086                        AT, BFD_RELOC_MIPS_GOT_HI16);
9087           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9088                        AT, AT, mips_gp_register);
9089           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
9090                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
9091           load_delay_nop ();
9092           if (breg != 0)
9093             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9094           /* Itbl support may require additional care here.  */
9095           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9096                        BFD_RELOC_LO16, AT);
9097           expr1.X_add_number += 4;
9098
9099           /* Set mips_optimize to 2 to avoid inserting an undesired
9100              nop.  */
9101           hold_mips_optimize = mips_optimize;
9102           mips_optimize = 2;
9103           /* Itbl support may require additional care here.  */
9104           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9105                        BFD_RELOC_LO16, AT);
9106           mips_optimize = hold_mips_optimize;
9107           expr1.X_add_number -= 4;
9108
9109           relax_switch ();
9110           offset_expr.X_add_number = expr1.X_add_number;
9111           if (gpdelay)
9112             macro_build (NULL, "nop", "");
9113           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9114                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
9115           load_delay_nop ();
9116           if (breg != 0)
9117             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9118           /* Itbl support may require additional care here.  */
9119           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9120                        BFD_RELOC_LO16, AT);
9121           offset_expr.X_add_number += 4;
9122
9123           /* Set mips_optimize to 2 to avoid inserting an undesired
9124              nop.  */
9125           hold_mips_optimize = mips_optimize;
9126           mips_optimize = 2;
9127           /* Itbl support may require additional care here.  */
9128           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9129                        BFD_RELOC_LO16, AT);
9130           mips_optimize = hold_mips_optimize;
9131           relax_end ();
9132         }
9133       else
9134         abort ();
9135
9136       break;
9137
9138     case M_LD_OB:
9139       s = HAVE_64BIT_GPRS ? "ld" : "lw";
9140       goto sd_ob;
9141     case M_SD_OB:
9142       s = HAVE_64BIT_GPRS ? "sd" : "sw";
9143     sd_ob:
9144       macro_build (&offset_expr, s, "t,o(b)", treg,
9145                    -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9146                    breg);
9147       if (!HAVE_64BIT_GPRS)
9148         {
9149           offset_expr.X_add_number += 4;
9150           macro_build (&offset_expr, s, "t,o(b)", treg + 1,
9151                        -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9152                        breg);
9153         }
9154       break;
9155
9156         
9157     case M_SAA_AB:
9158       ab = 1;
9159     case M_SAA_OB:
9160       s = "saa";
9161       off0 = 1;
9162       fmt = "t,(b)";
9163       goto ld_st;
9164     case M_SAAD_AB:
9165       ab = 1;
9166     case M_SAAD_OB:
9167       s = "saad";
9168       off0 = 1;
9169       fmt = "t,(b)";
9170       goto ld_st;
9171
9172    /* New code added to support COPZ instructions.
9173       This code builds table entries out of the macros in mip_opcodes.
9174       R4000 uses interlocks to handle coproc delays.
9175       Other chips (like the R3000) require nops to be inserted for delays.
9176
9177       FIXME: Currently, we require that the user handle delays.
9178       In order to fill delay slots for non-interlocked chips,
9179       we must have a way to specify delays based on the coprocessor.
9180       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
9181       What are the side-effects of the cop instruction?
9182       What cache support might we have and what are its effects?
9183       Both coprocessor & memory require delays. how long???
9184       What registers are read/set/modified?
9185
9186       If an itbl is provided to interpret cop instructions,
9187       this knowledge can be encoded in the itbl spec.  */
9188
9189     case M_COP0:
9190       s = "c0";
9191       goto copz;
9192     case M_COP1:
9193       s = "c1";
9194       goto copz;
9195     case M_COP2:
9196       s = "c2";
9197       goto copz;
9198     case M_COP3:
9199       s = "c3";
9200     copz:
9201       gas_assert (!mips_opts.micromips);
9202       if (NO_ISA_COP (mips_opts.arch)
9203           && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
9204         {
9205           as_bad (_("Opcode not supported on this processor: %s"),
9206                   mips_cpu_info_from_arch (mips_opts.arch)->name);
9207           break;
9208         }
9209
9210       /* For now we just do C (same as Cz).  The parameter will be
9211          stored in insn_opcode by mips_ip.  */
9212       macro_build (NULL, s, "C", ip->insn_opcode);
9213       break;
9214
9215     case M_MOVE:
9216       move_register (dreg, sreg);
9217       break;
9218
9219     case M_DMUL:
9220       dbl = 1;
9221     case M_MUL:
9222       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
9223       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9224       break;
9225
9226     case M_DMUL_I:
9227       dbl = 1;
9228     case M_MUL_I:
9229       /* The MIPS assembler some times generates shifts and adds.  I'm
9230          not trying to be that fancy. GCC should do this for us
9231          anyway.  */
9232       used_at = 1;
9233       load_register (AT, &imm_expr, dbl);
9234       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
9235       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9236       break;
9237
9238     case M_DMULO_I:
9239       dbl = 1;
9240     case M_MULO_I:
9241       imm = 1;
9242       goto do_mulo;
9243
9244     case M_DMULO:
9245       dbl = 1;
9246     case M_MULO:
9247     do_mulo:
9248       start_noreorder ();
9249       used_at = 1;
9250       if (imm)
9251         load_register (AT, &imm_expr, dbl);
9252       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
9253       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9254       macro_build (NULL, dbl ? "dsra32" : "sra", SHFT_FMT, dreg, dreg, RA);
9255       macro_build (NULL, "mfhi", MFHL_FMT, AT);
9256       if (mips_trap)
9257         macro_build (NULL, "tne", TRAP_FMT, dreg, AT, 6);
9258       else
9259         {
9260           if (mips_opts.micromips)
9261             micromips_label_expr (&label_expr);
9262           else
9263             label_expr.X_add_number = 8;
9264           macro_build (&label_expr, "beq", "s,t,p", dreg, AT);
9265           macro_build (NULL, "nop", "");
9266           macro_build (NULL, "break", BRK_FMT, 6);
9267           if (mips_opts.micromips)
9268             micromips_add_label ();
9269         }
9270       end_noreorder ();
9271       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9272       break;
9273
9274     case M_DMULOU_I:
9275       dbl = 1;
9276     case M_MULOU_I:
9277       imm = 1;
9278       goto do_mulou;
9279
9280     case M_DMULOU:
9281       dbl = 1;
9282     case M_MULOU:
9283     do_mulou:
9284       start_noreorder ();
9285       used_at = 1;
9286       if (imm)
9287         load_register (AT, &imm_expr, dbl);
9288       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
9289                    sreg, imm ? AT : treg);
9290       macro_build (NULL, "mfhi", MFHL_FMT, AT);
9291       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9292       if (mips_trap)
9293         macro_build (NULL, "tne", TRAP_FMT, AT, ZERO, 6);
9294       else
9295         {
9296           if (mips_opts.micromips)
9297             micromips_label_expr (&label_expr);
9298           else
9299             label_expr.X_add_number = 8;
9300           macro_build (&label_expr, "beq", "s,t,p", AT, ZERO);
9301           macro_build (NULL, "nop", "");
9302           macro_build (NULL, "break", BRK_FMT, 6);
9303           if (mips_opts.micromips)
9304             micromips_add_label ();
9305         }
9306       end_noreorder ();
9307       break;
9308
9309     case M_DROL:
9310       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9311         {
9312           if (dreg == sreg)
9313             {
9314               tempreg = AT;
9315               used_at = 1;
9316             }
9317           else
9318             {
9319               tempreg = dreg;
9320             }
9321           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
9322           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
9323           break;
9324         }
9325       used_at = 1;
9326       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9327       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
9328       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
9329       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9330       break;
9331
9332     case M_ROL:
9333       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9334         {
9335           if (dreg == sreg)
9336             {
9337               tempreg = AT;
9338               used_at = 1;
9339             }
9340           else
9341             {
9342               tempreg = dreg;
9343             }
9344           macro_build (NULL, "negu", "d,w", tempreg, treg);
9345           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
9346           break;
9347         }
9348       used_at = 1;
9349       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
9350       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
9351       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
9352       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9353       break;
9354
9355     case M_DROL_I:
9356       {
9357         unsigned int rot;
9358         char *l;
9359         char *rr;
9360
9361         if (imm_expr.X_op != O_constant)
9362           as_bad (_("Improper rotate count"));
9363         rot = imm_expr.X_add_number & 0x3f;
9364         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9365           {
9366             rot = (64 - rot) & 0x3f;
9367             if (rot >= 32)
9368               macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
9369             else
9370               macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
9371             break;
9372           }
9373         if (rot == 0)
9374           {
9375             macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
9376             break;
9377           }
9378         l = (rot < 0x20) ? "dsll" : "dsll32";
9379         rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
9380         rot &= 0x1f;
9381         used_at = 1;
9382         macro_build (NULL, l, SHFT_FMT, AT, sreg, rot);
9383         macro_build (NULL, rr, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9384         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9385       }
9386       break;
9387
9388     case M_ROL_I:
9389       {
9390         unsigned int rot;
9391
9392         if (imm_expr.X_op != O_constant)
9393           as_bad (_("Improper rotate count"));
9394         rot = imm_expr.X_add_number & 0x1f;
9395         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9396           {
9397             macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, (32 - rot) & 0x1f);
9398             break;
9399           }
9400         if (rot == 0)
9401           {
9402             macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
9403             break;
9404           }
9405         used_at = 1;
9406         macro_build (NULL, "sll", SHFT_FMT, AT, sreg, rot);
9407         macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9408         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9409       }
9410       break;
9411
9412     case M_DROR:
9413       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9414         {
9415           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
9416           break;
9417         }
9418       used_at = 1;
9419       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9420       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
9421       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
9422       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9423       break;
9424
9425     case M_ROR:
9426       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9427         {
9428           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
9429           break;
9430         }
9431       used_at = 1;
9432       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
9433       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
9434       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
9435       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9436       break;
9437
9438     case M_DROR_I:
9439       {
9440         unsigned int rot;
9441         char *l;
9442         char *rr;
9443
9444         if (imm_expr.X_op != O_constant)
9445           as_bad (_("Improper rotate count"));
9446         rot = imm_expr.X_add_number & 0x3f;
9447         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9448           {
9449             if (rot >= 32)
9450               macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
9451             else
9452               macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
9453             break;
9454           }
9455         if (rot == 0)
9456           {
9457             macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
9458             break;
9459           }
9460         rr = (rot < 0x20) ? "dsrl" : "dsrl32";
9461         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
9462         rot &= 0x1f;
9463         used_at = 1;
9464         macro_build (NULL, rr, SHFT_FMT, AT, sreg, rot);
9465         macro_build (NULL, l, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9466         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9467       }
9468       break;
9469
9470     case M_ROR_I:
9471       {
9472         unsigned int rot;
9473
9474         if (imm_expr.X_op != O_constant)
9475           as_bad (_("Improper rotate count"));
9476         rot = imm_expr.X_add_number & 0x1f;
9477         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9478           {
9479             macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, rot);
9480             break;
9481           }
9482         if (rot == 0)
9483           {
9484             macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
9485             break;
9486           }
9487         used_at = 1;
9488         macro_build (NULL, "srl", SHFT_FMT, AT, sreg, rot);
9489         macro_build (NULL, "sll", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9490         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9491       }
9492       break;
9493
9494     case M_SEQ:
9495       if (sreg == 0)
9496         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
9497       else if (treg == 0)
9498         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9499       else
9500         {
9501           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
9502           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
9503         }
9504       break;
9505
9506     case M_SEQ_I:
9507       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
9508         {
9509           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9510           break;
9511         }
9512       if (sreg == 0)
9513         {
9514           as_warn (_("Instruction %s: result is always false"),
9515                    ip->insn_mo->name);
9516           move_register (dreg, 0);
9517           break;
9518         }
9519       if (CPU_HAS_SEQ (mips_opts.arch)
9520           && -512 <= imm_expr.X_add_number
9521           && imm_expr.X_add_number < 512)
9522         {
9523           macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
9524                        (int) imm_expr.X_add_number);
9525           break;
9526         }
9527       if (imm_expr.X_op == O_constant
9528           && imm_expr.X_add_number >= 0
9529           && imm_expr.X_add_number < 0x10000)
9530         {
9531           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
9532         }
9533       else if (imm_expr.X_op == O_constant
9534                && imm_expr.X_add_number > -0x8000
9535                && imm_expr.X_add_number < 0)
9536         {
9537           imm_expr.X_add_number = -imm_expr.X_add_number;
9538           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
9539                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9540         }
9541       else if (CPU_HAS_SEQ (mips_opts.arch))
9542         {
9543           used_at = 1;
9544           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9545           macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
9546           break;
9547         }
9548       else
9549         {
9550           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9551           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
9552           used_at = 1;
9553         }
9554       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
9555       break;
9556
9557     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
9558       s = "slt";
9559       goto sge;
9560     case M_SGEU:
9561       s = "sltu";
9562     sge:
9563       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
9564       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9565       break;
9566
9567     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
9568     case M_SGEU_I:
9569       if (imm_expr.X_op == O_constant
9570           && imm_expr.X_add_number >= -0x8000
9571           && imm_expr.X_add_number < 0x8000)
9572         {
9573           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
9574                        dreg, sreg, BFD_RELOC_LO16);
9575         }
9576       else
9577         {
9578           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9579           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
9580                        dreg, sreg, AT);
9581           used_at = 1;
9582         }
9583       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9584       break;
9585
9586     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
9587       s = "slt";
9588       goto sgt;
9589     case M_SGTU:
9590       s = "sltu";
9591     sgt:
9592       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
9593       break;
9594
9595     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
9596       s = "slt";
9597       goto sgti;
9598     case M_SGTU_I:
9599       s = "sltu";
9600     sgti:
9601       used_at = 1;
9602       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9603       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
9604       break;
9605
9606     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
9607       s = "slt";
9608       goto sle;
9609     case M_SLEU:
9610       s = "sltu";
9611     sle:
9612       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
9613       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9614       break;
9615
9616     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
9617       s = "slt";
9618       goto slei;
9619     case M_SLEU_I:
9620       s = "sltu";
9621     slei:
9622       used_at = 1;
9623       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9624       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
9625       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9626       break;
9627
9628     case M_SLT_I:
9629       if (imm_expr.X_op == O_constant
9630           && imm_expr.X_add_number >= -0x8000
9631           && imm_expr.X_add_number < 0x8000)
9632         {
9633           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9634           break;
9635         }
9636       used_at = 1;
9637       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9638       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
9639       break;
9640
9641     case M_SLTU_I:
9642       if (imm_expr.X_op == O_constant
9643           && imm_expr.X_add_number >= -0x8000
9644           && imm_expr.X_add_number < 0x8000)
9645         {
9646           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
9647                        BFD_RELOC_LO16);
9648           break;
9649         }
9650       used_at = 1;
9651       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9652       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
9653       break;
9654
9655     case M_SNE:
9656       if (sreg == 0)
9657         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
9658       else if (treg == 0)
9659         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
9660       else
9661         {
9662           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
9663           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
9664         }
9665       break;
9666
9667     case M_SNE_I:
9668       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
9669         {
9670           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
9671           break;
9672         }
9673       if (sreg == 0)
9674         {
9675           as_warn (_("Instruction %s: result is always true"),
9676                    ip->insn_mo->name);
9677           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
9678                        dreg, 0, BFD_RELOC_LO16);
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, "snei", "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, "sne", "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 (NULL, "sltu", "d,v,t", dreg, 0, dreg);
9717       break;
9718
9719     case M_SUB_I:
9720       s = "addi";
9721       s2 = "sub";
9722       goto do_subi;
9723     case M_SUBU_I:
9724       s = "addiu";
9725       s2 = "subu";
9726       goto do_subi;
9727     case M_DSUB_I:
9728       dbl = 1;
9729       s = "daddi";
9730       s2 = "dsub";
9731       if (!mips_opts.micromips)
9732         goto do_subi;
9733       if (imm_expr.X_op == O_constant
9734           && imm_expr.X_add_number > -0x200
9735           && imm_expr.X_add_number <= 0x200)
9736         {
9737           macro_build (NULL, s, "t,r,.", dreg, sreg, -imm_expr.X_add_number);
9738           break;
9739         }
9740       goto do_subi_i;
9741     case M_DSUBU_I:
9742       dbl = 1;
9743       s = "daddiu";
9744       s2 = "dsubu";
9745     do_subi:
9746       if (imm_expr.X_op == O_constant
9747           && imm_expr.X_add_number > -0x8000
9748           && imm_expr.X_add_number <= 0x8000)
9749         {
9750           imm_expr.X_add_number = -imm_expr.X_add_number;
9751           macro_build (&imm_expr, s, "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9752           break;
9753         }
9754     do_subi_i:
9755       used_at = 1;
9756       load_register (AT, &imm_expr, dbl);
9757       macro_build (NULL, s2, "d,v,t", dreg, sreg, AT);
9758       break;
9759
9760     case M_TEQ_I:
9761       s = "teq";
9762       goto trap;
9763     case M_TGE_I:
9764       s = "tge";
9765       goto trap;
9766     case M_TGEU_I:
9767       s = "tgeu";
9768       goto trap;
9769     case M_TLT_I:
9770       s = "tlt";
9771       goto trap;
9772     case M_TLTU_I:
9773       s = "tltu";
9774       goto trap;
9775     case M_TNE_I:
9776       s = "tne";
9777     trap:
9778       used_at = 1;
9779       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9780       macro_build (NULL, s, "s,t", sreg, AT);
9781       break;
9782
9783     case M_TRUNCWS:
9784     case M_TRUNCWD:
9785       gas_assert (!mips_opts.micromips);
9786       gas_assert (mips_opts.isa == ISA_MIPS1);
9787       used_at = 1;
9788       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
9789       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
9790
9791       /*
9792        * Is the double cfc1 instruction a bug in the mips assembler;
9793        * or is there a reason for it?
9794        */
9795       start_noreorder ();
9796       macro_build (NULL, "cfc1", "t,G", treg, RA);
9797       macro_build (NULL, "cfc1", "t,G", treg, RA);
9798       macro_build (NULL, "nop", "");
9799       expr1.X_add_number = 3;
9800       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
9801       expr1.X_add_number = 2;
9802       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
9803       macro_build (NULL, "ctc1", "t,G", AT, RA);
9804       macro_build (NULL, "nop", "");
9805       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
9806                    dreg, sreg);
9807       macro_build (NULL, "ctc1", "t,G", treg, RA);
9808       macro_build (NULL, "nop", "");
9809       end_noreorder ();
9810       break;
9811
9812     case M_ULH_A:
9813       ab = 1;
9814     case M_ULH:
9815       s = "lb";
9816       s2 = "lbu";
9817       off = 1;
9818       goto uld_st;
9819     case M_ULHU_A:
9820       ab = 1;
9821     case M_ULHU:
9822       s = "lbu";
9823       s2 = "lbu";
9824       off = 1;
9825       goto uld_st;
9826     case M_ULW_A:
9827       ab = 1;
9828     case M_ULW:
9829       s = "lwl";
9830       s2 = "lwr";
9831       off12 = mips_opts.micromips;
9832       off = 3;
9833       goto uld_st;
9834     case M_ULD_A:
9835       ab = 1;
9836     case M_ULD:
9837       s = "ldl";
9838       s2 = "ldr";
9839       off12 = mips_opts.micromips;
9840       off = 7;
9841       goto uld_st;
9842     case M_USH_A:
9843       ab = 1;
9844     case M_USH:
9845       s = "sb";
9846       s2 = "sb";
9847       off = 1;
9848       ust = 1;
9849       goto uld_st;
9850     case M_USW_A:
9851       ab = 1;
9852     case M_USW:
9853       s = "swl";
9854       s2 = "swr";
9855       off12 = mips_opts.micromips;
9856       off = 3;
9857       ust = 1;
9858       goto uld_st;
9859     case M_USD_A:
9860       ab = 1;
9861     case M_USD:
9862       s = "sdl";
9863       s2 = "sdr";
9864       off12 = mips_opts.micromips;
9865       off = 7;
9866       ust = 1;
9867
9868     uld_st:
9869       if (!ab && offset_expr.X_add_number >= 0x8000 - off)
9870         as_bad (_("Operand overflow"));
9871
9872       ep = &offset_expr;
9873       expr1.X_add_number = 0;
9874       if (ab)
9875         {
9876           used_at = 1;
9877           tempreg = AT;
9878           load_address (tempreg, ep, &used_at);
9879           if (breg != 0)
9880             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9881                          tempreg, tempreg, breg);
9882           breg = tempreg;
9883           tempreg = treg;
9884           ep = &expr1;
9885         }
9886       else if (off12
9887                && (offset_expr.X_op != O_constant
9888                    || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number)
9889                    || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number + off)))
9890         {
9891           used_at = 1;
9892           tempreg = AT;
9893           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", tempreg, breg,
9894                        -1, offset_reloc[0], offset_reloc[1], offset_reloc[2]);
9895           breg = tempreg;
9896           tempreg = treg;
9897           ep = &expr1;
9898         }
9899       else if (!ust && treg == breg)
9900         {
9901           used_at = 1;
9902           tempreg = AT;
9903         }
9904       else
9905         tempreg = treg;
9906
9907       if (off == 1)
9908         goto ulh_sh;
9909
9910       if (!target_big_endian)
9911         ep->X_add_number += off;
9912       if (!off12)
9913         macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
9914       else
9915         macro_build (NULL, s, "t,~(b)",
9916                      tempreg, (unsigned long) ep->X_add_number, breg);
9917
9918       if (!target_big_endian)
9919         ep->X_add_number -= off;
9920       else
9921         ep->X_add_number += off;
9922       if (!off12)
9923         macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
9924       else
9925         macro_build (NULL, s2, "t,~(b)",
9926                      tempreg, (unsigned long) ep->X_add_number, breg);
9927
9928       /* If necessary, move the result in tempreg to the final destination.  */
9929       if (!ust && treg != tempreg)
9930         {
9931           /* Protect second load's delay slot.  */
9932           load_delay_nop ();
9933           move_register (treg, tempreg);
9934         }
9935       break;
9936
9937     ulh_sh:
9938       used_at = 1;
9939       if (target_big_endian == ust)
9940         ep->X_add_number += off;
9941       tempreg = ust || ab ? treg : AT;
9942       macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
9943
9944       /* For halfword transfers we need a temporary register to shuffle
9945          bytes.  Unfortunately for M_USH_A we have none available before
9946          the next store as AT holds the base address.  We deal with this
9947          case by clobbering TREG and then restoring it as with ULH.  */
9948       tempreg = ust == ab ? treg : AT;
9949       if (ust)
9950         macro_build (NULL, "srl", SHFT_FMT, tempreg, treg, 8);
9951
9952       if (target_big_endian == ust)
9953         ep->X_add_number -= off;
9954       else
9955         ep->X_add_number += off;
9956       macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
9957
9958       /* For M_USH_A re-retrieve the LSB.  */
9959       if (ust && ab)
9960         {
9961           if (target_big_endian)
9962             ep->X_add_number += off;
9963           else
9964             ep->X_add_number -= off;
9965           macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
9966         }
9967       /* For ULH and M_USH_A OR the LSB in.  */
9968       if (!ust || ab)
9969         {
9970           tempreg = !ab ? AT : treg;
9971           macro_build (NULL, "sll", SHFT_FMT, tempreg, tempreg, 8);
9972           macro_build (NULL, "or", "d,v,t", treg, treg, AT);
9973         }
9974       break;
9975
9976     default:
9977       /* FIXME: Check if this is one of the itbl macros, since they
9978          are added dynamically.  */
9979       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
9980       break;
9981     }
9982   if (!mips_opts.at && used_at)
9983     as_bad (_("Macro used $at after \".set noat\""));
9984 }
9985
9986 /* Implement macros in mips16 mode.  */
9987
9988 static void
9989 mips16_macro (struct mips_cl_insn *ip)
9990 {
9991   int mask;
9992   int xreg, yreg, zreg, tmp;
9993   expressionS expr1;
9994   int dbl;
9995   const char *s, *s2, *s3;
9996
9997   mask = ip->insn_mo->mask;
9998
9999   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
10000   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
10001   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
10002
10003   expr1.X_op = O_constant;
10004   expr1.X_op_symbol = NULL;
10005   expr1.X_add_symbol = NULL;
10006   expr1.X_add_number = 1;
10007
10008   dbl = 0;
10009
10010   switch (mask)
10011     {
10012     default:
10013       internalError ();
10014
10015     case M_DDIV_3:
10016       dbl = 1;
10017     case M_DIV_3:
10018       s = "mflo";
10019       goto do_div3;
10020     case M_DREM_3:
10021       dbl = 1;
10022     case M_REM_3:
10023       s = "mfhi";
10024     do_div3:
10025       start_noreorder ();
10026       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
10027       expr1.X_add_number = 2;
10028       macro_build (&expr1, "bnez", "x,p", yreg);
10029       macro_build (NULL, "break", "6", 7);
10030
10031       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
10032          since that causes an overflow.  We should do that as well,
10033          but I don't see how to do the comparisons without a temporary
10034          register.  */
10035       end_noreorder ();
10036       macro_build (NULL, s, "x", zreg);
10037       break;
10038
10039     case M_DIVU_3:
10040       s = "divu";
10041       s2 = "mflo";
10042       goto do_divu3;
10043     case M_REMU_3:
10044       s = "divu";
10045       s2 = "mfhi";
10046       goto do_divu3;
10047     case M_DDIVU_3:
10048       s = "ddivu";
10049       s2 = "mflo";
10050       goto do_divu3;
10051     case M_DREMU_3:
10052       s = "ddivu";
10053       s2 = "mfhi";
10054     do_divu3:
10055       start_noreorder ();
10056       macro_build (NULL, s, "0,x,y", xreg, yreg);
10057       expr1.X_add_number = 2;
10058       macro_build (&expr1, "bnez", "x,p", yreg);
10059       macro_build (NULL, "break", "6", 7);
10060       end_noreorder ();
10061       macro_build (NULL, s2, "x", zreg);
10062       break;
10063
10064     case M_DMUL:
10065       dbl = 1;
10066     case M_MUL:
10067       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
10068       macro_build (NULL, "mflo", "x", zreg);
10069       break;
10070
10071     case M_DSUBU_I:
10072       dbl = 1;
10073       goto do_subu;
10074     case M_SUBU_I:
10075     do_subu:
10076       if (imm_expr.X_op != O_constant)
10077         as_bad (_("Unsupported large constant"));
10078       imm_expr.X_add_number = -imm_expr.X_add_number;
10079       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
10080       break;
10081
10082     case M_SUBU_I_2:
10083       if (imm_expr.X_op != O_constant)
10084         as_bad (_("Unsupported large constant"));
10085       imm_expr.X_add_number = -imm_expr.X_add_number;
10086       macro_build (&imm_expr, "addiu", "x,k", xreg);
10087       break;
10088
10089     case M_DSUBU_I_2:
10090       if (imm_expr.X_op != O_constant)
10091         as_bad (_("Unsupported large constant"));
10092       imm_expr.X_add_number = -imm_expr.X_add_number;
10093       macro_build (&imm_expr, "daddiu", "y,j", yreg);
10094       break;
10095
10096     case M_BEQ:
10097       s = "cmp";
10098       s2 = "bteqz";
10099       goto do_branch;
10100     case M_BNE:
10101       s = "cmp";
10102       s2 = "btnez";
10103       goto do_branch;
10104     case M_BLT:
10105       s = "slt";
10106       s2 = "btnez";
10107       goto do_branch;
10108     case M_BLTU:
10109       s = "sltu";
10110       s2 = "btnez";
10111       goto do_branch;
10112     case M_BLE:
10113       s = "slt";
10114       s2 = "bteqz";
10115       goto do_reverse_branch;
10116     case M_BLEU:
10117       s = "sltu";
10118       s2 = "bteqz";
10119       goto do_reverse_branch;
10120     case M_BGE:
10121       s = "slt";
10122       s2 = "bteqz";
10123       goto do_branch;
10124     case M_BGEU:
10125       s = "sltu";
10126       s2 = "bteqz";
10127       goto do_branch;
10128     case M_BGT:
10129       s = "slt";
10130       s2 = "btnez";
10131       goto do_reverse_branch;
10132     case M_BGTU:
10133       s = "sltu";
10134       s2 = "btnez";
10135
10136     do_reverse_branch:
10137       tmp = xreg;
10138       xreg = yreg;
10139       yreg = tmp;
10140
10141     do_branch:
10142       macro_build (NULL, s, "x,y", xreg, yreg);
10143       macro_build (&offset_expr, s2, "p");
10144       break;
10145
10146     case M_BEQ_I:
10147       s = "cmpi";
10148       s2 = "bteqz";
10149       s3 = "x,U";
10150       goto do_branch_i;
10151     case M_BNE_I:
10152       s = "cmpi";
10153       s2 = "btnez";
10154       s3 = "x,U";
10155       goto do_branch_i;
10156     case M_BLT_I:
10157       s = "slti";
10158       s2 = "btnez";
10159       s3 = "x,8";
10160       goto do_branch_i;
10161     case M_BLTU_I:
10162       s = "sltiu";
10163       s2 = "btnez";
10164       s3 = "x,8";
10165       goto do_branch_i;
10166     case M_BLE_I:
10167       s = "slti";
10168       s2 = "btnez";
10169       s3 = "x,8";
10170       goto do_addone_branch_i;
10171     case M_BLEU_I:
10172       s = "sltiu";
10173       s2 = "btnez";
10174       s3 = "x,8";
10175       goto do_addone_branch_i;
10176     case M_BGE_I:
10177       s = "slti";
10178       s2 = "bteqz";
10179       s3 = "x,8";
10180       goto do_branch_i;
10181     case M_BGEU_I:
10182       s = "sltiu";
10183       s2 = "bteqz";
10184       s3 = "x,8";
10185       goto do_branch_i;
10186     case M_BGT_I:
10187       s = "slti";
10188       s2 = "bteqz";
10189       s3 = "x,8";
10190       goto do_addone_branch_i;
10191     case M_BGTU_I:
10192       s = "sltiu";
10193       s2 = "bteqz";
10194       s3 = "x,8";
10195
10196     do_addone_branch_i:
10197       if (imm_expr.X_op != O_constant)
10198         as_bad (_("Unsupported large constant"));
10199       ++imm_expr.X_add_number;
10200
10201     do_branch_i:
10202       macro_build (&imm_expr, s, s3, xreg);
10203       macro_build (&offset_expr, s2, "p");
10204       break;
10205
10206     case M_ABS:
10207       expr1.X_add_number = 0;
10208       macro_build (&expr1, "slti", "x,8", yreg);
10209       if (xreg != yreg)
10210         move_register (xreg, yreg);
10211       expr1.X_add_number = 2;
10212       macro_build (&expr1, "bteqz", "p");
10213       macro_build (NULL, "neg", "x,w", xreg, xreg);
10214     }
10215 }
10216
10217 /* For consistency checking, verify that all bits are specified either
10218    by the match/mask part of the instruction definition, or by the
10219    operand list.  */
10220 static int
10221 validate_mips_insn (const struct mips_opcode *opc)
10222 {
10223   const char *p = opc->args;
10224   char c;
10225   unsigned long used_bits = opc->mask;
10226
10227   if ((used_bits & opc->match) != opc->match)
10228     {
10229       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
10230               opc->name, opc->args);
10231       return 0;
10232     }
10233 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
10234   while (*p)
10235     switch (c = *p++)
10236       {
10237       case ',': break;
10238       case '(': break;
10239       case ')': break;
10240       case '+':
10241         switch (c = *p++)
10242           {
10243           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
10244           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
10245           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
10246           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
10247           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
10248           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
10249           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10250           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
10251                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
10252           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
10253           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
10254           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10255           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10256           case 'I': break;
10257           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
10258           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
10259                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
10260           case 'x': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
10261           case 'X': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
10262           case 'p': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
10263           case 'P': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
10264           case 'Q': USE_BITS (OP_MASK_SEQI,     OP_SH_SEQI);    break;
10265           case 's': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
10266           case 'S': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
10267           case 'z': USE_BITS (OP_MASK_RZ,       OP_SH_RZ);      break;
10268           case 'Z': USE_BITS (OP_MASK_FZ,       OP_SH_FZ);      break;
10269           case 'a': USE_BITS (OP_MASK_OFFSET_A, OP_SH_OFFSET_A); break;
10270           case 'b': USE_BITS (OP_MASK_OFFSET_B, OP_SH_OFFSET_B); break;
10271           case 'c': USE_BITS (OP_MASK_OFFSET_C, OP_SH_OFFSET_C); break;
10272
10273           default:
10274             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
10275                     c, opc->name, opc->args);
10276             return 0;
10277           }
10278         break;
10279       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10280       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10281       case 'A': break;
10282       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
10283       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
10284       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
10285       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10286       case 'F': break;
10287       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10288       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
10289       case 'I': break;
10290       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
10291       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10292       case 'L': break;
10293       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
10294       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
10295       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
10296       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
10297                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10298       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
10299       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10300       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10301       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10302       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10303       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
10304       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10305       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10306       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
10307       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10308       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
10309       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10310       case 'f': break;
10311       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
10312       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
10313       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10314       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
10315       case 'l': break;
10316       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10317       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10318       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
10319       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10320       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10321       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10322       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
10323       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10324       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10325       case 'x': break;
10326       case 'z': break;
10327       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
10328       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
10329                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10330       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
10331       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
10332       case '[': break;
10333       case ']': break;
10334       case '1': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10335       case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
10336       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
10337       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
10338       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
10339       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10340       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
10341       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
10342       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
10343       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
10344       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
10345       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
10346       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
10347       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
10348       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
10349       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
10350       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
10351       case '\\': USE_BITS (OP_MASK_3BITPOS,     OP_SH_3BITPOS); break;
10352       case '~': USE_BITS (OP_MASK_OFFSET12,     OP_SH_OFFSET12); break;
10353       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10354       default:
10355         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
10356                 c, opc->name, opc->args);
10357         return 0;
10358       }
10359 #undef USE_BITS
10360   if (used_bits != 0xffffffff)
10361     {
10362       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
10363               ~used_bits & 0xffffffff, opc->name, opc->args);
10364       return 0;
10365     }
10366   return 1;
10367 }
10368
10369 /* For consistency checking, verify that the length implied matches the
10370    major opcode and that all bits are specified either by the match/mask
10371    part of the instruction definition, or by the operand list.  */
10372
10373 static int
10374 validate_micromips_insn (const struct mips_opcode *opc)
10375 {
10376   unsigned long match = opc->match;
10377   unsigned long mask = opc->mask;
10378   const char *p = opc->args;
10379   unsigned long insn_bits;
10380   unsigned long used_bits;
10381   unsigned long major;
10382   unsigned int length;
10383   char e;
10384   char c;
10385
10386   if ((mask & match) != match)
10387     {
10388       as_bad (_("Internal error: bad microMIPS opcode (mask error): %s %s"),
10389               opc->name, opc->args);
10390       return 0;
10391     }
10392   length = micromips_insn_length (opc);
10393   if (length != 2 && length != 4)
10394     {
10395       as_bad (_("Internal error: bad microMIPS opcode (incorrect length: %u): "
10396                 "%s %s"), length, opc->name, opc->args);
10397       return 0;
10398     }
10399   major = match >> (10 + 8 * (length - 2));
10400   if ((length == 2 && (major & 7) != 1 && (major & 6) != 2)
10401       || (length == 4 && (major & 7) != 0 && (major & 4) != 4))
10402     {
10403       as_bad (_("Internal error: bad microMIPS opcode "
10404                 "(opcode/length mismatch): %s %s"), opc->name, opc->args);
10405       return 0;
10406     }
10407
10408   /* Shift piecewise to avoid an overflow where unsigned long is 32-bit.  */
10409   insn_bits = 1 << 4 * length;
10410   insn_bits <<= 4 * length;
10411   insn_bits -= 1;
10412   used_bits = mask;
10413 #define USE_BITS(field) \
10414   (used_bits |= MICROMIPSOP_MASK_##field << MICROMIPSOP_SH_##field)
10415   while (*p)
10416     switch (c = *p++)
10417       {
10418       case ',': break;
10419       case '(': break;
10420       case ')': break;
10421       case '+':
10422         e = c;
10423         switch (c = *p++)
10424           {
10425           case 'A': USE_BITS (EXTLSB);  break;
10426           case 'B': USE_BITS (INSMSB);  break;
10427           case 'C': USE_BITS (EXTMSBD); break;
10428           case 'D': USE_BITS (RS);      USE_BITS (SEL); break;
10429           case 'E': USE_BITS (EXTLSB);  break;
10430           case 'F': USE_BITS (INSMSB);  break;
10431           case 'G': USE_BITS (EXTMSBD); break;
10432           case 'H': USE_BITS (EXTMSBD); break;
10433           default:
10434             as_bad (_("Internal error: bad mips opcode "
10435                       "(unknown extension operand type `%c%c'): %s %s"),
10436                     e, c, opc->name, opc->args);
10437             return 0;
10438           }
10439         break;
10440       case 'm':
10441         e = c;
10442         switch (c = *p++)
10443           {
10444           case 'A': USE_BITS (IMMA);    break;
10445           case 'B': USE_BITS (IMMB);    break;
10446           case 'C': USE_BITS (IMMC);    break;
10447           case 'D': USE_BITS (IMMD);    break;
10448           case 'E': USE_BITS (IMME);    break;
10449           case 'F': USE_BITS (IMMF);    break;
10450           case 'G': USE_BITS (IMMG);    break;
10451           case 'H': USE_BITS (IMMH);    break;
10452           case 'I': USE_BITS (IMMI);    break;
10453           case 'J': USE_BITS (IMMJ);    break;
10454           case 'L': USE_BITS (IMML);    break;
10455           case 'M': USE_BITS (IMMM);    break;
10456           case 'N': USE_BITS (IMMN);    break;
10457           case 'O': USE_BITS (IMMO);    break;
10458           case 'P': USE_BITS (IMMP);    break;
10459           case 'Q': USE_BITS (IMMQ);    break;
10460           case 'U': USE_BITS (IMMU);    break;
10461           case 'W': USE_BITS (IMMW);    break;
10462           case 'X': USE_BITS (IMMX);    break;
10463           case 'Y': USE_BITS (IMMY);    break;
10464           case 'Z': break;
10465           case 'a': break;
10466           case 'b': USE_BITS (MB);      break;
10467           case 'c': USE_BITS (MC);      break;
10468           case 'd': USE_BITS (MD);      break;
10469           case 'e': USE_BITS (ME);      break;
10470           case 'f': USE_BITS (MF);      break;
10471           case 'g': USE_BITS (MG);      break;
10472           case 'h': USE_BITS (MH);      break;
10473           case 'i': USE_BITS (MI);      break;
10474           case 'j': USE_BITS (MJ);      break;
10475           case 'l': USE_BITS (ML);      break;
10476           case 'm': USE_BITS (MM);      break;
10477           case 'n': USE_BITS (MN);      break;
10478           case 'p': USE_BITS (MP);      break;
10479           case 'q': USE_BITS (MQ);      break;
10480           case 'r': break;
10481           case 's': break;
10482           case 't': break;
10483           case 'x': break;
10484           case 'y': break;
10485           case 'z': break;
10486           default:
10487             as_bad (_("Internal error: bad mips opcode "
10488                       "(unknown extension operand type `%c%c'): %s %s"),
10489                     e, c, opc->name, opc->args);
10490             return 0;
10491           }
10492         break;
10493       case '.': USE_BITS (OFFSET10);    break;
10494       case '1': USE_BITS (STYPE);       break;
10495       case '2': USE_BITS (BP);          break;
10496       case '3': USE_BITS (SA3);         break;
10497       case '4': USE_BITS (SA4);         break;
10498       case '5': USE_BITS (IMM8);        break;
10499       case '6': USE_BITS (RS);          break;
10500       case '7': USE_BITS (DSPACC);      break;
10501       case '8': USE_BITS (WRDSP);       break;
10502       case '0': USE_BITS (DSPSFT);      break;
10503       case '<': USE_BITS (SHAMT);       break;
10504       case '>': USE_BITS (SHAMT);       break;
10505       case '@': USE_BITS (IMM10);       break;
10506       case 'B': USE_BITS (CODE10);      break;
10507       case 'C': USE_BITS (COPZ);        break;
10508       case 'D': USE_BITS (FD);          break;
10509       case 'E': USE_BITS (RT);          break;
10510       case 'G': USE_BITS (RS);          break;
10511       case 'H': USE_BITS (SEL);         break;
10512       case 'K': USE_BITS (RS);          break;
10513       case 'M': USE_BITS (CCC);         break;
10514       case 'N': USE_BITS (BCC);         break;
10515       case 'R': USE_BITS (FR);          break;
10516       case 'S': USE_BITS (FS);          break;
10517       case 'T': USE_BITS (FT);          break;
10518       case 'V': USE_BITS (FS);          break;
10519       case '\\': USE_BITS (3BITPOS);    break;
10520       case '^': USE_BITS (RD);          break;
10521       case 'a': USE_BITS (TARGET);      break;
10522       case 'b': USE_BITS (RS);          break;
10523       case 'c': USE_BITS (CODE);        break;
10524       case 'd': USE_BITS (RD);          break;
10525       case 'h': USE_BITS (PREFX);       break;
10526       case 'i': USE_BITS (IMMEDIATE);   break;
10527       case 'j': USE_BITS (DELTA);       break;
10528       case 'k': USE_BITS (CACHE);       break;
10529       case 'n': USE_BITS (RT);          break;
10530       case 'o': USE_BITS (DELTA);       break;
10531       case 'p': USE_BITS (DELTA);       break;
10532       case 'q': USE_BITS (CODE2);       break;
10533       case 'r': USE_BITS (RS);          break;
10534       case 's': USE_BITS (RS);          break;
10535       case 't': USE_BITS (RT);          break;
10536       case 'u': USE_BITS (IMMEDIATE);   break;
10537       case 'v': USE_BITS (RS);          break;
10538       case 'w': USE_BITS (RT);          break;
10539       case 'y': USE_BITS (RS3);         break;
10540       case 'z': break;
10541       case '|': USE_BITS (TRAP);        break;
10542       case '~': USE_BITS (OFFSET12);    break;
10543       default:
10544         as_bad (_("Internal error: bad microMIPS opcode "
10545                   "(unknown operand type `%c'): %s %s"),
10546                 c, opc->name, opc->args);
10547         return 0;
10548       }
10549 #undef USE_BITS
10550   if (used_bits != insn_bits)
10551     {
10552       if (~used_bits & insn_bits)
10553         as_bad (_("Internal error: bad microMIPS opcode "
10554                   "(bits 0x%lx undefined): %s %s"),
10555                 ~used_bits & insn_bits, opc->name, opc->args);
10556       if (used_bits & ~insn_bits)
10557         as_bad (_("Internal error: bad microMIPS opcode "
10558                   "(bits 0x%lx defined): %s %s"),
10559                 used_bits & ~insn_bits, opc->name, opc->args);
10560       return 0;
10561     }
10562   return 1;
10563 }
10564
10565 /* UDI immediates.  */
10566 struct mips_immed {
10567   char          type;
10568   unsigned int  shift;
10569   unsigned long mask;
10570   const char *  desc;
10571 };
10572
10573 static const struct mips_immed mips_immed[] = {
10574   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
10575   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
10576   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
10577   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
10578   { 0,0,0,0 }
10579 };
10580
10581 /* Check whether an odd floating-point register is allowed.  */
10582 static int
10583 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
10584 {
10585   const char *s = insn->name;
10586
10587   if (insn->pinfo == INSN_MACRO)
10588     /* Let a macro pass, we'll catch it later when it is expanded.  */
10589     return 1;
10590
10591   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
10592     {
10593       /* Allow odd registers for single-precision ops.  */
10594       switch (insn->pinfo & (FP_S | FP_D))
10595         {
10596         case FP_S:
10597         case 0:
10598           return 1;     /* both single precision - ok */
10599         case FP_D:
10600           return 0;     /* both double precision - fail */
10601         default:
10602           break;
10603         }
10604
10605       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
10606       s = strchr (insn->name, '.');
10607       if (argnum == 2)
10608         s = s != NULL ? strchr (s + 1, '.') : NULL;
10609       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
10610     } 
10611
10612   /* Single-precision coprocessor loads and moves are OK too.  */
10613   if ((insn->pinfo & FP_S)
10614       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
10615                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
10616     return 1;
10617
10618   return 0;
10619 }
10620
10621 /* Check if EXPR is a constant between MIN (inclusive) and MAX (exclusive)
10622    taking bits from BIT up.  */
10623 static int
10624 expr_const_in_range (expressionS *ep, offsetT min, offsetT max, int bit)
10625 {
10626   return (ep->X_op == O_constant
10627           && (ep->X_add_number & ((1 << bit) - 1)) == 0
10628           && ep->X_add_number >= min << bit
10629           && ep->X_add_number < max << bit);
10630 }
10631
10632 /* This routine assembles an instruction into its binary format.  As a
10633    side effect, it sets one of the global variables imm_reloc or
10634    offset_reloc to the type of relocation to do if one of the operands
10635    is an address expression.  */
10636
10637 static void
10638 mips_ip (char *str, struct mips_cl_insn *ip)
10639 {
10640   bfd_boolean wrong_delay_slot_insns = FALSE;
10641   bfd_boolean need_delay_slot_ok = TRUE;
10642   struct mips_opcode *firstinsn = NULL;
10643   const struct mips_opcode *past;
10644   struct hash_control *hash;
10645   char *s;
10646   const char *args;
10647   char c = 0;
10648   struct mips_opcode *insn;
10649   char *argsStart;
10650   unsigned int regno;
10651   unsigned int lastregno;
10652   unsigned int destregno = 0;
10653   unsigned int lastpos = 0;
10654   unsigned int limlo, limhi;
10655   char *s_reset;
10656   offsetT min_range, max_range;
10657   long opend;
10658   char *name;
10659   int argnum;
10660   unsigned int rtype;
10661   char *dot;
10662   long end;
10663
10664   insn_error = NULL;
10665
10666   if (mips_opts.micromips)
10667     {
10668       hash = micromips_op_hash;
10669       past = &micromips_opcodes[bfd_micromips_num_opcodes];
10670     }
10671   else
10672     {
10673       hash = op_hash;
10674       past = &mips_opcodes[NUMOPCODES];
10675     }
10676   forced_insn_length = 0;
10677   insn = NULL;
10678
10679   /* We first try to match an instruction up to a space or to the end.  */
10680   for (end = 0; str[end] != '\0' && !ISSPACE (str[end]); end++)
10681     continue;
10682
10683   /* Make a copy of the instruction so that we can fiddle with it.  */
10684   name = alloca (end + 1);
10685   memcpy (name, str, end);
10686   name[end] = '\0';
10687
10688   for (;;)
10689     {
10690       insn = (struct mips_opcode *) hash_find (hash, name);
10691
10692       if (insn != NULL || !mips_opts.micromips)
10693         break;
10694       if (forced_insn_length)
10695         break;
10696
10697       /* See if there's an instruction size override suffix,
10698          either `16' or `32', at the end of the mnemonic proper,
10699          that defines the operation, i.e. before the first `.'
10700          character if any.  Strip it and retry.  */
10701       dot = strchr (name, '.');
10702       opend = dot != NULL ? dot - name : end;
10703       if (opend < 3)
10704         break;
10705       if (name[opend - 2] == '1' && name[opend - 1] == '6')
10706         forced_insn_length = 2;
10707       else if (name[opend - 2] == '3' && name[opend - 1] == '2')
10708         forced_insn_length = 4;
10709       else
10710         break;
10711       memcpy (name + opend - 2, name + opend, end - opend + 1);
10712     }
10713   if (insn == NULL)
10714     {
10715       insn_error = _("Unrecognized opcode");
10716       return;
10717     }
10718
10719   /* For microMIPS instructions placed in a fixed-length branch delay slot
10720      we make up to two passes over the relevant fragment of the opcode
10721      table.  First we try instructions that meet the delay slot's length
10722      requirement.  If none matched, then we retry with the remaining ones
10723      and if one matches, then we use it and then issue an appropriate
10724      warning later on.  */
10725   argsStart = s = str + end;
10726   for (;;)
10727     {
10728       bfd_boolean delay_slot_ok;
10729       bfd_boolean size_ok;
10730       bfd_boolean ok;
10731
10732       gas_assert (strcmp (insn->name, name) == 0);
10733
10734       ok = is_opcode_valid (insn);
10735       size_ok = is_size_valid (insn);
10736       delay_slot_ok = is_delay_slot_valid (insn);
10737       if (!delay_slot_ok && !wrong_delay_slot_insns)
10738         {
10739           firstinsn = insn;
10740           wrong_delay_slot_insns = TRUE;
10741         }
10742       if (!ok || !size_ok || delay_slot_ok != need_delay_slot_ok)
10743         {
10744           static char buf[256];
10745
10746           if (insn + 1 < past && strcmp (insn->name, insn[1].name) == 0)
10747             {
10748               ++insn;
10749               continue;
10750             }
10751           if (wrong_delay_slot_insns && need_delay_slot_ok)
10752             {
10753               gas_assert (firstinsn);
10754               need_delay_slot_ok = FALSE;
10755               past = insn + 1;
10756               insn = firstinsn;
10757               continue;
10758             }
10759
10760           if (insn_error)
10761             return;
10762
10763           if (!ok)
10764             sprintf (buf, _("Opcode not supported on this processor: %s (%s)"),
10765                      mips_cpu_info_from_arch (mips_opts.arch)->name,
10766                      mips_cpu_info_from_isa (mips_opts.isa)->name);
10767           else
10768             sprintf (buf, _("Unrecognized %u-bit version of microMIPS opcode"),
10769                      8 * forced_insn_length);
10770           insn_error = buf;
10771
10772           return;
10773         }
10774
10775       create_insn (ip, insn);
10776       insn_error = NULL;
10777       argnum = 1;
10778       lastregno = 0xffffffff;
10779       for (args = insn->args;; ++args)
10780         {
10781           int is_mdmx;
10782
10783           s += strspn (s, " \t");
10784           is_mdmx = 0;
10785           switch (*args)
10786             {
10787             case '\0':          /* end of args */
10788               if (*s == '\0')
10789                 return;
10790               break;
10791
10792             case '2':
10793               /* DSP 2-bit unsigned immediate in bit 11 (for standard MIPS
10794                  code) or 14 (for microMIPS code).  */
10795               my_getExpression (&imm_expr, s);
10796               check_absolute_expr (ip, &imm_expr);
10797               if ((unsigned long) imm_expr.X_add_number != 1
10798                   && (unsigned long) imm_expr.X_add_number != 3)
10799                 {
10800                   as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
10801                           (unsigned long) imm_expr.X_add_number);
10802                 }
10803               INSERT_OPERAND (mips_opts.micromips,
10804                               BP, *ip, imm_expr.X_add_number);
10805               imm_expr.X_op = O_absent;
10806               s = expr_end;
10807               continue;
10808
10809             case '3':
10810               /* DSP 3-bit unsigned immediate in bit 13 (for standard MIPS
10811                  code) or 21 (for microMIPS code).  */
10812               {
10813                 unsigned long mask = (mips_opts.micromips
10814                                       ? MICROMIPSOP_MASK_SA3 : OP_MASK_SA3);
10815
10816                 my_getExpression (&imm_expr, s);
10817                 check_absolute_expr (ip, &imm_expr);
10818                 if ((unsigned long) imm_expr.X_add_number > mask)
10819                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
10820                           mask, (unsigned long) imm_expr.X_add_number);
10821                 INSERT_OPERAND (mips_opts.micromips,
10822                                 SA3, *ip, imm_expr.X_add_number);
10823                 imm_expr.X_op = O_absent;
10824                 s = expr_end;
10825               }
10826               continue;
10827
10828             case '4':
10829               /* DSP 4-bit unsigned immediate in bit 12 (for standard MIPS
10830                  code) or 21 (for microMIPS code).  */
10831               {
10832                 unsigned long mask = (mips_opts.micromips
10833                                       ? MICROMIPSOP_MASK_SA4 : OP_MASK_SA4);
10834
10835                 my_getExpression (&imm_expr, s);
10836                 check_absolute_expr (ip, &imm_expr);
10837                 if ((unsigned long) imm_expr.X_add_number > mask)
10838                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
10839                           mask, (unsigned long) imm_expr.X_add_number);
10840                 INSERT_OPERAND (mips_opts.micromips,
10841                                 SA4, *ip, imm_expr.X_add_number);
10842                 imm_expr.X_op = O_absent;
10843                 s = expr_end;
10844               }
10845               continue;
10846
10847             case '5':
10848               /* DSP 8-bit unsigned immediate in bit 13 (for standard MIPS
10849                  code) or 16 (for microMIPS code).  */
10850               {
10851                 unsigned long mask = (mips_opts.micromips
10852                                       ? MICROMIPSOP_MASK_IMM8 : OP_MASK_IMM8);
10853
10854                 my_getExpression (&imm_expr, s);
10855                 check_absolute_expr (ip, &imm_expr);
10856                 if ((unsigned long) imm_expr.X_add_number > mask)
10857                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
10858                           mask, (unsigned long) imm_expr.X_add_number);
10859                 INSERT_OPERAND (mips_opts.micromips,
10860                                 IMM8, *ip, imm_expr.X_add_number);
10861                 imm_expr.X_op = O_absent;
10862                 s = expr_end;
10863               }
10864               continue;
10865
10866             case '6':
10867               /* DSP 5-bit unsigned immediate in bit 16 (for standard MIPS
10868                  code) or 21 (for microMIPS code).  */
10869               {
10870                 unsigned long mask = (mips_opts.micromips
10871                                       ? MICROMIPSOP_MASK_RS : OP_MASK_RS);
10872
10873                 my_getExpression (&imm_expr, s);
10874                 check_absolute_expr (ip, &imm_expr);
10875                 if ((unsigned long) imm_expr.X_add_number > mask)
10876                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
10877                           mask, (unsigned long) imm_expr.X_add_number);
10878                 INSERT_OPERAND (mips_opts.micromips,
10879                                 RS, *ip, imm_expr.X_add_number);
10880                 imm_expr.X_op = O_absent;
10881                 s = expr_end;
10882               }
10883               continue;
10884
10885             case '7': /* Four DSP accumulators in bits 11,12.  */
10886               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c'
10887                   && s[3] >= '0' && s[3] <= '3')
10888                 {
10889                   regno = s[3] - '0';
10890                   s += 4;
10891                   INSERT_OPERAND (mips_opts.micromips, DSPACC, *ip, regno);
10892                   continue;
10893                 }
10894               else
10895                 as_bad (_("Invalid dsp acc register"));
10896               break;
10897
10898             case '8':
10899               /* DSP 6-bit unsigned immediate in bit 11 (for standard MIPS
10900                  code) or 14 (for microMIPS code).  */
10901               {
10902                 unsigned long mask = (mips_opts.micromips
10903                                       ? MICROMIPSOP_MASK_WRDSP
10904                                       : OP_MASK_WRDSP);
10905
10906                 my_getExpression (&imm_expr, s);
10907                 check_absolute_expr (ip, &imm_expr);
10908                 if ((unsigned long) imm_expr.X_add_number > mask)
10909                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
10910                           mask, (unsigned long) imm_expr.X_add_number);
10911                 INSERT_OPERAND (mips_opts.micromips,
10912                                 WRDSP, *ip, imm_expr.X_add_number);
10913                 imm_expr.X_op = O_absent;
10914                 s = expr_end;
10915               }
10916               continue;
10917
10918             case '9': /* Four DSP accumulators in bits 21,22.  */
10919               gas_assert (!mips_opts.micromips);
10920               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c'
10921                   && s[3] >= '0' && s[3] <= '3')
10922                 {
10923                   regno = s[3] - '0';
10924                   s += 4;
10925                   INSERT_OPERAND (0, DSPACC_S, *ip, regno);
10926                   continue;
10927                 }
10928               else
10929                 as_bad (_("Invalid dsp acc register"));
10930               break;
10931
10932             case '0':
10933               /* DSP 6-bit signed immediate in bit 16 (for standard MIPS
10934                  code) or 20 (for microMIPS code).  */
10935               {
10936                 long mask = (mips_opts.micromips
10937                              ? MICROMIPSOP_MASK_DSPSFT : OP_MASK_DSPSFT);
10938
10939                 my_getExpression (&imm_expr, s);
10940                 check_absolute_expr (ip, &imm_expr);
10941                 min_range = -((mask + 1) >> 1);
10942                 max_range = ((mask + 1) >> 1) - 1;
10943                 if (imm_expr.X_add_number < min_range
10944                     || imm_expr.X_add_number > max_range)
10945                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
10946                           (long) min_range, (long) max_range,
10947                           (long) imm_expr.X_add_number);
10948                 INSERT_OPERAND (mips_opts.micromips,
10949                                 DSPSFT, *ip, imm_expr.X_add_number);
10950                 imm_expr.X_op = O_absent;
10951                 s = expr_end;
10952               }
10953               continue;
10954
10955             case '\'': /* DSP 6-bit unsigned immediate in bit 16.  */
10956               gas_assert (!mips_opts.micromips);
10957               my_getExpression (&imm_expr, s);
10958               check_absolute_expr (ip, &imm_expr);
10959               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
10960                 {
10961                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10962                           OP_MASK_RDDSP,
10963                           (unsigned long) imm_expr.X_add_number);
10964                 }
10965               INSERT_OPERAND (0, RDDSP, *ip, imm_expr.X_add_number);
10966               imm_expr.X_op = O_absent;
10967               s = expr_end;
10968               continue;
10969
10970             case ':': /* DSP 7-bit signed immediate in bit 19.  */
10971               gas_assert (!mips_opts.micromips);
10972               my_getExpression (&imm_expr, s);
10973               check_absolute_expr (ip, &imm_expr);
10974               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
10975               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
10976               if (imm_expr.X_add_number < min_range ||
10977                   imm_expr.X_add_number > max_range)
10978                 {
10979                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
10980                           (long) min_range, (long) max_range,
10981                           (long) imm_expr.X_add_number);
10982                 }
10983               INSERT_OPERAND (0, DSPSFT_7, *ip, imm_expr.X_add_number);
10984               imm_expr.X_op = O_absent;
10985               s = expr_end;
10986               continue;
10987
10988             case '@': /* DSP 10-bit signed immediate in bit 16.  */
10989               {
10990                 long mask = (mips_opts.micromips
10991                              ? MICROMIPSOP_MASK_IMM10 : OP_MASK_IMM10);
10992
10993                 my_getExpression (&imm_expr, s);
10994                 check_absolute_expr (ip, &imm_expr);
10995                 min_range = -((mask + 1) >> 1);
10996                 max_range = ((mask + 1) >> 1) - 1;
10997                 if (imm_expr.X_add_number < min_range
10998                     || imm_expr.X_add_number > max_range)
10999                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11000                           (long) min_range, (long) max_range,
11001                           (long) imm_expr.X_add_number);
11002                 INSERT_OPERAND (mips_opts.micromips,
11003                                 IMM10, *ip, imm_expr.X_add_number);
11004                 imm_expr.X_op = O_absent;
11005                 s = expr_end;
11006               }
11007               continue;
11008
11009             case '^': /* DSP 5-bit unsigned immediate in bit 11.  */
11010               gas_assert (mips_opts.micromips);
11011               my_getExpression (&imm_expr, s);
11012               check_absolute_expr (ip, &imm_expr);
11013               if (imm_expr.X_add_number & ~MICROMIPSOP_MASK_RD)
11014                 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
11015                         MICROMIPSOP_MASK_RD,
11016                         (unsigned long) imm_expr.X_add_number);
11017               INSERT_OPERAND (1, RD, *ip, imm_expr.X_add_number);
11018               imm_expr.X_op = O_absent;
11019               s = expr_end;
11020               continue;
11021
11022             case '!': /* MT usermode flag bit.  */
11023               gas_assert (!mips_opts.micromips);
11024               my_getExpression (&imm_expr, s);
11025               check_absolute_expr (ip, &imm_expr);
11026               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
11027                 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
11028                         (unsigned long) imm_expr.X_add_number);
11029               INSERT_OPERAND (0, MT_U, *ip, imm_expr.X_add_number);
11030               imm_expr.X_op = O_absent;
11031               s = expr_end;
11032               continue;
11033
11034             case '$': /* MT load high flag bit.  */
11035               gas_assert (!mips_opts.micromips);
11036               my_getExpression (&imm_expr, s);
11037               check_absolute_expr (ip, &imm_expr);
11038               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
11039                 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
11040                         (unsigned long) imm_expr.X_add_number);
11041               INSERT_OPERAND (0, MT_H, *ip, imm_expr.X_add_number);
11042               imm_expr.X_op = O_absent;
11043               s = expr_end;
11044               continue;
11045
11046             case '*': /* Four DSP accumulators in bits 18,19.  */
11047               gas_assert (!mips_opts.micromips);
11048               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
11049                   s[3] >= '0' && s[3] <= '3')
11050                 {
11051                   regno = s[3] - '0';
11052                   s += 4;
11053                   INSERT_OPERAND (0, MTACC_T, *ip, regno);
11054                   continue;
11055                 }
11056               else
11057                 as_bad (_("Invalid dsp/smartmips acc register"));
11058               break;
11059
11060             case '&': /* Four DSP accumulators in bits 13,14.  */
11061               gas_assert (!mips_opts.micromips);
11062               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
11063                   s[3] >= '0' && s[3] <= '3')
11064                 {
11065                   regno = s[3] - '0';
11066                   s += 4;
11067                   INSERT_OPERAND (0, MTACC_D, *ip, regno);
11068                   continue;
11069                 }
11070               else
11071                 as_bad (_("Invalid dsp/smartmips acc register"));
11072               break;
11073
11074             case '\\':          /* 3-bit bit position.  */
11075               {
11076                 unsigned long mask = (mips_opts.micromips
11077                                       ? MICROMIPSOP_MASK_3BITPOS
11078                                       : OP_MASK_3BITPOS);
11079
11080                 my_getExpression (&imm_expr, s);
11081                 check_absolute_expr (ip, &imm_expr);
11082                 if ((unsigned long) imm_expr.X_add_number > mask)
11083                   as_warn (_("Bit position for %s not in range 0..%lu (%lu)"),
11084                            ip->insn_mo->name,
11085                            mask, (unsigned long) imm_expr.X_add_number);
11086                 INSERT_OPERAND (mips_opts.micromips,
11087                                 3BITPOS, *ip, imm_expr.X_add_number);
11088                 imm_expr.X_op = O_absent;
11089                 s = expr_end;
11090               }
11091               continue;
11092
11093             case ',':
11094               ++argnum;
11095               if (*s++ == *args)
11096                 continue;
11097               s--;
11098               switch (*++args)
11099                 {
11100                 case 'r':
11101                 case 'v':
11102                   INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
11103                   continue;
11104
11105                 case 'w':
11106                   INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
11107                   continue;
11108
11109                 case 'W':
11110                   gas_assert (!mips_opts.micromips);
11111                   INSERT_OPERAND (0, FT, *ip, lastregno);
11112                   continue;
11113
11114                 case 'V':
11115                   INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
11116                   continue;
11117                 }
11118               break;
11119
11120             case '(':
11121               /* Handle optional base register.
11122                  Either the base register is omitted or
11123                  we must have a left paren.  */
11124               /* This is dependent on the next operand specifier
11125                  is a base register specification.  */
11126               gas_assert (args[1] == 'b'
11127                           || (mips_opts.micromips
11128                               && args[1] == 'm'
11129                               && (args[2] == 'l' || args[2] == 'n'
11130                                   || args[2] == 's' || args[2] == 'a')));
11131               if (*s == '\0' && args[1] == 'b')
11132                 return;
11133               /* Fall through.  */
11134
11135             case ')':           /* These must match exactly.  */
11136               if (*s++ == *args)
11137                 continue;
11138               break;
11139
11140             case '[':           /* These must match exactly.  */
11141             case ']':
11142               gas_assert (!mips_opts.micromips);
11143               if (*s++ == *args)
11144                 continue;
11145               break;
11146
11147             case '+':           /* Opcode extension character.  */
11148               switch (*++args)
11149                 {
11150                 case '1':       /* UDI immediates.  */
11151                 case '2':
11152                 case '3':
11153                 case '4':
11154                   gas_assert (!mips_opts.micromips);
11155                   {
11156                     const struct mips_immed *imm = mips_immed;
11157
11158                     while (imm->type && imm->type != *args)
11159                       ++imm;
11160                     if (! imm->type)
11161                       internalError ();
11162                     my_getExpression (&imm_expr, s);
11163                     check_absolute_expr (ip, &imm_expr);
11164                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
11165                       {
11166                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
11167                                  imm->desc ? imm->desc : ip->insn_mo->name,
11168                                  (unsigned long) imm_expr.X_add_number,
11169                                  (unsigned long) imm_expr.X_add_number);
11170                         imm_expr.X_add_number &= imm->mask;
11171                       }
11172                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
11173                                         << imm->shift);
11174                     imm_expr.X_op = O_absent;
11175                     s = expr_end;
11176                   }
11177                   continue;
11178
11179                 case 'A':               /* ins/ext position, becomes LSB.  */
11180                   limlo = 0;
11181                   limhi = 31;
11182                   goto do_lsb;
11183                 case 'E':
11184                   limlo = 32;
11185                   limhi = 63;
11186                   goto do_lsb;
11187                 do_lsb:
11188                   my_getExpression (&imm_expr, s);
11189                   check_absolute_expr (ip, &imm_expr);
11190                   if ((unsigned long) imm_expr.X_add_number < limlo
11191                       || (unsigned long) imm_expr.X_add_number > limhi)
11192                     {
11193                       as_bad (_("Improper position (%lu)"),
11194                               (unsigned long) imm_expr.X_add_number);
11195                       imm_expr.X_add_number = limlo;
11196                     }
11197                   lastpos = imm_expr.X_add_number;
11198                   INSERT_OPERAND (mips_opts.micromips,
11199                                   EXTLSB, *ip, imm_expr.X_add_number);
11200                   imm_expr.X_op = O_absent;
11201                   s = expr_end;
11202                   continue;
11203
11204                 case 'B':               /* ins size, becomes MSB.  */
11205                   limlo = 1;
11206                   limhi = 32;
11207                   goto do_msb;
11208                 case 'F':
11209                   limlo = 33;
11210                   limhi = 64;
11211                   goto do_msb;
11212                 do_msb:
11213                   my_getExpression (&imm_expr, s);
11214                   check_absolute_expr (ip, &imm_expr);
11215                   /* Check for negative input so that small negative numbers
11216                      will not succeed incorrectly.  The checks against
11217                      (pos+size) transitively check "size" itself,
11218                      assuming that "pos" is reasonable.  */
11219                   if ((long) imm_expr.X_add_number < 0
11220                       || ((unsigned long) imm_expr.X_add_number
11221                           + lastpos) < limlo
11222                       || ((unsigned long) imm_expr.X_add_number
11223                           + lastpos) > limhi)
11224                     {
11225                       as_bad (_("Improper insert size (%lu, position %lu)"),
11226                               (unsigned long) imm_expr.X_add_number,
11227                               (unsigned long) lastpos);
11228                       imm_expr.X_add_number = limlo - lastpos;
11229                     }
11230                   INSERT_OPERAND (mips_opts.micromips, INSMSB, *ip,
11231                                   lastpos + imm_expr.X_add_number - 1);
11232                   imm_expr.X_op = O_absent;
11233                   s = expr_end;
11234                   continue;
11235
11236                 case 'C':               /* ext size, becomes MSBD.  */
11237                   limlo = 1;
11238                   limhi = 32;
11239                   goto do_msbd;
11240                 case 'G':
11241                   limlo = 33;
11242                   limhi = 64;
11243                   goto do_msbd;
11244                 case 'H':
11245                   limlo = 33;
11246                   limhi = 64;
11247                   goto do_msbd;
11248                 do_msbd:
11249                   my_getExpression (&imm_expr, s);
11250                   check_absolute_expr (ip, &imm_expr);
11251                   /* Check for negative input so that small negative numbers
11252                      will not succeed incorrectly.  The checks against
11253                      (pos+size) transitively check "size" itself,
11254                      assuming that "pos" is reasonable.  */
11255                   if ((long) imm_expr.X_add_number < 0
11256                       || ((unsigned long) imm_expr.X_add_number
11257                           + lastpos) < limlo
11258                       || ((unsigned long) imm_expr.X_add_number
11259                           + lastpos) > limhi)
11260                     {
11261                       as_bad (_("Improper extract size (%lu, position %lu)"),
11262                               (unsigned long) imm_expr.X_add_number,
11263                               (unsigned long) lastpos);
11264                       imm_expr.X_add_number = limlo - lastpos;
11265                     }
11266                   INSERT_OPERAND (mips_opts.micromips,
11267                                   EXTMSBD, *ip, imm_expr.X_add_number - 1);
11268                   imm_expr.X_op = O_absent;
11269                   s = expr_end;
11270                   continue;
11271
11272                 case 'D':
11273                   /* +D is for disassembly only; never match.  */
11274                   break;
11275
11276                 case 'I':
11277                   /* "+I" is like "I", except that imm2_expr is used.  */
11278                   my_getExpression (&imm2_expr, s);
11279                   if (imm2_expr.X_op != O_big
11280                       && imm2_expr.X_op != O_constant)
11281                   insn_error = _("absolute expression required");
11282                   if (HAVE_32BIT_GPRS)
11283                     normalize_constant_expr (&imm2_expr);
11284                   s = expr_end;
11285                   continue;
11286
11287                 case 'T': /* Coprocessor register.  */
11288                   gas_assert (!mips_opts.micromips);
11289                   /* +T is for disassembly only; never match.  */
11290                   break;
11291
11292                 case 't': /* Coprocessor register number.  */
11293                   gas_assert (!mips_opts.micromips);
11294                   if (s[0] == '$' && ISDIGIT (s[1]))
11295                     {
11296                       ++s;
11297                       regno = 0;
11298                       do
11299                         {
11300                           regno *= 10;
11301                           regno += *s - '0';
11302                           ++s;
11303                         }
11304                       while (ISDIGIT (*s));
11305                       if (regno > 31)
11306                         as_bad (_("Invalid register number (%d)"), regno);
11307                       else
11308                         {
11309                           INSERT_OPERAND (0, RT, *ip, regno);
11310                           continue;
11311                         }
11312                     }
11313                   else
11314                     as_bad (_("Invalid coprocessor 0 register number"));
11315                   break;
11316
11317                 case 'x':
11318                   /* bbit[01] and bbit[01]32 bit index.  Give error if index
11319                      is not in the valid range.  */
11320                   gas_assert (!mips_opts.micromips);
11321                   my_getExpression (&imm_expr, s);
11322                   check_absolute_expr (ip, &imm_expr);
11323                   if ((unsigned) imm_expr.X_add_number > 31)
11324                     {
11325                       as_bad (_("Improper bit index (%lu)"),
11326                               (unsigned long) imm_expr.X_add_number);
11327                       imm_expr.X_add_number = 0;
11328                     }
11329                   INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number);
11330                   imm_expr.X_op = O_absent;
11331                   s = expr_end;
11332                   continue;
11333
11334                 case 'X':
11335                   /* bbit[01] bit index when bbit is used but we generate
11336                      bbit[01]32 because the index is over 32.  Move to the
11337                      next candidate if index is not in the valid range.  */
11338                   gas_assert (!mips_opts.micromips);
11339                   my_getExpression (&imm_expr, s);
11340                   check_absolute_expr (ip, &imm_expr);
11341                   if ((unsigned) imm_expr.X_add_number < 32
11342                       || (unsigned) imm_expr.X_add_number > 63)
11343                     break;
11344                   INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number - 32);
11345                   imm_expr.X_op = O_absent;
11346                   s = expr_end;
11347                   continue;
11348
11349                 case 'p':
11350                   /* cins, cins32, exts and exts32 position field.  Give error
11351                      if it's not in the valid range.  */
11352                   gas_assert (!mips_opts.micromips);
11353                   my_getExpression (&imm_expr, s);
11354                   check_absolute_expr (ip, &imm_expr);
11355                   if ((unsigned) imm_expr.X_add_number > 31)
11356                     {
11357                       as_bad (_("Improper position (%lu)"),
11358                               (unsigned long) imm_expr.X_add_number);
11359                       imm_expr.X_add_number = 0;
11360                     }
11361                   /* Make the pos explicit to simplify +S.  */
11362                   lastpos = imm_expr.X_add_number + 32;
11363                   INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number);
11364                   imm_expr.X_op = O_absent;
11365                   s = expr_end;
11366                   continue;
11367
11368                 case 'P':
11369                   /* cins, cins32, exts and exts32 position field.  Move to
11370                      the next candidate if it's not in the valid range.  */
11371                   gas_assert (!mips_opts.micromips);
11372                   my_getExpression (&imm_expr, s);
11373                   check_absolute_expr (ip, &imm_expr);
11374                   if ((unsigned) imm_expr.X_add_number < 32
11375                       || (unsigned) imm_expr.X_add_number > 63)
11376                     break;
11377                   lastpos = imm_expr.X_add_number;
11378                   INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number - 32);
11379                   imm_expr.X_op = O_absent;
11380                   s = expr_end;
11381                   continue;
11382
11383                 case 's':
11384                   /* cins and exts length-minus-one field.  */
11385                   gas_assert (!mips_opts.micromips);
11386                   my_getExpression (&imm_expr, s);
11387                   check_absolute_expr (ip, &imm_expr);
11388                   if ((unsigned long) imm_expr.X_add_number > 31)
11389                     {
11390                       as_bad (_("Improper size (%lu)"),
11391                               (unsigned long) imm_expr.X_add_number);
11392                       imm_expr.X_add_number = 0;
11393                     }
11394                   INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
11395                   imm_expr.X_op = O_absent;
11396                   s = expr_end;
11397                   continue;
11398
11399                 case 'S':
11400                   /* cins32/exts32 and cins/exts aliasing cint32/exts32
11401                      length-minus-one field.  */
11402                   gas_assert (!mips_opts.micromips);
11403                   my_getExpression (&imm_expr, s);
11404                   check_absolute_expr (ip, &imm_expr);
11405                   if ((long) imm_expr.X_add_number < 0
11406                       || (unsigned long) imm_expr.X_add_number + lastpos > 63)
11407                     {
11408                       as_bad (_("Improper size (%lu)"),
11409                               (unsigned long) imm_expr.X_add_number);
11410                       imm_expr.X_add_number = 0;
11411                     }
11412                   INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
11413                   imm_expr.X_op = O_absent;
11414                   s = expr_end;
11415                   continue;
11416
11417                 case 'Q':
11418                   /* seqi/snei immediate field.  */
11419                   gas_assert (!mips_opts.micromips);
11420                   my_getExpression (&imm_expr, s);
11421                   check_absolute_expr (ip, &imm_expr);
11422                   if ((long) imm_expr.X_add_number < -512
11423                       || (long) imm_expr.X_add_number >= 512)
11424                     {
11425                       as_bad (_("Improper immediate (%ld)"),
11426                                (long) imm_expr.X_add_number);
11427                       imm_expr.X_add_number = 0;
11428                     }
11429                   INSERT_OPERAND (0, SEQI, *ip, imm_expr.X_add_number);
11430                   imm_expr.X_op = O_absent;
11431                   s = expr_end;
11432                   continue;
11433
11434                 case 'a': /* 8-bit signed offset in bit 6 */
11435                   gas_assert (!mips_opts.micromips);
11436                   my_getExpression (&imm_expr, s);
11437                   check_absolute_expr (ip, &imm_expr);
11438                   min_range = -((OP_MASK_OFFSET_A + 1) >> 1);
11439                   max_range = ((OP_MASK_OFFSET_A + 1) >> 1) - 1;
11440                   if (imm_expr.X_add_number < min_range
11441                       || imm_expr.X_add_number > max_range)
11442                     {
11443                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
11444                               (long) min_range, (long) max_range,
11445                               (long) imm_expr.X_add_number);
11446                     }
11447                   INSERT_OPERAND (0, OFFSET_A, *ip, imm_expr.X_add_number);
11448                   imm_expr.X_op = O_absent;
11449                   s = expr_end;
11450                   continue;
11451
11452                 case 'b': /* 8-bit signed offset in bit 3 */
11453                   gas_assert (!mips_opts.micromips);
11454                   my_getExpression (&imm_expr, s);
11455                   check_absolute_expr (ip, &imm_expr);
11456                   min_range = -((OP_MASK_OFFSET_B + 1) >> 1);
11457                   max_range = ((OP_MASK_OFFSET_B + 1) >> 1) - 1;
11458                   if (imm_expr.X_add_number < min_range
11459                       || imm_expr.X_add_number > max_range)
11460                     {
11461                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
11462                               (long) min_range, (long) max_range,
11463                               (long) imm_expr.X_add_number);
11464                     }
11465                   INSERT_OPERAND (0, OFFSET_B, *ip, imm_expr.X_add_number);
11466                   imm_expr.X_op = O_absent;
11467                   s = expr_end;
11468                   continue;
11469
11470                 case 'c': /* 9-bit signed offset in bit 6 */
11471                   gas_assert (!mips_opts.micromips);
11472                   my_getExpression (&imm_expr, s);
11473                   check_absolute_expr (ip, &imm_expr);
11474                   min_range = -((OP_MASK_OFFSET_C + 1) >> 1);
11475                   max_range = ((OP_MASK_OFFSET_C + 1) >> 1) - 1;
11476                   /* We check the offset range before adjusted.  */
11477                   min_range <<= 4;
11478                   max_range <<= 4;
11479                   if (imm_expr.X_add_number < min_range
11480                       || imm_expr.X_add_number > max_range)
11481                     {
11482                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
11483                               (long) min_range, (long) max_range,
11484                               (long) imm_expr.X_add_number);
11485                     }
11486                   if (imm_expr.X_add_number & 0xf)
11487                     {
11488                       as_bad (_("Offset not 16 bytes alignment (%ld)"),
11489                               (long) imm_expr.X_add_number);
11490                     }
11491                   /* Right shift 4 bits to adjust the offset operand.  */
11492                   INSERT_OPERAND (0, OFFSET_C, *ip,
11493                                   imm_expr.X_add_number >> 4);
11494                   imm_expr.X_op = O_absent;
11495                   s = expr_end;
11496                   continue;
11497
11498                 case 'z':
11499                   gas_assert (!mips_opts.micromips);
11500                   if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
11501                     break;
11502                   if (regno == AT && mips_opts.at)
11503                     {
11504                       if (mips_opts.at == ATREG)
11505                         as_warn (_("used $at without \".set noat\""));
11506                       else
11507                         as_warn (_("used $%u with \".set at=$%u\""),
11508                                  regno, mips_opts.at);
11509                     }
11510                   INSERT_OPERAND (0, RZ, *ip, regno);
11511                   continue;
11512
11513                 case 'Z':
11514                   gas_assert (!mips_opts.micromips);
11515                   if (!reg_lookup (&s, RTYPE_FPU, &regno))
11516                     break;
11517                   INSERT_OPERAND (0, FZ, *ip, regno);
11518                   continue;
11519
11520                 default:
11521                   as_bad (_("Internal error: bad %s opcode "
11522                             "(unknown extension operand type `+%c'): %s %s"),
11523                           mips_opts.micromips ? "microMIPS" : "MIPS",
11524                           *args, insn->name, insn->args);
11525                   /* Further processing is fruitless.  */
11526                   return;
11527                 }
11528               break;
11529
11530             case '.':           /* 10-bit offset.  */
11531               gas_assert (mips_opts.micromips);
11532             case '~':           /* 12-bit offset.  */
11533               {
11534                 int shift = *args == '.' ? 9 : 11;
11535                 size_t i;
11536
11537                 /* Check whether there is only a single bracketed expression
11538                    left.  If so, it must be the base register and the
11539                    constant must be zero.  */
11540                 if (*s == '(' && strchr (s + 1, '(') == 0)
11541                   continue;
11542
11543                 /* If this value won't fit into the offset, then go find
11544                    a macro that will generate a 16- or 32-bit offset code
11545                    pattern.  */
11546                 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
11547                 if ((i == 0 && (imm_expr.X_op != O_constant
11548                                 || imm_expr.X_add_number >= 1 << shift
11549                                 || imm_expr.X_add_number < -1 << shift))
11550                     || i > 0)
11551                   {
11552                     imm_expr.X_op = O_absent;
11553                     break;
11554                   }
11555                 if (shift == 9)
11556                   INSERT_OPERAND (1, OFFSET10, *ip, imm_expr.X_add_number);
11557                 else
11558                   INSERT_OPERAND (mips_opts.micromips,
11559                                   OFFSET12, *ip, imm_expr.X_add_number);
11560                 imm_expr.X_op = O_absent;
11561                 s = expr_end;
11562               }
11563               continue;
11564
11565             case '<':           /* must be at least one digit */
11566               /*
11567                * According to the manual, if the shift amount is greater
11568                * than 31 or less than 0, then the shift amount should be
11569                * mod 32.  In reality the mips assembler issues an error.
11570                * We issue a warning and mask out all but the low 5 bits.
11571                */
11572               my_getExpression (&imm_expr, s);
11573               check_absolute_expr (ip, &imm_expr);
11574               if ((unsigned long) imm_expr.X_add_number > 31)
11575                 as_warn (_("Improper shift amount (%lu)"),
11576                          (unsigned long) imm_expr.X_add_number);
11577               INSERT_OPERAND (mips_opts.micromips,
11578                               SHAMT, *ip, imm_expr.X_add_number);
11579               imm_expr.X_op = O_absent;
11580               s = expr_end;
11581               continue;
11582
11583             case '>':           /* shift amount minus 32 */
11584               my_getExpression (&imm_expr, s);
11585               check_absolute_expr (ip, &imm_expr);
11586               if ((unsigned long) imm_expr.X_add_number < 32
11587                   || (unsigned long) imm_expr.X_add_number > 63)
11588                 break;
11589               INSERT_OPERAND (mips_opts.micromips,
11590                               SHAMT, *ip, imm_expr.X_add_number - 32);
11591               imm_expr.X_op = O_absent;
11592               s = expr_end;
11593               continue;
11594
11595             case 'k':           /* CACHE code.  */
11596             case 'h':           /* PREFX code.  */
11597             case '1':           /* SYNC type.  */
11598               my_getExpression (&imm_expr, s);
11599               check_absolute_expr (ip, &imm_expr);
11600               if ((unsigned long) imm_expr.X_add_number > 31)
11601                 as_warn (_("Invalid value for `%s' (%lu)"),
11602                          ip->insn_mo->name,
11603                          (unsigned long) imm_expr.X_add_number);
11604               switch (*args)
11605                 {
11606                 case 'k':
11607                   if (mips_fix_cn63xxp1
11608                       && !mips_opts.micromips
11609                       && strcmp ("pref", insn->name) == 0)
11610                     switch (imm_expr.X_add_number)
11611                       {
11612                       case 5:
11613                       case 25:
11614                       case 26:
11615                       case 27:
11616                       case 28:
11617                       case 29:
11618                       case 30:
11619                       case 31:  /* These are ok.  */
11620                         break;
11621
11622                       default:  /* The rest must be changed to 28.  */
11623                         imm_expr.X_add_number = 28;
11624                         break;
11625                       }
11626                   INSERT_OPERAND (mips_opts.micromips,
11627                                   CACHE, *ip, imm_expr.X_add_number);
11628                   break;
11629                 case 'h':
11630                   INSERT_OPERAND (mips_opts.micromips,
11631                                   PREFX, *ip, imm_expr.X_add_number);
11632                   break;
11633                 case '1':
11634                   INSERT_OPERAND (mips_opts.micromips,
11635                                   STYPE, *ip, imm_expr.X_add_number);
11636                   break;
11637                 }
11638               imm_expr.X_op = O_absent;
11639               s = expr_end;
11640               continue;
11641
11642             case 'c':           /* BREAK code.  */
11643               {
11644                 unsigned long mask = (mips_opts.micromips
11645                                       ? MICROMIPSOP_MASK_CODE
11646                                       : OP_MASK_CODE);
11647
11648                 my_getExpression (&imm_expr, s);
11649                 check_absolute_expr (ip, &imm_expr);
11650                 if ((unsigned long) imm_expr.X_add_number > mask)
11651                   as_warn (_("Code for %s not in range 0..%lu (%lu)"),
11652                            ip->insn_mo->name,
11653                            mask, (unsigned long) imm_expr.X_add_number);
11654                 INSERT_OPERAND (mips_opts.micromips,
11655                                 CODE, *ip, imm_expr.X_add_number);
11656                 imm_expr.X_op = O_absent;
11657                 s = expr_end;
11658               }
11659               continue;
11660
11661             case 'q':           /* Lower BREAK code.  */
11662               {
11663                 unsigned long mask = (mips_opts.micromips
11664                                       ? MICROMIPSOP_MASK_CODE2
11665                                       : OP_MASK_CODE2);
11666
11667                 my_getExpression (&imm_expr, s);
11668                 check_absolute_expr (ip, &imm_expr);
11669                 if ((unsigned long) imm_expr.X_add_number > mask)
11670                   as_warn (_("Lower code for %s not in range 0..%lu (%lu)"),
11671                            ip->insn_mo->name,
11672                            mask, (unsigned long) imm_expr.X_add_number);
11673                 INSERT_OPERAND (mips_opts.micromips,
11674                                 CODE2, *ip, imm_expr.X_add_number);
11675                 imm_expr.X_op = O_absent;
11676                 s = expr_end;
11677               }
11678               continue;
11679
11680             case 'B':           /* 20- or 10-bit syscall/break/wait code.  */
11681               {
11682                 unsigned long mask = (mips_opts.micromips
11683                                       ? MICROMIPSOP_MASK_CODE10
11684                                       : OP_MASK_CODE20);
11685
11686                 my_getExpression (&imm_expr, s);
11687                 check_absolute_expr (ip, &imm_expr);
11688                 if ((unsigned long) imm_expr.X_add_number > mask)
11689                   as_warn (_("Code for %s not in range 0..%lu (%lu)"),
11690                            ip->insn_mo->name,
11691                            mask, (unsigned long) imm_expr.X_add_number);
11692                 if (mips_opts.micromips)
11693                   INSERT_OPERAND (1, CODE10, *ip, imm_expr.X_add_number);
11694                 else
11695                   INSERT_OPERAND (0, CODE20, *ip, imm_expr.X_add_number);
11696                 imm_expr.X_op = O_absent;
11697                 s = expr_end;
11698               }
11699               continue;
11700
11701             case 'C':           /* 25- or 23-bit coprocessor code.  */
11702               {
11703                 unsigned long mask = (mips_opts.micromips
11704                                       ? MICROMIPSOP_MASK_COPZ
11705                                       : OP_MASK_COPZ);
11706
11707                 my_getExpression (&imm_expr, s);
11708                 check_absolute_expr (ip, &imm_expr);
11709                 if ((unsigned long) imm_expr.X_add_number > mask)
11710                   as_warn (_("Coproccesor code > %u bits (%lu)"),
11711                            mips_opts.micromips ? 23U : 25U,
11712                            (unsigned long) imm_expr.X_add_number);
11713                 INSERT_OPERAND (mips_opts.micromips,
11714                                 COPZ, *ip, imm_expr.X_add_number);
11715                 imm_expr.X_op = O_absent;
11716                 s = expr_end;
11717               }
11718               continue;
11719
11720             case 'J':           /* 19-bit WAIT code.  */
11721               gas_assert (!mips_opts.micromips);
11722               my_getExpression (&imm_expr, s);
11723               check_absolute_expr (ip, &imm_expr);
11724               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
11725                 {
11726                   as_warn (_("Illegal 19-bit code (%lu)"),
11727                            (unsigned long) imm_expr.X_add_number);
11728                   imm_expr.X_add_number &= OP_MASK_CODE19;
11729                 }
11730               INSERT_OPERAND (0, CODE19, *ip, imm_expr.X_add_number);
11731               imm_expr.X_op = O_absent;
11732               s = expr_end;
11733               continue;
11734
11735             case 'P':           /* Performance register.  */
11736               gas_assert (!mips_opts.micromips);
11737               my_getExpression (&imm_expr, s);
11738               check_absolute_expr (ip, &imm_expr);
11739               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
11740                 as_warn (_("Invalid performance register (%lu)"),
11741                          (unsigned long) imm_expr.X_add_number);
11742               INSERT_OPERAND (0, PERFREG, *ip, imm_expr.X_add_number);
11743               imm_expr.X_op = O_absent;
11744               s = expr_end;
11745               continue;
11746
11747             case 'G':           /* Coprocessor destination register.  */
11748               {
11749                 unsigned long opcode = ip->insn_opcode;
11750                 unsigned long mask;
11751                 unsigned int types;
11752                 int cop0;
11753
11754                 if (mips_opts.micromips)
11755                   {
11756                     mask = ~((MICROMIPSOP_MASK_RT << MICROMIPSOP_SH_RT)
11757                              | (MICROMIPSOP_MASK_RS << MICROMIPSOP_SH_RS)
11758                              | (MICROMIPSOP_MASK_SEL << MICROMIPSOP_SH_SEL));
11759                     opcode &= mask;
11760                     switch (opcode)
11761                       {
11762                       case 0x000000fc:                          /* mfc0  */
11763                       case 0x000002fc:                          /* mtc0  */
11764                       case 0x580000fc:                          /* dmfc0 */
11765                       case 0x580002fc:                          /* dmtc0 */
11766                         cop0 = 1;
11767                         break;
11768                       default:
11769                         cop0 = 0;
11770                         break;
11771                       }
11772                   }
11773                 else
11774                   {
11775                     opcode = (opcode >> OP_SH_OP) & OP_MASK_OP;
11776                     cop0 = opcode == OP_OP_COP0;
11777                   }
11778                 types = RTYPE_NUM | (cop0 ? RTYPE_CP0 : RTYPE_GP);
11779                 ok = reg_lookup (&s, types, &regno);
11780                 if (mips_opts.micromips)
11781                   INSERT_OPERAND (1, RS, *ip, regno);
11782                 else
11783                   INSERT_OPERAND (0, RD, *ip, regno);
11784                 if (ok)
11785                   {
11786                     lastregno = regno;
11787                     continue;
11788                   }
11789               }
11790               break;
11791
11792             case 'y':           /* ALNV.PS source register.  */
11793               gas_assert (mips_opts.micromips);
11794               goto do_reg;
11795             case 'x':           /* Ignore register name.  */
11796             case 'U':           /* Destination register (CLO/CLZ).  */
11797             case 'g':           /* Coprocessor destination register.  */
11798               gas_assert (!mips_opts.micromips);
11799             case 'b':           /* Base register.  */
11800             case 'd':           /* Destination register.  */
11801             case 's':           /* Source register.  */
11802             case 't':           /* Target register.  */
11803             case 'r':           /* Both target and source.  */
11804             case 'v':           /* Both dest and source.  */
11805             case 'w':           /* Both dest and target.  */
11806             case 'E':           /* Coprocessor target register.  */
11807             case 'K':           /* RDHWR destination register.  */
11808             case 'z':           /* Must be zero register.  */
11809             do_reg:
11810               s_reset = s;
11811               if (*args == 'E' || *args == 'K')
11812                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
11813               else
11814                 {
11815                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
11816                   if (regno == AT && mips_opts.at)
11817                     {
11818                       if (mips_opts.at == ATREG)
11819                         as_warn (_("Used $at without \".set noat\""));
11820                       else
11821                         as_warn (_("Used $%u with \".set at=$%u\""),
11822                                  regno, mips_opts.at);
11823                     }
11824                 }
11825               if (ok)
11826                 {
11827                   c = *args;
11828                   if (*s == ' ')
11829                     ++s;
11830                   if (args[1] != *s)
11831                     {
11832                       if (c == 'r' || c == 'v' || c == 'w')
11833                         {
11834                           regno = lastregno;
11835                           s = s_reset;
11836                           ++args;
11837                         }
11838                     }
11839                   /* 'z' only matches $0.  */
11840                   if (c == 'z' && regno != 0)
11841                     break;
11842
11843                   if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
11844                     {
11845                       if (regno == lastregno)
11846                         {
11847                           insn_error
11848                             = _("Source and destination must be different");
11849                           continue;
11850                         }
11851                       if (regno == 31 && lastregno == 0xffffffff)
11852                         {
11853                           insn_error
11854                             = _("A destination register must be supplied");
11855                           continue;
11856                         }
11857                     }
11858                   /* Now that we have assembled one operand, we use the args
11859                      string to figure out where it goes in the instruction.  */
11860                   switch (c)
11861                     {
11862                     case 'r':
11863                     case 's':
11864                     case 'v':
11865                     case 'b':
11866                       INSERT_OPERAND (mips_opts.micromips, RS, *ip, regno);
11867                       break;
11868
11869                     case 'K':
11870                       if (mips_opts.micromips)
11871                         INSERT_OPERAND (1, RS, *ip, regno);
11872                       else
11873                         INSERT_OPERAND (0, RD, *ip, regno);
11874                       break;
11875
11876                     case 'd':
11877                     case 'g':
11878                       INSERT_OPERAND (mips_opts.micromips, RD, *ip, regno);
11879                       break;
11880
11881                     case 'U':
11882                       gas_assert (!mips_opts.micromips);
11883                       INSERT_OPERAND (0, RD, *ip, regno);
11884                       INSERT_OPERAND (0, RT, *ip, regno);
11885                       break;
11886
11887                     case 'w':
11888                     case 't':
11889                     case 'E':
11890                       INSERT_OPERAND (mips_opts.micromips, RT, *ip, regno);
11891                       break;
11892
11893                     case 'y':
11894                       gas_assert (mips_opts.micromips);
11895                       INSERT_OPERAND (1, RS3, *ip, regno);
11896                       break;
11897
11898                     case 'x':
11899                       /* This case exists because on the r3000 trunc
11900                          expands into a macro which requires a gp
11901                          register.  On the r6000 or r4000 it is
11902                          assembled into a single instruction which
11903                          ignores the register.  Thus the insn version
11904                          is MIPS_ISA2 and uses 'x', and the macro
11905                          version is MIPS_ISA1 and uses 't'.  */
11906                       break;
11907
11908                     case 'z':
11909                       /* This case is for the div instruction, which
11910                          acts differently if the destination argument
11911                          is $0.  This only matches $0, and is checked
11912                          outside the switch.  */
11913                       break;
11914                     }
11915                   lastregno = regno;
11916                   continue;
11917                 }
11918               switch (*args++)
11919                 {
11920                 case 'r':
11921                 case 'v':
11922                   INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
11923                   continue;
11924
11925                 case 'w':
11926                   INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
11927                   continue;
11928                 }
11929               break;
11930
11931             case 'O':           /* MDMX alignment immediate constant.  */
11932               gas_assert (!mips_opts.micromips);
11933               my_getExpression (&imm_expr, s);
11934               check_absolute_expr (ip, &imm_expr);
11935               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
11936                 as_warn (_("Improper align amount (%ld), using low bits"),
11937                          (long) imm_expr.X_add_number);
11938               INSERT_OPERAND (0, ALN, *ip, imm_expr.X_add_number);
11939               imm_expr.X_op = O_absent;
11940               s = expr_end;
11941               continue;
11942
11943             case 'Q':           /* MDMX vector, element sel, or const.  */
11944               if (s[0] != '$')
11945                 {
11946                   /* MDMX Immediate.  */
11947                   gas_assert (!mips_opts.micromips);
11948                   my_getExpression (&imm_expr, s);
11949                   check_absolute_expr (ip, &imm_expr);
11950                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
11951                     as_warn (_("Invalid MDMX Immediate (%ld)"),
11952                              (long) imm_expr.X_add_number);
11953                   INSERT_OPERAND (0, FT, *ip, imm_expr.X_add_number);
11954                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
11955                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
11956                   else
11957                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
11958                   imm_expr.X_op = O_absent;
11959                   s = expr_end;
11960                   continue;
11961                 }
11962               /* Not MDMX Immediate.  Fall through.  */
11963             case 'X':           /* MDMX destination register.  */
11964             case 'Y':           /* MDMX source register.  */
11965             case 'Z':           /* MDMX target register.  */
11966               is_mdmx = 1;
11967             case 'W':
11968               gas_assert (!mips_opts.micromips);
11969             case 'D':           /* Floating point destination register.  */
11970             case 'S':           /* Floating point source register.  */
11971             case 'T':           /* Floating point target register.  */
11972             case 'R':           /* Floating point source register.  */
11973             case 'V':
11974               rtype = RTYPE_FPU;
11975               if (is_mdmx
11976                   || (mips_opts.ase_mdmx
11977                       && (ip->insn_mo->pinfo & FP_D)
11978                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
11979                                                 | INSN_COPROC_MEMORY_DELAY
11980                                                 | INSN_LOAD_COPROC_DELAY
11981                                                 | INSN_LOAD_MEMORY_DELAY
11982                                                 | INSN_STORE_MEMORY))))
11983                 rtype |= RTYPE_VEC;
11984               s_reset = s;
11985               if (reg_lookup (&s, rtype, &regno))
11986                 {
11987                   if ((regno & 1) != 0
11988                       && HAVE_32BIT_FPRS
11989                       && !mips_oddfpreg_ok (ip->insn_mo, argnum))
11990                     as_warn (_("Float register should be even, was %d"),
11991                              regno);
11992
11993                   c = *args;
11994                   if (*s == ' ')
11995                     ++s;
11996                   if (args[1] != *s)
11997                     {
11998                       if (c == 'V' || c == 'W')
11999                         {
12000                           regno = lastregno;
12001                           s = s_reset;
12002                           ++args;
12003                         }
12004                     }
12005                   switch (c)
12006                     {
12007                     case 'D':
12008                     case 'X':
12009                       INSERT_OPERAND (mips_opts.micromips, FD, *ip, regno);
12010                       break;
12011
12012                     case 'V':
12013                     case 'S':
12014                     case 'Y':
12015                       INSERT_OPERAND (mips_opts.micromips, FS, *ip, regno);
12016                       break;
12017
12018                     case 'Q':
12019                       /* This is like 'Z', but also needs to fix the MDMX
12020                          vector/scalar select bits.  Note that the
12021                          scalar immediate case is handled above.  */
12022                       if (*s == '[')
12023                         {
12024                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
12025                           int max_el = (is_qh ? 3 : 7);
12026                           s++;
12027                           my_getExpression(&imm_expr, s);
12028                           check_absolute_expr (ip, &imm_expr);
12029                           s = expr_end;
12030                           if (imm_expr.X_add_number > max_el)
12031                             as_bad (_("Bad element selector %ld"),
12032                                     (long) imm_expr.X_add_number);
12033                           imm_expr.X_add_number &= max_el;
12034                           ip->insn_opcode |= (imm_expr.X_add_number
12035                                               << (OP_SH_VSEL +
12036                                                   (is_qh ? 2 : 1)));
12037                           imm_expr.X_op = O_absent;
12038                           if (*s != ']')
12039                             as_warn (_("Expecting ']' found '%s'"), s);
12040                           else
12041                             s++;
12042                         }
12043                       else
12044                         {
12045                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
12046                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
12047                                                 << OP_SH_VSEL);
12048                           else
12049                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
12050                                                 OP_SH_VSEL);
12051                         }
12052                       /* Fall through.  */
12053                     case 'W':
12054                     case 'T':
12055                     case 'Z':
12056                       INSERT_OPERAND (mips_opts.micromips, FT, *ip, regno);
12057                       break;
12058
12059                     case 'R':
12060                       INSERT_OPERAND (mips_opts.micromips, FR, *ip, regno);
12061                       break;
12062                     }
12063                   lastregno = regno;
12064                   continue;
12065                 }
12066
12067               switch (*args++)
12068                 {
12069                 case 'V':
12070                   INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
12071                   continue;
12072
12073                 case 'W':
12074                   INSERT_OPERAND (mips_opts.micromips, FT, *ip, lastregno);
12075                   continue;
12076                 }
12077               break;
12078
12079             case 'I':
12080               my_getExpression (&imm_expr, s);
12081               if (imm_expr.X_op != O_big
12082                   && imm_expr.X_op != O_constant)
12083                 insn_error = _("absolute expression required");
12084               if (HAVE_32BIT_GPRS)
12085                 normalize_constant_expr (&imm_expr);
12086               s = expr_end;
12087               continue;
12088
12089             case 'A':
12090               my_getExpression (&offset_expr, s);
12091               normalize_address_expr (&offset_expr);
12092               *imm_reloc = BFD_RELOC_32;
12093               s = expr_end;
12094               continue;
12095
12096             case 'F':
12097             case 'L':
12098             case 'f':
12099             case 'l':
12100               {
12101                 int f64;
12102                 int using_gprs;
12103                 char *save_in;
12104                 char *err;
12105                 unsigned char temp[8];
12106                 int len;
12107                 unsigned int length;
12108                 segT seg;
12109                 subsegT subseg;
12110                 char *p;
12111
12112                 /* These only appear as the last operand in an
12113                    instruction, and every instruction that accepts
12114                    them in any variant accepts them in all variants.
12115                    This means we don't have to worry about backing out
12116                    any changes if the instruction does not match.
12117
12118                    The difference between them is the size of the
12119                    floating point constant and where it goes.  For 'F'
12120                    and 'L' the constant is 64 bits; for 'f' and 'l' it
12121                    is 32 bits.  Where the constant is placed is based
12122                    on how the MIPS assembler does things:
12123                     F -- .rdata
12124                     L -- .lit8
12125                     f -- immediate value
12126                     l -- .lit4
12127
12128                     The .lit4 and .lit8 sections are only used if
12129                     permitted by the -G argument.
12130
12131                     The code below needs to know whether the target register
12132                     is 32 or 64 bits wide.  It relies on the fact 'f' and
12133                     'F' are used with GPR-based instructions and 'l' and
12134                     'L' are used with FPR-based instructions.  */
12135
12136                 f64 = *args == 'F' || *args == 'L';
12137                 using_gprs = *args == 'F' || *args == 'f';
12138
12139                 save_in = input_line_pointer;
12140                 input_line_pointer = s;
12141                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
12142                 length = len;
12143                 s = input_line_pointer;
12144                 input_line_pointer = save_in;
12145                 if (err != NULL && *err != '\0')
12146                   {
12147                     as_bad (_("Bad floating point constant: %s"), err);
12148                     memset (temp, '\0', sizeof temp);
12149                     length = f64 ? 8 : 4;
12150                   }
12151
12152                 gas_assert (length == (unsigned) (f64 ? 8 : 4));
12153
12154                 if (*args == 'f'
12155                     || (*args == 'l'
12156                         && (g_switch_value < 4
12157                             || (temp[0] == 0 && temp[1] == 0)
12158                             || (temp[2] == 0 && temp[3] == 0))))
12159                   {
12160                     imm_expr.X_op = O_constant;
12161                     if (!target_big_endian)
12162                       imm_expr.X_add_number = bfd_getl32 (temp);
12163                     else
12164                       imm_expr.X_add_number = bfd_getb32 (temp);
12165                   }
12166                 else if (length > 4
12167                          && !mips_disable_float_construction
12168                          /* Constants can only be constructed in GPRs and
12169                             copied to FPRs if the GPRs are at least as wide
12170                             as the FPRs.  Force the constant into memory if
12171                             we are using 64-bit FPRs but the GPRs are only
12172                             32 bits wide.  */
12173                          && (using_gprs
12174                              || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
12175                          && ((temp[0] == 0 && temp[1] == 0)
12176                              || (temp[2] == 0 && temp[3] == 0))
12177                          && ((temp[4] == 0 && temp[5] == 0)
12178                              || (temp[6] == 0 && temp[7] == 0)))
12179                   {
12180                     /* The value is simple enough to load with a couple of
12181                        instructions.  If using 32-bit registers, set
12182                        imm_expr to the high order 32 bits and offset_expr to
12183                        the low order 32 bits.  Otherwise, set imm_expr to
12184                        the entire 64 bit constant.  */
12185                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
12186                       {
12187                         imm_expr.X_op = O_constant;
12188                         offset_expr.X_op = O_constant;
12189                         if (!target_big_endian)
12190                           {
12191                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
12192                             offset_expr.X_add_number = bfd_getl32 (temp);
12193                           }
12194                         else
12195                           {
12196                             imm_expr.X_add_number = bfd_getb32 (temp);
12197                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
12198                           }
12199                         if (offset_expr.X_add_number == 0)
12200                           offset_expr.X_op = O_absent;
12201                       }
12202                     else if (sizeof (imm_expr.X_add_number) > 4)
12203                       {
12204                         imm_expr.X_op = O_constant;
12205                         if (!target_big_endian)
12206                           imm_expr.X_add_number = bfd_getl64 (temp);
12207                         else
12208                           imm_expr.X_add_number = bfd_getb64 (temp);
12209                       }
12210                     else
12211                       {
12212                         imm_expr.X_op = O_big;
12213                         imm_expr.X_add_number = 4;
12214                         if (!target_big_endian)
12215                           {
12216                             generic_bignum[0] = bfd_getl16 (temp);
12217                             generic_bignum[1] = bfd_getl16 (temp + 2);
12218                             generic_bignum[2] = bfd_getl16 (temp + 4);
12219                             generic_bignum[3] = bfd_getl16 (temp + 6);
12220                           }
12221                         else
12222                           {
12223                             generic_bignum[0] = bfd_getb16 (temp + 6);
12224                             generic_bignum[1] = bfd_getb16 (temp + 4);
12225                             generic_bignum[2] = bfd_getb16 (temp + 2);
12226                             generic_bignum[3] = bfd_getb16 (temp);
12227                           }
12228                       }
12229                   }
12230                 else
12231                   {
12232                     const char *newname;
12233                     segT new_seg;
12234
12235                     /* Switch to the right section.  */
12236                     seg = now_seg;
12237                     subseg = now_subseg;
12238                     switch (*args)
12239                       {
12240                       default: /* unused default case avoids warnings.  */
12241                       case 'L':
12242                         newname = RDATA_SECTION_NAME;
12243                         if (g_switch_value >= 8)
12244                           newname = ".lit8";
12245                         break;
12246                       case 'F':
12247                         newname = RDATA_SECTION_NAME;
12248                         break;
12249                       case 'l':
12250                         gas_assert (g_switch_value >= 4);
12251                         newname = ".lit4";
12252                         break;
12253                       }
12254                     new_seg = subseg_new (newname, (subsegT) 0);
12255                     if (IS_ELF)
12256                       bfd_set_section_flags (stdoutput, new_seg,
12257                                              (SEC_ALLOC
12258                                               | SEC_LOAD
12259                                               | SEC_READONLY
12260                                               | SEC_DATA));
12261                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
12262                     if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
12263                       record_alignment (new_seg, 4);
12264                     else
12265                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
12266                     if (seg == now_seg)
12267                       as_bad (_("Can't use floating point insn in this section"));
12268
12269                     /* Set the argument to the current address in the
12270                        section.  */
12271                     offset_expr.X_op = O_symbol;
12272                     offset_expr.X_add_symbol = symbol_temp_new_now ();
12273                     offset_expr.X_add_number = 0;
12274
12275                     /* Put the floating point number into the section.  */
12276                     p = frag_more ((int) length);
12277                     memcpy (p, temp, length);
12278
12279                     /* Switch back to the original section.  */
12280                     subseg_set (seg, subseg);
12281                   }
12282               }
12283               continue;
12284
12285             case 'i':           /* 16-bit unsigned immediate.  */
12286             case 'j':           /* 16-bit signed immediate.  */
12287               *imm_reloc = BFD_RELOC_LO16;
12288               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
12289                 {
12290                   int more;
12291                   offsetT minval, maxval;
12292
12293                   more = (insn + 1 < past
12294                           && strcmp (insn->name, insn[1].name) == 0);
12295
12296                   /* If the expression was written as an unsigned number,
12297                      only treat it as signed if there are no more
12298                      alternatives.  */
12299                   if (more
12300                       && *args == 'j'
12301                       && sizeof (imm_expr.X_add_number) <= 4
12302                       && imm_expr.X_op == O_constant
12303                       && imm_expr.X_add_number < 0
12304                       && imm_expr.X_unsigned
12305                       && HAVE_64BIT_GPRS)
12306                     break;
12307
12308                   /* For compatibility with older assemblers, we accept
12309                      0x8000-0xffff as signed 16-bit numbers when only
12310                      signed numbers are allowed.  */
12311                   if (*args == 'i')
12312                     minval = 0, maxval = 0xffff;
12313                   else if (more)
12314                     minval = -0x8000, maxval = 0x7fff;
12315                   else
12316                     minval = -0x8000, maxval = 0xffff;
12317
12318                   if (imm_expr.X_op != O_constant
12319                       || imm_expr.X_add_number < minval
12320                       || imm_expr.X_add_number > maxval)
12321                     {
12322                       if (more)
12323                         break;
12324                       if (imm_expr.X_op == O_constant
12325                           || imm_expr.X_op == O_big)
12326                         as_bad (_("Expression out of range"));
12327                     }
12328                 }
12329               s = expr_end;
12330               continue;
12331
12332             case 'o':           /* 16-bit offset.  */
12333               offset_reloc[0] = BFD_RELOC_LO16;
12334               offset_reloc[1] = BFD_RELOC_UNUSED;
12335               offset_reloc[2] = BFD_RELOC_UNUSED;
12336
12337               /* Check whether there is only a single bracketed expression
12338                  left.  If so, it must be the base register and the
12339                  constant must be zero.  */
12340               if (*s == '(' && strchr (s + 1, '(') == 0)
12341                 {
12342                   offset_expr.X_op = O_constant;
12343                   offset_expr.X_add_number = 0;
12344                   continue;
12345                 }
12346
12347               /* If this value won't fit into a 16 bit offset, then go
12348                  find a macro that will generate the 32 bit offset
12349                  code pattern.  */
12350               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
12351                   && (offset_expr.X_op != O_constant
12352                       || offset_expr.X_add_number >= 0x8000
12353                       || offset_expr.X_add_number < -0x8000))
12354                 break;
12355
12356               s = expr_end;
12357               continue;
12358
12359             case 'p':           /* PC-relative offset.  */
12360               *offset_reloc = BFD_RELOC_16_PCREL_S2;
12361               my_getExpression (&offset_expr, s);
12362               s = expr_end;
12363               continue;
12364
12365             case 'u':           /* Upper 16 bits.  */
12366               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
12367                   && imm_expr.X_op == O_constant
12368                   && (imm_expr.X_add_number < 0
12369                       || imm_expr.X_add_number >= 0x10000))
12370                 as_bad (_("lui expression (%lu) not in range 0..65535"),
12371                         (unsigned long) imm_expr.X_add_number);
12372               s = expr_end;
12373               continue;
12374
12375             case 'a':           /* 26-bit address.  */
12376               *offset_reloc = BFD_RELOC_MIPS_JMP;
12377               my_getExpression (&offset_expr, s);
12378               s = expr_end;
12379               continue;
12380
12381             case 'N':           /* 3-bit branch condition code.  */
12382             case 'M':           /* 3-bit compare condition code.  */
12383               rtype = RTYPE_CCC;
12384               if (ip->insn_mo->pinfo & (FP_D | FP_S))
12385                 rtype |= RTYPE_FCC;
12386               if (!reg_lookup (&s, rtype, &regno))
12387                 break;
12388               if ((strcmp (str + strlen (str) - 3, ".ps") == 0
12389                    || strcmp (str + strlen (str) - 5, "any2f") == 0
12390                    || strcmp (str + strlen (str) - 5, "any2t") == 0)
12391                   && (regno & 1) != 0)
12392                 as_warn (_("Condition code register should be even for %s, "
12393                            "was %d"),
12394                          str, regno);
12395               if ((strcmp (str + strlen (str) - 5, "any4f") == 0
12396                    || strcmp (str + strlen (str) - 5, "any4t") == 0)
12397                   && (regno & 3) != 0)
12398                 as_warn (_("Condition code register should be 0 or 4 for %s, "
12399                            "was %d"),
12400                          str, regno);
12401               if (*args == 'N')
12402                 INSERT_OPERAND (mips_opts.micromips, BCC, *ip, regno);
12403               else
12404                 INSERT_OPERAND (mips_opts.micromips, CCC, *ip, regno);
12405               continue;
12406
12407             case 'H':
12408               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
12409                 s += 2;
12410               if (ISDIGIT (*s))
12411                 {
12412                   c = 0;
12413                   do
12414                     {
12415                       c *= 10;
12416                       c += *s - '0';
12417                       ++s;
12418                     }
12419                   while (ISDIGIT (*s));
12420                 }
12421               else
12422                 c = 8; /* Invalid sel value.  */
12423
12424               if (c > 7)
12425                 as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
12426               INSERT_OPERAND (mips_opts.micromips, SEL, *ip, c);
12427               continue;
12428
12429             case 'e':
12430               gas_assert (!mips_opts.micromips);
12431               /* Must be at least one digit.  */
12432               my_getExpression (&imm_expr, s);
12433               check_absolute_expr (ip, &imm_expr);
12434
12435               if ((unsigned long) imm_expr.X_add_number
12436                   > (unsigned long) OP_MASK_VECBYTE)
12437                 {
12438                   as_bad (_("bad byte vector index (%ld)"),
12439                            (long) imm_expr.X_add_number);
12440                   imm_expr.X_add_number = 0;
12441                 }
12442
12443               INSERT_OPERAND (0, VECBYTE, *ip, imm_expr.X_add_number);
12444               imm_expr.X_op = O_absent;
12445               s = expr_end;
12446               continue;
12447
12448             case '%':
12449               gas_assert (!mips_opts.micromips);
12450               my_getExpression (&imm_expr, s);
12451               check_absolute_expr (ip, &imm_expr);
12452
12453               if ((unsigned long) imm_expr.X_add_number
12454                   > (unsigned long) OP_MASK_VECALIGN)
12455                 {
12456                   as_bad (_("bad byte vector index (%ld)"),
12457                            (long) imm_expr.X_add_number);
12458                   imm_expr.X_add_number = 0;
12459                 }
12460
12461               INSERT_OPERAND (0, VECALIGN, *ip, imm_expr.X_add_number);
12462               imm_expr.X_op = O_absent;
12463               s = expr_end;
12464               continue;
12465
12466             case 'm':           /* Opcode extension character.  */
12467               gas_assert (mips_opts.micromips);
12468               c = *++args;
12469               switch (c)
12470                 {
12471                 case 'r':
12472                   if (strncmp (s, "$pc", 3) == 0)
12473                     {
12474                       s += 3;
12475                       continue;
12476                     }
12477                   break;
12478
12479                 case 'a':
12480                 case 'b':
12481                 case 'c':
12482                 case 'd':
12483                 case 'e':
12484                 case 'f':
12485                 case 'g':
12486                 case 'h':
12487                 case 'i':
12488                 case 'j':
12489                 case 'l':
12490                 case 'm':
12491                 case 'n':
12492                 case 'p':
12493                 case 'q':
12494                 case 's':
12495                 case 't':
12496                 case 'x':
12497                 case 'y':
12498                 case 'z':
12499                   s_reset = s;
12500                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
12501                   if (regno == AT && mips_opts.at)
12502                     {
12503                       if (mips_opts.at == ATREG)
12504                         as_warn (_("Used $at without \".set noat\""));
12505                       else
12506                         as_warn (_("Used $%u with \".set at=$%u\""),
12507                                  regno, mips_opts.at);
12508                     }
12509                   if (!ok)
12510                     {
12511                       if (c == 'c')
12512                         {
12513                           gas_assert (args[1] == ',');
12514                           regno = lastregno;
12515                           ++args;
12516                         }
12517                       else if (c == 't')
12518                         {
12519                           gas_assert (args[1] == ',');
12520                           ++args;
12521                           continue;                     /* Nothing to do.  */
12522                         }
12523                       else
12524                         break;
12525                     }
12526
12527                   if (c == 'j' && !strncmp (ip->insn_mo->name, "jalr", 4))
12528                     {
12529                       if (regno == lastregno)
12530                         {
12531                           insn_error
12532                             = _("Source and destination must be different");
12533                           continue;
12534                         }
12535                       if (regno == 31 && lastregno == 0xffffffff)
12536                         {
12537                           insn_error
12538                             = _("A destination register must be supplied");
12539                           continue;
12540                         }
12541                     }
12542
12543                   if (*s == ' ')
12544                     ++s;
12545                   if (args[1] != *s)
12546                     {
12547                       if (c == 'e')
12548                         {
12549                           gas_assert (args[1] == ',');
12550                           regno = lastregno;
12551                           s = s_reset;
12552                           ++args;
12553                         }
12554                       else if (c == 't')
12555                         {
12556                           gas_assert (args[1] == ',');
12557                           s = s_reset;
12558                           ++args;
12559                           continue;                     /* Nothing to do.  */
12560                         }
12561                     }
12562
12563                   /* Make sure regno is the same as lastregno.  */
12564                   if (c == 't' && regno != lastregno)
12565                     break;
12566
12567                   /* Make sure regno is the same as destregno.  */
12568                   if (c == 'x' && regno != destregno)
12569                     break;
12570
12571                   /* We need to save regno, before regno maps to the
12572                      microMIPS register encoding.  */
12573                   lastregno = regno;
12574
12575                   if (c == 'f')
12576                     destregno = regno;
12577
12578                   switch (c)
12579                     {
12580                       case 'a':
12581                         if (regno != GP)
12582                           regno = ILLEGAL_REG;
12583                         break;
12584
12585                       case 'b':
12586                         regno = mips32_to_micromips_reg_b_map[regno];
12587                         break;
12588
12589                       case 'c':
12590                         regno = mips32_to_micromips_reg_c_map[regno];
12591                         break;
12592
12593                       case 'd':
12594                         regno = mips32_to_micromips_reg_d_map[regno];
12595                         break;
12596
12597                       case 'e':
12598                         regno = mips32_to_micromips_reg_e_map[regno];
12599                         break;
12600
12601                       case 'f':
12602                         regno = mips32_to_micromips_reg_f_map[regno];
12603                         break;
12604
12605                       case 'g':
12606                         regno = mips32_to_micromips_reg_g_map[regno];
12607                         break;
12608
12609                       case 'h':
12610                         regno = mips32_to_micromips_reg_h_map[regno];
12611                         break;
12612
12613                       case 'i':
12614                         switch (EXTRACT_OPERAND (1, MI, *ip))
12615                           {
12616                             case 4:
12617                               if (regno == 21)
12618                                 regno = 3;
12619                               else if (regno == 22)
12620                                 regno = 4;
12621                               else if (regno == 5)
12622                                 regno = 5;
12623                               else if (regno == 6)
12624                                 regno = 6;
12625                               else if (regno == 7)
12626                                 regno = 7;
12627                               else
12628                                 regno = ILLEGAL_REG;
12629                               break;
12630
12631                             case 5:
12632                               if (regno == 6)
12633                                 regno = 0;
12634                               else if (regno == 7)
12635                                 regno = 1;
12636                               else
12637                                 regno = ILLEGAL_REG;
12638                               break;
12639
12640                             case 6:
12641                               if (regno == 7)
12642                                 regno = 2;
12643                               else
12644                                 regno = ILLEGAL_REG;
12645                               break;
12646
12647                             default:
12648                               regno = ILLEGAL_REG;
12649                               break;
12650                           }
12651                         break;
12652
12653                       case 'l':
12654                         regno = mips32_to_micromips_reg_l_map[regno];
12655                         break;
12656
12657                       case 'm':
12658                         regno = mips32_to_micromips_reg_m_map[regno];
12659                         break;
12660
12661                       case 'n':
12662                         regno = mips32_to_micromips_reg_n_map[regno];
12663                         break;
12664
12665                       case 'q':
12666                         regno = mips32_to_micromips_reg_q_map[regno];
12667                         break;
12668
12669                       case 's':
12670                         if (regno != SP)
12671                           regno = ILLEGAL_REG;
12672                         break;
12673
12674                       case 'y':
12675                         if (regno != 31)
12676                           regno = ILLEGAL_REG;
12677                         break;
12678
12679                       case 'z':
12680                         if (regno != ZERO)
12681                           regno = ILLEGAL_REG;
12682                         break;
12683
12684                       case 'j': /* Do nothing.  */
12685                       case 'p':
12686                       case 't':
12687                       case 'x':
12688                         break;
12689
12690                       default:
12691                         internalError ();
12692                     }
12693
12694                   if (regno == ILLEGAL_REG)
12695                     break;
12696
12697                   switch (c)
12698                     {
12699                       case 'b':
12700                         INSERT_OPERAND (1, MB, *ip, regno);
12701                         break;
12702
12703                       case 'c':
12704                         INSERT_OPERAND (1, MC, *ip, regno);
12705                         break;
12706
12707                       case 'd':
12708                         INSERT_OPERAND (1, MD, *ip, regno);
12709                         break;
12710
12711                       case 'e':
12712                         INSERT_OPERAND (1, ME, *ip, regno);
12713                         break;
12714
12715                       case 'f':
12716                         INSERT_OPERAND (1, MF, *ip, regno);
12717                         break;
12718
12719                       case 'g':
12720                         INSERT_OPERAND (1, MG, *ip, regno);
12721                         break;
12722
12723                       case 'h':
12724                         INSERT_OPERAND (1, MH, *ip, regno);
12725                         break;
12726
12727                       case 'i':
12728                         INSERT_OPERAND (1, MI, *ip, regno);
12729                         break;
12730
12731                       case 'j':
12732                         INSERT_OPERAND (1, MJ, *ip, regno);
12733                         break;
12734
12735                       case 'l':
12736                         INSERT_OPERAND (1, ML, *ip, regno);
12737                         break;
12738
12739                       case 'm':
12740                         INSERT_OPERAND (1, MM, *ip, regno);
12741                         break;
12742
12743                       case 'n':
12744                         INSERT_OPERAND (1, MN, *ip, regno);
12745                         break;
12746
12747                       case 'p':
12748                         INSERT_OPERAND (1, MP, *ip, regno);
12749                         break;
12750
12751                       case 'q':
12752                         INSERT_OPERAND (1, MQ, *ip, regno);
12753                         break;
12754
12755                       case 'a': /* Do nothing.  */
12756                       case 's': /* Do nothing.  */
12757                       case 't': /* Do nothing.  */
12758                       case 'x': /* Do nothing.  */
12759                       case 'y': /* Do nothing.  */
12760                       case 'z': /* Do nothing.  */
12761                         break;
12762
12763                       default:
12764                         internalError ();
12765                     }
12766                   continue;
12767
12768                 case 'A':
12769                   {
12770                     bfd_reloc_code_real_type r[3];
12771                     expressionS ep;
12772                     int imm;
12773
12774                     /* Check whether there is only a single bracketed
12775                        expression left.  If so, it must be the base register
12776                        and the constant must be zero.  */
12777                     if (*s == '(' && strchr (s + 1, '(') == 0)
12778                       {
12779                         INSERT_OPERAND (1, IMMA, *ip, 0);
12780                         continue;
12781                       }
12782
12783                     if (my_getSmallExpression (&ep, r, s) > 0
12784                         || !expr_const_in_range (&ep, -64, 64, 2))
12785                       break;
12786
12787                     imm = ep.X_add_number >> 2;
12788                     INSERT_OPERAND (1, IMMA, *ip, imm);
12789                   }
12790                   s = expr_end;
12791                   continue;
12792
12793                 case 'B':
12794                   {
12795                     bfd_reloc_code_real_type r[3];
12796                     expressionS ep;
12797                     int imm;
12798
12799                     if (my_getSmallExpression (&ep, r, s) > 0
12800                         || ep.X_op != O_constant)
12801                       break;
12802
12803                     for (imm = 0; imm < 8; imm++)
12804                       if (micromips_imm_b_map[imm] == ep.X_add_number)
12805                         break;
12806                     if (imm >= 8)
12807                       break;
12808
12809                     INSERT_OPERAND (1, IMMB, *ip, imm);
12810                   }
12811                   s = expr_end;
12812                   continue;
12813
12814                 case 'C':
12815                   {
12816                     bfd_reloc_code_real_type r[3];
12817                     expressionS ep;
12818                     int imm;
12819
12820                     if (my_getSmallExpression (&ep, r, s) > 0
12821                         || ep.X_op != O_constant)
12822                       break;
12823
12824                     for (imm = 0; imm < 16; imm++)
12825                       if (micromips_imm_c_map[imm] == ep.X_add_number)
12826                         break;
12827                     if (imm >= 16)
12828                       break;
12829
12830                     INSERT_OPERAND (1, IMMC, *ip, imm);
12831                   }
12832                   s = expr_end;
12833                   continue;
12834
12835                 case 'D':       /* pc relative offset */
12836                 case 'E':       /* pc relative offset */
12837                   my_getExpression (&offset_expr, s);
12838                   if (offset_expr.X_op == O_register)
12839                     break;
12840
12841                   if (!forced_insn_length)
12842                     *offset_reloc = (int) BFD_RELOC_UNUSED + c;
12843                   else if (c == 'D')
12844                     *offset_reloc = BFD_RELOC_MICROMIPS_10_PCREL_S1;
12845                   else
12846                     *offset_reloc = BFD_RELOC_MICROMIPS_7_PCREL_S1;
12847                   s = expr_end;
12848                   continue;
12849
12850                 case 'F':
12851                   {
12852                     bfd_reloc_code_real_type r[3];
12853                     expressionS ep;
12854                     int imm;
12855
12856                     if (my_getSmallExpression (&ep, r, s) > 0
12857                         || !expr_const_in_range (&ep, 0, 16, 0))
12858                       break;
12859
12860                     imm = ep.X_add_number;
12861                     INSERT_OPERAND (1, IMMF, *ip, imm);
12862                   }
12863                   s = expr_end;
12864                   continue;
12865
12866                 case 'G':
12867                   {
12868                     bfd_reloc_code_real_type r[3];
12869                     expressionS ep;
12870                     int imm;
12871
12872                     /* Check whether there is only a single bracketed
12873                        expression left.  If so, it must be the base register
12874                        and the constant must be zero.  */
12875                     if (*s == '(' && strchr (s + 1, '(') == 0)
12876                       {
12877                         INSERT_OPERAND (1, IMMG, *ip, 0);
12878                         continue;
12879                       }
12880
12881                     if (my_getSmallExpression (&ep, r, s) > 0
12882                         || !expr_const_in_range (&ep, -1, 15, 0))
12883                       break;
12884
12885                     imm = ep.X_add_number & 15;
12886                     INSERT_OPERAND (1, IMMG, *ip, imm);
12887                   }
12888                   s = expr_end;
12889                   continue;
12890
12891                 case 'H':
12892                   {
12893                     bfd_reloc_code_real_type r[3];
12894                     expressionS ep;
12895                     int imm;
12896
12897                     /* Check whether there is only a single bracketed
12898                        expression left.  If so, it must be the base register
12899                        and the constant must be zero.  */
12900                     if (*s == '(' && strchr (s + 1, '(') == 0)
12901                       {
12902                         INSERT_OPERAND (1, IMMH, *ip, 0);
12903                         continue;
12904                       }
12905
12906                     if (my_getSmallExpression (&ep, r, s) > 0
12907                         || !expr_const_in_range (&ep, 0, 16, 1))
12908                       break;
12909
12910                     imm = ep.X_add_number >> 1;
12911                     INSERT_OPERAND (1, IMMH, *ip, imm);
12912                   }
12913                   s = expr_end;
12914                   continue;
12915
12916                 case 'I':
12917                   {
12918                     bfd_reloc_code_real_type r[3];
12919                     expressionS ep;
12920                     int imm;
12921
12922                     if (my_getSmallExpression (&ep, r, s) > 0
12923                         || !expr_const_in_range (&ep, -1, 127, 0))
12924                       break;
12925
12926                     imm = ep.X_add_number & 127;
12927                     INSERT_OPERAND (1, IMMI, *ip, imm);
12928                   }
12929                   s = expr_end;
12930                   continue;
12931
12932                 case 'J':
12933                   {
12934                     bfd_reloc_code_real_type r[3];
12935                     expressionS ep;
12936                     int imm;
12937
12938                     /* Check whether there is only a single bracketed
12939                        expression left.  If so, it must be the base register
12940                        and the constant must be zero.  */
12941                     if (*s == '(' && strchr (s + 1, '(') == 0)
12942                       {
12943                         INSERT_OPERAND (1, IMMJ, *ip, 0);
12944                         continue;
12945                       }
12946
12947                     if (my_getSmallExpression (&ep, r, s) > 0
12948                         || !expr_const_in_range (&ep, 0, 16, 2))
12949                       break;
12950
12951                     imm = ep.X_add_number >> 2;
12952                     INSERT_OPERAND (1, IMMJ, *ip, imm);
12953                   }
12954                   s = expr_end;
12955                   continue;
12956
12957                 case 'L':
12958                   {
12959                     bfd_reloc_code_real_type r[3];
12960                     expressionS ep;
12961                     int imm;
12962
12963                     /* Check whether there is only a single bracketed
12964                        expression left.  If so, it must be the base register
12965                        and the constant must be zero.  */
12966                     if (*s == '(' && strchr (s + 1, '(') == 0)
12967                       {
12968                         INSERT_OPERAND (1, IMML, *ip, 0);
12969                         continue;
12970                       }
12971
12972                     if (my_getSmallExpression (&ep, r, s) > 0
12973                         || !expr_const_in_range (&ep, 0, 16, 0))
12974                       break;
12975
12976                     imm = ep.X_add_number;
12977                     INSERT_OPERAND (1, IMML, *ip, imm);
12978                   }
12979                   s = expr_end;
12980                   continue;
12981
12982                 case 'M':
12983                   {
12984                     bfd_reloc_code_real_type r[3];
12985                     expressionS ep;
12986                     int imm;
12987
12988                     if (my_getSmallExpression (&ep, r, s) > 0
12989                         || !expr_const_in_range (&ep, 1, 9, 0))
12990                       break;
12991
12992                     imm = ep.X_add_number & 7;
12993                     INSERT_OPERAND (1, IMMM, *ip, imm);
12994                   }
12995                   s = expr_end;
12996                   continue;
12997
12998                 case 'N':       /* Register list for lwm and swm.  */
12999                   {
13000                     /* A comma-separated list of registers and/or
13001                        dash-separated contiguous ranges including
13002                        both ra and a set of one or more registers
13003                        starting at s0 up to s3 which have to be
13004                        consecutive, e.g.:
13005
13006                        s0, ra
13007                        s0, s1, ra, s2, s3
13008                        s0-s2, ra
13009
13010                        and any permutations of these.  */
13011                     unsigned int reglist;
13012                     int imm;
13013
13014                     if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
13015                       break;
13016
13017                     if ((reglist & 0xfff1ffff) != 0x80010000)
13018                       break;
13019
13020                     reglist = (reglist >> 17) & 7;
13021                     reglist += 1;
13022                     if ((reglist & -reglist) != reglist)
13023                       break;
13024
13025                     imm = ffs (reglist) - 1;
13026                     INSERT_OPERAND (1, IMMN, *ip, imm);
13027                   }
13028                   continue;
13029
13030                 case 'O':       /* sdbbp 4-bit code.  */
13031                   {
13032                     bfd_reloc_code_real_type r[3];
13033                     expressionS ep;
13034                     int imm;
13035
13036                     if (my_getSmallExpression (&ep, r, s) > 0
13037                         || !expr_const_in_range (&ep, 0, 16, 0))
13038                       break;
13039
13040                     imm = ep.X_add_number;
13041                     INSERT_OPERAND (1, IMMO, *ip, imm);
13042                   }
13043                   s = expr_end;
13044                   continue;
13045
13046                 case 'P':
13047                   {
13048                     bfd_reloc_code_real_type r[3];
13049                     expressionS ep;
13050                     int imm;
13051
13052                     if (my_getSmallExpression (&ep, r, s) > 0
13053                         || !expr_const_in_range (&ep, 0, 32, 2))
13054                       break;
13055
13056                     imm = ep.X_add_number >> 2;
13057                     INSERT_OPERAND (1, IMMP, *ip, imm);
13058                   }
13059                   s = expr_end;
13060                   continue;
13061
13062                 case 'Q':
13063                   {
13064                     bfd_reloc_code_real_type r[3];
13065                     expressionS ep;
13066                     int imm;
13067
13068                     if (my_getSmallExpression (&ep, r, s) > 0
13069                         || !expr_const_in_range (&ep, -0x400000, 0x400000, 2))
13070                       break;
13071
13072                     imm = ep.X_add_number >> 2;
13073                     INSERT_OPERAND (1, IMMQ, *ip, imm);
13074                   }
13075                   s = expr_end;
13076                   continue;
13077
13078                 case 'U':
13079                   {
13080                     bfd_reloc_code_real_type r[3];
13081                     expressionS ep;
13082                     int imm;
13083
13084                     /* Check whether there is only a single bracketed
13085                        expression left.  If so, it must be the base register
13086                        and the constant must be zero.  */
13087                     if (*s == '(' && strchr (s + 1, '(') == 0)
13088                       {
13089                         INSERT_OPERAND (1, IMMU, *ip, 0);
13090                         continue;
13091                       }
13092
13093                     if (my_getSmallExpression (&ep, r, s) > 0
13094                         || !expr_const_in_range (&ep, 0, 32, 2))
13095                       break;
13096
13097                     imm = ep.X_add_number >> 2;
13098                     INSERT_OPERAND (1, IMMU, *ip, imm);
13099                   }
13100                   s = expr_end;
13101                   continue;
13102
13103                 case 'W':
13104                   {
13105                     bfd_reloc_code_real_type r[3];
13106                     expressionS ep;
13107                     int imm;
13108
13109                     if (my_getSmallExpression (&ep, r, s) > 0
13110                         || !expr_const_in_range (&ep, 0, 64, 2))
13111                       break;
13112
13113                     imm = ep.X_add_number >> 2;
13114                     INSERT_OPERAND (1, IMMW, *ip, imm);
13115                   }
13116                   s = expr_end;
13117                   continue;
13118
13119                 case 'X':
13120                   {
13121                     bfd_reloc_code_real_type r[3];
13122                     expressionS ep;
13123                     int imm;
13124
13125                     if (my_getSmallExpression (&ep, r, s) > 0
13126                         || !expr_const_in_range (&ep, -8, 8, 0))
13127                       break;
13128
13129                     imm = ep.X_add_number;
13130                     INSERT_OPERAND (1, IMMX, *ip, imm);
13131                   }
13132                   s = expr_end;
13133                   continue;
13134
13135                 case 'Y':
13136                   {
13137                     bfd_reloc_code_real_type r[3];
13138                     expressionS ep;
13139                     int imm;
13140
13141                     if (my_getSmallExpression (&ep, r, s) > 0
13142                         || expr_const_in_range (&ep, -2, 2, 2)
13143                         || !expr_const_in_range (&ep, -258, 258, 2))
13144                       break;
13145
13146                     imm = ep.X_add_number >> 2;
13147                     imm = ((imm >> 1) & ~0xff) | (imm & 0xff);
13148                     INSERT_OPERAND (1, IMMY, *ip, imm);
13149                   }
13150                   s = expr_end;
13151                   continue;
13152
13153                 case 'Z':
13154                   {
13155                     bfd_reloc_code_real_type r[3];
13156                     expressionS ep;
13157
13158                     if (my_getSmallExpression (&ep, r, s) > 0
13159                         || !expr_const_in_range (&ep, 0, 1, 0))
13160                       break;
13161                   }
13162                   s = expr_end;
13163                   continue;
13164
13165                 default:
13166                   as_bad (_("Internal error: bad microMIPS opcode "
13167                             "(unknown extension operand type `m%c'): %s %s"),
13168                           *args, insn->name, insn->args);
13169                   /* Further processing is fruitless.  */
13170                   return;
13171                 }
13172               break;
13173
13174             case 'n':           /* Register list for 32-bit lwm and swm.  */
13175               gas_assert (mips_opts.micromips);
13176               {
13177                 /* A comma-separated list of registers and/or
13178                    dash-separated contiguous ranges including
13179                    at least one of ra and a set of one or more
13180                    registers starting at s0 up to s7 and then
13181                    s8 which have to be consecutive, e.g.:
13182
13183                    ra
13184                    s0
13185                    ra, s0, s1, s2
13186                    s0-s8
13187                    s0-s5, ra
13188
13189                    and any permutations of these.  */
13190                 unsigned int reglist;
13191                 int imm;
13192                 int ra;
13193
13194                 if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
13195                   break;
13196
13197                 if ((reglist & 0x3f00ffff) != 0)
13198                   break;
13199
13200                 ra = (reglist >> 27) & 0x10;
13201                 reglist = ((reglist >> 22) & 0x100) | ((reglist >> 16) & 0xff);
13202                 reglist += 1;
13203                 if ((reglist & -reglist) != reglist)
13204                   break;
13205
13206                 imm = (ffs (reglist) - 1) | ra;
13207                 INSERT_OPERAND (1, RT, *ip, imm);
13208                 imm_expr.X_op = O_absent;
13209               }
13210               continue;
13211
13212             case '|':           /* 4-bit trap code.  */
13213               gas_assert (mips_opts.micromips);
13214               my_getExpression (&imm_expr, s);
13215               check_absolute_expr (ip, &imm_expr);
13216               if ((unsigned long) imm_expr.X_add_number
13217                   > MICROMIPSOP_MASK_TRAP)
13218                 as_bad (_("Trap code (%lu) for %s not in 0..15 range"),
13219                         (unsigned long) imm_expr.X_add_number,
13220                         ip->insn_mo->name);
13221               INSERT_OPERAND (1, TRAP, *ip, imm_expr.X_add_number);
13222               imm_expr.X_op = O_absent;
13223               s = expr_end;
13224               continue;
13225
13226             default:
13227               as_bad (_("Bad char = '%c'\n"), *args);
13228               internalError ();
13229             }
13230           break;
13231         }
13232       /* Args don't match.  */
13233       s = argsStart;
13234       insn_error = _("Illegal operands");
13235       if (insn + 1 < past && !strcmp (insn->name, insn[1].name))
13236         {
13237           ++insn;
13238           continue;
13239         }
13240       else if (wrong_delay_slot_insns && need_delay_slot_ok)
13241         {
13242           gas_assert (firstinsn);
13243           need_delay_slot_ok = FALSE;
13244           past = insn + 1;
13245           insn = firstinsn;
13246           continue;
13247         }
13248       return;
13249     }
13250 }
13251
13252 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
13253
13254 /* This routine assembles an instruction into its binary format when
13255    assembling for the mips16.  As a side effect, it sets one of the
13256    global variables imm_reloc or offset_reloc to the type of relocation
13257    to do if one of the operands is an address expression.  It also sets
13258    forced_insn_length to the resulting instruction size in bytes if the
13259    user explicitly requested a small or extended instruction.  */
13260
13261 static void
13262 mips16_ip (char *str, struct mips_cl_insn *ip)
13263 {
13264   char *s;
13265   const char *args;
13266   struct mips_opcode *insn;
13267   char *argsstart;
13268   unsigned int regno;
13269   unsigned int lastregno = 0;
13270   char *s_reset;
13271   size_t i;
13272
13273   insn_error = NULL;
13274
13275   forced_insn_length = 0;
13276
13277   for (s = str; ISLOWER (*s); ++s)
13278     ;
13279   switch (*s)
13280     {
13281     case '\0':
13282       break;
13283
13284     case ' ':
13285       *s++ = '\0';
13286       break;
13287
13288     case '.':
13289       if (s[1] == 't' && s[2] == ' ')
13290         {
13291           *s = '\0';
13292           forced_insn_length = 2;
13293           s += 3;
13294           break;
13295         }
13296       else if (s[1] == 'e' && s[2] == ' ')
13297         {
13298           *s = '\0';
13299           forced_insn_length = 4;
13300           s += 3;
13301           break;
13302         }
13303       /* Fall through.  */
13304     default:
13305       insn_error = _("unknown opcode");
13306       return;
13307     }
13308
13309   if (mips_opts.noautoextend && !forced_insn_length)
13310     forced_insn_length = 2;
13311
13312   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
13313     {
13314       insn_error = _("unrecognized opcode");
13315       return;
13316     }
13317
13318   argsstart = s;
13319   for (;;)
13320     {
13321       bfd_boolean ok;
13322
13323       gas_assert (strcmp (insn->name, str) == 0);
13324
13325       ok = is_opcode_valid_16 (insn);
13326       if (! ok)
13327         {
13328           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
13329               && strcmp (insn->name, insn[1].name) == 0)
13330             {
13331               ++insn;
13332               continue;
13333             }
13334           else
13335             {
13336               if (!insn_error)
13337                 {
13338                   static char buf[100];
13339                   sprintf (buf,
13340                            _("Opcode not supported on this processor: %s (%s)"),
13341                            mips_cpu_info_from_arch (mips_opts.arch)->name,
13342                            mips_cpu_info_from_isa (mips_opts.isa)->name);
13343                   insn_error = buf;
13344                 }
13345               return;
13346             }
13347         }
13348
13349       create_insn (ip, insn);
13350       imm_expr.X_op = O_absent;
13351       imm_reloc[0] = BFD_RELOC_UNUSED;
13352       imm_reloc[1] = BFD_RELOC_UNUSED;
13353       imm_reloc[2] = BFD_RELOC_UNUSED;
13354       imm2_expr.X_op = O_absent;
13355       offset_expr.X_op = O_absent;
13356       offset_reloc[0] = BFD_RELOC_UNUSED;
13357       offset_reloc[1] = BFD_RELOC_UNUSED;
13358       offset_reloc[2] = BFD_RELOC_UNUSED;
13359       for (args = insn->args; 1; ++args)
13360         {
13361           int c;
13362
13363           if (*s == ' ')
13364             ++s;
13365
13366           /* In this switch statement we call break if we did not find
13367              a match, continue if we did find a match, or return if we
13368              are done.  */
13369
13370           c = *args;
13371           switch (c)
13372             {
13373             case '\0':
13374               if (*s == '\0')
13375                 {
13376                   /* Stuff the immediate value in now, if we can.  */
13377                   if (imm_expr.X_op == O_constant
13378                       && *imm_reloc > BFD_RELOC_UNUSED
13379                       && *imm_reloc != BFD_RELOC_MIPS16_GOT16
13380                       && *imm_reloc != BFD_RELOC_MIPS16_CALL16
13381                       && insn->pinfo != INSN_MACRO)
13382                     {
13383                       valueT tmp;
13384
13385                       switch (*offset_reloc)
13386                         {
13387                           case BFD_RELOC_MIPS16_HI16_S:
13388                             tmp = (imm_expr.X_add_number + 0x8000) >> 16;
13389                             break;
13390
13391                           case BFD_RELOC_MIPS16_HI16:
13392                             tmp = imm_expr.X_add_number >> 16;
13393                             break;
13394
13395                           case BFD_RELOC_MIPS16_LO16:
13396                             tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
13397                                   - 0x8000;
13398                             break;
13399
13400                           case BFD_RELOC_UNUSED:
13401                             tmp = imm_expr.X_add_number;
13402                             break;
13403
13404                           default:
13405                             internalError ();
13406                         }
13407                       *offset_reloc = BFD_RELOC_UNUSED;
13408
13409                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
13410                                     tmp, TRUE, forced_insn_length == 2,
13411                                     forced_insn_length == 4, &ip->insn_opcode,
13412                                     &ip->use_extend, &ip->extend);
13413                       imm_expr.X_op = O_absent;
13414                       *imm_reloc = BFD_RELOC_UNUSED;
13415                     }
13416
13417                   return;
13418                 }
13419               break;
13420
13421             case ',':
13422               if (*s++ == c)
13423                 continue;
13424               s--;
13425               switch (*++args)
13426                 {
13427                 case 'v':
13428                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13429                   continue;
13430                 case 'w':
13431                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13432                   continue;
13433                 }
13434               break;
13435
13436             case '(':
13437             case ')':
13438               if (*s++ == c)
13439                 continue;
13440               break;
13441
13442             case 'v':
13443             case 'w':
13444               if (s[0] != '$')
13445                 {
13446                   if (c == 'v')
13447                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13448                   else
13449                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13450                   ++args;
13451                   continue;
13452                 }
13453               /* Fall through.  */
13454             case 'x':
13455             case 'y':
13456             case 'z':
13457             case 'Z':
13458             case '0':
13459             case 'S':
13460             case 'R':
13461             case 'X':
13462             case 'Y':
13463               s_reset = s;
13464               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
13465                 {
13466                   if (c == 'v' || c == 'w')
13467                     {
13468                       if (c == 'v')
13469                         MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13470                       else
13471                         MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13472                       ++args;
13473                       continue;
13474                     }
13475                   break;
13476                 }
13477
13478               if (*s == ' ')
13479                 ++s;
13480               if (args[1] != *s)
13481                 {
13482                   if (c == 'v' || c == 'w')
13483                     {
13484                       regno = mips16_to_32_reg_map[lastregno];
13485                       s = s_reset;
13486                       ++args;
13487                     }
13488                 }
13489
13490               switch (c)
13491                 {
13492                 case 'x':
13493                 case 'y':
13494                 case 'z':
13495                 case 'v':
13496                 case 'w':
13497                 case 'Z':
13498                   regno = mips32_to_16_reg_map[regno];
13499                   break;
13500
13501                 case '0':
13502                   if (regno != 0)
13503                     regno = ILLEGAL_REG;
13504                   break;
13505
13506                 case 'S':
13507                   if (regno != SP)
13508                     regno = ILLEGAL_REG;
13509                   break;
13510
13511                 case 'R':
13512                   if (regno != RA)
13513                     regno = ILLEGAL_REG;
13514                   break;
13515
13516                 case 'X':
13517                 case 'Y':
13518                   if (regno == AT && mips_opts.at)
13519                     {
13520                       if (mips_opts.at == ATREG)
13521                         as_warn (_("used $at without \".set noat\""));
13522                       else
13523                         as_warn (_("used $%u with \".set at=$%u\""),
13524                                  regno, mips_opts.at);
13525                     }
13526                   break;
13527
13528                 default:
13529                   internalError ();
13530                 }
13531
13532               if (regno == ILLEGAL_REG)
13533                 break;
13534
13535               switch (c)
13536                 {
13537                 case 'x':
13538                 case 'v':
13539                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
13540                   break;
13541                 case 'y':
13542                 case 'w':
13543                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
13544                   break;
13545                 case 'z':
13546                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
13547                   break;
13548                 case 'Z':
13549                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
13550                 case '0':
13551                 case 'S':
13552                 case 'R':
13553                   break;
13554                 case 'X':
13555                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
13556                   break;
13557                 case 'Y':
13558                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
13559                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
13560                   break;
13561                 default:
13562                   internalError ();
13563                 }
13564
13565               lastregno = regno;
13566               continue;
13567
13568             case 'P':
13569               if (strncmp (s, "$pc", 3) == 0)
13570                 {
13571                   s += 3;
13572                   continue;
13573                 }
13574               break;
13575
13576             case '5':
13577             case 'H':
13578             case 'W':
13579             case 'D':
13580             case 'j':
13581             case 'V':
13582             case 'C':
13583             case 'U':
13584             case 'k':
13585             case 'K':
13586               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
13587               if (i > 0)
13588                 {
13589                   if (imm_expr.X_op != O_constant)
13590                     {
13591                       forced_insn_length = 4;
13592                       ip->use_extend = TRUE;
13593                       ip->extend = 0;
13594                     }
13595                   else
13596                     {
13597                       /* We need to relax this instruction.  */
13598                       *offset_reloc = *imm_reloc;
13599                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13600                     }
13601                   s = expr_end;
13602                   continue;
13603                 }
13604               *imm_reloc = BFD_RELOC_UNUSED;
13605               /* Fall through.  */
13606             case '<':
13607             case '>':
13608             case '[':
13609             case ']':
13610             case '4':
13611             case '8':
13612               my_getExpression (&imm_expr, s);
13613               if (imm_expr.X_op == O_register)
13614                 {
13615                   /* What we thought was an expression turned out to
13616                      be a register.  */
13617
13618                   if (s[0] == '(' && args[1] == '(')
13619                     {
13620                       /* It looks like the expression was omitted
13621                          before a register indirection, which means
13622                          that the expression is implicitly zero.  We
13623                          still set up imm_expr, so that we handle
13624                          explicit extensions correctly.  */
13625                       imm_expr.X_op = O_constant;
13626                       imm_expr.X_add_number = 0;
13627                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13628                       continue;
13629                     }
13630
13631                   break;
13632                 }
13633
13634               /* We need to relax this instruction.  */
13635               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13636               s = expr_end;
13637               continue;
13638
13639             case 'p':
13640             case 'q':
13641             case 'A':
13642             case 'B':
13643             case 'E':
13644               /* We use offset_reloc rather than imm_reloc for the PC
13645                  relative operands.  This lets macros with both
13646                  immediate and address operands work correctly.  */
13647               my_getExpression (&offset_expr, s);
13648
13649               if (offset_expr.X_op == O_register)
13650                 break;
13651
13652               /* We need to relax this instruction.  */
13653               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
13654               s = expr_end;
13655               continue;
13656
13657             case '6':           /* break code */
13658               my_getExpression (&imm_expr, s);
13659               check_absolute_expr (ip, &imm_expr);
13660               if ((unsigned long) imm_expr.X_add_number > 63)
13661                 as_warn (_("Invalid value for `%s' (%lu)"),
13662                          ip->insn_mo->name,
13663                          (unsigned long) imm_expr.X_add_number);
13664               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
13665               imm_expr.X_op = O_absent;
13666               s = expr_end;
13667               continue;
13668
13669             case 'a':           /* 26 bit address */
13670               my_getExpression (&offset_expr, s);
13671               s = expr_end;
13672               *offset_reloc = BFD_RELOC_MIPS16_JMP;
13673               ip->insn_opcode <<= 16;
13674               continue;
13675
13676             case 'l':           /* register list for entry macro */
13677             case 'L':           /* register list for exit macro */
13678               {
13679                 int mask;
13680
13681                 if (c == 'l')
13682                   mask = 0;
13683                 else
13684                   mask = 7 << 3;
13685                 while (*s != '\0')
13686                   {
13687                     unsigned int freg, reg1, reg2;
13688
13689                     while (*s == ' ' || *s == ',')
13690                       ++s;
13691                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
13692                       freg = 0;
13693                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
13694                       freg = 1;
13695                     else
13696                       {
13697                         as_bad (_("can't parse register list"));
13698                         break;
13699                       }
13700                     if (*s == ' ')
13701                       ++s;
13702                     if (*s != '-')
13703                       reg2 = reg1;
13704                     else
13705                       {
13706                         ++s;
13707                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
13708                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
13709                           {
13710                             as_bad (_("invalid register list"));
13711                             break;
13712                           }
13713                       }
13714                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
13715                       {
13716                         mask &= ~ (7 << 3);
13717                         mask |= 5 << 3;
13718                       }
13719                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
13720                       {
13721                         mask &= ~ (7 << 3);
13722                         mask |= 6 << 3;
13723                       }
13724                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
13725                       mask |= (reg2 - 3) << 3;
13726                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
13727                       mask |= (reg2 - 15) << 1;
13728                     else if (reg1 == RA && reg2 == RA)
13729                       mask |= 1;
13730                     else
13731                       {
13732                         as_bad (_("invalid register list"));
13733                         break;
13734                       }
13735                   }
13736                 /* The mask is filled in in the opcode table for the
13737                    benefit of the disassembler.  We remove it before
13738                    applying the actual mask.  */
13739                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
13740                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
13741               }
13742             continue;
13743
13744             case 'm':           /* Register list for save insn.  */
13745             case 'M':           /* Register list for restore insn.  */
13746               {
13747                 int opcode = 0;
13748                 int framesz = 0, seen_framesz = 0;
13749                 int nargs = 0, statics = 0, sregs = 0;
13750
13751                 while (*s != '\0')
13752                   {
13753                     unsigned int reg1, reg2;
13754
13755                     SKIP_SPACE_TABS (s);
13756                     while (*s == ',')
13757                       ++s;
13758                     SKIP_SPACE_TABS (s);
13759
13760                     my_getExpression (&imm_expr, s);
13761                     if (imm_expr.X_op == O_constant)
13762                       {
13763                         /* Handle the frame size.  */
13764                         if (seen_framesz)
13765                           {
13766                             as_bad (_("more than one frame size in list"));
13767                             break;
13768                           }
13769                         seen_framesz = 1;
13770                         framesz = imm_expr.X_add_number;
13771                         imm_expr.X_op = O_absent;
13772                         s = expr_end;
13773                         continue;
13774                       }
13775
13776                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
13777                       {
13778                         as_bad (_("can't parse register list"));
13779                         break;
13780                       }
13781
13782                     while (*s == ' ')
13783                       ++s;
13784
13785                     if (*s != '-')
13786                       reg2 = reg1;
13787                     else
13788                       {
13789                         ++s;
13790                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
13791                             || reg2 < reg1)
13792                           {
13793                             as_bad (_("can't parse register list"));
13794                             break;
13795                           }
13796                       }
13797
13798                     while (reg1 <= reg2)
13799                       {
13800                         if (reg1 >= 4 && reg1 <= 7)
13801                           {
13802                             if (!seen_framesz)
13803                                 /* args $a0-$a3 */
13804                                 nargs |= 1 << (reg1 - 4);
13805                             else
13806                                 /* statics $a0-$a3 */
13807                                 statics |= 1 << (reg1 - 4);
13808                           }
13809                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
13810                           {
13811                             /* $s0-$s8 */
13812                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
13813                           }
13814                         else if (reg1 == 31)
13815                           {
13816                             /* Add $ra to insn.  */
13817                             opcode |= 0x40;
13818                           }
13819                         else
13820                           {
13821                             as_bad (_("unexpected register in list"));
13822                             break;
13823                           }
13824                         if (++reg1 == 24)
13825                           reg1 = 30;
13826                       }
13827                   }
13828
13829                 /* Encode args/statics combination.  */
13830                 if (nargs & statics)
13831                   as_bad (_("arg/static registers overlap"));
13832                 else if (nargs == 0xf)
13833                   /* All $a0-$a3 are args.  */
13834                   opcode |= MIPS16_ALL_ARGS << 16;
13835                 else if (statics == 0xf)
13836                   /* All $a0-$a3 are statics.  */
13837                   opcode |= MIPS16_ALL_STATICS << 16;
13838                 else 
13839                   {
13840                     int narg = 0, nstat = 0;
13841
13842                     /* Count arg registers.  */
13843                     while (nargs & 0x1)
13844                       {
13845                         nargs >>= 1;
13846                         narg++;
13847                       }
13848                     if (nargs != 0)
13849                       as_bad (_("invalid arg register list"));
13850
13851                     /* Count static registers.  */
13852                     while (statics & 0x8)
13853                       {
13854                         statics = (statics << 1) & 0xf;
13855                         nstat++;
13856                       }
13857                     if (statics != 0) 
13858                       as_bad (_("invalid static register list"));
13859
13860                     /* Encode args/statics.  */
13861                     opcode |= ((narg << 2) | nstat) << 16;
13862                   }
13863
13864                 /* Encode $s0/$s1.  */
13865                 if (sregs & (1 << 0))           /* $s0 */
13866                   opcode |= 0x20;
13867                 if (sregs & (1 << 1))           /* $s1 */
13868                   opcode |= 0x10;
13869                 sregs >>= 2;
13870
13871                 if (sregs != 0)
13872                   {
13873                     /* Count regs $s2-$s8.  */
13874                     int nsreg = 0;
13875                     while (sregs & 1)
13876                       {
13877                         sregs >>= 1;
13878                         nsreg++;
13879                       }
13880                     if (sregs != 0)
13881                       as_bad (_("invalid static register list"));
13882                     /* Encode $s2-$s8. */
13883                     opcode |= nsreg << 24;
13884                   }
13885
13886                 /* Encode frame size.  */
13887                 if (!seen_framesz)
13888                   as_bad (_("missing frame size"));
13889                 else if ((framesz & 7) != 0 || framesz < 0
13890                          || framesz > 0xff * 8)
13891                   as_bad (_("invalid frame size"));
13892                 else if (framesz != 128 || (opcode >> 16) != 0)
13893                   {
13894                     framesz /= 8;
13895                     opcode |= (((framesz & 0xf0) << 16)
13896                              | (framesz & 0x0f));
13897                   }
13898
13899                 /* Finally build the instruction.  */
13900                 if ((opcode >> 16) != 0 || framesz == 0)
13901                   {
13902                     ip->use_extend = TRUE;
13903                     ip->extend = opcode >> 16;
13904                   }
13905                 ip->insn_opcode |= opcode & 0x7f;
13906               }
13907             continue;
13908
13909             case 'e':           /* extend code */
13910               my_getExpression (&imm_expr, s);
13911               check_absolute_expr (ip, &imm_expr);
13912               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
13913                 {
13914                   as_warn (_("Invalid value for `%s' (%lu)"),
13915                            ip->insn_mo->name,
13916                            (unsigned long) imm_expr.X_add_number);
13917                   imm_expr.X_add_number &= 0x7ff;
13918                 }
13919               ip->insn_opcode |= imm_expr.X_add_number;
13920               imm_expr.X_op = O_absent;
13921               s = expr_end;
13922               continue;
13923
13924             default:
13925               internalError ();
13926             }
13927           break;
13928         }
13929
13930       /* Args don't match.  */
13931       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
13932           strcmp (insn->name, insn[1].name) == 0)
13933         {
13934           ++insn;
13935           s = argsstart;
13936           continue;
13937         }
13938
13939       insn_error = _("illegal operands");
13940
13941       return;
13942     }
13943 }
13944
13945 /* This structure holds information we know about a mips16 immediate
13946    argument type.  */
13947
13948 struct mips16_immed_operand
13949 {
13950   /* The type code used in the argument string in the opcode table.  */
13951   int type;
13952   /* The number of bits in the short form of the opcode.  */
13953   int nbits;
13954   /* The number of bits in the extended form of the opcode.  */
13955   int extbits;
13956   /* The amount by which the short form is shifted when it is used;
13957      for example, the sw instruction has a shift count of 2.  */
13958   int shift;
13959   /* The amount by which the short form is shifted when it is stored
13960      into the instruction code.  */
13961   int op_shift;
13962   /* Non-zero if the short form is unsigned.  */
13963   int unsp;
13964   /* Non-zero if the extended form is unsigned.  */
13965   int extu;
13966   /* Non-zero if the value is PC relative.  */
13967   int pcrel;
13968 };
13969
13970 /* The mips16 immediate operand types.  */
13971
13972 static const struct mips16_immed_operand mips16_immed_operands[] =
13973 {
13974   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
13975   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
13976   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
13977   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
13978   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
13979   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
13980   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
13981   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
13982   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
13983   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
13984   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
13985   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
13986   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
13987   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
13988   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
13989   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
13990   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
13991   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
13992   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
13993   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
13994   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
13995 };
13996
13997 #define MIPS16_NUM_IMMED \
13998   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
13999
14000 /* Handle a mips16 instruction with an immediate value.  This or's the
14001    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
14002    whether an extended value is needed; if one is needed, it sets
14003    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
14004    If SMALL is true, an unextended opcode was explicitly requested.
14005    If EXT is true, an extended opcode was explicitly requested.  If
14006    WARN is true, warn if EXT does not match reality.  */
14007
14008 static void
14009 mips16_immed (char *file, unsigned int line, int type, offsetT val,
14010               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
14011               unsigned long *insn, bfd_boolean *use_extend,
14012               unsigned short *extend)
14013 {
14014   const struct mips16_immed_operand *op;
14015   int mintiny, maxtiny;
14016   bfd_boolean needext;
14017
14018   op = mips16_immed_operands;
14019   while (op->type != type)
14020     {
14021       ++op;
14022       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
14023     }
14024
14025   if (op->unsp)
14026     {
14027       if (type == '<' || type == '>' || type == '[' || type == ']')
14028         {
14029           mintiny = 1;
14030           maxtiny = 1 << op->nbits;
14031         }
14032       else
14033         {
14034           mintiny = 0;
14035           maxtiny = (1 << op->nbits) - 1;
14036         }
14037     }
14038   else
14039     {
14040       mintiny = - (1 << (op->nbits - 1));
14041       maxtiny = (1 << (op->nbits - 1)) - 1;
14042     }
14043
14044   /* Branch offsets have an implicit 0 in the lowest bit.  */
14045   if (type == 'p' || type == 'q')
14046     val /= 2;
14047
14048   if ((val & ((1 << op->shift) - 1)) != 0
14049       || val < (mintiny << op->shift)
14050       || val > (maxtiny << op->shift))
14051     needext = TRUE;
14052   else
14053     needext = FALSE;
14054
14055   if (warn && ext && ! needext)
14056     as_warn_where (file, line,
14057                    _("extended operand requested but not required"));
14058   if (small && needext)
14059     as_bad_where (file, line, _("invalid unextended operand value"));
14060
14061   if (small || (! ext && ! needext))
14062     {
14063       int insnval;
14064
14065       *use_extend = FALSE;
14066       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
14067       insnval <<= op->op_shift;
14068       *insn |= insnval;
14069     }
14070   else
14071     {
14072       long minext, maxext;
14073       int extval;
14074
14075       if (op->extu)
14076         {
14077           minext = 0;
14078           maxext = (1 << op->extbits) - 1;
14079         }
14080       else
14081         {
14082           minext = - (1 << (op->extbits - 1));
14083           maxext = (1 << (op->extbits - 1)) - 1;
14084         }
14085       if (val < minext || val > maxext)
14086         as_bad_where (file, line,
14087                       _("operand value out of range for instruction"));
14088
14089       *use_extend = TRUE;
14090       if (op->extbits == 16)
14091         {
14092           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
14093           val &= 0x1f;
14094         }
14095       else if (op->extbits == 15)
14096         {
14097           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
14098           val &= 0xf;
14099         }
14100       else
14101         {
14102           extval = ((val & 0x1f) << 6) | (val & 0x20);
14103           val = 0;
14104         }
14105
14106       *extend = (unsigned short) extval;
14107       *insn |= val;
14108     }
14109 }
14110 \f
14111 struct percent_op_match
14112 {
14113   const char *str;
14114   bfd_reloc_code_real_type reloc;
14115 };
14116
14117 static const struct percent_op_match mips_percent_op[] =
14118 {
14119   {"%lo", BFD_RELOC_LO16},
14120 #ifdef OBJ_ELF
14121   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
14122   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
14123   {"%call16", BFD_RELOC_MIPS_CALL16},
14124   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
14125   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
14126   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
14127   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
14128   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
14129   {"%got", BFD_RELOC_MIPS_GOT16},
14130   {"%gp_rel", BFD_RELOC_GPREL16},
14131   {"%half", BFD_RELOC_16},
14132   {"%highest", BFD_RELOC_MIPS_HIGHEST},
14133   {"%higher", BFD_RELOC_MIPS_HIGHER},
14134   {"%neg", BFD_RELOC_MIPS_SUB},
14135   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
14136   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
14137   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
14138   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
14139   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
14140   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
14141   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
14142 #endif
14143   {"%hi", BFD_RELOC_HI16_S}
14144 };
14145
14146 static const struct percent_op_match mips16_percent_op[] =
14147 {
14148   {"%lo", BFD_RELOC_MIPS16_LO16},
14149   {"%gprel", BFD_RELOC_MIPS16_GPREL},
14150   {"%got", BFD_RELOC_MIPS16_GOT16},
14151   {"%call16", BFD_RELOC_MIPS16_CALL16},
14152   {"%hi", BFD_RELOC_MIPS16_HI16_S},
14153   {"%tlsgd", BFD_RELOC_MIPS16_TLS_GD},
14154   {"%tlsldm", BFD_RELOC_MIPS16_TLS_LDM},
14155   {"%dtprel_hi", BFD_RELOC_MIPS16_TLS_DTPREL_HI16},
14156   {"%dtprel_lo", BFD_RELOC_MIPS16_TLS_DTPREL_LO16},
14157   {"%tprel_hi", BFD_RELOC_MIPS16_TLS_TPREL_HI16},
14158   {"%tprel_lo", BFD_RELOC_MIPS16_TLS_TPREL_LO16},
14159   {"%gottprel", BFD_RELOC_MIPS16_TLS_GOTTPREL}
14160 };
14161
14162
14163 /* Return true if *STR points to a relocation operator.  When returning true,
14164    move *STR over the operator and store its relocation code in *RELOC.
14165    Leave both *STR and *RELOC alone when returning false.  */
14166
14167 static bfd_boolean
14168 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
14169 {
14170   const struct percent_op_match *percent_op;
14171   size_t limit, i;
14172
14173   if (mips_opts.mips16)
14174     {
14175       percent_op = mips16_percent_op;
14176       limit = ARRAY_SIZE (mips16_percent_op);
14177     }
14178   else
14179     {
14180       percent_op = mips_percent_op;
14181       limit = ARRAY_SIZE (mips_percent_op);
14182     }
14183
14184   for (i = 0; i < limit; i++)
14185     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
14186       {
14187         int len = strlen (percent_op[i].str);
14188
14189         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
14190           continue;
14191
14192         *str += strlen (percent_op[i].str);
14193         *reloc = percent_op[i].reloc;
14194
14195         /* Check whether the output BFD supports this relocation.
14196            If not, issue an error and fall back on something safe.  */
14197         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
14198           {
14199             as_bad (_("relocation %s isn't supported by the current ABI"),
14200                     percent_op[i].str);
14201             *reloc = BFD_RELOC_UNUSED;
14202           }
14203         return TRUE;
14204       }
14205   return FALSE;
14206 }
14207
14208
14209 /* Parse string STR as a 16-bit relocatable operand.  Store the
14210    expression in *EP and the relocations in the array starting
14211    at RELOC.  Return the number of relocation operators used.
14212
14213    On exit, EXPR_END points to the first character after the expression.  */
14214
14215 static size_t
14216 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
14217                        char *str)
14218 {
14219   bfd_reloc_code_real_type reversed_reloc[3];
14220   size_t reloc_index, i;
14221   int crux_depth, str_depth;
14222   char *crux;
14223
14224   /* Search for the start of the main expression, recoding relocations
14225      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
14226      of the main expression and with CRUX_DEPTH containing the number
14227      of open brackets at that point.  */
14228   reloc_index = -1;
14229   str_depth = 0;
14230   do
14231     {
14232       reloc_index++;
14233       crux = str;
14234       crux_depth = str_depth;
14235
14236       /* Skip over whitespace and brackets, keeping count of the number
14237          of brackets.  */
14238       while (*str == ' ' || *str == '\t' || *str == '(')
14239         if (*str++ == '(')
14240           str_depth++;
14241     }
14242   while (*str == '%'
14243          && reloc_index < (HAVE_NEWABI ? 3 : 1)
14244          && parse_relocation (&str, &reversed_reloc[reloc_index]));
14245
14246   my_getExpression (ep, crux);
14247   str = expr_end;
14248
14249   /* Match every open bracket.  */
14250   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
14251     if (*str++ == ')')
14252       crux_depth--;
14253
14254   if (crux_depth > 0)
14255     as_bad (_("unclosed '('"));
14256
14257   expr_end = str;
14258
14259   if (reloc_index != 0)
14260     {
14261       prev_reloc_op_frag = frag_now;
14262       for (i = 0; i < reloc_index; i++)
14263         reloc[i] = reversed_reloc[reloc_index - 1 - i];
14264     }
14265
14266   return reloc_index;
14267 }
14268
14269 static void
14270 my_getExpression (expressionS *ep, char *str)
14271 {
14272   char *save_in;
14273
14274   save_in = input_line_pointer;
14275   input_line_pointer = str;
14276   expression (ep);
14277   expr_end = input_line_pointer;
14278   input_line_pointer = save_in;
14279 }
14280
14281 char *
14282 md_atof (int type, char *litP, int *sizeP)
14283 {
14284   return ieee_md_atof (type, litP, sizeP, target_big_endian);
14285 }
14286
14287 void
14288 md_number_to_chars (char *buf, valueT val, int n)
14289 {
14290   if (target_big_endian)
14291     number_to_chars_bigendian (buf, val, n);
14292   else
14293     number_to_chars_littleendian (buf, val, n);
14294 }
14295 \f
14296 #ifdef OBJ_ELF
14297 static int support_64bit_objects(void)
14298 {
14299   const char **list, **l;
14300   int yes;
14301
14302   list = bfd_target_list ();
14303   for (l = list; *l != NULL; l++)
14304     if (strcmp (*l, ELF_TARGET ("elf64-", "big")) == 0
14305         || strcmp (*l, ELF_TARGET ("elf64-", "little")) == 0)
14306       break;
14307   yes = (*l != NULL);
14308   free (list);
14309   return yes;
14310 }
14311 #endif /* OBJ_ELF */
14312
14313 const char *md_shortopts = "O::g::G:";
14314
14315 enum options
14316   {
14317     OPTION_MARCH = OPTION_MD_BASE,
14318     OPTION_MTUNE,
14319     OPTION_MIPS1,
14320     OPTION_MIPS2,
14321     OPTION_MIPS3,
14322     OPTION_MIPS4,
14323     OPTION_MIPS5,
14324     OPTION_MIPS32,
14325     OPTION_MIPS64,
14326     OPTION_MIPS32R2,
14327     OPTION_MIPS64R2,
14328     OPTION_MIPS16,
14329     OPTION_NO_MIPS16,
14330     OPTION_MIPS3D,
14331     OPTION_NO_MIPS3D,
14332     OPTION_MDMX,
14333     OPTION_NO_MDMX,
14334     OPTION_DSP,
14335     OPTION_NO_DSP,
14336     OPTION_MT,
14337     OPTION_NO_MT,
14338     OPTION_SMARTMIPS,
14339     OPTION_NO_SMARTMIPS,
14340     OPTION_DSPR2,
14341     OPTION_NO_DSPR2,
14342     OPTION_MICROMIPS,
14343     OPTION_NO_MICROMIPS,
14344     OPTION_MCU,
14345     OPTION_NO_MCU,
14346     OPTION_COMPAT_ARCH_BASE,
14347     OPTION_M4650,
14348     OPTION_NO_M4650,
14349     OPTION_M4010,
14350     OPTION_NO_M4010,
14351     OPTION_M4100,
14352     OPTION_NO_M4100,
14353     OPTION_M3900,
14354     OPTION_NO_M3900,
14355     OPTION_M7000_HILO_FIX,
14356     OPTION_MNO_7000_HILO_FIX, 
14357     OPTION_FIX_24K,
14358     OPTION_NO_FIX_24K,
14359     OPTION_FIX_LOONGSON2F_JUMP,
14360     OPTION_NO_FIX_LOONGSON2F_JUMP,
14361     OPTION_FIX_LOONGSON2F_NOP,
14362     OPTION_NO_FIX_LOONGSON2F_NOP,
14363     OPTION_FIX_VR4120,
14364     OPTION_NO_FIX_VR4120,
14365     OPTION_FIX_VR4130,
14366     OPTION_NO_FIX_VR4130,
14367     OPTION_FIX_CN63XXP1,
14368     OPTION_NO_FIX_CN63XXP1,
14369     OPTION_TRAP,
14370     OPTION_BREAK,
14371     OPTION_EB,
14372     OPTION_EL,
14373     OPTION_FP32,
14374     OPTION_GP32,
14375     OPTION_CONSTRUCT_FLOATS,
14376     OPTION_NO_CONSTRUCT_FLOATS,
14377     OPTION_FP64,
14378     OPTION_GP64,
14379     OPTION_RELAX_BRANCH,
14380     OPTION_NO_RELAX_BRANCH,
14381     OPTION_MSHARED,
14382     OPTION_MNO_SHARED,
14383     OPTION_MSYM32,
14384     OPTION_MNO_SYM32,
14385     OPTION_SOFT_FLOAT,
14386     OPTION_HARD_FLOAT,
14387     OPTION_SINGLE_FLOAT,
14388     OPTION_DOUBLE_FLOAT,
14389     OPTION_32,
14390 #ifdef OBJ_ELF
14391     OPTION_CALL_SHARED,
14392     OPTION_CALL_NONPIC,
14393     OPTION_NON_SHARED,
14394     OPTION_XGOT,
14395     OPTION_MABI,
14396     OPTION_N32,
14397     OPTION_64,
14398     OPTION_MDEBUG,
14399     OPTION_NO_MDEBUG,
14400     OPTION_PDR,
14401     OPTION_NO_PDR,
14402     OPTION_MVXWORKS_PIC,
14403 #endif /* OBJ_ELF */
14404     OPTION_END_OF_ENUM    
14405   };
14406   
14407 struct option md_longopts[] =
14408 {
14409   /* Options which specify architecture.  */
14410   {"march", required_argument, NULL, OPTION_MARCH},
14411   {"mtune", required_argument, NULL, OPTION_MTUNE},
14412   {"mips0", no_argument, NULL, OPTION_MIPS1},
14413   {"mips1", no_argument, NULL, OPTION_MIPS1},
14414   {"mips2", no_argument, NULL, OPTION_MIPS2},
14415   {"mips3", no_argument, NULL, OPTION_MIPS3},
14416   {"mips4", no_argument, NULL, OPTION_MIPS4},
14417   {"mips5", no_argument, NULL, OPTION_MIPS5},
14418   {"mips32", no_argument, NULL, OPTION_MIPS32},
14419   {"mips64", no_argument, NULL, OPTION_MIPS64},
14420   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
14421   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
14422
14423   /* Options which specify Application Specific Extensions (ASEs).  */
14424   {"mips16", no_argument, NULL, OPTION_MIPS16},
14425   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
14426   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
14427   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
14428   {"mdmx", no_argument, NULL, OPTION_MDMX},
14429   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
14430   {"mdsp", no_argument, NULL, OPTION_DSP},
14431   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
14432   {"mmt", no_argument, NULL, OPTION_MT},
14433   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
14434   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
14435   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
14436   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
14437   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
14438   {"mmicromips", no_argument, NULL, OPTION_MICROMIPS},
14439   {"mno-micromips", no_argument, NULL, OPTION_NO_MICROMIPS},
14440   {"mmcu", no_argument, NULL, OPTION_MCU},
14441   {"mno-mcu", no_argument, NULL, OPTION_NO_MCU},
14442
14443   /* Old-style architecture options.  Don't add more of these.  */
14444   {"m4650", no_argument, NULL, OPTION_M4650},
14445   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
14446   {"m4010", no_argument, NULL, OPTION_M4010},
14447   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
14448   {"m4100", no_argument, NULL, OPTION_M4100},
14449   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
14450   {"m3900", no_argument, NULL, OPTION_M3900},
14451   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
14452
14453   /* Options which enable bug fixes.  */
14454   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
14455   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
14456   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
14457   {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
14458   {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
14459   {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
14460   {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
14461   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
14462   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
14463   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
14464   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
14465   {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
14466   {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
14467   {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
14468   {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
14469
14470   /* Miscellaneous options.  */
14471   {"trap", no_argument, NULL, OPTION_TRAP},
14472   {"no-break", no_argument, NULL, OPTION_TRAP},
14473   {"break", no_argument, NULL, OPTION_BREAK},
14474   {"no-trap", no_argument, NULL, OPTION_BREAK},
14475   {"EB", no_argument, NULL, OPTION_EB},
14476   {"EL", no_argument, NULL, OPTION_EL},
14477   {"mfp32", no_argument, NULL, OPTION_FP32},
14478   {"mgp32", no_argument, NULL, OPTION_GP32},
14479   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
14480   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
14481   {"mfp64", no_argument, NULL, OPTION_FP64},
14482   {"mgp64", no_argument, NULL, OPTION_GP64},
14483   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
14484   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
14485   {"mshared", no_argument, NULL, OPTION_MSHARED},
14486   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
14487   {"msym32", no_argument, NULL, OPTION_MSYM32},
14488   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
14489   {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
14490   {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
14491   {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
14492   {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
14493
14494   /* Strictly speaking this next option is ELF specific,
14495      but we allow it for other ports as well in order to
14496      make testing easier.  */
14497   {"32",          no_argument, NULL, OPTION_32},
14498   
14499   /* ELF-specific options.  */
14500 #ifdef OBJ_ELF
14501   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
14502   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
14503   {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
14504   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
14505   {"xgot",        no_argument, NULL, OPTION_XGOT},
14506   {"mabi", required_argument, NULL, OPTION_MABI},
14507   {"n32",         no_argument, NULL, OPTION_N32},
14508   {"64",          no_argument, NULL, OPTION_64},
14509   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
14510   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
14511   {"mpdr", no_argument, NULL, OPTION_PDR},
14512   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
14513   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
14514 #endif /* OBJ_ELF */
14515
14516   {NULL, no_argument, NULL, 0}
14517 };
14518 size_t md_longopts_size = sizeof (md_longopts);
14519
14520 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
14521    NEW_VALUE.  Warn if another value was already specified.  Note:
14522    we have to defer parsing the -march and -mtune arguments in order
14523    to handle 'from-abi' correctly, since the ABI might be specified
14524    in a later argument.  */
14525
14526 static void
14527 mips_set_option_string (const char **string_ptr, const char *new_value)
14528 {
14529   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
14530     as_warn (_("A different %s was already specified, is now %s"),
14531              string_ptr == &mips_arch_string ? "-march" : "-mtune",
14532              new_value);
14533
14534   *string_ptr = new_value;
14535 }
14536
14537 int
14538 md_parse_option (int c, char *arg)
14539 {
14540   switch (c)
14541     {
14542     case OPTION_CONSTRUCT_FLOATS:
14543       mips_disable_float_construction = 0;
14544       break;
14545
14546     case OPTION_NO_CONSTRUCT_FLOATS:
14547       mips_disable_float_construction = 1;
14548       break;
14549
14550     case OPTION_TRAP:
14551       mips_trap = 1;
14552       break;
14553
14554     case OPTION_BREAK:
14555       mips_trap = 0;
14556       break;
14557
14558     case OPTION_EB:
14559       target_big_endian = 1;
14560       break;
14561
14562     case OPTION_EL:
14563       target_big_endian = 0;
14564       break;
14565
14566     case 'O':
14567       if (arg == NULL)
14568         mips_optimize = 1;
14569       else if (arg[0] == '0')
14570         mips_optimize = 0;
14571       else if (arg[0] == '1')
14572         mips_optimize = 1;
14573       else
14574         mips_optimize = 2;
14575       break;
14576
14577     case 'g':
14578       if (arg == NULL)
14579         mips_debug = 2;
14580       else
14581         mips_debug = atoi (arg);
14582       break;
14583
14584     case OPTION_MIPS1:
14585       file_mips_isa = ISA_MIPS1;
14586       break;
14587
14588     case OPTION_MIPS2:
14589       file_mips_isa = ISA_MIPS2;
14590       break;
14591
14592     case OPTION_MIPS3:
14593       file_mips_isa = ISA_MIPS3;
14594       break;
14595
14596     case OPTION_MIPS4:
14597       file_mips_isa = ISA_MIPS4;
14598       break;
14599
14600     case OPTION_MIPS5:
14601       file_mips_isa = ISA_MIPS5;
14602       break;
14603
14604     case OPTION_MIPS32:
14605       file_mips_isa = ISA_MIPS32;
14606       break;
14607
14608     case OPTION_MIPS32R2:
14609       file_mips_isa = ISA_MIPS32R2;
14610       break;
14611
14612     case OPTION_MIPS64R2:
14613       file_mips_isa = ISA_MIPS64R2;
14614       break;
14615
14616     case OPTION_MIPS64:
14617       file_mips_isa = ISA_MIPS64;
14618       break;
14619
14620     case OPTION_MTUNE:
14621       mips_set_option_string (&mips_tune_string, arg);
14622       break;
14623
14624     case OPTION_MARCH:
14625       mips_set_option_string (&mips_arch_string, arg);
14626       break;
14627
14628     case OPTION_M4650:
14629       mips_set_option_string (&mips_arch_string, "4650");
14630       mips_set_option_string (&mips_tune_string, "4650");
14631       break;
14632
14633     case OPTION_NO_M4650:
14634       break;
14635
14636     case OPTION_M4010:
14637       mips_set_option_string (&mips_arch_string, "4010");
14638       mips_set_option_string (&mips_tune_string, "4010");
14639       break;
14640
14641     case OPTION_NO_M4010:
14642       break;
14643
14644     case OPTION_M4100:
14645       mips_set_option_string (&mips_arch_string, "4100");
14646       mips_set_option_string (&mips_tune_string, "4100");
14647       break;
14648
14649     case OPTION_NO_M4100:
14650       break;
14651
14652     case OPTION_M3900:
14653       mips_set_option_string (&mips_arch_string, "3900");
14654       mips_set_option_string (&mips_tune_string, "3900");
14655       break;
14656
14657     case OPTION_NO_M3900:
14658       break;
14659
14660     case OPTION_MDMX:
14661       mips_opts.ase_mdmx = 1;
14662       break;
14663
14664     case OPTION_NO_MDMX:
14665       mips_opts.ase_mdmx = 0;
14666       break;
14667
14668     case OPTION_DSP:
14669       mips_opts.ase_dsp = 1;
14670       mips_opts.ase_dspr2 = 0;
14671       break;
14672
14673     case OPTION_NO_DSP:
14674       mips_opts.ase_dsp = 0;
14675       mips_opts.ase_dspr2 = 0;
14676       break;
14677
14678     case OPTION_DSPR2:
14679       mips_opts.ase_dspr2 = 1;
14680       mips_opts.ase_dsp = 1;
14681       break;
14682
14683     case OPTION_NO_DSPR2:
14684       mips_opts.ase_dspr2 = 0;
14685       mips_opts.ase_dsp = 0;
14686       break;
14687
14688     case OPTION_MT:
14689       mips_opts.ase_mt = 1;
14690       break;
14691
14692     case OPTION_NO_MT:
14693       mips_opts.ase_mt = 0;
14694       break;
14695
14696     case OPTION_MCU:
14697       mips_opts.ase_mcu = 1;
14698       break;
14699
14700     case OPTION_NO_MCU:
14701       mips_opts.ase_mcu = 0;
14702       break;
14703
14704     case OPTION_MICROMIPS:
14705       if (mips_opts.mips16 == 1)
14706         {
14707           as_bad (_("-mmicromips cannot be used with -mips16"));
14708           return 0;
14709         }
14710       mips_opts.micromips = 1;
14711       mips_no_prev_insn ();
14712       break;
14713
14714     case OPTION_NO_MICROMIPS:
14715       mips_opts.micromips = 0;
14716       mips_no_prev_insn ();
14717       break;
14718
14719     case OPTION_MIPS16:
14720       if (mips_opts.micromips == 1)
14721         {
14722           as_bad (_("-mips16 cannot be used with -micromips"));
14723           return 0;
14724         }
14725       mips_opts.mips16 = 1;
14726       mips_no_prev_insn ();
14727       break;
14728
14729     case OPTION_NO_MIPS16:
14730       mips_opts.mips16 = 0;
14731       mips_no_prev_insn ();
14732       break;
14733
14734     case OPTION_MIPS3D:
14735       mips_opts.ase_mips3d = 1;
14736       break;
14737
14738     case OPTION_NO_MIPS3D:
14739       mips_opts.ase_mips3d = 0;
14740       break;
14741
14742     case OPTION_SMARTMIPS:
14743       mips_opts.ase_smartmips = 1;
14744       break;
14745
14746     case OPTION_NO_SMARTMIPS:
14747       mips_opts.ase_smartmips = 0;
14748       break;
14749
14750     case OPTION_FIX_24K:
14751       mips_fix_24k = 1;
14752       break;
14753
14754     case OPTION_NO_FIX_24K:
14755       mips_fix_24k = 0;
14756       break;
14757
14758     case OPTION_FIX_LOONGSON2F_JUMP:
14759       mips_fix_loongson2f_jump = TRUE;
14760       break;
14761
14762     case OPTION_NO_FIX_LOONGSON2F_JUMP:
14763       mips_fix_loongson2f_jump = FALSE;
14764       break;
14765
14766     case OPTION_FIX_LOONGSON2F_NOP:
14767       mips_fix_loongson2f_nop = TRUE;
14768       break;
14769
14770     case OPTION_NO_FIX_LOONGSON2F_NOP:
14771       mips_fix_loongson2f_nop = FALSE;
14772       break;
14773
14774     case OPTION_FIX_VR4120:
14775       mips_fix_vr4120 = 1;
14776       break;
14777
14778     case OPTION_NO_FIX_VR4120:
14779       mips_fix_vr4120 = 0;
14780       break;
14781
14782     case OPTION_FIX_VR4130:
14783       mips_fix_vr4130 = 1;
14784       break;
14785
14786     case OPTION_NO_FIX_VR4130:
14787       mips_fix_vr4130 = 0;
14788       break;
14789
14790     case OPTION_FIX_CN63XXP1:
14791       mips_fix_cn63xxp1 = TRUE;
14792       break;
14793
14794     case OPTION_NO_FIX_CN63XXP1:
14795       mips_fix_cn63xxp1 = FALSE;
14796       break;
14797
14798     case OPTION_RELAX_BRANCH:
14799       mips_relax_branch = 1;
14800       break;
14801
14802     case OPTION_NO_RELAX_BRANCH:
14803       mips_relax_branch = 0;
14804       break;
14805
14806     case OPTION_MSHARED:
14807       mips_in_shared = TRUE;
14808       break;
14809
14810     case OPTION_MNO_SHARED:
14811       mips_in_shared = FALSE;
14812       break;
14813
14814     case OPTION_MSYM32:
14815       mips_opts.sym32 = TRUE;
14816       break;
14817
14818     case OPTION_MNO_SYM32:
14819       mips_opts.sym32 = FALSE;
14820       break;
14821
14822 #ifdef OBJ_ELF
14823       /* When generating ELF code, we permit -KPIC and -call_shared to
14824          select SVR4_PIC, and -non_shared to select no PIC.  This is
14825          intended to be compatible with Irix 5.  */
14826     case OPTION_CALL_SHARED:
14827       if (!IS_ELF)
14828         {
14829           as_bad (_("-call_shared is supported only for ELF format"));
14830           return 0;
14831         }
14832       mips_pic = SVR4_PIC;
14833       mips_abicalls = TRUE;
14834       break;
14835
14836     case OPTION_CALL_NONPIC:
14837       if (!IS_ELF)
14838         {
14839           as_bad (_("-call_nonpic is supported only for ELF format"));
14840           return 0;
14841         }
14842       mips_pic = NO_PIC;
14843       mips_abicalls = TRUE;
14844       break;
14845
14846     case OPTION_NON_SHARED:
14847       if (!IS_ELF)
14848         {
14849           as_bad (_("-non_shared is supported only for ELF format"));
14850           return 0;
14851         }
14852       mips_pic = NO_PIC;
14853       mips_abicalls = FALSE;
14854       break;
14855
14856       /* The -xgot option tells the assembler to use 32 bit offsets
14857          when accessing the got in SVR4_PIC mode.  It is for Irix
14858          compatibility.  */
14859     case OPTION_XGOT:
14860       mips_big_got = 1;
14861       break;
14862 #endif /* OBJ_ELF */
14863
14864     case 'G':
14865       g_switch_value = atoi (arg);
14866       g_switch_seen = 1;
14867       break;
14868
14869       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
14870          and -mabi=64.  */
14871     case OPTION_32:
14872       if (IS_ELF)
14873         mips_abi = O32_ABI;
14874       /* We silently ignore -32 for non-ELF targets.  This greatly
14875          simplifies the construction of the MIPS GAS test cases.  */
14876       break;
14877
14878 #ifdef OBJ_ELF
14879     case OPTION_N32:
14880       if (!IS_ELF)
14881         {
14882           as_bad (_("-n32 is supported for ELF format only"));
14883           return 0;
14884         }
14885       mips_abi = N32_ABI;
14886       break;
14887
14888     case OPTION_64:
14889       if (!IS_ELF)
14890         {
14891           as_bad (_("-64 is supported for ELF format only"));
14892           return 0;
14893         }
14894       mips_abi = N64_ABI;
14895       if (!support_64bit_objects())
14896         as_fatal (_("No compiled in support for 64 bit object file format"));
14897       break;
14898 #endif /* OBJ_ELF */
14899
14900     case OPTION_GP32:
14901       file_mips_gp32 = 1;
14902       break;
14903
14904     case OPTION_GP64:
14905       file_mips_gp32 = 0;
14906       break;
14907
14908     case OPTION_FP32:
14909       file_mips_fp32 = 1;
14910       break;
14911
14912     case OPTION_FP64:
14913       file_mips_fp32 = 0;
14914       break;
14915
14916     case OPTION_SINGLE_FLOAT:
14917       file_mips_single_float = 1;
14918       break;
14919
14920     case OPTION_DOUBLE_FLOAT:
14921       file_mips_single_float = 0;
14922       break;
14923
14924     case OPTION_SOFT_FLOAT:
14925       file_mips_soft_float = 1;
14926       break;
14927
14928     case OPTION_HARD_FLOAT:
14929       file_mips_soft_float = 0;
14930       break;
14931
14932 #ifdef OBJ_ELF
14933     case OPTION_MABI:
14934       if (!IS_ELF)
14935         {
14936           as_bad (_("-mabi is supported for ELF format only"));
14937           return 0;
14938         }
14939       if (strcmp (arg, "32") == 0)
14940         mips_abi = O32_ABI;
14941       else if (strcmp (arg, "o64") == 0)
14942         mips_abi = O64_ABI;
14943       else if (strcmp (arg, "n32") == 0)
14944         mips_abi = N32_ABI;
14945       else if (strcmp (arg, "64") == 0)
14946         {
14947           mips_abi = N64_ABI;
14948           if (! support_64bit_objects())
14949             as_fatal (_("No compiled in support for 64 bit object file "
14950                         "format"));
14951         }
14952       else if (strcmp (arg, "eabi") == 0)
14953         mips_abi = EABI_ABI;
14954       else
14955         {
14956           as_fatal (_("invalid abi -mabi=%s"), arg);
14957           return 0;
14958         }
14959       break;
14960 #endif /* OBJ_ELF */
14961
14962     case OPTION_M7000_HILO_FIX:
14963       mips_7000_hilo_fix = TRUE;
14964       break;
14965
14966     case OPTION_MNO_7000_HILO_FIX:
14967       mips_7000_hilo_fix = FALSE;
14968       break;
14969
14970 #ifdef OBJ_ELF
14971     case OPTION_MDEBUG:
14972       mips_flag_mdebug = TRUE;
14973       break;
14974
14975     case OPTION_NO_MDEBUG:
14976       mips_flag_mdebug = FALSE;
14977       break;
14978
14979     case OPTION_PDR:
14980       mips_flag_pdr = TRUE;
14981       break;
14982
14983     case OPTION_NO_PDR:
14984       mips_flag_pdr = FALSE;
14985       break;
14986
14987     case OPTION_MVXWORKS_PIC:
14988       mips_pic = VXWORKS_PIC;
14989       break;
14990 #endif /* OBJ_ELF */
14991
14992     default:
14993       return 0;
14994     }
14995
14996     mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
14997
14998   return 1;
14999 }
15000 \f
15001 /* Set up globals to generate code for the ISA or processor
15002    described by INFO.  */
15003
15004 static void
15005 mips_set_architecture (const struct mips_cpu_info *info)
15006 {
15007   if (info != 0)
15008     {
15009       file_mips_arch = info->cpu;
15010       mips_opts.arch = info->cpu;
15011       mips_opts.isa = info->isa;
15012     }
15013 }
15014
15015
15016 /* Likewise for tuning.  */
15017
15018 static void
15019 mips_set_tune (const struct mips_cpu_info *info)
15020 {
15021   if (info != 0)
15022     mips_tune = info->cpu;
15023 }
15024
15025
15026 void
15027 mips_after_parse_args (void)
15028 {
15029   const struct mips_cpu_info *arch_info = 0;
15030   const struct mips_cpu_info *tune_info = 0;
15031
15032   /* GP relative stuff not working for PE */
15033   if (strncmp (TARGET_OS, "pe", 2) == 0)
15034     {
15035       if (g_switch_seen && g_switch_value != 0)
15036         as_bad (_("-G not supported in this configuration."));
15037       g_switch_value = 0;
15038     }
15039
15040   if (mips_abi == NO_ABI)
15041     mips_abi = MIPS_DEFAULT_ABI;
15042
15043   /* The following code determines the architecture and register size.
15044      Similar code was added to GCC 3.3 (see override_options() in
15045      config/mips/mips.c).  The GAS and GCC code should be kept in sync
15046      as much as possible.  */
15047
15048   if (mips_arch_string != 0)
15049     arch_info = mips_parse_cpu ("-march", mips_arch_string);
15050
15051   if (file_mips_isa != ISA_UNKNOWN)
15052     {
15053       /* Handle -mipsN.  At this point, file_mips_isa contains the
15054          ISA level specified by -mipsN, while arch_info->isa contains
15055          the -march selection (if any).  */
15056       if (arch_info != 0)
15057         {
15058           /* -march takes precedence over -mipsN, since it is more descriptive.
15059              There's no harm in specifying both as long as the ISA levels
15060              are the same.  */
15061           if (file_mips_isa != arch_info->isa)
15062             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
15063                     mips_cpu_info_from_isa (file_mips_isa)->name,
15064                     mips_cpu_info_from_isa (arch_info->isa)->name);
15065         }
15066       else
15067         arch_info = mips_cpu_info_from_isa (file_mips_isa);
15068     }
15069
15070   if (arch_info == 0)
15071     {
15072       arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
15073       gas_assert (arch_info);
15074     }
15075
15076   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
15077     as_bad (_("-march=%s is not compatible with the selected ABI"),
15078             arch_info->name);
15079
15080   mips_set_architecture (arch_info);
15081
15082   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
15083   if (mips_tune_string != 0)
15084     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
15085
15086   if (tune_info == 0)
15087     mips_set_tune (arch_info);
15088   else
15089     mips_set_tune (tune_info);
15090
15091   if (file_mips_gp32 >= 0)
15092     {
15093       /* The user specified the size of the integer registers.  Make sure
15094          it agrees with the ABI and ISA.  */
15095       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
15096         as_bad (_("-mgp64 used with a 32-bit processor"));
15097       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
15098         as_bad (_("-mgp32 used with a 64-bit ABI"));
15099       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
15100         as_bad (_("-mgp64 used with a 32-bit ABI"));
15101     }
15102   else
15103     {
15104       /* Infer the integer register size from the ABI and processor.
15105          Restrict ourselves to 32-bit registers if that's all the
15106          processor has, or if the ABI cannot handle 64-bit registers.  */
15107       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
15108                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
15109     }
15110
15111   switch (file_mips_fp32)
15112     {
15113     default:
15114     case -1:
15115       /* No user specified float register size.
15116          ??? GAS treats single-float processors as though they had 64-bit
15117          float registers (although it complains when double-precision
15118          instructions are used).  As things stand, saying they have 32-bit
15119          registers would lead to spurious "register must be even" messages.
15120          So here we assume float registers are never smaller than the
15121          integer ones.  */
15122       if (file_mips_gp32 == 0)
15123         /* 64-bit integer registers implies 64-bit float registers.  */
15124         file_mips_fp32 = 0;
15125       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
15126                && ISA_HAS_64BIT_FPRS (mips_opts.isa))
15127         /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
15128         file_mips_fp32 = 0;
15129       else
15130         /* 32-bit float registers.  */
15131         file_mips_fp32 = 1;
15132       break;
15133
15134     /* The user specified the size of the float registers.  Check if it
15135        agrees with the ABI and ISA.  */
15136     case 0:
15137       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
15138         as_bad (_("-mfp64 used with a 32-bit fpu"));
15139       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
15140                && !ISA_HAS_MXHC1 (mips_opts.isa))
15141         as_warn (_("-mfp64 used with a 32-bit ABI"));
15142       break;
15143     case 1:
15144       if (ABI_NEEDS_64BIT_REGS (mips_abi))
15145         as_warn (_("-mfp32 used with a 64-bit ABI"));
15146       break;
15147     }
15148
15149   /* End of GCC-shared inference code.  */
15150
15151   /* This flag is set when we have a 64-bit capable CPU but use only
15152      32-bit wide registers.  Note that EABI does not use it.  */
15153   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
15154       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
15155           || mips_abi == O32_ABI))
15156     mips_32bitmode = 1;
15157
15158   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
15159     as_bad (_("trap exception not supported at ISA 1"));
15160
15161   /* If the selected architecture includes support for ASEs, enable
15162      generation of code for them.  */
15163   if (mips_opts.mips16 == -1)
15164     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
15165   if (mips_opts.micromips == -1)
15166     mips_opts.micromips = (CPU_HAS_MICROMIPS (file_mips_arch)) ? 1 : 0;
15167   if (mips_opts.ase_mips3d == -1)
15168     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
15169                             && file_mips_fp32 == 0) ? 1 : 0;
15170   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
15171     as_bad (_("-mfp32 used with -mips3d"));
15172
15173   if (mips_opts.ase_mdmx == -1)
15174     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
15175                           && file_mips_fp32 == 0) ? 1 : 0;
15176   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
15177     as_bad (_("-mfp32 used with -mdmx"));
15178
15179   if (mips_opts.ase_smartmips == -1)
15180     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
15181   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
15182     as_warn (_("%s ISA does not support SmartMIPS"), 
15183              mips_cpu_info_from_isa (mips_opts.isa)->name);
15184
15185   if (mips_opts.ase_dsp == -1)
15186     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
15187   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
15188     as_warn (_("%s ISA does not support DSP ASE"), 
15189              mips_cpu_info_from_isa (mips_opts.isa)->name);
15190
15191   if (mips_opts.ase_dspr2 == -1)
15192     {
15193       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
15194       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
15195     }
15196   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
15197     as_warn (_("%s ISA does not support DSP R2 ASE"),
15198              mips_cpu_info_from_isa (mips_opts.isa)->name);
15199
15200   if (mips_opts.ase_mt == -1)
15201     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
15202   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
15203     as_warn (_("%s ISA does not support MT ASE"),
15204              mips_cpu_info_from_isa (mips_opts.isa)->name);
15205
15206   if (mips_opts.ase_mcu == -1)
15207     mips_opts.ase_mcu = (arch_info->flags & MIPS_CPU_ASE_MCU) ? 1 : 0;
15208   if (mips_opts.ase_mcu && !ISA_SUPPORTS_MCU_ASE)
15209       as_warn (_("%s ISA does not support MCU ASE"),
15210                mips_cpu_info_from_isa (mips_opts.isa)->name);
15211
15212   file_mips_isa = mips_opts.isa;
15213   file_ase_mips3d = mips_opts.ase_mips3d;
15214   file_ase_mdmx = mips_opts.ase_mdmx;
15215   file_ase_smartmips = mips_opts.ase_smartmips;
15216   file_ase_dsp = mips_opts.ase_dsp;
15217   file_ase_dspr2 = mips_opts.ase_dspr2;
15218   file_ase_mt = mips_opts.ase_mt;
15219   mips_opts.gp32 = file_mips_gp32;
15220   mips_opts.fp32 = file_mips_fp32;
15221   mips_opts.soft_float = file_mips_soft_float;
15222   mips_opts.single_float = file_mips_single_float;
15223
15224   if (mips_flag_mdebug < 0)
15225     {
15226 #ifdef OBJ_MAYBE_ECOFF
15227       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
15228         mips_flag_mdebug = 1;
15229       else
15230 #endif /* OBJ_MAYBE_ECOFF */
15231         mips_flag_mdebug = 0;
15232     }
15233 }
15234 \f
15235 void
15236 mips_init_after_args (void)
15237 {
15238   /* initialize opcodes */
15239   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
15240   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
15241 }
15242
15243 long
15244 md_pcrel_from (fixS *fixP)
15245 {
15246   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
15247   switch (fixP->fx_r_type)
15248     {
15249     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15250     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15251       /* Return the address of the delay slot.  */
15252       return addr + 2;
15253
15254     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15255     case BFD_RELOC_MICROMIPS_JMP:
15256     case BFD_RELOC_16_PCREL_S2:
15257     case BFD_RELOC_MIPS_JMP:
15258       /* Return the address of the delay slot.  */
15259       return addr + 4;
15260
15261     default:
15262       /* We have no relocation type for PC relative MIPS16 instructions.  */
15263       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
15264         as_bad_where (fixP->fx_file, fixP->fx_line,
15265                       _("PC relative MIPS16 instruction references a different section"));
15266       return addr;
15267     }
15268 }
15269
15270 /* This is called before the symbol table is processed.  In order to
15271    work with gcc when using mips-tfile, we must keep all local labels.
15272    However, in other cases, we want to discard them.  If we were
15273    called with -g, but we didn't see any debugging information, it may
15274    mean that gcc is smuggling debugging information through to
15275    mips-tfile, in which case we must generate all local labels.  */
15276
15277 void
15278 mips_frob_file_before_adjust (void)
15279 {
15280 #ifndef NO_ECOFF_DEBUGGING
15281   if (ECOFF_DEBUGGING
15282       && mips_debug != 0
15283       && ! ecoff_debugging_seen)
15284     flag_keep_locals = 1;
15285 #endif
15286 }
15287
15288 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
15289    the corresponding LO16 reloc.  This is called before md_apply_fix and
15290    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
15291    relocation operators.
15292
15293    For our purposes, a %lo() expression matches a %got() or %hi()
15294    expression if:
15295
15296       (a) it refers to the same symbol; and
15297       (b) the offset applied in the %lo() expression is no lower than
15298           the offset applied in the %got() or %hi().
15299
15300    (b) allows us to cope with code like:
15301
15302         lui     $4,%hi(foo)
15303         lh      $4,%lo(foo+2)($4)
15304
15305    ...which is legal on RELA targets, and has a well-defined behaviour
15306    if the user knows that adding 2 to "foo" will not induce a carry to
15307    the high 16 bits.
15308
15309    When several %lo()s match a particular %got() or %hi(), we use the
15310    following rules to distinguish them:
15311
15312      (1) %lo()s with smaller offsets are a better match than %lo()s with
15313          higher offsets.
15314
15315      (2) %lo()s with no matching %got() or %hi() are better than those
15316          that already have a matching %got() or %hi().
15317
15318      (3) later %lo()s are better than earlier %lo()s.
15319
15320    These rules are applied in order.
15321
15322    (1) means, among other things, that %lo()s with identical offsets are
15323    chosen if they exist.
15324
15325    (2) means that we won't associate several high-part relocations with
15326    the same low-part relocation unless there's no alternative.  Having
15327    several high parts for the same low part is a GNU extension; this rule
15328    allows careful users to avoid it.
15329
15330    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
15331    with the last high-part relocation being at the front of the list.
15332    It therefore makes sense to choose the last matching low-part
15333    relocation, all other things being equal.  It's also easier
15334    to code that way.  */
15335
15336 void
15337 mips_frob_file (void)
15338 {
15339   struct mips_hi_fixup *l;
15340   bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
15341
15342   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
15343     {
15344       segment_info_type *seginfo;
15345       bfd_boolean matched_lo_p;
15346       fixS **hi_pos, **lo_pos, **pos;
15347
15348       gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
15349
15350       /* If a GOT16 relocation turns out to be against a global symbol,
15351          there isn't supposed to be a matching LO.  */
15352       if (got16_reloc_p (l->fixp->fx_r_type)
15353           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
15354         continue;
15355
15356       /* Check quickly whether the next fixup happens to be a matching %lo.  */
15357       if (fixup_has_matching_lo_p (l->fixp))
15358         continue;
15359
15360       seginfo = seg_info (l->seg);
15361
15362       /* Set HI_POS to the position of this relocation in the chain.
15363          Set LO_POS to the position of the chosen low-part relocation.
15364          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
15365          relocation that matches an immediately-preceding high-part
15366          relocation.  */
15367       hi_pos = NULL;
15368       lo_pos = NULL;
15369       matched_lo_p = FALSE;
15370       looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
15371
15372       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
15373         {
15374           if (*pos == l->fixp)
15375             hi_pos = pos;
15376
15377           if ((*pos)->fx_r_type == looking_for_rtype
15378               && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
15379               && (*pos)->fx_offset >= l->fixp->fx_offset
15380               && (lo_pos == NULL
15381                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
15382                   || (!matched_lo_p
15383                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
15384             lo_pos = pos;
15385
15386           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
15387                           && fixup_has_matching_lo_p (*pos));
15388         }
15389
15390       /* If we found a match, remove the high-part relocation from its
15391          current position and insert it before the low-part relocation.
15392          Make the offsets match so that fixup_has_matching_lo_p()
15393          will return true.
15394
15395          We don't warn about unmatched high-part relocations since some
15396          versions of gcc have been known to emit dead "lui ...%hi(...)"
15397          instructions.  */
15398       if (lo_pos != NULL)
15399         {
15400           l->fixp->fx_offset = (*lo_pos)->fx_offset;
15401           if (l->fixp->fx_next != *lo_pos)
15402             {
15403               *hi_pos = l->fixp->fx_next;
15404               l->fixp->fx_next = *lo_pos;
15405               *lo_pos = l->fixp;
15406             }
15407         }
15408     }
15409 }
15410
15411 /* We may have combined relocations without symbols in the N32/N64 ABI.
15412    We have to prevent gas from dropping them.  */
15413
15414 int
15415 mips_force_relocation (fixS *fixp)
15416 {
15417   if (generic_force_reloc (fixp))
15418     return 1;
15419
15420   /* We want to keep BFD_RELOC_MICROMIPS_*_PCREL_S1 relocation,
15421      so that the linker relaxation can update targets.  */
15422   if (fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15423       || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15424       || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1)
15425     return 1;
15426
15427   if (HAVE_NEWABI
15428       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
15429       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
15430           || hi16_reloc_p (fixp->fx_r_type)
15431           || lo16_reloc_p (fixp->fx_r_type)))
15432     return 1;
15433
15434   return 0;
15435 }
15436
15437 /* Apply a fixup to the object file.  */
15438
15439 void
15440 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
15441 {
15442   bfd_byte *buf;
15443   long insn;
15444   reloc_howto_type *howto;
15445
15446   /* We ignore generic BFD relocations we don't know about.  */
15447   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
15448   if (! howto)
15449     return;
15450
15451   gas_assert (fixP->fx_size == 2
15452               || fixP->fx_size == 4
15453               || fixP->fx_r_type == BFD_RELOC_16
15454               || fixP->fx_r_type == BFD_RELOC_64
15455               || fixP->fx_r_type == BFD_RELOC_CTOR
15456               || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
15457               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_SUB
15458               || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
15459               || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
15460               || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
15461
15462   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
15463
15464   gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
15465               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15466               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15467               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1);
15468
15469   /* Don't treat parts of a composite relocation as done.  There are two
15470      reasons for this:
15471
15472      (1) The second and third parts will be against 0 (RSS_UNDEF) but
15473          should nevertheless be emitted if the first part is.
15474
15475      (2) In normal usage, composite relocations are never assembly-time
15476          constants.  The easiest way of dealing with the pathological
15477          exceptions is to generate a relocation against STN_UNDEF and
15478          leave everything up to the linker.  */
15479   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
15480     fixP->fx_done = 1;
15481
15482   switch (fixP->fx_r_type)
15483     {
15484     case BFD_RELOC_MIPS_TLS_GD:
15485     case BFD_RELOC_MIPS_TLS_LDM:
15486     case BFD_RELOC_MIPS_TLS_DTPREL32:
15487     case BFD_RELOC_MIPS_TLS_DTPREL64:
15488     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
15489     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
15490     case BFD_RELOC_MIPS_TLS_GOTTPREL:
15491     case BFD_RELOC_MIPS_TLS_TPREL32:
15492     case BFD_RELOC_MIPS_TLS_TPREL64:
15493     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
15494     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
15495     case BFD_RELOC_MICROMIPS_TLS_GD:
15496     case BFD_RELOC_MICROMIPS_TLS_LDM:
15497     case BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16:
15498     case BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16:
15499     case BFD_RELOC_MICROMIPS_TLS_GOTTPREL:
15500     case BFD_RELOC_MICROMIPS_TLS_TPREL_HI16:
15501     case BFD_RELOC_MICROMIPS_TLS_TPREL_LO16:
15502     case BFD_RELOC_MIPS16_TLS_GD:
15503     case BFD_RELOC_MIPS16_TLS_LDM:
15504     case BFD_RELOC_MIPS16_TLS_DTPREL_HI16:
15505     case BFD_RELOC_MIPS16_TLS_DTPREL_LO16:
15506     case BFD_RELOC_MIPS16_TLS_GOTTPREL:
15507     case BFD_RELOC_MIPS16_TLS_TPREL_HI16:
15508     case BFD_RELOC_MIPS16_TLS_TPREL_LO16:
15509       S_SET_THREAD_LOCAL (fixP->fx_addsy);
15510       /* fall through */
15511
15512     case BFD_RELOC_MIPS_JMP:
15513     case BFD_RELOC_MIPS_SHIFT5:
15514     case BFD_RELOC_MIPS_SHIFT6:
15515     case BFD_RELOC_MIPS_GOT_DISP:
15516     case BFD_RELOC_MIPS_GOT_PAGE:
15517     case BFD_RELOC_MIPS_GOT_OFST:
15518     case BFD_RELOC_MIPS_SUB:
15519     case BFD_RELOC_MIPS_INSERT_A:
15520     case BFD_RELOC_MIPS_INSERT_B:
15521     case BFD_RELOC_MIPS_DELETE:
15522     case BFD_RELOC_MIPS_HIGHEST:
15523     case BFD_RELOC_MIPS_HIGHER:
15524     case BFD_RELOC_MIPS_SCN_DISP:
15525     case BFD_RELOC_MIPS_REL16:
15526     case BFD_RELOC_MIPS_RELGOT:
15527     case BFD_RELOC_MIPS_JALR:
15528     case BFD_RELOC_HI16:
15529     case BFD_RELOC_HI16_S:
15530     case BFD_RELOC_GPREL16:
15531     case BFD_RELOC_MIPS_LITERAL:
15532     case BFD_RELOC_MIPS_CALL16:
15533     case BFD_RELOC_MIPS_GOT16:
15534     case BFD_RELOC_GPREL32:
15535     case BFD_RELOC_MIPS_GOT_HI16:
15536     case BFD_RELOC_MIPS_GOT_LO16:
15537     case BFD_RELOC_MIPS_CALL_HI16:
15538     case BFD_RELOC_MIPS_CALL_LO16:
15539     case BFD_RELOC_MIPS16_GPREL:
15540     case BFD_RELOC_MIPS16_GOT16:
15541     case BFD_RELOC_MIPS16_CALL16:
15542     case BFD_RELOC_MIPS16_HI16:
15543     case BFD_RELOC_MIPS16_HI16_S:
15544     case BFD_RELOC_MIPS16_JMP:
15545     case BFD_RELOC_MICROMIPS_JMP:
15546     case BFD_RELOC_MICROMIPS_GOT_DISP:
15547     case BFD_RELOC_MICROMIPS_GOT_PAGE:
15548     case BFD_RELOC_MICROMIPS_GOT_OFST:
15549     case BFD_RELOC_MICROMIPS_SUB:
15550     case BFD_RELOC_MICROMIPS_HIGHEST:
15551     case BFD_RELOC_MICROMIPS_HIGHER:
15552     case BFD_RELOC_MICROMIPS_SCN_DISP:
15553     case BFD_RELOC_MICROMIPS_JALR:
15554     case BFD_RELOC_MICROMIPS_HI16:
15555     case BFD_RELOC_MICROMIPS_HI16_S:
15556     case BFD_RELOC_MICROMIPS_GPREL16:
15557     case BFD_RELOC_MICROMIPS_LITERAL:
15558     case BFD_RELOC_MICROMIPS_CALL16:
15559     case BFD_RELOC_MICROMIPS_GOT16:
15560     case BFD_RELOC_MICROMIPS_GOT_HI16:
15561     case BFD_RELOC_MICROMIPS_GOT_LO16:
15562     case BFD_RELOC_MICROMIPS_CALL_HI16:
15563     case BFD_RELOC_MICROMIPS_CALL_LO16:
15564       /* Nothing needed to do.  The value comes from the reloc entry.  */
15565       break;
15566
15567     case BFD_RELOC_64:
15568       /* This is handled like BFD_RELOC_32, but we output a sign
15569          extended value if we are only 32 bits.  */
15570       if (fixP->fx_done)
15571         {
15572           if (8 <= sizeof (valueT))
15573             md_number_to_chars ((char *) buf, *valP, 8);
15574           else
15575             {
15576               valueT hiv;
15577
15578               if ((*valP & 0x80000000) != 0)
15579                 hiv = 0xffffffff;
15580               else
15581                 hiv = 0;
15582               md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
15583                                   *valP, 4);
15584               md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
15585                                   hiv, 4);
15586             }
15587         }
15588       break;
15589
15590     case BFD_RELOC_RVA:
15591     case BFD_RELOC_32:
15592     case BFD_RELOC_16:
15593       /* If we are deleting this reloc entry, we must fill in the
15594          value now.  This can happen if we have a .word which is not
15595          resolved when it appears but is later defined.  */
15596       if (fixP->fx_done)
15597         md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
15598       break;
15599
15600     case BFD_RELOC_LO16:
15601     case BFD_RELOC_MIPS16_LO16:
15602     case BFD_RELOC_MICROMIPS_LO16:
15603       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
15604          may be safe to remove, but if so it's not obvious.  */
15605       /* When handling an embedded PIC switch statement, we can wind
15606          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
15607       if (fixP->fx_done)
15608         {
15609           if (*valP + 0x8000 > 0xffff)
15610             as_bad_where (fixP->fx_file, fixP->fx_line,
15611                           _("relocation overflow"));
15612           /* 32-bit microMIPS instructions are divided into two halfwords.
15613              Relocations always refer to the second halfword, regardless
15614              of endianness.  */
15615           if (target_big_endian || fixP->fx_r_type == BFD_RELOC_MICROMIPS_LO16)
15616             buf += 2;
15617           md_number_to_chars ((char *) buf, *valP, 2);
15618         }
15619       break;
15620
15621     case BFD_RELOC_16_PCREL_S2:
15622       if ((*valP & 0x3) != 0)
15623         as_bad_where (fixP->fx_file, fixP->fx_line,
15624                       _("Branch to misaligned address (%lx)"), (long) *valP);
15625
15626       /* We need to save the bits in the instruction since fixup_segment()
15627          might be deleting the relocation entry (i.e., a branch within
15628          the current segment).  */
15629       if (! fixP->fx_done)
15630         break;
15631
15632       /* Update old instruction data.  */
15633       if (target_big_endian)
15634         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
15635       else
15636         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
15637
15638       if (*valP + 0x20000 <= 0x3ffff)
15639         {
15640           insn |= (*valP >> 2) & 0xffff;
15641           md_number_to_chars ((char *) buf, insn, 4);
15642         }
15643       else if (mips_pic == NO_PIC
15644                && fixP->fx_done
15645                && fixP->fx_frag->fr_address >= text_section->vma
15646                && (fixP->fx_frag->fr_address
15647                    < text_section->vma + bfd_get_section_size (text_section))
15648                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
15649                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
15650                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
15651         {
15652           /* The branch offset is too large.  If this is an
15653              unconditional branch, and we are not generating PIC code,
15654              we can convert it to an absolute jump instruction.  */
15655           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
15656             insn = 0x0c000000;  /* jal */
15657           else
15658             insn = 0x08000000;  /* j */
15659           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
15660           fixP->fx_done = 0;
15661           fixP->fx_addsy = section_symbol (text_section);
15662           *valP += md_pcrel_from (fixP);
15663           md_number_to_chars ((char *) buf, insn, 4);
15664         }
15665       else
15666         {
15667           /* If we got here, we have branch-relaxation disabled,
15668              and there's nothing we can do to fix this instruction
15669              without turning it into a longer sequence.  */
15670           as_bad_where (fixP->fx_file, fixP->fx_line,
15671                         _("Branch out of range"));
15672         }
15673       break;
15674
15675     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15676     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15677     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15678       /* We adjust the offset back to even.  */
15679       if ((*valP & 0x1) != 0)
15680         --(*valP);
15681
15682       if (! fixP->fx_done)
15683         break;
15684
15685       /* Should never visit here, because we keep the relocation.  */
15686       abort ();
15687       break;
15688
15689     case BFD_RELOC_VTABLE_INHERIT:
15690       fixP->fx_done = 0;
15691       if (fixP->fx_addsy
15692           && !S_IS_DEFINED (fixP->fx_addsy)
15693           && !S_IS_WEAK (fixP->fx_addsy))
15694         S_SET_WEAK (fixP->fx_addsy);
15695       break;
15696
15697     case BFD_RELOC_VTABLE_ENTRY:
15698       fixP->fx_done = 0;
15699       break;
15700
15701     default:
15702       internalError ();
15703     }
15704
15705   /* Remember value for tc_gen_reloc.  */
15706   fixP->fx_addnumber = *valP;
15707 }
15708
15709 static symbolS *
15710 get_symbol (void)
15711 {
15712   int c;
15713   char *name;
15714   symbolS *p;
15715
15716   name = input_line_pointer;
15717   c = get_symbol_end ();
15718   p = (symbolS *) symbol_find_or_make (name);
15719   *input_line_pointer = c;
15720   return p;
15721 }
15722
15723 /* Align the current frag to a given power of two.  If a particular
15724    fill byte should be used, FILL points to an integer that contains
15725    that byte, otherwise FILL is null.
15726
15727    This function used to have the comment:
15728
15729       The MIPS assembler also automatically adjusts any preceding label.
15730
15731    The implementation therefore applied the adjustment to a maximum of
15732    one label.  However, other label adjustments are applied to batches
15733    of labels, and adjusting just one caused problems when new labels
15734    were added for the sake of debugging or unwind information.
15735    We therefore adjust all preceding labels (given as LABELS) instead.  */
15736
15737 static void
15738 mips_align (int to, int *fill, struct insn_label_list *labels)
15739 {
15740   mips_emit_delays ();
15741   mips_record_compressed_mode ();
15742   if (fill == NULL && subseg_text_p (now_seg))
15743     frag_align_code (to, 0);
15744   else
15745     frag_align (to, fill ? *fill : 0, 0);
15746   record_alignment (now_seg, to);
15747   mips_move_labels (labels, FALSE);
15748 }
15749
15750 /* Align to a given power of two.  .align 0 turns off the automatic
15751    alignment used by the data creating pseudo-ops.  */
15752
15753 static void
15754 s_align (int x ATTRIBUTE_UNUSED)
15755 {
15756   int temp, fill_value, *fill_ptr;
15757   long max_alignment = 28;
15758
15759   /* o Note that the assembler pulls down any immediately preceding label
15760        to the aligned address.
15761      o It's not documented but auto alignment is reinstated by
15762        a .align pseudo instruction.
15763      o Note also that after auto alignment is turned off the mips assembler
15764        issues an error on attempt to assemble an improperly aligned data item.
15765        We don't.  */
15766
15767   temp = get_absolute_expression ();
15768   if (temp > max_alignment)
15769     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
15770   else if (temp < 0)
15771     {
15772       as_warn (_("Alignment negative: 0 assumed."));
15773       temp = 0;
15774     }
15775   if (*input_line_pointer == ',')
15776     {
15777       ++input_line_pointer;
15778       fill_value = get_absolute_expression ();
15779       fill_ptr = &fill_value;
15780     }
15781   else
15782     fill_ptr = 0;
15783   if (temp)
15784     {
15785       segment_info_type *si = seg_info (now_seg);
15786       struct insn_label_list *l = si->label_list;
15787       /* Auto alignment should be switched on by next section change.  */
15788       auto_align = 1;
15789       mips_align (temp, fill_ptr, l);
15790     }
15791   else
15792     {
15793       auto_align = 0;
15794     }
15795
15796   demand_empty_rest_of_line ();
15797 }
15798
15799 static void
15800 s_change_sec (int sec)
15801 {
15802   segT seg;
15803
15804 #ifdef OBJ_ELF
15805   /* The ELF backend needs to know that we are changing sections, so
15806      that .previous works correctly.  We could do something like check
15807      for an obj_section_change_hook macro, but that might be confusing
15808      as it would not be appropriate to use it in the section changing
15809      functions in read.c, since obj-elf.c intercepts those.  FIXME:
15810      This should be cleaner, somehow.  */
15811   if (IS_ELF)
15812     obj_elf_section_change_hook ();
15813 #endif
15814
15815   mips_emit_delays ();
15816
15817   switch (sec)
15818     {
15819     case 't':
15820       s_text (0);
15821       break;
15822     case 'd':
15823       s_data (0);
15824       break;
15825     case 'b':
15826       subseg_set (bss_section, (subsegT) get_absolute_expression ());
15827       demand_empty_rest_of_line ();
15828       break;
15829
15830     case 'r':
15831       seg = subseg_new (RDATA_SECTION_NAME,
15832                         (subsegT) get_absolute_expression ());
15833       if (IS_ELF)
15834         {
15835           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
15836                                                   | SEC_READONLY | SEC_RELOC
15837                                                   | SEC_DATA));
15838           if (strncmp (TARGET_OS, "elf", 3) != 0)
15839             record_alignment (seg, 4);
15840         }
15841       demand_empty_rest_of_line ();
15842       break;
15843
15844     case 's':
15845       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
15846       if (IS_ELF)
15847         {
15848           bfd_set_section_flags (stdoutput, seg,
15849                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
15850           if (strncmp (TARGET_OS, "elf", 3) != 0)
15851             record_alignment (seg, 4);
15852         }
15853       demand_empty_rest_of_line ();
15854       break;
15855
15856     case 'B':
15857       seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
15858       if (IS_ELF)
15859         {
15860           bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
15861           if (strncmp (TARGET_OS, "elf", 3) != 0)
15862             record_alignment (seg, 4);
15863         }
15864       demand_empty_rest_of_line ();
15865       break;
15866     }
15867
15868   auto_align = 1;
15869 }
15870
15871 void
15872 s_change_section (int ignore ATTRIBUTE_UNUSED)
15873 {
15874 #ifdef OBJ_ELF
15875   char *section_name;
15876   char c;
15877   char next_c = 0;
15878   int section_type;
15879   int section_flag;
15880   int section_entry_size;
15881   int section_alignment;
15882
15883   if (!IS_ELF)
15884     return;
15885
15886   section_name = input_line_pointer;
15887   c = get_symbol_end ();
15888   if (c)
15889     next_c = *(input_line_pointer + 1);
15890
15891   /* Do we have .section Name<,"flags">?  */
15892   if (c != ',' || (c == ',' && next_c == '"'))
15893     {
15894       /* just after name is now '\0'.  */
15895       *input_line_pointer = c;
15896       input_line_pointer = section_name;
15897       obj_elf_section (ignore);
15898       return;
15899     }
15900   input_line_pointer++;
15901
15902   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
15903   if (c == ',')
15904     section_type = get_absolute_expression ();
15905   else
15906     section_type = 0;
15907   if (*input_line_pointer++ == ',')
15908     section_flag = get_absolute_expression ();
15909   else
15910     section_flag = 0;
15911   if (*input_line_pointer++ == ',')
15912     section_entry_size = get_absolute_expression ();
15913   else
15914     section_entry_size = 0;
15915   if (*input_line_pointer++ == ',')
15916     section_alignment = get_absolute_expression ();
15917   else
15918     section_alignment = 0;
15919   /* FIXME: really ignore?  */
15920   (void) section_alignment;
15921
15922   section_name = xstrdup (section_name);
15923
15924   /* When using the generic form of .section (as implemented by obj-elf.c),
15925      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
15926      traditionally had to fall back on the more common @progbits instead.
15927
15928      There's nothing really harmful in this, since bfd will correct
15929      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
15930      means that, for backwards compatibility, the special_section entries
15931      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
15932
15933      Even so, we shouldn't force users of the MIPS .section syntax to
15934      incorrectly label the sections as SHT_PROGBITS.  The best compromise
15935      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
15936      generic type-checking code.  */
15937   if (section_type == SHT_MIPS_DWARF)
15938     section_type = SHT_PROGBITS;
15939
15940   obj_elf_change_section (section_name, section_type, section_flag,
15941                           section_entry_size, 0, 0, 0);
15942
15943   if (now_seg->name != section_name)
15944     free (section_name);
15945 #endif /* OBJ_ELF */
15946 }
15947
15948 void
15949 mips_enable_auto_align (void)
15950 {
15951   auto_align = 1;
15952 }
15953
15954 static void
15955 s_cons (int log_size)
15956 {
15957   segment_info_type *si = seg_info (now_seg);
15958   struct insn_label_list *l = si->label_list;
15959
15960   mips_emit_delays ();
15961   if (log_size > 0 && auto_align)
15962     mips_align (log_size, 0, l);
15963   cons (1 << log_size);
15964   mips_clear_insn_labels ();
15965 }
15966
15967 static void
15968 s_float_cons (int type)
15969 {
15970   segment_info_type *si = seg_info (now_seg);
15971   struct insn_label_list *l = si->label_list;
15972
15973   mips_emit_delays ();
15974
15975   if (auto_align)
15976     {
15977       if (type == 'd')
15978         mips_align (3, 0, l);
15979       else
15980         mips_align (2, 0, l);
15981     }
15982
15983   float_cons (type);
15984   mips_clear_insn_labels ();
15985 }
15986
15987 /* Handle .globl.  We need to override it because on Irix 5 you are
15988    permitted to say
15989        .globl foo .text
15990    where foo is an undefined symbol, to mean that foo should be
15991    considered to be the address of a function.  */
15992
15993 static void
15994 s_mips_globl (int x ATTRIBUTE_UNUSED)
15995 {
15996   char *name;
15997   int c;
15998   symbolS *symbolP;
15999   flagword flag;
16000
16001   do
16002     {
16003       name = input_line_pointer;
16004       c = get_symbol_end ();
16005       symbolP = symbol_find_or_make (name);
16006       S_SET_EXTERNAL (symbolP);
16007
16008       *input_line_pointer = c;
16009       SKIP_WHITESPACE ();
16010
16011       /* On Irix 5, every global symbol that is not explicitly labelled as
16012          being a function is apparently labelled as being an object.  */
16013       flag = BSF_OBJECT;
16014
16015       if (!is_end_of_line[(unsigned char) *input_line_pointer]
16016           && (*input_line_pointer != ','))
16017         {
16018           char *secname;
16019           asection *sec;
16020
16021           secname = input_line_pointer;
16022           c = get_symbol_end ();
16023           sec = bfd_get_section_by_name (stdoutput, secname);
16024           if (sec == NULL)
16025             as_bad (_("%s: no such section"), secname);
16026           *input_line_pointer = c;
16027
16028           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
16029             flag = BSF_FUNCTION;
16030         }
16031
16032       symbol_get_bfdsym (symbolP)->flags |= flag;
16033
16034       c = *input_line_pointer;
16035       if (c == ',')
16036         {
16037           input_line_pointer++;
16038           SKIP_WHITESPACE ();
16039           if (is_end_of_line[(unsigned char) *input_line_pointer])
16040             c = '\n';
16041         }
16042     }
16043   while (c == ',');
16044
16045   demand_empty_rest_of_line ();
16046 }
16047
16048 static void
16049 s_option (int x ATTRIBUTE_UNUSED)
16050 {
16051   char *opt;
16052   char c;
16053
16054   opt = input_line_pointer;
16055   c = get_symbol_end ();
16056
16057   if (*opt == 'O')
16058     {
16059       /* FIXME: What does this mean?  */
16060     }
16061   else if (strncmp (opt, "pic", 3) == 0)
16062     {
16063       int i;
16064
16065       i = atoi (opt + 3);
16066       if (i == 0)
16067         mips_pic = NO_PIC;
16068       else if (i == 2)
16069         {
16070           mips_pic = SVR4_PIC;
16071           mips_abicalls = TRUE;
16072         }
16073       else
16074         as_bad (_(".option pic%d not supported"), i);
16075
16076       if (mips_pic == SVR4_PIC)
16077         {
16078           if (g_switch_seen && g_switch_value != 0)
16079             as_warn (_("-G may not be used with SVR4 PIC code"));
16080           g_switch_value = 0;
16081           bfd_set_gp_size (stdoutput, 0);
16082         }
16083     }
16084   else
16085     as_warn (_("Unrecognized option \"%s\""), opt);
16086
16087   *input_line_pointer = c;
16088   demand_empty_rest_of_line ();
16089 }
16090
16091 /* This structure is used to hold a stack of .set values.  */
16092
16093 struct mips_option_stack
16094 {
16095   struct mips_option_stack *next;
16096   struct mips_set_options options;
16097 };
16098
16099 static struct mips_option_stack *mips_opts_stack;
16100
16101 /* Handle the .set pseudo-op.  */
16102
16103 static void
16104 s_mipsset (int x ATTRIBUTE_UNUSED)
16105 {
16106   char *name = input_line_pointer, ch;
16107
16108   while (!is_end_of_line[(unsigned char) *input_line_pointer])
16109     ++input_line_pointer;
16110   ch = *input_line_pointer;
16111   *input_line_pointer = '\0';
16112
16113   if (strcmp (name, "reorder") == 0)
16114     {
16115       if (mips_opts.noreorder)
16116         end_noreorder ();
16117     }
16118   else if (strcmp (name, "noreorder") == 0)
16119     {
16120       if (!mips_opts.noreorder)
16121         start_noreorder ();
16122     }
16123   else if (strncmp (name, "at=", 3) == 0)
16124     {
16125       char *s = name + 3;
16126
16127       if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
16128         as_bad (_("Unrecognized register name `%s'"), s);
16129     }
16130   else if (strcmp (name, "at") == 0)
16131     {
16132       mips_opts.at = ATREG;
16133     }
16134   else if (strcmp (name, "noat") == 0)
16135     {
16136       mips_opts.at = ZERO;
16137     }
16138   else if (strcmp (name, "macro") == 0)
16139     {
16140       mips_opts.warn_about_macros = 0;
16141     }
16142   else if (strcmp (name, "nomacro") == 0)
16143     {
16144       if (mips_opts.noreorder == 0)
16145         as_bad (_("`noreorder' must be set before `nomacro'"));
16146       mips_opts.warn_about_macros = 1;
16147     }
16148   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
16149     {
16150       mips_opts.nomove = 0;
16151     }
16152   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
16153     {
16154       mips_opts.nomove = 1;
16155     }
16156   else if (strcmp (name, "bopt") == 0)
16157     {
16158       mips_opts.nobopt = 0;
16159     }
16160   else if (strcmp (name, "nobopt") == 0)
16161     {
16162       mips_opts.nobopt = 1;
16163     }
16164   else if (strcmp (name, "gp=default") == 0)
16165     mips_opts.gp32 = file_mips_gp32;
16166   else if (strcmp (name, "gp=32") == 0)
16167     mips_opts.gp32 = 1;
16168   else if (strcmp (name, "gp=64") == 0)
16169     {
16170       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
16171         as_warn (_("%s isa does not support 64-bit registers"),
16172                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16173       mips_opts.gp32 = 0;
16174     }
16175   else if (strcmp (name, "fp=default") == 0)
16176     mips_opts.fp32 = file_mips_fp32;
16177   else if (strcmp (name, "fp=32") == 0)
16178     mips_opts.fp32 = 1;
16179   else if (strcmp (name, "fp=64") == 0)
16180     {
16181       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
16182         as_warn (_("%s isa does not support 64-bit floating point registers"),
16183                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16184       mips_opts.fp32 = 0;
16185     }
16186   else if (strcmp (name, "softfloat") == 0)
16187     mips_opts.soft_float = 1;
16188   else if (strcmp (name, "hardfloat") == 0)
16189     mips_opts.soft_float = 0;
16190   else if (strcmp (name, "singlefloat") == 0)
16191     mips_opts.single_float = 1;
16192   else if (strcmp (name, "doublefloat") == 0)
16193     mips_opts.single_float = 0;
16194   else if (strcmp (name, "mips16") == 0
16195            || strcmp (name, "MIPS-16") == 0)
16196     {
16197       if (mips_opts.micromips == 1)
16198         as_fatal (_("`mips16' cannot be used with `micromips'"));
16199       mips_opts.mips16 = 1;
16200     }
16201   else if (strcmp (name, "nomips16") == 0
16202            || strcmp (name, "noMIPS-16") == 0)
16203     mips_opts.mips16 = 0;
16204   else if (strcmp (name, "micromips") == 0)
16205     {
16206       if (mips_opts.mips16 == 1)
16207         as_fatal (_("`micromips' cannot be used with `mips16'"));
16208       mips_opts.micromips = 1;
16209     }
16210   else if (strcmp (name, "nomicromips") == 0)
16211     mips_opts.micromips = 0;
16212   else if (strcmp (name, "smartmips") == 0)
16213     {
16214       if (!ISA_SUPPORTS_SMARTMIPS)
16215         as_warn (_("%s ISA does not support SmartMIPS ASE"), 
16216                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16217       mips_opts.ase_smartmips = 1;
16218     }
16219   else if (strcmp (name, "nosmartmips") == 0)
16220     mips_opts.ase_smartmips = 0;
16221   else if (strcmp (name, "mips3d") == 0)
16222     mips_opts.ase_mips3d = 1;
16223   else if (strcmp (name, "nomips3d") == 0)
16224     mips_opts.ase_mips3d = 0;
16225   else if (strcmp (name, "mdmx") == 0)
16226     mips_opts.ase_mdmx = 1;
16227   else if (strcmp (name, "nomdmx") == 0)
16228     mips_opts.ase_mdmx = 0;
16229   else if (strcmp (name, "dsp") == 0)
16230     {
16231       if (!ISA_SUPPORTS_DSP_ASE)
16232         as_warn (_("%s ISA does not support DSP ASE"), 
16233                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16234       mips_opts.ase_dsp = 1;
16235       mips_opts.ase_dspr2 = 0;
16236     }
16237   else if (strcmp (name, "nodsp") == 0)
16238     {
16239       mips_opts.ase_dsp = 0;
16240       mips_opts.ase_dspr2 = 0;
16241     }
16242   else if (strcmp (name, "dspr2") == 0)
16243     {
16244       if (!ISA_SUPPORTS_DSPR2_ASE)
16245         as_warn (_("%s ISA does not support DSP R2 ASE"),
16246                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16247       mips_opts.ase_dspr2 = 1;
16248       mips_opts.ase_dsp = 1;
16249     }
16250   else if (strcmp (name, "nodspr2") == 0)
16251     {
16252       mips_opts.ase_dspr2 = 0;
16253       mips_opts.ase_dsp = 0;
16254     }
16255   else if (strcmp (name, "mt") == 0)
16256     {
16257       if (!ISA_SUPPORTS_MT_ASE)
16258         as_warn (_("%s ISA does not support MT ASE"), 
16259                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16260       mips_opts.ase_mt = 1;
16261     }
16262   else if (strcmp (name, "nomt") == 0)
16263     mips_opts.ase_mt = 0;
16264   else if (strcmp (name, "mcu") == 0)
16265     mips_opts.ase_mcu = 1;
16266   else if (strcmp (name, "nomcu") == 0)
16267     mips_opts.ase_mcu = 0;
16268   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
16269     {
16270       int reset = 0;
16271
16272       /* Permit the user to change the ISA and architecture on the fly.
16273          Needless to say, misuse can cause serious problems.  */
16274       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
16275         {
16276           reset = 1;
16277           mips_opts.isa = file_mips_isa;
16278           mips_opts.arch = file_mips_arch;
16279         }
16280       else if (strncmp (name, "arch=", 5) == 0)
16281         {
16282           const struct mips_cpu_info *p;
16283
16284           p = mips_parse_cpu("internal use", name + 5);
16285           if (!p)
16286             as_bad (_("unknown architecture %s"), name + 5);
16287           else
16288             {
16289               mips_opts.arch = p->cpu;
16290               mips_opts.isa = p->isa;
16291             }
16292         }
16293       else if (strncmp (name, "mips", 4) == 0)
16294         {
16295           const struct mips_cpu_info *p;
16296
16297           p = mips_parse_cpu("internal use", name);
16298           if (!p)
16299             as_bad (_("unknown ISA level %s"), name + 4);
16300           else
16301             {
16302               mips_opts.arch = p->cpu;
16303               mips_opts.isa = p->isa;
16304             }
16305         }
16306       else
16307         as_bad (_("unknown ISA or architecture %s"), name);
16308
16309       switch (mips_opts.isa)
16310         {
16311         case  0:
16312           break;
16313         case ISA_MIPS1:
16314         case ISA_MIPS2:
16315         case ISA_MIPS32:
16316         case ISA_MIPS32R2:
16317           mips_opts.gp32 = 1;
16318           mips_opts.fp32 = 1;
16319           break;
16320         case ISA_MIPS3:
16321         case ISA_MIPS4:
16322         case ISA_MIPS5:
16323         case ISA_MIPS64:
16324         case ISA_MIPS64R2:
16325           mips_opts.gp32 = 0;
16326           mips_opts.fp32 = 0;
16327           break;
16328         default:
16329           as_bad (_("unknown ISA level %s"), name + 4);
16330           break;
16331         }
16332       if (reset)
16333         {
16334           mips_opts.gp32 = file_mips_gp32;
16335           mips_opts.fp32 = file_mips_fp32;
16336         }
16337     }
16338   else if (strcmp (name, "autoextend") == 0)
16339     mips_opts.noautoextend = 0;
16340   else if (strcmp (name, "noautoextend") == 0)
16341     mips_opts.noautoextend = 1;
16342   else if (strcmp (name, "push") == 0)
16343     {
16344       struct mips_option_stack *s;
16345
16346       s = (struct mips_option_stack *) xmalloc (sizeof *s);
16347       s->next = mips_opts_stack;
16348       s->options = mips_opts;
16349       mips_opts_stack = s;
16350     }
16351   else if (strcmp (name, "pop") == 0)
16352     {
16353       struct mips_option_stack *s;
16354
16355       s = mips_opts_stack;
16356       if (s == NULL)
16357         as_bad (_(".set pop with no .set push"));
16358       else
16359         {
16360           /* If we're changing the reorder mode we need to handle
16361              delay slots correctly.  */
16362           if (s->options.noreorder && ! mips_opts.noreorder)
16363             start_noreorder ();
16364           else if (! s->options.noreorder && mips_opts.noreorder)
16365             end_noreorder ();
16366
16367           mips_opts = s->options;
16368           mips_opts_stack = s->next;
16369           free (s);
16370         }
16371     }
16372   else if (strcmp (name, "sym32") == 0)
16373     mips_opts.sym32 = TRUE;
16374   else if (strcmp (name, "nosym32") == 0)
16375     mips_opts.sym32 = FALSE;
16376   else if (strchr (name, ','))
16377     {
16378       /* Generic ".set" directive; use the generic handler.  */
16379       *input_line_pointer = ch;
16380       input_line_pointer = name;
16381       s_set (0);
16382       return;
16383     }
16384   else
16385     {
16386       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
16387     }
16388   *input_line_pointer = ch;
16389   demand_empty_rest_of_line ();
16390 }
16391
16392 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
16393    .option pic2.  It means to generate SVR4 PIC calls.  */
16394
16395 static void
16396 s_abicalls (int ignore ATTRIBUTE_UNUSED)
16397 {
16398   mips_pic = SVR4_PIC;
16399   mips_abicalls = TRUE;
16400
16401   if (g_switch_seen && g_switch_value != 0)
16402     as_warn (_("-G may not be used with SVR4 PIC code"));
16403   g_switch_value = 0;
16404
16405   bfd_set_gp_size (stdoutput, 0);
16406   demand_empty_rest_of_line ();
16407 }
16408
16409 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
16410    PIC code.  It sets the $gp register for the function based on the
16411    function address, which is in the register named in the argument.
16412    This uses a relocation against _gp_disp, which is handled specially
16413    by the linker.  The result is:
16414         lui     $gp,%hi(_gp_disp)
16415         addiu   $gp,$gp,%lo(_gp_disp)
16416         addu    $gp,$gp,.cpload argument
16417    The .cpload argument is normally $25 == $t9.
16418
16419    The -mno-shared option changes this to:
16420         lui     $gp,%hi(__gnu_local_gp)
16421         addiu   $gp,$gp,%lo(__gnu_local_gp)
16422    and the argument is ignored.  This saves an instruction, but the
16423    resulting code is not position independent; it uses an absolute
16424    address for __gnu_local_gp.  Thus code assembled with -mno-shared
16425    can go into an ordinary executable, but not into a shared library.  */
16426
16427 static void
16428 s_cpload (int ignore ATTRIBUTE_UNUSED)
16429 {
16430   expressionS ex;
16431   int reg;
16432   int in_shared;
16433
16434   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16435      .cpload is ignored.  */
16436   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16437     {
16438       s_ignore (0);
16439       return;
16440     }
16441
16442   /* .cpload should be in a .set noreorder section.  */
16443   if (mips_opts.noreorder == 0)
16444     as_warn (_(".cpload not in noreorder section"));
16445
16446   reg = tc_get_register (0);
16447
16448   /* If we need to produce a 64-bit address, we are better off using
16449      the default instruction sequence.  */
16450   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
16451
16452   ex.X_op = O_symbol;
16453   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
16454                                          "__gnu_local_gp");
16455   ex.X_op_symbol = NULL;
16456   ex.X_add_number = 0;
16457
16458   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
16459   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16460
16461   macro_start ();
16462   macro_build_lui (&ex, mips_gp_register);
16463   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16464                mips_gp_register, BFD_RELOC_LO16);
16465   if (in_shared)
16466     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
16467                  mips_gp_register, reg);
16468   macro_end ();
16469
16470   demand_empty_rest_of_line ();
16471 }
16472
16473 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
16474      .cpsetup $reg1, offset|$reg2, label
16475
16476    If offset is given, this results in:
16477      sd         $gp, offset($sp)
16478      lui        $gp, %hi(%neg(%gp_rel(label)))
16479      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
16480      daddu      $gp, $gp, $reg1
16481
16482    If $reg2 is given, this results in:
16483      daddu      $reg2, $gp, $0
16484      lui        $gp, %hi(%neg(%gp_rel(label)))
16485      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
16486      daddu      $gp, $gp, $reg1
16487    $reg1 is normally $25 == $t9.
16488
16489    The -mno-shared option replaces the last three instructions with
16490         lui     $gp,%hi(_gp)
16491         addiu   $gp,$gp,%lo(_gp)  */
16492
16493 static void
16494 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
16495 {
16496   expressionS ex_off;
16497   expressionS ex_sym;
16498   int reg1;
16499
16500   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
16501      We also need NewABI support.  */
16502   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16503     {
16504       s_ignore (0);
16505       return;
16506     }
16507
16508   reg1 = tc_get_register (0);
16509   SKIP_WHITESPACE ();
16510   if (*input_line_pointer != ',')
16511     {
16512       as_bad (_("missing argument separator ',' for .cpsetup"));
16513       return;
16514     }
16515   else
16516     ++input_line_pointer;
16517   SKIP_WHITESPACE ();
16518   if (*input_line_pointer == '$')
16519     {
16520       mips_cpreturn_register = tc_get_register (0);
16521       mips_cpreturn_offset = -1;
16522     }
16523   else
16524     {
16525       mips_cpreturn_offset = get_absolute_expression ();
16526       mips_cpreturn_register = -1;
16527     }
16528   SKIP_WHITESPACE ();
16529   if (*input_line_pointer != ',')
16530     {
16531       as_bad (_("missing argument separator ',' for .cpsetup"));
16532       return;
16533     }
16534   else
16535     ++input_line_pointer;
16536   SKIP_WHITESPACE ();
16537   expression (&ex_sym);
16538
16539   macro_start ();
16540   if (mips_cpreturn_register == -1)
16541     {
16542       ex_off.X_op = O_constant;
16543       ex_off.X_add_symbol = NULL;
16544       ex_off.X_op_symbol = NULL;
16545       ex_off.X_add_number = mips_cpreturn_offset;
16546
16547       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
16548                    BFD_RELOC_LO16, SP);
16549     }
16550   else
16551     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
16552                  mips_gp_register, 0);
16553
16554   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
16555     {
16556       macro_build (&ex_sym, "lui", LUI_FMT, mips_gp_register,
16557                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
16558                    BFD_RELOC_HI16_S);
16559
16560       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
16561                    mips_gp_register, -1, BFD_RELOC_GPREL16,
16562                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
16563
16564       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
16565                    mips_gp_register, reg1);
16566     }
16567   else
16568     {
16569       expressionS ex;
16570
16571       ex.X_op = O_symbol;
16572       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
16573       ex.X_op_symbol = NULL;
16574       ex.X_add_number = 0;
16575
16576       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
16577       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16578
16579       macro_build_lui (&ex, mips_gp_register);
16580       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16581                    mips_gp_register, BFD_RELOC_LO16);
16582     }
16583
16584   macro_end ();
16585
16586   demand_empty_rest_of_line ();
16587 }
16588
16589 static void
16590 s_cplocal (int ignore ATTRIBUTE_UNUSED)
16591 {
16592   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
16593      .cplocal is ignored.  */
16594   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16595     {
16596       s_ignore (0);
16597       return;
16598     }
16599
16600   mips_gp_register = tc_get_register (0);
16601   demand_empty_rest_of_line ();
16602 }
16603
16604 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
16605    offset from $sp.  The offset is remembered, and after making a PIC
16606    call $gp is restored from that location.  */
16607
16608 static void
16609 s_cprestore (int ignore ATTRIBUTE_UNUSED)
16610 {
16611   expressionS ex;
16612
16613   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16614      .cprestore is ignored.  */
16615   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16616     {
16617       s_ignore (0);
16618       return;
16619     }
16620
16621   mips_cprestore_offset = get_absolute_expression ();
16622   mips_cprestore_valid = 1;
16623
16624   ex.X_op = O_constant;
16625   ex.X_add_symbol = NULL;
16626   ex.X_op_symbol = NULL;
16627   ex.X_add_number = mips_cprestore_offset;
16628
16629   macro_start ();
16630   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
16631                                 SP, HAVE_64BIT_ADDRESSES);
16632   macro_end ();
16633
16634   demand_empty_rest_of_line ();
16635 }
16636
16637 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
16638    was given in the preceding .cpsetup, it results in:
16639      ld         $gp, offset($sp)
16640
16641    If a register $reg2 was given there, it results in:
16642      daddu      $gp, $reg2, $0  */
16643
16644 static void
16645 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
16646 {
16647   expressionS ex;
16648
16649   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
16650      We also need NewABI support.  */
16651   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16652     {
16653       s_ignore (0);
16654       return;
16655     }
16656
16657   macro_start ();
16658   if (mips_cpreturn_register == -1)
16659     {
16660       ex.X_op = O_constant;
16661       ex.X_add_symbol = NULL;
16662       ex.X_op_symbol = NULL;
16663       ex.X_add_number = mips_cpreturn_offset;
16664
16665       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
16666     }
16667   else
16668     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
16669                  mips_cpreturn_register, 0);
16670   macro_end ();
16671
16672   demand_empty_rest_of_line ();
16673 }
16674
16675 /* Handle a .dtprelword, .dtpreldword, .tprelword, or .tpreldword
16676    pseudo-op; DIRSTR says which. The pseudo-op generates a BYTES-size
16677    DTP- or TP-relative relocation of type RTYPE, for use in either DWARF
16678    debug information or MIPS16 TLS.  */
16679
16680 static void
16681 s_tls_rel_directive (const size_t bytes, const char *dirstr,
16682                      bfd_reloc_code_real_type rtype)
16683 {
16684   expressionS ex;
16685   char *p;
16686
16687   expression (&ex);
16688
16689   if (ex.X_op != O_symbol)
16690     {
16691       as_bad (_("Unsupported use of %s"), dirstr);
16692       ignore_rest_of_line ();
16693     }
16694
16695   p = frag_more (bytes);
16696   md_number_to_chars (p, 0, bytes);
16697   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE, rtype);
16698   demand_empty_rest_of_line ();
16699   mips_clear_insn_labels ();
16700 }
16701
16702 /* Handle .dtprelword.  */
16703
16704 static void
16705 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
16706 {
16707   s_tls_rel_directive (4, ".dtprelword", BFD_RELOC_MIPS_TLS_DTPREL32);
16708 }
16709
16710 /* Handle .dtpreldword.  */
16711
16712 static void
16713 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
16714 {
16715   s_tls_rel_directive (8, ".dtpreldword", BFD_RELOC_MIPS_TLS_DTPREL64);
16716 }
16717
16718 /* Handle .tprelword.  */
16719
16720 static void
16721 s_tprelword (int ignore ATTRIBUTE_UNUSED)
16722 {
16723   s_tls_rel_directive (4, ".tprelword", BFD_RELOC_MIPS_TLS_TPREL32);
16724 }
16725
16726 /* Handle .tpreldword.  */
16727
16728 static void
16729 s_tpreldword (int ignore ATTRIBUTE_UNUSED)
16730 {
16731   s_tls_rel_directive (8, ".tpreldword", BFD_RELOC_MIPS_TLS_TPREL64);
16732 }
16733
16734 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
16735    code.  It sets the offset to use in gp_rel relocations.  */
16736
16737 static void
16738 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
16739 {
16740   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
16741      We also need NewABI support.  */
16742   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16743     {
16744       s_ignore (0);
16745       return;
16746     }
16747
16748   mips_gprel_offset = get_absolute_expression ();
16749
16750   demand_empty_rest_of_line ();
16751 }
16752
16753 /* Handle the .gpword pseudo-op.  This is used when generating PIC
16754    code.  It generates a 32 bit GP relative reloc.  */
16755
16756 static void
16757 s_gpword (int ignore ATTRIBUTE_UNUSED)
16758 {
16759   segment_info_type *si;
16760   struct insn_label_list *l;
16761   expressionS ex;
16762   char *p;
16763
16764   /* When not generating PIC code, this is treated as .word.  */
16765   if (mips_pic != SVR4_PIC)
16766     {
16767       s_cons (2);
16768       return;
16769     }
16770
16771   si = seg_info (now_seg);
16772   l = si->label_list;
16773   mips_emit_delays ();
16774   if (auto_align)
16775     mips_align (2, 0, l);
16776
16777   expression (&ex);
16778   mips_clear_insn_labels ();
16779
16780   if (ex.X_op != O_symbol || ex.X_add_number != 0)
16781     {
16782       as_bad (_("Unsupported use of .gpword"));
16783       ignore_rest_of_line ();
16784     }
16785
16786   p = frag_more (4);
16787   md_number_to_chars (p, 0, 4);
16788   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
16789                BFD_RELOC_GPREL32);
16790
16791   demand_empty_rest_of_line ();
16792 }
16793
16794 static void
16795 s_gpdword (int ignore ATTRIBUTE_UNUSED)
16796 {
16797   segment_info_type *si;
16798   struct insn_label_list *l;
16799   expressionS ex;
16800   char *p;
16801
16802   /* When not generating PIC code, this is treated as .dword.  */
16803   if (mips_pic != SVR4_PIC)
16804     {
16805       s_cons (3);
16806       return;
16807     }
16808
16809   si = seg_info (now_seg);
16810   l = si->label_list;
16811   mips_emit_delays ();
16812   if (auto_align)
16813     mips_align (3, 0, l);
16814
16815   expression (&ex);
16816   mips_clear_insn_labels ();
16817
16818   if (ex.X_op != O_symbol || ex.X_add_number != 0)
16819     {
16820       as_bad (_("Unsupported use of .gpdword"));
16821       ignore_rest_of_line ();
16822     }
16823
16824   p = frag_more (8);
16825   md_number_to_chars (p, 0, 8);
16826   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
16827                BFD_RELOC_GPREL32)->fx_tcbit = 1;
16828
16829   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
16830   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
16831            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
16832
16833   demand_empty_rest_of_line ();
16834 }
16835
16836 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
16837    tables in SVR4 PIC code.  */
16838
16839 static void
16840 s_cpadd (int ignore ATTRIBUTE_UNUSED)
16841 {
16842   int reg;
16843
16844   /* This is ignored when not generating SVR4 PIC code.  */
16845   if (mips_pic != SVR4_PIC)
16846     {
16847       s_ignore (0);
16848       return;
16849     }
16850
16851   /* Add $gp to the register named as an argument.  */
16852   macro_start ();
16853   reg = tc_get_register (0);
16854   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
16855   macro_end ();
16856
16857   demand_empty_rest_of_line ();
16858 }
16859
16860 /* Handle the .insn pseudo-op.  This marks instruction labels in
16861    mips16/micromips mode.  This permits the linker to handle them specially,
16862    such as generating jalx instructions when needed.  We also make
16863    them odd for the duration of the assembly, in order to generate the
16864    right sort of code.  We will make them even in the adjust_symtab
16865    routine, while leaving them marked.  This is convenient for the
16866    debugger and the disassembler.  The linker knows to make them odd
16867    again.  */
16868
16869 static void
16870 s_insn (int ignore ATTRIBUTE_UNUSED)
16871 {
16872   mips_mark_labels ();
16873
16874   demand_empty_rest_of_line ();
16875 }
16876
16877 /* Handle a .stabn directive.  We need these in order to mark a label
16878    as being a mips16 text label correctly.  Sometimes the compiler
16879    will emit a label, followed by a .stabn, and then switch sections.
16880    If the label and .stabn are in mips16 mode, then the label is
16881    really a mips16 text label.  */
16882
16883 static void
16884 s_mips_stab (int type)
16885 {
16886   if (type == 'n')
16887     mips_mark_labels ();
16888
16889   s_stab (type);
16890 }
16891
16892 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
16893
16894 static void
16895 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
16896 {
16897   char *name;
16898   int c;
16899   symbolS *symbolP;
16900   expressionS exp;
16901
16902   name = input_line_pointer;
16903   c = get_symbol_end ();
16904   symbolP = symbol_find_or_make (name);
16905   S_SET_WEAK (symbolP);
16906   *input_line_pointer = c;
16907
16908   SKIP_WHITESPACE ();
16909
16910   if (! is_end_of_line[(unsigned char) *input_line_pointer])
16911     {
16912       if (S_IS_DEFINED (symbolP))
16913         {
16914           as_bad (_("ignoring attempt to redefine symbol %s"),
16915                   S_GET_NAME (symbolP));
16916           ignore_rest_of_line ();
16917           return;
16918         }
16919
16920       if (*input_line_pointer == ',')
16921         {
16922           ++input_line_pointer;
16923           SKIP_WHITESPACE ();
16924         }
16925
16926       expression (&exp);
16927       if (exp.X_op != O_symbol)
16928         {
16929           as_bad (_("bad .weakext directive"));
16930           ignore_rest_of_line ();
16931           return;
16932         }
16933       symbol_set_value_expression (symbolP, &exp);
16934     }
16935
16936   demand_empty_rest_of_line ();
16937 }
16938
16939 /* Parse a register string into a number.  Called from the ECOFF code
16940    to parse .frame.  The argument is non-zero if this is the frame
16941    register, so that we can record it in mips_frame_reg.  */
16942
16943 int
16944 tc_get_register (int frame)
16945 {
16946   unsigned int reg;
16947
16948   SKIP_WHITESPACE ();
16949   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
16950     reg = 0;
16951   if (frame)
16952     {
16953       mips_frame_reg = reg != 0 ? reg : SP;
16954       mips_frame_reg_valid = 1;
16955       mips_cprestore_valid = 0;
16956     }
16957   return reg;
16958 }
16959
16960 valueT
16961 md_section_align (asection *seg, valueT addr)
16962 {
16963   int align = bfd_get_section_alignment (stdoutput, seg);
16964
16965   if (IS_ELF)
16966     {
16967       /* We don't need to align ELF sections to the full alignment.
16968          However, Irix 5 may prefer that we align them at least to a 16
16969          byte boundary.  We don't bother to align the sections if we
16970          are targeted for an embedded system.  */
16971       if (strncmp (TARGET_OS, "elf", 3) == 0)
16972         return addr;
16973       if (align > 4)
16974         align = 4;
16975     }
16976
16977   return ((addr + (1 << align) - 1) & (-1 << align));
16978 }
16979
16980 /* Utility routine, called from above as well.  If called while the
16981    input file is still being read, it's only an approximation.  (For
16982    example, a symbol may later become defined which appeared to be
16983    undefined earlier.)  */
16984
16985 static int
16986 nopic_need_relax (symbolS *sym, int before_relaxing)
16987 {
16988   if (sym == 0)
16989     return 0;
16990
16991   if (g_switch_value > 0)
16992     {
16993       const char *symname;
16994       int change;
16995
16996       /* Find out whether this symbol can be referenced off the $gp
16997          register.  It can be if it is smaller than the -G size or if
16998          it is in the .sdata or .sbss section.  Certain symbols can
16999          not be referenced off the $gp, although it appears as though
17000          they can.  */
17001       symname = S_GET_NAME (sym);
17002       if (symname != (const char *) NULL
17003           && (strcmp (symname, "eprol") == 0
17004               || strcmp (symname, "etext") == 0
17005               || strcmp (symname, "_gp") == 0
17006               || strcmp (symname, "edata") == 0
17007               || strcmp (symname, "_fbss") == 0
17008               || strcmp (symname, "_fdata") == 0
17009               || strcmp (symname, "_ftext") == 0
17010               || strcmp (symname, "end") == 0
17011               || strcmp (symname, "_gp_disp") == 0))
17012         change = 1;
17013       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
17014                && (0
17015 #ifndef NO_ECOFF_DEBUGGING
17016                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
17017                        && (symbol_get_obj (sym)->ecoff_extern_size
17018                            <= g_switch_value))
17019 #endif
17020                    /* We must defer this decision until after the whole
17021                       file has been read, since there might be a .extern
17022                       after the first use of this symbol.  */
17023                    || (before_relaxing
17024 #ifndef NO_ECOFF_DEBUGGING
17025                        && symbol_get_obj (sym)->ecoff_extern_size == 0
17026 #endif
17027                        && S_GET_VALUE (sym) == 0)
17028                    || (S_GET_VALUE (sym) != 0
17029                        && S_GET_VALUE (sym) <= g_switch_value)))
17030         change = 0;
17031       else
17032         {
17033           const char *segname;
17034
17035           segname = segment_name (S_GET_SEGMENT (sym));
17036           gas_assert (strcmp (segname, ".lit8") != 0
17037                   && strcmp (segname, ".lit4") != 0);
17038           change = (strcmp (segname, ".sdata") != 0
17039                     && strcmp (segname, ".sbss") != 0
17040                     && strncmp (segname, ".sdata.", 7) != 0
17041                     && strncmp (segname, ".sbss.", 6) != 0
17042                     && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
17043                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
17044         }
17045       return change;
17046     }
17047   else
17048     /* We are not optimizing for the $gp register.  */
17049     return 1;
17050 }
17051
17052
17053 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
17054
17055 static bfd_boolean
17056 pic_need_relax (symbolS *sym, asection *segtype)
17057 {
17058   asection *symsec;
17059
17060   /* Handle the case of a symbol equated to another symbol.  */
17061   while (symbol_equated_reloc_p (sym))
17062     {
17063       symbolS *n;
17064
17065       /* It's possible to get a loop here in a badly written program.  */
17066       n = symbol_get_value_expression (sym)->X_add_symbol;
17067       if (n == sym)
17068         break;
17069       sym = n;
17070     }
17071
17072   if (symbol_section_p (sym))
17073     return TRUE;
17074
17075   symsec = S_GET_SEGMENT (sym);
17076
17077   /* This must duplicate the test in adjust_reloc_syms.  */
17078   return (!bfd_is_und_section (symsec)
17079           && !bfd_is_abs_section (symsec)
17080           && !bfd_is_com_section (symsec)
17081           && !s_is_linkonce (sym, segtype)
17082 #ifdef OBJ_ELF
17083           /* A global or weak symbol is treated as external.  */
17084           && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
17085 #endif
17086           );
17087 }
17088
17089
17090 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
17091    extended opcode.  SEC is the section the frag is in.  */
17092
17093 static int
17094 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
17095 {
17096   int type;
17097   const struct mips16_immed_operand *op;
17098   offsetT val;
17099   int mintiny, maxtiny;
17100   segT symsec;
17101   fragS *sym_frag;
17102
17103   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
17104     return 0;
17105   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
17106     return 1;
17107
17108   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
17109   op = mips16_immed_operands;
17110   while (op->type != type)
17111     {
17112       ++op;
17113       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
17114     }
17115
17116   if (op->unsp)
17117     {
17118       if (type == '<' || type == '>' || type == '[' || type == ']')
17119         {
17120           mintiny = 1;
17121           maxtiny = 1 << op->nbits;
17122         }
17123       else
17124         {
17125           mintiny = 0;
17126           maxtiny = (1 << op->nbits) - 1;
17127         }
17128     }
17129   else
17130     {
17131       mintiny = - (1 << (op->nbits - 1));
17132       maxtiny = (1 << (op->nbits - 1)) - 1;
17133     }
17134
17135   sym_frag = symbol_get_frag (fragp->fr_symbol);
17136   val = S_GET_VALUE (fragp->fr_symbol);
17137   symsec = S_GET_SEGMENT (fragp->fr_symbol);
17138
17139   if (op->pcrel)
17140     {
17141       addressT addr;
17142
17143       /* We won't have the section when we are called from
17144          mips_relax_frag.  However, we will always have been called
17145          from md_estimate_size_before_relax first.  If this is a
17146          branch to a different section, we mark it as such.  If SEC is
17147          NULL, and the frag is not marked, then it must be a branch to
17148          the same section.  */
17149       if (sec == NULL)
17150         {
17151           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
17152             return 1;
17153         }
17154       else
17155         {
17156           /* Must have been called from md_estimate_size_before_relax.  */
17157           if (symsec != sec)
17158             {
17159               fragp->fr_subtype =
17160                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17161
17162               /* FIXME: We should support this, and let the linker
17163                  catch branches and loads that are out of range.  */
17164               as_bad_where (fragp->fr_file, fragp->fr_line,
17165                             _("unsupported PC relative reference to different section"));
17166
17167               return 1;
17168             }
17169           if (fragp != sym_frag && sym_frag->fr_address == 0)
17170             /* Assume non-extended on the first relaxation pass.
17171                The address we have calculated will be bogus if this is
17172                a forward branch to another frag, as the forward frag
17173                will have fr_address == 0.  */
17174             return 0;
17175         }
17176
17177       /* In this case, we know for sure that the symbol fragment is in
17178          the same section.  If the relax_marker of the symbol fragment
17179          differs from the relax_marker of this fragment, we have not
17180          yet adjusted the symbol fragment fr_address.  We want to add
17181          in STRETCH in order to get a better estimate of the address.
17182          This particularly matters because of the shift bits.  */
17183       if (stretch != 0
17184           && sym_frag->relax_marker != fragp->relax_marker)
17185         {
17186           fragS *f;
17187
17188           /* Adjust stretch for any alignment frag.  Note that if have
17189              been expanding the earlier code, the symbol may be
17190              defined in what appears to be an earlier frag.  FIXME:
17191              This doesn't handle the fr_subtype field, which specifies
17192              a maximum number of bytes to skip when doing an
17193              alignment.  */
17194           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
17195             {
17196               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
17197                 {
17198                   if (stretch < 0)
17199                     stretch = - ((- stretch)
17200                                  & ~ ((1 << (int) f->fr_offset) - 1));
17201                   else
17202                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
17203                   if (stretch == 0)
17204                     break;
17205                 }
17206             }
17207           if (f != NULL)
17208             val += stretch;
17209         }
17210
17211       addr = fragp->fr_address + fragp->fr_fix;
17212
17213       /* The base address rules are complicated.  The base address of
17214          a branch is the following instruction.  The base address of a
17215          PC relative load or add is the instruction itself, but if it
17216          is in a delay slot (in which case it can not be extended) use
17217          the address of the instruction whose delay slot it is in.  */
17218       if (type == 'p' || type == 'q')
17219         {
17220           addr += 2;
17221
17222           /* If we are currently assuming that this frag should be
17223              extended, then, the current address is two bytes
17224              higher.  */
17225           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17226             addr += 2;
17227
17228           /* Ignore the low bit in the target, since it will be set
17229              for a text label.  */
17230           if ((val & 1) != 0)
17231             --val;
17232         }
17233       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
17234         addr -= 4;
17235       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
17236         addr -= 2;
17237
17238       val -= addr & ~ ((1 << op->shift) - 1);
17239
17240       /* Branch offsets have an implicit 0 in the lowest bit.  */
17241       if (type == 'p' || type == 'q')
17242         val /= 2;
17243
17244       /* If any of the shifted bits are set, we must use an extended
17245          opcode.  If the address depends on the size of this
17246          instruction, this can lead to a loop, so we arrange to always
17247          use an extended opcode.  We only check this when we are in
17248          the main relaxation loop, when SEC is NULL.  */
17249       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
17250         {
17251           fragp->fr_subtype =
17252             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17253           return 1;
17254         }
17255
17256       /* If we are about to mark a frag as extended because the value
17257          is precisely maxtiny + 1, then there is a chance of an
17258          infinite loop as in the following code:
17259              la $4,foo
17260              .skip      1020
17261              .align     2
17262            foo:
17263          In this case when the la is extended, foo is 0x3fc bytes
17264          away, so the la can be shrunk, but then foo is 0x400 away, so
17265          the la must be extended.  To avoid this loop, we mark the
17266          frag as extended if it was small, and is about to become
17267          extended with a value of maxtiny + 1.  */
17268       if (val == ((maxtiny + 1) << op->shift)
17269           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
17270           && sec == NULL)
17271         {
17272           fragp->fr_subtype =
17273             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17274           return 1;
17275         }
17276     }
17277   else if (symsec != absolute_section && sec != NULL)
17278     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
17279
17280   if ((val & ((1 << op->shift) - 1)) != 0
17281       || val < (mintiny << op->shift)
17282       || val > (maxtiny << op->shift))
17283     return 1;
17284   else
17285     return 0;
17286 }
17287
17288 /* Compute the length of a branch sequence, and adjust the
17289    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
17290    worst-case length is computed, with UPDATE being used to indicate
17291    whether an unconditional (-1), branch-likely (+1) or regular (0)
17292    branch is to be computed.  */
17293 static int
17294 relaxed_branch_length (fragS *fragp, asection *sec, int update)
17295 {
17296   bfd_boolean toofar;
17297   int length;
17298
17299   if (fragp
17300       && S_IS_DEFINED (fragp->fr_symbol)
17301       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17302     {
17303       addressT addr;
17304       offsetT val;
17305
17306       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17307
17308       addr = fragp->fr_address + fragp->fr_fix + 4;
17309
17310       val -= addr;
17311
17312       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
17313     }
17314   else if (fragp)
17315     /* If the symbol is not defined or it's in a different segment,
17316        assume the user knows what's going on and emit a short
17317        branch.  */
17318     toofar = FALSE;
17319   else
17320     toofar = TRUE;
17321
17322   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
17323     fragp->fr_subtype
17324       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_AT (fragp->fr_subtype),
17325                              RELAX_BRANCH_UNCOND (fragp->fr_subtype),
17326                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
17327                              RELAX_BRANCH_LINK (fragp->fr_subtype),
17328                              toofar);
17329
17330   length = 4;
17331   if (toofar)
17332     {
17333       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
17334         length += 8;
17335
17336       if (mips_pic != NO_PIC)
17337         {
17338           /* Additional space for PIC loading of target address.  */
17339           length += 8;
17340           if (mips_opts.isa == ISA_MIPS1)
17341             /* Additional space for $at-stabilizing nop.  */
17342             length += 4;
17343         }
17344
17345       /* If branch is conditional.  */
17346       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
17347         length += 8;
17348     }
17349
17350   return length;
17351 }
17352
17353 /* Compute the length of a branch sequence, and adjust the
17354    RELAX_MICROMIPS_TOOFAR32 bit accordingly.  If FRAGP is NULL, the
17355    worst-case length is computed, with UPDATE being used to indicate
17356    whether an unconditional (-1), or regular (0) branch is to be
17357    computed.  */
17358
17359 static int
17360 relaxed_micromips_32bit_branch_length (fragS *fragp, asection *sec, int update)
17361 {
17362   bfd_boolean toofar;
17363   int length;
17364
17365   if (fragp
17366       && S_IS_DEFINED (fragp->fr_symbol)
17367       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17368     {
17369       addressT addr;
17370       offsetT val;
17371
17372       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17373       /* Ignore the low bit in the target, since it will be set
17374          for a text label.  */
17375       if ((val & 1) != 0)
17376         --val;
17377
17378       addr = fragp->fr_address + fragp->fr_fix + 4;
17379
17380       val -= addr;
17381
17382       toofar = val < - (0x8000 << 1) || val >= (0x8000 << 1);
17383     }
17384   else if (fragp)
17385     /* If the symbol is not defined or it's in a different segment,
17386        assume the user knows what's going on and emit a short
17387        branch.  */
17388     toofar = FALSE;
17389   else
17390     toofar = TRUE;
17391
17392   if (fragp && update
17393       && toofar != RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
17394     fragp->fr_subtype = (toofar
17395                          ? RELAX_MICROMIPS_MARK_TOOFAR32 (fragp->fr_subtype)
17396                          : RELAX_MICROMIPS_CLEAR_TOOFAR32 (fragp->fr_subtype));
17397
17398   length = 4;
17399   if (toofar)
17400     {
17401       bfd_boolean compact_known = fragp != NULL;
17402       bfd_boolean compact = FALSE;
17403       bfd_boolean uncond;
17404
17405       if (compact_known)
17406         compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
17407       if (fragp)
17408         uncond = RELAX_MICROMIPS_UNCOND (fragp->fr_subtype);
17409       else
17410         uncond = update < 0;
17411
17412       /* If label is out of range, we turn branch <br>:
17413
17414                 <br>    label                   # 4 bytes
17415             0:
17416
17417          into:
17418
17419                 j       label                   # 4 bytes
17420                 nop                             # 2 bytes if compact && !PIC
17421             0:
17422        */
17423       if (mips_pic == NO_PIC && (!compact_known || compact))
17424         length += 2;
17425
17426       /* If assembling PIC code, we further turn:
17427
17428                         j       label                   # 4 bytes
17429
17430          into:
17431
17432                         lw/ld   at, %got(label)(gp)     # 4 bytes
17433                         d/addiu at, %lo(label)          # 4 bytes
17434                         jr/c    at                      # 2 bytes
17435        */
17436       if (mips_pic != NO_PIC)
17437         length += 6;
17438
17439       /* If branch <br> is conditional, we prepend negated branch <brneg>:
17440
17441                         <brneg> 0f                      # 4 bytes
17442                         nop                             # 2 bytes if !compact
17443        */
17444       if (!uncond)
17445         length += (compact_known && compact) ? 4 : 6;
17446     }
17447
17448   return length;
17449 }
17450
17451 /* Compute the length of a branch, and adjust the RELAX_MICROMIPS_TOOFAR16
17452    bit accordingly.  */
17453
17454 static int
17455 relaxed_micromips_16bit_branch_length (fragS *fragp, asection *sec, int update)
17456 {
17457   bfd_boolean toofar;
17458
17459   if (fragp
17460       && S_IS_DEFINED (fragp->fr_symbol)
17461       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17462     {
17463       addressT addr;
17464       offsetT val;
17465       int type;
17466
17467       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17468       /* Ignore the low bit in the target, since it will be set
17469          for a text label.  */
17470       if ((val & 1) != 0)
17471         --val;
17472
17473       /* Assume this is a 2-byte branch.  */
17474       addr = fragp->fr_address + fragp->fr_fix + 2;
17475
17476       /* We try to avoid the infinite loop by not adding 2 more bytes for
17477          long branches.  */
17478
17479       val -= addr;
17480
17481       type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
17482       if (type == 'D')
17483         toofar = val < - (0x200 << 1) || val >= (0x200 << 1);
17484       else if (type == 'E')
17485         toofar = val < - (0x40 << 1) || val >= (0x40 << 1);
17486       else
17487         abort ();
17488     }
17489   else
17490     /* If the symbol is not defined or it's in a different segment,
17491        we emit a normal 32-bit branch.  */
17492     toofar = TRUE;
17493
17494   if (fragp && update
17495       && toofar != RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
17496     fragp->fr_subtype
17497       = toofar ? RELAX_MICROMIPS_MARK_TOOFAR16 (fragp->fr_subtype)
17498                : RELAX_MICROMIPS_CLEAR_TOOFAR16 (fragp->fr_subtype);
17499
17500   if (toofar)
17501     return 4;
17502
17503   return 2;
17504 }
17505
17506 /* Estimate the size of a frag before relaxing.  Unless this is the
17507    mips16, we are not really relaxing here, and the final size is
17508    encoded in the subtype information.  For the mips16, we have to
17509    decide whether we are using an extended opcode or not.  */
17510
17511 int
17512 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
17513 {
17514   int change;
17515
17516   if (RELAX_BRANCH_P (fragp->fr_subtype))
17517     {
17518
17519       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
17520
17521       return fragp->fr_var;
17522     }
17523
17524   if (RELAX_MIPS16_P (fragp->fr_subtype))
17525     /* We don't want to modify the EXTENDED bit here; it might get us
17526        into infinite loops.  We change it only in mips_relax_frag().  */
17527     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
17528
17529   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17530     {
17531       int length = 4;
17532
17533       if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
17534         length = relaxed_micromips_16bit_branch_length (fragp, segtype, FALSE);
17535       if (length == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
17536         length = relaxed_micromips_32bit_branch_length (fragp, segtype, FALSE);
17537       fragp->fr_var = length;
17538
17539       return length;
17540     }
17541
17542   if (mips_pic == NO_PIC)
17543     change = nopic_need_relax (fragp->fr_symbol, 0);
17544   else if (mips_pic == SVR4_PIC)
17545     change = pic_need_relax (fragp->fr_symbol, segtype);
17546   else if (mips_pic == VXWORKS_PIC)
17547     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
17548     change = 0;
17549   else
17550     abort ();
17551
17552   if (change)
17553     {
17554       fragp->fr_subtype |= RELAX_USE_SECOND;
17555       return -RELAX_FIRST (fragp->fr_subtype);
17556     }
17557   else
17558     return -RELAX_SECOND (fragp->fr_subtype);
17559 }
17560
17561 /* This is called to see whether a reloc against a defined symbol
17562    should be converted into a reloc against a section.  */
17563
17564 int
17565 mips_fix_adjustable (fixS *fixp)
17566 {
17567   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
17568       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17569     return 0;
17570
17571   if (fixp->fx_addsy == NULL)
17572     return 1;
17573
17574   /* If symbol SYM is in a mergeable section, relocations of the form
17575      SYM + 0 can usually be made section-relative.  The mergeable data
17576      is then identified by the section offset rather than by the symbol.
17577
17578      However, if we're generating REL LO16 relocations, the offset is split
17579      between the LO16 and parterning high part relocation.  The linker will
17580      need to recalculate the complete offset in order to correctly identify
17581      the merge data.
17582
17583      The linker has traditionally not looked for the parterning high part
17584      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
17585      placed anywhere.  Rather than break backwards compatibility by changing
17586      this, it seems better not to force the issue, and instead keep the
17587      original symbol.  This will work with either linker behavior.  */
17588   if ((lo16_reloc_p (fixp->fx_r_type)
17589        || reloc_needs_lo_p (fixp->fx_r_type))
17590       && HAVE_IN_PLACE_ADDENDS
17591       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
17592     return 0;
17593
17594   /* There is no place to store an in-place offset for JALR relocations.
17595      Likewise an in-range offset of PC-relative relocations may overflow
17596      the in-place relocatable field if recalculated against the start
17597      address of the symbol's containing section.  */
17598   if (HAVE_IN_PLACE_ADDENDS
17599       && (fixp->fx_pcrel || jalr_reloc_p (fixp->fx_r_type)))
17600     return 0;
17601
17602 #ifdef OBJ_ELF
17603   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
17604      to a floating-point stub.  The same is true for non-R_MIPS16_26
17605      relocations against MIPS16 functions; in this case, the stub becomes
17606      the function's canonical address.
17607
17608      Floating-point stubs are stored in unique .mips16.call.* or
17609      .mips16.fn.* sections.  If a stub T for function F is in section S,
17610      the first relocation in section S must be against F; this is how the
17611      linker determines the target function.  All relocations that might
17612      resolve to T must also be against F.  We therefore have the following
17613      restrictions, which are given in an intentionally-redundant way:
17614
17615        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
17616           symbols.
17617
17618        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
17619           if that stub might be used.
17620
17621        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
17622           symbols.
17623
17624        4. We cannot reduce a stub's relocations against MIPS16 symbols if
17625           that stub might be used.
17626
17627      There is a further restriction:
17628
17629        5. We cannot reduce jump relocations (R_MIPS_26, R_MIPS16_26 or
17630           R_MICROMIPS_26_S1) against MIPS16 or microMIPS symbols on
17631           targets with in-place addends; the relocation field cannot
17632           encode the low bit.
17633
17634      For simplicity, we deal with (3)-(4) by not reducing _any_ relocation
17635      against a MIPS16 symbol.  We deal with (5) by by not reducing any
17636      such relocations on REL targets.
17637
17638      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
17639      relocation against some symbol R, no relocation against R may be
17640      reduced.  (Note that this deals with (2) as well as (1) because
17641      relocations against global symbols will never be reduced on ELF
17642      targets.)  This approach is a little simpler than trying to detect
17643      stub sections, and gives the "all or nothing" per-symbol consistency
17644      that we have for MIPS16 symbols.  */
17645   if (IS_ELF
17646       && fixp->fx_subsy == NULL
17647       && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
17648           || *symbol_get_tc (fixp->fx_addsy)
17649           || (HAVE_IN_PLACE_ADDENDS
17650               && ELF_ST_IS_MICROMIPS (S_GET_OTHER (fixp->fx_addsy))
17651               && jmp_reloc_p (fixp->fx_r_type))))
17652     return 0;
17653 #endif
17654
17655   return 1;
17656 }
17657
17658 /* Translate internal representation of relocation info to BFD target
17659    format.  */
17660
17661 arelent **
17662 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
17663 {
17664   static arelent *retval[4];
17665   arelent *reloc;
17666   bfd_reloc_code_real_type code;
17667
17668   memset (retval, 0, sizeof(retval));
17669   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
17670   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
17671   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
17672   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
17673
17674   if (fixp->fx_pcrel)
17675     {
17676       gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2
17677                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
17678                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
17679                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1);
17680
17681       /* At this point, fx_addnumber is "symbol offset - pcrel address".
17682          Relocations want only the symbol offset.  */
17683       reloc->addend = fixp->fx_addnumber + reloc->address;
17684       if (!IS_ELF)
17685         {
17686           /* A gruesome hack which is a result of the gruesome gas
17687              reloc handling.  What's worse, for COFF (as opposed to
17688              ECOFF), we might need yet another copy of reloc->address.
17689              See bfd_install_relocation.  */
17690           reloc->addend += reloc->address;
17691         }
17692     }
17693   else
17694     reloc->addend = fixp->fx_addnumber;
17695
17696   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
17697      entry to be used in the relocation's section offset.  */
17698   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17699     {
17700       reloc->address = reloc->addend;
17701       reloc->addend = 0;
17702     }
17703
17704   code = fixp->fx_r_type;
17705
17706   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
17707   if (reloc->howto == NULL)
17708     {
17709       as_bad_where (fixp->fx_file, fixp->fx_line,
17710                     _("Can not represent %s relocation in this object file format"),
17711                     bfd_get_reloc_code_name (code));
17712       retval[0] = NULL;
17713     }
17714
17715   return retval;
17716 }
17717
17718 /* Relax a machine dependent frag.  This returns the amount by which
17719    the current size of the frag should change.  */
17720
17721 int
17722 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
17723 {
17724   if (RELAX_BRANCH_P (fragp->fr_subtype))
17725     {
17726       offsetT old_var = fragp->fr_var;
17727
17728       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
17729
17730       return fragp->fr_var - old_var;
17731     }
17732
17733   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17734     {
17735       offsetT old_var = fragp->fr_var;
17736       offsetT new_var = 4;
17737
17738       if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
17739         new_var = relaxed_micromips_16bit_branch_length (fragp, sec, TRUE);
17740       if (new_var == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
17741         new_var = relaxed_micromips_32bit_branch_length (fragp, sec, TRUE);
17742       fragp->fr_var = new_var;
17743
17744       return new_var - old_var;
17745     }
17746
17747   if (! RELAX_MIPS16_P (fragp->fr_subtype))
17748     return 0;
17749
17750   if (mips16_extended_frag (fragp, NULL, stretch))
17751     {
17752       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17753         return 0;
17754       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
17755       return 2;
17756     }
17757   else
17758     {
17759       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17760         return 0;
17761       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
17762       return -2;
17763     }
17764
17765   return 0;
17766 }
17767
17768 /* Convert a machine dependent frag.  */
17769
17770 void
17771 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
17772 {
17773   if (RELAX_BRANCH_P (fragp->fr_subtype))
17774     {
17775       bfd_byte *buf;
17776       unsigned long insn;
17777       expressionS exp;
17778       fixS *fixp;
17779
17780       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
17781
17782       if (target_big_endian)
17783         insn = bfd_getb32 (buf);
17784       else
17785         insn = bfd_getl32 (buf);
17786
17787       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
17788         {
17789           /* We generate a fixup instead of applying it right now
17790              because, if there are linker relaxations, we're going to
17791              need the relocations.  */
17792           exp.X_op = O_symbol;
17793           exp.X_add_symbol = fragp->fr_symbol;
17794           exp.X_add_number = fragp->fr_offset;
17795
17796           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
17797                               4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
17798           fixp->fx_file = fragp->fr_file;
17799           fixp->fx_line = fragp->fr_line;
17800
17801           md_number_to_chars ((char *) buf, insn, 4);
17802           buf += 4;
17803         }
17804       else
17805         {
17806           int i;
17807
17808           as_warn_where (fragp->fr_file, fragp->fr_line,
17809                          _("Relaxed out-of-range branch into a jump"));
17810
17811           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
17812             goto uncond;
17813
17814           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
17815             {
17816               /* Reverse the branch.  */
17817               switch ((insn >> 28) & 0xf)
17818                 {
17819                 case 4:
17820                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
17821                      have the condition reversed by tweaking a single
17822                      bit, and their opcodes all have 0x4???????.  */
17823                   gas_assert ((insn & 0xf1000000) == 0x41000000);
17824                   insn ^= 0x00010000;
17825                   break;
17826
17827                 case 0:
17828                   /* bltz       0x04000000      bgez    0x04010000
17829                      bltzal     0x04100000      bgezal  0x04110000  */
17830                   gas_assert ((insn & 0xfc0e0000) == 0x04000000);
17831                   insn ^= 0x00010000;
17832                   break;
17833
17834                 case 1:
17835                   /* beq        0x10000000      bne     0x14000000
17836                      blez       0x18000000      bgtz    0x1c000000  */
17837                   insn ^= 0x04000000;
17838                   break;
17839
17840                 default:
17841                   abort ();
17842                 }
17843             }
17844
17845           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
17846             {
17847               /* Clear the and-link bit.  */
17848               gas_assert ((insn & 0xfc1c0000) == 0x04100000);
17849
17850               /* bltzal         0x04100000      bgezal  0x04110000
17851                  bltzall        0x04120000      bgezall 0x04130000  */
17852               insn &= ~0x00100000;
17853             }
17854
17855           /* Branch over the branch (if the branch was likely) or the
17856              full jump (not likely case).  Compute the offset from the
17857              current instruction to branch to.  */
17858           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
17859             i = 16;
17860           else
17861             {
17862               /* How many bytes in instructions we've already emitted?  */
17863               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
17864               /* How many bytes in instructions from here to the end?  */
17865               i = fragp->fr_var - i;
17866             }
17867           /* Convert to instruction count.  */
17868           i >>= 2;
17869           /* Branch counts from the next instruction.  */
17870           i--;
17871           insn |= i;
17872           /* Branch over the jump.  */
17873           md_number_to_chars ((char *) buf, insn, 4);
17874           buf += 4;
17875
17876           /* nop */
17877           md_number_to_chars ((char *) buf, 0, 4);
17878           buf += 4;
17879
17880           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
17881             {
17882               /* beql $0, $0, 2f */
17883               insn = 0x50000000;
17884               /* Compute the PC offset from the current instruction to
17885                  the end of the variable frag.  */
17886               /* How many bytes in instructions we've already emitted?  */
17887               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
17888               /* How many bytes in instructions from here to the end?  */
17889               i = fragp->fr_var - i;
17890               /* Convert to instruction count.  */
17891               i >>= 2;
17892               /* Don't decrement i, because we want to branch over the
17893                  delay slot.  */
17894
17895               insn |= i;
17896               md_number_to_chars ((char *) buf, insn, 4);
17897               buf += 4;
17898
17899               md_number_to_chars ((char *) buf, 0, 4);
17900               buf += 4;
17901             }
17902
17903         uncond:
17904           if (mips_pic == NO_PIC)
17905             {
17906               /* j or jal.  */
17907               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
17908                       ? 0x0c000000 : 0x08000000);
17909               exp.X_op = O_symbol;
17910               exp.X_add_symbol = fragp->fr_symbol;
17911               exp.X_add_number = fragp->fr_offset;
17912
17913               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
17914                                   4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
17915               fixp->fx_file = fragp->fr_file;
17916               fixp->fx_line = fragp->fr_line;
17917
17918               md_number_to_chars ((char *) buf, insn, 4);
17919               buf += 4;
17920             }
17921           else
17922             {
17923               unsigned long at = RELAX_BRANCH_AT (fragp->fr_subtype);
17924
17925               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
17926               insn = HAVE_64BIT_ADDRESSES ? 0xdf800000 : 0x8f800000;
17927               insn |= at << OP_SH_RT;
17928               exp.X_op = O_symbol;
17929               exp.X_add_symbol = fragp->fr_symbol;
17930               exp.X_add_number = fragp->fr_offset;
17931
17932               if (fragp->fr_offset)
17933                 {
17934                   exp.X_add_symbol = make_expr_symbol (&exp);
17935                   exp.X_add_number = 0;
17936                 }
17937
17938               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
17939                                   4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
17940               fixp->fx_file = fragp->fr_file;
17941               fixp->fx_line = fragp->fr_line;
17942
17943               md_number_to_chars ((char *) buf, insn, 4);
17944               buf += 4;
17945
17946               if (mips_opts.isa == ISA_MIPS1)
17947                 {
17948                   /* nop */
17949                   md_number_to_chars ((char *) buf, 0, 4);
17950                   buf += 4;
17951                 }
17952
17953               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
17954               insn = HAVE_64BIT_ADDRESSES ? 0x64000000 : 0x24000000;
17955               insn |= at << OP_SH_RS | at << OP_SH_RT;
17956
17957               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
17958                                   4, &exp, FALSE, BFD_RELOC_LO16);
17959               fixp->fx_file = fragp->fr_file;
17960               fixp->fx_line = fragp->fr_line;
17961
17962               md_number_to_chars ((char *) buf, insn, 4);
17963               buf += 4;
17964
17965               /* j(al)r $at.  */
17966               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
17967                 insn = 0x0000f809;
17968               else
17969                 insn = 0x00000008;
17970               insn |= at << OP_SH_RS;
17971
17972               md_number_to_chars ((char *) buf, insn, 4);
17973               buf += 4;
17974             }
17975         }
17976
17977       gas_assert (buf == (bfd_byte *)fragp->fr_literal
17978               + fragp->fr_fix + fragp->fr_var);
17979
17980       fragp->fr_fix += fragp->fr_var;
17981
17982       return;
17983     }
17984
17985   /* Relax microMIPS branches.  */
17986   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17987     {
17988       bfd_byte *buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
17989       bfd_boolean compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
17990       bfd_boolean al = RELAX_MICROMIPS_LINK (fragp->fr_subtype);
17991       int type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
17992       bfd_boolean short_ds;
17993       unsigned long insn;
17994       expressionS exp;
17995       fixS *fixp;
17996
17997       exp.X_op = O_symbol;
17998       exp.X_add_symbol = fragp->fr_symbol;
17999       exp.X_add_number = fragp->fr_offset;
18000
18001       fragp->fr_fix += fragp->fr_var;
18002
18003       /* Handle 16-bit branches that fit or are forced to fit.  */
18004       if (type != 0 && !RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
18005         {
18006           /* We generate a fixup instead of applying it right now,
18007              because if there is linker relaxation, we're going to
18008              need the relocations.  */
18009           if (type == 'D')
18010             fixp = fix_new_exp (fragp,
18011                                 buf - (bfd_byte *) fragp->fr_literal,
18012                                 2, &exp, TRUE,
18013                                 BFD_RELOC_MICROMIPS_10_PCREL_S1);
18014           else if (type == 'E')
18015             fixp = fix_new_exp (fragp,
18016                                 buf - (bfd_byte *) fragp->fr_literal,
18017                                 2, &exp, TRUE,
18018                                 BFD_RELOC_MICROMIPS_7_PCREL_S1);
18019           else
18020             abort ();
18021
18022           fixp->fx_file = fragp->fr_file;
18023           fixp->fx_line = fragp->fr_line;
18024
18025           /* These relocations can have an addend that won't fit in
18026              2 octets.  */
18027           fixp->fx_no_overflow = 1;
18028
18029           return;
18030         }
18031
18032       /* Handle 32-bit branches that fit or are forced to fit.  */
18033       if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
18034           || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
18035         {
18036           /* We generate a fixup instead of applying it right now,
18037              because if there is linker relaxation, we're going to
18038              need the relocations.  */
18039           fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
18040                               4, &exp, TRUE, BFD_RELOC_MICROMIPS_16_PCREL_S1);
18041           fixp->fx_file = fragp->fr_file;
18042           fixp->fx_line = fragp->fr_line;
18043
18044           if (type == 0)
18045             return;
18046         }
18047
18048       /* Relax 16-bit branches to 32-bit branches.  */
18049       if (type != 0)
18050         {
18051           if (target_big_endian)
18052             insn = bfd_getb16 (buf);
18053           else
18054             insn = bfd_getl16 (buf);
18055
18056           if ((insn & 0xfc00) == 0xcc00)                /* b16  */
18057             insn = 0x94000000;                          /* beq  */
18058           else if ((insn & 0xdc00) == 0x8c00)           /* beqz16/bnez16  */
18059             {
18060               unsigned long regno;
18061
18062               regno = (insn >> MICROMIPSOP_SH_MD) & MICROMIPSOP_MASK_MD;
18063               regno = micromips_to_32_reg_d_map [regno];
18064               insn = ((insn & 0x2000) << 16) | 0x94000000;      /* beq/bne  */
18065               insn |= regno << MICROMIPSOP_SH_RS;
18066             }
18067           else
18068             abort ();
18069
18070           /* Nothing else to do, just write it out.  */
18071           if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
18072               || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
18073             {
18074               md_number_to_chars ((char *) buf, insn >> 16, 2);
18075               buf += 2;
18076               md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18077               buf += 2;
18078
18079               gas_assert (buf == ((bfd_byte *) fragp->fr_literal
18080                                   + fragp->fr_fix));
18081               return;
18082             }
18083         }
18084       else
18085         {
18086           unsigned long next;
18087
18088           if (target_big_endian)
18089             {
18090               insn = bfd_getb16 (buf);
18091               next = bfd_getb16 (buf + 2);
18092             }
18093           else
18094             {
18095               insn = bfd_getl16 (buf);
18096               next = bfd_getl16 (buf + 2);
18097             }
18098           insn = (insn << 16) | next;
18099         }
18100
18101       /* Relax 32-bit branches to a sequence of instructions.  */
18102       as_warn_where (fragp->fr_file, fragp->fr_line,
18103                      _("Relaxed out-of-range branch into a jump"));
18104
18105       /* Set the short-delay-slot bit.  */
18106       short_ds = al && (insn & 0x02000000) != 0;
18107
18108       if (!RELAX_MICROMIPS_UNCOND (fragp->fr_subtype))
18109         {
18110           symbolS *l;
18111
18112           /* Reverse the branch.  */
18113           if ((insn & 0xfc000000) == 0x94000000                 /* beq  */
18114               || (insn & 0xfc000000) == 0xb4000000)             /* bne  */
18115             insn ^= 0x20000000;
18116           else if ((insn & 0xffe00000) == 0x40000000            /* bltz  */
18117                    || (insn & 0xffe00000) == 0x40400000         /* bgez  */
18118                    || (insn & 0xffe00000) == 0x40800000         /* blez  */
18119                    || (insn & 0xffe00000) == 0x40c00000         /* bgtz  */
18120                    || (insn & 0xffe00000) == 0x40a00000         /* bnezc  */
18121                    || (insn & 0xffe00000) == 0x40e00000         /* beqzc  */
18122                    || (insn & 0xffe00000) == 0x40200000         /* bltzal  */
18123                    || (insn & 0xffe00000) == 0x40600000         /* bgezal  */
18124                    || (insn & 0xffe00000) == 0x42200000         /* bltzals  */
18125                    || (insn & 0xffe00000) == 0x42600000)        /* bgezals  */
18126             insn ^= 0x00400000;
18127           else if ((insn & 0xffe30000) == 0x43800000            /* bc1f  */
18128                    || (insn & 0xffe30000) == 0x43a00000         /* bc1t  */
18129                    || (insn & 0xffe30000) == 0x42800000         /* bc2f  */
18130                    || (insn & 0xffe30000) == 0x42a00000)        /* bc2t  */
18131             insn ^= 0x00200000;
18132           else
18133             abort ();
18134
18135           if (al)
18136             {
18137               /* Clear the and-link and short-delay-slot bits.  */
18138               gas_assert ((insn & 0xfda00000) == 0x40200000);
18139
18140               /* bltzal  0x40200000     bgezal  0x40600000  */
18141               /* bltzals 0x42200000     bgezals 0x42600000  */
18142               insn &= ~0x02200000;
18143             }
18144
18145           /* Make a label at the end for use with the branch.  */
18146           l = symbol_new (micromips_label_name (), asec, fragp->fr_fix, fragp);
18147           micromips_label_inc ();
18148 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
18149           if (IS_ELF)
18150             S_SET_OTHER (l, ELF_ST_SET_MICROMIPS (S_GET_OTHER (l)));
18151 #endif
18152
18153           /* Refer to it.  */
18154           fixp = fix_new (fragp, buf - (bfd_byte *) fragp->fr_literal,
18155                           4, l, 0, TRUE, BFD_RELOC_MICROMIPS_16_PCREL_S1);
18156           fixp->fx_file = fragp->fr_file;
18157           fixp->fx_line = fragp->fr_line;
18158
18159           /* Branch over the jump.  */
18160           md_number_to_chars ((char *) buf, insn >> 16, 2);
18161           buf += 2;
18162           md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18163           buf += 2;
18164
18165           if (!compact)
18166             {
18167               /* nop  */
18168               insn = 0x0c00;
18169               md_number_to_chars ((char *) buf, insn, 2);
18170               buf += 2;
18171             }
18172         }
18173
18174       if (mips_pic == NO_PIC)
18175         {
18176           unsigned long jal = short_ds ? 0x74000000 : 0xf4000000; /* jal/s  */
18177
18178           /* j/jal/jals <sym>  R_MICROMIPS_26_S1  */
18179           insn = al ? jal : 0xd4000000;
18180
18181           fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
18182                               4, &exp, FALSE, BFD_RELOC_MICROMIPS_JMP);
18183           fixp->fx_file = fragp->fr_file;
18184           fixp->fx_line = fragp->fr_line;
18185
18186           md_number_to_chars ((char *) buf, insn >> 16, 2);
18187           buf += 2;
18188           md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18189           buf += 2;
18190
18191           if (compact)
18192             {
18193               /* nop  */
18194               insn = 0x0c00;
18195               md_number_to_chars ((char *) buf, insn, 2);
18196               buf += 2;
18197             }
18198         }
18199       else
18200         {
18201           unsigned long at = RELAX_MICROMIPS_AT (fragp->fr_subtype);
18202           unsigned long jalr = short_ds ? 0x45e0 : 0x45c0;      /* jalr/s  */
18203           unsigned long jr = compact ? 0x45a0 : 0x4580;         /* jr/c  */
18204
18205           /* lw/ld $at, <sym>($gp)  R_MICROMIPS_GOT16  */
18206           insn = HAVE_64BIT_ADDRESSES ? 0xdc1c0000 : 0xfc1c0000;
18207           insn |= at << MICROMIPSOP_SH_RT;
18208
18209           if (exp.X_add_number)
18210             {
18211               exp.X_add_symbol = make_expr_symbol (&exp);
18212               exp.X_add_number = 0;
18213             }
18214
18215           fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
18216                               4, &exp, FALSE, BFD_RELOC_MICROMIPS_GOT16);
18217           fixp->fx_file = fragp->fr_file;
18218           fixp->fx_line = fragp->fr_line;
18219
18220           md_number_to_chars ((char *) buf, insn >> 16, 2);
18221           buf += 2;
18222           md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18223           buf += 2;
18224
18225           /* d/addiu $at, $at, <sym>  R_MICROMIPS_LO16  */
18226           insn = HAVE_64BIT_ADDRESSES ? 0x5c000000 : 0x30000000;
18227           insn |= at << MICROMIPSOP_SH_RT | at << MICROMIPSOP_SH_RS;
18228
18229           fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
18230                               4, &exp, FALSE, BFD_RELOC_MICROMIPS_LO16);
18231           fixp->fx_file = fragp->fr_file;
18232           fixp->fx_line = fragp->fr_line;
18233
18234           md_number_to_chars ((char *) buf, insn >> 16, 2);
18235           buf += 2;
18236           md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18237           buf += 2;
18238
18239           /* jr/jrc/jalr/jalrs $at  */
18240           insn = al ? jalr : jr;
18241           insn |= at << MICROMIPSOP_SH_MJ;
18242
18243           md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18244           buf += 2;
18245         }
18246
18247       gas_assert (buf == (bfd_byte *) fragp->fr_literal + fragp->fr_fix);
18248       return;
18249     }
18250
18251   if (RELAX_MIPS16_P (fragp->fr_subtype))
18252     {
18253       int type;
18254       const struct mips16_immed_operand *op;
18255       bfd_boolean small, ext;
18256       offsetT val;
18257       bfd_byte *buf;
18258       unsigned long insn;
18259       bfd_boolean use_extend;
18260       unsigned short extend;
18261
18262       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
18263       op = mips16_immed_operands;
18264       while (op->type != type)
18265         ++op;
18266
18267       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
18268         {
18269           small = FALSE;
18270           ext = TRUE;
18271         }
18272       else
18273         {
18274           small = TRUE;
18275           ext = FALSE;
18276         }
18277
18278       val = resolve_symbol_value (fragp->fr_symbol);
18279       if (op->pcrel)
18280         {
18281           addressT addr;
18282
18283           addr = fragp->fr_address + fragp->fr_fix;
18284
18285           /* The rules for the base address of a PC relative reloc are
18286              complicated; see mips16_extended_frag.  */
18287           if (type == 'p' || type == 'q')
18288             {
18289               addr += 2;
18290               if (ext)
18291                 addr += 2;
18292               /* Ignore the low bit in the target, since it will be
18293                  set for a text label.  */
18294               if ((val & 1) != 0)
18295                 --val;
18296             }
18297           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
18298             addr -= 4;
18299           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
18300             addr -= 2;
18301
18302           addr &= ~ (addressT) ((1 << op->shift) - 1);
18303           val -= addr;
18304
18305           /* Make sure the section winds up with the alignment we have
18306              assumed.  */
18307           if (op->shift > 0)
18308             record_alignment (asec, op->shift);
18309         }
18310
18311       if (ext
18312           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
18313               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
18314         as_warn_where (fragp->fr_file, fragp->fr_line,
18315                        _("extended instruction in delay slot"));
18316
18317       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
18318
18319       if (target_big_endian)
18320         insn = bfd_getb16 (buf);
18321       else
18322         insn = bfd_getl16 (buf);
18323
18324       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
18325                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
18326                     small, ext, &insn, &use_extend, &extend);
18327
18328       if (use_extend)
18329         {
18330           md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
18331           fragp->fr_fix += 2;
18332           buf += 2;
18333         }
18334
18335       md_number_to_chars ((char *) buf, insn, 2);
18336       fragp->fr_fix += 2;
18337       buf += 2;
18338     }
18339   else
18340     {
18341       relax_substateT subtype = fragp->fr_subtype;
18342       bfd_boolean second_longer = (subtype & RELAX_SECOND_LONGER) != 0;
18343       bfd_boolean use_second = (subtype & RELAX_USE_SECOND) != 0;
18344       int first, second;
18345       fixS *fixp;
18346
18347       first = RELAX_FIRST (subtype);
18348       second = RELAX_SECOND (subtype);
18349       fixp = (fixS *) fragp->fr_opcode;
18350
18351       /* If the delay slot chosen does not match the size of the instruction,
18352          then emit a warning.  */
18353       if ((!use_second && (subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0)
18354            || (use_second && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0))
18355         {
18356           relax_substateT s;
18357           const char *msg;
18358
18359           s = subtype & (RELAX_DELAY_SLOT_16BIT
18360                          | RELAX_DELAY_SLOT_SIZE_FIRST
18361                          | RELAX_DELAY_SLOT_SIZE_SECOND);
18362           msg = macro_warning (s);
18363           if (msg != NULL)
18364             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18365           subtype &= ~s;
18366         }
18367
18368       /* Possibly emit a warning if we've chosen the longer option.  */
18369       if (use_second == second_longer)
18370         {
18371           relax_substateT s;
18372           const char *msg;
18373
18374           s = (subtype
18375                & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT));
18376           msg = macro_warning (s);
18377           if (msg != NULL)
18378             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18379           subtype &= ~s;
18380         }
18381
18382       /* Go through all the fixups for the first sequence.  Disable them
18383          (by marking them as done) if we're going to use the second
18384          sequence instead.  */
18385       while (fixp
18386              && fixp->fx_frag == fragp
18387              && fixp->fx_where < fragp->fr_fix - second)
18388         {
18389           if (subtype & RELAX_USE_SECOND)
18390             fixp->fx_done = 1;
18391           fixp = fixp->fx_next;
18392         }
18393
18394       /* Go through the fixups for the second sequence.  Disable them if
18395          we're going to use the first sequence, otherwise adjust their
18396          addresses to account for the relaxation.  */
18397       while (fixp && fixp->fx_frag == fragp)
18398         {
18399           if (subtype & RELAX_USE_SECOND)
18400             fixp->fx_where -= first;
18401           else
18402             fixp->fx_done = 1;
18403           fixp = fixp->fx_next;
18404         }
18405
18406       /* Now modify the frag contents.  */
18407       if (subtype & RELAX_USE_SECOND)
18408         {
18409           char *start;
18410
18411           start = fragp->fr_literal + fragp->fr_fix - first - second;
18412           memmove (start, start + first, second);
18413           fragp->fr_fix -= first;
18414         }
18415       else
18416         fragp->fr_fix -= second;
18417     }
18418 }
18419
18420 #ifdef OBJ_ELF
18421
18422 /* This function is called after the relocs have been generated.
18423    We've been storing mips16 text labels as odd.  Here we convert them
18424    back to even for the convenience of the debugger.  */
18425
18426 void
18427 mips_frob_file_after_relocs (void)
18428 {
18429   asymbol **syms;
18430   unsigned int count, i;
18431
18432   if (!IS_ELF)
18433     return;
18434
18435   syms = bfd_get_outsymbols (stdoutput);
18436   count = bfd_get_symcount (stdoutput);
18437   for (i = 0; i < count; i++, syms++)
18438     if (ELF_ST_IS_COMPRESSED (elf_symbol (*syms)->internal_elf_sym.st_other)
18439         && ((*syms)->value & 1) != 0)
18440       {
18441         (*syms)->value &= ~1;
18442         /* If the symbol has an odd size, it was probably computed
18443            incorrectly, so adjust that as well.  */
18444         if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
18445           ++elf_symbol (*syms)->internal_elf_sym.st_size;
18446       }
18447 }
18448
18449 #endif
18450
18451 /* This function is called whenever a label is defined, including fake
18452    labels instantiated off the dot special symbol.  It is used when
18453    handling branch delays; if a branch has a label, we assume we cannot
18454    move it.  This also bumps the value of the symbol by 1 in compressed
18455    code.  */
18456
18457 void
18458 mips_record_label (symbolS *sym)
18459 {
18460   segment_info_type *si = seg_info (now_seg);
18461   struct insn_label_list *l;
18462
18463   if (free_insn_labels == NULL)
18464     l = (struct insn_label_list *) xmalloc (sizeof *l);
18465   else
18466     {
18467       l = free_insn_labels;
18468       free_insn_labels = l->next;
18469     }
18470
18471   l->label = sym;
18472   l->next = si->label_list;
18473   si->label_list = l;
18474 }
18475
18476 /* This function is called as tc_frob_label() whenever a label is defined
18477    and adds a DWARF-2 record we only want for true labels.  */
18478
18479 void
18480 mips_define_label (symbolS *sym)
18481 {
18482   mips_record_label (sym);
18483 #ifdef OBJ_ELF
18484   dwarf2_emit_label (sym);
18485 #endif
18486 }
18487 \f
18488 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
18489
18490 /* Some special processing for a MIPS ELF file.  */
18491
18492 void
18493 mips_elf_final_processing (void)
18494 {
18495   /* Write out the register information.  */
18496   if (mips_abi != N64_ABI)
18497     {
18498       Elf32_RegInfo s;
18499
18500       s.ri_gprmask = mips_gprmask;
18501       s.ri_cprmask[0] = mips_cprmask[0];
18502       s.ri_cprmask[1] = mips_cprmask[1];
18503       s.ri_cprmask[2] = mips_cprmask[2];
18504       s.ri_cprmask[3] = mips_cprmask[3];
18505       /* The gp_value field is set by the MIPS ELF backend.  */
18506
18507       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
18508                                        ((Elf32_External_RegInfo *)
18509                                         mips_regmask_frag));
18510     }
18511   else
18512     {
18513       Elf64_Internal_RegInfo s;
18514
18515       s.ri_gprmask = mips_gprmask;
18516       s.ri_pad = 0;
18517       s.ri_cprmask[0] = mips_cprmask[0];
18518       s.ri_cprmask[1] = mips_cprmask[1];
18519       s.ri_cprmask[2] = mips_cprmask[2];
18520       s.ri_cprmask[3] = mips_cprmask[3];
18521       /* The gp_value field is set by the MIPS ELF backend.  */
18522
18523       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
18524                                        ((Elf64_External_RegInfo *)
18525                                         mips_regmask_frag));
18526     }
18527
18528   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
18529      sort of BFD interface for this.  */
18530   if (mips_any_noreorder)
18531     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
18532   if (mips_pic != NO_PIC)
18533     {
18534       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
18535       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18536     }
18537   if (mips_abicalls)
18538     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18539
18540   /* Set MIPS ELF flags for ASEs.  */
18541   /* We may need to define a new flag for DSP ASE, and set this flag when
18542      file_ase_dsp is true.  */
18543   /* Same for DSP R2.  */
18544   /* We may need to define a new flag for MT ASE, and set this flag when
18545      file_ase_mt is true.  */
18546   if (file_ase_mips16)
18547     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
18548   if (file_ase_micromips)
18549     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MICROMIPS;
18550 #if 0 /* XXX FIXME */
18551   if (file_ase_mips3d)
18552     elf_elfheader (stdoutput)->e_flags |= ???;
18553 #endif
18554   if (file_ase_mdmx)
18555     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
18556
18557   /* Set the MIPS ELF ABI flags.  */
18558   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
18559     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
18560   else if (mips_abi == O64_ABI)
18561     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
18562   else if (mips_abi == EABI_ABI)
18563     {
18564       if (!file_mips_gp32)
18565         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
18566       else
18567         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
18568     }
18569   else if (mips_abi == N32_ABI)
18570     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
18571
18572   /* Nothing to do for N64_ABI.  */
18573
18574   if (mips_32bitmode)
18575     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
18576
18577 #if 0 /* XXX FIXME */
18578   /* 32 bit code with 64 bit FP registers.  */
18579   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
18580     elf_elfheader (stdoutput)->e_flags |= ???;
18581 #endif
18582 }
18583
18584 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
18585 \f
18586 typedef struct proc {
18587   symbolS *func_sym;
18588   symbolS *func_end_sym;
18589   unsigned long reg_mask;
18590   unsigned long reg_offset;
18591   unsigned long fpreg_mask;
18592   unsigned long fpreg_offset;
18593   unsigned long frame_offset;
18594   unsigned long frame_reg;
18595   unsigned long pc_reg;
18596 } procS;
18597
18598 static procS cur_proc;
18599 static procS *cur_proc_ptr;
18600 static int numprocs;
18601
18602 /* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1", a microMIPS nop
18603    as "2", and a normal nop as "0".  */
18604
18605 #define NOP_OPCODE_MIPS         0
18606 #define NOP_OPCODE_MIPS16       1
18607 #define NOP_OPCODE_MICROMIPS    2
18608
18609 char
18610 mips_nop_opcode (void)
18611 {
18612   if (seg_info (now_seg)->tc_segment_info_data.micromips)
18613     return NOP_OPCODE_MICROMIPS;
18614   else if (seg_info (now_seg)->tc_segment_info_data.mips16)
18615     return NOP_OPCODE_MIPS16;
18616   else
18617     return NOP_OPCODE_MIPS;
18618 }
18619
18620 /* Fill in an rs_align_code fragment.  Unlike elsewhere we want to use
18621    32-bit microMIPS NOPs here (if applicable).  */
18622
18623 void
18624 mips_handle_align (fragS *fragp)
18625 {
18626   char nop_opcode;
18627   char *p;
18628   int bytes, size, excess;
18629   valueT opcode;
18630
18631   if (fragp->fr_type != rs_align_code)
18632     return;
18633
18634   p = fragp->fr_literal + fragp->fr_fix;
18635   nop_opcode = *p;
18636   switch (nop_opcode)
18637     {
18638     case NOP_OPCODE_MICROMIPS:
18639       opcode = micromips_nop32_insn.insn_opcode;
18640       size = 4;
18641       break;
18642     case NOP_OPCODE_MIPS16:
18643       opcode = mips16_nop_insn.insn_opcode;
18644       size = 2;
18645       break;
18646     case NOP_OPCODE_MIPS:
18647     default:
18648       opcode = nop_insn.insn_opcode;
18649       size = 4;
18650       break;
18651     }
18652
18653   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
18654   excess = bytes % size;
18655
18656   /* Handle the leading part if we're not inserting a whole number of
18657      instructions, and make it the end of the fixed part of the frag.
18658      Try to fit in a short microMIPS NOP if applicable and possible,
18659      and use zeroes otherwise.  */
18660   gas_assert (excess < 4);
18661   fragp->fr_fix += excess;
18662   switch (excess)
18663     {
18664     case 3:
18665       *p++ = '\0';
18666       /* Fall through.  */
18667     case 2:
18668       if (nop_opcode == NOP_OPCODE_MICROMIPS)
18669         {
18670           md_number_to_chars (p, micromips_nop16_insn.insn_opcode, 2);
18671           p += 2;
18672           break;
18673         }
18674       *p++ = '\0';
18675       /* Fall through.  */
18676     case 1:
18677       *p++ = '\0';
18678       /* Fall through.  */
18679     case 0:
18680       break;
18681     }
18682
18683   md_number_to_chars (p, opcode, size);
18684   fragp->fr_var = size;
18685 }
18686
18687 static void
18688 md_obj_begin (void)
18689 {
18690 }
18691
18692 static void
18693 md_obj_end (void)
18694 {
18695   /* Check for premature end, nesting errors, etc.  */
18696   if (cur_proc_ptr)
18697     as_warn (_("missing .end at end of assembly"));
18698 }
18699
18700 static long
18701 get_number (void)
18702 {
18703   int negative = 0;
18704   long val = 0;
18705
18706   if (*input_line_pointer == '-')
18707     {
18708       ++input_line_pointer;
18709       negative = 1;
18710     }
18711   if (!ISDIGIT (*input_line_pointer))
18712     as_bad (_("expected simple number"));
18713   if (input_line_pointer[0] == '0')
18714     {
18715       if (input_line_pointer[1] == 'x')
18716         {
18717           input_line_pointer += 2;
18718           while (ISXDIGIT (*input_line_pointer))
18719             {
18720               val <<= 4;
18721               val |= hex_value (*input_line_pointer++);
18722             }
18723           return negative ? -val : val;
18724         }
18725       else
18726         {
18727           ++input_line_pointer;
18728           while (ISDIGIT (*input_line_pointer))
18729             {
18730               val <<= 3;
18731               val |= *input_line_pointer++ - '0';
18732             }
18733           return negative ? -val : val;
18734         }
18735     }
18736   if (!ISDIGIT (*input_line_pointer))
18737     {
18738       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
18739               *input_line_pointer, *input_line_pointer);
18740       as_warn (_("invalid number"));
18741       return -1;
18742     }
18743   while (ISDIGIT (*input_line_pointer))
18744     {
18745       val *= 10;
18746       val += *input_line_pointer++ - '0';
18747     }
18748   return negative ? -val : val;
18749 }
18750
18751 /* The .file directive; just like the usual .file directive, but there
18752    is an initial number which is the ECOFF file index.  In the non-ECOFF
18753    case .file implies DWARF-2.  */
18754
18755 static void
18756 s_mips_file (int x ATTRIBUTE_UNUSED)
18757 {
18758   static int first_file_directive = 0;
18759
18760   if (ECOFF_DEBUGGING)
18761     {
18762       get_number ();
18763       s_app_file (0);
18764     }
18765   else
18766     {
18767       char *filename;
18768
18769       filename = dwarf2_directive_file (0);
18770
18771       /* Versions of GCC up to 3.1 start files with a ".file"
18772          directive even for stabs output.  Make sure that this
18773          ".file" is handled.  Note that you need a version of GCC
18774          after 3.1 in order to support DWARF-2 on MIPS.  */
18775       if (filename != NULL && ! first_file_directive)
18776         {
18777           (void) new_logical_line (filename, -1);
18778           s_app_file_string (filename, 0);
18779         }
18780       first_file_directive = 1;
18781     }
18782 }
18783
18784 /* The .loc directive, implying DWARF-2.  */
18785
18786 static void
18787 s_mips_loc (int x ATTRIBUTE_UNUSED)
18788 {
18789   if (!ECOFF_DEBUGGING)
18790     dwarf2_directive_loc (0);
18791 }
18792
18793 /* The .end directive.  */
18794
18795 static void
18796 s_mips_end (int x ATTRIBUTE_UNUSED)
18797 {
18798   symbolS *p;
18799
18800   /* Following functions need their own .frame and .cprestore directives.  */
18801   mips_frame_reg_valid = 0;
18802   mips_cprestore_valid = 0;
18803
18804   if (!is_end_of_line[(unsigned char) *input_line_pointer])
18805     {
18806       p = get_symbol ();
18807       demand_empty_rest_of_line ();
18808     }
18809   else
18810     p = NULL;
18811
18812   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
18813     as_warn (_(".end not in text section"));
18814
18815   if (!cur_proc_ptr)
18816     {
18817       as_warn (_(".end directive without a preceding .ent directive."));
18818       demand_empty_rest_of_line ();
18819       return;
18820     }
18821
18822   if (p != NULL)
18823     {
18824       gas_assert (S_GET_NAME (p));
18825       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
18826         as_warn (_(".end symbol does not match .ent symbol."));
18827
18828       if (debug_type == DEBUG_STABS)
18829         stabs_generate_asm_endfunc (S_GET_NAME (p),
18830                                     S_GET_NAME (p));
18831     }
18832   else
18833     as_warn (_(".end directive missing or unknown symbol"));
18834
18835 #ifdef OBJ_ELF
18836   /* Create an expression to calculate the size of the function.  */
18837   if (p && cur_proc_ptr)
18838     {
18839       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
18840       expressionS *exp = xmalloc (sizeof (expressionS));
18841
18842       obj->size = exp;
18843       exp->X_op = O_subtract;
18844       exp->X_add_symbol = symbol_temp_new_now ();
18845       exp->X_op_symbol = p;
18846       exp->X_add_number = 0;
18847
18848       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
18849     }
18850
18851   /* Generate a .pdr section.  */
18852   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
18853     {
18854       segT saved_seg = now_seg;
18855       subsegT saved_subseg = now_subseg;
18856       expressionS exp;
18857       char *fragp;
18858
18859 #ifdef md_flush_pending_output
18860       md_flush_pending_output ();
18861 #endif
18862
18863       gas_assert (pdr_seg);
18864       subseg_set (pdr_seg, 0);
18865
18866       /* Write the symbol.  */
18867       exp.X_op = O_symbol;
18868       exp.X_add_symbol = p;
18869       exp.X_add_number = 0;
18870       emit_expr (&exp, 4);
18871
18872       fragp = frag_more (7 * 4);
18873
18874       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
18875       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
18876       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
18877       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
18878       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
18879       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
18880       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
18881
18882       subseg_set (saved_seg, saved_subseg);
18883     }
18884 #endif /* OBJ_ELF */
18885
18886   cur_proc_ptr = NULL;
18887 }
18888
18889 /* The .aent and .ent directives.  */
18890
18891 static void
18892 s_mips_ent (int aent)
18893 {
18894   symbolS *symbolP;
18895
18896   symbolP = get_symbol ();
18897   if (*input_line_pointer == ',')
18898     ++input_line_pointer;
18899   SKIP_WHITESPACE ();
18900   if (ISDIGIT (*input_line_pointer)
18901       || *input_line_pointer == '-')
18902     get_number ();
18903
18904   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
18905     as_warn (_(".ent or .aent not in text section."));
18906
18907   if (!aent && cur_proc_ptr)
18908     as_warn (_("missing .end"));
18909
18910   if (!aent)
18911     {
18912       /* This function needs its own .frame and .cprestore directives.  */
18913       mips_frame_reg_valid = 0;
18914       mips_cprestore_valid = 0;
18915
18916       cur_proc_ptr = &cur_proc;
18917       memset (cur_proc_ptr, '\0', sizeof (procS));
18918
18919       cur_proc_ptr->func_sym = symbolP;
18920
18921       ++numprocs;
18922
18923       if (debug_type == DEBUG_STABS)
18924         stabs_generate_asm_func (S_GET_NAME (symbolP),
18925                                  S_GET_NAME (symbolP));
18926     }
18927
18928   symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
18929
18930   demand_empty_rest_of_line ();
18931 }
18932
18933 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
18934    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
18935    s_mips_frame is used so that we can set the PDR information correctly.
18936    We can't use the ecoff routines because they make reference to the ecoff
18937    symbol table (in the mdebug section).  */
18938
18939 static void
18940 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
18941 {
18942 #ifdef OBJ_ELF
18943   if (IS_ELF && !ECOFF_DEBUGGING)
18944     {
18945       long val;
18946
18947       if (cur_proc_ptr == (procS *) NULL)
18948         {
18949           as_warn (_(".frame outside of .ent"));
18950           demand_empty_rest_of_line ();
18951           return;
18952         }
18953
18954       cur_proc_ptr->frame_reg = tc_get_register (1);
18955
18956       SKIP_WHITESPACE ();
18957       if (*input_line_pointer++ != ','
18958           || get_absolute_expression_and_terminator (&val) != ',')
18959         {
18960           as_warn (_("Bad .frame directive"));
18961           --input_line_pointer;
18962           demand_empty_rest_of_line ();
18963           return;
18964         }
18965
18966       cur_proc_ptr->frame_offset = val;
18967       cur_proc_ptr->pc_reg = tc_get_register (0);
18968
18969       demand_empty_rest_of_line ();
18970     }
18971   else
18972 #endif /* OBJ_ELF */
18973     s_ignore (ignore);
18974 }
18975
18976 /* The .fmask and .mask directives. If the mdebug section is present
18977    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
18978    embedded targets, s_mips_mask is used so that we can set the PDR
18979    information correctly. We can't use the ecoff routines because they
18980    make reference to the ecoff symbol table (in the mdebug section).  */
18981
18982 static void
18983 s_mips_mask (int reg_type)
18984 {
18985 #ifdef OBJ_ELF
18986   if (IS_ELF && !ECOFF_DEBUGGING)
18987     {
18988       long mask, off;
18989
18990       if (cur_proc_ptr == (procS *) NULL)
18991         {
18992           as_warn (_(".mask/.fmask outside of .ent"));
18993           demand_empty_rest_of_line ();
18994           return;
18995         }
18996
18997       if (get_absolute_expression_and_terminator (&mask) != ',')
18998         {
18999           as_warn (_("Bad .mask/.fmask directive"));
19000           --input_line_pointer;
19001           demand_empty_rest_of_line ();
19002           return;
19003         }
19004
19005       off = get_absolute_expression ();
19006
19007       if (reg_type == 'F')
19008         {
19009           cur_proc_ptr->fpreg_mask = mask;
19010           cur_proc_ptr->fpreg_offset = off;
19011         }
19012       else
19013         {
19014           cur_proc_ptr->reg_mask = mask;
19015           cur_proc_ptr->reg_offset = off;
19016         }
19017
19018       demand_empty_rest_of_line ();
19019     }
19020   else
19021 #endif /* OBJ_ELF */
19022     s_ignore (reg_type);
19023 }
19024
19025 /* A table describing all the processors gas knows about.  Names are
19026    matched in the order listed.
19027
19028    To ease comparison, please keep this table in the same order as
19029    gcc's mips_cpu_info_table[].  */
19030 static const struct mips_cpu_info mips_cpu_info_table[] =
19031 {
19032   /* Entries for generic ISAs */
19033   { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
19034   { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
19035   { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
19036   { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
19037   { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
19038   { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
19039   { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
19040   { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
19041   { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
19042
19043   /* MIPS I */
19044   { "r3000",          0,                        ISA_MIPS1,      CPU_R3000 },
19045   { "r2000",          0,                        ISA_MIPS1,      CPU_R3000 },
19046   { "r3900",          0,                        ISA_MIPS1,      CPU_R3900 },
19047
19048   /* MIPS II */
19049   { "r6000",          0,                        ISA_MIPS2,      CPU_R6000 },
19050
19051   /* MIPS III */
19052   { "r4000",          0,                        ISA_MIPS3,      CPU_R4000 },
19053   { "r4010",          0,                        ISA_MIPS2,      CPU_R4010 },
19054   { "vr4100",         0,                        ISA_MIPS3,      CPU_VR4100 },
19055   { "vr4111",         0,                        ISA_MIPS3,      CPU_R4111 },
19056   { "vr4120",         0,                        ISA_MIPS3,      CPU_VR4120 },
19057   { "vr4130",         0,                        ISA_MIPS3,      CPU_VR4120 },
19058   { "vr4181",         0,                        ISA_MIPS3,      CPU_R4111 },
19059   { "vr4300",         0,                        ISA_MIPS3,      CPU_R4300 },
19060   { "r4400",          0,                        ISA_MIPS3,      CPU_R4400 },
19061   { "r4600",          0,                        ISA_MIPS3,      CPU_R4600 },
19062   { "orion",          0,                        ISA_MIPS3,      CPU_R4600 },
19063   { "r4650",          0,                        ISA_MIPS3,      CPU_R4650 },
19064   /* ST Microelectronics Loongson 2E and 2F cores */
19065   { "loongson2e",     0,                        ISA_MIPS3,   CPU_LOONGSON_2E },
19066   { "loongson2f",     0,                        ISA_MIPS3,   CPU_LOONGSON_2F },
19067
19068   /* MIPS IV */
19069   { "r8000",          0,                        ISA_MIPS4,      CPU_R8000 },
19070   { "r10000",         0,                        ISA_MIPS4,      CPU_R10000 },
19071   { "r12000",         0,                        ISA_MIPS4,      CPU_R12000 },
19072   { "r14000",         0,                        ISA_MIPS4,      CPU_R14000 },
19073   { "r16000",         0,                        ISA_MIPS4,      CPU_R16000 },
19074   { "vr5000",         0,                        ISA_MIPS4,      CPU_R5000 },
19075   { "vr5400",         0,                        ISA_MIPS4,      CPU_VR5400 },
19076   { "vr5500",         0,                        ISA_MIPS4,      CPU_VR5500 },
19077   { "rm5200",         0,                        ISA_MIPS4,      CPU_R5000 },
19078   { "rm5230",         0,                        ISA_MIPS4,      CPU_R5000 },
19079   { "rm5231",         0,                        ISA_MIPS4,      CPU_R5000 },
19080   { "rm5261",         0,                        ISA_MIPS4,      CPU_R5000 },
19081   { "rm5721",         0,                        ISA_MIPS4,      CPU_R5000 },
19082   { "rm7000",         0,                        ISA_MIPS4,      CPU_RM7000 },
19083   { "rm9000",         0,                        ISA_MIPS4,      CPU_RM9000 },
19084
19085   /* MIPS 32 */
19086   { "4kc",            0,                        ISA_MIPS32,     CPU_MIPS32 },
19087   { "4km",            0,                        ISA_MIPS32,     CPU_MIPS32 },
19088   { "4kp",            0,                        ISA_MIPS32,     CPU_MIPS32 },
19089   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
19090
19091   /* MIPS 32 Release 2 */
19092   { "4kec",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19093   { "4kem",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19094   { "4kep",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19095   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
19096   { "m4k",            0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19097   { "m4kp",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19098   { "m14k",           MIPS_CPU_ASE_MCU,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19099   { "m14kc",          MIPS_CPU_ASE_MCU,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19100   { "m14ke",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2 | MIPS_CPU_ASE_MCU,
19101                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19102   { "m14kec",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2 | MIPS_CPU_ASE_MCU,
19103                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19104   { "24kc",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19105   { "24kf2_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19106   { "24kf",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19107   { "24kf1_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19108   /* Deprecated forms of the above.  */
19109   { "24kfx",          0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19110   { "24kx",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
19111   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
19112   { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19113   { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19114   { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19115   { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19116   /* Deprecated forms of the above.  */
19117   { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19118   { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
19119   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
19120   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19121                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19122   { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19123                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19124   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19125                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19126   { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19127                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19128   /* Deprecated forms of the above.  */
19129   { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19130                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19131   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19132                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19133   /* 34Kn is a 34kc without DSP.  */
19134   { "34kn",           MIPS_CPU_ASE_MT,          ISA_MIPS32R2,   CPU_MIPS32R2 },
19135   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
19136   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19137                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19138   { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19139                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19140   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19141                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19142   { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19143                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19144   { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19145                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19146   /* Deprecated forms of the above.  */
19147   { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19148                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19149   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19150                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19151   /* 1004K cores are multiprocessor versions of the 34K.  */
19152   { "1004kc",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19153                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19154   { "1004kf2_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19155                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19156   { "1004kf",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19157                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19158   { "1004kf1_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19159                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19160
19161   /* MIPS 64 */
19162   { "5kc",            0,                        ISA_MIPS64,     CPU_MIPS64 },
19163   { "5kf",            0,                        ISA_MIPS64,     CPU_MIPS64 },
19164   { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
19165   { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
19166
19167   /* Broadcom SB-1 CPU core */
19168   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
19169                                                 ISA_MIPS64,     CPU_SB1 },
19170   /* Broadcom SB-1A CPU core */
19171   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
19172                                                 ISA_MIPS64,     CPU_SB1 },
19173   
19174   { "loongson3a",     0,                        ISA_MIPS64,     CPU_LOONGSON_3A },
19175
19176   /* MIPS 64 Release 2 */
19177
19178   /* Cavium Networks Octeon CPU core */
19179   { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
19180   { "octeon+",        0,      ISA_MIPS64R2,   CPU_OCTEONP },
19181   { "octeon2",        0,      ISA_MIPS64R2,   CPU_OCTEON2 },
19182
19183   /* RMI Xlr */
19184   { "xlr",            0,      ISA_MIPS64,     CPU_XLR },
19185
19186   /* Broadcom XLP.
19187      XLP is mostly like XLR, with the prominent exception that it is
19188      MIPS64R2 rather than MIPS64.  */
19189   { "xlp",            0,      ISA_MIPS64R2,     CPU_XLR },
19190
19191   /* End marker */
19192   { NULL, 0, 0, 0 }
19193 };
19194
19195
19196 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
19197    with a final "000" replaced by "k".  Ignore case.
19198
19199    Note: this function is shared between GCC and GAS.  */
19200
19201 static bfd_boolean
19202 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
19203 {
19204   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
19205     given++, canonical++;
19206
19207   return ((*given == 0 && *canonical == 0)
19208           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
19209 }
19210
19211
19212 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
19213    CPU name.  We've traditionally allowed a lot of variation here.
19214
19215    Note: this function is shared between GCC and GAS.  */
19216
19217 static bfd_boolean
19218 mips_matching_cpu_name_p (const char *canonical, const char *given)
19219 {
19220   /* First see if the name matches exactly, or with a final "000"
19221      turned into "k".  */
19222   if (mips_strict_matching_cpu_name_p (canonical, given))
19223     return TRUE;
19224
19225   /* If not, try comparing based on numerical designation alone.
19226      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
19227   if (TOLOWER (*given) == 'r')
19228     given++;
19229   if (!ISDIGIT (*given))
19230     return FALSE;
19231
19232   /* Skip over some well-known prefixes in the canonical name,
19233      hoping to find a number there too.  */
19234   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
19235     canonical += 2;
19236   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
19237     canonical += 2;
19238   else if (TOLOWER (canonical[0]) == 'r')
19239     canonical += 1;
19240
19241   return mips_strict_matching_cpu_name_p (canonical, given);
19242 }
19243
19244
19245 /* Parse an option that takes the name of a processor as its argument.
19246    OPTION is the name of the option and CPU_STRING is the argument.
19247    Return the corresponding processor enumeration if the CPU_STRING is
19248    recognized, otherwise report an error and return null.
19249
19250    A similar function exists in GCC.  */
19251
19252 static const struct mips_cpu_info *
19253 mips_parse_cpu (const char *option, const char *cpu_string)
19254 {
19255   const struct mips_cpu_info *p;
19256
19257   /* 'from-abi' selects the most compatible architecture for the given
19258      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
19259      EABIs, we have to decide whether we're using the 32-bit or 64-bit
19260      version.  Look first at the -mgp options, if given, otherwise base
19261      the choice on MIPS_DEFAULT_64BIT.
19262
19263      Treat NO_ABI like the EABIs.  One reason to do this is that the
19264      plain 'mips' and 'mips64' configs have 'from-abi' as their default
19265      architecture.  This code picks MIPS I for 'mips' and MIPS III for
19266      'mips64', just as we did in the days before 'from-abi'.  */
19267   if (strcasecmp (cpu_string, "from-abi") == 0)
19268     {
19269       if (ABI_NEEDS_32BIT_REGS (mips_abi))
19270         return mips_cpu_info_from_isa (ISA_MIPS1);
19271
19272       if (ABI_NEEDS_64BIT_REGS (mips_abi))
19273         return mips_cpu_info_from_isa (ISA_MIPS3);
19274
19275       if (file_mips_gp32 >= 0)
19276         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
19277
19278       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
19279                                      ? ISA_MIPS3
19280                                      : ISA_MIPS1);
19281     }
19282
19283   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
19284   if (strcasecmp (cpu_string, "default") == 0)
19285     return 0;
19286
19287   for (p = mips_cpu_info_table; p->name != 0; p++)
19288     if (mips_matching_cpu_name_p (p->name, cpu_string))
19289       return p;
19290
19291   as_bad (_("Bad value (%s) for %s"), cpu_string, option);
19292   return 0;
19293 }
19294
19295 /* Return the canonical processor information for ISA (a member of the
19296    ISA_MIPS* enumeration).  */
19297
19298 static const struct mips_cpu_info *
19299 mips_cpu_info_from_isa (int isa)
19300 {
19301   int i;
19302
19303   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19304     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
19305         && isa == mips_cpu_info_table[i].isa)
19306       return (&mips_cpu_info_table[i]);
19307
19308   return NULL;
19309 }
19310
19311 static const struct mips_cpu_info *
19312 mips_cpu_info_from_arch (int arch)
19313 {
19314   int i;
19315
19316   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19317     if (arch == mips_cpu_info_table[i].cpu)
19318       return (&mips_cpu_info_table[i]);
19319
19320   return NULL;
19321 }
19322 \f
19323 static void
19324 show (FILE *stream, const char *string, int *col_p, int *first_p)
19325 {
19326   if (*first_p)
19327     {
19328       fprintf (stream, "%24s", "");
19329       *col_p = 24;
19330     }
19331   else
19332     {
19333       fprintf (stream, ", ");
19334       *col_p += 2;
19335     }
19336
19337   if (*col_p + strlen (string) > 72)
19338     {
19339       fprintf (stream, "\n%24s", "");
19340       *col_p = 24;
19341     }
19342
19343   fprintf (stream, "%s", string);
19344   *col_p += strlen (string);
19345
19346   *first_p = 0;
19347 }
19348
19349 void
19350 md_show_usage (FILE *stream)
19351 {
19352   int column, first;
19353   size_t i;
19354
19355   fprintf (stream, _("\
19356 MIPS options:\n\
19357 -EB                     generate big endian output\n\
19358 -EL                     generate little endian output\n\
19359 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
19360 -G NUM                  allow referencing objects up to NUM bytes\n\
19361                         implicitly with the gp register [default 8]\n"));
19362   fprintf (stream, _("\
19363 -mips1                  generate MIPS ISA I instructions\n\
19364 -mips2                  generate MIPS ISA II instructions\n\
19365 -mips3                  generate MIPS ISA III instructions\n\
19366 -mips4                  generate MIPS ISA IV instructions\n\
19367 -mips5                  generate MIPS ISA V instructions\n\
19368 -mips32                 generate MIPS32 ISA instructions\n\
19369 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
19370 -mips64                 generate MIPS64 ISA instructions\n\
19371 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
19372 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
19373
19374   first = 1;
19375
19376   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19377     show (stream, mips_cpu_info_table[i].name, &column, &first);
19378   show (stream, "from-abi", &column, &first);
19379   fputc ('\n', stream);
19380
19381   fprintf (stream, _("\
19382 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
19383 -no-mCPU                don't generate code specific to CPU.\n\
19384                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
19385
19386   first = 1;
19387
19388   show (stream, "3900", &column, &first);
19389   show (stream, "4010", &column, &first);
19390   show (stream, "4100", &column, &first);
19391   show (stream, "4650", &column, &first);
19392   fputc ('\n', stream);
19393
19394   fprintf (stream, _("\
19395 -mips16                 generate mips16 instructions\n\
19396 -no-mips16              do not generate mips16 instructions\n"));
19397   fprintf (stream, _("\
19398 -mmicromips             generate microMIPS instructions\n\
19399 -mno-micromips          do not generate microMIPS instructions\n"));
19400   fprintf (stream, _("\
19401 -msmartmips             generate smartmips instructions\n\
19402 -mno-smartmips          do not generate smartmips instructions\n"));  
19403   fprintf (stream, _("\
19404 -mdsp                   generate DSP instructions\n\
19405 -mno-dsp                do not generate DSP instructions\n"));
19406   fprintf (stream, _("\
19407 -mdspr2                 generate DSP R2 instructions\n\
19408 -mno-dspr2              do not generate DSP R2 instructions\n"));
19409   fprintf (stream, _("\
19410 -mmt                    generate MT instructions\n\
19411 -mno-mt                 do not generate MT instructions\n"));
19412   fprintf (stream, _("\
19413 -mmcu                   generate MCU instructions\n\
19414 -mno-mcu                do not generate MCU instructions\n"));
19415   fprintf (stream, _("\
19416 -mfix-loongson2f-jump   work around Loongson2F JUMP instructions\n\
19417 -mfix-loongson2f-nop    work around Loongson2F NOP errata\n\
19418 -mfix-vr4120            work around certain VR4120 errata\n\
19419 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
19420 -mfix-24k               insert a nop after ERET and DERET instructions\n\
19421 -mfix-cn63xxp1          work around CN63XXP1 PREF errata\n\
19422 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
19423 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
19424 -msym32                 assume all symbols have 32-bit values\n\
19425 -O0                     remove unneeded NOPs, do not swap branches\n\
19426 -O                      remove unneeded NOPs and swap branches\n\
19427 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
19428 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
19429   fprintf (stream, _("\
19430 -mhard-float            allow floating-point instructions\n\
19431 -msoft-float            do not allow floating-point instructions\n\
19432 -msingle-float          only allow 32-bit floating-point operations\n\
19433 -mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
19434 --[no-]construct-floats [dis]allow floating point values to be constructed\n"
19435                      ));
19436 #ifdef OBJ_ELF
19437   fprintf (stream, _("\
19438 -KPIC, -call_shared     generate SVR4 position independent code\n\
19439 -call_nonpic            generate non-PIC code that can operate with DSOs\n\
19440 -mvxworks-pic           generate VxWorks position independent code\n\
19441 -non_shared             do not generate code that can operate with DSOs\n\
19442 -xgot                   assume a 32 bit GOT\n\
19443 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
19444 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
19445                         position dependent (non shared) code\n\
19446 -mabi=ABI               create ABI conformant object file for:\n"));
19447
19448   first = 1;
19449
19450   show (stream, "32", &column, &first);
19451   show (stream, "o64", &column, &first);
19452   show (stream, "n32", &column, &first);
19453   show (stream, "64", &column, &first);
19454   show (stream, "eabi", &column, &first);
19455
19456   fputc ('\n', stream);
19457
19458   fprintf (stream, _("\
19459 -32                     create o32 ABI object file (default)\n\
19460 -n32                    create n32 ABI object file\n\
19461 -64                     create 64 ABI object file\n"));
19462 #endif
19463 }
19464
19465 #ifdef TE_IRIX
19466 enum dwarf2_format
19467 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
19468 {
19469   if (HAVE_64BIT_SYMBOLS)
19470     return dwarf2_format_64bit_irix;
19471   else
19472     return dwarf2_format_32bit;
19473 }
19474 #endif
19475
19476 int
19477 mips_dwarf2_addr_size (void)
19478 {
19479   if (HAVE_64BIT_OBJECTS)
19480     return 8;
19481   else
19482     return 4;
19483 }
19484
19485 /* Standard calling conventions leave the CFA at SP on entry.  */
19486 void
19487 mips_cfi_frame_initial_instructions (void)
19488 {
19489   cfi_add_CFA_def_cfa_register (SP);
19490 }
19491
19492 int
19493 tc_mips_regname_to_dw2regnum (char *regname)
19494 {
19495   unsigned int regnum = -1;
19496   unsigned int reg;
19497
19498   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
19499     regnum = reg;
19500
19501   return regnum;
19502 }