gas/
[external/binutils.git] / gas / config / tc-mips.c
1 /* tc-mips.c -- assemble code for a MIPS chip.
2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3    2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
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
356 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
357
358 /* True if -mdspr2 was passed or implied by arguments passed on the
359    command line (e.g., by -march).  */
360 static int file_ase_dspr2;
361
362 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
363                                 || mips_opts.isa == ISA_MIPS64R2)
364
365 /* True if -mmt was passed or implied by arguments passed on the
366    command line (e.g., by -march).  */
367 static int file_ase_mt;
368
369 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
370                              || mips_opts.isa == ISA_MIPS64R2)
371
372 #define ISA_SUPPORTS_MCU_ASE (mips_opts.isa == ISA_MIPS32R2             \
373                               || mips_opts.isa == ISA_MIPS64R2)
374
375 /* The argument of the -march= flag.  The architecture we are assembling.  */
376 static int file_mips_arch = CPU_UNKNOWN;
377 static const char *mips_arch_string;
378
379 /* The argument of the -mtune= flag.  The architecture for which we
380    are optimizing.  */
381 static int mips_tune = CPU_UNKNOWN;
382 static const char *mips_tune_string;
383
384 /* True when generating 32-bit code for a 64-bit processor.  */
385 static int mips_32bitmode = 0;
386
387 /* True if the given ABI requires 32-bit registers.  */
388 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
389
390 /* Likewise 64-bit registers.  */
391 #define ABI_NEEDS_64BIT_REGS(ABI)       \
392   ((ABI) == N32_ABI                     \
393    || (ABI) == N64_ABI                  \
394    || (ABI) == O64_ABI)
395
396 /*  Return true if ISA supports 64 bit wide gp registers.  */
397 #define ISA_HAS_64BIT_REGS(ISA)         \
398   ((ISA) == ISA_MIPS3                   \
399    || (ISA) == ISA_MIPS4                \
400    || (ISA) == ISA_MIPS5                \
401    || (ISA) == ISA_MIPS64               \
402    || (ISA) == ISA_MIPS64R2)
403
404 /*  Return true if ISA supports 64 bit wide float registers.  */
405 #define ISA_HAS_64BIT_FPRS(ISA)         \
406   ((ISA) == ISA_MIPS3                   \
407    || (ISA) == ISA_MIPS4                \
408    || (ISA) == ISA_MIPS5                \
409    || (ISA) == ISA_MIPS32R2             \
410    || (ISA) == ISA_MIPS64               \
411    || (ISA) == ISA_MIPS64R2)
412
413 /* Return true if ISA supports 64-bit right rotate (dror et al.)
414    instructions.  */
415 #define ISA_HAS_DROR(ISA)               \
416   ((ISA) == ISA_MIPS64R2                \
417    || (mips_opts.micromips              \
418        && ISA_HAS_64BIT_REGS (ISA))     \
419    )
420
421 /* Return true if ISA supports 32-bit right rotate (ror et al.)
422    instructions.  */
423 #define ISA_HAS_ROR(ISA)                \
424   ((ISA) == ISA_MIPS32R2                \
425    || (ISA) == ISA_MIPS64R2             \
426    || mips_opts.ase_smartmips           \
427    || mips_opts.micromips               \
428    )
429
430 /* Return true if ISA supports single-precision floats in odd registers.  */
431 #define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
432   ((ISA) == ISA_MIPS32                  \
433    || (ISA) == ISA_MIPS32R2             \
434    || (ISA) == ISA_MIPS64               \
435    || (ISA) == ISA_MIPS64R2)
436
437 /* Return true if ISA supports move to/from high part of a 64-bit
438    floating-point register. */
439 #define ISA_HAS_MXHC1(ISA)              \
440   ((ISA) == ISA_MIPS32R2                \
441    || (ISA) == ISA_MIPS64R2)
442
443 #define HAVE_32BIT_GPRS                            \
444     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
445
446 #define HAVE_32BIT_FPRS                            \
447     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
448
449 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
450 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
451
452 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
453
454 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
455
456 /* True if relocations are stored in-place.  */
457 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
458
459 /* The ABI-derived address size.  */
460 #define HAVE_64BIT_ADDRESSES \
461   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
462 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
463
464 /* The size of symbolic constants (i.e., expressions of the form
465    "SYMBOL" or "SYMBOL + OFFSET").  */
466 #define HAVE_32BIT_SYMBOLS \
467   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
468 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
469
470 /* Addresses are loaded in different ways, depending on the address size
471    in use.  The n32 ABI Documentation also mandates the use of additions
472    with overflow checking, but existing implementations don't follow it.  */
473 #define ADDRESS_ADD_INSN                                                \
474    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
475
476 #define ADDRESS_ADDI_INSN                                               \
477    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
478
479 #define ADDRESS_LOAD_INSN                                               \
480    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
481
482 #define ADDRESS_STORE_INSN                                              \
483    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
484
485 /* Return true if the given CPU supports the MIPS16 ASE.  */
486 #define CPU_HAS_MIPS16(cpu)                                             \
487    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
488     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
489
490 /* Return true if the given CPU supports the microMIPS ASE.  */
491 #define CPU_HAS_MICROMIPS(cpu)  0
492
493 /* True if CPU has a dror instruction.  */
494 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
495
496 /* True if CPU has a ror instruction.  */
497 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
498
499 /* True if CPU has seq/sne and seqi/snei instructions.  */
500 #define CPU_HAS_SEQ(CPU)        ((CPU) == CPU_OCTEON)
501
502 /* True if CPU does not implement the all the coprocessor insns.  For these
503    CPUs only those COP insns are accepted that are explicitly marked to be
504    available on the CPU.  ISA membership for COP insns is ignored.  */
505 #define NO_ISA_COP(CPU)         ((CPU) == CPU_OCTEON)
506
507 /* True if mflo and mfhi can be immediately followed by instructions
508    which write to the HI and LO registers.
509
510    According to MIPS specifications, MIPS ISAs I, II, and III need
511    (at least) two instructions between the reads of HI/LO and
512    instructions which write them, and later ISAs do not.  Contradicting
513    the MIPS specifications, some MIPS IV processor user manuals (e.g.
514    the UM for the NEC Vr5000) document needing the instructions between
515    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
516    MIPS64 and later ISAs to have the interlocks, plus any specific
517    earlier-ISA CPUs for which CPU documentation declares that the
518    instructions are really interlocked.  */
519 #define hilo_interlocks \
520   (mips_opts.isa == ISA_MIPS32                        \
521    || mips_opts.isa == ISA_MIPS32R2                   \
522    || mips_opts.isa == ISA_MIPS64                     \
523    || mips_opts.isa == ISA_MIPS64R2                   \
524    || mips_opts.arch == CPU_R4010                     \
525    || mips_opts.arch == CPU_R10000                    \
526    || mips_opts.arch == CPU_R12000                    \
527    || mips_opts.arch == CPU_R14000                    \
528    || mips_opts.arch == CPU_R16000                    \
529    || mips_opts.arch == CPU_RM7000                    \
530    || mips_opts.arch == CPU_VR5500                    \
531    || mips_opts.micromips                             \
532    )
533
534 /* Whether the processor uses hardware interlocks to protect reads
535    from the GPRs after they are loaded from memory, and thus does not
536    require nops to be inserted.  This applies to instructions marked
537    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
538    level I and microMIPS mode instructions are always interlocked.  */
539 #define gpr_interlocks                                \
540   (mips_opts.isa != ISA_MIPS1                         \
541    || mips_opts.arch == CPU_R3900                     \
542    || mips_opts.micromips                             \
543    )
544
545 /* Whether the processor uses hardware interlocks to avoid delays
546    required by coprocessor instructions, and thus does not require
547    nops to be inserted.  This applies to instructions marked
548    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
549    between instructions marked INSN_WRITE_COND_CODE and ones marked
550    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
551    levels I, II, and III and microMIPS mode instructions are always
552    interlocked.  */
553 /* Itbl support may require additional care here.  */
554 #define cop_interlocks                                \
555   ((mips_opts.isa != ISA_MIPS1                        \
556     && mips_opts.isa != ISA_MIPS2                     \
557     && mips_opts.isa != ISA_MIPS3)                    \
558    || mips_opts.arch == CPU_R4300                     \
559    || mips_opts.micromips                             \
560    )
561
562 /* Whether the processor uses hardware interlocks to protect reads
563    from coprocessor registers after they are loaded from memory, and
564    thus does not require nops to be inserted.  This applies to
565    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
566    requires at MIPS ISA level I and microMIPS mode instructions are
567    always interlocked.  */
568 #define cop_mem_interlocks                            \
569   (mips_opts.isa != ISA_MIPS1                         \
570    || mips_opts.micromips                             \
571    )
572
573 /* Is this a mfhi or mflo instruction?  */
574 #define MF_HILO_INSN(PINFO) \
575   ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
576
577 /* Returns true for a (non floating-point) coprocessor instruction.  Reading
578    or writing the condition code is only possible on the coprocessors and
579    these insns are not marked with INSN_COP.  Thus for these insns use the
580    condition-code flags.  */
581 #define COP_INSN(PINFO)                                                 \
582   (PINFO != INSN_MACRO                                                  \
583    && ((PINFO) & (FP_S | FP_D)) == 0                                    \
584    && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
585
586 /* Whether code compression (either of the MIPS16 or the microMIPS ASEs)
587    has been selected.  This implies, in particular, that addresses of text
588    labels have their LSB set.  */
589 #define HAVE_CODE_COMPRESSION                                           \
590   ((mips_opts.mips16 | mips_opts.micromips) != 0)
591
592 /* MIPS PIC level.  */
593
594 enum mips_pic_level mips_pic;
595
596 /* 1 if we should generate 32 bit offsets from the $gp register in
597    SVR4_PIC mode.  Currently has no meaning in other modes.  */
598 static int mips_big_got = 0;
599
600 /* 1 if trap instructions should used for overflow rather than break
601    instructions.  */
602 static int mips_trap = 0;
603
604 /* 1 if double width floating point constants should not be constructed
605    by assembling two single width halves into two single width floating
606    point registers which just happen to alias the double width destination
607    register.  On some architectures this aliasing can be disabled by a bit
608    in the status register, and the setting of this bit cannot be determined
609    automatically at assemble time.  */
610 static int mips_disable_float_construction;
611
612 /* Non-zero if any .set noreorder directives were used.  */
613
614 static int mips_any_noreorder;
615
616 /* Non-zero if nops should be inserted when the register referenced in
617    an mfhi/mflo instruction is read in the next two instructions.  */
618 static int mips_7000_hilo_fix;
619
620 /* The size of objects in the small data section.  */
621 static unsigned int g_switch_value = 8;
622 /* Whether the -G option was used.  */
623 static int g_switch_seen = 0;
624
625 #define N_RMASK 0xc4
626 #define N_VFP   0xd4
627
628 /* If we can determine in advance that GP optimization won't be
629    possible, we can skip the relaxation stuff that tries to produce
630    GP-relative references.  This makes delay slot optimization work
631    better.
632
633    This function can only provide a guess, but it seems to work for
634    gcc output.  It needs to guess right for gcc, otherwise gcc
635    will put what it thinks is a GP-relative instruction in a branch
636    delay slot.
637
638    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
639    fixed it for the non-PIC mode.  KR 95/04/07  */
640 static int nopic_need_relax (symbolS *, int);
641
642 /* handle of the OPCODE hash table */
643 static struct hash_control *op_hash = NULL;
644
645 /* The opcode hash table we use for the mips16.  */
646 static struct hash_control *mips16_op_hash = NULL;
647
648 /* The opcode hash table we use for the microMIPS ASE.  */
649 static struct hash_control *micromips_op_hash = NULL;
650
651 /* This array holds the chars that always start a comment.  If the
652     pre-processor is disabled, these aren't very useful */
653 const char comment_chars[] = "#";
654
655 /* This array holds the chars that only start a comment at the beginning of
656    a line.  If the line seems to have the form '# 123 filename'
657    .line and .file directives will appear in the pre-processed output */
658 /* Note that input_file.c hand checks for '#' at the beginning of the
659    first line of the input file.  This is because the compiler outputs
660    #NO_APP at the beginning of its output.  */
661 /* Also note that C style comments are always supported.  */
662 const char line_comment_chars[] = "#";
663
664 /* This array holds machine specific line separator characters.  */
665 const char line_separator_chars[] = ";";
666
667 /* Chars that can be used to separate mant from exp in floating point nums */
668 const char EXP_CHARS[] = "eE";
669
670 /* Chars that mean this number is a floating point constant */
671 /* As in 0f12.456 */
672 /* or    0d1.2345e12 */
673 const char FLT_CHARS[] = "rRsSfFdDxXpP";
674
675 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
676    changed in read.c .  Ideally it shouldn't have to know about it at all,
677    but nothing is ideal around here.
678  */
679
680 static char *insn_error;
681
682 static int auto_align = 1;
683
684 /* When outputting SVR4 PIC code, the assembler needs to know the
685    offset in the stack frame from which to restore the $gp register.
686    This is set by the .cprestore pseudo-op, and saved in this
687    variable.  */
688 static offsetT mips_cprestore_offset = -1;
689
690 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
691    more optimizations, it can use a register value instead of a memory-saved
692    offset and even an other register than $gp as global pointer.  */
693 static offsetT mips_cpreturn_offset = -1;
694 static int mips_cpreturn_register = -1;
695 static int mips_gp_register = GP;
696 static int mips_gprel_offset = 0;
697
698 /* Whether mips_cprestore_offset has been set in the current function
699    (or whether it has already been warned about, if not).  */
700 static int mips_cprestore_valid = 0;
701
702 /* This is the register which holds the stack frame, as set by the
703    .frame pseudo-op.  This is needed to implement .cprestore.  */
704 static int mips_frame_reg = SP;
705
706 /* Whether mips_frame_reg has been set in the current function
707    (or whether it has already been warned about, if not).  */
708 static int mips_frame_reg_valid = 0;
709
710 /* To output NOP instructions correctly, we need to keep information
711    about the previous two instructions.  */
712
713 /* Whether we are optimizing.  The default value of 2 means to remove
714    unneeded NOPs and swap branch instructions when possible.  A value
715    of 1 means to not swap branches.  A value of 0 means to always
716    insert NOPs.  */
717 static int mips_optimize = 2;
718
719 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
720    equivalent to seeing no -g option at all.  */
721 static int mips_debug = 0;
722
723 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
724 #define MAX_VR4130_NOPS 4
725
726 /* The maximum number of NOPs needed to fill delay slots.  */
727 #define MAX_DELAY_NOPS 2
728
729 /* The maximum number of NOPs needed for any purpose.  */
730 #define MAX_NOPS 4
731
732 /* A list of previous instructions, with index 0 being the most recent.
733    We need to look back MAX_NOPS instructions when filling delay slots
734    or working around processor errata.  We need to look back one
735    instruction further if we're thinking about using history[0] to
736    fill a branch delay slot.  */
737 static struct mips_cl_insn history[1 + MAX_NOPS];
738
739 /* Nop instructions used by emit_nop.  */
740 static struct mips_cl_insn nop_insn;
741 static struct mips_cl_insn mips16_nop_insn;
742 static struct mips_cl_insn micromips_nop16_insn;
743 static struct mips_cl_insn micromips_nop32_insn;
744
745 /* The appropriate nop for the current mode.  */
746 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn \
747                   : (mips_opts.micromips ? &micromips_nop16_insn : &nop_insn))
748
749 /* The size of NOP_INSN in bytes.  */
750 #define NOP_INSN_SIZE (HAVE_CODE_COMPRESSION ? 2 : 4)
751
752 /* If this is set, it points to a frag holding nop instructions which
753    were inserted before the start of a noreorder section.  If those
754    nops turn out to be unnecessary, the size of the frag can be
755    decreased.  */
756 static fragS *prev_nop_frag;
757
758 /* The number of nop instructions we created in prev_nop_frag.  */
759 static int prev_nop_frag_holds;
760
761 /* The number of nop instructions that we know we need in
762    prev_nop_frag.  */
763 static int prev_nop_frag_required;
764
765 /* The number of instructions we've seen since prev_nop_frag.  */
766 static int prev_nop_frag_since;
767
768 /* For ECOFF and ELF, relocations against symbols are done in two
769    parts, with a HI relocation and a LO relocation.  Each relocation
770    has only 16 bits of space to store an addend.  This means that in
771    order for the linker to handle carries correctly, it must be able
772    to locate both the HI and the LO relocation.  This means that the
773    relocations must appear in order in the relocation table.
774
775    In order to implement this, we keep track of each unmatched HI
776    relocation.  We then sort them so that they immediately precede the
777    corresponding LO relocation.  */
778
779 struct mips_hi_fixup
780 {
781   /* Next HI fixup.  */
782   struct mips_hi_fixup *next;
783   /* This fixup.  */
784   fixS *fixp;
785   /* The section this fixup is in.  */
786   segT seg;
787 };
788
789 /* The list of unmatched HI relocs.  */
790
791 static struct mips_hi_fixup *mips_hi_fixup_list;
792
793 /* The frag containing the last explicit relocation operator.
794    Null if explicit relocations have not been used.  */
795
796 static fragS *prev_reloc_op_frag;
797
798 /* Map normal MIPS register numbers to mips16 register numbers.  */
799
800 #define X ILLEGAL_REG
801 static const int mips32_to_16_reg_map[] =
802 {
803   X, X, 2, 3, 4, 5, 6, 7,
804   X, X, X, X, X, X, X, X,
805   0, 1, X, X, X, X, X, X,
806   X, X, X, X, X, X, X, X
807 };
808 #undef X
809
810 /* Map mips16 register numbers to normal MIPS register numbers.  */
811
812 static const unsigned int mips16_to_32_reg_map[] =
813 {
814   16, 17, 2, 3, 4, 5, 6, 7
815 };
816
817 /* Map normal MIPS register numbers to microMIPS register numbers.  */
818
819 #define mips32_to_micromips_reg_b_map   mips32_to_16_reg_map
820 #define mips32_to_micromips_reg_c_map   mips32_to_16_reg_map
821 #define mips32_to_micromips_reg_d_map   mips32_to_16_reg_map
822 #define mips32_to_micromips_reg_e_map   mips32_to_16_reg_map
823 #define mips32_to_micromips_reg_f_map   mips32_to_16_reg_map
824 #define mips32_to_micromips_reg_g_map   mips32_to_16_reg_map
825 #define mips32_to_micromips_reg_l_map   mips32_to_16_reg_map
826
827 #define X ILLEGAL_REG
828 /* reg type h: 4, 5, 6.  */
829 static const int mips32_to_micromips_reg_h_map[] =
830 {
831   X, X, X, X, 4, 5, 6, X,
832   X, X, X, X, X, X, X, X,
833   X, X, X, X, X, X, X, X,
834   X, X, X, X, X, X, X, X
835 };
836
837 /* reg type m: 0, 17, 2, 3, 16, 18, 19, 20.  */
838 static const int mips32_to_micromips_reg_m_map[] =
839 {
840   0, X, 2, 3, X, X, X, X,
841   X, X, X, X, X, X, X, X,
842   4, 1, 5, 6, 7, X, X, X,
843   X, X, X, X, X, X, X, X
844 };
845
846 /* reg type q: 0, 2-7. 17.  */
847 static const int mips32_to_micromips_reg_q_map[] =
848 {
849   0, X, 2, 3, 4, 5, 6, 7,
850   X, X, X, X, X, X, X, X,
851   X, 1, X, X, X, X, X, X,
852   X, X, X, X, X, X, X, X
853 };
854
855 #define mips32_to_micromips_reg_n_map  mips32_to_micromips_reg_m_map
856 #undef X
857
858 /* Map microMIPS register numbers to normal MIPS register numbers.  */
859
860 #define micromips_to_32_reg_b_map       mips16_to_32_reg_map
861 #define micromips_to_32_reg_c_map       mips16_to_32_reg_map
862 #define micromips_to_32_reg_d_map       mips16_to_32_reg_map
863 #define micromips_to_32_reg_e_map       mips16_to_32_reg_map
864 #define micromips_to_32_reg_f_map       mips16_to_32_reg_map
865 #define micromips_to_32_reg_g_map       mips16_to_32_reg_map
866
867 /* The microMIPS registers with type h.  */
868 static const unsigned int micromips_to_32_reg_h_map[] =
869 {
870   5, 5, 6, 4, 4, 4, 4, 4
871 };
872
873 /* The microMIPS registers with type i.  */
874 static const unsigned int micromips_to_32_reg_i_map[] =
875 {
876   6, 7, 7, 21, 22, 5, 6, 7
877 };
878
879 #define micromips_to_32_reg_l_map       mips16_to_32_reg_map
880
881 /* The microMIPS registers with type m.  */
882 static const unsigned int micromips_to_32_reg_m_map[] =
883 {
884   0, 17, 2, 3, 16, 18, 19, 20
885 };
886
887 #define micromips_to_32_reg_n_map      micromips_to_32_reg_m_map
888
889 /* The microMIPS registers with type q.  */
890 static const unsigned int micromips_to_32_reg_q_map[] =
891 {
892   0, 17, 2, 3, 4, 5, 6, 7
893 };
894
895 /* microMIPS imm type B.  */
896 static const int micromips_imm_b_map[] =
897 {
898   1, 4, 8, 12, 16, 20, 24, -1
899 };
900
901 /* microMIPS imm type C.  */
902 static const int micromips_imm_c_map[] =
903 {
904   128, 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 255, 32768, 65535
905 };
906
907 /* Classifies the kind of instructions we're interested in when
908    implementing -mfix-vr4120.  */
909 enum fix_vr4120_class
910 {
911   FIX_VR4120_MACC,
912   FIX_VR4120_DMACC,
913   FIX_VR4120_MULT,
914   FIX_VR4120_DMULT,
915   FIX_VR4120_DIV,
916   FIX_VR4120_MTHILO,
917   NUM_FIX_VR4120_CLASSES
918 };
919
920 /* ...likewise -mfix-loongson2f-jump.  */
921 static bfd_boolean mips_fix_loongson2f_jump;
922
923 /* ...likewise -mfix-loongson2f-nop.  */
924 static bfd_boolean mips_fix_loongson2f_nop;
925
926 /* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed.  */
927 static bfd_boolean mips_fix_loongson2f;
928
929 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
930    there must be at least one other instruction between an instruction
931    of type X and an instruction of type Y.  */
932 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
933
934 /* True if -mfix-vr4120 is in force.  */
935 static int mips_fix_vr4120;
936
937 /* ...likewise -mfix-vr4130.  */
938 static int mips_fix_vr4130;
939
940 /* ...likewise -mfix-24k.  */
941 static int mips_fix_24k;
942
943 /* ...likewise -mfix-cn63xxp1 */
944 static bfd_boolean mips_fix_cn63xxp1;
945
946 /* We don't relax branches by default, since this causes us to expand
947    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
948    fail to compute the offset before expanding the macro to the most
949    efficient expansion.  */
950
951 static int mips_relax_branch;
952 \f
953 /* The expansion of many macros depends on the type of symbol that
954    they refer to.  For example, when generating position-dependent code,
955    a macro that refers to a symbol may have two different expansions,
956    one which uses GP-relative addresses and one which uses absolute
957    addresses.  When generating SVR4-style PIC, a macro may have
958    different expansions for local and global symbols.
959
960    We handle these situations by generating both sequences and putting
961    them in variant frags.  In position-dependent code, the first sequence
962    will be the GP-relative one and the second sequence will be the
963    absolute one.  In SVR4 PIC, the first sequence will be for global
964    symbols and the second will be for local symbols.
965
966    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
967    SECOND are the lengths of the two sequences in bytes.  These fields
968    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
969    the subtype has the following flags:
970
971    RELAX_USE_SECOND
972         Set if it has been decided that we should use the second
973         sequence instead of the first.
974
975    RELAX_SECOND_LONGER
976         Set in the first variant frag if the macro's second implementation
977         is longer than its first.  This refers to the macro as a whole,
978         not an individual relaxation.
979
980    RELAX_NOMACRO
981         Set in the first variant frag if the macro appeared in a .set nomacro
982         block and if one alternative requires a warning but the other does not.
983
984    RELAX_DELAY_SLOT
985         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
986         delay slot.
987
988    RELAX_DELAY_SLOT_16BIT
989         Like RELAX_DELAY_SLOT, but indicates that the delay slot requires a
990         16-bit instruction.
991
992    RELAX_DELAY_SLOT_SIZE_FIRST
993         Like RELAX_DELAY_SLOT, but indicates that the first implementation of
994         the macro is of the wrong size for the branch delay slot.
995
996    RELAX_DELAY_SLOT_SIZE_SECOND
997         Like RELAX_DELAY_SLOT, but indicates that the second implementation of
998         the macro is of the wrong size for the branch delay slot.
999
1000    The frag's "opcode" points to the first fixup for relaxable code.
1001
1002    Relaxable macros are generated using a sequence such as:
1003
1004       relax_start (SYMBOL);
1005       ... generate first expansion ...
1006       relax_switch ();
1007       ... generate second expansion ...
1008       relax_end ();
1009
1010    The code and fixups for the unwanted alternative are discarded
1011    by md_convert_frag.  */
1012 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
1013
1014 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
1015 #define RELAX_SECOND(X) ((X) & 0xff)
1016 #define RELAX_USE_SECOND 0x10000
1017 #define RELAX_SECOND_LONGER 0x20000
1018 #define RELAX_NOMACRO 0x40000
1019 #define RELAX_DELAY_SLOT 0x80000
1020 #define RELAX_DELAY_SLOT_16BIT 0x100000
1021 #define RELAX_DELAY_SLOT_SIZE_FIRST 0x200000
1022 #define RELAX_DELAY_SLOT_SIZE_SECOND 0x400000
1023
1024 /* Branch without likely bit.  If label is out of range, we turn:
1025
1026         beq reg1, reg2, label
1027         delay slot
1028
1029    into
1030
1031         bne reg1, reg2, 0f
1032         nop
1033         j label
1034      0: delay slot
1035
1036    with the following opcode replacements:
1037
1038         beq <-> bne
1039         blez <-> bgtz
1040         bltz <-> bgez
1041         bc1f <-> bc1t
1042
1043         bltzal <-> bgezal  (with jal label instead of j label)
1044
1045    Even though keeping the delay slot instruction in the delay slot of
1046    the branch would be more efficient, it would be very tricky to do
1047    correctly, because we'd have to introduce a variable frag *after*
1048    the delay slot instruction, and expand that instead.  Let's do it
1049    the easy way for now, even if the branch-not-taken case now costs
1050    one additional instruction.  Out-of-range branches are not supposed
1051    to be common, anyway.
1052
1053    Branch likely.  If label is out of range, we turn:
1054
1055         beql reg1, reg2, label
1056         delay slot (annulled if branch not taken)
1057
1058    into
1059
1060         beql reg1, reg2, 1f
1061         nop
1062         beql $0, $0, 2f
1063         nop
1064      1: j[al] label
1065         delay slot (executed only if branch taken)
1066      2:
1067
1068    It would be possible to generate a shorter sequence by losing the
1069    likely bit, generating something like:
1070
1071         bne reg1, reg2, 0f
1072         nop
1073         j[al] label
1074         delay slot (executed only if branch taken)
1075      0:
1076
1077         beql -> bne
1078         bnel -> beq
1079         blezl -> bgtz
1080         bgtzl -> blez
1081         bltzl -> bgez
1082         bgezl -> bltz
1083         bc1fl -> bc1t
1084         bc1tl -> bc1f
1085
1086         bltzall -> bgezal  (with jal label instead of j label)
1087         bgezall -> bltzal  (ditto)
1088
1089
1090    but it's not clear that it would actually improve performance.  */
1091 #define RELAX_BRANCH_ENCODE(at, uncond, likely, link, toofar)   \
1092   ((relax_substateT)                                            \
1093    (0xc0000000                                                  \
1094     | ((at) & 0x1f)                                             \
1095     | ((toofar) ? 0x20 : 0)                                     \
1096     | ((link) ? 0x40 : 0)                                       \
1097     | ((likely) ? 0x80 : 0)                                     \
1098     | ((uncond) ? 0x100 : 0)))
1099 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
1100 #define RELAX_BRANCH_UNCOND(i) (((i) & 0x100) != 0)
1101 #define RELAX_BRANCH_LIKELY(i) (((i) & 0x80) != 0)
1102 #define RELAX_BRANCH_LINK(i) (((i) & 0x40) != 0)
1103 #define RELAX_BRANCH_TOOFAR(i) (((i) & 0x20) != 0)
1104 #define RELAX_BRANCH_AT(i) ((i) & 0x1f)
1105
1106 /* For mips16 code, we use an entirely different form of relaxation.
1107    mips16 supports two versions of most instructions which take
1108    immediate values: a small one which takes some small value, and a
1109    larger one which takes a 16 bit value.  Since branches also follow
1110    this pattern, relaxing these values is required.
1111
1112    We can assemble both mips16 and normal MIPS code in a single
1113    object.  Therefore, we need to support this type of relaxation at
1114    the same time that we support the relaxation described above.  We
1115    use the high bit of the subtype field to distinguish these cases.
1116
1117    The information we store for this type of relaxation is the
1118    argument code found in the opcode file for this relocation, whether
1119    the user explicitly requested a small or extended form, and whether
1120    the relocation is in a jump or jal delay slot.  That tells us the
1121    size of the value, and how it should be stored.  We also store
1122    whether the fragment is considered to be extended or not.  We also
1123    store whether this is known to be a branch to a different section,
1124    whether we have tried to relax this frag yet, and whether we have
1125    ever extended a PC relative fragment because of a shift count.  */
1126 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
1127   (0x80000000                                                   \
1128    | ((type) & 0xff)                                            \
1129    | ((small) ? 0x100 : 0)                                      \
1130    | ((ext) ? 0x200 : 0)                                        \
1131    | ((dslot) ? 0x400 : 0)                                      \
1132    | ((jal_dslot) ? 0x800 : 0))
1133 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
1134 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
1135 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
1136 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
1137 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
1138 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
1139 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
1140 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
1141 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
1142 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
1143 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
1144 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
1145
1146 /* For microMIPS code, we use relaxation similar to one we use for
1147    MIPS16 code.  Some instructions that take immediate values support
1148    two encodings: a small one which takes some small value, and a
1149    larger one which takes a 16 bit value.  As some branches also follow
1150    this pattern, relaxing these values is required.
1151
1152    We can assemble both microMIPS and normal MIPS code in a single
1153    object.  Therefore, we need to support this type of relaxation at
1154    the same time that we support the relaxation described above.  We
1155    use one of the high bits of the subtype field to distinguish these
1156    cases.
1157
1158    The information we store for this type of relaxation is the argument
1159    code found in the opcode file for this relocation, the register
1160    selected as the assembler temporary, whether the branch is
1161    unconditional, whether it is compact, whether it stores the link
1162    address implicitly in $ra, whether relaxation of out-of-range 32-bit
1163    branches to a sequence of instructions is enabled, and whether the
1164    displacement of a branch is too large to fit as an immediate argument
1165    of a 16-bit and a 32-bit branch, respectively.  */
1166 #define RELAX_MICROMIPS_ENCODE(type, at, uncond, compact, link, \
1167                                relax32, toofar16, toofar32)     \
1168   (0x40000000                                                   \
1169    | ((type) & 0xff)                                            \
1170    | (((at) & 0x1f) << 8)                                       \
1171    | ((uncond) ? 0x2000 : 0)                                    \
1172    | ((compact) ? 0x4000 : 0)                                   \
1173    | ((link) ? 0x8000 : 0)                                      \
1174    | ((relax32) ? 0x10000 : 0)                                  \
1175    | ((toofar16) ? 0x20000 : 0)                                 \
1176    | ((toofar32) ? 0x40000 : 0))
1177 #define RELAX_MICROMIPS_P(i) (((i) & 0xc0000000) == 0x40000000)
1178 #define RELAX_MICROMIPS_TYPE(i) ((i) & 0xff)
1179 #define RELAX_MICROMIPS_AT(i) (((i) >> 8) & 0x1f)
1180 #define RELAX_MICROMIPS_UNCOND(i) (((i) & 0x2000) != 0)
1181 #define RELAX_MICROMIPS_COMPACT(i) (((i) & 0x4000) != 0)
1182 #define RELAX_MICROMIPS_LINK(i) (((i) & 0x8000) != 0)
1183 #define RELAX_MICROMIPS_RELAX32(i) (((i) & 0x10000) != 0)
1184
1185 #define RELAX_MICROMIPS_TOOFAR16(i) (((i) & 0x20000) != 0)
1186 #define RELAX_MICROMIPS_MARK_TOOFAR16(i) ((i) | 0x20000)
1187 #define RELAX_MICROMIPS_CLEAR_TOOFAR16(i) ((i) & ~0x20000)
1188 #define RELAX_MICROMIPS_TOOFAR32(i) (((i) & 0x40000) != 0)
1189 #define RELAX_MICROMIPS_MARK_TOOFAR32(i) ((i) | 0x40000)
1190 #define RELAX_MICROMIPS_CLEAR_TOOFAR32(i) ((i) & ~0x40000)
1191
1192 /* Is the given value a sign-extended 32-bit value?  */
1193 #define IS_SEXT_32BIT_NUM(x)                                            \
1194   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
1195    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
1196
1197 /* Is the given value a sign-extended 16-bit value?  */
1198 #define IS_SEXT_16BIT_NUM(x)                                            \
1199   (((x) &~ (offsetT) 0x7fff) == 0                                       \
1200    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
1201
1202 /* Is the given value a sign-extended 12-bit value?  */
1203 #define IS_SEXT_12BIT_NUM(x)                                            \
1204   (((((x) & 0xfff) ^ 0x800LL) - 0x800LL) == (x))
1205
1206 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
1207 #define IS_ZEXT_32BIT_NUM(x)                                            \
1208   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
1209    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
1210
1211 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
1212    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
1213 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
1214   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
1215               | (((VALUE) & (MASK)) << (SHIFT)))
1216
1217 /* Extract bits MASK << SHIFT from STRUCT and shift them right
1218    SHIFT places.  */
1219 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
1220   (((STRUCT) >> (SHIFT)) & (MASK))
1221
1222 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1223    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1224
1225    include/opcode/mips.h specifies operand fields using the macros
1226    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
1227    with "MIPS16OP" instead of "OP".  */
1228 #define INSERT_OPERAND(MICROMIPS, FIELD, INSN, VALUE) \
1229   do \
1230     if (!(MICROMIPS)) \
1231       INSERT_BITS ((INSN).insn_opcode, VALUE, \
1232                    OP_MASK_##FIELD, OP_SH_##FIELD); \
1233     else \
1234       INSERT_BITS ((INSN).insn_opcode, VALUE, \
1235                    MICROMIPSOP_MASK_##FIELD, MICROMIPSOP_SH_##FIELD); \
1236   while (0)
1237 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1238   INSERT_BITS ((INSN).insn_opcode, VALUE, \
1239                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1240
1241 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
1242 #define EXTRACT_OPERAND(MICROMIPS, FIELD, INSN) \
1243   (!(MICROMIPS) \
1244    ? EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD) \
1245    : EXTRACT_BITS ((INSN).insn_opcode, \
1246                    MICROMIPSOP_MASK_##FIELD, MICROMIPSOP_SH_##FIELD))
1247 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1248   EXTRACT_BITS ((INSN).insn_opcode, \
1249                 MIPS16OP_MASK_##FIELD, \
1250                 MIPS16OP_SH_##FIELD)
1251 \f
1252 /* Whether or not we are emitting a branch-likely macro.  */
1253 static bfd_boolean emit_branch_likely_macro = FALSE;
1254
1255 /* Global variables used when generating relaxable macros.  See the
1256    comment above RELAX_ENCODE for more details about how relaxation
1257    is used.  */
1258 static struct {
1259   /* 0 if we're not emitting a relaxable macro.
1260      1 if we're emitting the first of the two relaxation alternatives.
1261      2 if we're emitting the second alternative.  */
1262   int sequence;
1263
1264   /* The first relaxable fixup in the current frag.  (In other words,
1265      the first fixup that refers to relaxable code.)  */
1266   fixS *first_fixup;
1267
1268   /* sizes[0] says how many bytes of the first alternative are stored in
1269      the current frag.  Likewise sizes[1] for the second alternative.  */
1270   unsigned int sizes[2];
1271
1272   /* The symbol on which the choice of sequence depends.  */
1273   symbolS *symbol;
1274 } mips_relax;
1275 \f
1276 /* Global variables used to decide whether a macro needs a warning.  */
1277 static struct {
1278   /* True if the macro is in a branch delay slot.  */
1279   bfd_boolean delay_slot_p;
1280
1281   /* Set to the length in bytes required if the macro is in a delay slot
1282      that requires a specific length of instruction, otherwise zero.  */
1283   unsigned int delay_slot_length;
1284
1285   /* For relaxable macros, sizes[0] is the length of the first alternative
1286      in bytes and sizes[1] is the length of the second alternative.
1287      For non-relaxable macros, both elements give the length of the
1288      macro in bytes.  */
1289   unsigned int sizes[2];
1290
1291   /* For relaxable macros, first_insn_sizes[0] is the length of the first
1292      instruction of the first alternative in bytes and first_insn_sizes[1]
1293      is the length of the first instruction of the second alternative.
1294      For non-relaxable macros, both elements give the length of the first
1295      instruction in bytes.
1296
1297      Set to zero if we haven't yet seen the first instruction.  */
1298   unsigned int first_insn_sizes[2];
1299
1300   /* For relaxable macros, insns[0] is the number of instructions for the
1301      first alternative and insns[1] is the number of instructions for the
1302      second alternative.
1303
1304      For non-relaxable macros, both elements give the number of
1305      instructions for the macro.  */
1306   unsigned int insns[2];
1307
1308   /* The first variant frag for this macro.  */
1309   fragS *first_frag;
1310 } mips_macro_warning;
1311 \f
1312 /* Prototypes for static functions.  */
1313
1314 #define internalError()                                                 \
1315     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1316
1317 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1318
1319 static void append_insn
1320   (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *,
1321    bfd_boolean expansionp);
1322 static void mips_no_prev_insn (void);
1323 static void macro_build (expressionS *, const char *, const char *, ...);
1324 static void mips16_macro_build
1325   (expressionS *, const char *, const char *, va_list *);
1326 static void load_register (int, expressionS *, int);
1327 static void macro_start (void);
1328 static void macro_end (void);
1329 static void macro (struct mips_cl_insn * ip);
1330 static void mips16_macro (struct mips_cl_insn * ip);
1331 static void mips_ip (char *str, struct mips_cl_insn * ip);
1332 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1333 static void mips16_immed
1334   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1335    unsigned long *, bfd_boolean *, unsigned short *);
1336 static size_t my_getSmallExpression
1337   (expressionS *, bfd_reloc_code_real_type *, char *);
1338 static void my_getExpression (expressionS *, char *);
1339 static void s_align (int);
1340 static void s_change_sec (int);
1341 static void s_change_section (int);
1342 static void s_cons (int);
1343 static void s_float_cons (int);
1344 static void s_mips_globl (int);
1345 static void s_option (int);
1346 static void s_mipsset (int);
1347 static void s_abicalls (int);
1348 static void s_cpload (int);
1349 static void s_cpsetup (int);
1350 static void s_cplocal (int);
1351 static void s_cprestore (int);
1352 static void s_cpreturn (int);
1353 static void s_dtprelword (int);
1354 static void s_dtpreldword (int);
1355 static void s_gpvalue (int);
1356 static void s_gpword (int);
1357 static void s_gpdword (int);
1358 static void s_cpadd (int);
1359 static void s_insn (int);
1360 static void md_obj_begin (void);
1361 static void md_obj_end (void);
1362 static void s_mips_ent (int);
1363 static void s_mips_end (int);
1364 static void s_mips_frame (int);
1365 static void s_mips_mask (int reg_type);
1366 static void s_mips_stab (int);
1367 static void s_mips_weakext (int);
1368 static void s_mips_file (int);
1369 static void s_mips_loc (int);
1370 static bfd_boolean pic_need_relax (symbolS *, asection *);
1371 static int relaxed_branch_length (fragS *, asection *, int);
1372 static int validate_mips_insn (const struct mips_opcode *);
1373 static int validate_micromips_insn (const struct mips_opcode *);
1374 static int relaxed_micromips_16bit_branch_length (fragS *, asection *, int);
1375 static int relaxed_micromips_32bit_branch_length (fragS *, asection *, int);
1376
1377 /* Table and functions used to map between CPU/ISA names, and
1378    ISA levels, and CPU numbers.  */
1379
1380 struct mips_cpu_info
1381 {
1382   const char *name;           /* CPU or ISA name.  */
1383   int flags;                  /* ASEs available, or ISA flag.  */
1384   int isa;                    /* ISA level.  */
1385   int cpu;                    /* CPU number (default CPU if ISA).  */
1386 };
1387
1388 #define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1389 #define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1390 #define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1391 #define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1392 #define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1393 #define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1394 #define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1395 #define MIPS_CPU_ASE_MCU        0x0080  /* CPU implements MCU ASE */
1396
1397 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1398 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1399 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1400 \f
1401 /* Pseudo-op table.
1402
1403    The following pseudo-ops from the Kane and Heinrich MIPS book
1404    should be defined here, but are currently unsupported: .alias,
1405    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1406
1407    The following pseudo-ops from the Kane and Heinrich MIPS book are
1408    specific to the type of debugging information being generated, and
1409    should be defined by the object format: .aent, .begin, .bend,
1410    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1411    .vreg.
1412
1413    The following pseudo-ops from the Kane and Heinrich MIPS book are
1414    not MIPS CPU specific, but are also not specific to the object file
1415    format.  This file is probably the best place to define them, but
1416    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1417
1418 static const pseudo_typeS mips_pseudo_table[] =
1419 {
1420   /* MIPS specific pseudo-ops.  */
1421   {"option", s_option, 0},
1422   {"set", s_mipsset, 0},
1423   {"rdata", s_change_sec, 'r'},
1424   {"sdata", s_change_sec, 's'},
1425   {"livereg", s_ignore, 0},
1426   {"abicalls", s_abicalls, 0},
1427   {"cpload", s_cpload, 0},
1428   {"cpsetup", s_cpsetup, 0},
1429   {"cplocal", s_cplocal, 0},
1430   {"cprestore", s_cprestore, 0},
1431   {"cpreturn", s_cpreturn, 0},
1432   {"dtprelword", s_dtprelword, 0},
1433   {"dtpreldword", s_dtpreldword, 0},
1434   {"gpvalue", s_gpvalue, 0},
1435   {"gpword", s_gpword, 0},
1436   {"gpdword", s_gpdword, 0},
1437   {"cpadd", s_cpadd, 0},
1438   {"insn", s_insn, 0},
1439
1440   /* Relatively generic pseudo-ops that happen to be used on MIPS
1441      chips.  */
1442   {"asciiz", stringer, 8 + 1},
1443   {"bss", s_change_sec, 'b'},
1444   {"err", s_err, 0},
1445   {"half", s_cons, 1},
1446   {"dword", s_cons, 3},
1447   {"weakext", s_mips_weakext, 0},
1448   {"origin", s_org, 0},
1449   {"repeat", s_rept, 0},
1450
1451   /* For MIPS this is non-standard, but we define it for consistency.  */
1452   {"sbss", s_change_sec, 'B'},
1453
1454   /* These pseudo-ops are defined in read.c, but must be overridden
1455      here for one reason or another.  */
1456   {"align", s_align, 0},
1457   {"byte", s_cons, 0},
1458   {"data", s_change_sec, 'd'},
1459   {"double", s_float_cons, 'd'},
1460   {"float", s_float_cons, 'f'},
1461   {"globl", s_mips_globl, 0},
1462   {"global", s_mips_globl, 0},
1463   {"hword", s_cons, 1},
1464   {"int", s_cons, 2},
1465   {"long", s_cons, 2},
1466   {"octa", s_cons, 4},
1467   {"quad", s_cons, 3},
1468   {"section", s_change_section, 0},
1469   {"short", s_cons, 1},
1470   {"single", s_float_cons, 'f'},
1471   {"stabn", s_mips_stab, 'n'},
1472   {"text", s_change_sec, 't'},
1473   {"word", s_cons, 2},
1474
1475   { "extern", ecoff_directive_extern, 0},
1476
1477   { NULL, NULL, 0 },
1478 };
1479
1480 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1481 {
1482   /* These pseudo-ops should be defined by the object file format.
1483      However, a.out doesn't support them, so we have versions here.  */
1484   {"aent", s_mips_ent, 1},
1485   {"bgnb", s_ignore, 0},
1486   {"end", s_mips_end, 0},
1487   {"endb", s_ignore, 0},
1488   {"ent", s_mips_ent, 0},
1489   {"file", s_mips_file, 0},
1490   {"fmask", s_mips_mask, 'F'},
1491   {"frame", s_mips_frame, 0},
1492   {"loc", s_mips_loc, 0},
1493   {"mask", s_mips_mask, 'R'},
1494   {"verstamp", s_ignore, 0},
1495   { NULL, NULL, 0 },
1496 };
1497
1498 /* Export the ABI address size for use by TC_ADDRESS_BYTES for the
1499    purpose of the `.dc.a' internal pseudo-op.  */
1500
1501 int
1502 mips_address_bytes (void)
1503 {
1504   return HAVE_64BIT_ADDRESSES ? 8 : 4;
1505 }
1506
1507 extern void pop_insert (const pseudo_typeS *);
1508
1509 void
1510 mips_pop_insert (void)
1511 {
1512   pop_insert (mips_pseudo_table);
1513   if (! ECOFF_DEBUGGING)
1514     pop_insert (mips_nonecoff_pseudo_table);
1515 }
1516 \f
1517 /* Symbols labelling the current insn.  */
1518
1519 struct insn_label_list
1520 {
1521   struct insn_label_list *next;
1522   symbolS *label;
1523 };
1524
1525 static struct insn_label_list *free_insn_labels;
1526 #define label_list tc_segment_info_data.labels
1527
1528 static void mips_clear_insn_labels (void);
1529 static void mips_mark_labels (void);
1530 static void mips_compressed_mark_labels (void);
1531
1532 static inline void
1533 mips_clear_insn_labels (void)
1534 {
1535   register struct insn_label_list **pl;
1536   segment_info_type *si;
1537
1538   if (now_seg)
1539     {
1540       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1541         ;
1542       
1543       si = seg_info (now_seg);
1544       *pl = si->label_list;
1545       si->label_list = NULL;
1546     }
1547 }
1548
1549 /* Mark instruction labels in MIPS16/microMIPS mode.  */
1550
1551 static inline void
1552 mips_mark_labels (void)
1553 {
1554   if (HAVE_CODE_COMPRESSION)
1555     mips_compressed_mark_labels ();
1556 }
1557 \f
1558 static char *expr_end;
1559
1560 /* Expressions which appear in instructions.  These are set by
1561    mips_ip.  */
1562
1563 static expressionS imm_expr;
1564 static expressionS imm2_expr;
1565 static expressionS offset_expr;
1566
1567 /* Relocs associated with imm_expr and offset_expr.  */
1568
1569 static bfd_reloc_code_real_type imm_reloc[3]
1570   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1571 static bfd_reloc_code_real_type offset_reloc[3]
1572   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1573
1574 /* This is set to the resulting size of the instruction to be produced
1575    by mips16_ip if an explicit extension is used or by mips_ip if an
1576    explicit size is supplied.  */
1577
1578 static unsigned int forced_insn_length;
1579
1580 #ifdef OBJ_ELF
1581 /* The pdr segment for per procedure frame/regmask info.  Not used for
1582    ECOFF debugging.  */
1583
1584 static segT pdr_seg;
1585 #endif
1586
1587 /* The default target format to use.  */
1588
1589 #if defined (TE_FreeBSD)
1590 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips-freebsd"
1591 #elif defined (TE_TMIPS)
1592 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips"
1593 #else
1594 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX ENDIAN "mips"
1595 #endif
1596
1597 const char *
1598 mips_target_format (void)
1599 {
1600   switch (OUTPUT_FLAVOR)
1601     {
1602     case bfd_target_ecoff_flavour:
1603       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1604     case bfd_target_coff_flavour:
1605       return "pe-mips";
1606     case bfd_target_elf_flavour:
1607 #ifdef TE_VXWORKS
1608       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1609         return (target_big_endian
1610                 ? "elf32-bigmips-vxworks"
1611                 : "elf32-littlemips-vxworks");
1612 #endif
1613       return (target_big_endian
1614               ? (HAVE_64BIT_OBJECTS
1615                  ? ELF_TARGET ("elf64-", "big")
1616                  : (HAVE_NEWABI
1617                     ? ELF_TARGET ("elf32-n", "big")
1618                     : ELF_TARGET ("elf32-", "big")))
1619               : (HAVE_64BIT_OBJECTS
1620                  ? ELF_TARGET ("elf64-", "little")
1621                  : (HAVE_NEWABI
1622                     ? ELF_TARGET ("elf32-n", "little")
1623                     : ELF_TARGET ("elf32-", "little"))));
1624     default:
1625       abort ();
1626       return NULL;
1627     }
1628 }
1629
1630 /* Return the length of a microMIPS instruction in bytes.  If bits of
1631    the mask beyond the low 16 are 0, then it is a 16-bit instruction.
1632    Otherwise assume a 32-bit instruction; 48-bit instructions (0x1f
1633    major opcode) will require further modifications to the opcode
1634    table.  */
1635
1636 static inline unsigned int
1637 micromips_insn_length (const struct mips_opcode *mo)
1638 {
1639   return (mo->mask >> 16) == 0 ? 2 : 4;
1640 }
1641
1642 /* Return the length of instruction INSN.  */
1643
1644 static inline unsigned int
1645 insn_length (const struct mips_cl_insn *insn)
1646 {
1647   if (mips_opts.micromips)
1648     return micromips_insn_length (insn->insn_mo);
1649   else if (mips_opts.mips16)
1650     return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1651   else
1652     return 4;
1653 }
1654
1655 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1656
1657 static void
1658 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1659 {
1660   size_t i;
1661
1662   insn->insn_mo = mo;
1663   insn->use_extend = FALSE;
1664   insn->extend = 0;
1665   insn->insn_opcode = mo->match;
1666   insn->frag = NULL;
1667   insn->where = 0;
1668   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1669     insn->fixp[i] = NULL;
1670   insn->fixed_p = (mips_opts.noreorder > 0);
1671   insn->noreorder_p = (mips_opts.noreorder > 0);
1672   insn->mips16_absolute_jump_p = 0;
1673   insn->complete_p = 0;
1674 }
1675
1676 /* Record the current MIPS16/microMIPS mode in now_seg.  */
1677
1678 static void
1679 mips_record_compressed_mode (void)
1680 {
1681   segment_info_type *si;
1682
1683   si = seg_info (now_seg);
1684   if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1685     si->tc_segment_info_data.mips16 = mips_opts.mips16;
1686   if (si->tc_segment_info_data.micromips != mips_opts.micromips)
1687     si->tc_segment_info_data.micromips = mips_opts.micromips;
1688 }
1689
1690 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1691
1692 static void
1693 install_insn (const struct mips_cl_insn *insn)
1694 {
1695   char *f = insn->frag->fr_literal + insn->where;
1696   if (!HAVE_CODE_COMPRESSION)
1697     md_number_to_chars (f, insn->insn_opcode, 4);
1698   else if (mips_opts.micromips)
1699     {
1700       unsigned int length = insn_length (insn);
1701       if (length == 2)
1702         md_number_to_chars (f, insn->insn_opcode, 2);
1703       else if (length == 4)
1704         {
1705           md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1706           f += 2;
1707           md_number_to_chars (f, insn->insn_opcode & 0xffff, 2);
1708         }
1709       else
1710         as_bad (_("48-bit microMIPS instructions are not supported"));
1711     }
1712   else if (insn->mips16_absolute_jump_p)
1713     {
1714       md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1715       md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1716     }
1717   else
1718     {
1719       if (insn->use_extend)
1720         {
1721           md_number_to_chars (f, 0xf000 | insn->extend, 2);
1722           f += 2;
1723         }
1724       md_number_to_chars (f, insn->insn_opcode, 2);
1725     }
1726   mips_record_compressed_mode ();
1727 }
1728
1729 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1730    and install the opcode in the new location.  */
1731
1732 static void
1733 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1734 {
1735   size_t i;
1736
1737   insn->frag = frag;
1738   insn->where = where;
1739   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1740     if (insn->fixp[i] != NULL)
1741       {
1742         insn->fixp[i]->fx_frag = frag;
1743         insn->fixp[i]->fx_where = where;
1744       }
1745   install_insn (insn);
1746 }
1747
1748 /* Add INSN to the end of the output.  */
1749
1750 static void
1751 add_fixed_insn (struct mips_cl_insn *insn)
1752 {
1753   char *f = frag_more (insn_length (insn));
1754   move_insn (insn, frag_now, f - frag_now->fr_literal);
1755 }
1756
1757 /* Start a variant frag and move INSN to the start of the variant part,
1758    marking it as fixed.  The other arguments are as for frag_var.  */
1759
1760 static void
1761 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1762                   relax_substateT subtype, symbolS *symbol, offsetT offset)
1763 {
1764   frag_grow (max_chars);
1765   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1766   insn->fixed_p = 1;
1767   frag_var (rs_machine_dependent, max_chars, var,
1768             subtype, symbol, offset, NULL);
1769 }
1770
1771 /* Insert N copies of INSN into the history buffer, starting at
1772    position FIRST.  Neither FIRST nor N need to be clipped.  */
1773
1774 static void
1775 insert_into_history (unsigned int first, unsigned int n,
1776                      const struct mips_cl_insn *insn)
1777 {
1778   if (mips_relax.sequence != 2)
1779     {
1780       unsigned int i;
1781
1782       for (i = ARRAY_SIZE (history); i-- > first;)
1783         if (i >= first + n)
1784           history[i] = history[i - n];
1785         else
1786           history[i] = *insn;
1787     }
1788 }
1789
1790 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1791    the idea is to make it obvious at a glance that each errata is
1792    included.  */
1793
1794 static void
1795 init_vr4120_conflicts (void)
1796 {
1797 #define CONFLICT(FIRST, SECOND) \
1798     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1799
1800   /* Errata 21 - [D]DIV[U] after [D]MACC */
1801   CONFLICT (MACC, DIV);
1802   CONFLICT (DMACC, DIV);
1803
1804   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1805   CONFLICT (DMULT, DMULT);
1806   CONFLICT (DMULT, DMACC);
1807   CONFLICT (DMACC, DMULT);
1808   CONFLICT (DMACC, DMACC);
1809
1810   /* Errata 24 - MT{LO,HI} after [D]MACC */
1811   CONFLICT (MACC, MTHILO);
1812   CONFLICT (DMACC, MTHILO);
1813
1814   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1815      instruction is executed immediately after a MACC or DMACC
1816      instruction, the result of [either instruction] is incorrect."  */
1817   CONFLICT (MACC, MULT);
1818   CONFLICT (MACC, DMULT);
1819   CONFLICT (DMACC, MULT);
1820   CONFLICT (DMACC, DMULT);
1821
1822   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1823      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1824      DDIV or DDIVU instruction, the result of the MACC or
1825      DMACC instruction is incorrect.".  */
1826   CONFLICT (DMULT, MACC);
1827   CONFLICT (DMULT, DMACC);
1828   CONFLICT (DIV, MACC);
1829   CONFLICT (DIV, DMACC);
1830
1831 #undef CONFLICT
1832 }
1833
1834 struct regname {
1835   const char *name;
1836   unsigned int num;
1837 };
1838
1839 #define RTYPE_MASK      0x1ff00
1840 #define RTYPE_NUM       0x00100
1841 #define RTYPE_FPU       0x00200
1842 #define RTYPE_FCC       0x00400
1843 #define RTYPE_VEC       0x00800
1844 #define RTYPE_GP        0x01000
1845 #define RTYPE_CP0       0x02000
1846 #define RTYPE_PC        0x04000
1847 #define RTYPE_ACC       0x08000
1848 #define RTYPE_CCC       0x10000
1849 #define RNUM_MASK       0x000ff
1850 #define RWARN           0x80000
1851
1852 #define GENERIC_REGISTER_NUMBERS \
1853     {"$0",      RTYPE_NUM | 0},  \
1854     {"$1",      RTYPE_NUM | 1},  \
1855     {"$2",      RTYPE_NUM | 2},  \
1856     {"$3",      RTYPE_NUM | 3},  \
1857     {"$4",      RTYPE_NUM | 4},  \
1858     {"$5",      RTYPE_NUM | 5},  \
1859     {"$6",      RTYPE_NUM | 6},  \
1860     {"$7",      RTYPE_NUM | 7},  \
1861     {"$8",      RTYPE_NUM | 8},  \
1862     {"$9",      RTYPE_NUM | 9},  \
1863     {"$10",     RTYPE_NUM | 10}, \
1864     {"$11",     RTYPE_NUM | 11}, \
1865     {"$12",     RTYPE_NUM | 12}, \
1866     {"$13",     RTYPE_NUM | 13}, \
1867     {"$14",     RTYPE_NUM | 14}, \
1868     {"$15",     RTYPE_NUM | 15}, \
1869     {"$16",     RTYPE_NUM | 16}, \
1870     {"$17",     RTYPE_NUM | 17}, \
1871     {"$18",     RTYPE_NUM | 18}, \
1872     {"$19",     RTYPE_NUM | 19}, \
1873     {"$20",     RTYPE_NUM | 20}, \
1874     {"$21",     RTYPE_NUM | 21}, \
1875     {"$22",     RTYPE_NUM | 22}, \
1876     {"$23",     RTYPE_NUM | 23}, \
1877     {"$24",     RTYPE_NUM | 24}, \
1878     {"$25",     RTYPE_NUM | 25}, \
1879     {"$26",     RTYPE_NUM | 26}, \
1880     {"$27",     RTYPE_NUM | 27}, \
1881     {"$28",     RTYPE_NUM | 28}, \
1882     {"$29",     RTYPE_NUM | 29}, \
1883     {"$30",     RTYPE_NUM | 30}, \
1884     {"$31",     RTYPE_NUM | 31} 
1885
1886 #define FPU_REGISTER_NAMES       \
1887     {"$f0",     RTYPE_FPU | 0},  \
1888     {"$f1",     RTYPE_FPU | 1},  \
1889     {"$f2",     RTYPE_FPU | 2},  \
1890     {"$f3",     RTYPE_FPU | 3},  \
1891     {"$f4",     RTYPE_FPU | 4},  \
1892     {"$f5",     RTYPE_FPU | 5},  \
1893     {"$f6",     RTYPE_FPU | 6},  \
1894     {"$f7",     RTYPE_FPU | 7},  \
1895     {"$f8",     RTYPE_FPU | 8},  \
1896     {"$f9",     RTYPE_FPU | 9},  \
1897     {"$f10",    RTYPE_FPU | 10}, \
1898     {"$f11",    RTYPE_FPU | 11}, \
1899     {"$f12",    RTYPE_FPU | 12}, \
1900     {"$f13",    RTYPE_FPU | 13}, \
1901     {"$f14",    RTYPE_FPU | 14}, \
1902     {"$f15",    RTYPE_FPU | 15}, \
1903     {"$f16",    RTYPE_FPU | 16}, \
1904     {"$f17",    RTYPE_FPU | 17}, \
1905     {"$f18",    RTYPE_FPU | 18}, \
1906     {"$f19",    RTYPE_FPU | 19}, \
1907     {"$f20",    RTYPE_FPU | 20}, \
1908     {"$f21",    RTYPE_FPU | 21}, \
1909     {"$f22",    RTYPE_FPU | 22}, \
1910     {"$f23",    RTYPE_FPU | 23}, \
1911     {"$f24",    RTYPE_FPU | 24}, \
1912     {"$f25",    RTYPE_FPU | 25}, \
1913     {"$f26",    RTYPE_FPU | 26}, \
1914     {"$f27",    RTYPE_FPU | 27}, \
1915     {"$f28",    RTYPE_FPU | 28}, \
1916     {"$f29",    RTYPE_FPU | 29}, \
1917     {"$f30",    RTYPE_FPU | 30}, \
1918     {"$f31",    RTYPE_FPU | 31}
1919
1920 #define FPU_CONDITION_CODE_NAMES \
1921     {"$fcc0",   RTYPE_FCC | 0},  \
1922     {"$fcc1",   RTYPE_FCC | 1},  \
1923     {"$fcc2",   RTYPE_FCC | 2},  \
1924     {"$fcc3",   RTYPE_FCC | 3},  \
1925     {"$fcc4",   RTYPE_FCC | 4},  \
1926     {"$fcc5",   RTYPE_FCC | 5},  \
1927     {"$fcc6",   RTYPE_FCC | 6},  \
1928     {"$fcc7",   RTYPE_FCC | 7}
1929
1930 #define COPROC_CONDITION_CODE_NAMES         \
1931     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1932     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1933     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1934     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1935     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1936     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1937     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1938     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1939
1940 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1941     {"$a4",     RTYPE_GP | 8},  \
1942     {"$a5",     RTYPE_GP | 9},  \
1943     {"$a6",     RTYPE_GP | 10}, \
1944     {"$a7",     RTYPE_GP | 11}, \
1945     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1946     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1947     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1948     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1949     {"$t0",     RTYPE_GP | 12}, \
1950     {"$t1",     RTYPE_GP | 13}, \
1951     {"$t2",     RTYPE_GP | 14}, \
1952     {"$t3",     RTYPE_GP | 15}
1953
1954 #define O32_SYMBOLIC_REGISTER_NAMES \
1955     {"$t0",     RTYPE_GP | 8},  \
1956     {"$t1",     RTYPE_GP | 9},  \
1957     {"$t2",     RTYPE_GP | 10}, \
1958     {"$t3",     RTYPE_GP | 11}, \
1959     {"$t4",     RTYPE_GP | 12}, \
1960     {"$t5",     RTYPE_GP | 13}, \
1961     {"$t6",     RTYPE_GP | 14}, \
1962     {"$t7",     RTYPE_GP | 15}, \
1963     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
1964     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
1965     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
1966     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */ 
1967
1968 /* Remaining symbolic register names */
1969 #define SYMBOLIC_REGISTER_NAMES \
1970     {"$zero",   RTYPE_GP | 0},  \
1971     {"$at",     RTYPE_GP | 1},  \
1972     {"$AT",     RTYPE_GP | 1},  \
1973     {"$v0",     RTYPE_GP | 2},  \
1974     {"$v1",     RTYPE_GP | 3},  \
1975     {"$a0",     RTYPE_GP | 4},  \
1976     {"$a1",     RTYPE_GP | 5},  \
1977     {"$a2",     RTYPE_GP | 6},  \
1978     {"$a3",     RTYPE_GP | 7},  \
1979     {"$s0",     RTYPE_GP | 16}, \
1980     {"$s1",     RTYPE_GP | 17}, \
1981     {"$s2",     RTYPE_GP | 18}, \
1982     {"$s3",     RTYPE_GP | 19}, \
1983     {"$s4",     RTYPE_GP | 20}, \
1984     {"$s5",     RTYPE_GP | 21}, \
1985     {"$s6",     RTYPE_GP | 22}, \
1986     {"$s7",     RTYPE_GP | 23}, \
1987     {"$t8",     RTYPE_GP | 24}, \
1988     {"$t9",     RTYPE_GP | 25}, \
1989     {"$k0",     RTYPE_GP | 26}, \
1990     {"$kt0",    RTYPE_GP | 26}, \
1991     {"$k1",     RTYPE_GP | 27}, \
1992     {"$kt1",    RTYPE_GP | 27}, \
1993     {"$gp",     RTYPE_GP | 28}, \
1994     {"$sp",     RTYPE_GP | 29}, \
1995     {"$s8",     RTYPE_GP | 30}, \
1996     {"$fp",     RTYPE_GP | 30}, \
1997     {"$ra",     RTYPE_GP | 31}
1998
1999 #define MIPS16_SPECIAL_REGISTER_NAMES \
2000     {"$pc",     RTYPE_PC | 0}
2001
2002 #define MDMX_VECTOR_REGISTER_NAMES \
2003     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
2004     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
2005     {"$v2",     RTYPE_VEC | 2},  \
2006     {"$v3",     RTYPE_VEC | 3},  \
2007     {"$v4",     RTYPE_VEC | 4},  \
2008     {"$v5",     RTYPE_VEC | 5},  \
2009     {"$v6",     RTYPE_VEC | 6},  \
2010     {"$v7",     RTYPE_VEC | 7},  \
2011     {"$v8",     RTYPE_VEC | 8},  \
2012     {"$v9",     RTYPE_VEC | 9},  \
2013     {"$v10",    RTYPE_VEC | 10}, \
2014     {"$v11",    RTYPE_VEC | 11}, \
2015     {"$v12",    RTYPE_VEC | 12}, \
2016     {"$v13",    RTYPE_VEC | 13}, \
2017     {"$v14",    RTYPE_VEC | 14}, \
2018     {"$v15",    RTYPE_VEC | 15}, \
2019     {"$v16",    RTYPE_VEC | 16}, \
2020     {"$v17",    RTYPE_VEC | 17}, \
2021     {"$v18",    RTYPE_VEC | 18}, \
2022     {"$v19",    RTYPE_VEC | 19}, \
2023     {"$v20",    RTYPE_VEC | 20}, \
2024     {"$v21",    RTYPE_VEC | 21}, \
2025     {"$v22",    RTYPE_VEC | 22}, \
2026     {"$v23",    RTYPE_VEC | 23}, \
2027     {"$v24",    RTYPE_VEC | 24}, \
2028     {"$v25",    RTYPE_VEC | 25}, \
2029     {"$v26",    RTYPE_VEC | 26}, \
2030     {"$v27",    RTYPE_VEC | 27}, \
2031     {"$v28",    RTYPE_VEC | 28}, \
2032     {"$v29",    RTYPE_VEC | 29}, \
2033     {"$v30",    RTYPE_VEC | 30}, \
2034     {"$v31",    RTYPE_VEC | 31}
2035
2036 #define MIPS_DSP_ACCUMULATOR_NAMES \
2037     {"$ac0",    RTYPE_ACC | 0}, \
2038     {"$ac1",    RTYPE_ACC | 1}, \
2039     {"$ac2",    RTYPE_ACC | 2}, \
2040     {"$ac3",    RTYPE_ACC | 3}
2041
2042 static const struct regname reg_names[] = {
2043   GENERIC_REGISTER_NUMBERS,
2044   FPU_REGISTER_NAMES,
2045   FPU_CONDITION_CODE_NAMES,
2046   COPROC_CONDITION_CODE_NAMES,
2047
2048   /* The $txx registers depends on the abi,
2049      these will be added later into the symbol table from
2050      one of the tables below once mips_abi is set after 
2051      parsing of arguments from the command line. */
2052   SYMBOLIC_REGISTER_NAMES,
2053
2054   MIPS16_SPECIAL_REGISTER_NAMES,
2055   MDMX_VECTOR_REGISTER_NAMES,
2056   MIPS_DSP_ACCUMULATOR_NAMES,
2057   {0, 0}
2058 };
2059
2060 static const struct regname reg_names_o32[] = {
2061   O32_SYMBOLIC_REGISTER_NAMES,
2062   {0, 0}
2063 };
2064
2065 static const struct regname reg_names_n32n64[] = {
2066   N32N64_SYMBOLIC_REGISTER_NAMES,
2067   {0, 0}
2068 };
2069
2070 /* Check if S points at a valid register specifier according to TYPES.
2071    If so, then return 1, advance S to consume the specifier and store
2072    the register's number in REGNOP, otherwise return 0.  */
2073
2074 static int
2075 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
2076 {
2077   symbolS *symbolP;
2078   char *e;
2079   char save_c;
2080   int reg = -1;
2081
2082   /* Find end of name.  */
2083   e = *s;
2084   if (is_name_beginner (*e))
2085     ++e;
2086   while (is_part_of_name (*e))
2087     ++e;
2088
2089   /* Terminate name.  */
2090   save_c = *e;
2091   *e = '\0';
2092
2093   /* Look for a register symbol.  */
2094   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
2095     {
2096       int r = S_GET_VALUE (symbolP);
2097       if (r & types)
2098         reg = r & RNUM_MASK;
2099       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
2100         /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
2101         reg = (r & RNUM_MASK) - 2;
2102     }
2103   /* Else see if this is a register defined in an itbl entry.  */
2104   else if ((types & RTYPE_GP) && itbl_have_entries)
2105     {
2106       char *n = *s;
2107       unsigned long r;
2108
2109       if (*n == '$')
2110         ++n;
2111       if (itbl_get_reg_val (n, &r))
2112         reg = r & RNUM_MASK;
2113     }
2114
2115   /* Advance to next token if a register was recognised.  */
2116   if (reg >= 0)
2117     *s = e;
2118   else if (types & RWARN)
2119     as_warn (_("Unrecognized register name `%s'"), *s);
2120
2121   *e = save_c;
2122   if (regnop)
2123     *regnop = reg;
2124   return reg >= 0;
2125 }
2126
2127 /* Check if S points at a valid register list according to TYPES.
2128    If so, then return 1, advance S to consume the list and store
2129    the registers present on the list as a bitmask of ones in REGLISTP,
2130    otherwise return 0.  A valid list comprises a comma-separated
2131    enumeration of valid single registers and/or dash-separated
2132    contiguous register ranges as determined by their numbers.
2133
2134    As a special exception if one of s0-s7 registers is specified as
2135    the range's lower delimiter and s8 (fp) is its upper one, then no
2136    registers whose numbers place them between s7 and s8 (i.e. $24-$29)
2137    are selected; they have to be listed separately if needed.  */
2138
2139 static int
2140 reglist_lookup (char **s, unsigned int types, unsigned int *reglistp)
2141 {
2142   unsigned int reglist = 0;
2143   unsigned int lastregno;
2144   bfd_boolean ok = TRUE;
2145   unsigned int regmask;
2146   char *s_endlist = *s;
2147   char *s_reset = *s;
2148   unsigned int regno;
2149
2150   while (reg_lookup (s, types, &regno))
2151     {
2152       lastregno = regno;
2153       if (**s == '-')
2154         {
2155           (*s)++;
2156           ok = reg_lookup (s, types, &lastregno);
2157           if (ok && lastregno < regno)
2158             ok = FALSE;
2159           if (!ok)
2160             break;
2161         }
2162
2163       if (lastregno == FP && regno >= S0 && regno <= S7)
2164         {
2165           lastregno = S7;
2166           reglist |= 1 << FP;
2167         }
2168       regmask = 1 << lastregno;
2169       regmask = (regmask << 1) - 1;
2170       regmask ^= (1 << regno) - 1;
2171       reglist |= regmask;
2172
2173       s_endlist = *s;
2174       if (**s != ',')
2175         break;
2176       (*s)++;
2177     }
2178
2179   if (ok)
2180     *s = s_endlist;
2181   else
2182     *s = s_reset;
2183   if (reglistp)
2184     *reglistp = reglist;
2185   return ok && reglist != 0;
2186 }
2187
2188 /* Return TRUE if opcode MO is valid on the currently selected ISA and
2189    architecture.  Use is_opcode_valid_16 for MIPS16 opcodes.  */
2190
2191 static bfd_boolean
2192 is_opcode_valid (const struct mips_opcode *mo)
2193 {
2194   int isa = mips_opts.isa;
2195   int fp_s, fp_d;
2196
2197   if (mips_opts.ase_mdmx)
2198     isa |= INSN_MDMX;
2199   if (mips_opts.ase_dsp)
2200     isa |= INSN_DSP;
2201   if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
2202     isa |= INSN_DSP64;
2203   if (mips_opts.ase_dspr2)
2204     isa |= INSN_DSPR2;
2205   if (mips_opts.ase_mt)
2206     isa |= INSN_MT;
2207   if (mips_opts.ase_mips3d)
2208     isa |= INSN_MIPS3D;
2209   if (mips_opts.ase_smartmips)
2210     isa |= INSN_SMARTMIPS;
2211   if (mips_opts.ase_mcu)
2212     isa |= INSN_MCU;
2213
2214   /* Don't accept instructions based on the ISA if the CPU does not implement
2215      all the coprocessor insns. */
2216   if (NO_ISA_COP (mips_opts.arch)
2217       && COP_INSN (mo->pinfo))
2218     isa = 0;
2219
2220   if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
2221     return FALSE;
2222
2223   /* Check whether the instruction or macro requires single-precision or
2224      double-precision floating-point support.  Note that this information is
2225      stored differently in the opcode table for insns and macros.  */
2226   if (mo->pinfo == INSN_MACRO)
2227     {
2228       fp_s = mo->pinfo2 & INSN2_M_FP_S;
2229       fp_d = mo->pinfo2 & INSN2_M_FP_D;
2230     }
2231   else
2232     {
2233       fp_s = mo->pinfo & FP_S;
2234       fp_d = mo->pinfo & FP_D;
2235     }
2236
2237   if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
2238     return FALSE;
2239
2240   if (fp_s && mips_opts.soft_float)
2241     return FALSE;
2242
2243   return TRUE;
2244 }
2245
2246 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
2247    selected ISA and architecture.  */
2248
2249 static bfd_boolean
2250 is_opcode_valid_16 (const struct mips_opcode *mo)
2251 {
2252   return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
2253 }
2254
2255 /* Return TRUE if the size of the microMIPS opcode MO matches one
2256    explicitly requested.  Always TRUE in the standard MIPS mode.  */
2257
2258 static bfd_boolean
2259 is_size_valid (const struct mips_opcode *mo)
2260 {
2261   if (!mips_opts.micromips)
2262     return TRUE;
2263
2264   if (!forced_insn_length)
2265     return TRUE;
2266   if (mo->pinfo == INSN_MACRO)
2267     return FALSE;
2268   return forced_insn_length == micromips_insn_length (mo);
2269 }
2270
2271 /* Return TRUE if the microMIPS opcode MO is valid for the delay slot
2272    of the preceding instruction.  Always TRUE in the standard MIPS mode.  */
2273
2274 static bfd_boolean
2275 is_delay_slot_valid (const struct mips_opcode *mo)
2276 {
2277   if (!mips_opts.micromips)
2278     return TRUE;
2279
2280   if (mo->pinfo == INSN_MACRO)
2281     return TRUE;
2282   if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
2283       && micromips_insn_length (mo) != 4)
2284     return FALSE;
2285   if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
2286       && micromips_insn_length (mo) != 2)
2287     return FALSE;
2288
2289   return TRUE;
2290 }
2291
2292 /* This function is called once, at assembler startup time.  It should set up
2293    all the tables, etc. that the MD part of the assembler will need.  */
2294
2295 void
2296 md_begin (void)
2297 {
2298   const char *retval = NULL;
2299   int i = 0;
2300   int broken = 0;
2301
2302   if (mips_pic != NO_PIC)
2303     {
2304       if (g_switch_seen && g_switch_value != 0)
2305         as_bad (_("-G may not be used in position-independent code"));
2306       g_switch_value = 0;
2307     }
2308
2309   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
2310     as_warn (_("Could not set architecture and machine"));
2311
2312   op_hash = hash_new ();
2313
2314   for (i = 0; i < NUMOPCODES;)
2315     {
2316       const char *name = mips_opcodes[i].name;
2317
2318       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
2319       if (retval != NULL)
2320         {
2321           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
2322                    mips_opcodes[i].name, retval);
2323           /* Probably a memory allocation problem?  Give up now.  */
2324           as_fatal (_("Broken assembler.  No assembly attempted."));
2325         }
2326       do
2327         {
2328           if (mips_opcodes[i].pinfo != INSN_MACRO)
2329             {
2330               if (!validate_mips_insn (&mips_opcodes[i]))
2331                 broken = 1;
2332               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2333                 {
2334                   create_insn (&nop_insn, mips_opcodes + i);
2335                   if (mips_fix_loongson2f_nop)
2336                     nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
2337                   nop_insn.fixed_p = 1;
2338                 }
2339             }
2340           ++i;
2341         }
2342       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
2343     }
2344
2345   mips16_op_hash = hash_new ();
2346
2347   i = 0;
2348   while (i < bfd_mips16_num_opcodes)
2349     {
2350       const char *name = mips16_opcodes[i].name;
2351
2352       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
2353       if (retval != NULL)
2354         as_fatal (_("internal: can't hash `%s': %s"),
2355                   mips16_opcodes[i].name, retval);
2356       do
2357         {
2358           if (mips16_opcodes[i].pinfo != INSN_MACRO
2359               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
2360                   != mips16_opcodes[i].match))
2361             {
2362               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
2363                        mips16_opcodes[i].name, mips16_opcodes[i].args);
2364               broken = 1;
2365             }
2366           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2367             {
2368               create_insn (&mips16_nop_insn, mips16_opcodes + i);
2369               mips16_nop_insn.fixed_p = 1;
2370             }
2371           ++i;
2372         }
2373       while (i < bfd_mips16_num_opcodes
2374              && strcmp (mips16_opcodes[i].name, name) == 0);
2375     }
2376
2377   micromips_op_hash = hash_new ();
2378
2379   i = 0;
2380   while (i < bfd_micromips_num_opcodes)
2381     {
2382       const char *name = micromips_opcodes[i].name;
2383
2384       retval = hash_insert (micromips_op_hash, name,
2385                             (void *) &micromips_opcodes[i]);
2386       if (retval != NULL)
2387         as_fatal (_("internal: can't hash `%s': %s"),
2388                   micromips_opcodes[i].name, retval);
2389       do
2390         if (micromips_opcodes[i].pinfo != INSN_MACRO)
2391           {
2392             struct mips_cl_insn *micromips_nop_insn;
2393
2394             if (!validate_micromips_insn (&micromips_opcodes[i]))
2395               broken = 1;
2396
2397             if (micromips_insn_length (micromips_opcodes + i) == 2)
2398               micromips_nop_insn = &micromips_nop16_insn;
2399             else if (micromips_insn_length (micromips_opcodes + i) == 4)
2400               micromips_nop_insn = &micromips_nop32_insn;
2401             else
2402               continue;
2403
2404             if (micromips_nop_insn->insn_mo == NULL
2405                 && strcmp (name, "nop") == 0)
2406               {
2407                 create_insn (micromips_nop_insn, micromips_opcodes + i);
2408                 micromips_nop_insn->fixed_p = 1;
2409               }
2410           }
2411       while (++i < bfd_micromips_num_opcodes
2412              && strcmp (micromips_opcodes[i].name, name) == 0);
2413     }
2414
2415   if (broken)
2416     as_fatal (_("Broken assembler.  No assembly attempted."));
2417
2418   /* We add all the general register names to the symbol table.  This
2419      helps us detect invalid uses of them.  */
2420   for (i = 0; reg_names[i].name; i++) 
2421     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
2422                                      reg_names[i].num, /* & RNUM_MASK, */
2423                                      &zero_address_frag));
2424   if (HAVE_NEWABI)
2425     for (i = 0; reg_names_n32n64[i].name; i++) 
2426       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
2427                                        reg_names_n32n64[i].num, /* & RNUM_MASK, */
2428                                        &zero_address_frag));
2429   else
2430     for (i = 0; reg_names_o32[i].name; i++) 
2431       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
2432                                        reg_names_o32[i].num, /* & RNUM_MASK, */
2433                                        &zero_address_frag));
2434
2435   mips_no_prev_insn ();
2436
2437   mips_gprmask = 0;
2438   mips_cprmask[0] = 0;
2439   mips_cprmask[1] = 0;
2440   mips_cprmask[2] = 0;
2441   mips_cprmask[3] = 0;
2442
2443   /* set the default alignment for the text section (2**2) */
2444   record_alignment (text_section, 2);
2445
2446   bfd_set_gp_size (stdoutput, g_switch_value);
2447
2448 #ifdef OBJ_ELF
2449   if (IS_ELF)
2450     {
2451       /* On a native system other than VxWorks, sections must be aligned
2452          to 16 byte boundaries.  When configured for an embedded ELF
2453          target, we don't bother.  */
2454       if (strncmp (TARGET_OS, "elf", 3) != 0
2455           && strncmp (TARGET_OS, "vxworks", 7) != 0)
2456         {
2457           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2458           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2459           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2460         }
2461
2462       /* Create a .reginfo section for register masks and a .mdebug
2463          section for debugging information.  */
2464       {
2465         segT seg;
2466         subsegT subseg;
2467         flagword flags;
2468         segT sec;
2469
2470         seg = now_seg;
2471         subseg = now_subseg;
2472
2473         /* The ABI says this section should be loaded so that the
2474            running program can access it.  However, we don't load it
2475            if we are configured for an embedded target */
2476         flags = SEC_READONLY | SEC_DATA;
2477         if (strncmp (TARGET_OS, "elf", 3) != 0)
2478           flags |= SEC_ALLOC | SEC_LOAD;
2479
2480         if (mips_abi != N64_ABI)
2481           {
2482             sec = subseg_new (".reginfo", (subsegT) 0);
2483
2484             bfd_set_section_flags (stdoutput, sec, flags);
2485             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2486
2487             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2488           }
2489         else
2490           {
2491             /* The 64-bit ABI uses a .MIPS.options section rather than
2492                .reginfo section.  */
2493             sec = subseg_new (".MIPS.options", (subsegT) 0);
2494             bfd_set_section_flags (stdoutput, sec, flags);
2495             bfd_set_section_alignment (stdoutput, sec, 3);
2496
2497             /* Set up the option header.  */
2498             {
2499               Elf_Internal_Options opthdr;
2500               char *f;
2501
2502               opthdr.kind = ODK_REGINFO;
2503               opthdr.size = (sizeof (Elf_External_Options)
2504                              + sizeof (Elf64_External_RegInfo));
2505               opthdr.section = 0;
2506               opthdr.info = 0;
2507               f = frag_more (sizeof (Elf_External_Options));
2508               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2509                                              (Elf_External_Options *) f);
2510
2511               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2512             }
2513           }
2514
2515         if (ECOFF_DEBUGGING)
2516           {
2517             sec = subseg_new (".mdebug", (subsegT) 0);
2518             (void) bfd_set_section_flags (stdoutput, sec,
2519                                           SEC_HAS_CONTENTS | SEC_READONLY);
2520             (void) bfd_set_section_alignment (stdoutput, sec, 2);
2521           }
2522         else if (mips_flag_pdr)
2523           {
2524             pdr_seg = subseg_new (".pdr", (subsegT) 0);
2525             (void) bfd_set_section_flags (stdoutput, pdr_seg,
2526                                           SEC_READONLY | SEC_RELOC
2527                                           | SEC_DEBUGGING);
2528             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2529           }
2530
2531         subseg_set (seg, subseg);
2532       }
2533     }
2534 #endif /* OBJ_ELF */
2535
2536   if (! ECOFF_DEBUGGING)
2537     md_obj_begin ();
2538
2539   if (mips_fix_vr4120)
2540     init_vr4120_conflicts ();
2541 }
2542
2543 void
2544 md_mips_end (void)
2545 {
2546   mips_emit_delays ();
2547   if (! ECOFF_DEBUGGING)
2548     md_obj_end ();
2549 }
2550
2551 void
2552 md_assemble (char *str)
2553 {
2554   struct mips_cl_insn insn;
2555   bfd_reloc_code_real_type unused_reloc[3]
2556     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2557
2558   imm_expr.X_op = O_absent;
2559   imm2_expr.X_op = O_absent;
2560   offset_expr.X_op = O_absent;
2561   imm_reloc[0] = BFD_RELOC_UNUSED;
2562   imm_reloc[1] = BFD_RELOC_UNUSED;
2563   imm_reloc[2] = BFD_RELOC_UNUSED;
2564   offset_reloc[0] = BFD_RELOC_UNUSED;
2565   offset_reloc[1] = BFD_RELOC_UNUSED;
2566   offset_reloc[2] = BFD_RELOC_UNUSED;
2567
2568   if (mips_opts.mips16)
2569     mips16_ip (str, &insn);
2570   else
2571     {
2572       mips_ip (str, &insn);
2573       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2574             str, insn.insn_opcode));
2575     }
2576
2577   if (insn_error)
2578     {
2579       as_bad ("%s `%s'", insn_error, str);
2580       return;
2581     }
2582
2583   if (insn.insn_mo->pinfo == INSN_MACRO)
2584     {
2585       macro_start ();
2586       if (mips_opts.mips16)
2587         mips16_macro (&insn);
2588       else
2589         macro (&insn);
2590       macro_end ();
2591     }
2592   else
2593     {
2594       if (imm_expr.X_op != O_absent)
2595         append_insn (&insn, &imm_expr, imm_reloc, FALSE);
2596       else if (offset_expr.X_op != O_absent)
2597         append_insn (&insn, &offset_expr, offset_reloc, FALSE);
2598       else
2599         append_insn (&insn, NULL, unused_reloc, FALSE);
2600     }
2601 }
2602
2603 /* Convenience functions for abstracting away the differences between
2604    MIPS16 and non-MIPS16 relocations.  */
2605
2606 static inline bfd_boolean
2607 mips16_reloc_p (bfd_reloc_code_real_type reloc)
2608 {
2609   switch (reloc)
2610     {
2611     case BFD_RELOC_MIPS16_JMP:
2612     case BFD_RELOC_MIPS16_GPREL:
2613     case BFD_RELOC_MIPS16_GOT16:
2614     case BFD_RELOC_MIPS16_CALL16:
2615     case BFD_RELOC_MIPS16_HI16_S:
2616     case BFD_RELOC_MIPS16_HI16:
2617     case BFD_RELOC_MIPS16_LO16:
2618       return TRUE;
2619
2620     default:
2621       return FALSE;
2622     }
2623 }
2624
2625 static inline bfd_boolean
2626 micromips_reloc_p (bfd_reloc_code_real_type reloc)
2627 {
2628   switch (reloc)
2629     {
2630     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
2631     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
2632     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
2633     case BFD_RELOC_MICROMIPS_GPREL16:
2634     case BFD_RELOC_MICROMIPS_JMP:
2635     case BFD_RELOC_MICROMIPS_HI16:
2636     case BFD_RELOC_MICROMIPS_HI16_S:
2637     case BFD_RELOC_MICROMIPS_LO16:
2638     case BFD_RELOC_MICROMIPS_LITERAL:
2639     case BFD_RELOC_MICROMIPS_GOT16:
2640     case BFD_RELOC_MICROMIPS_CALL16:
2641     case BFD_RELOC_MICROMIPS_GOT_HI16:
2642     case BFD_RELOC_MICROMIPS_GOT_LO16:
2643     case BFD_RELOC_MICROMIPS_CALL_HI16:
2644     case BFD_RELOC_MICROMIPS_CALL_LO16:
2645     case BFD_RELOC_MICROMIPS_SUB:
2646     case BFD_RELOC_MICROMIPS_GOT_PAGE:
2647     case BFD_RELOC_MICROMIPS_GOT_OFST:
2648     case BFD_RELOC_MICROMIPS_GOT_DISP:
2649     case BFD_RELOC_MICROMIPS_HIGHEST:
2650     case BFD_RELOC_MICROMIPS_HIGHER:
2651     case BFD_RELOC_MICROMIPS_SCN_DISP:
2652     case BFD_RELOC_MICROMIPS_JALR:
2653       return TRUE;
2654
2655     default:
2656       return FALSE;
2657     }
2658 }
2659
2660 static inline bfd_boolean
2661 jmp_reloc_p (bfd_reloc_code_real_type reloc)
2662 {
2663   return reloc == BFD_RELOC_MIPS_JMP || reloc == BFD_RELOC_MICROMIPS_JMP;
2664 }
2665
2666 static inline bfd_boolean
2667 got16_reloc_p (bfd_reloc_code_real_type reloc)
2668 {
2669   return (reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16
2670           || reloc == BFD_RELOC_MICROMIPS_GOT16);
2671 }
2672
2673 static inline bfd_boolean
2674 hi16_reloc_p (bfd_reloc_code_real_type reloc)
2675 {
2676   return (reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S
2677           || reloc == BFD_RELOC_MICROMIPS_HI16_S);
2678 }
2679
2680 static inline bfd_boolean
2681 lo16_reloc_p (bfd_reloc_code_real_type reloc)
2682 {
2683   return (reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16
2684           || reloc == BFD_RELOC_MICROMIPS_LO16);
2685 }
2686
2687 static inline bfd_boolean
2688 jalr_reloc_p (bfd_reloc_code_real_type reloc)
2689 {
2690   return reloc == BFD_RELOC_MIPS_JALR || reloc == BFD_RELOC_MICROMIPS_JALR;
2691 }
2692
2693 /* Return true if the given relocation might need a matching %lo().
2694    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2695    need a matching %lo() when applied to local symbols.  */
2696
2697 static inline bfd_boolean
2698 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2699 {
2700   return (HAVE_IN_PLACE_ADDENDS
2701           && (hi16_reloc_p (reloc)
2702               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2703                  all GOT16 relocations evaluate to "G".  */
2704               || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2705 }
2706
2707 /* Return the type of %lo() reloc needed by RELOC, given that
2708    reloc_needs_lo_p.  */
2709
2710 static inline bfd_reloc_code_real_type
2711 matching_lo_reloc (bfd_reloc_code_real_type reloc)
2712 {
2713   return (mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16
2714           : (micromips_reloc_p (reloc) ? BFD_RELOC_MICROMIPS_LO16
2715              : BFD_RELOC_LO16));
2716 }
2717
2718 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2719    relocation.  */
2720
2721 static inline bfd_boolean
2722 fixup_has_matching_lo_p (fixS *fixp)
2723 {
2724   return (fixp->fx_next != NULL
2725           && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
2726           && fixp->fx_addsy == fixp->fx_next->fx_addsy
2727           && fixp->fx_offset == fixp->fx_next->fx_offset);
2728 }
2729
2730 /* This function returns true if modifying a register requires a
2731    delay.  */
2732
2733 static int
2734 reg_needs_delay (unsigned int reg)
2735 {
2736   unsigned long prev_pinfo;
2737
2738   prev_pinfo = history[0].insn_mo->pinfo;
2739   if (! mips_opts.noreorder
2740       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2741            && ! gpr_interlocks)
2742           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2743               && ! cop_interlocks)))
2744     {
2745       /* A load from a coprocessor or from memory.  All load delays
2746          delay the use of general register rt for one instruction.  */
2747       /* Itbl support may require additional care here.  */
2748       know (prev_pinfo & INSN_WRITE_GPR_T);
2749       if (reg == EXTRACT_OPERAND (mips_opts.micromips, RT, history[0]))
2750         return 1;
2751     }
2752
2753   return 0;
2754 }
2755
2756 /* Move all labels in insn_labels to the current insertion point.  */
2757
2758 static void
2759 mips_move_labels (void)
2760 {
2761   segment_info_type *si = seg_info (now_seg);
2762   struct insn_label_list *l;
2763   valueT val;
2764
2765   for (l = si->label_list; l != NULL; l = l->next)
2766     {
2767       gas_assert (S_GET_SEGMENT (l->label) == now_seg);
2768       symbol_set_frag (l->label, frag_now);
2769       val = (valueT) frag_now_fix ();
2770       /* MIPS16/microMIPS text labels are stored as odd.  */
2771       if (HAVE_CODE_COMPRESSION)
2772         ++val;
2773       S_SET_VALUE (l->label, val);
2774     }
2775 }
2776
2777 static bfd_boolean
2778 s_is_linkonce (symbolS *sym, segT from_seg)
2779 {
2780   bfd_boolean linkonce = FALSE;
2781   segT symseg = S_GET_SEGMENT (sym);
2782
2783   if (symseg != from_seg && !S_IS_LOCAL (sym))
2784     {
2785       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2786         linkonce = TRUE;
2787 #ifdef OBJ_ELF
2788       /* The GNU toolchain uses an extension for ELF: a section
2789          beginning with the magic string .gnu.linkonce is a
2790          linkonce section.  */
2791       if (strncmp (segment_name (symseg), ".gnu.linkonce",
2792                    sizeof ".gnu.linkonce" - 1) == 0)
2793         linkonce = TRUE;
2794 #endif
2795     }
2796   return linkonce;
2797 }
2798
2799 /* Mark instruction labels in MIPS16/microMIPS mode.  This permits the
2800    linker to handle them specially, such as generating jalx instructions
2801    when needed.  We also make them odd for the duration of the assembly,
2802    in order to generate the right sort of code.  We will make them even
2803    in the adjust_symtab routine, while leaving them marked.  This is
2804    convenient for the debugger and the disassembler.  The linker knows
2805    to make them odd again.  */
2806
2807 static void
2808 mips_compressed_mark_labels (void)
2809 {
2810   segment_info_type *si = seg_info (now_seg);
2811   struct insn_label_list *l;
2812
2813   gas_assert (HAVE_CODE_COMPRESSION);
2814
2815   for (l = si->label_list; l != NULL; l = l->next)
2816    {
2817       symbolS *label = l->label;
2818
2819 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2820       if (IS_ELF)
2821         {
2822           if (mips_opts.mips16)
2823             S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2824           else
2825             S_SET_OTHER (label, ELF_ST_SET_MICROMIPS (S_GET_OTHER (label)));
2826         }
2827 #endif
2828       if ((S_GET_VALUE (label) & 1) == 0
2829         /* Don't adjust the address if the label is global or weak, or
2830            in a link-once section, since we'll be emitting symbol reloc
2831            references to it which will be patched up by the linker, and
2832            the final value of the symbol may or may not be MIPS16/microMIPS.  */
2833           && ! S_IS_WEAK (label)
2834           && ! S_IS_EXTERNAL (label)
2835           && ! s_is_linkonce (label, now_seg))
2836         S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2837     }
2838 }
2839
2840 /* End the current frag.  Make it a variant frag and record the
2841    relaxation info.  */
2842
2843 static void
2844 relax_close_frag (void)
2845 {
2846   mips_macro_warning.first_frag = frag_now;
2847   frag_var (rs_machine_dependent, 0, 0,
2848             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2849             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2850
2851   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2852   mips_relax.first_fixup = 0;
2853 }
2854
2855 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2856    See the comment above RELAX_ENCODE for more details.  */
2857
2858 static void
2859 relax_start (symbolS *symbol)
2860 {
2861   gas_assert (mips_relax.sequence == 0);
2862   mips_relax.sequence = 1;
2863   mips_relax.symbol = symbol;
2864 }
2865
2866 /* Start generating the second version of a relaxable sequence.
2867    See the comment above RELAX_ENCODE for more details.  */
2868
2869 static void
2870 relax_switch (void)
2871 {
2872   gas_assert (mips_relax.sequence == 1);
2873   mips_relax.sequence = 2;
2874 }
2875
2876 /* End the current relaxable sequence.  */
2877
2878 static void
2879 relax_end (void)
2880 {
2881   gas_assert (mips_relax.sequence == 2);
2882   relax_close_frag ();
2883   mips_relax.sequence = 0;
2884 }
2885
2886 /* Return true if IP is a delayed branch or jump.  */
2887
2888 static inline bfd_boolean
2889 delayed_branch_p (const struct mips_cl_insn *ip)
2890 {
2891   return (ip->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2892                                 | INSN_COND_BRANCH_DELAY
2893                                 | INSN_COND_BRANCH_LIKELY)) != 0;
2894 }
2895
2896 /* Return true if IP is a compact branch or jump.  */
2897
2898 static inline bfd_boolean
2899 compact_branch_p (const struct mips_cl_insn *ip)
2900 {
2901   if (mips_opts.mips16)
2902     return (ip->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
2903                                   | MIPS16_INSN_COND_BRANCH)) != 0;
2904   else
2905     return (ip->insn_mo->pinfo2 & (INSN2_UNCOND_BRANCH
2906                                    | INSN2_COND_BRANCH)) != 0;
2907 }
2908
2909 /* Return true if IP is an unconditional branch or jump.  */
2910
2911 static inline bfd_boolean
2912 uncond_branch_p (const struct mips_cl_insn *ip)
2913 {
2914   return ((ip->insn_mo->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0
2915           || (mips_opts.mips16
2916               ? (ip->insn_mo->pinfo & MIPS16_INSN_UNCOND_BRANCH) != 0
2917               : (ip->insn_mo->pinfo2 & INSN2_UNCOND_BRANCH) != 0));
2918 }
2919
2920 /* Return true if IP is a branch-likely instruction.  */
2921
2922 static inline bfd_boolean
2923 branch_likely_p (const struct mips_cl_insn *ip)
2924 {
2925   return (ip->insn_mo->pinfo & INSN_COND_BRANCH_LIKELY) != 0;
2926 }
2927
2928 /* Return the type of nop that should be used to fill the delay slot
2929    of delayed branch IP.  */
2930
2931 static struct mips_cl_insn *
2932 get_delay_slot_nop (const struct mips_cl_insn *ip)
2933 {
2934   if (mips_opts.micromips
2935       && (ip->insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
2936     return &micromips_nop32_insn;
2937   return NOP_INSN;
2938 }
2939
2940 /* Return the mask of core registers that IP reads or writes.  */
2941
2942 static unsigned int
2943 gpr_mod_mask (const struct mips_cl_insn *ip)
2944 {
2945   unsigned long pinfo2;
2946   unsigned int mask;
2947
2948   mask = 0;
2949   pinfo2 = ip->insn_mo->pinfo2;
2950   if (mips_opts.micromips)
2951     {
2952       if (pinfo2 & INSN2_MOD_GPR_MD)
2953         mask |= 1 << micromips_to_32_reg_d_map[EXTRACT_OPERAND (1, MD, *ip)];
2954       if (pinfo2 & INSN2_MOD_GPR_MF)
2955         mask |= 1 << micromips_to_32_reg_f_map[EXTRACT_OPERAND (1, MF, *ip)];
2956       if (pinfo2 & INSN2_MOD_SP)
2957         mask |= 1 << SP;
2958     }
2959   return mask;
2960 }
2961
2962 /* Return the mask of core registers that IP reads.  */
2963
2964 static unsigned int
2965 gpr_read_mask (const struct mips_cl_insn *ip)
2966 {
2967   unsigned long pinfo, pinfo2;
2968   unsigned int mask;
2969
2970   mask = gpr_mod_mask (ip);
2971   pinfo = ip->insn_mo->pinfo;
2972   pinfo2 = ip->insn_mo->pinfo2;
2973   if (mips_opts.mips16)
2974     {
2975       if (pinfo & MIPS16_INSN_READ_X)
2976         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
2977       if (pinfo & MIPS16_INSN_READ_Y)
2978         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
2979       if (pinfo & MIPS16_INSN_READ_T)
2980         mask |= 1 << TREG;
2981       if (pinfo & MIPS16_INSN_READ_SP)
2982         mask |= 1 << SP;
2983       if (pinfo & MIPS16_INSN_READ_31)
2984         mask |= 1 << RA;
2985       if (pinfo & MIPS16_INSN_READ_Z)
2986         mask |= 1 << (mips16_to_32_reg_map
2987                       [MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]);
2988       if (pinfo & MIPS16_INSN_READ_GPR_X)
2989         mask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
2990     }
2991   else
2992     {
2993       if (pinfo2 & INSN2_READ_GPR_D)
2994         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
2995       if (pinfo & INSN_READ_GPR_T)
2996         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
2997       if (pinfo & INSN_READ_GPR_S)
2998         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
2999       if (pinfo2 & INSN2_READ_GP)
3000         mask |= 1 << GP;
3001       if (pinfo2 & INSN2_READ_GPR_31)
3002         mask |= 1 << RA;
3003       if (pinfo2 & INSN2_READ_GPR_Z)
3004         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3005     }
3006   if (mips_opts.micromips)
3007     {
3008       if (pinfo2 & INSN2_READ_GPR_MC)
3009         mask |= 1 << micromips_to_32_reg_c_map[EXTRACT_OPERAND (1, MC, *ip)];
3010       if (pinfo2 & INSN2_READ_GPR_ME)
3011         mask |= 1 << micromips_to_32_reg_e_map[EXTRACT_OPERAND (1, ME, *ip)];
3012       if (pinfo2 & INSN2_READ_GPR_MG)
3013         mask |= 1 << micromips_to_32_reg_g_map[EXTRACT_OPERAND (1, MG, *ip)];
3014       if (pinfo2 & INSN2_READ_GPR_MJ)
3015         mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3016       if (pinfo2 & INSN2_READ_GPR_MMN)
3017         {
3018           mask |= 1 << micromips_to_32_reg_m_map[EXTRACT_OPERAND (1, MM, *ip)];
3019           mask |= 1 << micromips_to_32_reg_n_map[EXTRACT_OPERAND (1, MN, *ip)];
3020         }
3021       if (pinfo2 & INSN2_READ_GPR_MP)
3022         mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3023       if (pinfo2 & INSN2_READ_GPR_MQ)
3024         mask |= 1 << micromips_to_32_reg_q_map[EXTRACT_OPERAND (1, MQ, *ip)];
3025     }
3026   /* Don't include register 0.  */
3027   return mask & ~1;
3028 }
3029
3030 /* Return the mask of core registers that IP writes.  */
3031
3032 static unsigned int
3033 gpr_write_mask (const struct mips_cl_insn *ip)
3034 {
3035   unsigned long pinfo, pinfo2;
3036   unsigned int mask;
3037
3038   mask = gpr_mod_mask (ip);
3039   pinfo = ip->insn_mo->pinfo;
3040   pinfo2 = ip->insn_mo->pinfo2;
3041   if (mips_opts.mips16)
3042     {
3043       if (pinfo & MIPS16_INSN_WRITE_X)
3044         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
3045       if (pinfo & MIPS16_INSN_WRITE_Y)
3046         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
3047       if (pinfo & MIPS16_INSN_WRITE_Z)
3048         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RZ, *ip)];
3049       if (pinfo & MIPS16_INSN_WRITE_T)
3050         mask |= 1 << TREG;
3051       if (pinfo & MIPS16_INSN_WRITE_SP)
3052         mask |= 1 << SP;
3053       if (pinfo & MIPS16_INSN_WRITE_31)
3054         mask |= 1 << RA;
3055       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3056         mask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3057     }
3058   else
3059     {
3060       if (pinfo & INSN_WRITE_GPR_D)
3061         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
3062       if (pinfo & INSN_WRITE_GPR_T)
3063         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
3064       if (pinfo & INSN_WRITE_GPR_S)
3065         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
3066       if (pinfo & INSN_WRITE_GPR_31)
3067         mask |= 1 << RA;
3068       if (pinfo2 & INSN2_WRITE_GPR_Z)
3069         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3070     }
3071   if (mips_opts.micromips)
3072     {
3073       if (pinfo2 & INSN2_WRITE_GPR_MB)
3074         mask |= 1 << micromips_to_32_reg_b_map[EXTRACT_OPERAND (1, MB, *ip)];
3075       if (pinfo2 & INSN2_WRITE_GPR_MHI)
3076         {
3077           mask |= 1 << micromips_to_32_reg_h_map[EXTRACT_OPERAND (1, MH, *ip)];
3078           mask |= 1 << micromips_to_32_reg_i_map[EXTRACT_OPERAND (1, MI, *ip)];
3079         }
3080       if (pinfo2 & INSN2_WRITE_GPR_MJ)
3081         mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3082       if (pinfo2 & INSN2_WRITE_GPR_MP)
3083         mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3084     }
3085   /* Don't include register 0.  */
3086   return mask & ~1;
3087 }
3088
3089 /* Return the mask of floating-point registers that IP reads.  */
3090
3091 static unsigned int
3092 fpr_read_mask (const struct mips_cl_insn *ip)
3093 {
3094   unsigned long pinfo, pinfo2;
3095   unsigned int mask;
3096
3097   mask = 0;
3098   pinfo = ip->insn_mo->pinfo;
3099   pinfo2 = ip->insn_mo->pinfo2;
3100   if (!mips_opts.mips16)
3101     {
3102       if (pinfo2 & INSN2_READ_FPR_D)
3103         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3104       if (pinfo & INSN_READ_FPR_S)
3105         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3106       if (pinfo & INSN_READ_FPR_T)
3107         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3108       if (pinfo & INSN_READ_FPR_R)
3109         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FR, *ip);
3110       if (pinfo2 & INSN2_READ_FPR_Z)
3111         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3112     }
3113   /* Conservatively treat all operands to an FP_D instruction are doubles.
3114      (This is overly pessimistic for things like cvt.d.s.)  */
3115   if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3116     mask |= mask << 1;
3117   return mask;
3118 }
3119
3120 /* Return the mask of floating-point registers that IP writes.  */
3121
3122 static unsigned int
3123 fpr_write_mask (const struct mips_cl_insn *ip)
3124 {
3125   unsigned long pinfo, pinfo2;
3126   unsigned int mask;
3127
3128   mask = 0;
3129   pinfo = ip->insn_mo->pinfo;
3130   pinfo2 = ip->insn_mo->pinfo2;
3131   if (!mips_opts.mips16)
3132     {
3133       if (pinfo & INSN_WRITE_FPR_D)
3134         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3135       if (pinfo & INSN_WRITE_FPR_S)
3136         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3137       if (pinfo & INSN_WRITE_FPR_T)
3138         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3139       if (pinfo2 & INSN2_WRITE_FPR_Z)
3140         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3141     }
3142   /* Conservatively treat all operands to an FP_D instruction are doubles.
3143      (This is overly pessimistic for things like cvt.s.d.)  */
3144   if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3145     mask |= mask << 1;
3146   return mask;
3147 }
3148
3149 /* Classify an instruction according to the FIX_VR4120_* enumeration.
3150    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
3151    by VR4120 errata.  */
3152
3153 static unsigned int
3154 classify_vr4120_insn (const char *name)
3155 {
3156   if (strncmp (name, "macc", 4) == 0)
3157     return FIX_VR4120_MACC;
3158   if (strncmp (name, "dmacc", 5) == 0)
3159     return FIX_VR4120_DMACC;
3160   if (strncmp (name, "mult", 4) == 0)
3161     return FIX_VR4120_MULT;
3162   if (strncmp (name, "dmult", 5) == 0)
3163     return FIX_VR4120_DMULT;
3164   if (strstr (name, "div"))
3165     return FIX_VR4120_DIV;
3166   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
3167     return FIX_VR4120_MTHILO;
3168   return NUM_FIX_VR4120_CLASSES;
3169 }
3170
3171 #define INSN_ERET  0x42000018
3172 #define INSN_DERET 0x4200001f
3173
3174 /* Return the number of instructions that must separate INSN1 and INSN2,
3175    where INSN1 is the earlier instruction.  Return the worst-case value
3176    for any INSN2 if INSN2 is null.  */
3177
3178 static unsigned int
3179 insns_between (const struct mips_cl_insn *insn1,
3180                const struct mips_cl_insn *insn2)
3181 {
3182   unsigned long pinfo1, pinfo2;
3183   unsigned int mask;
3184
3185   /* This function needs to know which pinfo flags are set for INSN2
3186      and which registers INSN2 uses.  The former is stored in PINFO2 and
3187      the latter is tested via INSN2_USES_GPR.  If INSN2 is null, PINFO2
3188      will have every flag set and INSN2_USES_GPR will always return true.  */
3189   pinfo1 = insn1->insn_mo->pinfo;
3190   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
3191
3192 #define INSN2_USES_GPR(REG) \
3193   (insn2 == NULL || (gpr_read_mask (insn2) & (1U << (REG))) != 0)
3194
3195   /* For most targets, write-after-read dependencies on the HI and LO
3196      registers must be separated by at least two instructions.  */
3197   if (!hilo_interlocks)
3198     {
3199       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
3200         return 2;
3201       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
3202         return 2;
3203     }
3204
3205   /* If we're working around r7000 errata, there must be two instructions
3206      between an mfhi or mflo and any instruction that uses the result.  */
3207   if (mips_7000_hilo_fix
3208       && !mips_opts.micromips
3209       && MF_HILO_INSN (pinfo1)
3210       && INSN2_USES_GPR (EXTRACT_OPERAND (0, RD, *insn1)))
3211     return 2;
3212
3213   /* If we're working around 24K errata, one instruction is required
3214      if an ERET or DERET is followed by a branch instruction.  */
3215   if (mips_fix_24k && !mips_opts.micromips)
3216     {
3217       if (insn1->insn_opcode == INSN_ERET
3218           || insn1->insn_opcode == INSN_DERET)
3219         {
3220           if (insn2 == NULL
3221               || insn2->insn_opcode == INSN_ERET
3222               || insn2->insn_opcode == INSN_DERET
3223               || delayed_branch_p (insn2))
3224             return 1;
3225         }
3226     }
3227
3228   /* If working around VR4120 errata, check for combinations that need
3229      a single intervening instruction.  */
3230   if (mips_fix_vr4120 && !mips_opts.micromips)
3231     {
3232       unsigned int class1, class2;
3233
3234       class1 = classify_vr4120_insn (insn1->insn_mo->name);
3235       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
3236         {
3237           if (insn2 == NULL)
3238             return 1;
3239           class2 = classify_vr4120_insn (insn2->insn_mo->name);
3240           if (vr4120_conflicts[class1] & (1 << class2))
3241             return 1;
3242         }
3243     }
3244
3245   if (!HAVE_CODE_COMPRESSION)
3246     {
3247       /* Check for GPR or coprocessor load delays.  All such delays
3248          are on the RT register.  */
3249       /* Itbl support may require additional care here.  */
3250       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
3251           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
3252         {
3253           know (pinfo1 & INSN_WRITE_GPR_T);
3254           if (INSN2_USES_GPR (EXTRACT_OPERAND (0, RT, *insn1)))
3255             return 1;
3256         }
3257
3258       /* Check for generic coprocessor hazards.
3259
3260          This case is not handled very well.  There is no special
3261          knowledge of CP0 handling, and the coprocessors other than
3262          the floating point unit are not distinguished at all.  */
3263       /* Itbl support may require additional care here. FIXME!
3264          Need to modify this to include knowledge about
3265          user specified delays!  */
3266       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
3267                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
3268         {
3269           /* Handle cases where INSN1 writes to a known general coprocessor
3270              register.  There must be a one instruction delay before INSN2
3271              if INSN2 reads that register, otherwise no delay is needed.  */
3272           mask = fpr_write_mask (insn1);
3273           if (mask != 0)
3274             {
3275               if (!insn2 || (mask & fpr_read_mask (insn2)) != 0)
3276                 return 1;
3277             }
3278           else
3279             {
3280               /* Read-after-write dependencies on the control registers
3281                  require a two-instruction gap.  */
3282               if ((pinfo1 & INSN_WRITE_COND_CODE)
3283                   && (pinfo2 & INSN_READ_COND_CODE))
3284                 return 2;
3285
3286               /* We don't know exactly what INSN1 does.  If INSN2 is
3287                  also a coprocessor instruction, assume there must be
3288                  a one instruction gap.  */
3289               if (pinfo2 & INSN_COP)
3290                 return 1;
3291             }
3292         }
3293
3294       /* Check for read-after-write dependencies on the coprocessor
3295          control registers in cases where INSN1 does not need a general
3296          coprocessor delay.  This means that INSN1 is a floating point
3297          comparison instruction.  */
3298       /* Itbl support may require additional care here.  */
3299       else if (!cop_interlocks
3300                && (pinfo1 & INSN_WRITE_COND_CODE)
3301                && (pinfo2 & INSN_READ_COND_CODE))
3302         return 1;
3303     }
3304
3305 #undef INSN2_USES_GPR
3306
3307   return 0;
3308 }
3309
3310 /* Return the number of nops that would be needed to work around the
3311    VR4130 mflo/mfhi errata if instruction INSN immediately followed
3312    the MAX_VR4130_NOPS instructions described by HIST.  Ignore hazards
3313    that are contained within the first IGNORE instructions of HIST.  */
3314
3315 static int
3316 nops_for_vr4130 (int ignore, const struct mips_cl_insn *hist,
3317                  const struct mips_cl_insn *insn)
3318 {
3319   int i, j;
3320   unsigned int mask;
3321
3322   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
3323      are not affected by the errata.  */
3324   if (insn != 0
3325       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
3326           || strcmp (insn->insn_mo->name, "mtlo") == 0
3327           || strcmp (insn->insn_mo->name, "mthi") == 0))
3328     return 0;
3329
3330   /* Search for the first MFLO or MFHI.  */
3331   for (i = 0; i < MAX_VR4130_NOPS; i++)
3332     if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
3333       {
3334         /* Extract the destination register.  */
3335         mask = gpr_write_mask (&hist[i]);
3336
3337         /* No nops are needed if INSN reads that register.  */
3338         if (insn != NULL && (gpr_read_mask (insn) & mask) != 0)
3339           return 0;
3340
3341         /* ...or if any of the intervening instructions do.  */
3342         for (j = 0; j < i; j++)
3343           if (gpr_read_mask (&hist[j]) & mask)
3344             return 0;
3345
3346         if (i >= ignore)
3347           return MAX_VR4130_NOPS - i;
3348       }
3349   return 0;
3350 }
3351
3352 #define BASE_REG_EQ(INSN1, INSN2)       \
3353   ((((INSN1) >> OP_SH_RS) & OP_MASK_RS) \
3354       == (((INSN2) >> OP_SH_RS) & OP_MASK_RS))
3355
3356 /* Return the minimum alignment for this store instruction.  */
3357
3358 static int
3359 fix_24k_align_to (const struct mips_opcode *mo)
3360 {
3361   if (strcmp (mo->name, "sh") == 0)
3362     return 2;
3363
3364   if (strcmp (mo->name, "swc1") == 0
3365       || strcmp (mo->name, "swc2") == 0
3366       || strcmp (mo->name, "sw") == 0
3367       || strcmp (mo->name, "sc") == 0
3368       || strcmp (mo->name, "s.s") == 0)
3369     return 4;
3370
3371   if (strcmp (mo->name, "sdc1") == 0
3372       || strcmp (mo->name, "sdc2") == 0
3373       || strcmp (mo->name, "s.d") == 0)
3374     return 8;
3375
3376   /* sb, swl, swr */
3377   return 1;
3378 }
3379
3380 struct fix_24k_store_info
3381   {
3382     /* Immediate offset, if any, for this store instruction.  */
3383     short off;
3384     /* Alignment required by this store instruction.  */
3385     int align_to;
3386     /* True for register offsets.  */
3387     int register_offset;
3388   };
3389
3390 /* Comparison function used by qsort.  */
3391
3392 static int
3393 fix_24k_sort (const void *a, const void *b)
3394 {
3395   const struct fix_24k_store_info *pos1 = a;
3396   const struct fix_24k_store_info *pos2 = b;
3397
3398   return (pos1->off - pos2->off);
3399 }
3400
3401 /* INSN is a store instruction.  Try to record the store information
3402    in STINFO.  Return false if the information isn't known.  */
3403
3404 static bfd_boolean
3405 fix_24k_record_store_info (struct fix_24k_store_info *stinfo,
3406                            const struct mips_cl_insn *insn)
3407 {
3408   /* The instruction must have a known offset.  */
3409   if (!insn->complete_p || !strstr (insn->insn_mo->args, "o("))
3410     return FALSE;
3411
3412   stinfo->off = (insn->insn_opcode >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE;
3413   stinfo->align_to = fix_24k_align_to (insn->insn_mo);
3414   return TRUE;
3415 }
3416
3417 /* Return the number of nops that would be needed to work around the 24k
3418    "lost data on stores during refill" errata if instruction INSN
3419    immediately followed the 2 instructions described by HIST.
3420    Ignore hazards that are contained within the first IGNORE
3421    instructions of HIST.
3422
3423    Problem: The FSB (fetch store buffer) acts as an intermediate buffer
3424    for the data cache refills and store data. The following describes
3425    the scenario where the store data could be lost.
3426
3427    * A data cache miss, due to either a load or a store, causing fill
3428      data to be supplied by the memory subsystem
3429    * The first three doublewords of fill data are returned and written
3430      into the cache
3431    * A sequence of four stores occurs in consecutive cycles around the
3432      final doubleword of the fill:
3433    * Store A
3434    * Store B
3435    * Store C
3436    * Zero, One or more instructions
3437    * Store D
3438
3439    The four stores A-D must be to different doublewords of the line that
3440    is being filled. The fourth instruction in the sequence above permits
3441    the fill of the final doubleword to be transferred from the FSB into
3442    the cache. In the sequence above, the stores may be either integer
3443    (sb, sh, sw, swr, swl, sc) or coprocessor (swc1/swc2, sdc1/sdc2,
3444    swxc1, sdxc1, suxc1) stores, as long as the four stores are to
3445    different doublewords on the line. If the floating point unit is
3446    running in 1:2 mode, it is not possible to create the sequence above
3447    using only floating point store instructions.
3448
3449    In this case, the cache line being filled is incorrectly marked
3450    invalid, thereby losing the data from any store to the line that
3451    occurs between the original miss and the completion of the five
3452    cycle sequence shown above.
3453
3454    The workarounds are:
3455
3456    * Run the data cache in write-through mode.
3457    * Insert a non-store instruction between
3458      Store A and Store B or Store B and Store C.  */
3459   
3460 static int
3461 nops_for_24k (int ignore, const struct mips_cl_insn *hist,
3462               const struct mips_cl_insn *insn)
3463 {
3464   struct fix_24k_store_info pos[3];
3465   int align, i, base_offset;
3466
3467   if (ignore >= 2)
3468     return 0;
3469
3470   /* If the previous instruction wasn't a store, there's nothing to
3471      worry about.  */
3472   if ((hist[0].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3473     return 0;
3474
3475   /* If the instructions after the previous one are unknown, we have
3476      to assume the worst.  */
3477   if (!insn)
3478     return 1;
3479
3480   /* Check whether we are dealing with three consecutive stores.  */
3481   if ((insn->insn_mo->pinfo & INSN_STORE_MEMORY) == 0
3482       || (hist[1].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3483     return 0;
3484
3485   /* If we don't know the relationship between the store addresses,
3486      assume the worst.  */
3487   if (!BASE_REG_EQ (insn->insn_opcode, hist[0].insn_opcode)
3488       || !BASE_REG_EQ (insn->insn_opcode, hist[1].insn_opcode))
3489     return 1;
3490
3491   if (!fix_24k_record_store_info (&pos[0], insn)
3492       || !fix_24k_record_store_info (&pos[1], &hist[0])
3493       || !fix_24k_record_store_info (&pos[2], &hist[1]))
3494     return 1;
3495
3496   qsort (&pos, 3, sizeof (struct fix_24k_store_info), fix_24k_sort);
3497
3498   /* Pick a value of ALIGN and X such that all offsets are adjusted by
3499      X bytes and such that the base register + X is known to be aligned
3500      to align bytes.  */
3501
3502   if (((insn->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == SP)
3503     align = 8;
3504   else
3505     {
3506       align = pos[0].align_to;
3507       base_offset = pos[0].off;
3508       for (i = 1; i < 3; i++)
3509         if (align < pos[i].align_to)
3510           {
3511             align = pos[i].align_to;
3512             base_offset = pos[i].off;
3513           }
3514       for (i = 0; i < 3; i++)
3515         pos[i].off -= base_offset;
3516     }
3517
3518   pos[0].off &= ~align + 1;
3519   pos[1].off &= ~align + 1;
3520   pos[2].off &= ~align + 1;
3521
3522   /* If any two stores write to the same chunk, they also write to the
3523      same doubleword.  The offsets are still sorted at this point.  */
3524   if (pos[0].off == pos[1].off || pos[1].off == pos[2].off)
3525     return 0;
3526
3527   /* A range of at least 9 bytes is needed for the stores to be in
3528      non-overlapping doublewords.  */
3529   if (pos[2].off - pos[0].off <= 8)
3530     return 0;
3531
3532   if (pos[2].off - pos[1].off >= 24
3533       || pos[1].off - pos[0].off >= 24
3534       || pos[2].off - pos[0].off >= 32)
3535     return 0;
3536
3537   return 1;
3538 }
3539
3540 /* Return the number of nops that would be needed if instruction INSN
3541    immediately followed the MAX_NOPS instructions given by HIST,
3542    where HIST[0] is the most recent instruction.  Ignore hazards
3543    between INSN and the first IGNORE instructions in HIST.
3544
3545    If INSN is null, return the worse-case number of nops for any
3546    instruction.  */
3547
3548 static int
3549 nops_for_insn (int ignore, const struct mips_cl_insn *hist,
3550                const struct mips_cl_insn *insn)
3551 {
3552   int i, nops, tmp_nops;
3553
3554   nops = 0;
3555   for (i = ignore; i < MAX_DELAY_NOPS; i++)
3556     {
3557       tmp_nops = insns_between (hist + i, insn) - i;
3558       if (tmp_nops > nops)
3559         nops = tmp_nops;
3560     }
3561
3562   if (mips_fix_vr4130 && !mips_opts.micromips)
3563     {
3564       tmp_nops = nops_for_vr4130 (ignore, hist, insn);
3565       if (tmp_nops > nops)
3566         nops = tmp_nops;
3567     }
3568
3569   if (mips_fix_24k && !mips_opts.micromips)
3570     {
3571       tmp_nops = nops_for_24k (ignore, hist, insn);
3572       if (tmp_nops > nops)
3573         nops = tmp_nops;
3574     }
3575
3576   return nops;
3577 }
3578
3579 /* The variable arguments provide NUM_INSNS extra instructions that
3580    might be added to HIST.  Return the largest number of nops that
3581    would be needed after the extended sequence, ignoring hazards
3582    in the first IGNORE instructions.  */
3583
3584 static int
3585 nops_for_sequence (int num_insns, int ignore,
3586                    const struct mips_cl_insn *hist, ...)
3587 {
3588   va_list args;
3589   struct mips_cl_insn buffer[MAX_NOPS];
3590   struct mips_cl_insn *cursor;
3591   int nops;
3592
3593   va_start (args, hist);
3594   cursor = buffer + num_insns;
3595   memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
3596   while (cursor > buffer)
3597     *--cursor = *va_arg (args, const struct mips_cl_insn *);
3598
3599   nops = nops_for_insn (ignore, buffer, NULL);
3600   va_end (args);
3601   return nops;
3602 }
3603
3604 /* Like nops_for_insn, but if INSN is a branch, take into account the
3605    worst-case delay for the branch target.  */
3606
3607 static int
3608 nops_for_insn_or_target (int ignore, const struct mips_cl_insn *hist,
3609                          const struct mips_cl_insn *insn)
3610 {
3611   int nops, tmp_nops;
3612
3613   nops = nops_for_insn (ignore, hist, insn);
3614   if (delayed_branch_p (insn))
3615     {
3616       tmp_nops = nops_for_sequence (2, ignore ? ignore + 2 : 0,
3617                                     hist, insn, get_delay_slot_nop (insn));
3618       if (tmp_nops > nops)
3619         nops = tmp_nops;
3620     }
3621   else if (compact_branch_p (insn))
3622     {
3623       tmp_nops = nops_for_sequence (1, ignore ? ignore + 1 : 0, hist, insn);
3624       if (tmp_nops > nops)
3625         nops = tmp_nops;
3626     }
3627   return nops;
3628 }
3629
3630 /* Fix NOP issue: Replace nops by "or at,at,zero".  */
3631
3632 static void
3633 fix_loongson2f_nop (struct mips_cl_insn * ip)
3634 {
3635   gas_assert (!HAVE_CODE_COMPRESSION);
3636   if (strcmp (ip->insn_mo->name, "nop") == 0)
3637     ip->insn_opcode = LOONGSON2F_NOP_INSN;
3638 }
3639
3640 /* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
3641                    jr target pc &= 'hffff_ffff_cfff_ffff.  */
3642
3643 static void
3644 fix_loongson2f_jump (struct mips_cl_insn * ip)
3645 {
3646   gas_assert (!HAVE_CODE_COMPRESSION);
3647   if (strcmp (ip->insn_mo->name, "j") == 0
3648       || strcmp (ip->insn_mo->name, "jr") == 0
3649       || strcmp (ip->insn_mo->name, "jalr") == 0)
3650     {
3651       int sreg;
3652       expressionS ep;
3653
3654       if (! mips_opts.at)
3655         return;
3656
3657       sreg = EXTRACT_OPERAND (0, RS, *ip);
3658       if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
3659         return;
3660
3661       ep.X_op = O_constant;
3662       ep.X_add_number = 0xcfff0000;
3663       macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
3664       ep.X_add_number = 0xffff;
3665       macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
3666       macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
3667     }
3668 }
3669
3670 static void
3671 fix_loongson2f (struct mips_cl_insn * ip)
3672 {
3673   if (mips_fix_loongson2f_nop)
3674     fix_loongson2f_nop (ip);
3675
3676   if (mips_fix_loongson2f_jump)
3677     fix_loongson2f_jump (ip);
3678 }
3679
3680 /* IP is a branch that has a delay slot, and we need to fill it
3681    automatically.   Return true if we can do that by swapping IP
3682    with the previous instruction.  */
3683
3684 static bfd_boolean
3685 can_swap_branch_p (struct mips_cl_insn *ip)
3686 {
3687   unsigned long pinfo, pinfo2, prev_pinfo, prev_pinfo2;
3688   unsigned int gpr_read, gpr_write, prev_gpr_read, prev_gpr_write;
3689
3690
3691   /* -O2 and above is required for this optimization.  */
3692   if (mips_optimize < 2)
3693     return FALSE;
3694
3695   /* If we have seen .set volatile or .set nomove, don't optimize.  */
3696   if (mips_opts.nomove)
3697     return FALSE;
3698
3699   /* We can't swap if the previous instruction's position is fixed.  */
3700   if (history[0].fixed_p)
3701     return FALSE;
3702
3703   /* If the previous previous insn was in a .set noreorder, we can't
3704      swap.  Actually, the MIPS assembler will swap in this situation.
3705      However, gcc configured -with-gnu-as will generate code like
3706
3707         .set    noreorder
3708         lw      $4,XXX
3709         .set    reorder
3710         INSN
3711         bne     $4,$0,foo
3712
3713      in which we can not swap the bne and INSN.  If gcc is not configured
3714      -with-gnu-as, it does not output the .set pseudo-ops.  */
3715   if (history[1].noreorder_p)
3716     return FALSE;
3717
3718   /* If the previous instruction had a fixup in mips16 mode, we can not
3719      swap.  This normally means that the previous instruction was a 4
3720      byte branch anyhow.  */
3721   if (mips_opts.mips16 && history[0].fixp[0])
3722     return FALSE;
3723
3724   /* If the branch is itself the target of a branch, we can not swap.
3725      We cheat on this; all we check for is whether there is a label on
3726      this instruction.  If there are any branches to anything other than
3727      a label, users must use .set noreorder.  */
3728   if (seg_info (now_seg)->label_list)
3729     return FALSE;
3730
3731   /* If the previous instruction is in a variant frag other than this
3732      branch's one, we cannot do the swap.  This does not apply to
3733      MIPS16/microMIPS code, which uses variant frags for different
3734      purposes.  */
3735   if (!HAVE_CODE_COMPRESSION
3736       && history[0].frag
3737       && history[0].frag->fr_type == rs_machine_dependent)
3738     return FALSE;
3739
3740   /* We do not swap with instructions that cannot architecturally
3741      be placed in a branch delay slot, such as SYNC or ERET.  We
3742      also refrain from swapping with a trap instruction, since it
3743      complicates trap handlers to have the trap instruction be in
3744      a delay slot.  */
3745   prev_pinfo = history[0].insn_mo->pinfo;
3746   if (prev_pinfo & INSN_NO_DELAY_SLOT)
3747     return FALSE;
3748
3749   /* Check for conflicts between the branch and the instructions
3750      before the candidate delay slot.  */
3751   if (nops_for_insn (0, history + 1, ip) > 0)
3752     return FALSE;
3753
3754   /* Check for conflicts between the swapped sequence and the
3755      target of the branch.  */
3756   if (nops_for_sequence (2, 0, history + 1, ip, history) > 0)
3757     return FALSE;
3758
3759   /* If the branch reads a register that the previous
3760      instruction sets, we can not swap.  */
3761   gpr_read = gpr_read_mask (ip);
3762   prev_gpr_write = gpr_write_mask (&history[0]);
3763   if (gpr_read & prev_gpr_write)
3764     return FALSE;
3765
3766   /* If the branch writes a register that the previous
3767      instruction sets, we can not swap.  */
3768   gpr_write = gpr_write_mask (ip);
3769   if (gpr_write & prev_gpr_write)
3770     return FALSE;
3771
3772   /* If the branch writes a register that the previous
3773      instruction reads, we can not swap.  */
3774   prev_gpr_read = gpr_read_mask (&history[0]);
3775   if (gpr_write & prev_gpr_read)
3776     return FALSE;
3777
3778   /* If one instruction sets a condition code and the
3779      other one uses a condition code, we can not swap.  */
3780   pinfo = ip->insn_mo->pinfo;
3781   if ((pinfo & INSN_READ_COND_CODE)
3782       && (prev_pinfo & INSN_WRITE_COND_CODE))
3783     return FALSE;
3784   if ((pinfo & INSN_WRITE_COND_CODE)
3785       && (prev_pinfo & INSN_READ_COND_CODE))
3786     return FALSE;
3787
3788   /* If the previous instruction uses the PC, we can not swap.  */
3789   prev_pinfo2 = history[0].insn_mo->pinfo2;
3790   if (mips_opts.mips16 && (prev_pinfo & MIPS16_INSN_READ_PC))
3791     return FALSE;
3792   if (mips_opts.micromips && (prev_pinfo2 & INSN2_READ_PC))
3793     return FALSE;
3794
3795   /* If the previous instruction has an incorrect size for a fixed
3796      branch delay slot in microMIPS mode, we cannot swap.  */
3797   pinfo2 = ip->insn_mo->pinfo2;
3798   if (mips_opts.micromips
3799       && (pinfo2 & INSN2_BRANCH_DELAY_16BIT)
3800       && insn_length (history) != 2)
3801     return FALSE;
3802   if (mips_opts.micromips
3803       && (pinfo2 & INSN2_BRANCH_DELAY_32BIT)
3804       && insn_length (history) != 4)
3805     return FALSE;
3806
3807   return TRUE;
3808 }
3809
3810 /* Decide how we should add IP to the instruction stream.  */
3811
3812 static enum append_method
3813 get_append_method (struct mips_cl_insn *ip)
3814 {
3815   unsigned long pinfo;
3816
3817   /* The relaxed version of a macro sequence must be inherently
3818      hazard-free.  */
3819   if (mips_relax.sequence == 2)
3820     return APPEND_ADD;
3821
3822   /* We must not dabble with instructions in a ".set norerorder" block.  */
3823   if (mips_opts.noreorder)
3824     return APPEND_ADD;
3825
3826   /* Otherwise, it's our responsibility to fill branch delay slots.  */
3827   if (delayed_branch_p (ip))
3828     {
3829       if (!branch_likely_p (ip) && can_swap_branch_p (ip))
3830         return APPEND_SWAP;
3831
3832       pinfo = ip->insn_mo->pinfo;
3833       if (mips_opts.mips16
3834           && ISA_SUPPORTS_MIPS16E
3835           && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31)))
3836         return APPEND_ADD_COMPACT;
3837
3838       return APPEND_ADD_WITH_NOP;
3839     }
3840
3841   return APPEND_ADD;
3842 }
3843
3844 /* IP is a MIPS16 instruction whose opcode we have just changed.
3845    Point IP->insn_mo to the new opcode's definition.  */
3846
3847 static void
3848 find_altered_mips16_opcode (struct mips_cl_insn *ip)
3849 {
3850   const struct mips_opcode *mo, *end;
3851
3852   end = &mips16_opcodes[bfd_mips16_num_opcodes];
3853   for (mo = ip->insn_mo; mo < end; mo++)
3854     if ((ip->insn_opcode & mo->mask) == mo->match)
3855       {
3856         ip->insn_mo = mo;
3857         return;
3858       }
3859   abort ();
3860 }
3861
3862 /* For microMIPS macros, we need to generate a local number label
3863    as the target of branches.  */
3864 #define MICROMIPS_LABEL_CHAR            '\037'
3865 static unsigned long micromips_target_label;
3866 static char micromips_target_name[32];
3867
3868 static char *
3869 micromips_label_name (void)
3870 {
3871   char *p = micromips_target_name;
3872   char symbol_name_temporary[24];
3873   unsigned long l;
3874   int i;
3875
3876   if (*p)
3877     return p;
3878
3879   i = 0;
3880   l = micromips_target_label;
3881 #ifdef LOCAL_LABEL_PREFIX
3882   *p++ = LOCAL_LABEL_PREFIX;
3883 #endif
3884   *p++ = 'L';
3885   *p++ = MICROMIPS_LABEL_CHAR;
3886   do
3887     {
3888       symbol_name_temporary[i++] = l % 10 + '0';
3889       l /= 10;
3890     }
3891   while (l != 0);
3892   while (i > 0)
3893     *p++ = symbol_name_temporary[--i];
3894   *p = '\0';
3895
3896   return micromips_target_name;
3897 }
3898
3899 static void
3900 micromips_label_expr (expressionS *label_expr)
3901 {
3902   label_expr->X_op = O_symbol;
3903   label_expr->X_add_symbol = symbol_find_or_make (micromips_label_name ());
3904   label_expr->X_add_number = 0;
3905 }
3906
3907 static void
3908 micromips_label_inc (void)
3909 {
3910   micromips_target_label++;
3911   *micromips_target_name = '\0';
3912 }
3913
3914 static void
3915 micromips_add_label (void)
3916 {
3917   symbolS *s;
3918
3919   s = colon (micromips_label_name ());
3920   micromips_label_inc ();
3921 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
3922   if (IS_ELF)
3923     S_SET_OTHER (s, ELF_ST_SET_MICROMIPS (S_GET_OTHER (s)));
3924 #endif
3925 }
3926
3927 /* If assembling microMIPS code, then return the microMIPS reloc
3928    corresponding to the requested one if any.  Otherwise return
3929    the reloc unchanged.  */
3930
3931 static bfd_reloc_code_real_type
3932 micromips_map_reloc (bfd_reloc_code_real_type reloc)
3933 {
3934   static const bfd_reloc_code_real_type relocs[][2] =
3935     {
3936       /* Keep sorted incrementally by the left-hand key.  */
3937       { BFD_RELOC_16_PCREL_S2, BFD_RELOC_MICROMIPS_16_PCREL_S1 },
3938       { BFD_RELOC_GPREL16, BFD_RELOC_MICROMIPS_GPREL16 },
3939       { BFD_RELOC_MIPS_JMP, BFD_RELOC_MICROMIPS_JMP },
3940       { BFD_RELOC_HI16, BFD_RELOC_MICROMIPS_HI16 },
3941       { BFD_RELOC_HI16_S, BFD_RELOC_MICROMIPS_HI16_S },
3942       { BFD_RELOC_LO16, BFD_RELOC_MICROMIPS_LO16 },
3943       { BFD_RELOC_MIPS_LITERAL, BFD_RELOC_MICROMIPS_LITERAL },
3944       { BFD_RELOC_MIPS_GOT16, BFD_RELOC_MICROMIPS_GOT16 },
3945       { BFD_RELOC_MIPS_CALL16, BFD_RELOC_MICROMIPS_CALL16 },
3946       { BFD_RELOC_MIPS_GOT_HI16, BFD_RELOC_MICROMIPS_GOT_HI16 },
3947       { BFD_RELOC_MIPS_GOT_LO16, BFD_RELOC_MICROMIPS_GOT_LO16 },
3948       { BFD_RELOC_MIPS_CALL_HI16, BFD_RELOC_MICROMIPS_CALL_HI16 },
3949       { BFD_RELOC_MIPS_CALL_LO16, BFD_RELOC_MICROMIPS_CALL_LO16 },
3950       { BFD_RELOC_MIPS_SUB, BFD_RELOC_MICROMIPS_SUB },
3951       { BFD_RELOC_MIPS_GOT_PAGE, BFD_RELOC_MICROMIPS_GOT_PAGE },
3952       { BFD_RELOC_MIPS_GOT_OFST, BFD_RELOC_MICROMIPS_GOT_OFST },
3953       { BFD_RELOC_MIPS_GOT_DISP, BFD_RELOC_MICROMIPS_GOT_DISP },
3954       { BFD_RELOC_MIPS_HIGHEST, BFD_RELOC_MICROMIPS_HIGHEST },
3955       { BFD_RELOC_MIPS_HIGHER, BFD_RELOC_MICROMIPS_HIGHER },
3956       { BFD_RELOC_MIPS_SCN_DISP, BFD_RELOC_MICROMIPS_SCN_DISP },
3957       { BFD_RELOC_MIPS_TLS_GD, BFD_RELOC_MICROMIPS_TLS_GD },
3958       { BFD_RELOC_MIPS_TLS_LDM, BFD_RELOC_MICROMIPS_TLS_LDM },
3959       { BFD_RELOC_MIPS_TLS_DTPREL_HI16, BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16 },
3960       { BFD_RELOC_MIPS_TLS_DTPREL_LO16, BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16 },
3961       { BFD_RELOC_MIPS_TLS_GOTTPREL, BFD_RELOC_MICROMIPS_TLS_GOTTPREL },
3962       { BFD_RELOC_MIPS_TLS_TPREL_HI16, BFD_RELOC_MICROMIPS_TLS_TPREL_HI16 },
3963       { BFD_RELOC_MIPS_TLS_TPREL_LO16, BFD_RELOC_MICROMIPS_TLS_TPREL_LO16 }
3964     };
3965   bfd_reloc_code_real_type r;
3966   size_t i;
3967
3968   if (!mips_opts.micromips)
3969     return reloc;
3970   for (i = 0; i < ARRAY_SIZE (relocs); i++)
3971     {
3972       r = relocs[i][0];
3973       if (r > reloc)
3974         return reloc;
3975       if (r == reloc)
3976         return relocs[i][1];
3977     }
3978   return reloc;
3979 }
3980
3981 /* Output an instruction.  IP is the instruction information.
3982    ADDRESS_EXPR is an operand of the instruction to be used with
3983    RELOC_TYPE.  EXPANSIONP is true if the instruction is part of
3984    a macro expansion.  */
3985
3986 static void
3987 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
3988              bfd_reloc_code_real_type *reloc_type, bfd_boolean expansionp)
3989 {
3990   unsigned long prev_pinfo2, pinfo;
3991   bfd_boolean relaxed_branch = FALSE;
3992   enum append_method method;
3993   bfd_boolean relax32;
3994   int branch_disp;
3995
3996   if (mips_fix_loongson2f && !HAVE_CODE_COMPRESSION)
3997     fix_loongson2f (ip);
3998
3999   mips_mark_labels ();
4000
4001   file_ase_mips16 |= mips_opts.mips16;
4002   file_ase_micromips |= mips_opts.micromips;
4003
4004   prev_pinfo2 = history[0].insn_mo->pinfo2;
4005   pinfo = ip->insn_mo->pinfo;
4006
4007   if (mips_opts.micromips
4008       && !expansionp
4009       && (((prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
4010            && micromips_insn_length (ip->insn_mo) != 2)
4011           || ((prev_pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
4012               && micromips_insn_length (ip->insn_mo) != 4)))
4013     as_warn (_("Wrong size instruction in a %u-bit branch delay slot"),
4014              (prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0 ? 16 : 32);
4015
4016   if (address_expr == NULL)
4017     ip->complete_p = 1;
4018   else if (*reloc_type <= BFD_RELOC_UNUSED
4019            && address_expr->X_op == O_constant)
4020     {
4021       unsigned int tmp;
4022
4023       ip->complete_p = 1;
4024       switch (*reloc_type)
4025         {
4026         case BFD_RELOC_32:
4027           ip->insn_opcode |= address_expr->X_add_number;
4028           break;
4029
4030         case BFD_RELOC_MIPS_HIGHEST:
4031           tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
4032           ip->insn_opcode |= tmp & 0xffff;
4033           break;
4034
4035         case BFD_RELOC_MIPS_HIGHER:
4036           tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
4037           ip->insn_opcode |= tmp & 0xffff;
4038           break;
4039
4040         case BFD_RELOC_HI16_S:
4041           tmp = (address_expr->X_add_number + 0x8000) >> 16;
4042           ip->insn_opcode |= tmp & 0xffff;
4043           break;
4044
4045         case BFD_RELOC_HI16:
4046           ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
4047           break;
4048
4049         case BFD_RELOC_UNUSED:
4050         case BFD_RELOC_LO16:
4051         case BFD_RELOC_MIPS_GOT_DISP:
4052           ip->insn_opcode |= address_expr->X_add_number & 0xffff;
4053           break;
4054
4055         case BFD_RELOC_MIPS_JMP:
4056           {
4057             int shift;
4058
4059             shift = mips_opts.micromips ? 1 : 2;
4060             if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4061               as_bad (_("jump to misaligned address (0x%lx)"),
4062                       (unsigned long) address_expr->X_add_number);
4063             ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4064                                 & 0x3ffffff);
4065             ip->complete_p = 0;
4066           }
4067           break;
4068
4069         case BFD_RELOC_MIPS16_JMP:
4070           if ((address_expr->X_add_number & 3) != 0)
4071             as_bad (_("jump to misaligned address (0x%lx)"),
4072                     (unsigned long) address_expr->X_add_number);
4073           ip->insn_opcode |=
4074             (((address_expr->X_add_number & 0x7c0000) << 3)
4075                | ((address_expr->X_add_number & 0xf800000) >> 7)
4076                | ((address_expr->X_add_number & 0x3fffc) >> 2));
4077           ip->complete_p = 0;
4078           break;
4079
4080         case BFD_RELOC_16_PCREL_S2:
4081           {
4082             int shift;
4083
4084             shift = mips_opts.micromips ? 1 : 2;
4085             if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4086               as_bad (_("branch to misaligned address (0x%lx)"),
4087                       (unsigned long) address_expr->X_add_number);
4088             if (!mips_relax_branch)
4089               {
4090                 if ((address_expr->X_add_number + (1 << (shift + 15)))
4091                     & ~((1 << (shift + 16)) - 1))
4092                   as_bad (_("branch address range overflow (0x%lx)"),
4093                           (unsigned long) address_expr->X_add_number);
4094                 ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4095                                     & 0xffff);
4096               }
4097             ip->complete_p = 0;
4098           }
4099           break;
4100
4101         default:
4102           internalError ();
4103         }       
4104     }
4105
4106   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
4107     {
4108       /* There are a lot of optimizations we could do that we don't.
4109          In particular, we do not, in general, reorder instructions.
4110          If you use gcc with optimization, it will reorder
4111          instructions and generally do much more optimization then we
4112          do here; repeating all that work in the assembler would only
4113          benefit hand written assembly code, and does not seem worth
4114          it.  */
4115       int nops = (mips_optimize == 0
4116                   ? nops_for_insn (0, history, NULL)
4117                   : nops_for_insn_or_target (0, history, ip));
4118       if (nops > 0)
4119         {
4120           fragS *old_frag;
4121           unsigned long old_frag_offset;
4122           int i;
4123
4124           old_frag = frag_now;
4125           old_frag_offset = frag_now_fix ();
4126
4127           for (i = 0; i < nops; i++)
4128             add_fixed_insn (NOP_INSN);
4129           insert_into_history (0, nops, NOP_INSN);
4130
4131           if (listing)
4132             {
4133               listing_prev_line ();
4134               /* We may be at the start of a variant frag.  In case we
4135                  are, make sure there is enough space for the frag
4136                  after the frags created by listing_prev_line.  The
4137                  argument to frag_grow here must be at least as large
4138                  as the argument to all other calls to frag_grow in
4139                  this file.  We don't have to worry about being in the
4140                  middle of a variant frag, because the variants insert
4141                  all needed nop instructions themselves.  */
4142               frag_grow (40);
4143             }
4144
4145           mips_move_labels ();
4146
4147 #ifndef NO_ECOFF_DEBUGGING
4148           if (ECOFF_DEBUGGING)
4149             ecoff_fix_loc (old_frag, old_frag_offset);
4150 #endif
4151         }
4152     }
4153   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
4154     {
4155       int nops;
4156
4157       /* Work out how many nops in prev_nop_frag are needed by IP,
4158          ignoring hazards generated by the first prev_nop_frag_since
4159          instructions.  */
4160       nops = nops_for_insn_or_target (prev_nop_frag_since, history, ip);
4161       gas_assert (nops <= prev_nop_frag_holds);
4162
4163       /* Enforce NOPS as a minimum.  */
4164       if (nops > prev_nop_frag_required)
4165         prev_nop_frag_required = nops;
4166
4167       if (prev_nop_frag_holds == prev_nop_frag_required)
4168         {
4169           /* Settle for the current number of nops.  Update the history
4170              accordingly (for the benefit of any future .set reorder code).  */
4171           prev_nop_frag = NULL;
4172           insert_into_history (prev_nop_frag_since,
4173                                prev_nop_frag_holds, NOP_INSN);
4174         }
4175       else
4176         {
4177           /* Allow this instruction to replace one of the nops that was
4178              tentatively added to prev_nop_frag.  */
4179           prev_nop_frag->fr_fix -= NOP_INSN_SIZE;
4180           prev_nop_frag_holds--;
4181           prev_nop_frag_since++;
4182         }
4183     }
4184
4185   method = get_append_method (ip);
4186   branch_disp = method == APPEND_SWAP ? insn_length (history) : 0;
4187
4188 #ifdef OBJ_ELF
4189   /* The value passed to dwarf2_emit_insn is the distance between
4190      the beginning of the current instruction and the address that
4191      should be recorded in the debug tables.  This is normally the
4192      current address.
4193
4194      For MIPS16/microMIPS debug info we want to use ISA-encoded
4195      addresses, so we use -1 for an address higher by one than the
4196      current one.
4197
4198      If the instruction produced is a branch that we will swap with
4199      the preceding instruction, then we add the displacement by which
4200      the branch will be moved backwards.  This is more appropriate
4201      and for MIPS16/microMIPS code also prevents a debugger from
4202      placing a breakpoint in the middle of the branch (and corrupting
4203      code if software breakpoints are used).  */
4204   dwarf2_emit_insn ((HAVE_CODE_COMPRESSION ? -1 : 0) + branch_disp);
4205 #endif
4206
4207   relax32 = (mips_relax_branch
4208              /* Don't try branch relaxation within .set nomacro, or within
4209                 .set noat if we use $at for PIC computations.  If it turns
4210                 out that the branch was out-of-range, we'll get an error.  */
4211              && !mips_opts.warn_about_macros
4212              && (mips_opts.at || mips_pic == NO_PIC)
4213              /* Don't relax BPOSGE32/64 as they have no complementing
4214                 branches.  */
4215              && !(ip->insn_mo->membership & (INSN_DSP64 | INSN_DSP)));
4216
4217   if (!HAVE_CODE_COMPRESSION
4218       && address_expr
4219       && relax32
4220       && *reloc_type == BFD_RELOC_16_PCREL_S2
4221       && delayed_branch_p (ip))
4222     {
4223       relaxed_branch = TRUE;
4224       add_relaxed_insn (ip, (relaxed_branch_length
4225                              (NULL, NULL,
4226                               uncond_branch_p (ip) ? -1
4227                               : branch_likely_p (ip) ? 1
4228                               : 0)), 4,
4229                         RELAX_BRANCH_ENCODE
4230                         (AT,
4231                          uncond_branch_p (ip),
4232                          branch_likely_p (ip),
4233                          pinfo & INSN_WRITE_GPR_31,
4234                          0),
4235                         address_expr->X_add_symbol,
4236                         address_expr->X_add_number);
4237       *reloc_type = BFD_RELOC_UNUSED;
4238     }
4239   else if (mips_opts.micromips
4240            && address_expr
4241            && ((relax32 && *reloc_type == BFD_RELOC_16_PCREL_S2)
4242                || *reloc_type > BFD_RELOC_UNUSED)
4243            && (delayed_branch_p (ip) || compact_branch_p (ip))
4244            /* Don't try branch relaxation when users specify
4245               16-bit/32-bit instructions.  */
4246            && !forced_insn_length)
4247     {
4248       bfd_boolean relax16 = *reloc_type > BFD_RELOC_UNUSED;
4249       int type = relax16 ? *reloc_type - BFD_RELOC_UNUSED : 0;
4250       int uncond = uncond_branch_p (ip) ? -1 : 0;
4251       int compact = compact_branch_p (ip);
4252       int al = pinfo & INSN_WRITE_GPR_31;
4253       int length32;
4254
4255       gas_assert (address_expr != NULL);
4256       gas_assert (!mips_relax.sequence);
4257
4258       relaxed_branch = TRUE;
4259       length32 = relaxed_micromips_32bit_branch_length (NULL, NULL, uncond);
4260       add_relaxed_insn (ip, relax32 ? length32 : 4, relax16 ? 2 : 4,
4261                         RELAX_MICROMIPS_ENCODE (type, AT, uncond, compact, al,
4262                                                 relax32, 0, 0),
4263                         address_expr->X_add_symbol,
4264                         address_expr->X_add_number);
4265       *reloc_type = BFD_RELOC_UNUSED;
4266     }
4267   else if (mips_opts.mips16 && *reloc_type > BFD_RELOC_UNUSED)
4268     {
4269       /* We need to set up a variant frag.  */
4270       gas_assert (address_expr != NULL);
4271       add_relaxed_insn (ip, 4, 0,
4272                         RELAX_MIPS16_ENCODE
4273                         (*reloc_type - BFD_RELOC_UNUSED,
4274                          forced_insn_length == 2, forced_insn_length == 4,
4275                          delayed_branch_p (&history[0]),
4276                          history[0].mips16_absolute_jump_p),
4277                         make_expr_symbol (address_expr), 0);
4278     }
4279   else if (mips_opts.mips16
4280            && ! ip->use_extend
4281            && *reloc_type != BFD_RELOC_MIPS16_JMP)
4282     {
4283       if (!delayed_branch_p (ip))
4284         /* Make sure there is enough room to swap this instruction with
4285            a following jump instruction.  */
4286         frag_grow (6);
4287       add_fixed_insn (ip);
4288     }
4289   else
4290     {
4291       if (mips_opts.mips16
4292           && mips_opts.noreorder
4293           && delayed_branch_p (&history[0]))
4294         as_warn (_("extended instruction in delay slot"));
4295
4296       if (mips_relax.sequence)
4297         {
4298           /* If we've reached the end of this frag, turn it into a variant
4299              frag and record the information for the instructions we've
4300              written so far.  */
4301           if (frag_room () < 4)
4302             relax_close_frag ();
4303           mips_relax.sizes[mips_relax.sequence - 1] += insn_length (ip);
4304         }
4305
4306       if (mips_relax.sequence != 2)
4307         {
4308           if (mips_macro_warning.first_insn_sizes[0] == 0)
4309             mips_macro_warning.first_insn_sizes[0] = insn_length (ip);
4310           mips_macro_warning.sizes[0] += insn_length (ip);
4311           mips_macro_warning.insns[0]++;
4312         }
4313       if (mips_relax.sequence != 1)
4314         {
4315           if (mips_macro_warning.first_insn_sizes[1] == 0)
4316             mips_macro_warning.first_insn_sizes[1] = insn_length (ip);
4317           mips_macro_warning.sizes[1] += insn_length (ip);
4318           mips_macro_warning.insns[1]++;
4319         }
4320
4321       if (mips_opts.mips16)
4322         {
4323           ip->fixed_p = 1;
4324           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
4325         }
4326       add_fixed_insn (ip);
4327     }
4328
4329   if (!ip->complete_p && *reloc_type < BFD_RELOC_UNUSED)
4330     {
4331       bfd_reloc_code_real_type final_type[3];
4332       reloc_howto_type *howto0;
4333       reloc_howto_type *howto;
4334       int i;
4335
4336       /* Perform any necessary conversion to microMIPS relocations
4337          and find out how many relocations there actually are.  */
4338       for (i = 0; i < 3 && reloc_type[i] != BFD_RELOC_UNUSED; i++)
4339         final_type[i] = micromips_map_reloc (reloc_type[i]);
4340
4341       /* In a compound relocation, it is the final (outermost)
4342          operator that determines the relocated field.  */
4343       howto = howto0 = bfd_reloc_type_lookup (stdoutput, final_type[i - 1]);
4344
4345       if (howto == NULL)
4346         {
4347           /* To reproduce this failure try assembling gas/testsuites/
4348              gas/mips/mips16-intermix.s with a mips-ecoff targeted
4349              assembler.  */
4350           as_bad (_("Unsupported MIPS relocation number %d"),
4351                   final_type[i - 1]);
4352           howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
4353         }
4354
4355       if (i > 1)
4356         howto0 = bfd_reloc_type_lookup (stdoutput, final_type[0]);
4357       ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
4358                                  bfd_get_reloc_size (howto),
4359                                  address_expr,
4360                                  howto0 && howto0->pc_relative,
4361                                  final_type[0]);
4362
4363       /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
4364       if (final_type[0] == BFD_RELOC_MIPS16_JMP && ip->fixp[0]->fx_addsy)
4365         *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
4366
4367       /* These relocations can have an addend that won't fit in
4368          4 octets for 64bit assembly.  */
4369       if (HAVE_64BIT_GPRS
4370           && ! howto->partial_inplace
4371           && (reloc_type[0] == BFD_RELOC_16
4372               || reloc_type[0] == BFD_RELOC_32
4373               || reloc_type[0] == BFD_RELOC_MIPS_JMP
4374               || reloc_type[0] == BFD_RELOC_GPREL16
4375               || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
4376               || reloc_type[0] == BFD_RELOC_GPREL32
4377               || reloc_type[0] == BFD_RELOC_64
4378               || reloc_type[0] == BFD_RELOC_CTOR
4379               || reloc_type[0] == BFD_RELOC_MIPS_SUB
4380               || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
4381               || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
4382               || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
4383               || reloc_type[0] == BFD_RELOC_MIPS_REL16
4384               || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
4385               || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
4386               || hi16_reloc_p (reloc_type[0])
4387               || lo16_reloc_p (reloc_type[0])))
4388         ip->fixp[0]->fx_no_overflow = 1;
4389
4390       if (mips_relax.sequence)
4391         {
4392           if (mips_relax.first_fixup == 0)
4393             mips_relax.first_fixup = ip->fixp[0];
4394         }
4395       else if (reloc_needs_lo_p (*reloc_type))
4396         {
4397           struct mips_hi_fixup *hi_fixup;
4398
4399           /* Reuse the last entry if it already has a matching %lo.  */
4400           hi_fixup = mips_hi_fixup_list;
4401           if (hi_fixup == 0
4402               || !fixup_has_matching_lo_p (hi_fixup->fixp))
4403             {
4404               hi_fixup = ((struct mips_hi_fixup *)
4405                           xmalloc (sizeof (struct mips_hi_fixup)));
4406               hi_fixup->next = mips_hi_fixup_list;
4407               mips_hi_fixup_list = hi_fixup;
4408             }
4409           hi_fixup->fixp = ip->fixp[0];
4410           hi_fixup->seg = now_seg;
4411         }
4412
4413       /* Add fixups for the second and third relocations, if given.
4414          Note that the ABI allows the second relocation to be
4415          against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
4416          moment we only use RSS_UNDEF, but we could add support
4417          for the others if it ever becomes necessary.  */
4418       for (i = 1; i < 3; i++)
4419         if (reloc_type[i] != BFD_RELOC_UNUSED)
4420           {
4421             ip->fixp[i] = fix_new (ip->frag, ip->where,
4422                                    ip->fixp[0]->fx_size, NULL, 0,
4423                                    FALSE, final_type[i]);
4424
4425             /* Use fx_tcbit to mark compound relocs.  */
4426             ip->fixp[0]->fx_tcbit = 1;
4427             ip->fixp[i]->fx_tcbit = 1;
4428           }
4429     }
4430   install_insn (ip);
4431
4432   /* Update the register mask information.  */
4433   mips_gprmask |= gpr_read_mask (ip) | gpr_write_mask (ip);
4434   mips_cprmask[1] |= fpr_read_mask (ip) | fpr_write_mask (ip);
4435
4436   switch (method)
4437     {
4438     case APPEND_ADD:
4439       insert_into_history (0, 1, ip);
4440       break;
4441
4442     case APPEND_ADD_WITH_NOP:
4443       {
4444         struct mips_cl_insn *nop;
4445
4446         insert_into_history (0, 1, ip);
4447         nop = get_delay_slot_nop (ip);
4448         add_fixed_insn (nop);
4449         insert_into_history (0, 1, nop);
4450         if (mips_relax.sequence)
4451           mips_relax.sizes[mips_relax.sequence - 1] += insn_length (nop);
4452       }
4453       break;
4454
4455     case APPEND_ADD_COMPACT:
4456       /* Convert MIPS16 jr/jalr into a "compact" jump.  */
4457       gas_assert (mips_opts.mips16);
4458       ip->insn_opcode |= 0x0080;
4459       find_altered_mips16_opcode (ip);
4460       install_insn (ip);
4461       insert_into_history (0, 1, ip);
4462       break;
4463
4464     case APPEND_SWAP:
4465       {
4466         struct mips_cl_insn delay = history[0];
4467         if (mips_opts.mips16)
4468           {
4469             know (delay.frag == ip->frag);
4470             move_insn (ip, delay.frag, delay.where);
4471             move_insn (&delay, ip->frag, ip->where + insn_length (ip));
4472           }
4473         else if (relaxed_branch)
4474           {
4475             /* Add the delay slot instruction to the end of the
4476                current frag and shrink the fixed part of the
4477                original frag.  If the branch occupies the tail of
4478                the latter, move it backwards to cover the gap.  */
4479             delay.frag->fr_fix -= branch_disp;
4480             if (delay.frag == ip->frag)
4481               move_insn (ip, ip->frag, ip->where - branch_disp);
4482             add_fixed_insn (&delay);
4483           }
4484         else
4485           {
4486             move_insn (&delay, ip->frag,
4487                        ip->where - branch_disp + insn_length (ip));
4488             move_insn (ip, history[0].frag, history[0].where);
4489           }
4490         history[0] = *ip;
4491         delay.fixed_p = 1;
4492         insert_into_history (0, 1, &delay);
4493       }
4494       break;
4495     }
4496
4497   /* If we have just completed an unconditional branch, clear the history.  */
4498   if ((delayed_branch_p (&history[1]) && uncond_branch_p (&history[1]))
4499       || (compact_branch_p (&history[0]) && uncond_branch_p (&history[0])))
4500     mips_no_prev_insn ();
4501
4502   /* We need to emit a label at the end of branch-likely macros.  */
4503   if (emit_branch_likely_macro)
4504     {
4505       emit_branch_likely_macro = FALSE;
4506       micromips_add_label ();
4507     }
4508
4509   /* We just output an insn, so the next one doesn't have a label.  */
4510   mips_clear_insn_labels ();
4511 }
4512
4513 /* Forget that there was any previous instruction or label.  */
4514
4515 static void
4516 mips_no_prev_insn (void)
4517 {
4518   prev_nop_frag = NULL;
4519   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
4520   mips_clear_insn_labels ();
4521 }
4522
4523 /* This function must be called before we emit something other than
4524    instructions.  It is like mips_no_prev_insn except that it inserts
4525    any NOPS that might be needed by previous instructions.  */
4526
4527 void
4528 mips_emit_delays (void)
4529 {
4530   if (! mips_opts.noreorder)
4531     {
4532       int nops = nops_for_insn (0, history, NULL);
4533       if (nops > 0)
4534         {
4535           while (nops-- > 0)
4536             add_fixed_insn (NOP_INSN);
4537           mips_move_labels ();
4538         }
4539     }
4540   mips_no_prev_insn ();
4541 }
4542
4543 /* Start a (possibly nested) noreorder block.  */
4544
4545 static void
4546 start_noreorder (void)
4547 {
4548   if (mips_opts.noreorder == 0)
4549     {
4550       unsigned int i;
4551       int nops;
4552
4553       /* None of the instructions before the .set noreorder can be moved.  */
4554       for (i = 0; i < ARRAY_SIZE (history); i++)
4555         history[i].fixed_p = 1;
4556
4557       /* Insert any nops that might be needed between the .set noreorder
4558          block and the previous instructions.  We will later remove any
4559          nops that turn out not to be needed.  */
4560       nops = nops_for_insn (0, history, NULL);
4561       if (nops > 0)
4562         {
4563           if (mips_optimize != 0)
4564             {
4565               /* Record the frag which holds the nop instructions, so
4566                  that we can remove them if we don't need them.  */
4567               frag_grow (nops * NOP_INSN_SIZE);
4568               prev_nop_frag = frag_now;
4569               prev_nop_frag_holds = nops;
4570               prev_nop_frag_required = 0;
4571               prev_nop_frag_since = 0;
4572             }
4573
4574           for (; nops > 0; --nops)
4575             add_fixed_insn (NOP_INSN);
4576
4577           /* Move on to a new frag, so that it is safe to simply
4578              decrease the size of prev_nop_frag.  */
4579           frag_wane (frag_now);
4580           frag_new (0);
4581           mips_move_labels ();
4582         }
4583       mips_mark_labels ();
4584       mips_clear_insn_labels ();
4585     }
4586   mips_opts.noreorder++;
4587   mips_any_noreorder = 1;
4588 }
4589
4590 /* End a nested noreorder block.  */
4591
4592 static void
4593 end_noreorder (void)
4594 {
4595
4596   mips_opts.noreorder--;
4597   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
4598     {
4599       /* Commit to inserting prev_nop_frag_required nops and go back to
4600          handling nop insertion the .set reorder way.  */
4601       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
4602                                 * NOP_INSN_SIZE);
4603       insert_into_history (prev_nop_frag_since,
4604                            prev_nop_frag_required, NOP_INSN);
4605       prev_nop_frag = NULL;
4606     }
4607 }
4608
4609 /* Set up global variables for the start of a new macro.  */
4610
4611 static void
4612 macro_start (void)
4613 {
4614   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
4615   memset (&mips_macro_warning.first_insn_sizes, 0,
4616           sizeof (mips_macro_warning.first_insn_sizes));
4617   memset (&mips_macro_warning.insns, 0, sizeof (mips_macro_warning.insns));
4618   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
4619                                      && delayed_branch_p (&history[0]));
4620   switch (history[0].insn_mo->pinfo2
4621           & (INSN2_BRANCH_DELAY_32BIT | INSN2_BRANCH_DELAY_16BIT))
4622     {
4623     case INSN2_BRANCH_DELAY_32BIT:
4624       mips_macro_warning.delay_slot_length = 4;
4625       break;
4626     case INSN2_BRANCH_DELAY_16BIT:
4627       mips_macro_warning.delay_slot_length = 2;
4628       break;
4629     default:
4630       mips_macro_warning.delay_slot_length = 0;
4631       break;
4632     }
4633   mips_macro_warning.first_frag = NULL;
4634 }
4635
4636 /* Given that a macro is longer than one instruction or of the wrong size,
4637    return the appropriate warning for it.  Return null if no warning is
4638    needed.  SUBTYPE is a bitmask of RELAX_DELAY_SLOT, RELAX_DELAY_SLOT_16BIT,
4639    RELAX_DELAY_SLOT_SIZE_FIRST, RELAX_DELAY_SLOT_SIZE_SECOND,
4640    and RELAX_NOMACRO.  */
4641
4642 static const char *
4643 macro_warning (relax_substateT subtype)
4644 {
4645   if (subtype & RELAX_DELAY_SLOT)
4646     return _("Macro instruction expanded into multiple instructions"
4647              " in a branch delay slot");
4648   else if (subtype & RELAX_NOMACRO)
4649     return _("Macro instruction expanded into multiple instructions");
4650   else if (subtype & (RELAX_DELAY_SLOT_SIZE_FIRST
4651                       | RELAX_DELAY_SLOT_SIZE_SECOND))
4652     return ((subtype & RELAX_DELAY_SLOT_16BIT)
4653             ? _("Macro instruction expanded into a wrong size instruction"
4654                 " in a 16-bit branch delay slot")
4655             : _("Macro instruction expanded into a wrong size instruction"
4656                 " in a 32-bit branch delay slot"));
4657   else
4658     return 0;
4659 }
4660
4661 /* Finish up a macro.  Emit warnings as appropriate.  */
4662
4663 static void
4664 macro_end (void)
4665 {
4666   /* Relaxation warning flags.  */
4667   relax_substateT subtype = 0;
4668
4669   /* Check delay slot size requirements.  */
4670   if (mips_macro_warning.delay_slot_length == 2)
4671     subtype |= RELAX_DELAY_SLOT_16BIT;
4672   if (mips_macro_warning.delay_slot_length != 0)
4673     {
4674       if (mips_macro_warning.delay_slot_length
4675           != mips_macro_warning.first_insn_sizes[0])
4676         subtype |= RELAX_DELAY_SLOT_SIZE_FIRST;
4677       if (mips_macro_warning.delay_slot_length
4678           != mips_macro_warning.first_insn_sizes[1])
4679         subtype |= RELAX_DELAY_SLOT_SIZE_SECOND;
4680     }
4681
4682   /* Check instruction count requirements.  */
4683   if (mips_macro_warning.insns[0] > 1 || mips_macro_warning.insns[1] > 1)
4684     {
4685       if (mips_macro_warning.insns[1] > mips_macro_warning.insns[0])
4686         subtype |= RELAX_SECOND_LONGER;
4687       if (mips_opts.warn_about_macros)
4688         subtype |= RELAX_NOMACRO;
4689       if (mips_macro_warning.delay_slot_p)
4690         subtype |= RELAX_DELAY_SLOT;
4691     }
4692
4693   /* If both alternatives fail to fill a delay slot correctly,
4694      emit the warning now.  */
4695   if ((subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0
4696       && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0)
4697     {
4698       relax_substateT s;
4699       const char *msg;
4700
4701       s = subtype & (RELAX_DELAY_SLOT_16BIT
4702                      | RELAX_DELAY_SLOT_SIZE_FIRST
4703                      | RELAX_DELAY_SLOT_SIZE_SECOND);
4704       msg = macro_warning (s);
4705       if (msg != NULL)
4706         as_warn ("%s", msg);
4707       subtype &= ~s;
4708     }
4709
4710   /* If both implementations are longer than 1 instruction, then emit the
4711      warning now.  */
4712   if (mips_macro_warning.insns[0] > 1 && mips_macro_warning.insns[1] > 1)
4713     {
4714       relax_substateT s;
4715       const char *msg;
4716
4717       s = subtype & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT);
4718       msg = macro_warning (s);
4719       if (msg != NULL)
4720         as_warn ("%s", msg);
4721       subtype &= ~s;
4722     }
4723
4724   /* If any flags still set, then one implementation might need a warning
4725      and the other either will need one of a different kind or none at all.
4726      Pass any remaining flags over to relaxation.  */
4727   if (mips_macro_warning.first_frag != NULL)
4728     mips_macro_warning.first_frag->fr_subtype |= subtype;
4729 }
4730
4731 /* Instruction operand formats used in macros that vary between
4732    standard MIPS and microMIPS code.  */
4733
4734 static const char * const brk_fmt[2] = { "c", "mF" };
4735 static const char * const cop12_fmt[2] = { "E,o(b)", "E,~(b)" };
4736 static const char * const jalr_fmt[2] = { "d,s", "t,s" };
4737 static const char * const lui_fmt[2] = { "t,u", "s,u" };
4738 static const char * const mem12_fmt[2] = { "t,o(b)", "t,~(b)" };
4739 static const char * const mfhl_fmt[2] = { "d", "mj" };
4740 static const char * const shft_fmt[2] = { "d,w,<", "t,r,<" };
4741 static const char * const trap_fmt[2] = { "s,t,q", "s,t,|" };
4742
4743 #define BRK_FMT (brk_fmt[mips_opts.micromips])
4744 #define COP12_FMT (cop12_fmt[mips_opts.micromips])
4745 #define JALR_FMT (jalr_fmt[mips_opts.micromips])
4746 #define LUI_FMT (lui_fmt[mips_opts.micromips])
4747 #define MEM12_FMT (mem12_fmt[mips_opts.micromips])
4748 #define MFHL_FMT (mfhl_fmt[mips_opts.micromips])
4749 #define SHFT_FMT (shft_fmt[mips_opts.micromips])
4750 #define TRAP_FMT (trap_fmt[mips_opts.micromips])
4751
4752 /* Read a macro's relocation codes from *ARGS and store them in *R.
4753    The first argument in *ARGS will be either the code for a single
4754    relocation or -1 followed by the three codes that make up a
4755    composite relocation.  */
4756
4757 static void
4758 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
4759 {
4760   int i, next;
4761
4762   next = va_arg (*args, int);
4763   if (next >= 0)
4764     r[0] = (bfd_reloc_code_real_type) next;
4765   else
4766     for (i = 0; i < 3; i++)
4767       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
4768 }
4769
4770 /* Build an instruction created by a macro expansion.  This is passed
4771    a pointer to the count of instructions created so far, an
4772    expression, the name of the instruction to build, an operand format
4773    string, and corresponding arguments.  */
4774
4775 static void
4776 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
4777 {
4778   const struct mips_opcode *mo = NULL;
4779   bfd_reloc_code_real_type r[3];
4780   const struct mips_opcode *amo;
4781   struct hash_control *hash;
4782   struct mips_cl_insn insn;
4783   va_list args;
4784
4785   va_start (args, fmt);
4786
4787   if (mips_opts.mips16)
4788     {
4789       mips16_macro_build (ep, name, fmt, &args);
4790       va_end (args);
4791       return;
4792     }
4793
4794   r[0] = BFD_RELOC_UNUSED;
4795   r[1] = BFD_RELOC_UNUSED;
4796   r[2] = BFD_RELOC_UNUSED;
4797   hash = mips_opts.micromips ? micromips_op_hash : op_hash;
4798   amo = (struct mips_opcode *) hash_find (hash, name);
4799   gas_assert (amo);
4800   gas_assert (strcmp (name, amo->name) == 0);
4801
4802   do
4803     {
4804       /* Search until we get a match for NAME.  It is assumed here that
4805          macros will never generate MDMX, MIPS-3D, or MT instructions.
4806          We try to match an instruction that fulfils the branch delay
4807          slot instruction length requirement (if any) of the previous
4808          instruction.  While doing this we record the first instruction
4809          seen that matches all the other conditions and use it anyway
4810          if the requirement cannot be met; we will issue an appropriate
4811          warning later on.  */
4812       if (strcmp (fmt, amo->args) == 0
4813           && amo->pinfo != INSN_MACRO
4814           && is_opcode_valid (amo)
4815           && is_size_valid (amo))
4816         {
4817           if (is_delay_slot_valid (amo))
4818             {
4819               mo = amo;
4820               break;
4821             }
4822           else if (!mo)
4823             mo = amo;
4824         }
4825
4826       ++amo;
4827       gas_assert (amo->name);
4828     }
4829   while (strcmp (name, amo->name) == 0);
4830
4831   gas_assert (mo);
4832   create_insn (&insn, mo);
4833   for (;;)
4834     {
4835       switch (*fmt++)
4836         {
4837         case '\0':
4838           break;
4839
4840         case ',':
4841         case '(':
4842         case ')':
4843           continue;
4844
4845         case '+':
4846           switch (*fmt++)
4847             {
4848             case 'A':
4849             case 'E':
4850               INSERT_OPERAND (mips_opts.micromips,
4851                               EXTLSB, insn, va_arg (args, int));
4852               continue;
4853
4854             case 'B':
4855             case 'F':
4856               /* Note that in the macro case, these arguments are already
4857                  in MSB form.  (When handling the instruction in the
4858                  non-macro case, these arguments are sizes from which
4859                  MSB values must be calculated.)  */
4860               INSERT_OPERAND (mips_opts.micromips,
4861                               INSMSB, insn, va_arg (args, int));
4862               continue;
4863
4864             case 'C':
4865             case 'G':
4866             case 'H':
4867               /* Note that in the macro case, these arguments are already
4868                  in MSBD form.  (When handling the instruction in the
4869                  non-macro case, these arguments are sizes from which
4870                  MSBD values must be calculated.)  */
4871               INSERT_OPERAND (mips_opts.micromips,
4872                               EXTMSBD, insn, va_arg (args, int));
4873               continue;
4874
4875             case 'Q':
4876               gas_assert (!mips_opts.micromips);
4877               INSERT_OPERAND (0, SEQI, insn, va_arg (args, int));
4878               continue;
4879
4880             default:
4881               internalError ();
4882             }
4883           continue;
4884
4885         case '2':
4886           gas_assert (!mips_opts.micromips);
4887           INSERT_OPERAND (0, BP, insn, va_arg (args, int));
4888           continue;
4889
4890         case 'n':
4891           gas_assert (mips_opts.micromips);
4892         case 't':
4893         case 'w':
4894         case 'E':
4895           INSERT_OPERAND (mips_opts.micromips, RT, insn, va_arg (args, int));
4896           continue;
4897
4898         case 'c':
4899           gas_assert (!mips_opts.micromips);
4900           INSERT_OPERAND (0, CODE, insn, va_arg (args, int));
4901           continue;
4902
4903         case 'W':
4904           gas_assert (!mips_opts.micromips);
4905         case 'T':
4906           INSERT_OPERAND (mips_opts.micromips, FT, insn, va_arg (args, int));
4907           continue;
4908
4909         case 'G':
4910           if (mips_opts.micromips)
4911             INSERT_OPERAND (1, RS, insn, va_arg (args, int));
4912           else
4913             INSERT_OPERAND (0, RD, insn, va_arg (args, int));
4914           continue;
4915
4916         case 'K':
4917           gas_assert (!mips_opts.micromips);
4918         case 'd':
4919           INSERT_OPERAND (mips_opts.micromips, RD, insn, va_arg (args, int));
4920           continue;
4921
4922         case 'U':
4923           gas_assert (!mips_opts.micromips);
4924           {
4925             int tmp = va_arg (args, int);
4926
4927             INSERT_OPERAND (0, RT, insn, tmp);
4928             INSERT_OPERAND (0, RD, insn, tmp);
4929           }
4930           continue;
4931
4932         case 'V':
4933         case 'S':
4934           gas_assert (!mips_opts.micromips);
4935           INSERT_OPERAND (0, FS, insn, va_arg (args, int));
4936           continue;
4937
4938         case 'z':
4939           continue;
4940
4941         case '<':
4942           INSERT_OPERAND (mips_opts.micromips,
4943                           SHAMT, insn, va_arg (args, int));
4944           continue;
4945
4946         case 'D':
4947           gas_assert (!mips_opts.micromips);
4948           INSERT_OPERAND (0, FD, insn, va_arg (args, int));
4949           continue;
4950
4951         case 'B':
4952           gas_assert (!mips_opts.micromips);
4953           INSERT_OPERAND (0, CODE20, insn, va_arg (args, int));
4954           continue;
4955
4956         case 'J':
4957           gas_assert (!mips_opts.micromips);
4958           INSERT_OPERAND (0, CODE19, insn, va_arg (args, int));
4959           continue;
4960
4961         case 'q':
4962           gas_assert (!mips_opts.micromips);
4963           INSERT_OPERAND (0, CODE2, insn, va_arg (args, int));
4964           continue;
4965
4966         case 'b':
4967         case 's':
4968         case 'r':
4969         case 'v':
4970           INSERT_OPERAND (mips_opts.micromips, RS, insn, va_arg (args, int));
4971           continue;
4972
4973         case 'i':
4974         case 'j':
4975           macro_read_relocs (&args, r);
4976           gas_assert (*r == BFD_RELOC_GPREL16
4977                       || *r == BFD_RELOC_MIPS_HIGHER
4978                       || *r == BFD_RELOC_HI16_S
4979                       || *r == BFD_RELOC_LO16
4980                       || *r == BFD_RELOC_MIPS_GOT_OFST);
4981           continue;
4982
4983         case 'o':
4984           macro_read_relocs (&args, r);
4985           continue;
4986
4987         case 'u':
4988           macro_read_relocs (&args, r);
4989           gas_assert (ep != NULL
4990                       && (ep->X_op == O_constant
4991                           || (ep->X_op == O_symbol
4992                               && (*r == BFD_RELOC_MIPS_HIGHEST
4993                                   || *r == BFD_RELOC_HI16_S
4994                                   || *r == BFD_RELOC_HI16
4995                                   || *r == BFD_RELOC_GPREL16
4996                                   || *r == BFD_RELOC_MIPS_GOT_HI16
4997                                   || *r == BFD_RELOC_MIPS_CALL_HI16))));
4998           continue;
4999
5000         case 'p':
5001           gas_assert (ep != NULL);
5002
5003           /*
5004            * This allows macro() to pass an immediate expression for
5005            * creating short branches without creating a symbol.
5006            *
5007            * We don't allow branch relaxation for these branches, as
5008            * they should only appear in ".set nomacro" anyway.
5009            */
5010           if (ep->X_op == O_constant)
5011             {
5012               /* For microMIPS we always use relocations for branches.
5013                  So we should not resolve immediate values.  */
5014               gas_assert (!mips_opts.micromips);
5015
5016               if ((ep->X_add_number & 3) != 0)
5017                 as_bad (_("branch to misaligned address (0x%lx)"),
5018                         (unsigned long) ep->X_add_number);
5019               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
5020                 as_bad (_("branch address range overflow (0x%lx)"),
5021                         (unsigned long) ep->X_add_number);
5022               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
5023               ep = NULL;
5024             }
5025           else
5026             *r = BFD_RELOC_16_PCREL_S2;
5027           continue;
5028
5029         case 'a':
5030           gas_assert (ep != NULL);
5031           *r = BFD_RELOC_MIPS_JMP;
5032           continue;
5033
5034         case 'C':
5035           gas_assert (!mips_opts.micromips);
5036           INSERT_OPERAND (0, COPZ, insn, va_arg (args, unsigned long));
5037           continue;
5038
5039         case 'k':
5040           INSERT_OPERAND (mips_opts.micromips,
5041                           CACHE, insn, va_arg (args, unsigned long));
5042           continue;
5043
5044         case '|':
5045           gas_assert (mips_opts.micromips);
5046           INSERT_OPERAND (1, TRAP, insn, va_arg (args, int));
5047           continue;
5048
5049         case '.':
5050           gas_assert (mips_opts.micromips);
5051           INSERT_OPERAND (1, OFFSET10, insn, va_arg (args, int));
5052           continue;
5053
5054         case '\\':
5055           INSERT_OPERAND (mips_opts.micromips,
5056                           3BITPOS, insn, va_arg (args, unsigned int));
5057           continue;
5058
5059         case '~':
5060           INSERT_OPERAND (mips_opts.micromips,
5061                           OFFSET12, insn, va_arg (args, unsigned long));
5062           continue;
5063
5064         case 'N':
5065           gas_assert (mips_opts.micromips);
5066           INSERT_OPERAND (1, BCC, insn, va_arg (args, int));
5067           continue;
5068
5069         case 'm':       /* Opcode extension character.  */
5070           gas_assert (mips_opts.micromips);
5071           switch (*fmt++)
5072             {
5073             case 'j':
5074               INSERT_OPERAND (1, MJ, insn, va_arg (args, int));
5075               break;
5076
5077             case 'p':
5078               INSERT_OPERAND (1, MP, insn, va_arg (args, int));
5079               break;
5080
5081             case 'F':
5082               INSERT_OPERAND (1, IMMF, insn, va_arg (args, int));
5083               break;
5084
5085             default:
5086               internalError ();
5087             }
5088           continue;
5089
5090         default:
5091           internalError ();
5092         }
5093       break;
5094     }
5095   va_end (args);
5096   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5097
5098   append_insn (&insn, ep, r, TRUE);
5099 }
5100
5101 static void
5102 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
5103                     va_list *args)
5104 {
5105   struct mips_opcode *mo;
5106   struct mips_cl_insn insn;
5107   bfd_reloc_code_real_type r[3]
5108     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
5109
5110   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
5111   gas_assert (mo);
5112   gas_assert (strcmp (name, mo->name) == 0);
5113
5114   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
5115     {
5116       ++mo;
5117       gas_assert (mo->name);
5118       gas_assert (strcmp (name, mo->name) == 0);
5119     }
5120
5121   create_insn (&insn, mo);
5122   for (;;)
5123     {
5124       int c;
5125
5126       c = *fmt++;
5127       switch (c)
5128         {
5129         case '\0':
5130           break;
5131
5132         case ',':
5133         case '(':
5134         case ')':
5135           continue;
5136
5137         case 'y':
5138         case 'w':
5139           MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
5140           continue;
5141
5142         case 'x':
5143         case 'v':
5144           MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
5145           continue;
5146
5147         case 'z':
5148           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
5149           continue;
5150
5151         case 'Z':
5152           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
5153           continue;
5154
5155         case '0':
5156         case 'S':
5157         case 'P':
5158         case 'R':
5159           continue;
5160
5161         case 'X':
5162           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
5163           continue;
5164
5165         case 'Y':
5166           {
5167             int regno;
5168
5169             regno = va_arg (*args, int);
5170             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
5171             MIPS16_INSERT_OPERAND (REG32R, insn, regno);
5172           }
5173           continue;
5174
5175         case '<':
5176         case '>':
5177         case '4':
5178         case '5':
5179         case 'H':
5180         case 'W':
5181         case 'D':
5182         case 'j':
5183         case '8':
5184         case 'V':
5185         case 'C':
5186         case 'U':
5187         case 'k':
5188         case 'K':
5189         case 'p':
5190         case 'q':
5191           {
5192             gas_assert (ep != NULL);
5193
5194             if (ep->X_op != O_constant)
5195               *r = (int) BFD_RELOC_UNUSED + c;
5196             else
5197               {
5198                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
5199                               FALSE, &insn.insn_opcode, &insn.use_extend,
5200                               &insn.extend);
5201                 ep = NULL;
5202                 *r = BFD_RELOC_UNUSED;
5203               }
5204           }
5205           continue;
5206
5207         case '6':
5208           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
5209           continue;
5210         }
5211
5212       break;
5213     }
5214
5215   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5216
5217   append_insn (&insn, ep, r, TRUE);
5218 }
5219
5220 /*
5221  * Sign-extend 32-bit mode constants that have bit 31 set and all
5222  * higher bits unset.
5223  */
5224 static void
5225 normalize_constant_expr (expressionS *ex)
5226 {
5227   if (ex->X_op == O_constant
5228       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5229     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5230                         - 0x80000000);
5231 }
5232
5233 /*
5234  * Sign-extend 32-bit mode address offsets that have bit 31 set and
5235  * all higher bits unset.
5236  */
5237 static void
5238 normalize_address_expr (expressionS *ex)
5239 {
5240   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
5241         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
5242       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5243     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5244                         - 0x80000000);
5245 }
5246
5247 /*
5248  * Generate a "jalr" instruction with a relocation hint to the called
5249  * function.  This occurs in NewABI PIC code.
5250  */
5251 static void
5252 macro_build_jalr (expressionS *ep, int cprestore)
5253 {
5254   static const bfd_reloc_code_real_type jalr_relocs[2]
5255     = { BFD_RELOC_MIPS_JALR, BFD_RELOC_MICROMIPS_JALR };
5256   bfd_reloc_code_real_type jalr_reloc = jalr_relocs[mips_opts.micromips];
5257   const char *jalr;
5258   char *f = NULL;
5259
5260   if (MIPS_JALR_HINT_P (ep))
5261     {
5262       frag_grow (8);
5263       f = frag_more (0);
5264     }
5265   if (!mips_opts.micromips)
5266     macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
5267   else
5268     {
5269       jalr = mips_opts.noreorder && !cprestore ? "jalr" : "jalrs";
5270       if (MIPS_JALR_HINT_P (ep))
5271         macro_build (NULL, jalr, "t,s", RA, PIC_CALL_REG);
5272       else
5273         macro_build (NULL, jalr, "mj", PIC_CALL_REG);
5274     }
5275   if (MIPS_JALR_HINT_P (ep))
5276     fix_new_exp (frag_now, f - frag_now->fr_literal, 4, ep, FALSE, jalr_reloc);
5277 }
5278
5279 /*
5280  * Generate a "lui" instruction.
5281  */
5282 static void
5283 macro_build_lui (expressionS *ep, int regnum)
5284 {
5285   gas_assert (! mips_opts.mips16);
5286
5287   if (ep->X_op != O_constant)
5288     {
5289       gas_assert (ep->X_op == O_symbol);
5290       /* _gp_disp is a special case, used from s_cpload.
5291          __gnu_local_gp is used if mips_no_shared.  */
5292       gas_assert (mips_pic == NO_PIC
5293               || (! HAVE_NEWABI
5294                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
5295               || (! mips_in_shared
5296                   && strcmp (S_GET_NAME (ep->X_add_symbol),
5297                              "__gnu_local_gp") == 0));
5298     }
5299
5300   macro_build (ep, "lui", LUI_FMT, regnum, BFD_RELOC_HI16_S);
5301 }
5302
5303 /* Generate a sequence of instructions to do a load or store from a constant
5304    offset off of a base register (breg) into/from a target register (treg),
5305    using AT if necessary.  */
5306 static void
5307 macro_build_ldst_constoffset (expressionS *ep, const char *op,
5308                               int treg, int breg, int dbl)
5309 {
5310   gas_assert (ep->X_op == O_constant);
5311
5312   /* Sign-extending 32-bit constants makes their handling easier.  */
5313   if (!dbl)
5314     normalize_constant_expr (ep);
5315
5316   /* Right now, this routine can only handle signed 32-bit constants.  */
5317   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
5318     as_warn (_("operand overflow"));
5319
5320   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
5321     {
5322       /* Signed 16-bit offset will fit in the op.  Easy!  */
5323       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
5324     }
5325   else
5326     {
5327       /* 32-bit offset, need multiple instructions and AT, like:
5328            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
5329            addu     $tempreg,$tempreg,$breg
5330            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
5331          to handle the complete offset.  */
5332       macro_build_lui (ep, AT);
5333       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
5334       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
5335
5336       if (!mips_opts.at)
5337         as_bad (_("Macro used $at after \".set noat\""));
5338     }
5339 }
5340
5341 /*                      set_at()
5342  * Generates code to set the $at register to true (one)
5343  * if reg is less than the immediate expression.
5344  */
5345 static void
5346 set_at (int reg, int unsignedp)
5347 {
5348   if (imm_expr.X_op == O_constant
5349       && imm_expr.X_add_number >= -0x8000
5350       && imm_expr.X_add_number < 0x8000)
5351     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
5352                  AT, reg, BFD_RELOC_LO16);
5353   else
5354     {
5355       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5356       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
5357     }
5358 }
5359
5360 /* Warn if an expression is not a constant.  */
5361
5362 static void
5363 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
5364 {
5365   if (ex->X_op == O_big)
5366     as_bad (_("unsupported large constant"));
5367   else if (ex->X_op != O_constant)
5368     as_bad (_("Instruction %s requires absolute expression"),
5369             ip->insn_mo->name);
5370
5371   if (HAVE_32BIT_GPRS)
5372     normalize_constant_expr (ex);
5373 }
5374
5375 /* Count the leading zeroes by performing a binary chop. This is a
5376    bulky bit of source, but performance is a LOT better for the
5377    majority of values than a simple loop to count the bits:
5378        for (lcnt = 0; (lcnt < 32); lcnt++)
5379          if ((v) & (1 << (31 - lcnt)))
5380            break;
5381   However it is not code size friendly, and the gain will drop a bit
5382   on certain cached systems.
5383 */
5384 #define COUNT_TOP_ZEROES(v)             \
5385   (((v) & ~0xffff) == 0                 \
5386    ? ((v) & ~0xff) == 0                 \
5387      ? ((v) & ~0xf) == 0                \
5388        ? ((v) & ~0x3) == 0              \
5389          ? ((v) & ~0x1) == 0            \
5390            ? !(v)                       \
5391              ? 32                       \
5392              : 31                       \
5393            : 30                         \
5394          : ((v) & ~0x7) == 0            \
5395            ? 29                         \
5396            : 28                         \
5397        : ((v) & ~0x3f) == 0             \
5398          ? ((v) & ~0x1f) == 0           \
5399            ? 27                         \
5400            : 26                         \
5401          : ((v) & ~0x7f) == 0           \
5402            ? 25                         \
5403            : 24                         \
5404      : ((v) & ~0xfff) == 0              \
5405        ? ((v) & ~0x3ff) == 0            \
5406          ? ((v) & ~0x1ff) == 0          \
5407            ? 23                         \
5408            : 22                         \
5409          : ((v) & ~0x7ff) == 0          \
5410            ? 21                         \
5411            : 20                         \
5412        : ((v) & ~0x3fff) == 0           \
5413          ? ((v) & ~0x1fff) == 0         \
5414            ? 19                         \
5415            : 18                         \
5416          : ((v) & ~0x7fff) == 0         \
5417            ? 17                         \
5418            : 16                         \
5419    : ((v) & ~0xffffff) == 0             \
5420      ? ((v) & ~0xfffff) == 0            \
5421        ? ((v) & ~0x3ffff) == 0          \
5422          ? ((v) & ~0x1ffff) == 0        \
5423            ? 15                         \
5424            : 14                         \
5425          : ((v) & ~0x7ffff) == 0        \
5426            ? 13                         \
5427            : 12                         \
5428        : ((v) & ~0x3fffff) == 0         \
5429          ? ((v) & ~0x1fffff) == 0       \
5430            ? 11                         \
5431            : 10                         \
5432          : ((v) & ~0x7fffff) == 0       \
5433            ? 9                          \
5434            : 8                          \
5435      : ((v) & ~0xfffffff) == 0          \
5436        ? ((v) & ~0x3ffffff) == 0        \
5437          ? ((v) & ~0x1ffffff) == 0      \
5438            ? 7                          \
5439            : 6                          \
5440          : ((v) & ~0x7ffffff) == 0      \
5441            ? 5                          \
5442            : 4                          \
5443        : ((v) & ~0x3fffffff) == 0       \
5444          ? ((v) & ~0x1fffffff) == 0     \
5445            ? 3                          \
5446            : 2                          \
5447          : ((v) & ~0x7fffffff) == 0     \
5448            ? 1                          \
5449            : 0)
5450
5451 /*                      load_register()
5452  *  This routine generates the least number of instructions necessary to load
5453  *  an absolute expression value into a register.
5454  */
5455 static void
5456 load_register (int reg, expressionS *ep, int dbl)
5457 {
5458   int freg;
5459   expressionS hi32, lo32;
5460
5461   if (ep->X_op != O_big)
5462     {
5463       gas_assert (ep->X_op == O_constant);
5464
5465       /* Sign-extending 32-bit constants makes their handling easier.  */
5466       if (!dbl)
5467         normalize_constant_expr (ep);
5468
5469       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
5470         {
5471           /* We can handle 16 bit signed values with an addiu to
5472              $zero.  No need to ever use daddiu here, since $zero and
5473              the result are always correct in 32 bit mode.  */
5474           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5475           return;
5476         }
5477       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
5478         {
5479           /* We can handle 16 bit unsigned values with an ori to
5480              $zero.  */
5481           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
5482           return;
5483         }
5484       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
5485         {
5486           /* 32 bit values require an lui.  */
5487           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5488           if ((ep->X_add_number & 0xffff) != 0)
5489             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
5490           return;
5491         }
5492     }
5493
5494   /* The value is larger than 32 bits.  */
5495
5496   if (!dbl || HAVE_32BIT_GPRS)
5497     {
5498       char value[32];
5499
5500       sprintf_vma (value, ep->X_add_number);
5501       as_bad (_("Number (0x%s) larger than 32 bits"), value);
5502       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5503       return;
5504     }
5505
5506   if (ep->X_op != O_big)
5507     {
5508       hi32 = *ep;
5509       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
5510       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
5511       hi32.X_add_number &= 0xffffffff;
5512       lo32 = *ep;
5513       lo32.X_add_number &= 0xffffffff;
5514     }
5515   else
5516     {
5517       gas_assert (ep->X_add_number > 2);
5518       if (ep->X_add_number == 3)
5519         generic_bignum[3] = 0;
5520       else if (ep->X_add_number > 4)
5521         as_bad (_("Number larger than 64 bits"));
5522       lo32.X_op = O_constant;
5523       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
5524       hi32.X_op = O_constant;
5525       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
5526     }
5527
5528   if (hi32.X_add_number == 0)
5529     freg = 0;
5530   else
5531     {
5532       int shift, bit;
5533       unsigned long hi, lo;
5534
5535       if (hi32.X_add_number == (offsetT) 0xffffffff)
5536         {
5537           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
5538             {
5539               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5540               return;
5541             }
5542           if (lo32.X_add_number & 0x80000000)
5543             {
5544               macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5545               if (lo32.X_add_number & 0xffff)
5546                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
5547               return;
5548             }
5549         }
5550
5551       /* Check for 16bit shifted constant.  We know that hi32 is
5552          non-zero, so start the mask on the first bit of the hi32
5553          value.  */
5554       shift = 17;
5555       do
5556         {
5557           unsigned long himask, lomask;
5558
5559           if (shift < 32)
5560             {
5561               himask = 0xffff >> (32 - shift);
5562               lomask = (0xffff << shift) & 0xffffffff;
5563             }
5564           else
5565             {
5566               himask = 0xffff << (shift - 32);
5567               lomask = 0;
5568             }
5569           if ((hi32.X_add_number & ~(offsetT) himask) == 0
5570               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
5571             {
5572               expressionS tmp;
5573
5574               tmp.X_op = O_constant;
5575               if (shift < 32)
5576                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
5577                                     | (lo32.X_add_number >> shift));
5578               else
5579                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
5580               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
5581               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", SHFT_FMT,
5582                            reg, reg, (shift >= 32) ? shift - 32 : shift);
5583               return;
5584             }
5585           ++shift;
5586         }
5587       while (shift <= (64 - 16));
5588
5589       /* Find the bit number of the lowest one bit, and store the
5590          shifted value in hi/lo.  */
5591       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
5592       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
5593       if (lo != 0)
5594         {
5595           bit = 0;
5596           while ((lo & 1) == 0)
5597             {
5598               lo >>= 1;
5599               ++bit;
5600             }
5601           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
5602           hi >>= bit;
5603         }
5604       else
5605         {
5606           bit = 32;
5607           while ((hi & 1) == 0)
5608             {
5609               hi >>= 1;
5610               ++bit;
5611             }
5612           lo = hi;
5613           hi = 0;
5614         }
5615
5616       /* Optimize if the shifted value is a (power of 2) - 1.  */
5617       if ((hi == 0 && ((lo + 1) & lo) == 0)
5618           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
5619         {
5620           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
5621           if (shift != 0)
5622             {
5623               expressionS tmp;
5624
5625               /* This instruction will set the register to be all
5626                  ones.  */
5627               tmp.X_op = O_constant;
5628               tmp.X_add_number = (offsetT) -1;
5629               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5630               if (bit != 0)
5631                 {
5632                   bit += shift;
5633                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", SHFT_FMT,
5634                                reg, reg, (bit >= 32) ? bit - 32 : bit);
5635                 }
5636               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", SHFT_FMT,
5637                            reg, reg, (shift >= 32) ? shift - 32 : shift);
5638               return;
5639             }
5640         }
5641
5642       /* Sign extend hi32 before calling load_register, because we can
5643          generally get better code when we load a sign extended value.  */
5644       if ((hi32.X_add_number & 0x80000000) != 0)
5645         hi32.X_add_number |= ~(offsetT) 0xffffffff;
5646       load_register (reg, &hi32, 0);
5647       freg = reg;
5648     }
5649   if ((lo32.X_add_number & 0xffff0000) == 0)
5650     {
5651       if (freg != 0)
5652         {
5653           macro_build (NULL, "dsll32", SHFT_FMT, reg, freg, 0);
5654           freg = reg;
5655         }
5656     }
5657   else
5658     {
5659       expressionS mid16;
5660
5661       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
5662         {
5663           macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5664           macro_build (NULL, "dsrl32", SHFT_FMT, reg, reg, 0);
5665           return;
5666         }
5667
5668       if (freg != 0)
5669         {
5670           macro_build (NULL, "dsll", SHFT_FMT, reg, freg, 16);
5671           freg = reg;
5672         }
5673       mid16 = lo32;
5674       mid16.X_add_number >>= 16;
5675       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
5676       macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5677       freg = reg;
5678     }
5679   if ((lo32.X_add_number & 0xffff) != 0)
5680     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
5681 }
5682
5683 static inline void
5684 load_delay_nop (void)
5685 {
5686   if (!gpr_interlocks)
5687     macro_build (NULL, "nop", "");
5688 }
5689
5690 /* Load an address into a register.  */
5691
5692 static void
5693 load_address (int reg, expressionS *ep, int *used_at)
5694 {
5695   if (ep->X_op != O_constant
5696       && ep->X_op != O_symbol)
5697     {
5698       as_bad (_("expression too complex"));
5699       ep->X_op = O_constant;
5700     }
5701
5702   if (ep->X_op == O_constant)
5703     {
5704       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
5705       return;
5706     }
5707
5708   if (mips_pic == NO_PIC)
5709     {
5710       /* If this is a reference to a GP relative symbol, we want
5711            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
5712          Otherwise we want
5713            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
5714            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
5715          If we have an addend, we always use the latter form.
5716
5717          With 64bit address space and a usable $at we want
5718            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
5719            lui          $at,<sym>               (BFD_RELOC_HI16_S)
5720            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
5721            daddiu       $at,<sym>               (BFD_RELOC_LO16)
5722            dsll32       $reg,0
5723            daddu        $reg,$reg,$at
5724
5725          If $at is already in use, we use a path which is suboptimal
5726          on superscalar processors.
5727            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
5728            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
5729            dsll         $reg,16
5730            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
5731            dsll         $reg,16
5732            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
5733
5734          For GP relative symbols in 64bit address space we can use
5735          the same sequence as in 32bit address space.  */
5736       if (HAVE_64BIT_SYMBOLS)
5737         {
5738           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
5739               && !nopic_need_relax (ep->X_add_symbol, 1))
5740             {
5741               relax_start (ep->X_add_symbol);
5742               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
5743                            mips_gp_register, BFD_RELOC_GPREL16);
5744               relax_switch ();
5745             }
5746
5747           if (*used_at == 0 && mips_opts.at)
5748             {
5749               macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
5750               macro_build (ep, "lui", LUI_FMT, AT, BFD_RELOC_HI16_S);
5751               macro_build (ep, "daddiu", "t,r,j", reg, reg,
5752                            BFD_RELOC_MIPS_HIGHER);
5753               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
5754               macro_build (NULL, "dsll32", SHFT_FMT, reg, reg, 0);
5755               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
5756               *used_at = 1;
5757             }
5758           else
5759             {
5760               macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
5761               macro_build (ep, "daddiu", "t,r,j", reg, reg,
5762                            BFD_RELOC_MIPS_HIGHER);
5763               macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5764               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
5765               macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5766               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
5767             }
5768
5769           if (mips_relax.sequence)
5770             relax_end ();
5771         }
5772       else
5773         {
5774           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
5775               && !nopic_need_relax (ep->X_add_symbol, 1))
5776             {
5777               relax_start (ep->X_add_symbol);
5778               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
5779                            mips_gp_register, BFD_RELOC_GPREL16);
5780               relax_switch ();
5781             }
5782           macro_build_lui (ep, reg);
5783           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
5784                        reg, reg, BFD_RELOC_LO16);
5785           if (mips_relax.sequence)
5786             relax_end ();
5787         }
5788     }
5789   else if (!mips_big_got)
5790     {
5791       expressionS ex;
5792
5793       /* If this is a reference to an external symbol, we want
5794            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
5795          Otherwise we want
5796            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
5797            nop
5798            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
5799          If there is a constant, it must be added in after.
5800
5801          If we have NewABI, we want
5802            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5803          unless we're referencing a global symbol with a non-zero
5804          offset, in which case cst must be added separately.  */
5805       if (HAVE_NEWABI)
5806         {
5807           if (ep->X_add_number)
5808             {
5809               ex.X_add_number = ep->X_add_number;
5810               ep->X_add_number = 0;
5811               relax_start (ep->X_add_symbol);
5812               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5813                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5814               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
5815                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5816               ex.X_op = O_constant;
5817               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
5818                            reg, reg, BFD_RELOC_LO16);
5819               ep->X_add_number = ex.X_add_number;
5820               relax_switch ();
5821             }
5822           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5823                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5824           if (mips_relax.sequence)
5825             relax_end ();
5826         }
5827       else
5828         {
5829           ex.X_add_number = ep->X_add_number;
5830           ep->X_add_number = 0;
5831           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5832                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
5833           load_delay_nop ();
5834           relax_start (ep->X_add_symbol);
5835           relax_switch ();
5836           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5837                        BFD_RELOC_LO16);
5838           relax_end ();
5839
5840           if (ex.X_add_number != 0)
5841             {
5842               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
5843                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5844               ex.X_op = O_constant;
5845               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
5846                            reg, reg, BFD_RELOC_LO16);
5847             }
5848         }
5849     }
5850   else if (mips_big_got)
5851     {
5852       expressionS ex;
5853
5854       /* This is the large GOT case.  If this is a reference to an
5855          external symbol, we want
5856            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
5857            addu         $reg,$reg,$gp
5858            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
5859
5860          Otherwise, for a reference to a local symbol in old ABI, we want
5861            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
5862            nop
5863            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
5864          If there is a constant, it must be added in after.
5865
5866          In the NewABI, for local symbols, with or without offsets, we want:
5867            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
5868            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
5869       */
5870       if (HAVE_NEWABI)
5871         {
5872           ex.X_add_number = ep->X_add_number;
5873           ep->X_add_number = 0;
5874           relax_start (ep->X_add_symbol);
5875           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
5876           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5877                        reg, reg, mips_gp_register);
5878           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
5879                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
5880           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
5881             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5882           else if (ex.X_add_number)
5883             {
5884               ex.X_op = O_constant;
5885               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5886                            BFD_RELOC_LO16);
5887             }
5888
5889           ep->X_add_number = ex.X_add_number;
5890           relax_switch ();
5891           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5892                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5893           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5894                        BFD_RELOC_MIPS_GOT_OFST);
5895           relax_end ();
5896         }
5897       else
5898         {
5899           ex.X_add_number = ep->X_add_number;
5900           ep->X_add_number = 0;
5901           relax_start (ep->X_add_symbol);
5902           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
5903           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5904                        reg, reg, mips_gp_register);
5905           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
5906                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
5907           relax_switch ();
5908           if (reg_needs_delay (mips_gp_register))
5909             {
5910               /* We need a nop before loading from $gp.  This special
5911                  check is required because the lui which starts the main
5912                  instruction stream does not refer to $gp, and so will not
5913                  insert the nop which may be required.  */
5914               macro_build (NULL, "nop", "");
5915             }
5916           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5917                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
5918           load_delay_nop ();
5919           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5920                        BFD_RELOC_LO16);
5921           relax_end ();
5922
5923           if (ex.X_add_number != 0)
5924             {
5925               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
5926                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5927               ex.X_op = O_constant;
5928               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5929                            BFD_RELOC_LO16);
5930             }
5931         }
5932     }
5933   else
5934     abort ();
5935
5936   if (!mips_opts.at && *used_at == 1)
5937     as_bad (_("Macro used $at after \".set noat\""));
5938 }
5939
5940 /* Move the contents of register SOURCE into register DEST.  */
5941
5942 static void
5943 move_register (int dest, int source)
5944 {
5945   /* Prefer to use a 16-bit microMIPS instruction unless the previous
5946      instruction specifically requires a 32-bit one.  */
5947   if (mips_opts.micromips
5948       && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
5949     macro_build (NULL, "move", "mp,mj", dest, source );
5950   else
5951     macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
5952                  dest, source, 0);
5953 }
5954
5955 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
5956    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
5957    The two alternatives are:
5958
5959    Global symbol                Local sybmol
5960    -------------                ------------
5961    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
5962    ...                          ...
5963    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
5964
5965    load_got_offset emits the first instruction and add_got_offset
5966    emits the second for a 16-bit offset or add_got_offset_hilo emits
5967    a sequence to add a 32-bit offset using a scratch register.  */
5968
5969 static void
5970 load_got_offset (int dest, expressionS *local)
5971 {
5972   expressionS global;
5973
5974   global = *local;
5975   global.X_add_number = 0;
5976
5977   relax_start (local->X_add_symbol);
5978   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
5979                BFD_RELOC_MIPS_GOT16, mips_gp_register);
5980   relax_switch ();
5981   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
5982                BFD_RELOC_MIPS_GOT16, mips_gp_register);
5983   relax_end ();
5984 }
5985
5986 static void
5987 add_got_offset (int dest, expressionS *local)
5988 {
5989   expressionS global;
5990
5991   global.X_op = O_constant;
5992   global.X_op_symbol = NULL;
5993   global.X_add_symbol = NULL;
5994   global.X_add_number = local->X_add_number;
5995
5996   relax_start (local->X_add_symbol);
5997   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
5998                dest, dest, BFD_RELOC_LO16);
5999   relax_switch ();
6000   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
6001   relax_end ();
6002 }
6003
6004 static void
6005 add_got_offset_hilo (int dest, expressionS *local, int tmp)
6006 {
6007   expressionS global;
6008   int hold_mips_optimize;
6009
6010   global.X_op = O_constant;
6011   global.X_op_symbol = NULL;
6012   global.X_add_symbol = NULL;
6013   global.X_add_number = local->X_add_number;
6014
6015   relax_start (local->X_add_symbol);
6016   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
6017   relax_switch ();
6018   /* Set mips_optimize around the lui instruction to avoid
6019      inserting an unnecessary nop after the lw.  */
6020   hold_mips_optimize = mips_optimize;
6021   mips_optimize = 2;
6022   macro_build_lui (&global, tmp);
6023   mips_optimize = hold_mips_optimize;
6024   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
6025   relax_end ();
6026
6027   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
6028 }
6029
6030 /* Emit a sequence of instructions to emulate a branch likely operation.
6031    BR is an ordinary branch corresponding to one to be emulated.  BRNEG
6032    is its complementing branch with the original condition negated.
6033    CALL is set if the original branch specified the link operation.
6034    EP, FMT, SREG and TREG specify the usual macro_build() parameters.
6035
6036    Code like this is produced in the noreorder mode:
6037
6038         BRNEG   <args>, 1f
6039          nop
6040         b       <sym>
6041          delay slot (executed only if branch taken)
6042     1:
6043
6044    or, if CALL is set:
6045
6046         BRNEG   <args>, 1f
6047          nop
6048         bal     <sym>
6049          delay slot (executed only if branch taken)
6050     1:
6051
6052    In the reorder mode the delay slot would be filled with a nop anyway,
6053    so code produced is simply:
6054
6055         BR      <args>, <sym>
6056          nop
6057
6058    This function is used when producing code for the microMIPS ASE that
6059    does not implement branch likely instructions in hardware.  */
6060
6061 static void
6062 macro_build_branch_likely (const char *br, const char *brneg,
6063                            int call, expressionS *ep, const char *fmt,
6064                            unsigned int sreg, unsigned int treg)
6065 {
6066   int noreorder = mips_opts.noreorder;
6067   expressionS expr1;
6068
6069   gas_assert (mips_opts.micromips);
6070   start_noreorder ();
6071   if (noreorder)
6072     {
6073       micromips_label_expr (&expr1);
6074       macro_build (&expr1, brneg, fmt, sreg, treg);
6075       macro_build (NULL, "nop", "");
6076       macro_build (ep, call ? "bal" : "b", "p");
6077
6078       /* Set to true so that append_insn adds a label.  */
6079       emit_branch_likely_macro = TRUE;
6080     }
6081   else
6082     {
6083       macro_build (ep, br, fmt, sreg, treg);
6084       macro_build (NULL, "nop", "");
6085     }
6086   end_noreorder ();
6087 }
6088
6089 /* Emit a coprocessor branch-likely macro specified by TYPE, using CC as
6090    the condition code tested.  EP specifies the branch target.  */
6091
6092 static void
6093 macro_build_branch_ccl (int type, expressionS *ep, unsigned int cc)
6094 {
6095   const int call = 0;
6096   const char *brneg;
6097   const char *br;
6098
6099   switch (type)
6100     {
6101     case M_BC1FL:
6102       br = "bc1f";
6103       brneg = "bc1t";
6104       break;
6105     case M_BC1TL:
6106       br = "bc1t";
6107       brneg = "bc1f";
6108       break;
6109     case M_BC2FL:
6110       br = "bc2f";
6111       brneg = "bc2t";
6112       break;
6113     case M_BC2TL:
6114       br = "bc2t";
6115       brneg = "bc2f";
6116       break;
6117     default:
6118       abort ();
6119     }
6120   macro_build_branch_likely (br, brneg, call, ep, "N,p", cc, ZERO);
6121 }
6122
6123 /* Emit a two-argument branch macro specified by TYPE, using SREG as
6124    the register tested.  EP specifies the branch target.  */
6125
6126 static void
6127 macro_build_branch_rs (int type, expressionS *ep, unsigned int sreg)
6128 {
6129   const char *brneg = NULL;
6130   const char *br;
6131   int call = 0;
6132
6133   switch (type)
6134     {
6135     case M_BGEZ:
6136       br = "bgez";
6137       break;
6138     case M_BGEZL:
6139       br = mips_opts.micromips ? "bgez" : "bgezl";
6140       brneg = "bltz";
6141       break;
6142     case M_BGEZALL:
6143       gas_assert (mips_opts.micromips);
6144       br = "bgezals";
6145       brneg = "bltz";
6146       call = 1;
6147       break;
6148     case M_BGTZ:
6149       br = "bgtz";
6150       break;
6151     case M_BGTZL:
6152       br = mips_opts.micromips ? "bgtz" : "bgtzl";
6153       brneg = "blez";
6154       break;
6155     case M_BLEZ:
6156       br = "blez";
6157       break;
6158     case M_BLEZL:
6159       br = mips_opts.micromips ? "blez" : "blezl";
6160       brneg = "bgtz";
6161       break;
6162     case M_BLTZ:
6163       br = "bltz";
6164       break;
6165     case M_BLTZL:
6166       br = mips_opts.micromips ? "bltz" : "bltzl";
6167       brneg = "bgez";
6168       break;
6169     case M_BLTZALL:
6170       gas_assert (mips_opts.micromips);
6171       br = "bltzals";
6172       brneg = "bgez";
6173       call = 1;
6174       break;
6175     default:
6176       abort ();
6177     }
6178   if (mips_opts.micromips && brneg)
6179     macro_build_branch_likely (br, brneg, call, ep, "s,p", sreg, ZERO);
6180   else
6181     macro_build (ep, br, "s,p", sreg);
6182 }
6183
6184 /* Emit a three-argument branch macro specified by TYPE, using SREG and
6185    TREG as the registers tested.  EP specifies the branch target.  */
6186
6187 static void
6188 macro_build_branch_rsrt (int type, expressionS *ep,
6189                          unsigned int sreg, unsigned int treg)
6190 {
6191   const char *brneg = NULL;
6192   const int call = 0;
6193   const char *br;
6194
6195   switch (type)
6196     {
6197     case M_BEQ:
6198     case M_BEQ_I:
6199       br = "beq";
6200       break;
6201     case M_BEQL:
6202     case M_BEQL_I:
6203       br = mips_opts.micromips ? "beq" : "beql";
6204       brneg = "bne";
6205       break;
6206     case M_BNE:
6207     case M_BNE_I:
6208       br = "bne";
6209       break;
6210     case M_BNEL:
6211     case M_BNEL_I:
6212       br = mips_opts.micromips ? "bne" : "bnel";
6213       brneg = "beq";
6214       break;
6215     default:
6216       abort ();
6217     }
6218   if (mips_opts.micromips && brneg)
6219     macro_build_branch_likely (br, brneg, call, ep, "s,t,p", sreg, treg);
6220   else
6221     macro_build (ep, br, "s,t,p", sreg, treg);
6222 }
6223
6224 /*
6225  *                      Build macros
6226  *   This routine implements the seemingly endless macro or synthesized
6227  * instructions and addressing modes in the mips assembly language. Many
6228  * of these macros are simple and are similar to each other. These could
6229  * probably be handled by some kind of table or grammar approach instead of
6230  * this verbose method. Others are not simple macros but are more like
6231  * optimizing code generation.
6232  *   One interesting optimization is when several store macros appear
6233  * consecutively that would load AT with the upper half of the same address.
6234  * The ensuing load upper instructions are ommited. This implies some kind
6235  * of global optimization. We currently only optimize within a single macro.
6236  *   For many of the load and store macros if the address is specified as a
6237  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
6238  * first load register 'at' with zero and use it as the base register. The
6239  * mips assembler simply uses register $zero. Just one tiny optimization
6240  * we're missing.
6241  */
6242 static void
6243 macro (struct mips_cl_insn *ip)
6244 {
6245   unsigned int treg, sreg, dreg, breg;
6246   unsigned int tempreg;
6247   int mask;
6248   int used_at = 0;
6249   expressionS label_expr;
6250   expressionS expr1;
6251   expressionS *ep;
6252   const char *s;
6253   const char *s2;
6254   const char *fmt;
6255   int likely = 0;
6256   int coproc = 0;
6257   int off12 = 0;
6258   int call = 0;
6259   int jals = 0;
6260   int dbl = 0;
6261   int imm = 0;
6262   int ust = 0;
6263   int lp = 0;
6264   int ab = 0;
6265   int off;
6266   offsetT maxnum;
6267   bfd_reloc_code_real_type r;
6268   int hold_mips_optimize;
6269
6270   gas_assert (! mips_opts.mips16);
6271
6272   treg = EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
6273   dreg = EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
6274   sreg = breg = EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
6275   mask = ip->insn_mo->mask;
6276
6277   label_expr.X_op = O_constant;
6278   label_expr.X_op_symbol = NULL;
6279   label_expr.X_add_symbol = NULL;
6280   label_expr.X_add_number = 0;
6281
6282   expr1.X_op = O_constant;
6283   expr1.X_op_symbol = NULL;
6284   expr1.X_add_symbol = NULL;
6285   expr1.X_add_number = 1;
6286
6287   switch (mask)
6288     {
6289     case M_DABS:
6290       dbl = 1;
6291     case M_ABS:
6292       /*    bgez    $a0,1f
6293             move    v0,$a0
6294             sub     v0,$zero,$a0
6295          1:
6296        */
6297
6298       start_noreorder ();
6299
6300       if (mips_opts.micromips)
6301         micromips_label_expr (&label_expr);
6302       else
6303         label_expr.X_add_number = 8;
6304       macro_build (&label_expr, "bgez", "s,p", sreg);
6305       if (dreg == sreg)
6306         macro_build (NULL, "nop", "");
6307       else
6308         move_register (dreg, sreg);
6309       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
6310       if (mips_opts.micromips)
6311         micromips_add_label ();
6312
6313       end_noreorder ();
6314       break;
6315
6316     case M_ADD_I:
6317       s = "addi";
6318       s2 = "add";
6319       goto do_addi;
6320     case M_ADDU_I:
6321       s = "addiu";
6322       s2 = "addu";
6323       goto do_addi;
6324     case M_DADD_I:
6325       dbl = 1;
6326       s = "daddi";
6327       s2 = "dadd";
6328       if (!mips_opts.micromips)
6329         goto do_addi;
6330       if (imm_expr.X_op == O_constant
6331           && imm_expr.X_add_number >= -0x200
6332           && imm_expr.X_add_number < 0x200)
6333         {
6334           macro_build (NULL, s, "t,r,.", treg, sreg, imm_expr.X_add_number);
6335           break;
6336         }
6337       goto do_addi_i;
6338     case M_DADDU_I:
6339       dbl = 1;
6340       s = "daddiu";
6341       s2 = "daddu";
6342     do_addi:
6343       if (imm_expr.X_op == O_constant
6344           && imm_expr.X_add_number >= -0x8000
6345           && imm_expr.X_add_number < 0x8000)
6346         {
6347           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
6348           break;
6349         }
6350     do_addi_i:
6351       used_at = 1;
6352       load_register (AT, &imm_expr, dbl);
6353       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6354       break;
6355
6356     case M_AND_I:
6357       s = "andi";
6358       s2 = "and";
6359       goto do_bit;
6360     case M_OR_I:
6361       s = "ori";
6362       s2 = "or";
6363       goto do_bit;
6364     case M_NOR_I:
6365       s = "";
6366       s2 = "nor";
6367       goto do_bit;
6368     case M_XOR_I:
6369       s = "xori";
6370       s2 = "xor";
6371     do_bit:
6372       if (imm_expr.X_op == O_constant
6373           && imm_expr.X_add_number >= 0
6374           && imm_expr.X_add_number < 0x10000)
6375         {
6376           if (mask != M_NOR_I)
6377             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
6378           else
6379             {
6380               macro_build (&imm_expr, "ori", "t,r,i",
6381                            treg, sreg, BFD_RELOC_LO16);
6382               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
6383             }
6384           break;
6385         }
6386
6387       used_at = 1;
6388       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
6389       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6390       break;
6391
6392     case M_BALIGN:
6393       switch (imm_expr.X_add_number)
6394         {
6395         case 0:
6396           macro_build (NULL, "nop", "");
6397           break;
6398         case 2:
6399           macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
6400           break;
6401         default:
6402           macro_build (NULL, "balign", "t,s,2", treg, sreg,
6403                        (int) imm_expr.X_add_number);
6404           break;
6405         }
6406       break;
6407
6408     case M_BC1FL:
6409     case M_BC1TL:
6410     case M_BC2FL:
6411     case M_BC2TL:
6412       gas_assert (mips_opts.micromips);
6413       macro_build_branch_ccl (mask, &offset_expr,
6414                               EXTRACT_OPERAND (1, BCC, *ip));
6415       break;
6416
6417     case M_BEQ_I:
6418     case M_BEQL_I:
6419     case M_BNE_I:
6420     case M_BNEL_I:
6421       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6422         treg = 0;
6423       else
6424         {
6425           treg = AT;
6426           used_at = 1;
6427           load_register (treg, &imm_expr, HAVE_64BIT_GPRS);
6428         }
6429       /* Fall through.  */
6430     case M_BEQL:
6431     case M_BNEL:
6432       macro_build_branch_rsrt (mask, &offset_expr, sreg, treg);
6433       break;
6434
6435     case M_BGEL:
6436       likely = 1;
6437     case M_BGE:
6438       if (treg == 0)
6439         macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, sreg);
6440       else if (sreg == 0)
6441         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, treg);
6442       else
6443         {
6444           used_at = 1;
6445           macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
6446           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6447                                    &offset_expr, AT, ZERO);
6448         }
6449       break;
6450
6451     case M_BGEZL:
6452     case M_BGEZALL:
6453     case M_BGTZL:
6454     case M_BLEZL:
6455     case M_BLTZL:
6456     case M_BLTZALL:
6457       macro_build_branch_rs (mask, &offset_expr, sreg);
6458       break;
6459
6460     case M_BGTL_I:
6461       likely = 1;
6462     case M_BGT_I:
6463       /* Check for > max integer.  */
6464       maxnum = 0x7fffffff;
6465       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6466         {
6467           maxnum <<= 16;
6468           maxnum |= 0xffff;
6469           maxnum <<= 16;
6470           maxnum |= 0xffff;
6471         }
6472       if (imm_expr.X_op == O_constant
6473           && imm_expr.X_add_number >= maxnum
6474           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6475         {
6476         do_false:
6477           /* Result is always false.  */
6478           if (! likely)
6479             macro_build (NULL, "nop", "");
6480           else
6481             macro_build_branch_rsrt (M_BNEL, &offset_expr, ZERO, ZERO);
6482           break;
6483         }
6484       if (imm_expr.X_op != O_constant)
6485         as_bad (_("Unsupported large constant"));
6486       ++imm_expr.X_add_number;
6487       /* FALLTHROUGH */
6488     case M_BGE_I:
6489     case M_BGEL_I:
6490       if (mask == M_BGEL_I)
6491         likely = 1;
6492       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6493         {
6494           macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ,
6495                                  &offset_expr, sreg);
6496           break;
6497         }
6498       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6499         {
6500           macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ,
6501                                  &offset_expr, sreg);
6502           break;
6503         }
6504       maxnum = 0x7fffffff;
6505       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6506         {
6507           maxnum <<= 16;
6508           maxnum |= 0xffff;
6509           maxnum <<= 16;
6510           maxnum |= 0xffff;
6511         }
6512       maxnum = - maxnum - 1;
6513       if (imm_expr.X_op == O_constant
6514           && imm_expr.X_add_number <= maxnum
6515           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6516         {
6517         do_true:
6518           /* result is always true */
6519           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
6520           macro_build (&offset_expr, "b", "p");
6521           break;
6522         }
6523       used_at = 1;
6524       set_at (sreg, 0);
6525       macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6526                                &offset_expr, AT, ZERO);
6527       break;
6528
6529     case M_BGEUL:
6530       likely = 1;
6531     case M_BGEU:
6532       if (treg == 0)
6533         goto do_true;
6534       else if (sreg == 0)
6535         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6536                                  &offset_expr, ZERO, treg);
6537       else
6538         {
6539           used_at = 1;
6540           macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
6541           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6542                                    &offset_expr, AT, ZERO);
6543         }
6544       break;
6545
6546     case M_BGTUL_I:
6547       likely = 1;
6548     case M_BGTU_I:
6549       if (sreg == 0
6550           || (HAVE_32BIT_GPRS
6551               && imm_expr.X_op == O_constant
6552               && imm_expr.X_add_number == -1))
6553         goto do_false;
6554       if (imm_expr.X_op != O_constant)
6555         as_bad (_("Unsupported large constant"));
6556       ++imm_expr.X_add_number;
6557       /* FALLTHROUGH */
6558     case M_BGEU_I:
6559     case M_BGEUL_I:
6560       if (mask == M_BGEUL_I)
6561         likely = 1;
6562       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6563         goto do_true;
6564       else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6565         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6566                                  &offset_expr, sreg, ZERO);
6567       else
6568         {
6569           used_at = 1;
6570           set_at (sreg, 1);
6571           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6572                                    &offset_expr, AT, ZERO);
6573         }
6574       break;
6575
6576     case M_BGTL:
6577       likely = 1;
6578     case M_BGT:
6579       if (treg == 0)
6580         macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, sreg);
6581       else if (sreg == 0)
6582         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, treg);
6583       else
6584         {
6585           used_at = 1;
6586           macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
6587           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6588                                    &offset_expr, AT, ZERO);
6589         }
6590       break;
6591
6592     case M_BGTUL:
6593       likely = 1;
6594     case M_BGTU:
6595       if (treg == 0)
6596         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6597                                  &offset_expr, sreg, ZERO);
6598       else if (sreg == 0)
6599         goto do_false;
6600       else
6601         {
6602           used_at = 1;
6603           macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
6604           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6605                                    &offset_expr, AT, ZERO);
6606         }
6607       break;
6608
6609     case M_BLEL:
6610       likely = 1;
6611     case M_BLE:
6612       if (treg == 0)
6613         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
6614       else if (sreg == 0)
6615         macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, treg);
6616       else
6617         {
6618           used_at = 1;
6619           macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
6620           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6621                                    &offset_expr, AT, ZERO);
6622         }
6623       break;
6624
6625     case M_BLEL_I:
6626       likely = 1;
6627     case M_BLE_I:
6628       maxnum = 0x7fffffff;
6629       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6630         {
6631           maxnum <<= 16;
6632           maxnum |= 0xffff;
6633           maxnum <<= 16;
6634           maxnum |= 0xffff;
6635         }
6636       if (imm_expr.X_op == O_constant
6637           && imm_expr.X_add_number >= maxnum
6638           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6639         goto do_true;
6640       if (imm_expr.X_op != O_constant)
6641         as_bad (_("Unsupported large constant"));
6642       ++imm_expr.X_add_number;
6643       /* FALLTHROUGH */
6644     case M_BLT_I:
6645     case M_BLTL_I:
6646       if (mask == M_BLTL_I)
6647         likely = 1;
6648       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6649         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
6650       else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6651         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
6652       else
6653         {
6654           used_at = 1;
6655           set_at (sreg, 0);
6656           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6657                                    &offset_expr, AT, ZERO);
6658         }
6659       break;
6660
6661     case M_BLEUL:
6662       likely = 1;
6663     case M_BLEU:
6664       if (treg == 0)
6665         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6666                                  &offset_expr, sreg, ZERO);
6667       else if (sreg == 0)
6668         goto do_true;
6669       else
6670         {
6671           used_at = 1;
6672           macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
6673           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6674                                    &offset_expr, AT, ZERO);
6675         }
6676       break;
6677
6678     case M_BLEUL_I:
6679       likely = 1;
6680     case M_BLEU_I:
6681       if (sreg == 0
6682           || (HAVE_32BIT_GPRS
6683               && imm_expr.X_op == O_constant
6684               && imm_expr.X_add_number == -1))
6685         goto do_true;
6686       if (imm_expr.X_op != O_constant)
6687         as_bad (_("Unsupported large constant"));
6688       ++imm_expr.X_add_number;
6689       /* FALLTHROUGH */
6690     case M_BLTU_I:
6691     case M_BLTUL_I:
6692       if (mask == M_BLTUL_I)
6693         likely = 1;
6694       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6695         goto do_false;
6696       else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6697         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6698                                  &offset_expr, sreg, ZERO);
6699       else
6700         {
6701           used_at = 1;
6702           set_at (sreg, 1);
6703           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6704                                    &offset_expr, AT, ZERO);
6705         }
6706       break;
6707
6708     case M_BLTL:
6709       likely = 1;
6710     case M_BLT:
6711       if (treg == 0)
6712         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
6713       else if (sreg == 0)
6714         macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, treg);
6715       else
6716         {
6717           used_at = 1;
6718           macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
6719           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6720                                    &offset_expr, AT, ZERO);
6721         }
6722       break;
6723
6724     case M_BLTUL:
6725       likely = 1;
6726     case M_BLTU:
6727       if (treg == 0)
6728         goto do_false;
6729       else if (sreg == 0)
6730         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6731                                  &offset_expr, ZERO, treg);
6732       else
6733         {
6734           used_at = 1;
6735           macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
6736           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6737                                    &offset_expr, AT, ZERO);
6738         }
6739       break;
6740
6741     case M_DEXT:
6742       {
6743         /* Use unsigned arithmetic.  */
6744         addressT pos;
6745         addressT size;
6746
6747         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
6748           {
6749             as_bad (_("Unsupported large constant"));
6750             pos = size = 1;
6751           }
6752         else
6753           {
6754             pos = imm_expr.X_add_number;
6755             size = imm2_expr.X_add_number;
6756           }
6757
6758         if (pos > 63)
6759           {
6760             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
6761             pos = 1;
6762           }
6763         if (size == 0 || size > 64 || (pos + size - 1) > 63)
6764           {
6765             as_bad (_("Improper extract size (%lu, position %lu)"),
6766                     (unsigned long) size, (unsigned long) pos);
6767             size = 1;
6768           }
6769
6770         if (size <= 32 && pos < 32)
6771           {
6772             s = "dext";
6773             fmt = "t,r,+A,+C";
6774           }
6775         else if (size <= 32)
6776           {
6777             s = "dextu";
6778             fmt = "t,r,+E,+H";
6779           }
6780         else
6781           {
6782             s = "dextm";
6783             fmt = "t,r,+A,+G";
6784           }
6785         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
6786                      (int) (size - 1));
6787       }
6788       break;
6789
6790     case M_DINS:
6791       {
6792         /* Use unsigned arithmetic.  */
6793         addressT pos;
6794         addressT size;
6795
6796         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
6797           {
6798             as_bad (_("Unsupported large constant"));
6799             pos = size = 1;
6800           }
6801         else
6802           {
6803             pos = imm_expr.X_add_number;
6804             size = imm2_expr.X_add_number;
6805           }
6806
6807         if (pos > 63)
6808           {
6809             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
6810             pos = 1;
6811           }
6812         if (size == 0 || size > 64 || (pos + size - 1) > 63)
6813           {
6814             as_bad (_("Improper insert size (%lu, position %lu)"),
6815                     (unsigned long) size, (unsigned long) pos);
6816             size = 1;
6817           }
6818
6819         if (pos < 32 && (pos + size - 1) < 32)
6820           {
6821             s = "dins";
6822             fmt = "t,r,+A,+B";
6823           }
6824         else if (pos >= 32)
6825           {
6826             s = "dinsu";
6827             fmt = "t,r,+E,+F";
6828           }
6829         else
6830           {
6831             s = "dinsm";
6832             fmt = "t,r,+A,+F";
6833           }
6834         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
6835                      (int) (pos + size - 1));
6836       }
6837       break;
6838
6839     case M_DDIV_3:
6840       dbl = 1;
6841     case M_DIV_3:
6842       s = "mflo";
6843       goto do_div3;
6844     case M_DREM_3:
6845       dbl = 1;
6846     case M_REM_3:
6847       s = "mfhi";
6848     do_div3:
6849       if (treg == 0)
6850         {
6851           as_warn (_("Divide by zero."));
6852           if (mips_trap)
6853             macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
6854           else
6855             macro_build (NULL, "break", BRK_FMT, 7);
6856           break;
6857         }
6858
6859       start_noreorder ();
6860       if (mips_trap)
6861         {
6862           macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
6863           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
6864         }
6865       else
6866         {
6867           if (mips_opts.micromips)
6868             micromips_label_expr (&label_expr);
6869           else
6870             label_expr.X_add_number = 8;
6871           macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
6872           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
6873           macro_build (NULL, "break", BRK_FMT, 7);
6874           if (mips_opts.micromips)
6875             micromips_add_label ();
6876         }
6877       expr1.X_add_number = -1;
6878       used_at = 1;
6879       load_register (AT, &expr1, dbl);
6880       if (mips_opts.micromips)
6881         micromips_label_expr (&label_expr);
6882       else
6883         label_expr.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
6884       macro_build (&label_expr, "bne", "s,t,p", treg, AT);
6885       if (dbl)
6886         {
6887           expr1.X_add_number = 1;
6888           load_register (AT, &expr1, dbl);
6889           macro_build (NULL, "dsll32", SHFT_FMT, AT, AT, 31);
6890         }
6891       else
6892         {
6893           expr1.X_add_number = 0x80000000;
6894           macro_build (&expr1, "lui", LUI_FMT, AT, BFD_RELOC_HI16);
6895         }
6896       if (mips_trap)
6897         {
6898           macro_build (NULL, "teq", TRAP_FMT, sreg, AT, 6);
6899           /* We want to close the noreorder block as soon as possible, so
6900              that later insns are available for delay slot filling.  */
6901           end_noreorder ();
6902         }
6903       else
6904         {
6905           if (mips_opts.micromips)
6906             micromips_label_expr (&label_expr);
6907           else
6908             label_expr.X_add_number = 8;
6909           macro_build (&label_expr, "bne", "s,t,p", sreg, AT);
6910           macro_build (NULL, "nop", "");
6911
6912           /* We want to close the noreorder block as soon as possible, so
6913              that later insns are available for delay slot filling.  */
6914           end_noreorder ();
6915
6916           macro_build (NULL, "break", BRK_FMT, 6);
6917         }
6918       if (mips_opts.micromips)
6919         micromips_add_label ();
6920       macro_build (NULL, s, MFHL_FMT, dreg);
6921       break;
6922
6923     case M_DIV_3I:
6924       s = "div";
6925       s2 = "mflo";
6926       goto do_divi;
6927     case M_DIVU_3I:
6928       s = "divu";
6929       s2 = "mflo";
6930       goto do_divi;
6931     case M_REM_3I:
6932       s = "div";
6933       s2 = "mfhi";
6934       goto do_divi;
6935     case M_REMU_3I:
6936       s = "divu";
6937       s2 = "mfhi";
6938       goto do_divi;
6939     case M_DDIV_3I:
6940       dbl = 1;
6941       s = "ddiv";
6942       s2 = "mflo";
6943       goto do_divi;
6944     case M_DDIVU_3I:
6945       dbl = 1;
6946       s = "ddivu";
6947       s2 = "mflo";
6948       goto do_divi;
6949     case M_DREM_3I:
6950       dbl = 1;
6951       s = "ddiv";
6952       s2 = "mfhi";
6953       goto do_divi;
6954     case M_DREMU_3I:
6955       dbl = 1;
6956       s = "ddivu";
6957       s2 = "mfhi";
6958     do_divi:
6959       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6960         {
6961           as_warn (_("Divide by zero."));
6962           if (mips_trap)
6963             macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
6964           else
6965             macro_build (NULL, "break", BRK_FMT, 7);
6966           break;
6967         }
6968       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6969         {
6970           if (strcmp (s2, "mflo") == 0)
6971             move_register (dreg, sreg);
6972           else
6973             move_register (dreg, ZERO);
6974           break;
6975         }
6976       if (imm_expr.X_op == O_constant
6977           && imm_expr.X_add_number == -1
6978           && s[strlen (s) - 1] != 'u')
6979         {
6980           if (strcmp (s2, "mflo") == 0)
6981             {
6982               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
6983             }
6984           else
6985             move_register (dreg, ZERO);
6986           break;
6987         }
6988
6989       used_at = 1;
6990       load_register (AT, &imm_expr, dbl);
6991       macro_build (NULL, s, "z,s,t", sreg, AT);
6992       macro_build (NULL, s2, MFHL_FMT, dreg);
6993       break;
6994
6995     case M_DIVU_3:
6996       s = "divu";
6997       s2 = "mflo";
6998       goto do_divu3;
6999     case M_REMU_3:
7000       s = "divu";
7001       s2 = "mfhi";
7002       goto do_divu3;
7003     case M_DDIVU_3:
7004       s = "ddivu";
7005       s2 = "mflo";
7006       goto do_divu3;
7007     case M_DREMU_3:
7008       s = "ddivu";
7009       s2 = "mfhi";
7010     do_divu3:
7011       start_noreorder ();
7012       if (mips_trap)
7013         {
7014           macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
7015           macro_build (NULL, s, "z,s,t", sreg, treg);
7016           /* We want to close the noreorder block as soon as possible, so
7017              that later insns are available for delay slot filling.  */
7018           end_noreorder ();
7019         }
7020       else
7021         {
7022           if (mips_opts.micromips)
7023             micromips_label_expr (&label_expr);
7024           else
7025             label_expr.X_add_number = 8;
7026           macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
7027           macro_build (NULL, s, "z,s,t", sreg, treg);
7028
7029           /* We want to close the noreorder block as soon as possible, so
7030              that later insns are available for delay slot filling.  */
7031           end_noreorder ();
7032           macro_build (NULL, "break", BRK_FMT, 7);
7033           if (mips_opts.micromips)
7034             micromips_add_label ();
7035         }
7036       macro_build (NULL, s2, MFHL_FMT, dreg);
7037       break;
7038
7039     case M_DLCA_AB:
7040       dbl = 1;
7041     case M_LCA_AB:
7042       call = 1;
7043       goto do_la;
7044     case M_DLA_AB:
7045       dbl = 1;
7046     case M_LA_AB:
7047     do_la:
7048       /* Load the address of a symbol into a register.  If breg is not
7049          zero, we then add a base register to it.  */
7050
7051       if (dbl && HAVE_32BIT_GPRS)
7052         as_warn (_("dla used to load 32-bit register"));
7053
7054       if (!dbl && HAVE_64BIT_OBJECTS)
7055         as_warn (_("la used to load 64-bit address"));
7056
7057       if (offset_expr.X_op == O_constant
7058           && offset_expr.X_add_number >= -0x8000
7059           && offset_expr.X_add_number < 0x8000)
7060         {
7061           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
7062                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
7063           break;
7064         }
7065
7066       if (mips_opts.at && (treg == breg))
7067         {
7068           tempreg = AT;
7069           used_at = 1;
7070         }
7071       else
7072         {
7073           tempreg = treg;
7074         }
7075
7076       if (offset_expr.X_op != O_symbol
7077           && offset_expr.X_op != O_constant)
7078         {
7079           as_bad (_("Expression too complex"));
7080           offset_expr.X_op = O_constant;
7081         }
7082
7083       if (offset_expr.X_op == O_constant)
7084         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
7085       else if (mips_pic == NO_PIC)
7086         {
7087           /* If this is a reference to a GP relative symbol, we want
7088                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
7089              Otherwise we want
7090                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
7091                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7092              If we have a constant, we need two instructions anyhow,
7093              so we may as well always use the latter form.
7094
7095              With 64bit address space and a usable $at we want
7096                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
7097                lui      $at,<sym>               (BFD_RELOC_HI16_S)
7098                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
7099                daddiu   $at,<sym>               (BFD_RELOC_LO16)
7100                dsll32   $tempreg,0
7101                daddu    $tempreg,$tempreg,$at
7102
7103              If $at is already in use, we use a path which is suboptimal
7104              on superscalar processors.
7105                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
7106                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
7107                dsll     $tempreg,16
7108                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
7109                dsll     $tempreg,16
7110                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
7111
7112              For GP relative symbols in 64bit address space we can use
7113              the same sequence as in 32bit address space.  */
7114           if (HAVE_64BIT_SYMBOLS)
7115             {
7116               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7117                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7118                 {
7119                   relax_start (offset_expr.X_add_symbol);
7120                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7121                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7122                   relax_switch ();
7123                 }
7124
7125               if (used_at == 0 && mips_opts.at)
7126                 {
7127                   macro_build (&offset_expr, "lui", LUI_FMT,
7128                                tempreg, BFD_RELOC_MIPS_HIGHEST);
7129                   macro_build (&offset_expr, "lui", LUI_FMT,
7130                                AT, BFD_RELOC_HI16_S);
7131                   macro_build (&offset_expr, "daddiu", "t,r,j",
7132                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7133                   macro_build (&offset_expr, "daddiu", "t,r,j",
7134                                AT, AT, BFD_RELOC_LO16);
7135                   macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
7136                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
7137                   used_at = 1;
7138                 }
7139               else
7140                 {
7141                   macro_build (&offset_expr, "lui", LUI_FMT,
7142                                tempreg, BFD_RELOC_MIPS_HIGHEST);
7143                   macro_build (&offset_expr, "daddiu", "t,r,j",
7144                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7145                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7146                   macro_build (&offset_expr, "daddiu", "t,r,j",
7147                                tempreg, tempreg, BFD_RELOC_HI16_S);
7148                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7149                   macro_build (&offset_expr, "daddiu", "t,r,j",
7150                                tempreg, tempreg, BFD_RELOC_LO16);
7151                 }
7152
7153               if (mips_relax.sequence)
7154                 relax_end ();
7155             }
7156           else
7157             {
7158               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7159                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7160                 {
7161                   relax_start (offset_expr.X_add_symbol);
7162                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7163                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7164                   relax_switch ();
7165                 }
7166               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7167                 as_bad (_("Offset too large"));
7168               macro_build_lui (&offset_expr, tempreg);
7169               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7170                            tempreg, tempreg, BFD_RELOC_LO16);
7171               if (mips_relax.sequence)
7172                 relax_end ();
7173             }
7174         }
7175       else if (!mips_big_got && !HAVE_NEWABI)
7176         {
7177           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7178
7179           /* If this is a reference to an external symbol, and there
7180              is no constant, we want
7181                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7182              or for lca or if tempreg is PIC_CALL_REG
7183                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
7184              For a local symbol, we want
7185                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7186                nop
7187                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7188
7189              If we have a small constant, and this is a reference to
7190              an external symbol, we want
7191                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7192                nop
7193                addiu    $tempreg,$tempreg,<constant>
7194              For a local symbol, we want the same instruction
7195              sequence, but we output a BFD_RELOC_LO16 reloc on the
7196              addiu instruction.
7197
7198              If we have a large constant, and this is a reference to
7199              an external symbol, we want
7200                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7201                lui      $at,<hiconstant>
7202                addiu    $at,$at,<loconstant>
7203                addu     $tempreg,$tempreg,$at
7204              For a local symbol, we want the same instruction
7205              sequence, but we output a BFD_RELOC_LO16 reloc on the
7206              addiu instruction.
7207            */
7208
7209           if (offset_expr.X_add_number == 0)
7210             {
7211               if (mips_pic == SVR4_PIC
7212                   && breg == 0
7213                   && (call || tempreg == PIC_CALL_REG))
7214                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
7215
7216               relax_start (offset_expr.X_add_symbol);
7217               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7218                            lw_reloc_type, mips_gp_register);
7219               if (breg != 0)
7220                 {
7221                   /* We're going to put in an addu instruction using
7222                      tempreg, so we may as well insert the nop right
7223                      now.  */
7224                   load_delay_nop ();
7225                 }
7226               relax_switch ();
7227               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7228                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
7229               load_delay_nop ();
7230               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7231                            tempreg, tempreg, BFD_RELOC_LO16);
7232               relax_end ();
7233               /* FIXME: If breg == 0, and the next instruction uses
7234                  $tempreg, then if this variant case is used an extra
7235                  nop will be generated.  */
7236             }
7237           else if (offset_expr.X_add_number >= -0x8000
7238                    && offset_expr.X_add_number < 0x8000)
7239             {
7240               load_got_offset (tempreg, &offset_expr);
7241               load_delay_nop ();
7242               add_got_offset (tempreg, &offset_expr);
7243             }
7244           else
7245             {
7246               expr1.X_add_number = offset_expr.X_add_number;
7247               offset_expr.X_add_number =
7248                 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
7249               load_got_offset (tempreg, &offset_expr);
7250               offset_expr.X_add_number = expr1.X_add_number;
7251               /* If we are going to add in a base register, and the
7252                  target register and the base register are the same,
7253                  then we are using AT as a temporary register.  Since
7254                  we want to load the constant into AT, we add our
7255                  current AT (from the global offset table) and the
7256                  register into the register now, and pretend we were
7257                  not using a base register.  */
7258               if (breg == treg)
7259                 {
7260                   load_delay_nop ();
7261                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7262                                treg, AT, breg);
7263                   breg = 0;
7264                   tempreg = treg;
7265                 }
7266               add_got_offset_hilo (tempreg, &offset_expr, AT);
7267               used_at = 1;
7268             }
7269         }
7270       else if (!mips_big_got && HAVE_NEWABI)
7271         {
7272           int add_breg_early = 0;
7273
7274           /* If this is a reference to an external, and there is no
7275              constant, or local symbol (*), with or without a
7276              constant, we want
7277                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7278              or for lca or if tempreg is PIC_CALL_REG
7279                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
7280
7281              If we have a small constant, and this is a reference to
7282              an external symbol, we want
7283                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7284                addiu    $tempreg,$tempreg,<constant>
7285
7286              If we have a large constant, and this is a reference to
7287              an external symbol, we want
7288                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7289                lui      $at,<hiconstant>
7290                addiu    $at,$at,<loconstant>
7291                addu     $tempreg,$tempreg,$at
7292
7293              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
7294              local symbols, even though it introduces an additional
7295              instruction.  */
7296
7297           if (offset_expr.X_add_number)
7298             {
7299               expr1.X_add_number = offset_expr.X_add_number;
7300               offset_expr.X_add_number = 0;
7301
7302               relax_start (offset_expr.X_add_symbol);
7303               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7304                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7305
7306               if (expr1.X_add_number >= -0x8000
7307                   && expr1.X_add_number < 0x8000)
7308                 {
7309                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7310                                tempreg, tempreg, BFD_RELOC_LO16);
7311                 }
7312               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
7313                 {
7314                   /* If we are going to add in a base register, and the
7315                      target register and the base register are the same,
7316                      then we are using AT as a temporary register.  Since
7317                      we want to load the constant into AT, we add our
7318                      current AT (from the global offset table) and the
7319                      register into the register now, and pretend we were
7320                      not using a base register.  */
7321                   if (breg != treg)
7322                     dreg = tempreg;
7323                   else
7324                     {
7325                       gas_assert (tempreg == AT);
7326                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7327                                    treg, AT, breg);
7328                       dreg = treg;
7329                       add_breg_early = 1;
7330                     }
7331
7332                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7333                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7334                                dreg, dreg, AT);
7335
7336                   used_at = 1;
7337                 }
7338               else
7339                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
7340
7341               relax_switch ();
7342               offset_expr.X_add_number = expr1.X_add_number;
7343
7344               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7345                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7346               if (add_breg_early)
7347                 {
7348                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7349                                treg, tempreg, breg);
7350                   breg = 0;
7351                   tempreg = treg;
7352                 }
7353               relax_end ();
7354             }
7355           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
7356             {
7357               relax_start (offset_expr.X_add_symbol);
7358               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7359                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
7360               relax_switch ();
7361               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7362                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7363               relax_end ();
7364             }
7365           else
7366             {
7367               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7368                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7369             }
7370         }
7371       else if (mips_big_got && !HAVE_NEWABI)
7372         {
7373           int gpdelay;
7374           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7375           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7376           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7377
7378           /* This is the large GOT case.  If this is a reference to an
7379              external symbol, and there is no constant, we want
7380                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7381                addu     $tempreg,$tempreg,$gp
7382                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7383              or for lca or if tempreg is PIC_CALL_REG
7384                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
7385                addu     $tempreg,$tempreg,$gp
7386                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
7387              For a local symbol, we want
7388                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7389                nop
7390                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7391
7392              If we have a small constant, and this is a reference to
7393              an external symbol, we want
7394                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7395                addu     $tempreg,$tempreg,$gp
7396                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7397                nop
7398                addiu    $tempreg,$tempreg,<constant>
7399              For a local symbol, we want
7400                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7401                nop
7402                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
7403
7404              If we have a large constant, and this is a reference to
7405              an external symbol, we want
7406                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7407                addu     $tempreg,$tempreg,$gp
7408                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7409                lui      $at,<hiconstant>
7410                addiu    $at,$at,<loconstant>
7411                addu     $tempreg,$tempreg,$at
7412              For a local symbol, we want
7413                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7414                lui      $at,<hiconstant>
7415                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
7416                addu     $tempreg,$tempreg,$at
7417           */
7418
7419           expr1.X_add_number = offset_expr.X_add_number;
7420           offset_expr.X_add_number = 0;
7421           relax_start (offset_expr.X_add_symbol);
7422           gpdelay = reg_needs_delay (mips_gp_register);
7423           if (expr1.X_add_number == 0 && breg == 0
7424               && (call || tempreg == PIC_CALL_REG))
7425             {
7426               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
7427               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
7428             }
7429           macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
7430           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7431                        tempreg, tempreg, mips_gp_register);
7432           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7433                        tempreg, lw_reloc_type, tempreg);
7434           if (expr1.X_add_number == 0)
7435             {
7436               if (breg != 0)
7437                 {
7438                   /* We're going to put in an addu instruction using
7439                      tempreg, so we may as well insert the nop right
7440                      now.  */
7441                   load_delay_nop ();
7442                 }
7443             }
7444           else if (expr1.X_add_number >= -0x8000
7445                    && expr1.X_add_number < 0x8000)
7446             {
7447               load_delay_nop ();
7448               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7449                            tempreg, tempreg, BFD_RELOC_LO16);
7450             }
7451           else
7452             {
7453               /* If we are going to add in a base register, and the
7454                  target register and the base register are the same,
7455                  then we are using AT as a temporary register.  Since
7456                  we want to load the constant into AT, we add our
7457                  current AT (from the global offset table) and the
7458                  register into the register now, and pretend we were
7459                  not using a base register.  */
7460               if (breg != treg)
7461                 dreg = tempreg;
7462               else
7463                 {
7464                   gas_assert (tempreg == AT);
7465                   load_delay_nop ();
7466                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7467                                treg, AT, breg);
7468                   dreg = treg;
7469                 }
7470
7471               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7472               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
7473
7474               used_at = 1;
7475             }
7476           offset_expr.X_add_number =
7477             ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
7478           relax_switch ();
7479
7480           if (gpdelay)
7481             {
7482               /* This is needed because this instruction uses $gp, but
7483                  the first instruction on the main stream does not.  */
7484               macro_build (NULL, "nop", "");
7485             }
7486
7487           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7488                        local_reloc_type, mips_gp_register);
7489           if (expr1.X_add_number >= -0x8000
7490               && expr1.X_add_number < 0x8000)
7491             {
7492               load_delay_nop ();
7493               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7494                            tempreg, tempreg, BFD_RELOC_LO16);
7495               /* FIXME: If add_number is 0, and there was no base
7496                  register, the external symbol case ended with a load,
7497                  so if the symbol turns out to not be external, and
7498                  the next instruction uses tempreg, an unnecessary nop
7499                  will be inserted.  */
7500             }
7501           else
7502             {
7503               if (breg == treg)
7504                 {
7505                   /* We must add in the base register now, as in the
7506                      external symbol case.  */
7507                   gas_assert (tempreg == AT);
7508                   load_delay_nop ();
7509                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7510                                treg, AT, breg);
7511                   tempreg = treg;
7512                   /* We set breg to 0 because we have arranged to add
7513                      it in in both cases.  */
7514                   breg = 0;
7515                 }
7516
7517               macro_build_lui (&expr1, AT);
7518               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7519                            AT, AT, BFD_RELOC_LO16);
7520               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7521                            tempreg, tempreg, AT);
7522               used_at = 1;
7523             }
7524           relax_end ();
7525         }
7526       else if (mips_big_got && HAVE_NEWABI)
7527         {
7528           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7529           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7530           int add_breg_early = 0;
7531
7532           /* This is the large GOT case.  If this is a reference to an
7533              external symbol, and there is no constant, we want
7534                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7535                add      $tempreg,$tempreg,$gp
7536                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7537              or for lca or if tempreg is PIC_CALL_REG
7538                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
7539                add      $tempreg,$tempreg,$gp
7540                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
7541
7542              If we have a small constant, and this is a reference to
7543              an external symbol, we want
7544                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7545                add      $tempreg,$tempreg,$gp
7546                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7547                addi     $tempreg,$tempreg,<constant>
7548
7549              If we have a large constant, and this is a reference to
7550              an external symbol, we want
7551                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7552                addu     $tempreg,$tempreg,$gp
7553                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7554                lui      $at,<hiconstant>
7555                addi     $at,$at,<loconstant>
7556                add      $tempreg,$tempreg,$at
7557
7558              If we have NewABI, and we know it's a local symbol, we want
7559                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
7560                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
7561              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
7562
7563           relax_start (offset_expr.X_add_symbol);
7564
7565           expr1.X_add_number = offset_expr.X_add_number;
7566           offset_expr.X_add_number = 0;
7567
7568           if (expr1.X_add_number == 0 && breg == 0
7569               && (call || tempreg == PIC_CALL_REG))
7570             {
7571               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
7572               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
7573             }
7574           macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
7575           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7576                        tempreg, tempreg, mips_gp_register);
7577           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7578                        tempreg, lw_reloc_type, tempreg);
7579
7580           if (expr1.X_add_number == 0)
7581             ;
7582           else if (expr1.X_add_number >= -0x8000
7583                    && expr1.X_add_number < 0x8000)
7584             {
7585               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7586                            tempreg, tempreg, BFD_RELOC_LO16);
7587             }
7588           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
7589             {
7590               /* If we are going to add in a base register, and the
7591                  target register and the base register are the same,
7592                  then we are using AT as a temporary register.  Since
7593                  we want to load the constant into AT, we add our
7594                  current AT (from the global offset table) and the
7595                  register into the register now, and pretend we were
7596                  not using a base register.  */
7597               if (breg != treg)
7598                 dreg = tempreg;
7599               else
7600                 {
7601                   gas_assert (tempreg == AT);
7602                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7603                                treg, AT, breg);
7604                   dreg = treg;
7605                   add_breg_early = 1;
7606                 }
7607
7608               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7609               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
7610
7611               used_at = 1;
7612             }
7613           else
7614             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
7615
7616           relax_switch ();
7617           offset_expr.X_add_number = expr1.X_add_number;
7618           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7619                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
7620           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
7621                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
7622           if (add_breg_early)
7623             {
7624               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7625                            treg, tempreg, breg);
7626               breg = 0;
7627               tempreg = treg;
7628             }
7629           relax_end ();
7630         }
7631       else
7632         abort ();
7633
7634       if (breg != 0)
7635         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
7636       break;
7637
7638     case M_MSGSND:
7639       gas_assert (!mips_opts.micromips);
7640       {
7641         unsigned long temp = (treg << 16) | (0x01);
7642         macro_build (NULL, "c2", "C", temp);
7643       }
7644       break;
7645
7646     case M_MSGLD:
7647       gas_assert (!mips_opts.micromips);
7648       {
7649         unsigned long temp = (0x02);
7650         macro_build (NULL, "c2", "C", temp);
7651       }
7652       break;
7653
7654     case M_MSGLD_T:
7655       gas_assert (!mips_opts.micromips);
7656       {
7657         unsigned long temp = (treg << 16) | (0x02);
7658         macro_build (NULL, "c2", "C", temp);
7659       }
7660       break;
7661
7662     case M_MSGWAIT:
7663       gas_assert (!mips_opts.micromips);
7664       macro_build (NULL, "c2", "C", 3);
7665       break;
7666
7667     case M_MSGWAIT_T:
7668       gas_assert (!mips_opts.micromips);
7669       {
7670         unsigned long temp = (treg << 16) | 0x03;
7671         macro_build (NULL, "c2", "C", temp);
7672       }
7673       break;
7674
7675     case M_J_A:
7676       /* The j instruction may not be used in PIC code, since it
7677          requires an absolute address.  We convert it to a b
7678          instruction.  */
7679       if (mips_pic == NO_PIC)
7680         macro_build (&offset_expr, "j", "a");
7681       else
7682         macro_build (&offset_expr, "b", "p");
7683       break;
7684
7685       /* The jal instructions must be handled as macros because when
7686          generating PIC code they expand to multi-instruction
7687          sequences.  Normally they are simple instructions.  */
7688     case M_JALS_1:
7689       dreg = RA;
7690       /* Fall through.  */
7691     case M_JALS_2:
7692       gas_assert (mips_opts.micromips);
7693       jals = 1;
7694       goto jal;
7695     case M_JAL_1:
7696       dreg = RA;
7697       /* Fall through.  */
7698     case M_JAL_2:
7699     jal:
7700       if (mips_pic == NO_PIC)
7701         {
7702           s = jals ? "jalrs" : "jalr";
7703           if (mips_opts.micromips && dreg == RA)
7704             macro_build (NULL, s, "mj", sreg);
7705           else
7706             macro_build (NULL, s, JALR_FMT, dreg, sreg);
7707         }
7708       else
7709         {
7710           int cprestore = (mips_pic == SVR4_PIC && !HAVE_NEWABI
7711                            && mips_cprestore_offset >= 0);
7712
7713           if (sreg != PIC_CALL_REG)
7714             as_warn (_("MIPS PIC call to register other than $25"));
7715
7716           s = (mips_opts.micromips && (!mips_opts.noreorder || cprestore)
7717                ? "jalrs" : "jalr");
7718           if (mips_opts.micromips && dreg == RA)
7719             macro_build (NULL, s, "mj", sreg);
7720           else
7721             macro_build (NULL, s, JALR_FMT, dreg, sreg);
7722           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
7723             {
7724               if (mips_cprestore_offset < 0)
7725                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
7726               else
7727                 {
7728                   if (!mips_frame_reg_valid)
7729                     {
7730                       as_warn (_("No .frame pseudo-op used in PIC code"));
7731                       /* Quiet this warning.  */
7732                       mips_frame_reg_valid = 1;
7733                     }
7734                   if (!mips_cprestore_valid)
7735                     {
7736                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
7737                       /* Quiet this warning.  */
7738                       mips_cprestore_valid = 1;
7739                     }
7740                   if (mips_opts.noreorder)
7741                     macro_build (NULL, "nop", "");
7742                   expr1.X_add_number = mips_cprestore_offset;
7743                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
7744                                                 mips_gp_register,
7745                                                 mips_frame_reg,
7746                                                 HAVE_64BIT_ADDRESSES);
7747                 }
7748             }
7749         }
7750
7751       break;
7752
7753     case M_JALS_A:
7754       gas_assert (mips_opts.micromips);
7755       jals = 1;
7756       /* Fall through.  */
7757     case M_JAL_A:
7758       if (mips_pic == NO_PIC)
7759         macro_build (&offset_expr, jals ? "jals" : "jal", "a");
7760       else if (mips_pic == SVR4_PIC)
7761         {
7762           /* If this is a reference to an external symbol, and we are
7763              using a small GOT, we want
7764                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
7765                nop
7766                jalr     $ra,$25
7767                nop
7768                lw       $gp,cprestore($sp)
7769              The cprestore value is set using the .cprestore
7770              pseudo-op.  If we are using a big GOT, we want
7771                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
7772                addu     $25,$25,$gp
7773                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
7774                nop
7775                jalr     $ra,$25
7776                nop
7777                lw       $gp,cprestore($sp)
7778              If the symbol is not external, we want
7779                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7780                nop
7781                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
7782                jalr     $ra,$25
7783                nop
7784                lw $gp,cprestore($sp)
7785
7786              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
7787              sequences above, minus nops, unless the symbol is local,
7788              which enables us to use GOT_PAGE/GOT_OFST (big got) or
7789              GOT_DISP.  */
7790           if (HAVE_NEWABI)
7791             {
7792               if (!mips_big_got)
7793                 {
7794                   relax_start (offset_expr.X_add_symbol);
7795                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7796                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
7797                                mips_gp_register);
7798                   relax_switch ();
7799                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7800                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
7801                                mips_gp_register);
7802                   relax_end ();
7803                 }
7804               else
7805                 {
7806                   relax_start (offset_expr.X_add_symbol);
7807                   macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
7808                                BFD_RELOC_MIPS_CALL_HI16);
7809                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
7810                                PIC_CALL_REG, mips_gp_register);
7811                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7812                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
7813                                PIC_CALL_REG);
7814                   relax_switch ();
7815                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7816                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
7817                                mips_gp_register);
7818                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7819                                PIC_CALL_REG, PIC_CALL_REG,
7820                                BFD_RELOC_MIPS_GOT_OFST);
7821                   relax_end ();
7822                 }
7823
7824               macro_build_jalr (&offset_expr, 0);
7825             }
7826           else
7827             {
7828               relax_start (offset_expr.X_add_symbol);
7829               if (!mips_big_got)
7830                 {
7831                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7832                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
7833                                mips_gp_register);
7834                   load_delay_nop ();
7835                   relax_switch ();
7836                 }
7837               else
7838                 {
7839                   int gpdelay;
7840
7841                   gpdelay = reg_needs_delay (mips_gp_register);
7842                   macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
7843                                BFD_RELOC_MIPS_CALL_HI16);
7844                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
7845                                PIC_CALL_REG, mips_gp_register);
7846                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7847                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
7848                                PIC_CALL_REG);
7849                   load_delay_nop ();
7850                   relax_switch ();
7851                   if (gpdelay)
7852                     macro_build (NULL, "nop", "");
7853                 }
7854               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7855                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
7856                            mips_gp_register);
7857               load_delay_nop ();
7858               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7859                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
7860               relax_end ();
7861               macro_build_jalr (&offset_expr, mips_cprestore_offset >= 0);
7862
7863               if (mips_cprestore_offset < 0)
7864                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
7865               else
7866                 {
7867                   if (!mips_frame_reg_valid)
7868                     {
7869                       as_warn (_("No .frame pseudo-op used in PIC code"));
7870                       /* Quiet this warning.  */
7871                       mips_frame_reg_valid = 1;
7872                     }
7873                   if (!mips_cprestore_valid)
7874                     {
7875                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
7876                       /* Quiet this warning.  */
7877                       mips_cprestore_valid = 1;
7878                     }
7879                   if (mips_opts.noreorder)
7880                     macro_build (NULL, "nop", "");
7881                   expr1.X_add_number = mips_cprestore_offset;
7882                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
7883                                                 mips_gp_register,
7884                                                 mips_frame_reg,
7885                                                 HAVE_64BIT_ADDRESSES);
7886                 }
7887             }
7888         }
7889       else if (mips_pic == VXWORKS_PIC)
7890         as_bad (_("Non-PIC jump used in PIC library"));
7891       else
7892         abort ();
7893
7894       break;
7895
7896     case M_ACLR_AB:
7897       ab = 1;
7898     case M_ACLR_OB:
7899       s = "aclr";
7900       treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
7901       fmt = "\\,~(b)";
7902       off12 = 1;
7903       goto ld_st;
7904     case M_ASET_AB:
7905       ab = 1;
7906     case M_ASET_OB:
7907       s = "aset";
7908       treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
7909       fmt = "\\,~(b)";
7910       off12 = 1;
7911       goto ld_st;
7912     case M_LB_AB:
7913       ab = 1;
7914       s = "lb";
7915       fmt = "t,o(b)";
7916       goto ld;
7917     case M_LBU_AB:
7918       ab = 1;
7919       s = "lbu";
7920       fmt = "t,o(b)";
7921       goto ld;
7922     case M_LH_AB:
7923       ab = 1;
7924       s = "lh";
7925       fmt = "t,o(b)";
7926       goto ld;
7927     case M_LHU_AB:
7928       ab = 1;
7929       s = "lhu";
7930       fmt = "t,o(b)";
7931       goto ld;
7932     case M_LW_AB:
7933       ab = 1;
7934       s = "lw";
7935       fmt = "t,o(b)";
7936       goto ld;
7937     case M_LWC0_AB:
7938       ab = 1;
7939       gas_assert (!mips_opts.micromips);
7940       s = "lwc0";
7941       fmt = "E,o(b)";
7942       /* Itbl support may require additional care here.  */
7943       coproc = 1;
7944       goto ld_st;
7945     case M_LWC1_AB:
7946       ab = 1;
7947       s = "lwc1";
7948       fmt = "T,o(b)";
7949       /* Itbl support may require additional care here.  */
7950       coproc = 1;
7951       goto ld_st;
7952     case M_LWC2_AB:
7953       ab = 1;
7954     case M_LWC2_OB:
7955       s = "lwc2";
7956       fmt = COP12_FMT;
7957       off12 = mips_opts.micromips;
7958       /* Itbl support may require additional care here.  */
7959       coproc = 1;
7960       goto ld_st;
7961     case M_LWC3_AB:
7962       ab = 1;
7963       gas_assert (!mips_opts.micromips);
7964       s = "lwc3";
7965       fmt = "E,o(b)";
7966       /* Itbl support may require additional care here.  */
7967       coproc = 1;
7968       goto ld_st;
7969     case M_LWL_AB:
7970       ab = 1;
7971     case M_LWL_OB:
7972       s = "lwl";
7973       fmt = MEM12_FMT;
7974       off12 = mips_opts.micromips;
7975       goto ld_st;
7976     case M_LWR_AB:
7977       ab = 1;
7978     case M_LWR_OB:
7979       s = "lwr";
7980       fmt = MEM12_FMT;
7981       off12 = mips_opts.micromips;
7982       goto ld_st;
7983     case M_LDC1_AB:
7984       ab = 1;
7985       s = "ldc1";
7986       fmt = "T,o(b)";
7987       /* Itbl support may require additional care here.  */
7988       coproc = 1;
7989       goto ld_st;
7990     case M_LDC2_AB:
7991       ab = 1;
7992     case M_LDC2_OB:
7993       s = "ldc2";
7994       fmt = COP12_FMT;
7995       off12 = mips_opts.micromips;
7996       /* Itbl support may require additional care here.  */
7997       coproc = 1;
7998       goto ld_st;
7999     case M_LDC3_AB:
8000       ab = 1;
8001       s = "ldc3";
8002       fmt = "E,o(b)";
8003       /* Itbl support may require additional care here.  */
8004       coproc = 1;
8005       goto ld_st;
8006     case M_LDL_AB:
8007       ab = 1;
8008     case M_LDL_OB:
8009       s = "ldl";
8010       fmt = MEM12_FMT;
8011       off12 = mips_opts.micromips;
8012       goto ld_st;
8013     case M_LDR_AB:
8014       ab = 1;
8015     case M_LDR_OB:
8016       s = "ldr";
8017       fmt = MEM12_FMT;
8018       off12 = mips_opts.micromips;
8019       goto ld_st;
8020     case M_LL_AB:
8021       ab = 1;
8022     case M_LL_OB:
8023       s = "ll";
8024       fmt = MEM12_FMT;
8025       off12 = mips_opts.micromips;
8026       goto ld;
8027     case M_LLD_AB:
8028       ab = 1;
8029     case M_LLD_OB:
8030       s = "lld";
8031       fmt = MEM12_FMT;
8032       off12 = mips_opts.micromips;
8033       goto ld;
8034     case M_LWU_AB:
8035       ab = 1;
8036     case M_LWU_OB:
8037       s = "lwu";
8038       fmt = MEM12_FMT;
8039       off12 = mips_opts.micromips;
8040       goto ld;
8041     case M_LWP_AB:
8042       ab = 1;
8043     case M_LWP_OB:
8044       gas_assert (mips_opts.micromips);
8045       s = "lwp";
8046       fmt = "t,~(b)";
8047       off12 = 1;
8048       lp = 1;
8049       goto ld;
8050     case M_LDP_AB:
8051       ab = 1;
8052     case M_LDP_OB:
8053       gas_assert (mips_opts.micromips);
8054       s = "ldp";
8055       fmt = "t,~(b)";
8056       off12 = 1;
8057       lp = 1;
8058       goto ld;
8059     case M_LWM_AB:
8060       ab = 1;
8061     case M_LWM_OB:
8062       gas_assert (mips_opts.micromips);
8063       s = "lwm";
8064       fmt = "n,~(b)";
8065       off12 = 1;
8066       goto ld_st;
8067     case M_LDM_AB:
8068       ab = 1;
8069     case M_LDM_OB:
8070       gas_assert (mips_opts.micromips);
8071       s = "ldm";
8072       fmt = "n,~(b)";
8073       off12 = 1;
8074       goto ld_st;
8075
8076     ld:
8077       if (breg == treg + lp)
8078         goto ld_st;
8079       else
8080         tempreg = treg + lp;
8081       goto ld_noat;
8082
8083     case M_SB_AB:
8084       ab = 1;
8085       s = "sb";
8086       fmt = "t,o(b)";
8087       goto ld_st;
8088     case M_SH_AB:
8089       ab = 1;
8090       s = "sh";
8091       fmt = "t,o(b)";
8092       goto ld_st;
8093     case M_SW_AB:
8094       ab = 1;
8095       s = "sw";
8096       fmt = "t,o(b)";
8097       goto ld_st;
8098     case M_SWC0_AB:
8099       ab = 1;
8100       gas_assert (!mips_opts.micromips);
8101       s = "swc0";
8102       fmt = "E,o(b)";
8103       /* Itbl support may require additional care here.  */
8104       coproc = 1;
8105       goto ld_st;
8106     case M_SWC1_AB:
8107       ab = 1;
8108       s = "swc1";
8109       fmt = "T,o(b)";
8110       /* Itbl support may require additional care here.  */
8111       coproc = 1;
8112       goto ld_st;
8113     case M_SWC2_AB:
8114       ab = 1;
8115     case M_SWC2_OB:
8116       s = "swc2";
8117       fmt = COP12_FMT;
8118       off12 = mips_opts.micromips;
8119       /* Itbl support may require additional care here.  */
8120       coproc = 1;
8121       goto ld_st;
8122     case M_SWC3_AB:
8123       ab = 1;
8124       gas_assert (!mips_opts.micromips);
8125       s = "swc3";
8126       fmt = "E,o(b)";
8127       /* Itbl support may require additional care here.  */
8128       coproc = 1;
8129       goto ld_st;
8130     case M_SWL_AB:
8131       ab = 1;
8132     case M_SWL_OB:
8133       s = "swl";
8134       fmt = MEM12_FMT;
8135       off12 = mips_opts.micromips;
8136       goto ld_st;
8137     case M_SWR_AB:
8138       ab = 1;
8139     case M_SWR_OB:
8140       s = "swr";
8141       fmt = MEM12_FMT;
8142       off12 = mips_opts.micromips;
8143       goto ld_st;
8144     case M_SC_AB:
8145       ab = 1;
8146     case M_SC_OB:
8147       s = "sc";
8148       fmt = MEM12_FMT;
8149       off12 = mips_opts.micromips;
8150       goto ld_st;
8151     case M_SCD_AB:
8152       ab = 1;
8153     case M_SCD_OB:
8154       s = "scd";
8155       fmt = MEM12_FMT;
8156       off12 = mips_opts.micromips;
8157       goto ld_st;
8158     case M_CACHE_AB:
8159       ab = 1;
8160     case M_CACHE_OB:
8161       s = "cache";
8162       fmt = mips_opts.micromips ? "k,~(b)" : "k,o(b)";
8163       off12 = mips_opts.micromips;
8164       goto ld_st;
8165     case M_PREF_AB:
8166       ab = 1;
8167     case M_PREF_OB:
8168       s = "pref";
8169       fmt = !mips_opts.micromips ? "k,o(b)" : "k,~(b)";
8170       off12 = mips_opts.micromips;
8171       goto ld_st;
8172     case M_SDC1_AB:
8173       ab = 1;
8174       s = "sdc1";
8175       fmt = "T,o(b)";
8176       coproc = 1;
8177       /* Itbl support may require additional care here.  */
8178       goto ld_st;
8179     case M_SDC2_AB:
8180       ab = 1;
8181     case M_SDC2_OB:
8182       s = "sdc2";
8183       fmt = COP12_FMT;
8184       off12 = mips_opts.micromips;
8185       /* Itbl support may require additional care here.  */
8186       coproc = 1;
8187       goto ld_st;
8188     case M_SDC3_AB:
8189       ab = 1;
8190       gas_assert (!mips_opts.micromips);
8191       s = "sdc3";
8192       fmt = "E,o(b)";
8193       /* Itbl support may require additional care here.  */
8194       coproc = 1;
8195       goto ld_st;
8196     case M_SDL_AB:
8197       ab = 1;
8198     case M_SDL_OB:
8199       s = "sdl";
8200       fmt = MEM12_FMT;
8201       off12 = mips_opts.micromips;
8202       goto ld_st;
8203     case M_SDR_AB:
8204       ab = 1;
8205     case M_SDR_OB:
8206       s = "sdr";
8207       fmt = MEM12_FMT;
8208       off12 = mips_opts.micromips;
8209       goto ld_st;
8210     case M_SWP_AB:
8211       ab = 1;
8212     case M_SWP_OB:
8213       gas_assert (mips_opts.micromips);
8214       s = "swp";
8215       fmt = "t,~(b)";
8216       off12 = 1;
8217       goto ld_st;
8218     case M_SDP_AB:
8219       ab = 1;
8220     case M_SDP_OB:
8221       gas_assert (mips_opts.micromips);
8222       s = "sdp";
8223       fmt = "t,~(b)";
8224       off12 = 1;
8225       goto ld_st;
8226     case M_SWM_AB:
8227       ab = 1;
8228     case M_SWM_OB:
8229       gas_assert (mips_opts.micromips);
8230       s = "swm";
8231       fmt = "n,~(b)";
8232       off12 = 1;
8233       goto ld_st;
8234     case M_SDM_AB:
8235       ab = 1;
8236     case M_SDM_OB:
8237       gas_assert (mips_opts.micromips);
8238       s = "sdm";
8239       fmt = "n,~(b)";
8240       off12 = 1;
8241
8242     ld_st:
8243       tempreg = AT;
8244       used_at = 1;
8245     ld_noat:
8246       if (coproc
8247           && NO_ISA_COP (mips_opts.arch)
8248           && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
8249         {
8250           as_bad (_("Opcode not supported on this processor: %s"),
8251                   mips_cpu_info_from_arch (mips_opts.arch)->name);
8252           break;
8253         }
8254
8255       if (offset_expr.X_op != O_constant
8256           && offset_expr.X_op != O_symbol)
8257         {
8258           as_bad (_("Expression too complex"));
8259           offset_expr.X_op = O_constant;
8260         }
8261
8262       if (HAVE_32BIT_ADDRESSES
8263           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
8264         {
8265           char value [32];
8266
8267           sprintf_vma (value, offset_expr.X_add_number);
8268           as_bad (_("Number (0x%s) larger than 32 bits"), value);
8269         }
8270
8271       /* A constant expression in PIC code can be handled just as it
8272          is in non PIC code.  */
8273       if (offset_expr.X_op == O_constant)
8274         {
8275           int hipart = 0;
8276
8277           expr1.X_add_number = offset_expr.X_add_number;
8278           normalize_address_expr (&expr1);
8279           if (!off12 && !IS_SEXT_16BIT_NUM (expr1.X_add_number))
8280             {
8281               expr1.X_add_number = ((expr1.X_add_number + 0x8000)
8282                                     & ~(bfd_vma) 0xffff);
8283               hipart = 1;
8284             }
8285           else if (off12 && !IS_SEXT_12BIT_NUM (expr1.X_add_number))
8286             {
8287               expr1.X_add_number = ((expr1.X_add_number + 0x800)
8288                                     & ~(bfd_vma) 0xfff);
8289               hipart = 1;
8290             }
8291           if (hipart)
8292             {
8293               load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
8294               if (breg != 0)
8295                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8296                              tempreg, tempreg, breg);
8297               breg = tempreg;
8298             }
8299           if (!off12)
8300             macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
8301           else
8302             macro_build (NULL, s, fmt,
8303                          treg, (unsigned long) offset_expr.X_add_number, breg);
8304         }
8305       else if (off12)
8306         {
8307           /* A 12-bit offset field is too narrow to be used for a low-part
8308              relocation, so load the whole address into the auxillary
8309              register.  In the case of "A(b)" addresses, we first load
8310              absolute address "A" into the register and then add base
8311              register "b".  In the case of "o(b)" addresses, we simply
8312              need to add 16-bit offset "o" to base register "b", and
8313              offset_reloc already contains the relocations associated
8314              with "o".  */
8315           if (ab)
8316             {
8317               load_address (tempreg, &offset_expr, &used_at);
8318               if (breg != 0)
8319                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8320                              tempreg, tempreg, breg);
8321             }
8322           else
8323             macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8324                          tempreg, breg, -1,
8325                          offset_reloc[0], offset_reloc[1], offset_reloc[2]);
8326           expr1.X_add_number = 0;
8327           macro_build (NULL, s, fmt,
8328                        treg, (unsigned long) expr1.X_add_number, tempreg);
8329         }
8330       else if (mips_pic == NO_PIC)
8331         {
8332           /* If this is a reference to a GP relative symbol, and there
8333              is no base register, we want
8334                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
8335              Otherwise, if there is no base register, we want
8336                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
8337                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8338              If we have a constant, we need two instructions anyhow,
8339              so we always use the latter form.
8340
8341              If we have a base register, and this is a reference to a
8342              GP relative symbol, we want
8343                addu     $tempreg,$breg,$gp
8344                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
8345              Otherwise we want
8346                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
8347                addu     $tempreg,$tempreg,$breg
8348                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8349              With a constant we always use the latter case.
8350
8351              With 64bit address space and no base register and $at usable,
8352              we want
8353                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8354                lui      $at,<sym>               (BFD_RELOC_HI16_S)
8355                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8356                dsll32   $tempreg,0
8357                daddu    $tempreg,$at
8358                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8359              If we have a base register, we want
8360                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8361                lui      $at,<sym>               (BFD_RELOC_HI16_S)
8362                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8363                daddu    $at,$breg
8364                dsll32   $tempreg,0
8365                daddu    $tempreg,$at
8366                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8367
8368              Without $at we can't generate the optimal path for superscalar
8369              processors here since this would require two temporary registers.
8370                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8371                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8372                dsll     $tempreg,16
8373                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
8374                dsll     $tempreg,16
8375                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8376              If we have a base register, we want
8377                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8378                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8379                dsll     $tempreg,16
8380                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
8381                dsll     $tempreg,16
8382                daddu    $tempreg,$tempreg,$breg
8383                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8384
8385              For GP relative symbols in 64bit address space we can use
8386              the same sequence as in 32bit address space.  */
8387           if (HAVE_64BIT_SYMBOLS)
8388             {
8389               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8390                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8391                 {
8392                   relax_start (offset_expr.X_add_symbol);
8393                   if (breg == 0)
8394                     {
8395                       macro_build (&offset_expr, s, fmt, treg,
8396                                    BFD_RELOC_GPREL16, mips_gp_register);
8397                     }
8398                   else
8399                     {
8400                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8401                                    tempreg, breg, mips_gp_register);
8402                       macro_build (&offset_expr, s, fmt, treg,
8403                                    BFD_RELOC_GPREL16, tempreg);
8404                     }
8405                   relax_switch ();
8406                 }
8407
8408               if (used_at == 0 && mips_opts.at)
8409                 {
8410                   macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8411                                BFD_RELOC_MIPS_HIGHEST);
8412                   macro_build (&offset_expr, "lui", LUI_FMT, AT,
8413                                BFD_RELOC_HI16_S);
8414                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8415                                tempreg, BFD_RELOC_MIPS_HIGHER);
8416                   if (breg != 0)
8417                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
8418                   macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
8419                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
8420                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
8421                                tempreg);
8422                   used_at = 1;
8423                 }
8424               else
8425                 {
8426                   macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8427                                BFD_RELOC_MIPS_HIGHEST);
8428                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8429                                tempreg, BFD_RELOC_MIPS_HIGHER);
8430                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
8431                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8432                                tempreg, BFD_RELOC_HI16_S);
8433                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
8434                   if (breg != 0)
8435                     macro_build (NULL, "daddu", "d,v,t",
8436                                  tempreg, tempreg, breg);
8437                   macro_build (&offset_expr, s, fmt, treg,
8438                                BFD_RELOC_LO16, tempreg);
8439                 }
8440
8441               if (mips_relax.sequence)
8442                 relax_end ();
8443               break;
8444             }
8445
8446           if (breg == 0)
8447             {
8448               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8449                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8450                 {
8451                   relax_start (offset_expr.X_add_symbol);
8452                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
8453                                mips_gp_register);
8454                   relax_switch ();
8455                 }
8456               macro_build_lui (&offset_expr, tempreg);
8457               macro_build (&offset_expr, s, fmt, treg,
8458                            BFD_RELOC_LO16, tempreg);
8459               if (mips_relax.sequence)
8460                 relax_end ();
8461             }
8462           else
8463             {
8464               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8465                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8466                 {
8467                   relax_start (offset_expr.X_add_symbol);
8468                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8469                                tempreg, breg, mips_gp_register);
8470                   macro_build (&offset_expr, s, fmt, treg,
8471                                BFD_RELOC_GPREL16, tempreg);
8472                   relax_switch ();
8473                 }
8474               macro_build_lui (&offset_expr, tempreg);
8475               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8476                            tempreg, tempreg, breg);
8477               macro_build (&offset_expr, s, fmt, treg,
8478                            BFD_RELOC_LO16, tempreg);
8479               if (mips_relax.sequence)
8480                 relax_end ();
8481             }
8482         }
8483       else if (!mips_big_got)
8484         {
8485           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
8486
8487           /* If this is a reference to an external symbol, we want
8488                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8489                nop
8490                <op>     $treg,0($tempreg)
8491              Otherwise we want
8492                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8493                nop
8494                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
8495                <op>     $treg,0($tempreg)
8496
8497              For NewABI, we want
8498                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
8499                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
8500
8501              If there is a base register, we add it to $tempreg before
8502              the <op>.  If there is a constant, we stick it in the
8503              <op> instruction.  We don't handle constants larger than
8504              16 bits, because we have no way to load the upper 16 bits
8505              (actually, we could handle them for the subset of cases
8506              in which we are not using $at).  */
8507           gas_assert (offset_expr.X_op == O_symbol);
8508           if (HAVE_NEWABI)
8509             {
8510               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8511                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
8512               if (breg != 0)
8513                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8514                              tempreg, tempreg, breg);
8515               macro_build (&offset_expr, s, fmt, treg,
8516                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
8517               break;
8518             }
8519           expr1.X_add_number = offset_expr.X_add_number;
8520           offset_expr.X_add_number = 0;
8521           if (expr1.X_add_number < -0x8000
8522               || expr1.X_add_number >= 0x8000)
8523             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8524           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8525                        lw_reloc_type, mips_gp_register);
8526           load_delay_nop ();
8527           relax_start (offset_expr.X_add_symbol);
8528           relax_switch ();
8529           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
8530                        tempreg, BFD_RELOC_LO16);
8531           relax_end ();
8532           if (breg != 0)
8533             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8534                          tempreg, tempreg, breg);
8535           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8536         }
8537       else if (mips_big_got && !HAVE_NEWABI)
8538         {
8539           int gpdelay;
8540
8541           /* If this is a reference to an external symbol, we want
8542                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
8543                addu     $tempreg,$tempreg,$gp
8544                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8545                <op>     $treg,0($tempreg)
8546              Otherwise we want
8547                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8548                nop
8549                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
8550                <op>     $treg,0($tempreg)
8551              If there is a base register, we add it to $tempreg before
8552              the <op>.  If there is a constant, we stick it in the
8553              <op> instruction.  We don't handle constants larger than
8554              16 bits, because we have no way to load the upper 16 bits
8555              (actually, we could handle them for the subset of cases
8556              in which we are not using $at).  */
8557           gas_assert (offset_expr.X_op == O_symbol);
8558           expr1.X_add_number = offset_expr.X_add_number;
8559           offset_expr.X_add_number = 0;
8560           if (expr1.X_add_number < -0x8000
8561               || expr1.X_add_number >= 0x8000)
8562             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8563           gpdelay = reg_needs_delay (mips_gp_register);
8564           relax_start (offset_expr.X_add_symbol);
8565           macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8566                        BFD_RELOC_MIPS_GOT_HI16);
8567           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
8568                        mips_gp_register);
8569           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8570                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
8571           relax_switch ();
8572           if (gpdelay)
8573             macro_build (NULL, "nop", "");
8574           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8575                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
8576           load_delay_nop ();
8577           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
8578                        tempreg, BFD_RELOC_LO16);
8579           relax_end ();
8580
8581           if (breg != 0)
8582             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8583                          tempreg, tempreg, breg);
8584           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8585         }
8586       else if (mips_big_got && HAVE_NEWABI)
8587         {
8588           /* If this is a reference to an external symbol, we want
8589                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
8590                add      $tempreg,$tempreg,$gp
8591                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8592                <op>     $treg,<ofst>($tempreg)
8593              Otherwise, for local symbols, we want:
8594                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
8595                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
8596           gas_assert (offset_expr.X_op == O_symbol);
8597           expr1.X_add_number = offset_expr.X_add_number;
8598           offset_expr.X_add_number = 0;
8599           if (expr1.X_add_number < -0x8000
8600               || expr1.X_add_number >= 0x8000)
8601             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8602           relax_start (offset_expr.X_add_symbol);
8603           macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8604                        BFD_RELOC_MIPS_GOT_HI16);
8605           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
8606                        mips_gp_register);
8607           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8608                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
8609           if (breg != 0)
8610             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8611                          tempreg, tempreg, breg);
8612           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8613
8614           relax_switch ();
8615           offset_expr.X_add_number = expr1.X_add_number;
8616           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8617                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
8618           if (breg != 0)
8619             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8620                          tempreg, tempreg, breg);
8621           macro_build (&offset_expr, s, fmt, treg,
8622                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
8623           relax_end ();
8624         }
8625       else
8626         abort ();
8627
8628       break;
8629
8630     case M_LI:
8631     case M_LI_S:
8632       load_register (treg, &imm_expr, 0);
8633       break;
8634
8635     case M_DLI:
8636       load_register (treg, &imm_expr, 1);
8637       break;
8638
8639     case M_LI_SS:
8640       if (imm_expr.X_op == O_constant)
8641         {
8642           used_at = 1;
8643           load_register (AT, &imm_expr, 0);
8644           macro_build (NULL, "mtc1", "t,G", AT, treg);
8645           break;
8646         }
8647       else
8648         {
8649           gas_assert (offset_expr.X_op == O_symbol
8650                       && strcmp (segment_name (S_GET_SEGMENT
8651                                                (offset_expr.X_add_symbol)),
8652                                  ".lit4") == 0
8653                       && offset_expr.X_add_number == 0);
8654           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
8655                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8656           break;
8657         }
8658
8659     case M_LI_D:
8660       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
8661          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
8662          order 32 bits of the value and the low order 32 bits are either
8663          zero or in OFFSET_EXPR.  */
8664       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
8665         {
8666           if (HAVE_64BIT_GPRS)
8667             load_register (treg, &imm_expr, 1);
8668           else
8669             {
8670               int hreg, lreg;
8671
8672               if (target_big_endian)
8673                 {
8674                   hreg = treg;
8675                   lreg = treg + 1;
8676                 }
8677               else
8678                 {
8679                   hreg = treg + 1;
8680                   lreg = treg;
8681                 }
8682
8683               if (hreg <= 31)
8684                 load_register (hreg, &imm_expr, 0);
8685               if (lreg <= 31)
8686                 {
8687                   if (offset_expr.X_op == O_absent)
8688                     move_register (lreg, 0);
8689                   else
8690                     {
8691                       gas_assert (offset_expr.X_op == O_constant);
8692                       load_register (lreg, &offset_expr, 0);
8693                     }
8694                 }
8695             }
8696           break;
8697         }
8698
8699       /* We know that sym is in the .rdata section.  First we get the
8700          upper 16 bits of the address.  */
8701       if (mips_pic == NO_PIC)
8702         {
8703           macro_build_lui (&offset_expr, AT);
8704           used_at = 1;
8705         }
8706       else
8707         {
8708           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
8709                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
8710           used_at = 1;
8711         }
8712
8713       /* Now we load the register(s).  */
8714       if (HAVE_64BIT_GPRS)
8715         {
8716           used_at = 1;
8717           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8718         }
8719       else
8720         {
8721           used_at = 1;
8722           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8723           if (treg != RA)
8724             {
8725               /* FIXME: How in the world do we deal with the possible
8726                  overflow here?  */
8727               offset_expr.X_add_number += 4;
8728               macro_build (&offset_expr, "lw", "t,o(b)",
8729                            treg + 1, BFD_RELOC_LO16, AT);
8730             }
8731         }
8732       break;
8733
8734     case M_LI_DD:
8735       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
8736          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
8737          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
8738          the value and the low order 32 bits are either zero or in
8739          OFFSET_EXPR.  */
8740       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
8741         {
8742           used_at = 1;
8743           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
8744           if (HAVE_64BIT_FPRS)
8745             {
8746               gas_assert (HAVE_64BIT_GPRS);
8747               macro_build (NULL, "dmtc1", "t,S", AT, treg);
8748             }
8749           else
8750             {
8751               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
8752               if (offset_expr.X_op == O_absent)
8753                 macro_build (NULL, "mtc1", "t,G", 0, treg);
8754               else
8755                 {
8756                   gas_assert (offset_expr.X_op == O_constant);
8757                   load_register (AT, &offset_expr, 0);
8758                   macro_build (NULL, "mtc1", "t,G", AT, treg);
8759                 }
8760             }
8761           break;
8762         }
8763
8764       gas_assert (offset_expr.X_op == O_symbol
8765                   && offset_expr.X_add_number == 0);
8766       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
8767       if (strcmp (s, ".lit8") == 0)
8768         {
8769           if (mips_opts.isa != ISA_MIPS1 || mips_opts.micromips)
8770             {
8771               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
8772                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8773               break;
8774             }
8775           breg = mips_gp_register;
8776           r = BFD_RELOC_MIPS_LITERAL;
8777           goto dob;
8778         }
8779       else
8780         {
8781           gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
8782           used_at = 1;
8783           if (mips_pic != NO_PIC)
8784             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
8785                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
8786           else
8787             {
8788               /* FIXME: This won't work for a 64 bit address.  */
8789               macro_build_lui (&offset_expr, AT);
8790             }
8791
8792           if (mips_opts.isa != ISA_MIPS1 || mips_opts.micromips)
8793             {
8794               macro_build (&offset_expr, "ldc1", "T,o(b)",
8795                            treg, BFD_RELOC_LO16, AT);
8796               break;
8797             }
8798           breg = AT;
8799           r = BFD_RELOC_LO16;
8800           goto dob;
8801         }
8802
8803     case M_L_DOB:
8804       /* Even on a big endian machine $fn comes before $fn+1.  We have
8805          to adjust when loading from memory.  */
8806       r = BFD_RELOC_LO16;
8807     dob:
8808       gas_assert (!mips_opts.micromips);
8809       gas_assert (mips_opts.isa == ISA_MIPS1);
8810       macro_build (&offset_expr, "lwc1", "T,o(b)",
8811                    target_big_endian ? treg + 1 : treg, r, breg);
8812       /* FIXME: A possible overflow which I don't know how to deal
8813          with.  */
8814       offset_expr.X_add_number += 4;
8815       macro_build (&offset_expr, "lwc1", "T,o(b)",
8816                    target_big_endian ? treg : treg + 1, r, breg);
8817       break;
8818
8819     case M_S_DOB:
8820       gas_assert (!mips_opts.micromips);
8821       gas_assert (mips_opts.isa == ISA_MIPS1);
8822       /* Even on a big endian machine $fn comes before $fn+1.  We have
8823          to adjust when storing to memory.  */
8824       macro_build (&offset_expr, "swc1", "T,o(b)",
8825                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
8826       offset_expr.X_add_number += 4;
8827       macro_build (&offset_expr, "swc1", "T,o(b)",
8828                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
8829       break;
8830
8831     case M_L_DAB:
8832       gas_assert (!mips_opts.micromips);
8833       /*
8834        * The MIPS assembler seems to check for X_add_number not
8835        * being double aligned and generating:
8836        *        lui     at,%hi(foo+1)
8837        *        addu    at,at,v1
8838        *        addiu   at,at,%lo(foo+1)
8839        *        lwc1    f2,0(at)
8840        *        lwc1    f3,4(at)
8841        * But, the resulting address is the same after relocation so why
8842        * generate the extra instruction?
8843        */
8844       /* Itbl support may require additional care here.  */
8845       coproc = 1;
8846       fmt = "T,o(b)";
8847       if (mips_opts.isa != ISA_MIPS1)
8848         {
8849           s = "ldc1";
8850           goto ld_st;
8851         }
8852       s = "lwc1";
8853       goto ldd_std;
8854
8855     case M_S_DAB:
8856       gas_assert (!mips_opts.micromips);
8857       /* Itbl support may require additional care here.  */
8858       coproc = 1;
8859       fmt = "T,o(b)";
8860       if (mips_opts.isa != ISA_MIPS1)
8861         {
8862           s = "sdc1";
8863           goto ld_st;
8864         }
8865       s = "swc1";
8866       goto ldd_std;
8867
8868     case M_LD_AB:
8869       fmt = "t,o(b)";
8870       if (HAVE_64BIT_GPRS)
8871         {
8872           s = "ld";
8873           goto ld;
8874         }
8875       s = "lw";
8876       goto ldd_std;
8877
8878     case M_SD_AB:
8879       fmt = "t,o(b)";
8880       if (HAVE_64BIT_GPRS)
8881         {
8882           s = "sd";
8883           goto ld_st;
8884         }
8885       s = "sw";
8886
8887     ldd_std:
8888       if (offset_expr.X_op != O_symbol
8889           && offset_expr.X_op != O_constant)
8890         {
8891           as_bad (_("Expression too complex"));
8892           offset_expr.X_op = O_constant;
8893         }
8894
8895       if (HAVE_32BIT_ADDRESSES
8896           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
8897         {
8898           char value [32];
8899
8900           sprintf_vma (value, offset_expr.X_add_number);
8901           as_bad (_("Number (0x%s) larger than 32 bits"), value);
8902         }
8903
8904       /* Even on a big endian machine $fn comes before $fn+1.  We have
8905          to adjust when loading from memory.  We set coproc if we must
8906          load $fn+1 first.  */
8907       /* Itbl support may require additional care here.  */
8908       if (!target_big_endian)
8909         coproc = 0;
8910
8911       if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
8912         {
8913           /* If this is a reference to a GP relative symbol, we want
8914                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
8915                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
8916              If we have a base register, we use this
8917                addu     $at,$breg,$gp
8918                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
8919                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
8920              If this is not a GP relative symbol, we want
8921                lui      $at,<sym>               (BFD_RELOC_HI16_S)
8922                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
8923                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
8924              If there is a base register, we add it to $at after the
8925              lui instruction.  If there is a constant, we always use
8926              the last case.  */
8927           if (offset_expr.X_op == O_symbol
8928               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8929               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8930             {
8931               relax_start (offset_expr.X_add_symbol);
8932               if (breg == 0)
8933                 {
8934                   tempreg = mips_gp_register;
8935                 }
8936               else
8937                 {
8938                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8939                                AT, breg, mips_gp_register);
8940                   tempreg = AT;
8941                   used_at = 1;
8942                 }
8943
8944               /* Itbl support may require additional care here.  */
8945               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
8946                            BFD_RELOC_GPREL16, tempreg);
8947               offset_expr.X_add_number += 4;
8948
8949               /* Set mips_optimize to 2 to avoid inserting an
8950                  undesired nop.  */
8951               hold_mips_optimize = mips_optimize;
8952               mips_optimize = 2;
8953               /* Itbl support may require additional care here.  */
8954               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
8955                            BFD_RELOC_GPREL16, tempreg);
8956               mips_optimize = hold_mips_optimize;
8957
8958               relax_switch ();
8959
8960               offset_expr.X_add_number -= 4;
8961             }
8962           used_at = 1;
8963           macro_build_lui (&offset_expr, AT);
8964           if (breg != 0)
8965             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
8966           /* Itbl support may require additional care here.  */
8967           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
8968                        BFD_RELOC_LO16, AT);
8969           /* FIXME: How do we handle overflow here?  */
8970           offset_expr.X_add_number += 4;
8971           /* Itbl support may require additional care here.  */
8972           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
8973                        BFD_RELOC_LO16, AT);
8974           if (mips_relax.sequence)
8975             relax_end ();
8976         }
8977       else if (!mips_big_got)
8978         {
8979           /* If this is a reference to an external symbol, we want
8980                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
8981                nop
8982                <op>     $treg,0($at)
8983                <op>     $treg+1,4($at)
8984              Otherwise we want
8985                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
8986                nop
8987                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
8988                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
8989              If there is a base register we add it to $at before the
8990              lwc1 instructions.  If there is a constant we include it
8991              in the lwc1 instructions.  */
8992           used_at = 1;
8993           expr1.X_add_number = offset_expr.X_add_number;
8994           if (expr1.X_add_number < -0x8000
8995               || expr1.X_add_number >= 0x8000 - 4)
8996             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8997           load_got_offset (AT, &offset_expr);
8998           load_delay_nop ();
8999           if (breg != 0)
9000             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9001
9002           /* Set mips_optimize to 2 to avoid inserting an undesired
9003              nop.  */
9004           hold_mips_optimize = mips_optimize;
9005           mips_optimize = 2;
9006
9007           /* Itbl support may require additional care here.  */
9008           relax_start (offset_expr.X_add_symbol);
9009           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9010                        BFD_RELOC_LO16, AT);
9011           expr1.X_add_number += 4;
9012           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9013                        BFD_RELOC_LO16, AT);
9014           relax_switch ();
9015           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9016                        BFD_RELOC_LO16, AT);
9017           offset_expr.X_add_number += 4;
9018           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9019                        BFD_RELOC_LO16, AT);
9020           relax_end ();
9021
9022           mips_optimize = hold_mips_optimize;
9023         }
9024       else if (mips_big_got)
9025         {
9026           int gpdelay;
9027
9028           /* If this is a reference to an external symbol, we want
9029                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
9030                addu     $at,$at,$gp
9031                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
9032                nop
9033                <op>     $treg,0($at)
9034                <op>     $treg+1,4($at)
9035              Otherwise we want
9036                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
9037                nop
9038                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
9039                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
9040              If there is a base register we add it to $at before the
9041              lwc1 instructions.  If there is a constant we include it
9042              in the lwc1 instructions.  */
9043           used_at = 1;
9044           expr1.X_add_number = offset_expr.X_add_number;
9045           offset_expr.X_add_number = 0;
9046           if (expr1.X_add_number < -0x8000
9047               || expr1.X_add_number >= 0x8000 - 4)
9048             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9049           gpdelay = reg_needs_delay (mips_gp_register);
9050           relax_start (offset_expr.X_add_symbol);
9051           macro_build (&offset_expr, "lui", LUI_FMT,
9052                        AT, BFD_RELOC_MIPS_GOT_HI16);
9053           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9054                        AT, AT, mips_gp_register);
9055           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
9056                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
9057           load_delay_nop ();
9058           if (breg != 0)
9059             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9060           /* Itbl support may require additional care here.  */
9061           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9062                        BFD_RELOC_LO16, AT);
9063           expr1.X_add_number += 4;
9064
9065           /* Set mips_optimize to 2 to avoid inserting an undesired
9066              nop.  */
9067           hold_mips_optimize = mips_optimize;
9068           mips_optimize = 2;
9069           /* Itbl support may require additional care here.  */
9070           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9071                        BFD_RELOC_LO16, AT);
9072           mips_optimize = hold_mips_optimize;
9073           expr1.X_add_number -= 4;
9074
9075           relax_switch ();
9076           offset_expr.X_add_number = expr1.X_add_number;
9077           if (gpdelay)
9078             macro_build (NULL, "nop", "");
9079           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9080                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
9081           load_delay_nop ();
9082           if (breg != 0)
9083             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9084           /* Itbl support may require additional care here.  */
9085           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9086                        BFD_RELOC_LO16, AT);
9087           offset_expr.X_add_number += 4;
9088
9089           /* Set mips_optimize to 2 to avoid inserting an undesired
9090              nop.  */
9091           hold_mips_optimize = mips_optimize;
9092           mips_optimize = 2;
9093           /* Itbl support may require additional care here.  */
9094           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9095                        BFD_RELOC_LO16, AT);
9096           mips_optimize = hold_mips_optimize;
9097           relax_end ();
9098         }
9099       else
9100         abort ();
9101
9102       break;
9103
9104     case M_LD_OB:
9105       s = HAVE_64BIT_GPRS ? "ld" : "lw";
9106       goto sd_ob;
9107     case M_SD_OB:
9108       s = HAVE_64BIT_GPRS ? "sd" : "sw";
9109     sd_ob:
9110       macro_build (&offset_expr, s, "t,o(b)", treg,
9111                    -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9112                    breg);
9113       if (!HAVE_64BIT_GPRS)
9114         {
9115           offset_expr.X_add_number += 4;
9116           macro_build (&offset_expr, s, "t,o(b)", treg + 1,
9117                        -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9118                        breg);
9119         }
9120       break;
9121
9122    /* New code added to support COPZ instructions.
9123       This code builds table entries out of the macros in mip_opcodes.
9124       R4000 uses interlocks to handle coproc delays.
9125       Other chips (like the R3000) require nops to be inserted for delays.
9126
9127       FIXME: Currently, we require that the user handle delays.
9128       In order to fill delay slots for non-interlocked chips,
9129       we must have a way to specify delays based on the coprocessor.
9130       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
9131       What are the side-effects of the cop instruction?
9132       What cache support might we have and what are its effects?
9133       Both coprocessor & memory require delays. how long???
9134       What registers are read/set/modified?
9135
9136       If an itbl is provided to interpret cop instructions,
9137       this knowledge can be encoded in the itbl spec.  */
9138
9139     case M_COP0:
9140       s = "c0";
9141       goto copz;
9142     case M_COP1:
9143       s = "c1";
9144       goto copz;
9145     case M_COP2:
9146       s = "c2";
9147       goto copz;
9148     case M_COP3:
9149       s = "c3";
9150     copz:
9151       gas_assert (!mips_opts.micromips);
9152       if (NO_ISA_COP (mips_opts.arch)
9153           && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
9154         {
9155           as_bad (_("opcode not supported on this processor: %s"),
9156                   mips_cpu_info_from_arch (mips_opts.arch)->name);
9157           break;
9158         }
9159
9160       /* For now we just do C (same as Cz).  The parameter will be
9161          stored in insn_opcode by mips_ip.  */
9162       macro_build (NULL, s, "C", ip->insn_opcode);
9163       break;
9164
9165     case M_MOVE:
9166       move_register (dreg, sreg);
9167       break;
9168
9169     case M_DMUL:
9170       dbl = 1;
9171     case M_MUL:
9172       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
9173       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9174       break;
9175
9176     case M_DMUL_I:
9177       dbl = 1;
9178     case M_MUL_I:
9179       /* The MIPS assembler some times generates shifts and adds.  I'm
9180          not trying to be that fancy. GCC should do this for us
9181          anyway.  */
9182       used_at = 1;
9183       load_register (AT, &imm_expr, dbl);
9184       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
9185       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9186       break;
9187
9188     case M_DMULO_I:
9189       dbl = 1;
9190     case M_MULO_I:
9191       imm = 1;
9192       goto do_mulo;
9193
9194     case M_DMULO:
9195       dbl = 1;
9196     case M_MULO:
9197     do_mulo:
9198       start_noreorder ();
9199       used_at = 1;
9200       if (imm)
9201         load_register (AT, &imm_expr, dbl);
9202       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
9203       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9204       macro_build (NULL, dbl ? "dsra32" : "sra", SHFT_FMT, dreg, dreg, RA);
9205       macro_build (NULL, "mfhi", MFHL_FMT, AT);
9206       if (mips_trap)
9207         macro_build (NULL, "tne", TRAP_FMT, dreg, AT, 6);
9208       else
9209         {
9210           if (mips_opts.micromips)
9211             micromips_label_expr (&label_expr);
9212           else
9213             label_expr.X_add_number = 8;
9214           macro_build (&label_expr, "beq", "s,t,p", dreg, AT);
9215           macro_build (NULL, "nop", "");
9216           macro_build (NULL, "break", BRK_FMT, 6);
9217           if (mips_opts.micromips)
9218             micromips_add_label ();
9219         }
9220       end_noreorder ();
9221       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9222       break;
9223
9224     case M_DMULOU_I:
9225       dbl = 1;
9226     case M_MULOU_I:
9227       imm = 1;
9228       goto do_mulou;
9229
9230     case M_DMULOU:
9231       dbl = 1;
9232     case M_MULOU:
9233     do_mulou:
9234       start_noreorder ();
9235       used_at = 1;
9236       if (imm)
9237         load_register (AT, &imm_expr, dbl);
9238       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
9239                    sreg, imm ? AT : treg);
9240       macro_build (NULL, "mfhi", MFHL_FMT, AT);
9241       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9242       if (mips_trap)
9243         macro_build (NULL, "tne", TRAP_FMT, AT, ZERO, 6);
9244       else
9245         {
9246           if (mips_opts.micromips)
9247             micromips_label_expr (&label_expr);
9248           else
9249             label_expr.X_add_number = 8;
9250           macro_build (&label_expr, "beq", "s,t,p", AT, ZERO);
9251           macro_build (NULL, "nop", "");
9252           macro_build (NULL, "break", BRK_FMT, 6);
9253           if (mips_opts.micromips)
9254             micromips_add_label ();
9255         }
9256       end_noreorder ();
9257       break;
9258
9259     case M_DROL:
9260       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9261         {
9262           if (dreg == sreg)
9263             {
9264               tempreg = AT;
9265               used_at = 1;
9266             }
9267           else
9268             {
9269               tempreg = dreg;
9270             }
9271           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
9272           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
9273           break;
9274         }
9275       used_at = 1;
9276       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9277       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
9278       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
9279       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9280       break;
9281
9282     case M_ROL:
9283       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9284         {
9285           if (dreg == sreg)
9286             {
9287               tempreg = AT;
9288               used_at = 1;
9289             }
9290           else
9291             {
9292               tempreg = dreg;
9293             }
9294           macro_build (NULL, "negu", "d,w", tempreg, treg);
9295           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
9296           break;
9297         }
9298       used_at = 1;
9299       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
9300       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
9301       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
9302       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9303       break;
9304
9305     case M_DROL_I:
9306       {
9307         unsigned int rot;
9308         char *l;
9309         char *rr;
9310
9311         if (imm_expr.X_op != O_constant)
9312           as_bad (_("Improper rotate count"));
9313         rot = imm_expr.X_add_number & 0x3f;
9314         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9315           {
9316             rot = (64 - rot) & 0x3f;
9317             if (rot >= 32)
9318               macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
9319             else
9320               macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
9321             break;
9322           }
9323         if (rot == 0)
9324           {
9325             macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
9326             break;
9327           }
9328         l = (rot < 0x20) ? "dsll" : "dsll32";
9329         rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
9330         rot &= 0x1f;
9331         used_at = 1;
9332         macro_build (NULL, l, SHFT_FMT, AT, sreg, rot);
9333         macro_build (NULL, rr, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9334         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9335       }
9336       break;
9337
9338     case M_ROL_I:
9339       {
9340         unsigned int rot;
9341
9342         if (imm_expr.X_op != O_constant)
9343           as_bad (_("Improper rotate count"));
9344         rot = imm_expr.X_add_number & 0x1f;
9345         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9346           {
9347             macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, (32 - rot) & 0x1f);
9348             break;
9349           }
9350         if (rot == 0)
9351           {
9352             macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
9353             break;
9354           }
9355         used_at = 1;
9356         macro_build (NULL, "sll", SHFT_FMT, AT, sreg, rot);
9357         macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9358         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9359       }
9360       break;
9361
9362     case M_DROR:
9363       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9364         {
9365           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
9366           break;
9367         }
9368       used_at = 1;
9369       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9370       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
9371       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
9372       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9373       break;
9374
9375     case M_ROR:
9376       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9377         {
9378           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
9379           break;
9380         }
9381       used_at = 1;
9382       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
9383       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
9384       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
9385       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9386       break;
9387
9388     case M_DROR_I:
9389       {
9390         unsigned int rot;
9391         char *l;
9392         char *rr;
9393
9394         if (imm_expr.X_op != O_constant)
9395           as_bad (_("Improper rotate count"));
9396         rot = imm_expr.X_add_number & 0x3f;
9397         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9398           {
9399             if (rot >= 32)
9400               macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
9401             else
9402               macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
9403             break;
9404           }
9405         if (rot == 0)
9406           {
9407             macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
9408             break;
9409           }
9410         rr = (rot < 0x20) ? "dsrl" : "dsrl32";
9411         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
9412         rot &= 0x1f;
9413         used_at = 1;
9414         macro_build (NULL, rr, SHFT_FMT, AT, sreg, rot);
9415         macro_build (NULL, l, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9416         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9417       }
9418       break;
9419
9420     case M_ROR_I:
9421       {
9422         unsigned int rot;
9423
9424         if (imm_expr.X_op != O_constant)
9425           as_bad (_("Improper rotate count"));
9426         rot = imm_expr.X_add_number & 0x1f;
9427         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9428           {
9429             macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, rot);
9430             break;
9431           }
9432         if (rot == 0)
9433           {
9434             macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
9435             break;
9436           }
9437         used_at = 1;
9438         macro_build (NULL, "srl", SHFT_FMT, AT, sreg, rot);
9439         macro_build (NULL, "sll", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9440         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9441       }
9442       break;
9443
9444     case M_SEQ:
9445       if (sreg == 0)
9446         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
9447       else if (treg == 0)
9448         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9449       else
9450         {
9451           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
9452           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
9453         }
9454       break;
9455
9456     case M_SEQ_I:
9457       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
9458         {
9459           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9460           break;
9461         }
9462       if (sreg == 0)
9463         {
9464           as_warn (_("Instruction %s: result is always false"),
9465                    ip->insn_mo->name);
9466           move_register (dreg, 0);
9467           break;
9468         }
9469       if (CPU_HAS_SEQ (mips_opts.arch)
9470           && -512 <= imm_expr.X_add_number
9471           && imm_expr.X_add_number < 512)
9472         {
9473           macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
9474                        (int) imm_expr.X_add_number);
9475           break;
9476         }
9477       if (imm_expr.X_op == O_constant
9478           && imm_expr.X_add_number >= 0
9479           && imm_expr.X_add_number < 0x10000)
9480         {
9481           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
9482         }
9483       else if (imm_expr.X_op == O_constant
9484                && imm_expr.X_add_number > -0x8000
9485                && imm_expr.X_add_number < 0)
9486         {
9487           imm_expr.X_add_number = -imm_expr.X_add_number;
9488           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
9489                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9490         }
9491       else if (CPU_HAS_SEQ (mips_opts.arch))
9492         {
9493           used_at = 1;
9494           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9495           macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
9496           break;
9497         }
9498       else
9499         {
9500           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9501           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
9502           used_at = 1;
9503         }
9504       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
9505       break;
9506
9507     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
9508       s = "slt";
9509       goto sge;
9510     case M_SGEU:
9511       s = "sltu";
9512     sge:
9513       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
9514       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9515       break;
9516
9517     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
9518     case M_SGEU_I:
9519       if (imm_expr.X_op == O_constant
9520           && imm_expr.X_add_number >= -0x8000
9521           && imm_expr.X_add_number < 0x8000)
9522         {
9523           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
9524                        dreg, sreg, BFD_RELOC_LO16);
9525         }
9526       else
9527         {
9528           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9529           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
9530                        dreg, sreg, AT);
9531           used_at = 1;
9532         }
9533       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9534       break;
9535
9536     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
9537       s = "slt";
9538       goto sgt;
9539     case M_SGTU:
9540       s = "sltu";
9541     sgt:
9542       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
9543       break;
9544
9545     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
9546       s = "slt";
9547       goto sgti;
9548     case M_SGTU_I:
9549       s = "sltu";
9550     sgti:
9551       used_at = 1;
9552       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9553       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
9554       break;
9555
9556     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
9557       s = "slt";
9558       goto sle;
9559     case M_SLEU:
9560       s = "sltu";
9561     sle:
9562       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
9563       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9564       break;
9565
9566     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
9567       s = "slt";
9568       goto slei;
9569     case M_SLEU_I:
9570       s = "sltu";
9571     slei:
9572       used_at = 1;
9573       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9574       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
9575       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9576       break;
9577
9578     case M_SLT_I:
9579       if (imm_expr.X_op == O_constant
9580           && imm_expr.X_add_number >= -0x8000
9581           && imm_expr.X_add_number < 0x8000)
9582         {
9583           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9584           break;
9585         }
9586       used_at = 1;
9587       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9588       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
9589       break;
9590
9591     case M_SLTU_I:
9592       if (imm_expr.X_op == O_constant
9593           && imm_expr.X_add_number >= -0x8000
9594           && imm_expr.X_add_number < 0x8000)
9595         {
9596           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
9597                        BFD_RELOC_LO16);
9598           break;
9599         }
9600       used_at = 1;
9601       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9602       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
9603       break;
9604
9605     case M_SNE:
9606       if (sreg == 0)
9607         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
9608       else if (treg == 0)
9609         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
9610       else
9611         {
9612           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
9613           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
9614         }
9615       break;
9616
9617     case M_SNE_I:
9618       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
9619         {
9620           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
9621           break;
9622         }
9623       if (sreg == 0)
9624         {
9625           as_warn (_("Instruction %s: result is always true"),
9626                    ip->insn_mo->name);
9627           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
9628                        dreg, 0, BFD_RELOC_LO16);
9629           break;
9630         }
9631       if (CPU_HAS_SEQ (mips_opts.arch)
9632           && -512 <= imm_expr.X_add_number
9633           && imm_expr.X_add_number < 512)
9634         {
9635           macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
9636                        (int) imm_expr.X_add_number);
9637           break;
9638         }
9639       if (imm_expr.X_op == O_constant
9640           && imm_expr.X_add_number >= 0
9641           && imm_expr.X_add_number < 0x10000)
9642         {
9643           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
9644         }
9645       else if (imm_expr.X_op == O_constant
9646                && imm_expr.X_add_number > -0x8000
9647                && imm_expr.X_add_number < 0)
9648         {
9649           imm_expr.X_add_number = -imm_expr.X_add_number;
9650           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
9651                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9652         }
9653       else if (CPU_HAS_SEQ (mips_opts.arch))
9654         {
9655           used_at = 1;
9656           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9657           macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
9658           break;
9659         }
9660       else
9661         {
9662           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9663           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
9664           used_at = 1;
9665         }
9666       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
9667       break;
9668
9669     case M_SUB_I:
9670       s = "addi";
9671       s2 = "sub";
9672       goto do_subi;
9673     case M_SUBU_I:
9674       s = "addiu";
9675       s2 = "subu";
9676       goto do_subi;
9677     case M_DSUB_I:
9678       dbl = 1;
9679       s = "daddi";
9680       s2 = "dsub";
9681       if (!mips_opts.micromips)
9682         goto do_subi;
9683       if (imm_expr.X_op == O_constant
9684           && imm_expr.X_add_number > -0x200
9685           && imm_expr.X_add_number <= 0x200)
9686         {
9687           macro_build (NULL, s, "t,r,.", dreg, sreg, -imm_expr.X_add_number);
9688           break;
9689         }
9690       goto do_subi_i;
9691     case M_DSUBU_I:
9692       dbl = 1;
9693       s = "daddiu";
9694       s2 = "dsubu";
9695     do_subi:
9696       if (imm_expr.X_op == O_constant
9697           && imm_expr.X_add_number > -0x8000
9698           && imm_expr.X_add_number <= 0x8000)
9699         {
9700           imm_expr.X_add_number = -imm_expr.X_add_number;
9701           macro_build (&imm_expr, s, "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9702           break;
9703         }
9704     do_subi_i:
9705       used_at = 1;
9706       load_register (AT, &imm_expr, dbl);
9707       macro_build (NULL, s2, "d,v,t", dreg, sreg, AT);
9708       break;
9709
9710     case M_TEQ_I:
9711       s = "teq";
9712       goto trap;
9713     case M_TGE_I:
9714       s = "tge";
9715       goto trap;
9716     case M_TGEU_I:
9717       s = "tgeu";
9718       goto trap;
9719     case M_TLT_I:
9720       s = "tlt";
9721       goto trap;
9722     case M_TLTU_I:
9723       s = "tltu";
9724       goto trap;
9725     case M_TNE_I:
9726       s = "tne";
9727     trap:
9728       used_at = 1;
9729       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9730       macro_build (NULL, s, "s,t", sreg, AT);
9731       break;
9732
9733     case M_TRUNCWS:
9734     case M_TRUNCWD:
9735       gas_assert (!mips_opts.micromips);
9736       gas_assert (mips_opts.isa == ISA_MIPS1);
9737       used_at = 1;
9738       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
9739       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
9740
9741       /*
9742        * Is the double cfc1 instruction a bug in the mips assembler;
9743        * or is there a reason for it?
9744        */
9745       start_noreorder ();
9746       macro_build (NULL, "cfc1", "t,G", treg, RA);
9747       macro_build (NULL, "cfc1", "t,G", treg, RA);
9748       macro_build (NULL, "nop", "");
9749       expr1.X_add_number = 3;
9750       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
9751       expr1.X_add_number = 2;
9752       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
9753       macro_build (NULL, "ctc1", "t,G", AT, RA);
9754       macro_build (NULL, "nop", "");
9755       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
9756                    dreg, sreg);
9757       macro_build (NULL, "ctc1", "t,G", treg, RA);
9758       macro_build (NULL, "nop", "");
9759       end_noreorder ();
9760       break;
9761
9762     case M_ULH_A:
9763       ab = 1;
9764     case M_ULH:
9765       s = "lb";
9766       s2 = "lbu";
9767       off = 1;
9768       goto uld_st;
9769     case M_ULHU_A:
9770       ab = 1;
9771     case M_ULHU:
9772       s = "lbu";
9773       s2 = "lbu";
9774       off = 1;
9775       goto uld_st;
9776     case M_ULW_A:
9777       ab = 1;
9778     case M_ULW:
9779       s = "lwl";
9780       s2 = "lwr";
9781       off12 = mips_opts.micromips;
9782       off = 3;
9783       goto uld_st;
9784     case M_ULD_A:
9785       ab = 1;
9786     case M_ULD:
9787       s = "ldl";
9788       s2 = "ldr";
9789       off12 = mips_opts.micromips;
9790       off = 7;
9791       goto uld_st;
9792     case M_USH_A:
9793       ab = 1;
9794     case M_USH:
9795       s = "sb";
9796       s2 = "sb";
9797       off = 1;
9798       ust = 1;
9799       goto uld_st;
9800     case M_USW_A:
9801       ab = 1;
9802     case M_USW:
9803       s = "swl";
9804       s2 = "swr";
9805       off12 = mips_opts.micromips;
9806       off = 3;
9807       ust = 1;
9808       goto uld_st;
9809     case M_USD_A:
9810       ab = 1;
9811     case M_USD:
9812       s = "sdl";
9813       s2 = "sdr";
9814       off12 = mips_opts.micromips;
9815       off = 7;
9816       ust = 1;
9817
9818     uld_st:
9819       if (!ab && offset_expr.X_add_number >= 0x8000 - off)
9820         as_bad (_("Operand overflow"));
9821
9822       ep = &offset_expr;
9823       expr1.X_add_number = 0;
9824       if (ab)
9825         {
9826           used_at = 1;
9827           tempreg = AT;
9828           load_address (tempreg, ep, &used_at);
9829           if (breg != 0)
9830             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9831                          tempreg, tempreg, breg);
9832           breg = tempreg;
9833           tempreg = treg;
9834           ep = &expr1;
9835         }
9836       else if (off12
9837                && (offset_expr.X_op != O_constant
9838                    || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number)
9839                    || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number + off)))
9840         {
9841           used_at = 1;
9842           tempreg = AT;
9843           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", tempreg, breg,
9844                        -1, offset_reloc[0], offset_reloc[1], offset_reloc[2]);
9845           breg = tempreg;
9846           tempreg = treg;
9847           ep = &expr1;
9848         }
9849       else if (!ust && treg == breg)
9850         {
9851           used_at = 1;
9852           tempreg = AT;
9853         }
9854       else
9855         tempreg = treg;
9856
9857       if (off == 1)
9858         goto ulh_sh;
9859
9860       if (!target_big_endian)
9861         ep->X_add_number += off;
9862       if (!off12)
9863         macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
9864       else
9865         macro_build (NULL, s, "t,~(b)",
9866                      tempreg, (unsigned long) ep->X_add_number, breg);
9867
9868       if (!target_big_endian)
9869         ep->X_add_number -= off;
9870       else
9871         ep->X_add_number += off;
9872       if (!off12)
9873         macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
9874       else
9875         macro_build (NULL, s2, "t,~(b)",
9876                      tempreg, (unsigned long) ep->X_add_number, breg);
9877
9878       /* If necessary, move the result in tempreg to the final destination.  */
9879       if (!ust && treg != tempreg)
9880         {
9881           /* Protect second load's delay slot.  */
9882           load_delay_nop ();
9883           move_register (treg, tempreg);
9884         }
9885       break;
9886
9887     ulh_sh:
9888       used_at = 1;
9889       if (target_big_endian == ust)
9890         ep->X_add_number += off;
9891       tempreg = ust || ab ? treg : AT;
9892       macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
9893
9894       /* For halfword transfers we need a temporary register to shuffle
9895          bytes.  Unfortunately for M_USH_A we have none available before
9896          the next store as AT holds the base address.  We deal with this
9897          case by clobbering TREG and then restoring it as with ULH.  */
9898       tempreg = ust == ab ? treg : AT;
9899       if (ust)
9900         macro_build (NULL, "srl", SHFT_FMT, tempreg, treg, 8);
9901
9902       if (target_big_endian == ust)
9903         ep->X_add_number -= off;
9904       else
9905         ep->X_add_number += off;
9906       macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
9907
9908       /* For M_USH_A re-retrieve the LSB.  */
9909       if (ust && ab)
9910         {
9911           if (target_big_endian)
9912             ep->X_add_number += off;
9913           else
9914             ep->X_add_number -= off;
9915           macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
9916         }
9917       /* For ULH and M_USH_A OR the LSB in.  */
9918       if (!ust || ab)
9919         {
9920           tempreg = !ab ? AT : treg;
9921           macro_build (NULL, "sll", SHFT_FMT, tempreg, tempreg, 8);
9922           macro_build (NULL, "or", "d,v,t", treg, treg, AT);
9923         }
9924       break;
9925
9926     default:
9927       /* FIXME: Check if this is one of the itbl macros, since they
9928          are added dynamically.  */
9929       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
9930       break;
9931     }
9932   if (!mips_opts.at && used_at)
9933     as_bad (_("Macro used $at after \".set noat\""));
9934 }
9935
9936 /* Implement macros in mips16 mode.  */
9937
9938 static void
9939 mips16_macro (struct mips_cl_insn *ip)
9940 {
9941   int mask;
9942   int xreg, yreg, zreg, tmp;
9943   expressionS expr1;
9944   int dbl;
9945   const char *s, *s2, *s3;
9946
9947   mask = ip->insn_mo->mask;
9948
9949   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
9950   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
9951   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
9952
9953   expr1.X_op = O_constant;
9954   expr1.X_op_symbol = NULL;
9955   expr1.X_add_symbol = NULL;
9956   expr1.X_add_number = 1;
9957
9958   dbl = 0;
9959
9960   switch (mask)
9961     {
9962     default:
9963       internalError ();
9964
9965     case M_DDIV_3:
9966       dbl = 1;
9967     case M_DIV_3:
9968       s = "mflo";
9969       goto do_div3;
9970     case M_DREM_3:
9971       dbl = 1;
9972     case M_REM_3:
9973       s = "mfhi";
9974     do_div3:
9975       start_noreorder ();
9976       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
9977       expr1.X_add_number = 2;
9978       macro_build (&expr1, "bnez", "x,p", yreg);
9979       macro_build (NULL, "break", "6", 7);
9980
9981       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
9982          since that causes an overflow.  We should do that as well,
9983          but I don't see how to do the comparisons without a temporary
9984          register.  */
9985       end_noreorder ();
9986       macro_build (NULL, s, "x", zreg);
9987       break;
9988
9989     case M_DIVU_3:
9990       s = "divu";
9991       s2 = "mflo";
9992       goto do_divu3;
9993     case M_REMU_3:
9994       s = "divu";
9995       s2 = "mfhi";
9996       goto do_divu3;
9997     case M_DDIVU_3:
9998       s = "ddivu";
9999       s2 = "mflo";
10000       goto do_divu3;
10001     case M_DREMU_3:
10002       s = "ddivu";
10003       s2 = "mfhi";
10004     do_divu3:
10005       start_noreorder ();
10006       macro_build (NULL, s, "0,x,y", xreg, yreg);
10007       expr1.X_add_number = 2;
10008       macro_build (&expr1, "bnez", "x,p", yreg);
10009       macro_build (NULL, "break", "6", 7);
10010       end_noreorder ();
10011       macro_build (NULL, s2, "x", zreg);
10012       break;
10013
10014     case M_DMUL:
10015       dbl = 1;
10016     case M_MUL:
10017       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
10018       macro_build (NULL, "mflo", "x", zreg);
10019       break;
10020
10021     case M_DSUBU_I:
10022       dbl = 1;
10023       goto do_subu;
10024     case M_SUBU_I:
10025     do_subu:
10026       if (imm_expr.X_op != O_constant)
10027         as_bad (_("Unsupported large constant"));
10028       imm_expr.X_add_number = -imm_expr.X_add_number;
10029       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
10030       break;
10031
10032     case M_SUBU_I_2:
10033       if (imm_expr.X_op != O_constant)
10034         as_bad (_("Unsupported large constant"));
10035       imm_expr.X_add_number = -imm_expr.X_add_number;
10036       macro_build (&imm_expr, "addiu", "x,k", xreg);
10037       break;
10038
10039     case M_DSUBU_I_2:
10040       if (imm_expr.X_op != O_constant)
10041         as_bad (_("Unsupported large constant"));
10042       imm_expr.X_add_number = -imm_expr.X_add_number;
10043       macro_build (&imm_expr, "daddiu", "y,j", yreg);
10044       break;
10045
10046     case M_BEQ:
10047       s = "cmp";
10048       s2 = "bteqz";
10049       goto do_branch;
10050     case M_BNE:
10051       s = "cmp";
10052       s2 = "btnez";
10053       goto do_branch;
10054     case M_BLT:
10055       s = "slt";
10056       s2 = "btnez";
10057       goto do_branch;
10058     case M_BLTU:
10059       s = "sltu";
10060       s2 = "btnez";
10061       goto do_branch;
10062     case M_BLE:
10063       s = "slt";
10064       s2 = "bteqz";
10065       goto do_reverse_branch;
10066     case M_BLEU:
10067       s = "sltu";
10068       s2 = "bteqz";
10069       goto do_reverse_branch;
10070     case M_BGE:
10071       s = "slt";
10072       s2 = "bteqz";
10073       goto do_branch;
10074     case M_BGEU:
10075       s = "sltu";
10076       s2 = "bteqz";
10077       goto do_branch;
10078     case M_BGT:
10079       s = "slt";
10080       s2 = "btnez";
10081       goto do_reverse_branch;
10082     case M_BGTU:
10083       s = "sltu";
10084       s2 = "btnez";
10085
10086     do_reverse_branch:
10087       tmp = xreg;
10088       xreg = yreg;
10089       yreg = tmp;
10090
10091     do_branch:
10092       macro_build (NULL, s, "x,y", xreg, yreg);
10093       macro_build (&offset_expr, s2, "p");
10094       break;
10095
10096     case M_BEQ_I:
10097       s = "cmpi";
10098       s2 = "bteqz";
10099       s3 = "x,U";
10100       goto do_branch_i;
10101     case M_BNE_I:
10102       s = "cmpi";
10103       s2 = "btnez";
10104       s3 = "x,U";
10105       goto do_branch_i;
10106     case M_BLT_I:
10107       s = "slti";
10108       s2 = "btnez";
10109       s3 = "x,8";
10110       goto do_branch_i;
10111     case M_BLTU_I:
10112       s = "sltiu";
10113       s2 = "btnez";
10114       s3 = "x,8";
10115       goto do_branch_i;
10116     case M_BLE_I:
10117       s = "slti";
10118       s2 = "btnez";
10119       s3 = "x,8";
10120       goto do_addone_branch_i;
10121     case M_BLEU_I:
10122       s = "sltiu";
10123       s2 = "btnez";
10124       s3 = "x,8";
10125       goto do_addone_branch_i;
10126     case M_BGE_I:
10127       s = "slti";
10128       s2 = "bteqz";
10129       s3 = "x,8";
10130       goto do_branch_i;
10131     case M_BGEU_I:
10132       s = "sltiu";
10133       s2 = "bteqz";
10134       s3 = "x,8";
10135       goto do_branch_i;
10136     case M_BGT_I:
10137       s = "slti";
10138       s2 = "bteqz";
10139       s3 = "x,8";
10140       goto do_addone_branch_i;
10141     case M_BGTU_I:
10142       s = "sltiu";
10143       s2 = "bteqz";
10144       s3 = "x,8";
10145
10146     do_addone_branch_i:
10147       if (imm_expr.X_op != O_constant)
10148         as_bad (_("Unsupported large constant"));
10149       ++imm_expr.X_add_number;
10150
10151     do_branch_i:
10152       macro_build (&imm_expr, s, s3, xreg);
10153       macro_build (&offset_expr, s2, "p");
10154       break;
10155
10156     case M_ABS:
10157       expr1.X_add_number = 0;
10158       macro_build (&expr1, "slti", "x,8", yreg);
10159       if (xreg != yreg)
10160         move_register (xreg, yreg);
10161       expr1.X_add_number = 2;
10162       macro_build (&expr1, "bteqz", "p");
10163       macro_build (NULL, "neg", "x,w", xreg, xreg);
10164     }
10165 }
10166
10167 /* For consistency checking, verify that all bits are specified either
10168    by the match/mask part of the instruction definition, or by the
10169    operand list.  */
10170 static int
10171 validate_mips_insn (const struct mips_opcode *opc)
10172 {
10173   const char *p = opc->args;
10174   char c;
10175   unsigned long used_bits = opc->mask;
10176
10177   if ((used_bits & opc->match) != opc->match)
10178     {
10179       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
10180               opc->name, opc->args);
10181       return 0;
10182     }
10183 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
10184   while (*p)
10185     switch (c = *p++)
10186       {
10187       case ',': break;
10188       case '(': break;
10189       case ')': break;
10190       case '+':
10191         switch (c = *p++)
10192           {
10193           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
10194           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
10195           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
10196           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
10197           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
10198           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
10199           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10200           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
10201                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
10202           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
10203           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
10204           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10205           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10206           case 'I': break;
10207           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
10208           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
10209                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
10210           case 'x': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
10211           case 'X': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
10212           case 'p': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
10213           case 'P': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
10214           case 'Q': USE_BITS (OP_MASK_SEQI,     OP_SH_SEQI);    break;
10215           case 's': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
10216           case 'S': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
10217           case 'z': USE_BITS (OP_MASK_RZ,       OP_SH_RZ);      break;
10218           case 'Z': USE_BITS (OP_MASK_FZ,       OP_SH_FZ);      break;
10219           case 'a': USE_BITS (OP_MASK_OFFSET_A, OP_SH_OFFSET_A); break;
10220           case 'b': USE_BITS (OP_MASK_OFFSET_B, OP_SH_OFFSET_B); break;
10221           case 'c': USE_BITS (OP_MASK_OFFSET_C, OP_SH_OFFSET_C); break;
10222
10223           default:
10224             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
10225                     c, opc->name, opc->args);
10226             return 0;
10227           }
10228         break;
10229       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10230       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10231       case 'A': break;
10232       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
10233       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
10234       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
10235       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10236       case 'F': break;
10237       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10238       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
10239       case 'I': break;
10240       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
10241       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10242       case 'L': break;
10243       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
10244       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
10245       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
10246       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
10247                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10248       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
10249       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10250       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10251       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10252       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10253       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
10254       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10255       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10256       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
10257       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10258       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
10259       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10260       case 'f': break;
10261       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
10262       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
10263       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10264       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
10265       case 'l': break;
10266       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10267       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10268       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
10269       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10270       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10271       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10272       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
10273       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10274       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10275       case 'x': break;
10276       case 'z': break;
10277       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
10278       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
10279                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10280       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
10281       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
10282       case '[': break;
10283       case ']': break;
10284       case '1': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10285       case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
10286       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
10287       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
10288       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
10289       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10290       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
10291       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
10292       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
10293       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
10294       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
10295       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
10296       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
10297       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
10298       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
10299       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
10300       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
10301       case '\\': USE_BITS (OP_MASK_3BITPOS,     OP_SH_3BITPOS); break;
10302       case '~': USE_BITS (OP_MASK_OFFSET12,     OP_SH_OFFSET12); break;
10303       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10304       default:
10305         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
10306                 c, opc->name, opc->args);
10307         return 0;
10308       }
10309 #undef USE_BITS
10310   if (used_bits != 0xffffffff)
10311     {
10312       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
10313               ~used_bits & 0xffffffff, opc->name, opc->args);
10314       return 0;
10315     }
10316   return 1;
10317 }
10318
10319 /* For consistency checking, verify that the length implied matches the
10320    major opcode and that all bits are specified either by the match/mask
10321    part of the instruction definition, or by the operand list.  */
10322
10323 static int
10324 validate_micromips_insn (const struct mips_opcode *opc)
10325 {
10326   unsigned long match = opc->match;
10327   unsigned long mask = opc->mask;
10328   const char *p = opc->args;
10329   unsigned long insn_bits;
10330   unsigned long used_bits;
10331   unsigned long major;
10332   unsigned int length;
10333   char e;
10334   char c;
10335
10336   if ((mask & match) != match)
10337     {
10338       as_bad (_("Internal error: bad microMIPS opcode (mask error): %s %s"),
10339               opc->name, opc->args);
10340       return 0;
10341     }
10342   length = micromips_insn_length (opc);
10343   if (length != 2 && length != 4)
10344     {
10345       as_bad (_("Internal error: bad microMIPS opcode (incorrect length: %u): "
10346                 "%s %s"), length, opc->name, opc->args);
10347       return 0;
10348     }
10349   major = match >> (10 + 8 * (length - 2));
10350   if ((length == 2 && (major & 7) != 1 && (major & 6) != 2)
10351       || (length == 4 && (major & 7) != 0 && (major & 4) != 4))
10352     {
10353       as_bad (_("Internal error: bad microMIPS opcode "
10354                 "(opcode/length mismatch): %s %s"), opc->name, opc->args);
10355       return 0;
10356     }
10357
10358   /* Shift piecewise to avoid an overflow where unsigned long is 32-bit.  */
10359   insn_bits = 1 << 4 * length;
10360   insn_bits <<= 4 * length;
10361   insn_bits -= 1;
10362   used_bits = mask;
10363 #define USE_BITS(field) \
10364   (used_bits |= MICROMIPSOP_MASK_##field << MICROMIPSOP_SH_##field)
10365   while (*p)
10366     switch (c = *p++)
10367       {
10368       case ',': break;
10369       case '(': break;
10370       case ')': break;
10371       case '+':
10372         e = c;
10373         switch (c = *p++)
10374           {
10375           case 'A': USE_BITS (EXTLSB);  break;
10376           case 'B': USE_BITS (INSMSB);  break;
10377           case 'C': USE_BITS (EXTMSBD); break;
10378           case 'D': USE_BITS (RS);      USE_BITS (SEL); break;
10379           case 'E': USE_BITS (EXTLSB);  break;
10380           case 'F': USE_BITS (INSMSB);  break;
10381           case 'G': USE_BITS (EXTMSBD); break;
10382           case 'H': USE_BITS (EXTMSBD); break;
10383           default:
10384             as_bad (_("Internal error: bad mips opcode "
10385                       "(unknown extension operand type `%c%c'): %s %s"),
10386                     e, c, opc->name, opc->args);
10387             return 0;
10388           }
10389         break;
10390       case 'm':
10391         e = c;
10392         switch (c = *p++)
10393           {
10394           case 'A': USE_BITS (IMMA);    break;
10395           case 'B': USE_BITS (IMMB);    break;
10396           case 'C': USE_BITS (IMMC);    break;
10397           case 'D': USE_BITS (IMMD);    break;
10398           case 'E': USE_BITS (IMME);    break;
10399           case 'F': USE_BITS (IMMF);    break;
10400           case 'G': USE_BITS (IMMG);    break;
10401           case 'H': USE_BITS (IMMH);    break;
10402           case 'I': USE_BITS (IMMI);    break;
10403           case 'J': USE_BITS (IMMJ);    break;
10404           case 'L': USE_BITS (IMML);    break;
10405           case 'M': USE_BITS (IMMM);    break;
10406           case 'N': USE_BITS (IMMN);    break;
10407           case 'O': USE_BITS (IMMO);    break;
10408           case 'P': USE_BITS (IMMP);    break;
10409           case 'Q': USE_BITS (IMMQ);    break;
10410           case 'U': USE_BITS (IMMU);    break;
10411           case 'W': USE_BITS (IMMW);    break;
10412           case 'X': USE_BITS (IMMX);    break;
10413           case 'Y': USE_BITS (IMMY);    break;
10414           case 'Z': break;
10415           case 'a': break;
10416           case 'b': USE_BITS (MB);      break;
10417           case 'c': USE_BITS (MC);      break;
10418           case 'd': USE_BITS (MD);      break;
10419           case 'e': USE_BITS (ME);      break;
10420           case 'f': USE_BITS (MF);      break;
10421           case 'g': USE_BITS (MG);      break;
10422           case 'h': USE_BITS (MH);      break;
10423           case 'i': USE_BITS (MI);      break;
10424           case 'j': USE_BITS (MJ);      break;
10425           case 'l': USE_BITS (ML);      break;
10426           case 'm': USE_BITS (MM);      break;
10427           case 'n': USE_BITS (MN);      break;
10428           case 'p': USE_BITS (MP);      break;
10429           case 'q': USE_BITS (MQ);      break;
10430           case 'r': break;
10431           case 's': break;
10432           case 't': break;
10433           case 'x': break;
10434           case 'y': break;
10435           case 'z': break;
10436           default:
10437             as_bad (_("Internal error: bad mips opcode "
10438                       "(unknown extension operand type `%c%c'): %s %s"),
10439                     e, c, opc->name, opc->args);
10440             return 0;
10441           }
10442         break;
10443       case '.': USE_BITS (OFFSET10);    break;
10444       case '1': USE_BITS (STYPE);       break;
10445       case '<': USE_BITS (SHAMT);       break;
10446       case '>': USE_BITS (SHAMT);       break;
10447       case 'B': USE_BITS (CODE10);      break;
10448       case 'C': USE_BITS (COPZ);        break;
10449       case 'D': USE_BITS (FD);          break;
10450       case 'E': USE_BITS (RT);          break;
10451       case 'G': USE_BITS (RS);          break;
10452       case 'H': USE_BITS (SEL); break;
10453       case 'K': USE_BITS (RS);          break;
10454       case 'M': USE_BITS (CCC);         break;
10455       case 'N': USE_BITS (BCC);         break;
10456       case 'R': USE_BITS (FR);          break;
10457       case 'S': USE_BITS (FS);          break;
10458       case 'T': USE_BITS (FT);          break;
10459       case 'V': USE_BITS (FS);          break;
10460       case '\\': USE_BITS (3BITPOS);    break;
10461       case 'a': USE_BITS (TARGET);      break;
10462       case 'b': USE_BITS (RS);          break;
10463       case 'c': USE_BITS (CODE);        break;
10464       case 'd': USE_BITS (RD);          break;
10465       case 'h': USE_BITS (PREFX);       break;
10466       case 'i': USE_BITS (IMMEDIATE);   break;
10467       case 'j': USE_BITS (DELTA);       break;
10468       case 'k': USE_BITS (CACHE);       break;
10469       case 'n': USE_BITS (RT);          break;
10470       case 'o': USE_BITS (DELTA);       break;
10471       case 'p': USE_BITS (DELTA);       break;
10472       case 'q': USE_BITS (CODE2);       break;
10473       case 'r': USE_BITS (RS);          break;
10474       case 's': USE_BITS (RS);          break;
10475       case 't': USE_BITS (RT);          break;
10476       case 'u': USE_BITS (IMMEDIATE);   break;
10477       case 'v': USE_BITS (RS);          break;
10478       case 'w': USE_BITS (RT);          break;
10479       case 'y': USE_BITS (RS3);         break;
10480       case 'z': break;
10481       case '|': USE_BITS (TRAP);        break;
10482       case '~': USE_BITS (OFFSET12);    break;
10483       default:
10484         as_bad (_("Internal error: bad microMIPS opcode "
10485                   "(unknown operand type `%c'): %s %s"),
10486                 c, opc->name, opc->args);
10487         return 0;
10488       }
10489 #undef USE_BITS
10490   if (used_bits != insn_bits)
10491     {
10492       if (~used_bits & insn_bits)
10493         as_bad (_("Internal error: bad microMIPS opcode "
10494                   "(bits 0x%lx undefined): %s %s"),
10495                 ~used_bits & insn_bits, opc->name, opc->args);
10496       if (used_bits & ~insn_bits)
10497         as_bad (_("Internal error: bad microMIPS opcode "
10498                   "(bits 0x%lx defined): %s %s"),
10499                 used_bits & ~insn_bits, opc->name, opc->args);
10500       return 0;
10501     }
10502   return 1;
10503 }
10504
10505 /* UDI immediates.  */
10506 struct mips_immed {
10507   char          type;
10508   unsigned int  shift;
10509   unsigned long mask;
10510   const char *  desc;
10511 };
10512
10513 static const struct mips_immed mips_immed[] = {
10514   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
10515   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
10516   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
10517   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
10518   { 0,0,0,0 }
10519 };
10520
10521 /* Check whether an odd floating-point register is allowed.  */
10522 static int
10523 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
10524 {
10525   const char *s = insn->name;
10526
10527   if (insn->pinfo == INSN_MACRO)
10528     /* Let a macro pass, we'll catch it later when it is expanded.  */
10529     return 1;
10530
10531   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
10532     {
10533       /* Allow odd registers for single-precision ops.  */
10534       switch (insn->pinfo & (FP_S | FP_D))
10535         {
10536         case FP_S:
10537         case 0:
10538           return 1;     /* both single precision - ok */
10539         case FP_D:
10540           return 0;     /* both double precision - fail */
10541         default:
10542           break;
10543         }
10544
10545       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
10546       s = strchr (insn->name, '.');
10547       if (argnum == 2)
10548         s = s != NULL ? strchr (s + 1, '.') : NULL;
10549       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
10550     } 
10551
10552   /* Single-precision coprocessor loads and moves are OK too.  */
10553   if ((insn->pinfo & FP_S)
10554       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
10555                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
10556     return 1;
10557
10558   return 0;
10559 }
10560
10561 /* Check if EXPR is a constant between MIN (inclusive) and MAX (exclusive)
10562    taking bits from BIT up.  */
10563 static int
10564 expr_const_in_range (expressionS *ep, offsetT min, offsetT max, int bit)
10565 {
10566   return (ep->X_op == O_constant
10567           && (ep->X_add_number & ((1 << bit) - 1)) == 0
10568           && ep->X_add_number >= min << bit
10569           && ep->X_add_number < max << bit);
10570 }
10571
10572 /* This routine assembles an instruction into its binary format.  As a
10573    side effect, it sets one of the global variables imm_reloc or
10574    offset_reloc to the type of relocation to do if one of the operands
10575    is an address expression.  */
10576
10577 static void
10578 mips_ip (char *str, struct mips_cl_insn *ip)
10579 {
10580   bfd_boolean wrong_delay_slot_insns = FALSE;
10581   bfd_boolean need_delay_slot_ok = TRUE;
10582   struct mips_opcode *firstinsn = NULL;
10583   const struct mips_opcode *past;
10584   struct hash_control *hash;
10585   char *s;
10586   const char *args;
10587   char c = 0;
10588   struct mips_opcode *insn;
10589   char *argsStart;
10590   unsigned int regno;
10591   unsigned int lastregno;
10592   unsigned int destregno = 0;
10593   unsigned int lastpos = 0;
10594   unsigned int limlo, limhi;
10595   char *s_reset;
10596   offsetT min_range, max_range;
10597   long opend;
10598   char *name;
10599   int argnum;
10600   unsigned int rtype;
10601   char *dot;
10602   long end;
10603
10604   insn_error = NULL;
10605
10606   if (mips_opts.micromips)
10607     {
10608       hash = micromips_op_hash;
10609       past = &micromips_opcodes[bfd_micromips_num_opcodes];
10610     }
10611   else
10612     {
10613       hash = op_hash;
10614       past = &mips_opcodes[NUMOPCODES];
10615     }
10616   forced_insn_length = 0;
10617   insn = NULL;
10618
10619   /* We first try to match an instruction up to a space or to the end.  */
10620   for (end = 0; str[end] != '\0' && !ISSPACE (str[end]); end++)
10621     continue;
10622
10623   /* Make a copy of the instruction so that we can fiddle with it.  */
10624   name = alloca (end + 1);
10625   memcpy (name, str, end);
10626   name[end] = '\0';
10627
10628   for (;;)
10629     {
10630       insn = (struct mips_opcode *) hash_find (hash, name);
10631
10632       if (insn != NULL || !mips_opts.micromips)
10633         break;
10634       if (forced_insn_length)
10635         break;
10636
10637       /* See if there's an instruction size override suffix,
10638          either `16' or `32', at the end of the mnemonic proper,
10639          that defines the operation, i.e. before the first `.'
10640          character if any.  Strip it and retry.  */
10641       dot = strchr (name, '.');
10642       opend = dot != NULL ? dot - name : end;
10643       if (opend < 3)
10644         break;
10645       if (name[opend - 2] == '1' && name[opend - 1] == '6')
10646         forced_insn_length = 2;
10647       else if (name[opend - 2] == '3' && name[opend - 1] == '2')
10648         forced_insn_length = 4;
10649       else
10650         break;
10651       memcpy (name + opend - 2, name + opend, end - opend + 1);
10652     }
10653   if (insn == NULL)
10654     {
10655       insn_error = _("Unrecognized opcode");
10656       return;
10657     }
10658
10659   /* For microMIPS instructions placed in a fixed-length branch delay slot
10660      we make up to two passes over the relevant fragment of the opcode
10661      table.  First we try instructions that meet the delay slot's length
10662      requirement.  If none matched, then we retry with the remaining ones
10663      and if one matches, then we use it and then issue an appropriate
10664      warning later on.  */
10665   argsStart = s = str + end;
10666   for (;;)
10667     {
10668       bfd_boolean delay_slot_ok;
10669       bfd_boolean size_ok;
10670       bfd_boolean ok;
10671
10672       gas_assert (strcmp (insn->name, name) == 0);
10673
10674       ok = is_opcode_valid (insn);
10675       size_ok = is_size_valid (insn);
10676       delay_slot_ok = is_delay_slot_valid (insn);
10677       if (!delay_slot_ok && !wrong_delay_slot_insns)
10678         {
10679           firstinsn = insn;
10680           wrong_delay_slot_insns = TRUE;
10681         }
10682       if (!ok || !size_ok || delay_slot_ok != need_delay_slot_ok)
10683         {
10684           static char buf[256];
10685
10686           if (insn + 1 < past && strcmp (insn->name, insn[1].name) == 0)
10687             {
10688               ++insn;
10689               continue;
10690             }
10691           if (wrong_delay_slot_insns && need_delay_slot_ok)
10692             {
10693               gas_assert (firstinsn);
10694               need_delay_slot_ok = FALSE;
10695               past = insn + 1;
10696               insn = firstinsn;
10697               continue;
10698             }
10699
10700           if (insn_error)
10701             return;
10702
10703           if (!ok)
10704             sprintf (buf, _("opcode not supported on this processor: %s (%s)"),
10705                      mips_cpu_info_from_arch (mips_opts.arch)->name,
10706                      mips_cpu_info_from_isa (mips_opts.isa)->name);
10707           else
10708             sprintf (buf, _("Unrecognized %u-bit version of microMIPS opcode"),
10709                      8 * forced_insn_length);
10710           insn_error = buf;
10711
10712           return;
10713         }
10714
10715       create_insn (ip, insn);
10716       insn_error = NULL;
10717       argnum = 1;
10718       lastregno = 0xffffffff;
10719       for (args = insn->args;; ++args)
10720         {
10721           int is_mdmx;
10722
10723           s += strspn (s, " \t");
10724           is_mdmx = 0;
10725           switch (*args)
10726             {
10727             case '\0':          /* end of args */
10728               if (*s == '\0')
10729                 return;
10730               break;
10731
10732             case '2': /* DSP 2-bit unsigned immediate in bit 11.  */
10733               gas_assert (!mips_opts.micromips);
10734               my_getExpression (&imm_expr, s);
10735               check_absolute_expr (ip, &imm_expr);
10736               if ((unsigned long) imm_expr.X_add_number != 1
10737                   && (unsigned long) imm_expr.X_add_number != 3)
10738                 {
10739                   as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
10740                           (unsigned long) imm_expr.X_add_number);
10741                 }
10742               INSERT_OPERAND (0, BP, *ip, imm_expr.X_add_number);
10743               imm_expr.X_op = O_absent;
10744               s = expr_end;
10745               continue;
10746
10747             case '3': /* DSP 3-bit unsigned immediate in bit 21.  */
10748               gas_assert (!mips_opts.micromips);
10749               my_getExpression (&imm_expr, s);
10750               check_absolute_expr (ip, &imm_expr);
10751               if (imm_expr.X_add_number & ~OP_MASK_SA3)
10752                 {
10753                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10754                           OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
10755                 }
10756               INSERT_OPERAND (0, SA3, *ip, imm_expr.X_add_number);
10757               imm_expr.X_op = O_absent;
10758               s = expr_end;
10759               continue;
10760
10761             case '4': /* DSP 4-bit unsigned immediate in bit 21.  */
10762               gas_assert (!mips_opts.micromips);
10763               my_getExpression (&imm_expr, s);
10764               check_absolute_expr (ip, &imm_expr);
10765               if (imm_expr.X_add_number & ~OP_MASK_SA4)
10766                 {
10767                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10768                           OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
10769                 }
10770               INSERT_OPERAND (0, SA4, *ip, imm_expr.X_add_number);
10771               imm_expr.X_op = O_absent;
10772               s = expr_end;
10773               continue;
10774
10775             case '5': /* DSP 8-bit unsigned immediate in bit 16.  */
10776               gas_assert (!mips_opts.micromips);
10777               my_getExpression (&imm_expr, s);
10778               check_absolute_expr (ip, &imm_expr);
10779               if (imm_expr.X_add_number & ~OP_MASK_IMM8)
10780                 {
10781                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10782                           OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
10783                 }
10784               INSERT_OPERAND (0, IMM8, *ip, imm_expr.X_add_number);
10785               imm_expr.X_op = O_absent;
10786               s = expr_end;
10787               continue;
10788
10789             case '6': /* DSP 5-bit unsigned immediate in bit 21.  */
10790               gas_assert (!mips_opts.micromips);
10791               my_getExpression (&imm_expr, s);
10792               check_absolute_expr (ip, &imm_expr);
10793               if (imm_expr.X_add_number & ~OP_MASK_RS)
10794                 {
10795                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10796                           OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
10797                 }
10798               INSERT_OPERAND (0, RS, *ip, imm_expr.X_add_number);
10799               imm_expr.X_op = O_absent;
10800               s = expr_end;
10801               continue;
10802
10803             case '7': /* Four DSP accumulators in bits 11,12.  */
10804               gas_assert (!mips_opts.micromips);
10805               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
10806                   s[3] >= '0' && s[3] <= '3')
10807                 {
10808                   regno = s[3] - '0';
10809                   s += 4;
10810                   INSERT_OPERAND (0, DSPACC, *ip, regno);
10811                   continue;
10812                 }
10813               else
10814                 as_bad (_("Invalid dsp acc register"));
10815               break;
10816
10817             case '8': /* DSP 6-bit unsigned immediate in bit 11.  */
10818               gas_assert (!mips_opts.micromips);
10819               my_getExpression (&imm_expr, s);
10820               check_absolute_expr (ip, &imm_expr);
10821               if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
10822                 {
10823                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10824                           OP_MASK_WRDSP,
10825                           (unsigned long) imm_expr.X_add_number);
10826                 }
10827               INSERT_OPERAND (0, WRDSP, *ip, imm_expr.X_add_number);
10828               imm_expr.X_op = O_absent;
10829               s = expr_end;
10830               continue;
10831
10832             case '9': /* Four DSP accumulators in bits 21,22.  */
10833               gas_assert (!mips_opts.micromips);
10834               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
10835                   s[3] >= '0' && s[3] <= '3')
10836                 {
10837                   regno = s[3] - '0';
10838                   s += 4;
10839                   INSERT_OPERAND (0, DSPACC_S, *ip, regno);
10840                   continue;
10841                 }
10842               else
10843                 as_bad (_("Invalid dsp acc register"));
10844               break;
10845
10846             case '0': /* DSP 6-bit signed immediate in bit 20.  */
10847               gas_assert (!mips_opts.micromips);
10848               my_getExpression (&imm_expr, s);
10849               check_absolute_expr (ip, &imm_expr);
10850               min_range = -((OP_MASK_DSPSFT + 1) >> 1);
10851               max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
10852               if (imm_expr.X_add_number < min_range ||
10853                   imm_expr.X_add_number > max_range)
10854                 {
10855                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
10856                           (long) min_range, (long) max_range,
10857                           (long) imm_expr.X_add_number);
10858                 }
10859               INSERT_OPERAND (0, DSPSFT, *ip, imm_expr.X_add_number);
10860               imm_expr.X_op = O_absent;
10861               s = expr_end;
10862               continue;
10863
10864             case '\'': /* DSP 6-bit unsigned immediate in bit 16.  */
10865               gas_assert (!mips_opts.micromips);
10866               my_getExpression (&imm_expr, s);
10867               check_absolute_expr (ip, &imm_expr);
10868               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
10869                 {
10870                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10871                           OP_MASK_RDDSP,
10872                           (unsigned long) imm_expr.X_add_number);
10873                 }
10874               INSERT_OPERAND (0, RDDSP, *ip, imm_expr.X_add_number);
10875               imm_expr.X_op = O_absent;
10876               s = expr_end;
10877               continue;
10878
10879             case ':': /* DSP 7-bit signed immediate in bit 19.  */
10880               gas_assert (!mips_opts.micromips);
10881               my_getExpression (&imm_expr, s);
10882               check_absolute_expr (ip, &imm_expr);
10883               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
10884               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
10885               if (imm_expr.X_add_number < min_range ||
10886                   imm_expr.X_add_number > max_range)
10887                 {
10888                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
10889                           (long) min_range, (long) max_range,
10890                           (long) imm_expr.X_add_number);
10891                 }
10892               INSERT_OPERAND (0, DSPSFT_7, *ip, imm_expr.X_add_number);
10893               imm_expr.X_op = O_absent;
10894               s = expr_end;
10895               continue;
10896
10897             case '@': /* DSP 10-bit signed immediate in bit 16.  */
10898               gas_assert (!mips_opts.micromips);
10899               my_getExpression (&imm_expr, s);
10900               check_absolute_expr (ip, &imm_expr);
10901               min_range = -((OP_MASK_IMM10 + 1) >> 1);
10902               max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
10903               if (imm_expr.X_add_number < min_range ||
10904                   imm_expr.X_add_number > max_range)
10905                 {
10906                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
10907                           (long) min_range, (long) max_range,
10908                           (long) imm_expr.X_add_number);
10909                 }
10910               INSERT_OPERAND (0, IMM10, *ip, imm_expr.X_add_number);
10911               imm_expr.X_op = O_absent;
10912               s = expr_end;
10913               continue;
10914
10915             case '!': /* MT usermode flag bit.  */
10916               gas_assert (!mips_opts.micromips);
10917               my_getExpression (&imm_expr, s);
10918               check_absolute_expr (ip, &imm_expr);
10919               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
10920                 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
10921                         (unsigned long) imm_expr.X_add_number);
10922               INSERT_OPERAND (0, MT_U, *ip, imm_expr.X_add_number);
10923               imm_expr.X_op = O_absent;
10924               s = expr_end;
10925               continue;
10926
10927             case '$': /* MT load high flag bit.  */
10928               gas_assert (!mips_opts.micromips);
10929               my_getExpression (&imm_expr, s);
10930               check_absolute_expr (ip, &imm_expr);
10931               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
10932                 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
10933                         (unsigned long) imm_expr.X_add_number);
10934               INSERT_OPERAND (0, MT_H, *ip, imm_expr.X_add_number);
10935               imm_expr.X_op = O_absent;
10936               s = expr_end;
10937               continue;
10938
10939             case '*': /* Four DSP accumulators in bits 18,19.  */
10940               gas_assert (!mips_opts.micromips);
10941               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
10942                   s[3] >= '0' && s[3] <= '3')
10943                 {
10944                   regno = s[3] - '0';
10945                   s += 4;
10946                   INSERT_OPERAND (0, MTACC_T, *ip, regno);
10947                   continue;
10948                 }
10949               else
10950                 as_bad (_("Invalid dsp/smartmips acc register"));
10951               break;
10952
10953             case '&': /* Four DSP accumulators in bits 13,14.  */
10954               gas_assert (!mips_opts.micromips);
10955               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
10956                   s[3] >= '0' && s[3] <= '3')
10957                 {
10958                   regno = s[3] - '0';
10959                   s += 4;
10960                   INSERT_OPERAND (0, MTACC_D, *ip, regno);
10961                   continue;
10962                 }
10963               else
10964                 as_bad (_("Invalid dsp/smartmips acc register"));
10965               break;
10966
10967             case '\\':          /* 3-bit bit position.  */
10968               {
10969                 unsigned long mask = (!mips_opts.micromips
10970                                       ? OP_MASK_3BITPOS
10971                                       : MICROMIPSOP_MASK_3BITPOS);
10972
10973                 my_getExpression (&imm_expr, s);
10974                 check_absolute_expr (ip, &imm_expr);
10975                 if ((unsigned long) imm_expr.X_add_number > mask)
10976                   as_warn (_("Bit position for %s not in range 0..%lu (%lu)"),
10977                            ip->insn_mo->name,
10978                            mask, (unsigned long) imm_expr.X_add_number);
10979                 INSERT_OPERAND (mips_opts.micromips,
10980                                 3BITPOS, *ip, imm_expr.X_add_number);
10981                 imm_expr.X_op = O_absent;
10982                 s = expr_end;
10983               }
10984               continue;
10985
10986             case ',':
10987               ++argnum;
10988               if (*s++ == *args)
10989                 continue;
10990               s--;
10991               switch (*++args)
10992                 {
10993                 case 'r':
10994                 case 'v':
10995                   INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
10996                   continue;
10997
10998                 case 'w':
10999                   INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
11000                   continue;
11001
11002                 case 'W':
11003                   gas_assert (!mips_opts.micromips);
11004                   INSERT_OPERAND (0, FT, *ip, lastregno);
11005                   continue;
11006
11007                 case 'V':
11008                   INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
11009                   continue;
11010                 }
11011               break;
11012
11013             case '(':
11014               /* Handle optional base register.
11015                  Either the base register is omitted or
11016                  we must have a left paren.  */
11017               /* This is dependent on the next operand specifier
11018                  is a base register specification.  */
11019               gas_assert (args[1] == 'b'
11020                           || (mips_opts.micromips
11021                               && args[1] == 'm'
11022                               && (args[2] == 'l' || args[2] == 'n'
11023                                   || args[2] == 's' || args[2] == 'a')));
11024               if (*s == '\0' && args[1] == 'b')
11025                 return;
11026               /* Fall through.  */
11027
11028             case ')':           /* These must match exactly.  */
11029               if (*s++ == *args)
11030                 continue;
11031               break;
11032
11033             case '[':           /* These must match exactly.  */
11034             case ']':
11035               gas_assert (!mips_opts.micromips);
11036               if (*s++ == *args)
11037                 continue;
11038               break;
11039
11040             case '+':           /* Opcode extension character.  */
11041               switch (*++args)
11042                 {
11043                 case '1':       /* UDI immediates.  */
11044                 case '2':
11045                 case '3':
11046                 case '4':
11047                   gas_assert (!mips_opts.micromips);
11048                   {
11049                     const struct mips_immed *imm = mips_immed;
11050
11051                     while (imm->type && imm->type != *args)
11052                       ++imm;
11053                     if (! imm->type)
11054                       internalError ();
11055                     my_getExpression (&imm_expr, s);
11056                     check_absolute_expr (ip, &imm_expr);
11057                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
11058                       {
11059                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
11060                                  imm->desc ? imm->desc : ip->insn_mo->name,
11061                                  (unsigned long) imm_expr.X_add_number,
11062                                  (unsigned long) imm_expr.X_add_number);
11063                         imm_expr.X_add_number &= imm->mask;
11064                       }
11065                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
11066                                         << imm->shift);
11067                     imm_expr.X_op = O_absent;
11068                     s = expr_end;
11069                   }
11070                   continue;
11071
11072                 case 'A':               /* ins/ext position, becomes LSB.  */
11073                   limlo = 0;
11074                   limhi = 31;
11075                   goto do_lsb;
11076                 case 'E':
11077                   limlo = 32;
11078                   limhi = 63;
11079                   goto do_lsb;
11080                 do_lsb:
11081                   my_getExpression (&imm_expr, s);
11082                   check_absolute_expr (ip, &imm_expr);
11083                   if ((unsigned long) imm_expr.X_add_number < limlo
11084                       || (unsigned long) imm_expr.X_add_number > limhi)
11085                     {
11086                       as_bad (_("Improper position (%lu)"),
11087                               (unsigned long) imm_expr.X_add_number);
11088                       imm_expr.X_add_number = limlo;
11089                     }
11090                   lastpos = imm_expr.X_add_number;
11091                   INSERT_OPERAND (mips_opts.micromips,
11092                                   EXTLSB, *ip, imm_expr.X_add_number);
11093                   imm_expr.X_op = O_absent;
11094                   s = expr_end;
11095                   continue;
11096
11097                 case 'B':               /* ins size, becomes MSB.  */
11098                   limlo = 1;
11099                   limhi = 32;
11100                   goto do_msb;
11101                 case 'F':
11102                   limlo = 33;
11103                   limhi = 64;
11104                   goto do_msb;
11105                 do_msb:
11106                   my_getExpression (&imm_expr, s);
11107                   check_absolute_expr (ip, &imm_expr);
11108                   /* Check for negative input so that small negative numbers
11109                      will not succeed incorrectly.  The checks against
11110                      (pos+size) transitively check "size" itself,
11111                      assuming that "pos" is reasonable.  */
11112                   if ((long) imm_expr.X_add_number < 0
11113                       || ((unsigned long) imm_expr.X_add_number
11114                           + lastpos) < limlo
11115                       || ((unsigned long) imm_expr.X_add_number
11116                           + lastpos) > limhi)
11117                     {
11118                       as_bad (_("Improper insert size (%lu, position %lu)"),
11119                               (unsigned long) imm_expr.X_add_number,
11120                               (unsigned long) lastpos);
11121                       imm_expr.X_add_number = limlo - lastpos;
11122                     }
11123                   INSERT_OPERAND (mips_opts.micromips, INSMSB, *ip,
11124                                   lastpos + imm_expr.X_add_number - 1);
11125                   imm_expr.X_op = O_absent;
11126                   s = expr_end;
11127                   continue;
11128
11129                 case 'C':               /* ext size, becomes MSBD.  */
11130                   limlo = 1;
11131                   limhi = 32;
11132                   goto do_msbd;
11133                 case 'G':
11134                   limlo = 33;
11135                   limhi = 64;
11136                   goto do_msbd;
11137                 case 'H':
11138                   limlo = 33;
11139                   limhi = 64;
11140                   goto do_msbd;
11141                 do_msbd:
11142                   my_getExpression (&imm_expr, s);
11143                   check_absolute_expr (ip, &imm_expr);
11144                   /* Check for negative input so that small negative numbers
11145                      will not succeed incorrectly.  The checks against
11146                      (pos+size) transitively check "size" itself,
11147                      assuming that "pos" is reasonable.  */
11148                   if ((long) imm_expr.X_add_number < 0
11149                       || ((unsigned long) imm_expr.X_add_number
11150                           + lastpos) < limlo
11151                       || ((unsigned long) imm_expr.X_add_number
11152                           + lastpos) > limhi)
11153                     {
11154                       as_bad (_("Improper extract size (%lu, position %lu)"),
11155                               (unsigned long) imm_expr.X_add_number,
11156                               (unsigned long) lastpos);
11157                       imm_expr.X_add_number = limlo - lastpos;
11158                     }
11159                   INSERT_OPERAND (mips_opts.micromips,
11160                                   EXTMSBD, *ip, imm_expr.X_add_number - 1);
11161                   imm_expr.X_op = O_absent;
11162                   s = expr_end;
11163                   continue;
11164
11165                 case 'D':
11166                   /* +D is for disassembly only; never match.  */
11167                   break;
11168
11169                 case 'I':
11170                   /* "+I" is like "I", except that imm2_expr is used.  */
11171                   my_getExpression (&imm2_expr, s);
11172                   if (imm2_expr.X_op != O_big
11173                       && imm2_expr.X_op != O_constant)
11174                   insn_error = _("absolute expression required");
11175                   if (HAVE_32BIT_GPRS)
11176                     normalize_constant_expr (&imm2_expr);
11177                   s = expr_end;
11178                   continue;
11179
11180                 case 'T': /* Coprocessor register.  */
11181                   gas_assert (!mips_opts.micromips);
11182                   /* +T is for disassembly only; never match.  */
11183                   break;
11184
11185                 case 't': /* Coprocessor register number.  */
11186                   gas_assert (!mips_opts.micromips);
11187                   if (s[0] == '$' && ISDIGIT (s[1]))
11188                     {
11189                       ++s;
11190                       regno = 0;
11191                       do
11192                         {
11193                           regno *= 10;
11194                           regno += *s - '0';
11195                           ++s;
11196                         }
11197                       while (ISDIGIT (*s));
11198                       if (regno > 31)
11199                         as_bad (_("Invalid register number (%d)"), regno);
11200                       else
11201                         {
11202                           INSERT_OPERAND (0, RT, *ip, regno);
11203                           continue;
11204                         }
11205                     }
11206                   else
11207                     as_bad (_("Invalid coprocessor 0 register number"));
11208                   break;
11209
11210                 case 'x':
11211                   /* bbit[01] and bbit[01]32 bit index.  Give error if index
11212                      is not in the valid range.  */
11213                   gas_assert (!mips_opts.micromips);
11214                   my_getExpression (&imm_expr, s);
11215                   check_absolute_expr (ip, &imm_expr);
11216                   if ((unsigned) imm_expr.X_add_number > 31)
11217                     {
11218                       as_bad (_("Improper bit index (%lu)"),
11219                               (unsigned long) imm_expr.X_add_number);
11220                       imm_expr.X_add_number = 0;
11221                     }
11222                   INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number);
11223                   imm_expr.X_op = O_absent;
11224                   s = expr_end;
11225                   continue;
11226
11227                 case 'X':
11228                   /* bbit[01] bit index when bbit is used but we generate
11229                      bbit[01]32 because the index is over 32.  Move to the
11230                      next candidate if index is not in the valid range.  */
11231                   gas_assert (!mips_opts.micromips);
11232                   my_getExpression (&imm_expr, s);
11233                   check_absolute_expr (ip, &imm_expr);
11234                   if ((unsigned) imm_expr.X_add_number < 32
11235                       || (unsigned) imm_expr.X_add_number > 63)
11236                     break;
11237                   INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number - 32);
11238                   imm_expr.X_op = O_absent;
11239                   s = expr_end;
11240                   continue;
11241
11242                 case 'p':
11243                   /* cins, cins32, exts and exts32 position field.  Give error
11244                      if it's not in the valid range.  */
11245                   gas_assert (!mips_opts.micromips);
11246                   my_getExpression (&imm_expr, s);
11247                   check_absolute_expr (ip, &imm_expr);
11248                   if ((unsigned) imm_expr.X_add_number > 31)
11249                     {
11250                       as_bad (_("Improper position (%lu)"),
11251                               (unsigned long) imm_expr.X_add_number);
11252                       imm_expr.X_add_number = 0;
11253                     }
11254                   /* Make the pos explicit to simplify +S.  */
11255                   lastpos = imm_expr.X_add_number + 32;
11256                   INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number);
11257                   imm_expr.X_op = O_absent;
11258                   s = expr_end;
11259                   continue;
11260
11261                 case 'P':
11262                   /* cins, cins32, exts and exts32 position field.  Move to
11263                      the next candidate if it's not in the valid range.  */
11264                   gas_assert (!mips_opts.micromips);
11265                   my_getExpression (&imm_expr, s);
11266                   check_absolute_expr (ip, &imm_expr);
11267                   if ((unsigned) imm_expr.X_add_number < 32
11268                       || (unsigned) imm_expr.X_add_number > 63)
11269                     break;
11270                   lastpos = imm_expr.X_add_number;
11271                   INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number - 32);
11272                   imm_expr.X_op = O_absent;
11273                   s = expr_end;
11274                   continue;
11275
11276                 case 's':
11277                   /* cins and exts length-minus-one field.  */
11278                   gas_assert (!mips_opts.micromips);
11279                   my_getExpression (&imm_expr, s);
11280                   check_absolute_expr (ip, &imm_expr);
11281                   if ((unsigned long) imm_expr.X_add_number > 31)
11282                     {
11283                       as_bad (_("Improper size (%lu)"),
11284                               (unsigned long) imm_expr.X_add_number);
11285                       imm_expr.X_add_number = 0;
11286                     }
11287                   INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
11288                   imm_expr.X_op = O_absent;
11289                   s = expr_end;
11290                   continue;
11291
11292                 case 'S':
11293                   /* cins32/exts32 and cins/exts aliasing cint32/exts32
11294                      length-minus-one field.  */
11295                   gas_assert (!mips_opts.micromips);
11296                   my_getExpression (&imm_expr, s);
11297                   check_absolute_expr (ip, &imm_expr);
11298                   if ((long) imm_expr.X_add_number < 0
11299                       || (unsigned long) imm_expr.X_add_number + lastpos > 63)
11300                     {
11301                       as_bad (_("Improper size (%lu)"),
11302                               (unsigned long) imm_expr.X_add_number);
11303                       imm_expr.X_add_number = 0;
11304                     }
11305                   INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
11306                   imm_expr.X_op = O_absent;
11307                   s = expr_end;
11308                   continue;
11309
11310                 case 'Q':
11311                   /* seqi/snei immediate field.  */
11312                   gas_assert (!mips_opts.micromips);
11313                   my_getExpression (&imm_expr, s);
11314                   check_absolute_expr (ip, &imm_expr);
11315                   if ((long) imm_expr.X_add_number < -512
11316                       || (long) imm_expr.X_add_number >= 512)
11317                     {
11318                       as_bad (_("Improper immediate (%ld)"),
11319                                (long) imm_expr.X_add_number);
11320                       imm_expr.X_add_number = 0;
11321                     }
11322                   INSERT_OPERAND (0, SEQI, *ip, imm_expr.X_add_number);
11323                   imm_expr.X_op = O_absent;
11324                   s = expr_end;
11325                   continue;
11326
11327                 case 'a': /* 8-bit signed offset in bit 6 */
11328                   gas_assert (!mips_opts.micromips);
11329                   my_getExpression (&imm_expr, s);
11330                   check_absolute_expr (ip, &imm_expr);
11331                   min_range = -((OP_MASK_OFFSET_A + 1) >> 1);
11332                   max_range = ((OP_MASK_OFFSET_A + 1) >> 1) - 1;
11333                   if (imm_expr.X_add_number < min_range
11334                       || imm_expr.X_add_number > max_range)
11335                     {
11336                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
11337                               (long) min_range, (long) max_range,
11338                               (long) imm_expr.X_add_number);
11339                     }
11340                   INSERT_OPERAND (0, OFFSET_A, *ip, imm_expr.X_add_number);
11341                   imm_expr.X_op = O_absent;
11342                   s = expr_end;
11343                   continue;
11344
11345                 case 'b': /* 8-bit signed offset in bit 3 */
11346                   gas_assert (!mips_opts.micromips);
11347                   my_getExpression (&imm_expr, s);
11348                   check_absolute_expr (ip, &imm_expr);
11349                   min_range = -((OP_MASK_OFFSET_B + 1) >> 1);
11350                   max_range = ((OP_MASK_OFFSET_B + 1) >> 1) - 1;
11351                   if (imm_expr.X_add_number < min_range
11352                       || imm_expr.X_add_number > max_range)
11353                     {
11354                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
11355                               (long) min_range, (long) max_range,
11356                               (long) imm_expr.X_add_number);
11357                     }
11358                   INSERT_OPERAND (0, OFFSET_B, *ip, imm_expr.X_add_number);
11359                   imm_expr.X_op = O_absent;
11360                   s = expr_end;
11361                   continue;
11362
11363                 case 'c': /* 9-bit signed offset in bit 6 */
11364                   gas_assert (!mips_opts.micromips);
11365                   my_getExpression (&imm_expr, s);
11366                   check_absolute_expr (ip, &imm_expr);
11367                   min_range = -((OP_MASK_OFFSET_C + 1) >> 1);
11368                   max_range = ((OP_MASK_OFFSET_C + 1) >> 1) - 1;
11369                   /* We check the offset range before adjusted.  */
11370                   min_range <<= 4;
11371                   max_range <<= 4;
11372                   if (imm_expr.X_add_number < min_range
11373                       || imm_expr.X_add_number > max_range)
11374                     {
11375                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
11376                               (long) min_range, (long) max_range,
11377                               (long) imm_expr.X_add_number);
11378                     }
11379                   if (imm_expr.X_add_number & 0xf)
11380                     {
11381                       as_bad (_("Offset not 16 bytes alignment (%ld)"),
11382                               (long) imm_expr.X_add_number);
11383                     }
11384                   /* Right shift 4 bits to adjust the offset operand.  */
11385                   INSERT_OPERAND (0, OFFSET_C, *ip,
11386                                   imm_expr.X_add_number >> 4);
11387                   imm_expr.X_op = O_absent;
11388                   s = expr_end;
11389                   continue;
11390
11391                 case 'z':
11392                   gas_assert (!mips_opts.micromips);
11393                   if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
11394                     break;
11395                   if (regno == AT && mips_opts.at)
11396                     {
11397                       if (mips_opts.at == ATREG)
11398                         as_warn (_("used $at without \".set noat\""));
11399                       else
11400                         as_warn (_("used $%u with \".set at=$%u\""),
11401                                  regno, mips_opts.at);
11402                     }
11403                   INSERT_OPERAND (0, RZ, *ip, regno);
11404                   continue;
11405
11406                 case 'Z':
11407                   gas_assert (!mips_opts.micromips);
11408                   if (!reg_lookup (&s, RTYPE_FPU, &regno))
11409                     break;
11410                   INSERT_OPERAND (0, FZ, *ip, regno);
11411                   continue;
11412
11413                 default:
11414                   as_bad (_("Internal error: bad %s opcode "
11415                             "(unknown extension operand type `+%c'): %s %s"),
11416                           mips_opts.micromips ? "microMIPS" : "MIPS",
11417                           *args, insn->name, insn->args);
11418                   /* Further processing is fruitless.  */
11419                   return;
11420                 }
11421               break;
11422
11423             case '.':           /* 10-bit offset.  */
11424               gas_assert (mips_opts.micromips);
11425             case '~':           /* 12-bit offset.  */
11426               {
11427                 int shift = *args == '.' ? 9 : 11;
11428                 size_t i;
11429
11430                 /* Check whether there is only a single bracketed expression
11431                    left.  If so, it must be the base register and the
11432                    constant must be zero.  */
11433                 if (*s == '(' && strchr (s + 1, '(') == 0)
11434                   continue;
11435
11436                 /* If this value won't fit into the offset, then go find
11437                    a macro that will generate a 16- or 32-bit offset code
11438                    pattern.  */
11439                 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
11440                 if ((i == 0 && (imm_expr.X_op != O_constant
11441                                 || imm_expr.X_add_number >= 1 << shift
11442                                 || imm_expr.X_add_number < -1 << shift))
11443                     || i > 0)
11444                   {
11445                     imm_expr.X_op = O_absent;
11446                     break;
11447                   }
11448                 if (shift == 9)
11449                   INSERT_OPERAND (1, OFFSET10, *ip, imm_expr.X_add_number);
11450                 else
11451                   INSERT_OPERAND (mips_opts.micromips,
11452                                   OFFSET12, *ip, imm_expr.X_add_number);
11453                 imm_expr.X_op = O_absent;
11454                 s = expr_end;
11455               }
11456               continue;
11457
11458             case '<':           /* must be at least one digit */
11459               /*
11460                * According to the manual, if the shift amount is greater
11461                * than 31 or less than 0, then the shift amount should be
11462                * mod 32.  In reality the mips assembler issues an error.
11463                * We issue a warning and mask out all but the low 5 bits.
11464                */
11465               my_getExpression (&imm_expr, s);
11466               check_absolute_expr (ip, &imm_expr);
11467               if ((unsigned long) imm_expr.X_add_number > 31)
11468                 as_warn (_("Improper shift amount (%lu)"),
11469                          (unsigned long) imm_expr.X_add_number);
11470               INSERT_OPERAND (mips_opts.micromips,
11471                               SHAMT, *ip, imm_expr.X_add_number);
11472               imm_expr.X_op = O_absent;
11473               s = expr_end;
11474               continue;
11475
11476             case '>':           /* shift amount minus 32 */
11477               my_getExpression (&imm_expr, s);
11478               check_absolute_expr (ip, &imm_expr);
11479               if ((unsigned long) imm_expr.X_add_number < 32
11480                   || (unsigned long) imm_expr.X_add_number > 63)
11481                 break;
11482               INSERT_OPERAND (mips_opts.micromips,
11483                               SHAMT, *ip, imm_expr.X_add_number - 32);
11484               imm_expr.X_op = O_absent;
11485               s = expr_end;
11486               continue;
11487
11488             case 'k':           /* CACHE code.  */
11489             case 'h':           /* PREFX code.  */
11490             case '1':           /* SYNC type.  */
11491               my_getExpression (&imm_expr, s);
11492               check_absolute_expr (ip, &imm_expr);
11493               if ((unsigned long) imm_expr.X_add_number > 31)
11494                 as_warn (_("Invalid value for `%s' (%lu)"),
11495                          ip->insn_mo->name,
11496                          (unsigned long) imm_expr.X_add_number);
11497               switch (*args)
11498                 {
11499                 case 'k':
11500                   if (mips_fix_cn63xxp1
11501                       && !mips_opts.micromips
11502                       && strcmp ("pref", insn->name) == 0)
11503                     switch (imm_expr.X_add_number)
11504                       {
11505                       case 5:
11506                       case 25:
11507                       case 26:
11508                       case 27:
11509                       case 28:
11510                       case 29:
11511                       case 30:
11512                       case 31:  /* These are ok.  */
11513                         break;
11514
11515                       default:  /* The rest must be changed to 28.  */
11516                         imm_expr.X_add_number = 28;
11517                         break;
11518                       }
11519                   INSERT_OPERAND (mips_opts.micromips,
11520                                   CACHE, *ip, imm_expr.X_add_number);
11521                   break;
11522                 case 'h':
11523                   INSERT_OPERAND (mips_opts.micromips,
11524                                   PREFX, *ip, imm_expr.X_add_number);
11525                   break;
11526                 case '1':
11527                   INSERT_OPERAND (mips_opts.micromips,
11528                                   STYPE, *ip, imm_expr.X_add_number);
11529                   break;
11530                 }
11531               imm_expr.X_op = O_absent;
11532               s = expr_end;
11533               continue;
11534
11535             case 'c':           /* BREAK code.  */
11536               {
11537                 unsigned long mask = (mips_opts.micromips
11538                                       ? MICROMIPSOP_MASK_CODE
11539                                       : OP_MASK_CODE);
11540
11541                 my_getExpression (&imm_expr, s);
11542                 check_absolute_expr (ip, &imm_expr);
11543                 if ((unsigned long) imm_expr.X_add_number > mask)
11544                   as_warn (_("Code for %s not in range 0..%lu (%lu)"),
11545                            ip->insn_mo->name,
11546                            mask, (unsigned long) imm_expr.X_add_number);
11547                 INSERT_OPERAND (mips_opts.micromips,
11548                                 CODE, *ip, imm_expr.X_add_number);
11549                 imm_expr.X_op = O_absent;
11550                 s = expr_end;
11551               }
11552               continue;
11553
11554             case 'q':           /* Lower BREAK code.  */
11555               {
11556                 unsigned long mask = (mips_opts.micromips
11557                                       ? MICROMIPSOP_MASK_CODE2
11558                                       : OP_MASK_CODE2);
11559
11560                 my_getExpression (&imm_expr, s);
11561                 check_absolute_expr (ip, &imm_expr);
11562                 if ((unsigned long) imm_expr.X_add_number > mask)
11563                   as_warn (_("Lower code for %s not in range 0..%lu (%lu)"),
11564                            ip->insn_mo->name,
11565                            mask, (unsigned long) imm_expr.X_add_number);
11566                 INSERT_OPERAND (mips_opts.micromips,
11567                                 CODE2, *ip, imm_expr.X_add_number);
11568                 imm_expr.X_op = O_absent;
11569                 s = expr_end;
11570               }
11571               continue;
11572
11573             case 'B':           /* 20- or 10-bit syscall/break/wait code.  */
11574               {
11575                 unsigned long mask = (mips_opts.micromips
11576                                       ? MICROMIPSOP_MASK_CODE10
11577                                       : OP_MASK_CODE20);
11578
11579                 my_getExpression (&imm_expr, s);
11580                 check_absolute_expr (ip, &imm_expr);
11581                 if ((unsigned long) imm_expr.X_add_number > mask)
11582                   as_warn (_("Code for %s not in range 0..%lu (%lu)"),
11583                            ip->insn_mo->name,
11584                            mask, (unsigned long) imm_expr.X_add_number);
11585                 if (mips_opts.micromips)
11586                   INSERT_OPERAND (1, CODE10, *ip, imm_expr.X_add_number);
11587                 else
11588                   INSERT_OPERAND (0, CODE20, *ip, imm_expr.X_add_number);
11589                 imm_expr.X_op = O_absent;
11590                 s = expr_end;
11591               }
11592               continue;
11593
11594             case 'C':           /* 25- or 23-bit coprocessor code.  */
11595               {
11596                 unsigned long mask = (mips_opts.micromips
11597                                       ? MICROMIPSOP_MASK_COPZ
11598                                       : OP_MASK_COPZ);
11599
11600                 my_getExpression (&imm_expr, s);
11601                 check_absolute_expr (ip, &imm_expr);
11602                 if ((unsigned long) imm_expr.X_add_number > mask)
11603                   as_warn (_("Coproccesor code > %u bits (%lu)"),
11604                            mips_opts.micromips ? 23U : 25U,
11605                            (unsigned long) imm_expr.X_add_number);
11606                 INSERT_OPERAND (mips_opts.micromips,
11607                                 COPZ, *ip, imm_expr.X_add_number);
11608                 imm_expr.X_op = O_absent;
11609                 s = expr_end;
11610               }
11611               continue;
11612
11613             case 'J':           /* 19-bit WAIT code.  */
11614               gas_assert (!mips_opts.micromips);
11615               my_getExpression (&imm_expr, s);
11616               check_absolute_expr (ip, &imm_expr);
11617               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
11618                 {
11619                   as_warn (_("Illegal 19-bit code (%lu)"),
11620                            (unsigned long) imm_expr.X_add_number);
11621                   imm_expr.X_add_number &= OP_MASK_CODE19;
11622                 }
11623               INSERT_OPERAND (0, CODE19, *ip, imm_expr.X_add_number);
11624               imm_expr.X_op = O_absent;
11625               s = expr_end;
11626               continue;
11627
11628             case 'P':           /* Performance register.  */
11629               gas_assert (!mips_opts.micromips);
11630               my_getExpression (&imm_expr, s);
11631               check_absolute_expr (ip, &imm_expr);
11632               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
11633                 as_warn (_("Invalid performance register (%lu)"),
11634                          (unsigned long) imm_expr.X_add_number);
11635               INSERT_OPERAND (0, PERFREG, *ip, imm_expr.X_add_number);
11636               imm_expr.X_op = O_absent;
11637               s = expr_end;
11638               continue;
11639
11640             case 'G':           /* Coprocessor destination register.  */
11641               {
11642                 unsigned long opcode = ip->insn_opcode;
11643                 unsigned long mask;
11644                 unsigned int types;
11645                 int cop0;
11646
11647                 if (mips_opts.micromips)
11648                   {
11649                     mask = ~((MICROMIPSOP_MASK_RT << MICROMIPSOP_SH_RT)
11650                              | (MICROMIPSOP_MASK_RS << MICROMIPSOP_SH_RS)
11651                              | (MICROMIPSOP_MASK_SEL << MICROMIPSOP_SH_SEL));
11652                     opcode &= mask;
11653                     switch (opcode)
11654                       {
11655                       case 0x000000fc:                          /* mfc0  */
11656                       case 0x000002fc:                          /* mtc0  */
11657                       case 0x580000fc:                          /* dmfc0 */
11658                       case 0x580002fc:                          /* dmtc0 */
11659                         cop0 = 1;
11660                         break;
11661                       default:
11662                         cop0 = 0;
11663                         break;
11664                       }
11665                   }
11666                 else
11667                   {
11668                     opcode = (opcode >> OP_SH_OP) & OP_MASK_OP;
11669                     cop0 = opcode == OP_OP_COP0;
11670                   }
11671                 types = RTYPE_NUM | (cop0 ? RTYPE_CP0 : RTYPE_GP);
11672                 ok = reg_lookup (&s, types, &regno);
11673                 if (mips_opts.micromips)
11674                   INSERT_OPERAND (1, RS, *ip, regno);
11675                 else
11676                   INSERT_OPERAND (0, RD, *ip, regno);
11677                 if (ok)
11678                   {
11679                     lastregno = regno;
11680                     continue;
11681                   }
11682               }
11683               break;
11684
11685             case 'y':           /* ALNV.PS source register.  */
11686               gas_assert (mips_opts.micromips);
11687               goto do_reg;
11688             case 'x':           /* Ignore register name.  */
11689             case 'U':           /* Destination register (CLO/CLZ).  */
11690             case 'g':           /* Coprocessor destination register.  */
11691               gas_assert (!mips_opts.micromips);
11692             case 'b':           /* Base register.  */
11693             case 'd':           /* Destination register.  */
11694             case 's':           /* Source register.  */
11695             case 't':           /* Target register.  */
11696             case 'r':           /* Both target and source.  */
11697             case 'v':           /* Both dest and source.  */
11698             case 'w':           /* Both dest and target.  */
11699             case 'E':           /* Coprocessor target register.  */
11700             case 'K':           /* RDHWR destination register.  */
11701             case 'z':           /* Must be zero register.  */
11702             do_reg:
11703               s_reset = s;
11704               if (*args == 'E' || *args == 'K')
11705                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
11706               else
11707                 {
11708                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
11709                   if (regno == AT && mips_opts.at)
11710                     {
11711                       if (mips_opts.at == ATREG)
11712                         as_warn (_("Used $at without \".set noat\""));
11713                       else
11714                         as_warn (_("Used $%u with \".set at=$%u\""),
11715                                  regno, mips_opts.at);
11716                     }
11717                 }
11718               if (ok)
11719                 {
11720                   c = *args;
11721                   if (*s == ' ')
11722                     ++s;
11723                   if (args[1] != *s)
11724                     {
11725                       if (c == 'r' || c == 'v' || c == 'w')
11726                         {
11727                           regno = lastregno;
11728                           s = s_reset;
11729                           ++args;
11730                         }
11731                     }
11732                   /* 'z' only matches $0.  */
11733                   if (c == 'z' && regno != 0)
11734                     break;
11735
11736                   if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
11737                     {
11738                       if (regno == lastregno)
11739                         {
11740                           insn_error
11741                             = _("Source and destination must be different");
11742                           continue;
11743                         }
11744                       if (regno == 31 && lastregno == 0xffffffff)
11745                         {
11746                           insn_error
11747                             = _("A destination register must be supplied");
11748                           continue;
11749                         }
11750                     }
11751                   /* Now that we have assembled one operand, we use the args
11752                      string to figure out where it goes in the instruction.  */
11753                   switch (c)
11754                     {
11755                     case 'r':
11756                     case 's':
11757                     case 'v':
11758                     case 'b':
11759                       INSERT_OPERAND (mips_opts.micromips, RS, *ip, regno);
11760                       break;
11761
11762                     case 'K':
11763                       if (mips_opts.micromips)
11764                         INSERT_OPERAND (1, RS, *ip, regno);
11765                       else
11766                         INSERT_OPERAND (0, RD, *ip, regno);
11767                       break;
11768
11769                     case 'd':
11770                     case 'g':
11771                       INSERT_OPERAND (mips_opts.micromips, RD, *ip, regno);
11772                       break;
11773
11774                     case 'U':
11775                       gas_assert (!mips_opts.micromips);
11776                       INSERT_OPERAND (0, RD, *ip, regno);
11777                       INSERT_OPERAND (0, RT, *ip, regno);
11778                       break;
11779
11780                     case 'w':
11781                     case 't':
11782                     case 'E':
11783                       INSERT_OPERAND (mips_opts.micromips, RT, *ip, regno);
11784                       break;
11785
11786                     case 'y':
11787                       gas_assert (mips_opts.micromips);
11788                       INSERT_OPERAND (1, RS3, *ip, regno);
11789                       break;
11790
11791                     case 'x':
11792                       /* This case exists because on the r3000 trunc
11793                          expands into a macro which requires a gp
11794                          register.  On the r6000 or r4000 it is
11795                          assembled into a single instruction which
11796                          ignores the register.  Thus the insn version
11797                          is MIPS_ISA2 and uses 'x', and the macro
11798                          version is MIPS_ISA1 and uses 't'.  */
11799                       break;
11800
11801                     case 'z':
11802                       /* This case is for the div instruction, which
11803                          acts differently if the destination argument
11804                          is $0.  This only matches $0, and is checked
11805                          outside the switch.  */
11806                       break;
11807                     }
11808                   lastregno = regno;
11809                   continue;
11810                 }
11811               switch (*args++)
11812                 {
11813                 case 'r':
11814                 case 'v':
11815                   INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
11816                   continue;
11817
11818                 case 'w':
11819                   INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
11820                   continue;
11821                 }
11822               break;
11823
11824             case 'O':           /* MDMX alignment immediate constant.  */
11825               gas_assert (!mips_opts.micromips);
11826               my_getExpression (&imm_expr, s);
11827               check_absolute_expr (ip, &imm_expr);
11828               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
11829                 as_warn (_("Improper align amount (%ld), using low bits"),
11830                          (long) imm_expr.X_add_number);
11831               INSERT_OPERAND (0, ALN, *ip, imm_expr.X_add_number);
11832               imm_expr.X_op = O_absent;
11833               s = expr_end;
11834               continue;
11835
11836             case 'Q':           /* MDMX vector, element sel, or const.  */
11837               if (s[0] != '$')
11838                 {
11839                   /* MDMX Immediate.  */
11840                   gas_assert (!mips_opts.micromips);
11841                   my_getExpression (&imm_expr, s);
11842                   check_absolute_expr (ip, &imm_expr);
11843                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
11844                     as_warn (_("Invalid MDMX Immediate (%ld)"),
11845                              (long) imm_expr.X_add_number);
11846                   INSERT_OPERAND (0, FT, *ip, imm_expr.X_add_number);
11847                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
11848                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
11849                   else
11850                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
11851                   imm_expr.X_op = O_absent;
11852                   s = expr_end;
11853                   continue;
11854                 }
11855               /* Not MDMX Immediate.  Fall through.  */
11856             case 'X':           /* MDMX destination register.  */
11857             case 'Y':           /* MDMX source register.  */
11858             case 'Z':           /* MDMX target register.  */
11859               is_mdmx = 1;
11860             case 'W':
11861               gas_assert (!mips_opts.micromips);
11862             case 'D':           /* Floating point destination register.  */
11863             case 'S':           /* Floating point source register.  */
11864             case 'T':           /* Floating point target register.  */
11865             case 'R':           /* Floating point source register.  */
11866             case 'V':
11867               rtype = RTYPE_FPU;
11868               if (is_mdmx
11869                   || (mips_opts.ase_mdmx
11870                       && (ip->insn_mo->pinfo & FP_D)
11871                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
11872                                                 | INSN_COPROC_MEMORY_DELAY
11873                                                 | INSN_LOAD_COPROC_DELAY
11874                                                 | INSN_LOAD_MEMORY_DELAY
11875                                                 | INSN_STORE_MEMORY))))
11876                 rtype |= RTYPE_VEC;
11877               s_reset = s;
11878               if (reg_lookup (&s, rtype, &regno))
11879                 {
11880                   if ((regno & 1) != 0
11881                       && HAVE_32BIT_FPRS
11882                       && !mips_oddfpreg_ok (ip->insn_mo, argnum))
11883                     as_warn (_("Float register should be even, was %d"),
11884                              regno);
11885
11886                   c = *args;
11887                   if (*s == ' ')
11888                     ++s;
11889                   if (args[1] != *s)
11890                     {
11891                       if (c == 'V' || c == 'W')
11892                         {
11893                           regno = lastregno;
11894                           s = s_reset;
11895                           ++args;
11896                         }
11897                     }
11898                   switch (c)
11899                     {
11900                     case 'D':
11901                     case 'X':
11902                       INSERT_OPERAND (mips_opts.micromips, FD, *ip, regno);
11903                       break;
11904
11905                     case 'V':
11906                     case 'S':
11907                     case 'Y':
11908                       INSERT_OPERAND (mips_opts.micromips, FS, *ip, regno);
11909                       break;
11910
11911                     case 'Q':
11912                       /* This is like 'Z', but also needs to fix the MDMX
11913                          vector/scalar select bits.  Note that the
11914                          scalar immediate case is handled above.  */
11915                       if (*s == '[')
11916                         {
11917                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
11918                           int max_el = (is_qh ? 3 : 7);
11919                           s++;
11920                           my_getExpression(&imm_expr, s);
11921                           check_absolute_expr (ip, &imm_expr);
11922                           s = expr_end;
11923                           if (imm_expr.X_add_number > max_el)
11924                             as_bad (_("Bad element selector %ld"),
11925                                     (long) imm_expr.X_add_number);
11926                           imm_expr.X_add_number &= max_el;
11927                           ip->insn_opcode |= (imm_expr.X_add_number
11928                                               << (OP_SH_VSEL +
11929                                                   (is_qh ? 2 : 1)));
11930                           imm_expr.X_op = O_absent;
11931                           if (*s != ']')
11932                             as_warn (_("Expecting ']' found '%s'"), s);
11933                           else
11934                             s++;
11935                         }
11936                       else
11937                         {
11938                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
11939                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
11940                                                 << OP_SH_VSEL);
11941                           else
11942                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
11943                                                 OP_SH_VSEL);
11944                         }
11945                       /* Fall through.  */
11946                     case 'W':
11947                     case 'T':
11948                     case 'Z':
11949                       INSERT_OPERAND (mips_opts.micromips, FT, *ip, regno);
11950                       break;
11951
11952                     case 'R':
11953                       INSERT_OPERAND (mips_opts.micromips, FR, *ip, regno);
11954                       break;
11955                     }
11956                   lastregno = regno;
11957                   continue;
11958                 }
11959
11960               switch (*args++)
11961                 {
11962                 case 'V':
11963                   INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
11964                   continue;
11965
11966                 case 'W':
11967                   INSERT_OPERAND (mips_opts.micromips, FT, *ip, lastregno);
11968                   continue;
11969                 }
11970               break;
11971
11972             case 'I':
11973               my_getExpression (&imm_expr, s);
11974               if (imm_expr.X_op != O_big
11975                   && imm_expr.X_op != O_constant)
11976                 insn_error = _("absolute expression required");
11977               if (HAVE_32BIT_GPRS)
11978                 normalize_constant_expr (&imm_expr);
11979               s = expr_end;
11980               continue;
11981
11982             case 'A':
11983               my_getExpression (&offset_expr, s);
11984               normalize_address_expr (&offset_expr);
11985               *imm_reloc = BFD_RELOC_32;
11986               s = expr_end;
11987               continue;
11988
11989             case 'F':
11990             case 'L':
11991             case 'f':
11992             case 'l':
11993               {
11994                 int f64;
11995                 int using_gprs;
11996                 char *save_in;
11997                 char *err;
11998                 unsigned char temp[8];
11999                 int len;
12000                 unsigned int length;
12001                 segT seg;
12002                 subsegT subseg;
12003                 char *p;
12004
12005                 /* These only appear as the last operand in an
12006                    instruction, and every instruction that accepts
12007                    them in any variant accepts them in all variants.
12008                    This means we don't have to worry about backing out
12009                    any changes if the instruction does not match.
12010
12011                    The difference between them is the size of the
12012                    floating point constant and where it goes.  For 'F'
12013                    and 'L' the constant is 64 bits; for 'f' and 'l' it
12014                    is 32 bits.  Where the constant is placed is based
12015                    on how the MIPS assembler does things:
12016                     F -- .rdata
12017                     L -- .lit8
12018                     f -- immediate value
12019                     l -- .lit4
12020
12021                     The .lit4 and .lit8 sections are only used if
12022                     permitted by the -G argument.
12023
12024                     The code below needs to know whether the target register
12025                     is 32 or 64 bits wide.  It relies on the fact 'f' and
12026                     'F' are used with GPR-based instructions and 'l' and
12027                     'L' are used with FPR-based instructions.  */
12028
12029                 f64 = *args == 'F' || *args == 'L';
12030                 using_gprs = *args == 'F' || *args == 'f';
12031
12032                 save_in = input_line_pointer;
12033                 input_line_pointer = s;
12034                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
12035                 length = len;
12036                 s = input_line_pointer;
12037                 input_line_pointer = save_in;
12038                 if (err != NULL && *err != '\0')
12039                   {
12040                     as_bad (_("Bad floating point constant: %s"), err);
12041                     memset (temp, '\0', sizeof temp);
12042                     length = f64 ? 8 : 4;
12043                   }
12044
12045                 gas_assert (length == (unsigned) (f64 ? 8 : 4));
12046
12047                 if (*args == 'f'
12048                     || (*args == 'l'
12049                         && (g_switch_value < 4
12050                             || (temp[0] == 0 && temp[1] == 0)
12051                             || (temp[2] == 0 && temp[3] == 0))))
12052                   {
12053                     imm_expr.X_op = O_constant;
12054                     if (!target_big_endian)
12055                       imm_expr.X_add_number = bfd_getl32 (temp);
12056                     else
12057                       imm_expr.X_add_number = bfd_getb32 (temp);
12058                   }
12059                 else if (length > 4
12060                          && !mips_disable_float_construction
12061                          /* Constants can only be constructed in GPRs and
12062                             copied to FPRs if the GPRs are at least as wide
12063                             as the FPRs.  Force the constant into memory if
12064                             we are using 64-bit FPRs but the GPRs are only
12065                             32 bits wide.  */
12066                          && (using_gprs
12067                              || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
12068                          && ((temp[0] == 0 && temp[1] == 0)
12069                              || (temp[2] == 0 && temp[3] == 0))
12070                          && ((temp[4] == 0 && temp[5] == 0)
12071                              || (temp[6] == 0 && temp[7] == 0)))
12072                   {
12073                     /* The value is simple enough to load with a couple of
12074                        instructions.  If using 32-bit registers, set
12075                        imm_expr to the high order 32 bits and offset_expr to
12076                        the low order 32 bits.  Otherwise, set imm_expr to
12077                        the entire 64 bit constant.  */
12078                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
12079                       {
12080                         imm_expr.X_op = O_constant;
12081                         offset_expr.X_op = O_constant;
12082                         if (!target_big_endian)
12083                           {
12084                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
12085                             offset_expr.X_add_number = bfd_getl32 (temp);
12086                           }
12087                         else
12088                           {
12089                             imm_expr.X_add_number = bfd_getb32 (temp);
12090                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
12091                           }
12092                         if (offset_expr.X_add_number == 0)
12093                           offset_expr.X_op = O_absent;
12094                       }
12095                     else if (sizeof (imm_expr.X_add_number) > 4)
12096                       {
12097                         imm_expr.X_op = O_constant;
12098                         if (!target_big_endian)
12099                           imm_expr.X_add_number = bfd_getl64 (temp);
12100                         else
12101                           imm_expr.X_add_number = bfd_getb64 (temp);
12102                       }
12103                     else
12104                       {
12105                         imm_expr.X_op = O_big;
12106                         imm_expr.X_add_number = 4;
12107                         if (!target_big_endian)
12108                           {
12109                             generic_bignum[0] = bfd_getl16 (temp);
12110                             generic_bignum[1] = bfd_getl16 (temp + 2);
12111                             generic_bignum[2] = bfd_getl16 (temp + 4);
12112                             generic_bignum[3] = bfd_getl16 (temp + 6);
12113                           }
12114                         else
12115                           {
12116                             generic_bignum[0] = bfd_getb16 (temp + 6);
12117                             generic_bignum[1] = bfd_getb16 (temp + 4);
12118                             generic_bignum[2] = bfd_getb16 (temp + 2);
12119                             generic_bignum[3] = bfd_getb16 (temp);
12120                           }
12121                       }
12122                   }
12123                 else
12124                   {
12125                     const char *newname;
12126                     segT new_seg;
12127
12128                     /* Switch to the right section.  */
12129                     seg = now_seg;
12130                     subseg = now_subseg;
12131                     switch (*args)
12132                       {
12133                       default: /* unused default case avoids warnings.  */
12134                       case 'L':
12135                         newname = RDATA_SECTION_NAME;
12136                         if (g_switch_value >= 8)
12137                           newname = ".lit8";
12138                         break;
12139                       case 'F':
12140                         newname = RDATA_SECTION_NAME;
12141                         break;
12142                       case 'l':
12143                         gas_assert (g_switch_value >= 4);
12144                         newname = ".lit4";
12145                         break;
12146                       }
12147                     new_seg = subseg_new (newname, (subsegT) 0);
12148                     if (IS_ELF)
12149                       bfd_set_section_flags (stdoutput, new_seg,
12150                                              (SEC_ALLOC
12151                                               | SEC_LOAD
12152                                               | SEC_READONLY
12153                                               | SEC_DATA));
12154                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
12155                     if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
12156                       record_alignment (new_seg, 4);
12157                     else
12158                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
12159                     if (seg == now_seg)
12160                       as_bad (_("Can't use floating point insn in this section"));
12161
12162                     /* Set the argument to the current address in the
12163                        section.  */
12164                     offset_expr.X_op = O_symbol;
12165                     offset_expr.X_add_symbol = symbol_temp_new_now ();
12166                     offset_expr.X_add_number = 0;
12167
12168                     /* Put the floating point number into the section.  */
12169                     p = frag_more ((int) length);
12170                     memcpy (p, temp, length);
12171
12172                     /* Switch back to the original section.  */
12173                     subseg_set (seg, subseg);
12174                   }
12175               }
12176               continue;
12177
12178             case 'i':           /* 16-bit unsigned immediate.  */
12179             case 'j':           /* 16-bit signed immediate.  */
12180               *imm_reloc = BFD_RELOC_LO16;
12181               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
12182                 {
12183                   int more;
12184                   offsetT minval, maxval;
12185
12186                   more = (insn + 1 < past
12187                           && strcmp (insn->name, insn[1].name) == 0);
12188
12189                   /* If the expression was written as an unsigned number,
12190                      only treat it as signed if there are no more
12191                      alternatives.  */
12192                   if (more
12193                       && *args == 'j'
12194                       && sizeof (imm_expr.X_add_number) <= 4
12195                       && imm_expr.X_op == O_constant
12196                       && imm_expr.X_add_number < 0
12197                       && imm_expr.X_unsigned
12198                       && HAVE_64BIT_GPRS)
12199                     break;
12200
12201                   /* For compatibility with older assemblers, we accept
12202                      0x8000-0xffff as signed 16-bit numbers when only
12203                      signed numbers are allowed.  */
12204                   if (*args == 'i')
12205                     minval = 0, maxval = 0xffff;
12206                   else if (more)
12207                     minval = -0x8000, maxval = 0x7fff;
12208                   else
12209                     minval = -0x8000, maxval = 0xffff;
12210
12211                   if (imm_expr.X_op != O_constant
12212                       || imm_expr.X_add_number < minval
12213                       || imm_expr.X_add_number > maxval)
12214                     {
12215                       if (more)
12216                         break;
12217                       if (imm_expr.X_op == O_constant
12218                           || imm_expr.X_op == O_big)
12219                         as_bad (_("Expression out of range"));
12220                     }
12221                 }
12222               s = expr_end;
12223               continue;
12224
12225             case 'o':           /* 16-bit offset.  */
12226               offset_reloc[0] = BFD_RELOC_LO16;
12227               offset_reloc[1] = BFD_RELOC_UNUSED;
12228               offset_reloc[2] = BFD_RELOC_UNUSED;
12229
12230               /* Check whether there is only a single bracketed expression
12231                  left.  If so, it must be the base register and the
12232                  constant must be zero.  */
12233               if (*s == '(' && strchr (s + 1, '(') == 0)
12234                 {
12235                   offset_expr.X_op = O_constant;
12236                   offset_expr.X_add_number = 0;
12237                   continue;
12238                 }
12239
12240               /* If this value won't fit into a 16 bit offset, then go
12241                  find a macro that will generate the 32 bit offset
12242                  code pattern.  */
12243               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
12244                   && (offset_expr.X_op != O_constant
12245                       || offset_expr.X_add_number >= 0x8000
12246                       || offset_expr.X_add_number < -0x8000))
12247                 break;
12248
12249               s = expr_end;
12250               continue;
12251
12252             case 'p':           /* PC-relative offset.  */
12253               *offset_reloc = BFD_RELOC_16_PCREL_S2;
12254               my_getExpression (&offset_expr, s);
12255               s = expr_end;
12256               continue;
12257
12258             case 'u':           /* Upper 16 bits.  */
12259               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
12260                   && imm_expr.X_op == O_constant
12261                   && (imm_expr.X_add_number < 0
12262                       || imm_expr.X_add_number >= 0x10000))
12263                 as_bad (_("lui expression (%lu) not in range 0..65535"),
12264                         (unsigned long) imm_expr.X_add_number);
12265               s = expr_end;
12266               continue;
12267
12268             case 'a':           /* 26-bit address.  */
12269               *offset_reloc = BFD_RELOC_MIPS_JMP;
12270               my_getExpression (&offset_expr, s);
12271               s = expr_end;
12272               continue;
12273
12274             case 'N':           /* 3-bit branch condition code.  */
12275             case 'M':           /* 3-bit compare condition code.  */
12276               rtype = RTYPE_CCC;
12277               if (ip->insn_mo->pinfo & (FP_D | FP_S))
12278                 rtype |= RTYPE_FCC;
12279               if (!reg_lookup (&s, rtype, &regno))
12280                 break;
12281               if ((strcmp (str + strlen (str) - 3, ".ps") == 0
12282                    || strcmp (str + strlen (str) - 5, "any2f") == 0
12283                    || strcmp (str + strlen (str) - 5, "any2t") == 0)
12284                   && (regno & 1) != 0)
12285                 as_warn (_("Condition code register should be even for %s, "
12286                            "was %d"),
12287                          str, regno);
12288               if ((strcmp (str + strlen (str) - 5, "any4f") == 0
12289                    || strcmp (str + strlen (str) - 5, "any4t") == 0)
12290                   && (regno & 3) != 0)
12291                 as_warn (_("Condition code register should be 0 or 4 for %s, "
12292                            "was %d"),
12293                          str, regno);
12294               if (*args == 'N')
12295                 INSERT_OPERAND (mips_opts.micromips, BCC, *ip, regno);
12296               else
12297                 INSERT_OPERAND (mips_opts.micromips, CCC, *ip, regno);
12298               continue;
12299
12300             case 'H':
12301               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
12302                 s += 2;
12303               if (ISDIGIT (*s))
12304                 {
12305                   c = 0;
12306                   do
12307                     {
12308                       c *= 10;
12309                       c += *s - '0';
12310                       ++s;
12311                     }
12312                   while (ISDIGIT (*s));
12313                 }
12314               else
12315                 c = 8; /* Invalid sel value.  */
12316
12317               if (c > 7)
12318                 as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
12319               INSERT_OPERAND (mips_opts.micromips, SEL, *ip, c);
12320               continue;
12321
12322             case 'e':
12323               gas_assert (!mips_opts.micromips);
12324               /* Must be at least one digit.  */
12325               my_getExpression (&imm_expr, s);
12326               check_absolute_expr (ip, &imm_expr);
12327
12328               if ((unsigned long) imm_expr.X_add_number
12329                   > (unsigned long) OP_MASK_VECBYTE)
12330                 {
12331                   as_bad (_("bad byte vector index (%ld)"),
12332                            (long) imm_expr.X_add_number);
12333                   imm_expr.X_add_number = 0;
12334                 }
12335
12336               INSERT_OPERAND (0, VECBYTE, *ip, imm_expr.X_add_number);
12337               imm_expr.X_op = O_absent;
12338               s = expr_end;
12339               continue;
12340
12341             case '%':
12342               gas_assert (!mips_opts.micromips);
12343               my_getExpression (&imm_expr, s);
12344               check_absolute_expr (ip, &imm_expr);
12345
12346               if ((unsigned long) imm_expr.X_add_number
12347                   > (unsigned long) OP_MASK_VECALIGN)
12348                 {
12349                   as_bad (_("bad byte vector index (%ld)"),
12350                            (long) imm_expr.X_add_number);
12351                   imm_expr.X_add_number = 0;
12352                 }
12353
12354               INSERT_OPERAND (0, VECALIGN, *ip, imm_expr.X_add_number);
12355               imm_expr.X_op = O_absent;
12356               s = expr_end;
12357               continue;
12358
12359             case 'm':           /* Opcode extension character.  */
12360               gas_assert (mips_opts.micromips);
12361               c = *++args;
12362               switch (c)
12363                 {
12364                 case 'r':
12365                   if (strncmp (s, "$pc", 3) == 0)
12366                     {
12367                       s += 3;
12368                       continue;
12369                     }
12370                   break;
12371
12372                 case 'a':
12373                 case 'b':
12374                 case 'c':
12375                 case 'd':
12376                 case 'e':
12377                 case 'f':
12378                 case 'g':
12379                 case 'h':
12380                 case 'i':
12381                 case 'j':
12382                 case 'l':
12383                 case 'm':
12384                 case 'n':
12385                 case 'p':
12386                 case 'q':
12387                 case 's':
12388                 case 't':
12389                 case 'x':
12390                 case 'y':
12391                 case 'z':
12392                   s_reset = s;
12393                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
12394                   if (regno == AT && mips_opts.at)
12395                     {
12396                       if (mips_opts.at == ATREG)
12397                         as_warn (_("Used $at without \".set noat\""));
12398                       else
12399                         as_warn (_("Used $%u with \".set at=$%u\""),
12400                                  regno, mips_opts.at);
12401                     }
12402                   if (!ok)
12403                     {
12404                       if (c == 'c')
12405                         {
12406                           gas_assert (args[1] == ',');
12407                           regno = lastregno;
12408                           ++args;
12409                         }
12410                       else if (c == 't')
12411                         {
12412                           gas_assert (args[1] == ',');
12413                           ++args;
12414                           continue;                     /* Nothing to do.  */
12415                         }
12416                       else
12417                         break;
12418                     }
12419
12420                   if (c == 'j' && !strncmp (ip->insn_mo->name, "jalr", 4))
12421                     {
12422                       if (regno == lastregno)
12423                         {
12424                           insn_error
12425                             = _("Source and destination must be different");
12426                           continue;
12427                         }
12428                       if (regno == 31 && lastregno == 0xffffffff)
12429                         {
12430                           insn_error
12431                             = _("A destination register must be supplied");
12432                           continue;
12433                         }
12434                     }
12435
12436                   if (*s == ' ')
12437                     ++s;
12438                   if (args[1] != *s)
12439                     {
12440                       if (c == 'e')
12441                         {
12442                           gas_assert (args[1] == ',');
12443                           regno = lastregno;
12444                           s = s_reset;
12445                           ++args;
12446                         }
12447                       else if (c == 't')
12448                         {
12449                           gas_assert (args[1] == ',');
12450                           s = s_reset;
12451                           ++args;
12452                           continue;                     /* Nothing to do.  */
12453                         }
12454                     }
12455
12456                   /* Make sure regno is the same as lastregno.  */
12457                   if (c == 't' && regno != lastregno)
12458                     break;
12459
12460                   /* Make sure regno is the same as destregno.  */
12461                   if (c == 'x' && regno != destregno)
12462                     break;
12463
12464                   /* We need to save regno, before regno maps to the
12465                      microMIPS register encoding.  */
12466                   lastregno = regno;
12467
12468                   if (c == 'f')
12469                     destregno = regno;
12470
12471                   switch (c)
12472                     {
12473                       case 'a':
12474                         if (regno != GP)
12475                           regno = ILLEGAL_REG;
12476                         break;
12477
12478                       case 'b':
12479                         regno = mips32_to_micromips_reg_b_map[regno];
12480                         break;
12481
12482                       case 'c':
12483                         regno = mips32_to_micromips_reg_c_map[regno];
12484                         break;
12485
12486                       case 'd':
12487                         regno = mips32_to_micromips_reg_d_map[regno];
12488                         break;
12489
12490                       case 'e':
12491                         regno = mips32_to_micromips_reg_e_map[regno];
12492                         break;
12493
12494                       case 'f':
12495                         regno = mips32_to_micromips_reg_f_map[regno];
12496                         break;
12497
12498                       case 'g':
12499                         regno = mips32_to_micromips_reg_g_map[regno];
12500                         break;
12501
12502                       case 'h':
12503                         regno = mips32_to_micromips_reg_h_map[regno];
12504                         break;
12505
12506                       case 'i':
12507                         switch (EXTRACT_OPERAND (1, MI, *ip))
12508                           {
12509                             case 4:
12510                               if (regno == 21)
12511                                 regno = 3;
12512                               else if (regno == 22)
12513                                 regno = 4;
12514                               else if (regno == 5)
12515                                 regno = 5;
12516                               else if (regno == 6)
12517                                 regno = 6;
12518                               else if (regno == 7)
12519                                 regno = 7;
12520                               else
12521                                 regno = ILLEGAL_REG;
12522                               break;
12523
12524                             case 5:
12525                               if (regno == 6)
12526                                 regno = 0;
12527                               else if (regno == 7)
12528                                 regno = 1;
12529                               else
12530                                 regno = ILLEGAL_REG;
12531                               break;
12532
12533                             case 6:
12534                               if (regno == 7)
12535                                 regno = 2;
12536                               else
12537                                 regno = ILLEGAL_REG;
12538                               break;
12539
12540                             default:
12541                               regno = ILLEGAL_REG;
12542                               break;
12543                           }
12544                         break;
12545
12546                       case 'l':
12547                         regno = mips32_to_micromips_reg_l_map[regno];
12548                         break;
12549
12550                       case 'm':
12551                         regno = mips32_to_micromips_reg_m_map[regno];
12552                         break;
12553
12554                       case 'n':
12555                         regno = mips32_to_micromips_reg_n_map[regno];
12556                         break;
12557
12558                       case 'q':
12559                         regno = mips32_to_micromips_reg_q_map[regno];
12560                         break;
12561
12562                       case 's':
12563                         if (regno != SP)
12564                           regno = ILLEGAL_REG;
12565                         break;
12566
12567                       case 'y':
12568                         if (regno != 31)
12569                           regno = ILLEGAL_REG;
12570                         break;
12571
12572                       case 'z':
12573                         if (regno != ZERO)
12574                           regno = ILLEGAL_REG;
12575                         break;
12576
12577                       case 'j': /* Do nothing.  */
12578                       case 'p':
12579                       case 't':
12580                       case 'x':
12581                         break;
12582
12583                       default:
12584                         internalError ();
12585                     }
12586
12587                   if (regno == ILLEGAL_REG)
12588                     break;
12589
12590                   switch (c)
12591                     {
12592                       case 'b':
12593                         INSERT_OPERAND (1, MB, *ip, regno);
12594                         break;
12595
12596                       case 'c':
12597                         INSERT_OPERAND (1, MC, *ip, regno);
12598                         break;
12599
12600                       case 'd':
12601                         INSERT_OPERAND (1, MD, *ip, regno);
12602                         break;
12603
12604                       case 'e':
12605                         INSERT_OPERAND (1, ME, *ip, regno);
12606                         break;
12607
12608                       case 'f':
12609                         INSERT_OPERAND (1, MF, *ip, regno);
12610                         break;
12611
12612                       case 'g':
12613                         INSERT_OPERAND (1, MG, *ip, regno);
12614                         break;
12615
12616                       case 'h':
12617                         INSERT_OPERAND (1, MH, *ip, regno);
12618                         break;
12619
12620                       case 'i':
12621                         INSERT_OPERAND (1, MI, *ip, regno);
12622                         break;
12623
12624                       case 'j':
12625                         INSERT_OPERAND (1, MJ, *ip, regno);
12626                         break;
12627
12628                       case 'l':
12629                         INSERT_OPERAND (1, ML, *ip, regno);
12630                         break;
12631
12632                       case 'm':
12633                         INSERT_OPERAND (1, MM, *ip, regno);
12634                         break;
12635
12636                       case 'n':
12637                         INSERT_OPERAND (1, MN, *ip, regno);
12638                         break;
12639
12640                       case 'p':
12641                         INSERT_OPERAND (1, MP, *ip, regno);
12642                         break;
12643
12644                       case 'q':
12645                         INSERT_OPERAND (1, MQ, *ip, regno);
12646                         break;
12647
12648                       case 'a': /* Do nothing.  */
12649                       case 's': /* Do nothing.  */
12650                       case 't': /* Do nothing.  */
12651                       case 'x': /* Do nothing.  */
12652                       case 'y': /* Do nothing.  */
12653                       case 'z': /* Do nothing.  */
12654                         break;
12655
12656                       default:
12657                         internalError ();
12658                     }
12659                   continue;
12660
12661                 case 'A':
12662                   {
12663                     bfd_reloc_code_real_type r[3];
12664                     expressionS ep;
12665                     int imm;
12666
12667                     /* Check whether there is only a single bracketed
12668                        expression left.  If so, it must be the base register
12669                        and the constant must be zero.  */
12670                     if (*s == '(' && strchr (s + 1, '(') == 0)
12671                       {
12672                         INSERT_OPERAND (1, IMMA, *ip, 0);
12673                         continue;
12674                       }
12675
12676                     if (my_getSmallExpression (&ep, r, s) > 0
12677                         || !expr_const_in_range (&ep, -64, 64, 2))
12678                       break;
12679
12680                     imm = ep.X_add_number >> 2;
12681                     INSERT_OPERAND (1, IMMA, *ip, imm);
12682                   }
12683                   s = expr_end;
12684                   continue;
12685
12686                 case 'B':
12687                   {
12688                     bfd_reloc_code_real_type r[3];
12689                     expressionS ep;
12690                     int imm;
12691
12692                     if (my_getSmallExpression (&ep, r, s) > 0
12693                         || ep.X_op != O_constant)
12694                       break;
12695
12696                     for (imm = 0; imm < 8; imm++)
12697                       if (micromips_imm_b_map[imm] == ep.X_add_number)
12698                         break;
12699                     if (imm >= 8)
12700                       break;
12701
12702                     INSERT_OPERAND (1, IMMB, *ip, imm);
12703                   }
12704                   s = expr_end;
12705                   continue;
12706
12707                 case 'C':
12708                   {
12709                     bfd_reloc_code_real_type r[3];
12710                     expressionS ep;
12711                     int imm;
12712
12713                     if (my_getSmallExpression (&ep, r, s) > 0
12714                         || ep.X_op != O_constant)
12715                       break;
12716
12717                     for (imm = 0; imm < 16; imm++)
12718                       if (micromips_imm_c_map[imm] == ep.X_add_number)
12719                         break;
12720                     if (imm >= 16)
12721                       break;
12722
12723                     INSERT_OPERAND (1, IMMC, *ip, imm);
12724                   }
12725                   s = expr_end;
12726                   continue;
12727
12728                 case 'D':       /* pc relative offset */
12729                 case 'E':       /* pc relative offset */
12730                   my_getExpression (&offset_expr, s);
12731                   if (offset_expr.X_op == O_register)
12732                     break;
12733
12734                   if (!forced_insn_length)
12735                     *offset_reloc = (int) BFD_RELOC_UNUSED + c;
12736                   else if (c == 'D')
12737                     *offset_reloc = BFD_RELOC_MICROMIPS_10_PCREL_S1;
12738                   else
12739                     *offset_reloc = BFD_RELOC_MICROMIPS_7_PCREL_S1;
12740                   s = expr_end;
12741                   continue;
12742
12743                 case 'F':
12744                   {
12745                     bfd_reloc_code_real_type r[3];
12746                     expressionS ep;
12747                     int imm;
12748
12749                     if (my_getSmallExpression (&ep, r, s) > 0
12750                         || !expr_const_in_range (&ep, 0, 16, 0))
12751                       break;
12752
12753                     imm = ep.X_add_number;
12754                     INSERT_OPERAND (1, IMMF, *ip, imm);
12755                   }
12756                   s = expr_end;
12757                   continue;
12758
12759                 case 'G':
12760                   {
12761                     bfd_reloc_code_real_type r[3];
12762                     expressionS ep;
12763                     int imm;
12764
12765                     /* Check whether there is only a single bracketed
12766                        expression left.  If so, it must be the base register
12767                        and the constant must be zero.  */
12768                     if (*s == '(' && strchr (s + 1, '(') == 0)
12769                       {
12770                         INSERT_OPERAND (1, IMMG, *ip, 0);
12771                         continue;
12772                       }
12773
12774                     if (my_getSmallExpression (&ep, r, s) > 0
12775                         || !expr_const_in_range (&ep, -1, 15, 0))
12776                       break;
12777
12778                     imm = ep.X_add_number & 15;
12779                     INSERT_OPERAND (1, IMMG, *ip, imm);
12780                   }
12781                   s = expr_end;
12782                   continue;
12783
12784                 case 'H':
12785                   {
12786                     bfd_reloc_code_real_type r[3];
12787                     expressionS ep;
12788                     int imm;
12789
12790                     /* Check whether there is only a single bracketed
12791                        expression left.  If so, it must be the base register
12792                        and the constant must be zero.  */
12793                     if (*s == '(' && strchr (s + 1, '(') == 0)
12794                       {
12795                         INSERT_OPERAND (1, IMMH, *ip, 0);
12796                         continue;
12797                       }
12798
12799                     if (my_getSmallExpression (&ep, r, s) > 0
12800                         || !expr_const_in_range (&ep, 0, 16, 1))
12801                       break;
12802
12803                     imm = ep.X_add_number >> 1;
12804                     INSERT_OPERAND (1, IMMH, *ip, imm);
12805                   }
12806                   s = expr_end;
12807                   continue;
12808
12809                 case 'I':
12810                   {
12811                     bfd_reloc_code_real_type r[3];
12812                     expressionS ep;
12813                     int imm;
12814
12815                     if (my_getSmallExpression (&ep, r, s) > 0
12816                         || !expr_const_in_range (&ep, -1, 127, 0))
12817                       break;
12818
12819                     imm = ep.X_add_number & 127;
12820                     INSERT_OPERAND (1, IMMI, *ip, imm);
12821                   }
12822                   s = expr_end;
12823                   continue;
12824
12825                 case 'J':
12826                   {
12827                     bfd_reloc_code_real_type r[3];
12828                     expressionS ep;
12829                     int imm;
12830
12831                     /* Check whether there is only a single bracketed
12832                        expression left.  If so, it must be the base register
12833                        and the constant must be zero.  */
12834                     if (*s == '(' && strchr (s + 1, '(') == 0)
12835                       {
12836                         INSERT_OPERAND (1, IMMJ, *ip, 0);
12837                         continue;
12838                       }
12839
12840                     if (my_getSmallExpression (&ep, r, s) > 0
12841                         || !expr_const_in_range (&ep, 0, 16, 2))
12842                       break;
12843
12844                     imm = ep.X_add_number >> 2;
12845                     INSERT_OPERAND (1, IMMJ, *ip, imm);
12846                   }
12847                   s = expr_end;
12848                   continue;
12849
12850                 case 'L':
12851                   {
12852                     bfd_reloc_code_real_type r[3];
12853                     expressionS ep;
12854                     int imm;
12855
12856                     /* Check whether there is only a single bracketed
12857                        expression left.  If so, it must be the base register
12858                        and the constant must be zero.  */
12859                     if (*s == '(' && strchr (s + 1, '(') == 0)
12860                       {
12861                         INSERT_OPERAND (1, IMML, *ip, 0);
12862                         continue;
12863                       }
12864
12865                     if (my_getSmallExpression (&ep, r, s) > 0
12866                         || !expr_const_in_range (&ep, 0, 16, 0))
12867                       break;
12868
12869                     imm = ep.X_add_number;
12870                     INSERT_OPERAND (1, IMML, *ip, imm);
12871                   }
12872                   s = expr_end;
12873                   continue;
12874
12875                 case 'M':
12876                   {
12877                     bfd_reloc_code_real_type r[3];
12878                     expressionS ep;
12879                     int imm;
12880
12881                     if (my_getSmallExpression (&ep, r, s) > 0
12882                         || !expr_const_in_range (&ep, 1, 9, 0))
12883                       break;
12884
12885                     imm = ep.X_add_number & 7;
12886                     INSERT_OPERAND (1, IMMM, *ip, imm);
12887                   }
12888                   s = expr_end;
12889                   continue;
12890
12891                 case 'N':       /* Register list for lwm and swm.  */
12892                   {
12893                     /* A comma-separated list of registers and/or
12894                        dash-separated contiguous ranges including
12895                        both ra and a set of one or more registers
12896                        starting at s0 up to s3 which have to be
12897                        consecutive, e.g.:
12898
12899                        s0, ra
12900                        s0, s1, ra, s2, s3
12901                        s0-s2, ra
12902
12903                        and any permutations of these.  */
12904                     unsigned int reglist;
12905                     int imm;
12906
12907                     if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
12908                       break;
12909
12910                     if ((reglist & 0xfff1ffff) != 0x80010000)
12911                       break;
12912
12913                     reglist = (reglist >> 17) & 7;
12914                     reglist += 1;
12915                     if ((reglist & -reglist) != reglist)
12916                       break;
12917
12918                     imm = ffs (reglist) - 1;
12919                     INSERT_OPERAND (1, IMMN, *ip, imm);
12920                   }
12921                   continue;
12922
12923                 case 'O':       /* sdbbp 4-bit code.  */
12924                   {
12925                     bfd_reloc_code_real_type r[3];
12926                     expressionS ep;
12927                     int imm;
12928
12929                     if (my_getSmallExpression (&ep, r, s) > 0
12930                         || !expr_const_in_range (&ep, 0, 16, 0))
12931                       break;
12932
12933                     imm = ep.X_add_number;
12934                     INSERT_OPERAND (1, IMMO, *ip, imm);
12935                   }
12936                   s = expr_end;
12937                   continue;
12938
12939                 case 'P':
12940                   {
12941                     bfd_reloc_code_real_type r[3];
12942                     expressionS ep;
12943                     int imm;
12944
12945                     if (my_getSmallExpression (&ep, r, s) > 0
12946                         || !expr_const_in_range (&ep, 0, 32, 2))
12947                       break;
12948
12949                     imm = ep.X_add_number >> 2;
12950                     INSERT_OPERAND (1, IMMP, *ip, imm);
12951                   }
12952                   s = expr_end;
12953                   continue;
12954
12955                 case 'Q':
12956                   {
12957                     bfd_reloc_code_real_type r[3];
12958                     expressionS ep;
12959                     int imm;
12960
12961                     if (my_getSmallExpression (&ep, r, s) > 0
12962                         || !expr_const_in_range (&ep, -0x400000, 0x400000, 2))
12963                       break;
12964
12965                     imm = ep.X_add_number >> 2;
12966                     INSERT_OPERAND (1, IMMQ, *ip, imm);
12967                   }
12968                   s = expr_end;
12969                   continue;
12970
12971                 case 'U':
12972                   {
12973                     bfd_reloc_code_real_type r[3];
12974                     expressionS ep;
12975                     int imm;
12976
12977                     /* Check whether there is only a single bracketed
12978                        expression left.  If so, it must be the base register
12979                        and the constant must be zero.  */
12980                     if (*s == '(' && strchr (s + 1, '(') == 0)
12981                       {
12982                         INSERT_OPERAND (1, IMMU, *ip, 0);
12983                         continue;
12984                       }
12985
12986                     if (my_getSmallExpression (&ep, r, s) > 0
12987                         || !expr_const_in_range (&ep, 0, 32, 2))
12988                       break;
12989
12990                     imm = ep.X_add_number >> 2;
12991                     INSERT_OPERAND (1, IMMU, *ip, imm);
12992                   }
12993                   s = expr_end;
12994                   continue;
12995
12996                 case 'W':
12997                   {
12998                     bfd_reloc_code_real_type r[3];
12999                     expressionS ep;
13000                     int imm;
13001
13002                     if (my_getSmallExpression (&ep, r, s) > 0
13003                         || !expr_const_in_range (&ep, 0, 64, 2))
13004                       break;
13005
13006                     imm = ep.X_add_number >> 2;
13007                     INSERT_OPERAND (1, IMMW, *ip, imm);
13008                   }
13009                   s = expr_end;
13010                   continue;
13011
13012                 case 'X':
13013                   {
13014                     bfd_reloc_code_real_type r[3];
13015                     expressionS ep;
13016                     int imm;
13017
13018                     if (my_getSmallExpression (&ep, r, s) > 0
13019                         || !expr_const_in_range (&ep, -8, 8, 0))
13020                       break;
13021
13022                     imm = ep.X_add_number;
13023                     INSERT_OPERAND (1, IMMX, *ip, imm);
13024                   }
13025                   s = expr_end;
13026                   continue;
13027
13028                 case 'Y':
13029                   {
13030                     bfd_reloc_code_real_type r[3];
13031                     expressionS ep;
13032                     int imm;
13033
13034                     if (my_getSmallExpression (&ep, r, s) > 0
13035                         || expr_const_in_range (&ep, -2, 2, 2)
13036                         || !expr_const_in_range (&ep, -258, 258, 2))
13037                       break;
13038
13039                     imm = ep.X_add_number >> 2;
13040                     imm = ((imm >> 1) & ~0xff) | (imm & 0xff);
13041                     INSERT_OPERAND (1, IMMY, *ip, imm);
13042                   }
13043                   s = expr_end;
13044                   continue;
13045
13046                 case 'Z':
13047                   {
13048                     bfd_reloc_code_real_type r[3];
13049                     expressionS ep;
13050
13051                     if (my_getSmallExpression (&ep, r, s) > 0
13052                         || !expr_const_in_range (&ep, 0, 1, 0))
13053                       break;
13054                   }
13055                   s = expr_end;
13056                   continue;
13057
13058                 default:
13059                   as_bad (_("Internal error: bad microMIPS opcode "
13060                             "(unknown extension operand type `m%c'): %s %s"),
13061                           *args, insn->name, insn->args);
13062                   /* Further processing is fruitless.  */
13063                   return;
13064                 }
13065               break;
13066
13067             case 'n':           /* Register list for 32-bit lwm and swm.  */
13068               gas_assert (mips_opts.micromips);
13069               {
13070                 /* A comma-separated list of registers and/or
13071                    dash-separated contiguous ranges including
13072                    at least one of ra and a set of one or more
13073                    registers starting at s0 up to s7 and then
13074                    s8 which have to be consecutive, e.g.:
13075
13076                    ra
13077                    s0
13078                    ra, s0, s1, s2
13079                    s0-s8
13080                    s0-s5, ra
13081
13082                    and any permutations of these.  */
13083                 unsigned int reglist;
13084                 int imm;
13085                 int ra;
13086
13087                 if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
13088                   break;
13089
13090                 if ((reglist & 0x3f00ffff) != 0)
13091                   break;
13092
13093                 ra = (reglist >> 27) & 0x10;
13094                 reglist = ((reglist >> 22) & 0x100) | ((reglist >> 16) & 0xff);
13095                 reglist += 1;
13096                 if ((reglist & -reglist) != reglist)
13097                   break;
13098
13099                 imm = (ffs (reglist) - 1) | ra;
13100                 INSERT_OPERAND (1, RT, *ip, imm);
13101                 imm_expr.X_op = O_absent;
13102               }
13103               continue;
13104
13105             case '|':           /* 4-bit trap code.  */
13106               gas_assert (mips_opts.micromips);
13107               my_getExpression (&imm_expr, s);
13108               check_absolute_expr (ip, &imm_expr);
13109               if ((unsigned long) imm_expr.X_add_number
13110                   > MICROMIPSOP_MASK_TRAP)
13111                 as_bad (_("Trap code (%lu) for %s not in 0..15 range"),
13112                         (unsigned long) imm_expr.X_add_number,
13113                         ip->insn_mo->name);
13114               INSERT_OPERAND (1, TRAP, *ip, imm_expr.X_add_number);
13115               imm_expr.X_op = O_absent;
13116               s = expr_end;
13117               continue;
13118
13119             default:
13120               as_bad (_("Bad char = '%c'\n"), *args);
13121               internalError ();
13122             }
13123           break;
13124         }
13125       /* Args don't match.  */
13126       s = argsStart;
13127       insn_error = _("Illegal operands");
13128       if (insn + 1 < past && !strcmp (insn->name, insn[1].name))
13129         {
13130           ++insn;
13131           continue;
13132         }
13133       else if (wrong_delay_slot_insns && need_delay_slot_ok)
13134         {
13135           gas_assert (firstinsn);
13136           need_delay_slot_ok = FALSE;
13137           past = insn + 1;
13138           insn = firstinsn;
13139           continue;
13140         }
13141       return;
13142     }
13143 }
13144
13145 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
13146
13147 /* This routine assembles an instruction into its binary format when
13148    assembling for the mips16.  As a side effect, it sets one of the
13149    global variables imm_reloc or offset_reloc to the type of relocation
13150    to do if one of the operands is an address expression.  It also sets
13151    forced_insn_length to the resulting instruction size in bytes if the
13152    user explicitly requested a small or extended instruction.  */
13153
13154 static void
13155 mips16_ip (char *str, struct mips_cl_insn *ip)
13156 {
13157   char *s;
13158   const char *args;
13159   struct mips_opcode *insn;
13160   char *argsstart;
13161   unsigned int regno;
13162   unsigned int lastregno = 0;
13163   char *s_reset;
13164   size_t i;
13165
13166   insn_error = NULL;
13167
13168   forced_insn_length = 0;
13169
13170   for (s = str; ISLOWER (*s); ++s)
13171     ;
13172   switch (*s)
13173     {
13174     case '\0':
13175       break;
13176
13177     case ' ':
13178       *s++ = '\0';
13179       break;
13180
13181     case '.':
13182       if (s[1] == 't' && s[2] == ' ')
13183         {
13184           *s = '\0';
13185           forced_insn_length = 2;
13186           s += 3;
13187           break;
13188         }
13189       else if (s[1] == 'e' && s[2] == ' ')
13190         {
13191           *s = '\0';
13192           forced_insn_length = 4;
13193           s += 3;
13194           break;
13195         }
13196       /* Fall through.  */
13197     default:
13198       insn_error = _("unknown opcode");
13199       return;
13200     }
13201
13202   if (mips_opts.noautoextend && !forced_insn_length)
13203     forced_insn_length = 2;
13204
13205   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
13206     {
13207       insn_error = _("unrecognized opcode");
13208       return;
13209     }
13210
13211   argsstart = s;
13212   for (;;)
13213     {
13214       bfd_boolean ok;
13215
13216       gas_assert (strcmp (insn->name, str) == 0);
13217
13218       ok = is_opcode_valid_16 (insn);
13219       if (! ok)
13220         {
13221           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
13222               && strcmp (insn->name, insn[1].name) == 0)
13223             {
13224               ++insn;
13225               continue;
13226             }
13227           else
13228             {
13229               if (!insn_error)
13230                 {
13231                   static char buf[100];
13232                   sprintf (buf,
13233                            _("opcode not supported on this processor: %s (%s)"),
13234                            mips_cpu_info_from_arch (mips_opts.arch)->name,
13235                            mips_cpu_info_from_isa (mips_opts.isa)->name);
13236                   insn_error = buf;
13237                 }
13238               return;
13239             }
13240         }
13241
13242       create_insn (ip, insn);
13243       imm_expr.X_op = O_absent;
13244       imm_reloc[0] = BFD_RELOC_UNUSED;
13245       imm_reloc[1] = BFD_RELOC_UNUSED;
13246       imm_reloc[2] = BFD_RELOC_UNUSED;
13247       imm2_expr.X_op = O_absent;
13248       offset_expr.X_op = O_absent;
13249       offset_reloc[0] = BFD_RELOC_UNUSED;
13250       offset_reloc[1] = BFD_RELOC_UNUSED;
13251       offset_reloc[2] = BFD_RELOC_UNUSED;
13252       for (args = insn->args; 1; ++args)
13253         {
13254           int c;
13255
13256           if (*s == ' ')
13257             ++s;
13258
13259           /* In this switch statement we call break if we did not find
13260              a match, continue if we did find a match, or return if we
13261              are done.  */
13262
13263           c = *args;
13264           switch (c)
13265             {
13266             case '\0':
13267               if (*s == '\0')
13268                 {
13269                   /* Stuff the immediate value in now, if we can.  */
13270                   if (imm_expr.X_op == O_constant
13271                       && *imm_reloc > BFD_RELOC_UNUSED
13272                       && *imm_reloc != BFD_RELOC_MIPS16_GOT16
13273                       && *imm_reloc != BFD_RELOC_MIPS16_CALL16
13274                       && insn->pinfo != INSN_MACRO)
13275                     {
13276                       valueT tmp;
13277
13278                       switch (*offset_reloc)
13279                         {
13280                           case BFD_RELOC_MIPS16_HI16_S:
13281                             tmp = (imm_expr.X_add_number + 0x8000) >> 16;
13282                             break;
13283
13284                           case BFD_RELOC_MIPS16_HI16:
13285                             tmp = imm_expr.X_add_number >> 16;
13286                             break;
13287
13288                           case BFD_RELOC_MIPS16_LO16:
13289                             tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
13290                                   - 0x8000;
13291                             break;
13292
13293                           case BFD_RELOC_UNUSED:
13294                             tmp = imm_expr.X_add_number;
13295                             break;
13296
13297                           default:
13298                             internalError ();
13299                         }
13300                       *offset_reloc = BFD_RELOC_UNUSED;
13301
13302                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
13303                                     tmp, TRUE, forced_insn_length == 2,
13304                                     forced_insn_length == 4, &ip->insn_opcode,
13305                                     &ip->use_extend, &ip->extend);
13306                       imm_expr.X_op = O_absent;
13307                       *imm_reloc = BFD_RELOC_UNUSED;
13308                     }
13309
13310                   return;
13311                 }
13312               break;
13313
13314             case ',':
13315               if (*s++ == c)
13316                 continue;
13317               s--;
13318               switch (*++args)
13319                 {
13320                 case 'v':
13321                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13322                   continue;
13323                 case 'w':
13324                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13325                   continue;
13326                 }
13327               break;
13328
13329             case '(':
13330             case ')':
13331               if (*s++ == c)
13332                 continue;
13333               break;
13334
13335             case 'v':
13336             case 'w':
13337               if (s[0] != '$')
13338                 {
13339                   if (c == 'v')
13340                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13341                   else
13342                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13343                   ++args;
13344                   continue;
13345                 }
13346               /* Fall through.  */
13347             case 'x':
13348             case 'y':
13349             case 'z':
13350             case 'Z':
13351             case '0':
13352             case 'S':
13353             case 'R':
13354             case 'X':
13355             case 'Y':
13356               s_reset = s;
13357               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
13358                 {
13359                   if (c == 'v' || c == 'w')
13360                     {
13361                       if (c == 'v')
13362                         MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13363                       else
13364                         MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13365                       ++args;
13366                       continue;
13367                     }
13368                   break;
13369                 }
13370
13371               if (*s == ' ')
13372                 ++s;
13373               if (args[1] != *s)
13374                 {
13375                   if (c == 'v' || c == 'w')
13376                     {
13377                       regno = mips16_to_32_reg_map[lastregno];
13378                       s = s_reset;
13379                       ++args;
13380                     }
13381                 }
13382
13383               switch (c)
13384                 {
13385                 case 'x':
13386                 case 'y':
13387                 case 'z':
13388                 case 'v':
13389                 case 'w':
13390                 case 'Z':
13391                   regno = mips32_to_16_reg_map[regno];
13392                   break;
13393
13394                 case '0':
13395                   if (regno != 0)
13396                     regno = ILLEGAL_REG;
13397                   break;
13398
13399                 case 'S':
13400                   if (regno != SP)
13401                     regno = ILLEGAL_REG;
13402                   break;
13403
13404                 case 'R':
13405                   if (regno != RA)
13406                     regno = ILLEGAL_REG;
13407                   break;
13408
13409                 case 'X':
13410                 case 'Y':
13411                   if (regno == AT && mips_opts.at)
13412                     {
13413                       if (mips_opts.at == ATREG)
13414                         as_warn (_("used $at without \".set noat\""));
13415                       else
13416                         as_warn (_("used $%u with \".set at=$%u\""),
13417                                  regno, mips_opts.at);
13418                     }
13419                   break;
13420
13421                 default:
13422                   internalError ();
13423                 }
13424
13425               if (regno == ILLEGAL_REG)
13426                 break;
13427
13428               switch (c)
13429                 {
13430                 case 'x':
13431                 case 'v':
13432                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
13433                   break;
13434                 case 'y':
13435                 case 'w':
13436                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
13437                   break;
13438                 case 'z':
13439                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
13440                   break;
13441                 case 'Z':
13442                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
13443                 case '0':
13444                 case 'S':
13445                 case 'R':
13446                   break;
13447                 case 'X':
13448                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
13449                   break;
13450                 case 'Y':
13451                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
13452                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
13453                   break;
13454                 default:
13455                   internalError ();
13456                 }
13457
13458               lastregno = regno;
13459               continue;
13460
13461             case 'P':
13462               if (strncmp (s, "$pc", 3) == 0)
13463                 {
13464                   s += 3;
13465                   continue;
13466                 }
13467               break;
13468
13469             case '5':
13470             case 'H':
13471             case 'W':
13472             case 'D':
13473             case 'j':
13474             case 'V':
13475             case 'C':
13476             case 'U':
13477             case 'k':
13478             case 'K':
13479               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
13480               if (i > 0)
13481                 {
13482                   if (imm_expr.X_op != O_constant)
13483                     {
13484                       forced_insn_length = 4;
13485                       ip->use_extend = TRUE;
13486                       ip->extend = 0;
13487                     }
13488                   else
13489                     {
13490                       /* We need to relax this instruction.  */
13491                       *offset_reloc = *imm_reloc;
13492                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13493                     }
13494                   s = expr_end;
13495                   continue;
13496                 }
13497               *imm_reloc = BFD_RELOC_UNUSED;
13498               /* Fall through.  */
13499             case '<':
13500             case '>':
13501             case '[':
13502             case ']':
13503             case '4':
13504             case '8':
13505               my_getExpression (&imm_expr, s);
13506               if (imm_expr.X_op == O_register)
13507                 {
13508                   /* What we thought was an expression turned out to
13509                      be a register.  */
13510
13511                   if (s[0] == '(' && args[1] == '(')
13512                     {
13513                       /* It looks like the expression was omitted
13514                          before a register indirection, which means
13515                          that the expression is implicitly zero.  We
13516                          still set up imm_expr, so that we handle
13517                          explicit extensions correctly.  */
13518                       imm_expr.X_op = O_constant;
13519                       imm_expr.X_add_number = 0;
13520                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13521                       continue;
13522                     }
13523
13524                   break;
13525                 }
13526
13527               /* We need to relax this instruction.  */
13528               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13529               s = expr_end;
13530               continue;
13531
13532             case 'p':
13533             case 'q':
13534             case 'A':
13535             case 'B':
13536             case 'E':
13537               /* We use offset_reloc rather than imm_reloc for the PC
13538                  relative operands.  This lets macros with both
13539                  immediate and address operands work correctly.  */
13540               my_getExpression (&offset_expr, s);
13541
13542               if (offset_expr.X_op == O_register)
13543                 break;
13544
13545               /* We need to relax this instruction.  */
13546               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
13547               s = expr_end;
13548               continue;
13549
13550             case '6':           /* break code */
13551               my_getExpression (&imm_expr, s);
13552               check_absolute_expr (ip, &imm_expr);
13553               if ((unsigned long) imm_expr.X_add_number > 63)
13554                 as_warn (_("Invalid value for `%s' (%lu)"),
13555                          ip->insn_mo->name,
13556                          (unsigned long) imm_expr.X_add_number);
13557               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
13558               imm_expr.X_op = O_absent;
13559               s = expr_end;
13560               continue;
13561
13562             case 'a':           /* 26 bit address */
13563               my_getExpression (&offset_expr, s);
13564               s = expr_end;
13565               *offset_reloc = BFD_RELOC_MIPS16_JMP;
13566               ip->insn_opcode <<= 16;
13567               continue;
13568
13569             case 'l':           /* register list for entry macro */
13570             case 'L':           /* register list for exit macro */
13571               {
13572                 int mask;
13573
13574                 if (c == 'l')
13575                   mask = 0;
13576                 else
13577                   mask = 7 << 3;
13578                 while (*s != '\0')
13579                   {
13580                     unsigned int freg, reg1, reg2;
13581
13582                     while (*s == ' ' || *s == ',')
13583                       ++s;
13584                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
13585                       freg = 0;
13586                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
13587                       freg = 1;
13588                     else
13589                       {
13590                         as_bad (_("can't parse register list"));
13591                         break;
13592                       }
13593                     if (*s == ' ')
13594                       ++s;
13595                     if (*s != '-')
13596                       reg2 = reg1;
13597                     else
13598                       {
13599                         ++s;
13600                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
13601                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
13602                           {
13603                             as_bad (_("invalid register list"));
13604                             break;
13605                           }
13606                       }
13607                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
13608                       {
13609                         mask &= ~ (7 << 3);
13610                         mask |= 5 << 3;
13611                       }
13612                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
13613                       {
13614                         mask &= ~ (7 << 3);
13615                         mask |= 6 << 3;
13616                       }
13617                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
13618                       mask |= (reg2 - 3) << 3;
13619                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
13620                       mask |= (reg2 - 15) << 1;
13621                     else if (reg1 == RA && reg2 == RA)
13622                       mask |= 1;
13623                     else
13624                       {
13625                         as_bad (_("invalid register list"));
13626                         break;
13627                       }
13628                   }
13629                 /* The mask is filled in in the opcode table for the
13630                    benefit of the disassembler.  We remove it before
13631                    applying the actual mask.  */
13632                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
13633                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
13634               }
13635             continue;
13636
13637             case 'm':           /* Register list for save insn.  */
13638             case 'M':           /* Register list for restore insn.  */
13639               {
13640                 int opcode = 0;
13641                 int framesz = 0, seen_framesz = 0;
13642                 int nargs = 0, statics = 0, sregs = 0;
13643
13644                 while (*s != '\0')
13645                   {
13646                     unsigned int reg1, reg2;
13647
13648                     SKIP_SPACE_TABS (s);
13649                     while (*s == ',')
13650                       ++s;
13651                     SKIP_SPACE_TABS (s);
13652
13653                     my_getExpression (&imm_expr, s);
13654                     if (imm_expr.X_op == O_constant)
13655                       {
13656                         /* Handle the frame size.  */
13657                         if (seen_framesz)
13658                           {
13659                             as_bad (_("more than one frame size in list"));
13660                             break;
13661                           }
13662                         seen_framesz = 1;
13663                         framesz = imm_expr.X_add_number;
13664                         imm_expr.X_op = O_absent;
13665                         s = expr_end;
13666                         continue;
13667                       }
13668
13669                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
13670                       {
13671                         as_bad (_("can't parse register list"));
13672                         break;
13673                       }
13674
13675                     while (*s == ' ')
13676                       ++s;
13677
13678                     if (*s != '-')
13679                       reg2 = reg1;
13680                     else
13681                       {
13682                         ++s;
13683                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
13684                             || reg2 < reg1)
13685                           {
13686                             as_bad (_("can't parse register list"));
13687                             break;
13688                           }
13689                       }
13690
13691                     while (reg1 <= reg2)
13692                       {
13693                         if (reg1 >= 4 && reg1 <= 7)
13694                           {
13695                             if (!seen_framesz)
13696                                 /* args $a0-$a3 */
13697                                 nargs |= 1 << (reg1 - 4);
13698                             else
13699                                 /* statics $a0-$a3 */
13700                                 statics |= 1 << (reg1 - 4);
13701                           }
13702                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
13703                           {
13704                             /* $s0-$s8 */
13705                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
13706                           }
13707                         else if (reg1 == 31)
13708                           {
13709                             /* Add $ra to insn.  */
13710                             opcode |= 0x40;
13711                           }
13712                         else
13713                           {
13714                             as_bad (_("unexpected register in list"));
13715                             break;
13716                           }
13717                         if (++reg1 == 24)
13718                           reg1 = 30;
13719                       }
13720                   }
13721
13722                 /* Encode args/statics combination.  */
13723                 if (nargs & statics)
13724                   as_bad (_("arg/static registers overlap"));
13725                 else if (nargs == 0xf)
13726                   /* All $a0-$a3 are args.  */
13727                   opcode |= MIPS16_ALL_ARGS << 16;
13728                 else if (statics == 0xf)
13729                   /* All $a0-$a3 are statics.  */
13730                   opcode |= MIPS16_ALL_STATICS << 16;
13731                 else 
13732                   {
13733                     int narg = 0, nstat = 0;
13734
13735                     /* Count arg registers.  */
13736                     while (nargs & 0x1)
13737                       {
13738                         nargs >>= 1;
13739                         narg++;
13740                       }
13741                     if (nargs != 0)
13742                       as_bad (_("invalid arg register list"));
13743
13744                     /* Count static registers.  */
13745                     while (statics & 0x8)
13746                       {
13747                         statics = (statics << 1) & 0xf;
13748                         nstat++;
13749                       }
13750                     if (statics != 0) 
13751                       as_bad (_("invalid static register list"));
13752
13753                     /* Encode args/statics.  */
13754                     opcode |= ((narg << 2) | nstat) << 16;
13755                   }
13756
13757                 /* Encode $s0/$s1.  */
13758                 if (sregs & (1 << 0))           /* $s0 */
13759                   opcode |= 0x20;
13760                 if (sregs & (1 << 1))           /* $s1 */
13761                   opcode |= 0x10;
13762                 sregs >>= 2;
13763
13764                 if (sregs != 0)
13765                   {
13766                     /* Count regs $s2-$s8.  */
13767                     int nsreg = 0;
13768                     while (sregs & 1)
13769                       {
13770                         sregs >>= 1;
13771                         nsreg++;
13772                       }
13773                     if (sregs != 0)
13774                       as_bad (_("invalid static register list"));
13775                     /* Encode $s2-$s8. */
13776                     opcode |= nsreg << 24;
13777                   }
13778
13779                 /* Encode frame size.  */
13780                 if (!seen_framesz)
13781                   as_bad (_("missing frame size"));
13782                 else if ((framesz & 7) != 0 || framesz < 0
13783                          || framesz > 0xff * 8)
13784                   as_bad (_("invalid frame size"));
13785                 else if (framesz != 128 || (opcode >> 16) != 0)
13786                   {
13787                     framesz /= 8;
13788                     opcode |= (((framesz & 0xf0) << 16)
13789                              | (framesz & 0x0f));
13790                   }
13791
13792                 /* Finally build the instruction.  */
13793                 if ((opcode >> 16) != 0 || framesz == 0)
13794                   {
13795                     ip->use_extend = TRUE;
13796                     ip->extend = opcode >> 16;
13797                   }
13798                 ip->insn_opcode |= opcode & 0x7f;
13799               }
13800             continue;
13801
13802             case 'e':           /* extend code */
13803               my_getExpression (&imm_expr, s);
13804               check_absolute_expr (ip, &imm_expr);
13805               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
13806                 {
13807                   as_warn (_("Invalid value for `%s' (%lu)"),
13808                            ip->insn_mo->name,
13809                            (unsigned long) imm_expr.X_add_number);
13810                   imm_expr.X_add_number &= 0x7ff;
13811                 }
13812               ip->insn_opcode |= imm_expr.X_add_number;
13813               imm_expr.X_op = O_absent;
13814               s = expr_end;
13815               continue;
13816
13817             default:
13818               internalError ();
13819             }
13820           break;
13821         }
13822
13823       /* Args don't match.  */
13824       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
13825           strcmp (insn->name, insn[1].name) == 0)
13826         {
13827           ++insn;
13828           s = argsstart;
13829           continue;
13830         }
13831
13832       insn_error = _("illegal operands");
13833
13834       return;
13835     }
13836 }
13837
13838 /* This structure holds information we know about a mips16 immediate
13839    argument type.  */
13840
13841 struct mips16_immed_operand
13842 {
13843   /* The type code used in the argument string in the opcode table.  */
13844   int type;
13845   /* The number of bits in the short form of the opcode.  */
13846   int nbits;
13847   /* The number of bits in the extended form of the opcode.  */
13848   int extbits;
13849   /* The amount by which the short form is shifted when it is used;
13850      for example, the sw instruction has a shift count of 2.  */
13851   int shift;
13852   /* The amount by which the short form is shifted when it is stored
13853      into the instruction code.  */
13854   int op_shift;
13855   /* Non-zero if the short form is unsigned.  */
13856   int unsp;
13857   /* Non-zero if the extended form is unsigned.  */
13858   int extu;
13859   /* Non-zero if the value is PC relative.  */
13860   int pcrel;
13861 };
13862
13863 /* The mips16 immediate operand types.  */
13864
13865 static const struct mips16_immed_operand mips16_immed_operands[] =
13866 {
13867   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
13868   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
13869   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
13870   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
13871   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
13872   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
13873   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
13874   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
13875   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
13876   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
13877   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
13878   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
13879   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
13880   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
13881   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
13882   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
13883   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
13884   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
13885   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
13886   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
13887   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
13888 };
13889
13890 #define MIPS16_NUM_IMMED \
13891   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
13892
13893 /* Handle a mips16 instruction with an immediate value.  This or's the
13894    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
13895    whether an extended value is needed; if one is needed, it sets
13896    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
13897    If SMALL is true, an unextended opcode was explicitly requested.
13898    If EXT is true, an extended opcode was explicitly requested.  If
13899    WARN is true, warn if EXT does not match reality.  */
13900
13901 static void
13902 mips16_immed (char *file, unsigned int line, int type, offsetT val,
13903               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
13904               unsigned long *insn, bfd_boolean *use_extend,
13905               unsigned short *extend)
13906 {
13907   const struct mips16_immed_operand *op;
13908   int mintiny, maxtiny;
13909   bfd_boolean needext;
13910
13911   op = mips16_immed_operands;
13912   while (op->type != type)
13913     {
13914       ++op;
13915       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13916     }
13917
13918   if (op->unsp)
13919     {
13920       if (type == '<' || type == '>' || type == '[' || type == ']')
13921         {
13922           mintiny = 1;
13923           maxtiny = 1 << op->nbits;
13924         }
13925       else
13926         {
13927           mintiny = 0;
13928           maxtiny = (1 << op->nbits) - 1;
13929         }
13930     }
13931   else
13932     {
13933       mintiny = - (1 << (op->nbits - 1));
13934       maxtiny = (1 << (op->nbits - 1)) - 1;
13935     }
13936
13937   /* Branch offsets have an implicit 0 in the lowest bit.  */
13938   if (type == 'p' || type == 'q')
13939     val /= 2;
13940
13941   if ((val & ((1 << op->shift) - 1)) != 0
13942       || val < (mintiny << op->shift)
13943       || val > (maxtiny << op->shift))
13944     needext = TRUE;
13945   else
13946     needext = FALSE;
13947
13948   if (warn && ext && ! needext)
13949     as_warn_where (file, line,
13950                    _("extended operand requested but not required"));
13951   if (small && needext)
13952     as_bad_where (file, line, _("invalid unextended operand value"));
13953
13954   if (small || (! ext && ! needext))
13955     {
13956       int insnval;
13957
13958       *use_extend = FALSE;
13959       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
13960       insnval <<= op->op_shift;
13961       *insn |= insnval;
13962     }
13963   else
13964     {
13965       long minext, maxext;
13966       int extval;
13967
13968       if (op->extu)
13969         {
13970           minext = 0;
13971           maxext = (1 << op->extbits) - 1;
13972         }
13973       else
13974         {
13975           minext = - (1 << (op->extbits - 1));
13976           maxext = (1 << (op->extbits - 1)) - 1;
13977         }
13978       if (val < minext || val > maxext)
13979         as_bad_where (file, line,
13980                       _("operand value out of range for instruction"));
13981
13982       *use_extend = TRUE;
13983       if (op->extbits == 16)
13984         {
13985           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
13986           val &= 0x1f;
13987         }
13988       else if (op->extbits == 15)
13989         {
13990           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
13991           val &= 0xf;
13992         }
13993       else
13994         {
13995           extval = ((val & 0x1f) << 6) | (val & 0x20);
13996           val = 0;
13997         }
13998
13999       *extend = (unsigned short) extval;
14000       *insn |= val;
14001     }
14002 }
14003 \f
14004 struct percent_op_match
14005 {
14006   const char *str;
14007   bfd_reloc_code_real_type reloc;
14008 };
14009
14010 static const struct percent_op_match mips_percent_op[] =
14011 {
14012   {"%lo", BFD_RELOC_LO16},
14013 #ifdef OBJ_ELF
14014   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
14015   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
14016   {"%call16", BFD_RELOC_MIPS_CALL16},
14017   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
14018   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
14019   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
14020   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
14021   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
14022   {"%got", BFD_RELOC_MIPS_GOT16},
14023   {"%gp_rel", BFD_RELOC_GPREL16},
14024   {"%half", BFD_RELOC_16},
14025   {"%highest", BFD_RELOC_MIPS_HIGHEST},
14026   {"%higher", BFD_RELOC_MIPS_HIGHER},
14027   {"%neg", BFD_RELOC_MIPS_SUB},
14028   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
14029   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
14030   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
14031   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
14032   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
14033   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
14034   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
14035 #endif
14036   {"%hi", BFD_RELOC_HI16_S}
14037 };
14038
14039 static const struct percent_op_match mips16_percent_op[] =
14040 {
14041   {"%lo", BFD_RELOC_MIPS16_LO16},
14042   {"%gprel", BFD_RELOC_MIPS16_GPREL},
14043   {"%got", BFD_RELOC_MIPS16_GOT16},
14044   {"%call16", BFD_RELOC_MIPS16_CALL16},
14045   {"%hi", BFD_RELOC_MIPS16_HI16_S}
14046 };
14047
14048
14049 /* Return true if *STR points to a relocation operator.  When returning true,
14050    move *STR over the operator and store its relocation code in *RELOC.
14051    Leave both *STR and *RELOC alone when returning false.  */
14052
14053 static bfd_boolean
14054 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
14055 {
14056   const struct percent_op_match *percent_op;
14057   size_t limit, i;
14058
14059   if (mips_opts.mips16)
14060     {
14061       percent_op = mips16_percent_op;
14062       limit = ARRAY_SIZE (mips16_percent_op);
14063     }
14064   else
14065     {
14066       percent_op = mips_percent_op;
14067       limit = ARRAY_SIZE (mips_percent_op);
14068     }
14069
14070   for (i = 0; i < limit; i++)
14071     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
14072       {
14073         int len = strlen (percent_op[i].str);
14074
14075         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
14076           continue;
14077
14078         *str += strlen (percent_op[i].str);
14079         *reloc = percent_op[i].reloc;
14080
14081         /* Check whether the output BFD supports this relocation.
14082            If not, issue an error and fall back on something safe.  */
14083         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
14084           {
14085             as_bad (_("relocation %s isn't supported by the current ABI"),
14086                     percent_op[i].str);
14087             *reloc = BFD_RELOC_UNUSED;
14088           }
14089         return TRUE;
14090       }
14091   return FALSE;
14092 }
14093
14094
14095 /* Parse string STR as a 16-bit relocatable operand.  Store the
14096    expression in *EP and the relocations in the array starting
14097    at RELOC.  Return the number of relocation operators used.
14098
14099    On exit, EXPR_END points to the first character after the expression.  */
14100
14101 static size_t
14102 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
14103                        char *str)
14104 {
14105   bfd_reloc_code_real_type reversed_reloc[3];
14106   size_t reloc_index, i;
14107   int crux_depth, str_depth;
14108   char *crux;
14109
14110   /* Search for the start of the main expression, recoding relocations
14111      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
14112      of the main expression and with CRUX_DEPTH containing the number
14113      of open brackets at that point.  */
14114   reloc_index = -1;
14115   str_depth = 0;
14116   do
14117     {
14118       reloc_index++;
14119       crux = str;
14120       crux_depth = str_depth;
14121
14122       /* Skip over whitespace and brackets, keeping count of the number
14123          of brackets.  */
14124       while (*str == ' ' || *str == '\t' || *str == '(')
14125         if (*str++ == '(')
14126           str_depth++;
14127     }
14128   while (*str == '%'
14129          && reloc_index < (HAVE_NEWABI ? 3 : 1)
14130          && parse_relocation (&str, &reversed_reloc[reloc_index]));
14131
14132   my_getExpression (ep, crux);
14133   str = expr_end;
14134
14135   /* Match every open bracket.  */
14136   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
14137     if (*str++ == ')')
14138       crux_depth--;
14139
14140   if (crux_depth > 0)
14141     as_bad (_("unclosed '('"));
14142
14143   expr_end = str;
14144
14145   if (reloc_index != 0)
14146     {
14147       prev_reloc_op_frag = frag_now;
14148       for (i = 0; i < reloc_index; i++)
14149         reloc[i] = reversed_reloc[reloc_index - 1 - i];
14150     }
14151
14152   return reloc_index;
14153 }
14154
14155 static void
14156 my_getExpression (expressionS *ep, char *str)
14157 {
14158   char *save_in;
14159
14160   save_in = input_line_pointer;
14161   input_line_pointer = str;
14162   expression (ep);
14163   expr_end = input_line_pointer;
14164   input_line_pointer = save_in;
14165 }
14166
14167 char *
14168 md_atof (int type, char *litP, int *sizeP)
14169 {
14170   return ieee_md_atof (type, litP, sizeP, target_big_endian);
14171 }
14172
14173 void
14174 md_number_to_chars (char *buf, valueT val, int n)
14175 {
14176   if (target_big_endian)
14177     number_to_chars_bigendian (buf, val, n);
14178   else
14179     number_to_chars_littleendian (buf, val, n);
14180 }
14181 \f
14182 #ifdef OBJ_ELF
14183 static int support_64bit_objects(void)
14184 {
14185   const char **list, **l;
14186   int yes;
14187
14188   list = bfd_target_list ();
14189   for (l = list; *l != NULL; l++)
14190     if (strcmp (*l, ELF_TARGET ("elf64-", "big")) == 0
14191         || strcmp (*l, ELF_TARGET ("elf64-", "little")) == 0)
14192       break;
14193   yes = (*l != NULL);
14194   free (list);
14195   return yes;
14196 }
14197 #endif /* OBJ_ELF */
14198
14199 const char *md_shortopts = "O::g::G:";
14200
14201 enum options
14202   {
14203     OPTION_MARCH = OPTION_MD_BASE,
14204     OPTION_MTUNE,
14205     OPTION_MIPS1,
14206     OPTION_MIPS2,
14207     OPTION_MIPS3,
14208     OPTION_MIPS4,
14209     OPTION_MIPS5,
14210     OPTION_MIPS32,
14211     OPTION_MIPS64,
14212     OPTION_MIPS32R2,
14213     OPTION_MIPS64R2,
14214     OPTION_MIPS16,
14215     OPTION_NO_MIPS16,
14216     OPTION_MIPS3D,
14217     OPTION_NO_MIPS3D,
14218     OPTION_MDMX,
14219     OPTION_NO_MDMX,
14220     OPTION_DSP,
14221     OPTION_NO_DSP,
14222     OPTION_MT,
14223     OPTION_NO_MT,
14224     OPTION_SMARTMIPS,
14225     OPTION_NO_SMARTMIPS,
14226     OPTION_DSPR2,
14227     OPTION_NO_DSPR2,
14228     OPTION_MICROMIPS,
14229     OPTION_NO_MICROMIPS,
14230     OPTION_MCU,
14231     OPTION_NO_MCU,
14232     OPTION_COMPAT_ARCH_BASE,
14233     OPTION_M4650,
14234     OPTION_NO_M4650,
14235     OPTION_M4010,
14236     OPTION_NO_M4010,
14237     OPTION_M4100,
14238     OPTION_NO_M4100,
14239     OPTION_M3900,
14240     OPTION_NO_M3900,
14241     OPTION_M7000_HILO_FIX,
14242     OPTION_MNO_7000_HILO_FIX, 
14243     OPTION_FIX_24K,
14244     OPTION_NO_FIX_24K,
14245     OPTION_FIX_LOONGSON2F_JUMP,
14246     OPTION_NO_FIX_LOONGSON2F_JUMP,
14247     OPTION_FIX_LOONGSON2F_NOP,
14248     OPTION_NO_FIX_LOONGSON2F_NOP,
14249     OPTION_FIX_VR4120,
14250     OPTION_NO_FIX_VR4120,
14251     OPTION_FIX_VR4130,
14252     OPTION_NO_FIX_VR4130,
14253     OPTION_FIX_CN63XXP1,
14254     OPTION_NO_FIX_CN63XXP1,
14255     OPTION_TRAP,
14256     OPTION_BREAK,
14257     OPTION_EB,
14258     OPTION_EL,
14259     OPTION_FP32,
14260     OPTION_GP32,
14261     OPTION_CONSTRUCT_FLOATS,
14262     OPTION_NO_CONSTRUCT_FLOATS,
14263     OPTION_FP64,
14264     OPTION_GP64,
14265     OPTION_RELAX_BRANCH,
14266     OPTION_NO_RELAX_BRANCH,
14267     OPTION_MSHARED,
14268     OPTION_MNO_SHARED,
14269     OPTION_MSYM32,
14270     OPTION_MNO_SYM32,
14271     OPTION_SOFT_FLOAT,
14272     OPTION_HARD_FLOAT,
14273     OPTION_SINGLE_FLOAT,
14274     OPTION_DOUBLE_FLOAT,
14275     OPTION_32,
14276 #ifdef OBJ_ELF
14277     OPTION_CALL_SHARED,
14278     OPTION_CALL_NONPIC,
14279     OPTION_NON_SHARED,
14280     OPTION_XGOT,
14281     OPTION_MABI,
14282     OPTION_N32,
14283     OPTION_64,
14284     OPTION_MDEBUG,
14285     OPTION_NO_MDEBUG,
14286     OPTION_PDR,
14287     OPTION_NO_PDR,
14288     OPTION_MVXWORKS_PIC,
14289 #endif /* OBJ_ELF */
14290     OPTION_END_OF_ENUM    
14291   };
14292   
14293 struct option md_longopts[] =
14294 {
14295   /* Options which specify architecture.  */
14296   {"march", required_argument, NULL, OPTION_MARCH},
14297   {"mtune", required_argument, NULL, OPTION_MTUNE},
14298   {"mips0", no_argument, NULL, OPTION_MIPS1},
14299   {"mips1", no_argument, NULL, OPTION_MIPS1},
14300   {"mips2", no_argument, NULL, OPTION_MIPS2},
14301   {"mips3", no_argument, NULL, OPTION_MIPS3},
14302   {"mips4", no_argument, NULL, OPTION_MIPS4},
14303   {"mips5", no_argument, NULL, OPTION_MIPS5},
14304   {"mips32", no_argument, NULL, OPTION_MIPS32},
14305   {"mips64", no_argument, NULL, OPTION_MIPS64},
14306   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
14307   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
14308
14309   /* Options which specify Application Specific Extensions (ASEs).  */
14310   {"mips16", no_argument, NULL, OPTION_MIPS16},
14311   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
14312   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
14313   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
14314   {"mdmx", no_argument, NULL, OPTION_MDMX},
14315   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
14316   {"mdsp", no_argument, NULL, OPTION_DSP},
14317   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
14318   {"mmt", no_argument, NULL, OPTION_MT},
14319   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
14320   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
14321   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
14322   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
14323   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
14324   {"mmicromips", no_argument, NULL, OPTION_MICROMIPS},
14325   {"mno-micromips", no_argument, NULL, OPTION_NO_MICROMIPS},
14326   {"mmcu", no_argument, NULL, OPTION_MCU},
14327   {"mno-mcu", no_argument, NULL, OPTION_NO_MCU},
14328
14329   /* Old-style architecture options.  Don't add more of these.  */
14330   {"m4650", no_argument, NULL, OPTION_M4650},
14331   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
14332   {"m4010", no_argument, NULL, OPTION_M4010},
14333   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
14334   {"m4100", no_argument, NULL, OPTION_M4100},
14335   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
14336   {"m3900", no_argument, NULL, OPTION_M3900},
14337   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
14338
14339   /* Options which enable bug fixes.  */
14340   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
14341   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
14342   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
14343   {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
14344   {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
14345   {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
14346   {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
14347   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
14348   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
14349   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
14350   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
14351   {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
14352   {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
14353   {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
14354   {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
14355
14356   /* Miscellaneous options.  */
14357   {"trap", no_argument, NULL, OPTION_TRAP},
14358   {"no-break", no_argument, NULL, OPTION_TRAP},
14359   {"break", no_argument, NULL, OPTION_BREAK},
14360   {"no-trap", no_argument, NULL, OPTION_BREAK},
14361   {"EB", no_argument, NULL, OPTION_EB},
14362   {"EL", no_argument, NULL, OPTION_EL},
14363   {"mfp32", no_argument, NULL, OPTION_FP32},
14364   {"mgp32", no_argument, NULL, OPTION_GP32},
14365   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
14366   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
14367   {"mfp64", no_argument, NULL, OPTION_FP64},
14368   {"mgp64", no_argument, NULL, OPTION_GP64},
14369   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
14370   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
14371   {"mshared", no_argument, NULL, OPTION_MSHARED},
14372   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
14373   {"msym32", no_argument, NULL, OPTION_MSYM32},
14374   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
14375   {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
14376   {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
14377   {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
14378   {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
14379
14380   /* Strictly speaking this next option is ELF specific,
14381      but we allow it for other ports as well in order to
14382      make testing easier.  */
14383   {"32",          no_argument, NULL, OPTION_32},
14384   
14385   /* ELF-specific options.  */
14386 #ifdef OBJ_ELF
14387   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
14388   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
14389   {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
14390   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
14391   {"xgot",        no_argument, NULL, OPTION_XGOT},
14392   {"mabi", required_argument, NULL, OPTION_MABI},
14393   {"n32",         no_argument, NULL, OPTION_N32},
14394   {"64",          no_argument, NULL, OPTION_64},
14395   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
14396   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
14397   {"mpdr", no_argument, NULL, OPTION_PDR},
14398   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
14399   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
14400 #endif /* OBJ_ELF */
14401
14402   {NULL, no_argument, NULL, 0}
14403 };
14404 size_t md_longopts_size = sizeof (md_longopts);
14405
14406 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
14407    NEW_VALUE.  Warn if another value was already specified.  Note:
14408    we have to defer parsing the -march and -mtune arguments in order
14409    to handle 'from-abi' correctly, since the ABI might be specified
14410    in a later argument.  */
14411
14412 static void
14413 mips_set_option_string (const char **string_ptr, const char *new_value)
14414 {
14415   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
14416     as_warn (_("A different %s was already specified, is now %s"),
14417              string_ptr == &mips_arch_string ? "-march" : "-mtune",
14418              new_value);
14419
14420   *string_ptr = new_value;
14421 }
14422
14423 int
14424 md_parse_option (int c, char *arg)
14425 {
14426   switch (c)
14427     {
14428     case OPTION_CONSTRUCT_FLOATS:
14429       mips_disable_float_construction = 0;
14430       break;
14431
14432     case OPTION_NO_CONSTRUCT_FLOATS:
14433       mips_disable_float_construction = 1;
14434       break;
14435
14436     case OPTION_TRAP:
14437       mips_trap = 1;
14438       break;
14439
14440     case OPTION_BREAK:
14441       mips_trap = 0;
14442       break;
14443
14444     case OPTION_EB:
14445       target_big_endian = 1;
14446       break;
14447
14448     case OPTION_EL:
14449       target_big_endian = 0;
14450       break;
14451
14452     case 'O':
14453       if (arg == NULL)
14454         mips_optimize = 1;
14455       else if (arg[0] == '0')
14456         mips_optimize = 0;
14457       else if (arg[0] == '1')
14458         mips_optimize = 1;
14459       else
14460         mips_optimize = 2;
14461       break;
14462
14463     case 'g':
14464       if (arg == NULL)
14465         mips_debug = 2;
14466       else
14467         mips_debug = atoi (arg);
14468       break;
14469
14470     case OPTION_MIPS1:
14471       file_mips_isa = ISA_MIPS1;
14472       break;
14473
14474     case OPTION_MIPS2:
14475       file_mips_isa = ISA_MIPS2;
14476       break;
14477
14478     case OPTION_MIPS3:
14479       file_mips_isa = ISA_MIPS3;
14480       break;
14481
14482     case OPTION_MIPS4:
14483       file_mips_isa = ISA_MIPS4;
14484       break;
14485
14486     case OPTION_MIPS5:
14487       file_mips_isa = ISA_MIPS5;
14488       break;
14489
14490     case OPTION_MIPS32:
14491       file_mips_isa = ISA_MIPS32;
14492       break;
14493
14494     case OPTION_MIPS32R2:
14495       file_mips_isa = ISA_MIPS32R2;
14496       break;
14497
14498     case OPTION_MIPS64R2:
14499       file_mips_isa = ISA_MIPS64R2;
14500       break;
14501
14502     case OPTION_MIPS64:
14503       file_mips_isa = ISA_MIPS64;
14504       break;
14505
14506     case OPTION_MTUNE:
14507       mips_set_option_string (&mips_tune_string, arg);
14508       break;
14509
14510     case OPTION_MARCH:
14511       mips_set_option_string (&mips_arch_string, arg);
14512       break;
14513
14514     case OPTION_M4650:
14515       mips_set_option_string (&mips_arch_string, "4650");
14516       mips_set_option_string (&mips_tune_string, "4650");
14517       break;
14518
14519     case OPTION_NO_M4650:
14520       break;
14521
14522     case OPTION_M4010:
14523       mips_set_option_string (&mips_arch_string, "4010");
14524       mips_set_option_string (&mips_tune_string, "4010");
14525       break;
14526
14527     case OPTION_NO_M4010:
14528       break;
14529
14530     case OPTION_M4100:
14531       mips_set_option_string (&mips_arch_string, "4100");
14532       mips_set_option_string (&mips_tune_string, "4100");
14533       break;
14534
14535     case OPTION_NO_M4100:
14536       break;
14537
14538     case OPTION_M3900:
14539       mips_set_option_string (&mips_arch_string, "3900");
14540       mips_set_option_string (&mips_tune_string, "3900");
14541       break;
14542
14543     case OPTION_NO_M3900:
14544       break;
14545
14546     case OPTION_MDMX:
14547       mips_opts.ase_mdmx = 1;
14548       break;
14549
14550     case OPTION_NO_MDMX:
14551       mips_opts.ase_mdmx = 0;
14552       break;
14553
14554     case OPTION_DSP:
14555       mips_opts.ase_dsp = 1;
14556       mips_opts.ase_dspr2 = 0;
14557       break;
14558
14559     case OPTION_NO_DSP:
14560       mips_opts.ase_dsp = 0;
14561       mips_opts.ase_dspr2 = 0;
14562       break;
14563
14564     case OPTION_DSPR2:
14565       mips_opts.ase_dspr2 = 1;
14566       mips_opts.ase_dsp = 1;
14567       break;
14568
14569     case OPTION_NO_DSPR2:
14570       mips_opts.ase_dspr2 = 0;
14571       mips_opts.ase_dsp = 0;
14572       break;
14573
14574     case OPTION_MT:
14575       mips_opts.ase_mt = 1;
14576       break;
14577
14578     case OPTION_NO_MT:
14579       mips_opts.ase_mt = 0;
14580       break;
14581
14582     case OPTION_MCU:
14583       mips_opts.ase_mcu = 1;
14584       break;
14585
14586     case OPTION_NO_MCU:
14587       mips_opts.ase_mcu = 0;
14588       break;
14589
14590     case OPTION_MICROMIPS:
14591       if (mips_opts.mips16 == 1)
14592         {
14593           as_bad (_("-mmicromips cannot be used with -mips16"));
14594           return 0;
14595         }
14596       mips_opts.micromips = 1;
14597       mips_no_prev_insn ();
14598       break;
14599
14600     case OPTION_NO_MICROMIPS:
14601       mips_opts.micromips = 0;
14602       mips_no_prev_insn ();
14603       break;
14604
14605     case OPTION_MIPS16:
14606       if (mips_opts.micromips == 1)
14607         {
14608           as_bad (_("-mips16 cannot be used with -micromips"));
14609           return 0;
14610         }
14611       mips_opts.mips16 = 1;
14612       mips_no_prev_insn ();
14613       break;
14614
14615     case OPTION_NO_MIPS16:
14616       mips_opts.mips16 = 0;
14617       mips_no_prev_insn ();
14618       break;
14619
14620     case OPTION_MIPS3D:
14621       mips_opts.ase_mips3d = 1;
14622       break;
14623
14624     case OPTION_NO_MIPS3D:
14625       mips_opts.ase_mips3d = 0;
14626       break;
14627
14628     case OPTION_SMARTMIPS:
14629       mips_opts.ase_smartmips = 1;
14630       break;
14631
14632     case OPTION_NO_SMARTMIPS:
14633       mips_opts.ase_smartmips = 0;
14634       break;
14635
14636     case OPTION_FIX_24K:
14637       mips_fix_24k = 1;
14638       break;
14639
14640     case OPTION_NO_FIX_24K:
14641       mips_fix_24k = 0;
14642       break;
14643
14644     case OPTION_FIX_LOONGSON2F_JUMP:
14645       mips_fix_loongson2f_jump = TRUE;
14646       break;
14647
14648     case OPTION_NO_FIX_LOONGSON2F_JUMP:
14649       mips_fix_loongson2f_jump = FALSE;
14650       break;
14651
14652     case OPTION_FIX_LOONGSON2F_NOP:
14653       mips_fix_loongson2f_nop = TRUE;
14654       break;
14655
14656     case OPTION_NO_FIX_LOONGSON2F_NOP:
14657       mips_fix_loongson2f_nop = FALSE;
14658       break;
14659
14660     case OPTION_FIX_VR4120:
14661       mips_fix_vr4120 = 1;
14662       break;
14663
14664     case OPTION_NO_FIX_VR4120:
14665       mips_fix_vr4120 = 0;
14666       break;
14667
14668     case OPTION_FIX_VR4130:
14669       mips_fix_vr4130 = 1;
14670       break;
14671
14672     case OPTION_NO_FIX_VR4130:
14673       mips_fix_vr4130 = 0;
14674       break;
14675
14676     case OPTION_FIX_CN63XXP1:
14677       mips_fix_cn63xxp1 = TRUE;
14678       break;
14679
14680     case OPTION_NO_FIX_CN63XXP1:
14681       mips_fix_cn63xxp1 = FALSE;
14682       break;
14683
14684     case OPTION_RELAX_BRANCH:
14685       mips_relax_branch = 1;
14686       break;
14687
14688     case OPTION_NO_RELAX_BRANCH:
14689       mips_relax_branch = 0;
14690       break;
14691
14692     case OPTION_MSHARED:
14693       mips_in_shared = TRUE;
14694       break;
14695
14696     case OPTION_MNO_SHARED:
14697       mips_in_shared = FALSE;
14698       break;
14699
14700     case OPTION_MSYM32:
14701       mips_opts.sym32 = TRUE;
14702       break;
14703
14704     case OPTION_MNO_SYM32:
14705       mips_opts.sym32 = FALSE;
14706       break;
14707
14708 #ifdef OBJ_ELF
14709       /* When generating ELF code, we permit -KPIC and -call_shared to
14710          select SVR4_PIC, and -non_shared to select no PIC.  This is
14711          intended to be compatible with Irix 5.  */
14712     case OPTION_CALL_SHARED:
14713       if (!IS_ELF)
14714         {
14715           as_bad (_("-call_shared is supported only for ELF format"));
14716           return 0;
14717         }
14718       mips_pic = SVR4_PIC;
14719       mips_abicalls = TRUE;
14720       break;
14721
14722     case OPTION_CALL_NONPIC:
14723       if (!IS_ELF)
14724         {
14725           as_bad (_("-call_nonpic is supported only for ELF format"));
14726           return 0;
14727         }
14728       mips_pic = NO_PIC;
14729       mips_abicalls = TRUE;
14730       break;
14731
14732     case OPTION_NON_SHARED:
14733       if (!IS_ELF)
14734         {
14735           as_bad (_("-non_shared is supported only for ELF format"));
14736           return 0;
14737         }
14738       mips_pic = NO_PIC;
14739       mips_abicalls = FALSE;
14740       break;
14741
14742       /* The -xgot option tells the assembler to use 32 bit offsets
14743          when accessing the got in SVR4_PIC mode.  It is for Irix
14744          compatibility.  */
14745     case OPTION_XGOT:
14746       mips_big_got = 1;
14747       break;
14748 #endif /* OBJ_ELF */
14749
14750     case 'G':
14751       g_switch_value = atoi (arg);
14752       g_switch_seen = 1;
14753       break;
14754
14755       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
14756          and -mabi=64.  */
14757     case OPTION_32:
14758       if (IS_ELF)
14759         mips_abi = O32_ABI;
14760       /* We silently ignore -32 for non-ELF targets.  This greatly
14761          simplifies the construction of the MIPS GAS test cases.  */
14762       break;
14763
14764 #ifdef OBJ_ELF
14765     case OPTION_N32:
14766       if (!IS_ELF)
14767         {
14768           as_bad (_("-n32 is supported for ELF format only"));
14769           return 0;
14770         }
14771       mips_abi = N32_ABI;
14772       break;
14773
14774     case OPTION_64:
14775       if (!IS_ELF)
14776         {
14777           as_bad (_("-64 is supported for ELF format only"));
14778           return 0;
14779         }
14780       mips_abi = N64_ABI;
14781       if (!support_64bit_objects())
14782         as_fatal (_("No compiled in support for 64 bit object file format"));
14783       break;
14784 #endif /* OBJ_ELF */
14785
14786     case OPTION_GP32:
14787       file_mips_gp32 = 1;
14788       break;
14789
14790     case OPTION_GP64:
14791       file_mips_gp32 = 0;
14792       break;
14793
14794     case OPTION_FP32:
14795       file_mips_fp32 = 1;
14796       break;
14797
14798     case OPTION_FP64:
14799       file_mips_fp32 = 0;
14800       break;
14801
14802     case OPTION_SINGLE_FLOAT:
14803       file_mips_single_float = 1;
14804       break;
14805
14806     case OPTION_DOUBLE_FLOAT:
14807       file_mips_single_float = 0;
14808       break;
14809
14810     case OPTION_SOFT_FLOAT:
14811       file_mips_soft_float = 1;
14812       break;
14813
14814     case OPTION_HARD_FLOAT:
14815       file_mips_soft_float = 0;
14816       break;
14817
14818 #ifdef OBJ_ELF
14819     case OPTION_MABI:
14820       if (!IS_ELF)
14821         {
14822           as_bad (_("-mabi is supported for ELF format only"));
14823           return 0;
14824         }
14825       if (strcmp (arg, "32") == 0)
14826         mips_abi = O32_ABI;
14827       else if (strcmp (arg, "o64") == 0)
14828         mips_abi = O64_ABI;
14829       else if (strcmp (arg, "n32") == 0)
14830         mips_abi = N32_ABI;
14831       else if (strcmp (arg, "64") == 0)
14832         {
14833           mips_abi = N64_ABI;
14834           if (! support_64bit_objects())
14835             as_fatal (_("No compiled in support for 64 bit object file "
14836                         "format"));
14837         }
14838       else if (strcmp (arg, "eabi") == 0)
14839         mips_abi = EABI_ABI;
14840       else
14841         {
14842           as_fatal (_("invalid abi -mabi=%s"), arg);
14843           return 0;
14844         }
14845       break;
14846 #endif /* OBJ_ELF */
14847
14848     case OPTION_M7000_HILO_FIX:
14849       mips_7000_hilo_fix = TRUE;
14850       break;
14851
14852     case OPTION_MNO_7000_HILO_FIX:
14853       mips_7000_hilo_fix = FALSE;
14854       break;
14855
14856 #ifdef OBJ_ELF
14857     case OPTION_MDEBUG:
14858       mips_flag_mdebug = TRUE;
14859       break;
14860
14861     case OPTION_NO_MDEBUG:
14862       mips_flag_mdebug = FALSE;
14863       break;
14864
14865     case OPTION_PDR:
14866       mips_flag_pdr = TRUE;
14867       break;
14868
14869     case OPTION_NO_PDR:
14870       mips_flag_pdr = FALSE;
14871       break;
14872
14873     case OPTION_MVXWORKS_PIC:
14874       mips_pic = VXWORKS_PIC;
14875       break;
14876 #endif /* OBJ_ELF */
14877
14878     default:
14879       return 0;
14880     }
14881
14882     mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
14883
14884   return 1;
14885 }
14886 \f
14887 /* Set up globals to generate code for the ISA or processor
14888    described by INFO.  */
14889
14890 static void
14891 mips_set_architecture (const struct mips_cpu_info *info)
14892 {
14893   if (info != 0)
14894     {
14895       file_mips_arch = info->cpu;
14896       mips_opts.arch = info->cpu;
14897       mips_opts.isa = info->isa;
14898     }
14899 }
14900
14901
14902 /* Likewise for tuning.  */
14903
14904 static void
14905 mips_set_tune (const struct mips_cpu_info *info)
14906 {
14907   if (info != 0)
14908     mips_tune = info->cpu;
14909 }
14910
14911
14912 void
14913 mips_after_parse_args (void)
14914 {
14915   const struct mips_cpu_info *arch_info = 0;
14916   const struct mips_cpu_info *tune_info = 0;
14917
14918   /* GP relative stuff not working for PE */
14919   if (strncmp (TARGET_OS, "pe", 2) == 0)
14920     {
14921       if (g_switch_seen && g_switch_value != 0)
14922         as_bad (_("-G not supported in this configuration."));
14923       g_switch_value = 0;
14924     }
14925
14926   if (mips_abi == NO_ABI)
14927     mips_abi = MIPS_DEFAULT_ABI;
14928
14929   /* The following code determines the architecture and register size.
14930      Similar code was added to GCC 3.3 (see override_options() in
14931      config/mips/mips.c).  The GAS and GCC code should be kept in sync
14932      as much as possible.  */
14933
14934   if (mips_arch_string != 0)
14935     arch_info = mips_parse_cpu ("-march", mips_arch_string);
14936
14937   if (file_mips_isa != ISA_UNKNOWN)
14938     {
14939       /* Handle -mipsN.  At this point, file_mips_isa contains the
14940          ISA level specified by -mipsN, while arch_info->isa contains
14941          the -march selection (if any).  */
14942       if (arch_info != 0)
14943         {
14944           /* -march takes precedence over -mipsN, since it is more descriptive.
14945              There's no harm in specifying both as long as the ISA levels
14946              are the same.  */
14947           if (file_mips_isa != arch_info->isa)
14948             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
14949                     mips_cpu_info_from_isa (file_mips_isa)->name,
14950                     mips_cpu_info_from_isa (arch_info->isa)->name);
14951         }
14952       else
14953         arch_info = mips_cpu_info_from_isa (file_mips_isa);
14954     }
14955
14956   if (arch_info == 0)
14957     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
14958
14959   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
14960     as_bad (_("-march=%s is not compatible with the selected ABI"),
14961             arch_info->name);
14962
14963   mips_set_architecture (arch_info);
14964
14965   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
14966   if (mips_tune_string != 0)
14967     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
14968
14969   if (tune_info == 0)
14970     mips_set_tune (arch_info);
14971   else
14972     mips_set_tune (tune_info);
14973
14974   if (file_mips_gp32 >= 0)
14975     {
14976       /* The user specified the size of the integer registers.  Make sure
14977          it agrees with the ABI and ISA.  */
14978       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
14979         as_bad (_("-mgp64 used with a 32-bit processor"));
14980       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
14981         as_bad (_("-mgp32 used with a 64-bit ABI"));
14982       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
14983         as_bad (_("-mgp64 used with a 32-bit ABI"));
14984     }
14985   else
14986     {
14987       /* Infer the integer register size from the ABI and processor.
14988          Restrict ourselves to 32-bit registers if that's all the
14989          processor has, or if the ABI cannot handle 64-bit registers.  */
14990       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
14991                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
14992     }
14993
14994   switch (file_mips_fp32)
14995     {
14996     default:
14997     case -1:
14998       /* No user specified float register size.
14999          ??? GAS treats single-float processors as though they had 64-bit
15000          float registers (although it complains when double-precision
15001          instructions are used).  As things stand, saying they have 32-bit
15002          registers would lead to spurious "register must be even" messages.
15003          So here we assume float registers are never smaller than the
15004          integer ones.  */
15005       if (file_mips_gp32 == 0)
15006         /* 64-bit integer registers implies 64-bit float registers.  */
15007         file_mips_fp32 = 0;
15008       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
15009                && ISA_HAS_64BIT_FPRS (mips_opts.isa))
15010         /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
15011         file_mips_fp32 = 0;
15012       else
15013         /* 32-bit float registers.  */
15014         file_mips_fp32 = 1;
15015       break;
15016
15017     /* The user specified the size of the float registers.  Check if it
15018        agrees with the ABI and ISA.  */
15019     case 0:
15020       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
15021         as_bad (_("-mfp64 used with a 32-bit fpu"));
15022       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
15023                && !ISA_HAS_MXHC1 (mips_opts.isa))
15024         as_warn (_("-mfp64 used with a 32-bit ABI"));
15025       break;
15026     case 1:
15027       if (ABI_NEEDS_64BIT_REGS (mips_abi))
15028         as_warn (_("-mfp32 used with a 64-bit ABI"));
15029       break;
15030     }
15031
15032   /* End of GCC-shared inference code.  */
15033
15034   /* This flag is set when we have a 64-bit capable CPU but use only
15035      32-bit wide registers.  Note that EABI does not use it.  */
15036   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
15037       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
15038           || mips_abi == O32_ABI))
15039     mips_32bitmode = 1;
15040
15041   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
15042     as_bad (_("trap exception not supported at ISA 1"));
15043
15044   /* If the selected architecture includes support for ASEs, enable
15045      generation of code for them.  */
15046   if (mips_opts.mips16 == -1)
15047     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
15048   if (mips_opts.micromips == -1)
15049     mips_opts.micromips = (CPU_HAS_MICROMIPS (file_mips_arch)) ? 1 : 0;
15050   if (mips_opts.ase_mips3d == -1)
15051     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
15052                             && file_mips_fp32 == 0) ? 1 : 0;
15053   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
15054     as_bad (_("-mfp32 used with -mips3d"));
15055
15056   if (mips_opts.ase_mdmx == -1)
15057     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
15058                           && file_mips_fp32 == 0) ? 1 : 0;
15059   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
15060     as_bad (_("-mfp32 used with -mdmx"));
15061
15062   if (mips_opts.ase_smartmips == -1)
15063     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
15064   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
15065     as_warn (_("%s ISA does not support SmartMIPS"), 
15066              mips_cpu_info_from_isa (mips_opts.isa)->name);
15067
15068   if (mips_opts.ase_dsp == -1)
15069     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
15070   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
15071     as_warn (_("%s ISA does not support DSP ASE"), 
15072              mips_cpu_info_from_isa (mips_opts.isa)->name);
15073
15074   if (mips_opts.ase_dspr2 == -1)
15075     {
15076       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
15077       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
15078     }
15079   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
15080     as_warn (_("%s ISA does not support DSP R2 ASE"),
15081              mips_cpu_info_from_isa (mips_opts.isa)->name);
15082
15083   if (mips_opts.ase_mt == -1)
15084     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
15085   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
15086     as_warn (_("%s ISA does not support MT ASE"),
15087              mips_cpu_info_from_isa (mips_opts.isa)->name);
15088
15089   if (mips_opts.ase_mcu == -1)
15090     mips_opts.ase_mcu = (arch_info->flags & MIPS_CPU_ASE_MCU) ? 1 : 0;
15091   if (mips_opts.ase_mcu && !ISA_SUPPORTS_MCU_ASE)
15092       as_warn (_("%s ISA does not support MCU ASE"),
15093                mips_cpu_info_from_isa (mips_opts.isa)->name);
15094
15095   file_mips_isa = mips_opts.isa;
15096   file_ase_mips3d = mips_opts.ase_mips3d;
15097   file_ase_mdmx = mips_opts.ase_mdmx;
15098   file_ase_smartmips = mips_opts.ase_smartmips;
15099   file_ase_dsp = mips_opts.ase_dsp;
15100   file_ase_dspr2 = mips_opts.ase_dspr2;
15101   file_ase_mt = mips_opts.ase_mt;
15102   mips_opts.gp32 = file_mips_gp32;
15103   mips_opts.fp32 = file_mips_fp32;
15104   mips_opts.soft_float = file_mips_soft_float;
15105   mips_opts.single_float = file_mips_single_float;
15106
15107   if (mips_flag_mdebug < 0)
15108     {
15109 #ifdef OBJ_MAYBE_ECOFF
15110       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
15111         mips_flag_mdebug = 1;
15112       else
15113 #endif /* OBJ_MAYBE_ECOFF */
15114         mips_flag_mdebug = 0;
15115     }
15116 }
15117 \f
15118 void
15119 mips_init_after_args (void)
15120 {
15121   /* initialize opcodes */
15122   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
15123   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
15124 }
15125
15126 long
15127 md_pcrel_from (fixS *fixP)
15128 {
15129   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
15130   switch (fixP->fx_r_type)
15131     {
15132     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15133     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15134       /* Return the address of the delay slot.  */
15135       return addr + 2;
15136
15137     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15138     case BFD_RELOC_MICROMIPS_JMP:
15139     case BFD_RELOC_16_PCREL_S2:
15140     case BFD_RELOC_MIPS_JMP:
15141       /* Return the address of the delay slot.  */
15142       return addr + 4;
15143
15144     default:
15145       /* We have no relocation type for PC relative MIPS16 instructions.  */
15146       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
15147         as_bad_where (fixP->fx_file, fixP->fx_line,
15148                       _("PC relative MIPS16 instruction references a different section"));
15149       return addr;
15150     }
15151 }
15152
15153 /* This is called before the symbol table is processed.  In order to
15154    work with gcc when using mips-tfile, we must keep all local labels.
15155    However, in other cases, we want to discard them.  If we were
15156    called with -g, but we didn't see any debugging information, it may
15157    mean that gcc is smuggling debugging information through to
15158    mips-tfile, in which case we must generate all local labels.  */
15159
15160 void
15161 mips_frob_file_before_adjust (void)
15162 {
15163 #ifndef NO_ECOFF_DEBUGGING
15164   if (ECOFF_DEBUGGING
15165       && mips_debug != 0
15166       && ! ecoff_debugging_seen)
15167     flag_keep_locals = 1;
15168 #endif
15169 }
15170
15171 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
15172    the corresponding LO16 reloc.  This is called before md_apply_fix and
15173    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
15174    relocation operators.
15175
15176    For our purposes, a %lo() expression matches a %got() or %hi()
15177    expression if:
15178
15179       (a) it refers to the same symbol; and
15180       (b) the offset applied in the %lo() expression is no lower than
15181           the offset applied in the %got() or %hi().
15182
15183    (b) allows us to cope with code like:
15184
15185         lui     $4,%hi(foo)
15186         lh      $4,%lo(foo+2)($4)
15187
15188    ...which is legal on RELA targets, and has a well-defined behaviour
15189    if the user knows that adding 2 to "foo" will not induce a carry to
15190    the high 16 bits.
15191
15192    When several %lo()s match a particular %got() or %hi(), we use the
15193    following rules to distinguish them:
15194
15195      (1) %lo()s with smaller offsets are a better match than %lo()s with
15196          higher offsets.
15197
15198      (2) %lo()s with no matching %got() or %hi() are better than those
15199          that already have a matching %got() or %hi().
15200
15201      (3) later %lo()s are better than earlier %lo()s.
15202
15203    These rules are applied in order.
15204
15205    (1) means, among other things, that %lo()s with identical offsets are
15206    chosen if they exist.
15207
15208    (2) means that we won't associate several high-part relocations with
15209    the same low-part relocation unless there's no alternative.  Having
15210    several high parts for the same low part is a GNU extension; this rule
15211    allows careful users to avoid it.
15212
15213    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
15214    with the last high-part relocation being at the front of the list.
15215    It therefore makes sense to choose the last matching low-part
15216    relocation, all other things being equal.  It's also easier
15217    to code that way.  */
15218
15219 void
15220 mips_frob_file (void)
15221 {
15222   struct mips_hi_fixup *l;
15223   bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
15224
15225   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
15226     {
15227       segment_info_type *seginfo;
15228       bfd_boolean matched_lo_p;
15229       fixS **hi_pos, **lo_pos, **pos;
15230
15231       gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
15232
15233       /* If a GOT16 relocation turns out to be against a global symbol,
15234          there isn't supposed to be a matching LO.  */
15235       if (got16_reloc_p (l->fixp->fx_r_type)
15236           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
15237         continue;
15238
15239       /* Check quickly whether the next fixup happens to be a matching %lo.  */
15240       if (fixup_has_matching_lo_p (l->fixp))
15241         continue;
15242
15243       seginfo = seg_info (l->seg);
15244
15245       /* Set HI_POS to the position of this relocation in the chain.
15246          Set LO_POS to the position of the chosen low-part relocation.
15247          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
15248          relocation that matches an immediately-preceding high-part
15249          relocation.  */
15250       hi_pos = NULL;
15251       lo_pos = NULL;
15252       matched_lo_p = FALSE;
15253       looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
15254
15255       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
15256         {
15257           if (*pos == l->fixp)
15258             hi_pos = pos;
15259
15260           if ((*pos)->fx_r_type == looking_for_rtype
15261               && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
15262               && (*pos)->fx_offset >= l->fixp->fx_offset
15263               && (lo_pos == NULL
15264                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
15265                   || (!matched_lo_p
15266                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
15267             lo_pos = pos;
15268
15269           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
15270                           && fixup_has_matching_lo_p (*pos));
15271         }
15272
15273       /* If we found a match, remove the high-part relocation from its
15274          current position and insert it before the low-part relocation.
15275          Make the offsets match so that fixup_has_matching_lo_p()
15276          will return true.
15277
15278          We don't warn about unmatched high-part relocations since some
15279          versions of gcc have been known to emit dead "lui ...%hi(...)"
15280          instructions.  */
15281       if (lo_pos != NULL)
15282         {
15283           l->fixp->fx_offset = (*lo_pos)->fx_offset;
15284           if (l->fixp->fx_next != *lo_pos)
15285             {
15286               *hi_pos = l->fixp->fx_next;
15287               l->fixp->fx_next = *lo_pos;
15288               *lo_pos = l->fixp;
15289             }
15290         }
15291     }
15292 }
15293
15294 /* We may have combined relocations without symbols in the N32/N64 ABI.
15295    We have to prevent gas from dropping them.  */
15296
15297 int
15298 mips_force_relocation (fixS *fixp)
15299 {
15300   if (generic_force_reloc (fixp))
15301     return 1;
15302
15303   /* We want to keep BFD_RELOC_MICROMIPS_*_PCREL_S1 relocation,
15304      so that the linker relaxation can update targets.  */
15305   if (fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15306       || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15307       || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1)
15308     return 1;
15309
15310   if (HAVE_NEWABI
15311       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
15312       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
15313           || hi16_reloc_p (fixp->fx_r_type)
15314           || lo16_reloc_p (fixp->fx_r_type)))
15315     return 1;
15316
15317   return 0;
15318 }
15319
15320 /* Apply a fixup to the object file.  */
15321
15322 void
15323 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
15324 {
15325   bfd_byte *buf;
15326   long insn;
15327   reloc_howto_type *howto;
15328
15329   /* We ignore generic BFD relocations we don't know about.  */
15330   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
15331   if (! howto)
15332     return;
15333
15334   gas_assert (fixP->fx_size == 2
15335               || fixP->fx_size == 4
15336               || fixP->fx_r_type == BFD_RELOC_16
15337               || fixP->fx_r_type == BFD_RELOC_64
15338               || fixP->fx_r_type == BFD_RELOC_CTOR
15339               || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
15340               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_SUB
15341               || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
15342               || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
15343               || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
15344
15345   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
15346
15347   gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
15348               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15349               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15350               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1);
15351
15352   /* Don't treat parts of a composite relocation as done.  There are two
15353      reasons for this:
15354
15355      (1) The second and third parts will be against 0 (RSS_UNDEF) but
15356          should nevertheless be emitted if the first part is.
15357
15358      (2) In normal usage, composite relocations are never assembly-time
15359          constants.  The easiest way of dealing with the pathological
15360          exceptions is to generate a relocation against STN_UNDEF and
15361          leave everything up to the linker.  */
15362   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
15363     fixP->fx_done = 1;
15364
15365   switch (fixP->fx_r_type)
15366     {
15367     case BFD_RELOC_MIPS_TLS_GD:
15368     case BFD_RELOC_MIPS_TLS_LDM:
15369     case BFD_RELOC_MIPS_TLS_DTPREL32:
15370     case BFD_RELOC_MIPS_TLS_DTPREL64:
15371     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
15372     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
15373     case BFD_RELOC_MIPS_TLS_GOTTPREL:
15374     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
15375     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
15376     case BFD_RELOC_MICROMIPS_TLS_GD:
15377     case BFD_RELOC_MICROMIPS_TLS_LDM:
15378     case BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16:
15379     case BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16:
15380     case BFD_RELOC_MICROMIPS_TLS_GOTTPREL:
15381     case BFD_RELOC_MICROMIPS_TLS_TPREL_HI16:
15382     case BFD_RELOC_MICROMIPS_TLS_TPREL_LO16:
15383       S_SET_THREAD_LOCAL (fixP->fx_addsy);
15384       /* fall through */
15385
15386     case BFD_RELOC_MIPS_JMP:
15387     case BFD_RELOC_MIPS_SHIFT5:
15388     case BFD_RELOC_MIPS_SHIFT6:
15389     case BFD_RELOC_MIPS_GOT_DISP:
15390     case BFD_RELOC_MIPS_GOT_PAGE:
15391     case BFD_RELOC_MIPS_GOT_OFST:
15392     case BFD_RELOC_MIPS_SUB:
15393     case BFD_RELOC_MIPS_INSERT_A:
15394     case BFD_RELOC_MIPS_INSERT_B:
15395     case BFD_RELOC_MIPS_DELETE:
15396     case BFD_RELOC_MIPS_HIGHEST:
15397     case BFD_RELOC_MIPS_HIGHER:
15398     case BFD_RELOC_MIPS_SCN_DISP:
15399     case BFD_RELOC_MIPS_REL16:
15400     case BFD_RELOC_MIPS_RELGOT:
15401     case BFD_RELOC_MIPS_JALR:
15402     case BFD_RELOC_HI16:
15403     case BFD_RELOC_HI16_S:
15404     case BFD_RELOC_GPREL16:
15405     case BFD_RELOC_MIPS_LITERAL:
15406     case BFD_RELOC_MIPS_CALL16:
15407     case BFD_RELOC_MIPS_GOT16:
15408     case BFD_RELOC_GPREL32:
15409     case BFD_RELOC_MIPS_GOT_HI16:
15410     case BFD_RELOC_MIPS_GOT_LO16:
15411     case BFD_RELOC_MIPS_CALL_HI16:
15412     case BFD_RELOC_MIPS_CALL_LO16:
15413     case BFD_RELOC_MIPS16_GPREL:
15414     case BFD_RELOC_MIPS16_GOT16:
15415     case BFD_RELOC_MIPS16_CALL16:
15416     case BFD_RELOC_MIPS16_HI16:
15417     case BFD_RELOC_MIPS16_HI16_S:
15418     case BFD_RELOC_MIPS16_JMP:
15419     case BFD_RELOC_MICROMIPS_JMP:
15420     case BFD_RELOC_MICROMIPS_GOT_DISP:
15421     case BFD_RELOC_MICROMIPS_GOT_PAGE:
15422     case BFD_RELOC_MICROMIPS_GOT_OFST:
15423     case BFD_RELOC_MICROMIPS_SUB:
15424     case BFD_RELOC_MICROMIPS_HIGHEST:
15425     case BFD_RELOC_MICROMIPS_HIGHER:
15426     case BFD_RELOC_MICROMIPS_SCN_DISP:
15427     case BFD_RELOC_MICROMIPS_JALR:
15428     case BFD_RELOC_MICROMIPS_HI16:
15429     case BFD_RELOC_MICROMIPS_HI16_S:
15430     case BFD_RELOC_MICROMIPS_GPREL16:
15431     case BFD_RELOC_MICROMIPS_LITERAL:
15432     case BFD_RELOC_MICROMIPS_CALL16:
15433     case BFD_RELOC_MICROMIPS_GOT16:
15434     case BFD_RELOC_MICROMIPS_GOT_HI16:
15435     case BFD_RELOC_MICROMIPS_GOT_LO16:
15436     case BFD_RELOC_MICROMIPS_CALL_HI16:
15437     case BFD_RELOC_MICROMIPS_CALL_LO16:
15438       /* Nothing needed to do.  The value comes from the reloc entry.  */
15439       break;
15440
15441     case BFD_RELOC_64:
15442       /* This is handled like BFD_RELOC_32, but we output a sign
15443          extended value if we are only 32 bits.  */
15444       if (fixP->fx_done)
15445         {
15446           if (8 <= sizeof (valueT))
15447             md_number_to_chars ((char *) buf, *valP, 8);
15448           else
15449             {
15450               valueT hiv;
15451
15452               if ((*valP & 0x80000000) != 0)
15453                 hiv = 0xffffffff;
15454               else
15455                 hiv = 0;
15456               md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
15457                                   *valP, 4);
15458               md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
15459                                   hiv, 4);
15460             }
15461         }
15462       break;
15463
15464     case BFD_RELOC_RVA:
15465     case BFD_RELOC_32:
15466     case BFD_RELOC_16:
15467       /* If we are deleting this reloc entry, we must fill in the
15468          value now.  This can happen if we have a .word which is not
15469          resolved when it appears but is later defined.  */
15470       if (fixP->fx_done)
15471         md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
15472       break;
15473
15474     case BFD_RELOC_LO16:
15475     case BFD_RELOC_MIPS16_LO16:
15476     case BFD_RELOC_MICROMIPS_LO16:
15477       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
15478          may be safe to remove, but if so it's not obvious.  */
15479       /* When handling an embedded PIC switch statement, we can wind
15480          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
15481       if (fixP->fx_done)
15482         {
15483           if (*valP + 0x8000 > 0xffff)
15484             as_bad_where (fixP->fx_file, fixP->fx_line,
15485                           _("relocation overflow"));
15486           /* 32-bit microMIPS instructions are divided into two halfwords.
15487              Relocations always refer to the second halfword, regardless
15488              of endianness.  */
15489           if (target_big_endian || fixP->fx_r_type == BFD_RELOC_MICROMIPS_LO16)
15490             buf += 2;
15491           md_number_to_chars ((char *) buf, *valP, 2);
15492         }
15493       break;
15494
15495     case BFD_RELOC_16_PCREL_S2:
15496       if ((*valP & 0x3) != 0)
15497         as_bad_where (fixP->fx_file, fixP->fx_line,
15498                       _("Branch to misaligned address (%lx)"), (long) *valP);
15499
15500       /* We need to save the bits in the instruction since fixup_segment()
15501          might be deleting the relocation entry (i.e., a branch within
15502          the current segment).  */
15503       if (! fixP->fx_done)
15504         break;
15505
15506       /* Update old instruction data.  */
15507       if (target_big_endian)
15508         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
15509       else
15510         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
15511
15512       if (*valP + 0x20000 <= 0x3ffff)
15513         {
15514           insn |= (*valP >> 2) & 0xffff;
15515           md_number_to_chars ((char *) buf, insn, 4);
15516         }
15517       else if (mips_pic == NO_PIC
15518                && fixP->fx_done
15519                && fixP->fx_frag->fr_address >= text_section->vma
15520                && (fixP->fx_frag->fr_address
15521                    < text_section->vma + bfd_get_section_size (text_section))
15522                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
15523                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
15524                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
15525         {
15526           /* The branch offset is too large.  If this is an
15527              unconditional branch, and we are not generating PIC code,
15528              we can convert it to an absolute jump instruction.  */
15529           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
15530             insn = 0x0c000000;  /* jal */
15531           else
15532             insn = 0x08000000;  /* j */
15533           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
15534           fixP->fx_done = 0;
15535           fixP->fx_addsy = section_symbol (text_section);
15536           *valP += md_pcrel_from (fixP);
15537           md_number_to_chars ((char *) buf, insn, 4);
15538         }
15539       else
15540         {
15541           /* If we got here, we have branch-relaxation disabled,
15542              and there's nothing we can do to fix this instruction
15543              without turning it into a longer sequence.  */
15544           as_bad_where (fixP->fx_file, fixP->fx_line,
15545                         _("Branch out of range"));
15546         }
15547       break;
15548
15549     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15550     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15551     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15552       /* We adjust the offset back to even.  */
15553       if ((*valP & 0x1) != 0)
15554         --(*valP);
15555
15556       if (! fixP->fx_done)
15557         break;
15558
15559       /* Should never visit here, because we keep the relocation.  */
15560       abort ();
15561       break;
15562
15563     case BFD_RELOC_VTABLE_INHERIT:
15564       fixP->fx_done = 0;
15565       if (fixP->fx_addsy
15566           && !S_IS_DEFINED (fixP->fx_addsy)
15567           && !S_IS_WEAK (fixP->fx_addsy))
15568         S_SET_WEAK (fixP->fx_addsy);
15569       break;
15570
15571     case BFD_RELOC_VTABLE_ENTRY:
15572       fixP->fx_done = 0;
15573       break;
15574
15575     default:
15576       internalError ();
15577     }
15578
15579   /* Remember value for tc_gen_reloc.  */
15580   fixP->fx_addnumber = *valP;
15581 }
15582
15583 static symbolS *
15584 get_symbol (void)
15585 {
15586   int c;
15587   char *name;
15588   symbolS *p;
15589
15590   name = input_line_pointer;
15591   c = get_symbol_end ();
15592   p = (symbolS *) symbol_find_or_make (name);
15593   *input_line_pointer = c;
15594   return p;
15595 }
15596
15597 /* Align the current frag to a given power of two.  If a particular
15598    fill byte should be used, FILL points to an integer that contains
15599    that byte, otherwise FILL is null.
15600
15601    The MIPS assembler also automatically adjusts any preceding
15602    label.  */
15603
15604 static void
15605 mips_align (int to, int *fill, symbolS *label)
15606 {
15607   mips_emit_delays ();
15608   mips_record_compressed_mode ();
15609   if (fill == NULL && subseg_text_p (now_seg))
15610     frag_align_code (to, 0);
15611   else
15612     frag_align (to, fill ? *fill : 0, 0);
15613   record_alignment (now_seg, to);
15614   if (label != NULL)
15615     {
15616       gas_assert (S_GET_SEGMENT (label) == now_seg);
15617       symbol_set_frag (label, frag_now);
15618       S_SET_VALUE (label, (valueT) frag_now_fix ());
15619     }
15620 }
15621
15622 /* Align to a given power of two.  .align 0 turns off the automatic
15623    alignment used by the data creating pseudo-ops.  */
15624
15625 static void
15626 s_align (int x ATTRIBUTE_UNUSED)
15627 {
15628   int temp, fill_value, *fill_ptr;
15629   long max_alignment = 28;
15630
15631   /* o Note that the assembler pulls down any immediately preceding label
15632        to the aligned address.
15633      o It's not documented but auto alignment is reinstated by
15634        a .align pseudo instruction.
15635      o Note also that after auto alignment is turned off the mips assembler
15636        issues an error on attempt to assemble an improperly aligned data item.
15637        We don't.  */
15638
15639   temp = get_absolute_expression ();
15640   if (temp > max_alignment)
15641     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
15642   else if (temp < 0)
15643     {
15644       as_warn (_("Alignment negative: 0 assumed."));
15645       temp = 0;
15646     }
15647   if (*input_line_pointer == ',')
15648     {
15649       ++input_line_pointer;
15650       fill_value = get_absolute_expression ();
15651       fill_ptr = &fill_value;
15652     }
15653   else
15654     fill_ptr = 0;
15655   if (temp)
15656     {
15657       segment_info_type *si = seg_info (now_seg);
15658       struct insn_label_list *l = si->label_list;
15659       /* Auto alignment should be switched on by next section change.  */
15660       auto_align = 1;
15661       mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
15662     }
15663   else
15664     {
15665       auto_align = 0;
15666     }
15667
15668   demand_empty_rest_of_line ();
15669 }
15670
15671 static void
15672 s_change_sec (int sec)
15673 {
15674   segT seg;
15675
15676 #ifdef OBJ_ELF
15677   /* The ELF backend needs to know that we are changing sections, so
15678      that .previous works correctly.  We could do something like check
15679      for an obj_section_change_hook macro, but that might be confusing
15680      as it would not be appropriate to use it in the section changing
15681      functions in read.c, since obj-elf.c intercepts those.  FIXME:
15682      This should be cleaner, somehow.  */
15683   if (IS_ELF)
15684     obj_elf_section_change_hook ();
15685 #endif
15686
15687   mips_emit_delays ();
15688
15689   switch (sec)
15690     {
15691     case 't':
15692       s_text (0);
15693       break;
15694     case 'd':
15695       s_data (0);
15696       break;
15697     case 'b':
15698       subseg_set (bss_section, (subsegT) get_absolute_expression ());
15699       demand_empty_rest_of_line ();
15700       break;
15701
15702     case 'r':
15703       seg = subseg_new (RDATA_SECTION_NAME,
15704                         (subsegT) get_absolute_expression ());
15705       if (IS_ELF)
15706         {
15707           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
15708                                                   | SEC_READONLY | SEC_RELOC
15709                                                   | SEC_DATA));
15710           if (strncmp (TARGET_OS, "elf", 3) != 0)
15711             record_alignment (seg, 4);
15712         }
15713       demand_empty_rest_of_line ();
15714       break;
15715
15716     case 's':
15717       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
15718       if (IS_ELF)
15719         {
15720           bfd_set_section_flags (stdoutput, seg,
15721                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
15722           if (strncmp (TARGET_OS, "elf", 3) != 0)
15723             record_alignment (seg, 4);
15724         }
15725       demand_empty_rest_of_line ();
15726       break;
15727
15728     case 'B':
15729       seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
15730       if (IS_ELF)
15731         {
15732           bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
15733           if (strncmp (TARGET_OS, "elf", 3) != 0)
15734             record_alignment (seg, 4);
15735         }
15736       demand_empty_rest_of_line ();
15737       break;
15738     }
15739
15740   auto_align = 1;
15741 }
15742
15743 void
15744 s_change_section (int ignore ATTRIBUTE_UNUSED)
15745 {
15746 #ifdef OBJ_ELF
15747   char *section_name;
15748   char c;
15749   char next_c = 0;
15750   int section_type;
15751   int section_flag;
15752   int section_entry_size;
15753   int section_alignment;
15754
15755   if (!IS_ELF)
15756     return;
15757
15758   section_name = input_line_pointer;
15759   c = get_symbol_end ();
15760   if (c)
15761     next_c = *(input_line_pointer + 1);
15762
15763   /* Do we have .section Name<,"flags">?  */
15764   if (c != ',' || (c == ',' && next_c == '"'))
15765     {
15766       /* just after name is now '\0'.  */
15767       *input_line_pointer = c;
15768       input_line_pointer = section_name;
15769       obj_elf_section (ignore);
15770       return;
15771     }
15772   input_line_pointer++;
15773
15774   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
15775   if (c == ',')
15776     section_type = get_absolute_expression ();
15777   else
15778     section_type = 0;
15779   if (*input_line_pointer++ == ',')
15780     section_flag = get_absolute_expression ();
15781   else
15782     section_flag = 0;
15783   if (*input_line_pointer++ == ',')
15784     section_entry_size = get_absolute_expression ();
15785   else
15786     section_entry_size = 0;
15787   if (*input_line_pointer++ == ',')
15788     section_alignment = get_absolute_expression ();
15789   else
15790     section_alignment = 0;
15791   /* FIXME: really ignore?  */
15792   (void) section_alignment;
15793
15794   section_name = xstrdup (section_name);
15795
15796   /* When using the generic form of .section (as implemented by obj-elf.c),
15797      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
15798      traditionally had to fall back on the more common @progbits instead.
15799
15800      There's nothing really harmful in this, since bfd will correct
15801      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
15802      means that, for backwards compatibility, the special_section entries
15803      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
15804
15805      Even so, we shouldn't force users of the MIPS .section syntax to
15806      incorrectly label the sections as SHT_PROGBITS.  The best compromise
15807      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
15808      generic type-checking code.  */
15809   if (section_type == SHT_MIPS_DWARF)
15810     section_type = SHT_PROGBITS;
15811
15812   obj_elf_change_section (section_name, section_type, section_flag,
15813                           section_entry_size, 0, 0, 0);
15814
15815   if (now_seg->name != section_name)
15816     free (section_name);
15817 #endif /* OBJ_ELF */
15818 }
15819
15820 void
15821 mips_enable_auto_align (void)
15822 {
15823   auto_align = 1;
15824 }
15825
15826 static void
15827 s_cons (int log_size)
15828 {
15829   segment_info_type *si = seg_info (now_seg);
15830   struct insn_label_list *l = si->label_list;
15831   symbolS *label;
15832
15833   label = l != NULL ? l->label : NULL;
15834   mips_emit_delays ();
15835   if (log_size > 0 && auto_align)
15836     mips_align (log_size, 0, label);
15837   cons (1 << log_size);
15838   mips_clear_insn_labels ();
15839 }
15840
15841 static void
15842 s_float_cons (int type)
15843 {
15844   segment_info_type *si = seg_info (now_seg);
15845   struct insn_label_list *l = si->label_list;
15846   symbolS *label;
15847
15848   label = l != NULL ? l->label : NULL;
15849
15850   mips_emit_delays ();
15851
15852   if (auto_align)
15853     {
15854       if (type == 'd')
15855         mips_align (3, 0, label);
15856       else
15857         mips_align (2, 0, label);
15858     }
15859
15860   float_cons (type);
15861   mips_clear_insn_labels ();
15862 }
15863
15864 /* Handle .globl.  We need to override it because on Irix 5 you are
15865    permitted to say
15866        .globl foo .text
15867    where foo is an undefined symbol, to mean that foo should be
15868    considered to be the address of a function.  */
15869
15870 static void
15871 s_mips_globl (int x ATTRIBUTE_UNUSED)
15872 {
15873   char *name;
15874   int c;
15875   symbolS *symbolP;
15876   flagword flag;
15877
15878   do
15879     {
15880       name = input_line_pointer;
15881       c = get_symbol_end ();
15882       symbolP = symbol_find_or_make (name);
15883       S_SET_EXTERNAL (symbolP);
15884
15885       *input_line_pointer = c;
15886       SKIP_WHITESPACE ();
15887
15888       /* On Irix 5, every global symbol that is not explicitly labelled as
15889          being a function is apparently labelled as being an object.  */
15890       flag = BSF_OBJECT;
15891
15892       if (!is_end_of_line[(unsigned char) *input_line_pointer]
15893           && (*input_line_pointer != ','))
15894         {
15895           char *secname;
15896           asection *sec;
15897
15898           secname = input_line_pointer;
15899           c = get_symbol_end ();
15900           sec = bfd_get_section_by_name (stdoutput, secname);
15901           if (sec == NULL)
15902             as_bad (_("%s: no such section"), secname);
15903           *input_line_pointer = c;
15904
15905           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
15906             flag = BSF_FUNCTION;
15907         }
15908
15909       symbol_get_bfdsym (symbolP)->flags |= flag;
15910
15911       c = *input_line_pointer;
15912       if (c == ',')
15913         {
15914           input_line_pointer++;
15915           SKIP_WHITESPACE ();
15916           if (is_end_of_line[(unsigned char) *input_line_pointer])
15917             c = '\n';
15918         }
15919     }
15920   while (c == ',');
15921
15922   demand_empty_rest_of_line ();
15923 }
15924
15925 static void
15926 s_option (int x ATTRIBUTE_UNUSED)
15927 {
15928   char *opt;
15929   char c;
15930
15931   opt = input_line_pointer;
15932   c = get_symbol_end ();
15933
15934   if (*opt == 'O')
15935     {
15936       /* FIXME: What does this mean?  */
15937     }
15938   else if (strncmp (opt, "pic", 3) == 0)
15939     {
15940       int i;
15941
15942       i = atoi (opt + 3);
15943       if (i == 0)
15944         mips_pic = NO_PIC;
15945       else if (i == 2)
15946         {
15947         mips_pic = SVR4_PIC;
15948           mips_abicalls = TRUE;
15949         }
15950       else
15951         as_bad (_(".option pic%d not supported"), i);
15952
15953       if (mips_pic == SVR4_PIC)
15954         {
15955           if (g_switch_seen && g_switch_value != 0)
15956             as_warn (_("-G may not be used with SVR4 PIC code"));
15957           g_switch_value = 0;
15958           bfd_set_gp_size (stdoutput, 0);
15959         }
15960     }
15961   else
15962     as_warn (_("Unrecognized option \"%s\""), opt);
15963
15964   *input_line_pointer = c;
15965   demand_empty_rest_of_line ();
15966 }
15967
15968 /* This structure is used to hold a stack of .set values.  */
15969
15970 struct mips_option_stack
15971 {
15972   struct mips_option_stack *next;
15973   struct mips_set_options options;
15974 };
15975
15976 static struct mips_option_stack *mips_opts_stack;
15977
15978 /* Handle the .set pseudo-op.  */
15979
15980 static void
15981 s_mipsset (int x ATTRIBUTE_UNUSED)
15982 {
15983   char *name = input_line_pointer, ch;
15984
15985   while (!is_end_of_line[(unsigned char) *input_line_pointer])
15986     ++input_line_pointer;
15987   ch = *input_line_pointer;
15988   *input_line_pointer = '\0';
15989
15990   if (strcmp (name, "reorder") == 0)
15991     {
15992       if (mips_opts.noreorder)
15993         end_noreorder ();
15994     }
15995   else if (strcmp (name, "noreorder") == 0)
15996     {
15997       if (!mips_opts.noreorder)
15998         start_noreorder ();
15999     }
16000   else if (strncmp (name, "at=", 3) == 0)
16001     {
16002       char *s = name + 3;
16003
16004       if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
16005         as_bad (_("Unrecognized register name `%s'"), s);
16006     }
16007   else if (strcmp (name, "at") == 0)
16008     {
16009       mips_opts.at = ATREG;
16010     }
16011   else if (strcmp (name, "noat") == 0)
16012     {
16013       mips_opts.at = ZERO;
16014     }
16015   else if (strcmp (name, "macro") == 0)
16016     {
16017       mips_opts.warn_about_macros = 0;
16018     }
16019   else if (strcmp (name, "nomacro") == 0)
16020     {
16021       if (mips_opts.noreorder == 0)
16022         as_bad (_("`noreorder' must be set before `nomacro'"));
16023       mips_opts.warn_about_macros = 1;
16024     }
16025   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
16026     {
16027       mips_opts.nomove = 0;
16028     }
16029   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
16030     {
16031       mips_opts.nomove = 1;
16032     }
16033   else if (strcmp (name, "bopt") == 0)
16034     {
16035       mips_opts.nobopt = 0;
16036     }
16037   else if (strcmp (name, "nobopt") == 0)
16038     {
16039       mips_opts.nobopt = 1;
16040     }
16041   else if (strcmp (name, "gp=default") == 0)
16042     mips_opts.gp32 = file_mips_gp32;
16043   else if (strcmp (name, "gp=32") == 0)
16044     mips_opts.gp32 = 1;
16045   else if (strcmp (name, "gp=64") == 0)
16046     {
16047       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
16048         as_warn (_("%s isa does not support 64-bit registers"),
16049                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16050       mips_opts.gp32 = 0;
16051     }
16052   else if (strcmp (name, "fp=default") == 0)
16053     mips_opts.fp32 = file_mips_fp32;
16054   else if (strcmp (name, "fp=32") == 0)
16055     mips_opts.fp32 = 1;
16056   else if (strcmp (name, "fp=64") == 0)
16057     {
16058       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
16059         as_warn (_("%s isa does not support 64-bit floating point registers"),
16060                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16061       mips_opts.fp32 = 0;
16062     }
16063   else if (strcmp (name, "softfloat") == 0)
16064     mips_opts.soft_float = 1;
16065   else if (strcmp (name, "hardfloat") == 0)
16066     mips_opts.soft_float = 0;
16067   else if (strcmp (name, "singlefloat") == 0)
16068     mips_opts.single_float = 1;
16069   else if (strcmp (name, "doublefloat") == 0)
16070     mips_opts.single_float = 0;
16071   else if (strcmp (name, "mips16") == 0
16072            || strcmp (name, "MIPS-16") == 0)
16073     {
16074       if (mips_opts.micromips == 1)
16075         as_fatal (_("`mips16' cannot be used with `micromips'"));
16076       mips_opts.mips16 = 1;
16077     }
16078   else if (strcmp (name, "nomips16") == 0
16079            || strcmp (name, "noMIPS-16") == 0)
16080     mips_opts.mips16 = 0;
16081   else if (strcmp (name, "micromips") == 0)
16082     {
16083       if (mips_opts.mips16 == 1)
16084         as_fatal (_("`micromips' cannot be used with `mips16'"));
16085       mips_opts.micromips = 1;
16086     }
16087   else if (strcmp (name, "nomicromips") == 0)
16088     mips_opts.micromips = 0;
16089   else if (strcmp (name, "smartmips") == 0)
16090     {
16091       if (!ISA_SUPPORTS_SMARTMIPS)
16092         as_warn (_("%s ISA does not support SmartMIPS ASE"), 
16093                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16094       mips_opts.ase_smartmips = 1;
16095     }
16096   else if (strcmp (name, "nosmartmips") == 0)
16097     mips_opts.ase_smartmips = 0;
16098   else if (strcmp (name, "mips3d") == 0)
16099     mips_opts.ase_mips3d = 1;
16100   else if (strcmp (name, "nomips3d") == 0)
16101     mips_opts.ase_mips3d = 0;
16102   else if (strcmp (name, "mdmx") == 0)
16103     mips_opts.ase_mdmx = 1;
16104   else if (strcmp (name, "nomdmx") == 0)
16105     mips_opts.ase_mdmx = 0;
16106   else if (strcmp (name, "dsp") == 0)
16107     {
16108       if (!ISA_SUPPORTS_DSP_ASE)
16109         as_warn (_("%s ISA does not support DSP ASE"), 
16110                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16111       mips_opts.ase_dsp = 1;
16112       mips_opts.ase_dspr2 = 0;
16113     }
16114   else if (strcmp (name, "nodsp") == 0)
16115     {
16116       mips_opts.ase_dsp = 0;
16117       mips_opts.ase_dspr2 = 0;
16118     }
16119   else if (strcmp (name, "dspr2") == 0)
16120     {
16121       if (!ISA_SUPPORTS_DSPR2_ASE)
16122         as_warn (_("%s ISA does not support DSP R2 ASE"),
16123                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16124       mips_opts.ase_dspr2 = 1;
16125       mips_opts.ase_dsp = 1;
16126     }
16127   else if (strcmp (name, "nodspr2") == 0)
16128     {
16129       mips_opts.ase_dspr2 = 0;
16130       mips_opts.ase_dsp = 0;
16131     }
16132   else if (strcmp (name, "mt") == 0)
16133     {
16134       if (!ISA_SUPPORTS_MT_ASE)
16135         as_warn (_("%s ISA does not support MT ASE"), 
16136                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16137       mips_opts.ase_mt = 1;
16138     }
16139   else if (strcmp (name, "nomt") == 0)
16140     mips_opts.ase_mt = 0;
16141   else if (strcmp (name, "mcu") == 0)
16142     mips_opts.ase_mcu = 1;
16143   else if (strcmp (name, "nomcu") == 0)
16144     mips_opts.ase_mcu = 0;
16145   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
16146     {
16147       int reset = 0;
16148
16149       /* Permit the user to change the ISA and architecture on the fly.
16150          Needless to say, misuse can cause serious problems.  */
16151       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
16152         {
16153           reset = 1;
16154           mips_opts.isa = file_mips_isa;
16155           mips_opts.arch = file_mips_arch;
16156         }
16157       else if (strncmp (name, "arch=", 5) == 0)
16158         {
16159           const struct mips_cpu_info *p;
16160
16161           p = mips_parse_cpu("internal use", name + 5);
16162           if (!p)
16163             as_bad (_("unknown architecture %s"), name + 5);
16164           else
16165             {
16166               mips_opts.arch = p->cpu;
16167               mips_opts.isa = p->isa;
16168             }
16169         }
16170       else if (strncmp (name, "mips", 4) == 0)
16171         {
16172           const struct mips_cpu_info *p;
16173
16174           p = mips_parse_cpu("internal use", name);
16175           if (!p)
16176             as_bad (_("unknown ISA level %s"), name + 4);
16177           else
16178             {
16179               mips_opts.arch = p->cpu;
16180               mips_opts.isa = p->isa;
16181             }
16182         }
16183       else
16184         as_bad (_("unknown ISA or architecture %s"), name);
16185
16186       switch (mips_opts.isa)
16187         {
16188         case  0:
16189           break;
16190         case ISA_MIPS1:
16191         case ISA_MIPS2:
16192         case ISA_MIPS32:
16193         case ISA_MIPS32R2:
16194           mips_opts.gp32 = 1;
16195           mips_opts.fp32 = 1;
16196           break;
16197         case ISA_MIPS3:
16198         case ISA_MIPS4:
16199         case ISA_MIPS5:
16200         case ISA_MIPS64:
16201         case ISA_MIPS64R2:
16202           mips_opts.gp32 = 0;
16203           mips_opts.fp32 = 0;
16204           break;
16205         default:
16206           as_bad (_("unknown ISA level %s"), name + 4);
16207           break;
16208         }
16209       if (reset)
16210         {
16211           mips_opts.gp32 = file_mips_gp32;
16212           mips_opts.fp32 = file_mips_fp32;
16213         }
16214     }
16215   else if (strcmp (name, "autoextend") == 0)
16216     mips_opts.noautoextend = 0;
16217   else if (strcmp (name, "noautoextend") == 0)
16218     mips_opts.noautoextend = 1;
16219   else if (strcmp (name, "push") == 0)
16220     {
16221       struct mips_option_stack *s;
16222
16223       s = (struct mips_option_stack *) xmalloc (sizeof *s);
16224       s->next = mips_opts_stack;
16225       s->options = mips_opts;
16226       mips_opts_stack = s;
16227     }
16228   else if (strcmp (name, "pop") == 0)
16229     {
16230       struct mips_option_stack *s;
16231
16232       s = mips_opts_stack;
16233       if (s == NULL)
16234         as_bad (_(".set pop with no .set push"));
16235       else
16236         {
16237           /* If we're changing the reorder mode we need to handle
16238              delay slots correctly.  */
16239           if (s->options.noreorder && ! mips_opts.noreorder)
16240             start_noreorder ();
16241           else if (! s->options.noreorder && mips_opts.noreorder)
16242             end_noreorder ();
16243
16244           mips_opts = s->options;
16245           mips_opts_stack = s->next;
16246           free (s);
16247         }
16248     }
16249   else if (strcmp (name, "sym32") == 0)
16250     mips_opts.sym32 = TRUE;
16251   else if (strcmp (name, "nosym32") == 0)
16252     mips_opts.sym32 = FALSE;
16253   else if (strchr (name, ','))
16254     {
16255       /* Generic ".set" directive; use the generic handler.  */
16256       *input_line_pointer = ch;
16257       input_line_pointer = name;
16258       s_set (0);
16259       return;
16260     }
16261   else
16262     {
16263       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
16264     }
16265   *input_line_pointer = ch;
16266   demand_empty_rest_of_line ();
16267 }
16268
16269 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
16270    .option pic2.  It means to generate SVR4 PIC calls.  */
16271
16272 static void
16273 s_abicalls (int ignore ATTRIBUTE_UNUSED)
16274 {
16275   mips_pic = SVR4_PIC;
16276   mips_abicalls = TRUE;
16277
16278   if (g_switch_seen && g_switch_value != 0)
16279     as_warn (_("-G may not be used with SVR4 PIC code"));
16280   g_switch_value = 0;
16281
16282   bfd_set_gp_size (stdoutput, 0);
16283   demand_empty_rest_of_line ();
16284 }
16285
16286 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
16287    PIC code.  It sets the $gp register for the function based on the
16288    function address, which is in the register named in the argument.
16289    This uses a relocation against _gp_disp, which is handled specially
16290    by the linker.  The result is:
16291         lui     $gp,%hi(_gp_disp)
16292         addiu   $gp,$gp,%lo(_gp_disp)
16293         addu    $gp,$gp,.cpload argument
16294    The .cpload argument is normally $25 == $t9.
16295
16296    The -mno-shared option changes this to:
16297         lui     $gp,%hi(__gnu_local_gp)
16298         addiu   $gp,$gp,%lo(__gnu_local_gp)
16299    and the argument is ignored.  This saves an instruction, but the
16300    resulting code is not position independent; it uses an absolute
16301    address for __gnu_local_gp.  Thus code assembled with -mno-shared
16302    can go into an ordinary executable, but not into a shared library.  */
16303
16304 static void
16305 s_cpload (int ignore ATTRIBUTE_UNUSED)
16306 {
16307   expressionS ex;
16308   int reg;
16309   int in_shared;
16310
16311   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16312      .cpload is ignored.  */
16313   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16314     {
16315       s_ignore (0);
16316       return;
16317     }
16318
16319   /* .cpload should be in a .set noreorder section.  */
16320   if (mips_opts.noreorder == 0)
16321     as_warn (_(".cpload not in noreorder section"));
16322
16323   reg = tc_get_register (0);
16324
16325   /* If we need to produce a 64-bit address, we are better off using
16326      the default instruction sequence.  */
16327   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
16328
16329   ex.X_op = O_symbol;
16330   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
16331                                          "__gnu_local_gp");
16332   ex.X_op_symbol = NULL;
16333   ex.X_add_number = 0;
16334
16335   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
16336   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16337
16338   macro_start ();
16339   macro_build_lui (&ex, mips_gp_register);
16340   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16341                mips_gp_register, BFD_RELOC_LO16);
16342   if (in_shared)
16343     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
16344                  mips_gp_register, reg);
16345   macro_end ();
16346
16347   demand_empty_rest_of_line ();
16348 }
16349
16350 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
16351      .cpsetup $reg1, offset|$reg2, label
16352
16353    If offset is given, this results in:
16354      sd         $gp, offset($sp)
16355      lui        $gp, %hi(%neg(%gp_rel(label)))
16356      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
16357      daddu      $gp, $gp, $reg1
16358
16359    If $reg2 is given, this results in:
16360      daddu      $reg2, $gp, $0
16361      lui        $gp, %hi(%neg(%gp_rel(label)))
16362      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
16363      daddu      $gp, $gp, $reg1
16364    $reg1 is normally $25 == $t9.
16365
16366    The -mno-shared option replaces the last three instructions with
16367         lui     $gp,%hi(_gp)
16368         addiu   $gp,$gp,%lo(_gp)  */
16369
16370 static void
16371 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
16372 {
16373   expressionS ex_off;
16374   expressionS ex_sym;
16375   int reg1;
16376
16377   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
16378      We also need NewABI support.  */
16379   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16380     {
16381       s_ignore (0);
16382       return;
16383     }
16384
16385   reg1 = tc_get_register (0);
16386   SKIP_WHITESPACE ();
16387   if (*input_line_pointer != ',')
16388     {
16389       as_bad (_("missing argument separator ',' for .cpsetup"));
16390       return;
16391     }
16392   else
16393     ++input_line_pointer;
16394   SKIP_WHITESPACE ();
16395   if (*input_line_pointer == '$')
16396     {
16397       mips_cpreturn_register = tc_get_register (0);
16398       mips_cpreturn_offset = -1;
16399     }
16400   else
16401     {
16402       mips_cpreturn_offset = get_absolute_expression ();
16403       mips_cpreturn_register = -1;
16404     }
16405   SKIP_WHITESPACE ();
16406   if (*input_line_pointer != ',')
16407     {
16408       as_bad (_("missing argument separator ',' for .cpsetup"));
16409       return;
16410     }
16411   else
16412     ++input_line_pointer;
16413   SKIP_WHITESPACE ();
16414   expression (&ex_sym);
16415
16416   macro_start ();
16417   if (mips_cpreturn_register == -1)
16418     {
16419       ex_off.X_op = O_constant;
16420       ex_off.X_add_symbol = NULL;
16421       ex_off.X_op_symbol = NULL;
16422       ex_off.X_add_number = mips_cpreturn_offset;
16423
16424       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
16425                    BFD_RELOC_LO16, SP);
16426     }
16427   else
16428     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
16429                  mips_gp_register, 0);
16430
16431   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
16432     {
16433       macro_build (&ex_sym, "lui", LUI_FMT, mips_gp_register,
16434                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
16435                    BFD_RELOC_HI16_S);
16436
16437       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
16438                    mips_gp_register, -1, BFD_RELOC_GPREL16,
16439                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
16440
16441       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
16442                    mips_gp_register, reg1);
16443     }
16444   else
16445     {
16446       expressionS ex;
16447
16448       ex.X_op = O_symbol;
16449       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
16450       ex.X_op_symbol = NULL;
16451       ex.X_add_number = 0;
16452
16453       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
16454       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16455
16456       macro_build_lui (&ex, mips_gp_register);
16457       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16458                    mips_gp_register, BFD_RELOC_LO16);
16459     }
16460
16461   macro_end ();
16462
16463   demand_empty_rest_of_line ();
16464 }
16465
16466 static void
16467 s_cplocal (int ignore ATTRIBUTE_UNUSED)
16468 {
16469   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
16470      .cplocal is ignored.  */
16471   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16472     {
16473       s_ignore (0);
16474       return;
16475     }
16476
16477   mips_gp_register = tc_get_register (0);
16478   demand_empty_rest_of_line ();
16479 }
16480
16481 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
16482    offset from $sp.  The offset is remembered, and after making a PIC
16483    call $gp is restored from that location.  */
16484
16485 static void
16486 s_cprestore (int ignore ATTRIBUTE_UNUSED)
16487 {
16488   expressionS ex;
16489
16490   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16491      .cprestore is ignored.  */
16492   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16493     {
16494       s_ignore (0);
16495       return;
16496     }
16497
16498   mips_cprestore_offset = get_absolute_expression ();
16499   mips_cprestore_valid = 1;
16500
16501   ex.X_op = O_constant;
16502   ex.X_add_symbol = NULL;
16503   ex.X_op_symbol = NULL;
16504   ex.X_add_number = mips_cprestore_offset;
16505
16506   macro_start ();
16507   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
16508                                 SP, HAVE_64BIT_ADDRESSES);
16509   macro_end ();
16510
16511   demand_empty_rest_of_line ();
16512 }
16513
16514 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
16515    was given in the preceding .cpsetup, it results in:
16516      ld         $gp, offset($sp)
16517
16518    If a register $reg2 was given there, it results in:
16519      daddu      $gp, $reg2, $0  */
16520
16521 static void
16522 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
16523 {
16524   expressionS ex;
16525
16526   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
16527      We also need NewABI support.  */
16528   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16529     {
16530       s_ignore (0);
16531       return;
16532     }
16533
16534   macro_start ();
16535   if (mips_cpreturn_register == -1)
16536     {
16537       ex.X_op = O_constant;
16538       ex.X_add_symbol = NULL;
16539       ex.X_op_symbol = NULL;
16540       ex.X_add_number = mips_cpreturn_offset;
16541
16542       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
16543     }
16544   else
16545     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
16546                  mips_cpreturn_register, 0);
16547   macro_end ();
16548
16549   demand_empty_rest_of_line ();
16550 }
16551
16552 /* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
16553    a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
16554    use in DWARF debug information.  */
16555
16556 static void
16557 s_dtprel_internal (size_t bytes)
16558 {
16559   expressionS ex;
16560   char *p;
16561
16562   expression (&ex);
16563
16564   if (ex.X_op != O_symbol)
16565     {
16566       as_bad (_("Unsupported use of %s"), (bytes == 8
16567                                            ? ".dtpreldword"
16568                                            : ".dtprelword"));
16569       ignore_rest_of_line ();
16570     }
16571
16572   p = frag_more (bytes);
16573   md_number_to_chars (p, 0, bytes);
16574   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
16575                (bytes == 8
16576                 ? BFD_RELOC_MIPS_TLS_DTPREL64
16577                 : BFD_RELOC_MIPS_TLS_DTPREL32));
16578
16579   demand_empty_rest_of_line ();
16580 }
16581
16582 /* Handle .dtprelword.  */
16583
16584 static void
16585 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
16586 {
16587   s_dtprel_internal (4);
16588 }
16589
16590 /* Handle .dtpreldword.  */
16591
16592 static void
16593 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
16594 {
16595   s_dtprel_internal (8);
16596 }
16597
16598 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
16599    code.  It sets the offset to use in gp_rel relocations.  */
16600
16601 static void
16602 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
16603 {
16604   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
16605      We also need NewABI support.  */
16606   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16607     {
16608       s_ignore (0);
16609       return;
16610     }
16611
16612   mips_gprel_offset = get_absolute_expression ();
16613
16614   demand_empty_rest_of_line ();
16615 }
16616
16617 /* Handle the .gpword pseudo-op.  This is used when generating PIC
16618    code.  It generates a 32 bit GP relative reloc.  */
16619
16620 static void
16621 s_gpword (int ignore ATTRIBUTE_UNUSED)
16622 {
16623   segment_info_type *si;
16624   struct insn_label_list *l;
16625   symbolS *label;
16626   expressionS ex;
16627   char *p;
16628
16629   /* When not generating PIC code, this is treated as .word.  */
16630   if (mips_pic != SVR4_PIC)
16631     {
16632       s_cons (2);
16633       return;
16634     }
16635
16636   si = seg_info (now_seg);
16637   l = si->label_list;
16638   label = l != NULL ? l->label : NULL;
16639   mips_emit_delays ();
16640   if (auto_align)
16641     mips_align (2, 0, label);
16642
16643   expression (&ex);
16644   mips_clear_insn_labels ();
16645
16646   if (ex.X_op != O_symbol || ex.X_add_number != 0)
16647     {
16648       as_bad (_("Unsupported use of .gpword"));
16649       ignore_rest_of_line ();
16650     }
16651
16652   p = frag_more (4);
16653   md_number_to_chars (p, 0, 4);
16654   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
16655                BFD_RELOC_GPREL32);
16656
16657   demand_empty_rest_of_line ();
16658 }
16659
16660 static void
16661 s_gpdword (int ignore ATTRIBUTE_UNUSED)
16662 {
16663   segment_info_type *si;
16664   struct insn_label_list *l;
16665   symbolS *label;
16666   expressionS ex;
16667   char *p;
16668
16669   /* When not generating PIC code, this is treated as .dword.  */
16670   if (mips_pic != SVR4_PIC)
16671     {
16672       s_cons (3);
16673       return;
16674     }
16675
16676   si = seg_info (now_seg);
16677   l = si->label_list;
16678   label = l != NULL ? l->label : NULL;
16679   mips_emit_delays ();
16680   if (auto_align)
16681     mips_align (3, 0, label);
16682
16683   expression (&ex);
16684   mips_clear_insn_labels ();
16685
16686   if (ex.X_op != O_symbol || ex.X_add_number != 0)
16687     {
16688       as_bad (_("Unsupported use of .gpdword"));
16689       ignore_rest_of_line ();
16690     }
16691
16692   p = frag_more (8);
16693   md_number_to_chars (p, 0, 8);
16694   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
16695                BFD_RELOC_GPREL32)->fx_tcbit = 1;
16696
16697   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
16698   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
16699            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
16700
16701   demand_empty_rest_of_line ();
16702 }
16703
16704 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
16705    tables in SVR4 PIC code.  */
16706
16707 static void
16708 s_cpadd (int ignore ATTRIBUTE_UNUSED)
16709 {
16710   int reg;
16711
16712   /* This is ignored when not generating SVR4 PIC code.  */
16713   if (mips_pic != SVR4_PIC)
16714     {
16715       s_ignore (0);
16716       return;
16717     }
16718
16719   /* Add $gp to the register named as an argument.  */
16720   macro_start ();
16721   reg = tc_get_register (0);
16722   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
16723   macro_end ();
16724
16725   demand_empty_rest_of_line ();
16726 }
16727
16728 /* Handle the .insn pseudo-op.  This marks instruction labels in
16729    mips16/micromips mode.  This permits the linker to handle them specially,
16730    such as generating jalx instructions when needed.  We also make
16731    them odd for the duration of the assembly, in order to generate the
16732    right sort of code.  We will make them even in the adjust_symtab
16733    routine, while leaving them marked.  This is convenient for the
16734    debugger and the disassembler.  The linker knows to make them odd
16735    again.  */
16736
16737 static void
16738 s_insn (int ignore ATTRIBUTE_UNUSED)
16739 {
16740   mips_mark_labels ();
16741
16742   demand_empty_rest_of_line ();
16743 }
16744
16745 /* Handle a .stabn directive.  We need these in order to mark a label
16746    as being a mips16 text label correctly.  Sometimes the compiler
16747    will emit a label, followed by a .stabn, and then switch sections.
16748    If the label and .stabn are in mips16 mode, then the label is
16749    really a mips16 text label.  */
16750
16751 static void
16752 s_mips_stab (int type)
16753 {
16754   if (type == 'n')
16755     mips_mark_labels ();
16756
16757   s_stab (type);
16758 }
16759
16760 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
16761
16762 static void
16763 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
16764 {
16765   char *name;
16766   int c;
16767   symbolS *symbolP;
16768   expressionS exp;
16769
16770   name = input_line_pointer;
16771   c = get_symbol_end ();
16772   symbolP = symbol_find_or_make (name);
16773   S_SET_WEAK (symbolP);
16774   *input_line_pointer = c;
16775
16776   SKIP_WHITESPACE ();
16777
16778   if (! is_end_of_line[(unsigned char) *input_line_pointer])
16779     {
16780       if (S_IS_DEFINED (symbolP))
16781         {
16782           as_bad (_("ignoring attempt to redefine symbol %s"),
16783                   S_GET_NAME (symbolP));
16784           ignore_rest_of_line ();
16785           return;
16786         }
16787
16788       if (*input_line_pointer == ',')
16789         {
16790           ++input_line_pointer;
16791           SKIP_WHITESPACE ();
16792         }
16793
16794       expression (&exp);
16795       if (exp.X_op != O_symbol)
16796         {
16797           as_bad (_("bad .weakext directive"));
16798           ignore_rest_of_line ();
16799           return;
16800         }
16801       symbol_set_value_expression (symbolP, &exp);
16802     }
16803
16804   demand_empty_rest_of_line ();
16805 }
16806
16807 /* Parse a register string into a number.  Called from the ECOFF code
16808    to parse .frame.  The argument is non-zero if this is the frame
16809    register, so that we can record it in mips_frame_reg.  */
16810
16811 int
16812 tc_get_register (int frame)
16813 {
16814   unsigned int reg;
16815
16816   SKIP_WHITESPACE ();
16817   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
16818     reg = 0;
16819   if (frame)
16820     {
16821       mips_frame_reg = reg != 0 ? reg : SP;
16822       mips_frame_reg_valid = 1;
16823       mips_cprestore_valid = 0;
16824     }
16825   return reg;
16826 }
16827
16828 valueT
16829 md_section_align (asection *seg, valueT addr)
16830 {
16831   int align = bfd_get_section_alignment (stdoutput, seg);
16832
16833   if (IS_ELF)
16834     {
16835       /* We don't need to align ELF sections to the full alignment.
16836          However, Irix 5 may prefer that we align them at least to a 16
16837          byte boundary.  We don't bother to align the sections if we
16838          are targeted for an embedded system.  */
16839       if (strncmp (TARGET_OS, "elf", 3) == 0)
16840         return addr;
16841       if (align > 4)
16842         align = 4;
16843     }
16844
16845   return ((addr + (1 << align) - 1) & (-1 << align));
16846 }
16847
16848 /* Utility routine, called from above as well.  If called while the
16849    input file is still being read, it's only an approximation.  (For
16850    example, a symbol may later become defined which appeared to be
16851    undefined earlier.)  */
16852
16853 static int
16854 nopic_need_relax (symbolS *sym, int before_relaxing)
16855 {
16856   if (sym == 0)
16857     return 0;
16858
16859   if (g_switch_value > 0)
16860     {
16861       const char *symname;
16862       int change;
16863
16864       /* Find out whether this symbol can be referenced off the $gp
16865          register.  It can be if it is smaller than the -G size or if
16866          it is in the .sdata or .sbss section.  Certain symbols can
16867          not be referenced off the $gp, although it appears as though
16868          they can.  */
16869       symname = S_GET_NAME (sym);
16870       if (symname != (const char *) NULL
16871           && (strcmp (symname, "eprol") == 0
16872               || strcmp (symname, "etext") == 0
16873               || strcmp (symname, "_gp") == 0
16874               || strcmp (symname, "edata") == 0
16875               || strcmp (symname, "_fbss") == 0
16876               || strcmp (symname, "_fdata") == 0
16877               || strcmp (symname, "_ftext") == 0
16878               || strcmp (symname, "end") == 0
16879               || strcmp (symname, "_gp_disp") == 0))
16880         change = 1;
16881       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
16882                && (0
16883 #ifndef NO_ECOFF_DEBUGGING
16884                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
16885                        && (symbol_get_obj (sym)->ecoff_extern_size
16886                            <= g_switch_value))
16887 #endif
16888                    /* We must defer this decision until after the whole
16889                       file has been read, since there might be a .extern
16890                       after the first use of this symbol.  */
16891                    || (before_relaxing
16892 #ifndef NO_ECOFF_DEBUGGING
16893                        && symbol_get_obj (sym)->ecoff_extern_size == 0
16894 #endif
16895                        && S_GET_VALUE (sym) == 0)
16896                    || (S_GET_VALUE (sym) != 0
16897                        && S_GET_VALUE (sym) <= g_switch_value)))
16898         change = 0;
16899       else
16900         {
16901           const char *segname;
16902
16903           segname = segment_name (S_GET_SEGMENT (sym));
16904           gas_assert (strcmp (segname, ".lit8") != 0
16905                   && strcmp (segname, ".lit4") != 0);
16906           change = (strcmp (segname, ".sdata") != 0
16907                     && strcmp (segname, ".sbss") != 0
16908                     && strncmp (segname, ".sdata.", 7) != 0
16909                     && strncmp (segname, ".sbss.", 6) != 0
16910                     && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
16911                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
16912         }
16913       return change;
16914     }
16915   else
16916     /* We are not optimizing for the $gp register.  */
16917     return 1;
16918 }
16919
16920
16921 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
16922
16923 static bfd_boolean
16924 pic_need_relax (symbolS *sym, asection *segtype)
16925 {
16926   asection *symsec;
16927
16928   /* Handle the case of a symbol equated to another symbol.  */
16929   while (symbol_equated_reloc_p (sym))
16930     {
16931       symbolS *n;
16932
16933       /* It's possible to get a loop here in a badly written program.  */
16934       n = symbol_get_value_expression (sym)->X_add_symbol;
16935       if (n == sym)
16936         break;
16937       sym = n;
16938     }
16939
16940   if (symbol_section_p (sym))
16941     return TRUE;
16942
16943   symsec = S_GET_SEGMENT (sym);
16944
16945   /* This must duplicate the test in adjust_reloc_syms.  */
16946   return (symsec != &bfd_und_section
16947           && symsec != &bfd_abs_section
16948           && !bfd_is_com_section (symsec)
16949           && !s_is_linkonce (sym, segtype)
16950 #ifdef OBJ_ELF
16951           /* A global or weak symbol is treated as external.  */
16952           && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
16953 #endif
16954           );
16955 }
16956
16957
16958 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
16959    extended opcode.  SEC is the section the frag is in.  */
16960
16961 static int
16962 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
16963 {
16964   int type;
16965   const struct mips16_immed_operand *op;
16966   offsetT val;
16967   int mintiny, maxtiny;
16968   segT symsec;
16969   fragS *sym_frag;
16970
16971   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
16972     return 0;
16973   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
16974     return 1;
16975
16976   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
16977   op = mips16_immed_operands;
16978   while (op->type != type)
16979     {
16980       ++op;
16981       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
16982     }
16983
16984   if (op->unsp)
16985     {
16986       if (type == '<' || type == '>' || type == '[' || type == ']')
16987         {
16988           mintiny = 1;
16989           maxtiny = 1 << op->nbits;
16990         }
16991       else
16992         {
16993           mintiny = 0;
16994           maxtiny = (1 << op->nbits) - 1;
16995         }
16996     }
16997   else
16998     {
16999       mintiny = - (1 << (op->nbits - 1));
17000       maxtiny = (1 << (op->nbits - 1)) - 1;
17001     }
17002
17003   sym_frag = symbol_get_frag (fragp->fr_symbol);
17004   val = S_GET_VALUE (fragp->fr_symbol);
17005   symsec = S_GET_SEGMENT (fragp->fr_symbol);
17006
17007   if (op->pcrel)
17008     {
17009       addressT addr;
17010
17011       /* We won't have the section when we are called from
17012          mips_relax_frag.  However, we will always have been called
17013          from md_estimate_size_before_relax first.  If this is a
17014          branch to a different section, we mark it as such.  If SEC is
17015          NULL, and the frag is not marked, then it must be a branch to
17016          the same section.  */
17017       if (sec == NULL)
17018         {
17019           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
17020             return 1;
17021         }
17022       else
17023         {
17024           /* Must have been called from md_estimate_size_before_relax.  */
17025           if (symsec != sec)
17026             {
17027               fragp->fr_subtype =
17028                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17029
17030               /* FIXME: We should support this, and let the linker
17031                  catch branches and loads that are out of range.  */
17032               as_bad_where (fragp->fr_file, fragp->fr_line,
17033                             _("unsupported PC relative reference to different section"));
17034
17035               return 1;
17036             }
17037           if (fragp != sym_frag && sym_frag->fr_address == 0)
17038             /* Assume non-extended on the first relaxation pass.
17039                The address we have calculated will be bogus if this is
17040                a forward branch to another frag, as the forward frag
17041                will have fr_address == 0.  */
17042             return 0;
17043         }
17044
17045       /* In this case, we know for sure that the symbol fragment is in
17046          the same section.  If the relax_marker of the symbol fragment
17047          differs from the relax_marker of this fragment, we have not
17048          yet adjusted the symbol fragment fr_address.  We want to add
17049          in STRETCH in order to get a better estimate of the address.
17050          This particularly matters because of the shift bits.  */
17051       if (stretch != 0
17052           && sym_frag->relax_marker != fragp->relax_marker)
17053         {
17054           fragS *f;
17055
17056           /* Adjust stretch for any alignment frag.  Note that if have
17057              been expanding the earlier code, the symbol may be
17058              defined in what appears to be an earlier frag.  FIXME:
17059              This doesn't handle the fr_subtype field, which specifies
17060              a maximum number of bytes to skip when doing an
17061              alignment.  */
17062           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
17063             {
17064               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
17065                 {
17066                   if (stretch < 0)
17067                     stretch = - ((- stretch)
17068                                  & ~ ((1 << (int) f->fr_offset) - 1));
17069                   else
17070                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
17071                   if (stretch == 0)
17072                     break;
17073                 }
17074             }
17075           if (f != NULL)
17076             val += stretch;
17077         }
17078
17079       addr = fragp->fr_address + fragp->fr_fix;
17080
17081       /* The base address rules are complicated.  The base address of
17082          a branch is the following instruction.  The base address of a
17083          PC relative load or add is the instruction itself, but if it
17084          is in a delay slot (in which case it can not be extended) use
17085          the address of the instruction whose delay slot it is in.  */
17086       if (type == 'p' || type == 'q')
17087         {
17088           addr += 2;
17089
17090           /* If we are currently assuming that this frag should be
17091              extended, then, the current address is two bytes
17092              higher.  */
17093           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17094             addr += 2;
17095
17096           /* Ignore the low bit in the target, since it will be set
17097              for a text label.  */
17098           if ((val & 1) != 0)
17099             --val;
17100         }
17101       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
17102         addr -= 4;
17103       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
17104         addr -= 2;
17105
17106       val -= addr & ~ ((1 << op->shift) - 1);
17107
17108       /* Branch offsets have an implicit 0 in the lowest bit.  */
17109       if (type == 'p' || type == 'q')
17110         val /= 2;
17111
17112       /* If any of the shifted bits are set, we must use an extended
17113          opcode.  If the address depends on the size of this
17114          instruction, this can lead to a loop, so we arrange to always
17115          use an extended opcode.  We only check this when we are in
17116          the main relaxation loop, when SEC is NULL.  */
17117       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
17118         {
17119           fragp->fr_subtype =
17120             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17121           return 1;
17122         }
17123
17124       /* If we are about to mark a frag as extended because the value
17125          is precisely maxtiny + 1, then there is a chance of an
17126          infinite loop as in the following code:
17127              la $4,foo
17128              .skip      1020
17129              .align     2
17130            foo:
17131          In this case when the la is extended, foo is 0x3fc bytes
17132          away, so the la can be shrunk, but then foo is 0x400 away, so
17133          the la must be extended.  To avoid this loop, we mark the
17134          frag as extended if it was small, and is about to become
17135          extended with a value of maxtiny + 1.  */
17136       if (val == ((maxtiny + 1) << op->shift)
17137           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
17138           && sec == NULL)
17139         {
17140           fragp->fr_subtype =
17141             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17142           return 1;
17143         }
17144     }
17145   else if (symsec != absolute_section && sec != NULL)
17146     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
17147
17148   if ((val & ((1 << op->shift) - 1)) != 0
17149       || val < (mintiny << op->shift)
17150       || val > (maxtiny << op->shift))
17151     return 1;
17152   else
17153     return 0;
17154 }
17155
17156 /* Compute the length of a branch sequence, and adjust the
17157    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
17158    worst-case length is computed, with UPDATE being used to indicate
17159    whether an unconditional (-1), branch-likely (+1) or regular (0)
17160    branch is to be computed.  */
17161 static int
17162 relaxed_branch_length (fragS *fragp, asection *sec, int update)
17163 {
17164   bfd_boolean toofar;
17165   int length;
17166
17167   if (fragp
17168       && S_IS_DEFINED (fragp->fr_symbol)
17169       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17170     {
17171       addressT addr;
17172       offsetT val;
17173
17174       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17175
17176       addr = fragp->fr_address + fragp->fr_fix + 4;
17177
17178       val -= addr;
17179
17180       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
17181     }
17182   else if (fragp)
17183     /* If the symbol is not defined or it's in a different segment,
17184        assume the user knows what's going on and emit a short
17185        branch.  */
17186     toofar = FALSE;
17187   else
17188     toofar = TRUE;
17189
17190   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
17191     fragp->fr_subtype
17192       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_AT (fragp->fr_subtype),
17193                              RELAX_BRANCH_UNCOND (fragp->fr_subtype),
17194                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
17195                              RELAX_BRANCH_LINK (fragp->fr_subtype),
17196                              toofar);
17197
17198   length = 4;
17199   if (toofar)
17200     {
17201       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
17202         length += 8;
17203
17204       if (mips_pic != NO_PIC)
17205         {
17206           /* Additional space for PIC loading of target address.  */
17207           length += 8;
17208           if (mips_opts.isa == ISA_MIPS1)
17209             /* Additional space for $at-stabilizing nop.  */
17210             length += 4;
17211         }
17212
17213       /* If branch is conditional.  */
17214       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
17215         length += 8;
17216     }
17217
17218   return length;
17219 }
17220
17221 /* Compute the length of a branch sequence, and adjust the
17222    RELAX_MICROMIPS_TOOFAR32 bit accordingly.  If FRAGP is NULL, the
17223    worst-case length is computed, with UPDATE being used to indicate
17224    whether an unconditional (-1), or regular (0) branch is to be
17225    computed.  */
17226
17227 static int
17228 relaxed_micromips_32bit_branch_length (fragS *fragp, asection *sec, int update)
17229 {
17230   bfd_boolean toofar;
17231   int length;
17232
17233   if (fragp
17234       && S_IS_DEFINED (fragp->fr_symbol)
17235       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17236     {
17237       addressT addr;
17238       offsetT val;
17239
17240       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17241       /* Ignore the low bit in the target, since it will be set
17242          for a text label.  */
17243       if ((val & 1) != 0)
17244         --val;
17245
17246       addr = fragp->fr_address + fragp->fr_fix + 4;
17247
17248       val -= addr;
17249
17250       toofar = val < - (0x8000 << 1) || val >= (0x8000 << 1);
17251     }
17252   else if (fragp)
17253     /* If the symbol is not defined or it's in a different segment,
17254        assume the user knows what's going on and emit a short
17255        branch.  */
17256     toofar = FALSE;
17257   else
17258     toofar = TRUE;
17259
17260   if (fragp && update
17261       && toofar != RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
17262     fragp->fr_subtype = (toofar
17263                          ? RELAX_MICROMIPS_MARK_TOOFAR32 (fragp->fr_subtype)
17264                          : RELAX_MICROMIPS_CLEAR_TOOFAR32 (fragp->fr_subtype));
17265
17266   length = 4;
17267   if (toofar)
17268     {
17269       bfd_boolean compact_known = fragp != NULL;
17270       bfd_boolean compact = FALSE;
17271       bfd_boolean uncond;
17272
17273       if (compact_known)
17274         compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
17275       if (fragp)
17276         uncond = RELAX_MICROMIPS_UNCOND (fragp->fr_subtype);
17277       else
17278         uncond = update < 0;
17279
17280       /* If label is out of range, we turn branch <br>:
17281
17282                 <br>    label                   # 4 bytes
17283             0:
17284
17285          into:
17286
17287                 j       label                   # 4 bytes
17288                 nop                             # 2 bytes if compact && !PIC
17289             0:
17290        */
17291       if (mips_pic == NO_PIC && (!compact_known || compact))
17292         length += 2;
17293
17294       /* If assembling PIC code, we further turn:
17295
17296                         j       label                   # 4 bytes
17297
17298          into:
17299
17300                         lw/ld   at, %got(label)(gp)     # 4 bytes
17301                         d/addiu at, %lo(label)          # 4 bytes
17302                         jr/c    at                      # 2 bytes
17303        */
17304       if (mips_pic != NO_PIC)
17305         length += 6;
17306
17307       /* If branch <br> is conditional, we prepend negated branch <brneg>:
17308
17309                         <brneg> 0f                      # 4 bytes
17310                         nop                             # 2 bytes if !compact
17311        */
17312       if (!uncond)
17313         length += (compact_known && compact) ? 4 : 6;
17314     }
17315
17316   return length;
17317 }
17318
17319 /* Compute the length of a branch, and adjust the RELAX_MICROMIPS_TOOFAR16
17320    bit accordingly.  */
17321
17322 static int
17323 relaxed_micromips_16bit_branch_length (fragS *fragp, asection *sec, int update)
17324 {
17325   bfd_boolean toofar;
17326
17327   if (fragp
17328       && S_IS_DEFINED (fragp->fr_symbol)
17329       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17330     {
17331       addressT addr;
17332       offsetT val;
17333       int type;
17334
17335       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17336       /* Ignore the low bit in the target, since it will be set
17337          for a text label.  */
17338       if ((val & 1) != 0)
17339         --val;
17340
17341       /* Assume this is a 2-byte branch.  */
17342       addr = fragp->fr_address + fragp->fr_fix + 2;
17343
17344       /* We try to avoid the infinite loop by not adding 2 more bytes for
17345          long branches.  */
17346
17347       val -= addr;
17348
17349       type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
17350       if (type == 'D')
17351         toofar = val < - (0x200 << 1) || val >= (0x200 << 1);
17352       else if (type == 'E')
17353         toofar = val < - (0x40 << 1) || val >= (0x40 << 1);
17354       else
17355         abort ();
17356     }
17357   else
17358     /* If the symbol is not defined or it's in a different segment,
17359        we emit a normal 32-bit branch.  */
17360     toofar = TRUE;
17361
17362   if (fragp && update
17363       && toofar != RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
17364     fragp->fr_subtype
17365       = toofar ? RELAX_MICROMIPS_MARK_TOOFAR16 (fragp->fr_subtype)
17366                : RELAX_MICROMIPS_CLEAR_TOOFAR16 (fragp->fr_subtype);
17367
17368   if (toofar)
17369     return 4;
17370
17371   return 2;
17372 }
17373
17374 /* Estimate the size of a frag before relaxing.  Unless this is the
17375    mips16, we are not really relaxing here, and the final size is
17376    encoded in the subtype information.  For the mips16, we have to
17377    decide whether we are using an extended opcode or not.  */
17378
17379 int
17380 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
17381 {
17382   int change;
17383
17384   if (RELAX_BRANCH_P (fragp->fr_subtype))
17385     {
17386
17387       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
17388
17389       return fragp->fr_var;
17390     }
17391
17392   if (RELAX_MIPS16_P (fragp->fr_subtype))
17393     /* We don't want to modify the EXTENDED bit here; it might get us
17394        into infinite loops.  We change it only in mips_relax_frag().  */
17395     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
17396
17397   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17398     {
17399       int length = 4;
17400
17401       if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
17402         length = relaxed_micromips_16bit_branch_length (fragp, segtype, FALSE);
17403       if (length == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
17404         length = relaxed_micromips_32bit_branch_length (fragp, segtype, FALSE);
17405       fragp->fr_var = length;
17406
17407       return length;
17408     }
17409
17410   if (mips_pic == NO_PIC)
17411     change = nopic_need_relax (fragp->fr_symbol, 0);
17412   else if (mips_pic == SVR4_PIC)
17413     change = pic_need_relax (fragp->fr_symbol, segtype);
17414   else if (mips_pic == VXWORKS_PIC)
17415     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
17416     change = 0;
17417   else
17418     abort ();
17419
17420   if (change)
17421     {
17422       fragp->fr_subtype |= RELAX_USE_SECOND;
17423       return -RELAX_FIRST (fragp->fr_subtype);
17424     }
17425   else
17426     return -RELAX_SECOND (fragp->fr_subtype);
17427 }
17428
17429 /* This is called to see whether a reloc against a defined symbol
17430    should be converted into a reloc against a section.  */
17431
17432 int
17433 mips_fix_adjustable (fixS *fixp)
17434 {
17435   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
17436       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17437     return 0;
17438
17439   if (fixp->fx_addsy == NULL)
17440     return 1;
17441
17442   /* If symbol SYM is in a mergeable section, relocations of the form
17443      SYM + 0 can usually be made section-relative.  The mergeable data
17444      is then identified by the section offset rather than by the symbol.
17445
17446      However, if we're generating REL LO16 relocations, the offset is split
17447      between the LO16 and parterning high part relocation.  The linker will
17448      need to recalculate the complete offset in order to correctly identify
17449      the merge data.
17450
17451      The linker has traditionally not looked for the parterning high part
17452      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
17453      placed anywhere.  Rather than break backwards compatibility by changing
17454      this, it seems better not to force the issue, and instead keep the
17455      original symbol.  This will work with either linker behavior.  */
17456   if ((lo16_reloc_p (fixp->fx_r_type)
17457        || reloc_needs_lo_p (fixp->fx_r_type))
17458       && HAVE_IN_PLACE_ADDENDS
17459       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
17460     return 0;
17461
17462   /* There is no place to store an in-place offset for JALR relocations.
17463      Likewise an in-range offset of PC-relative relocations may overflow
17464      the in-place relocatable field if recalculated against the start
17465      address of the symbol's containing section.  */
17466   if (HAVE_IN_PLACE_ADDENDS
17467       && (fixp->fx_pcrel || jalr_reloc_p (fixp->fx_r_type)))
17468     return 0;
17469
17470 #ifdef OBJ_ELF
17471   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
17472      to a floating-point stub.  The same is true for non-R_MIPS16_26
17473      relocations against MIPS16 functions; in this case, the stub becomes
17474      the function's canonical address.
17475
17476      Floating-point stubs are stored in unique .mips16.call.* or
17477      .mips16.fn.* sections.  If a stub T for function F is in section S,
17478      the first relocation in section S must be against F; this is how the
17479      linker determines the target function.  All relocations that might
17480      resolve to T must also be against F.  We therefore have the following
17481      restrictions, which are given in an intentionally-redundant way:
17482
17483        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
17484           symbols.
17485
17486        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
17487           if that stub might be used.
17488
17489        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
17490           symbols.
17491
17492        4. We cannot reduce a stub's relocations against MIPS16 symbols if
17493           that stub might be used.
17494
17495      There is a further restriction:
17496
17497        5. We cannot reduce jump relocations (R_MIPS_26, R_MIPS16_26 or
17498           R_MICROMIPS_26_S1) against MIPS16 or microMIPS symbols on
17499           targets with in-place addends; the relocation field cannot
17500           encode the low bit.
17501
17502      For simplicity, we deal with (3)-(4) by not reducing _any_ relocation
17503      against a MIPS16 symbol.  We deal with (5) by by not reducing any
17504      such relocations on REL targets.
17505
17506      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
17507      relocation against some symbol R, no relocation against R may be
17508      reduced.  (Note that this deals with (2) as well as (1) because
17509      relocations against global symbols will never be reduced on ELF
17510      targets.)  This approach is a little simpler than trying to detect
17511      stub sections, and gives the "all or nothing" per-symbol consistency
17512      that we have for MIPS16 symbols.  */
17513   if (IS_ELF
17514       && fixp->fx_subsy == NULL
17515       && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
17516           || *symbol_get_tc (fixp->fx_addsy)
17517           || (HAVE_IN_PLACE_ADDENDS
17518               && ELF_ST_IS_MICROMIPS (S_GET_OTHER (fixp->fx_addsy))
17519               && jmp_reloc_p (fixp->fx_r_type))))
17520     return 0;
17521 #endif
17522
17523   return 1;
17524 }
17525
17526 /* Translate internal representation of relocation info to BFD target
17527    format.  */
17528
17529 arelent **
17530 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
17531 {
17532   static arelent *retval[4];
17533   arelent *reloc;
17534   bfd_reloc_code_real_type code;
17535
17536   memset (retval, 0, sizeof(retval));
17537   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
17538   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
17539   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
17540   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
17541
17542   if (fixp->fx_pcrel)
17543     {
17544       gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2
17545                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
17546                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
17547                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1);
17548
17549       /* At this point, fx_addnumber is "symbol offset - pcrel address".
17550          Relocations want only the symbol offset.  */
17551       reloc->addend = fixp->fx_addnumber + reloc->address;
17552       if (!IS_ELF)
17553         {
17554           /* A gruesome hack which is a result of the gruesome gas
17555              reloc handling.  What's worse, for COFF (as opposed to
17556              ECOFF), we might need yet another copy of reloc->address.
17557              See bfd_install_relocation.  */
17558           reloc->addend += reloc->address;
17559         }
17560     }
17561   else
17562     reloc->addend = fixp->fx_addnumber;
17563
17564   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
17565      entry to be used in the relocation's section offset.  */
17566   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17567     {
17568       reloc->address = reloc->addend;
17569       reloc->addend = 0;
17570     }
17571
17572   code = fixp->fx_r_type;
17573
17574   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
17575   if (reloc->howto == NULL)
17576     {
17577       as_bad_where (fixp->fx_file, fixp->fx_line,
17578                     _("Can not represent %s relocation in this object file format"),
17579                     bfd_get_reloc_code_name (code));
17580       retval[0] = NULL;
17581     }
17582
17583   return retval;
17584 }
17585
17586 /* Relax a machine dependent frag.  This returns the amount by which
17587    the current size of the frag should change.  */
17588
17589 int
17590 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
17591 {
17592   if (RELAX_BRANCH_P (fragp->fr_subtype))
17593     {
17594       offsetT old_var = fragp->fr_var;
17595
17596       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
17597
17598       return fragp->fr_var - old_var;
17599     }
17600
17601   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17602     {
17603       offsetT old_var = fragp->fr_var;
17604       offsetT new_var = 4;
17605
17606       if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
17607         new_var = relaxed_micromips_16bit_branch_length (fragp, sec, TRUE);
17608       if (new_var == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
17609         new_var = relaxed_micromips_32bit_branch_length (fragp, sec, TRUE);
17610       fragp->fr_var = new_var;
17611
17612       return new_var - old_var;
17613     }
17614
17615   if (! RELAX_MIPS16_P (fragp->fr_subtype))
17616     return 0;
17617
17618   if (mips16_extended_frag (fragp, NULL, stretch))
17619     {
17620       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17621         return 0;
17622       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
17623       return 2;
17624     }
17625   else
17626     {
17627       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17628         return 0;
17629       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
17630       return -2;
17631     }
17632
17633   return 0;
17634 }
17635
17636 /* Convert a machine dependent frag.  */
17637
17638 void
17639 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
17640 {
17641   if (RELAX_BRANCH_P (fragp->fr_subtype))
17642     {
17643       bfd_byte *buf;
17644       unsigned long insn;
17645       expressionS exp;
17646       fixS *fixp;
17647
17648       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
17649
17650       if (target_big_endian)
17651         insn = bfd_getb32 (buf);
17652       else
17653         insn = bfd_getl32 (buf);
17654
17655       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
17656         {
17657           /* We generate a fixup instead of applying it right now
17658              because, if there are linker relaxations, we're going to
17659              need the relocations.  */
17660           exp.X_op = O_symbol;
17661           exp.X_add_symbol = fragp->fr_symbol;
17662           exp.X_add_number = fragp->fr_offset;
17663
17664           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
17665                               4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
17666           fixp->fx_file = fragp->fr_file;
17667           fixp->fx_line = fragp->fr_line;
17668
17669           md_number_to_chars ((char *) buf, insn, 4);
17670           buf += 4;
17671         }
17672       else
17673         {
17674           int i;
17675
17676           as_warn_where (fragp->fr_file, fragp->fr_line,
17677                          _("Relaxed out-of-range branch into a jump"));
17678
17679           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
17680             goto uncond;
17681
17682           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
17683             {
17684               /* Reverse the branch.  */
17685               switch ((insn >> 28) & 0xf)
17686                 {
17687                 case 4:
17688                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
17689                      have the condition reversed by tweaking a single
17690                      bit, and their opcodes all have 0x4???????.  */
17691                   gas_assert ((insn & 0xf1000000) == 0x41000000);
17692                   insn ^= 0x00010000;
17693                   break;
17694
17695                 case 0:
17696                   /* bltz       0x04000000      bgez    0x04010000
17697                      bltzal     0x04100000      bgezal  0x04110000  */
17698                   gas_assert ((insn & 0xfc0e0000) == 0x04000000);
17699                   insn ^= 0x00010000;
17700                   break;
17701
17702                 case 1:
17703                   /* beq        0x10000000      bne     0x14000000
17704                      blez       0x18000000      bgtz    0x1c000000  */
17705                   insn ^= 0x04000000;
17706                   break;
17707
17708                 default:
17709                   abort ();
17710                 }
17711             }
17712
17713           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
17714             {
17715               /* Clear the and-link bit.  */
17716               gas_assert ((insn & 0xfc1c0000) == 0x04100000);
17717
17718               /* bltzal         0x04100000      bgezal  0x04110000
17719                  bltzall        0x04120000      bgezall 0x04130000  */
17720               insn &= ~0x00100000;
17721             }
17722
17723           /* Branch over the branch (if the branch was likely) or the
17724              full jump (not likely case).  Compute the offset from the
17725              current instruction to branch to.  */
17726           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
17727             i = 16;
17728           else
17729             {
17730               /* How many bytes in instructions we've already emitted?  */
17731               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
17732               /* How many bytes in instructions from here to the end?  */
17733               i = fragp->fr_var - i;
17734             }
17735           /* Convert to instruction count.  */
17736           i >>= 2;
17737           /* Branch counts from the next instruction.  */
17738           i--;
17739           insn |= i;
17740           /* Branch over the jump.  */
17741           md_number_to_chars ((char *) buf, insn, 4);
17742           buf += 4;
17743
17744           /* nop */
17745           md_number_to_chars ((char *) buf, 0, 4);
17746           buf += 4;
17747
17748           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
17749             {
17750               /* beql $0, $0, 2f */
17751               insn = 0x50000000;
17752               /* Compute the PC offset from the current instruction to
17753                  the end of the variable frag.  */
17754               /* How many bytes in instructions we've already emitted?  */
17755               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
17756               /* How many bytes in instructions from here to the end?  */
17757               i = fragp->fr_var - i;
17758               /* Convert to instruction count.  */
17759               i >>= 2;
17760               /* Don't decrement i, because we want to branch over the
17761                  delay slot.  */
17762
17763               insn |= i;
17764               md_number_to_chars ((char *) buf, insn, 4);
17765               buf += 4;
17766
17767               md_number_to_chars ((char *) buf, 0, 4);
17768               buf += 4;
17769             }
17770
17771         uncond:
17772           if (mips_pic == NO_PIC)
17773             {
17774               /* j or jal.  */
17775               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
17776                       ? 0x0c000000 : 0x08000000);
17777               exp.X_op = O_symbol;
17778               exp.X_add_symbol = fragp->fr_symbol;
17779               exp.X_add_number = fragp->fr_offset;
17780
17781               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
17782                                   4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
17783               fixp->fx_file = fragp->fr_file;
17784               fixp->fx_line = fragp->fr_line;
17785
17786               md_number_to_chars ((char *) buf, insn, 4);
17787               buf += 4;
17788             }
17789           else
17790             {
17791               unsigned long at = RELAX_BRANCH_AT (fragp->fr_subtype);
17792
17793               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
17794               insn = HAVE_64BIT_ADDRESSES ? 0xdf800000 : 0x8f800000;
17795               insn |= at << OP_SH_RT;
17796               exp.X_op = O_symbol;
17797               exp.X_add_symbol = fragp->fr_symbol;
17798               exp.X_add_number = fragp->fr_offset;
17799
17800               if (fragp->fr_offset)
17801                 {
17802                   exp.X_add_symbol = make_expr_symbol (&exp);
17803                   exp.X_add_number = 0;
17804                 }
17805
17806               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
17807                                   4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
17808               fixp->fx_file = fragp->fr_file;
17809               fixp->fx_line = fragp->fr_line;
17810
17811               md_number_to_chars ((char *) buf, insn, 4);
17812               buf += 4;
17813
17814               if (mips_opts.isa == ISA_MIPS1)
17815                 {
17816                   /* nop */
17817                   md_number_to_chars ((char *) buf, 0, 4);
17818                   buf += 4;
17819                 }
17820
17821               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
17822               insn = HAVE_64BIT_ADDRESSES ? 0x64000000 : 0x24000000;
17823               insn |= at << OP_SH_RS | at << OP_SH_RT;
17824
17825               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
17826                                   4, &exp, FALSE, BFD_RELOC_LO16);
17827               fixp->fx_file = fragp->fr_file;
17828               fixp->fx_line = fragp->fr_line;
17829
17830               md_number_to_chars ((char *) buf, insn, 4);
17831               buf += 4;
17832
17833               /* j(al)r $at.  */
17834               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
17835                 insn = 0x0000f809;
17836               else
17837                 insn = 0x00000008;
17838               insn |= at << OP_SH_RS;
17839
17840               md_number_to_chars ((char *) buf, insn, 4);
17841               buf += 4;
17842             }
17843         }
17844
17845       gas_assert (buf == (bfd_byte *)fragp->fr_literal
17846               + fragp->fr_fix + fragp->fr_var);
17847
17848       fragp->fr_fix += fragp->fr_var;
17849
17850       return;
17851     }
17852
17853   /* Relax microMIPS branches.  */
17854   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17855     {
17856       bfd_byte *buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
17857       bfd_boolean compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
17858       bfd_boolean al = RELAX_MICROMIPS_LINK (fragp->fr_subtype);
17859       int type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
17860       bfd_boolean short_ds;
17861       unsigned long insn;
17862       expressionS exp;
17863       fixS *fixp;
17864
17865       exp.X_op = O_symbol;
17866       exp.X_add_symbol = fragp->fr_symbol;
17867       exp.X_add_number = fragp->fr_offset;
17868
17869       fragp->fr_fix += fragp->fr_var;
17870
17871       /* Handle 16-bit branches that fit or are forced to fit.  */
17872       if (type != 0 && !RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
17873         {
17874           /* We generate a fixup instead of applying it right now,
17875              because if there is linker relaxation, we're going to
17876              need the relocations.  */
17877           if (type == 'D')
17878             fixp = fix_new_exp (fragp,
17879                                 buf - (bfd_byte *) fragp->fr_literal,
17880                                 2, &exp, TRUE,
17881                                 BFD_RELOC_MICROMIPS_10_PCREL_S1);
17882           else if (type == 'E')
17883             fixp = fix_new_exp (fragp,
17884                                 buf - (bfd_byte *) fragp->fr_literal,
17885                                 2, &exp, TRUE,
17886                                 BFD_RELOC_MICROMIPS_7_PCREL_S1);
17887           else
17888             abort ();
17889
17890           fixp->fx_file = fragp->fr_file;
17891           fixp->fx_line = fragp->fr_line;
17892
17893           /* These relocations can have an addend that won't fit in
17894              2 octets.  */
17895           fixp->fx_no_overflow = 1;
17896
17897           return;
17898         }
17899
17900       /* Handle 32-bit branches that fit or are forced to fit.  */
17901       if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
17902           || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
17903         {
17904           /* We generate a fixup instead of applying it right now,
17905              because if there is linker relaxation, we're going to
17906              need the relocations.  */
17907           fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
17908                               4, &exp, TRUE, BFD_RELOC_MICROMIPS_16_PCREL_S1);
17909           fixp->fx_file = fragp->fr_file;
17910           fixp->fx_line = fragp->fr_line;
17911
17912           if (type == 0)
17913             return;
17914         }
17915
17916       /* Relax 16-bit branches to 32-bit branches.  */
17917       if (type != 0)
17918         {
17919           if (target_big_endian)
17920             insn = bfd_getb16 (buf);
17921           else
17922             insn = bfd_getl16 (buf);
17923
17924           if ((insn & 0xfc00) == 0xcc00)                /* b16  */
17925             insn = 0x94000000;                          /* beq  */
17926           else if ((insn & 0xdc00) == 0x8c00)           /* beqz16/bnez16  */
17927             {
17928               unsigned long regno;
17929
17930               regno = (insn >> MICROMIPSOP_SH_MD) & MICROMIPSOP_MASK_MD;
17931               regno = micromips_to_32_reg_d_map [regno];
17932               insn = ((insn & 0x2000) << 16) | 0x94000000;      /* beq/bne  */
17933               insn |= regno << MICROMIPSOP_SH_RS;
17934             }
17935           else
17936             abort ();
17937
17938           /* Nothing else to do, just write it out.  */
17939           if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
17940               || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
17941             {
17942               md_number_to_chars ((char *) buf, insn >> 16, 2);
17943               buf += 2;
17944               md_number_to_chars ((char *) buf, insn & 0xffff, 2);
17945               buf += 2;
17946
17947               gas_assert (buf == ((bfd_byte *) fragp->fr_literal
17948                                   + fragp->fr_fix));
17949               return;
17950             }
17951         }
17952       else
17953         {
17954           unsigned long next;
17955
17956           if (target_big_endian)
17957             {
17958               insn = bfd_getb16 (buf);
17959               next = bfd_getb16 (buf + 2);
17960             }
17961           else
17962             {
17963               insn = bfd_getl16 (buf);
17964               next = bfd_getl16 (buf + 2);
17965             }
17966           insn = (insn << 16) | next;
17967         }
17968
17969       /* Relax 32-bit branches to a sequence of instructions.  */
17970       as_warn_where (fragp->fr_file, fragp->fr_line,
17971                      _("Relaxed out-of-range branch into a jump"));
17972
17973       /* Set the short-delay-slot bit.  */
17974       short_ds = al && (insn & 0x02000000) != 0;
17975
17976       if (!RELAX_MICROMIPS_UNCOND (fragp->fr_subtype))
17977         {
17978           symbolS *l;
17979
17980           /* Reverse the branch.  */
17981           if ((insn & 0xfc000000) == 0x94000000                 /* beq  */
17982               || (insn & 0xfc000000) == 0xb4000000)             /* bne  */
17983             insn ^= 0x20000000;
17984           else if ((insn & 0xffe00000) == 0x40000000            /* bltz  */
17985                    || (insn & 0xffe00000) == 0x40400000         /* bgez  */
17986                    || (insn & 0xffe00000) == 0x40800000         /* blez  */
17987                    || (insn & 0xffe00000) == 0x40c00000         /* bgtz  */
17988                    || (insn & 0xffe00000) == 0x40a00000         /* bnezc  */
17989                    || (insn & 0xffe00000) == 0x40e00000         /* beqzc  */
17990                    || (insn & 0xffe00000) == 0x40200000         /* bltzal  */
17991                    || (insn & 0xffe00000) == 0x40600000         /* bgezal  */
17992                    || (insn & 0xffe00000) == 0x42200000         /* bltzals  */
17993                    || (insn & 0xffe00000) == 0x42600000)        /* bgezals  */
17994             insn ^= 0x00400000;
17995           else if ((insn & 0xffe30000) == 0x43800000            /* bc1f  */
17996                    || (insn & 0xffe30000) == 0x43a00000         /* bc1t  */
17997                    || (insn & 0xffe30000) == 0x42800000         /* bc2f  */
17998                    || (insn & 0xffe30000) == 0x42a00000)        /* bc2t  */
17999             insn ^= 0x00200000;
18000           else
18001             abort ();
18002
18003           if (al)
18004             {
18005               /* Clear the and-link and short-delay-slot bits.  */
18006               gas_assert ((insn & 0xfda00000) == 0x40200000);
18007
18008               /* bltzal  0x40200000     bgezal  0x40600000  */
18009               /* bltzals 0x42200000     bgezals 0x42600000  */
18010               insn &= ~0x02200000;
18011             }
18012
18013           /* Make a label at the end for use with the branch.  */
18014           l = symbol_new (micromips_label_name (), asec, fragp->fr_fix, fragp);
18015           micromips_label_inc ();
18016 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
18017           if (IS_ELF)
18018             S_SET_OTHER (l, ELF_ST_SET_MICROMIPS (S_GET_OTHER (l)));
18019 #endif
18020
18021           /* Refer to it.  */
18022           fixp = fix_new (fragp, buf - (bfd_byte *) fragp->fr_literal,
18023                           4, l, 0, TRUE, BFD_RELOC_MICROMIPS_16_PCREL_S1);
18024           fixp->fx_file = fragp->fr_file;
18025           fixp->fx_line = fragp->fr_line;
18026
18027           /* Branch over the jump.  */
18028           md_number_to_chars ((char *) buf, insn >> 16, 2);
18029           buf += 2;
18030           md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18031           buf += 2;
18032
18033           if (!compact)
18034             {
18035               /* nop  */
18036               insn = 0x0c00;
18037               md_number_to_chars ((char *) buf, insn, 2);
18038               buf += 2;
18039             }
18040         }
18041
18042       if (mips_pic == NO_PIC)
18043         {
18044           unsigned long jal = short_ds ? 0x74000000 : 0xf4000000; /* jal/s  */
18045
18046           /* j/jal/jals <sym>  R_MICROMIPS_26_S1  */
18047           insn = al ? jal : 0xd4000000;
18048
18049           fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
18050                               4, &exp, FALSE, BFD_RELOC_MICROMIPS_JMP);
18051           fixp->fx_file = fragp->fr_file;
18052           fixp->fx_line = fragp->fr_line;
18053
18054           md_number_to_chars ((char *) buf, insn >> 16, 2);
18055           buf += 2;
18056           md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18057           buf += 2;
18058
18059           if (compact)
18060             {
18061               /* nop  */
18062               insn = 0x0c00;
18063               md_number_to_chars ((char *) buf, insn, 2);
18064               buf += 2;
18065             }
18066         }
18067       else
18068         {
18069           unsigned long at = RELAX_MICROMIPS_AT (fragp->fr_subtype);
18070           unsigned long jalr = short_ds ? 0x45e0 : 0x45c0;      /* jalr/s  */
18071           unsigned long jr = compact ? 0x45a0 : 0x4580;         /* jr/c  */
18072
18073           /* lw/ld $at, <sym>($gp)  R_MICROMIPS_GOT16  */
18074           insn = HAVE_64BIT_ADDRESSES ? 0xdc1c0000 : 0xfc1c0000;
18075           insn |= at << MICROMIPSOP_SH_RT;
18076
18077           if (exp.X_add_number)
18078             {
18079               exp.X_add_symbol = make_expr_symbol (&exp);
18080               exp.X_add_number = 0;
18081             }
18082
18083           fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
18084                               4, &exp, FALSE, BFD_RELOC_MICROMIPS_GOT16);
18085           fixp->fx_file = fragp->fr_file;
18086           fixp->fx_line = fragp->fr_line;
18087
18088           md_number_to_chars ((char *) buf, insn >> 16, 2);
18089           buf += 2;
18090           md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18091           buf += 2;
18092
18093           /* d/addiu $at, $at, <sym>  R_MICROMIPS_LO16  */
18094           insn = HAVE_64BIT_ADDRESSES ? 0x5c000000 : 0x30000000;
18095           insn |= at << MICROMIPSOP_SH_RT | at << MICROMIPSOP_SH_RS;
18096
18097           fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
18098                               4, &exp, FALSE, BFD_RELOC_MICROMIPS_LO16);
18099           fixp->fx_file = fragp->fr_file;
18100           fixp->fx_line = fragp->fr_line;
18101
18102           md_number_to_chars ((char *) buf, insn >> 16, 2);
18103           buf += 2;
18104           md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18105           buf += 2;
18106
18107           /* jr/jrc/jalr/jalrs $at  */
18108           insn = al ? jalr : jr;
18109           insn |= at << MICROMIPSOP_SH_MJ;
18110
18111           md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18112           buf += 2;
18113         }
18114
18115       gas_assert (buf == (bfd_byte *) fragp->fr_literal + fragp->fr_fix);
18116       return;
18117     }
18118
18119   if (RELAX_MIPS16_P (fragp->fr_subtype))
18120     {
18121       int type;
18122       const struct mips16_immed_operand *op;
18123       bfd_boolean small, ext;
18124       offsetT val;
18125       bfd_byte *buf;
18126       unsigned long insn;
18127       bfd_boolean use_extend;
18128       unsigned short extend;
18129
18130       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
18131       op = mips16_immed_operands;
18132       while (op->type != type)
18133         ++op;
18134
18135       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
18136         {
18137           small = FALSE;
18138           ext = TRUE;
18139         }
18140       else
18141         {
18142           small = TRUE;
18143           ext = FALSE;
18144         }
18145
18146       val = resolve_symbol_value (fragp->fr_symbol);
18147       if (op->pcrel)
18148         {
18149           addressT addr;
18150
18151           addr = fragp->fr_address + fragp->fr_fix;
18152
18153           /* The rules for the base address of a PC relative reloc are
18154              complicated; see mips16_extended_frag.  */
18155           if (type == 'p' || type == 'q')
18156             {
18157               addr += 2;
18158               if (ext)
18159                 addr += 2;
18160               /* Ignore the low bit in the target, since it will be
18161                  set for a text label.  */
18162               if ((val & 1) != 0)
18163                 --val;
18164             }
18165           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
18166             addr -= 4;
18167           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
18168             addr -= 2;
18169
18170           addr &= ~ (addressT) ((1 << op->shift) - 1);
18171           val -= addr;
18172
18173           /* Make sure the section winds up with the alignment we have
18174              assumed.  */
18175           if (op->shift > 0)
18176             record_alignment (asec, op->shift);
18177         }
18178
18179       if (ext
18180           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
18181               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
18182         as_warn_where (fragp->fr_file, fragp->fr_line,
18183                        _("extended instruction in delay slot"));
18184
18185       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
18186
18187       if (target_big_endian)
18188         insn = bfd_getb16 (buf);
18189       else
18190         insn = bfd_getl16 (buf);
18191
18192       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
18193                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
18194                     small, ext, &insn, &use_extend, &extend);
18195
18196       if (use_extend)
18197         {
18198           md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
18199           fragp->fr_fix += 2;
18200           buf += 2;
18201         }
18202
18203       md_number_to_chars ((char *) buf, insn, 2);
18204       fragp->fr_fix += 2;
18205       buf += 2;
18206     }
18207   else
18208     {
18209       relax_substateT subtype = fragp->fr_subtype;
18210       bfd_boolean second_longer = (subtype & RELAX_SECOND_LONGER) != 0;
18211       bfd_boolean use_second = (subtype & RELAX_USE_SECOND) != 0;
18212       int first, second;
18213       fixS *fixp;
18214
18215       first = RELAX_FIRST (subtype);
18216       second = RELAX_SECOND (subtype);
18217       fixp = (fixS *) fragp->fr_opcode;
18218
18219       /* If the delay slot chosen does not match the size of the instruction,
18220          then emit a warning.  */
18221       if ((!use_second && (subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0)
18222            || (use_second && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0))
18223         {
18224           relax_substateT s;
18225           const char *msg;
18226
18227           s = subtype & (RELAX_DELAY_SLOT_16BIT
18228                          | RELAX_DELAY_SLOT_SIZE_FIRST
18229                          | RELAX_DELAY_SLOT_SIZE_SECOND);
18230           msg = macro_warning (s);
18231           if (msg != NULL)
18232             as_warn_where (fragp->fr_file, fragp->fr_line, msg);
18233           subtype &= ~s;
18234         }
18235
18236       /* Possibly emit a warning if we've chosen the longer option.  */
18237       if (use_second == second_longer)
18238         {
18239           relax_substateT s;
18240           const char *msg;
18241
18242           s = (subtype
18243                & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT));
18244           msg = macro_warning (s);
18245           if (msg != NULL)
18246             as_warn_where (fragp->fr_file, fragp->fr_line, msg);
18247           subtype &= ~s;
18248         }
18249
18250       /* Go through all the fixups for the first sequence.  Disable them
18251          (by marking them as done) if we're going to use the second
18252          sequence instead.  */
18253       while (fixp
18254              && fixp->fx_frag == fragp
18255              && fixp->fx_where < fragp->fr_fix - second)
18256         {
18257           if (subtype & RELAX_USE_SECOND)
18258             fixp->fx_done = 1;
18259           fixp = fixp->fx_next;
18260         }
18261
18262       /* Go through the fixups for the second sequence.  Disable them if
18263          we're going to use the first sequence, otherwise adjust their
18264          addresses to account for the relaxation.  */
18265       while (fixp && fixp->fx_frag == fragp)
18266         {
18267           if (subtype & RELAX_USE_SECOND)
18268             fixp->fx_where -= first;
18269           else
18270             fixp->fx_done = 1;
18271           fixp = fixp->fx_next;
18272         }
18273
18274       /* Now modify the frag contents.  */
18275       if (subtype & RELAX_USE_SECOND)
18276         {
18277           char *start;
18278
18279           start = fragp->fr_literal + fragp->fr_fix - first - second;
18280           memmove (start, start + first, second);
18281           fragp->fr_fix -= first;
18282         }
18283       else
18284         fragp->fr_fix -= second;
18285     }
18286 }
18287
18288 #ifdef OBJ_ELF
18289
18290 /* This function is called after the relocs have been generated.
18291    We've been storing mips16 text labels as odd.  Here we convert them
18292    back to even for the convenience of the debugger.  */
18293
18294 void
18295 mips_frob_file_after_relocs (void)
18296 {
18297   asymbol **syms;
18298   unsigned int count, i;
18299
18300   if (!IS_ELF)
18301     return;
18302
18303   syms = bfd_get_outsymbols (stdoutput);
18304   count = bfd_get_symcount (stdoutput);
18305   for (i = 0; i < count; i++, syms++)
18306     if (ELF_ST_IS_COMPRESSED (elf_symbol (*syms)->internal_elf_sym.st_other)
18307         && ((*syms)->value & 1) != 0)
18308       {
18309         (*syms)->value &= ~1;
18310         /* If the symbol has an odd size, it was probably computed
18311            incorrectly, so adjust that as well.  */
18312         if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
18313           ++elf_symbol (*syms)->internal_elf_sym.st_size;
18314       }
18315 }
18316
18317 #endif
18318
18319 /* This function is called whenever a label is defined, including fake
18320    labels instantiated off the dot special symbol.  It is used when
18321    handling branch delays; if a branch has a label, we assume we cannot
18322    move it.  This also bumps the value of the symbol by 1 in compressed
18323    code.  */
18324
18325 void
18326 mips_record_label (symbolS *sym)
18327 {
18328   segment_info_type *si = seg_info (now_seg);
18329   struct insn_label_list *l;
18330
18331   if (free_insn_labels == NULL)
18332     l = (struct insn_label_list *) xmalloc (sizeof *l);
18333   else
18334     {
18335       l = free_insn_labels;
18336       free_insn_labels = l->next;
18337     }
18338
18339   l->label = sym;
18340   l->next = si->label_list;
18341   si->label_list = l;
18342 }
18343
18344 /* This function is called as tc_frob_label() whenever a label is defined
18345    and adds a DWARF-2 record we only want for true labels.  */
18346
18347 void
18348 mips_define_label (symbolS *sym)
18349 {
18350   mips_record_label (sym);
18351 #ifdef OBJ_ELF
18352   dwarf2_emit_label (sym);
18353 #endif
18354 }
18355 \f
18356 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
18357
18358 /* Some special processing for a MIPS ELF file.  */
18359
18360 void
18361 mips_elf_final_processing (void)
18362 {
18363   /* Write out the register information.  */
18364   if (mips_abi != N64_ABI)
18365     {
18366       Elf32_RegInfo s;
18367
18368       s.ri_gprmask = mips_gprmask;
18369       s.ri_cprmask[0] = mips_cprmask[0];
18370       s.ri_cprmask[1] = mips_cprmask[1];
18371       s.ri_cprmask[2] = mips_cprmask[2];
18372       s.ri_cprmask[3] = mips_cprmask[3];
18373       /* The gp_value field is set by the MIPS ELF backend.  */
18374
18375       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
18376                                        ((Elf32_External_RegInfo *)
18377                                         mips_regmask_frag));
18378     }
18379   else
18380     {
18381       Elf64_Internal_RegInfo s;
18382
18383       s.ri_gprmask = mips_gprmask;
18384       s.ri_pad = 0;
18385       s.ri_cprmask[0] = mips_cprmask[0];
18386       s.ri_cprmask[1] = mips_cprmask[1];
18387       s.ri_cprmask[2] = mips_cprmask[2];
18388       s.ri_cprmask[3] = mips_cprmask[3];
18389       /* The gp_value field is set by the MIPS ELF backend.  */
18390
18391       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
18392                                        ((Elf64_External_RegInfo *)
18393                                         mips_regmask_frag));
18394     }
18395
18396   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
18397      sort of BFD interface for this.  */
18398   if (mips_any_noreorder)
18399     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
18400   if (mips_pic != NO_PIC)
18401     {
18402     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
18403       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18404     }
18405   if (mips_abicalls)
18406     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18407
18408   /* Set MIPS ELF flags for ASEs.  */
18409   /* We may need to define a new flag for DSP ASE, and set this flag when
18410      file_ase_dsp is true.  */
18411   /* Same for DSP R2.  */
18412   /* We may need to define a new flag for MT ASE, and set this flag when
18413      file_ase_mt is true.  */
18414   if (file_ase_mips16)
18415     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
18416   if (file_ase_micromips)
18417     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MICROMIPS;
18418 #if 0 /* XXX FIXME */
18419   if (file_ase_mips3d)
18420     elf_elfheader (stdoutput)->e_flags |= ???;
18421 #endif
18422   if (file_ase_mdmx)
18423     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
18424
18425   /* Set the MIPS ELF ABI flags.  */
18426   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
18427     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
18428   else if (mips_abi == O64_ABI)
18429     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
18430   else if (mips_abi == EABI_ABI)
18431     {
18432       if (!file_mips_gp32)
18433         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
18434       else
18435         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
18436     }
18437   else if (mips_abi == N32_ABI)
18438     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
18439
18440   /* Nothing to do for N64_ABI.  */
18441
18442   if (mips_32bitmode)
18443     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
18444
18445 #if 0 /* XXX FIXME */
18446   /* 32 bit code with 64 bit FP registers.  */
18447   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
18448     elf_elfheader (stdoutput)->e_flags |= ???;
18449 #endif
18450 }
18451
18452 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
18453 \f
18454 typedef struct proc {
18455   symbolS *func_sym;
18456   symbolS *func_end_sym;
18457   unsigned long reg_mask;
18458   unsigned long reg_offset;
18459   unsigned long fpreg_mask;
18460   unsigned long fpreg_offset;
18461   unsigned long frame_offset;
18462   unsigned long frame_reg;
18463   unsigned long pc_reg;
18464 } procS;
18465
18466 static procS cur_proc;
18467 static procS *cur_proc_ptr;
18468 static int numprocs;
18469
18470 /* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1", a microMIPS nop
18471    as "2", and a normal nop as "0".  */
18472
18473 #define NOP_OPCODE_MIPS         0
18474 #define NOP_OPCODE_MIPS16       1
18475 #define NOP_OPCODE_MICROMIPS    2
18476
18477 char
18478 mips_nop_opcode (void)
18479 {
18480   if (seg_info (now_seg)->tc_segment_info_data.micromips)
18481     return NOP_OPCODE_MICROMIPS;
18482   else if (seg_info (now_seg)->tc_segment_info_data.mips16)
18483     return NOP_OPCODE_MIPS16;
18484   else
18485     return NOP_OPCODE_MIPS;
18486 }
18487
18488 /* Fill in an rs_align_code fragment.  Unlike elsewhere we want to use
18489    32-bit microMIPS NOPs here (if applicable).  */
18490
18491 void
18492 mips_handle_align (fragS *fragp)
18493 {
18494   char nop_opcode;
18495   char *p;
18496   int bytes, size, excess;
18497   valueT opcode;
18498
18499   if (fragp->fr_type != rs_align_code)
18500     return;
18501
18502   p = fragp->fr_literal + fragp->fr_fix;
18503   nop_opcode = *p;
18504   switch (nop_opcode)
18505     {
18506     case NOP_OPCODE_MICROMIPS:
18507       opcode = micromips_nop32_insn.insn_opcode;
18508       size = 4;
18509       break;
18510     case NOP_OPCODE_MIPS16:
18511       opcode = mips16_nop_insn.insn_opcode;
18512       size = 2;
18513       break;
18514     case NOP_OPCODE_MIPS:
18515     default:
18516       opcode = nop_insn.insn_opcode;
18517       size = 4;
18518       break;
18519     }
18520
18521   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
18522   excess = bytes % size;
18523
18524   /* Handle the leading part if we're not inserting a whole number of
18525      instructions, and make it the end of the fixed part of the frag.
18526      Try to fit in a short microMIPS NOP if applicable and possible,
18527      and use zeroes otherwise.  */
18528   gas_assert (excess < 4);
18529   fragp->fr_fix += excess;
18530   switch (excess)
18531     {
18532     case 3:
18533       *p++ = '\0';
18534       /* Fall through.  */
18535     case 2:
18536       if (nop_opcode == NOP_OPCODE_MICROMIPS)
18537         {
18538           md_number_to_chars (p, micromips_nop16_insn.insn_opcode, 2);
18539           p += 2;
18540           break;
18541         }
18542       *p++ = '\0';
18543       /* Fall through.  */
18544     case 1:
18545       *p++ = '\0';
18546       /* Fall through.  */
18547     case 0:
18548       break;
18549     }
18550
18551   md_number_to_chars (p, opcode, size);
18552   fragp->fr_var = size;
18553 }
18554
18555 static void
18556 md_obj_begin (void)
18557 {
18558 }
18559
18560 static void
18561 md_obj_end (void)
18562 {
18563   /* Check for premature end, nesting errors, etc.  */
18564   if (cur_proc_ptr)
18565     as_warn (_("missing .end at end of assembly"));
18566 }
18567
18568 static long
18569 get_number (void)
18570 {
18571   int negative = 0;
18572   long val = 0;
18573
18574   if (*input_line_pointer == '-')
18575     {
18576       ++input_line_pointer;
18577       negative = 1;
18578     }
18579   if (!ISDIGIT (*input_line_pointer))
18580     as_bad (_("expected simple number"));
18581   if (input_line_pointer[0] == '0')
18582     {
18583       if (input_line_pointer[1] == 'x')
18584         {
18585           input_line_pointer += 2;
18586           while (ISXDIGIT (*input_line_pointer))
18587             {
18588               val <<= 4;
18589               val |= hex_value (*input_line_pointer++);
18590             }
18591           return negative ? -val : val;
18592         }
18593       else
18594         {
18595           ++input_line_pointer;
18596           while (ISDIGIT (*input_line_pointer))
18597             {
18598               val <<= 3;
18599               val |= *input_line_pointer++ - '0';
18600             }
18601           return negative ? -val : val;
18602         }
18603     }
18604   if (!ISDIGIT (*input_line_pointer))
18605     {
18606       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
18607               *input_line_pointer, *input_line_pointer);
18608       as_warn (_("invalid number"));
18609       return -1;
18610     }
18611   while (ISDIGIT (*input_line_pointer))
18612     {
18613       val *= 10;
18614       val += *input_line_pointer++ - '0';
18615     }
18616   return negative ? -val : val;
18617 }
18618
18619 /* The .file directive; just like the usual .file directive, but there
18620    is an initial number which is the ECOFF file index.  In the non-ECOFF
18621    case .file implies DWARF-2.  */
18622
18623 static void
18624 s_mips_file (int x ATTRIBUTE_UNUSED)
18625 {
18626   static int first_file_directive = 0;
18627
18628   if (ECOFF_DEBUGGING)
18629     {
18630       get_number ();
18631       s_app_file (0);
18632     }
18633   else
18634     {
18635       char *filename;
18636
18637       filename = dwarf2_directive_file (0);
18638
18639       /* Versions of GCC up to 3.1 start files with a ".file"
18640          directive even for stabs output.  Make sure that this
18641          ".file" is handled.  Note that you need a version of GCC
18642          after 3.1 in order to support DWARF-2 on MIPS.  */
18643       if (filename != NULL && ! first_file_directive)
18644         {
18645           (void) new_logical_line (filename, -1);
18646           s_app_file_string (filename, 0);
18647         }
18648       first_file_directive = 1;
18649     }
18650 }
18651
18652 /* The .loc directive, implying DWARF-2.  */
18653
18654 static void
18655 s_mips_loc (int x ATTRIBUTE_UNUSED)
18656 {
18657   if (!ECOFF_DEBUGGING)
18658     dwarf2_directive_loc (0);
18659 }
18660
18661 /* The .end directive.  */
18662
18663 static void
18664 s_mips_end (int x ATTRIBUTE_UNUSED)
18665 {
18666   symbolS *p;
18667
18668   /* Following functions need their own .frame and .cprestore directives.  */
18669   mips_frame_reg_valid = 0;
18670   mips_cprestore_valid = 0;
18671
18672   if (!is_end_of_line[(unsigned char) *input_line_pointer])
18673     {
18674       p = get_symbol ();
18675       demand_empty_rest_of_line ();
18676     }
18677   else
18678     p = NULL;
18679
18680   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
18681     as_warn (_(".end not in text section"));
18682
18683   if (!cur_proc_ptr)
18684     {
18685       as_warn (_(".end directive without a preceding .ent directive."));
18686       demand_empty_rest_of_line ();
18687       return;
18688     }
18689
18690   if (p != NULL)
18691     {
18692       gas_assert (S_GET_NAME (p));
18693       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
18694         as_warn (_(".end symbol does not match .ent symbol."));
18695
18696       if (debug_type == DEBUG_STABS)
18697         stabs_generate_asm_endfunc (S_GET_NAME (p),
18698                                     S_GET_NAME (p));
18699     }
18700   else
18701     as_warn (_(".end directive missing or unknown symbol"));
18702
18703 #ifdef OBJ_ELF
18704   /* Create an expression to calculate the size of the function.  */
18705   if (p && cur_proc_ptr)
18706     {
18707       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
18708       expressionS *exp = xmalloc (sizeof (expressionS));
18709
18710       obj->size = exp;
18711       exp->X_op = O_subtract;
18712       exp->X_add_symbol = symbol_temp_new_now ();
18713       exp->X_op_symbol = p;
18714       exp->X_add_number = 0;
18715
18716       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
18717     }
18718
18719   /* Generate a .pdr section.  */
18720   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
18721     {
18722       segT saved_seg = now_seg;
18723       subsegT saved_subseg = now_subseg;
18724       expressionS exp;
18725       char *fragp;
18726
18727 #ifdef md_flush_pending_output
18728       md_flush_pending_output ();
18729 #endif
18730
18731       gas_assert (pdr_seg);
18732       subseg_set (pdr_seg, 0);
18733
18734       /* Write the symbol.  */
18735       exp.X_op = O_symbol;
18736       exp.X_add_symbol = p;
18737       exp.X_add_number = 0;
18738       emit_expr (&exp, 4);
18739
18740       fragp = frag_more (7 * 4);
18741
18742       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
18743       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
18744       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
18745       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
18746       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
18747       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
18748       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
18749
18750       subseg_set (saved_seg, saved_subseg);
18751     }
18752 #endif /* OBJ_ELF */
18753
18754   cur_proc_ptr = NULL;
18755 }
18756
18757 /* The .aent and .ent directives.  */
18758
18759 static void
18760 s_mips_ent (int aent)
18761 {
18762   symbolS *symbolP;
18763
18764   symbolP = get_symbol ();
18765   if (*input_line_pointer == ',')
18766     ++input_line_pointer;
18767   SKIP_WHITESPACE ();
18768   if (ISDIGIT (*input_line_pointer)
18769       || *input_line_pointer == '-')
18770     get_number ();
18771
18772   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
18773     as_warn (_(".ent or .aent not in text section."));
18774
18775   if (!aent && cur_proc_ptr)
18776     as_warn (_("missing .end"));
18777
18778   if (!aent)
18779     {
18780       /* This function needs its own .frame and .cprestore directives.  */
18781       mips_frame_reg_valid = 0;
18782       mips_cprestore_valid = 0;
18783
18784       cur_proc_ptr = &cur_proc;
18785       memset (cur_proc_ptr, '\0', sizeof (procS));
18786
18787       cur_proc_ptr->func_sym = symbolP;
18788
18789       ++numprocs;
18790
18791       if (debug_type == DEBUG_STABS)
18792         stabs_generate_asm_func (S_GET_NAME (symbolP),
18793                                  S_GET_NAME (symbolP));
18794     }
18795
18796   symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
18797
18798   demand_empty_rest_of_line ();
18799 }
18800
18801 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
18802    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
18803    s_mips_frame is used so that we can set the PDR information correctly.
18804    We can't use the ecoff routines because they make reference to the ecoff
18805    symbol table (in the mdebug section).  */
18806
18807 static void
18808 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
18809 {
18810 #ifdef OBJ_ELF
18811   if (IS_ELF && !ECOFF_DEBUGGING)
18812     {
18813       long val;
18814
18815       if (cur_proc_ptr == (procS *) NULL)
18816         {
18817           as_warn (_(".frame outside of .ent"));
18818           demand_empty_rest_of_line ();
18819           return;
18820         }
18821
18822       cur_proc_ptr->frame_reg = tc_get_register (1);
18823
18824       SKIP_WHITESPACE ();
18825       if (*input_line_pointer++ != ','
18826           || get_absolute_expression_and_terminator (&val) != ',')
18827         {
18828           as_warn (_("Bad .frame directive"));
18829           --input_line_pointer;
18830           demand_empty_rest_of_line ();
18831           return;
18832         }
18833
18834       cur_proc_ptr->frame_offset = val;
18835       cur_proc_ptr->pc_reg = tc_get_register (0);
18836
18837       demand_empty_rest_of_line ();
18838     }
18839   else
18840 #endif /* OBJ_ELF */
18841     s_ignore (ignore);
18842 }
18843
18844 /* The .fmask and .mask directives. If the mdebug section is present
18845    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
18846    embedded targets, s_mips_mask is used so that we can set the PDR
18847    information correctly. We can't use the ecoff routines because they
18848    make reference to the ecoff symbol table (in the mdebug section).  */
18849
18850 static void
18851 s_mips_mask (int reg_type)
18852 {
18853 #ifdef OBJ_ELF
18854   if (IS_ELF && !ECOFF_DEBUGGING)
18855     {
18856       long mask, off;
18857
18858       if (cur_proc_ptr == (procS *) NULL)
18859         {
18860           as_warn (_(".mask/.fmask outside of .ent"));
18861           demand_empty_rest_of_line ();
18862           return;
18863         }
18864
18865       if (get_absolute_expression_and_terminator (&mask) != ',')
18866         {
18867           as_warn (_("Bad .mask/.fmask directive"));
18868           --input_line_pointer;
18869           demand_empty_rest_of_line ();
18870           return;
18871         }
18872
18873       off = get_absolute_expression ();
18874
18875       if (reg_type == 'F')
18876         {
18877           cur_proc_ptr->fpreg_mask = mask;
18878           cur_proc_ptr->fpreg_offset = off;
18879         }
18880       else
18881         {
18882           cur_proc_ptr->reg_mask = mask;
18883           cur_proc_ptr->reg_offset = off;
18884         }
18885
18886       demand_empty_rest_of_line ();
18887     }
18888   else
18889 #endif /* OBJ_ELF */
18890     s_ignore (reg_type);
18891 }
18892
18893 /* A table describing all the processors gas knows about.  Names are
18894    matched in the order listed.
18895
18896    To ease comparison, please keep this table in the same order as
18897    gcc's mips_cpu_info_table[].  */
18898 static const struct mips_cpu_info mips_cpu_info_table[] =
18899 {
18900   /* Entries for generic ISAs */
18901   { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
18902   { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
18903   { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
18904   { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
18905   { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
18906   { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
18907   { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
18908   { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
18909   { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
18910
18911   /* MIPS I */
18912   { "r3000",          0,                        ISA_MIPS1,      CPU_R3000 },
18913   { "r2000",          0,                        ISA_MIPS1,      CPU_R3000 },
18914   { "r3900",          0,                        ISA_MIPS1,      CPU_R3900 },
18915
18916   /* MIPS II */
18917   { "r6000",          0,                        ISA_MIPS2,      CPU_R6000 },
18918
18919   /* MIPS III */
18920   { "r4000",          0,                        ISA_MIPS3,      CPU_R4000 },
18921   { "r4010",          0,                        ISA_MIPS2,      CPU_R4010 },
18922   { "vr4100",         0,                        ISA_MIPS3,      CPU_VR4100 },
18923   { "vr4111",         0,                        ISA_MIPS3,      CPU_R4111 },
18924   { "vr4120",         0,                        ISA_MIPS3,      CPU_VR4120 },
18925   { "vr4130",         0,                        ISA_MIPS3,      CPU_VR4120 },
18926   { "vr4181",         0,                        ISA_MIPS3,      CPU_R4111 },
18927   { "vr4300",         0,                        ISA_MIPS3,      CPU_R4300 },
18928   { "r4400",          0,                        ISA_MIPS3,      CPU_R4400 },
18929   { "r4600",          0,                        ISA_MIPS3,      CPU_R4600 },
18930   { "orion",          0,                        ISA_MIPS3,      CPU_R4600 },
18931   { "r4650",          0,                        ISA_MIPS3,      CPU_R4650 },
18932   /* ST Microelectronics Loongson 2E and 2F cores */
18933   { "loongson2e",     0,                        ISA_MIPS3,   CPU_LOONGSON_2E },
18934   { "loongson2f",     0,                        ISA_MIPS3,   CPU_LOONGSON_2F },
18935
18936   /* MIPS IV */
18937   { "r8000",          0,                        ISA_MIPS4,      CPU_R8000 },
18938   { "r10000",         0,                        ISA_MIPS4,      CPU_R10000 },
18939   { "r12000",         0,                        ISA_MIPS4,      CPU_R12000 },
18940   { "r14000",         0,                        ISA_MIPS4,      CPU_R14000 },
18941   { "r16000",         0,                        ISA_MIPS4,      CPU_R16000 },
18942   { "vr5000",         0,                        ISA_MIPS4,      CPU_R5000 },
18943   { "vr5400",         0,                        ISA_MIPS4,      CPU_VR5400 },
18944   { "vr5500",         0,                        ISA_MIPS4,      CPU_VR5500 },
18945   { "rm5200",         0,                        ISA_MIPS4,      CPU_R5000 },
18946   { "rm5230",         0,                        ISA_MIPS4,      CPU_R5000 },
18947   { "rm5231",         0,                        ISA_MIPS4,      CPU_R5000 },
18948   { "rm5261",         0,                        ISA_MIPS4,      CPU_R5000 },
18949   { "rm5721",         0,                        ISA_MIPS4,      CPU_R5000 },
18950   { "rm7000",         0,                        ISA_MIPS4,      CPU_RM7000 },
18951   { "rm9000",         0,                        ISA_MIPS4,      CPU_RM9000 },
18952
18953   /* MIPS 32 */
18954   { "4kc",            0,                        ISA_MIPS32,     CPU_MIPS32 },
18955   { "4km",            0,                        ISA_MIPS32,     CPU_MIPS32 },
18956   { "4kp",            0,                        ISA_MIPS32,     CPU_MIPS32 },
18957   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
18958
18959   /* MIPS 32 Release 2 */
18960   { "4kec",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
18961   { "4kem",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
18962   { "4kep",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
18963   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
18964   { "m4k",            0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
18965   { "m4kp",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
18966   { "24kc",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
18967   { "24kf2_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
18968   { "24kf",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
18969   { "24kf1_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
18970   /* Deprecated forms of the above.  */
18971   { "24kfx",          0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
18972   { "24kx",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
18973   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
18974   { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18975   { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18976   { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18977   { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18978   /* Deprecated forms of the above.  */
18979   { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18980   { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18981   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
18982   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18983                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18984   { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18985                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18986   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18987                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18988   { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18989                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18990   /* Deprecated forms of the above.  */
18991   { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18992                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18993   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18994                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18995   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
18996   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
18997                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18998   { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
18999                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19000   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19001                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19002   { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19003                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19004   { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19005                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19006   /* Deprecated forms of the above.  */
19007   { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19008                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19009   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19010                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19011   /* 1004K cores are multiprocessor versions of the 34K.  */
19012   { "1004kc",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19013                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19014   { "1004kf2_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19015                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19016   { "1004kf",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19017                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19018   { "1004kf1_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19019                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
19020
19021   /* MIPS 64 */
19022   { "5kc",            0,                        ISA_MIPS64,     CPU_MIPS64 },
19023   { "5kf",            0,                        ISA_MIPS64,     CPU_MIPS64 },
19024   { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
19025   { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
19026
19027   /* Broadcom SB-1 CPU core */
19028   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
19029                                                 ISA_MIPS64,     CPU_SB1 },
19030   /* Broadcom SB-1A CPU core */
19031   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
19032                                                 ISA_MIPS64,     CPU_SB1 },
19033   
19034   { "loongson3a",     0,                        ISA_MIPS64,     CPU_LOONGSON_3A },
19035
19036   /* MIPS 64 Release 2 */
19037
19038   /* Cavium Networks Octeon CPU core */
19039   { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
19040
19041   /* RMI Xlr */
19042   { "xlr",            0,      ISA_MIPS64,     CPU_XLR },
19043
19044   /* End marker */
19045   { NULL, 0, 0, 0 }
19046 };
19047
19048
19049 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
19050    with a final "000" replaced by "k".  Ignore case.
19051
19052    Note: this function is shared between GCC and GAS.  */
19053
19054 static bfd_boolean
19055 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
19056 {
19057   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
19058     given++, canonical++;
19059
19060   return ((*given == 0 && *canonical == 0)
19061           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
19062 }
19063
19064
19065 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
19066    CPU name.  We've traditionally allowed a lot of variation here.
19067
19068    Note: this function is shared between GCC and GAS.  */
19069
19070 static bfd_boolean
19071 mips_matching_cpu_name_p (const char *canonical, const char *given)
19072 {
19073   /* First see if the name matches exactly, or with a final "000"
19074      turned into "k".  */
19075   if (mips_strict_matching_cpu_name_p (canonical, given))
19076     return TRUE;
19077
19078   /* If not, try comparing based on numerical designation alone.
19079      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
19080   if (TOLOWER (*given) == 'r')
19081     given++;
19082   if (!ISDIGIT (*given))
19083     return FALSE;
19084
19085   /* Skip over some well-known prefixes in the canonical name,
19086      hoping to find a number there too.  */
19087   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
19088     canonical += 2;
19089   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
19090     canonical += 2;
19091   else if (TOLOWER (canonical[0]) == 'r')
19092     canonical += 1;
19093
19094   return mips_strict_matching_cpu_name_p (canonical, given);
19095 }
19096
19097
19098 /* Parse an option that takes the name of a processor as its argument.
19099    OPTION is the name of the option and CPU_STRING is the argument.
19100    Return the corresponding processor enumeration if the CPU_STRING is
19101    recognized, otherwise report an error and return null.
19102
19103    A similar function exists in GCC.  */
19104
19105 static const struct mips_cpu_info *
19106 mips_parse_cpu (const char *option, const char *cpu_string)
19107 {
19108   const struct mips_cpu_info *p;
19109
19110   /* 'from-abi' selects the most compatible architecture for the given
19111      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
19112      EABIs, we have to decide whether we're using the 32-bit or 64-bit
19113      version.  Look first at the -mgp options, if given, otherwise base
19114      the choice on MIPS_DEFAULT_64BIT.
19115
19116      Treat NO_ABI like the EABIs.  One reason to do this is that the
19117      plain 'mips' and 'mips64' configs have 'from-abi' as their default
19118      architecture.  This code picks MIPS I for 'mips' and MIPS III for
19119      'mips64', just as we did in the days before 'from-abi'.  */
19120   if (strcasecmp (cpu_string, "from-abi") == 0)
19121     {
19122       if (ABI_NEEDS_32BIT_REGS (mips_abi))
19123         return mips_cpu_info_from_isa (ISA_MIPS1);
19124
19125       if (ABI_NEEDS_64BIT_REGS (mips_abi))
19126         return mips_cpu_info_from_isa (ISA_MIPS3);
19127
19128       if (file_mips_gp32 >= 0)
19129         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
19130
19131       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
19132                                      ? ISA_MIPS3
19133                                      : ISA_MIPS1);
19134     }
19135
19136   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
19137   if (strcasecmp (cpu_string, "default") == 0)
19138     return 0;
19139
19140   for (p = mips_cpu_info_table; p->name != 0; p++)
19141     if (mips_matching_cpu_name_p (p->name, cpu_string))
19142       return p;
19143
19144   as_bad (_("Bad value (%s) for %s"), cpu_string, option);
19145   return 0;
19146 }
19147
19148 /* Return the canonical processor information for ISA (a member of the
19149    ISA_MIPS* enumeration).  */
19150
19151 static const struct mips_cpu_info *
19152 mips_cpu_info_from_isa (int isa)
19153 {
19154   int i;
19155
19156   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19157     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
19158         && isa == mips_cpu_info_table[i].isa)
19159       return (&mips_cpu_info_table[i]);
19160
19161   return NULL;
19162 }
19163
19164 static const struct mips_cpu_info *
19165 mips_cpu_info_from_arch (int arch)
19166 {
19167   int i;
19168
19169   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19170     if (arch == mips_cpu_info_table[i].cpu)
19171       return (&mips_cpu_info_table[i]);
19172
19173   return NULL;
19174 }
19175 \f
19176 static void
19177 show (FILE *stream, const char *string, int *col_p, int *first_p)
19178 {
19179   if (*first_p)
19180     {
19181       fprintf (stream, "%24s", "");
19182       *col_p = 24;
19183     }
19184   else
19185     {
19186       fprintf (stream, ", ");
19187       *col_p += 2;
19188     }
19189
19190   if (*col_p + strlen (string) > 72)
19191     {
19192       fprintf (stream, "\n%24s", "");
19193       *col_p = 24;
19194     }
19195
19196   fprintf (stream, "%s", string);
19197   *col_p += strlen (string);
19198
19199   *first_p = 0;
19200 }
19201
19202 void
19203 md_show_usage (FILE *stream)
19204 {
19205   int column, first;
19206   size_t i;
19207
19208   fprintf (stream, _("\
19209 MIPS options:\n\
19210 -EB                     generate big endian output\n\
19211 -EL                     generate little endian output\n\
19212 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
19213 -G NUM                  allow referencing objects up to NUM bytes\n\
19214                         implicitly with the gp register [default 8]\n"));
19215   fprintf (stream, _("\
19216 -mips1                  generate MIPS ISA I instructions\n\
19217 -mips2                  generate MIPS ISA II instructions\n\
19218 -mips3                  generate MIPS ISA III instructions\n\
19219 -mips4                  generate MIPS ISA IV instructions\n\
19220 -mips5                  generate MIPS ISA V instructions\n\
19221 -mips32                 generate MIPS32 ISA instructions\n\
19222 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
19223 -mips64                 generate MIPS64 ISA instructions\n\
19224 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
19225 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
19226
19227   first = 1;
19228
19229   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19230     show (stream, mips_cpu_info_table[i].name, &column, &first);
19231   show (stream, "from-abi", &column, &first);
19232   fputc ('\n', stream);
19233
19234   fprintf (stream, _("\
19235 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
19236 -no-mCPU                don't generate code specific to CPU.\n\
19237                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
19238
19239   first = 1;
19240
19241   show (stream, "3900", &column, &first);
19242   show (stream, "4010", &column, &first);
19243   show (stream, "4100", &column, &first);
19244   show (stream, "4650", &column, &first);
19245   fputc ('\n', stream);
19246
19247   fprintf (stream, _("\
19248 -mips16                 generate mips16 instructions\n\
19249 -no-mips16              do not generate mips16 instructions\n"));
19250   fprintf (stream, _("\
19251 -mmicromips             generate microMIPS instructions\n\
19252 -mno-micromips          do not generate microMIPS instructions\n"));
19253   fprintf (stream, _("\
19254 -msmartmips             generate smartmips instructions\n\
19255 -mno-smartmips          do not generate smartmips instructions\n"));  
19256   fprintf (stream, _("\
19257 -mdsp                   generate DSP instructions\n\
19258 -mno-dsp                do not generate DSP instructions\n"));
19259   fprintf (stream, _("\
19260 -mdspr2                 generate DSP R2 instructions\n\
19261 -mno-dspr2              do not generate DSP R2 instructions\n"));
19262   fprintf (stream, _("\
19263 -mmt                    generate MT instructions\n\
19264 -mno-mt                 do not generate MT instructions\n"));
19265   fprintf (stream, _("\
19266 -mmcu                   generate MCU instructions\n\
19267 -mno-mcu                do not generate MCU instructions\n"));
19268   fprintf (stream, _("\
19269 -mfix-loongson2f-jump   work around Loongson2F JUMP instructions\n\
19270 -mfix-loongson2f-nop    work around Loongson2F NOP errata\n\
19271 -mfix-vr4120            work around certain VR4120 errata\n\
19272 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
19273 -mfix-24k               insert a nop after ERET and DERET instructions\n\
19274 -mfix-cn63xxp1          work around CN63XXP1 PREF errata\n\
19275 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
19276 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
19277 -msym32                 assume all symbols have 32-bit values\n\
19278 -O0                     remove unneeded NOPs, do not swap branches\n\
19279 -O                      remove unneeded NOPs and swap branches\n\
19280 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
19281 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
19282   fprintf (stream, _("\
19283 -mhard-float            allow floating-point instructions\n\
19284 -msoft-float            do not allow floating-point instructions\n\
19285 -msingle-float          only allow 32-bit floating-point operations\n\
19286 -mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
19287 --[no-]construct-floats [dis]allow floating point values to be constructed\n"
19288                      ));
19289 #ifdef OBJ_ELF
19290   fprintf (stream, _("\
19291 -KPIC, -call_shared     generate SVR4 position independent code\n\
19292 -call_nonpic            generate non-PIC code that can operate with DSOs\n\
19293 -mvxworks-pic           generate VxWorks position independent code\n\
19294 -non_shared             do not generate code that can operate with DSOs\n\
19295 -xgot                   assume a 32 bit GOT\n\
19296 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
19297 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
19298                         position dependent (non shared) code\n\
19299 -mabi=ABI               create ABI conformant object file for:\n"));
19300
19301   first = 1;
19302
19303   show (stream, "32", &column, &first);
19304   show (stream, "o64", &column, &first);
19305   show (stream, "n32", &column, &first);
19306   show (stream, "64", &column, &first);
19307   show (stream, "eabi", &column, &first);
19308
19309   fputc ('\n', stream);
19310
19311   fprintf (stream, _("\
19312 -32                     create o32 ABI object file (default)\n\
19313 -n32                    create n32 ABI object file\n\
19314 -64                     create 64 ABI object file\n"));
19315 #endif
19316 }
19317
19318 #ifdef TE_IRIX
19319 enum dwarf2_format
19320 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
19321 {
19322   if (HAVE_64BIT_SYMBOLS)
19323     return dwarf2_format_64bit_irix;
19324   else
19325     return dwarf2_format_32bit;
19326 }
19327 #endif
19328
19329 int
19330 mips_dwarf2_addr_size (void)
19331 {
19332   if (HAVE_64BIT_OBJECTS)
19333     return 8;
19334   else
19335     return 4;
19336 }
19337
19338 /* Standard calling conventions leave the CFA at SP on entry.  */
19339 void
19340 mips_cfi_frame_initial_instructions (void)
19341 {
19342   cfi_add_CFA_def_cfa_register (SP);
19343 }
19344
19345 int
19346 tc_mips_regname_to_dw2regnum (char *regname)
19347 {
19348   unsigned int regnum = -1;
19349   unsigned int reg;
19350
19351   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
19352     regnum = reg;
19353
19354   return regnum;
19355 }