include/opcode/
[external/binutils.git] / gas / config / tc-mips.c
1 /* tc-mips.c -- assemble code for a MIPS chip.
2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3    2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
4    Free Software Foundation, Inc.
5    Contributed by the OSF and Ralph Campbell.
6    Written by Keith Knowles and Ralph Campbell, working independently.
7    Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
8    Support.
9
10    This file is part of GAS.
11
12    GAS is free software; you can redistribute it and/or modify
13    it under the terms of the GNU General Public License as published by
14    the Free Software Foundation; either version 3, or (at your option)
15    any later version.
16
17    GAS is distributed in the hope that it will be useful,
18    but WITHOUT ANY WARRANTY; without even the implied warranty of
19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20    GNU General Public License for more details.
21
22    You should have received a copy of the GNU General Public License
23    along with GAS; see the file COPYING.  If not, write to the Free
24    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
25    02110-1301, USA.  */
26
27 #include "as.h"
28 #include "config.h"
29 #include "subsegs.h"
30 #include "safe-ctype.h"
31
32 #include "opcode/mips.h"
33 #include "itbl-ops.h"
34 #include "dwarf2dbg.h"
35 #include "dw2gencfi.h"
36
37 /* Check assumptions made in this file.  */
38 typedef char static_assert1[sizeof (offsetT) < 8 ? -1 : 1];
39 typedef char static_assert2[sizeof (valueT) < 8 ? -1 : 1];
40
41 #ifdef DEBUG
42 #define DBG(x) printf x
43 #else
44 #define DBG(x)
45 #endif
46
47 /* Clean up namespace so we can include obj-elf.h too.  */
48 static int mips_output_flavor (void);
49 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
50 #undef OBJ_PROCESS_STAB
51 #undef OUTPUT_FLAVOR
52 #undef S_GET_ALIGN
53 #undef S_GET_SIZE
54 #undef S_SET_ALIGN
55 #undef S_SET_SIZE
56 #undef obj_frob_file
57 #undef obj_frob_file_after_relocs
58 #undef obj_frob_symbol
59 #undef obj_pop_insert
60 #undef obj_sec_sym_ok_for_reloc
61 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
62
63 #include "obj-elf.h"
64 /* Fix any of them that we actually care about.  */
65 #undef OUTPUT_FLAVOR
66 #define OUTPUT_FLAVOR mips_output_flavor()
67
68 #include "elf/mips.h"
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 static char *mips_regmask_frag;
89
90 #define ZERO 0
91 #define ATREG 1
92 #define S0  16
93 #define S7  23
94 #define TREG 24
95 #define PIC_CALL_REG 25
96 #define KT0 26
97 #define KT1 27
98 #define GP  28
99 #define SP  29
100 #define FP  30
101 #define RA  31
102
103 #define ILLEGAL_REG (32)
104
105 #define AT  mips_opts.at
106
107 extern int target_big_endian;
108
109 /* The name of the readonly data section.  */
110 #define RDATA_SECTION_NAME ".rodata"
111
112 /* Ways in which an instruction can be "appended" to the output.  */
113 enum append_method {
114   /* Just add it normally.  */
115   APPEND_ADD,
116
117   /* Add it normally and then add a nop.  */
118   APPEND_ADD_WITH_NOP,
119
120   /* Turn an instruction with a delay slot into a "compact" version.  */
121   APPEND_ADD_COMPACT,
122
123   /* Insert the instruction before the last one.  */
124   APPEND_SWAP
125 };
126
127 /* Information about an instruction, including its format, operands
128    and fixups.  */
129 struct mips_cl_insn
130 {
131   /* The opcode's entry in mips_opcodes or mips16_opcodes.  */
132   const struct mips_opcode *insn_mo;
133
134   /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
135      a copy of INSN_MO->match with the operands filled in.  If we have
136      decided to use an extended MIPS16 instruction, this includes the
137      extension.  */
138   unsigned long insn_opcode;
139
140   /* The frag that contains the instruction.  */
141   struct frag *frag;
142
143   /* The offset into FRAG of the first instruction byte.  */
144   long where;
145
146   /* The relocs associated with the instruction, if any.  */
147   fixS *fixp[3];
148
149   /* True if this entry cannot be moved from its current position.  */
150   unsigned int fixed_p : 1;
151
152   /* True if this instruction occurred in a .set noreorder block.  */
153   unsigned int noreorder_p : 1;
154
155   /* True for mips16 instructions that jump to an absolute address.  */
156   unsigned int mips16_absolute_jump_p : 1;
157
158   /* True if this instruction is complete.  */
159   unsigned int complete_p : 1;
160
161   /* True if this instruction is cleared from history by unconditional
162      branch.  */
163   unsigned int cleared_p : 1;
164 };
165
166 /* The ABI to use.  */
167 enum mips_abi_level
168 {
169   NO_ABI = 0,
170   O32_ABI,
171   O64_ABI,
172   N32_ABI,
173   N64_ABI,
174   EABI_ABI
175 };
176
177 /* MIPS ABI we are using for this output file.  */
178 static enum mips_abi_level mips_abi = NO_ABI;
179
180 /* Whether or not we have code that can call pic code.  */
181 int mips_abicalls = FALSE;
182
183 /* Whether or not we have code which can be put into a shared
184    library.  */
185 static bfd_boolean mips_in_shared = TRUE;
186
187 /* This is the set of options which may be modified by the .set
188    pseudo-op.  We use a struct so that .set push and .set pop are more
189    reliable.  */
190
191 struct mips_set_options
192 {
193   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
194      if it has not been initialized.  Changed by `.set mipsN', and the
195      -mipsN command line option, and the default CPU.  */
196   int isa;
197   /* Enabled Application Specific Extensions (ASEs).  Changed by `.set
198      <asename>', by command line options, and based on the default
199      architecture.  */
200   int ase;
201   /* Whether we are assembling for the mips16 processor.  0 if we are
202      not, 1 if we are, and -1 if the value has not been initialized.
203      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
204      -nomips16 command line options, and the default CPU.  */
205   int mips16;
206   /* Whether we are assembling for the mipsMIPS ASE.  0 if we are not,
207      1 if we are, and -1 if the value has not been initialized.  Changed
208      by `.set micromips' and `.set nomicromips', and the -mmicromips
209      and -mno-micromips command line options, and the default CPU.  */
210   int micromips;
211   /* Non-zero if we should not reorder instructions.  Changed by `.set
212      reorder' and `.set noreorder'.  */
213   int noreorder;
214   /* Non-zero if we should not permit the register designated "assembler
215      temporary" to be used in instructions.  The value is the register
216      number, normally $at ($1).  Changed by `.set at=REG', `.set noat'
217      (same as `.set at=$0') and `.set at' (same as `.set at=$1').  */
218   unsigned int at;
219   /* Non-zero if we should warn when a macro instruction expands into
220      more than one machine instruction.  Changed by `.set nomacro' and
221      `.set macro'.  */
222   int warn_about_macros;
223   /* Non-zero if we should not move instructions.  Changed by `.set
224      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
225   int nomove;
226   /* Non-zero if we should not optimize branches by moving the target
227      of the branch into the delay slot.  Actually, we don't perform
228      this optimization anyhow.  Changed by `.set bopt' and `.set
229      nobopt'.  */
230   int nobopt;
231   /* Non-zero if we should not autoextend mips16 instructions.
232      Changed by `.set autoextend' and `.set noautoextend'.  */
233   int noautoextend;
234   /* Restrict general purpose registers and floating point registers
235      to 32 bit.  This is initially determined when -mgp32 or -mfp32
236      is passed but can changed if the assembler code uses .set mipsN.  */
237   int gp32;
238   int fp32;
239   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
240      command line option, and the default CPU.  */
241   int arch;
242   /* True if ".set sym32" is in effect.  */
243   bfd_boolean sym32;
244   /* True if floating-point operations are not allowed.  Changed by .set
245      softfloat or .set hardfloat, by command line options -msoft-float or
246      -mhard-float.  The default is false.  */
247   bfd_boolean soft_float;
248
249   /* True if only single-precision floating-point operations are allowed.
250      Changed by .set singlefloat or .set doublefloat, command-line options
251      -msingle-float or -mdouble-float.  The default is false.  */
252   bfd_boolean single_float;
253 };
254
255 /* This is the struct we use to hold the current set of options.  Note
256    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
257    -1 to indicate that they have not been initialized.  */
258
259 /* True if -mgp32 was passed.  */
260 static int file_mips_gp32 = -1;
261
262 /* True if -mfp32 was passed.  */
263 static int file_mips_fp32 = -1;
264
265 /* 1 if -msoft-float, 0 if -mhard-float.  The default is 0.  */
266 static int file_mips_soft_float = 0;
267
268 /* 1 if -msingle-float, 0 if -mdouble-float.  The default is 0.   */
269 static int file_mips_single_float = 0;
270
271 static struct mips_set_options mips_opts =
272 {
273   /* isa */ ISA_UNKNOWN, /* ase */ 0, /* mips16 */ -1, /* micromips */ -1,
274   /* noreorder */ 0,  /* at */ ATREG, /* warn_about_macros */ 0,
275   /* nomove */ 0, /* nobopt */ 0, /* noautoextend */ 0, /* gp32 */ 0,
276   /* fp32 */ 0, /* arch */ CPU_UNKNOWN, /* sym32 */ FALSE,
277   /* soft_float */ FALSE, /* single_float */ FALSE
278 };
279
280 /* The set of ASEs that were selected on the command line, either
281    explicitly via ASE options or implicitly through things like -march.  */
282 static unsigned int file_ase;
283
284 /* Which bits of file_ase were explicitly set or cleared by ASE options.  */
285 static unsigned int file_ase_explicit;
286
287 /* These variables are filled in with the masks of registers used.
288    The object format code reads them and puts them in the appropriate
289    place.  */
290 unsigned long mips_gprmask;
291 unsigned long mips_cprmask[4];
292
293 /* MIPS ISA we are using for this output file.  */
294 static int file_mips_isa = ISA_UNKNOWN;
295
296 /* True if any MIPS16 code was produced.  */
297 static int file_ase_mips16;
298
299 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
300                               || mips_opts.isa == ISA_MIPS32R2          \
301                               || mips_opts.isa == ISA_MIPS64            \
302                               || mips_opts.isa == ISA_MIPS64R2)
303
304 /* True if any microMIPS code was produced.  */
305 static int file_ase_micromips;
306
307 /* True if we want to create R_MIPS_JALR for jalr $25.  */
308 #ifdef TE_IRIX
309 #define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
310 #else
311 /* As a GNU extension, we use R_MIPS_JALR for o32 too.  However,
312    because there's no place for any addend, the only acceptable
313    expression is a bare symbol.  */
314 #define MIPS_JALR_HINT_P(EXPR) \
315   (!HAVE_IN_PLACE_ADDENDS \
316    || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
317 #endif
318
319 /* The argument of the -march= flag.  The architecture we are assembling.  */
320 static int file_mips_arch = CPU_UNKNOWN;
321 static const char *mips_arch_string;
322
323 /* The argument of the -mtune= flag.  The architecture for which we
324    are optimizing.  */
325 static int mips_tune = CPU_UNKNOWN;
326 static const char *mips_tune_string;
327
328 /* True when generating 32-bit code for a 64-bit processor.  */
329 static int mips_32bitmode = 0;
330
331 /* True if the given ABI requires 32-bit registers.  */
332 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
333
334 /* Likewise 64-bit registers.  */
335 #define ABI_NEEDS_64BIT_REGS(ABI)       \
336   ((ABI) == N32_ABI                     \
337    || (ABI) == N64_ABI                  \
338    || (ABI) == O64_ABI)
339
340 /*  Return true if ISA supports 64 bit wide gp registers.  */
341 #define ISA_HAS_64BIT_REGS(ISA)         \
342   ((ISA) == ISA_MIPS3                   \
343    || (ISA) == ISA_MIPS4                \
344    || (ISA) == ISA_MIPS5                \
345    || (ISA) == ISA_MIPS64               \
346    || (ISA) == ISA_MIPS64R2)
347
348 /*  Return true if ISA supports 64 bit wide float registers.  */
349 #define ISA_HAS_64BIT_FPRS(ISA)         \
350   ((ISA) == ISA_MIPS3                   \
351    || (ISA) == ISA_MIPS4                \
352    || (ISA) == ISA_MIPS5                \
353    || (ISA) == ISA_MIPS32R2             \
354    || (ISA) == ISA_MIPS64               \
355    || (ISA) == ISA_MIPS64R2)
356
357 /* Return true if ISA supports 64-bit right rotate (dror et al.)
358    instructions.  */
359 #define ISA_HAS_DROR(ISA)               \
360   ((ISA) == ISA_MIPS64R2                \
361    || (mips_opts.micromips              \
362        && ISA_HAS_64BIT_REGS (ISA))     \
363    )
364
365 /* Return true if ISA supports 32-bit right rotate (ror et al.)
366    instructions.  */
367 #define ISA_HAS_ROR(ISA)                \
368   ((ISA) == ISA_MIPS32R2                \
369    || (ISA) == ISA_MIPS64R2             \
370    || (mips_opts.ase & ASE_SMARTMIPS)   \
371    || mips_opts.micromips               \
372    )
373
374 /* Return true if ISA supports single-precision floats in odd registers.  */
375 #define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
376   ((ISA) == ISA_MIPS32                  \
377    || (ISA) == ISA_MIPS32R2             \
378    || (ISA) == ISA_MIPS64               \
379    || (ISA) == ISA_MIPS64R2)
380
381 /* Return true if ISA supports move to/from high part of a 64-bit
382    floating-point register. */
383 #define ISA_HAS_MXHC1(ISA)              \
384   ((ISA) == ISA_MIPS32R2                \
385    || (ISA) == ISA_MIPS64R2)
386
387 #define HAVE_32BIT_GPRS                            \
388     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
389
390 #define HAVE_32BIT_FPRS                            \
391     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
392
393 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
394 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
395
396 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
397
398 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
399
400 /* True if relocations are stored in-place.  */
401 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
402
403 /* The ABI-derived address size.  */
404 #define HAVE_64BIT_ADDRESSES \
405   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
406 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
407
408 /* The size of symbolic constants (i.e., expressions of the form
409    "SYMBOL" or "SYMBOL + OFFSET").  */
410 #define HAVE_32BIT_SYMBOLS \
411   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
412 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
413
414 /* Addresses are loaded in different ways, depending on the address size
415    in use.  The n32 ABI Documentation also mandates the use of additions
416    with overflow checking, but existing implementations don't follow it.  */
417 #define ADDRESS_ADD_INSN                                                \
418    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
419
420 #define ADDRESS_ADDI_INSN                                               \
421    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
422
423 #define ADDRESS_LOAD_INSN                                               \
424    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
425
426 #define ADDRESS_STORE_INSN                                              \
427    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
428
429 /* Return true if the given CPU supports the MIPS16 ASE.  */
430 #define CPU_HAS_MIPS16(cpu)                                             \
431    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
432     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
433
434 /* Return true if the given CPU supports the microMIPS ASE.  */
435 #define CPU_HAS_MICROMIPS(cpu)  0
436
437 /* True if CPU has a dror instruction.  */
438 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
439
440 /* True if CPU has a ror instruction.  */
441 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
442
443 /* True if CPU is in the Octeon family */
444 #define CPU_IS_OCTEON(CPU) ((CPU) == CPU_OCTEON || (CPU) == CPU_OCTEONP || (CPU) == CPU_OCTEON2)
445
446 /* True if CPU has seq/sne and seqi/snei instructions.  */
447 #define CPU_HAS_SEQ(CPU)        (CPU_IS_OCTEON (CPU))
448
449 /* True, if CPU has support for ldc1 and sdc1. */
450 #define CPU_HAS_LDC1_SDC1(CPU)  \
451    ((mips_opts.isa != ISA_MIPS1) && ((CPU) != CPU_R5900))
452
453 /* True if mflo and mfhi can be immediately followed by instructions
454    which write to the HI and LO registers.
455
456    According to MIPS specifications, MIPS ISAs I, II, and III need
457    (at least) two instructions between the reads of HI/LO and
458    instructions which write them, and later ISAs do not.  Contradicting
459    the MIPS specifications, some MIPS IV processor user manuals (e.g.
460    the UM for the NEC Vr5000) document needing the instructions between
461    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
462    MIPS64 and later ISAs to have the interlocks, plus any specific
463    earlier-ISA CPUs for which CPU documentation declares that the
464    instructions are really interlocked.  */
465 #define hilo_interlocks \
466   (mips_opts.isa == ISA_MIPS32                        \
467    || mips_opts.isa == ISA_MIPS32R2                   \
468    || mips_opts.isa == ISA_MIPS64                     \
469    || mips_opts.isa == ISA_MIPS64R2                   \
470    || mips_opts.arch == CPU_R4010                     \
471    || mips_opts.arch == CPU_R5900                     \
472    || mips_opts.arch == CPU_R10000                    \
473    || mips_opts.arch == CPU_R12000                    \
474    || mips_opts.arch == CPU_R14000                    \
475    || mips_opts.arch == CPU_R16000                    \
476    || mips_opts.arch == CPU_RM7000                    \
477    || mips_opts.arch == CPU_VR5500                    \
478    || mips_opts.micromips                             \
479    )
480
481 /* Whether the processor uses hardware interlocks to protect reads
482    from the GPRs after they are loaded from memory, and thus does not
483    require nops to be inserted.  This applies to instructions marked
484    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
485    level I and microMIPS mode instructions are always interlocked.  */
486 #define gpr_interlocks                                \
487   (mips_opts.isa != ISA_MIPS1                         \
488    || mips_opts.arch == CPU_R3900                     \
489    || mips_opts.arch == CPU_R5900                     \
490    || mips_opts.micromips                             \
491    )
492
493 /* Whether the processor uses hardware interlocks to avoid delays
494    required by coprocessor instructions, and thus does not require
495    nops to be inserted.  This applies to instructions marked
496    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
497    between instructions marked INSN_WRITE_COND_CODE and ones marked
498    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
499    levels I, II, and III and microMIPS mode instructions are always
500    interlocked.  */
501 /* Itbl support may require additional care here.  */
502 #define cop_interlocks                                \
503   ((mips_opts.isa != ISA_MIPS1                        \
504     && mips_opts.isa != ISA_MIPS2                     \
505     && mips_opts.isa != ISA_MIPS3)                    \
506    || mips_opts.arch == CPU_R4300                     \
507    || mips_opts.micromips                             \
508    )
509
510 /* Whether the processor uses hardware interlocks to protect reads
511    from coprocessor registers after they are loaded from memory, and
512    thus does not require nops to be inserted.  This applies to
513    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
514    requires at MIPS ISA level I and microMIPS mode instructions are
515    always interlocked.  */
516 #define cop_mem_interlocks                            \
517   (mips_opts.isa != ISA_MIPS1                         \
518    || mips_opts.micromips                             \
519    )
520
521 /* Is this a mfhi or mflo instruction?  */
522 #define MF_HILO_INSN(PINFO) \
523   ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
524
525 /* Whether code compression (either of the MIPS16 or the microMIPS ASEs)
526    has been selected.  This implies, in particular, that addresses of text
527    labels have their LSB set.  */
528 #define HAVE_CODE_COMPRESSION                                           \
529   ((mips_opts.mips16 | mips_opts.micromips) != 0)
530
531 /* The minimum and maximum signed values that can be stored in a GPR.  */
532 #define GPR_SMAX ((offsetT) (((valueT) 1 << (HAVE_64BIT_GPRS ? 63 : 31)) - 1))
533 #define GPR_SMIN (-GPR_SMAX - 1)
534
535 /* MIPS PIC level.  */
536
537 enum mips_pic_level mips_pic;
538
539 /* 1 if we should generate 32 bit offsets from the $gp register in
540    SVR4_PIC mode.  Currently has no meaning in other modes.  */
541 static int mips_big_got = 0;
542
543 /* 1 if trap instructions should used for overflow rather than break
544    instructions.  */
545 static int mips_trap = 0;
546
547 /* 1 if double width floating point constants should not be constructed
548    by assembling two single width halves into two single width floating
549    point registers which just happen to alias the double width destination
550    register.  On some architectures this aliasing can be disabled by a bit
551    in the status register, and the setting of this bit cannot be determined
552    automatically at assemble time.  */
553 static int mips_disable_float_construction;
554
555 /* Non-zero if any .set noreorder directives were used.  */
556
557 static int mips_any_noreorder;
558
559 /* Non-zero if nops should be inserted when the register referenced in
560    an mfhi/mflo instruction is read in the next two instructions.  */
561 static int mips_7000_hilo_fix;
562
563 /* The size of objects in the small data section.  */
564 static unsigned int g_switch_value = 8;
565 /* Whether the -G option was used.  */
566 static int g_switch_seen = 0;
567
568 #define N_RMASK 0xc4
569 #define N_VFP   0xd4
570
571 /* If we can determine in advance that GP optimization won't be
572    possible, we can skip the relaxation stuff that tries to produce
573    GP-relative references.  This makes delay slot optimization work
574    better.
575
576    This function can only provide a guess, but it seems to work for
577    gcc output.  It needs to guess right for gcc, otherwise gcc
578    will put what it thinks is a GP-relative instruction in a branch
579    delay slot.
580
581    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
582    fixed it for the non-PIC mode.  KR 95/04/07  */
583 static int nopic_need_relax (symbolS *, int);
584
585 /* handle of the OPCODE hash table */
586 static struct hash_control *op_hash = NULL;
587
588 /* The opcode hash table we use for the mips16.  */
589 static struct hash_control *mips16_op_hash = NULL;
590
591 /* The opcode hash table we use for the microMIPS ASE.  */
592 static struct hash_control *micromips_op_hash = NULL;
593
594 /* This array holds the chars that always start a comment.  If the
595     pre-processor is disabled, these aren't very useful */
596 const char comment_chars[] = "#";
597
598 /* This array holds the chars that only start a comment at the beginning of
599    a line.  If the line seems to have the form '# 123 filename'
600    .line and .file directives will appear in the pre-processed output */
601 /* Note that input_file.c hand checks for '#' at the beginning of the
602    first line of the input file.  This is because the compiler outputs
603    #NO_APP at the beginning of its output.  */
604 /* Also note that C style comments are always supported.  */
605 const char line_comment_chars[] = "#";
606
607 /* This array holds machine specific line separator characters.  */
608 const char line_separator_chars[] = ";";
609
610 /* Chars that can be used to separate mant from exp in floating point nums */
611 const char EXP_CHARS[] = "eE";
612
613 /* Chars that mean this number is a floating point constant */
614 /* As in 0f12.456 */
615 /* or    0d1.2345e12 */
616 const char FLT_CHARS[] = "rRsSfFdDxXpP";
617
618 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
619    changed in read.c .  Ideally it shouldn't have to know about it at all,
620    but nothing is ideal around here.
621  */
622
623 static char *insn_error;
624
625 static int auto_align = 1;
626
627 /* When outputting SVR4 PIC code, the assembler needs to know the
628    offset in the stack frame from which to restore the $gp register.
629    This is set by the .cprestore pseudo-op, and saved in this
630    variable.  */
631 static offsetT mips_cprestore_offset = -1;
632
633 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
634    more optimizations, it can use a register value instead of a memory-saved
635    offset and even an other register than $gp as global pointer.  */
636 static offsetT mips_cpreturn_offset = -1;
637 static int mips_cpreturn_register = -1;
638 static int mips_gp_register = GP;
639 static int mips_gprel_offset = 0;
640
641 /* Whether mips_cprestore_offset has been set in the current function
642    (or whether it has already been warned about, if not).  */
643 static int mips_cprestore_valid = 0;
644
645 /* This is the register which holds the stack frame, as set by the
646    .frame pseudo-op.  This is needed to implement .cprestore.  */
647 static int mips_frame_reg = SP;
648
649 /* Whether mips_frame_reg has been set in the current function
650    (or whether it has already been warned about, if not).  */
651 static int mips_frame_reg_valid = 0;
652
653 /* To output NOP instructions correctly, we need to keep information
654    about the previous two instructions.  */
655
656 /* Whether we are optimizing.  The default value of 2 means to remove
657    unneeded NOPs and swap branch instructions when possible.  A value
658    of 1 means to not swap branches.  A value of 0 means to always
659    insert NOPs.  */
660 static int mips_optimize = 2;
661
662 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
663    equivalent to seeing no -g option at all.  */
664 static int mips_debug = 0;
665
666 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
667 #define MAX_VR4130_NOPS 4
668
669 /* The maximum number of NOPs needed to fill delay slots.  */
670 #define MAX_DELAY_NOPS 2
671
672 /* The maximum number of NOPs needed for any purpose.  */
673 #define MAX_NOPS 4
674
675 /* A list of previous instructions, with index 0 being the most recent.
676    We need to look back MAX_NOPS instructions when filling delay slots
677    or working around processor errata.  We need to look back one
678    instruction further if we're thinking about using history[0] to
679    fill a branch delay slot.  */
680 static struct mips_cl_insn history[1 + MAX_NOPS];
681
682 /* Nop instructions used by emit_nop.  */
683 static struct mips_cl_insn nop_insn;
684 static struct mips_cl_insn mips16_nop_insn;
685 static struct mips_cl_insn micromips_nop16_insn;
686 static struct mips_cl_insn micromips_nop32_insn;
687
688 /* The appropriate nop for the current mode.  */
689 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn \
690                   : (mips_opts.micromips ? &micromips_nop16_insn : &nop_insn))
691
692 /* The size of NOP_INSN in bytes.  */
693 #define NOP_INSN_SIZE (HAVE_CODE_COMPRESSION ? 2 : 4)
694
695 /* If this is set, it points to a frag holding nop instructions which
696    were inserted before the start of a noreorder section.  If those
697    nops turn out to be unnecessary, the size of the frag can be
698    decreased.  */
699 static fragS *prev_nop_frag;
700
701 /* The number of nop instructions we created in prev_nop_frag.  */
702 static int prev_nop_frag_holds;
703
704 /* The number of nop instructions that we know we need in
705    prev_nop_frag.  */
706 static int prev_nop_frag_required;
707
708 /* The number of instructions we've seen since prev_nop_frag.  */
709 static int prev_nop_frag_since;
710
711 /* Relocations against symbols are sometimes done in two parts, with a HI
712    relocation and a LO relocation.  Each relocation has only 16 bits of
713    space to store an addend.  This means that in order for the linker to
714    handle carries correctly, it must be able to locate both the HI and
715    the LO relocation.  This means that the relocations must appear in
716    order in the relocation table.
717
718    In order to implement this, we keep track of each unmatched HI
719    relocation.  We then sort them so that they immediately precede the
720    corresponding LO relocation.  */
721
722 struct mips_hi_fixup
723 {
724   /* Next HI fixup.  */
725   struct mips_hi_fixup *next;
726   /* This fixup.  */
727   fixS *fixp;
728   /* The section this fixup is in.  */
729   segT seg;
730 };
731
732 /* The list of unmatched HI relocs.  */
733
734 static struct mips_hi_fixup *mips_hi_fixup_list;
735
736 /* The frag containing the last explicit relocation operator.
737    Null if explicit relocations have not been used.  */
738
739 static fragS *prev_reloc_op_frag;
740
741 /* Map normal MIPS register numbers to mips16 register numbers.  */
742
743 #define X ILLEGAL_REG
744 static const int mips32_to_16_reg_map[] =
745 {
746   X, X, 2, 3, 4, 5, 6, 7,
747   X, X, X, X, X, X, X, X,
748   0, 1, X, X, X, X, X, X,
749   X, X, X, X, X, X, X, X
750 };
751 #undef X
752
753 /* Map mips16 register numbers to normal MIPS register numbers.  */
754
755 static const unsigned int mips16_to_32_reg_map[] =
756 {
757   16, 17, 2, 3, 4, 5, 6, 7
758 };
759
760 /* Map normal MIPS register numbers to microMIPS register numbers.  */
761
762 #define mips32_to_micromips_reg_b_map   mips32_to_16_reg_map
763 #define mips32_to_micromips_reg_c_map   mips32_to_16_reg_map
764 #define mips32_to_micromips_reg_d_map   mips32_to_16_reg_map
765 #define mips32_to_micromips_reg_e_map   mips32_to_16_reg_map
766 #define mips32_to_micromips_reg_f_map   mips32_to_16_reg_map
767 #define mips32_to_micromips_reg_g_map   mips32_to_16_reg_map
768 #define mips32_to_micromips_reg_l_map   mips32_to_16_reg_map
769
770 #define X ILLEGAL_REG
771 /* reg type h: 4, 5, 6.  */
772 static const int mips32_to_micromips_reg_h_map[] =
773 {
774   X, X, X, X, 4, 5, 6, X,
775   X, X, X, X, X, X, X, X,
776   X, X, X, X, X, X, X, X,
777   X, X, X, X, X, X, X, X
778 };
779
780 /* reg type m: 0, 17, 2, 3, 16, 18, 19, 20.  */
781 static const int mips32_to_micromips_reg_m_map[] =
782 {
783   0, X, 2, 3, X, X, X, X,
784   X, X, X, X, X, X, X, X,
785   4, 1, 5, 6, 7, X, X, X,
786   X, X, X, X, X, X, X, X
787 };
788
789 /* reg type q: 0, 2-7. 17.  */
790 static const int mips32_to_micromips_reg_q_map[] =
791 {
792   0, X, 2, 3, 4, 5, 6, 7,
793   X, X, X, X, X, X, X, X,
794   X, 1, X, X, X, X, X, X,
795   X, X, X, X, X, X, X, X
796 };
797
798 #define mips32_to_micromips_reg_n_map  mips32_to_micromips_reg_m_map
799 #undef X
800
801 /* Map microMIPS register numbers to normal MIPS register numbers.  */
802
803 #define micromips_to_32_reg_b_map       mips16_to_32_reg_map
804 #define micromips_to_32_reg_c_map       mips16_to_32_reg_map
805 #define micromips_to_32_reg_d_map       mips16_to_32_reg_map
806 #define micromips_to_32_reg_e_map       mips16_to_32_reg_map
807 #define micromips_to_32_reg_f_map       mips16_to_32_reg_map
808 #define micromips_to_32_reg_g_map       mips16_to_32_reg_map
809
810 /* The microMIPS registers with type h.  */
811 static const unsigned int micromips_to_32_reg_h_map[] =
812 {
813   5, 5, 6, 4, 4, 4, 4, 4
814 };
815
816 /* The microMIPS registers with type i.  */
817 static const unsigned int micromips_to_32_reg_i_map[] =
818 {
819   6, 7, 7, 21, 22, 5, 6, 7
820 };
821
822 #define micromips_to_32_reg_l_map       mips16_to_32_reg_map
823
824 /* The microMIPS registers with type m.  */
825 static const unsigned int micromips_to_32_reg_m_map[] =
826 {
827   0, 17, 2, 3, 16, 18, 19, 20
828 };
829
830 #define micromips_to_32_reg_n_map      micromips_to_32_reg_m_map
831
832 /* The microMIPS registers with type q.  */
833 static const unsigned int micromips_to_32_reg_q_map[] =
834 {
835   0, 17, 2, 3, 4, 5, 6, 7
836 };
837
838 /* microMIPS imm type B.  */
839 static const int micromips_imm_b_map[] =
840 {
841   1, 4, 8, 12, 16, 20, 24, -1
842 };
843
844 /* microMIPS imm type C.  */
845 static const int micromips_imm_c_map[] =
846 {
847   128, 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 255, 32768, 65535
848 };
849
850 /* Classifies the kind of instructions we're interested in when
851    implementing -mfix-vr4120.  */
852 enum fix_vr4120_class
853 {
854   FIX_VR4120_MACC,
855   FIX_VR4120_DMACC,
856   FIX_VR4120_MULT,
857   FIX_VR4120_DMULT,
858   FIX_VR4120_DIV,
859   FIX_VR4120_MTHILO,
860   NUM_FIX_VR4120_CLASSES
861 };
862
863 /* ...likewise -mfix-loongson2f-jump.  */
864 static bfd_boolean mips_fix_loongson2f_jump;
865
866 /* ...likewise -mfix-loongson2f-nop.  */
867 static bfd_boolean mips_fix_loongson2f_nop;
868
869 /* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed.  */
870 static bfd_boolean mips_fix_loongson2f;
871
872 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
873    there must be at least one other instruction between an instruction
874    of type X and an instruction of type Y.  */
875 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
876
877 /* True if -mfix-vr4120 is in force.  */
878 static int mips_fix_vr4120;
879
880 /* ...likewise -mfix-vr4130.  */
881 static int mips_fix_vr4130;
882
883 /* ...likewise -mfix-24k.  */
884 static int mips_fix_24k;
885
886 /* ...likewise -mfix-cn63xxp1 */
887 static bfd_boolean mips_fix_cn63xxp1;
888
889 /* We don't relax branches by default, since this causes us to expand
890    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
891    fail to compute the offset before expanding the macro to the most
892    efficient expansion.  */
893
894 static int mips_relax_branch;
895 \f
896 /* The expansion of many macros depends on the type of symbol that
897    they refer to.  For example, when generating position-dependent code,
898    a macro that refers to a symbol may have two different expansions,
899    one which uses GP-relative addresses and one which uses absolute
900    addresses.  When generating SVR4-style PIC, a macro may have
901    different expansions for local and global symbols.
902
903    We handle these situations by generating both sequences and putting
904    them in variant frags.  In position-dependent code, the first sequence
905    will be the GP-relative one and the second sequence will be the
906    absolute one.  In SVR4 PIC, the first sequence will be for global
907    symbols and the second will be for local symbols.
908
909    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
910    SECOND are the lengths of the two sequences in bytes.  These fields
911    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
912    the subtype has the following flags:
913
914    RELAX_USE_SECOND
915         Set if it has been decided that we should use the second
916         sequence instead of the first.
917
918    RELAX_SECOND_LONGER
919         Set in the first variant frag if the macro's second implementation
920         is longer than its first.  This refers to the macro as a whole,
921         not an individual relaxation.
922
923    RELAX_NOMACRO
924         Set in the first variant frag if the macro appeared in a .set nomacro
925         block and if one alternative requires a warning but the other does not.
926
927    RELAX_DELAY_SLOT
928         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
929         delay slot.
930
931    RELAX_DELAY_SLOT_16BIT
932         Like RELAX_DELAY_SLOT, but indicates that the delay slot requires a
933         16-bit instruction.
934
935    RELAX_DELAY_SLOT_SIZE_FIRST
936         Like RELAX_DELAY_SLOT, but indicates that the first implementation of
937         the macro is of the wrong size for the branch delay slot.
938
939    RELAX_DELAY_SLOT_SIZE_SECOND
940         Like RELAX_DELAY_SLOT, but indicates that the second implementation of
941         the macro is of the wrong size for the branch delay slot.
942
943    The frag's "opcode" points to the first fixup for relaxable code.
944
945    Relaxable macros are generated using a sequence such as:
946
947       relax_start (SYMBOL);
948       ... generate first expansion ...
949       relax_switch ();
950       ... generate second expansion ...
951       relax_end ();
952
953    The code and fixups for the unwanted alternative are discarded
954    by md_convert_frag.  */
955 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
956
957 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
958 #define RELAX_SECOND(X) ((X) & 0xff)
959 #define RELAX_USE_SECOND 0x10000
960 #define RELAX_SECOND_LONGER 0x20000
961 #define RELAX_NOMACRO 0x40000
962 #define RELAX_DELAY_SLOT 0x80000
963 #define RELAX_DELAY_SLOT_16BIT 0x100000
964 #define RELAX_DELAY_SLOT_SIZE_FIRST 0x200000
965 #define RELAX_DELAY_SLOT_SIZE_SECOND 0x400000
966
967 /* Branch without likely bit.  If label is out of range, we turn:
968
969         beq reg1, reg2, label
970         delay slot
971
972    into
973
974         bne reg1, reg2, 0f
975         nop
976         j label
977      0: delay slot
978
979    with the following opcode replacements:
980
981         beq <-> bne
982         blez <-> bgtz
983         bltz <-> bgez
984         bc1f <-> bc1t
985
986         bltzal <-> bgezal  (with jal label instead of j label)
987
988    Even though keeping the delay slot instruction in the delay slot of
989    the branch would be more efficient, it would be very tricky to do
990    correctly, because we'd have to introduce a variable frag *after*
991    the delay slot instruction, and expand that instead.  Let's do it
992    the easy way for now, even if the branch-not-taken case now costs
993    one additional instruction.  Out-of-range branches are not supposed
994    to be common, anyway.
995
996    Branch likely.  If label is out of range, we turn:
997
998         beql reg1, reg2, label
999         delay slot (annulled if branch not taken)
1000
1001    into
1002
1003         beql reg1, reg2, 1f
1004         nop
1005         beql $0, $0, 2f
1006         nop
1007      1: j[al] label
1008         delay slot (executed only if branch taken)
1009      2:
1010
1011    It would be possible to generate a shorter sequence by losing the
1012    likely bit, generating something like:
1013
1014         bne reg1, reg2, 0f
1015         nop
1016         j[al] label
1017         delay slot (executed only if branch taken)
1018      0:
1019
1020         beql -> bne
1021         bnel -> beq
1022         blezl -> bgtz
1023         bgtzl -> blez
1024         bltzl -> bgez
1025         bgezl -> bltz
1026         bc1fl -> bc1t
1027         bc1tl -> bc1f
1028
1029         bltzall -> bgezal  (with jal label instead of j label)
1030         bgezall -> bltzal  (ditto)
1031
1032
1033    but it's not clear that it would actually improve performance.  */
1034 #define RELAX_BRANCH_ENCODE(at, uncond, likely, link, toofar)   \
1035   ((relax_substateT)                                            \
1036    (0xc0000000                                                  \
1037     | ((at) & 0x1f)                                             \
1038     | ((toofar) ? 0x20 : 0)                                     \
1039     | ((link) ? 0x40 : 0)                                       \
1040     | ((likely) ? 0x80 : 0)                                     \
1041     | ((uncond) ? 0x100 : 0)))
1042 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
1043 #define RELAX_BRANCH_UNCOND(i) (((i) & 0x100) != 0)
1044 #define RELAX_BRANCH_LIKELY(i) (((i) & 0x80) != 0)
1045 #define RELAX_BRANCH_LINK(i) (((i) & 0x40) != 0)
1046 #define RELAX_BRANCH_TOOFAR(i) (((i) & 0x20) != 0)
1047 #define RELAX_BRANCH_AT(i) ((i) & 0x1f)
1048
1049 /* For mips16 code, we use an entirely different form of relaxation.
1050    mips16 supports two versions of most instructions which take
1051    immediate values: a small one which takes some small value, and a
1052    larger one which takes a 16 bit value.  Since branches also follow
1053    this pattern, relaxing these values is required.
1054
1055    We can assemble both mips16 and normal MIPS code in a single
1056    object.  Therefore, we need to support this type of relaxation at
1057    the same time that we support the relaxation described above.  We
1058    use the high bit of the subtype field to distinguish these cases.
1059
1060    The information we store for this type of relaxation is the
1061    argument code found in the opcode file for this relocation, whether
1062    the user explicitly requested a small or extended form, and whether
1063    the relocation is in a jump or jal delay slot.  That tells us the
1064    size of the value, and how it should be stored.  We also store
1065    whether the fragment is considered to be extended or not.  We also
1066    store whether this is known to be a branch to a different section,
1067    whether we have tried to relax this frag yet, and whether we have
1068    ever extended a PC relative fragment because of a shift count.  */
1069 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
1070   (0x80000000                                                   \
1071    | ((type) & 0xff)                                            \
1072    | ((small) ? 0x100 : 0)                                      \
1073    | ((ext) ? 0x200 : 0)                                        \
1074    | ((dslot) ? 0x400 : 0)                                      \
1075    | ((jal_dslot) ? 0x800 : 0))
1076 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
1077 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
1078 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
1079 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
1080 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
1081 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
1082 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
1083 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
1084 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
1085 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
1086 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
1087 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
1088
1089 /* For microMIPS code, we use relaxation similar to one we use for
1090    MIPS16 code.  Some instructions that take immediate values support
1091    two encodings: a small one which takes some small value, and a
1092    larger one which takes a 16 bit value.  As some branches also follow
1093    this pattern, relaxing these values is required.
1094
1095    We can assemble both microMIPS and normal MIPS code in a single
1096    object.  Therefore, we need to support this type of relaxation at
1097    the same time that we support the relaxation described above.  We
1098    use one of the high bits of the subtype field to distinguish these
1099    cases.
1100
1101    The information we store for this type of relaxation is the argument
1102    code found in the opcode file for this relocation, the register
1103    selected as the assembler temporary, whether the branch is
1104    unconditional, whether it is compact, whether it stores the link
1105    address implicitly in $ra, whether relaxation of out-of-range 32-bit
1106    branches to a sequence of instructions is enabled, and whether the
1107    displacement of a branch is too large to fit as an immediate argument
1108    of a 16-bit and a 32-bit branch, respectively.  */
1109 #define RELAX_MICROMIPS_ENCODE(type, at, uncond, compact, link, \
1110                                relax32, toofar16, toofar32)     \
1111   (0x40000000                                                   \
1112    | ((type) & 0xff)                                            \
1113    | (((at) & 0x1f) << 8)                                       \
1114    | ((uncond) ? 0x2000 : 0)                                    \
1115    | ((compact) ? 0x4000 : 0)                                   \
1116    | ((link) ? 0x8000 : 0)                                      \
1117    | ((relax32) ? 0x10000 : 0)                                  \
1118    | ((toofar16) ? 0x20000 : 0)                                 \
1119    | ((toofar32) ? 0x40000 : 0))
1120 #define RELAX_MICROMIPS_P(i) (((i) & 0xc0000000) == 0x40000000)
1121 #define RELAX_MICROMIPS_TYPE(i) ((i) & 0xff)
1122 #define RELAX_MICROMIPS_AT(i) (((i) >> 8) & 0x1f)
1123 #define RELAX_MICROMIPS_UNCOND(i) (((i) & 0x2000) != 0)
1124 #define RELAX_MICROMIPS_COMPACT(i) (((i) & 0x4000) != 0)
1125 #define RELAX_MICROMIPS_LINK(i) (((i) & 0x8000) != 0)
1126 #define RELAX_MICROMIPS_RELAX32(i) (((i) & 0x10000) != 0)
1127
1128 #define RELAX_MICROMIPS_TOOFAR16(i) (((i) & 0x20000) != 0)
1129 #define RELAX_MICROMIPS_MARK_TOOFAR16(i) ((i) | 0x20000)
1130 #define RELAX_MICROMIPS_CLEAR_TOOFAR16(i) ((i) & ~0x20000)
1131 #define RELAX_MICROMIPS_TOOFAR32(i) (((i) & 0x40000) != 0)
1132 #define RELAX_MICROMIPS_MARK_TOOFAR32(i) ((i) | 0x40000)
1133 #define RELAX_MICROMIPS_CLEAR_TOOFAR32(i) ((i) & ~0x40000)
1134
1135 /* Sign-extend 16-bit value X.  */
1136 #define SEXT_16BIT(X) ((((X) + 0x8000) & 0xffff) - 0x8000)
1137
1138 /* Is the given value a sign-extended 32-bit value?  */
1139 #define IS_SEXT_32BIT_NUM(x)                                            \
1140   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
1141    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
1142
1143 /* Is the given value a sign-extended 16-bit value?  */
1144 #define IS_SEXT_16BIT_NUM(x)                                            \
1145   (((x) &~ (offsetT) 0x7fff) == 0                                       \
1146    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
1147
1148 /* Is the given value a sign-extended 12-bit value?  */
1149 #define IS_SEXT_12BIT_NUM(x)                                            \
1150   (((((x) & 0xfff) ^ 0x800LL) - 0x800LL) == (x))
1151
1152 /* Is the given value a sign-extended 9-bit value?  */
1153 #define IS_SEXT_9BIT_NUM(x)                                             \
1154   (((((x) & 0x1ff) ^ 0x100LL) - 0x100LL) == (x))
1155
1156 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
1157 #define IS_ZEXT_32BIT_NUM(x)                                            \
1158   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
1159    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
1160
1161 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
1162    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
1163 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
1164   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
1165               | (((VALUE) & (MASK)) << (SHIFT)))
1166
1167 /* Extract bits MASK << SHIFT from STRUCT and shift them right
1168    SHIFT places.  */
1169 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
1170   (((STRUCT) >> (SHIFT)) & (MASK))
1171
1172 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1173    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1174
1175    include/opcode/mips.h specifies operand fields using the macros
1176    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
1177    with "MIPS16OP" instead of "OP".  */
1178 #define INSERT_OPERAND(MICROMIPS, FIELD, INSN, VALUE) \
1179   do \
1180     if (!(MICROMIPS)) \
1181       INSERT_BITS ((INSN).insn_opcode, VALUE, \
1182                    OP_MASK_##FIELD, OP_SH_##FIELD); \
1183     else \
1184       INSERT_BITS ((INSN).insn_opcode, VALUE, \
1185                    MICROMIPSOP_MASK_##FIELD, MICROMIPSOP_SH_##FIELD); \
1186   while (0)
1187 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1188   INSERT_BITS ((INSN).insn_opcode, VALUE, \
1189                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1190
1191 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
1192 #define EXTRACT_OPERAND(MICROMIPS, FIELD, INSN) \
1193   (!(MICROMIPS) \
1194    ? EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD) \
1195    : EXTRACT_BITS ((INSN).insn_opcode, \
1196                    MICROMIPSOP_MASK_##FIELD, MICROMIPSOP_SH_##FIELD))
1197 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1198   EXTRACT_BITS ((INSN).insn_opcode, \
1199                 MIPS16OP_MASK_##FIELD, \
1200                 MIPS16OP_SH_##FIELD)
1201
1202 /* The MIPS16 EXTEND opcode, shifted left 16 places.  */
1203 #define MIPS16_EXTEND (0xf000U << 16)
1204 \f
1205 /* Whether or not we are emitting a branch-likely macro.  */
1206 static bfd_boolean emit_branch_likely_macro = FALSE;
1207
1208 /* Global variables used when generating relaxable macros.  See the
1209    comment above RELAX_ENCODE for more details about how relaxation
1210    is used.  */
1211 static struct {
1212   /* 0 if we're not emitting a relaxable macro.
1213      1 if we're emitting the first of the two relaxation alternatives.
1214      2 if we're emitting the second alternative.  */
1215   int sequence;
1216
1217   /* The first relaxable fixup in the current frag.  (In other words,
1218      the first fixup that refers to relaxable code.)  */
1219   fixS *first_fixup;
1220
1221   /* sizes[0] says how many bytes of the first alternative are stored in
1222      the current frag.  Likewise sizes[1] for the second alternative.  */
1223   unsigned int sizes[2];
1224
1225   /* The symbol on which the choice of sequence depends.  */
1226   symbolS *symbol;
1227 } mips_relax;
1228 \f
1229 /* Global variables used to decide whether a macro needs a warning.  */
1230 static struct {
1231   /* True if the macro is in a branch delay slot.  */
1232   bfd_boolean delay_slot_p;
1233
1234   /* Set to the length in bytes required if the macro is in a delay slot
1235      that requires a specific length of instruction, otherwise zero.  */
1236   unsigned int delay_slot_length;
1237
1238   /* For relaxable macros, sizes[0] is the length of the first alternative
1239      in bytes and sizes[1] is the length of the second alternative.
1240      For non-relaxable macros, both elements give the length of the
1241      macro in bytes.  */
1242   unsigned int sizes[2];
1243
1244   /* For relaxable macros, first_insn_sizes[0] is the length of the first
1245      instruction of the first alternative in bytes and first_insn_sizes[1]
1246      is the length of the first instruction of the second alternative.
1247      For non-relaxable macros, both elements give the length of the first
1248      instruction in bytes.
1249
1250      Set to zero if we haven't yet seen the first instruction.  */
1251   unsigned int first_insn_sizes[2];
1252
1253   /* For relaxable macros, insns[0] is the number of instructions for the
1254      first alternative and insns[1] is the number of instructions for the
1255      second alternative.
1256
1257      For non-relaxable macros, both elements give the number of
1258      instructions for the macro.  */
1259   unsigned int insns[2];
1260
1261   /* The first variant frag for this macro.  */
1262   fragS *first_frag;
1263 } mips_macro_warning;
1264 \f
1265 /* Prototypes for static functions.  */
1266
1267 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1268
1269 static void append_insn
1270   (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *,
1271    bfd_boolean expansionp);
1272 static void mips_no_prev_insn (void);
1273 static void macro_build (expressionS *, const char *, const char *, ...);
1274 static void mips16_macro_build
1275   (expressionS *, const char *, const char *, va_list *);
1276 static void load_register (int, expressionS *, int);
1277 static void macro_start (void);
1278 static void macro_end (void);
1279 static void macro (struct mips_cl_insn * ip);
1280 static void mips16_macro (struct mips_cl_insn * ip);
1281 static void mips_ip (char *str, struct mips_cl_insn * ip);
1282 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1283 static void mips16_immed
1284   (char *, unsigned int, int, bfd_reloc_code_real_type, offsetT,
1285    unsigned int, unsigned long *);
1286 static size_t my_getSmallExpression
1287   (expressionS *, bfd_reloc_code_real_type *, char *);
1288 static void my_getExpression (expressionS *, char *);
1289 static void s_align (int);
1290 static void s_change_sec (int);
1291 static void s_change_section (int);
1292 static void s_cons (int);
1293 static void s_float_cons (int);
1294 static void s_mips_globl (int);
1295 static void s_option (int);
1296 static void s_mipsset (int);
1297 static void s_abicalls (int);
1298 static void s_cpload (int);
1299 static void s_cpsetup (int);
1300 static void s_cplocal (int);
1301 static void s_cprestore (int);
1302 static void s_cpreturn (int);
1303 static void s_dtprelword (int);
1304 static void s_dtpreldword (int);
1305 static void s_tprelword (int);
1306 static void s_tpreldword (int);
1307 static void s_gpvalue (int);
1308 static void s_gpword (int);
1309 static void s_gpdword (int);
1310 static void s_ehword (int);
1311 static void s_cpadd (int);
1312 static void s_insn (int);
1313 static void md_obj_begin (void);
1314 static void md_obj_end (void);
1315 static void s_mips_ent (int);
1316 static void s_mips_end (int);
1317 static void s_mips_frame (int);
1318 static void s_mips_mask (int reg_type);
1319 static void s_mips_stab (int);
1320 static void s_mips_weakext (int);
1321 static void s_mips_file (int);
1322 static void s_mips_loc (int);
1323 static bfd_boolean pic_need_relax (symbolS *, asection *);
1324 static int relaxed_branch_length (fragS *, asection *, int);
1325 static int validate_mips_insn (const struct mips_opcode *);
1326 static int validate_micromips_insn (const struct mips_opcode *);
1327 static int relaxed_micromips_16bit_branch_length (fragS *, asection *, int);
1328 static int relaxed_micromips_32bit_branch_length (fragS *, asection *, int);
1329
1330 /* Table and functions used to map between CPU/ISA names, and
1331    ISA levels, and CPU numbers.  */
1332
1333 struct mips_cpu_info
1334 {
1335   const char *name;           /* CPU or ISA name.  */
1336   int flags;                  /* MIPS_CPU_* flags.  */
1337   int ase;                    /* Set of ASEs implemented by the CPU.  */
1338   int isa;                    /* ISA level.  */
1339   int cpu;                    /* CPU number (default CPU if ISA).  */
1340 };
1341
1342 #define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1343
1344 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1345 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1346 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1347 \f
1348 /* Command-line options.  */
1349 const char *md_shortopts = "O::g::G:";
1350
1351 enum options
1352   {
1353     OPTION_MARCH = OPTION_MD_BASE,
1354     OPTION_MTUNE,
1355     OPTION_MIPS1,
1356     OPTION_MIPS2,
1357     OPTION_MIPS3,
1358     OPTION_MIPS4,
1359     OPTION_MIPS5,
1360     OPTION_MIPS32,
1361     OPTION_MIPS64,
1362     OPTION_MIPS32R2,
1363     OPTION_MIPS64R2,
1364     OPTION_MIPS16,
1365     OPTION_NO_MIPS16,
1366     OPTION_MIPS3D,
1367     OPTION_NO_MIPS3D,
1368     OPTION_MDMX,
1369     OPTION_NO_MDMX,
1370     OPTION_DSP,
1371     OPTION_NO_DSP,
1372     OPTION_MT,
1373     OPTION_NO_MT,
1374     OPTION_VIRT,
1375     OPTION_NO_VIRT,
1376     OPTION_SMARTMIPS,
1377     OPTION_NO_SMARTMIPS,
1378     OPTION_DSPR2,
1379     OPTION_NO_DSPR2,
1380     OPTION_EVA,
1381     OPTION_NO_EVA,
1382     OPTION_MICROMIPS,
1383     OPTION_NO_MICROMIPS,
1384     OPTION_MCU,
1385     OPTION_NO_MCU,
1386     OPTION_COMPAT_ARCH_BASE,
1387     OPTION_M4650,
1388     OPTION_NO_M4650,
1389     OPTION_M4010,
1390     OPTION_NO_M4010,
1391     OPTION_M4100,
1392     OPTION_NO_M4100,
1393     OPTION_M3900,
1394     OPTION_NO_M3900,
1395     OPTION_M7000_HILO_FIX,
1396     OPTION_MNO_7000_HILO_FIX,
1397     OPTION_FIX_24K,
1398     OPTION_NO_FIX_24K,
1399     OPTION_FIX_LOONGSON2F_JUMP,
1400     OPTION_NO_FIX_LOONGSON2F_JUMP,
1401     OPTION_FIX_LOONGSON2F_NOP,
1402     OPTION_NO_FIX_LOONGSON2F_NOP,
1403     OPTION_FIX_VR4120,
1404     OPTION_NO_FIX_VR4120,
1405     OPTION_FIX_VR4130,
1406     OPTION_NO_FIX_VR4130,
1407     OPTION_FIX_CN63XXP1,
1408     OPTION_NO_FIX_CN63XXP1,
1409     OPTION_TRAP,
1410     OPTION_BREAK,
1411     OPTION_EB,
1412     OPTION_EL,
1413     OPTION_FP32,
1414     OPTION_GP32,
1415     OPTION_CONSTRUCT_FLOATS,
1416     OPTION_NO_CONSTRUCT_FLOATS,
1417     OPTION_FP64,
1418     OPTION_GP64,
1419     OPTION_RELAX_BRANCH,
1420     OPTION_NO_RELAX_BRANCH,
1421     OPTION_MSHARED,
1422     OPTION_MNO_SHARED,
1423     OPTION_MSYM32,
1424     OPTION_MNO_SYM32,
1425     OPTION_SOFT_FLOAT,
1426     OPTION_HARD_FLOAT,
1427     OPTION_SINGLE_FLOAT,
1428     OPTION_DOUBLE_FLOAT,
1429     OPTION_32,
1430     OPTION_CALL_SHARED,
1431     OPTION_CALL_NONPIC,
1432     OPTION_NON_SHARED,
1433     OPTION_XGOT,
1434     OPTION_MABI,
1435     OPTION_N32,
1436     OPTION_64,
1437     OPTION_MDEBUG,
1438     OPTION_NO_MDEBUG,
1439     OPTION_PDR,
1440     OPTION_NO_PDR,
1441     OPTION_MVXWORKS_PIC,
1442     OPTION_END_OF_ENUM
1443   };
1444
1445 struct option md_longopts[] =
1446 {
1447   /* Options which specify architecture.  */
1448   {"march", required_argument, NULL, OPTION_MARCH},
1449   {"mtune", required_argument, NULL, OPTION_MTUNE},
1450   {"mips0", no_argument, NULL, OPTION_MIPS1},
1451   {"mips1", no_argument, NULL, OPTION_MIPS1},
1452   {"mips2", no_argument, NULL, OPTION_MIPS2},
1453   {"mips3", no_argument, NULL, OPTION_MIPS3},
1454   {"mips4", no_argument, NULL, OPTION_MIPS4},
1455   {"mips5", no_argument, NULL, OPTION_MIPS5},
1456   {"mips32", no_argument, NULL, OPTION_MIPS32},
1457   {"mips64", no_argument, NULL, OPTION_MIPS64},
1458   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
1459   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
1460
1461   /* Options which specify Application Specific Extensions (ASEs).  */
1462   {"mips16", no_argument, NULL, OPTION_MIPS16},
1463   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
1464   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
1465   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
1466   {"mdmx", no_argument, NULL, OPTION_MDMX},
1467   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
1468   {"mdsp", no_argument, NULL, OPTION_DSP},
1469   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
1470   {"mmt", no_argument, NULL, OPTION_MT},
1471   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
1472   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
1473   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
1474   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
1475   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
1476   {"meva", no_argument, NULL, OPTION_EVA},
1477   {"mno-eva", no_argument, NULL, OPTION_NO_EVA},
1478   {"mmicromips", no_argument, NULL, OPTION_MICROMIPS},
1479   {"mno-micromips", no_argument, NULL, OPTION_NO_MICROMIPS},
1480   {"mmcu", no_argument, NULL, OPTION_MCU},
1481   {"mno-mcu", no_argument, NULL, OPTION_NO_MCU},
1482   {"mvirt", no_argument, NULL, OPTION_VIRT},
1483   {"mno-virt", no_argument, NULL, OPTION_NO_VIRT},
1484
1485   /* Old-style architecture options.  Don't add more of these.  */
1486   {"m4650", no_argument, NULL, OPTION_M4650},
1487   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
1488   {"m4010", no_argument, NULL, OPTION_M4010},
1489   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
1490   {"m4100", no_argument, NULL, OPTION_M4100},
1491   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
1492   {"m3900", no_argument, NULL, OPTION_M3900},
1493   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
1494
1495   /* Options which enable bug fixes.  */
1496   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
1497   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
1498   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
1499   {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
1500   {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
1501   {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
1502   {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
1503   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
1504   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
1505   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
1506   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
1507   {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
1508   {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
1509   {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
1510   {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
1511
1512   /* Miscellaneous options.  */
1513   {"trap", no_argument, NULL, OPTION_TRAP},
1514   {"no-break", no_argument, NULL, OPTION_TRAP},
1515   {"break", no_argument, NULL, OPTION_BREAK},
1516   {"no-trap", no_argument, NULL, OPTION_BREAK},
1517   {"EB", no_argument, NULL, OPTION_EB},
1518   {"EL", no_argument, NULL, OPTION_EL},
1519   {"mfp32", no_argument, NULL, OPTION_FP32},
1520   {"mgp32", no_argument, NULL, OPTION_GP32},
1521   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
1522   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
1523   {"mfp64", no_argument, NULL, OPTION_FP64},
1524   {"mgp64", no_argument, NULL, OPTION_GP64},
1525   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
1526   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
1527   {"mshared", no_argument, NULL, OPTION_MSHARED},
1528   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
1529   {"msym32", no_argument, NULL, OPTION_MSYM32},
1530   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
1531   {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
1532   {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
1533   {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
1534   {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
1535
1536   /* Strictly speaking this next option is ELF specific,
1537      but we allow it for other ports as well in order to
1538      make testing easier.  */
1539   {"32", no_argument, NULL, OPTION_32},
1540
1541   /* ELF-specific options.  */
1542   {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
1543   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
1544   {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
1545   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
1546   {"xgot", no_argument, NULL, OPTION_XGOT},
1547   {"mabi", required_argument, NULL, OPTION_MABI},
1548   {"n32", no_argument, NULL, OPTION_N32},
1549   {"64", no_argument, NULL, OPTION_64},
1550   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
1551   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
1552   {"mpdr", no_argument, NULL, OPTION_PDR},
1553   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
1554   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
1555
1556   {NULL, no_argument, NULL, 0}
1557 };
1558 size_t md_longopts_size = sizeof (md_longopts);
1559 \f
1560 /* Information about either an Application Specific Extension or an
1561    optional architecture feature that, for simplicity, we treat in the
1562    same way as an ASE.  */
1563 struct mips_ase
1564 {
1565   /* The name of the ASE, used in both the command-line and .set options.  */
1566   const char *name;
1567
1568   /* The associated ASE_* flags.  If the ASE is available on both 32-bit
1569      and 64-bit architectures, the flags here refer to the subset that
1570      is available on both.  */
1571   unsigned int flags;
1572
1573   /* The ASE_* flag used for instructions that are available on 64-bit
1574      architectures but that are not included in FLAGS.  */
1575   unsigned int flags64;
1576
1577   /* The command-line options that turn the ASE on and off.  */
1578   int option_on;
1579   int option_off;
1580
1581   /* The minimum required architecture revisions for MIPS32, MIPS64,
1582      microMIPS32 and microMIPS64, or -1 if the extension isn't supported.  */
1583   int mips32_rev;
1584   int mips64_rev;
1585   int micromips32_rev;
1586   int micromips64_rev;
1587 };
1588
1589 /* A table of all supported ASEs.  */
1590 static const struct mips_ase mips_ases[] = {
1591   { "dsp", ASE_DSP, ASE_DSP64,
1592     OPTION_DSP, OPTION_NO_DSP,
1593     2, 2, 2, 2 },
1594
1595   { "dspr2", ASE_DSP | ASE_DSPR2, 0,
1596     OPTION_DSPR2, OPTION_NO_DSPR2,
1597     2, 2, 2, 2 },
1598
1599   { "eva", ASE_EVA, 0,
1600     OPTION_EVA, OPTION_NO_EVA,
1601     2, 2, 2, 2 },
1602
1603   { "mcu", ASE_MCU, 0,
1604     OPTION_MCU, OPTION_NO_MCU,
1605     2, 2, 2, 2 },
1606
1607   /* Deprecated in MIPS64r5, but we don't implement that yet.  */
1608   { "mdmx", ASE_MDMX, 0,
1609     OPTION_MDMX, OPTION_NO_MDMX,
1610     -1, 1, -1, -1 },
1611
1612   /* Requires 64-bit FPRs, so the minimum MIPS32 revision is 2.  */
1613   { "mips3d", ASE_MIPS3D, 0,
1614     OPTION_MIPS3D, OPTION_NO_MIPS3D,
1615     2, 1, -1, -1 },
1616
1617   { "mt", ASE_MT, 0,
1618     OPTION_MT, OPTION_NO_MT,
1619     2, 2, -1, -1 },
1620
1621   { "smartmips", ASE_SMARTMIPS, 0,
1622     OPTION_SMARTMIPS, OPTION_NO_SMARTMIPS,
1623     1, -1, -1, -1 },
1624
1625   { "virt", ASE_VIRT, ASE_VIRT64,
1626     OPTION_VIRT, OPTION_NO_VIRT,
1627     2, 2, 2, 2 }
1628 };
1629
1630 /* The set of ASEs that require -mfp64.  */
1631 #define FP64_ASES (ASE_MIPS3D | ASE_MDMX)
1632
1633 /* Groups of ASE_* flags that represent different revisions of an ASE.  */
1634 static const unsigned int mips_ase_groups[] = {
1635   ASE_DSP | ASE_DSPR2
1636 };
1637 \f
1638 /* Pseudo-op table.
1639
1640    The following pseudo-ops from the Kane and Heinrich MIPS book
1641    should be defined here, but are currently unsupported: .alias,
1642    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1643
1644    The following pseudo-ops from the Kane and Heinrich MIPS book are
1645    specific to the type of debugging information being generated, and
1646    should be defined by the object format: .aent, .begin, .bend,
1647    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1648    .vreg.
1649
1650    The following pseudo-ops from the Kane and Heinrich MIPS book are
1651    not MIPS CPU specific, but are also not specific to the object file
1652    format.  This file is probably the best place to define them, but
1653    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1654
1655 static const pseudo_typeS mips_pseudo_table[] =
1656 {
1657   /* MIPS specific pseudo-ops.  */
1658   {"option", s_option, 0},
1659   {"set", s_mipsset, 0},
1660   {"rdata", s_change_sec, 'r'},
1661   {"sdata", s_change_sec, 's'},
1662   {"livereg", s_ignore, 0},
1663   {"abicalls", s_abicalls, 0},
1664   {"cpload", s_cpload, 0},
1665   {"cpsetup", s_cpsetup, 0},
1666   {"cplocal", s_cplocal, 0},
1667   {"cprestore", s_cprestore, 0},
1668   {"cpreturn", s_cpreturn, 0},
1669   {"dtprelword", s_dtprelword, 0},
1670   {"dtpreldword", s_dtpreldword, 0},
1671   {"tprelword", s_tprelword, 0},
1672   {"tpreldword", s_tpreldword, 0},
1673   {"gpvalue", s_gpvalue, 0},
1674   {"gpword", s_gpword, 0},
1675   {"gpdword", s_gpdword, 0},
1676   {"ehword", s_ehword, 0},
1677   {"cpadd", s_cpadd, 0},
1678   {"insn", s_insn, 0},
1679
1680   /* Relatively generic pseudo-ops that happen to be used on MIPS
1681      chips.  */
1682   {"asciiz", stringer, 8 + 1},
1683   {"bss", s_change_sec, 'b'},
1684   {"err", s_err, 0},
1685   {"half", s_cons, 1},
1686   {"dword", s_cons, 3},
1687   {"weakext", s_mips_weakext, 0},
1688   {"origin", s_org, 0},
1689   {"repeat", s_rept, 0},
1690
1691   /* For MIPS this is non-standard, but we define it for consistency.  */
1692   {"sbss", s_change_sec, 'B'},
1693
1694   /* These pseudo-ops are defined in read.c, but must be overridden
1695      here for one reason or another.  */
1696   {"align", s_align, 0},
1697   {"byte", s_cons, 0},
1698   {"data", s_change_sec, 'd'},
1699   {"double", s_float_cons, 'd'},
1700   {"float", s_float_cons, 'f'},
1701   {"globl", s_mips_globl, 0},
1702   {"global", s_mips_globl, 0},
1703   {"hword", s_cons, 1},
1704   {"int", s_cons, 2},
1705   {"long", s_cons, 2},
1706   {"octa", s_cons, 4},
1707   {"quad", s_cons, 3},
1708   {"section", s_change_section, 0},
1709   {"short", s_cons, 1},
1710   {"single", s_float_cons, 'f'},
1711   {"stabd", s_mips_stab, 'd'},
1712   {"stabn", s_mips_stab, 'n'},
1713   {"stabs", s_mips_stab, 's'},
1714   {"text", s_change_sec, 't'},
1715   {"word", s_cons, 2},
1716
1717   { "extern", ecoff_directive_extern, 0},
1718
1719   { NULL, NULL, 0 },
1720 };
1721
1722 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1723 {
1724   /* These pseudo-ops should be defined by the object file format.
1725      However, a.out doesn't support them, so we have versions here.  */
1726   {"aent", s_mips_ent, 1},
1727   {"bgnb", s_ignore, 0},
1728   {"end", s_mips_end, 0},
1729   {"endb", s_ignore, 0},
1730   {"ent", s_mips_ent, 0},
1731   {"file", s_mips_file, 0},
1732   {"fmask", s_mips_mask, 'F'},
1733   {"frame", s_mips_frame, 0},
1734   {"loc", s_mips_loc, 0},
1735   {"mask", s_mips_mask, 'R'},
1736   {"verstamp", s_ignore, 0},
1737   { NULL, NULL, 0 },
1738 };
1739
1740 /* Export the ABI address size for use by TC_ADDRESS_BYTES for the
1741    purpose of the `.dc.a' internal pseudo-op.  */
1742
1743 int
1744 mips_address_bytes (void)
1745 {
1746   return HAVE_64BIT_ADDRESSES ? 8 : 4;
1747 }
1748
1749 extern void pop_insert (const pseudo_typeS *);
1750
1751 void
1752 mips_pop_insert (void)
1753 {
1754   pop_insert (mips_pseudo_table);
1755   if (! ECOFF_DEBUGGING)
1756     pop_insert (mips_nonecoff_pseudo_table);
1757 }
1758 \f
1759 /* Symbols labelling the current insn.  */
1760
1761 struct insn_label_list
1762 {
1763   struct insn_label_list *next;
1764   symbolS *label;
1765 };
1766
1767 static struct insn_label_list *free_insn_labels;
1768 #define label_list tc_segment_info_data.labels
1769
1770 static void mips_clear_insn_labels (void);
1771 static void mips_mark_labels (void);
1772 static void mips_compressed_mark_labels (void);
1773
1774 static inline void
1775 mips_clear_insn_labels (void)
1776 {
1777   register struct insn_label_list **pl;
1778   segment_info_type *si;
1779
1780   if (now_seg)
1781     {
1782       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1783         ;
1784       
1785       si = seg_info (now_seg);
1786       *pl = si->label_list;
1787       si->label_list = NULL;
1788     }
1789 }
1790
1791 /* Mark instruction labels in MIPS16/microMIPS mode.  */
1792
1793 static inline void
1794 mips_mark_labels (void)
1795 {
1796   if (HAVE_CODE_COMPRESSION)
1797     mips_compressed_mark_labels ();
1798 }
1799 \f
1800 static char *expr_end;
1801
1802 /* Expressions which appear in instructions.  These are set by
1803    mips_ip.  */
1804
1805 static expressionS imm_expr;
1806 static expressionS imm2_expr;
1807 static expressionS offset_expr;
1808
1809 /* Relocs associated with imm_expr and offset_expr.  */
1810
1811 static bfd_reloc_code_real_type imm_reloc[3]
1812   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1813 static bfd_reloc_code_real_type offset_reloc[3]
1814   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1815
1816 /* This is set to the resulting size of the instruction to be produced
1817    by mips16_ip if an explicit extension is used or by mips_ip if an
1818    explicit size is supplied.  */
1819
1820 static unsigned int forced_insn_length;
1821
1822 /* True if we are assembling an instruction.  All dot symbols defined during
1823    this time should be treated as code labels.  */
1824
1825 static bfd_boolean mips_assembling_insn;
1826
1827 /* The pdr segment for per procedure frame/regmask info.  Not used for
1828    ECOFF debugging.  */
1829
1830 static segT pdr_seg;
1831
1832 /* The default target format to use.  */
1833
1834 #if defined (TE_FreeBSD)
1835 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips-freebsd"
1836 #elif defined (TE_TMIPS)
1837 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips"
1838 #else
1839 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX ENDIAN "mips"
1840 #endif
1841
1842 const char *
1843 mips_target_format (void)
1844 {
1845   switch (OUTPUT_FLAVOR)
1846     {
1847     case bfd_target_elf_flavour:
1848 #ifdef TE_VXWORKS
1849       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1850         return (target_big_endian
1851                 ? "elf32-bigmips-vxworks"
1852                 : "elf32-littlemips-vxworks");
1853 #endif
1854       return (target_big_endian
1855               ? (HAVE_64BIT_OBJECTS
1856                  ? ELF_TARGET ("elf64-", "big")
1857                  : (HAVE_NEWABI
1858                     ? ELF_TARGET ("elf32-n", "big")
1859                     : ELF_TARGET ("elf32-", "big")))
1860               : (HAVE_64BIT_OBJECTS
1861                  ? ELF_TARGET ("elf64-", "little")
1862                  : (HAVE_NEWABI
1863                     ? ELF_TARGET ("elf32-n", "little")
1864                     : ELF_TARGET ("elf32-", "little"))));
1865     default:
1866       abort ();
1867       return NULL;
1868     }
1869 }
1870
1871 /* Return the ISA revision that is currently in use, or 0 if we are
1872    generating code for MIPS V or below.  */
1873
1874 static int
1875 mips_isa_rev (void)
1876 {
1877   if (mips_opts.isa == ISA_MIPS32R2 || mips_opts.isa == ISA_MIPS64R2)
1878     return 2;
1879
1880   /* microMIPS implies revision 2 or above.  */
1881   if (mips_opts.micromips)
1882     return 2;
1883
1884   if (mips_opts.isa == ISA_MIPS32 || mips_opts.isa == ISA_MIPS64)
1885     return 1;
1886
1887   return 0;
1888 }
1889
1890 /* Return the mask of all ASEs that are revisions of those in FLAGS.  */
1891
1892 static unsigned int
1893 mips_ase_mask (unsigned int flags)
1894 {
1895   unsigned int i;
1896
1897   for (i = 0; i < ARRAY_SIZE (mips_ase_groups); i++)
1898     if (flags & mips_ase_groups[i])
1899       flags |= mips_ase_groups[i];
1900   return flags;
1901 }
1902
1903 /* Check whether the current ISA supports ASE.  Issue a warning if
1904    appropriate.  */
1905
1906 static void
1907 mips_check_isa_supports_ase (const struct mips_ase *ase)
1908 {
1909   const char *base;
1910   int min_rev, size;
1911   static unsigned int warned_isa;
1912   static unsigned int warned_fp32;
1913
1914   if (ISA_HAS_64BIT_REGS (mips_opts.isa))
1915     min_rev = mips_opts.micromips ? ase->micromips64_rev : ase->mips64_rev;
1916   else
1917     min_rev = mips_opts.micromips ? ase->micromips32_rev : ase->mips32_rev;
1918   if ((min_rev < 0 || mips_isa_rev () < min_rev)
1919       && (warned_isa & ase->flags) != ase->flags)
1920     {
1921       warned_isa |= ase->flags;
1922       base = mips_opts.micromips ? "microMIPS" : "MIPS";
1923       size = ISA_HAS_64BIT_REGS (mips_opts.isa) ? 64 : 32;
1924       if (min_rev < 0)
1925         as_warn (_("The %d-bit %s architecture does not support the"
1926                    " `%s' extension"), size, base, ase->name);
1927       else
1928         as_warn (_("The `%s' extension requires %s%d revision %d or greater"),
1929                  ase->name, base, size, min_rev);
1930     }
1931   if ((ase->flags & FP64_ASES)
1932       && mips_opts.fp32
1933       && (warned_fp32 & ase->flags) != ase->flags)
1934     {
1935       warned_fp32 |= ase->flags;
1936       as_warn (_("The `%s' extension requires 64-bit FPRs"), ase->name);
1937     }
1938 }
1939
1940 /* Check all enabled ASEs to see whether they are supported by the
1941    chosen architecture.  */
1942
1943 static void
1944 mips_check_isa_supports_ases (void)
1945 {
1946   unsigned int i, mask;
1947
1948   for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
1949     {
1950       mask = mips_ase_mask (mips_ases[i].flags);
1951       if ((mips_opts.ase & mask) == mips_ases[i].flags)
1952         mips_check_isa_supports_ase (&mips_ases[i]);
1953     }
1954 }
1955
1956 /* Set the state of ASE to ENABLED_P.  Return the mask of ASE_* flags
1957    that were affected.  */
1958
1959 static unsigned int
1960 mips_set_ase (const struct mips_ase *ase, bfd_boolean enabled_p)
1961 {
1962   unsigned int mask;
1963
1964   mask = mips_ase_mask (ase->flags);
1965   mips_opts.ase &= ~mask;
1966   if (enabled_p)
1967     mips_opts.ase |= ase->flags;
1968   return mask;
1969 }
1970
1971 /* Return the ASE called NAME, or null if none.  */
1972
1973 static const struct mips_ase *
1974 mips_lookup_ase (const char *name)
1975 {
1976   unsigned int i;
1977
1978   for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
1979     if (strcmp (name, mips_ases[i].name) == 0)
1980       return &mips_ases[i];
1981   return NULL;
1982 }
1983
1984 /* Return the length of a microMIPS instruction in bytes.  If bits of
1985    the mask beyond the low 16 are 0, then it is a 16-bit instruction.
1986    Otherwise assume a 32-bit instruction; 48-bit instructions (0x1f
1987    major opcode) will require further modifications to the opcode
1988    table.  */
1989
1990 static inline unsigned int
1991 micromips_insn_length (const struct mips_opcode *mo)
1992 {
1993   return (mo->mask >> 16) == 0 ? 2 : 4;
1994 }
1995
1996 /* Return the length of MIPS16 instruction OPCODE.  */
1997
1998 static inline unsigned int
1999 mips16_opcode_length (unsigned long opcode)
2000 {
2001   return (opcode >> 16) == 0 ? 2 : 4;
2002 }
2003
2004 /* Return the length of instruction INSN.  */
2005
2006 static inline unsigned int
2007 insn_length (const struct mips_cl_insn *insn)
2008 {
2009   if (mips_opts.micromips)
2010     return micromips_insn_length (insn->insn_mo);
2011   else if (mips_opts.mips16)
2012     return mips16_opcode_length (insn->insn_opcode);
2013   else
2014     return 4;
2015 }
2016
2017 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
2018
2019 static void
2020 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
2021 {
2022   size_t i;
2023
2024   insn->insn_mo = mo;
2025   insn->insn_opcode = mo->match;
2026   insn->frag = NULL;
2027   insn->where = 0;
2028   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
2029     insn->fixp[i] = NULL;
2030   insn->fixed_p = (mips_opts.noreorder > 0);
2031   insn->noreorder_p = (mips_opts.noreorder > 0);
2032   insn->mips16_absolute_jump_p = 0;
2033   insn->complete_p = 0;
2034   insn->cleared_p = 0;
2035 }
2036
2037 /* Record the current MIPS16/microMIPS mode in now_seg.  */
2038
2039 static void
2040 mips_record_compressed_mode (void)
2041 {
2042   segment_info_type *si;
2043
2044   si = seg_info (now_seg);
2045   if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
2046     si->tc_segment_info_data.mips16 = mips_opts.mips16;
2047   if (si->tc_segment_info_data.micromips != mips_opts.micromips)
2048     si->tc_segment_info_data.micromips = mips_opts.micromips;
2049 }
2050
2051 /* Read a standard MIPS instruction from BUF.  */
2052
2053 static unsigned long
2054 read_insn (char *buf)
2055 {
2056   if (target_big_endian)
2057     return bfd_getb32 ((bfd_byte *) buf);
2058   else
2059     return bfd_getl32 ((bfd_byte *) buf);
2060 }
2061
2062 /* Write standard MIPS instruction INSN to BUF.  Return a pointer to
2063    the next byte.  */
2064
2065 static char *
2066 write_insn (char *buf, unsigned int insn)
2067 {
2068   md_number_to_chars (buf, insn, 4);
2069   return buf + 4;
2070 }
2071
2072 /* Read a microMIPS or MIPS16 opcode from BUF, given that it
2073    has length LENGTH.  */
2074
2075 static unsigned long
2076 read_compressed_insn (char *buf, unsigned int length)
2077 {
2078   unsigned long insn;
2079   unsigned int i;
2080
2081   insn = 0;
2082   for (i = 0; i < length; i += 2)
2083     {
2084       insn <<= 16;
2085       if (target_big_endian)
2086         insn |= bfd_getb16 ((char *) buf);
2087       else
2088         insn |= bfd_getl16 ((char *) buf);
2089       buf += 2;
2090     }
2091   return insn;
2092 }
2093
2094 /* Write microMIPS or MIPS16 instruction INSN to BUF, given that the
2095    instruction is LENGTH bytes long.  Return a pointer to the next byte.  */
2096
2097 static char *
2098 write_compressed_insn (char *buf, unsigned int insn, unsigned int length)
2099 {
2100   unsigned int i;
2101
2102   for (i = 0; i < length; i += 2)
2103     md_number_to_chars (buf + i, insn >> ((length - i - 2) * 8), 2);
2104   return buf + length;
2105 }
2106
2107 /* Install INSN at the location specified by its "frag" and "where" fields.  */
2108
2109 static void
2110 install_insn (const struct mips_cl_insn *insn)
2111 {
2112   char *f = insn->frag->fr_literal + insn->where;
2113   if (HAVE_CODE_COMPRESSION)
2114     write_compressed_insn (f, insn->insn_opcode, insn_length (insn));
2115   else
2116     write_insn (f, insn->insn_opcode);
2117   mips_record_compressed_mode ();
2118 }
2119
2120 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
2121    and install the opcode in the new location.  */
2122
2123 static void
2124 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
2125 {
2126   size_t i;
2127
2128   insn->frag = frag;
2129   insn->where = where;
2130   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
2131     if (insn->fixp[i] != NULL)
2132       {
2133         insn->fixp[i]->fx_frag = frag;
2134         insn->fixp[i]->fx_where = where;
2135       }
2136   install_insn (insn);
2137 }
2138
2139 /* Add INSN to the end of the output.  */
2140
2141 static void
2142 add_fixed_insn (struct mips_cl_insn *insn)
2143 {
2144   char *f = frag_more (insn_length (insn));
2145   move_insn (insn, frag_now, f - frag_now->fr_literal);
2146 }
2147
2148 /* Start a variant frag and move INSN to the start of the variant part,
2149    marking it as fixed.  The other arguments are as for frag_var.  */
2150
2151 static void
2152 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
2153                   relax_substateT subtype, symbolS *symbol, offsetT offset)
2154 {
2155   frag_grow (max_chars);
2156   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
2157   insn->fixed_p = 1;
2158   frag_var (rs_machine_dependent, max_chars, var,
2159             subtype, symbol, offset, NULL);
2160 }
2161
2162 /* Insert N copies of INSN into the history buffer, starting at
2163    position FIRST.  Neither FIRST nor N need to be clipped.  */
2164
2165 static void
2166 insert_into_history (unsigned int first, unsigned int n,
2167                      const struct mips_cl_insn *insn)
2168 {
2169   if (mips_relax.sequence != 2)
2170     {
2171       unsigned int i;
2172
2173       for (i = ARRAY_SIZE (history); i-- > first;)
2174         if (i >= first + n)
2175           history[i] = history[i - n];
2176         else
2177           history[i] = *insn;
2178     }
2179 }
2180
2181 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
2182    the idea is to make it obvious at a glance that each errata is
2183    included.  */
2184
2185 static void
2186 init_vr4120_conflicts (void)
2187 {
2188 #define CONFLICT(FIRST, SECOND) \
2189     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
2190
2191   /* Errata 21 - [D]DIV[U] after [D]MACC */
2192   CONFLICT (MACC, DIV);
2193   CONFLICT (DMACC, DIV);
2194
2195   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
2196   CONFLICT (DMULT, DMULT);
2197   CONFLICT (DMULT, DMACC);
2198   CONFLICT (DMACC, DMULT);
2199   CONFLICT (DMACC, DMACC);
2200
2201   /* Errata 24 - MT{LO,HI} after [D]MACC */
2202   CONFLICT (MACC, MTHILO);
2203   CONFLICT (DMACC, MTHILO);
2204
2205   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
2206      instruction is executed immediately after a MACC or DMACC
2207      instruction, the result of [either instruction] is incorrect."  */
2208   CONFLICT (MACC, MULT);
2209   CONFLICT (MACC, DMULT);
2210   CONFLICT (DMACC, MULT);
2211   CONFLICT (DMACC, DMULT);
2212
2213   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
2214      executed immediately after a DMULT, DMULTU, DIV, DIVU,
2215      DDIV or DDIVU instruction, the result of the MACC or
2216      DMACC instruction is incorrect.".  */
2217   CONFLICT (DMULT, MACC);
2218   CONFLICT (DMULT, DMACC);
2219   CONFLICT (DIV, MACC);
2220   CONFLICT (DIV, DMACC);
2221
2222 #undef CONFLICT
2223 }
2224
2225 struct regname {
2226   const char *name;
2227   unsigned int num;
2228 };
2229
2230 #define RTYPE_MASK      0x1ff00
2231 #define RTYPE_NUM       0x00100
2232 #define RTYPE_FPU       0x00200
2233 #define RTYPE_FCC       0x00400
2234 #define RTYPE_VEC       0x00800
2235 #define RTYPE_GP        0x01000
2236 #define RTYPE_CP0       0x02000
2237 #define RTYPE_PC        0x04000
2238 #define RTYPE_ACC       0x08000
2239 #define RTYPE_CCC       0x10000
2240 #define RNUM_MASK       0x000ff
2241 #define RWARN           0x80000
2242
2243 #define GENERIC_REGISTER_NUMBERS \
2244     {"$0",      RTYPE_NUM | 0},  \
2245     {"$1",      RTYPE_NUM | 1},  \
2246     {"$2",      RTYPE_NUM | 2},  \
2247     {"$3",      RTYPE_NUM | 3},  \
2248     {"$4",      RTYPE_NUM | 4},  \
2249     {"$5",      RTYPE_NUM | 5},  \
2250     {"$6",      RTYPE_NUM | 6},  \
2251     {"$7",      RTYPE_NUM | 7},  \
2252     {"$8",      RTYPE_NUM | 8},  \
2253     {"$9",      RTYPE_NUM | 9},  \
2254     {"$10",     RTYPE_NUM | 10}, \
2255     {"$11",     RTYPE_NUM | 11}, \
2256     {"$12",     RTYPE_NUM | 12}, \
2257     {"$13",     RTYPE_NUM | 13}, \
2258     {"$14",     RTYPE_NUM | 14}, \
2259     {"$15",     RTYPE_NUM | 15}, \
2260     {"$16",     RTYPE_NUM | 16}, \
2261     {"$17",     RTYPE_NUM | 17}, \
2262     {"$18",     RTYPE_NUM | 18}, \
2263     {"$19",     RTYPE_NUM | 19}, \
2264     {"$20",     RTYPE_NUM | 20}, \
2265     {"$21",     RTYPE_NUM | 21}, \
2266     {"$22",     RTYPE_NUM | 22}, \
2267     {"$23",     RTYPE_NUM | 23}, \
2268     {"$24",     RTYPE_NUM | 24}, \
2269     {"$25",     RTYPE_NUM | 25}, \
2270     {"$26",     RTYPE_NUM | 26}, \
2271     {"$27",     RTYPE_NUM | 27}, \
2272     {"$28",     RTYPE_NUM | 28}, \
2273     {"$29",     RTYPE_NUM | 29}, \
2274     {"$30",     RTYPE_NUM | 30}, \
2275     {"$31",     RTYPE_NUM | 31} 
2276
2277 #define FPU_REGISTER_NAMES       \
2278     {"$f0",     RTYPE_FPU | 0},  \
2279     {"$f1",     RTYPE_FPU | 1},  \
2280     {"$f2",     RTYPE_FPU | 2},  \
2281     {"$f3",     RTYPE_FPU | 3},  \
2282     {"$f4",     RTYPE_FPU | 4},  \
2283     {"$f5",     RTYPE_FPU | 5},  \
2284     {"$f6",     RTYPE_FPU | 6},  \
2285     {"$f7",     RTYPE_FPU | 7},  \
2286     {"$f8",     RTYPE_FPU | 8},  \
2287     {"$f9",     RTYPE_FPU | 9},  \
2288     {"$f10",    RTYPE_FPU | 10}, \
2289     {"$f11",    RTYPE_FPU | 11}, \
2290     {"$f12",    RTYPE_FPU | 12}, \
2291     {"$f13",    RTYPE_FPU | 13}, \
2292     {"$f14",    RTYPE_FPU | 14}, \
2293     {"$f15",    RTYPE_FPU | 15}, \
2294     {"$f16",    RTYPE_FPU | 16}, \
2295     {"$f17",    RTYPE_FPU | 17}, \
2296     {"$f18",    RTYPE_FPU | 18}, \
2297     {"$f19",    RTYPE_FPU | 19}, \
2298     {"$f20",    RTYPE_FPU | 20}, \
2299     {"$f21",    RTYPE_FPU | 21}, \
2300     {"$f22",    RTYPE_FPU | 22}, \
2301     {"$f23",    RTYPE_FPU | 23}, \
2302     {"$f24",    RTYPE_FPU | 24}, \
2303     {"$f25",    RTYPE_FPU | 25}, \
2304     {"$f26",    RTYPE_FPU | 26}, \
2305     {"$f27",    RTYPE_FPU | 27}, \
2306     {"$f28",    RTYPE_FPU | 28}, \
2307     {"$f29",    RTYPE_FPU | 29}, \
2308     {"$f30",    RTYPE_FPU | 30}, \
2309     {"$f31",    RTYPE_FPU | 31}
2310
2311 #define FPU_CONDITION_CODE_NAMES \
2312     {"$fcc0",   RTYPE_FCC | 0},  \
2313     {"$fcc1",   RTYPE_FCC | 1},  \
2314     {"$fcc2",   RTYPE_FCC | 2},  \
2315     {"$fcc3",   RTYPE_FCC | 3},  \
2316     {"$fcc4",   RTYPE_FCC | 4},  \
2317     {"$fcc5",   RTYPE_FCC | 5},  \
2318     {"$fcc6",   RTYPE_FCC | 6},  \
2319     {"$fcc7",   RTYPE_FCC | 7}
2320
2321 #define COPROC_CONDITION_CODE_NAMES         \
2322     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
2323     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
2324     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
2325     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
2326     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
2327     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
2328     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
2329     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
2330
2331 #define N32N64_SYMBOLIC_REGISTER_NAMES \
2332     {"$a4",     RTYPE_GP | 8},  \
2333     {"$a5",     RTYPE_GP | 9},  \
2334     {"$a6",     RTYPE_GP | 10}, \
2335     {"$a7",     RTYPE_GP | 11}, \
2336     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
2337     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
2338     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
2339     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
2340     {"$t0",     RTYPE_GP | 12}, \
2341     {"$t1",     RTYPE_GP | 13}, \
2342     {"$t2",     RTYPE_GP | 14}, \
2343     {"$t3",     RTYPE_GP | 15}
2344
2345 #define O32_SYMBOLIC_REGISTER_NAMES \
2346     {"$t0",     RTYPE_GP | 8},  \
2347     {"$t1",     RTYPE_GP | 9},  \
2348     {"$t2",     RTYPE_GP | 10}, \
2349     {"$t3",     RTYPE_GP | 11}, \
2350     {"$t4",     RTYPE_GP | 12}, \
2351     {"$t5",     RTYPE_GP | 13}, \
2352     {"$t6",     RTYPE_GP | 14}, \
2353     {"$t7",     RTYPE_GP | 15}, \
2354     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
2355     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
2356     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
2357     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */ 
2358
2359 /* Remaining symbolic register names */
2360 #define SYMBOLIC_REGISTER_NAMES \
2361     {"$zero",   RTYPE_GP | 0},  \
2362     {"$at",     RTYPE_GP | 1},  \
2363     {"$AT",     RTYPE_GP | 1},  \
2364     {"$v0",     RTYPE_GP | 2},  \
2365     {"$v1",     RTYPE_GP | 3},  \
2366     {"$a0",     RTYPE_GP | 4},  \
2367     {"$a1",     RTYPE_GP | 5},  \
2368     {"$a2",     RTYPE_GP | 6},  \
2369     {"$a3",     RTYPE_GP | 7},  \
2370     {"$s0",     RTYPE_GP | 16}, \
2371     {"$s1",     RTYPE_GP | 17}, \
2372     {"$s2",     RTYPE_GP | 18}, \
2373     {"$s3",     RTYPE_GP | 19}, \
2374     {"$s4",     RTYPE_GP | 20}, \
2375     {"$s5",     RTYPE_GP | 21}, \
2376     {"$s6",     RTYPE_GP | 22}, \
2377     {"$s7",     RTYPE_GP | 23}, \
2378     {"$t8",     RTYPE_GP | 24}, \
2379     {"$t9",     RTYPE_GP | 25}, \
2380     {"$k0",     RTYPE_GP | 26}, \
2381     {"$kt0",    RTYPE_GP | 26}, \
2382     {"$k1",     RTYPE_GP | 27}, \
2383     {"$kt1",    RTYPE_GP | 27}, \
2384     {"$gp",     RTYPE_GP | 28}, \
2385     {"$sp",     RTYPE_GP | 29}, \
2386     {"$s8",     RTYPE_GP | 30}, \
2387     {"$fp",     RTYPE_GP | 30}, \
2388     {"$ra",     RTYPE_GP | 31}
2389
2390 #define MIPS16_SPECIAL_REGISTER_NAMES \
2391     {"$pc",     RTYPE_PC | 0}
2392
2393 #define MDMX_VECTOR_REGISTER_NAMES \
2394     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
2395     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
2396     {"$v2",     RTYPE_VEC | 2},  \
2397     {"$v3",     RTYPE_VEC | 3},  \
2398     {"$v4",     RTYPE_VEC | 4},  \
2399     {"$v5",     RTYPE_VEC | 5},  \
2400     {"$v6",     RTYPE_VEC | 6},  \
2401     {"$v7",     RTYPE_VEC | 7},  \
2402     {"$v8",     RTYPE_VEC | 8},  \
2403     {"$v9",     RTYPE_VEC | 9},  \
2404     {"$v10",    RTYPE_VEC | 10}, \
2405     {"$v11",    RTYPE_VEC | 11}, \
2406     {"$v12",    RTYPE_VEC | 12}, \
2407     {"$v13",    RTYPE_VEC | 13}, \
2408     {"$v14",    RTYPE_VEC | 14}, \
2409     {"$v15",    RTYPE_VEC | 15}, \
2410     {"$v16",    RTYPE_VEC | 16}, \
2411     {"$v17",    RTYPE_VEC | 17}, \
2412     {"$v18",    RTYPE_VEC | 18}, \
2413     {"$v19",    RTYPE_VEC | 19}, \
2414     {"$v20",    RTYPE_VEC | 20}, \
2415     {"$v21",    RTYPE_VEC | 21}, \
2416     {"$v22",    RTYPE_VEC | 22}, \
2417     {"$v23",    RTYPE_VEC | 23}, \
2418     {"$v24",    RTYPE_VEC | 24}, \
2419     {"$v25",    RTYPE_VEC | 25}, \
2420     {"$v26",    RTYPE_VEC | 26}, \
2421     {"$v27",    RTYPE_VEC | 27}, \
2422     {"$v28",    RTYPE_VEC | 28}, \
2423     {"$v29",    RTYPE_VEC | 29}, \
2424     {"$v30",    RTYPE_VEC | 30}, \
2425     {"$v31",    RTYPE_VEC | 31}
2426
2427 #define MIPS_DSP_ACCUMULATOR_NAMES \
2428     {"$ac0",    RTYPE_ACC | 0}, \
2429     {"$ac1",    RTYPE_ACC | 1}, \
2430     {"$ac2",    RTYPE_ACC | 2}, \
2431     {"$ac3",    RTYPE_ACC | 3}
2432
2433 static const struct regname reg_names[] = {
2434   GENERIC_REGISTER_NUMBERS,
2435   FPU_REGISTER_NAMES,
2436   FPU_CONDITION_CODE_NAMES,
2437   COPROC_CONDITION_CODE_NAMES,
2438
2439   /* The $txx registers depends on the abi,
2440      these will be added later into the symbol table from
2441      one of the tables below once mips_abi is set after 
2442      parsing of arguments from the command line. */
2443   SYMBOLIC_REGISTER_NAMES,
2444
2445   MIPS16_SPECIAL_REGISTER_NAMES,
2446   MDMX_VECTOR_REGISTER_NAMES,
2447   MIPS_DSP_ACCUMULATOR_NAMES,
2448   {0, 0}
2449 };
2450
2451 static const struct regname reg_names_o32[] = {
2452   O32_SYMBOLIC_REGISTER_NAMES,
2453   {0, 0}
2454 };
2455
2456 static const struct regname reg_names_n32n64[] = {
2457   N32N64_SYMBOLIC_REGISTER_NAMES,
2458   {0, 0}
2459 };
2460
2461 /* Check if S points at a valid register specifier according to TYPES.
2462    If so, then return 1, advance S to consume the specifier and store
2463    the register's number in REGNOP, otherwise return 0.  */
2464
2465 static int
2466 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
2467 {
2468   symbolS *symbolP;
2469   char *e;
2470   char save_c;
2471   int reg = -1;
2472
2473   /* Find end of name.  */
2474   e = *s;
2475   if (is_name_beginner (*e))
2476     ++e;
2477   while (is_part_of_name (*e))
2478     ++e;
2479
2480   /* Terminate name.  */
2481   save_c = *e;
2482   *e = '\0';
2483
2484   /* Look for a register symbol.  */
2485   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
2486     {
2487       int r = S_GET_VALUE (symbolP);
2488       if (r & types)
2489         reg = r & RNUM_MASK;
2490       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
2491         /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
2492         reg = (r & RNUM_MASK) - 2;
2493     }
2494   /* Else see if this is a register defined in an itbl entry.  */
2495   else if ((types & RTYPE_GP) && itbl_have_entries)
2496     {
2497       char *n = *s;
2498       unsigned long r;
2499
2500       if (*n == '$')
2501         ++n;
2502       if (itbl_get_reg_val (n, &r))
2503         reg = r & RNUM_MASK;
2504     }
2505
2506   /* Advance to next token if a register was recognised.  */
2507   if (reg >= 0)
2508     *s = e;
2509   else if (types & RWARN)
2510     as_warn (_("Unrecognized register name `%s'"), *s);
2511
2512   *e = save_c;
2513   if (regnop)
2514     *regnop = reg;
2515   return reg >= 0;
2516 }
2517
2518 /* Check if S points at a valid register list according to TYPES.
2519    If so, then return 1, advance S to consume the list and store
2520    the registers present on the list as a bitmask of ones in REGLISTP,
2521    otherwise return 0.  A valid list comprises a comma-separated
2522    enumeration of valid single registers and/or dash-separated
2523    contiguous register ranges as determined by their numbers.
2524
2525    As a special exception if one of s0-s7 registers is specified as
2526    the range's lower delimiter and s8 (fp) is its upper one, then no
2527    registers whose numbers place them between s7 and s8 (i.e. $24-$29)
2528    are selected; they have to be listed separately if needed.  */
2529
2530 static int
2531 reglist_lookup (char **s, unsigned int types, unsigned int *reglistp)
2532 {
2533   unsigned int reglist = 0;
2534   unsigned int lastregno;
2535   bfd_boolean ok = TRUE;
2536   unsigned int regmask;
2537   char *s_endlist = *s;
2538   char *s_reset = *s;
2539   unsigned int regno;
2540
2541   while (reg_lookup (s, types, &regno))
2542     {
2543       lastregno = regno;
2544       if (**s == '-')
2545         {
2546           (*s)++;
2547           ok = reg_lookup (s, types, &lastregno);
2548           if (ok && lastregno < regno)
2549             ok = FALSE;
2550           if (!ok)
2551             break;
2552         }
2553
2554       if (lastregno == FP && regno >= S0 && regno <= S7)
2555         {
2556           lastregno = S7;
2557           reglist |= 1 << FP;
2558         }
2559       regmask = 1 << lastregno;
2560       regmask = (regmask << 1) - 1;
2561       regmask ^= (1 << regno) - 1;
2562       reglist |= regmask;
2563
2564       s_endlist = *s;
2565       if (**s != ',')
2566         break;
2567       (*s)++;
2568     }
2569
2570   if (ok)
2571     *s = s_endlist;
2572   else
2573     *s = s_reset;
2574   if (reglistp)
2575     *reglistp = reglist;
2576   return ok && reglist != 0;
2577 }
2578
2579 /* Return TRUE if opcode MO is valid on the currently selected ISA, ASE
2580    and architecture.  Use is_opcode_valid_16 for MIPS16 opcodes.  */
2581
2582 static bfd_boolean
2583 is_opcode_valid (const struct mips_opcode *mo)
2584 {
2585   int isa = mips_opts.isa;
2586   int ase = mips_opts.ase;
2587   int fp_s, fp_d;
2588   unsigned int i;
2589
2590   if (ISA_HAS_64BIT_REGS (mips_opts.isa))
2591     for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
2592       if ((ase & mips_ases[i].flags) == mips_ases[i].flags)
2593         ase |= mips_ases[i].flags64;
2594
2595   if (!opcode_is_member (mo, isa, ase, mips_opts.arch))
2596     return FALSE;
2597
2598   /* Check whether the instruction or macro requires single-precision or
2599      double-precision floating-point support.  Note that this information is
2600      stored differently in the opcode table for insns and macros.  */
2601   if (mo->pinfo == INSN_MACRO)
2602     {
2603       fp_s = mo->pinfo2 & INSN2_M_FP_S;
2604       fp_d = mo->pinfo2 & INSN2_M_FP_D;
2605     }
2606   else
2607     {
2608       fp_s = mo->pinfo & FP_S;
2609       fp_d = mo->pinfo & FP_D;
2610     }
2611
2612   if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
2613     return FALSE;
2614
2615   if (fp_s && mips_opts.soft_float)
2616     return FALSE;
2617
2618   return TRUE;
2619 }
2620
2621 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
2622    selected ISA and architecture.  */
2623
2624 static bfd_boolean
2625 is_opcode_valid_16 (const struct mips_opcode *mo)
2626 {
2627   return opcode_is_member (mo, mips_opts.isa, 0, mips_opts.arch);
2628 }
2629
2630 /* Return TRUE if the size of the microMIPS opcode MO matches one
2631    explicitly requested.  Always TRUE in the standard MIPS mode.  */
2632
2633 static bfd_boolean
2634 is_size_valid (const struct mips_opcode *mo)
2635 {
2636   if (!mips_opts.micromips)
2637     return TRUE;
2638
2639   if (!forced_insn_length)
2640     return TRUE;
2641   if (mo->pinfo == INSN_MACRO)
2642     return FALSE;
2643   return forced_insn_length == micromips_insn_length (mo);
2644 }
2645
2646 /* Return TRUE if the microMIPS opcode MO is valid for the delay slot
2647    of the preceding instruction.  Always TRUE in the standard MIPS mode.
2648
2649    We don't accept macros in 16-bit delay slots to avoid a case where
2650    a macro expansion fails because it relies on a preceding 32-bit real
2651    instruction to have matched and does not handle the operands correctly.
2652    The only macros that may expand to 16-bit instructions are JAL that
2653    cannot be placed in a delay slot anyway, and corner cases of BALIGN
2654    and BGT (that likewise cannot be placed in a delay slot) that decay to
2655    a NOP.  In all these cases the macros precede any corresponding real
2656    instruction definitions in the opcode table, so they will match in the
2657    second pass where the size of the delay slot is ignored and therefore
2658    produce correct code.  */
2659
2660 static bfd_boolean
2661 is_delay_slot_valid (const struct mips_opcode *mo)
2662 {
2663   if (!mips_opts.micromips)
2664     return TRUE;
2665
2666   if (mo->pinfo == INSN_MACRO)
2667     return (history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) == 0;
2668   if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
2669       && micromips_insn_length (mo) != 4)
2670     return FALSE;
2671   if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
2672       && micromips_insn_length (mo) != 2)
2673     return FALSE;
2674
2675   return TRUE;
2676 }
2677
2678 /* This function is called once, at assembler startup time.  It should set up
2679    all the tables, etc. that the MD part of the assembler will need.  */
2680
2681 void
2682 md_begin (void)
2683 {
2684   const char *retval = NULL;
2685   int i = 0;
2686   int broken = 0;
2687
2688   if (mips_pic != NO_PIC)
2689     {
2690       if (g_switch_seen && g_switch_value != 0)
2691         as_bad (_("-G may not be used in position-independent code"));
2692       g_switch_value = 0;
2693     }
2694
2695   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
2696     as_warn (_("Could not set architecture and machine"));
2697
2698   op_hash = hash_new ();
2699
2700   for (i = 0; i < NUMOPCODES;)
2701     {
2702       const char *name = mips_opcodes[i].name;
2703
2704       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
2705       if (retval != NULL)
2706         {
2707           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
2708                    mips_opcodes[i].name, retval);
2709           /* Probably a memory allocation problem?  Give up now.  */
2710           as_fatal (_("Broken assembler.  No assembly attempted."));
2711         }
2712       do
2713         {
2714           if (mips_opcodes[i].pinfo != INSN_MACRO)
2715             {
2716               if (!validate_mips_insn (&mips_opcodes[i]))
2717                 broken = 1;
2718               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2719                 {
2720                   create_insn (&nop_insn, mips_opcodes + i);
2721                   if (mips_fix_loongson2f_nop)
2722                     nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
2723                   nop_insn.fixed_p = 1;
2724                 }
2725             }
2726           ++i;
2727         }
2728       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
2729     }
2730
2731   mips16_op_hash = hash_new ();
2732
2733   i = 0;
2734   while (i < bfd_mips16_num_opcodes)
2735     {
2736       const char *name = mips16_opcodes[i].name;
2737
2738       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
2739       if (retval != NULL)
2740         as_fatal (_("internal: can't hash `%s': %s"),
2741                   mips16_opcodes[i].name, retval);
2742       do
2743         {
2744           if (mips16_opcodes[i].pinfo != INSN_MACRO
2745               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
2746                   != mips16_opcodes[i].match))
2747             {
2748               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
2749                        mips16_opcodes[i].name, mips16_opcodes[i].args);
2750               broken = 1;
2751             }
2752           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2753             {
2754               create_insn (&mips16_nop_insn, mips16_opcodes + i);
2755               mips16_nop_insn.fixed_p = 1;
2756             }
2757           ++i;
2758         }
2759       while (i < bfd_mips16_num_opcodes
2760              && strcmp (mips16_opcodes[i].name, name) == 0);
2761     }
2762
2763   micromips_op_hash = hash_new ();
2764
2765   i = 0;
2766   while (i < bfd_micromips_num_opcodes)
2767     {
2768       const char *name = micromips_opcodes[i].name;
2769
2770       retval = hash_insert (micromips_op_hash, name,
2771                             (void *) &micromips_opcodes[i]);
2772       if (retval != NULL)
2773         as_fatal (_("internal: can't hash `%s': %s"),
2774                   micromips_opcodes[i].name, retval);
2775       do
2776         if (micromips_opcodes[i].pinfo != INSN_MACRO)
2777           {
2778             struct mips_cl_insn *micromips_nop_insn;
2779
2780             if (!validate_micromips_insn (&micromips_opcodes[i]))
2781               broken = 1;
2782
2783             if (micromips_insn_length (micromips_opcodes + i) == 2)
2784               micromips_nop_insn = &micromips_nop16_insn;
2785             else if (micromips_insn_length (micromips_opcodes + i) == 4)
2786               micromips_nop_insn = &micromips_nop32_insn;
2787             else
2788               continue;
2789
2790             if (micromips_nop_insn->insn_mo == NULL
2791                 && strcmp (name, "nop") == 0)
2792               {
2793                 create_insn (micromips_nop_insn, micromips_opcodes + i);
2794                 micromips_nop_insn->fixed_p = 1;
2795               }
2796           }
2797       while (++i < bfd_micromips_num_opcodes
2798              && strcmp (micromips_opcodes[i].name, name) == 0);
2799     }
2800
2801   if (broken)
2802     as_fatal (_("Broken assembler.  No assembly attempted."));
2803
2804   /* We add all the general register names to the symbol table.  This
2805      helps us detect invalid uses of them.  */
2806   for (i = 0; reg_names[i].name; i++) 
2807     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
2808                                      reg_names[i].num, /* & RNUM_MASK, */
2809                                      &zero_address_frag));
2810   if (HAVE_NEWABI)
2811     for (i = 0; reg_names_n32n64[i].name; i++) 
2812       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
2813                                        reg_names_n32n64[i].num, /* & RNUM_MASK, */
2814                                        &zero_address_frag));
2815   else
2816     for (i = 0; reg_names_o32[i].name; i++) 
2817       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
2818                                        reg_names_o32[i].num, /* & RNUM_MASK, */
2819                                        &zero_address_frag));
2820
2821   mips_no_prev_insn ();
2822
2823   mips_gprmask = 0;
2824   mips_cprmask[0] = 0;
2825   mips_cprmask[1] = 0;
2826   mips_cprmask[2] = 0;
2827   mips_cprmask[3] = 0;
2828
2829   /* set the default alignment for the text section (2**2) */
2830   record_alignment (text_section, 2);
2831
2832   bfd_set_gp_size (stdoutput, g_switch_value);
2833
2834   /* On a native system other than VxWorks, sections must be aligned
2835      to 16 byte boundaries.  When configured for an embedded ELF
2836      target, we don't bother.  */
2837   if (strncmp (TARGET_OS, "elf", 3) != 0
2838       && strncmp (TARGET_OS, "vxworks", 7) != 0)
2839     {
2840       (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2841       (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2842       (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2843     }
2844
2845   /* Create a .reginfo section for register masks and a .mdebug
2846      section for debugging information.  */
2847   {
2848     segT seg;
2849     subsegT subseg;
2850     flagword flags;
2851     segT sec;
2852
2853     seg = now_seg;
2854     subseg = now_subseg;
2855
2856     /* The ABI says this section should be loaded so that the
2857        running program can access it.  However, we don't load it
2858        if we are configured for an embedded target */
2859     flags = SEC_READONLY | SEC_DATA;
2860     if (strncmp (TARGET_OS, "elf", 3) != 0)
2861       flags |= SEC_ALLOC | SEC_LOAD;
2862
2863     if (mips_abi != N64_ABI)
2864       {
2865         sec = subseg_new (".reginfo", (subsegT) 0);
2866
2867         bfd_set_section_flags (stdoutput, sec, flags);
2868         bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2869
2870         mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2871       }
2872     else
2873       {
2874         /* The 64-bit ABI uses a .MIPS.options section rather than
2875            .reginfo section.  */
2876         sec = subseg_new (".MIPS.options", (subsegT) 0);
2877         bfd_set_section_flags (stdoutput, sec, flags);
2878         bfd_set_section_alignment (stdoutput, sec, 3);
2879
2880         /* Set up the option header.  */
2881         {
2882           Elf_Internal_Options opthdr;
2883           char *f;
2884
2885           opthdr.kind = ODK_REGINFO;
2886           opthdr.size = (sizeof (Elf_External_Options)
2887                          + sizeof (Elf64_External_RegInfo));
2888           opthdr.section = 0;
2889           opthdr.info = 0;
2890           f = frag_more (sizeof (Elf_External_Options));
2891           bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2892                                          (Elf_External_Options *) f);
2893
2894           mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2895         }
2896       }
2897
2898     if (ECOFF_DEBUGGING)
2899       {
2900         sec = subseg_new (".mdebug", (subsegT) 0);
2901         (void) bfd_set_section_flags (stdoutput, sec,
2902                                       SEC_HAS_CONTENTS | SEC_READONLY);
2903         (void) bfd_set_section_alignment (stdoutput, sec, 2);
2904       }
2905     else if (mips_flag_pdr)
2906       {
2907         pdr_seg = subseg_new (".pdr", (subsegT) 0);
2908         (void) bfd_set_section_flags (stdoutput, pdr_seg,
2909                                       SEC_READONLY | SEC_RELOC
2910                                       | SEC_DEBUGGING);
2911         (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2912       }
2913
2914     subseg_set (seg, subseg);
2915   }
2916
2917   if (! ECOFF_DEBUGGING)
2918     md_obj_begin ();
2919
2920   if (mips_fix_vr4120)
2921     init_vr4120_conflicts ();
2922 }
2923
2924 void
2925 md_mips_end (void)
2926 {
2927   mips_emit_delays ();
2928   if (! ECOFF_DEBUGGING)
2929     md_obj_end ();
2930 }
2931
2932 void
2933 md_assemble (char *str)
2934 {
2935   struct mips_cl_insn insn;
2936   bfd_reloc_code_real_type unused_reloc[3]
2937     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2938
2939   imm_expr.X_op = O_absent;
2940   imm2_expr.X_op = O_absent;
2941   offset_expr.X_op = O_absent;
2942   imm_reloc[0] = BFD_RELOC_UNUSED;
2943   imm_reloc[1] = BFD_RELOC_UNUSED;
2944   imm_reloc[2] = BFD_RELOC_UNUSED;
2945   offset_reloc[0] = BFD_RELOC_UNUSED;
2946   offset_reloc[1] = BFD_RELOC_UNUSED;
2947   offset_reloc[2] = BFD_RELOC_UNUSED;
2948
2949   mips_mark_labels ();
2950   mips_assembling_insn = TRUE;
2951
2952   if (mips_opts.mips16)
2953     mips16_ip (str, &insn);
2954   else
2955     {
2956       mips_ip (str, &insn);
2957       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2958             str, insn.insn_opcode));
2959     }
2960
2961   if (insn_error)
2962     as_bad ("%s `%s'", insn_error, str);
2963   else if (insn.insn_mo->pinfo == INSN_MACRO)
2964     {
2965       macro_start ();
2966       if (mips_opts.mips16)
2967         mips16_macro (&insn);
2968       else
2969         macro (&insn);
2970       macro_end ();
2971     }
2972   else
2973     {
2974       if (imm_expr.X_op != O_absent)
2975         append_insn (&insn, &imm_expr, imm_reloc, FALSE);
2976       else if (offset_expr.X_op != O_absent)
2977         append_insn (&insn, &offset_expr, offset_reloc, FALSE);
2978       else
2979         append_insn (&insn, NULL, unused_reloc, FALSE);
2980     }
2981
2982   mips_assembling_insn = FALSE;
2983 }
2984
2985 /* Convenience functions for abstracting away the differences between
2986    MIPS16 and non-MIPS16 relocations.  */
2987
2988 static inline bfd_boolean
2989 mips16_reloc_p (bfd_reloc_code_real_type reloc)
2990 {
2991   switch (reloc)
2992     {
2993     case BFD_RELOC_MIPS16_JMP:
2994     case BFD_RELOC_MIPS16_GPREL:
2995     case BFD_RELOC_MIPS16_GOT16:
2996     case BFD_RELOC_MIPS16_CALL16:
2997     case BFD_RELOC_MIPS16_HI16_S:
2998     case BFD_RELOC_MIPS16_HI16:
2999     case BFD_RELOC_MIPS16_LO16:
3000       return TRUE;
3001
3002     default:
3003       return FALSE;
3004     }
3005 }
3006
3007 static inline bfd_boolean
3008 micromips_reloc_p (bfd_reloc_code_real_type reloc)
3009 {
3010   switch (reloc)
3011     {
3012     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
3013     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
3014     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
3015     case BFD_RELOC_MICROMIPS_GPREL16:
3016     case BFD_RELOC_MICROMIPS_JMP:
3017     case BFD_RELOC_MICROMIPS_HI16:
3018     case BFD_RELOC_MICROMIPS_HI16_S:
3019     case BFD_RELOC_MICROMIPS_LO16:
3020     case BFD_RELOC_MICROMIPS_LITERAL:
3021     case BFD_RELOC_MICROMIPS_GOT16:
3022     case BFD_RELOC_MICROMIPS_CALL16:
3023     case BFD_RELOC_MICROMIPS_GOT_HI16:
3024     case BFD_RELOC_MICROMIPS_GOT_LO16:
3025     case BFD_RELOC_MICROMIPS_CALL_HI16:
3026     case BFD_RELOC_MICROMIPS_CALL_LO16:
3027     case BFD_RELOC_MICROMIPS_SUB:
3028     case BFD_RELOC_MICROMIPS_GOT_PAGE:
3029     case BFD_RELOC_MICROMIPS_GOT_OFST:
3030     case BFD_RELOC_MICROMIPS_GOT_DISP:
3031     case BFD_RELOC_MICROMIPS_HIGHEST:
3032     case BFD_RELOC_MICROMIPS_HIGHER:
3033     case BFD_RELOC_MICROMIPS_SCN_DISP:
3034     case BFD_RELOC_MICROMIPS_JALR:
3035       return TRUE;
3036
3037     default:
3038       return FALSE;
3039     }
3040 }
3041
3042 static inline bfd_boolean
3043 jmp_reloc_p (bfd_reloc_code_real_type reloc)
3044 {
3045   return reloc == BFD_RELOC_MIPS_JMP || reloc == BFD_RELOC_MICROMIPS_JMP;
3046 }
3047
3048 static inline bfd_boolean
3049 got16_reloc_p (bfd_reloc_code_real_type reloc)
3050 {
3051   return (reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16
3052           || reloc == BFD_RELOC_MICROMIPS_GOT16);
3053 }
3054
3055 static inline bfd_boolean
3056 hi16_reloc_p (bfd_reloc_code_real_type reloc)
3057 {
3058   return (reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S
3059           || reloc == BFD_RELOC_MICROMIPS_HI16_S);
3060 }
3061
3062 static inline bfd_boolean
3063 lo16_reloc_p (bfd_reloc_code_real_type reloc)
3064 {
3065   return (reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16
3066           || reloc == BFD_RELOC_MICROMIPS_LO16);
3067 }
3068
3069 static inline bfd_boolean
3070 jalr_reloc_p (bfd_reloc_code_real_type reloc)
3071 {
3072   return reloc == BFD_RELOC_MIPS_JALR || reloc == BFD_RELOC_MICROMIPS_JALR;
3073 }
3074
3075 /* Return true if RELOC is a PC-relative relocation that does not have
3076    full address range.  */
3077
3078 static inline bfd_boolean
3079 limited_pcrel_reloc_p (bfd_reloc_code_real_type reloc)
3080 {
3081   switch (reloc)
3082     {
3083     case BFD_RELOC_16_PCREL_S2:
3084     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
3085     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
3086     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
3087       return TRUE;
3088
3089     case BFD_RELOC_32_PCREL:
3090       return HAVE_64BIT_ADDRESSES;
3091
3092     default:
3093       return FALSE;
3094     }
3095 }
3096
3097 /* Return true if the given relocation might need a matching %lo().
3098    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
3099    need a matching %lo() when applied to local symbols.  */
3100
3101 static inline bfd_boolean
3102 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
3103 {
3104   return (HAVE_IN_PLACE_ADDENDS
3105           && (hi16_reloc_p (reloc)
3106               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
3107                  all GOT16 relocations evaluate to "G".  */
3108               || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
3109 }
3110
3111 /* Return the type of %lo() reloc needed by RELOC, given that
3112    reloc_needs_lo_p.  */
3113
3114 static inline bfd_reloc_code_real_type
3115 matching_lo_reloc (bfd_reloc_code_real_type reloc)
3116 {
3117   return (mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16
3118           : (micromips_reloc_p (reloc) ? BFD_RELOC_MICROMIPS_LO16
3119              : BFD_RELOC_LO16));
3120 }
3121
3122 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
3123    relocation.  */
3124
3125 static inline bfd_boolean
3126 fixup_has_matching_lo_p (fixS *fixp)
3127 {
3128   return (fixp->fx_next != NULL
3129           && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
3130           && fixp->fx_addsy == fixp->fx_next->fx_addsy
3131           && fixp->fx_offset == fixp->fx_next->fx_offset);
3132 }
3133
3134 /* This function returns true if modifying a register requires a
3135    delay.  */
3136
3137 static int
3138 reg_needs_delay (unsigned int reg)
3139 {
3140   unsigned long prev_pinfo;
3141
3142   prev_pinfo = history[0].insn_mo->pinfo;
3143   if (! mips_opts.noreorder
3144       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
3145            && ! gpr_interlocks)
3146           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
3147               && ! cop_interlocks)))
3148     {
3149       /* A load from a coprocessor or from memory.  All load delays
3150          delay the use of general register rt for one instruction.  */
3151       /* Itbl support may require additional care here.  */
3152       know (prev_pinfo & INSN_WRITE_GPR_T);
3153       if (reg == EXTRACT_OPERAND (mips_opts.micromips, RT, history[0]))
3154         return 1;
3155     }
3156
3157   return 0;
3158 }
3159
3160 /* Move all labels in LABELS to the current insertion point.  TEXT_P
3161    says whether the labels refer to text or data.  */
3162
3163 static void
3164 mips_move_labels (struct insn_label_list *labels, bfd_boolean text_p)
3165 {
3166   struct insn_label_list *l;
3167   valueT val;
3168
3169   for (l = labels; l != NULL; l = l->next)
3170     {
3171       gas_assert (S_GET_SEGMENT (l->label) == now_seg);
3172       symbol_set_frag (l->label, frag_now);
3173       val = (valueT) frag_now_fix ();
3174       /* MIPS16/microMIPS text labels are stored as odd.  */
3175       if (text_p && HAVE_CODE_COMPRESSION)
3176         ++val;
3177       S_SET_VALUE (l->label, val);
3178     }
3179 }
3180
3181 /* Move all labels in insn_labels to the current insertion point
3182    and treat them as text labels.  */
3183
3184 static void
3185 mips_move_text_labels (void)
3186 {
3187   mips_move_labels (seg_info (now_seg)->label_list, TRUE);
3188 }
3189
3190 static bfd_boolean
3191 s_is_linkonce (symbolS *sym, segT from_seg)
3192 {
3193   bfd_boolean linkonce = FALSE;
3194   segT symseg = S_GET_SEGMENT (sym);
3195
3196   if (symseg != from_seg && !S_IS_LOCAL (sym))
3197     {
3198       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
3199         linkonce = TRUE;
3200       /* The GNU toolchain uses an extension for ELF: a section
3201          beginning with the magic string .gnu.linkonce is a
3202          linkonce section.  */
3203       if (strncmp (segment_name (symseg), ".gnu.linkonce",
3204                    sizeof ".gnu.linkonce" - 1) == 0)
3205         linkonce = TRUE;
3206     }
3207   return linkonce;
3208 }
3209
3210 /* Mark MIPS16 or microMIPS instruction label LABEL.  This permits the
3211    linker to handle them specially, such as generating jalx instructions
3212    when needed.  We also make them odd for the duration of the assembly,
3213    in order to generate the right sort of code.  We will make them even
3214    in the adjust_symtab routine, while leaving them marked.  This is
3215    convenient for the debugger and the disassembler.  The linker knows
3216    to make them odd again.  */
3217
3218 static void
3219 mips_compressed_mark_label (symbolS *label)
3220 {
3221   gas_assert (HAVE_CODE_COMPRESSION);
3222
3223   if (mips_opts.mips16)
3224     S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
3225   else
3226     S_SET_OTHER (label, ELF_ST_SET_MICROMIPS (S_GET_OTHER (label)));
3227   if ((S_GET_VALUE (label) & 1) == 0
3228       /* Don't adjust the address if the label is global or weak, or
3229          in a link-once section, since we'll be emitting symbol reloc
3230          references to it which will be patched up by the linker, and
3231          the final value of the symbol may or may not be MIPS16/microMIPS.  */
3232       && !S_IS_WEAK (label)
3233       && !S_IS_EXTERNAL (label)
3234       && !s_is_linkonce (label, now_seg))
3235     S_SET_VALUE (label, S_GET_VALUE (label) | 1);
3236 }
3237
3238 /* Mark preceding MIPS16 or microMIPS instruction labels.  */
3239
3240 static void
3241 mips_compressed_mark_labels (void)
3242 {
3243   struct insn_label_list *l;
3244
3245   for (l = seg_info (now_seg)->label_list; l != NULL; l = l->next)
3246     mips_compressed_mark_label (l->label);
3247 }
3248
3249 /* End the current frag.  Make it a variant frag and record the
3250    relaxation info.  */
3251
3252 static void
3253 relax_close_frag (void)
3254 {
3255   mips_macro_warning.first_frag = frag_now;
3256   frag_var (rs_machine_dependent, 0, 0,
3257             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
3258             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
3259
3260   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
3261   mips_relax.first_fixup = 0;
3262 }
3263
3264 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
3265    See the comment above RELAX_ENCODE for more details.  */
3266
3267 static void
3268 relax_start (symbolS *symbol)
3269 {
3270   gas_assert (mips_relax.sequence == 0);
3271   mips_relax.sequence = 1;
3272   mips_relax.symbol = symbol;
3273 }
3274
3275 /* Start generating the second version of a relaxable sequence.
3276    See the comment above RELAX_ENCODE for more details.  */
3277
3278 static void
3279 relax_switch (void)
3280 {
3281   gas_assert (mips_relax.sequence == 1);
3282   mips_relax.sequence = 2;
3283 }
3284
3285 /* End the current relaxable sequence.  */
3286
3287 static void
3288 relax_end (void)
3289 {
3290   gas_assert (mips_relax.sequence == 2);
3291   relax_close_frag ();
3292   mips_relax.sequence = 0;
3293 }
3294
3295 /* Return true if IP is a delayed branch or jump.  */
3296
3297 static inline bfd_boolean
3298 delayed_branch_p (const struct mips_cl_insn *ip)
3299 {
3300   return (ip->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
3301                                 | INSN_COND_BRANCH_DELAY
3302                                 | INSN_COND_BRANCH_LIKELY)) != 0;
3303 }
3304
3305 /* Return true if IP is a compact branch or jump.  */
3306
3307 static inline bfd_boolean
3308 compact_branch_p (const struct mips_cl_insn *ip)
3309 {
3310   if (mips_opts.mips16)
3311     return (ip->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
3312                                   | MIPS16_INSN_COND_BRANCH)) != 0;
3313   else
3314     return (ip->insn_mo->pinfo2 & (INSN2_UNCOND_BRANCH
3315                                    | INSN2_COND_BRANCH)) != 0;
3316 }
3317
3318 /* Return true if IP is an unconditional branch or jump.  */
3319
3320 static inline bfd_boolean
3321 uncond_branch_p (const struct mips_cl_insn *ip)
3322 {
3323   return ((ip->insn_mo->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0
3324           || (mips_opts.mips16
3325               ? (ip->insn_mo->pinfo & MIPS16_INSN_UNCOND_BRANCH) != 0
3326               : (ip->insn_mo->pinfo2 & INSN2_UNCOND_BRANCH) != 0));
3327 }
3328
3329 /* Return true if IP is a branch-likely instruction.  */
3330
3331 static inline bfd_boolean
3332 branch_likely_p (const struct mips_cl_insn *ip)
3333 {
3334   return (ip->insn_mo->pinfo & INSN_COND_BRANCH_LIKELY) != 0;
3335 }
3336
3337 /* Return the type of nop that should be used to fill the delay slot
3338    of delayed branch IP.  */
3339
3340 static struct mips_cl_insn *
3341 get_delay_slot_nop (const struct mips_cl_insn *ip)
3342 {
3343   if (mips_opts.micromips
3344       && (ip->insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
3345     return &micromips_nop32_insn;
3346   return NOP_INSN;
3347 }
3348
3349 /* Return the mask of core registers that IP reads or writes.  */
3350
3351 static unsigned int
3352 gpr_mod_mask (const struct mips_cl_insn *ip)
3353 {
3354   unsigned long pinfo2;
3355   unsigned int mask;
3356
3357   mask = 0;
3358   pinfo2 = ip->insn_mo->pinfo2;
3359   if (mips_opts.micromips)
3360     {
3361       if (pinfo2 & INSN2_MOD_GPR_MD)
3362         mask |= 1 << micromips_to_32_reg_d_map[EXTRACT_OPERAND (1, MD, *ip)];
3363       if (pinfo2 & INSN2_MOD_GPR_MF)
3364         mask |= 1 << micromips_to_32_reg_f_map[EXTRACT_OPERAND (1, MF, *ip)];
3365       if (pinfo2 & INSN2_MOD_SP)
3366         mask |= 1 << SP;
3367     }
3368   return mask;
3369 }
3370
3371 /* Return the mask of core registers that IP reads.  */
3372
3373 static unsigned int
3374 gpr_read_mask (const struct mips_cl_insn *ip)
3375 {
3376   unsigned long pinfo, pinfo2;
3377   unsigned int mask;
3378
3379   mask = gpr_mod_mask (ip);
3380   pinfo = ip->insn_mo->pinfo;
3381   pinfo2 = ip->insn_mo->pinfo2;
3382   if (mips_opts.mips16)
3383     {
3384       if (pinfo & MIPS16_INSN_READ_X)
3385         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
3386       if (pinfo & MIPS16_INSN_READ_Y)
3387         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
3388       if (pinfo & MIPS16_INSN_READ_T)
3389         mask |= 1 << TREG;
3390       if (pinfo & MIPS16_INSN_READ_SP)
3391         mask |= 1 << SP;
3392       if (pinfo & MIPS16_INSN_READ_31)
3393         mask |= 1 << RA;
3394       if (pinfo & MIPS16_INSN_READ_Z)
3395         mask |= 1 << (mips16_to_32_reg_map
3396                       [MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]);
3397       if (pinfo & MIPS16_INSN_READ_GPR_X)
3398         mask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3399     }
3400   else
3401     {
3402       if (pinfo2 & INSN2_READ_GPR_D)
3403         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
3404       if (pinfo & INSN_READ_GPR_T)
3405         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
3406       if (pinfo & INSN_READ_GPR_S)
3407         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
3408       if (pinfo2 & INSN2_READ_GP)
3409         mask |= 1 << GP;
3410       if (pinfo2 & INSN2_READ_GPR_31)
3411         mask |= 1 << RA;
3412       if (pinfo2 & INSN2_READ_GPR_Z)
3413         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3414     }
3415   if (mips_opts.micromips)
3416     {
3417       if (pinfo2 & INSN2_READ_GPR_MC)
3418         mask |= 1 << micromips_to_32_reg_c_map[EXTRACT_OPERAND (1, MC, *ip)];
3419       if (pinfo2 & INSN2_READ_GPR_ME)
3420         mask |= 1 << micromips_to_32_reg_e_map[EXTRACT_OPERAND (1, ME, *ip)];
3421       if (pinfo2 & INSN2_READ_GPR_MG)
3422         mask |= 1 << micromips_to_32_reg_g_map[EXTRACT_OPERAND (1, MG, *ip)];
3423       if (pinfo2 & INSN2_READ_GPR_MJ)
3424         mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3425       if (pinfo2 & INSN2_READ_GPR_MMN)
3426         {
3427           mask |= 1 << micromips_to_32_reg_m_map[EXTRACT_OPERAND (1, MM, *ip)];
3428           mask |= 1 << micromips_to_32_reg_n_map[EXTRACT_OPERAND (1, MN, *ip)];
3429         }
3430       if (pinfo2 & INSN2_READ_GPR_MP)
3431         mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3432       if (pinfo2 & INSN2_READ_GPR_MQ)
3433         mask |= 1 << micromips_to_32_reg_q_map[EXTRACT_OPERAND (1, MQ, *ip)];
3434     }
3435   /* Don't include register 0.  */
3436   return mask & ~1;
3437 }
3438
3439 /* Return the mask of core registers that IP writes.  */
3440
3441 static unsigned int
3442 gpr_write_mask (const struct mips_cl_insn *ip)
3443 {
3444   unsigned long pinfo, pinfo2;
3445   unsigned int mask;
3446
3447   mask = gpr_mod_mask (ip);
3448   pinfo = ip->insn_mo->pinfo;
3449   pinfo2 = ip->insn_mo->pinfo2;
3450   if (mips_opts.mips16)
3451     {
3452       if (pinfo & MIPS16_INSN_WRITE_X)
3453         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
3454       if (pinfo & MIPS16_INSN_WRITE_Y)
3455         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
3456       if (pinfo & MIPS16_INSN_WRITE_Z)
3457         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RZ, *ip)];
3458       if (pinfo & MIPS16_INSN_WRITE_T)
3459         mask |= 1 << TREG;
3460       if (pinfo & MIPS16_INSN_WRITE_SP)
3461         mask |= 1 << SP;
3462       if (pinfo & MIPS16_INSN_WRITE_31)
3463         mask |= 1 << RA;
3464       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3465         mask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3466     }
3467   else
3468     {
3469       if (pinfo & INSN_WRITE_GPR_D)
3470         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
3471       if (pinfo & INSN_WRITE_GPR_T)
3472         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
3473       if (pinfo & INSN_WRITE_GPR_S)
3474         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
3475       if (pinfo & INSN_WRITE_GPR_31)
3476         mask |= 1 << RA;
3477       if (pinfo2 & INSN2_WRITE_GPR_Z)
3478         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3479     }
3480   if (mips_opts.micromips)
3481     {
3482       if (pinfo2 & INSN2_WRITE_GPR_MB)
3483         mask |= 1 << micromips_to_32_reg_b_map[EXTRACT_OPERAND (1, MB, *ip)];
3484       if (pinfo2 & INSN2_WRITE_GPR_MHI)
3485         {
3486           mask |= 1 << micromips_to_32_reg_h_map[EXTRACT_OPERAND (1, MH, *ip)];
3487           mask |= 1 << micromips_to_32_reg_i_map[EXTRACT_OPERAND (1, MI, *ip)];
3488         }
3489       if (pinfo2 & INSN2_WRITE_GPR_MJ)
3490         mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3491       if (pinfo2 & INSN2_WRITE_GPR_MP)
3492         mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3493     }
3494   /* Don't include register 0.  */
3495   return mask & ~1;
3496 }
3497
3498 /* Return the mask of floating-point registers that IP reads.  */
3499
3500 static unsigned int
3501 fpr_read_mask (const struct mips_cl_insn *ip)
3502 {
3503   unsigned long pinfo, pinfo2;
3504   unsigned int mask;
3505
3506   mask = 0;
3507   pinfo = ip->insn_mo->pinfo;
3508   pinfo2 = ip->insn_mo->pinfo2;
3509   if (!mips_opts.mips16)
3510     {
3511       if (pinfo2 & INSN2_READ_FPR_D)
3512         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3513       if (pinfo & INSN_READ_FPR_S)
3514         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3515       if (pinfo & INSN_READ_FPR_T)
3516         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3517       if (pinfo & INSN_READ_FPR_R)
3518         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FR, *ip);
3519       if (pinfo2 & INSN2_READ_FPR_Z)
3520         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3521     }
3522   /* Conservatively treat all operands to an FP_D instruction are doubles.
3523      (This is overly pessimistic for things like cvt.d.s.)  */
3524   if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3525     mask |= mask << 1;
3526   return mask;
3527 }
3528
3529 /* Return the mask of floating-point registers that IP writes.  */
3530
3531 static unsigned int
3532 fpr_write_mask (const struct mips_cl_insn *ip)
3533 {
3534   unsigned long pinfo, pinfo2;
3535   unsigned int mask;
3536
3537   mask = 0;
3538   pinfo = ip->insn_mo->pinfo;
3539   pinfo2 = ip->insn_mo->pinfo2;
3540   if (!mips_opts.mips16)
3541     {
3542       if (pinfo & INSN_WRITE_FPR_D)
3543         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3544       if (pinfo & INSN_WRITE_FPR_S)
3545         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3546       if (pinfo & INSN_WRITE_FPR_T)
3547         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3548       if (pinfo2 & INSN2_WRITE_FPR_Z)
3549         mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3550     }
3551   /* Conservatively treat all operands to an FP_D instruction are doubles.
3552      (This is overly pessimistic for things like cvt.s.d.)  */
3553   if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3554     mask |= mask << 1;
3555   return mask;
3556 }
3557
3558 /* Classify an instruction according to the FIX_VR4120_* enumeration.
3559    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
3560    by VR4120 errata.  */
3561
3562 static unsigned int
3563 classify_vr4120_insn (const char *name)
3564 {
3565   if (strncmp (name, "macc", 4) == 0)
3566     return FIX_VR4120_MACC;
3567   if (strncmp (name, "dmacc", 5) == 0)
3568     return FIX_VR4120_DMACC;
3569   if (strncmp (name, "mult", 4) == 0)
3570     return FIX_VR4120_MULT;
3571   if (strncmp (name, "dmult", 5) == 0)
3572     return FIX_VR4120_DMULT;
3573   if (strstr (name, "div"))
3574     return FIX_VR4120_DIV;
3575   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
3576     return FIX_VR4120_MTHILO;
3577   return NUM_FIX_VR4120_CLASSES;
3578 }
3579
3580 #define INSN_ERET  0x42000018
3581 #define INSN_DERET 0x4200001f
3582
3583 /* Return the number of instructions that must separate INSN1 and INSN2,
3584    where INSN1 is the earlier instruction.  Return the worst-case value
3585    for any INSN2 if INSN2 is null.  */
3586
3587 static unsigned int
3588 insns_between (const struct mips_cl_insn *insn1,
3589                const struct mips_cl_insn *insn2)
3590 {
3591   unsigned long pinfo1, pinfo2;
3592   unsigned int mask;
3593
3594   /* This function needs to know which pinfo flags are set for INSN2
3595      and which registers INSN2 uses.  The former is stored in PINFO2 and
3596      the latter is tested via INSN2_USES_GPR.  If INSN2 is null, PINFO2
3597      will have every flag set and INSN2_USES_GPR will always return true.  */
3598   pinfo1 = insn1->insn_mo->pinfo;
3599   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
3600
3601 #define INSN2_USES_GPR(REG) \
3602   (insn2 == NULL || (gpr_read_mask (insn2) & (1U << (REG))) != 0)
3603
3604   /* For most targets, write-after-read dependencies on the HI and LO
3605      registers must be separated by at least two instructions.  */
3606   if (!hilo_interlocks)
3607     {
3608       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
3609         return 2;
3610       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
3611         return 2;
3612     }
3613
3614   /* If we're working around r7000 errata, there must be two instructions
3615      between an mfhi or mflo and any instruction that uses the result.  */
3616   if (mips_7000_hilo_fix
3617       && !mips_opts.micromips
3618       && MF_HILO_INSN (pinfo1)
3619       && INSN2_USES_GPR (EXTRACT_OPERAND (0, RD, *insn1)))
3620     return 2;
3621
3622   /* If we're working around 24K errata, one instruction is required
3623      if an ERET or DERET is followed by a branch instruction.  */
3624   if (mips_fix_24k && !mips_opts.micromips)
3625     {
3626       if (insn1->insn_opcode == INSN_ERET
3627           || insn1->insn_opcode == INSN_DERET)
3628         {
3629           if (insn2 == NULL
3630               || insn2->insn_opcode == INSN_ERET
3631               || insn2->insn_opcode == INSN_DERET
3632               || delayed_branch_p (insn2))
3633             return 1;
3634         }
3635     }
3636
3637   /* If working around VR4120 errata, check for combinations that need
3638      a single intervening instruction.  */
3639   if (mips_fix_vr4120 && !mips_opts.micromips)
3640     {
3641       unsigned int class1, class2;
3642
3643       class1 = classify_vr4120_insn (insn1->insn_mo->name);
3644       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
3645         {
3646           if (insn2 == NULL)
3647             return 1;
3648           class2 = classify_vr4120_insn (insn2->insn_mo->name);
3649           if (vr4120_conflicts[class1] & (1 << class2))
3650             return 1;
3651         }
3652     }
3653
3654   if (!HAVE_CODE_COMPRESSION)
3655     {
3656       /* Check for GPR or coprocessor load delays.  All such delays
3657          are on the RT register.  */
3658       /* Itbl support may require additional care here.  */
3659       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
3660           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
3661         {
3662           know (pinfo1 & INSN_WRITE_GPR_T);
3663           if (INSN2_USES_GPR (EXTRACT_OPERAND (0, RT, *insn1)))
3664             return 1;
3665         }
3666
3667       /* Check for generic coprocessor hazards.
3668
3669          This case is not handled very well.  There is no special
3670          knowledge of CP0 handling, and the coprocessors other than
3671          the floating point unit are not distinguished at all.  */
3672       /* Itbl support may require additional care here. FIXME!
3673          Need to modify this to include knowledge about
3674          user specified delays!  */
3675       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
3676                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
3677         {
3678           /* Handle cases where INSN1 writes to a known general coprocessor
3679              register.  There must be a one instruction delay before INSN2
3680              if INSN2 reads that register, otherwise no delay is needed.  */
3681           mask = fpr_write_mask (insn1);
3682           if (mask != 0)
3683             {
3684               if (!insn2 || (mask & fpr_read_mask (insn2)) != 0)
3685                 return 1;
3686             }
3687           else
3688             {
3689               /* Read-after-write dependencies on the control registers
3690                  require a two-instruction gap.  */
3691               if ((pinfo1 & INSN_WRITE_COND_CODE)
3692                   && (pinfo2 & INSN_READ_COND_CODE))
3693                 return 2;
3694
3695               /* We don't know exactly what INSN1 does.  If INSN2 is
3696                  also a coprocessor instruction, assume there must be
3697                  a one instruction gap.  */
3698               if (pinfo2 & INSN_COP)
3699                 return 1;
3700             }
3701         }
3702
3703       /* Check for read-after-write dependencies on the coprocessor
3704          control registers in cases where INSN1 does not need a general
3705          coprocessor delay.  This means that INSN1 is a floating point
3706          comparison instruction.  */
3707       /* Itbl support may require additional care here.  */
3708       else if (!cop_interlocks
3709                && (pinfo1 & INSN_WRITE_COND_CODE)
3710                && (pinfo2 & INSN_READ_COND_CODE))
3711         return 1;
3712     }
3713
3714 #undef INSN2_USES_GPR
3715
3716   return 0;
3717 }
3718
3719 /* Return the number of nops that would be needed to work around the
3720    VR4130 mflo/mfhi errata if instruction INSN immediately followed
3721    the MAX_VR4130_NOPS instructions described by HIST.  Ignore hazards
3722    that are contained within the first IGNORE instructions of HIST.  */
3723
3724 static int
3725 nops_for_vr4130 (int ignore, const struct mips_cl_insn *hist,
3726                  const struct mips_cl_insn *insn)
3727 {
3728   int i, j;
3729   unsigned int mask;
3730
3731   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
3732      are not affected by the errata.  */
3733   if (insn != 0
3734       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
3735           || strcmp (insn->insn_mo->name, "mtlo") == 0
3736           || strcmp (insn->insn_mo->name, "mthi") == 0))
3737     return 0;
3738
3739   /* Search for the first MFLO or MFHI.  */
3740   for (i = 0; i < MAX_VR4130_NOPS; i++)
3741     if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
3742       {
3743         /* Extract the destination register.  */
3744         mask = gpr_write_mask (&hist[i]);
3745
3746         /* No nops are needed if INSN reads that register.  */
3747         if (insn != NULL && (gpr_read_mask (insn) & mask) != 0)
3748           return 0;
3749
3750         /* ...or if any of the intervening instructions do.  */
3751         for (j = 0; j < i; j++)
3752           if (gpr_read_mask (&hist[j]) & mask)
3753             return 0;
3754
3755         if (i >= ignore)
3756           return MAX_VR4130_NOPS - i;
3757       }
3758   return 0;
3759 }
3760
3761 #define BASE_REG_EQ(INSN1, INSN2)       \
3762   ((((INSN1) >> OP_SH_RS) & OP_MASK_RS) \
3763       == (((INSN2) >> OP_SH_RS) & OP_MASK_RS))
3764
3765 /* Return the minimum alignment for this store instruction.  */
3766
3767 static int
3768 fix_24k_align_to (const struct mips_opcode *mo)
3769 {
3770   if (strcmp (mo->name, "sh") == 0)
3771     return 2;
3772
3773   if (strcmp (mo->name, "swc1") == 0
3774       || strcmp (mo->name, "swc2") == 0
3775       || strcmp (mo->name, "sw") == 0
3776       || strcmp (mo->name, "sc") == 0
3777       || strcmp (mo->name, "s.s") == 0)
3778     return 4;
3779
3780   if (strcmp (mo->name, "sdc1") == 0
3781       || strcmp (mo->name, "sdc2") == 0
3782       || strcmp (mo->name, "s.d") == 0)
3783     return 8;
3784
3785   /* sb, swl, swr */
3786   return 1;
3787 }
3788
3789 struct fix_24k_store_info
3790   {
3791     /* Immediate offset, if any, for this store instruction.  */
3792     short off;
3793     /* Alignment required by this store instruction.  */
3794     int align_to;
3795     /* True for register offsets.  */
3796     int register_offset;
3797   };
3798
3799 /* Comparison function used by qsort.  */
3800
3801 static int
3802 fix_24k_sort (const void *a, const void *b)
3803 {
3804   const struct fix_24k_store_info *pos1 = a;
3805   const struct fix_24k_store_info *pos2 = b;
3806
3807   return (pos1->off - pos2->off);
3808 }
3809
3810 /* INSN is a store instruction.  Try to record the store information
3811    in STINFO.  Return false if the information isn't known.  */
3812
3813 static bfd_boolean
3814 fix_24k_record_store_info (struct fix_24k_store_info *stinfo,
3815                            const struct mips_cl_insn *insn)
3816 {
3817   /* The instruction must have a known offset.  */
3818   if (!insn->complete_p || !strstr (insn->insn_mo->args, "o("))
3819     return FALSE;
3820
3821   stinfo->off = (insn->insn_opcode >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE;
3822   stinfo->align_to = fix_24k_align_to (insn->insn_mo);
3823   return TRUE;
3824 }
3825
3826 /* Return the number of nops that would be needed to work around the 24k
3827    "lost data on stores during refill" errata if instruction INSN
3828    immediately followed the 2 instructions described by HIST.
3829    Ignore hazards that are contained within the first IGNORE
3830    instructions of HIST.
3831
3832    Problem: The FSB (fetch store buffer) acts as an intermediate buffer
3833    for the data cache refills and store data. The following describes
3834    the scenario where the store data could be lost.
3835
3836    * A data cache miss, due to either a load or a store, causing fill
3837      data to be supplied by the memory subsystem
3838    * The first three doublewords of fill data are returned and written
3839      into the cache
3840    * A sequence of four stores occurs in consecutive cycles around the
3841      final doubleword of the fill:
3842    * Store A
3843    * Store B
3844    * Store C
3845    * Zero, One or more instructions
3846    * Store D
3847
3848    The four stores A-D must be to different doublewords of the line that
3849    is being filled. The fourth instruction in the sequence above permits
3850    the fill of the final doubleword to be transferred from the FSB into
3851    the cache. In the sequence above, the stores may be either integer
3852    (sb, sh, sw, swr, swl, sc) or coprocessor (swc1/swc2, sdc1/sdc2,
3853    swxc1, sdxc1, suxc1) stores, as long as the four stores are to
3854    different doublewords on the line. If the floating point unit is
3855    running in 1:2 mode, it is not possible to create the sequence above
3856    using only floating point store instructions.
3857
3858    In this case, the cache line being filled is incorrectly marked
3859    invalid, thereby losing the data from any store to the line that
3860    occurs between the original miss and the completion of the five
3861    cycle sequence shown above.
3862
3863    The workarounds are:
3864
3865    * Run the data cache in write-through mode.
3866    * Insert a non-store instruction between
3867      Store A and Store B or Store B and Store C.  */
3868   
3869 static int
3870 nops_for_24k (int ignore, const struct mips_cl_insn *hist,
3871               const struct mips_cl_insn *insn)
3872 {
3873   struct fix_24k_store_info pos[3];
3874   int align, i, base_offset;
3875
3876   if (ignore >= 2)
3877     return 0;
3878
3879   /* If the previous instruction wasn't a store, there's nothing to
3880      worry about.  */
3881   if ((hist[0].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3882     return 0;
3883
3884   /* If the instructions after the previous one are unknown, we have
3885      to assume the worst.  */
3886   if (!insn)
3887     return 1;
3888
3889   /* Check whether we are dealing with three consecutive stores.  */
3890   if ((insn->insn_mo->pinfo & INSN_STORE_MEMORY) == 0
3891       || (hist[1].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3892     return 0;
3893
3894   /* If we don't know the relationship between the store addresses,
3895      assume the worst.  */
3896   if (!BASE_REG_EQ (insn->insn_opcode, hist[0].insn_opcode)
3897       || !BASE_REG_EQ (insn->insn_opcode, hist[1].insn_opcode))
3898     return 1;
3899
3900   if (!fix_24k_record_store_info (&pos[0], insn)
3901       || !fix_24k_record_store_info (&pos[1], &hist[0])
3902       || !fix_24k_record_store_info (&pos[2], &hist[1]))
3903     return 1;
3904
3905   qsort (&pos, 3, sizeof (struct fix_24k_store_info), fix_24k_sort);
3906
3907   /* Pick a value of ALIGN and X such that all offsets are adjusted by
3908      X bytes and such that the base register + X is known to be aligned
3909      to align bytes.  */
3910
3911   if (((insn->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == SP)
3912     align = 8;
3913   else
3914     {
3915       align = pos[0].align_to;
3916       base_offset = pos[0].off;
3917       for (i = 1; i < 3; i++)
3918         if (align < pos[i].align_to)
3919           {
3920             align = pos[i].align_to;
3921             base_offset = pos[i].off;
3922           }
3923       for (i = 0; i < 3; i++)
3924         pos[i].off -= base_offset;
3925     }
3926
3927   pos[0].off &= ~align + 1;
3928   pos[1].off &= ~align + 1;
3929   pos[2].off &= ~align + 1;
3930
3931   /* If any two stores write to the same chunk, they also write to the
3932      same doubleword.  The offsets are still sorted at this point.  */
3933   if (pos[0].off == pos[1].off || pos[1].off == pos[2].off)
3934     return 0;
3935
3936   /* A range of at least 9 bytes is needed for the stores to be in
3937      non-overlapping doublewords.  */
3938   if (pos[2].off - pos[0].off <= 8)
3939     return 0;
3940
3941   if (pos[2].off - pos[1].off >= 24
3942       || pos[1].off - pos[0].off >= 24
3943       || pos[2].off - pos[0].off >= 32)
3944     return 0;
3945
3946   return 1;
3947 }
3948
3949 /* Return the number of nops that would be needed if instruction INSN
3950    immediately followed the MAX_NOPS instructions given by HIST,
3951    where HIST[0] is the most recent instruction.  Ignore hazards
3952    between INSN and the first IGNORE instructions in HIST.
3953
3954    If INSN is null, return the worse-case number of nops for any
3955    instruction.  */
3956
3957 static int
3958 nops_for_insn (int ignore, const struct mips_cl_insn *hist,
3959                const struct mips_cl_insn *insn)
3960 {
3961   int i, nops, tmp_nops;
3962
3963   nops = 0;
3964   for (i = ignore; i < MAX_DELAY_NOPS; i++)
3965     {
3966       tmp_nops = insns_between (hist + i, insn) - i;
3967       if (tmp_nops > nops)
3968         nops = tmp_nops;
3969     }
3970
3971   if (mips_fix_vr4130 && !mips_opts.micromips)
3972     {
3973       tmp_nops = nops_for_vr4130 (ignore, hist, insn);
3974       if (tmp_nops > nops)
3975         nops = tmp_nops;
3976     }
3977
3978   if (mips_fix_24k && !mips_opts.micromips)
3979     {
3980       tmp_nops = nops_for_24k (ignore, hist, insn);
3981       if (tmp_nops > nops)
3982         nops = tmp_nops;
3983     }
3984
3985   return nops;
3986 }
3987
3988 /* The variable arguments provide NUM_INSNS extra instructions that
3989    might be added to HIST.  Return the largest number of nops that
3990    would be needed after the extended sequence, ignoring hazards
3991    in the first IGNORE instructions.  */
3992
3993 static int
3994 nops_for_sequence (int num_insns, int ignore,
3995                    const struct mips_cl_insn *hist, ...)
3996 {
3997   va_list args;
3998   struct mips_cl_insn buffer[MAX_NOPS];
3999   struct mips_cl_insn *cursor;
4000   int nops;
4001
4002   va_start (args, hist);
4003   cursor = buffer + num_insns;
4004   memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
4005   while (cursor > buffer)
4006     *--cursor = *va_arg (args, const struct mips_cl_insn *);
4007
4008   nops = nops_for_insn (ignore, buffer, NULL);
4009   va_end (args);
4010   return nops;
4011 }
4012
4013 /* Like nops_for_insn, but if INSN is a branch, take into account the
4014    worst-case delay for the branch target.  */
4015
4016 static int
4017 nops_for_insn_or_target (int ignore, const struct mips_cl_insn *hist,
4018                          const struct mips_cl_insn *insn)
4019 {
4020   int nops, tmp_nops;
4021
4022   nops = nops_for_insn (ignore, hist, insn);
4023   if (delayed_branch_p (insn))
4024     {
4025       tmp_nops = nops_for_sequence (2, ignore ? ignore + 2 : 0,
4026                                     hist, insn, get_delay_slot_nop (insn));
4027       if (tmp_nops > nops)
4028         nops = tmp_nops;
4029     }
4030   else if (compact_branch_p (insn))
4031     {
4032       tmp_nops = nops_for_sequence (1, ignore ? ignore + 1 : 0, hist, insn);
4033       if (tmp_nops > nops)
4034         nops = tmp_nops;
4035     }
4036   return nops;
4037 }
4038
4039 /* Fix NOP issue: Replace nops by "or at,at,zero".  */
4040
4041 static void
4042 fix_loongson2f_nop (struct mips_cl_insn * ip)
4043 {
4044   gas_assert (!HAVE_CODE_COMPRESSION);
4045   if (strcmp (ip->insn_mo->name, "nop") == 0)
4046     ip->insn_opcode = LOONGSON2F_NOP_INSN;
4047 }
4048
4049 /* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
4050                    jr target pc &= 'hffff_ffff_cfff_ffff.  */
4051
4052 static void
4053 fix_loongson2f_jump (struct mips_cl_insn * ip)
4054 {
4055   gas_assert (!HAVE_CODE_COMPRESSION);
4056   if (strcmp (ip->insn_mo->name, "j") == 0
4057       || strcmp (ip->insn_mo->name, "jr") == 0
4058       || strcmp (ip->insn_mo->name, "jalr") == 0)
4059     {
4060       int sreg;
4061       expressionS ep;
4062
4063       if (! mips_opts.at)
4064         return;
4065
4066       sreg = EXTRACT_OPERAND (0, RS, *ip);
4067       if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
4068         return;
4069
4070       ep.X_op = O_constant;
4071       ep.X_add_number = 0xcfff0000;
4072       macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
4073       ep.X_add_number = 0xffff;
4074       macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
4075       macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
4076     }
4077 }
4078
4079 static void
4080 fix_loongson2f (struct mips_cl_insn * ip)
4081 {
4082   if (mips_fix_loongson2f_nop)
4083     fix_loongson2f_nop (ip);
4084
4085   if (mips_fix_loongson2f_jump)
4086     fix_loongson2f_jump (ip);
4087 }
4088
4089 /* IP is a branch that has a delay slot, and we need to fill it
4090    automatically.   Return true if we can do that by swapping IP
4091    with the previous instruction.
4092    ADDRESS_EXPR is an operand of the instruction to be used with
4093    RELOC_TYPE.  */
4094
4095 static bfd_boolean
4096 can_swap_branch_p (struct mips_cl_insn *ip, expressionS *address_expr,
4097   bfd_reloc_code_real_type *reloc_type)
4098 {
4099   unsigned long pinfo, pinfo2, prev_pinfo, prev_pinfo2;
4100   unsigned int gpr_read, gpr_write, prev_gpr_read, prev_gpr_write;
4101
4102   /* -O2 and above is required for this optimization.  */
4103   if (mips_optimize < 2)
4104     return FALSE;
4105
4106   /* If we have seen .set volatile or .set nomove, don't optimize.  */
4107   if (mips_opts.nomove)
4108     return FALSE;
4109
4110   /* We can't swap if the previous instruction's position is fixed.  */
4111   if (history[0].fixed_p)
4112     return FALSE;
4113
4114   /* If the previous previous insn was in a .set noreorder, we can't
4115      swap.  Actually, the MIPS assembler will swap in this situation.
4116      However, gcc configured -with-gnu-as will generate code like
4117
4118         .set    noreorder
4119         lw      $4,XXX
4120         .set    reorder
4121         INSN
4122         bne     $4,$0,foo
4123
4124      in which we can not swap the bne and INSN.  If gcc is not configured
4125      -with-gnu-as, it does not output the .set pseudo-ops.  */
4126   if (history[1].noreorder_p)
4127     return FALSE;
4128
4129   /* If the previous instruction had a fixup in mips16 mode, we can not swap.
4130      This means that the previous instruction was a 4-byte one anyhow.  */
4131   if (mips_opts.mips16 && history[0].fixp[0])
4132     return FALSE;
4133
4134   /* If the branch is itself the target of a branch, we can not swap.
4135      We cheat on this; all we check for is whether there is a label on
4136      this instruction.  If there are any branches to anything other than
4137      a label, users must use .set noreorder.  */
4138   if (seg_info (now_seg)->label_list)
4139     return FALSE;
4140
4141   /* If the previous instruction is in a variant frag other than this
4142      branch's one, we cannot do the swap.  This does not apply to
4143      MIPS16 code, which uses variant frags for different purposes.  */
4144   if (!mips_opts.mips16
4145       && history[0].frag
4146       && history[0].frag->fr_type == rs_machine_dependent)
4147     return FALSE;
4148
4149   /* We do not swap with instructions that cannot architecturally
4150      be placed in a branch delay slot, such as SYNC or ERET.  We
4151      also refrain from swapping with a trap instruction, since it
4152      complicates trap handlers to have the trap instruction be in
4153      a delay slot.  */
4154   prev_pinfo = history[0].insn_mo->pinfo;
4155   if (prev_pinfo & INSN_NO_DELAY_SLOT)
4156     return FALSE;
4157
4158   /* Check for conflicts between the branch and the instructions
4159      before the candidate delay slot.  */
4160   if (nops_for_insn (0, history + 1, ip) > 0)
4161     return FALSE;
4162
4163   /* Check for conflicts between the swapped sequence and the
4164      target of the branch.  */
4165   if (nops_for_sequence (2, 0, history + 1, ip, history) > 0)
4166     return FALSE;
4167
4168   /* If the branch reads a register that the previous
4169      instruction sets, we can not swap.  */
4170   gpr_read = gpr_read_mask (ip);
4171   prev_gpr_write = gpr_write_mask (&history[0]);
4172   if (gpr_read & prev_gpr_write)
4173     return FALSE;
4174
4175   /* If the branch writes a register that the previous
4176      instruction sets, we can not swap.  */
4177   gpr_write = gpr_write_mask (ip);
4178   if (gpr_write & prev_gpr_write)
4179     return FALSE;
4180
4181   /* If the branch writes a register that the previous
4182      instruction reads, we can not swap.  */
4183   prev_gpr_read = gpr_read_mask (&history[0]);
4184   if (gpr_write & prev_gpr_read)
4185     return FALSE;
4186
4187   /* If one instruction sets a condition code and the
4188      other one uses a condition code, we can not swap.  */
4189   pinfo = ip->insn_mo->pinfo;
4190   if ((pinfo & INSN_READ_COND_CODE)
4191       && (prev_pinfo & INSN_WRITE_COND_CODE))
4192     return FALSE;
4193   if ((pinfo & INSN_WRITE_COND_CODE)
4194       && (prev_pinfo & INSN_READ_COND_CODE))
4195     return FALSE;
4196
4197   /* If the previous instruction uses the PC, we can not swap.  */
4198   prev_pinfo2 = history[0].insn_mo->pinfo2;
4199   if (mips_opts.mips16 && (prev_pinfo & MIPS16_INSN_READ_PC))
4200     return FALSE;
4201   if (mips_opts.micromips && (prev_pinfo2 & INSN2_READ_PC))
4202     return FALSE;
4203
4204   /* If the previous instruction has an incorrect size for a fixed
4205      branch delay slot in microMIPS mode, we cannot swap.  */
4206   pinfo2 = ip->insn_mo->pinfo2;
4207   if (mips_opts.micromips
4208       && (pinfo2 & INSN2_BRANCH_DELAY_16BIT)
4209       && insn_length (history) != 2)
4210     return FALSE;
4211   if (mips_opts.micromips
4212       && (pinfo2 & INSN2_BRANCH_DELAY_32BIT)
4213       && insn_length (history) != 4)
4214     return FALSE;
4215
4216   /* On R5900 short loops need to be fixed by inserting a nop in
4217      the branch delay slots.
4218      A short loop can be terminated too early.  */
4219   if (mips_opts.arch == CPU_R5900
4220       /* Check if instruction has a parameter, ignore "j $31". */
4221       && (address_expr != NULL)
4222       /* Parameter must be 16 bit. */
4223       && (*reloc_type == BFD_RELOC_16_PCREL_S2)
4224       /* Branch to same segment. */
4225       && (S_GET_SEGMENT(address_expr->X_add_symbol) == now_seg)
4226       /* Branch to same code fragment. */
4227       && (symbol_get_frag(address_expr->X_add_symbol) == frag_now)
4228       /* Can only calculate branch offset if value is known. */
4229       && symbol_constant_p(address_expr->X_add_symbol)
4230       /* Check if branch is really conditional. */
4231       && !((ip->insn_opcode & 0xffff0000) == 0x10000000   /* beq $0,$0 */
4232         || (ip->insn_opcode & 0xffff0000) == 0x04010000   /* bgez $0 */
4233         || (ip->insn_opcode & 0xffff0000) == 0x04110000)) /* bgezal $0 */
4234     {
4235       int distance;
4236       /* Check if loop is shorter than 6 instructions including
4237          branch and delay slot.  */
4238       distance = frag_now_fix() - S_GET_VALUE(address_expr->X_add_symbol);
4239       if (distance <= 20)
4240         {
4241           int i;
4242           int rv;
4243
4244           rv = FALSE;
4245           /* When the loop includes branches or jumps,
4246              it is not a short loop. */
4247           for (i = 0; i < (distance / 4); i++)
4248             {
4249               if ((history[i].cleared_p)
4250                   || delayed_branch_p(&history[i]))
4251                 {
4252                   rv = TRUE;
4253                   break;
4254                 }
4255             }
4256           if (rv == FALSE)
4257             {
4258               /* Insert nop after branch to fix short loop. */
4259               return FALSE;
4260             }
4261         }
4262     }
4263
4264   return TRUE;
4265 }
4266
4267 /* Decide how we should add IP to the instruction stream.
4268    ADDRESS_EXPR is an operand of the instruction to be used with
4269    RELOC_TYPE.  */
4270
4271 static enum append_method
4272 get_append_method (struct mips_cl_insn *ip, expressionS *address_expr,
4273   bfd_reloc_code_real_type *reloc_type)
4274 {
4275   unsigned long pinfo;
4276
4277   /* The relaxed version of a macro sequence must be inherently
4278      hazard-free.  */
4279   if (mips_relax.sequence == 2)
4280     return APPEND_ADD;
4281
4282   /* We must not dabble with instructions in a ".set norerorder" block.  */
4283   if (mips_opts.noreorder)
4284     return APPEND_ADD;
4285
4286   /* Otherwise, it's our responsibility to fill branch delay slots.  */
4287   if (delayed_branch_p (ip))
4288     {
4289       if (!branch_likely_p (ip)
4290           && can_swap_branch_p (ip, address_expr, reloc_type))
4291         return APPEND_SWAP;
4292
4293       pinfo = ip->insn_mo->pinfo;
4294       if (mips_opts.mips16
4295           && ISA_SUPPORTS_MIPS16E
4296           && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31)))
4297         return APPEND_ADD_COMPACT;
4298
4299       return APPEND_ADD_WITH_NOP;
4300     }
4301
4302   return APPEND_ADD;
4303 }
4304
4305 /* IP is a MIPS16 instruction whose opcode we have just changed.
4306    Point IP->insn_mo to the new opcode's definition.  */
4307
4308 static void
4309 find_altered_mips16_opcode (struct mips_cl_insn *ip)
4310 {
4311   const struct mips_opcode *mo, *end;
4312
4313   end = &mips16_opcodes[bfd_mips16_num_opcodes];
4314   for (mo = ip->insn_mo; mo < end; mo++)
4315     if ((ip->insn_opcode & mo->mask) == mo->match)
4316       {
4317         ip->insn_mo = mo;
4318         return;
4319       }
4320   abort ();
4321 }
4322
4323 /* For microMIPS macros, we need to generate a local number label
4324    as the target of branches.  */
4325 #define MICROMIPS_LABEL_CHAR            '\037'
4326 static unsigned long micromips_target_label;
4327 static char micromips_target_name[32];
4328
4329 static char *
4330 micromips_label_name (void)
4331 {
4332   char *p = micromips_target_name;
4333   char symbol_name_temporary[24];
4334   unsigned long l;
4335   int i;
4336
4337   if (*p)
4338     return p;
4339
4340   i = 0;
4341   l = micromips_target_label;
4342 #ifdef LOCAL_LABEL_PREFIX
4343   *p++ = LOCAL_LABEL_PREFIX;
4344 #endif
4345   *p++ = 'L';
4346   *p++ = MICROMIPS_LABEL_CHAR;
4347   do
4348     {
4349       symbol_name_temporary[i++] = l % 10 + '0';
4350       l /= 10;
4351     }
4352   while (l != 0);
4353   while (i > 0)
4354     *p++ = symbol_name_temporary[--i];
4355   *p = '\0';
4356
4357   return micromips_target_name;
4358 }
4359
4360 static void
4361 micromips_label_expr (expressionS *label_expr)
4362 {
4363   label_expr->X_op = O_symbol;
4364   label_expr->X_add_symbol = symbol_find_or_make (micromips_label_name ());
4365   label_expr->X_add_number = 0;
4366 }
4367
4368 static void
4369 micromips_label_inc (void)
4370 {
4371   micromips_target_label++;
4372   *micromips_target_name = '\0';
4373 }
4374
4375 static void
4376 micromips_add_label (void)
4377 {
4378   symbolS *s;
4379
4380   s = colon (micromips_label_name ());
4381   micromips_label_inc ();
4382   S_SET_OTHER (s, ELF_ST_SET_MICROMIPS (S_GET_OTHER (s)));
4383 }
4384
4385 /* If assembling microMIPS code, then return the microMIPS reloc
4386    corresponding to the requested one if any.  Otherwise return
4387    the reloc unchanged.  */
4388
4389 static bfd_reloc_code_real_type
4390 micromips_map_reloc (bfd_reloc_code_real_type reloc)
4391 {
4392   static const bfd_reloc_code_real_type relocs[][2] =
4393     {
4394       /* Keep sorted incrementally by the left-hand key.  */
4395       { BFD_RELOC_16_PCREL_S2, BFD_RELOC_MICROMIPS_16_PCREL_S1 },
4396       { BFD_RELOC_GPREL16, BFD_RELOC_MICROMIPS_GPREL16 },
4397       { BFD_RELOC_MIPS_JMP, BFD_RELOC_MICROMIPS_JMP },
4398       { BFD_RELOC_HI16, BFD_RELOC_MICROMIPS_HI16 },
4399       { BFD_RELOC_HI16_S, BFD_RELOC_MICROMIPS_HI16_S },
4400       { BFD_RELOC_LO16, BFD_RELOC_MICROMIPS_LO16 },
4401       { BFD_RELOC_MIPS_LITERAL, BFD_RELOC_MICROMIPS_LITERAL },
4402       { BFD_RELOC_MIPS_GOT16, BFD_RELOC_MICROMIPS_GOT16 },
4403       { BFD_RELOC_MIPS_CALL16, BFD_RELOC_MICROMIPS_CALL16 },
4404       { BFD_RELOC_MIPS_GOT_HI16, BFD_RELOC_MICROMIPS_GOT_HI16 },
4405       { BFD_RELOC_MIPS_GOT_LO16, BFD_RELOC_MICROMIPS_GOT_LO16 },
4406       { BFD_RELOC_MIPS_CALL_HI16, BFD_RELOC_MICROMIPS_CALL_HI16 },
4407       { BFD_RELOC_MIPS_CALL_LO16, BFD_RELOC_MICROMIPS_CALL_LO16 },
4408       { BFD_RELOC_MIPS_SUB, BFD_RELOC_MICROMIPS_SUB },
4409       { BFD_RELOC_MIPS_GOT_PAGE, BFD_RELOC_MICROMIPS_GOT_PAGE },
4410       { BFD_RELOC_MIPS_GOT_OFST, BFD_RELOC_MICROMIPS_GOT_OFST },
4411       { BFD_RELOC_MIPS_GOT_DISP, BFD_RELOC_MICROMIPS_GOT_DISP },
4412       { BFD_RELOC_MIPS_HIGHEST, BFD_RELOC_MICROMIPS_HIGHEST },
4413       { BFD_RELOC_MIPS_HIGHER, BFD_RELOC_MICROMIPS_HIGHER },
4414       { BFD_RELOC_MIPS_SCN_DISP, BFD_RELOC_MICROMIPS_SCN_DISP },
4415       { BFD_RELOC_MIPS_TLS_GD, BFD_RELOC_MICROMIPS_TLS_GD },
4416       { BFD_RELOC_MIPS_TLS_LDM, BFD_RELOC_MICROMIPS_TLS_LDM },
4417       { BFD_RELOC_MIPS_TLS_DTPREL_HI16, BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16 },
4418       { BFD_RELOC_MIPS_TLS_DTPREL_LO16, BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16 },
4419       { BFD_RELOC_MIPS_TLS_GOTTPREL, BFD_RELOC_MICROMIPS_TLS_GOTTPREL },
4420       { BFD_RELOC_MIPS_TLS_TPREL_HI16, BFD_RELOC_MICROMIPS_TLS_TPREL_HI16 },
4421       { BFD_RELOC_MIPS_TLS_TPREL_LO16, BFD_RELOC_MICROMIPS_TLS_TPREL_LO16 }
4422     };
4423   bfd_reloc_code_real_type r;
4424   size_t i;
4425
4426   if (!mips_opts.micromips)
4427     return reloc;
4428   for (i = 0; i < ARRAY_SIZE (relocs); i++)
4429     {
4430       r = relocs[i][0];
4431       if (r > reloc)
4432         return reloc;
4433       if (r == reloc)
4434         return relocs[i][1];
4435     }
4436   return reloc;
4437 }
4438
4439 /* Try to resolve relocation RELOC against constant OPERAND at assembly time.
4440    Return true on success, storing the resolved value in RESULT.  */
4441
4442 static bfd_boolean
4443 calculate_reloc (bfd_reloc_code_real_type reloc, offsetT operand,
4444                  offsetT *result)
4445 {
4446   switch (reloc)
4447     {
4448     case BFD_RELOC_MIPS_HIGHEST:
4449     case BFD_RELOC_MICROMIPS_HIGHEST:
4450       *result = ((operand + 0x800080008000ull) >> 48) & 0xffff;
4451       return TRUE;
4452
4453     case BFD_RELOC_MIPS_HIGHER:
4454     case BFD_RELOC_MICROMIPS_HIGHER:
4455       *result = ((operand + 0x80008000ull) >> 32) & 0xffff;
4456       return TRUE;
4457
4458     case BFD_RELOC_HI16_S:
4459     case BFD_RELOC_MICROMIPS_HI16_S:
4460     case BFD_RELOC_MIPS16_HI16_S:
4461       *result = ((operand + 0x8000) >> 16) & 0xffff;
4462       return TRUE;
4463
4464     case BFD_RELOC_HI16:
4465     case BFD_RELOC_MICROMIPS_HI16:
4466     case BFD_RELOC_MIPS16_HI16:
4467       *result = (operand >> 16) & 0xffff;
4468       return TRUE;
4469
4470     case BFD_RELOC_LO16:
4471     case BFD_RELOC_MICROMIPS_LO16:
4472     case BFD_RELOC_MIPS16_LO16:
4473       *result = operand & 0xffff;
4474       return TRUE;
4475
4476     case BFD_RELOC_UNUSED:
4477       *result = operand;
4478       return TRUE;
4479
4480     default:
4481       return FALSE;
4482     }
4483 }
4484
4485 /* Output an instruction.  IP is the instruction information.
4486    ADDRESS_EXPR is an operand of the instruction to be used with
4487    RELOC_TYPE.  EXPANSIONP is true if the instruction is part of
4488    a macro expansion.  */
4489
4490 static void
4491 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
4492              bfd_reloc_code_real_type *reloc_type, bfd_boolean expansionp)
4493 {
4494   unsigned long prev_pinfo2, pinfo;
4495   bfd_boolean relaxed_branch = FALSE;
4496   enum append_method method;
4497   bfd_boolean relax32;
4498   int branch_disp;
4499
4500   if (mips_fix_loongson2f && !HAVE_CODE_COMPRESSION)
4501     fix_loongson2f (ip);
4502
4503   file_ase_mips16 |= mips_opts.mips16;
4504   file_ase_micromips |= mips_opts.micromips;
4505
4506   prev_pinfo2 = history[0].insn_mo->pinfo2;
4507   pinfo = ip->insn_mo->pinfo;
4508
4509   if (mips_opts.micromips
4510       && !expansionp
4511       && (((prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
4512            && micromips_insn_length (ip->insn_mo) != 2)
4513           || ((prev_pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
4514               && micromips_insn_length (ip->insn_mo) != 4)))
4515     as_warn (_("Wrong size instruction in a %u-bit branch delay slot"),
4516              (prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0 ? 16 : 32);
4517
4518   if (address_expr == NULL)
4519     ip->complete_p = 1;
4520   else if (reloc_type[0] <= BFD_RELOC_UNUSED
4521            && reloc_type[1] == BFD_RELOC_UNUSED
4522            && reloc_type[2] == BFD_RELOC_UNUSED
4523            && address_expr->X_op == O_constant)
4524     {
4525       switch (*reloc_type)
4526         {
4527         case BFD_RELOC_MIPS_JMP:
4528           {
4529             int shift;
4530
4531             shift = mips_opts.micromips ? 1 : 2;
4532             if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4533               as_bad (_("jump to misaligned address (0x%lx)"),
4534                       (unsigned long) address_expr->X_add_number);
4535             ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4536                                 & 0x3ffffff);
4537             ip->complete_p = 1;
4538           }
4539           break;
4540
4541         case BFD_RELOC_MIPS16_JMP:
4542           if ((address_expr->X_add_number & 3) != 0)
4543             as_bad (_("jump to misaligned address (0x%lx)"),
4544                     (unsigned long) address_expr->X_add_number);
4545           ip->insn_opcode |=
4546             (((address_expr->X_add_number & 0x7c0000) << 3)
4547                | ((address_expr->X_add_number & 0xf800000) >> 7)
4548                | ((address_expr->X_add_number & 0x3fffc) >> 2));
4549           ip->complete_p = 1;
4550           break;
4551
4552         case BFD_RELOC_16_PCREL_S2:
4553           {
4554             int shift;
4555
4556             shift = mips_opts.micromips ? 1 : 2;
4557             if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4558               as_bad (_("branch to misaligned address (0x%lx)"),
4559                       (unsigned long) address_expr->X_add_number);
4560             if (!mips_relax_branch)
4561               {
4562                 if ((address_expr->X_add_number + (1 << (shift + 15)))
4563                     & ~((1 << (shift + 16)) - 1))
4564                   as_bad (_("branch address range overflow (0x%lx)"),
4565                           (unsigned long) address_expr->X_add_number);
4566                 ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4567                                     & 0xffff);
4568               }
4569           }
4570           break;
4571
4572         default:
4573           {
4574             offsetT value;
4575
4576             if (calculate_reloc (*reloc_type, address_expr->X_add_number,
4577                                  &value))
4578               {
4579                 ip->insn_opcode |= value & 0xffff;
4580                 ip->complete_p = 1;
4581               }
4582           }
4583           break;
4584         }
4585     }
4586
4587   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
4588     {
4589       /* There are a lot of optimizations we could do that we don't.
4590          In particular, we do not, in general, reorder instructions.
4591          If you use gcc with optimization, it will reorder
4592          instructions and generally do much more optimization then we
4593          do here; repeating all that work in the assembler would only
4594          benefit hand written assembly code, and does not seem worth
4595          it.  */
4596       int nops = (mips_optimize == 0
4597                   ? nops_for_insn (0, history, NULL)
4598                   : nops_for_insn_or_target (0, history, ip));
4599       if (nops > 0)
4600         {
4601           fragS *old_frag;
4602           unsigned long old_frag_offset;
4603           int i;
4604
4605           old_frag = frag_now;
4606           old_frag_offset = frag_now_fix ();
4607
4608           for (i = 0; i < nops; i++)
4609             add_fixed_insn (NOP_INSN);
4610           insert_into_history (0, nops, NOP_INSN);
4611
4612           if (listing)
4613             {
4614               listing_prev_line ();
4615               /* We may be at the start of a variant frag.  In case we
4616                  are, make sure there is enough space for the frag
4617                  after the frags created by listing_prev_line.  The
4618                  argument to frag_grow here must be at least as large
4619                  as the argument to all other calls to frag_grow in
4620                  this file.  We don't have to worry about being in the
4621                  middle of a variant frag, because the variants insert
4622                  all needed nop instructions themselves.  */
4623               frag_grow (40);
4624             }
4625
4626           mips_move_text_labels ();
4627
4628 #ifndef NO_ECOFF_DEBUGGING
4629           if (ECOFF_DEBUGGING)
4630             ecoff_fix_loc (old_frag, old_frag_offset);
4631 #endif
4632         }
4633     }
4634   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
4635     {
4636       int nops;
4637
4638       /* Work out how many nops in prev_nop_frag are needed by IP,
4639          ignoring hazards generated by the first prev_nop_frag_since
4640          instructions.  */
4641       nops = nops_for_insn_or_target (prev_nop_frag_since, history, ip);
4642       gas_assert (nops <= prev_nop_frag_holds);
4643
4644       /* Enforce NOPS as a minimum.  */
4645       if (nops > prev_nop_frag_required)
4646         prev_nop_frag_required = nops;
4647
4648       if (prev_nop_frag_holds == prev_nop_frag_required)
4649         {
4650           /* Settle for the current number of nops.  Update the history
4651              accordingly (for the benefit of any future .set reorder code).  */
4652           prev_nop_frag = NULL;
4653           insert_into_history (prev_nop_frag_since,
4654                                prev_nop_frag_holds, NOP_INSN);
4655         }
4656       else
4657         {
4658           /* Allow this instruction to replace one of the nops that was
4659              tentatively added to prev_nop_frag.  */
4660           prev_nop_frag->fr_fix -= NOP_INSN_SIZE;
4661           prev_nop_frag_holds--;
4662           prev_nop_frag_since++;
4663         }
4664     }
4665
4666   method = get_append_method (ip, address_expr, reloc_type);
4667   branch_disp = method == APPEND_SWAP ? insn_length (history) : 0;
4668
4669   dwarf2_emit_insn (0);
4670   /* We want MIPS16 and microMIPS debug info to use ISA-encoded addresses,
4671      so "move" the instruction address accordingly.
4672
4673      Also, it doesn't seem appropriate for the assembler to reorder .loc
4674      entries.  If this instruction is a branch that we are going to swap
4675      with the previous instruction, the two instructions should be
4676      treated as a unit, and the debug information for both instructions
4677      should refer to the start of the branch sequence.  Using the
4678      current position is certainly wrong when swapping a 32-bit branch
4679      and a 16-bit delay slot, since the current position would then be
4680      in the middle of a branch.  */
4681   dwarf2_move_insn ((HAVE_CODE_COMPRESSION ? 1 : 0) - branch_disp);
4682
4683   relax32 = (mips_relax_branch
4684              /* Don't try branch relaxation within .set nomacro, or within
4685                 .set noat if we use $at for PIC computations.  If it turns
4686                 out that the branch was out-of-range, we'll get an error.  */
4687              && !mips_opts.warn_about_macros
4688              && (mips_opts.at || mips_pic == NO_PIC)
4689              /* Don't relax BPOSGE32/64 or BC1ANY2T/F and BC1ANY4T/F
4690                 as they have no complementing branches.  */
4691              && !(ip->insn_mo->ase & (ASE_MIPS3D | ASE_DSP64 | ASE_DSP)));
4692
4693   if (!HAVE_CODE_COMPRESSION
4694       && address_expr
4695       && relax32
4696       && *reloc_type == BFD_RELOC_16_PCREL_S2
4697       && delayed_branch_p (ip))
4698     {
4699       relaxed_branch = TRUE;
4700       add_relaxed_insn (ip, (relaxed_branch_length
4701                              (NULL, NULL,
4702                               uncond_branch_p (ip) ? -1
4703                               : branch_likely_p (ip) ? 1
4704                               : 0)), 4,
4705                         RELAX_BRANCH_ENCODE
4706                         (AT,
4707                          uncond_branch_p (ip),
4708                          branch_likely_p (ip),
4709                          pinfo & INSN_WRITE_GPR_31,
4710                          0),
4711                         address_expr->X_add_symbol,
4712                         address_expr->X_add_number);
4713       *reloc_type = BFD_RELOC_UNUSED;
4714     }
4715   else if (mips_opts.micromips
4716            && address_expr
4717            && ((relax32 && *reloc_type == BFD_RELOC_16_PCREL_S2)
4718                || *reloc_type > BFD_RELOC_UNUSED)
4719            && (delayed_branch_p (ip) || compact_branch_p (ip))
4720            /* Don't try branch relaxation when users specify
4721               16-bit/32-bit instructions.  */
4722            && !forced_insn_length)
4723     {
4724       bfd_boolean relax16 = *reloc_type > BFD_RELOC_UNUSED;
4725       int type = relax16 ? *reloc_type - BFD_RELOC_UNUSED : 0;
4726       int uncond = uncond_branch_p (ip) ? -1 : 0;
4727       int compact = compact_branch_p (ip);
4728       int al = pinfo & INSN_WRITE_GPR_31;
4729       int length32;
4730
4731       gas_assert (address_expr != NULL);
4732       gas_assert (!mips_relax.sequence);
4733
4734       relaxed_branch = TRUE;
4735       length32 = relaxed_micromips_32bit_branch_length (NULL, NULL, uncond);
4736       add_relaxed_insn (ip, relax32 ? length32 : 4, relax16 ? 2 : 4,
4737                         RELAX_MICROMIPS_ENCODE (type, AT, uncond, compact, al,
4738                                                 relax32, 0, 0),
4739                         address_expr->X_add_symbol,
4740                         address_expr->X_add_number);
4741       *reloc_type = BFD_RELOC_UNUSED;
4742     }
4743   else if (mips_opts.mips16 && *reloc_type > BFD_RELOC_UNUSED)
4744     {
4745       /* We need to set up a variant frag.  */
4746       gas_assert (address_expr != NULL);
4747       add_relaxed_insn (ip, 4, 0,
4748                         RELAX_MIPS16_ENCODE
4749                         (*reloc_type - BFD_RELOC_UNUSED,
4750                          forced_insn_length == 2, forced_insn_length == 4,
4751                          delayed_branch_p (&history[0]),
4752                          history[0].mips16_absolute_jump_p),
4753                         make_expr_symbol (address_expr), 0);
4754     }
4755   else if (mips_opts.mips16 && insn_length (ip) == 2)
4756     {
4757       if (!delayed_branch_p (ip))
4758         /* Make sure there is enough room to swap this instruction with
4759            a following jump instruction.  */
4760         frag_grow (6);
4761       add_fixed_insn (ip);
4762     }
4763   else
4764     {
4765       if (mips_opts.mips16
4766           && mips_opts.noreorder
4767           && delayed_branch_p (&history[0]))
4768         as_warn (_("extended instruction in delay slot"));
4769
4770       if (mips_relax.sequence)
4771         {
4772           /* If we've reached the end of this frag, turn it into a variant
4773              frag and record the information for the instructions we've
4774              written so far.  */
4775           if (frag_room () < 4)
4776             relax_close_frag ();
4777           mips_relax.sizes[mips_relax.sequence - 1] += insn_length (ip);
4778         }
4779
4780       if (mips_relax.sequence != 2)
4781         {
4782           if (mips_macro_warning.first_insn_sizes[0] == 0)
4783             mips_macro_warning.first_insn_sizes[0] = insn_length (ip);
4784           mips_macro_warning.sizes[0] += insn_length (ip);
4785           mips_macro_warning.insns[0]++;
4786         }
4787       if (mips_relax.sequence != 1)
4788         {
4789           if (mips_macro_warning.first_insn_sizes[1] == 0)
4790             mips_macro_warning.first_insn_sizes[1] = insn_length (ip);
4791           mips_macro_warning.sizes[1] += insn_length (ip);
4792           mips_macro_warning.insns[1]++;
4793         }
4794
4795       if (mips_opts.mips16)
4796         {
4797           ip->fixed_p = 1;
4798           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
4799         }
4800       add_fixed_insn (ip);
4801     }
4802
4803   if (!ip->complete_p && *reloc_type < BFD_RELOC_UNUSED)
4804     {
4805       bfd_reloc_code_real_type final_type[3];
4806       reloc_howto_type *howto0;
4807       reloc_howto_type *howto;
4808       int i;
4809
4810       /* Perform any necessary conversion to microMIPS relocations
4811          and find out how many relocations there actually are.  */
4812       for (i = 0; i < 3 && reloc_type[i] != BFD_RELOC_UNUSED; i++)
4813         final_type[i] = micromips_map_reloc (reloc_type[i]);
4814
4815       /* In a compound relocation, it is the final (outermost)
4816          operator that determines the relocated field.  */
4817       howto = howto0 = bfd_reloc_type_lookup (stdoutput, final_type[i - 1]);
4818       if (!howto)
4819         abort ();
4820
4821       if (i > 1)
4822         howto0 = bfd_reloc_type_lookup (stdoutput, final_type[0]);
4823       ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
4824                                  bfd_get_reloc_size (howto),
4825                                  address_expr,
4826                                  howto0 && howto0->pc_relative,
4827                                  final_type[0]);
4828
4829       /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
4830       if (final_type[0] == BFD_RELOC_MIPS16_JMP && ip->fixp[0]->fx_addsy)
4831         *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
4832
4833       /* These relocations can have an addend that won't fit in
4834          4 octets for 64bit assembly.  */
4835       if (HAVE_64BIT_GPRS
4836           && ! howto->partial_inplace
4837           && (reloc_type[0] == BFD_RELOC_16
4838               || reloc_type[0] == BFD_RELOC_32
4839               || reloc_type[0] == BFD_RELOC_MIPS_JMP
4840               || reloc_type[0] == BFD_RELOC_GPREL16
4841               || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
4842               || reloc_type[0] == BFD_RELOC_GPREL32
4843               || reloc_type[0] == BFD_RELOC_64
4844               || reloc_type[0] == BFD_RELOC_CTOR
4845               || reloc_type[0] == BFD_RELOC_MIPS_SUB
4846               || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
4847               || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
4848               || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
4849               || reloc_type[0] == BFD_RELOC_MIPS_REL16
4850               || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
4851               || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
4852               || hi16_reloc_p (reloc_type[0])
4853               || lo16_reloc_p (reloc_type[0])))
4854         ip->fixp[0]->fx_no_overflow = 1;
4855
4856       /* These relocations can have an addend that won't fit in 2 octets.  */
4857       if (reloc_type[0] == BFD_RELOC_MICROMIPS_7_PCREL_S1
4858           || reloc_type[0] == BFD_RELOC_MICROMIPS_10_PCREL_S1)
4859         ip->fixp[0]->fx_no_overflow = 1;
4860
4861       if (mips_relax.sequence)
4862         {
4863           if (mips_relax.first_fixup == 0)
4864             mips_relax.first_fixup = ip->fixp[0];
4865         }
4866       else if (reloc_needs_lo_p (*reloc_type))
4867         {
4868           struct mips_hi_fixup *hi_fixup;
4869
4870           /* Reuse the last entry if it already has a matching %lo.  */
4871           hi_fixup = mips_hi_fixup_list;
4872           if (hi_fixup == 0
4873               || !fixup_has_matching_lo_p (hi_fixup->fixp))
4874             {
4875               hi_fixup = ((struct mips_hi_fixup *)
4876                           xmalloc (sizeof (struct mips_hi_fixup)));
4877               hi_fixup->next = mips_hi_fixup_list;
4878               mips_hi_fixup_list = hi_fixup;
4879             }
4880           hi_fixup->fixp = ip->fixp[0];
4881           hi_fixup->seg = now_seg;
4882         }
4883
4884       /* Add fixups for the second and third relocations, if given.
4885          Note that the ABI allows the second relocation to be
4886          against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
4887          moment we only use RSS_UNDEF, but we could add support
4888          for the others if it ever becomes necessary.  */
4889       for (i = 1; i < 3; i++)
4890         if (reloc_type[i] != BFD_RELOC_UNUSED)
4891           {
4892             ip->fixp[i] = fix_new (ip->frag, ip->where,
4893                                    ip->fixp[0]->fx_size, NULL, 0,
4894                                    FALSE, final_type[i]);
4895
4896             /* Use fx_tcbit to mark compound relocs.  */
4897             ip->fixp[0]->fx_tcbit = 1;
4898             ip->fixp[i]->fx_tcbit = 1;
4899           }
4900     }
4901   install_insn (ip);
4902
4903   /* Update the register mask information.  */
4904   mips_gprmask |= gpr_read_mask (ip) | gpr_write_mask (ip);
4905   mips_cprmask[1] |= fpr_read_mask (ip) | fpr_write_mask (ip);
4906
4907   switch (method)
4908     {
4909     case APPEND_ADD:
4910       insert_into_history (0, 1, ip);
4911       break;
4912
4913     case APPEND_ADD_WITH_NOP:
4914       {
4915         struct mips_cl_insn *nop;
4916
4917         insert_into_history (0, 1, ip);
4918         nop = get_delay_slot_nop (ip);
4919         add_fixed_insn (nop);
4920         insert_into_history (0, 1, nop);
4921         if (mips_relax.sequence)
4922           mips_relax.sizes[mips_relax.sequence - 1] += insn_length (nop);
4923       }
4924       break;
4925
4926     case APPEND_ADD_COMPACT:
4927       /* Convert MIPS16 jr/jalr into a "compact" jump.  */
4928       gas_assert (mips_opts.mips16);
4929       ip->insn_opcode |= 0x0080;
4930       find_altered_mips16_opcode (ip);
4931       install_insn (ip);
4932       insert_into_history (0, 1, ip);
4933       break;
4934
4935     case APPEND_SWAP:
4936       {
4937         struct mips_cl_insn delay = history[0];
4938         if (mips_opts.mips16)
4939           {
4940             know (delay.frag == ip->frag);
4941             move_insn (ip, delay.frag, delay.where);
4942             move_insn (&delay, ip->frag, ip->where + insn_length (ip));
4943           }
4944         else if (relaxed_branch || delay.frag != ip->frag)
4945           {
4946             /* Add the delay slot instruction to the end of the
4947                current frag and shrink the fixed part of the
4948                original frag.  If the branch occupies the tail of
4949                the latter, move it backwards to cover the gap.  */
4950             delay.frag->fr_fix -= branch_disp;
4951             if (delay.frag == ip->frag)
4952               move_insn (ip, ip->frag, ip->where - branch_disp);
4953             add_fixed_insn (&delay);
4954           }
4955         else
4956           {
4957             move_insn (&delay, ip->frag,
4958                        ip->where - branch_disp + insn_length (ip));
4959             move_insn (ip, history[0].frag, history[0].where);
4960           }
4961         history[0] = *ip;
4962         delay.fixed_p = 1;
4963         insert_into_history (0, 1, &delay);
4964       }
4965       break;
4966     }
4967
4968   /* If we have just completed an unconditional branch, clear the history.  */
4969   if ((delayed_branch_p (&history[1]) && uncond_branch_p (&history[1]))
4970       || (compact_branch_p (&history[0]) && uncond_branch_p (&history[0])))
4971     {
4972       unsigned int i;
4973
4974       mips_no_prev_insn ();
4975
4976       for (i = 0; i < ARRAY_SIZE (history); i++)
4977         history[i].cleared_p = 1;
4978     }
4979
4980   /* We need to emit a label at the end of branch-likely macros.  */
4981   if (emit_branch_likely_macro)
4982     {
4983       emit_branch_likely_macro = FALSE;
4984       micromips_add_label ();
4985     }
4986
4987   /* We just output an insn, so the next one doesn't have a label.  */
4988   mips_clear_insn_labels ();
4989 }
4990
4991 /* Forget that there was any previous instruction or label.
4992    When BRANCH is true, the branch history is also flushed.  */
4993
4994 static void
4995 mips_no_prev_insn (void)
4996 {
4997   prev_nop_frag = NULL;
4998   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
4999   mips_clear_insn_labels ();
5000 }
5001
5002 /* This function must be called before we emit something other than
5003    instructions.  It is like mips_no_prev_insn except that it inserts
5004    any NOPS that might be needed by previous instructions.  */
5005
5006 void
5007 mips_emit_delays (void)
5008 {
5009   if (! mips_opts.noreorder)
5010     {
5011       int nops = nops_for_insn (0, history, NULL);
5012       if (nops > 0)
5013         {
5014           while (nops-- > 0)
5015             add_fixed_insn (NOP_INSN);
5016           mips_move_text_labels ();
5017         }
5018     }
5019   mips_no_prev_insn ();
5020 }
5021
5022 /* Start a (possibly nested) noreorder block.  */
5023
5024 static void
5025 start_noreorder (void)
5026 {
5027   if (mips_opts.noreorder == 0)
5028     {
5029       unsigned int i;
5030       int nops;
5031
5032       /* None of the instructions before the .set noreorder can be moved.  */
5033       for (i = 0; i < ARRAY_SIZE (history); i++)
5034         history[i].fixed_p = 1;
5035
5036       /* Insert any nops that might be needed between the .set noreorder
5037          block and the previous instructions.  We will later remove any
5038          nops that turn out not to be needed.  */
5039       nops = nops_for_insn (0, history, NULL);
5040       if (nops > 0)
5041         {
5042           if (mips_optimize != 0)
5043             {
5044               /* Record the frag which holds the nop instructions, so
5045                  that we can remove them if we don't need them.  */
5046               frag_grow (nops * NOP_INSN_SIZE);
5047               prev_nop_frag = frag_now;
5048               prev_nop_frag_holds = nops;
5049               prev_nop_frag_required = 0;
5050               prev_nop_frag_since = 0;
5051             }
5052
5053           for (; nops > 0; --nops)
5054             add_fixed_insn (NOP_INSN);
5055
5056           /* Move on to a new frag, so that it is safe to simply
5057              decrease the size of prev_nop_frag.  */
5058           frag_wane (frag_now);
5059           frag_new (0);
5060           mips_move_text_labels ();
5061         }
5062       mips_mark_labels ();
5063       mips_clear_insn_labels ();
5064     }
5065   mips_opts.noreorder++;
5066   mips_any_noreorder = 1;
5067 }
5068
5069 /* End a nested noreorder block.  */
5070
5071 static void
5072 end_noreorder (void)
5073 {
5074   mips_opts.noreorder--;
5075   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
5076     {
5077       /* Commit to inserting prev_nop_frag_required nops and go back to
5078          handling nop insertion the .set reorder way.  */
5079       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
5080                                 * NOP_INSN_SIZE);
5081       insert_into_history (prev_nop_frag_since,
5082                            prev_nop_frag_required, NOP_INSN);
5083       prev_nop_frag = NULL;
5084     }
5085 }
5086
5087 /* Set up global variables for the start of a new macro.  */
5088
5089 static void
5090 macro_start (void)
5091 {
5092   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
5093   memset (&mips_macro_warning.first_insn_sizes, 0,
5094           sizeof (mips_macro_warning.first_insn_sizes));
5095   memset (&mips_macro_warning.insns, 0, sizeof (mips_macro_warning.insns));
5096   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
5097                                      && delayed_branch_p (&history[0]));
5098   switch (history[0].insn_mo->pinfo2
5099           & (INSN2_BRANCH_DELAY_32BIT | INSN2_BRANCH_DELAY_16BIT))
5100     {
5101     case INSN2_BRANCH_DELAY_32BIT:
5102       mips_macro_warning.delay_slot_length = 4;
5103       break;
5104     case INSN2_BRANCH_DELAY_16BIT:
5105       mips_macro_warning.delay_slot_length = 2;
5106       break;
5107     default:
5108       mips_macro_warning.delay_slot_length = 0;
5109       break;
5110     }
5111   mips_macro_warning.first_frag = NULL;
5112 }
5113
5114 /* Given that a macro is longer than one instruction or of the wrong size,
5115    return the appropriate warning for it.  Return null if no warning is
5116    needed.  SUBTYPE is a bitmask of RELAX_DELAY_SLOT, RELAX_DELAY_SLOT_16BIT,
5117    RELAX_DELAY_SLOT_SIZE_FIRST, RELAX_DELAY_SLOT_SIZE_SECOND,
5118    and RELAX_NOMACRO.  */
5119
5120 static const char *
5121 macro_warning (relax_substateT subtype)
5122 {
5123   if (subtype & RELAX_DELAY_SLOT)
5124     return _("Macro instruction expanded into multiple instructions"
5125              " in a branch delay slot");
5126   else if (subtype & RELAX_NOMACRO)
5127     return _("Macro instruction expanded into multiple instructions");
5128   else if (subtype & (RELAX_DELAY_SLOT_SIZE_FIRST
5129                       | RELAX_DELAY_SLOT_SIZE_SECOND))
5130     return ((subtype & RELAX_DELAY_SLOT_16BIT)
5131             ? _("Macro instruction expanded into a wrong size instruction"
5132                 " in a 16-bit branch delay slot")
5133             : _("Macro instruction expanded into a wrong size instruction"
5134                 " in a 32-bit branch delay slot"));
5135   else
5136     return 0;
5137 }
5138
5139 /* Finish up a macro.  Emit warnings as appropriate.  */
5140
5141 static void
5142 macro_end (void)
5143 {
5144   /* Relaxation warning flags.  */
5145   relax_substateT subtype = 0;
5146
5147   /* Check delay slot size requirements.  */
5148   if (mips_macro_warning.delay_slot_length == 2)
5149     subtype |= RELAX_DELAY_SLOT_16BIT;
5150   if (mips_macro_warning.delay_slot_length != 0)
5151     {
5152       if (mips_macro_warning.delay_slot_length
5153           != mips_macro_warning.first_insn_sizes[0])
5154         subtype |= RELAX_DELAY_SLOT_SIZE_FIRST;
5155       if (mips_macro_warning.delay_slot_length
5156           != mips_macro_warning.first_insn_sizes[1])
5157         subtype |= RELAX_DELAY_SLOT_SIZE_SECOND;
5158     }
5159
5160   /* Check instruction count requirements.  */
5161   if (mips_macro_warning.insns[0] > 1 || mips_macro_warning.insns[1] > 1)
5162     {
5163       if (mips_macro_warning.insns[1] > mips_macro_warning.insns[0])
5164         subtype |= RELAX_SECOND_LONGER;
5165       if (mips_opts.warn_about_macros)
5166         subtype |= RELAX_NOMACRO;
5167       if (mips_macro_warning.delay_slot_p)
5168         subtype |= RELAX_DELAY_SLOT;
5169     }
5170
5171   /* If both alternatives fail to fill a delay slot correctly,
5172      emit the warning now.  */
5173   if ((subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0
5174       && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0)
5175     {
5176       relax_substateT s;
5177       const char *msg;
5178
5179       s = subtype & (RELAX_DELAY_SLOT_16BIT
5180                      | RELAX_DELAY_SLOT_SIZE_FIRST
5181                      | RELAX_DELAY_SLOT_SIZE_SECOND);
5182       msg = macro_warning (s);
5183       if (msg != NULL)
5184         as_warn ("%s", msg);
5185       subtype &= ~s;
5186     }
5187
5188   /* If both implementations are longer than 1 instruction, then emit the
5189      warning now.  */
5190   if (mips_macro_warning.insns[0] > 1 && mips_macro_warning.insns[1] > 1)
5191     {
5192       relax_substateT s;
5193       const char *msg;
5194
5195       s = subtype & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT);
5196       msg = macro_warning (s);
5197       if (msg != NULL)
5198         as_warn ("%s", msg);
5199       subtype &= ~s;
5200     }
5201
5202   /* If any flags still set, then one implementation might need a warning
5203      and the other either will need one of a different kind or none at all.
5204      Pass any remaining flags over to relaxation.  */
5205   if (mips_macro_warning.first_frag != NULL)
5206     mips_macro_warning.first_frag->fr_subtype |= subtype;
5207 }
5208
5209 /* Instruction operand formats used in macros that vary between
5210    standard MIPS and microMIPS code.  */
5211
5212 static const char * const brk_fmt[2] = { "c", "mF" };
5213 static const char * const cop12_fmt[2] = { "E,o(b)", "E,~(b)" };
5214 static const char * const jalr_fmt[2] = { "d,s", "t,s" };
5215 static const char * const lui_fmt[2] = { "t,u", "s,u" };
5216 static const char * const mem12_fmt[2] = { "t,o(b)", "t,~(b)" };
5217 static const char * const mfhl_fmt[2] = { "d", "mj" };
5218 static const char * const shft_fmt[2] = { "d,w,<", "t,r,<" };
5219 static const char * const trap_fmt[2] = { "s,t,q", "s,t,|" };
5220
5221 #define BRK_FMT (brk_fmt[mips_opts.micromips])
5222 #define COP12_FMT (cop12_fmt[mips_opts.micromips])
5223 #define JALR_FMT (jalr_fmt[mips_opts.micromips])
5224 #define LUI_FMT (lui_fmt[mips_opts.micromips])
5225 #define MEM12_FMT (mem12_fmt[mips_opts.micromips])
5226 #define MFHL_FMT (mfhl_fmt[mips_opts.micromips])
5227 #define SHFT_FMT (shft_fmt[mips_opts.micromips])
5228 #define TRAP_FMT (trap_fmt[mips_opts.micromips])
5229
5230 /* Read a macro's relocation codes from *ARGS and store them in *R.
5231    The first argument in *ARGS will be either the code for a single
5232    relocation or -1 followed by the three codes that make up a
5233    composite relocation.  */
5234
5235 static void
5236 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
5237 {
5238   int i, next;
5239
5240   next = va_arg (*args, int);
5241   if (next >= 0)
5242     r[0] = (bfd_reloc_code_real_type) next;
5243   else
5244     for (i = 0; i < 3; i++)
5245       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
5246 }
5247
5248 /* Build an instruction created by a macro expansion.  This is passed
5249    a pointer to the count of instructions created so far, an
5250    expression, the name of the instruction to build, an operand format
5251    string, and corresponding arguments.  */
5252
5253 static void
5254 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
5255 {
5256   const struct mips_opcode *mo = NULL;
5257   bfd_reloc_code_real_type r[3];
5258   const struct mips_opcode *amo;
5259   struct hash_control *hash;
5260   struct mips_cl_insn insn;
5261   va_list args;
5262
5263   va_start (args, fmt);
5264
5265   if (mips_opts.mips16)
5266     {
5267       mips16_macro_build (ep, name, fmt, &args);
5268       va_end (args);
5269       return;
5270     }
5271
5272   r[0] = BFD_RELOC_UNUSED;
5273   r[1] = BFD_RELOC_UNUSED;
5274   r[2] = BFD_RELOC_UNUSED;
5275   hash = mips_opts.micromips ? micromips_op_hash : op_hash;
5276   amo = (struct mips_opcode *) hash_find (hash, name);
5277   gas_assert (amo);
5278   gas_assert (strcmp (name, amo->name) == 0);
5279
5280   do
5281     {
5282       /* Search until we get a match for NAME.  It is assumed here that
5283          macros will never generate MDMX, MIPS-3D, or MT instructions.
5284          We try to match an instruction that fulfils the branch delay
5285          slot instruction length requirement (if any) of the previous
5286          instruction.  While doing this we record the first instruction
5287          seen that matches all the other conditions and use it anyway
5288          if the requirement cannot be met; we will issue an appropriate
5289          warning later on.  */
5290       if (strcmp (fmt, amo->args) == 0
5291           && amo->pinfo != INSN_MACRO
5292           && is_opcode_valid (amo)
5293           && is_size_valid (amo))
5294         {
5295           if (is_delay_slot_valid (amo))
5296             {
5297               mo = amo;
5298               break;
5299             }
5300           else if (!mo)
5301             mo = amo;
5302         }
5303
5304       ++amo;
5305       gas_assert (amo->name);
5306     }
5307   while (strcmp (name, amo->name) == 0);
5308
5309   gas_assert (mo);
5310   create_insn (&insn, mo);
5311   for (;;)
5312     {
5313       switch (*fmt++)
5314         {
5315         case '\0':
5316           break;
5317
5318         case ',':
5319         case '(':
5320         case ')':
5321           continue;
5322
5323         case '+':
5324           switch (*fmt++)
5325             {
5326             case 'A':
5327             case 'E':
5328               INSERT_OPERAND (mips_opts.micromips,
5329                               EXTLSB, insn, va_arg (args, int));
5330               continue;
5331
5332             case 'B':
5333             case 'F':
5334               /* Note that in the macro case, these arguments are already
5335                  in MSB form.  (When handling the instruction in the
5336                  non-macro case, these arguments are sizes from which
5337                  MSB values must be calculated.)  */
5338               INSERT_OPERAND (mips_opts.micromips,
5339                               INSMSB, insn, va_arg (args, int));
5340               continue;
5341
5342             case 'J':
5343               gas_assert (!mips_opts.micromips);
5344               INSERT_OPERAND (0, CODE10, insn, va_arg (args, int));
5345               continue;
5346
5347             case 'C':
5348             case 'G':
5349             case 'H':
5350               /* Note that in the macro case, these arguments are already
5351                  in MSBD form.  (When handling the instruction in the
5352                  non-macro case, these arguments are sizes from which
5353                  MSBD values must be calculated.)  */
5354               INSERT_OPERAND (mips_opts.micromips,
5355                               EXTMSBD, insn, va_arg (args, int));
5356               continue;
5357
5358             case 'Q':
5359               gas_assert (!mips_opts.micromips);
5360               INSERT_OPERAND (0, SEQI, insn, va_arg (args, int));
5361               continue;
5362
5363             case 'j':
5364               INSERT_OPERAND (mips_opts.micromips, EVAOFFSET, insn, va_arg (args, int));
5365               continue;
5366
5367             default:
5368               abort ();
5369             }
5370           continue;
5371
5372         case '2':
5373           INSERT_OPERAND (mips_opts.micromips, BP, insn, va_arg (args, int));
5374           continue;
5375
5376         case 'n':
5377           gas_assert (mips_opts.micromips);
5378         case 't':
5379         case 'w':
5380         case 'E':
5381           INSERT_OPERAND (mips_opts.micromips, RT, insn, va_arg (args, int));
5382           continue;
5383
5384         case 'c':
5385           gas_assert (!mips_opts.micromips);
5386           INSERT_OPERAND (0, CODE, insn, va_arg (args, int));
5387           continue;
5388
5389         case 'W':
5390           gas_assert (!mips_opts.micromips);
5391         case 'T':
5392           INSERT_OPERAND (mips_opts.micromips, FT, insn, va_arg (args, int));
5393           continue;
5394
5395         case 'G':
5396           if (mips_opts.micromips)
5397             INSERT_OPERAND (1, RS, insn, va_arg (args, int));
5398           else
5399             INSERT_OPERAND (0, RD, insn, va_arg (args, int));
5400           continue;
5401
5402         case 'K':
5403           gas_assert (!mips_opts.micromips);
5404         case 'd':
5405           INSERT_OPERAND (mips_opts.micromips, RD, insn, va_arg (args, int));
5406           continue;
5407
5408         case 'U':
5409           gas_assert (!mips_opts.micromips);
5410           {
5411             int tmp = va_arg (args, int);
5412
5413             INSERT_OPERAND (0, RT, insn, tmp);
5414             INSERT_OPERAND (0, RD, insn, tmp);
5415           }
5416           continue;
5417
5418         case 'V':
5419         case 'S':
5420           gas_assert (!mips_opts.micromips);
5421           INSERT_OPERAND (0, FS, insn, va_arg (args, int));
5422           continue;
5423
5424         case 'z':
5425           continue;
5426
5427         case '<':
5428           INSERT_OPERAND (mips_opts.micromips,
5429                           SHAMT, insn, va_arg (args, int));
5430           continue;
5431
5432         case 'D':
5433           gas_assert (!mips_opts.micromips);
5434           INSERT_OPERAND (0, FD, insn, va_arg (args, int));
5435           continue;
5436
5437         case 'B':
5438           gas_assert (!mips_opts.micromips);
5439           INSERT_OPERAND (0, CODE20, insn, va_arg (args, int));
5440           continue;
5441
5442         case 'J':
5443           gas_assert (!mips_opts.micromips);
5444           INSERT_OPERAND (0, CODE19, insn, va_arg (args, int));
5445           continue;
5446
5447         case 'q':
5448           gas_assert (!mips_opts.micromips);
5449           INSERT_OPERAND (0, CODE2, insn, va_arg (args, int));
5450           continue;
5451
5452         case 'b':
5453         case 's':
5454         case 'r':
5455         case 'v':
5456           INSERT_OPERAND (mips_opts.micromips, RS, insn, va_arg (args, int));
5457           continue;
5458
5459         case 'i':
5460         case 'j':
5461           macro_read_relocs (&args, r);
5462           gas_assert (*r == BFD_RELOC_GPREL16
5463                       || *r == BFD_RELOC_MIPS_HIGHER
5464                       || *r == BFD_RELOC_HI16_S
5465                       || *r == BFD_RELOC_LO16
5466                       || *r == BFD_RELOC_MIPS_GOT_OFST);
5467           continue;
5468
5469         case 'o':
5470           macro_read_relocs (&args, r);
5471           continue;
5472
5473         case 'u':
5474           macro_read_relocs (&args, r);
5475           gas_assert (ep != NULL
5476                       && (ep->X_op == O_constant
5477                           || (ep->X_op == O_symbol
5478                               && (*r == BFD_RELOC_MIPS_HIGHEST
5479                                   || *r == BFD_RELOC_HI16_S
5480                                   || *r == BFD_RELOC_HI16
5481                                   || *r == BFD_RELOC_GPREL16
5482                                   || *r == BFD_RELOC_MIPS_GOT_HI16
5483                                   || *r == BFD_RELOC_MIPS_CALL_HI16))));
5484           continue;
5485
5486         case 'p':
5487           gas_assert (ep != NULL);
5488
5489           /*
5490            * This allows macro() to pass an immediate expression for
5491            * creating short branches without creating a symbol.
5492            *
5493            * We don't allow branch relaxation for these branches, as
5494            * they should only appear in ".set nomacro" anyway.
5495            */
5496           if (ep->X_op == O_constant)
5497             {
5498               /* For microMIPS we always use relocations for branches.
5499                  So we should not resolve immediate values.  */
5500               gas_assert (!mips_opts.micromips);
5501
5502               if ((ep->X_add_number & 3) != 0)
5503                 as_bad (_("branch to misaligned address (0x%lx)"),
5504                         (unsigned long) ep->X_add_number);
5505               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
5506                 as_bad (_("branch address range overflow (0x%lx)"),
5507                         (unsigned long) ep->X_add_number);
5508               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
5509               ep = NULL;
5510             }
5511           else
5512             *r = BFD_RELOC_16_PCREL_S2;
5513           continue;
5514
5515         case 'a':
5516           gas_assert (ep != NULL);
5517           *r = BFD_RELOC_MIPS_JMP;
5518           continue;
5519
5520         case 'C':
5521           gas_assert (!mips_opts.micromips);
5522           INSERT_OPERAND (0, COPZ, insn, va_arg (args, unsigned long));
5523           continue;
5524
5525         case 'k':
5526           INSERT_OPERAND (mips_opts.micromips,
5527                           CACHE, insn, va_arg (args, unsigned long));
5528           continue;
5529
5530         case '|':
5531           gas_assert (mips_opts.micromips);
5532           INSERT_OPERAND (1, TRAP, insn, va_arg (args, int));
5533           continue;
5534
5535         case '.':
5536           gas_assert (mips_opts.micromips);
5537           INSERT_OPERAND (1, OFFSET10, insn, va_arg (args, int));
5538           continue;
5539
5540         case '\\':
5541           INSERT_OPERAND (mips_opts.micromips,
5542                           3BITPOS, insn, va_arg (args, unsigned int));
5543           continue;
5544
5545         case '~':
5546           INSERT_OPERAND (mips_opts.micromips,
5547                           OFFSET12, insn, va_arg (args, unsigned long));
5548           continue;
5549
5550         case 'N':
5551           gas_assert (mips_opts.micromips);
5552           INSERT_OPERAND (1, BCC, insn, va_arg (args, int));
5553           continue;
5554
5555         case 'm':       /* Opcode extension character.  */
5556           gas_assert (mips_opts.micromips);
5557           switch (*fmt++)
5558             {
5559             case 'j':
5560               INSERT_OPERAND (1, MJ, insn, va_arg (args, int));
5561               break;
5562
5563             case 'p':
5564               INSERT_OPERAND (1, MP, insn, va_arg (args, int));
5565               break;
5566
5567             case 'F':
5568               INSERT_OPERAND (1, IMMF, insn, va_arg (args, int));
5569               break;
5570
5571             default:
5572               abort ();
5573             }
5574           continue;
5575
5576         default:
5577           abort ();
5578         }
5579       break;
5580     }
5581   va_end (args);
5582   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5583
5584   append_insn (&insn, ep, r, TRUE);
5585 }
5586
5587 static void
5588 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
5589                     va_list *args)
5590 {
5591   struct mips_opcode *mo;
5592   struct mips_cl_insn insn;
5593   bfd_reloc_code_real_type r[3]
5594     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
5595
5596   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
5597   gas_assert (mo);
5598   gas_assert (strcmp (name, mo->name) == 0);
5599
5600   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
5601     {
5602       ++mo;
5603       gas_assert (mo->name);
5604       gas_assert (strcmp (name, mo->name) == 0);
5605     }
5606
5607   create_insn (&insn, mo);
5608   for (;;)
5609     {
5610       int c;
5611
5612       c = *fmt++;
5613       switch (c)
5614         {
5615         case '\0':
5616           break;
5617
5618         case ',':
5619         case '(':
5620         case ')':
5621           continue;
5622
5623         case 'y':
5624         case 'w':
5625           MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
5626           continue;
5627
5628         case 'x':
5629         case 'v':
5630           MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
5631           continue;
5632
5633         case 'z':
5634           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
5635           continue;
5636
5637         case 'Z':
5638           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
5639           continue;
5640
5641         case '0':
5642         case 'S':
5643         case 'P':
5644         case 'R':
5645           continue;
5646
5647         case 'X':
5648           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
5649           continue;
5650
5651         case 'Y':
5652           {
5653             int regno;
5654
5655             regno = va_arg (*args, int);
5656             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
5657             MIPS16_INSERT_OPERAND (REG32R, insn, regno);
5658           }
5659           continue;
5660
5661         case '<':
5662         case '>':
5663         case '4':
5664         case '5':
5665         case 'H':
5666         case 'W':
5667         case 'D':
5668         case 'j':
5669         case '8':
5670         case 'V':
5671         case 'C':
5672         case 'U':
5673         case 'k':
5674         case 'K':
5675         case 'p':
5676         case 'q':
5677           {
5678             offsetT value;
5679
5680             gas_assert (ep != NULL);
5681
5682             if (ep->X_op != O_constant)
5683               *r = (int) BFD_RELOC_UNUSED + c;
5684             else if (calculate_reloc (*r, ep->X_add_number, &value))
5685               {
5686                 mips16_immed (NULL, 0, c, *r, value, 0, &insn.insn_opcode);
5687                 ep = NULL;
5688                 *r = BFD_RELOC_UNUSED;
5689               }
5690           }
5691           continue;
5692
5693         case '6':
5694           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
5695           continue;
5696         }
5697
5698       break;
5699     }
5700
5701   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5702
5703   append_insn (&insn, ep, r, TRUE);
5704 }
5705
5706 /*
5707  * Sign-extend 32-bit mode constants that have bit 31 set and all
5708  * higher bits unset.
5709  */
5710 static void
5711 normalize_constant_expr (expressionS *ex)
5712 {
5713   if (ex->X_op == O_constant
5714       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5715     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5716                         - 0x80000000);
5717 }
5718
5719 /*
5720  * Sign-extend 32-bit mode address offsets that have bit 31 set and
5721  * all higher bits unset.
5722  */
5723 static void
5724 normalize_address_expr (expressionS *ex)
5725 {
5726   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
5727         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
5728       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5729     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5730                         - 0x80000000);
5731 }
5732
5733 /*
5734  * Generate a "jalr" instruction with a relocation hint to the called
5735  * function.  This occurs in NewABI PIC code.
5736  */
5737 static void
5738 macro_build_jalr (expressionS *ep, int cprestore)
5739 {
5740   static const bfd_reloc_code_real_type jalr_relocs[2]
5741     = { BFD_RELOC_MIPS_JALR, BFD_RELOC_MICROMIPS_JALR };
5742   bfd_reloc_code_real_type jalr_reloc = jalr_relocs[mips_opts.micromips];
5743   const char *jalr;
5744   char *f = NULL;
5745
5746   if (MIPS_JALR_HINT_P (ep))
5747     {
5748       frag_grow (8);
5749       f = frag_more (0);
5750     }
5751   if (mips_opts.micromips)
5752     {
5753       jalr = mips_opts.noreorder && !cprestore ? "jalr" : "jalrs";
5754       if (MIPS_JALR_HINT_P (ep)
5755           || (history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
5756         macro_build (NULL, jalr, "t,s", RA, PIC_CALL_REG);
5757       else
5758         macro_build (NULL, jalr, "mj", PIC_CALL_REG);
5759     }
5760   else
5761     macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
5762   if (MIPS_JALR_HINT_P (ep))
5763     fix_new_exp (frag_now, f - frag_now->fr_literal, 4, ep, FALSE, jalr_reloc);
5764 }
5765
5766 /*
5767  * Generate a "lui" instruction.
5768  */
5769 static void
5770 macro_build_lui (expressionS *ep, int regnum)
5771 {
5772   gas_assert (! mips_opts.mips16);
5773
5774   if (ep->X_op != O_constant)
5775     {
5776       gas_assert (ep->X_op == O_symbol);
5777       /* _gp_disp is a special case, used from s_cpload.
5778          __gnu_local_gp is used if mips_no_shared.  */
5779       gas_assert (mips_pic == NO_PIC
5780               || (! HAVE_NEWABI
5781                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
5782               || (! mips_in_shared
5783                   && strcmp (S_GET_NAME (ep->X_add_symbol),
5784                              "__gnu_local_gp") == 0));
5785     }
5786
5787   macro_build (ep, "lui", LUI_FMT, regnum, BFD_RELOC_HI16_S);
5788 }
5789
5790 /* Generate a sequence of instructions to do a load or store from a constant
5791    offset off of a base register (breg) into/from a target register (treg),
5792    using AT if necessary.  */
5793 static void
5794 macro_build_ldst_constoffset (expressionS *ep, const char *op,
5795                               int treg, int breg, int dbl)
5796 {
5797   gas_assert (ep->X_op == O_constant);
5798
5799   /* Sign-extending 32-bit constants makes their handling easier.  */
5800   if (!dbl)
5801     normalize_constant_expr (ep);
5802
5803   /* Right now, this routine can only handle signed 32-bit constants.  */
5804   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
5805     as_warn (_("operand overflow"));
5806
5807   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
5808     {
5809       /* Signed 16-bit offset will fit in the op.  Easy!  */
5810       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
5811     }
5812   else
5813     {
5814       /* 32-bit offset, need multiple instructions and AT, like:
5815            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
5816            addu     $tempreg,$tempreg,$breg
5817            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
5818          to handle the complete offset.  */
5819       macro_build_lui (ep, AT);
5820       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
5821       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
5822
5823       if (!mips_opts.at)
5824         as_bad (_("Macro used $at after \".set noat\""));
5825     }
5826 }
5827
5828 /*                      set_at()
5829  * Generates code to set the $at register to true (one)
5830  * if reg is less than the immediate expression.
5831  */
5832 static void
5833 set_at (int reg, int unsignedp)
5834 {
5835   if (imm_expr.X_op == O_constant
5836       && imm_expr.X_add_number >= -0x8000
5837       && imm_expr.X_add_number < 0x8000)
5838     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
5839                  AT, reg, BFD_RELOC_LO16);
5840   else
5841     {
5842       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5843       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
5844     }
5845 }
5846
5847 /* Warn if an expression is not a constant.  */
5848
5849 static void
5850 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
5851 {
5852   if (ex->X_op == O_big)
5853     as_bad (_("unsupported large constant"));
5854   else if (ex->X_op != O_constant)
5855     as_bad (_("Instruction %s requires absolute expression"),
5856             ip->insn_mo->name);
5857
5858   if (HAVE_32BIT_GPRS)
5859     normalize_constant_expr (ex);
5860 }
5861
5862 /* Count the leading zeroes by performing a binary chop. This is a
5863    bulky bit of source, but performance is a LOT better for the
5864    majority of values than a simple loop to count the bits:
5865        for (lcnt = 0; (lcnt < 32); lcnt++)
5866          if ((v) & (1 << (31 - lcnt)))
5867            break;
5868   However it is not code size friendly, and the gain will drop a bit
5869   on certain cached systems.
5870 */
5871 #define COUNT_TOP_ZEROES(v)             \
5872   (((v) & ~0xffff) == 0                 \
5873    ? ((v) & ~0xff) == 0                 \
5874      ? ((v) & ~0xf) == 0                \
5875        ? ((v) & ~0x3) == 0              \
5876          ? ((v) & ~0x1) == 0            \
5877            ? !(v)                       \
5878              ? 32                       \
5879              : 31                       \
5880            : 30                         \
5881          : ((v) & ~0x7) == 0            \
5882            ? 29                         \
5883            : 28                         \
5884        : ((v) & ~0x3f) == 0             \
5885          ? ((v) & ~0x1f) == 0           \
5886            ? 27                         \
5887            : 26                         \
5888          : ((v) & ~0x7f) == 0           \
5889            ? 25                         \
5890            : 24                         \
5891      : ((v) & ~0xfff) == 0              \
5892        ? ((v) & ~0x3ff) == 0            \
5893          ? ((v) & ~0x1ff) == 0          \
5894            ? 23                         \
5895            : 22                         \
5896          : ((v) & ~0x7ff) == 0          \
5897            ? 21                         \
5898            : 20                         \
5899        : ((v) & ~0x3fff) == 0           \
5900          ? ((v) & ~0x1fff) == 0         \
5901            ? 19                         \
5902            : 18                         \
5903          : ((v) & ~0x7fff) == 0         \
5904            ? 17                         \
5905            : 16                         \
5906    : ((v) & ~0xffffff) == 0             \
5907      ? ((v) & ~0xfffff) == 0            \
5908        ? ((v) & ~0x3ffff) == 0          \
5909          ? ((v) & ~0x1ffff) == 0        \
5910            ? 15                         \
5911            : 14                         \
5912          : ((v) & ~0x7ffff) == 0        \
5913            ? 13                         \
5914            : 12                         \
5915        : ((v) & ~0x3fffff) == 0         \
5916          ? ((v) & ~0x1fffff) == 0       \
5917            ? 11                         \
5918            : 10                         \
5919          : ((v) & ~0x7fffff) == 0       \
5920            ? 9                          \
5921            : 8                          \
5922      : ((v) & ~0xfffffff) == 0          \
5923        ? ((v) & ~0x3ffffff) == 0        \
5924          ? ((v) & ~0x1ffffff) == 0      \
5925            ? 7                          \
5926            : 6                          \
5927          : ((v) & ~0x7ffffff) == 0      \
5928            ? 5                          \
5929            : 4                          \
5930        : ((v) & ~0x3fffffff) == 0       \
5931          ? ((v) & ~0x1fffffff) == 0     \
5932            ? 3                          \
5933            : 2                          \
5934          : ((v) & ~0x7fffffff) == 0     \
5935            ? 1                          \
5936            : 0)
5937
5938 /*                      load_register()
5939  *  This routine generates the least number of instructions necessary to load
5940  *  an absolute expression value into a register.
5941  */
5942 static void
5943 load_register (int reg, expressionS *ep, int dbl)
5944 {
5945   int freg;
5946   expressionS hi32, lo32;
5947
5948   if (ep->X_op != O_big)
5949     {
5950       gas_assert (ep->X_op == O_constant);
5951
5952       /* Sign-extending 32-bit constants makes their handling easier.  */
5953       if (!dbl)
5954         normalize_constant_expr (ep);
5955
5956       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
5957         {
5958           /* We can handle 16 bit signed values with an addiu to
5959              $zero.  No need to ever use daddiu here, since $zero and
5960              the result are always correct in 32 bit mode.  */
5961           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5962           return;
5963         }
5964       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
5965         {
5966           /* We can handle 16 bit unsigned values with an ori to
5967              $zero.  */
5968           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
5969           return;
5970         }
5971       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
5972         {
5973           /* 32 bit values require an lui.  */
5974           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5975           if ((ep->X_add_number & 0xffff) != 0)
5976             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
5977           return;
5978         }
5979     }
5980
5981   /* The value is larger than 32 bits.  */
5982
5983   if (!dbl || HAVE_32BIT_GPRS)
5984     {
5985       char value[32];
5986
5987       sprintf_vma (value, ep->X_add_number);
5988       as_bad (_("Number (0x%s) larger than 32 bits"), value);
5989       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5990       return;
5991     }
5992
5993   if (ep->X_op != O_big)
5994     {
5995       hi32 = *ep;
5996       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
5997       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
5998       hi32.X_add_number &= 0xffffffff;
5999       lo32 = *ep;
6000       lo32.X_add_number &= 0xffffffff;
6001     }
6002   else
6003     {
6004       gas_assert (ep->X_add_number > 2);
6005       if (ep->X_add_number == 3)
6006         generic_bignum[3] = 0;
6007       else if (ep->X_add_number > 4)
6008         as_bad (_("Number larger than 64 bits"));
6009       lo32.X_op = O_constant;
6010       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
6011       hi32.X_op = O_constant;
6012       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
6013     }
6014
6015   if (hi32.X_add_number == 0)
6016     freg = 0;
6017   else
6018     {
6019       int shift, bit;
6020       unsigned long hi, lo;
6021
6022       if (hi32.X_add_number == (offsetT) 0xffffffff)
6023         {
6024           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
6025             {
6026               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
6027               return;
6028             }
6029           if (lo32.X_add_number & 0x80000000)
6030             {
6031               macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
6032               if (lo32.X_add_number & 0xffff)
6033                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
6034               return;
6035             }
6036         }
6037
6038       /* Check for 16bit shifted constant.  We know that hi32 is
6039          non-zero, so start the mask on the first bit of the hi32
6040          value.  */
6041       shift = 17;
6042       do
6043         {
6044           unsigned long himask, lomask;
6045
6046           if (shift < 32)
6047             {
6048               himask = 0xffff >> (32 - shift);
6049               lomask = (0xffff << shift) & 0xffffffff;
6050             }
6051           else
6052             {
6053               himask = 0xffff << (shift - 32);
6054               lomask = 0;
6055             }
6056           if ((hi32.X_add_number & ~(offsetT) himask) == 0
6057               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
6058             {
6059               expressionS tmp;
6060
6061               tmp.X_op = O_constant;
6062               if (shift < 32)
6063                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
6064                                     | (lo32.X_add_number >> shift));
6065               else
6066                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
6067               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
6068               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", SHFT_FMT,
6069                            reg, reg, (shift >= 32) ? shift - 32 : shift);
6070               return;
6071             }
6072           ++shift;
6073         }
6074       while (shift <= (64 - 16));
6075
6076       /* Find the bit number of the lowest one bit, and store the
6077          shifted value in hi/lo.  */
6078       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
6079       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
6080       if (lo != 0)
6081         {
6082           bit = 0;
6083           while ((lo & 1) == 0)
6084             {
6085               lo >>= 1;
6086               ++bit;
6087             }
6088           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
6089           hi >>= bit;
6090         }
6091       else
6092         {
6093           bit = 32;
6094           while ((hi & 1) == 0)
6095             {
6096               hi >>= 1;
6097               ++bit;
6098             }
6099           lo = hi;
6100           hi = 0;
6101         }
6102
6103       /* Optimize if the shifted value is a (power of 2) - 1.  */
6104       if ((hi == 0 && ((lo + 1) & lo) == 0)
6105           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
6106         {
6107           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
6108           if (shift != 0)
6109             {
6110               expressionS tmp;
6111
6112               /* This instruction will set the register to be all
6113                  ones.  */
6114               tmp.X_op = O_constant;
6115               tmp.X_add_number = (offsetT) -1;
6116               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
6117               if (bit != 0)
6118                 {
6119                   bit += shift;
6120                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", SHFT_FMT,
6121                                reg, reg, (bit >= 32) ? bit - 32 : bit);
6122                 }
6123               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", SHFT_FMT,
6124                            reg, reg, (shift >= 32) ? shift - 32 : shift);
6125               return;
6126             }
6127         }
6128
6129       /* Sign extend hi32 before calling load_register, because we can
6130          generally get better code when we load a sign extended value.  */
6131       if ((hi32.X_add_number & 0x80000000) != 0)
6132         hi32.X_add_number |= ~(offsetT) 0xffffffff;
6133       load_register (reg, &hi32, 0);
6134       freg = reg;
6135     }
6136   if ((lo32.X_add_number & 0xffff0000) == 0)
6137     {
6138       if (freg != 0)
6139         {
6140           macro_build (NULL, "dsll32", SHFT_FMT, reg, freg, 0);
6141           freg = reg;
6142         }
6143     }
6144   else
6145     {
6146       expressionS mid16;
6147
6148       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
6149         {
6150           macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
6151           macro_build (NULL, "dsrl32", SHFT_FMT, reg, reg, 0);
6152           return;
6153         }
6154
6155       if (freg != 0)
6156         {
6157           macro_build (NULL, "dsll", SHFT_FMT, reg, freg, 16);
6158           freg = reg;
6159         }
6160       mid16 = lo32;
6161       mid16.X_add_number >>= 16;
6162       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
6163       macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
6164       freg = reg;
6165     }
6166   if ((lo32.X_add_number & 0xffff) != 0)
6167     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
6168 }
6169
6170 static inline void
6171 load_delay_nop (void)
6172 {
6173   if (!gpr_interlocks)
6174     macro_build (NULL, "nop", "");
6175 }
6176
6177 /* Load an address into a register.  */
6178
6179 static void
6180 load_address (int reg, expressionS *ep, int *used_at)
6181 {
6182   if (ep->X_op != O_constant
6183       && ep->X_op != O_symbol)
6184     {
6185       as_bad (_("expression too complex"));
6186       ep->X_op = O_constant;
6187     }
6188
6189   if (ep->X_op == O_constant)
6190     {
6191       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
6192       return;
6193     }
6194
6195   if (mips_pic == NO_PIC)
6196     {
6197       /* If this is a reference to a GP relative symbol, we want
6198            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
6199          Otherwise we want
6200            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
6201            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
6202          If we have an addend, we always use the latter form.
6203
6204          With 64bit address space and a usable $at we want
6205            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
6206            lui          $at,<sym>               (BFD_RELOC_HI16_S)
6207            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
6208            daddiu       $at,<sym>               (BFD_RELOC_LO16)
6209            dsll32       $reg,0
6210            daddu        $reg,$reg,$at
6211
6212          If $at is already in use, we use a path which is suboptimal
6213          on superscalar processors.
6214            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
6215            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
6216            dsll         $reg,16
6217            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
6218            dsll         $reg,16
6219            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
6220
6221          For GP relative symbols in 64bit address space we can use
6222          the same sequence as in 32bit address space.  */
6223       if (HAVE_64BIT_SYMBOLS)
6224         {
6225           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
6226               && !nopic_need_relax (ep->X_add_symbol, 1))
6227             {
6228               relax_start (ep->X_add_symbol);
6229               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
6230                            mips_gp_register, BFD_RELOC_GPREL16);
6231               relax_switch ();
6232             }
6233
6234           if (*used_at == 0 && mips_opts.at)
6235             {
6236               macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
6237               macro_build (ep, "lui", LUI_FMT, AT, BFD_RELOC_HI16_S);
6238               macro_build (ep, "daddiu", "t,r,j", reg, reg,
6239                            BFD_RELOC_MIPS_HIGHER);
6240               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
6241               macro_build (NULL, "dsll32", SHFT_FMT, reg, reg, 0);
6242               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
6243               *used_at = 1;
6244             }
6245           else
6246             {
6247               macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
6248               macro_build (ep, "daddiu", "t,r,j", reg, reg,
6249                            BFD_RELOC_MIPS_HIGHER);
6250               macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
6251               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
6252               macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
6253               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
6254             }
6255
6256           if (mips_relax.sequence)
6257             relax_end ();
6258         }
6259       else
6260         {
6261           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
6262               && !nopic_need_relax (ep->X_add_symbol, 1))
6263             {
6264               relax_start (ep->X_add_symbol);
6265               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
6266                            mips_gp_register, BFD_RELOC_GPREL16);
6267               relax_switch ();
6268             }
6269           macro_build_lui (ep, reg);
6270           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
6271                        reg, reg, BFD_RELOC_LO16);
6272           if (mips_relax.sequence)
6273             relax_end ();
6274         }
6275     }
6276   else if (!mips_big_got)
6277     {
6278       expressionS ex;
6279
6280       /* If this is a reference to an external symbol, we want
6281            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
6282          Otherwise we want
6283            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
6284            nop
6285            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
6286          If there is a constant, it must be added in after.
6287
6288          If we have NewABI, we want
6289            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
6290          unless we're referencing a global symbol with a non-zero
6291          offset, in which case cst must be added separately.  */
6292       if (HAVE_NEWABI)
6293         {
6294           if (ep->X_add_number)
6295             {
6296               ex.X_add_number = ep->X_add_number;
6297               ep->X_add_number = 0;
6298               relax_start (ep->X_add_symbol);
6299               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6300                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6301               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6302                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6303               ex.X_op = O_constant;
6304               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
6305                            reg, reg, BFD_RELOC_LO16);
6306               ep->X_add_number = ex.X_add_number;
6307               relax_switch ();
6308             }
6309           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6310                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6311           if (mips_relax.sequence)
6312             relax_end ();
6313         }
6314       else
6315         {
6316           ex.X_add_number = ep->X_add_number;
6317           ep->X_add_number = 0;
6318           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6319                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6320           load_delay_nop ();
6321           relax_start (ep->X_add_symbol);
6322           relax_switch ();
6323           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6324                        BFD_RELOC_LO16);
6325           relax_end ();
6326
6327           if (ex.X_add_number != 0)
6328             {
6329               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6330                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6331               ex.X_op = O_constant;
6332               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
6333                            reg, reg, BFD_RELOC_LO16);
6334             }
6335         }
6336     }
6337   else if (mips_big_got)
6338     {
6339       expressionS ex;
6340
6341       /* This is the large GOT case.  If this is a reference to an
6342          external symbol, we want
6343            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
6344            addu         $reg,$reg,$gp
6345            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
6346
6347          Otherwise, for a reference to a local symbol in old ABI, we want
6348            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
6349            nop
6350            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
6351          If there is a constant, it must be added in after.
6352
6353          In the NewABI, for local symbols, with or without offsets, we want:
6354            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
6355            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
6356       */
6357       if (HAVE_NEWABI)
6358         {
6359           ex.X_add_number = ep->X_add_number;
6360           ep->X_add_number = 0;
6361           relax_start (ep->X_add_symbol);
6362           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
6363           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6364                        reg, reg, mips_gp_register);
6365           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
6366                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
6367           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6368             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6369           else if (ex.X_add_number)
6370             {
6371               ex.X_op = O_constant;
6372               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6373                            BFD_RELOC_LO16);
6374             }
6375
6376           ep->X_add_number = ex.X_add_number;
6377           relax_switch ();
6378           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6379                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6380           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6381                        BFD_RELOC_MIPS_GOT_OFST);
6382           relax_end ();
6383         }
6384       else
6385         {
6386           ex.X_add_number = ep->X_add_number;
6387           ep->X_add_number = 0;
6388           relax_start (ep->X_add_symbol);
6389           macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
6390           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6391                        reg, reg, mips_gp_register);
6392           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
6393                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
6394           relax_switch ();
6395           if (reg_needs_delay (mips_gp_register))
6396             {
6397               /* We need a nop before loading from $gp.  This special
6398                  check is required because the lui which starts the main
6399                  instruction stream does not refer to $gp, and so will not
6400                  insert the nop which may be required.  */
6401               macro_build (NULL, "nop", "");
6402             }
6403           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6404                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6405           load_delay_nop ();
6406           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6407                        BFD_RELOC_LO16);
6408           relax_end ();
6409
6410           if (ex.X_add_number != 0)
6411             {
6412               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6413                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6414               ex.X_op = O_constant;
6415               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6416                            BFD_RELOC_LO16);
6417             }
6418         }
6419     }
6420   else
6421     abort ();
6422
6423   if (!mips_opts.at && *used_at == 1)
6424     as_bad (_("Macro used $at after \".set noat\""));
6425 }
6426
6427 /* Move the contents of register SOURCE into register DEST.  */
6428
6429 static void
6430 move_register (int dest, int source)
6431 {
6432   /* Prefer to use a 16-bit microMIPS instruction unless the previous
6433      instruction specifically requires a 32-bit one.  */
6434   if (mips_opts.micromips
6435       && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
6436     macro_build (NULL, "move", "mp,mj", dest, source);
6437   else
6438     macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
6439                  dest, source, 0);
6440 }
6441
6442 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
6443    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
6444    The two alternatives are:
6445
6446    Global symbol                Local sybmol
6447    -------------                ------------
6448    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
6449    ...                          ...
6450    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
6451
6452    load_got_offset emits the first instruction and add_got_offset
6453    emits the second for a 16-bit offset or add_got_offset_hilo emits
6454    a sequence to add a 32-bit offset using a scratch register.  */
6455
6456 static void
6457 load_got_offset (int dest, expressionS *local)
6458 {
6459   expressionS global;
6460
6461   global = *local;
6462   global.X_add_number = 0;
6463
6464   relax_start (local->X_add_symbol);
6465   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
6466                BFD_RELOC_MIPS_GOT16, mips_gp_register);
6467   relax_switch ();
6468   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
6469                BFD_RELOC_MIPS_GOT16, mips_gp_register);
6470   relax_end ();
6471 }
6472
6473 static void
6474 add_got_offset (int dest, expressionS *local)
6475 {
6476   expressionS global;
6477
6478   global.X_op = O_constant;
6479   global.X_op_symbol = NULL;
6480   global.X_add_symbol = NULL;
6481   global.X_add_number = local->X_add_number;
6482
6483   relax_start (local->X_add_symbol);
6484   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
6485                dest, dest, BFD_RELOC_LO16);
6486   relax_switch ();
6487   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
6488   relax_end ();
6489 }
6490
6491 static void
6492 add_got_offset_hilo (int dest, expressionS *local, int tmp)
6493 {
6494   expressionS global;
6495   int hold_mips_optimize;
6496
6497   global.X_op = O_constant;
6498   global.X_op_symbol = NULL;
6499   global.X_add_symbol = NULL;
6500   global.X_add_number = local->X_add_number;
6501
6502   relax_start (local->X_add_symbol);
6503   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
6504   relax_switch ();
6505   /* Set mips_optimize around the lui instruction to avoid
6506      inserting an unnecessary nop after the lw.  */
6507   hold_mips_optimize = mips_optimize;
6508   mips_optimize = 2;
6509   macro_build_lui (&global, tmp);
6510   mips_optimize = hold_mips_optimize;
6511   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
6512   relax_end ();
6513
6514   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
6515 }
6516
6517 /* Emit a sequence of instructions to emulate a branch likely operation.
6518    BR is an ordinary branch corresponding to one to be emulated.  BRNEG
6519    is its complementing branch with the original condition negated.
6520    CALL is set if the original branch specified the link operation.
6521    EP, FMT, SREG and TREG specify the usual macro_build() parameters.
6522
6523    Code like this is produced in the noreorder mode:
6524
6525         BRNEG   <args>, 1f
6526          nop
6527         b       <sym>
6528          delay slot (executed only if branch taken)
6529     1:
6530
6531    or, if CALL is set:
6532
6533         BRNEG   <args>, 1f
6534          nop
6535         bal     <sym>
6536          delay slot (executed only if branch taken)
6537     1:
6538
6539    In the reorder mode the delay slot would be filled with a nop anyway,
6540    so code produced is simply:
6541
6542         BR      <args>, <sym>
6543          nop
6544
6545    This function is used when producing code for the microMIPS ASE that
6546    does not implement branch likely instructions in hardware.  */
6547
6548 static void
6549 macro_build_branch_likely (const char *br, const char *brneg,
6550                            int call, expressionS *ep, const char *fmt,
6551                            unsigned int sreg, unsigned int treg)
6552 {
6553   int noreorder = mips_opts.noreorder;
6554   expressionS expr1;
6555
6556   gas_assert (mips_opts.micromips);
6557   start_noreorder ();
6558   if (noreorder)
6559     {
6560       micromips_label_expr (&expr1);
6561       macro_build (&expr1, brneg, fmt, sreg, treg);
6562       macro_build (NULL, "nop", "");
6563       macro_build (ep, call ? "bal" : "b", "p");
6564
6565       /* Set to true so that append_insn adds a label.  */
6566       emit_branch_likely_macro = TRUE;
6567     }
6568   else
6569     {
6570       macro_build (ep, br, fmt, sreg, treg);
6571       macro_build (NULL, "nop", "");
6572     }
6573   end_noreorder ();
6574 }
6575
6576 /* Emit a coprocessor branch-likely macro specified by TYPE, using CC as
6577    the condition code tested.  EP specifies the branch target.  */
6578
6579 static void
6580 macro_build_branch_ccl (int type, expressionS *ep, unsigned int cc)
6581 {
6582   const int call = 0;
6583   const char *brneg;
6584   const char *br;
6585
6586   switch (type)
6587     {
6588     case M_BC1FL:
6589       br = "bc1f";
6590       brneg = "bc1t";
6591       break;
6592     case M_BC1TL:
6593       br = "bc1t";
6594       brneg = "bc1f";
6595       break;
6596     case M_BC2FL:
6597       br = "bc2f";
6598       brneg = "bc2t";
6599       break;
6600     case M_BC2TL:
6601       br = "bc2t";
6602       brneg = "bc2f";
6603       break;
6604     default:
6605       abort ();
6606     }
6607   macro_build_branch_likely (br, brneg, call, ep, "N,p", cc, ZERO);
6608 }
6609
6610 /* Emit a two-argument branch macro specified by TYPE, using SREG as
6611    the register tested.  EP specifies the branch target.  */
6612
6613 static void
6614 macro_build_branch_rs (int type, expressionS *ep, unsigned int sreg)
6615 {
6616   const char *brneg = NULL;
6617   const char *br;
6618   int call = 0;
6619
6620   switch (type)
6621     {
6622     case M_BGEZ:
6623       br = "bgez";
6624       break;
6625     case M_BGEZL:
6626       br = mips_opts.micromips ? "bgez" : "bgezl";
6627       brneg = "bltz";
6628       break;
6629     case M_BGEZALL:
6630       gas_assert (mips_opts.micromips);
6631       br = "bgezals";
6632       brneg = "bltz";
6633       call = 1;
6634       break;
6635     case M_BGTZ:
6636       br = "bgtz";
6637       break;
6638     case M_BGTZL:
6639       br = mips_opts.micromips ? "bgtz" : "bgtzl";
6640       brneg = "blez";
6641       break;
6642     case M_BLEZ:
6643       br = "blez";
6644       break;
6645     case M_BLEZL:
6646       br = mips_opts.micromips ? "blez" : "blezl";
6647       brneg = "bgtz";
6648       break;
6649     case M_BLTZ:
6650       br = "bltz";
6651       break;
6652     case M_BLTZL:
6653       br = mips_opts.micromips ? "bltz" : "bltzl";
6654       brneg = "bgez";
6655       break;
6656     case M_BLTZALL:
6657       gas_assert (mips_opts.micromips);
6658       br = "bltzals";
6659       brneg = "bgez";
6660       call = 1;
6661       break;
6662     default:
6663       abort ();
6664     }
6665   if (mips_opts.micromips && brneg)
6666     macro_build_branch_likely (br, brneg, call, ep, "s,p", sreg, ZERO);
6667   else
6668     macro_build (ep, br, "s,p", sreg);
6669 }
6670
6671 /* Emit a three-argument branch macro specified by TYPE, using SREG and
6672    TREG as the registers tested.  EP specifies the branch target.  */
6673
6674 static void
6675 macro_build_branch_rsrt (int type, expressionS *ep,
6676                          unsigned int sreg, unsigned int treg)
6677 {
6678   const char *brneg = NULL;
6679   const int call = 0;
6680   const char *br;
6681
6682   switch (type)
6683     {
6684     case M_BEQ:
6685     case M_BEQ_I:
6686       br = "beq";
6687       break;
6688     case M_BEQL:
6689     case M_BEQL_I:
6690       br = mips_opts.micromips ? "beq" : "beql";
6691       brneg = "bne";
6692       break;
6693     case M_BNE:
6694     case M_BNE_I:
6695       br = "bne";
6696       break;
6697     case M_BNEL:
6698     case M_BNEL_I:
6699       br = mips_opts.micromips ? "bne" : "bnel";
6700       brneg = "beq";
6701       break;
6702     default:
6703       abort ();
6704     }
6705   if (mips_opts.micromips && brneg)
6706     macro_build_branch_likely (br, brneg, call, ep, "s,t,p", sreg, treg);
6707   else
6708     macro_build (ep, br, "s,t,p", sreg, treg);
6709 }
6710
6711 /*
6712  *                      Build macros
6713  *   This routine implements the seemingly endless macro or synthesized
6714  * instructions and addressing modes in the mips assembly language. Many
6715  * of these macros are simple and are similar to each other. These could
6716  * probably be handled by some kind of table or grammar approach instead of
6717  * this verbose method. Others are not simple macros but are more like
6718  * optimizing code generation.
6719  *   One interesting optimization is when several store macros appear
6720  * consecutively that would load AT with the upper half of the same address.
6721  * The ensuing load upper instructions are ommited. This implies some kind
6722  * of global optimization. We currently only optimize within a single macro.
6723  *   For many of the load and store macros if the address is specified as a
6724  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
6725  * first load register 'at' with zero and use it as the base register. The
6726  * mips assembler simply uses register $zero. Just one tiny optimization
6727  * we're missing.
6728  */
6729 static void
6730 macro (struct mips_cl_insn *ip)
6731 {
6732   unsigned int treg, sreg, dreg, breg;
6733   unsigned int tempreg;
6734   int mask;
6735   int used_at = 0;
6736   expressionS label_expr;
6737   expressionS expr1;
6738   expressionS *ep;
6739   const char *s;
6740   const char *s2;
6741   const char *fmt;
6742   int likely = 0;
6743   int coproc = 0;
6744   int offbits = 16;
6745   int call = 0;
6746   int jals = 0;
6747   int dbl = 0;
6748   int imm = 0;
6749   int ust = 0;
6750   int lp = 0;
6751   int ab = 0;
6752   int off;
6753   bfd_reloc_code_real_type r;
6754   int hold_mips_optimize;
6755
6756   gas_assert (! mips_opts.mips16);
6757
6758   treg = EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
6759   dreg = EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
6760   sreg = breg = EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
6761   mask = ip->insn_mo->mask;
6762
6763   label_expr.X_op = O_constant;
6764   label_expr.X_op_symbol = NULL;
6765   label_expr.X_add_symbol = NULL;
6766   label_expr.X_add_number = 0;
6767
6768   expr1.X_op = O_constant;
6769   expr1.X_op_symbol = NULL;
6770   expr1.X_add_symbol = NULL;
6771   expr1.X_add_number = 1;
6772
6773   switch (mask)
6774     {
6775     case M_DABS:
6776       dbl = 1;
6777     case M_ABS:
6778       /*    bgez    $a0,1f
6779             move    v0,$a0
6780             sub     v0,$zero,$a0
6781          1:
6782        */
6783
6784       start_noreorder ();
6785
6786       if (mips_opts.micromips)
6787         micromips_label_expr (&label_expr);
6788       else
6789         label_expr.X_add_number = 8;
6790       macro_build (&label_expr, "bgez", "s,p", sreg);
6791       if (dreg == sreg)
6792         macro_build (NULL, "nop", "");
6793       else
6794         move_register (dreg, sreg);
6795       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
6796       if (mips_opts.micromips)
6797         micromips_add_label ();
6798
6799       end_noreorder ();
6800       break;
6801
6802     case M_ADD_I:
6803       s = "addi";
6804       s2 = "add";
6805       goto do_addi;
6806     case M_ADDU_I:
6807       s = "addiu";
6808       s2 = "addu";
6809       goto do_addi;
6810     case M_DADD_I:
6811       dbl = 1;
6812       s = "daddi";
6813       s2 = "dadd";
6814       if (!mips_opts.micromips)
6815         goto do_addi;
6816       if (imm_expr.X_op == O_constant
6817           && imm_expr.X_add_number >= -0x200
6818           && imm_expr.X_add_number < 0x200)
6819         {
6820           macro_build (NULL, s, "t,r,.", treg, sreg, imm_expr.X_add_number);
6821           break;
6822         }
6823       goto do_addi_i;
6824     case M_DADDU_I:
6825       dbl = 1;
6826       s = "daddiu";
6827       s2 = "daddu";
6828     do_addi:
6829       if (imm_expr.X_op == O_constant
6830           && imm_expr.X_add_number >= -0x8000
6831           && imm_expr.X_add_number < 0x8000)
6832         {
6833           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
6834           break;
6835         }
6836     do_addi_i:
6837       used_at = 1;
6838       load_register (AT, &imm_expr, dbl);
6839       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6840       break;
6841
6842     case M_AND_I:
6843       s = "andi";
6844       s2 = "and";
6845       goto do_bit;
6846     case M_OR_I:
6847       s = "ori";
6848       s2 = "or";
6849       goto do_bit;
6850     case M_NOR_I:
6851       s = "";
6852       s2 = "nor";
6853       goto do_bit;
6854     case M_XOR_I:
6855       s = "xori";
6856       s2 = "xor";
6857     do_bit:
6858       if (imm_expr.X_op == O_constant
6859           && imm_expr.X_add_number >= 0
6860           && imm_expr.X_add_number < 0x10000)
6861         {
6862           if (mask != M_NOR_I)
6863             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
6864           else
6865             {
6866               macro_build (&imm_expr, "ori", "t,r,i",
6867                            treg, sreg, BFD_RELOC_LO16);
6868               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
6869             }
6870           break;
6871         }
6872
6873       used_at = 1;
6874       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
6875       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6876       break;
6877
6878     case M_BALIGN:
6879       switch (imm_expr.X_add_number)
6880         {
6881         case 0:
6882           macro_build (NULL, "nop", "");
6883           break;
6884         case 2:
6885           macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
6886           break;
6887         case 1:
6888         case 3:
6889           macro_build (NULL, "balign", "t,s,2", treg, sreg,
6890                        (int) imm_expr.X_add_number);
6891           break;
6892         default:
6893           as_bad (_("BALIGN immediate not 0, 1, 2 or 3 (%lu)"),
6894                   (unsigned long) imm_expr.X_add_number);
6895           break;
6896         }
6897       break;
6898
6899     case M_BC1FL:
6900     case M_BC1TL:
6901     case M_BC2FL:
6902     case M_BC2TL:
6903       gas_assert (mips_opts.micromips);
6904       macro_build_branch_ccl (mask, &offset_expr,
6905                               EXTRACT_OPERAND (1, BCC, *ip));
6906       break;
6907
6908     case M_BEQ_I:
6909     case M_BEQL_I:
6910     case M_BNE_I:
6911     case M_BNEL_I:
6912       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6913         treg = 0;
6914       else
6915         {
6916           treg = AT;
6917           used_at = 1;
6918           load_register (treg, &imm_expr, HAVE_64BIT_GPRS);
6919         }
6920       /* Fall through.  */
6921     case M_BEQL:
6922     case M_BNEL:
6923       macro_build_branch_rsrt (mask, &offset_expr, sreg, treg);
6924       break;
6925
6926     case M_BGEL:
6927       likely = 1;
6928     case M_BGE:
6929       if (treg == 0)
6930         macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, sreg);
6931       else if (sreg == 0)
6932         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, treg);
6933       else
6934         {
6935           used_at = 1;
6936           macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
6937           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6938                                    &offset_expr, AT, ZERO);
6939         }
6940       break;
6941
6942     case M_BGEZL:
6943     case M_BGEZALL:
6944     case M_BGTZL:
6945     case M_BLEZL:
6946     case M_BLTZL:
6947     case M_BLTZALL:
6948       macro_build_branch_rs (mask, &offset_expr, sreg);
6949       break;
6950
6951     case M_BGTL_I:
6952       likely = 1;
6953     case M_BGT_I:
6954       /* Check for > max integer.  */
6955       if (imm_expr.X_op == O_constant && imm_expr.X_add_number >= GPR_SMAX)
6956         {
6957         do_false:
6958           /* Result is always false.  */
6959           if (! likely)
6960             macro_build (NULL, "nop", "");
6961           else
6962             macro_build_branch_rsrt (M_BNEL, &offset_expr, ZERO, ZERO);
6963           break;
6964         }
6965       if (imm_expr.X_op != O_constant)
6966         as_bad (_("Unsupported large constant"));
6967       ++imm_expr.X_add_number;
6968       /* FALLTHROUGH */
6969     case M_BGE_I:
6970     case M_BGEL_I:
6971       if (mask == M_BGEL_I)
6972         likely = 1;
6973       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6974         {
6975           macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ,
6976                                  &offset_expr, sreg);
6977           break;
6978         }
6979       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6980         {
6981           macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ,
6982                                  &offset_expr, sreg);
6983           break;
6984         }
6985       if (imm_expr.X_op == O_constant && imm_expr.X_add_number <= GPR_SMIN)
6986         {
6987         do_true:
6988           /* result is always true */
6989           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
6990           macro_build (&offset_expr, "b", "p");
6991           break;
6992         }
6993       used_at = 1;
6994       set_at (sreg, 0);
6995       macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6996                                &offset_expr, AT, ZERO);
6997       break;
6998
6999     case M_BGEUL:
7000       likely = 1;
7001     case M_BGEU:
7002       if (treg == 0)
7003         goto do_true;
7004       else if (sreg == 0)
7005         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7006                                  &offset_expr, ZERO, treg);
7007       else
7008         {
7009           used_at = 1;
7010           macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
7011           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7012                                    &offset_expr, AT, ZERO);
7013         }
7014       break;
7015
7016     case M_BGTUL_I:
7017       likely = 1;
7018     case M_BGTU_I:
7019       if (sreg == 0
7020           || (HAVE_32BIT_GPRS
7021               && imm_expr.X_op == O_constant
7022               && imm_expr.X_add_number == -1))
7023         goto do_false;
7024       if (imm_expr.X_op != O_constant)
7025         as_bad (_("Unsupported large constant"));
7026       ++imm_expr.X_add_number;
7027       /* FALLTHROUGH */
7028     case M_BGEU_I:
7029     case M_BGEUL_I:
7030       if (mask == M_BGEUL_I)
7031         likely = 1;
7032       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7033         goto do_true;
7034       else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7035         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7036                                  &offset_expr, sreg, ZERO);
7037       else
7038         {
7039           used_at = 1;
7040           set_at (sreg, 1);
7041           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7042                                    &offset_expr, AT, ZERO);
7043         }
7044       break;
7045
7046     case M_BGTL:
7047       likely = 1;
7048     case M_BGT:
7049       if (treg == 0)
7050         macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, sreg);
7051       else if (sreg == 0)
7052         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, treg);
7053       else
7054         {
7055           used_at = 1;
7056           macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
7057           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7058                                    &offset_expr, AT, ZERO);
7059         }
7060       break;
7061
7062     case M_BGTUL:
7063       likely = 1;
7064     case M_BGTU:
7065       if (treg == 0)
7066         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7067                                  &offset_expr, sreg, ZERO);
7068       else if (sreg == 0)
7069         goto do_false;
7070       else
7071         {
7072           used_at = 1;
7073           macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
7074           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7075                                    &offset_expr, AT, ZERO);
7076         }
7077       break;
7078
7079     case M_BLEL:
7080       likely = 1;
7081     case M_BLE:
7082       if (treg == 0)
7083         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
7084       else if (sreg == 0)
7085         macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, treg);
7086       else
7087         {
7088           used_at = 1;
7089           macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
7090           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7091                                    &offset_expr, AT, ZERO);
7092         }
7093       break;
7094
7095     case M_BLEL_I:
7096       likely = 1;
7097     case M_BLE_I:
7098       if (imm_expr.X_op == O_constant && imm_expr.X_add_number >= GPR_SMAX)
7099         goto do_true;
7100       if (imm_expr.X_op != O_constant)
7101         as_bad (_("Unsupported large constant"));
7102       ++imm_expr.X_add_number;
7103       /* FALLTHROUGH */
7104     case M_BLT_I:
7105     case M_BLTL_I:
7106       if (mask == M_BLTL_I)
7107         likely = 1;
7108       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7109         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
7110       else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7111         macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
7112       else
7113         {
7114           used_at = 1;
7115           set_at (sreg, 0);
7116           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7117                                    &offset_expr, AT, ZERO);
7118         }
7119       break;
7120
7121     case M_BLEUL:
7122       likely = 1;
7123     case M_BLEU:
7124       if (treg == 0)
7125         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7126                                  &offset_expr, sreg, ZERO);
7127       else if (sreg == 0)
7128         goto do_true;
7129       else
7130         {
7131           used_at = 1;
7132           macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
7133           macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7134                                    &offset_expr, AT, ZERO);
7135         }
7136       break;
7137
7138     case M_BLEUL_I:
7139       likely = 1;
7140     case M_BLEU_I:
7141       if (sreg == 0
7142           || (HAVE_32BIT_GPRS
7143               && imm_expr.X_op == O_constant
7144               && imm_expr.X_add_number == -1))
7145         goto do_true;
7146       if (imm_expr.X_op != O_constant)
7147         as_bad (_("Unsupported large constant"));
7148       ++imm_expr.X_add_number;
7149       /* FALLTHROUGH */
7150     case M_BLTU_I:
7151     case M_BLTUL_I:
7152       if (mask == M_BLTUL_I)
7153         likely = 1;
7154       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7155         goto do_false;
7156       else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7157         macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7158                                  &offset_expr, sreg, ZERO);
7159       else
7160         {
7161           used_at = 1;
7162           set_at (sreg, 1);
7163           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7164                                    &offset_expr, AT, ZERO);
7165         }
7166       break;
7167
7168     case M_BLTL:
7169       likely = 1;
7170     case M_BLT:
7171       if (treg == 0)
7172         macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
7173       else if (sreg == 0)
7174         macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, treg);
7175       else
7176         {
7177           used_at = 1;
7178           macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
7179           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7180                                    &offset_expr, AT, ZERO);
7181         }
7182       break;
7183
7184     case M_BLTUL:
7185       likely = 1;
7186     case M_BLTU:
7187       if (treg == 0)
7188         goto do_false;
7189       else if (sreg == 0)
7190         macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7191                                  &offset_expr, ZERO, treg);
7192       else
7193         {
7194           used_at = 1;
7195           macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
7196           macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7197                                    &offset_expr, AT, ZERO);
7198         }
7199       break;
7200
7201     case M_DEXT:
7202       {
7203         /* Use unsigned arithmetic.  */
7204         addressT pos;
7205         addressT size;
7206
7207         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
7208           {
7209             as_bad (_("Unsupported large constant"));
7210             pos = size = 1;
7211           }
7212         else
7213           {
7214             pos = imm_expr.X_add_number;
7215             size = imm2_expr.X_add_number;
7216           }
7217
7218         if (pos > 63)
7219           {
7220             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
7221             pos = 1;
7222           }
7223         if (size == 0 || size > 64 || (pos + size - 1) > 63)
7224           {
7225             as_bad (_("Improper extract size (%lu, position %lu)"),
7226                     (unsigned long) size, (unsigned long) pos);
7227             size = 1;
7228           }
7229
7230         if (size <= 32 && pos < 32)
7231           {
7232             s = "dext";
7233             fmt = "t,r,+A,+C";
7234           }
7235         else if (size <= 32)
7236           {
7237             s = "dextu";
7238             fmt = "t,r,+E,+H";
7239           }
7240         else
7241           {
7242             s = "dextm";
7243             fmt = "t,r,+A,+G";
7244           }
7245         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
7246                      (int) (size - 1));
7247       }
7248       break;
7249
7250     case M_DINS:
7251       {
7252         /* Use unsigned arithmetic.  */
7253         addressT pos;
7254         addressT size;
7255
7256         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
7257           {
7258             as_bad (_("Unsupported large constant"));
7259             pos = size = 1;
7260           }
7261         else
7262           {
7263             pos = imm_expr.X_add_number;
7264             size = imm2_expr.X_add_number;
7265           }
7266
7267         if (pos > 63)
7268           {
7269             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
7270             pos = 1;
7271           }
7272         if (size == 0 || size > 64 || (pos + size - 1) > 63)
7273           {
7274             as_bad (_("Improper insert size (%lu, position %lu)"),
7275                     (unsigned long) size, (unsigned long) pos);
7276             size = 1;
7277           }
7278
7279         if (pos < 32 && (pos + size - 1) < 32)
7280           {
7281             s = "dins";
7282             fmt = "t,r,+A,+B";
7283           }
7284         else if (pos >= 32)
7285           {
7286             s = "dinsu";
7287             fmt = "t,r,+E,+F";
7288           }
7289         else
7290           {
7291             s = "dinsm";
7292             fmt = "t,r,+A,+F";
7293           }
7294         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
7295                      (int) (pos + size - 1));
7296       }
7297       break;
7298
7299     case M_DDIV_3:
7300       dbl = 1;
7301     case M_DIV_3:
7302       s = "mflo";
7303       goto do_div3;
7304     case M_DREM_3:
7305       dbl = 1;
7306     case M_REM_3:
7307       s = "mfhi";
7308     do_div3:
7309       if (treg == 0)
7310         {
7311           as_warn (_("Divide by zero."));
7312           if (mips_trap)
7313             macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
7314           else
7315             macro_build (NULL, "break", BRK_FMT, 7);
7316           break;
7317         }
7318
7319       start_noreorder ();
7320       if (mips_trap)
7321         {
7322           macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
7323           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
7324         }
7325       else
7326         {
7327           if (mips_opts.micromips)
7328             micromips_label_expr (&label_expr);
7329           else
7330             label_expr.X_add_number = 8;
7331           macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
7332           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
7333           macro_build (NULL, "break", BRK_FMT, 7);
7334           if (mips_opts.micromips)
7335             micromips_add_label ();
7336         }
7337       expr1.X_add_number = -1;
7338       used_at = 1;
7339       load_register (AT, &expr1, dbl);
7340       if (mips_opts.micromips)
7341         micromips_label_expr (&label_expr);
7342       else
7343         label_expr.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
7344       macro_build (&label_expr, "bne", "s,t,p", treg, AT);
7345       if (dbl)
7346         {
7347           expr1.X_add_number = 1;
7348           load_register (AT, &expr1, dbl);
7349           macro_build (NULL, "dsll32", SHFT_FMT, AT, AT, 31);
7350         }
7351       else
7352         {
7353           expr1.X_add_number = 0x80000000;
7354           macro_build (&expr1, "lui", LUI_FMT, AT, BFD_RELOC_HI16);
7355         }
7356       if (mips_trap)
7357         {
7358           macro_build (NULL, "teq", TRAP_FMT, sreg, AT, 6);
7359           /* We want to close the noreorder block as soon as possible, so
7360              that later insns are available for delay slot filling.  */
7361           end_noreorder ();
7362         }
7363       else
7364         {
7365           if (mips_opts.micromips)
7366             micromips_label_expr (&label_expr);
7367           else
7368             label_expr.X_add_number = 8;
7369           macro_build (&label_expr, "bne", "s,t,p", sreg, AT);
7370           macro_build (NULL, "nop", "");
7371
7372           /* We want to close the noreorder block as soon as possible, so
7373              that later insns are available for delay slot filling.  */
7374           end_noreorder ();
7375
7376           macro_build (NULL, "break", BRK_FMT, 6);
7377         }
7378       if (mips_opts.micromips)
7379         micromips_add_label ();
7380       macro_build (NULL, s, MFHL_FMT, dreg);
7381       break;
7382
7383     case M_DIV_3I:
7384       s = "div";
7385       s2 = "mflo";
7386       goto do_divi;
7387     case M_DIVU_3I:
7388       s = "divu";
7389       s2 = "mflo";
7390       goto do_divi;
7391     case M_REM_3I:
7392       s = "div";
7393       s2 = "mfhi";
7394       goto do_divi;
7395     case M_REMU_3I:
7396       s = "divu";
7397       s2 = "mfhi";
7398       goto do_divi;
7399     case M_DDIV_3I:
7400       dbl = 1;
7401       s = "ddiv";
7402       s2 = "mflo";
7403       goto do_divi;
7404     case M_DDIVU_3I:
7405       dbl = 1;
7406       s = "ddivu";
7407       s2 = "mflo";
7408       goto do_divi;
7409     case M_DREM_3I:
7410       dbl = 1;
7411       s = "ddiv";
7412       s2 = "mfhi";
7413       goto do_divi;
7414     case M_DREMU_3I:
7415       dbl = 1;
7416       s = "ddivu";
7417       s2 = "mfhi";
7418     do_divi:
7419       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7420         {
7421           as_warn (_("Divide by zero."));
7422           if (mips_trap)
7423             macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
7424           else
7425             macro_build (NULL, "break", BRK_FMT, 7);
7426           break;
7427         }
7428       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7429         {
7430           if (strcmp (s2, "mflo") == 0)
7431             move_register (dreg, sreg);
7432           else
7433             move_register (dreg, ZERO);
7434           break;
7435         }
7436       if (imm_expr.X_op == O_constant
7437           && imm_expr.X_add_number == -1
7438           && s[strlen (s) - 1] != 'u')
7439         {
7440           if (strcmp (s2, "mflo") == 0)
7441             {
7442               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
7443             }
7444           else
7445             move_register (dreg, ZERO);
7446           break;
7447         }
7448
7449       used_at = 1;
7450       load_register (AT, &imm_expr, dbl);
7451       macro_build (NULL, s, "z,s,t", sreg, AT);
7452       macro_build (NULL, s2, MFHL_FMT, dreg);
7453       break;
7454
7455     case M_DIVU_3:
7456       s = "divu";
7457       s2 = "mflo";
7458       goto do_divu3;
7459     case M_REMU_3:
7460       s = "divu";
7461       s2 = "mfhi";
7462       goto do_divu3;
7463     case M_DDIVU_3:
7464       s = "ddivu";
7465       s2 = "mflo";
7466       goto do_divu3;
7467     case M_DREMU_3:
7468       s = "ddivu";
7469       s2 = "mfhi";
7470     do_divu3:
7471       start_noreorder ();
7472       if (mips_trap)
7473         {
7474           macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
7475           macro_build (NULL, s, "z,s,t", sreg, treg);
7476           /* We want to close the noreorder block as soon as possible, so
7477              that later insns are available for delay slot filling.  */
7478           end_noreorder ();
7479         }
7480       else
7481         {
7482           if (mips_opts.micromips)
7483             micromips_label_expr (&label_expr);
7484           else
7485             label_expr.X_add_number = 8;
7486           macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
7487           macro_build (NULL, s, "z,s,t", sreg, treg);
7488
7489           /* We want to close the noreorder block as soon as possible, so
7490              that later insns are available for delay slot filling.  */
7491           end_noreorder ();
7492           macro_build (NULL, "break", BRK_FMT, 7);
7493           if (mips_opts.micromips)
7494             micromips_add_label ();
7495         }
7496       macro_build (NULL, s2, MFHL_FMT, dreg);
7497       break;
7498
7499     case M_DLCA_AB:
7500       dbl = 1;
7501     case M_LCA_AB:
7502       call = 1;
7503       goto do_la;
7504     case M_DLA_AB:
7505       dbl = 1;
7506     case M_LA_AB:
7507     do_la:
7508       /* Load the address of a symbol into a register.  If breg is not
7509          zero, we then add a base register to it.  */
7510
7511       if (dbl && HAVE_32BIT_GPRS)
7512         as_warn (_("dla used to load 32-bit register"));
7513
7514       if (!dbl && HAVE_64BIT_OBJECTS)
7515         as_warn (_("la used to load 64-bit address"));
7516
7517       if (offset_expr.X_op == O_constant
7518           && offset_expr.X_add_number >= -0x8000
7519           && offset_expr.X_add_number < 0x8000)
7520         {
7521           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
7522                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
7523           break;
7524         }
7525
7526       if (mips_opts.at && (treg == breg))
7527         {
7528           tempreg = AT;
7529           used_at = 1;
7530         }
7531       else
7532         {
7533           tempreg = treg;
7534         }
7535
7536       if (offset_expr.X_op != O_symbol
7537           && offset_expr.X_op != O_constant)
7538         {
7539           as_bad (_("Expression too complex"));
7540           offset_expr.X_op = O_constant;
7541         }
7542
7543       if (offset_expr.X_op == O_constant)
7544         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
7545       else if (mips_pic == NO_PIC)
7546         {
7547           /* If this is a reference to a GP relative symbol, we want
7548                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
7549              Otherwise we want
7550                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
7551                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7552              If we have a constant, we need two instructions anyhow,
7553              so we may as well always use the latter form.
7554
7555              With 64bit address space and a usable $at we want
7556                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
7557                lui      $at,<sym>               (BFD_RELOC_HI16_S)
7558                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
7559                daddiu   $at,<sym>               (BFD_RELOC_LO16)
7560                dsll32   $tempreg,0
7561                daddu    $tempreg,$tempreg,$at
7562
7563              If $at is already in use, we use a path which is suboptimal
7564              on superscalar processors.
7565                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
7566                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
7567                dsll     $tempreg,16
7568                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
7569                dsll     $tempreg,16
7570                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
7571
7572              For GP relative symbols in 64bit address space we can use
7573              the same sequence as in 32bit address space.  */
7574           if (HAVE_64BIT_SYMBOLS)
7575             {
7576               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7577                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7578                 {
7579                   relax_start (offset_expr.X_add_symbol);
7580                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7581                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7582                   relax_switch ();
7583                 }
7584
7585               if (used_at == 0 && mips_opts.at)
7586                 {
7587                   macro_build (&offset_expr, "lui", LUI_FMT,
7588                                tempreg, BFD_RELOC_MIPS_HIGHEST);
7589                   macro_build (&offset_expr, "lui", LUI_FMT,
7590                                AT, BFD_RELOC_HI16_S);
7591                   macro_build (&offset_expr, "daddiu", "t,r,j",
7592                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7593                   macro_build (&offset_expr, "daddiu", "t,r,j",
7594                                AT, AT, BFD_RELOC_LO16);
7595                   macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
7596                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
7597                   used_at = 1;
7598                 }
7599               else
7600                 {
7601                   macro_build (&offset_expr, "lui", LUI_FMT,
7602                                tempreg, BFD_RELOC_MIPS_HIGHEST);
7603                   macro_build (&offset_expr, "daddiu", "t,r,j",
7604                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7605                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7606                   macro_build (&offset_expr, "daddiu", "t,r,j",
7607                                tempreg, tempreg, BFD_RELOC_HI16_S);
7608                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7609                   macro_build (&offset_expr, "daddiu", "t,r,j",
7610                                tempreg, tempreg, BFD_RELOC_LO16);
7611                 }
7612
7613               if (mips_relax.sequence)
7614                 relax_end ();
7615             }
7616           else
7617             {
7618               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7619                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7620                 {
7621                   relax_start (offset_expr.X_add_symbol);
7622                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7623                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7624                   relax_switch ();
7625                 }
7626               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7627                 as_bad (_("Offset too large"));
7628               macro_build_lui (&offset_expr, tempreg);
7629               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7630                            tempreg, tempreg, BFD_RELOC_LO16);
7631               if (mips_relax.sequence)
7632                 relax_end ();
7633             }
7634         }
7635       else if (!mips_big_got && !HAVE_NEWABI)
7636         {
7637           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7638
7639           /* If this is a reference to an external symbol, and there
7640              is no constant, we want
7641                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7642              or for lca or if tempreg is PIC_CALL_REG
7643                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
7644              For a local symbol, we want
7645                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7646                nop
7647                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7648
7649              If we have a small constant, and this is a reference to
7650              an external symbol, we want
7651                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7652                nop
7653                addiu    $tempreg,$tempreg,<constant>
7654              For a local symbol, we want the same instruction
7655              sequence, but we output a BFD_RELOC_LO16 reloc on the
7656              addiu instruction.
7657
7658              If we have a large constant, and this is a reference to
7659              an external symbol, we want
7660                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7661                lui      $at,<hiconstant>
7662                addiu    $at,$at,<loconstant>
7663                addu     $tempreg,$tempreg,$at
7664              For a local symbol, we want the same instruction
7665              sequence, but we output a BFD_RELOC_LO16 reloc on the
7666              addiu instruction.
7667            */
7668
7669           if (offset_expr.X_add_number == 0)
7670             {
7671               if (mips_pic == SVR4_PIC
7672                   && breg == 0
7673                   && (call || tempreg == PIC_CALL_REG))
7674                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
7675
7676               relax_start (offset_expr.X_add_symbol);
7677               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7678                            lw_reloc_type, mips_gp_register);
7679               if (breg != 0)
7680                 {
7681                   /* We're going to put in an addu instruction using
7682                      tempreg, so we may as well insert the nop right
7683                      now.  */
7684                   load_delay_nop ();
7685                 }
7686               relax_switch ();
7687               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7688                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
7689               load_delay_nop ();
7690               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7691                            tempreg, tempreg, BFD_RELOC_LO16);
7692               relax_end ();
7693               /* FIXME: If breg == 0, and the next instruction uses
7694                  $tempreg, then if this variant case is used an extra
7695                  nop will be generated.  */
7696             }
7697           else if (offset_expr.X_add_number >= -0x8000
7698                    && offset_expr.X_add_number < 0x8000)
7699             {
7700               load_got_offset (tempreg, &offset_expr);
7701               load_delay_nop ();
7702               add_got_offset (tempreg, &offset_expr);
7703             }
7704           else
7705             {
7706               expr1.X_add_number = offset_expr.X_add_number;
7707               offset_expr.X_add_number =
7708                 SEXT_16BIT (offset_expr.X_add_number);
7709               load_got_offset (tempreg, &offset_expr);
7710               offset_expr.X_add_number = expr1.X_add_number;
7711               /* If we are going to add in a base register, and the
7712                  target register and the base register are the same,
7713                  then we are using AT as a temporary register.  Since
7714                  we want to load the constant into AT, we add our
7715                  current AT (from the global offset table) and the
7716                  register into the register now, and pretend we were
7717                  not using a base register.  */
7718               if (breg == treg)
7719                 {
7720                   load_delay_nop ();
7721                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7722                                treg, AT, breg);
7723                   breg = 0;
7724                   tempreg = treg;
7725                 }
7726               add_got_offset_hilo (tempreg, &offset_expr, AT);
7727               used_at = 1;
7728             }
7729         }
7730       else if (!mips_big_got && HAVE_NEWABI)
7731         {
7732           int add_breg_early = 0;
7733
7734           /* If this is a reference to an external, and there is no
7735              constant, or local symbol (*), with or without a
7736              constant, we want
7737                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7738              or for lca or if tempreg is PIC_CALL_REG
7739                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
7740
7741              If we have a small constant, and this is a reference to
7742              an external symbol, we want
7743                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7744                addiu    $tempreg,$tempreg,<constant>
7745
7746              If we have a large constant, and this is a reference to
7747              an external symbol, we want
7748                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7749                lui      $at,<hiconstant>
7750                addiu    $at,$at,<loconstant>
7751                addu     $tempreg,$tempreg,$at
7752
7753              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
7754              local symbols, even though it introduces an additional
7755              instruction.  */
7756
7757           if (offset_expr.X_add_number)
7758             {
7759               expr1.X_add_number = offset_expr.X_add_number;
7760               offset_expr.X_add_number = 0;
7761
7762               relax_start (offset_expr.X_add_symbol);
7763               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7764                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7765
7766               if (expr1.X_add_number >= -0x8000
7767                   && expr1.X_add_number < 0x8000)
7768                 {
7769                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7770                                tempreg, tempreg, BFD_RELOC_LO16);
7771                 }
7772               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
7773                 {
7774                   /* If we are going to add in a base register, and the
7775                      target register and the base register are the same,
7776                      then we are using AT as a temporary register.  Since
7777                      we want to load the constant into AT, we add our
7778                      current AT (from the global offset table) and the
7779                      register into the register now, and pretend we were
7780                      not using a base register.  */
7781                   if (breg != treg)
7782                     dreg = tempreg;
7783                   else
7784                     {
7785                       gas_assert (tempreg == AT);
7786                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7787                                    treg, AT, breg);
7788                       dreg = treg;
7789                       add_breg_early = 1;
7790                     }
7791
7792                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7793                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7794                                dreg, dreg, AT);
7795
7796                   used_at = 1;
7797                 }
7798               else
7799                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
7800
7801               relax_switch ();
7802               offset_expr.X_add_number = expr1.X_add_number;
7803
7804               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7805                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7806               if (add_breg_early)
7807                 {
7808                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7809                                treg, tempreg, breg);
7810                   breg = 0;
7811                   tempreg = treg;
7812                 }
7813               relax_end ();
7814             }
7815           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
7816             {
7817               relax_start (offset_expr.X_add_symbol);
7818               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7819                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
7820               relax_switch ();
7821               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7822                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7823               relax_end ();
7824             }
7825           else
7826             {
7827               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7828                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7829             }
7830         }
7831       else if (mips_big_got && !HAVE_NEWABI)
7832         {
7833           int gpdelay;
7834           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7835           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7836           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7837
7838           /* This is the large GOT case.  If this is a reference to an
7839              external symbol, and there is no constant, we want
7840                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7841                addu     $tempreg,$tempreg,$gp
7842                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7843              or for lca or if tempreg is PIC_CALL_REG
7844                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
7845                addu     $tempreg,$tempreg,$gp
7846                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
7847              For a local symbol, we want
7848                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7849                nop
7850                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7851
7852              If we have a small constant, and this is a reference to
7853              an external symbol, we want
7854                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7855                addu     $tempreg,$tempreg,$gp
7856                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7857                nop
7858                addiu    $tempreg,$tempreg,<constant>
7859              For a local symbol, we want
7860                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7861                nop
7862                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
7863
7864              If we have a large constant, and this is a reference to
7865              an external symbol, we want
7866                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7867                addu     $tempreg,$tempreg,$gp
7868                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7869                lui      $at,<hiconstant>
7870                addiu    $at,$at,<loconstant>
7871                addu     $tempreg,$tempreg,$at
7872              For a local symbol, we want
7873                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7874                lui      $at,<hiconstant>
7875                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
7876                addu     $tempreg,$tempreg,$at
7877           */
7878
7879           expr1.X_add_number = offset_expr.X_add_number;
7880           offset_expr.X_add_number = 0;
7881           relax_start (offset_expr.X_add_symbol);
7882           gpdelay = reg_needs_delay (mips_gp_register);
7883           if (expr1.X_add_number == 0 && breg == 0
7884               && (call || tempreg == PIC_CALL_REG))
7885             {
7886               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
7887               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
7888             }
7889           macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
7890           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7891                        tempreg, tempreg, mips_gp_register);
7892           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7893                        tempreg, lw_reloc_type, tempreg);
7894           if (expr1.X_add_number == 0)
7895             {
7896               if (breg != 0)
7897                 {
7898                   /* We're going to put in an addu instruction using
7899                      tempreg, so we may as well insert the nop right
7900                      now.  */
7901                   load_delay_nop ();
7902                 }
7903             }
7904           else if (expr1.X_add_number >= -0x8000
7905                    && expr1.X_add_number < 0x8000)
7906             {
7907               load_delay_nop ();
7908               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7909                            tempreg, tempreg, BFD_RELOC_LO16);
7910             }
7911           else
7912             {
7913               /* If we are going to add in a base register, and the
7914                  target register and the base register are the same,
7915                  then we are using AT as a temporary register.  Since
7916                  we want to load the constant into AT, we add our
7917                  current AT (from the global offset table) and the
7918                  register into the register now, and pretend we were
7919                  not using a base register.  */
7920               if (breg != treg)
7921                 dreg = tempreg;
7922               else
7923                 {
7924                   gas_assert (tempreg == AT);
7925                   load_delay_nop ();
7926                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7927                                treg, AT, breg);
7928                   dreg = treg;
7929                 }
7930
7931               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7932               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
7933
7934               used_at = 1;
7935             }
7936           offset_expr.X_add_number = SEXT_16BIT (expr1.X_add_number);
7937           relax_switch ();
7938
7939           if (gpdelay)
7940             {
7941               /* This is needed because this instruction uses $gp, but
7942                  the first instruction on the main stream does not.  */
7943               macro_build (NULL, "nop", "");
7944             }
7945
7946           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7947                        local_reloc_type, mips_gp_register);
7948           if (expr1.X_add_number >= -0x8000
7949               && expr1.X_add_number < 0x8000)
7950             {
7951               load_delay_nop ();
7952               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7953                            tempreg, tempreg, BFD_RELOC_LO16);
7954               /* FIXME: If add_number is 0, and there was no base
7955                  register, the external symbol case ended with a load,
7956                  so if the symbol turns out to not be external, and
7957                  the next instruction uses tempreg, an unnecessary nop
7958                  will be inserted.  */
7959             }
7960           else
7961             {
7962               if (breg == treg)
7963                 {
7964                   /* We must add in the base register now, as in the
7965                      external symbol case.  */
7966                   gas_assert (tempreg == AT);
7967                   load_delay_nop ();
7968                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7969                                treg, AT, breg);
7970                   tempreg = treg;
7971                   /* We set breg to 0 because we have arranged to add
7972                      it in in both cases.  */
7973                   breg = 0;
7974                 }
7975
7976               macro_build_lui (&expr1, AT);
7977               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7978                            AT, AT, BFD_RELOC_LO16);
7979               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7980                            tempreg, tempreg, AT);
7981               used_at = 1;
7982             }
7983           relax_end ();
7984         }
7985       else if (mips_big_got && HAVE_NEWABI)
7986         {
7987           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7988           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7989           int add_breg_early = 0;
7990
7991           /* This is the large GOT case.  If this is a reference to an
7992              external symbol, and there is no constant, we want
7993                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7994                add      $tempreg,$tempreg,$gp
7995                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7996              or for lca or if tempreg is PIC_CALL_REG
7997                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
7998                add      $tempreg,$tempreg,$gp
7999                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
8000
8001              If we have a small constant, and this is a reference to
8002              an external symbol, we want
8003                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
8004                add      $tempreg,$tempreg,$gp
8005                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8006                addi     $tempreg,$tempreg,<constant>
8007
8008              If we have a large constant, and this is a reference to
8009              an external symbol, we want
8010                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
8011                addu     $tempreg,$tempreg,$gp
8012                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8013                lui      $at,<hiconstant>
8014                addi     $at,$at,<loconstant>
8015                add      $tempreg,$tempreg,$at
8016
8017              If we have NewABI, and we know it's a local symbol, we want
8018                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
8019                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
8020              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
8021
8022           relax_start (offset_expr.X_add_symbol);
8023
8024           expr1.X_add_number = offset_expr.X_add_number;
8025           offset_expr.X_add_number = 0;
8026
8027           if (expr1.X_add_number == 0 && breg == 0
8028               && (call || tempreg == PIC_CALL_REG))
8029             {
8030               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
8031               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
8032             }
8033           macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
8034           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8035                        tempreg, tempreg, mips_gp_register);
8036           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8037                        tempreg, lw_reloc_type, tempreg);
8038
8039           if (expr1.X_add_number == 0)
8040             ;
8041           else if (expr1.X_add_number >= -0x8000
8042                    && expr1.X_add_number < 0x8000)
8043             {
8044               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
8045                            tempreg, tempreg, BFD_RELOC_LO16);
8046             }
8047           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
8048             {
8049               /* If we are going to add in a base register, and the
8050                  target register and the base register are the same,
8051                  then we are using AT as a temporary register.  Since
8052                  we want to load the constant into AT, we add our
8053                  current AT (from the global offset table) and the
8054                  register into the register now, and pretend we were
8055                  not using a base register.  */
8056               if (breg != treg)
8057                 dreg = tempreg;
8058               else
8059                 {
8060                   gas_assert (tempreg == AT);
8061                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8062                                treg, AT, breg);
8063                   dreg = treg;
8064                   add_breg_early = 1;
8065                 }
8066
8067               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
8068               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
8069
8070               used_at = 1;
8071             }
8072           else
8073             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
8074
8075           relax_switch ();
8076           offset_expr.X_add_number = expr1.X_add_number;
8077           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8078                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
8079           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
8080                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
8081           if (add_breg_early)
8082             {
8083               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8084                            treg, tempreg, breg);
8085               breg = 0;
8086               tempreg = treg;
8087             }
8088           relax_end ();
8089         }
8090       else
8091         abort ();
8092
8093       if (breg != 0)
8094         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
8095       break;
8096
8097     case M_MSGSND:
8098       gas_assert (!mips_opts.micromips);
8099       {
8100         unsigned long temp = (treg << 16) | (0x01);
8101         macro_build (NULL, "c2", "C", temp);
8102       }
8103       break;
8104
8105     case M_MSGLD:
8106       gas_assert (!mips_opts.micromips);
8107       {
8108         unsigned long temp = (0x02);
8109         macro_build (NULL, "c2", "C", temp);
8110       }
8111       break;
8112
8113     case M_MSGLD_T:
8114       gas_assert (!mips_opts.micromips);
8115       {
8116         unsigned long temp = (treg << 16) | (0x02);
8117         macro_build (NULL, "c2", "C", temp);
8118       }
8119       break;
8120
8121     case M_MSGWAIT:
8122       gas_assert (!mips_opts.micromips);
8123       macro_build (NULL, "c2", "C", 3);
8124       break;
8125
8126     case M_MSGWAIT_T:
8127       gas_assert (!mips_opts.micromips);
8128       {
8129         unsigned long temp = (treg << 16) | 0x03;
8130         macro_build (NULL, "c2", "C", temp);
8131       }
8132       break;
8133
8134     case M_J_A:
8135       /* The j instruction may not be used in PIC code, since it
8136          requires an absolute address.  We convert it to a b
8137          instruction.  */
8138       if (mips_pic == NO_PIC)
8139         macro_build (&offset_expr, "j", "a");
8140       else
8141         macro_build (&offset_expr, "b", "p");
8142       break;
8143
8144       /* The jal instructions must be handled as macros because when
8145          generating PIC code they expand to multi-instruction
8146          sequences.  Normally they are simple instructions.  */
8147     case M_JALS_1:
8148       dreg = RA;
8149       /* Fall through.  */
8150     case M_JALS_2:
8151       gas_assert (mips_opts.micromips);
8152       jals = 1;
8153       goto jal;
8154     case M_JAL_1:
8155       dreg = RA;
8156       /* Fall through.  */
8157     case M_JAL_2:
8158     jal:
8159       if (mips_pic == NO_PIC)
8160         {
8161           s = jals ? "jalrs" : "jalr";
8162           if (mips_opts.micromips
8163               && dreg == RA
8164               && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
8165             macro_build (NULL, s, "mj", sreg);
8166           else
8167             macro_build (NULL, s, JALR_FMT, dreg, sreg);
8168         }
8169       else
8170         {
8171           int cprestore = (mips_pic == SVR4_PIC && !HAVE_NEWABI
8172                            && mips_cprestore_offset >= 0);
8173
8174           if (sreg != PIC_CALL_REG)
8175             as_warn (_("MIPS PIC call to register other than $25"));
8176
8177           s = (mips_opts.micromips && (!mips_opts.noreorder || cprestore)
8178                ? "jalrs" : "jalr");
8179           if (mips_opts.micromips
8180               && dreg == RA
8181               && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
8182             macro_build (NULL, s, "mj", sreg);
8183           else
8184             macro_build (NULL, s, JALR_FMT, dreg, sreg);
8185           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
8186             {
8187               if (mips_cprestore_offset < 0)
8188                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
8189               else
8190                 {
8191                   if (!mips_frame_reg_valid)
8192                     {
8193                       as_warn (_("No .frame pseudo-op used in PIC code"));
8194                       /* Quiet this warning.  */
8195                       mips_frame_reg_valid = 1;
8196                     }
8197                   if (!mips_cprestore_valid)
8198                     {
8199                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
8200                       /* Quiet this warning.  */
8201                       mips_cprestore_valid = 1;
8202                     }
8203                   if (mips_opts.noreorder)
8204                     macro_build (NULL, "nop", "");
8205                   expr1.X_add_number = mips_cprestore_offset;
8206                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
8207                                                 mips_gp_register,
8208                                                 mips_frame_reg,
8209                                                 HAVE_64BIT_ADDRESSES);
8210                 }
8211             }
8212         }
8213
8214       break;
8215
8216     case M_JALS_A:
8217       gas_assert (mips_opts.micromips);
8218       jals = 1;
8219       /* Fall through.  */
8220     case M_JAL_A:
8221       if (mips_pic == NO_PIC)
8222         macro_build (&offset_expr, jals ? "jals" : "jal", "a");
8223       else if (mips_pic == SVR4_PIC)
8224         {
8225           /* If this is a reference to an external symbol, and we are
8226              using a small GOT, we want
8227                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
8228                nop
8229                jalr     $ra,$25
8230                nop
8231                lw       $gp,cprestore($sp)
8232              The cprestore value is set using the .cprestore
8233              pseudo-op.  If we are using a big GOT, we want
8234                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
8235                addu     $25,$25,$gp
8236                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
8237                nop
8238                jalr     $ra,$25
8239                nop
8240                lw       $gp,cprestore($sp)
8241              If the symbol is not external, we want
8242                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
8243                nop
8244                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
8245                jalr     $ra,$25
8246                nop
8247                lw $gp,cprestore($sp)
8248
8249              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
8250              sequences above, minus nops, unless the symbol is local,
8251              which enables us to use GOT_PAGE/GOT_OFST (big got) or
8252              GOT_DISP.  */
8253           if (HAVE_NEWABI)
8254             {
8255               if (!mips_big_got)
8256                 {
8257                   relax_start (offset_expr.X_add_symbol);
8258                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8259                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
8260                                mips_gp_register);
8261                   relax_switch ();
8262                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8263                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
8264                                mips_gp_register);
8265                   relax_end ();
8266                 }
8267               else
8268                 {
8269                   relax_start (offset_expr.X_add_symbol);
8270                   macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
8271                                BFD_RELOC_MIPS_CALL_HI16);
8272                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
8273                                PIC_CALL_REG, mips_gp_register);
8274                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8275                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
8276                                PIC_CALL_REG);
8277                   relax_switch ();
8278                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8279                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
8280                                mips_gp_register);
8281                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8282                                PIC_CALL_REG, PIC_CALL_REG,
8283                                BFD_RELOC_MIPS_GOT_OFST);
8284                   relax_end ();
8285                 }
8286
8287               macro_build_jalr (&offset_expr, 0);
8288             }
8289           else
8290             {
8291               relax_start (offset_expr.X_add_symbol);
8292               if (!mips_big_got)
8293                 {
8294                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8295                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
8296                                mips_gp_register);
8297                   load_delay_nop ();
8298                   relax_switch ();
8299                 }
8300               else
8301                 {
8302                   int gpdelay;
8303
8304                   gpdelay = reg_needs_delay (mips_gp_register);
8305                   macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
8306                                BFD_RELOC_MIPS_CALL_HI16);
8307                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
8308                                PIC_CALL_REG, mips_gp_register);
8309                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8310                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
8311                                PIC_CALL_REG);
8312                   load_delay_nop ();
8313                   relax_switch ();
8314                   if (gpdelay)
8315                     macro_build (NULL, "nop", "");
8316                 }
8317               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8318                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
8319                            mips_gp_register);
8320               load_delay_nop ();
8321               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8322                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
8323               relax_end ();
8324               macro_build_jalr (&offset_expr, mips_cprestore_offset >= 0);
8325
8326               if (mips_cprestore_offset < 0)
8327                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
8328               else
8329                 {
8330                   if (!mips_frame_reg_valid)
8331                     {
8332                       as_warn (_("No .frame pseudo-op used in PIC code"));
8333                       /* Quiet this warning.  */
8334                       mips_frame_reg_valid = 1;
8335                     }
8336                   if (!mips_cprestore_valid)
8337                     {
8338                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
8339                       /* Quiet this warning.  */
8340                       mips_cprestore_valid = 1;
8341                     }
8342                   if (mips_opts.noreorder)
8343                     macro_build (NULL, "nop", "");
8344                   expr1.X_add_number = mips_cprestore_offset;
8345                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
8346                                                 mips_gp_register,
8347                                                 mips_frame_reg,
8348                                                 HAVE_64BIT_ADDRESSES);
8349                 }
8350             }
8351         }
8352       else if (mips_pic == VXWORKS_PIC)
8353         as_bad (_("Non-PIC jump used in PIC library"));
8354       else
8355         abort ();
8356
8357       break;
8358
8359     case M_LBUE_AB:
8360       ab = 1;
8361     case M_LBUE_OB:
8362       s = "lbue";
8363       fmt = "t,+j(b)";
8364       offbits = 9;
8365       goto ld_st;
8366     case M_LHUE_AB:
8367       ab = 1;
8368     case M_LHUE_OB:
8369       s = "lhue";
8370       fmt = "t,+j(b)";
8371       offbits = 9;
8372       goto ld_st;
8373     case M_LBE_AB:
8374       ab = 1;
8375     case M_LBE_OB:
8376       s = "lbe";
8377       fmt = "t,+j(b)";
8378       offbits = 9;
8379       goto ld_st;
8380     case M_LHE_AB:
8381       ab = 1;
8382     case M_LHE_OB:
8383       s = "lhe";
8384       fmt = "t,+j(b)";
8385       offbits = 9;
8386       goto ld_st;
8387     case M_LLE_AB:
8388       ab = 1;
8389     case M_LLE_OB:
8390       s = "lle";
8391       fmt = "t,+j(b)";
8392       offbits = 9;
8393       goto ld_st;
8394     case M_LWE_AB:
8395       ab = 1;
8396     case M_LWE_OB:
8397       s = "lwe";
8398       fmt = "t,+j(b)";
8399       offbits = 9;
8400       goto ld_st;
8401     case M_LWLE_AB:
8402       ab = 1;
8403     case M_LWLE_OB:
8404       s = "lwle";
8405       fmt = "t,+j(b)";
8406       offbits = 9;
8407       goto ld_st;
8408     case M_LWRE_AB:
8409       ab = 1;
8410     case M_LWRE_OB:
8411       s = "lwre";
8412       fmt = "t,+j(b)";
8413       offbits = 9;
8414       goto ld_st;
8415     case M_SBE_AB:
8416       ab = 1;
8417     case M_SBE_OB:
8418       s = "sbe";
8419       fmt = "t,+j(b)";
8420       offbits = 9;
8421       goto ld_st;
8422     case M_SCE_AB:
8423       ab = 1;
8424     case M_SCE_OB:
8425       s = "sce";
8426       fmt = "t,+j(b)";
8427       offbits = 9;
8428       goto ld_st;
8429     case M_SHE_AB:
8430       ab = 1;
8431     case M_SHE_OB:
8432       s = "she";
8433       fmt = "t,+j(b)";
8434       offbits = 9;
8435       goto ld_st;
8436     case M_SWE_AB:
8437       ab = 1;
8438     case M_SWE_OB:
8439       s = "swe";
8440       fmt = "t,+j(b)";
8441       offbits = 9;
8442       goto ld_st;
8443     case M_SWLE_AB:
8444       ab = 1;
8445     case M_SWLE_OB:
8446       s = "swle";
8447       fmt = "t,+j(b)";
8448       offbits = 9;
8449       goto ld_st;
8450     case M_SWRE_AB:
8451       ab = 1;
8452     case M_SWRE_OB:
8453       s = "swre";
8454       fmt = "t,+j(b)";
8455       offbits = 9;
8456       goto ld_st;
8457     case M_ACLR_AB:
8458       ab = 1;
8459     case M_ACLR_OB:
8460       s = "aclr";
8461       treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
8462       fmt = "\\,~(b)";
8463       offbits = 12;
8464       goto ld_st;
8465     case M_ASET_AB:
8466       ab = 1;
8467     case M_ASET_OB:
8468       s = "aset";
8469       treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
8470       fmt = "\\,~(b)";
8471       offbits = 12;
8472       goto ld_st;
8473     case M_LB_AB:
8474       ab = 1;
8475       s = "lb";
8476       fmt = "t,o(b)";
8477       goto ld;
8478     case M_LBU_AB:
8479       ab = 1;
8480       s = "lbu";
8481       fmt = "t,o(b)";
8482       goto ld;
8483     case M_LH_AB:
8484       ab = 1;
8485       s = "lh";
8486       fmt = "t,o(b)";
8487       goto ld;
8488     case M_LHU_AB:
8489       ab = 1;
8490       s = "lhu";
8491       fmt = "t,o(b)";
8492       goto ld;
8493     case M_LW_AB:
8494       ab = 1;
8495       s = "lw";
8496       fmt = "t,o(b)";
8497       goto ld;
8498     case M_LWC0_AB:
8499       ab = 1;
8500       gas_assert (!mips_opts.micromips);
8501       s = "lwc0";
8502       fmt = "E,o(b)";
8503       /* Itbl support may require additional care here.  */
8504       coproc = 1;
8505       goto ld_st;
8506     case M_LWC1_AB:
8507       ab = 1;
8508       s = "lwc1";
8509       fmt = "T,o(b)";
8510       /* Itbl support may require additional care here.  */
8511       coproc = 1;
8512       goto ld_st;
8513     case M_LWC2_AB:
8514       ab = 1;
8515     case M_LWC2_OB:
8516       s = "lwc2";
8517       fmt = COP12_FMT;
8518       offbits = (mips_opts.micromips ? 12 : 16);
8519       /* Itbl support may require additional care here.  */
8520       coproc = 1;
8521       goto ld_st;
8522     case M_LWC3_AB:
8523       ab = 1;
8524       gas_assert (!mips_opts.micromips);
8525       s = "lwc3";
8526       fmt = "E,o(b)";
8527       /* Itbl support may require additional care here.  */
8528       coproc = 1;
8529       goto ld_st;
8530     case M_LWL_AB:
8531       ab = 1;
8532     case M_LWL_OB:
8533       s = "lwl";
8534       fmt = MEM12_FMT;
8535       offbits = (mips_opts.micromips ? 12 : 16);
8536       goto ld_st;
8537     case M_LWR_AB:
8538       ab = 1;
8539     case M_LWR_OB:
8540       s = "lwr";
8541       fmt = MEM12_FMT;
8542       offbits = (mips_opts.micromips ? 12 : 16);
8543       goto ld_st;
8544     case M_LDC1_AB:
8545       ab = 1;
8546       s = "ldc1";
8547       fmt = "T,o(b)";
8548       /* Itbl support may require additional care here.  */
8549       coproc = 1;
8550       goto ld_st;
8551     case M_LDC2_AB:
8552       ab = 1;
8553     case M_LDC2_OB:
8554       s = "ldc2";
8555       fmt = COP12_FMT;
8556       offbits = (mips_opts.micromips ? 12 : 16);
8557       /* Itbl support may require additional care here.  */
8558       coproc = 1;
8559       goto ld_st;
8560     case M_LQC2_AB:
8561       ab = 1;
8562       s = "lqc2";
8563       fmt = "E,o(b)";
8564       /* Itbl support may require additional care here.  */
8565       coproc = 1;
8566       goto ld_st;
8567     case M_LDC3_AB:
8568       ab = 1;
8569       s = "ldc3";
8570       fmt = "E,o(b)";
8571       /* Itbl support may require additional care here.  */
8572       coproc = 1;
8573       goto ld_st;
8574     case M_LDL_AB:
8575       ab = 1;
8576     case M_LDL_OB:
8577       s = "ldl";
8578       fmt = MEM12_FMT;
8579       offbits = (mips_opts.micromips ? 12 : 16);
8580       goto ld_st;
8581     case M_LDR_AB:
8582       ab = 1;
8583     case M_LDR_OB:
8584       s = "ldr";
8585       fmt = MEM12_FMT;
8586       offbits = (mips_opts.micromips ? 12 : 16);
8587       goto ld_st;
8588     case M_LL_AB:
8589       ab = 1;
8590     case M_LL_OB:
8591       s = "ll";
8592       fmt = MEM12_FMT;
8593       offbits = (mips_opts.micromips ? 12 : 16);
8594       goto ld;
8595     case M_LLD_AB:
8596       ab = 1;
8597     case M_LLD_OB:
8598       s = "lld";
8599       fmt = MEM12_FMT;
8600       offbits = (mips_opts.micromips ? 12 : 16);
8601       goto ld;
8602     case M_LWU_AB:
8603       ab = 1;
8604     case M_LWU_OB:
8605       s = "lwu";
8606       fmt = MEM12_FMT;
8607       offbits = (mips_opts.micromips ? 12 : 16);
8608       goto ld;
8609     case M_LWP_AB:
8610       ab = 1;
8611     case M_LWP_OB:
8612       gas_assert (mips_opts.micromips);
8613       s = "lwp";
8614       fmt = "t,~(b)";
8615       offbits = 12;
8616       lp = 1;
8617       goto ld;
8618     case M_LDP_AB:
8619       ab = 1;
8620     case M_LDP_OB:
8621       gas_assert (mips_opts.micromips);
8622       s = "ldp";
8623       fmt = "t,~(b)";
8624       offbits = 12;
8625       lp = 1;
8626       goto ld;
8627     case M_LWM_AB:
8628       ab = 1;
8629     case M_LWM_OB:
8630       gas_assert (mips_opts.micromips);
8631       s = "lwm";
8632       fmt = "n,~(b)";
8633       offbits = 12;
8634       goto ld_st;
8635     case M_LDM_AB:
8636       ab = 1;
8637     case M_LDM_OB:
8638       gas_assert (mips_opts.micromips);
8639       s = "ldm";
8640       fmt = "n,~(b)";
8641       offbits = 12;
8642       goto ld_st;
8643
8644     ld:
8645       /* We don't want to use $0 as tempreg.  */
8646       if (breg == treg + lp || treg + lp == ZERO)
8647         goto ld_st;
8648       else
8649         tempreg = treg + lp;
8650       goto ld_noat;
8651
8652     case M_SB_AB:
8653       ab = 1;
8654       s = "sb";
8655       fmt = "t,o(b)";
8656       goto ld_st;
8657     case M_SH_AB:
8658       ab = 1;
8659       s = "sh";
8660       fmt = "t,o(b)";
8661       goto ld_st;
8662     case M_SW_AB:
8663       ab = 1;
8664       s = "sw";
8665       fmt = "t,o(b)";
8666       goto ld_st;
8667     case M_SWC0_AB:
8668       ab = 1;
8669       gas_assert (!mips_opts.micromips);
8670       s = "swc0";
8671       fmt = "E,o(b)";
8672       /* Itbl support may require additional care here.  */
8673       coproc = 1;
8674       goto ld_st;
8675     case M_SWC1_AB:
8676       ab = 1;
8677       s = "swc1";
8678       fmt = "T,o(b)";
8679       /* Itbl support may require additional care here.  */
8680       coproc = 1;
8681       goto ld_st;
8682     case M_SWC2_AB:
8683       ab = 1;
8684     case M_SWC2_OB:
8685       s = "swc2";
8686       fmt = COP12_FMT;
8687       offbits = (mips_opts.micromips ? 12 : 16);
8688       /* Itbl support may require additional care here.  */
8689       coproc = 1;
8690       goto ld_st;
8691     case M_SWC3_AB:
8692       ab = 1;
8693       gas_assert (!mips_opts.micromips);
8694       s = "swc3";
8695       fmt = "E,o(b)";
8696       /* Itbl support may require additional care here.  */
8697       coproc = 1;
8698       goto ld_st;
8699     case M_SWL_AB:
8700       ab = 1;
8701     case M_SWL_OB:
8702       s = "swl";
8703       fmt = MEM12_FMT;
8704       offbits = (mips_opts.micromips ? 12 : 16);
8705       goto ld_st;
8706     case M_SWR_AB:
8707       ab = 1;
8708     case M_SWR_OB:
8709       s = "swr";
8710       fmt = MEM12_FMT;
8711       offbits = (mips_opts.micromips ? 12 : 16);
8712       goto ld_st;
8713     case M_SC_AB:
8714       ab = 1;
8715     case M_SC_OB:
8716       s = "sc";
8717       fmt = MEM12_FMT;
8718       offbits = (mips_opts.micromips ? 12 : 16);
8719       goto ld_st;
8720     case M_SCD_AB:
8721       ab = 1;
8722     case M_SCD_OB:
8723       s = "scd";
8724       fmt = MEM12_FMT;
8725       offbits = (mips_opts.micromips ? 12 : 16);
8726       goto ld_st;
8727     case M_CACHE_AB:
8728       ab = 1;
8729     case M_CACHE_OB:
8730       s = "cache";
8731       fmt = mips_opts.micromips ? "k,~(b)" : "k,o(b)";
8732       offbits = (mips_opts.micromips ? 12 : 16);
8733       goto ld_st;
8734     case M_CACHEE_AB:
8735       ab = 1;
8736     case M_CACHEE_OB:
8737       s = "cachee";
8738       fmt = "k,+j(b)";
8739       offbits = 9;
8740       goto ld_st;
8741     case M_PREF_AB:
8742       ab = 1;
8743     case M_PREF_OB:
8744       s = "pref";
8745       fmt = !mips_opts.micromips ? "k,o(b)" : "k,~(b)";
8746       offbits = (mips_opts.micromips ? 12 : 16);
8747       goto ld_st;
8748     case M_PREFE_AB:
8749       ab = 1;
8750     case M_PREFE_OB:
8751       s = "prefe";
8752       fmt = "k,+j(b)";
8753       offbits = 9;
8754       goto ld_st;
8755     case M_SDC1_AB:
8756       ab = 1;
8757       s = "sdc1";
8758       fmt = "T,o(b)";
8759       coproc = 1;
8760       /* Itbl support may require additional care here.  */
8761       goto ld_st;
8762     case M_SDC2_AB:
8763       ab = 1;
8764     case M_SDC2_OB:
8765       s = "sdc2";
8766       fmt = COP12_FMT;
8767       offbits = (mips_opts.micromips ? 12 : 16);
8768       /* Itbl support may require additional care here.  */
8769       coproc = 1;
8770       goto ld_st;
8771     case M_SQC2_AB:
8772       ab = 1;
8773       s = "sqc2";
8774       fmt = "E,o(b)";
8775       /* Itbl support may require additional care here.  */
8776       coproc = 1;
8777       goto ld_st;
8778     case M_SDC3_AB:
8779       ab = 1;
8780       gas_assert (!mips_opts.micromips);
8781       s = "sdc3";
8782       fmt = "E,o(b)";
8783       /* Itbl support may require additional care here.  */
8784       coproc = 1;
8785       goto ld_st;
8786     case M_SDL_AB:
8787       ab = 1;
8788     case M_SDL_OB:
8789       s = "sdl";
8790       fmt = MEM12_FMT;
8791       offbits = (mips_opts.micromips ? 12 : 16);
8792       goto ld_st;
8793     case M_SDR_AB:
8794       ab = 1;
8795     case M_SDR_OB:
8796       s = "sdr";
8797       fmt = MEM12_FMT;
8798       offbits = (mips_opts.micromips ? 12 : 16);
8799       goto ld_st;
8800     case M_SWP_AB:
8801       ab = 1;
8802     case M_SWP_OB:
8803       gas_assert (mips_opts.micromips);
8804       s = "swp";
8805       fmt = "t,~(b)";
8806       offbits = 12;
8807       goto ld_st;
8808     case M_SDP_AB:
8809       ab = 1;
8810     case M_SDP_OB:
8811       gas_assert (mips_opts.micromips);
8812       s = "sdp";
8813       fmt = "t,~(b)";
8814       offbits = 12;
8815       goto ld_st;
8816     case M_SWM_AB:
8817       ab = 1;
8818     case M_SWM_OB:
8819       gas_assert (mips_opts.micromips);
8820       s = "swm";
8821       fmt = "n,~(b)";
8822       offbits = 12;
8823       goto ld_st;
8824     case M_SDM_AB:
8825       ab = 1;
8826     case M_SDM_OB:
8827       gas_assert (mips_opts.micromips);
8828       s = "sdm";
8829       fmt = "n,~(b)";
8830       offbits = 12;
8831
8832     ld_st:
8833       tempreg = AT;
8834       used_at = 1;
8835     ld_noat:
8836       if (offset_expr.X_op != O_constant
8837           && offset_expr.X_op != O_symbol)
8838         {
8839           as_bad (_("Expression too complex"));
8840           offset_expr.X_op = O_constant;
8841         }
8842
8843       if (HAVE_32BIT_ADDRESSES
8844           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
8845         {
8846           char value [32];
8847
8848           sprintf_vma (value, offset_expr.X_add_number);
8849           as_bad (_("Number (0x%s) larger than 32 bits"), value);
8850         }
8851
8852       /* A constant expression in PIC code can be handled just as it
8853          is in non PIC code.  */
8854       if (offset_expr.X_op == O_constant)
8855         {
8856           int hipart = 0;
8857
8858           expr1.X_add_number = offset_expr.X_add_number;
8859           normalize_address_expr (&expr1);
8860           if ((offbits == 0 || offbits == 16)
8861               && !IS_SEXT_16BIT_NUM (expr1.X_add_number))
8862             {
8863               expr1.X_add_number = ((expr1.X_add_number + 0x8000)
8864                                     & ~(bfd_vma) 0xffff);
8865               hipart = 1;
8866             }
8867           else if (offbits == 12 && !IS_SEXT_12BIT_NUM (expr1.X_add_number))
8868             {
8869               expr1.X_add_number = ((expr1.X_add_number + 0x800)
8870                                     & ~(bfd_vma) 0xfff);
8871               hipart = 1;
8872             }
8873           else if (offbits == 9 && !IS_SEXT_9BIT_NUM (expr1.X_add_number))
8874             {
8875               expr1.X_add_number = ((expr1.X_add_number + 0x100)
8876                                     & ~(bfd_vma) 0x1ff);
8877               hipart = 1;
8878             }
8879           if (hipart)
8880             {
8881               load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
8882               if (breg != 0)
8883                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8884                              tempreg, tempreg, breg);
8885               breg = tempreg;
8886             }
8887           if (offbits == 0)
8888             {
8889               if (offset_expr.X_add_number == 0)
8890                 tempreg = breg;
8891               else
8892                 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
8893                              "t,r,j", tempreg, breg, BFD_RELOC_LO16);
8894               macro_build (NULL, s, fmt, treg, tempreg);
8895             }
8896           else if (offbits == 16)
8897             macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
8898           else
8899             macro_build (NULL, s, fmt,
8900                          treg, (unsigned long) offset_expr.X_add_number, breg);
8901         }
8902       else if (offbits != 16)
8903         {
8904           /* The offset field is too narrow to be used for a low-part
8905              relocation, so load the whole address into the auxillary
8906              register.  In the case of "A(b)" addresses, we first load
8907              absolute address "A" into the register and then add base
8908              register "b".  In the case of "o(b)" addresses, we simply
8909              need to add 16-bit offset "o" to base register "b", and
8910              offset_reloc already contains the relocations associated
8911              with "o".  */
8912           if (ab)
8913             {
8914               load_address (tempreg, &offset_expr, &used_at);
8915               if (breg != 0)
8916                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8917                              tempreg, tempreg, breg);
8918             }
8919           else
8920             macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8921                          tempreg, breg, -1,
8922                          offset_reloc[0], offset_reloc[1], offset_reloc[2]);
8923           expr1.X_add_number = 0;
8924           if (offbits == 0)
8925             macro_build (NULL, s, fmt, treg, tempreg);
8926           else
8927             macro_build (NULL, s, fmt,
8928                          treg, (unsigned long) expr1.X_add_number, tempreg);
8929         }
8930       else if (mips_pic == NO_PIC)
8931         {
8932           /* If this is a reference to a GP relative symbol, and there
8933              is no base register, we want
8934                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
8935              Otherwise, if there is no base register, we want
8936                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
8937                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8938              If we have a constant, we need two instructions anyhow,
8939              so we always use the latter form.
8940
8941              If we have a base register, and this is a reference to a
8942              GP relative symbol, we want
8943                addu     $tempreg,$breg,$gp
8944                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
8945              Otherwise we want
8946                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
8947                addu     $tempreg,$tempreg,$breg
8948                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8949              With a constant we always use the latter case.
8950
8951              With 64bit address space and no base register and $at usable,
8952              we want
8953                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8954                lui      $at,<sym>               (BFD_RELOC_HI16_S)
8955                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8956                dsll32   $tempreg,0
8957                daddu    $tempreg,$at
8958                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8959              If we have a base register, we want
8960                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8961                lui      $at,<sym>               (BFD_RELOC_HI16_S)
8962                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8963                daddu    $at,$breg
8964                dsll32   $tempreg,0
8965                daddu    $tempreg,$at
8966                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8967
8968              Without $at we can't generate the optimal path for superscalar
8969              processors here since this would require two temporary registers.
8970                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8971                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8972                dsll     $tempreg,16
8973                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
8974                dsll     $tempreg,16
8975                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8976              If we have a base register, we want
8977                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8978                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8979                dsll     $tempreg,16
8980                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
8981                dsll     $tempreg,16
8982                daddu    $tempreg,$tempreg,$breg
8983                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8984
8985              For GP relative symbols in 64bit address space we can use
8986              the same sequence as in 32bit address space.  */
8987           if (HAVE_64BIT_SYMBOLS)
8988             {
8989               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8990                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8991                 {
8992                   relax_start (offset_expr.X_add_symbol);
8993                   if (breg == 0)
8994                     {
8995                       macro_build (&offset_expr, s, fmt, treg,
8996                                    BFD_RELOC_GPREL16, mips_gp_register);
8997                     }
8998                   else
8999                     {
9000                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9001                                    tempreg, breg, mips_gp_register);
9002                       macro_build (&offset_expr, s, fmt, treg,
9003                                    BFD_RELOC_GPREL16, tempreg);
9004                     }
9005                   relax_switch ();
9006                 }
9007
9008               if (used_at == 0 && mips_opts.at)
9009                 {
9010                   macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
9011                                BFD_RELOC_MIPS_HIGHEST);
9012                   macro_build (&offset_expr, "lui", LUI_FMT, AT,
9013                                BFD_RELOC_HI16_S);
9014                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
9015                                tempreg, BFD_RELOC_MIPS_HIGHER);
9016                   if (breg != 0)
9017                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
9018                   macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
9019                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
9020                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
9021                                tempreg);
9022                   used_at = 1;
9023                 }
9024               else
9025                 {
9026                   macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
9027                                BFD_RELOC_MIPS_HIGHEST);
9028                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
9029                                tempreg, BFD_RELOC_MIPS_HIGHER);
9030                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
9031                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
9032                                tempreg, BFD_RELOC_HI16_S);
9033                   macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
9034                   if (breg != 0)
9035                     macro_build (NULL, "daddu", "d,v,t",
9036                                  tempreg, tempreg, breg);
9037                   macro_build (&offset_expr, s, fmt, treg,
9038                                BFD_RELOC_LO16, tempreg);
9039                 }
9040
9041               if (mips_relax.sequence)
9042                 relax_end ();
9043               break;
9044             }
9045
9046           if (breg == 0)
9047             {
9048               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
9049                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
9050                 {
9051                   relax_start (offset_expr.X_add_symbol);
9052                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
9053                                mips_gp_register);
9054                   relax_switch ();
9055                 }
9056               macro_build_lui (&offset_expr, tempreg);
9057               macro_build (&offset_expr, s, fmt, treg,
9058                            BFD_RELOC_LO16, tempreg);
9059               if (mips_relax.sequence)
9060                 relax_end ();
9061             }
9062           else
9063             {
9064               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
9065                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
9066                 {
9067                   relax_start (offset_expr.X_add_symbol);
9068                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9069                                tempreg, breg, mips_gp_register);
9070                   macro_build (&offset_expr, s, fmt, treg,
9071                                BFD_RELOC_GPREL16, tempreg);
9072                   relax_switch ();
9073                 }
9074               macro_build_lui (&offset_expr, tempreg);
9075               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9076                            tempreg, tempreg, breg);
9077               macro_build (&offset_expr, s, fmt, treg,
9078                            BFD_RELOC_LO16, tempreg);
9079               if (mips_relax.sequence)
9080                 relax_end ();
9081             }
9082         }
9083       else if (!mips_big_got)
9084         {
9085           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
9086
9087           /* If this is a reference to an external symbol, we want
9088                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
9089                nop
9090                <op>     $treg,0($tempreg)
9091              Otherwise we want
9092                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
9093                nop
9094                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
9095                <op>     $treg,0($tempreg)
9096
9097              For NewABI, we want
9098                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
9099                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
9100
9101              If there is a base register, we add it to $tempreg before
9102              the <op>.  If there is a constant, we stick it in the
9103              <op> instruction.  We don't handle constants larger than
9104              16 bits, because we have no way to load the upper 16 bits
9105              (actually, we could handle them for the subset of cases
9106              in which we are not using $at).  */
9107           gas_assert (offset_expr.X_op == O_symbol);
9108           if (HAVE_NEWABI)
9109             {
9110               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9111                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
9112               if (breg != 0)
9113                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9114                              tempreg, tempreg, breg);
9115               macro_build (&offset_expr, s, fmt, treg,
9116                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
9117               break;
9118             }
9119           expr1.X_add_number = offset_expr.X_add_number;
9120           offset_expr.X_add_number = 0;
9121           if (expr1.X_add_number < -0x8000
9122               || expr1.X_add_number >= 0x8000)
9123             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9124           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9125                        lw_reloc_type, mips_gp_register);
9126           load_delay_nop ();
9127           relax_start (offset_expr.X_add_symbol);
9128           relax_switch ();
9129           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
9130                        tempreg, BFD_RELOC_LO16);
9131           relax_end ();
9132           if (breg != 0)
9133             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9134                          tempreg, tempreg, breg);
9135           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
9136         }
9137       else if (mips_big_got && !HAVE_NEWABI)
9138         {
9139           int gpdelay;
9140
9141           /* If this is a reference to an external symbol, we want
9142                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
9143                addu     $tempreg,$tempreg,$gp
9144                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
9145                <op>     $treg,0($tempreg)
9146              Otherwise we want
9147                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
9148                nop
9149                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
9150                <op>     $treg,0($tempreg)
9151              If there is a base register, we add it to $tempreg before
9152              the <op>.  If there is a constant, we stick it in the
9153              <op> instruction.  We don't handle constants larger than
9154              16 bits, because we have no way to load the upper 16 bits
9155              (actually, we could handle them for the subset of cases
9156              in which we are not using $at).  */
9157           gas_assert (offset_expr.X_op == O_symbol);
9158           expr1.X_add_number = offset_expr.X_add_number;
9159           offset_expr.X_add_number = 0;
9160           if (expr1.X_add_number < -0x8000
9161               || expr1.X_add_number >= 0x8000)
9162             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9163           gpdelay = reg_needs_delay (mips_gp_register);
9164           relax_start (offset_expr.X_add_symbol);
9165           macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
9166                        BFD_RELOC_MIPS_GOT_HI16);
9167           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
9168                        mips_gp_register);
9169           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9170                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
9171           relax_switch ();
9172           if (gpdelay)
9173             macro_build (NULL, "nop", "");
9174           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9175                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
9176           load_delay_nop ();
9177           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
9178                        tempreg, BFD_RELOC_LO16);
9179           relax_end ();
9180
9181           if (breg != 0)
9182             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9183                          tempreg, tempreg, breg);
9184           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
9185         }
9186       else if (mips_big_got && HAVE_NEWABI)
9187         {
9188           /* If this is a reference to an external symbol, we want
9189                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
9190                add      $tempreg,$tempreg,$gp
9191                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
9192                <op>     $treg,<ofst>($tempreg)
9193              Otherwise, for local symbols, we want:
9194                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
9195                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
9196           gas_assert (offset_expr.X_op == O_symbol);
9197           expr1.X_add_number = offset_expr.X_add_number;
9198           offset_expr.X_add_number = 0;
9199           if (expr1.X_add_number < -0x8000
9200               || expr1.X_add_number >= 0x8000)
9201             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9202           relax_start (offset_expr.X_add_symbol);
9203           macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
9204                        BFD_RELOC_MIPS_GOT_HI16);
9205           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
9206                        mips_gp_register);
9207           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9208                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
9209           if (breg != 0)
9210             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9211                          tempreg, tempreg, breg);
9212           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
9213
9214           relax_switch ();
9215           offset_expr.X_add_number = expr1.X_add_number;
9216           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9217                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
9218           if (breg != 0)
9219             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9220                          tempreg, tempreg, breg);
9221           macro_build (&offset_expr, s, fmt, treg,
9222                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
9223           relax_end ();
9224         }
9225       else
9226         abort ();
9227
9228       break;
9229
9230     case M_LI:
9231     case M_LI_S:
9232       load_register (treg, &imm_expr, 0);
9233       break;
9234
9235     case M_DLI:
9236       load_register (treg, &imm_expr, 1);
9237       break;
9238
9239     case M_LI_SS:
9240       if (imm_expr.X_op == O_constant)
9241         {
9242           used_at = 1;
9243           load_register (AT, &imm_expr, 0);
9244           macro_build (NULL, "mtc1", "t,G", AT, treg);
9245           break;
9246         }
9247       else
9248         {
9249           gas_assert (offset_expr.X_op == O_symbol
9250                       && strcmp (segment_name (S_GET_SEGMENT
9251                                                (offset_expr.X_add_symbol)),
9252                                  ".lit4") == 0
9253                       && offset_expr.X_add_number == 0);
9254           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
9255                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
9256           break;
9257         }
9258
9259     case M_LI_D:
9260       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
9261          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
9262          order 32 bits of the value and the low order 32 bits are either
9263          zero or in OFFSET_EXPR.  */
9264       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
9265         {
9266           if (HAVE_64BIT_GPRS)
9267             load_register (treg, &imm_expr, 1);
9268           else
9269             {
9270               int hreg, lreg;
9271
9272               if (target_big_endian)
9273                 {
9274                   hreg = treg;
9275                   lreg = treg + 1;
9276                 }
9277               else
9278                 {
9279                   hreg = treg + 1;
9280                   lreg = treg;
9281                 }
9282
9283               if (hreg <= 31)
9284                 load_register (hreg, &imm_expr, 0);
9285               if (lreg <= 31)
9286                 {
9287                   if (offset_expr.X_op == O_absent)
9288                     move_register (lreg, 0);
9289                   else
9290                     {
9291                       gas_assert (offset_expr.X_op == O_constant);
9292                       load_register (lreg, &offset_expr, 0);
9293                     }
9294                 }
9295             }
9296           break;
9297         }
9298
9299       /* We know that sym is in the .rdata section.  First we get the
9300          upper 16 bits of the address.  */
9301       if (mips_pic == NO_PIC)
9302         {
9303           macro_build_lui (&offset_expr, AT);
9304           used_at = 1;
9305         }
9306       else
9307         {
9308           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9309                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
9310           used_at = 1;
9311         }
9312
9313       /* Now we load the register(s).  */
9314       if (HAVE_64BIT_GPRS)
9315         {
9316           used_at = 1;
9317           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
9318         }
9319       else
9320         {
9321           used_at = 1;
9322           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
9323           if (treg != RA)
9324             {
9325               /* FIXME: How in the world do we deal with the possible
9326                  overflow here?  */
9327               offset_expr.X_add_number += 4;
9328               macro_build (&offset_expr, "lw", "t,o(b)",
9329                            treg + 1, BFD_RELOC_LO16, AT);
9330             }
9331         }
9332       break;
9333
9334     case M_LI_DD:
9335       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
9336          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
9337          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
9338          the value and the low order 32 bits are either zero or in
9339          OFFSET_EXPR.  */
9340       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
9341         {
9342           used_at = 1;
9343           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
9344           if (HAVE_64BIT_FPRS)
9345             {
9346               gas_assert (HAVE_64BIT_GPRS);
9347               macro_build (NULL, "dmtc1", "t,S", AT, treg);
9348             }
9349           else
9350             {
9351               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
9352               if (offset_expr.X_op == O_absent)
9353                 macro_build (NULL, "mtc1", "t,G", 0, treg);
9354               else
9355                 {
9356                   gas_assert (offset_expr.X_op == O_constant);
9357                   load_register (AT, &offset_expr, 0);
9358                   macro_build (NULL, "mtc1", "t,G", AT, treg);
9359                 }
9360             }
9361           break;
9362         }
9363
9364       gas_assert (offset_expr.X_op == O_symbol
9365                   && offset_expr.X_add_number == 0);
9366       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
9367       if (strcmp (s, ".lit8") == 0)
9368         {
9369           if (CPU_HAS_LDC1_SDC1 (mips_opts.arch) || mips_opts.micromips)
9370             {
9371               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
9372                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
9373               break;
9374             }
9375           breg = mips_gp_register;
9376           r = BFD_RELOC_MIPS_LITERAL;
9377           goto dob;
9378         }
9379       else
9380         {
9381           gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
9382           used_at = 1;
9383           if (mips_pic != NO_PIC)
9384             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9385                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
9386           else
9387             {
9388               /* FIXME: This won't work for a 64 bit address.  */
9389               macro_build_lui (&offset_expr, AT);
9390             }
9391
9392           if (CPU_HAS_LDC1_SDC1 (mips_opts.arch) || mips_opts.micromips)
9393             {
9394               macro_build (&offset_expr, "ldc1", "T,o(b)",
9395                            treg, BFD_RELOC_LO16, AT);
9396               break;
9397             }
9398           breg = AT;
9399           r = BFD_RELOC_LO16;
9400           goto dob;
9401         }
9402
9403     case M_L_DOB:
9404       /* Even on a big endian machine $fn comes before $fn+1.  We have
9405          to adjust when loading from memory.  */
9406       r = BFD_RELOC_LO16;
9407     dob:
9408       gas_assert (!mips_opts.micromips);
9409       gas_assert (!CPU_HAS_LDC1_SDC1 (mips_opts.arch));
9410       macro_build (&offset_expr, "lwc1", "T,o(b)",
9411                    target_big_endian ? treg + 1 : treg, r, breg);
9412       /* FIXME: A possible overflow which I don't know how to deal
9413          with.  */
9414       offset_expr.X_add_number += 4;
9415       macro_build (&offset_expr, "lwc1", "T,o(b)",
9416                    target_big_endian ? treg : treg + 1, r, breg);
9417       break;
9418
9419     case M_S_DOB:
9420       gas_assert (!mips_opts.micromips);
9421       gas_assert (!CPU_HAS_LDC1_SDC1 (mips_opts.arch));
9422       /* Even on a big endian machine $fn comes before $fn+1.  We have
9423          to adjust when storing to memory.  */
9424       macro_build (&offset_expr, "swc1", "T,o(b)",
9425                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
9426       offset_expr.X_add_number += 4;
9427       macro_build (&offset_expr, "swc1", "T,o(b)",
9428                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
9429       break;
9430
9431     case M_L_DAB:
9432       gas_assert (!mips_opts.micromips);
9433       /*
9434        * The MIPS assembler seems to check for X_add_number not
9435        * being double aligned and generating:
9436        *        lui     at,%hi(foo+1)
9437        *        addu    at,at,v1
9438        *        addiu   at,at,%lo(foo+1)
9439        *        lwc1    f2,0(at)
9440        *        lwc1    f3,4(at)
9441        * But, the resulting address is the same after relocation so why
9442        * generate the extra instruction?
9443        */
9444       /* Itbl support may require additional care here.  */
9445       coproc = 1;
9446       fmt = "T,o(b)";
9447       if (CPU_HAS_LDC1_SDC1 (mips_opts.arch))
9448         {
9449           s = "ldc1";
9450           goto ld_st;
9451         }
9452       s = "lwc1";
9453       goto ldd_std;
9454
9455     case M_S_DAB:
9456       gas_assert (!mips_opts.micromips);
9457       /* Itbl support may require additional care here.  */
9458       coproc = 1;
9459       fmt = "T,o(b)";
9460       if (CPU_HAS_LDC1_SDC1 (mips_opts.arch))
9461         {
9462           s = "sdc1";
9463           goto ld_st;
9464         }
9465       s = "swc1";
9466       goto ldd_std;
9467
9468     case M_LQ_AB:
9469       fmt = "t,o(b)";
9470       s = "lq";
9471       goto ld;
9472
9473     case M_SQ_AB:
9474       fmt = "t,o(b)";
9475       s = "sq";
9476       goto ld_st;
9477
9478     case M_LD_AB:
9479       fmt = "t,o(b)";
9480       if (HAVE_64BIT_GPRS)
9481         {
9482           s = "ld";
9483           goto ld;
9484         }
9485       s = "lw";
9486       goto ldd_std;
9487
9488     case M_SD_AB:
9489       fmt = "t,o(b)";
9490       if (HAVE_64BIT_GPRS)
9491         {
9492           s = "sd";
9493           goto ld_st;
9494         }
9495       s = "sw";
9496
9497     ldd_std:
9498       if (offset_expr.X_op != O_symbol
9499           && offset_expr.X_op != O_constant)
9500         {
9501           as_bad (_("Expression too complex"));
9502           offset_expr.X_op = O_constant;
9503         }
9504
9505       if (HAVE_32BIT_ADDRESSES
9506           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
9507         {
9508           char value [32];
9509
9510           sprintf_vma (value, offset_expr.X_add_number);
9511           as_bad (_("Number (0x%s) larger than 32 bits"), value);
9512         }
9513
9514       /* Even on a big endian machine $fn comes before $fn+1.  We have
9515          to adjust when loading from memory.  We set coproc if we must
9516          load $fn+1 first.  */
9517       /* Itbl support may require additional care here.  */
9518       if (!target_big_endian)
9519         coproc = 0;
9520
9521       if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
9522         {
9523           /* If this is a reference to a GP relative symbol, we want
9524                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
9525                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
9526              If we have a base register, we use this
9527                addu     $at,$breg,$gp
9528                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
9529                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
9530              If this is not a GP relative symbol, we want
9531                lui      $at,<sym>               (BFD_RELOC_HI16_S)
9532                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
9533                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
9534              If there is a base register, we add it to $at after the
9535              lui instruction.  If there is a constant, we always use
9536              the last case.  */
9537           if (offset_expr.X_op == O_symbol
9538               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
9539               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
9540             {
9541               relax_start (offset_expr.X_add_symbol);
9542               if (breg == 0)
9543                 {
9544                   tempreg = mips_gp_register;
9545                 }
9546               else
9547                 {
9548                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9549                                AT, breg, mips_gp_register);
9550                   tempreg = AT;
9551                   used_at = 1;
9552                 }
9553
9554               /* Itbl support may require additional care here.  */
9555               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9556                            BFD_RELOC_GPREL16, tempreg);
9557               offset_expr.X_add_number += 4;
9558
9559               /* Set mips_optimize to 2 to avoid inserting an
9560                  undesired nop.  */
9561               hold_mips_optimize = mips_optimize;
9562               mips_optimize = 2;
9563               /* Itbl support may require additional care here.  */
9564               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9565                            BFD_RELOC_GPREL16, tempreg);
9566               mips_optimize = hold_mips_optimize;
9567
9568               relax_switch ();
9569
9570               offset_expr.X_add_number -= 4;
9571             }
9572           used_at = 1;
9573           macro_build_lui (&offset_expr, AT);
9574           if (breg != 0)
9575             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9576           /* Itbl support may require additional care here.  */
9577           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9578                        BFD_RELOC_LO16, AT);
9579           /* FIXME: How do we handle overflow here?  */
9580           offset_expr.X_add_number += 4;
9581           /* Itbl support may require additional care here.  */
9582           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9583                        BFD_RELOC_LO16, AT);
9584           if (mips_relax.sequence)
9585             relax_end ();
9586         }
9587       else if (!mips_big_got)
9588         {
9589           /* If this is a reference to an external symbol, we want
9590                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
9591                nop
9592                <op>     $treg,0($at)
9593                <op>     $treg+1,4($at)
9594              Otherwise we want
9595                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
9596                nop
9597                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
9598                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
9599              If there is a base register we add it to $at before the
9600              lwc1 instructions.  If there is a constant we include it
9601              in the lwc1 instructions.  */
9602           used_at = 1;
9603           expr1.X_add_number = offset_expr.X_add_number;
9604           if (expr1.X_add_number < -0x8000
9605               || expr1.X_add_number >= 0x8000 - 4)
9606             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9607           load_got_offset (AT, &offset_expr);
9608           load_delay_nop ();
9609           if (breg != 0)
9610             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9611
9612           /* Set mips_optimize to 2 to avoid inserting an undesired
9613              nop.  */
9614           hold_mips_optimize = mips_optimize;
9615           mips_optimize = 2;
9616
9617           /* Itbl support may require additional care here.  */
9618           relax_start (offset_expr.X_add_symbol);
9619           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9620                        BFD_RELOC_LO16, AT);
9621           expr1.X_add_number += 4;
9622           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9623                        BFD_RELOC_LO16, AT);
9624           relax_switch ();
9625           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9626                        BFD_RELOC_LO16, AT);
9627           offset_expr.X_add_number += 4;
9628           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9629                        BFD_RELOC_LO16, AT);
9630           relax_end ();
9631
9632           mips_optimize = hold_mips_optimize;
9633         }
9634       else if (mips_big_got)
9635         {
9636           int gpdelay;
9637
9638           /* If this is a reference to an external symbol, we want
9639                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
9640                addu     $at,$at,$gp
9641                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
9642                nop
9643                <op>     $treg,0($at)
9644                <op>     $treg+1,4($at)
9645              Otherwise we want
9646                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
9647                nop
9648                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
9649                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
9650              If there is a base register we add it to $at before the
9651              lwc1 instructions.  If there is a constant we include it
9652              in the lwc1 instructions.  */
9653           used_at = 1;
9654           expr1.X_add_number = offset_expr.X_add_number;
9655           offset_expr.X_add_number = 0;
9656           if (expr1.X_add_number < -0x8000
9657               || expr1.X_add_number >= 0x8000 - 4)
9658             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9659           gpdelay = reg_needs_delay (mips_gp_register);
9660           relax_start (offset_expr.X_add_symbol);
9661           macro_build (&offset_expr, "lui", LUI_FMT,
9662                        AT, BFD_RELOC_MIPS_GOT_HI16);
9663           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9664                        AT, AT, mips_gp_register);
9665           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
9666                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
9667           load_delay_nop ();
9668           if (breg != 0)
9669             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9670           /* Itbl support may require additional care here.  */
9671           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9672                        BFD_RELOC_LO16, AT);
9673           expr1.X_add_number += 4;
9674
9675           /* Set mips_optimize to 2 to avoid inserting an undesired
9676              nop.  */
9677           hold_mips_optimize = mips_optimize;
9678           mips_optimize = 2;
9679           /* Itbl support may require additional care here.  */
9680           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9681                        BFD_RELOC_LO16, AT);
9682           mips_optimize = hold_mips_optimize;
9683           expr1.X_add_number -= 4;
9684
9685           relax_switch ();
9686           offset_expr.X_add_number = expr1.X_add_number;
9687           if (gpdelay)
9688             macro_build (NULL, "nop", "");
9689           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9690                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
9691           load_delay_nop ();
9692           if (breg != 0)
9693             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9694           /* Itbl support may require additional care here.  */
9695           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9696                        BFD_RELOC_LO16, AT);
9697           offset_expr.X_add_number += 4;
9698
9699           /* Set mips_optimize to 2 to avoid inserting an undesired
9700              nop.  */
9701           hold_mips_optimize = mips_optimize;
9702           mips_optimize = 2;
9703           /* Itbl support may require additional care here.  */
9704           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9705                        BFD_RELOC_LO16, AT);
9706           mips_optimize = hold_mips_optimize;
9707           relax_end ();
9708         }
9709       else
9710         abort ();
9711
9712       break;
9713
9714     case M_LD_OB:
9715       s = HAVE_64BIT_GPRS ? "ld" : "lw";
9716       goto sd_ob;
9717     case M_SD_OB:
9718       s = HAVE_64BIT_GPRS ? "sd" : "sw";
9719     sd_ob:
9720       macro_build (&offset_expr, s, "t,o(b)", treg,
9721                    -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9722                    breg);
9723       if (!HAVE_64BIT_GPRS)
9724         {
9725           offset_expr.X_add_number += 4;
9726           macro_build (&offset_expr, s, "t,o(b)", treg + 1,
9727                        -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9728                        breg);
9729         }
9730       break;
9731
9732         
9733     case M_SAA_AB:
9734       ab = 1;
9735     case M_SAA_OB:
9736       s = "saa";
9737       offbits = 0;
9738       fmt = "t,(b)";
9739       goto ld_st;
9740     case M_SAAD_AB:
9741       ab = 1;
9742     case M_SAAD_OB:
9743       s = "saad";
9744       offbits = 0;
9745       fmt = "t,(b)";
9746       goto ld_st;
9747
9748    /* New code added to support COPZ instructions.
9749       This code builds table entries out of the macros in mip_opcodes.
9750       R4000 uses interlocks to handle coproc delays.
9751       Other chips (like the R3000) require nops to be inserted for delays.
9752
9753       FIXME: Currently, we require that the user handle delays.
9754       In order to fill delay slots for non-interlocked chips,
9755       we must have a way to specify delays based on the coprocessor.
9756       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
9757       What are the side-effects of the cop instruction?
9758       What cache support might we have and what are its effects?
9759       Both coprocessor & memory require delays. how long???
9760       What registers are read/set/modified?
9761
9762       If an itbl is provided to interpret cop instructions,
9763       this knowledge can be encoded in the itbl spec.  */
9764
9765     case M_COP0:
9766       s = "c0";
9767       goto copz;
9768     case M_COP1:
9769       s = "c1";
9770       goto copz;
9771     case M_COP2:
9772       s = "c2";
9773       goto copz;
9774     case M_COP3:
9775       s = "c3";
9776     copz:
9777       gas_assert (!mips_opts.micromips);
9778       /* For now we just do C (same as Cz).  The parameter will be
9779          stored in insn_opcode by mips_ip.  */
9780       macro_build (NULL, s, "C", ip->insn_opcode);
9781       break;
9782
9783     case M_MOVE:
9784       move_register (dreg, sreg);
9785       break;
9786
9787     case M_DMUL:
9788       dbl = 1;
9789     case M_MUL:
9790       if (mips_opts.arch == CPU_R5900)
9791         {
9792           macro_build (NULL, dbl ? "dmultu" : "multu", "d,s,t", dreg, sreg, treg);
9793         }
9794       else
9795         {
9796       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
9797       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9798         }
9799       break;
9800
9801     case M_DMUL_I:
9802       dbl = 1;
9803     case M_MUL_I:
9804       /* The MIPS assembler some times generates shifts and adds.  I'm
9805          not trying to be that fancy. GCC should do this for us
9806          anyway.  */
9807       used_at = 1;
9808       load_register (AT, &imm_expr, dbl);
9809       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
9810       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9811       break;
9812
9813     case M_DMULO_I:
9814       dbl = 1;
9815     case M_MULO_I:
9816       imm = 1;
9817       goto do_mulo;
9818
9819     case M_DMULO:
9820       dbl = 1;
9821     case M_MULO:
9822     do_mulo:
9823       start_noreorder ();
9824       used_at = 1;
9825       if (imm)
9826         load_register (AT, &imm_expr, dbl);
9827       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
9828       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9829       macro_build (NULL, dbl ? "dsra32" : "sra", SHFT_FMT, dreg, dreg, RA);
9830       macro_build (NULL, "mfhi", MFHL_FMT, AT);
9831       if (mips_trap)
9832         macro_build (NULL, "tne", TRAP_FMT, dreg, AT, 6);
9833       else
9834         {
9835           if (mips_opts.micromips)
9836             micromips_label_expr (&label_expr);
9837           else
9838             label_expr.X_add_number = 8;
9839           macro_build (&label_expr, "beq", "s,t,p", dreg, AT);
9840           macro_build (NULL, "nop", "");
9841           macro_build (NULL, "break", BRK_FMT, 6);
9842           if (mips_opts.micromips)
9843             micromips_add_label ();
9844         }
9845       end_noreorder ();
9846       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9847       break;
9848
9849     case M_DMULOU_I:
9850       dbl = 1;
9851     case M_MULOU_I:
9852       imm = 1;
9853       goto do_mulou;
9854
9855     case M_DMULOU:
9856       dbl = 1;
9857     case M_MULOU:
9858     do_mulou:
9859       start_noreorder ();
9860       used_at = 1;
9861       if (imm)
9862         load_register (AT, &imm_expr, dbl);
9863       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
9864                    sreg, imm ? AT : treg);
9865       macro_build (NULL, "mfhi", MFHL_FMT, AT);
9866       macro_build (NULL, "mflo", MFHL_FMT, dreg);
9867       if (mips_trap)
9868         macro_build (NULL, "tne", TRAP_FMT, AT, ZERO, 6);
9869       else
9870         {
9871           if (mips_opts.micromips)
9872             micromips_label_expr (&label_expr);
9873           else
9874             label_expr.X_add_number = 8;
9875           macro_build (&label_expr, "beq", "s,t,p", AT, ZERO);
9876           macro_build (NULL, "nop", "");
9877           macro_build (NULL, "break", BRK_FMT, 6);
9878           if (mips_opts.micromips)
9879             micromips_add_label ();
9880         }
9881       end_noreorder ();
9882       break;
9883
9884     case M_DROL:
9885       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9886         {
9887           if (dreg == sreg)
9888             {
9889               tempreg = AT;
9890               used_at = 1;
9891             }
9892           else
9893             {
9894               tempreg = dreg;
9895             }
9896           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
9897           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
9898           break;
9899         }
9900       used_at = 1;
9901       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9902       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
9903       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
9904       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9905       break;
9906
9907     case M_ROL:
9908       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9909         {
9910           if (dreg == sreg)
9911             {
9912               tempreg = AT;
9913               used_at = 1;
9914             }
9915           else
9916             {
9917               tempreg = dreg;
9918             }
9919           macro_build (NULL, "negu", "d,w", tempreg, treg);
9920           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
9921           break;
9922         }
9923       used_at = 1;
9924       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
9925       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
9926       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
9927       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9928       break;
9929
9930     case M_DROL_I:
9931       {
9932         unsigned int rot;
9933         char *l;
9934         char *rr;
9935
9936         if (imm_expr.X_op != O_constant)
9937           as_bad (_("Improper rotate count"));
9938         rot = imm_expr.X_add_number & 0x3f;
9939         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9940           {
9941             rot = (64 - rot) & 0x3f;
9942             if (rot >= 32)
9943               macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
9944             else
9945               macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
9946             break;
9947           }
9948         if (rot == 0)
9949           {
9950             macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
9951             break;
9952           }
9953         l = (rot < 0x20) ? "dsll" : "dsll32";
9954         rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
9955         rot &= 0x1f;
9956         used_at = 1;
9957         macro_build (NULL, l, SHFT_FMT, AT, sreg, rot);
9958         macro_build (NULL, rr, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9959         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9960       }
9961       break;
9962
9963     case M_ROL_I:
9964       {
9965         unsigned int rot;
9966
9967         if (imm_expr.X_op != O_constant)
9968           as_bad (_("Improper rotate count"));
9969         rot = imm_expr.X_add_number & 0x1f;
9970         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9971           {
9972             macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, (32 - rot) & 0x1f);
9973             break;
9974           }
9975         if (rot == 0)
9976           {
9977             macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
9978             break;
9979           }
9980         used_at = 1;
9981         macro_build (NULL, "sll", SHFT_FMT, AT, sreg, rot);
9982         macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9983         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9984       }
9985       break;
9986
9987     case M_DROR:
9988       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9989         {
9990           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
9991           break;
9992         }
9993       used_at = 1;
9994       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9995       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
9996       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
9997       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9998       break;
9999
10000     case M_ROR:
10001       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
10002         {
10003           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
10004           break;
10005         }
10006       used_at = 1;
10007       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
10008       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
10009       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
10010       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10011       break;
10012
10013     case M_DROR_I:
10014       {
10015         unsigned int rot;
10016         char *l;
10017         char *rr;
10018
10019         if (imm_expr.X_op != O_constant)
10020           as_bad (_("Improper rotate count"));
10021         rot = imm_expr.X_add_number & 0x3f;
10022         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
10023           {
10024             if (rot >= 32)
10025               macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
10026             else
10027               macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
10028             break;
10029           }
10030         if (rot == 0)
10031           {
10032             macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
10033             break;
10034           }
10035         rr = (rot < 0x20) ? "dsrl" : "dsrl32";
10036         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
10037         rot &= 0x1f;
10038         used_at = 1;
10039         macro_build (NULL, rr, SHFT_FMT, AT, sreg, rot);
10040         macro_build (NULL, l, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
10041         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10042       }
10043       break;
10044
10045     case M_ROR_I:
10046       {
10047         unsigned int rot;
10048
10049         if (imm_expr.X_op != O_constant)
10050           as_bad (_("Improper rotate count"));
10051         rot = imm_expr.X_add_number & 0x1f;
10052         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
10053           {
10054             macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, rot);
10055             break;
10056           }
10057         if (rot == 0)
10058           {
10059             macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
10060             break;
10061           }
10062         used_at = 1;
10063         macro_build (NULL, "srl", SHFT_FMT, AT, sreg, rot);
10064         macro_build (NULL, "sll", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
10065         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10066       }
10067       break;
10068
10069     case M_SEQ:
10070       if (sreg == 0)
10071         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
10072       else if (treg == 0)
10073         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10074       else
10075         {
10076           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
10077           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
10078         }
10079       break;
10080
10081     case M_SEQ_I:
10082       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
10083         {
10084           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10085           break;
10086         }
10087       if (sreg == 0)
10088         {
10089           as_warn (_("Instruction %s: result is always false"),
10090                    ip->insn_mo->name);
10091           move_register (dreg, 0);
10092           break;
10093         }
10094       if (CPU_HAS_SEQ (mips_opts.arch)
10095           && -512 <= imm_expr.X_add_number
10096           && imm_expr.X_add_number < 512)
10097         {
10098           macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
10099                        (int) imm_expr.X_add_number);
10100           break;
10101         }
10102       if (imm_expr.X_op == O_constant
10103           && imm_expr.X_add_number >= 0
10104           && imm_expr.X_add_number < 0x10000)
10105         {
10106           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
10107         }
10108       else if (imm_expr.X_op == O_constant
10109                && imm_expr.X_add_number > -0x8000
10110                && imm_expr.X_add_number < 0)
10111         {
10112           imm_expr.X_add_number = -imm_expr.X_add_number;
10113           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
10114                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10115         }
10116       else if (CPU_HAS_SEQ (mips_opts.arch))
10117         {
10118           used_at = 1;
10119           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10120           macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
10121           break;
10122         }
10123       else
10124         {
10125           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10126           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
10127           used_at = 1;
10128         }
10129       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
10130       break;
10131
10132     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
10133       s = "slt";
10134       goto sge;
10135     case M_SGEU:
10136       s = "sltu";
10137     sge:
10138       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
10139       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
10140       break;
10141
10142     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
10143     case M_SGEU_I:
10144       if (imm_expr.X_op == O_constant
10145           && imm_expr.X_add_number >= -0x8000
10146           && imm_expr.X_add_number < 0x8000)
10147         {
10148           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
10149                        dreg, sreg, BFD_RELOC_LO16);
10150         }
10151       else
10152         {
10153           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10154           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
10155                        dreg, sreg, AT);
10156           used_at = 1;
10157         }
10158       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
10159       break;
10160
10161     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
10162       s = "slt";
10163       goto sgt;
10164     case M_SGTU:
10165       s = "sltu";
10166     sgt:
10167       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
10168       break;
10169
10170     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
10171       s = "slt";
10172       goto sgti;
10173     case M_SGTU_I:
10174       s = "sltu";
10175     sgti:
10176       used_at = 1;
10177       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10178       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
10179       break;
10180
10181     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
10182       s = "slt";
10183       goto sle;
10184     case M_SLEU:
10185       s = "sltu";
10186     sle:
10187       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
10188       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
10189       break;
10190
10191     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
10192       s = "slt";
10193       goto slei;
10194     case M_SLEU_I:
10195       s = "sltu";
10196     slei:
10197       used_at = 1;
10198       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10199       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
10200       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
10201       break;
10202
10203     case M_SLT_I:
10204       if (imm_expr.X_op == O_constant
10205           && imm_expr.X_add_number >= -0x8000
10206           && imm_expr.X_add_number < 0x8000)
10207         {
10208           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10209           break;
10210         }
10211       used_at = 1;
10212       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10213       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
10214       break;
10215
10216     case M_SLTU_I:
10217       if (imm_expr.X_op == O_constant
10218           && imm_expr.X_add_number >= -0x8000
10219           && imm_expr.X_add_number < 0x8000)
10220         {
10221           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
10222                        BFD_RELOC_LO16);
10223           break;
10224         }
10225       used_at = 1;
10226       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10227       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
10228       break;
10229
10230     case M_SNE:
10231       if (sreg == 0)
10232         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
10233       else if (treg == 0)
10234         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
10235       else
10236         {
10237           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
10238           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
10239         }
10240       break;
10241
10242     case M_SNE_I:
10243       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
10244         {
10245           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
10246           break;
10247         }
10248       if (sreg == 0)
10249         {
10250           as_warn (_("Instruction %s: result is always true"),
10251                    ip->insn_mo->name);
10252           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
10253                        dreg, 0, BFD_RELOC_LO16);
10254           break;
10255         }
10256       if (CPU_HAS_SEQ (mips_opts.arch)
10257           && -512 <= imm_expr.X_add_number
10258           && imm_expr.X_add_number < 512)
10259         {
10260           macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
10261                        (int) imm_expr.X_add_number);
10262           break;
10263         }
10264       if (imm_expr.X_op == O_constant
10265           && imm_expr.X_add_number >= 0
10266           && imm_expr.X_add_number < 0x10000)
10267         {
10268           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
10269         }
10270       else if (imm_expr.X_op == O_constant
10271                && imm_expr.X_add_number > -0x8000
10272                && imm_expr.X_add_number < 0)
10273         {
10274           imm_expr.X_add_number = -imm_expr.X_add_number;
10275           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
10276                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10277         }
10278       else if (CPU_HAS_SEQ (mips_opts.arch))
10279         {
10280           used_at = 1;
10281           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10282           macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
10283           break;
10284         }
10285       else
10286         {
10287           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10288           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
10289           used_at = 1;
10290         }
10291       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
10292       break;
10293
10294     case M_SUB_I:
10295       s = "addi";
10296       s2 = "sub";
10297       goto do_subi;
10298     case M_SUBU_I:
10299       s = "addiu";
10300       s2 = "subu";
10301       goto do_subi;
10302     case M_DSUB_I:
10303       dbl = 1;
10304       s = "daddi";
10305       s2 = "dsub";
10306       if (!mips_opts.micromips)
10307         goto do_subi;
10308       if (imm_expr.X_op == O_constant
10309           && imm_expr.X_add_number > -0x200
10310           && imm_expr.X_add_number <= 0x200)
10311         {
10312           macro_build (NULL, s, "t,r,.", dreg, sreg, -imm_expr.X_add_number);
10313           break;
10314         }
10315       goto do_subi_i;
10316     case M_DSUBU_I:
10317       dbl = 1;
10318       s = "daddiu";
10319       s2 = "dsubu";
10320     do_subi:
10321       if (imm_expr.X_op == O_constant
10322           && imm_expr.X_add_number > -0x8000
10323           && imm_expr.X_add_number <= 0x8000)
10324         {
10325           imm_expr.X_add_number = -imm_expr.X_add_number;
10326           macro_build (&imm_expr, s, "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10327           break;
10328         }
10329     do_subi_i:
10330       used_at = 1;
10331       load_register (AT, &imm_expr, dbl);
10332       macro_build (NULL, s2, "d,v,t", dreg, sreg, AT);
10333       break;
10334
10335     case M_TEQ_I:
10336       s = "teq";
10337       goto trap;
10338     case M_TGE_I:
10339       s = "tge";
10340       goto trap;
10341     case M_TGEU_I:
10342       s = "tgeu";
10343       goto trap;
10344     case M_TLT_I:
10345       s = "tlt";
10346       goto trap;
10347     case M_TLTU_I:
10348       s = "tltu";
10349       goto trap;
10350     case M_TNE_I:
10351       s = "tne";
10352     trap:
10353       used_at = 1;
10354       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10355       macro_build (NULL, s, "s,t", sreg, AT);
10356       break;
10357
10358     case M_TRUNCWS:
10359     case M_TRUNCWD:
10360       gas_assert (!mips_opts.micromips);
10361       gas_assert (mips_opts.isa == ISA_MIPS1);
10362       used_at = 1;
10363       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
10364       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
10365
10366       /*
10367        * Is the double cfc1 instruction a bug in the mips assembler;
10368        * or is there a reason for it?
10369        */
10370       start_noreorder ();
10371       macro_build (NULL, "cfc1", "t,G", treg, RA);
10372       macro_build (NULL, "cfc1", "t,G", treg, RA);
10373       macro_build (NULL, "nop", "");
10374       expr1.X_add_number = 3;
10375       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
10376       expr1.X_add_number = 2;
10377       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
10378       macro_build (NULL, "ctc1", "t,G", AT, RA);
10379       macro_build (NULL, "nop", "");
10380       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
10381                    dreg, sreg);
10382       macro_build (NULL, "ctc1", "t,G", treg, RA);
10383       macro_build (NULL, "nop", "");
10384       end_noreorder ();
10385       break;
10386
10387     case M_ULH_A:
10388       ab = 1;
10389     case M_ULH:
10390       s = "lb";
10391       s2 = "lbu";
10392       off = 1;
10393       goto uld_st;
10394     case M_ULHU_A:
10395       ab = 1;
10396     case M_ULHU:
10397       s = "lbu";
10398       s2 = "lbu";
10399       off = 1;
10400       goto uld_st;
10401     case M_ULW_A:
10402       ab = 1;
10403     case M_ULW:
10404       s = "lwl";
10405       s2 = "lwr";
10406       offbits = (mips_opts.micromips ? 12 : 16);
10407       off = 3;
10408       goto uld_st;
10409     case M_ULD_A:
10410       ab = 1;
10411     case M_ULD:
10412       s = "ldl";
10413       s2 = "ldr";
10414       offbits = (mips_opts.micromips ? 12 : 16);
10415       off = 7;
10416       goto uld_st;
10417     case M_USH_A:
10418       ab = 1;
10419     case M_USH:
10420       s = "sb";
10421       s2 = "sb";
10422       off = 1;
10423       ust = 1;
10424       goto uld_st;
10425     case M_USW_A:
10426       ab = 1;
10427     case M_USW:
10428       s = "swl";
10429       s2 = "swr";
10430       offbits = (mips_opts.micromips ? 12 : 16);
10431       off = 3;
10432       ust = 1;
10433       goto uld_st;
10434     case M_USD_A:
10435       ab = 1;
10436     case M_USD:
10437       s = "sdl";
10438       s2 = "sdr";
10439       offbits = (mips_opts.micromips ? 12 : 16);
10440       off = 7;
10441       ust = 1;
10442
10443     uld_st:
10444       if (!ab && offset_expr.X_add_number >= 0x8000 - off)
10445         as_bad (_("Operand overflow"));
10446
10447       ep = &offset_expr;
10448       expr1.X_add_number = 0;
10449       if (ab)
10450         {
10451           used_at = 1;
10452           tempreg = AT;
10453           load_address (tempreg, ep, &used_at);
10454           if (breg != 0)
10455             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
10456                          tempreg, tempreg, breg);
10457           breg = tempreg;
10458           tempreg = treg;
10459           ep = &expr1;
10460         }
10461       else if (offbits == 12
10462                && (offset_expr.X_op != O_constant
10463                    || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number)
10464                    || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number + off)))
10465         {
10466           used_at = 1;
10467           tempreg = AT;
10468           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", tempreg, breg,
10469                        -1, offset_reloc[0], offset_reloc[1], offset_reloc[2]);
10470           breg = tempreg;
10471           tempreg = treg;
10472           ep = &expr1;
10473         }
10474       else if (!ust && treg == breg)
10475         {
10476           used_at = 1;
10477           tempreg = AT;
10478         }
10479       else
10480         tempreg = treg;
10481
10482       if (off == 1)
10483         goto ulh_sh;
10484
10485       if (!target_big_endian)
10486         ep->X_add_number += off;
10487       if (offbits != 12)
10488         macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10489       else
10490         macro_build (NULL, s, "t,~(b)",
10491                      tempreg, (unsigned long) ep->X_add_number, breg);
10492
10493       if (!target_big_endian)
10494         ep->X_add_number -= off;
10495       else
10496         ep->X_add_number += off;
10497       if (offbits != 12)
10498         macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10499       else
10500         macro_build (NULL, s2, "t,~(b)",
10501                      tempreg, (unsigned long) ep->X_add_number, breg);
10502
10503       /* If necessary, move the result in tempreg to the final destination.  */
10504       if (!ust && treg != tempreg)
10505         {
10506           /* Protect second load's delay slot.  */
10507           load_delay_nop ();
10508           move_register (treg, tempreg);
10509         }
10510       break;
10511
10512     ulh_sh:
10513       used_at = 1;
10514       if (target_big_endian == ust)
10515         ep->X_add_number += off;
10516       tempreg = ust || ab ? treg : AT;
10517       macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10518
10519       /* For halfword transfers we need a temporary register to shuffle
10520          bytes.  Unfortunately for M_USH_A we have none available before
10521          the next store as AT holds the base address.  We deal with this
10522          case by clobbering TREG and then restoring it as with ULH.  */
10523       tempreg = ust == ab ? treg : AT;
10524       if (ust)
10525         macro_build (NULL, "srl", SHFT_FMT, tempreg, treg, 8);
10526
10527       if (target_big_endian == ust)
10528         ep->X_add_number -= off;
10529       else
10530         ep->X_add_number += off;
10531       macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10532
10533       /* For M_USH_A re-retrieve the LSB.  */
10534       if (ust && ab)
10535         {
10536           if (target_big_endian)
10537             ep->X_add_number += off;
10538           else
10539             ep->X_add_number -= off;
10540           macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
10541         }
10542       /* For ULH and M_USH_A OR the LSB in.  */
10543       if (!ust || ab)
10544         {
10545           tempreg = !ab ? AT : treg;
10546           macro_build (NULL, "sll", SHFT_FMT, tempreg, tempreg, 8);
10547           macro_build (NULL, "or", "d,v,t", treg, treg, AT);
10548         }
10549       break;
10550
10551     default:
10552       /* FIXME: Check if this is one of the itbl macros, since they
10553          are added dynamically.  */
10554       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
10555       break;
10556     }
10557   if (!mips_opts.at && used_at)
10558     as_bad (_("Macro used $at after \".set noat\""));
10559 }
10560
10561 /* Implement macros in mips16 mode.  */
10562
10563 static void
10564 mips16_macro (struct mips_cl_insn *ip)
10565 {
10566   int mask;
10567   int xreg, yreg, zreg, tmp;
10568   expressionS expr1;
10569   int dbl;
10570   const char *s, *s2, *s3;
10571
10572   mask = ip->insn_mo->mask;
10573
10574   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
10575   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
10576   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
10577
10578   expr1.X_op = O_constant;
10579   expr1.X_op_symbol = NULL;
10580   expr1.X_add_symbol = NULL;
10581   expr1.X_add_number = 1;
10582
10583   dbl = 0;
10584
10585   switch (mask)
10586     {
10587     default:
10588       abort ();
10589
10590     case M_DDIV_3:
10591       dbl = 1;
10592     case M_DIV_3:
10593       s = "mflo";
10594       goto do_div3;
10595     case M_DREM_3:
10596       dbl = 1;
10597     case M_REM_3:
10598       s = "mfhi";
10599     do_div3:
10600       start_noreorder ();
10601       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
10602       expr1.X_add_number = 2;
10603       macro_build (&expr1, "bnez", "x,p", yreg);
10604       macro_build (NULL, "break", "6", 7);
10605
10606       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
10607          since that causes an overflow.  We should do that as well,
10608          but I don't see how to do the comparisons without a temporary
10609          register.  */
10610       end_noreorder ();
10611       macro_build (NULL, s, "x", zreg);
10612       break;
10613
10614     case M_DIVU_3:
10615       s = "divu";
10616       s2 = "mflo";
10617       goto do_divu3;
10618     case M_REMU_3:
10619       s = "divu";
10620       s2 = "mfhi";
10621       goto do_divu3;
10622     case M_DDIVU_3:
10623       s = "ddivu";
10624       s2 = "mflo";
10625       goto do_divu3;
10626     case M_DREMU_3:
10627       s = "ddivu";
10628       s2 = "mfhi";
10629     do_divu3:
10630       start_noreorder ();
10631       macro_build (NULL, s, "0,x,y", xreg, yreg);
10632       expr1.X_add_number = 2;
10633       macro_build (&expr1, "bnez", "x,p", yreg);
10634       macro_build (NULL, "break", "6", 7);
10635       end_noreorder ();
10636       macro_build (NULL, s2, "x", zreg);
10637       break;
10638
10639     case M_DMUL:
10640       dbl = 1;
10641     case M_MUL:
10642       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
10643       macro_build (NULL, "mflo", "x", zreg);
10644       break;
10645
10646     case M_DSUBU_I:
10647       dbl = 1;
10648       goto do_subu;
10649     case M_SUBU_I:
10650     do_subu:
10651       if (imm_expr.X_op != O_constant)
10652         as_bad (_("Unsupported large constant"));
10653       imm_expr.X_add_number = -imm_expr.X_add_number;
10654       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
10655       break;
10656
10657     case M_SUBU_I_2:
10658       if (imm_expr.X_op != O_constant)
10659         as_bad (_("Unsupported large constant"));
10660       imm_expr.X_add_number = -imm_expr.X_add_number;
10661       macro_build (&imm_expr, "addiu", "x,k", xreg);
10662       break;
10663
10664     case M_DSUBU_I_2:
10665       if (imm_expr.X_op != O_constant)
10666         as_bad (_("Unsupported large constant"));
10667       imm_expr.X_add_number = -imm_expr.X_add_number;
10668       macro_build (&imm_expr, "daddiu", "y,j", yreg);
10669       break;
10670
10671     case M_BEQ:
10672       s = "cmp";
10673       s2 = "bteqz";
10674       goto do_branch;
10675     case M_BNE:
10676       s = "cmp";
10677       s2 = "btnez";
10678       goto do_branch;
10679     case M_BLT:
10680       s = "slt";
10681       s2 = "btnez";
10682       goto do_branch;
10683     case M_BLTU:
10684       s = "sltu";
10685       s2 = "btnez";
10686       goto do_branch;
10687     case M_BLE:
10688       s = "slt";
10689       s2 = "bteqz";
10690       goto do_reverse_branch;
10691     case M_BLEU:
10692       s = "sltu";
10693       s2 = "bteqz";
10694       goto do_reverse_branch;
10695     case M_BGE:
10696       s = "slt";
10697       s2 = "bteqz";
10698       goto do_branch;
10699     case M_BGEU:
10700       s = "sltu";
10701       s2 = "bteqz";
10702       goto do_branch;
10703     case M_BGT:
10704       s = "slt";
10705       s2 = "btnez";
10706       goto do_reverse_branch;
10707     case M_BGTU:
10708       s = "sltu";
10709       s2 = "btnez";
10710
10711     do_reverse_branch:
10712       tmp = xreg;
10713       xreg = yreg;
10714       yreg = tmp;
10715
10716     do_branch:
10717       macro_build (NULL, s, "x,y", xreg, yreg);
10718       macro_build (&offset_expr, s2, "p");
10719       break;
10720
10721     case M_BEQ_I:
10722       s = "cmpi";
10723       s2 = "bteqz";
10724       s3 = "x,U";
10725       goto do_branch_i;
10726     case M_BNE_I:
10727       s = "cmpi";
10728       s2 = "btnez";
10729       s3 = "x,U";
10730       goto do_branch_i;
10731     case M_BLT_I:
10732       s = "slti";
10733       s2 = "btnez";
10734       s3 = "x,8";
10735       goto do_branch_i;
10736     case M_BLTU_I:
10737       s = "sltiu";
10738       s2 = "btnez";
10739       s3 = "x,8";
10740       goto do_branch_i;
10741     case M_BLE_I:
10742       s = "slti";
10743       s2 = "btnez";
10744       s3 = "x,8";
10745       goto do_addone_branch_i;
10746     case M_BLEU_I:
10747       s = "sltiu";
10748       s2 = "btnez";
10749       s3 = "x,8";
10750       goto do_addone_branch_i;
10751     case M_BGE_I:
10752       s = "slti";
10753       s2 = "bteqz";
10754       s3 = "x,8";
10755       goto do_branch_i;
10756     case M_BGEU_I:
10757       s = "sltiu";
10758       s2 = "bteqz";
10759       s3 = "x,8";
10760       goto do_branch_i;
10761     case M_BGT_I:
10762       s = "slti";
10763       s2 = "bteqz";
10764       s3 = "x,8";
10765       goto do_addone_branch_i;
10766     case M_BGTU_I:
10767       s = "sltiu";
10768       s2 = "bteqz";
10769       s3 = "x,8";
10770
10771     do_addone_branch_i:
10772       if (imm_expr.X_op != O_constant)
10773         as_bad (_("Unsupported large constant"));
10774       ++imm_expr.X_add_number;
10775
10776     do_branch_i:
10777       macro_build (&imm_expr, s, s3, xreg);
10778       macro_build (&offset_expr, s2, "p");
10779       break;
10780
10781     case M_ABS:
10782       expr1.X_add_number = 0;
10783       macro_build (&expr1, "slti", "x,8", yreg);
10784       if (xreg != yreg)
10785         move_register (xreg, yreg);
10786       expr1.X_add_number = 2;
10787       macro_build (&expr1, "bteqz", "p");
10788       macro_build (NULL, "neg", "x,w", xreg, xreg);
10789     }
10790 }
10791
10792 /* For consistency checking, verify that all bits are specified either
10793    by the match/mask part of the instruction definition, or by the
10794    operand list.  */
10795 static int
10796 validate_mips_insn (const struct mips_opcode *opc)
10797 {
10798   const char *p = opc->args;
10799   char c;
10800   unsigned long used_bits = opc->mask;
10801
10802   if ((used_bits & opc->match) != opc->match)
10803     {
10804       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
10805               opc->name, opc->args);
10806       return 0;
10807     }
10808 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
10809   while (*p)
10810     switch (c = *p++)
10811       {
10812       case ',': break;
10813       case '(': break;
10814       case ')': break;
10815       case '+':
10816         switch (c = *p++)
10817           {
10818           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
10819           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
10820           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
10821           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
10822           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
10823           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
10824           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10825           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
10826                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
10827           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
10828           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
10829           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10830           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10831           case 'I': break;
10832           case 'J': USE_BITS (OP_MASK_CODE10,   OP_SH_CODE10);  break;
10833           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
10834           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
10835                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
10836           case 'x': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
10837           case 'X': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
10838           case 'p': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
10839           case 'P': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
10840           case 'Q': USE_BITS (OP_MASK_SEQI,     OP_SH_SEQI);    break;
10841           case 's': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
10842           case 'S': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
10843           case 'z': USE_BITS (OP_MASK_RZ,       OP_SH_RZ);      break;
10844           case 'Z': USE_BITS (OP_MASK_FZ,       OP_SH_FZ);      break;
10845           case 'a': USE_BITS (OP_MASK_OFFSET_A, OP_SH_OFFSET_A); break;
10846           case 'b': USE_BITS (OP_MASK_OFFSET_B, OP_SH_OFFSET_B); break;
10847           case 'c': USE_BITS (OP_MASK_OFFSET_C, OP_SH_OFFSET_C); break;
10848           case 'j': USE_BITS (OP_MASK_EVAOFFSET, OP_SH_EVAOFFSET); break;
10849
10850           default:
10851             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
10852                     c, opc->name, opc->args);
10853             return 0;
10854           }
10855         break;
10856       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10857       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10858       case 'A': break;
10859       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
10860       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
10861       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
10862       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10863       case 'F': break;
10864       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10865       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
10866       case 'I': break;
10867       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
10868       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10869       case 'L': break;
10870       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
10871       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
10872       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
10873       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
10874                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10875       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
10876       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10877       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10878       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10879       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10880       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
10881       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10882       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10883       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
10884       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10885       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
10886       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10887       case 'f': break;
10888       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
10889       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
10890       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10891       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
10892       case 'l': break;
10893       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10894       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10895       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
10896       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10897       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10898       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10899       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
10900       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10901       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10902       case 'x': break;
10903       case 'z': break;
10904       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
10905       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
10906                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10907       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
10908       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
10909       case '[': break;
10910       case ']': break;
10911       case '1': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10912       case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
10913       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
10914       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
10915       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
10916       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10917       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
10918       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
10919       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
10920       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
10921       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
10922       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
10923       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
10924       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
10925       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
10926       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
10927       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
10928       case '\\': USE_BITS (OP_MASK_3BITPOS,     OP_SH_3BITPOS); break;
10929       case '~': USE_BITS (OP_MASK_OFFSET12,     OP_SH_OFFSET12); break;
10930       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10931       default:
10932         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
10933                 c, opc->name, opc->args);
10934         return 0;
10935       }
10936 #undef USE_BITS
10937   if (used_bits != 0xffffffff)
10938     {
10939       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
10940               ~used_bits & 0xffffffff, opc->name, opc->args);
10941       return 0;
10942     }
10943   return 1;
10944 }
10945
10946 /* For consistency checking, verify that the length implied matches the
10947    major opcode and that all bits are specified either by the match/mask
10948    part of the instruction definition, or by the operand list.  */
10949
10950 static int
10951 validate_micromips_insn (const struct mips_opcode *opc)
10952 {
10953   unsigned long match = opc->match;
10954   unsigned long mask = opc->mask;
10955   const char *p = opc->args;
10956   unsigned long insn_bits;
10957   unsigned long used_bits;
10958   unsigned long major;
10959   unsigned int length;
10960   char e;
10961   char c;
10962
10963   if ((mask & match) != match)
10964     {
10965       as_bad (_("Internal error: bad microMIPS opcode (mask error): %s %s"),
10966               opc->name, opc->args);
10967       return 0;
10968     }
10969   length = micromips_insn_length (opc);
10970   if (length != 2 && length != 4)
10971     {
10972       as_bad (_("Internal error: bad microMIPS opcode (incorrect length: %u): "
10973                 "%s %s"), length, opc->name, opc->args);
10974       return 0;
10975     }
10976   major = match >> (10 + 8 * (length - 2));
10977   if ((length == 2 && (major & 7) != 1 && (major & 6) != 2)
10978       || (length == 4 && (major & 7) != 0 && (major & 4) != 4))
10979     {
10980       as_bad (_("Internal error: bad microMIPS opcode "
10981                 "(opcode/length mismatch): %s %s"), opc->name, opc->args);
10982       return 0;
10983     }
10984
10985   /* Shift piecewise to avoid an overflow where unsigned long is 32-bit.  */
10986   insn_bits = 1 << 4 * length;
10987   insn_bits <<= 4 * length;
10988   insn_bits -= 1;
10989   used_bits = mask;
10990 #define USE_BITS(field) \
10991   (used_bits |= MICROMIPSOP_MASK_##field << MICROMIPSOP_SH_##field)
10992   while (*p)
10993     switch (c = *p++)
10994       {
10995       case ',': break;
10996       case '(': break;
10997       case ')': break;
10998       case '+':
10999         e = c;
11000         switch (c = *p++)
11001           {
11002           case 'A': USE_BITS (EXTLSB);  break;
11003           case 'B': USE_BITS (INSMSB);  break;
11004           case 'C': USE_BITS (EXTMSBD); break;
11005           case 'D': USE_BITS (RS);      USE_BITS (SEL); break;
11006           case 'E': USE_BITS (EXTLSB);  break;
11007           case 'F': USE_BITS (INSMSB);  break;
11008           case 'G': USE_BITS (EXTMSBD); break;
11009           case 'H': USE_BITS (EXTMSBD); break;
11010           case 'j': USE_BITS (EVAOFFSET);       break;
11011           default:
11012             as_bad (_("Internal error: bad mips opcode "
11013                       "(unknown extension operand type `%c%c'): %s %s"),
11014                     e, c, opc->name, opc->args);
11015             return 0;
11016           }
11017         break;
11018       case 'm':
11019         e = c;
11020         switch (c = *p++)
11021           {
11022           case 'A': USE_BITS (IMMA);    break;
11023           case 'B': USE_BITS (IMMB);    break;
11024           case 'C': USE_BITS (IMMC);    break;
11025           case 'D': USE_BITS (IMMD);    break;
11026           case 'E': USE_BITS (IMME);    break;
11027           case 'F': USE_BITS (IMMF);    break;
11028           case 'G': USE_BITS (IMMG);    break;
11029           case 'H': USE_BITS (IMMH);    break;
11030           case 'I': USE_BITS (IMMI);    break;
11031           case 'J': USE_BITS (IMMJ);    break;
11032           case 'L': USE_BITS (IMML);    break;
11033           case 'M': USE_BITS (IMMM);    break;
11034           case 'N': USE_BITS (IMMN);    break;
11035           case 'O': USE_BITS (IMMO);    break;
11036           case 'P': USE_BITS (IMMP);    break;
11037           case 'Q': USE_BITS (IMMQ);    break;
11038           case 'U': USE_BITS (IMMU);    break;
11039           case 'W': USE_BITS (IMMW);    break;
11040           case 'X': USE_BITS (IMMX);    break;
11041           case 'Y': USE_BITS (IMMY);    break;
11042           case 'Z': break;
11043           case 'a': break;
11044           case 'b': USE_BITS (MB);      break;
11045           case 'c': USE_BITS (MC);      break;
11046           case 'd': USE_BITS (MD);      break;
11047           case 'e': USE_BITS (ME);      break;
11048           case 'f': USE_BITS (MF);      break;
11049           case 'g': USE_BITS (MG);      break;
11050           case 'h': USE_BITS (MH);      break;
11051           case 'i': USE_BITS (MI);      break;
11052           case 'j': USE_BITS (MJ);      break;
11053           case 'l': USE_BITS (ML);      break;
11054           case 'm': USE_BITS (MM);      break;
11055           case 'n': USE_BITS (MN);      break;
11056           case 'p': USE_BITS (MP);      break;
11057           case 'q': USE_BITS (MQ);      break;
11058           case 'r': break;
11059           case 's': break;
11060           case 't': break;
11061           case 'x': break;
11062           case 'y': break;
11063           case 'z': break;
11064           default:
11065             as_bad (_("Internal error: bad mips opcode "
11066                       "(unknown extension operand type `%c%c'): %s %s"),
11067                     e, c, opc->name, opc->args);
11068             return 0;
11069           }
11070         break;
11071       case '.': USE_BITS (OFFSET10);    break;
11072       case '1': USE_BITS (STYPE);       break;
11073       case '2': USE_BITS (BP);          break;
11074       case '3': USE_BITS (SA3);         break;
11075       case '4': USE_BITS (SA4);         break;
11076       case '5': USE_BITS (IMM8);        break;
11077       case '6': USE_BITS (RS);          break;
11078       case '7': USE_BITS (DSPACC);      break;
11079       case '8': USE_BITS (WRDSP);       break;
11080       case '0': USE_BITS (DSPSFT);      break;
11081       case '<': USE_BITS (SHAMT);       break;
11082       case '>': USE_BITS (SHAMT);       break;
11083       case '@': USE_BITS (IMM10);       break;
11084       case 'B': USE_BITS (CODE10);      break;
11085       case 'C': USE_BITS (COPZ);        break;
11086       case 'D': USE_BITS (FD);          break;
11087       case 'E': USE_BITS (RT);          break;
11088       case 'G': USE_BITS (RS);          break;
11089       case 'H': USE_BITS (SEL);         break;
11090       case 'K': USE_BITS (RS);          break;
11091       case 'M': USE_BITS (CCC);         break;
11092       case 'N': USE_BITS (BCC);         break;
11093       case 'R': USE_BITS (FR);          break;
11094       case 'S': USE_BITS (FS);          break;
11095       case 'T': USE_BITS (FT);          break;
11096       case 'V': USE_BITS (FS);          break;
11097       case '\\': USE_BITS (3BITPOS);    break;
11098       case '^': USE_BITS (RD);          break;
11099       case 'a': USE_BITS (TARGET);      break;
11100       case 'b': USE_BITS (RS);          break;
11101       case 'c': USE_BITS (CODE);        break;
11102       case 'd': USE_BITS (RD);          break;
11103       case 'h': USE_BITS (PREFX);       break;
11104       case 'i': USE_BITS (IMMEDIATE);   break;
11105       case 'j': USE_BITS (DELTA);       break;
11106       case 'k': USE_BITS (CACHE);       break;
11107       case 'n': USE_BITS (RT);          break;
11108       case 'o': USE_BITS (DELTA);       break;
11109       case 'p': USE_BITS (DELTA);       break;
11110       case 'q': USE_BITS (CODE2);       break;
11111       case 'r': USE_BITS (RS);          break;
11112       case 's': USE_BITS (RS);          break;
11113       case 't': USE_BITS (RT);          break;
11114       case 'u': USE_BITS (IMMEDIATE);   break;
11115       case 'v': USE_BITS (RS);          break;
11116       case 'w': USE_BITS (RT);          break;
11117       case 'y': USE_BITS (RS3);         break;
11118       case 'z': break;
11119       case '|': USE_BITS (TRAP);        break;
11120       case '~': USE_BITS (OFFSET12);    break;
11121       default:
11122         as_bad (_("Internal error: bad microMIPS opcode "
11123                   "(unknown operand type `%c'): %s %s"),
11124                 c, opc->name, opc->args);
11125         return 0;
11126       }
11127 #undef USE_BITS
11128   if (used_bits != insn_bits)
11129     {
11130       if (~used_bits & insn_bits)
11131         as_bad (_("Internal error: bad microMIPS opcode "
11132                   "(bits 0x%lx undefined): %s %s"),
11133                 ~used_bits & insn_bits, opc->name, opc->args);
11134       if (used_bits & ~insn_bits)
11135         as_bad (_("Internal error: bad microMIPS opcode "
11136                   "(bits 0x%lx defined): %s %s"),
11137                 used_bits & ~insn_bits, opc->name, opc->args);
11138       return 0;
11139     }
11140   return 1;
11141 }
11142
11143 /* UDI immediates.  */
11144 struct mips_immed {
11145   char          type;
11146   unsigned int  shift;
11147   unsigned long mask;
11148   const char *  desc;
11149 };
11150
11151 static const struct mips_immed mips_immed[] = {
11152   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
11153   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
11154   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
11155   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
11156   { 0,0,0,0 }
11157 };
11158
11159 /* Check whether an odd floating-point register is allowed.  */
11160 static int
11161 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
11162 {
11163   const char *s = insn->name;
11164
11165   if (insn->pinfo == INSN_MACRO)
11166     /* Let a macro pass, we'll catch it later when it is expanded.  */
11167     return 1;
11168
11169   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa) || (mips_opts.arch == CPU_R5900))
11170     {
11171       /* Allow odd registers for single-precision ops.  */
11172       switch (insn->pinfo & (FP_S | FP_D))
11173         {
11174         case FP_S:
11175         case 0:
11176           return 1;     /* both single precision - ok */
11177         case FP_D:
11178           return 0;     /* both double precision - fail */
11179         default:
11180           break;
11181         }
11182
11183       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
11184       s = strchr (insn->name, '.');
11185       if (argnum == 2)
11186         s = s != NULL ? strchr (s + 1, '.') : NULL;
11187       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
11188     } 
11189
11190   /* Single-precision coprocessor loads and moves are OK too.  */
11191   if ((insn->pinfo & FP_S)
11192       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
11193                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
11194     return 1;
11195
11196   return 0;
11197 }
11198
11199 /* Check if EXPR is a constant between MIN (inclusive) and MAX (exclusive)
11200    taking bits from BIT up.  */
11201 static int
11202 expr_const_in_range (expressionS *ep, offsetT min, offsetT max, int bit)
11203 {
11204   return (ep->X_op == O_constant
11205           && (ep->X_add_number & ((1 << bit) - 1)) == 0
11206           && ep->X_add_number >= min << bit
11207           && ep->X_add_number < max << bit);
11208 }
11209
11210 /* This routine assembles an instruction into its binary format.  As a
11211    side effect, it sets one of the global variables imm_reloc or
11212    offset_reloc to the type of relocation to do if one of the operands
11213    is an address expression.  */
11214
11215 static void
11216 mips_ip (char *str, struct mips_cl_insn *ip)
11217 {
11218   bfd_boolean wrong_delay_slot_insns = FALSE;
11219   bfd_boolean need_delay_slot_ok = TRUE;
11220   struct mips_opcode *firstinsn = NULL;
11221   const struct mips_opcode *past;
11222   struct hash_control *hash;
11223   char *s;
11224   const char *args;
11225   char c = 0;
11226   struct mips_opcode *insn;
11227   char *argsStart;
11228   unsigned int regno;
11229   unsigned int lastregno;
11230   unsigned int destregno = 0;
11231   unsigned int lastpos = 0;
11232   unsigned int limlo, limhi;
11233   int sizelo;
11234   char *s_reset;
11235   offsetT min_range, max_range;
11236   long opend;
11237   char *name;
11238   int argnum;
11239   unsigned int rtype;
11240   char *dot;
11241   long end;
11242
11243   insn_error = NULL;
11244
11245   if (mips_opts.micromips)
11246     {
11247       hash = micromips_op_hash;
11248       past = &micromips_opcodes[bfd_micromips_num_opcodes];
11249     }
11250   else
11251     {
11252       hash = op_hash;
11253       past = &mips_opcodes[NUMOPCODES];
11254     }
11255   forced_insn_length = 0;
11256   insn = NULL;
11257
11258   /* We first try to match an instruction up to a space or to the end.  */
11259   for (end = 0; str[end] != '\0' && !ISSPACE (str[end]); end++)
11260     continue;
11261
11262   /* Make a copy of the instruction so that we can fiddle with it.  */
11263   name = alloca (end + 1);
11264   memcpy (name, str, end);
11265   name[end] = '\0';
11266
11267   for (;;)
11268     {
11269       insn = (struct mips_opcode *) hash_find (hash, name);
11270
11271       if (insn != NULL || !mips_opts.micromips)
11272         break;
11273       if (forced_insn_length)
11274         break;
11275
11276       /* See if there's an instruction size override suffix,
11277          either `16' or `32', at the end of the mnemonic proper,
11278          that defines the operation, i.e. before the first `.'
11279          character if any.  Strip it and retry.  */
11280       dot = strchr (name, '.');
11281       opend = dot != NULL ? dot - name : end;
11282       if (opend < 3)
11283         break;
11284       if (name[opend - 2] == '1' && name[opend - 1] == '6')
11285         forced_insn_length = 2;
11286       else if (name[opend - 2] == '3' && name[opend - 1] == '2')
11287         forced_insn_length = 4;
11288       else
11289         break;
11290       memcpy (name + opend - 2, name + opend, end - opend + 1);
11291     }
11292   if (insn == NULL)
11293     {
11294       insn_error = _("Unrecognized opcode");
11295       return;
11296     }
11297
11298   /* For microMIPS instructions placed in a fixed-length branch delay slot
11299      we make up to two passes over the relevant fragment of the opcode
11300      table.  First we try instructions that meet the delay slot's length
11301      requirement.  If none matched, then we retry with the remaining ones
11302      and if one matches, then we use it and then issue an appropriate
11303      warning later on.  */
11304   argsStart = s = str + end;
11305   for (;;)
11306     {
11307       bfd_boolean delay_slot_ok;
11308       bfd_boolean size_ok;
11309       bfd_boolean ok;
11310
11311       gas_assert (strcmp (insn->name, name) == 0);
11312
11313       ok = is_opcode_valid (insn);
11314       size_ok = is_size_valid (insn);
11315       delay_slot_ok = is_delay_slot_valid (insn);
11316       if (!delay_slot_ok && !wrong_delay_slot_insns)
11317         {
11318           firstinsn = insn;
11319           wrong_delay_slot_insns = TRUE;
11320         }
11321       if (!ok || !size_ok || delay_slot_ok != need_delay_slot_ok)
11322         {
11323           static char buf[256];
11324
11325           if (insn + 1 < past && strcmp (insn->name, insn[1].name) == 0)
11326             {
11327               ++insn;
11328               continue;
11329             }
11330           if (wrong_delay_slot_insns && need_delay_slot_ok)
11331             {
11332               gas_assert (firstinsn);
11333               need_delay_slot_ok = FALSE;
11334               past = insn + 1;
11335               insn = firstinsn;
11336               continue;
11337             }
11338
11339           if (insn_error)
11340             return;
11341
11342           if (!ok)
11343             sprintf (buf, _("Opcode not supported on this processor: %s (%s)"),
11344                      mips_cpu_info_from_arch (mips_opts.arch)->name,
11345                      mips_cpu_info_from_isa (mips_opts.isa)->name);
11346           else
11347             sprintf (buf, _("Unrecognized %u-bit version of microMIPS opcode"),
11348                      8 * forced_insn_length);
11349           insn_error = buf;
11350
11351           return;
11352         }
11353
11354       create_insn (ip, insn);
11355       insn_error = NULL;
11356       argnum = 1;
11357       lastregno = 0xffffffff;
11358       for (args = insn->args;; ++args)
11359         {
11360           int is_mdmx;
11361
11362           s += strspn (s, " \t");
11363           is_mdmx = 0;
11364           switch (*args)
11365             {
11366             case '\0':          /* end of args */
11367               if (*s == '\0')
11368                 return;
11369               break;
11370
11371             case '2':
11372               /* DSP 2-bit unsigned immediate in bit 11 (for standard MIPS
11373                  code) or 14 (for microMIPS code).  */
11374               my_getExpression (&imm_expr, s);
11375               check_absolute_expr (ip, &imm_expr);
11376               if ((unsigned long) imm_expr.X_add_number != 1
11377                   && (unsigned long) imm_expr.X_add_number != 3)
11378                 {
11379                   as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
11380                           (unsigned long) imm_expr.X_add_number);
11381                 }
11382               INSERT_OPERAND (mips_opts.micromips,
11383                               BP, *ip, imm_expr.X_add_number);
11384               imm_expr.X_op = O_absent;
11385               s = expr_end;
11386               continue;
11387
11388             case '3':
11389               /* DSP 3-bit unsigned immediate in bit 21 (for standard MIPS
11390                  code) or 13 (for microMIPS code).  */
11391               {
11392                 unsigned long mask = (mips_opts.micromips
11393                                       ? MICROMIPSOP_MASK_SA3 : OP_MASK_SA3);
11394
11395                 my_getExpression (&imm_expr, s);
11396                 check_absolute_expr (ip, &imm_expr);
11397                 if ((unsigned long) imm_expr.X_add_number > mask)
11398                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11399                           mask, (unsigned long) imm_expr.X_add_number);
11400                 INSERT_OPERAND (mips_opts.micromips,
11401                                 SA3, *ip, imm_expr.X_add_number);
11402                 imm_expr.X_op = O_absent;
11403                 s = expr_end;
11404               }
11405               continue;
11406
11407             case '4':
11408               /* DSP 4-bit unsigned immediate in bit 21 (for standard MIPS
11409                  code) or 12 (for microMIPS code).  */
11410               {
11411                 unsigned long mask = (mips_opts.micromips
11412                                       ? MICROMIPSOP_MASK_SA4 : OP_MASK_SA4);
11413
11414                 my_getExpression (&imm_expr, s);
11415                 check_absolute_expr (ip, &imm_expr);
11416                 if ((unsigned long) imm_expr.X_add_number > mask)
11417                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11418                           mask, (unsigned long) imm_expr.X_add_number);
11419                 INSERT_OPERAND (mips_opts.micromips,
11420                                 SA4, *ip, imm_expr.X_add_number);
11421                 imm_expr.X_op = O_absent;
11422                 s = expr_end;
11423               }
11424               continue;
11425
11426             case '5':
11427               /* DSP 8-bit unsigned immediate in bit 16 (for standard MIPS
11428                  code) or 13 (for microMIPS code).  */
11429               {
11430                 unsigned long mask = (mips_opts.micromips
11431                                       ? MICROMIPSOP_MASK_IMM8 : OP_MASK_IMM8);
11432
11433                 my_getExpression (&imm_expr, s);
11434                 check_absolute_expr (ip, &imm_expr);
11435                 if ((unsigned long) imm_expr.X_add_number > mask)
11436                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11437                           mask, (unsigned long) imm_expr.X_add_number);
11438                 INSERT_OPERAND (mips_opts.micromips,
11439                                 IMM8, *ip, imm_expr.X_add_number);
11440                 imm_expr.X_op = O_absent;
11441                 s = expr_end;
11442               }
11443               continue;
11444
11445             case '6':
11446               /* DSP 5-bit unsigned immediate in bit 21 (for standard MIPS
11447                  code) or 16 (for microMIPS code).  */
11448               {
11449                 unsigned long mask = (mips_opts.micromips
11450                                       ? MICROMIPSOP_MASK_RS : OP_MASK_RS);
11451
11452                 my_getExpression (&imm_expr, s);
11453                 check_absolute_expr (ip, &imm_expr);
11454                 if ((unsigned long) imm_expr.X_add_number > mask)
11455                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11456                           mask, (unsigned long) imm_expr.X_add_number);
11457                 INSERT_OPERAND (mips_opts.micromips,
11458                                 RS, *ip, imm_expr.X_add_number);
11459                 imm_expr.X_op = O_absent;
11460                 s = expr_end;
11461               }
11462               continue;
11463
11464             case '7':
11465               /* Four DSP accumulators in bit 11 (for standard MIPS code)
11466                  or 14 (for microMIPS code).  */
11467               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c'
11468                   && s[3] >= '0' && s[3] <= '3')
11469                 {
11470                   regno = s[3] - '0';
11471                   s += 4;
11472                   INSERT_OPERAND (mips_opts.micromips, DSPACC, *ip, regno);
11473                   continue;
11474                 }
11475               else
11476                 as_bad (_("Invalid dsp acc register"));
11477               break;
11478
11479             case '8':
11480               /* DSP 6-bit unsigned immediate in bit 11 (for standard MIPS
11481                  code) or 14 (for microMIPS code).  */
11482               {
11483                 unsigned long mask = (mips_opts.micromips
11484                                       ? MICROMIPSOP_MASK_WRDSP
11485                                       : OP_MASK_WRDSP);
11486
11487                 my_getExpression (&imm_expr, s);
11488                 check_absolute_expr (ip, &imm_expr);
11489                 if ((unsigned long) imm_expr.X_add_number > mask)
11490                   as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11491                           mask, (unsigned long) imm_expr.X_add_number);
11492                 INSERT_OPERAND (mips_opts.micromips,
11493                                 WRDSP, *ip, imm_expr.X_add_number);
11494                 imm_expr.X_op = O_absent;
11495                 s = expr_end;
11496               }
11497               continue;
11498
11499             case '9': /* Four DSP accumulators in bits 21,22.  */
11500               gas_assert (!mips_opts.micromips);
11501               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c'
11502                   && s[3] >= '0' && s[3] <= '3')
11503                 {
11504                   regno = s[3] - '0';
11505                   s += 4;
11506                   INSERT_OPERAND (0, DSPACC_S, *ip, regno);
11507                   continue;
11508                 }
11509               else
11510                 as_bad (_("Invalid dsp acc register"));
11511               break;
11512
11513             case '0':
11514               /* DSP 6-bit signed immediate in bit 20 (for standard MIPS
11515                  code) or 16 (for microMIPS code).  */
11516               {
11517                 long mask = (mips_opts.micromips
11518                              ? MICROMIPSOP_MASK_DSPSFT : OP_MASK_DSPSFT);
11519
11520                 my_getExpression (&imm_expr, s);
11521                 check_absolute_expr (ip, &imm_expr);
11522                 min_range = -((mask + 1) >> 1);
11523                 max_range = ((mask + 1) >> 1) - 1;
11524                 if (imm_expr.X_add_number < min_range
11525                     || imm_expr.X_add_number > max_range)
11526                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11527                           (long) min_range, (long) max_range,
11528                           (long) imm_expr.X_add_number);
11529                 INSERT_OPERAND (mips_opts.micromips,
11530                                 DSPSFT, *ip, imm_expr.X_add_number);
11531                 imm_expr.X_op = O_absent;
11532                 s = expr_end;
11533               }
11534               continue;
11535
11536             case '\'': /* DSP 6-bit unsigned immediate in bit 16.  */
11537               gas_assert (!mips_opts.micromips);
11538               my_getExpression (&imm_expr, s);
11539               check_absolute_expr (ip, &imm_expr);
11540               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
11541                 {
11542                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
11543                           OP_MASK_RDDSP,
11544                           (unsigned long) imm_expr.X_add_number);
11545                 }
11546               INSERT_OPERAND (0, RDDSP, *ip, imm_expr.X_add_number);
11547               imm_expr.X_op = O_absent;
11548               s = expr_end;
11549               continue;
11550
11551             case ':': /* DSP 7-bit signed immediate in bit 19.  */
11552               gas_assert (!mips_opts.micromips);
11553               my_getExpression (&imm_expr, s);
11554               check_absolute_expr (ip, &imm_expr);
11555               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
11556               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
11557               if (imm_expr.X_add_number < min_range ||
11558                   imm_expr.X_add_number > max_range)
11559                 {
11560                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11561                           (long) min_range, (long) max_range,
11562                           (long) imm_expr.X_add_number);
11563                 }
11564               INSERT_OPERAND (0, DSPSFT_7, *ip, imm_expr.X_add_number);
11565               imm_expr.X_op = O_absent;
11566               s = expr_end;
11567               continue;
11568
11569             case '@': /* DSP 10-bit signed immediate in bit 16.  */
11570               {
11571                 long mask = (mips_opts.micromips
11572                              ? MICROMIPSOP_MASK_IMM10 : OP_MASK_IMM10);
11573
11574                 my_getExpression (&imm_expr, s);
11575                 check_absolute_expr (ip, &imm_expr);
11576                 min_range = -((mask + 1) >> 1);
11577                 max_range = ((mask + 1) >> 1) - 1;
11578                 if (imm_expr.X_add_number < min_range
11579                     || imm_expr.X_add_number > max_range)
11580                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11581                           (long) min_range, (long) max_range,
11582                           (long) imm_expr.X_add_number);
11583                 INSERT_OPERAND (mips_opts.micromips,
11584                                 IMM10, *ip, imm_expr.X_add_number);
11585                 imm_expr.X_op = O_absent;
11586                 s = expr_end;
11587               }
11588               continue;
11589
11590             case '^': /* DSP 5-bit unsigned immediate in bit 11.  */
11591               gas_assert (mips_opts.micromips);
11592               my_getExpression (&imm_expr, s);
11593               check_absolute_expr (ip, &imm_expr);
11594               if (imm_expr.X_add_number & ~MICROMIPSOP_MASK_RD)
11595                 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
11596                         MICROMIPSOP_MASK_RD,
11597                         (unsigned long) imm_expr.X_add_number);
11598               INSERT_OPERAND (1, RD, *ip, imm_expr.X_add_number);
11599               imm_expr.X_op = O_absent;
11600               s = expr_end;
11601               continue;
11602
11603             case '!': /* MT usermode flag bit.  */
11604               gas_assert (!mips_opts.micromips);
11605               my_getExpression (&imm_expr, s);
11606               check_absolute_expr (ip, &imm_expr);
11607               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
11608                 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
11609                         (unsigned long) imm_expr.X_add_number);
11610               INSERT_OPERAND (0, MT_U, *ip, imm_expr.X_add_number);
11611               imm_expr.X_op = O_absent;
11612               s = expr_end;
11613               continue;
11614
11615             case '$': /* MT load high flag bit.  */
11616               gas_assert (!mips_opts.micromips);
11617               my_getExpression (&imm_expr, s);
11618               check_absolute_expr (ip, &imm_expr);
11619               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
11620                 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
11621                         (unsigned long) imm_expr.X_add_number);
11622               INSERT_OPERAND (0, MT_H, *ip, imm_expr.X_add_number);
11623               imm_expr.X_op = O_absent;
11624               s = expr_end;
11625               continue;
11626
11627             case '*': /* Four DSP accumulators in bits 18,19.  */
11628               gas_assert (!mips_opts.micromips);
11629               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
11630                   s[3] >= '0' && s[3] <= '3')
11631                 {
11632                   regno = s[3] - '0';
11633                   s += 4;
11634                   INSERT_OPERAND (0, MTACC_T, *ip, regno);
11635                   continue;
11636                 }
11637               else
11638                 as_bad (_("Invalid dsp/smartmips acc register"));
11639               break;
11640
11641             case '&': /* Four DSP accumulators in bits 13,14.  */
11642               gas_assert (!mips_opts.micromips);
11643               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
11644                   s[3] >= '0' && s[3] <= '3')
11645                 {
11646                   regno = s[3] - '0';
11647                   s += 4;
11648                   INSERT_OPERAND (0, MTACC_D, *ip, regno);
11649                   continue;
11650                 }
11651               else
11652                 as_bad (_("Invalid dsp/smartmips acc register"));
11653               break;
11654
11655             case '\\':          /* 3-bit bit position.  */
11656               {
11657                 unsigned long mask = (mips_opts.micromips
11658                                       ? MICROMIPSOP_MASK_3BITPOS
11659                                       : OP_MASK_3BITPOS);
11660
11661                 my_getExpression (&imm_expr, s);
11662                 check_absolute_expr (ip, &imm_expr);
11663                 if ((unsigned long) imm_expr.X_add_number > mask)
11664                   as_warn (_("Bit position for %s not in range 0..%lu (%lu)"),
11665                            ip->insn_mo->name,
11666                            mask, (unsigned long) imm_expr.X_add_number);
11667                 INSERT_OPERAND (mips_opts.micromips,
11668                                 3BITPOS, *ip, imm_expr.X_add_number);
11669                 imm_expr.X_op = O_absent;
11670                 s = expr_end;
11671               }
11672               continue;
11673
11674             case ',':
11675               ++argnum;
11676               if (*s++ == *args)
11677                 continue;
11678               s--;
11679               switch (*++args)
11680                 {
11681                 case 'r':
11682                 case 'v':
11683                   INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
11684                   continue;
11685
11686                 case 'w':
11687                   INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
11688                   continue;
11689
11690                 case 'W':
11691                   gas_assert (!mips_opts.micromips);
11692                   INSERT_OPERAND (0, FT, *ip, lastregno);
11693                   continue;
11694
11695                 case 'V':
11696                   INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
11697                   continue;
11698                 }
11699               break;
11700
11701             case '(':
11702               /* Handle optional base register.
11703                  Either the base register is omitted or
11704                  we must have a left paren.  */
11705               /* This is dependent on the next operand specifier
11706                  is a base register specification.  */
11707               gas_assert (args[1] == 'b'
11708                           || (mips_opts.micromips
11709                               && args[1] == 'm'
11710                               && (args[2] == 'l' || args[2] == 'n'
11711                                   || args[2] == 's' || args[2] == 'a')));
11712               if (*s == '\0' && args[1] == 'b')
11713                 return;
11714               /* Fall through.  */
11715
11716             case ')':           /* These must match exactly.  */
11717               if (*s++ == *args)
11718                 continue;
11719               break;
11720
11721             case '[':           /* These must match exactly.  */
11722             case ']':
11723               gas_assert (!mips_opts.micromips);
11724               if (*s++ == *args)
11725                 continue;
11726               break;
11727
11728             case '+':           /* Opcode extension character.  */
11729               switch (*++args)
11730                 {
11731                 case '1':       /* UDI immediates.  */
11732                 case '2':
11733                 case '3':
11734                 case '4':
11735                   gas_assert (!mips_opts.micromips);
11736                   {
11737                     const struct mips_immed *imm = mips_immed;
11738
11739                     while (imm->type && imm->type != *args)
11740                       ++imm;
11741                     if (! imm->type)
11742                       abort ();
11743                     my_getExpression (&imm_expr, s);
11744                     check_absolute_expr (ip, &imm_expr);
11745                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
11746                       {
11747                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
11748                                  imm->desc ? imm->desc : ip->insn_mo->name,
11749                                  (unsigned long) imm_expr.X_add_number,
11750                                  (unsigned long) imm_expr.X_add_number);
11751                         imm_expr.X_add_number &= imm->mask;
11752                       }
11753                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
11754                                         << imm->shift);
11755                     imm_expr.X_op = O_absent;
11756                     s = expr_end;
11757                   }
11758                   continue;
11759
11760                 case 'J':               /* 10-bit hypcall code.  */
11761                   gas_assert (!mips_opts.micromips);
11762                   {
11763                     unsigned long mask = OP_MASK_CODE10;
11764
11765                     my_getExpression (&imm_expr, s);
11766                     check_absolute_expr (ip, &imm_expr);
11767                     if ((unsigned long) imm_expr.X_add_number > mask)
11768                       as_warn (_("Code for %s not in range 0..%lu (%lu)"),
11769                                ip->insn_mo->name,
11770                                mask, (unsigned long) imm_expr.X_add_number);
11771                     INSERT_OPERAND (0, CODE10, *ip, imm_expr.X_add_number);
11772                     imm_expr.X_op = O_absent;
11773                     s = expr_end;
11774                   }
11775                   continue;
11776
11777                 case 'A':               /* ins/ext position, becomes LSB.  */
11778                   limlo = 0;
11779                   limhi = 31;
11780                   goto do_lsb;
11781                 case 'E':
11782                   limlo = 32;
11783                   limhi = 63;
11784                   goto do_lsb;
11785                 do_lsb:
11786                   my_getExpression (&imm_expr, s);
11787                   check_absolute_expr (ip, &imm_expr);
11788                   if ((unsigned long) imm_expr.X_add_number < limlo
11789                       || (unsigned long) imm_expr.X_add_number > limhi)
11790                     {
11791                       as_bad (_("Improper position (%lu)"),
11792                               (unsigned long) imm_expr.X_add_number);
11793                       imm_expr.X_add_number = limlo;
11794                     }
11795                   lastpos = imm_expr.X_add_number;
11796                   INSERT_OPERAND (mips_opts.micromips,
11797                                   EXTLSB, *ip, imm_expr.X_add_number);
11798                   imm_expr.X_op = O_absent;
11799                   s = expr_end;
11800                   continue;
11801
11802                 case 'B':               /* ins size, becomes MSB.  */
11803                   limlo = 1;
11804                   limhi = 32;
11805                   goto do_msb;
11806                 case 'F':
11807                   limlo = 33;
11808                   limhi = 64;
11809                   goto do_msb;
11810                 do_msb:
11811                   my_getExpression (&imm_expr, s);
11812                   check_absolute_expr (ip, &imm_expr);
11813                   /* Check for negative input so that small negative numbers
11814                      will not succeed incorrectly.  The checks against
11815                      (pos+size) transitively check "size" itself,
11816                      assuming that "pos" is reasonable.  */
11817                   if ((long) imm_expr.X_add_number < 0
11818                       || ((unsigned long) imm_expr.X_add_number
11819                           + lastpos) < limlo
11820                       || ((unsigned long) imm_expr.X_add_number
11821                           + lastpos) > limhi)
11822                     {
11823                       as_bad (_("Improper insert size (%lu, position %lu)"),
11824                               (unsigned long) imm_expr.X_add_number,
11825                               (unsigned long) lastpos);
11826                       imm_expr.X_add_number = limlo - lastpos;
11827                     }
11828                   INSERT_OPERAND (mips_opts.micromips, INSMSB, *ip,
11829                                   lastpos + imm_expr.X_add_number - 1);
11830                   imm_expr.X_op = O_absent;
11831                   s = expr_end;
11832                   continue;
11833
11834                 case 'C':               /* ext size, becomes MSBD.  */
11835                   limlo = 1;
11836                   limhi = 32;
11837                   sizelo = 1;
11838                   goto do_msbd;
11839                 case 'G':
11840                   limlo = 33;
11841                   limhi = 64;
11842                   sizelo = 33;
11843                   goto do_msbd;
11844                 case 'H':
11845                   limlo = 33;
11846                   limhi = 64;
11847                   sizelo = 1;
11848                   goto do_msbd;
11849                 do_msbd:
11850                   my_getExpression (&imm_expr, s);
11851                   check_absolute_expr (ip, &imm_expr);
11852                   /* The checks against (pos+size) don't transitively check
11853                      "size" itself, assuming that "pos" is reasonable.
11854                      We also need to check the lower bound of "size".  */
11855                   if ((long) imm_expr.X_add_number < sizelo
11856                       || ((unsigned long) imm_expr.X_add_number
11857                           + lastpos) < limlo
11858                       || ((unsigned long) imm_expr.X_add_number
11859                           + lastpos) > limhi)
11860                     {
11861                       as_bad (_("Improper extract size (%lu, position %lu)"),
11862                               (unsigned long) imm_expr.X_add_number,
11863                               (unsigned long) lastpos);
11864                       imm_expr.X_add_number = limlo - lastpos;
11865                     }
11866                   INSERT_OPERAND (mips_opts.micromips,
11867                                   EXTMSBD, *ip, imm_expr.X_add_number - 1);
11868                   imm_expr.X_op = O_absent;
11869                   s = expr_end;
11870                   continue;
11871
11872                 case 'D':
11873                   /* +D is for disassembly only; never match.  */
11874                   break;
11875
11876                 case 'I':
11877                   /* "+I" is like "I", except that imm2_expr is used.  */
11878                   my_getExpression (&imm2_expr, s);
11879                   if (imm2_expr.X_op != O_big
11880                       && imm2_expr.X_op != O_constant)
11881                   insn_error = _("absolute expression required");
11882                   if (HAVE_32BIT_GPRS)
11883                     normalize_constant_expr (&imm2_expr);
11884                   s = expr_end;
11885                   continue;
11886
11887                 case 'T': /* Coprocessor register.  */
11888                   gas_assert (!mips_opts.micromips);
11889                   /* +T is for disassembly only; never match.  */
11890                   break;
11891
11892                 case 't': /* Coprocessor register number.  */
11893                   gas_assert (!mips_opts.micromips);
11894                   if (s[0] == '$' && ISDIGIT (s[1]))
11895                     {
11896                       ++s;
11897                       regno = 0;
11898                       do
11899                         {
11900                           regno *= 10;
11901                           regno += *s - '0';
11902                           ++s;
11903                         }
11904                       while (ISDIGIT (*s));
11905                       if (regno > 31)
11906                         as_bad (_("Invalid register number (%d)"), regno);
11907                       else
11908                         {
11909                           INSERT_OPERAND (0, RT, *ip, regno);
11910                           continue;
11911                         }
11912                     }
11913                   else
11914                     as_bad (_("Invalid coprocessor 0 register number"));
11915                   break;
11916
11917                 case 'x':
11918                   /* bbit[01] and bbit[01]32 bit index.  Give error if index
11919                      is not in the valid range.  */
11920                   gas_assert (!mips_opts.micromips);
11921                   my_getExpression (&imm_expr, s);
11922                   check_absolute_expr (ip, &imm_expr);
11923                   if ((unsigned) imm_expr.X_add_number > 31)
11924                     {
11925                       as_bad (_("Improper bit index (%lu)"),
11926                               (unsigned long) imm_expr.X_add_number);
11927                       imm_expr.X_add_number = 0;
11928                     }
11929                   INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number);
11930                   imm_expr.X_op = O_absent;
11931                   s = expr_end;
11932                   continue;
11933
11934                 case 'X':
11935                   /* bbit[01] bit index when bbit is used but we generate
11936                      bbit[01]32 because the index is over 32.  Move to the
11937                      next candidate if index is not in the valid range.  */
11938                   gas_assert (!mips_opts.micromips);
11939                   my_getExpression (&imm_expr, s);
11940                   check_absolute_expr (ip, &imm_expr);
11941                   if ((unsigned) imm_expr.X_add_number < 32
11942                       || (unsigned) imm_expr.X_add_number > 63)
11943                     break;
11944                   INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number - 32);
11945                   imm_expr.X_op = O_absent;
11946                   s = expr_end;
11947                   continue;
11948
11949                 case 'p':
11950                   /* cins, cins32, exts and exts32 position field.  Give error
11951                      if it's not in the valid range.  */
11952                   gas_assert (!mips_opts.micromips);
11953                   my_getExpression (&imm_expr, s);
11954                   check_absolute_expr (ip, &imm_expr);
11955                   if ((unsigned) imm_expr.X_add_number > 31)
11956                     {
11957                       as_bad (_("Improper position (%lu)"),
11958                               (unsigned long) imm_expr.X_add_number);
11959                       imm_expr.X_add_number = 0;
11960                     }
11961                   /* Make the pos explicit to simplify +S.  */
11962                   lastpos = imm_expr.X_add_number + 32;
11963                   INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number);
11964                   imm_expr.X_op = O_absent;
11965                   s = expr_end;
11966                   continue;
11967
11968                 case 'P':
11969                   /* cins, cins32, exts and exts32 position field.  Move to
11970                      the next candidate if it's not in the valid range.  */
11971                   gas_assert (!mips_opts.micromips);
11972                   my_getExpression (&imm_expr, s);
11973                   check_absolute_expr (ip, &imm_expr);
11974                   if ((unsigned) imm_expr.X_add_number < 32
11975                       || (unsigned) imm_expr.X_add_number > 63)
11976                     break;
11977                   lastpos = imm_expr.X_add_number;
11978                   INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number - 32);
11979                   imm_expr.X_op = O_absent;
11980                   s = expr_end;
11981                   continue;
11982
11983                 case 's':
11984                   /* cins and exts length-minus-one field.  */
11985                   gas_assert (!mips_opts.micromips);
11986                   my_getExpression (&imm_expr, s);
11987                   check_absolute_expr (ip, &imm_expr);
11988                   if ((unsigned long) imm_expr.X_add_number > 31)
11989                     {
11990                       as_bad (_("Improper size (%lu)"),
11991                               (unsigned long) imm_expr.X_add_number);
11992                       imm_expr.X_add_number = 0;
11993                     }
11994                   INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
11995                   imm_expr.X_op = O_absent;
11996                   s = expr_end;
11997                   continue;
11998
11999                 case 'S':
12000                   /* cins32/exts32 and cins/exts aliasing cint32/exts32
12001                      length-minus-one field.  */
12002                   gas_assert (!mips_opts.micromips);
12003                   my_getExpression (&imm_expr, s);
12004                   check_absolute_expr (ip, &imm_expr);
12005                   if ((long) imm_expr.X_add_number < 0
12006                       || (unsigned long) imm_expr.X_add_number + lastpos > 63)
12007                     {
12008                       as_bad (_("Improper size (%lu)"),
12009                               (unsigned long) imm_expr.X_add_number);
12010                       imm_expr.X_add_number = 0;
12011                     }
12012                   INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
12013                   imm_expr.X_op = O_absent;
12014                   s = expr_end;
12015                   continue;
12016
12017                 case 'Q':
12018                   /* seqi/snei immediate field.  */
12019                   gas_assert (!mips_opts.micromips);
12020                   my_getExpression (&imm_expr, s);
12021                   check_absolute_expr (ip, &imm_expr);
12022                   if ((long) imm_expr.X_add_number < -512
12023                       || (long) imm_expr.X_add_number >= 512)
12024                     {
12025                       as_bad (_("Improper immediate (%ld)"),
12026                                (long) imm_expr.X_add_number);
12027                       imm_expr.X_add_number = 0;
12028                     }
12029                   INSERT_OPERAND (0, SEQI, *ip, imm_expr.X_add_number);
12030                   imm_expr.X_op = O_absent;
12031                   s = expr_end;
12032                   continue;
12033
12034                 case 'a': /* 8-bit signed offset in bit 6 */
12035                   gas_assert (!mips_opts.micromips);
12036                   my_getExpression (&imm_expr, s);
12037                   check_absolute_expr (ip, &imm_expr);
12038                   min_range = -((OP_MASK_OFFSET_A + 1) >> 1);
12039                   max_range = ((OP_MASK_OFFSET_A + 1) >> 1) - 1;
12040                   if (imm_expr.X_add_number < min_range
12041                       || imm_expr.X_add_number > max_range)
12042                     {
12043                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
12044                               (long) min_range, (long) max_range,
12045                               (long) imm_expr.X_add_number);
12046                     }
12047                   INSERT_OPERAND (0, OFFSET_A, *ip, imm_expr.X_add_number);
12048                   imm_expr.X_op = O_absent;
12049                   s = expr_end;
12050                   continue;
12051
12052                 case 'b': /* 8-bit signed offset in bit 3 */
12053                   gas_assert (!mips_opts.micromips);
12054                   my_getExpression (&imm_expr, s);
12055                   check_absolute_expr (ip, &imm_expr);
12056                   min_range = -((OP_MASK_OFFSET_B + 1) >> 1);
12057                   max_range = ((OP_MASK_OFFSET_B + 1) >> 1) - 1;
12058                   if (imm_expr.X_add_number < min_range
12059                       || imm_expr.X_add_number > max_range)
12060                     {
12061                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
12062                               (long) min_range, (long) max_range,
12063                               (long) imm_expr.X_add_number);
12064                     }
12065                   INSERT_OPERAND (0, OFFSET_B, *ip, imm_expr.X_add_number);
12066                   imm_expr.X_op = O_absent;
12067                   s = expr_end;
12068                   continue;
12069
12070                 case 'c': /* 9-bit signed offset in bit 6 */
12071                   gas_assert (!mips_opts.micromips);
12072                   my_getExpression (&imm_expr, s);
12073                   check_absolute_expr (ip, &imm_expr);
12074                   min_range = -((OP_MASK_OFFSET_C + 1) >> 1);
12075                   max_range = ((OP_MASK_OFFSET_C + 1) >> 1) - 1;
12076                   /* We check the offset range before adjusted.  */
12077                   min_range <<= 4;
12078                   max_range <<= 4;
12079                   if (imm_expr.X_add_number < min_range
12080                       || imm_expr.X_add_number > max_range)
12081                     {
12082                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
12083                               (long) min_range, (long) max_range,
12084                               (long) imm_expr.X_add_number);
12085                     }
12086                   if (imm_expr.X_add_number & 0xf)
12087                     {
12088                       as_bad (_("Offset not 16 bytes alignment (%ld)"),
12089                               (long) imm_expr.X_add_number);
12090                     }
12091                   /* Right shift 4 bits to adjust the offset operand.  */
12092                   INSERT_OPERAND (0, OFFSET_C, *ip,
12093                                   imm_expr.X_add_number >> 4);
12094                   imm_expr.X_op = O_absent;
12095                   s = expr_end;
12096                   continue;
12097
12098                 case 'z':
12099                   gas_assert (!mips_opts.micromips);
12100                   if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
12101                     break;
12102                   if (regno == AT && mips_opts.at)
12103                     {
12104                       if (mips_opts.at == ATREG)
12105                         as_warn (_("used $at without \".set noat\""));
12106                       else
12107                         as_warn (_("used $%u with \".set at=$%u\""),
12108                                  regno, mips_opts.at);
12109                     }
12110                   INSERT_OPERAND (0, RZ, *ip, regno);
12111                   continue;
12112
12113                 case 'Z':
12114                   gas_assert (!mips_opts.micromips);
12115                   if (!reg_lookup (&s, RTYPE_FPU, &regno))
12116                     break;
12117                   INSERT_OPERAND (0, FZ, *ip, regno);
12118                   continue;
12119
12120                 case 'j':
12121                   {
12122                     int shift = 8;
12123                     size_t i;
12124                     /* Check whether there is only a single bracketed expression
12125                        left.  If so, it must be the base register and the
12126                        constant must be zero.  */
12127                     if (*s == '(' && strchr (s + 1, '(') == 0)
12128                       continue;
12129
12130                     /* If this value won't fit into the offset, then go find
12131                        a macro that will generate a 16- or 32-bit offset code
12132                        pattern.  */
12133                     i = my_getSmallExpression (&imm_expr, imm_reloc, s);
12134                     if ((i == 0 && (imm_expr.X_op != O_constant
12135                                     || imm_expr.X_add_number >= 1 << shift
12136                                     || imm_expr.X_add_number < -1 << shift))
12137                         || i > 0)
12138                       {
12139                         imm_expr.X_op = O_absent;
12140                         break;
12141                       }
12142                     INSERT_OPERAND (mips_opts.micromips, EVAOFFSET, *ip,
12143                                     imm_expr.X_add_number);
12144                     imm_expr.X_op = O_absent;
12145                     s = expr_end;
12146                   }
12147                   continue;
12148
12149                 default:
12150                   as_bad (_("Internal error: bad %s opcode "
12151                             "(unknown extension operand type `+%c'): %s %s"),
12152                           mips_opts.micromips ? "microMIPS" : "MIPS",
12153                           *args, insn->name, insn->args);
12154                   /* Further processing is fruitless.  */
12155                   return;
12156                 }
12157               break;
12158
12159             case '.':           /* 10-bit offset.  */
12160               gas_assert (mips_opts.micromips);
12161             case '~':           /* 12-bit offset.  */
12162               {
12163                 int shift = *args == '.' ? 9 : 11;
12164                 size_t i;
12165
12166                 /* Check whether there is only a single bracketed expression
12167                    left.  If so, it must be the base register and the
12168                    constant must be zero.  */
12169                 if (*s == '(' && strchr (s + 1, '(') == 0)
12170                   continue;
12171
12172                 /* If this value won't fit into the offset, then go find
12173                    a macro that will generate a 16- or 32-bit offset code
12174                    pattern.  */
12175                 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
12176                 if ((i == 0 && (imm_expr.X_op != O_constant
12177                                 || imm_expr.X_add_number >= 1 << shift
12178                                 || imm_expr.X_add_number < -1 << shift))
12179                     || i > 0)
12180                   {
12181                     imm_expr.X_op = O_absent;
12182                     break;
12183                   }
12184                 if (shift == 9)
12185                   INSERT_OPERAND (1, OFFSET10, *ip, imm_expr.X_add_number);
12186                 else
12187                   INSERT_OPERAND (mips_opts.micromips,
12188                                   OFFSET12, *ip, imm_expr.X_add_number);
12189                 imm_expr.X_op = O_absent;
12190                 s = expr_end;
12191               }
12192               continue;
12193
12194             case '<':           /* must be at least one digit */
12195               /*
12196                * According to the manual, if the shift amount is greater
12197                * than 31 or less than 0, then the shift amount should be
12198                * mod 32.  In reality the mips assembler issues an error.
12199                * We issue a warning and mask out all but the low 5 bits.
12200                */
12201               my_getExpression (&imm_expr, s);
12202               check_absolute_expr (ip, &imm_expr);
12203               if ((unsigned long) imm_expr.X_add_number > 31)
12204                 as_warn (_("Improper shift amount (%lu)"),
12205                          (unsigned long) imm_expr.X_add_number);
12206               INSERT_OPERAND (mips_opts.micromips,
12207                               SHAMT, *ip, imm_expr.X_add_number);
12208               imm_expr.X_op = O_absent;
12209               s = expr_end;
12210               continue;
12211
12212             case '>':           /* shift amount minus 32 */
12213               my_getExpression (&imm_expr, s);
12214               check_absolute_expr (ip, &imm_expr);
12215               if ((unsigned long) imm_expr.X_add_number < 32
12216                   || (unsigned long) imm_expr.X_add_number > 63)
12217                 break;
12218               INSERT_OPERAND (mips_opts.micromips,
12219                               SHAMT, *ip, imm_expr.X_add_number - 32);
12220               imm_expr.X_op = O_absent;
12221               s = expr_end;
12222               continue;
12223
12224             case 'k':           /* CACHE code.  */
12225             case 'h':           /* PREFX code.  */
12226             case '1':           /* SYNC type.  */
12227               my_getExpression (&imm_expr, s);
12228               check_absolute_expr (ip, &imm_expr);
12229               if ((unsigned long) imm_expr.X_add_number > 31)
12230                 as_warn (_("Invalid value for `%s' (%lu)"),
12231                          ip->insn_mo->name,
12232                          (unsigned long) imm_expr.X_add_number);
12233               switch (*args)
12234                 {
12235                 case 'k':
12236                   if (mips_fix_cn63xxp1
12237                       && !mips_opts.micromips
12238                       && strcmp ("pref", insn->name) == 0)
12239                     switch (imm_expr.X_add_number)
12240                       {
12241                       case 5:
12242                       case 25:
12243                       case 26:
12244                       case 27:
12245                       case 28:
12246                       case 29:
12247                       case 30:
12248                       case 31:  /* These are ok.  */
12249                         break;
12250
12251                       default:  /* The rest must be changed to 28.  */
12252                         imm_expr.X_add_number = 28;
12253                         break;
12254                       }
12255                   INSERT_OPERAND (mips_opts.micromips,
12256                                   CACHE, *ip, imm_expr.X_add_number);
12257                   break;
12258                 case 'h':
12259                   INSERT_OPERAND (mips_opts.micromips,
12260                                   PREFX, *ip, imm_expr.X_add_number);
12261                   break;
12262                 case '1':
12263                   INSERT_OPERAND (mips_opts.micromips,
12264                                   STYPE, *ip, imm_expr.X_add_number);
12265                   break;
12266                 }
12267               imm_expr.X_op = O_absent;
12268               s = expr_end;
12269               continue;
12270
12271             case 'c':           /* BREAK code.  */
12272               {
12273                 unsigned long mask = (mips_opts.micromips
12274                                       ? MICROMIPSOP_MASK_CODE
12275                                       : OP_MASK_CODE);
12276
12277                 my_getExpression (&imm_expr, s);
12278                 check_absolute_expr (ip, &imm_expr);
12279                 if ((unsigned long) imm_expr.X_add_number > mask)
12280                   as_warn (_("Code for %s not in range 0..%lu (%lu)"),
12281                            ip->insn_mo->name,
12282                            mask, (unsigned long) imm_expr.X_add_number);
12283                 INSERT_OPERAND (mips_opts.micromips,
12284                                 CODE, *ip, imm_expr.X_add_number);
12285                 imm_expr.X_op = O_absent;
12286                 s = expr_end;
12287               }
12288               continue;
12289
12290             case 'q':           /* Lower BREAK code.  */
12291               {
12292                 unsigned long mask = (mips_opts.micromips
12293                                       ? MICROMIPSOP_MASK_CODE2
12294                                       : OP_MASK_CODE2);
12295
12296                 my_getExpression (&imm_expr, s);
12297                 check_absolute_expr (ip, &imm_expr);
12298                 if ((unsigned long) imm_expr.X_add_number > mask)
12299                   as_warn (_("Lower code for %s not in range 0..%lu (%lu)"),
12300                            ip->insn_mo->name,
12301                            mask, (unsigned long) imm_expr.X_add_number);
12302                 INSERT_OPERAND (mips_opts.micromips,
12303                                 CODE2, *ip, imm_expr.X_add_number);
12304                 imm_expr.X_op = O_absent;
12305                 s = expr_end;
12306               }
12307               continue;
12308
12309             case 'B':           /* 20- or 10-bit syscall/break/wait code.  */
12310               {
12311                 unsigned long mask = (mips_opts.micromips
12312                                       ? MICROMIPSOP_MASK_CODE10
12313                                       : OP_MASK_CODE20);
12314
12315                 my_getExpression (&imm_expr, s);
12316                 check_absolute_expr (ip, &imm_expr);
12317                 if ((unsigned long) imm_expr.X_add_number > mask)
12318                   as_warn (_("Code for %s not in range 0..%lu (%lu)"),
12319                            ip->insn_mo->name,
12320                            mask, (unsigned long) imm_expr.X_add_number);
12321                 if (mips_opts.micromips)
12322                   INSERT_OPERAND (1, CODE10, *ip, imm_expr.X_add_number);
12323                 else
12324                   INSERT_OPERAND (0, CODE20, *ip, imm_expr.X_add_number);
12325                 imm_expr.X_op = O_absent;
12326                 s = expr_end;
12327               }
12328               continue;
12329
12330             case 'C':           /* 25- or 23-bit coprocessor code.  */
12331               {
12332                 unsigned long mask = (mips_opts.micromips
12333                                       ? MICROMIPSOP_MASK_COPZ
12334                                       : OP_MASK_COPZ);
12335
12336                 my_getExpression (&imm_expr, s);
12337                 check_absolute_expr (ip, &imm_expr);
12338                 if ((unsigned long) imm_expr.X_add_number > mask)
12339                   as_warn (_("Coproccesor code > %u bits (%lu)"),
12340                            mips_opts.micromips ? 23U : 25U,
12341                            (unsigned long) imm_expr.X_add_number);
12342                 INSERT_OPERAND (mips_opts.micromips,
12343                                 COPZ, *ip, imm_expr.X_add_number);
12344                 imm_expr.X_op = O_absent;
12345                 s = expr_end;
12346               }
12347               continue;
12348
12349             case 'J':           /* 19-bit WAIT code.  */
12350               gas_assert (!mips_opts.micromips);
12351               my_getExpression (&imm_expr, s);
12352               check_absolute_expr (ip, &imm_expr);
12353               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
12354                 {
12355                   as_warn (_("Illegal 19-bit code (%lu)"),
12356                            (unsigned long) imm_expr.X_add_number);
12357                   imm_expr.X_add_number &= OP_MASK_CODE19;
12358                 }
12359               INSERT_OPERAND (0, CODE19, *ip, imm_expr.X_add_number);
12360               imm_expr.X_op = O_absent;
12361               s = expr_end;
12362               continue;
12363
12364             case 'P':           /* Performance register.  */
12365               gas_assert (!mips_opts.micromips);
12366               my_getExpression (&imm_expr, s);
12367               check_absolute_expr (ip, &imm_expr);
12368               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
12369                 as_warn (_("Invalid performance register (%lu)"),
12370                          (unsigned long) imm_expr.X_add_number);
12371               if (imm_expr.X_add_number != 0 && mips_opts.arch == CPU_R5900
12372                 && (!strcmp(insn->name,"mfps") || !strcmp(insn->name,"mtps")))
12373                 as_warn (_("Invalid performance register (%lu)"),
12374                   (unsigned long) imm_expr.X_add_number);
12375               INSERT_OPERAND (0, PERFREG, *ip, imm_expr.X_add_number);
12376               imm_expr.X_op = O_absent;
12377               s = expr_end;
12378               continue;
12379
12380             case 'G':           /* Coprocessor destination register.  */
12381               {
12382                 unsigned long opcode = ip->insn_opcode;
12383                 unsigned long mask;
12384                 unsigned int types;
12385                 int cop0;
12386
12387                 if (mips_opts.micromips)
12388                   {
12389                     mask = ~((MICROMIPSOP_MASK_RT << MICROMIPSOP_SH_RT)
12390                              | (MICROMIPSOP_MASK_RS << MICROMIPSOP_SH_RS)
12391                              | (MICROMIPSOP_MASK_SEL << MICROMIPSOP_SH_SEL));
12392                     opcode &= mask;
12393                     switch (opcode)
12394                       {
12395                       case 0x000000fc:                          /* mfc0  */
12396                       case 0x000002fc:                          /* mtc0  */
12397                       case 0x580000fc:                          /* dmfc0 */
12398                       case 0x580002fc:                          /* dmtc0 */
12399                         cop0 = 1;
12400                         break;
12401                       default:
12402                         cop0 = 0;
12403                         break;
12404                       }
12405                   }
12406                 else
12407                   {
12408                     opcode = (opcode >> OP_SH_OP) & OP_MASK_OP;
12409                     cop0 = opcode == OP_OP_COP0;
12410                   }
12411                 types = RTYPE_NUM | (cop0 ? RTYPE_CP0 : RTYPE_GP);
12412                 ok = reg_lookup (&s, types, &regno);
12413                 if (mips_opts.micromips)
12414                   INSERT_OPERAND (1, RS, *ip, regno);
12415                 else
12416                   INSERT_OPERAND (0, RD, *ip, regno);
12417                 if (ok)
12418                   {
12419                     lastregno = regno;
12420                     continue;
12421                   }
12422               }
12423               break;
12424
12425             case 'y':           /* ALNV.PS source register.  */
12426               gas_assert (mips_opts.micromips);
12427               goto do_reg;
12428             case 'x':           /* Ignore register name.  */
12429             case 'U':           /* Destination register (CLO/CLZ).  */
12430             case 'g':           /* Coprocessor destination register.  */
12431               gas_assert (!mips_opts.micromips);
12432             case 'b':           /* Base register.  */
12433             case 'd':           /* Destination register.  */
12434             case 's':           /* Source register.  */
12435             case 't':           /* Target register.  */
12436             case 'r':           /* Both target and source.  */
12437             case 'v':           /* Both dest and source.  */
12438             case 'w':           /* Both dest and target.  */
12439             case 'E':           /* Coprocessor target register.  */
12440             case 'K':           /* RDHWR destination register.  */
12441             case 'z':           /* Must be zero register.  */
12442             do_reg:
12443               s_reset = s;
12444               if (*args == 'E' || *args == 'K')
12445                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
12446               else
12447                 {
12448                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
12449                   if (regno == AT && mips_opts.at)
12450                     {
12451                       if (mips_opts.at == ATREG)
12452                         as_warn (_("Used $at without \".set noat\""));
12453                       else
12454                         as_warn (_("Used $%u with \".set at=$%u\""),
12455                                  regno, mips_opts.at);
12456                     }
12457                 }
12458               if (ok)
12459                 {
12460                   c = *args;
12461                   if (*s == ' ')
12462                     ++s;
12463                   if (args[1] != *s)
12464                     {
12465                       if (c == 'r' || c == 'v' || c == 'w')
12466                         {
12467                           regno = lastregno;
12468                           s = s_reset;
12469                           ++args;
12470                         }
12471                     }
12472                   /* 'z' only matches $0.  */
12473                   if (c == 'z' && regno != 0)
12474                     break;
12475
12476                   if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
12477                     {
12478                       if (regno == lastregno)
12479                         {
12480                           insn_error
12481                             = _("Source and destination must be different");
12482                           continue;
12483                         }
12484                       if (regno == 31 && lastregno == 0xffffffff)
12485                         {
12486                           insn_error
12487                             = _("A destination register must be supplied");
12488                           continue;
12489                         }
12490                     }
12491                   /* Now that we have assembled one operand, we use the args
12492                      string to figure out where it goes in the instruction.  */
12493                   switch (c)
12494                     {
12495                     case 'r':
12496                     case 's':
12497                     case 'v':
12498                     case 'b':
12499                       INSERT_OPERAND (mips_opts.micromips, RS, *ip, regno);
12500                       break;
12501
12502                     case 'K':
12503                       if (mips_opts.micromips)
12504                         INSERT_OPERAND (1, RS, *ip, regno);
12505                       else
12506                         INSERT_OPERAND (0, RD, *ip, regno);
12507                       break;
12508
12509                     case 'd':
12510                     case 'g':
12511                       INSERT_OPERAND (mips_opts.micromips, RD, *ip, regno);
12512                       break;
12513
12514                     case 'U':
12515                       gas_assert (!mips_opts.micromips);
12516                       INSERT_OPERAND (0, RD, *ip, regno);
12517                       INSERT_OPERAND (0, RT, *ip, regno);
12518                       break;
12519
12520                     case 'w':
12521                     case 't':
12522                     case 'E':
12523                       INSERT_OPERAND (mips_opts.micromips, RT, *ip, regno);
12524                       break;
12525
12526                     case 'y':
12527                       gas_assert (mips_opts.micromips);
12528                       INSERT_OPERAND (1, RS3, *ip, regno);
12529                       break;
12530
12531                     case 'x':
12532                       /* This case exists because on the r3000 trunc
12533                          expands into a macro which requires a gp
12534                          register.  On the r6000 or r4000 it is
12535                          assembled into a single instruction which
12536                          ignores the register.  Thus the insn version
12537                          is MIPS_ISA2 and uses 'x', and the macro
12538                          version is MIPS_ISA1 and uses 't'.  */
12539                       break;
12540
12541                     case 'z':
12542                       /* This case is for the div instruction, which
12543                          acts differently if the destination argument
12544                          is $0.  This only matches $0, and is checked
12545                          outside the switch.  */
12546                       break;
12547                     }
12548                   lastregno = regno;
12549                   continue;
12550                 }
12551               switch (*args++)
12552                 {
12553                 case 'r':
12554                 case 'v':
12555                   INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
12556                   continue;
12557
12558                 case 'w':
12559                   INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
12560                   continue;
12561                 }
12562               break;
12563
12564             case 'O':           /* MDMX alignment immediate constant.  */
12565               gas_assert (!mips_opts.micromips);
12566               my_getExpression (&imm_expr, s);
12567               check_absolute_expr (ip, &imm_expr);
12568               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
12569                 as_warn (_("Improper align amount (%ld), using low bits"),
12570                          (long) imm_expr.X_add_number);
12571               INSERT_OPERAND (0, ALN, *ip, imm_expr.X_add_number);
12572               imm_expr.X_op = O_absent;
12573               s = expr_end;
12574               continue;
12575
12576             case 'Q':           /* MDMX vector, element sel, or const.  */
12577               if (s[0] != '$')
12578                 {
12579                   /* MDMX Immediate.  */
12580                   gas_assert (!mips_opts.micromips);
12581                   my_getExpression (&imm_expr, s);
12582                   check_absolute_expr (ip, &imm_expr);
12583                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
12584                     as_warn (_("Invalid MDMX Immediate (%ld)"),
12585                              (long) imm_expr.X_add_number);
12586                   INSERT_OPERAND (0, FT, *ip, imm_expr.X_add_number);
12587                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
12588                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
12589                   else
12590                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
12591                   imm_expr.X_op = O_absent;
12592                   s = expr_end;
12593                   continue;
12594                 }
12595               /* Not MDMX Immediate.  Fall through.  */
12596             case 'X':           /* MDMX destination register.  */
12597             case 'Y':           /* MDMX source register.  */
12598             case 'Z':           /* MDMX target register.  */
12599               is_mdmx = 1;
12600             case 'W':
12601               gas_assert (!mips_opts.micromips);
12602             case 'D':           /* Floating point destination register.  */
12603             case 'S':           /* Floating point source register.  */
12604             case 'T':           /* Floating point target register.  */
12605             case 'R':           /* Floating point source register.  */
12606             case 'V':
12607               rtype = RTYPE_FPU;
12608               if (is_mdmx
12609                   || ((mips_opts.ase & ASE_MDMX)
12610                       && (ip->insn_mo->pinfo & FP_D)
12611                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
12612                                                 | INSN_COPROC_MEMORY_DELAY
12613                                                 | INSN_LOAD_COPROC_DELAY
12614                                                 | INSN_LOAD_MEMORY_DELAY
12615                                                 | INSN_STORE_MEMORY))))
12616                 rtype |= RTYPE_VEC;
12617               s_reset = s;
12618               if (reg_lookup (&s, rtype, &regno))
12619                 {
12620                   if ((regno & 1) != 0
12621                       && HAVE_32BIT_FPRS
12622                       && !mips_oddfpreg_ok (ip->insn_mo, argnum))
12623                     as_warn (_("Float register should be even, was %d"),
12624                              regno);
12625
12626                   c = *args;
12627                   if (*s == ' ')
12628                     ++s;
12629                   if (args[1] != *s)
12630                     {
12631                       if (c == 'V' || c == 'W')
12632                         {
12633                           regno = lastregno;
12634                           s = s_reset;
12635                           ++args;
12636                         }
12637                     }
12638                   switch (c)
12639                     {
12640                     case 'D':
12641                     case 'X':
12642                       INSERT_OPERAND (mips_opts.micromips, FD, *ip, regno);
12643                       break;
12644
12645                     case 'V':
12646                     case 'S':
12647                     case 'Y':
12648                       INSERT_OPERAND (mips_opts.micromips, FS, *ip, regno);
12649                       break;
12650
12651                     case 'Q':
12652                       /* This is like 'Z', but also needs to fix the MDMX
12653                          vector/scalar select bits.  Note that the
12654                          scalar immediate case is handled above.  */
12655                       if (*s == '[')
12656                         {
12657                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
12658                           int max_el = (is_qh ? 3 : 7);
12659                           s++;
12660                           my_getExpression(&imm_expr, s);
12661                           check_absolute_expr (ip, &imm_expr);
12662                           s = expr_end;
12663                           if (imm_expr.X_add_number > max_el)
12664                             as_bad (_("Bad element selector %ld"),
12665                                     (long) imm_expr.X_add_number);
12666                           imm_expr.X_add_number &= max_el;
12667                           ip->insn_opcode |= (imm_expr.X_add_number
12668                                               << (OP_SH_VSEL +
12669                                                   (is_qh ? 2 : 1)));
12670                           imm_expr.X_op = O_absent;
12671                           if (*s != ']')
12672                             as_warn (_("Expecting ']' found '%s'"), s);
12673                           else
12674                             s++;
12675                         }
12676                       else
12677                         {
12678                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
12679                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
12680                                                 << OP_SH_VSEL);
12681                           else
12682                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
12683                                                 OP_SH_VSEL);
12684                         }
12685                       /* Fall through.  */
12686                     case 'W':
12687                     case 'T':
12688                     case 'Z':
12689                       INSERT_OPERAND (mips_opts.micromips, FT, *ip, regno);
12690                       break;
12691
12692                     case 'R':
12693                       INSERT_OPERAND (mips_opts.micromips, FR, *ip, regno);
12694                       break;
12695                     }
12696                   lastregno = regno;
12697                   continue;
12698                 }
12699
12700               switch (*args++)
12701                 {
12702                 case 'V':
12703                   INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
12704                   continue;
12705
12706                 case 'W':
12707                   INSERT_OPERAND (mips_opts.micromips, FT, *ip, lastregno);
12708                   continue;
12709                 }
12710               break;
12711
12712             case 'I':
12713               my_getExpression (&imm_expr, s);
12714               if (imm_expr.X_op != O_big
12715                   && imm_expr.X_op != O_constant)
12716                 insn_error = _("absolute expression required");
12717               if (HAVE_32BIT_GPRS)
12718                 normalize_constant_expr (&imm_expr);
12719               s = expr_end;
12720               continue;
12721
12722             case 'A':
12723               my_getExpression (&offset_expr, s);
12724               normalize_address_expr (&offset_expr);
12725               *imm_reloc = BFD_RELOC_32;
12726               s = expr_end;
12727               continue;
12728
12729             case 'F':
12730             case 'L':
12731             case 'f':
12732             case 'l':
12733               {
12734                 int f64;
12735                 int using_gprs;
12736                 char *save_in;
12737                 char *err;
12738                 unsigned char temp[8];
12739                 int len;
12740                 unsigned int length;
12741                 segT seg;
12742                 subsegT subseg;
12743                 char *p;
12744
12745                 /* These only appear as the last operand in an
12746                    instruction, and every instruction that accepts
12747                    them in any variant accepts them in all variants.
12748                    This means we don't have to worry about backing out
12749                    any changes if the instruction does not match.
12750
12751                    The difference between them is the size of the
12752                    floating point constant and where it goes.  For 'F'
12753                    and 'L' the constant is 64 bits; for 'f' and 'l' it
12754                    is 32 bits.  Where the constant is placed is based
12755                    on how the MIPS assembler does things:
12756                     F -- .rdata
12757                     L -- .lit8
12758                     f -- immediate value
12759                     l -- .lit4
12760
12761                     The .lit4 and .lit8 sections are only used if
12762                     permitted by the -G argument.
12763
12764                     The code below needs to know whether the target register
12765                     is 32 or 64 bits wide.  It relies on the fact 'f' and
12766                     'F' are used with GPR-based instructions and 'l' and
12767                     'L' are used with FPR-based instructions.  */
12768
12769                 f64 = *args == 'F' || *args == 'L';
12770                 using_gprs = *args == 'F' || *args == 'f';
12771
12772                 save_in = input_line_pointer;
12773                 input_line_pointer = s;
12774                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
12775                 length = len;
12776                 s = input_line_pointer;
12777                 input_line_pointer = save_in;
12778                 if (err != NULL && *err != '\0')
12779                   {
12780                     as_bad (_("Bad floating point constant: %s"), err);
12781                     memset (temp, '\0', sizeof temp);
12782                     length = f64 ? 8 : 4;
12783                   }
12784
12785                 gas_assert (length == (unsigned) (f64 ? 8 : 4));
12786
12787                 if (*args == 'f'
12788                     || (*args == 'l'
12789                         && (g_switch_value < 4
12790                             || (temp[0] == 0 && temp[1] == 0)
12791                             || (temp[2] == 0 && temp[3] == 0))))
12792                   {
12793                     imm_expr.X_op = O_constant;
12794                     if (!target_big_endian)
12795                       imm_expr.X_add_number = bfd_getl32 (temp);
12796                     else
12797                       imm_expr.X_add_number = bfd_getb32 (temp);
12798                   }
12799                 else if (length > 4
12800                          && !mips_disable_float_construction
12801                          /* Constants can only be constructed in GPRs and
12802                             copied to FPRs if the GPRs are at least as wide
12803                             as the FPRs.  Force the constant into memory if
12804                             we are using 64-bit FPRs but the GPRs are only
12805                             32 bits wide.  */
12806                          && (using_gprs
12807                              || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
12808                          && ((temp[0] == 0 && temp[1] == 0)
12809                              || (temp[2] == 0 && temp[3] == 0))
12810                          && ((temp[4] == 0 && temp[5] == 0)
12811                              || (temp[6] == 0 && temp[7] == 0)))
12812                   {
12813                     /* The value is simple enough to load with a couple of
12814                        instructions.  If using 32-bit registers, set
12815                        imm_expr to the high order 32 bits and offset_expr to
12816                        the low order 32 bits.  Otherwise, set imm_expr to
12817                        the entire 64 bit constant.  */
12818                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
12819                       {
12820                         imm_expr.X_op = O_constant;
12821                         offset_expr.X_op = O_constant;
12822                         if (!target_big_endian)
12823                           {
12824                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
12825                             offset_expr.X_add_number = bfd_getl32 (temp);
12826                           }
12827                         else
12828                           {
12829                             imm_expr.X_add_number = bfd_getb32 (temp);
12830                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
12831                           }
12832                         if (offset_expr.X_add_number == 0)
12833                           offset_expr.X_op = O_absent;
12834                       }
12835                     else
12836                       {
12837                         imm_expr.X_op = O_constant;
12838                         if (!target_big_endian)
12839                           imm_expr.X_add_number = bfd_getl64 (temp);
12840                         else
12841                           imm_expr.X_add_number = bfd_getb64 (temp);
12842                       }
12843                   }
12844                 else
12845                   {
12846                     const char *newname;
12847                     segT new_seg;
12848
12849                     /* Switch to the right section.  */
12850                     seg = now_seg;
12851                     subseg = now_subseg;
12852                     switch (*args)
12853                       {
12854                       default: /* unused default case avoids warnings.  */
12855                       case 'L':
12856                         newname = RDATA_SECTION_NAME;
12857                         if (g_switch_value >= 8)
12858                           newname = ".lit8";
12859                         break;
12860                       case 'F':
12861                         newname = RDATA_SECTION_NAME;
12862                         break;
12863                       case 'l':
12864                         gas_assert (g_switch_value >= 4);
12865                         newname = ".lit4";
12866                         break;
12867                       }
12868                     new_seg = subseg_new (newname, (subsegT) 0);
12869                     bfd_set_section_flags (stdoutput, new_seg,
12870                                            (SEC_ALLOC
12871                                             | SEC_LOAD
12872                                             | SEC_READONLY
12873                                             | SEC_DATA));
12874                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
12875                     if (strncmp (TARGET_OS, "elf", 3) != 0)
12876                       record_alignment (new_seg, 4);
12877                     else
12878                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
12879                     if (seg == now_seg)
12880                       as_bad (_("Can't use floating point insn in this section"));
12881
12882                     /* Set the argument to the current address in the
12883                        section.  */
12884                     offset_expr.X_op = O_symbol;
12885                     offset_expr.X_add_symbol = symbol_temp_new_now ();
12886                     offset_expr.X_add_number = 0;
12887
12888                     /* Put the floating point number into the section.  */
12889                     p = frag_more ((int) length);
12890                     memcpy (p, temp, length);
12891
12892                     /* Switch back to the original section.  */
12893                     subseg_set (seg, subseg);
12894                   }
12895               }
12896               continue;
12897
12898             case 'i':           /* 16-bit unsigned immediate.  */
12899             case 'j':           /* 16-bit signed immediate.  */
12900               *imm_reloc = BFD_RELOC_LO16;
12901               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
12902                 {
12903                   int more;
12904                   offsetT minval, maxval;
12905
12906                   more = (insn + 1 < past
12907                           && strcmp (insn->name, insn[1].name) == 0);
12908
12909                   /* For compatibility with older assemblers, we accept
12910                      0x8000-0xffff as signed 16-bit numbers when only
12911                      signed numbers are allowed.  */
12912                   if (*args == 'i')
12913                     minval = 0, maxval = 0xffff;
12914                   else if (more)
12915                     minval = -0x8000, maxval = 0x7fff;
12916                   else
12917                     minval = -0x8000, maxval = 0xffff;
12918
12919                   if (imm_expr.X_op != O_constant
12920                       || imm_expr.X_add_number < minval
12921                       || imm_expr.X_add_number > maxval)
12922                     {
12923                       if (more)
12924                         break;
12925                       if (imm_expr.X_op == O_constant
12926                           || imm_expr.X_op == O_big)
12927                         as_bad (_("Expression out of range"));
12928                     }
12929                 }
12930               s = expr_end;
12931               continue;
12932
12933             case 'o':           /* 16-bit offset.  */
12934               offset_reloc[0] = BFD_RELOC_LO16;
12935               offset_reloc[1] = BFD_RELOC_UNUSED;
12936               offset_reloc[2] = BFD_RELOC_UNUSED;
12937
12938               /* Check whether there is only a single bracketed expression
12939                  left.  If so, it must be the base register and the
12940                  constant must be zero.  */
12941               if (*s == '(' && strchr (s + 1, '(') == 0)
12942                 {
12943                   offset_expr.X_op = O_constant;
12944                   offset_expr.X_add_number = 0;
12945                   continue;
12946                 }
12947
12948               /* If this value won't fit into a 16 bit offset, then go
12949                  find a macro that will generate the 32 bit offset
12950                  code pattern.  */
12951               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
12952                   && (offset_expr.X_op != O_constant
12953                       || offset_expr.X_add_number >= 0x8000
12954                       || offset_expr.X_add_number < -0x8000))
12955                 break;
12956
12957               s = expr_end;
12958               continue;
12959
12960             case 'p':           /* PC-relative offset.  */
12961               *offset_reloc = BFD_RELOC_16_PCREL_S2;
12962               my_getExpression (&offset_expr, s);
12963               s = expr_end;
12964               continue;
12965
12966             case 'u':           /* Upper 16 bits.  */
12967               *imm_reloc = BFD_RELOC_LO16;
12968               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
12969                   && imm_expr.X_op == O_constant
12970                   && (imm_expr.X_add_number < 0
12971                       || imm_expr.X_add_number >= 0x10000))
12972                 as_bad (_("lui expression (%lu) not in range 0..65535"),
12973                         (unsigned long) imm_expr.X_add_number);
12974               s = expr_end;
12975               continue;
12976
12977             case 'a':           /* 26-bit address.  */
12978               *offset_reloc = BFD_RELOC_MIPS_JMP;
12979               my_getExpression (&offset_expr, s);
12980               s = expr_end;
12981               continue;
12982
12983             case 'N':           /* 3-bit branch condition code.  */
12984             case 'M':           /* 3-bit compare condition code.  */
12985               rtype = RTYPE_CCC;
12986               if (ip->insn_mo->pinfo & (FP_D | FP_S))
12987                 rtype |= RTYPE_FCC;
12988               if (!reg_lookup (&s, rtype, &regno))
12989                 break;
12990               if ((strcmp (str + strlen (str) - 3, ".ps") == 0
12991                    || strcmp (str + strlen (str) - 5, "any2f") == 0
12992                    || strcmp (str + strlen (str) - 5, "any2t") == 0)
12993                   && (regno & 1) != 0)
12994                 as_warn (_("Condition code register should be even for %s, "
12995                            "was %d"),
12996                          str, regno);
12997               if ((strcmp (str + strlen (str) - 5, "any4f") == 0
12998                    || strcmp (str + strlen (str) - 5, "any4t") == 0)
12999                   && (regno & 3) != 0)
13000                 as_warn (_("Condition code register should be 0 or 4 for %s, "
13001                            "was %d"),
13002                          str, regno);
13003               if (*args == 'N')
13004                 INSERT_OPERAND (mips_opts.micromips, BCC, *ip, regno);
13005               else
13006                 INSERT_OPERAND (mips_opts.micromips, CCC, *ip, regno);
13007               continue;
13008
13009             case 'H':
13010               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
13011                 s += 2;
13012               if (ISDIGIT (*s))
13013                 {
13014                   c = 0;
13015                   do
13016                     {
13017                       c *= 10;
13018                       c += *s - '0';
13019                       ++s;
13020                     }
13021                   while (ISDIGIT (*s));
13022                 }
13023               else
13024                 c = 8; /* Invalid sel value.  */
13025
13026               if (c > 7)
13027                 as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
13028               INSERT_OPERAND (mips_opts.micromips, SEL, *ip, c);
13029               continue;
13030
13031             case 'e':
13032               gas_assert (!mips_opts.micromips);
13033               /* Must be at least one digit.  */
13034               my_getExpression (&imm_expr, s);
13035               check_absolute_expr (ip, &imm_expr);
13036
13037               if ((unsigned long) imm_expr.X_add_number
13038                   > (unsigned long) OP_MASK_VECBYTE)
13039                 {
13040                   as_bad (_("bad byte vector index (%ld)"),
13041                            (long) imm_expr.X_add_number);
13042                   imm_expr.X_add_number = 0;
13043                 }
13044
13045               INSERT_OPERAND (0, VECBYTE, *ip, imm_expr.X_add_number);
13046               imm_expr.X_op = O_absent;
13047               s = expr_end;
13048               continue;
13049
13050             case '%':
13051               gas_assert (!mips_opts.micromips);
13052               my_getExpression (&imm_expr, s);
13053               check_absolute_expr (ip, &imm_expr);
13054
13055               if ((unsigned long) imm_expr.X_add_number
13056                   > (unsigned long) OP_MASK_VECALIGN)
13057                 {
13058                   as_bad (_("bad byte vector index (%ld)"),
13059                            (long) imm_expr.X_add_number);
13060                   imm_expr.X_add_number = 0;
13061                 }
13062
13063               INSERT_OPERAND (0, VECALIGN, *ip, imm_expr.X_add_number);
13064               imm_expr.X_op = O_absent;
13065               s = expr_end;
13066               continue;
13067
13068             case 'm':           /* Opcode extension character.  */
13069               gas_assert (mips_opts.micromips);
13070               c = *++args;
13071               switch (c)
13072                 {
13073                 case 'r':
13074                   if (strncmp (s, "$pc", 3) == 0)
13075                     {
13076                       s += 3;
13077                       continue;
13078                     }
13079                   break;
13080
13081                 case 'a':
13082                 case 'b':
13083                 case 'c':
13084                 case 'd':
13085                 case 'e':
13086                 case 'f':
13087                 case 'g':
13088                 case 'h':
13089                 case 'i':
13090                 case 'j':
13091                 case 'l':
13092                 case 'm':
13093                 case 'n':
13094                 case 'p':
13095                 case 'q':
13096                 case 's':
13097                 case 't':
13098                 case 'x':
13099                 case 'y':
13100                 case 'z':
13101                   s_reset = s;
13102                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
13103                   if (regno == AT && mips_opts.at)
13104                     {
13105                       if (mips_opts.at == ATREG)
13106                         as_warn (_("Used $at without \".set noat\""));
13107                       else
13108                         as_warn (_("Used $%u with \".set at=$%u\""),
13109                                  regno, mips_opts.at);
13110                     }
13111                   if (!ok)
13112                     {
13113                       if (c == 'c')
13114                         {
13115                           gas_assert (args[1] == ',');
13116                           regno = lastregno;
13117                           ++args;
13118                         }
13119                       else if (c == 't')
13120                         {
13121                           gas_assert (args[1] == ',');
13122                           ++args;
13123                           continue;                     /* Nothing to do.  */
13124                         }
13125                       else
13126                         break;
13127                     }
13128
13129                   if (c == 'j' && !strncmp (ip->insn_mo->name, "jalr", 4))
13130                     {
13131                       if (regno == lastregno)
13132                         {
13133                           insn_error
13134                             = _("Source and destination must be different");
13135                           continue;
13136                         }
13137                       if (regno == 31 && lastregno == 0xffffffff)
13138                         {
13139                           insn_error
13140                             = _("A destination register must be supplied");
13141                           continue;
13142                         }
13143                     }
13144
13145                   if (*s == ' ')
13146                     ++s;
13147                   if (args[1] != *s)
13148                     {
13149                       if (c == 'e')
13150                         {
13151                           gas_assert (args[1] == ',');
13152                           regno = lastregno;
13153                           s = s_reset;
13154                           ++args;
13155                         }
13156                       else if (c == 't')
13157                         {
13158                           gas_assert (args[1] == ',');
13159                           s = s_reset;
13160                           ++args;
13161                           continue;                     /* Nothing to do.  */
13162                         }
13163                     }
13164
13165                   /* Make sure regno is the same as lastregno.  */
13166                   if (c == 't' && regno != lastregno)
13167                     break;
13168
13169                   /* Make sure regno is the same as destregno.  */
13170                   if (c == 'x' && regno != destregno)
13171                     break;
13172
13173                   /* We need to save regno, before regno maps to the
13174                      microMIPS register encoding.  */
13175                   lastregno = regno;
13176
13177                   if (c == 'f')
13178                     destregno = regno;
13179
13180                   switch (c)
13181                     {
13182                       case 'a':
13183                         if (regno != GP)
13184                           regno = ILLEGAL_REG;
13185                         break;
13186
13187                       case 'b':
13188                         regno = mips32_to_micromips_reg_b_map[regno];
13189                         break;
13190
13191                       case 'c':
13192                         regno = mips32_to_micromips_reg_c_map[regno];
13193                         break;
13194
13195                       case 'd':
13196                         regno = mips32_to_micromips_reg_d_map[regno];
13197                         break;
13198
13199                       case 'e':
13200                         regno = mips32_to_micromips_reg_e_map[regno];
13201                         break;
13202
13203                       case 'f':
13204                         regno = mips32_to_micromips_reg_f_map[regno];
13205                         break;
13206
13207                       case 'g':
13208                         regno = mips32_to_micromips_reg_g_map[regno];
13209                         break;
13210
13211                       case 'h':
13212                         regno = mips32_to_micromips_reg_h_map[regno];
13213                         break;
13214
13215                       case 'i':
13216                         switch (EXTRACT_OPERAND (1, MI, *ip))
13217                           {
13218                             case 4:
13219                               if (regno == 21)
13220                                 regno = 3;
13221                               else if (regno == 22)
13222                                 regno = 4;
13223                               else if (regno == 5)
13224                                 regno = 5;
13225                               else if (regno == 6)
13226                                 regno = 6;
13227                               else if (regno == 7)
13228                                 regno = 7;
13229                               else
13230                                 regno = ILLEGAL_REG;
13231                               break;
13232
13233                             case 5:
13234                               if (regno == 6)
13235                                 regno = 0;
13236                               else if (regno == 7)
13237                                 regno = 1;
13238                               else
13239                                 regno = ILLEGAL_REG;
13240                               break;
13241
13242                             case 6:
13243                               if (regno == 7)
13244                                 regno = 2;
13245                               else
13246                                 regno = ILLEGAL_REG;
13247                               break;
13248
13249                             default:
13250                               regno = ILLEGAL_REG;
13251                               break;
13252                           }
13253                         break;
13254
13255                       case 'l':
13256                         regno = mips32_to_micromips_reg_l_map[regno];
13257                         break;
13258
13259                       case 'm':
13260                         regno = mips32_to_micromips_reg_m_map[regno];
13261                         break;
13262
13263                       case 'n':
13264                         regno = mips32_to_micromips_reg_n_map[regno];
13265                         break;
13266
13267                       case 'q':
13268                         regno = mips32_to_micromips_reg_q_map[regno];
13269                         break;
13270
13271                       case 's':
13272                         if (regno != SP)
13273                           regno = ILLEGAL_REG;
13274                         break;
13275
13276                       case 'y':
13277                         if (regno != 31)
13278                           regno = ILLEGAL_REG;
13279                         break;
13280
13281                       case 'z':
13282                         if (regno != ZERO)
13283                           regno = ILLEGAL_REG;
13284                         break;
13285
13286                       case 'j': /* Do nothing.  */
13287                       case 'p':
13288                       case 't':
13289                       case 'x':
13290                         break;
13291
13292                       default:
13293                         abort ();
13294                     }
13295
13296                   if (regno == ILLEGAL_REG)
13297                     break;
13298
13299                   switch (c)
13300                     {
13301                       case 'b':
13302                         INSERT_OPERAND (1, MB, *ip, regno);
13303                         break;
13304
13305                       case 'c':
13306                         INSERT_OPERAND (1, MC, *ip, regno);
13307                         break;
13308
13309                       case 'd':
13310                         INSERT_OPERAND (1, MD, *ip, regno);
13311                         break;
13312
13313                       case 'e':
13314                         INSERT_OPERAND (1, ME, *ip, regno);
13315                         break;
13316
13317                       case 'f':
13318                         INSERT_OPERAND (1, MF, *ip, regno);
13319                         break;
13320
13321                       case 'g':
13322                         INSERT_OPERAND (1, MG, *ip, regno);
13323                         break;
13324
13325                       case 'h':
13326                         INSERT_OPERAND (1, MH, *ip, regno);
13327                         break;
13328
13329                       case 'i':
13330                         INSERT_OPERAND (1, MI, *ip, regno);
13331                         break;
13332
13333                       case 'j':
13334                         INSERT_OPERAND (1, MJ, *ip, regno);
13335                         break;
13336
13337                       case 'l':
13338                         INSERT_OPERAND (1, ML, *ip, regno);
13339                         break;
13340
13341                       case 'm':
13342                         INSERT_OPERAND (1, MM, *ip, regno);
13343                         break;
13344
13345                       case 'n':
13346                         INSERT_OPERAND (1, MN, *ip, regno);
13347                         break;
13348
13349                       case 'p':
13350                         INSERT_OPERAND (1, MP, *ip, regno);
13351                         break;
13352
13353                       case 'q':
13354                         INSERT_OPERAND (1, MQ, *ip, regno);
13355                         break;
13356
13357                       case 'a': /* Do nothing.  */
13358                       case 's': /* Do nothing.  */
13359                       case 't': /* Do nothing.  */
13360                       case 'x': /* Do nothing.  */
13361                       case 'y': /* Do nothing.  */
13362                       case 'z': /* Do nothing.  */
13363                         break;
13364
13365                       default:
13366                         abort ();
13367                     }
13368                   continue;
13369
13370                 case 'A':
13371                   {
13372                     bfd_reloc_code_real_type r[3];
13373                     expressionS ep;
13374                     int imm;
13375
13376                     /* Check whether there is only a single bracketed
13377                        expression left.  If so, it must be the base register
13378                        and the constant must be zero.  */
13379                     if (*s == '(' && strchr (s + 1, '(') == 0)
13380                       {
13381                         INSERT_OPERAND (1, IMMA, *ip, 0);
13382                         continue;
13383                       }
13384
13385                     if (my_getSmallExpression (&ep, r, s) > 0
13386                         || !expr_const_in_range (&ep, -64, 64, 2))
13387                       break;
13388
13389                     imm = ep.X_add_number >> 2;
13390                     INSERT_OPERAND (1, IMMA, *ip, imm);
13391                   }
13392                   s = expr_end;
13393                   continue;
13394
13395                 case 'B':
13396                   {
13397                     bfd_reloc_code_real_type r[3];
13398                     expressionS ep;
13399                     int imm;
13400
13401                     if (my_getSmallExpression (&ep, r, s) > 0
13402                         || ep.X_op != O_constant)
13403                       break;
13404
13405                     for (imm = 0; imm < 8; imm++)
13406                       if (micromips_imm_b_map[imm] == ep.X_add_number)
13407                         break;
13408                     if (imm >= 8)
13409                       break;
13410
13411                     INSERT_OPERAND (1, IMMB, *ip, imm);
13412                   }
13413                   s = expr_end;
13414                   continue;
13415
13416                 case 'C':
13417                   {
13418                     bfd_reloc_code_real_type r[3];
13419                     expressionS ep;
13420                     int imm;
13421
13422                     if (my_getSmallExpression (&ep, r, s) > 0
13423                         || ep.X_op != O_constant)
13424                       break;
13425
13426                     for (imm = 0; imm < 16; imm++)
13427                       if (micromips_imm_c_map[imm] == ep.X_add_number)
13428                         break;
13429                     if (imm >= 16)
13430                       break;
13431
13432                     INSERT_OPERAND (1, IMMC, *ip, imm);
13433                   }
13434                   s = expr_end;
13435                   continue;
13436
13437                 case 'D':       /* pc relative offset */
13438                 case 'E':       /* pc relative offset */
13439                   my_getExpression (&offset_expr, s);
13440                   if (offset_expr.X_op == O_register)
13441                     break;
13442
13443                   if (!forced_insn_length)
13444                     *offset_reloc = (int) BFD_RELOC_UNUSED + c;
13445                   else if (c == 'D')
13446                     *offset_reloc = BFD_RELOC_MICROMIPS_10_PCREL_S1;
13447                   else
13448                     *offset_reloc = BFD_RELOC_MICROMIPS_7_PCREL_S1;
13449                   s = expr_end;
13450                   continue;
13451
13452                 case 'F':
13453                   {
13454                     bfd_reloc_code_real_type r[3];
13455                     expressionS ep;
13456                     int imm;
13457
13458                     if (my_getSmallExpression (&ep, r, s) > 0
13459                         || !expr_const_in_range (&ep, 0, 16, 0))
13460                       break;
13461
13462                     imm = ep.X_add_number;
13463                     INSERT_OPERAND (1, IMMF, *ip, imm);
13464                   }
13465                   s = expr_end;
13466                   continue;
13467
13468                 case 'G':
13469                   {
13470                     bfd_reloc_code_real_type r[3];
13471                     expressionS ep;
13472                     int imm;
13473
13474                     /* Check whether there is only a single bracketed
13475                        expression left.  If so, it must be the base register
13476                        and the constant must be zero.  */
13477                     if (*s == '(' && strchr (s + 1, '(') == 0)
13478                       {
13479                         INSERT_OPERAND (1, IMMG, *ip, 0);
13480                         continue;
13481                       }
13482
13483                     if (my_getSmallExpression (&ep, r, s) > 0
13484                         || !expr_const_in_range (&ep, -1, 15, 0))
13485                       break;
13486
13487                     imm = ep.X_add_number & 15;
13488                     INSERT_OPERAND (1, IMMG, *ip, imm);
13489                   }
13490                   s = expr_end;
13491                   continue;
13492
13493                 case 'H':
13494                   {
13495                     bfd_reloc_code_real_type r[3];
13496                     expressionS ep;
13497                     int imm;
13498
13499                     /* Check whether there is only a single bracketed
13500                        expression left.  If so, it must be the base register
13501                        and the constant must be zero.  */
13502                     if (*s == '(' && strchr (s + 1, '(') == 0)
13503                       {
13504                         INSERT_OPERAND (1, IMMH, *ip, 0);
13505                         continue;
13506                       }
13507
13508                     if (my_getSmallExpression (&ep, r, s) > 0
13509                         || !expr_const_in_range (&ep, 0, 16, 1))
13510                       break;
13511
13512                     imm = ep.X_add_number >> 1;
13513                     INSERT_OPERAND (1, IMMH, *ip, imm);
13514                   }
13515                   s = expr_end;
13516                   continue;
13517
13518                 case 'I':
13519                   {
13520                     bfd_reloc_code_real_type r[3];
13521                     expressionS ep;
13522                     int imm;
13523
13524                     if (my_getSmallExpression (&ep, r, s) > 0
13525                         || !expr_const_in_range (&ep, -1, 127, 0))
13526                       break;
13527
13528                     imm = ep.X_add_number & 127;
13529                     INSERT_OPERAND (1, IMMI, *ip, imm);
13530                   }
13531                   s = expr_end;
13532                   continue;
13533
13534                 case 'J':
13535                   {
13536                     bfd_reloc_code_real_type r[3];
13537                     expressionS ep;
13538                     int imm;
13539
13540                     /* Check whether there is only a single bracketed
13541                        expression left.  If so, it must be the base register
13542                        and the constant must be zero.  */
13543                     if (*s == '(' && strchr (s + 1, '(') == 0)
13544                       {
13545                         INSERT_OPERAND (1, IMMJ, *ip, 0);
13546                         continue;
13547                       }
13548
13549                     if (my_getSmallExpression (&ep, r, s) > 0
13550                         || !expr_const_in_range (&ep, 0, 16, 2))
13551                       break;
13552
13553                     imm = ep.X_add_number >> 2;
13554                     INSERT_OPERAND (1, IMMJ, *ip, imm);
13555                   }
13556                   s = expr_end;
13557                   continue;
13558
13559                 case 'L':
13560                   {
13561                     bfd_reloc_code_real_type r[3];
13562                     expressionS ep;
13563                     int imm;
13564
13565                     /* Check whether there is only a single bracketed
13566                        expression left.  If so, it must be the base register
13567                        and the constant must be zero.  */
13568                     if (*s == '(' && strchr (s + 1, '(') == 0)
13569                       {
13570                         INSERT_OPERAND (1, IMML, *ip, 0);
13571                         continue;
13572                       }
13573
13574                     if (my_getSmallExpression (&ep, r, s) > 0
13575                         || !expr_const_in_range (&ep, 0, 16, 0))
13576                       break;
13577
13578                     imm = ep.X_add_number;
13579                     INSERT_OPERAND (1, IMML, *ip, imm);
13580                   }
13581                   s = expr_end;
13582                   continue;
13583
13584                 case 'M':
13585                   {
13586                     bfd_reloc_code_real_type r[3];
13587                     expressionS ep;
13588                     int imm;
13589
13590                     if (my_getSmallExpression (&ep, r, s) > 0
13591                         || !expr_const_in_range (&ep, 1, 9, 0))
13592                       break;
13593
13594                     imm = ep.X_add_number & 7;
13595                     INSERT_OPERAND (1, IMMM, *ip, imm);
13596                   }
13597                   s = expr_end;
13598                   continue;
13599
13600                 case 'N':       /* Register list for lwm and swm.  */
13601                   {
13602                     /* A comma-separated list of registers and/or
13603                        dash-separated contiguous ranges including
13604                        both ra and a set of one or more registers
13605                        starting at s0 up to s3 which have to be
13606                        consecutive, e.g.:
13607
13608                        s0, ra
13609                        s0, s1, ra, s2, s3
13610                        s0-s2, ra
13611
13612                        and any permutations of these.  */
13613                     unsigned int reglist;
13614                     int imm;
13615
13616                     if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
13617                       break;
13618
13619                     if ((reglist & 0xfff1ffff) != 0x80010000)
13620                       break;
13621
13622                     reglist = (reglist >> 17) & 7;
13623                     reglist += 1;
13624                     if ((reglist & -reglist) != reglist)
13625                       break;
13626
13627                     imm = ffs (reglist) - 1;
13628                     INSERT_OPERAND (1, IMMN, *ip, imm);
13629                   }
13630                   continue;
13631
13632                 case 'O':       /* sdbbp 4-bit code.  */
13633                   {
13634                     bfd_reloc_code_real_type r[3];
13635                     expressionS ep;
13636                     int imm;
13637
13638                     if (my_getSmallExpression (&ep, r, s) > 0
13639                         || !expr_const_in_range (&ep, 0, 16, 0))
13640                       break;
13641
13642                     imm = ep.X_add_number;
13643                     INSERT_OPERAND (1, IMMO, *ip, imm);
13644                   }
13645                   s = expr_end;
13646                   continue;
13647
13648                 case 'P':
13649                   {
13650                     bfd_reloc_code_real_type r[3];
13651                     expressionS ep;
13652                     int imm;
13653
13654                     if (my_getSmallExpression (&ep, r, s) > 0
13655                         || !expr_const_in_range (&ep, 0, 32, 2))
13656                       break;
13657
13658                     imm = ep.X_add_number >> 2;
13659                     INSERT_OPERAND (1, IMMP, *ip, imm);
13660                   }
13661                   s = expr_end;
13662                   continue;
13663
13664                 case 'Q':
13665                   {
13666                     bfd_reloc_code_real_type r[3];
13667                     expressionS ep;
13668                     int imm;
13669
13670                     if (my_getSmallExpression (&ep, r, s) > 0
13671                         || !expr_const_in_range (&ep, -0x400000, 0x400000, 2))
13672                       break;
13673
13674                     imm = ep.X_add_number >> 2;
13675                     INSERT_OPERAND (1, IMMQ, *ip, imm);
13676                   }
13677                   s = expr_end;
13678                   continue;
13679
13680                 case 'U':
13681                   {
13682                     bfd_reloc_code_real_type r[3];
13683                     expressionS ep;
13684                     int imm;
13685
13686                     /* Check whether there is only a single bracketed
13687                        expression left.  If so, it must be the base register
13688                        and the constant must be zero.  */
13689                     if (*s == '(' && strchr (s + 1, '(') == 0)
13690                       {
13691                         INSERT_OPERAND (1, IMMU, *ip, 0);
13692                         continue;
13693                       }
13694
13695                     if (my_getSmallExpression (&ep, r, s) > 0
13696                         || !expr_const_in_range (&ep, 0, 32, 2))
13697                       break;
13698
13699                     imm = ep.X_add_number >> 2;
13700                     INSERT_OPERAND (1, IMMU, *ip, imm);
13701                   }
13702                   s = expr_end;
13703                   continue;
13704
13705                 case 'W':
13706                   {
13707                     bfd_reloc_code_real_type r[3];
13708                     expressionS ep;
13709                     int imm;
13710
13711                     if (my_getSmallExpression (&ep, r, s) > 0
13712                         || !expr_const_in_range (&ep, 0, 64, 2))
13713                       break;
13714
13715                     imm = ep.X_add_number >> 2;
13716                     INSERT_OPERAND (1, IMMW, *ip, imm);
13717                   }
13718                   s = expr_end;
13719                   continue;
13720
13721                 case 'X':
13722                   {
13723                     bfd_reloc_code_real_type r[3];
13724                     expressionS ep;
13725                     int imm;
13726
13727                     if (my_getSmallExpression (&ep, r, s) > 0
13728                         || !expr_const_in_range (&ep, -8, 8, 0))
13729                       break;
13730
13731                     imm = ep.X_add_number;
13732                     INSERT_OPERAND (1, IMMX, *ip, imm);
13733                   }
13734                   s = expr_end;
13735                   continue;
13736
13737                 case 'Y':
13738                   {
13739                     bfd_reloc_code_real_type r[3];
13740                     expressionS ep;
13741                     int imm;
13742
13743                     if (my_getSmallExpression (&ep, r, s) > 0
13744                         || expr_const_in_range (&ep, -2, 2, 2)
13745                         || !expr_const_in_range (&ep, -258, 258, 2))
13746                       break;
13747
13748                     imm = ep.X_add_number >> 2;
13749                     imm = ((imm >> 1) & ~0xff) | (imm & 0xff);
13750                     INSERT_OPERAND (1, IMMY, *ip, imm);
13751                   }
13752                   s = expr_end;
13753                   continue;
13754
13755                 case 'Z':
13756                   {
13757                     bfd_reloc_code_real_type r[3];
13758                     expressionS ep;
13759
13760                     if (my_getSmallExpression (&ep, r, s) > 0
13761                         || !expr_const_in_range (&ep, 0, 1, 0))
13762                       break;
13763                   }
13764                   s = expr_end;
13765                   continue;
13766
13767                 default:
13768                   as_bad (_("Internal error: bad microMIPS opcode "
13769                             "(unknown extension operand type `m%c'): %s %s"),
13770                           *args, insn->name, insn->args);
13771                   /* Further processing is fruitless.  */
13772                   return;
13773                 }
13774               break;
13775
13776             case 'n':           /* Register list for 32-bit lwm and swm.  */
13777               gas_assert (mips_opts.micromips);
13778               {
13779                 /* A comma-separated list of registers and/or
13780                    dash-separated contiguous ranges including
13781                    at least one of ra and a set of one or more
13782                    registers starting at s0 up to s7 and then
13783                    s8 which have to be consecutive, e.g.:
13784
13785                    ra
13786                    s0
13787                    ra, s0, s1, s2
13788                    s0-s8
13789                    s0-s5, ra
13790
13791                    and any permutations of these.  */
13792                 unsigned int reglist;
13793                 int imm;
13794                 int ra;
13795
13796                 if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
13797                   break;
13798
13799                 if ((reglist & 0x3f00ffff) != 0)
13800                   break;
13801
13802                 ra = (reglist >> 27) & 0x10;
13803                 reglist = ((reglist >> 22) & 0x100) | ((reglist >> 16) & 0xff);
13804                 reglist += 1;
13805                 if ((reglist & -reglist) != reglist)
13806                   break;
13807
13808                 imm = (ffs (reglist) - 1) | ra;
13809                 INSERT_OPERAND (1, RT, *ip, imm);
13810                 imm_expr.X_op = O_absent;
13811               }
13812               continue;
13813
13814             case '|':           /* 4-bit trap code.  */
13815               gas_assert (mips_opts.micromips);
13816               my_getExpression (&imm_expr, s);
13817               check_absolute_expr (ip, &imm_expr);
13818               if ((unsigned long) imm_expr.X_add_number
13819                   > MICROMIPSOP_MASK_TRAP)
13820                 as_bad (_("Trap code (%lu) for %s not in 0..15 range"),
13821                         (unsigned long) imm_expr.X_add_number,
13822                         ip->insn_mo->name);
13823               INSERT_OPERAND (1, TRAP, *ip, imm_expr.X_add_number);
13824               imm_expr.X_op = O_absent;
13825               s = expr_end;
13826               continue;
13827
13828             default:
13829               as_bad (_("Bad char = '%c'\n"), *args);
13830               abort ();
13831             }
13832           break;
13833         }
13834       /* Args don't match.  */
13835       s = argsStart;
13836       insn_error = _("Illegal operands");
13837       if (insn + 1 < past && !strcmp (insn->name, insn[1].name))
13838         {
13839           ++insn;
13840           continue;
13841         }
13842       else if (wrong_delay_slot_insns && need_delay_slot_ok)
13843         {
13844           gas_assert (firstinsn);
13845           need_delay_slot_ok = FALSE;
13846           past = insn + 1;
13847           insn = firstinsn;
13848           continue;
13849         }
13850       return;
13851     }
13852 }
13853
13854 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
13855
13856 /* This routine assembles an instruction into its binary format when
13857    assembling for the mips16.  As a side effect, it sets one of the
13858    global variables imm_reloc or offset_reloc to the type of relocation
13859    to do if one of the operands is an address expression.  It also sets
13860    forced_insn_length to the resulting instruction size in bytes if the
13861    user explicitly requested a small or extended instruction.  */
13862
13863 static void
13864 mips16_ip (char *str, struct mips_cl_insn *ip)
13865 {
13866   char *s;
13867   const char *args;
13868   struct mips_opcode *insn;
13869   char *argsstart;
13870   unsigned int regno;
13871   unsigned int lastregno = 0;
13872   char *s_reset;
13873   size_t i;
13874
13875   insn_error = NULL;
13876
13877   forced_insn_length = 0;
13878
13879   for (s = str; ISLOWER (*s); ++s)
13880     ;
13881   switch (*s)
13882     {
13883     case '\0':
13884       break;
13885
13886     case ' ':
13887       *s++ = '\0';
13888       break;
13889
13890     case '.':
13891       if (s[1] == 't' && s[2] == ' ')
13892         {
13893           *s = '\0';
13894           forced_insn_length = 2;
13895           s += 3;
13896           break;
13897         }
13898       else if (s[1] == 'e' && s[2] == ' ')
13899         {
13900           *s = '\0';
13901           forced_insn_length = 4;
13902           s += 3;
13903           break;
13904         }
13905       /* Fall through.  */
13906     default:
13907       insn_error = _("unknown opcode");
13908       return;
13909     }
13910
13911   if (mips_opts.noautoextend && !forced_insn_length)
13912     forced_insn_length = 2;
13913
13914   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
13915     {
13916       insn_error = _("unrecognized opcode");
13917       return;
13918     }
13919
13920   argsstart = s;
13921   for (;;)
13922     {
13923       bfd_boolean ok;
13924
13925       gas_assert (strcmp (insn->name, str) == 0);
13926
13927       ok = is_opcode_valid_16 (insn);
13928       if (! ok)
13929         {
13930           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
13931               && strcmp (insn->name, insn[1].name) == 0)
13932             {
13933               ++insn;
13934               continue;
13935             }
13936           else
13937             {
13938               if (!insn_error)
13939                 {
13940                   static char buf[100];
13941                   sprintf (buf,
13942                            _("Opcode not supported on this processor: %s (%s)"),
13943                            mips_cpu_info_from_arch (mips_opts.arch)->name,
13944                            mips_cpu_info_from_isa (mips_opts.isa)->name);
13945                   insn_error = buf;
13946                 }
13947               return;
13948             }
13949         }
13950
13951       create_insn (ip, insn);
13952       imm_expr.X_op = O_absent;
13953       imm_reloc[0] = BFD_RELOC_UNUSED;
13954       imm_reloc[1] = BFD_RELOC_UNUSED;
13955       imm_reloc[2] = BFD_RELOC_UNUSED;
13956       imm2_expr.X_op = O_absent;
13957       offset_expr.X_op = O_absent;
13958       offset_reloc[0] = BFD_RELOC_UNUSED;
13959       offset_reloc[1] = BFD_RELOC_UNUSED;
13960       offset_reloc[2] = BFD_RELOC_UNUSED;
13961       for (args = insn->args; 1; ++args)
13962         {
13963           int c;
13964
13965           if (*s == ' ')
13966             ++s;
13967
13968           /* In this switch statement we call break if we did not find
13969              a match, continue if we did find a match, or return if we
13970              are done.  */
13971
13972           c = *args;
13973           switch (c)
13974             {
13975             case '\0':
13976               if (*s == '\0')
13977                 {
13978                   offsetT value;
13979
13980                   /* Stuff the immediate value in now, if we can.  */
13981                   if (imm_expr.X_op == O_constant
13982                       && *imm_reloc > BFD_RELOC_UNUSED
13983                       && insn->pinfo != INSN_MACRO
13984                       && calculate_reloc (*offset_reloc,
13985                                           imm_expr.X_add_number, &value))
13986                     {
13987                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
13988                                     *offset_reloc, value, forced_insn_length,
13989                                     &ip->insn_opcode);
13990                       imm_expr.X_op = O_absent;
13991                       *imm_reloc = BFD_RELOC_UNUSED;
13992                       *offset_reloc = BFD_RELOC_UNUSED;
13993                     }
13994
13995                   return;
13996                 }
13997               break;
13998
13999             case ',':
14000               if (*s++ == c)
14001                 continue;
14002               s--;
14003               switch (*++args)
14004                 {
14005                 case 'v':
14006                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
14007                   continue;
14008                 case 'w':
14009                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
14010                   continue;
14011                 }
14012               break;
14013
14014             case '(':
14015             case ')':
14016               if (*s++ == c)
14017                 continue;
14018               break;
14019
14020             case 'v':
14021             case 'w':
14022               if (s[0] != '$')
14023                 {
14024                   if (c == 'v')
14025                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
14026                   else
14027                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
14028                   ++args;
14029                   continue;
14030                 }
14031               /* Fall through.  */
14032             case 'x':
14033             case 'y':
14034             case 'z':
14035             case 'Z':
14036             case '0':
14037             case 'S':
14038             case 'R':
14039             case 'X':
14040             case 'Y':
14041               s_reset = s;
14042               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
14043                 {
14044                   if (c == 'v' || c == 'w')
14045                     {
14046                       if (c == 'v')
14047                         MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
14048                       else
14049                         MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
14050                       ++args;
14051                       continue;
14052                     }
14053                   break;
14054                 }
14055
14056               if (*s == ' ')
14057                 ++s;
14058               if (args[1] != *s)
14059                 {
14060                   if (c == 'v' || c == 'w')
14061                     {
14062                       regno = mips16_to_32_reg_map[lastregno];
14063                       s = s_reset;
14064                       ++args;
14065                     }
14066                 }
14067
14068               switch (c)
14069                 {
14070                 case 'x':
14071                 case 'y':
14072                 case 'z':
14073                 case 'v':
14074                 case 'w':
14075                 case 'Z':
14076                   regno = mips32_to_16_reg_map[regno];
14077                   break;
14078
14079                 case '0':
14080                   if (regno != 0)
14081                     regno = ILLEGAL_REG;
14082                   break;
14083
14084                 case 'S':
14085                   if (regno != SP)
14086                     regno = ILLEGAL_REG;
14087                   break;
14088
14089                 case 'R':
14090                   if (regno != RA)
14091                     regno = ILLEGAL_REG;
14092                   break;
14093
14094                 case 'X':
14095                 case 'Y':
14096                   if (regno == AT && mips_opts.at)
14097                     {
14098                       if (mips_opts.at == ATREG)
14099                         as_warn (_("used $at without \".set noat\""));
14100                       else
14101                         as_warn (_("used $%u with \".set at=$%u\""),
14102                                  regno, mips_opts.at);
14103                     }
14104                   break;
14105
14106                 default:
14107                   abort ();
14108                 }
14109
14110               if (regno == ILLEGAL_REG)
14111                 break;
14112
14113               switch (c)
14114                 {
14115                 case 'x':
14116                 case 'v':
14117                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
14118                   break;
14119                 case 'y':
14120                 case 'w':
14121                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
14122                   break;
14123                 case 'z':
14124                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
14125                   break;
14126                 case 'Z':
14127                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
14128                 case '0':
14129                 case 'S':
14130                 case 'R':
14131                   break;
14132                 case 'X':
14133                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
14134                   break;
14135                 case 'Y':
14136                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
14137                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
14138                   break;
14139                 default:
14140                   abort ();
14141                 }
14142
14143               lastregno = regno;
14144               continue;
14145
14146             case 'P':
14147               if (strncmp (s, "$pc", 3) == 0)
14148                 {
14149                   s += 3;
14150                   continue;
14151                 }
14152               break;
14153
14154             case '5':
14155             case 'H':
14156             case 'W':
14157             case 'D':
14158             case 'j':
14159             case 'V':
14160             case 'C':
14161             case 'U':
14162             case 'k':
14163             case 'K':
14164               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
14165               if (i > 0)
14166                 {
14167                   if (imm_expr.X_op != O_constant)
14168                     {
14169                       forced_insn_length = 4;
14170                       ip->insn_opcode |= MIPS16_EXTEND;
14171                     }
14172                   else
14173                     {
14174                       /* We need to relax this instruction.  */
14175                       *offset_reloc = *imm_reloc;
14176                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
14177                     }
14178                   s = expr_end;
14179                   continue;
14180                 }
14181               *imm_reloc = BFD_RELOC_UNUSED;
14182               /* Fall through.  */
14183             case '<':
14184             case '>':
14185             case '[':
14186             case ']':
14187             case '4':
14188             case '8':
14189               my_getExpression (&imm_expr, s);
14190               if (imm_expr.X_op == O_register)
14191                 {
14192                   /* What we thought was an expression turned out to
14193                      be a register.  */
14194
14195                   if (s[0] == '(' && args[1] == '(')
14196                     {
14197                       /* It looks like the expression was omitted
14198                          before a register indirection, which means
14199                          that the expression is implicitly zero.  We
14200                          still set up imm_expr, so that we handle
14201                          explicit extensions correctly.  */
14202                       imm_expr.X_op = O_constant;
14203                       imm_expr.X_add_number = 0;
14204                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
14205                       continue;
14206                     }
14207
14208                   break;
14209                 }
14210
14211               /* We need to relax this instruction.  */
14212               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
14213               s = expr_end;
14214               continue;
14215
14216             case 'p':
14217             case 'q':
14218             case 'A':
14219             case 'B':
14220             case 'E':
14221               /* We use offset_reloc rather than imm_reloc for the PC
14222                  relative operands.  This lets macros with both
14223                  immediate and address operands work correctly.  */
14224               my_getExpression (&offset_expr, s);
14225
14226               if (offset_expr.X_op == O_register)
14227                 break;
14228
14229               /* We need to relax this instruction.  */
14230               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
14231               s = expr_end;
14232               continue;
14233
14234             case '6':           /* break code */
14235               my_getExpression (&imm_expr, s);
14236               check_absolute_expr (ip, &imm_expr);
14237               if ((unsigned long) imm_expr.X_add_number > 63)
14238                 as_warn (_("Invalid value for `%s' (%lu)"),
14239                          ip->insn_mo->name,
14240                          (unsigned long) imm_expr.X_add_number);
14241               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
14242               imm_expr.X_op = O_absent;
14243               s = expr_end;
14244               continue;
14245
14246             case 'a':           /* 26 bit address */
14247               my_getExpression (&offset_expr, s);
14248               s = expr_end;
14249               *offset_reloc = BFD_RELOC_MIPS16_JMP;
14250               ip->insn_opcode <<= 16;
14251               continue;
14252
14253             case 'l':           /* register list for entry macro */
14254             case 'L':           /* register list for exit macro */
14255               {
14256                 int mask;
14257
14258                 if (c == 'l')
14259                   mask = 0;
14260                 else
14261                   mask = 7 << 3;
14262                 while (*s != '\0')
14263                   {
14264                     unsigned int freg, reg1, reg2;
14265
14266                     while (*s == ' ' || *s == ',')
14267                       ++s;
14268                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
14269                       freg = 0;
14270                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
14271                       freg = 1;
14272                     else
14273                       {
14274                         as_bad (_("can't parse register list"));
14275                         break;
14276                       }
14277                     if (*s == ' ')
14278                       ++s;
14279                     if (*s != '-')
14280                       reg2 = reg1;
14281                     else
14282                       {
14283                         ++s;
14284                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
14285                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
14286                           {
14287                             as_bad (_("invalid register list"));
14288                             break;
14289                           }
14290                       }
14291                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
14292                       {
14293                         mask &= ~ (7 << 3);
14294                         mask |= 5 << 3;
14295                       }
14296                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
14297                       {
14298                         mask &= ~ (7 << 3);
14299                         mask |= 6 << 3;
14300                       }
14301                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
14302                       mask |= (reg2 - 3) << 3;
14303                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
14304                       mask |= (reg2 - 15) << 1;
14305                     else if (reg1 == RA && reg2 == RA)
14306                       mask |= 1;
14307                     else
14308                       {
14309                         as_bad (_("invalid register list"));
14310                         break;
14311                       }
14312                   }
14313                 /* The mask is filled in in the opcode table for the
14314                    benefit of the disassembler.  We remove it before
14315                    applying the actual mask.  */
14316                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
14317                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
14318               }
14319             continue;
14320
14321             case 'm':           /* Register list for save insn.  */
14322             case 'M':           /* Register list for restore insn.  */
14323               {
14324                 int opcode = ip->insn_opcode;
14325                 int framesz = 0, seen_framesz = 0;
14326                 int nargs = 0, statics = 0, sregs = 0;
14327
14328                 while (*s != '\0')
14329                   {
14330                     unsigned int reg1, reg2;
14331
14332                     SKIP_SPACE_TABS (s);
14333                     while (*s == ',')
14334                       ++s;
14335                     SKIP_SPACE_TABS (s);
14336
14337                     my_getExpression (&imm_expr, s);
14338                     if (imm_expr.X_op == O_constant)
14339                       {
14340                         /* Handle the frame size.  */
14341                         if (seen_framesz)
14342                           {
14343                             as_bad (_("more than one frame size in list"));
14344                             break;
14345                           }
14346                         seen_framesz = 1;
14347                         framesz = imm_expr.X_add_number;
14348                         imm_expr.X_op = O_absent;
14349                         s = expr_end;
14350                         continue;
14351                       }
14352
14353                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
14354                       {
14355                         as_bad (_("can't parse register list"));
14356                         break;
14357                       }
14358
14359                     while (*s == ' ')
14360                       ++s;
14361
14362                     if (*s != '-')
14363                       reg2 = reg1;
14364                     else
14365                       {
14366                         ++s;
14367                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
14368                             || reg2 < reg1)
14369                           {
14370                             as_bad (_("can't parse register list"));
14371                             break;
14372                           }
14373                       }
14374
14375                     while (reg1 <= reg2)
14376                       {
14377                         if (reg1 >= 4 && reg1 <= 7)
14378                           {
14379                             if (!seen_framesz)
14380                                 /* args $a0-$a3 */
14381                                 nargs |= 1 << (reg1 - 4);
14382                             else
14383                                 /* statics $a0-$a3 */
14384                                 statics |= 1 << (reg1 - 4);
14385                           }
14386                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
14387                           {
14388                             /* $s0-$s8 */
14389                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
14390                           }
14391                         else if (reg1 == 31)
14392                           {
14393                             /* Add $ra to insn.  */
14394                             opcode |= 0x40;
14395                           }
14396                         else
14397                           {
14398                             as_bad (_("unexpected register in list"));
14399                             break;
14400                           }
14401                         if (++reg1 == 24)
14402                           reg1 = 30;
14403                       }
14404                   }
14405
14406                 /* Encode args/statics combination.  */
14407                 if (nargs & statics)
14408                   as_bad (_("arg/static registers overlap"));
14409                 else if (nargs == 0xf)
14410                   /* All $a0-$a3 are args.  */
14411                   opcode |= MIPS16_ALL_ARGS << 16;
14412                 else if (statics == 0xf)
14413                   /* All $a0-$a3 are statics.  */
14414                   opcode |= MIPS16_ALL_STATICS << 16;
14415                 else 
14416                   {
14417                     int narg = 0, nstat = 0;
14418
14419                     /* Count arg registers.  */
14420                     while (nargs & 0x1)
14421                       {
14422                         nargs >>= 1;
14423                         narg++;
14424                       }
14425                     if (nargs != 0)
14426                       as_bad (_("invalid arg register list"));
14427
14428                     /* Count static registers.  */
14429                     while (statics & 0x8)
14430                       {
14431                         statics = (statics << 1) & 0xf;
14432                         nstat++;
14433                       }
14434                     if (statics != 0) 
14435                       as_bad (_("invalid static register list"));
14436
14437                     /* Encode args/statics.  */
14438                     opcode |= ((narg << 2) | nstat) << 16;
14439                   }
14440
14441                 /* Encode $s0/$s1.  */
14442                 if (sregs & (1 << 0))           /* $s0 */
14443                   opcode |= 0x20;
14444                 if (sregs & (1 << 1))           /* $s1 */
14445                   opcode |= 0x10;
14446                 sregs >>= 2;
14447
14448                 if (sregs != 0)
14449                   {
14450                     /* Count regs $s2-$s8.  */
14451                     int nsreg = 0;
14452                     while (sregs & 1)
14453                       {
14454                         sregs >>= 1;
14455                         nsreg++;
14456                       }
14457                     if (sregs != 0)
14458                       as_bad (_("invalid static register list"));
14459                     /* Encode $s2-$s8. */
14460                     opcode |= nsreg << 24;
14461                   }
14462
14463                 /* Encode frame size.  */
14464                 if (!seen_framesz)
14465                   as_bad (_("missing frame size"));
14466                 else if ((framesz & 7) != 0 || framesz < 0
14467                          || framesz > 0xff * 8)
14468                   as_bad (_("invalid frame size"));
14469                 else if (framesz != 128 || (opcode >> 16) != 0)
14470                   {
14471                     framesz /= 8;
14472                     opcode |= (((framesz & 0xf0) << 16)
14473                              | (framesz & 0x0f));
14474                   }
14475
14476                 /* Finally build the instruction.  */
14477                 if ((opcode >> 16) != 0 || framesz == 0)
14478                   opcode |= MIPS16_EXTEND;
14479                 ip->insn_opcode = opcode;
14480               }
14481             continue;
14482
14483             case 'e':           /* extend code */
14484               my_getExpression (&imm_expr, s);
14485               check_absolute_expr (ip, &imm_expr);
14486               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
14487                 {
14488                   as_warn (_("Invalid value for `%s' (%lu)"),
14489                            ip->insn_mo->name,
14490                            (unsigned long) imm_expr.X_add_number);
14491                   imm_expr.X_add_number &= 0x7ff;
14492                 }
14493               ip->insn_opcode |= imm_expr.X_add_number;
14494               imm_expr.X_op = O_absent;
14495               s = expr_end;
14496               continue;
14497
14498             default:
14499               abort ();
14500             }
14501           break;
14502         }
14503
14504       /* Args don't match.  */
14505       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
14506           strcmp (insn->name, insn[1].name) == 0)
14507         {
14508           ++insn;
14509           s = argsstart;
14510           continue;
14511         }
14512
14513       insn_error = _("illegal operands");
14514
14515       return;
14516     }
14517 }
14518
14519 /* This structure holds information we know about a mips16 immediate
14520    argument type.  */
14521
14522 struct mips16_immed_operand
14523 {
14524   /* The type code used in the argument string in the opcode table.  */
14525   int type;
14526   /* The number of bits in the short form of the opcode.  */
14527   int nbits;
14528   /* The number of bits in the extended form of the opcode.  */
14529   int extbits;
14530   /* The amount by which the short form is shifted when it is used;
14531      for example, the sw instruction has a shift count of 2.  */
14532   int shift;
14533   /* The amount by which the short form is shifted when it is stored
14534      into the instruction code.  */
14535   int op_shift;
14536   /* Non-zero if the short form is unsigned.  */
14537   int unsp;
14538   /* Non-zero if the extended form is unsigned.  */
14539   int extu;
14540   /* Non-zero if the value is PC relative.  */
14541   int pcrel;
14542 };
14543
14544 /* The mips16 immediate operand types.  */
14545
14546 static const struct mips16_immed_operand mips16_immed_operands[] =
14547 {
14548   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
14549   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
14550   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
14551   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
14552   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
14553   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
14554   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
14555   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
14556   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
14557   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
14558   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
14559   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
14560   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
14561   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
14562   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
14563   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
14564   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
14565   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
14566   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
14567   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
14568   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
14569 };
14570
14571 #define MIPS16_NUM_IMMED \
14572   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
14573
14574 /* Marshal immediate value VAL for an extended MIPS16 instruction.
14575    NBITS is the number of significant bits in VAL.  */
14576
14577 static unsigned long
14578 mips16_immed_extend (offsetT val, unsigned int nbits)
14579 {
14580   int extval;
14581   if (nbits == 16)
14582     {
14583       extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
14584       val &= 0x1f;
14585     }
14586   else if (nbits == 15)
14587     {
14588       extval = ((val >> 11) & 0xf) | (val & 0x7f0);
14589       val &= 0xf;
14590     }
14591   else
14592     {
14593       extval = ((val & 0x1f) << 6) | (val & 0x20);
14594       val = 0;
14595     }
14596   return (extval << 16) | val;
14597 }
14598
14599 /* Install immediate value VAL into MIPS16 instruction *INSN,
14600    extending it if necessary.  The instruction in *INSN may
14601    already be extended.
14602
14603    RELOC is the relocation that produced VAL, or BFD_RELOC_UNUSED
14604    if none.  In the former case, VAL is a 16-bit number with no
14605    defined signedness.
14606
14607    TYPE is the type of the immediate field.  USER_INSN_LENGTH
14608    is the length that the user requested, or 0 if none.  */
14609
14610 static void
14611 mips16_immed (char *file, unsigned int line, int type,
14612               bfd_reloc_code_real_type reloc, offsetT val,
14613               unsigned int user_insn_length, unsigned long *insn)
14614 {
14615   const struct mips16_immed_operand *op;
14616   int mintiny, maxtiny;
14617
14618   op = mips16_immed_operands;
14619   while (op->type != type)
14620     {
14621       ++op;
14622       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
14623     }
14624
14625   if (op->unsp)
14626     {
14627       if (type == '<' || type == '>' || type == '[' || type == ']')
14628         {
14629           mintiny = 1;
14630           maxtiny = 1 << op->nbits;
14631         }
14632       else
14633         {
14634           mintiny = 0;
14635           maxtiny = (1 << op->nbits) - 1;
14636         }
14637       if (reloc != BFD_RELOC_UNUSED)
14638         val &= 0xffff;
14639     }
14640   else
14641     {
14642       mintiny = - (1 << (op->nbits - 1));
14643       maxtiny = (1 << (op->nbits - 1)) - 1;
14644       if (reloc != BFD_RELOC_UNUSED)
14645         val = SEXT_16BIT (val);
14646     }
14647
14648   /* Branch offsets have an implicit 0 in the lowest bit.  */
14649   if (type == 'p' || type == 'q')
14650     val /= 2;
14651
14652   if ((val & ((1 << op->shift) - 1)) != 0
14653       || val < (mintiny << op->shift)
14654       || val > (maxtiny << op->shift))
14655     {
14656       /* We need an extended instruction.  */
14657       if (user_insn_length == 2)
14658         as_bad_where (file, line, _("invalid unextended operand value"));
14659       else
14660         *insn |= MIPS16_EXTEND;
14661     }
14662   else if (user_insn_length == 4)
14663     {
14664       /* The operand doesn't force an unextended instruction to be extended.
14665          Warn if the user wanted an extended instruction anyway.  */
14666       *insn |= MIPS16_EXTEND;
14667       as_warn_where (file, line,
14668                      _("extended operand requested but not required"));
14669     }
14670
14671   if (mips16_opcode_length (*insn) == 2)
14672     {
14673       int insnval;
14674
14675       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
14676       insnval <<= op->op_shift;
14677       *insn |= insnval;
14678     }
14679   else
14680     {
14681       long minext, maxext;
14682
14683       if (reloc == BFD_RELOC_UNUSED)
14684         {
14685           if (op->extu)
14686             {
14687               minext = 0;
14688               maxext = (1 << op->extbits) - 1;
14689             }
14690           else
14691             {
14692               minext = - (1 << (op->extbits - 1));
14693               maxext = (1 << (op->extbits - 1)) - 1;
14694             }
14695           if (val < minext || val > maxext)
14696             as_bad_where (file, line,
14697                           _("operand value out of range for instruction"));
14698         }
14699
14700       *insn |= mips16_immed_extend (val, op->extbits);
14701     }
14702 }
14703 \f
14704 struct percent_op_match
14705 {
14706   const char *str;
14707   bfd_reloc_code_real_type reloc;
14708 };
14709
14710 static const struct percent_op_match mips_percent_op[] =
14711 {
14712   {"%lo", BFD_RELOC_LO16},
14713   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
14714   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
14715   {"%call16", BFD_RELOC_MIPS_CALL16},
14716   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
14717   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
14718   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
14719   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
14720   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
14721   {"%got", BFD_RELOC_MIPS_GOT16},
14722   {"%gp_rel", BFD_RELOC_GPREL16},
14723   {"%half", BFD_RELOC_16},
14724   {"%highest", BFD_RELOC_MIPS_HIGHEST},
14725   {"%higher", BFD_RELOC_MIPS_HIGHER},
14726   {"%neg", BFD_RELOC_MIPS_SUB},
14727   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
14728   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
14729   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
14730   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
14731   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
14732   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
14733   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
14734   {"%hi", BFD_RELOC_HI16_S}
14735 };
14736
14737 static const struct percent_op_match mips16_percent_op[] =
14738 {
14739   {"%lo", BFD_RELOC_MIPS16_LO16},
14740   {"%gprel", BFD_RELOC_MIPS16_GPREL},
14741   {"%got", BFD_RELOC_MIPS16_GOT16},
14742   {"%call16", BFD_RELOC_MIPS16_CALL16},
14743   {"%hi", BFD_RELOC_MIPS16_HI16_S},
14744   {"%tlsgd", BFD_RELOC_MIPS16_TLS_GD},
14745   {"%tlsldm", BFD_RELOC_MIPS16_TLS_LDM},
14746   {"%dtprel_hi", BFD_RELOC_MIPS16_TLS_DTPREL_HI16},
14747   {"%dtprel_lo", BFD_RELOC_MIPS16_TLS_DTPREL_LO16},
14748   {"%tprel_hi", BFD_RELOC_MIPS16_TLS_TPREL_HI16},
14749   {"%tprel_lo", BFD_RELOC_MIPS16_TLS_TPREL_LO16},
14750   {"%gottprel", BFD_RELOC_MIPS16_TLS_GOTTPREL}
14751 };
14752
14753
14754 /* Return true if *STR points to a relocation operator.  When returning true,
14755    move *STR over the operator and store its relocation code in *RELOC.
14756    Leave both *STR and *RELOC alone when returning false.  */
14757
14758 static bfd_boolean
14759 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
14760 {
14761   const struct percent_op_match *percent_op;
14762   size_t limit, i;
14763
14764   if (mips_opts.mips16)
14765     {
14766       percent_op = mips16_percent_op;
14767       limit = ARRAY_SIZE (mips16_percent_op);
14768     }
14769   else
14770     {
14771       percent_op = mips_percent_op;
14772       limit = ARRAY_SIZE (mips_percent_op);
14773     }
14774
14775   for (i = 0; i < limit; i++)
14776     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
14777       {
14778         int len = strlen (percent_op[i].str);
14779
14780         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
14781           continue;
14782
14783         *str += strlen (percent_op[i].str);
14784         *reloc = percent_op[i].reloc;
14785
14786         /* Check whether the output BFD supports this relocation.
14787            If not, issue an error and fall back on something safe.  */
14788         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
14789           {
14790             as_bad (_("relocation %s isn't supported by the current ABI"),
14791                     percent_op[i].str);
14792             *reloc = BFD_RELOC_UNUSED;
14793           }
14794         return TRUE;
14795       }
14796   return FALSE;
14797 }
14798
14799
14800 /* Parse string STR as a 16-bit relocatable operand.  Store the
14801    expression in *EP and the relocations in the array starting
14802    at RELOC.  Return the number of relocation operators used.
14803
14804    On exit, EXPR_END points to the first character after the expression.  */
14805
14806 static size_t
14807 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
14808                        char *str)
14809 {
14810   bfd_reloc_code_real_type reversed_reloc[3];
14811   size_t reloc_index, i;
14812   int crux_depth, str_depth;
14813   char *crux;
14814
14815   /* Search for the start of the main expression, recoding relocations
14816      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
14817      of the main expression and with CRUX_DEPTH containing the number
14818      of open brackets at that point.  */
14819   reloc_index = -1;
14820   str_depth = 0;
14821   do
14822     {
14823       reloc_index++;
14824       crux = str;
14825       crux_depth = str_depth;
14826
14827       /* Skip over whitespace and brackets, keeping count of the number
14828          of brackets.  */
14829       while (*str == ' ' || *str == '\t' || *str == '(')
14830         if (*str++ == '(')
14831           str_depth++;
14832     }
14833   while (*str == '%'
14834          && reloc_index < (HAVE_NEWABI ? 3 : 1)
14835          && parse_relocation (&str, &reversed_reloc[reloc_index]));
14836
14837   my_getExpression (ep, crux);
14838   str = expr_end;
14839
14840   /* Match every open bracket.  */
14841   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
14842     if (*str++ == ')')
14843       crux_depth--;
14844
14845   if (crux_depth > 0)
14846     as_bad (_("unclosed '('"));
14847
14848   expr_end = str;
14849
14850   if (reloc_index != 0)
14851     {
14852       prev_reloc_op_frag = frag_now;
14853       for (i = 0; i < reloc_index; i++)
14854         reloc[i] = reversed_reloc[reloc_index - 1 - i];
14855     }
14856
14857   return reloc_index;
14858 }
14859
14860 static void
14861 my_getExpression (expressionS *ep, char *str)
14862 {
14863   char *save_in;
14864
14865   save_in = input_line_pointer;
14866   input_line_pointer = str;
14867   expression (ep);
14868   expr_end = input_line_pointer;
14869   input_line_pointer = save_in;
14870 }
14871
14872 char *
14873 md_atof (int type, char *litP, int *sizeP)
14874 {
14875   return ieee_md_atof (type, litP, sizeP, target_big_endian);
14876 }
14877
14878 void
14879 md_number_to_chars (char *buf, valueT val, int n)
14880 {
14881   if (target_big_endian)
14882     number_to_chars_bigendian (buf, val, n);
14883   else
14884     number_to_chars_littleendian (buf, val, n);
14885 }
14886 \f
14887 static int support_64bit_objects(void)
14888 {
14889   const char **list, **l;
14890   int yes;
14891
14892   list = bfd_target_list ();
14893   for (l = list; *l != NULL; l++)
14894     if (strcmp (*l, ELF_TARGET ("elf64-", "big")) == 0
14895         || strcmp (*l, ELF_TARGET ("elf64-", "little")) == 0)
14896       break;
14897   yes = (*l != NULL);
14898   free (list);
14899   return yes;
14900 }
14901
14902 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
14903    NEW_VALUE.  Warn if another value was already specified.  Note:
14904    we have to defer parsing the -march and -mtune arguments in order
14905    to handle 'from-abi' correctly, since the ABI might be specified
14906    in a later argument.  */
14907
14908 static void
14909 mips_set_option_string (const char **string_ptr, const char *new_value)
14910 {
14911   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
14912     as_warn (_("A different %s was already specified, is now %s"),
14913              string_ptr == &mips_arch_string ? "-march" : "-mtune",
14914              new_value);
14915
14916   *string_ptr = new_value;
14917 }
14918
14919 int
14920 md_parse_option (int c, char *arg)
14921 {
14922   unsigned int i;
14923
14924   for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
14925     if (c == mips_ases[i].option_on || c == mips_ases[i].option_off)
14926       {
14927         file_ase_explicit |= mips_set_ase (&mips_ases[i],
14928                                            c == mips_ases[i].option_on);
14929         return 1;
14930       }
14931
14932   switch (c)
14933     {
14934     case OPTION_CONSTRUCT_FLOATS:
14935       mips_disable_float_construction = 0;
14936       break;
14937
14938     case OPTION_NO_CONSTRUCT_FLOATS:
14939       mips_disable_float_construction = 1;
14940       break;
14941
14942     case OPTION_TRAP:
14943       mips_trap = 1;
14944       break;
14945
14946     case OPTION_BREAK:
14947       mips_trap = 0;
14948       break;
14949
14950     case OPTION_EB:
14951       target_big_endian = 1;
14952       break;
14953
14954     case OPTION_EL:
14955       target_big_endian = 0;
14956       break;
14957
14958     case 'O':
14959       if (arg == NULL)
14960         mips_optimize = 1;
14961       else if (arg[0] == '0')
14962         mips_optimize = 0;
14963       else if (arg[0] == '1')
14964         mips_optimize = 1;
14965       else
14966         mips_optimize = 2;
14967       break;
14968
14969     case 'g':
14970       if (arg == NULL)
14971         mips_debug = 2;
14972       else
14973         mips_debug = atoi (arg);
14974       break;
14975
14976     case OPTION_MIPS1:
14977       file_mips_isa = ISA_MIPS1;
14978       break;
14979
14980     case OPTION_MIPS2:
14981       file_mips_isa = ISA_MIPS2;
14982       break;
14983
14984     case OPTION_MIPS3:
14985       file_mips_isa = ISA_MIPS3;
14986       break;
14987
14988     case OPTION_MIPS4:
14989       file_mips_isa = ISA_MIPS4;
14990       break;
14991
14992     case OPTION_MIPS5:
14993       file_mips_isa = ISA_MIPS5;
14994       break;
14995
14996     case OPTION_MIPS32:
14997       file_mips_isa = ISA_MIPS32;
14998       break;
14999
15000     case OPTION_MIPS32R2:
15001       file_mips_isa = ISA_MIPS32R2;
15002       break;
15003
15004     case OPTION_MIPS64R2:
15005       file_mips_isa = ISA_MIPS64R2;
15006       break;
15007
15008     case OPTION_MIPS64:
15009       file_mips_isa = ISA_MIPS64;
15010       break;
15011
15012     case OPTION_MTUNE:
15013       mips_set_option_string (&mips_tune_string, arg);
15014       break;
15015
15016     case OPTION_MARCH:
15017       mips_set_option_string (&mips_arch_string, arg);
15018       break;
15019
15020     case OPTION_M4650:
15021       mips_set_option_string (&mips_arch_string, "4650");
15022       mips_set_option_string (&mips_tune_string, "4650");
15023       break;
15024
15025     case OPTION_NO_M4650:
15026       break;
15027
15028     case OPTION_M4010:
15029       mips_set_option_string (&mips_arch_string, "4010");
15030       mips_set_option_string (&mips_tune_string, "4010");
15031       break;
15032
15033     case OPTION_NO_M4010:
15034       break;
15035
15036     case OPTION_M4100:
15037       mips_set_option_string (&mips_arch_string, "4100");
15038       mips_set_option_string (&mips_tune_string, "4100");
15039       break;
15040
15041     case OPTION_NO_M4100:
15042       break;
15043
15044     case OPTION_M3900:
15045       mips_set_option_string (&mips_arch_string, "3900");
15046       mips_set_option_string (&mips_tune_string, "3900");
15047       break;
15048
15049     case OPTION_NO_M3900:
15050       break;
15051
15052     case OPTION_MICROMIPS:
15053       if (mips_opts.mips16 == 1)
15054         {
15055           as_bad (_("-mmicromips cannot be used with -mips16"));
15056           return 0;
15057         }
15058       mips_opts.micromips = 1;
15059       mips_no_prev_insn ();
15060       break;
15061
15062     case OPTION_NO_MICROMIPS:
15063       mips_opts.micromips = 0;
15064       mips_no_prev_insn ();
15065       break;
15066
15067     case OPTION_MIPS16:
15068       if (mips_opts.micromips == 1)
15069         {
15070           as_bad (_("-mips16 cannot be used with -micromips"));
15071           return 0;
15072         }
15073       mips_opts.mips16 = 1;
15074       mips_no_prev_insn ();
15075       break;
15076
15077     case OPTION_NO_MIPS16:
15078       mips_opts.mips16 = 0;
15079       mips_no_prev_insn ();
15080       break;
15081
15082     case OPTION_FIX_24K:
15083       mips_fix_24k = 1;
15084       break;
15085
15086     case OPTION_NO_FIX_24K:
15087       mips_fix_24k = 0;
15088       break;
15089
15090     case OPTION_FIX_LOONGSON2F_JUMP:
15091       mips_fix_loongson2f_jump = TRUE;
15092       break;
15093
15094     case OPTION_NO_FIX_LOONGSON2F_JUMP:
15095       mips_fix_loongson2f_jump = FALSE;
15096       break;
15097
15098     case OPTION_FIX_LOONGSON2F_NOP:
15099       mips_fix_loongson2f_nop = TRUE;
15100       break;
15101
15102     case OPTION_NO_FIX_LOONGSON2F_NOP:
15103       mips_fix_loongson2f_nop = FALSE;
15104       break;
15105
15106     case OPTION_FIX_VR4120:
15107       mips_fix_vr4120 = 1;
15108       break;
15109
15110     case OPTION_NO_FIX_VR4120:
15111       mips_fix_vr4120 = 0;
15112       break;
15113
15114     case OPTION_FIX_VR4130:
15115       mips_fix_vr4130 = 1;
15116       break;
15117
15118     case OPTION_NO_FIX_VR4130:
15119       mips_fix_vr4130 = 0;
15120       break;
15121
15122     case OPTION_FIX_CN63XXP1:
15123       mips_fix_cn63xxp1 = TRUE;
15124       break;
15125
15126     case OPTION_NO_FIX_CN63XXP1:
15127       mips_fix_cn63xxp1 = FALSE;
15128       break;
15129
15130     case OPTION_RELAX_BRANCH:
15131       mips_relax_branch = 1;
15132       break;
15133
15134     case OPTION_NO_RELAX_BRANCH:
15135       mips_relax_branch = 0;
15136       break;
15137
15138     case OPTION_MSHARED:
15139       mips_in_shared = TRUE;
15140       break;
15141
15142     case OPTION_MNO_SHARED:
15143       mips_in_shared = FALSE;
15144       break;
15145
15146     case OPTION_MSYM32:
15147       mips_opts.sym32 = TRUE;
15148       break;
15149
15150     case OPTION_MNO_SYM32:
15151       mips_opts.sym32 = FALSE;
15152       break;
15153
15154       /* When generating ELF code, we permit -KPIC and -call_shared to
15155          select SVR4_PIC, and -non_shared to select no PIC.  This is
15156          intended to be compatible with Irix 5.  */
15157     case OPTION_CALL_SHARED:
15158       mips_pic = SVR4_PIC;
15159       mips_abicalls = TRUE;
15160       break;
15161
15162     case OPTION_CALL_NONPIC:
15163       mips_pic = NO_PIC;
15164       mips_abicalls = TRUE;
15165       break;
15166
15167     case OPTION_NON_SHARED:
15168       mips_pic = NO_PIC;
15169       mips_abicalls = FALSE;
15170       break;
15171
15172       /* The -xgot option tells the assembler to use 32 bit offsets
15173          when accessing the got in SVR4_PIC mode.  It is for Irix
15174          compatibility.  */
15175     case OPTION_XGOT:
15176       mips_big_got = 1;
15177       break;
15178
15179     case 'G':
15180       g_switch_value = atoi (arg);
15181       g_switch_seen = 1;
15182       break;
15183
15184       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
15185          and -mabi=64.  */
15186     case OPTION_32:
15187       mips_abi = O32_ABI;
15188       break;
15189
15190     case OPTION_N32:
15191       mips_abi = N32_ABI;
15192       break;
15193
15194     case OPTION_64:
15195       mips_abi = N64_ABI;
15196       if (!support_64bit_objects())
15197         as_fatal (_("No compiled in support for 64 bit object file format"));
15198       break;
15199
15200     case OPTION_GP32:
15201       file_mips_gp32 = 1;
15202       break;
15203
15204     case OPTION_GP64:
15205       file_mips_gp32 = 0;
15206       break;
15207
15208     case OPTION_FP32:
15209       file_mips_fp32 = 1;
15210       break;
15211
15212     case OPTION_FP64:
15213       file_mips_fp32 = 0;
15214       break;
15215
15216     case OPTION_SINGLE_FLOAT:
15217       file_mips_single_float = 1;
15218       break;
15219
15220     case OPTION_DOUBLE_FLOAT:
15221       file_mips_single_float = 0;
15222       break;
15223
15224     case OPTION_SOFT_FLOAT:
15225       file_mips_soft_float = 1;
15226       break;
15227
15228     case OPTION_HARD_FLOAT:
15229       file_mips_soft_float = 0;
15230       break;
15231
15232     case OPTION_MABI:
15233       if (strcmp (arg, "32") == 0)
15234         mips_abi = O32_ABI;
15235       else if (strcmp (arg, "o64") == 0)
15236         mips_abi = O64_ABI;
15237       else if (strcmp (arg, "n32") == 0)
15238         mips_abi = N32_ABI;
15239       else if (strcmp (arg, "64") == 0)
15240         {
15241           mips_abi = N64_ABI;
15242           if (! support_64bit_objects())
15243             as_fatal (_("No compiled in support for 64 bit object file "
15244                         "format"));
15245         }
15246       else if (strcmp (arg, "eabi") == 0)
15247         mips_abi = EABI_ABI;
15248       else
15249         {
15250           as_fatal (_("invalid abi -mabi=%s"), arg);
15251           return 0;
15252         }
15253       break;
15254
15255     case OPTION_M7000_HILO_FIX:
15256       mips_7000_hilo_fix = TRUE;
15257       break;
15258
15259     case OPTION_MNO_7000_HILO_FIX:
15260       mips_7000_hilo_fix = FALSE;
15261       break;
15262
15263     case OPTION_MDEBUG:
15264       mips_flag_mdebug = TRUE;
15265       break;
15266
15267     case OPTION_NO_MDEBUG:
15268       mips_flag_mdebug = FALSE;
15269       break;
15270
15271     case OPTION_PDR:
15272       mips_flag_pdr = TRUE;
15273       break;
15274
15275     case OPTION_NO_PDR:
15276       mips_flag_pdr = FALSE;
15277       break;
15278
15279     case OPTION_MVXWORKS_PIC:
15280       mips_pic = VXWORKS_PIC;
15281       break;
15282
15283     default:
15284       return 0;
15285     }
15286
15287     mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
15288
15289   return 1;
15290 }
15291 \f
15292 /* Set up globals to generate code for the ISA or processor
15293    described by INFO.  */
15294
15295 static void
15296 mips_set_architecture (const struct mips_cpu_info *info)
15297 {
15298   if (info != 0)
15299     {
15300       file_mips_arch = info->cpu;
15301       mips_opts.arch = info->cpu;
15302       mips_opts.isa = info->isa;
15303     }
15304 }
15305
15306
15307 /* Likewise for tuning.  */
15308
15309 static void
15310 mips_set_tune (const struct mips_cpu_info *info)
15311 {
15312   if (info != 0)
15313     mips_tune = info->cpu;
15314 }
15315
15316
15317 void
15318 mips_after_parse_args (void)
15319 {
15320   const struct mips_cpu_info *arch_info = 0;
15321   const struct mips_cpu_info *tune_info = 0;
15322
15323   /* GP relative stuff not working for PE */
15324   if (strncmp (TARGET_OS, "pe", 2) == 0)
15325     {
15326       if (g_switch_seen && g_switch_value != 0)
15327         as_bad (_("-G not supported in this configuration."));
15328       g_switch_value = 0;
15329     }
15330
15331   if (mips_abi == NO_ABI)
15332     mips_abi = MIPS_DEFAULT_ABI;
15333
15334   /* The following code determines the architecture and register size.
15335      Similar code was added to GCC 3.3 (see override_options() in
15336      config/mips/mips.c).  The GAS and GCC code should be kept in sync
15337      as much as possible.  */
15338
15339   if (mips_arch_string != 0)
15340     arch_info = mips_parse_cpu ("-march", mips_arch_string);
15341
15342   if (file_mips_isa != ISA_UNKNOWN)
15343     {
15344       /* Handle -mipsN.  At this point, file_mips_isa contains the
15345          ISA level specified by -mipsN, while arch_info->isa contains
15346          the -march selection (if any).  */
15347       if (arch_info != 0)
15348         {
15349           /* -march takes precedence over -mipsN, since it is more descriptive.
15350              There's no harm in specifying both as long as the ISA levels
15351              are the same.  */
15352           if (file_mips_isa != arch_info->isa)
15353             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
15354                     mips_cpu_info_from_isa (file_mips_isa)->name,
15355                     mips_cpu_info_from_isa (arch_info->isa)->name);
15356         }
15357       else
15358         arch_info = mips_cpu_info_from_isa (file_mips_isa);
15359     }
15360
15361   if (arch_info == 0)
15362     {
15363       arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
15364       gas_assert (arch_info);
15365     }
15366
15367   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
15368     as_bad (_("-march=%s is not compatible with the selected ABI"),
15369             arch_info->name);
15370
15371   mips_set_architecture (arch_info);
15372
15373   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
15374   if (mips_tune_string != 0)
15375     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
15376
15377   if (tune_info == 0)
15378     mips_set_tune (arch_info);
15379   else
15380     mips_set_tune (tune_info);
15381
15382   if (file_mips_gp32 >= 0)
15383     {
15384       /* The user specified the size of the integer registers.  Make sure
15385          it agrees with the ABI and ISA.  */
15386       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
15387         as_bad (_("-mgp64 used with a 32-bit processor"));
15388       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
15389         as_bad (_("-mgp32 used with a 64-bit ABI"));
15390       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
15391         as_bad (_("-mgp64 used with a 32-bit ABI"));
15392     }
15393   else
15394     {
15395       /* Infer the integer register size from the ABI and processor.
15396          Restrict ourselves to 32-bit registers if that's all the
15397          processor has, or if the ABI cannot handle 64-bit registers.  */
15398       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
15399                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
15400     }
15401
15402   switch (file_mips_fp32)
15403     {
15404     default:
15405     case -1:
15406       /* No user specified float register size.
15407          ??? GAS treats single-float processors as though they had 64-bit
15408          float registers (although it complains when double-precision
15409          instructions are used).  As things stand, saying they have 32-bit
15410          registers would lead to spurious "register must be even" messages.
15411          So here we assume float registers are never smaller than the
15412          integer ones.  */
15413       if (file_mips_gp32 == 0)
15414         /* 64-bit integer registers implies 64-bit float registers.  */
15415         file_mips_fp32 = 0;
15416       else if ((mips_opts.ase & FP64_ASES)
15417                && ISA_HAS_64BIT_FPRS (mips_opts.isa))
15418         /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
15419         file_mips_fp32 = 0;
15420       else
15421         /* 32-bit float registers.  */
15422         file_mips_fp32 = 1;
15423       break;
15424
15425     /* The user specified the size of the float registers.  Check if it
15426        agrees with the ABI and ISA.  */
15427     case 0:
15428       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
15429         as_bad (_("-mfp64 used with a 32-bit fpu"));
15430       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
15431                && !ISA_HAS_MXHC1 (mips_opts.isa))
15432         as_warn (_("-mfp64 used with a 32-bit ABI"));
15433       break;
15434     case 1:
15435       if (ABI_NEEDS_64BIT_REGS (mips_abi))
15436         as_warn (_("-mfp32 used with a 64-bit ABI"));
15437       break;
15438     }
15439
15440   /* End of GCC-shared inference code.  */
15441
15442   /* This flag is set when we have a 64-bit capable CPU but use only
15443      32-bit wide registers.  Note that EABI does not use it.  */
15444   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
15445       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
15446           || mips_abi == O32_ABI))
15447     mips_32bitmode = 1;
15448
15449   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
15450     as_bad (_("trap exception not supported at ISA 1"));
15451
15452   /* If the selected architecture includes support for ASEs, enable
15453      generation of code for them.  */
15454   if (mips_opts.mips16 == -1)
15455     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
15456   if (mips_opts.micromips == -1)
15457     mips_opts.micromips = (CPU_HAS_MICROMIPS (file_mips_arch)) ? 1 : 0;
15458
15459   /* MIPS3D and MDMX require 64-bit FPRs, so -mfp32 should stop those
15460      ASEs from being selected implicitly.  */
15461   if (file_mips_fp32 == 1)
15462     file_ase_explicit |= ASE_MIPS3D | ASE_MDMX;
15463
15464   /* If the user didn't explicitly select or deselect a particular ASE,
15465      use the default setting for the CPU.  */
15466   mips_opts.ase |= (arch_info->ase & ~file_ase_explicit);
15467
15468   file_mips_isa = mips_opts.isa;
15469   file_ase = mips_opts.ase;
15470   mips_opts.gp32 = file_mips_gp32;
15471   mips_opts.fp32 = file_mips_fp32;
15472   mips_opts.soft_float = file_mips_soft_float;
15473   mips_opts.single_float = file_mips_single_float;
15474
15475   mips_check_isa_supports_ases ();
15476
15477   if (mips_flag_mdebug < 0)
15478     mips_flag_mdebug = 0;
15479 }
15480 \f
15481 void
15482 mips_init_after_args (void)
15483 {
15484   /* initialize opcodes */
15485   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
15486   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
15487 }
15488
15489 long
15490 md_pcrel_from (fixS *fixP)
15491 {
15492   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
15493   switch (fixP->fx_r_type)
15494     {
15495     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15496     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15497       /* Return the address of the delay slot.  */
15498       return addr + 2;
15499
15500     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15501     case BFD_RELOC_MICROMIPS_JMP:
15502     case BFD_RELOC_16_PCREL_S2:
15503     case BFD_RELOC_MIPS_JMP:
15504       /* Return the address of the delay slot.  */
15505       return addr + 4;
15506
15507     case BFD_RELOC_32_PCREL:
15508       return addr;
15509
15510     default:
15511       /* We have no relocation type for PC relative MIPS16 instructions.  */
15512       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
15513         as_bad_where (fixP->fx_file, fixP->fx_line,
15514                       _("PC relative MIPS16 instruction references a different section"));
15515       return addr;
15516     }
15517 }
15518
15519 /* This is called before the symbol table is processed.  In order to
15520    work with gcc when using mips-tfile, we must keep all local labels.
15521    However, in other cases, we want to discard them.  If we were
15522    called with -g, but we didn't see any debugging information, it may
15523    mean that gcc is smuggling debugging information through to
15524    mips-tfile, in which case we must generate all local labels.  */
15525
15526 void
15527 mips_frob_file_before_adjust (void)
15528 {
15529 #ifndef NO_ECOFF_DEBUGGING
15530   if (ECOFF_DEBUGGING
15531       && mips_debug != 0
15532       && ! ecoff_debugging_seen)
15533     flag_keep_locals = 1;
15534 #endif
15535 }
15536
15537 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
15538    the corresponding LO16 reloc.  This is called before md_apply_fix and
15539    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
15540    relocation operators.
15541
15542    For our purposes, a %lo() expression matches a %got() or %hi()
15543    expression if:
15544
15545       (a) it refers to the same symbol; and
15546       (b) the offset applied in the %lo() expression is no lower than
15547           the offset applied in the %got() or %hi().
15548
15549    (b) allows us to cope with code like:
15550
15551         lui     $4,%hi(foo)
15552         lh      $4,%lo(foo+2)($4)
15553
15554    ...which is legal on RELA targets, and has a well-defined behaviour
15555    if the user knows that adding 2 to "foo" will not induce a carry to
15556    the high 16 bits.
15557
15558    When several %lo()s match a particular %got() or %hi(), we use the
15559    following rules to distinguish them:
15560
15561      (1) %lo()s with smaller offsets are a better match than %lo()s with
15562          higher offsets.
15563
15564      (2) %lo()s with no matching %got() or %hi() are better than those
15565          that already have a matching %got() or %hi().
15566
15567      (3) later %lo()s are better than earlier %lo()s.
15568
15569    These rules are applied in order.
15570
15571    (1) means, among other things, that %lo()s with identical offsets are
15572    chosen if they exist.
15573
15574    (2) means that we won't associate several high-part relocations with
15575    the same low-part relocation unless there's no alternative.  Having
15576    several high parts for the same low part is a GNU extension; this rule
15577    allows careful users to avoid it.
15578
15579    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
15580    with the last high-part relocation being at the front of the list.
15581    It therefore makes sense to choose the last matching low-part
15582    relocation, all other things being equal.  It's also easier
15583    to code that way.  */
15584
15585 void
15586 mips_frob_file (void)
15587 {
15588   struct mips_hi_fixup *l;
15589   bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
15590
15591   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
15592     {
15593       segment_info_type *seginfo;
15594       bfd_boolean matched_lo_p;
15595       fixS **hi_pos, **lo_pos, **pos;
15596
15597       gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
15598
15599       /* If a GOT16 relocation turns out to be against a global symbol,
15600          there isn't supposed to be a matching LO.  Ignore %gots against
15601          constants; we'll report an error for those later.  */
15602       if (got16_reloc_p (l->fixp->fx_r_type)
15603           && !(l->fixp->fx_addsy
15604                && pic_need_relax (l->fixp->fx_addsy, l->seg)))
15605         continue;
15606
15607       /* Check quickly whether the next fixup happens to be a matching %lo.  */
15608       if (fixup_has_matching_lo_p (l->fixp))
15609         continue;
15610
15611       seginfo = seg_info (l->seg);
15612
15613       /* Set HI_POS to the position of this relocation in the chain.
15614          Set LO_POS to the position of the chosen low-part relocation.
15615          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
15616          relocation that matches an immediately-preceding high-part
15617          relocation.  */
15618       hi_pos = NULL;
15619       lo_pos = NULL;
15620       matched_lo_p = FALSE;
15621       looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
15622
15623       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
15624         {
15625           if (*pos == l->fixp)
15626             hi_pos = pos;
15627
15628           if ((*pos)->fx_r_type == looking_for_rtype
15629               && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
15630               && (*pos)->fx_offset >= l->fixp->fx_offset
15631               && (lo_pos == NULL
15632                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
15633                   || (!matched_lo_p
15634                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
15635             lo_pos = pos;
15636
15637           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
15638                           && fixup_has_matching_lo_p (*pos));
15639         }
15640
15641       /* If we found a match, remove the high-part relocation from its
15642          current position and insert it before the low-part relocation.
15643          Make the offsets match so that fixup_has_matching_lo_p()
15644          will return true.
15645
15646          We don't warn about unmatched high-part relocations since some
15647          versions of gcc have been known to emit dead "lui ...%hi(...)"
15648          instructions.  */
15649       if (lo_pos != NULL)
15650         {
15651           l->fixp->fx_offset = (*lo_pos)->fx_offset;
15652           if (l->fixp->fx_next != *lo_pos)
15653             {
15654               *hi_pos = l->fixp->fx_next;
15655               l->fixp->fx_next = *lo_pos;
15656               *lo_pos = l->fixp;
15657             }
15658         }
15659     }
15660 }
15661
15662 int
15663 mips_force_relocation (fixS *fixp)
15664 {
15665   if (generic_force_reloc (fixp))
15666     return 1;
15667
15668   /* We want to keep BFD_RELOC_MICROMIPS_*_PCREL_S1 relocation,
15669      so that the linker relaxation can update targets.  */
15670   if (fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15671       || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15672       || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1)
15673     return 1;
15674
15675   return 0;
15676 }
15677
15678 /* Read the instruction associated with RELOC from BUF.  */
15679
15680 static unsigned int
15681 read_reloc_insn (char *buf, bfd_reloc_code_real_type reloc)
15682 {
15683   if (mips16_reloc_p (reloc) || micromips_reloc_p (reloc))
15684     return read_compressed_insn (buf, 4);
15685   else
15686     return read_insn (buf);
15687 }
15688
15689 /* Write instruction INSN to BUF, given that it has been relocated
15690    by RELOC.  */
15691
15692 static void
15693 write_reloc_insn (char *buf, bfd_reloc_code_real_type reloc,
15694                   unsigned long insn)
15695 {
15696   if (mips16_reloc_p (reloc) || micromips_reloc_p (reloc))
15697     write_compressed_insn (buf, insn, 4);
15698   else
15699     write_insn (buf, insn);
15700 }
15701
15702 /* Apply a fixup to the object file.  */
15703
15704 void
15705 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
15706 {
15707   char *buf;
15708   unsigned long insn;
15709   reloc_howto_type *howto;
15710
15711   /* We ignore generic BFD relocations we don't know about.  */
15712   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
15713   if (! howto)
15714     return;
15715
15716   gas_assert (fixP->fx_size == 2
15717               || fixP->fx_size == 4
15718               || fixP->fx_r_type == BFD_RELOC_16
15719               || fixP->fx_r_type == BFD_RELOC_64
15720               || fixP->fx_r_type == BFD_RELOC_CTOR
15721               || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
15722               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_SUB
15723               || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
15724               || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
15725               || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
15726
15727   buf = fixP->fx_frag->fr_literal + fixP->fx_where;
15728
15729   gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
15730               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15731               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15732               || fixP->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1
15733               || fixP->fx_r_type == BFD_RELOC_32_PCREL);
15734
15735   /* Don't treat parts of a composite relocation as done.  There are two
15736      reasons for this:
15737
15738      (1) The second and third parts will be against 0 (RSS_UNDEF) but
15739          should nevertheless be emitted if the first part is.
15740
15741      (2) In normal usage, composite relocations are never assembly-time
15742          constants.  The easiest way of dealing with the pathological
15743          exceptions is to generate a relocation against STN_UNDEF and
15744          leave everything up to the linker.  */
15745   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
15746     fixP->fx_done = 1;
15747
15748   switch (fixP->fx_r_type)
15749     {
15750     case BFD_RELOC_MIPS_TLS_GD:
15751     case BFD_RELOC_MIPS_TLS_LDM:
15752     case BFD_RELOC_MIPS_TLS_DTPREL32:
15753     case BFD_RELOC_MIPS_TLS_DTPREL64:
15754     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
15755     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
15756     case BFD_RELOC_MIPS_TLS_GOTTPREL:
15757     case BFD_RELOC_MIPS_TLS_TPREL32:
15758     case BFD_RELOC_MIPS_TLS_TPREL64:
15759     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
15760     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
15761     case BFD_RELOC_MICROMIPS_TLS_GD:
15762     case BFD_RELOC_MICROMIPS_TLS_LDM:
15763     case BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16:
15764     case BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16:
15765     case BFD_RELOC_MICROMIPS_TLS_GOTTPREL:
15766     case BFD_RELOC_MICROMIPS_TLS_TPREL_HI16:
15767     case BFD_RELOC_MICROMIPS_TLS_TPREL_LO16:
15768     case BFD_RELOC_MIPS16_TLS_GD:
15769     case BFD_RELOC_MIPS16_TLS_LDM:
15770     case BFD_RELOC_MIPS16_TLS_DTPREL_HI16:
15771     case BFD_RELOC_MIPS16_TLS_DTPREL_LO16:
15772     case BFD_RELOC_MIPS16_TLS_GOTTPREL:
15773     case BFD_RELOC_MIPS16_TLS_TPREL_HI16:
15774     case BFD_RELOC_MIPS16_TLS_TPREL_LO16:
15775       if (!fixP->fx_addsy)
15776         {
15777           as_bad_where (fixP->fx_file, fixP->fx_line,
15778                         _("TLS relocation against a constant"));
15779           break;
15780         }
15781       S_SET_THREAD_LOCAL (fixP->fx_addsy);
15782       /* fall through */
15783
15784     case BFD_RELOC_MIPS_JMP:
15785     case BFD_RELOC_MIPS_SHIFT5:
15786     case BFD_RELOC_MIPS_SHIFT6:
15787     case BFD_RELOC_MIPS_GOT_DISP:
15788     case BFD_RELOC_MIPS_GOT_PAGE:
15789     case BFD_RELOC_MIPS_GOT_OFST:
15790     case BFD_RELOC_MIPS_SUB:
15791     case BFD_RELOC_MIPS_INSERT_A:
15792     case BFD_RELOC_MIPS_INSERT_B:
15793     case BFD_RELOC_MIPS_DELETE:
15794     case BFD_RELOC_MIPS_HIGHEST:
15795     case BFD_RELOC_MIPS_HIGHER:
15796     case BFD_RELOC_MIPS_SCN_DISP:
15797     case BFD_RELOC_MIPS_REL16:
15798     case BFD_RELOC_MIPS_RELGOT:
15799     case BFD_RELOC_MIPS_JALR:
15800     case BFD_RELOC_HI16:
15801     case BFD_RELOC_HI16_S:
15802     case BFD_RELOC_LO16:
15803     case BFD_RELOC_GPREL16:
15804     case BFD_RELOC_MIPS_LITERAL:
15805     case BFD_RELOC_MIPS_CALL16:
15806     case BFD_RELOC_MIPS_GOT16:
15807     case BFD_RELOC_GPREL32:
15808     case BFD_RELOC_MIPS_GOT_HI16:
15809     case BFD_RELOC_MIPS_GOT_LO16:
15810     case BFD_RELOC_MIPS_CALL_HI16:
15811     case BFD_RELOC_MIPS_CALL_LO16:
15812     case BFD_RELOC_MIPS16_GPREL:
15813     case BFD_RELOC_MIPS16_GOT16:
15814     case BFD_RELOC_MIPS16_CALL16:
15815     case BFD_RELOC_MIPS16_HI16:
15816     case BFD_RELOC_MIPS16_HI16_S:
15817     case BFD_RELOC_MIPS16_LO16:
15818     case BFD_RELOC_MIPS16_JMP:
15819     case BFD_RELOC_MICROMIPS_JMP:
15820     case BFD_RELOC_MICROMIPS_GOT_DISP:
15821     case BFD_RELOC_MICROMIPS_GOT_PAGE:
15822     case BFD_RELOC_MICROMIPS_GOT_OFST:
15823     case BFD_RELOC_MICROMIPS_SUB:
15824     case BFD_RELOC_MICROMIPS_HIGHEST:
15825     case BFD_RELOC_MICROMIPS_HIGHER:
15826     case BFD_RELOC_MICROMIPS_SCN_DISP:
15827     case BFD_RELOC_MICROMIPS_JALR:
15828     case BFD_RELOC_MICROMIPS_HI16:
15829     case BFD_RELOC_MICROMIPS_HI16_S:
15830     case BFD_RELOC_MICROMIPS_LO16:
15831     case BFD_RELOC_MICROMIPS_GPREL16:
15832     case BFD_RELOC_MICROMIPS_LITERAL:
15833     case BFD_RELOC_MICROMIPS_CALL16:
15834     case BFD_RELOC_MICROMIPS_GOT16:
15835     case BFD_RELOC_MICROMIPS_GOT_HI16:
15836     case BFD_RELOC_MICROMIPS_GOT_LO16:
15837     case BFD_RELOC_MICROMIPS_CALL_HI16:
15838     case BFD_RELOC_MICROMIPS_CALL_LO16:
15839     case BFD_RELOC_MIPS_EH:
15840       if (fixP->fx_done)
15841         {
15842           offsetT value;
15843
15844           if (calculate_reloc (fixP->fx_r_type, *valP, &value))
15845             {
15846               insn = read_reloc_insn (buf, fixP->fx_r_type);
15847               if (mips16_reloc_p (fixP->fx_r_type))
15848                 insn |= mips16_immed_extend (value, 16);
15849               else
15850                 insn |= (value & 0xffff);
15851               write_reloc_insn (buf, fixP->fx_r_type, insn);
15852             }
15853           else
15854             as_bad_where (fixP->fx_file, fixP->fx_line,
15855                           _("Unsupported constant in relocation"));
15856         }
15857       break;
15858
15859     case BFD_RELOC_64:
15860       /* This is handled like BFD_RELOC_32, but we output a sign
15861          extended value if we are only 32 bits.  */
15862       if (fixP->fx_done)
15863         {
15864           if (8 <= sizeof (valueT))
15865             md_number_to_chars (buf, *valP, 8);
15866           else
15867             {
15868               valueT hiv;
15869
15870               if ((*valP & 0x80000000) != 0)
15871                 hiv = 0xffffffff;
15872               else
15873                 hiv = 0;
15874               md_number_to_chars (buf + (target_big_endian ? 4 : 0), *valP, 4);
15875               md_number_to_chars (buf + (target_big_endian ? 0 : 4), hiv, 4);
15876             }
15877         }
15878       break;
15879
15880     case BFD_RELOC_RVA:
15881     case BFD_RELOC_32:
15882     case BFD_RELOC_32_PCREL:
15883     case BFD_RELOC_16:
15884       /* If we are deleting this reloc entry, we must fill in the
15885          value now.  This can happen if we have a .word which is not
15886          resolved when it appears but is later defined.  */
15887       if (fixP->fx_done)
15888         md_number_to_chars (buf, *valP, fixP->fx_size);
15889       break;
15890
15891     case BFD_RELOC_16_PCREL_S2:
15892       if ((*valP & 0x3) != 0)
15893         as_bad_where (fixP->fx_file, fixP->fx_line,
15894                       _("Branch to misaligned address (%lx)"), (long) *valP);
15895
15896       /* We need to save the bits in the instruction since fixup_segment()
15897          might be deleting the relocation entry (i.e., a branch within
15898          the current segment).  */
15899       if (! fixP->fx_done)
15900         break;
15901
15902       /* Update old instruction data.  */
15903       insn = read_insn (buf);
15904
15905       if (*valP + 0x20000 <= 0x3ffff)
15906         {
15907           insn |= (*valP >> 2) & 0xffff;
15908           write_insn (buf, insn);
15909         }
15910       else if (mips_pic == NO_PIC
15911                && fixP->fx_done
15912                && fixP->fx_frag->fr_address >= text_section->vma
15913                && (fixP->fx_frag->fr_address
15914                    < text_section->vma + bfd_get_section_size (text_section))
15915                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
15916                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
15917                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
15918         {
15919           /* The branch offset is too large.  If this is an
15920              unconditional branch, and we are not generating PIC code,
15921              we can convert it to an absolute jump instruction.  */
15922           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
15923             insn = 0x0c000000;  /* jal */
15924           else
15925             insn = 0x08000000;  /* j */
15926           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
15927           fixP->fx_done = 0;
15928           fixP->fx_addsy = section_symbol (text_section);
15929           *valP += md_pcrel_from (fixP);
15930           write_insn (buf, insn);
15931         }
15932       else
15933         {
15934           /* If we got here, we have branch-relaxation disabled,
15935              and there's nothing we can do to fix this instruction
15936              without turning it into a longer sequence.  */
15937           as_bad_where (fixP->fx_file, fixP->fx_line,
15938                         _("Branch out of range"));
15939         }
15940       break;
15941
15942     case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15943     case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15944     case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15945       /* We adjust the offset back to even.  */
15946       if ((*valP & 0x1) != 0)
15947         --(*valP);
15948
15949       if (! fixP->fx_done)
15950         break;
15951
15952       /* Should never visit here, because we keep the relocation.  */
15953       abort ();
15954       break;
15955
15956     case BFD_RELOC_VTABLE_INHERIT:
15957       fixP->fx_done = 0;
15958       if (fixP->fx_addsy
15959           && !S_IS_DEFINED (fixP->fx_addsy)
15960           && !S_IS_WEAK (fixP->fx_addsy))
15961         S_SET_WEAK (fixP->fx_addsy);
15962       break;
15963
15964     case BFD_RELOC_VTABLE_ENTRY:
15965       fixP->fx_done = 0;
15966       break;
15967
15968     default:
15969       abort ();
15970     }
15971
15972   /* Remember value for tc_gen_reloc.  */
15973   fixP->fx_addnumber = *valP;
15974 }
15975
15976 static symbolS *
15977 get_symbol (void)
15978 {
15979   int c;
15980   char *name;
15981   symbolS *p;
15982
15983   name = input_line_pointer;
15984   c = get_symbol_end ();
15985   p = (symbolS *) symbol_find_or_make (name);
15986   *input_line_pointer = c;
15987   return p;
15988 }
15989
15990 /* Align the current frag to a given power of two.  If a particular
15991    fill byte should be used, FILL points to an integer that contains
15992    that byte, otherwise FILL is null.
15993
15994    This function used to have the comment:
15995
15996       The MIPS assembler also automatically adjusts any preceding label.
15997
15998    The implementation therefore applied the adjustment to a maximum of
15999    one label.  However, other label adjustments are applied to batches
16000    of labels, and adjusting just one caused problems when new labels
16001    were added for the sake of debugging or unwind information.
16002    We therefore adjust all preceding labels (given as LABELS) instead.  */
16003
16004 static void
16005 mips_align (int to, int *fill, struct insn_label_list *labels)
16006 {
16007   mips_emit_delays ();
16008   mips_record_compressed_mode ();
16009   if (fill == NULL && subseg_text_p (now_seg))
16010     frag_align_code (to, 0);
16011   else
16012     frag_align (to, fill ? *fill : 0, 0);
16013   record_alignment (now_seg, to);
16014   mips_move_labels (labels, FALSE);
16015 }
16016
16017 /* Align to a given power of two.  .align 0 turns off the automatic
16018    alignment used by the data creating pseudo-ops.  */
16019
16020 static void
16021 s_align (int x ATTRIBUTE_UNUSED)
16022 {
16023   int temp, fill_value, *fill_ptr;
16024   long max_alignment = 28;
16025
16026   /* o Note that the assembler pulls down any immediately preceding label
16027        to the aligned address.
16028      o It's not documented but auto alignment is reinstated by
16029        a .align pseudo instruction.
16030      o Note also that after auto alignment is turned off the mips assembler
16031        issues an error on attempt to assemble an improperly aligned data item.
16032        We don't.  */
16033
16034   temp = get_absolute_expression ();
16035   if (temp > max_alignment)
16036     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
16037   else if (temp < 0)
16038     {
16039       as_warn (_("Alignment negative: 0 assumed."));
16040       temp = 0;
16041     }
16042   if (*input_line_pointer == ',')
16043     {
16044       ++input_line_pointer;
16045       fill_value = get_absolute_expression ();
16046       fill_ptr = &fill_value;
16047     }
16048   else
16049     fill_ptr = 0;
16050   if (temp)
16051     {
16052       segment_info_type *si = seg_info (now_seg);
16053       struct insn_label_list *l = si->label_list;
16054       /* Auto alignment should be switched on by next section change.  */
16055       auto_align = 1;
16056       mips_align (temp, fill_ptr, l);
16057     }
16058   else
16059     {
16060       auto_align = 0;
16061     }
16062
16063   demand_empty_rest_of_line ();
16064 }
16065
16066 static void
16067 s_change_sec (int sec)
16068 {
16069   segT seg;
16070
16071   /* The ELF backend needs to know that we are changing sections, so
16072      that .previous works correctly.  We could do something like check
16073      for an obj_section_change_hook macro, but that might be confusing
16074      as it would not be appropriate to use it in the section changing
16075      functions in read.c, since obj-elf.c intercepts those.  FIXME:
16076      This should be cleaner, somehow.  */
16077   obj_elf_section_change_hook ();
16078
16079   mips_emit_delays ();
16080
16081   switch (sec)
16082     {
16083     case 't':
16084       s_text (0);
16085       break;
16086     case 'd':
16087       s_data (0);
16088       break;
16089     case 'b':
16090       subseg_set (bss_section, (subsegT) get_absolute_expression ());
16091       demand_empty_rest_of_line ();
16092       break;
16093
16094     case 'r':
16095       seg = subseg_new (RDATA_SECTION_NAME,
16096                         (subsegT) get_absolute_expression ());
16097       bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
16098                                               | SEC_READONLY | SEC_RELOC
16099                                               | SEC_DATA));
16100       if (strncmp (TARGET_OS, "elf", 3) != 0)
16101         record_alignment (seg, 4);
16102       demand_empty_rest_of_line ();
16103       break;
16104
16105     case 's':
16106       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
16107       bfd_set_section_flags (stdoutput, seg,
16108                              SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
16109       if (strncmp (TARGET_OS, "elf", 3) != 0)
16110         record_alignment (seg, 4);
16111       demand_empty_rest_of_line ();
16112       break;
16113
16114     case 'B':
16115       seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
16116       bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
16117       if (strncmp (TARGET_OS, "elf", 3) != 0)
16118         record_alignment (seg, 4);
16119       demand_empty_rest_of_line ();
16120       break;
16121     }
16122
16123   auto_align = 1;
16124 }
16125
16126 void
16127 s_change_section (int ignore ATTRIBUTE_UNUSED)
16128 {
16129   char *section_name;
16130   char c;
16131   char next_c = 0;
16132   int section_type;
16133   int section_flag;
16134   int section_entry_size;
16135   int section_alignment;
16136
16137   section_name = input_line_pointer;
16138   c = get_symbol_end ();
16139   if (c)
16140     next_c = *(input_line_pointer + 1);
16141
16142   /* Do we have .section Name<,"flags">?  */
16143   if (c != ',' || (c == ',' && next_c == '"'))
16144     {
16145       /* just after name is now '\0'.  */
16146       *input_line_pointer = c;
16147       input_line_pointer = section_name;
16148       obj_elf_section (ignore);
16149       return;
16150     }
16151   input_line_pointer++;
16152
16153   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
16154   if (c == ',')
16155     section_type = get_absolute_expression ();
16156   else
16157     section_type = 0;
16158   if (*input_line_pointer++ == ',')
16159     section_flag = get_absolute_expression ();
16160   else
16161     section_flag = 0;
16162   if (*input_line_pointer++ == ',')
16163     section_entry_size = get_absolute_expression ();
16164   else
16165     section_entry_size = 0;
16166   if (*input_line_pointer++ == ',')
16167     section_alignment = get_absolute_expression ();
16168   else
16169     section_alignment = 0;
16170   /* FIXME: really ignore?  */
16171   (void) section_alignment;
16172
16173   section_name = xstrdup (section_name);
16174
16175   /* When using the generic form of .section (as implemented by obj-elf.c),
16176      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
16177      traditionally had to fall back on the more common @progbits instead.
16178
16179      There's nothing really harmful in this, since bfd will correct
16180      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
16181      means that, for backwards compatibility, the special_section entries
16182      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
16183
16184      Even so, we shouldn't force users of the MIPS .section syntax to
16185      incorrectly label the sections as SHT_PROGBITS.  The best compromise
16186      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
16187      generic type-checking code.  */
16188   if (section_type == SHT_MIPS_DWARF)
16189     section_type = SHT_PROGBITS;
16190
16191   obj_elf_change_section (section_name, section_type, section_flag,
16192                           section_entry_size, 0, 0, 0);
16193
16194   if (now_seg->name != section_name)
16195     free (section_name);
16196 }
16197
16198 void
16199 mips_enable_auto_align (void)
16200 {
16201   auto_align = 1;
16202 }
16203
16204 static void
16205 s_cons (int log_size)
16206 {
16207   segment_info_type *si = seg_info (now_seg);
16208   struct insn_label_list *l = si->label_list;
16209
16210   mips_emit_delays ();
16211   if (log_size > 0 && auto_align)
16212     mips_align (log_size, 0, l);
16213   cons (1 << log_size);
16214   mips_clear_insn_labels ();
16215 }
16216
16217 static void
16218 s_float_cons (int type)
16219 {
16220   segment_info_type *si = seg_info (now_seg);
16221   struct insn_label_list *l = si->label_list;
16222
16223   mips_emit_delays ();
16224
16225   if (auto_align)
16226     {
16227       if (type == 'd')
16228         mips_align (3, 0, l);
16229       else
16230         mips_align (2, 0, l);
16231     }
16232
16233   float_cons (type);
16234   mips_clear_insn_labels ();
16235 }
16236
16237 /* Handle .globl.  We need to override it because on Irix 5 you are
16238    permitted to say
16239        .globl foo .text
16240    where foo is an undefined symbol, to mean that foo should be
16241    considered to be the address of a function.  */
16242
16243 static void
16244 s_mips_globl (int x ATTRIBUTE_UNUSED)
16245 {
16246   char *name;
16247   int c;
16248   symbolS *symbolP;
16249   flagword flag;
16250
16251   do
16252     {
16253       name = input_line_pointer;
16254       c = get_symbol_end ();
16255       symbolP = symbol_find_or_make (name);
16256       S_SET_EXTERNAL (symbolP);
16257
16258       *input_line_pointer = c;
16259       SKIP_WHITESPACE ();
16260
16261       /* On Irix 5, every global symbol that is not explicitly labelled as
16262          being a function is apparently labelled as being an object.  */
16263       flag = BSF_OBJECT;
16264
16265       if (!is_end_of_line[(unsigned char) *input_line_pointer]
16266           && (*input_line_pointer != ','))
16267         {
16268           char *secname;
16269           asection *sec;
16270
16271           secname = input_line_pointer;
16272           c = get_symbol_end ();
16273           sec = bfd_get_section_by_name (stdoutput, secname);
16274           if (sec == NULL)
16275             as_bad (_("%s: no such section"), secname);
16276           *input_line_pointer = c;
16277
16278           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
16279             flag = BSF_FUNCTION;
16280         }
16281
16282       symbol_get_bfdsym (symbolP)->flags |= flag;
16283
16284       c = *input_line_pointer;
16285       if (c == ',')
16286         {
16287           input_line_pointer++;
16288           SKIP_WHITESPACE ();
16289           if (is_end_of_line[(unsigned char) *input_line_pointer])
16290             c = '\n';
16291         }
16292     }
16293   while (c == ',');
16294
16295   demand_empty_rest_of_line ();
16296 }
16297
16298 static void
16299 s_option (int x ATTRIBUTE_UNUSED)
16300 {
16301   char *opt;
16302   char c;
16303
16304   opt = input_line_pointer;
16305   c = get_symbol_end ();
16306
16307   if (*opt == 'O')
16308     {
16309       /* FIXME: What does this mean?  */
16310     }
16311   else if (strncmp (opt, "pic", 3) == 0)
16312     {
16313       int i;
16314
16315       i = atoi (opt + 3);
16316       if (i == 0)
16317         mips_pic = NO_PIC;
16318       else if (i == 2)
16319         {
16320           mips_pic = SVR4_PIC;
16321           mips_abicalls = TRUE;
16322         }
16323       else
16324         as_bad (_(".option pic%d not supported"), i);
16325
16326       if (mips_pic == SVR4_PIC)
16327         {
16328           if (g_switch_seen && g_switch_value != 0)
16329             as_warn (_("-G may not be used with SVR4 PIC code"));
16330           g_switch_value = 0;
16331           bfd_set_gp_size (stdoutput, 0);
16332         }
16333     }
16334   else
16335     as_warn (_("Unrecognized option \"%s\""), opt);
16336
16337   *input_line_pointer = c;
16338   demand_empty_rest_of_line ();
16339 }
16340
16341 /* This structure is used to hold a stack of .set values.  */
16342
16343 struct mips_option_stack
16344 {
16345   struct mips_option_stack *next;
16346   struct mips_set_options options;
16347 };
16348
16349 static struct mips_option_stack *mips_opts_stack;
16350
16351 /* Handle the .set pseudo-op.  */
16352
16353 static void
16354 s_mipsset (int x ATTRIBUTE_UNUSED)
16355 {
16356   char *name = input_line_pointer, ch;
16357   const struct mips_ase *ase;
16358
16359   while (!is_end_of_line[(unsigned char) *input_line_pointer])
16360     ++input_line_pointer;
16361   ch = *input_line_pointer;
16362   *input_line_pointer = '\0';
16363
16364   if (strcmp (name, "reorder") == 0)
16365     {
16366       if (mips_opts.noreorder)
16367         end_noreorder ();
16368     }
16369   else if (strcmp (name, "noreorder") == 0)
16370     {
16371       if (!mips_opts.noreorder)
16372         start_noreorder ();
16373     }
16374   else if (strncmp (name, "at=", 3) == 0)
16375     {
16376       char *s = name + 3;
16377
16378       if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
16379         as_bad (_("Unrecognized register name `%s'"), s);
16380     }
16381   else if (strcmp (name, "at") == 0)
16382     {
16383       mips_opts.at = ATREG;
16384     }
16385   else if (strcmp (name, "noat") == 0)
16386     {
16387       mips_opts.at = ZERO;
16388     }
16389   else if (strcmp (name, "macro") == 0)
16390     {
16391       mips_opts.warn_about_macros = 0;
16392     }
16393   else if (strcmp (name, "nomacro") == 0)
16394     {
16395       if (mips_opts.noreorder == 0)
16396         as_bad (_("`noreorder' must be set before `nomacro'"));
16397       mips_opts.warn_about_macros = 1;
16398     }
16399   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
16400     {
16401       mips_opts.nomove = 0;
16402     }
16403   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
16404     {
16405       mips_opts.nomove = 1;
16406     }
16407   else if (strcmp (name, "bopt") == 0)
16408     {
16409       mips_opts.nobopt = 0;
16410     }
16411   else if (strcmp (name, "nobopt") == 0)
16412     {
16413       mips_opts.nobopt = 1;
16414     }
16415   else if (strcmp (name, "gp=default") == 0)
16416     mips_opts.gp32 = file_mips_gp32;
16417   else if (strcmp (name, "gp=32") == 0)
16418     mips_opts.gp32 = 1;
16419   else if (strcmp (name, "gp=64") == 0)
16420     {
16421       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
16422         as_warn (_("%s isa does not support 64-bit registers"),
16423                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16424       mips_opts.gp32 = 0;
16425     }
16426   else if (strcmp (name, "fp=default") == 0)
16427     mips_opts.fp32 = file_mips_fp32;
16428   else if (strcmp (name, "fp=32") == 0)
16429     mips_opts.fp32 = 1;
16430   else if (strcmp (name, "fp=64") == 0)
16431     {
16432       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
16433         as_warn (_("%s isa does not support 64-bit floating point registers"),
16434                  mips_cpu_info_from_isa (mips_opts.isa)->name);
16435       mips_opts.fp32 = 0;
16436     }
16437   else if (strcmp (name, "softfloat") == 0)
16438     mips_opts.soft_float = 1;
16439   else if (strcmp (name, "hardfloat") == 0)
16440     mips_opts.soft_float = 0;
16441   else if (strcmp (name, "singlefloat") == 0)
16442     mips_opts.single_float = 1;
16443   else if (strcmp (name, "doublefloat") == 0)
16444     mips_opts.single_float = 0;
16445   else if (strcmp (name, "mips16") == 0
16446            || strcmp (name, "MIPS-16") == 0)
16447     {
16448       if (mips_opts.micromips == 1)
16449         as_fatal (_("`mips16' cannot be used with `micromips'"));
16450       mips_opts.mips16 = 1;
16451     }
16452   else if (strcmp (name, "nomips16") == 0
16453            || strcmp (name, "noMIPS-16") == 0)
16454     mips_opts.mips16 = 0;
16455   else if (strcmp (name, "micromips") == 0)
16456     {
16457       if (mips_opts.mips16 == 1)
16458         as_fatal (_("`micromips' cannot be used with `mips16'"));
16459       mips_opts.micromips = 1;
16460     }
16461   else if (strcmp (name, "nomicromips") == 0)
16462     mips_opts.micromips = 0;
16463   else if (name[0] == 'n'
16464            && name[1] == 'o'
16465            && (ase = mips_lookup_ase (name + 2)))
16466     mips_set_ase (ase, FALSE);
16467   else if ((ase = mips_lookup_ase (name)))
16468     mips_set_ase (ase, TRUE);
16469   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
16470     {
16471       int reset = 0;
16472
16473       /* Permit the user to change the ISA and architecture on the fly.
16474          Needless to say, misuse can cause serious problems.  */
16475       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
16476         {
16477           reset = 1;
16478           mips_opts.isa = file_mips_isa;
16479           mips_opts.arch = file_mips_arch;
16480         }
16481       else if (strncmp (name, "arch=", 5) == 0)
16482         {
16483           const struct mips_cpu_info *p;
16484
16485           p = mips_parse_cpu("internal use", name + 5);
16486           if (!p)
16487             as_bad (_("unknown architecture %s"), name + 5);
16488           else
16489             {
16490               mips_opts.arch = p->cpu;
16491               mips_opts.isa = p->isa;
16492             }
16493         }
16494       else if (strncmp (name, "mips", 4) == 0)
16495         {
16496           const struct mips_cpu_info *p;
16497
16498           p = mips_parse_cpu("internal use", name);
16499           if (!p)
16500             as_bad (_("unknown ISA level %s"), name + 4);
16501           else
16502             {
16503               mips_opts.arch = p->cpu;
16504               mips_opts.isa = p->isa;
16505             }
16506         }
16507       else
16508         as_bad (_("unknown ISA or architecture %s"), name);
16509
16510       switch (mips_opts.isa)
16511         {
16512         case  0:
16513           break;
16514         case ISA_MIPS1:
16515         case ISA_MIPS2:
16516         case ISA_MIPS32:
16517         case ISA_MIPS32R2:
16518           mips_opts.gp32 = 1;
16519           mips_opts.fp32 = 1;
16520           break;
16521         case ISA_MIPS3:
16522         case ISA_MIPS4:
16523         case ISA_MIPS5:
16524         case ISA_MIPS64:
16525         case ISA_MIPS64R2:
16526           mips_opts.gp32 = 0;
16527           if (mips_opts.arch == CPU_R5900)
16528             {
16529                 mips_opts.fp32 = 1;
16530             }
16531           else
16532             {
16533           mips_opts.fp32 = 0;
16534             }
16535           break;
16536         default:
16537           as_bad (_("unknown ISA level %s"), name + 4);
16538           break;
16539         }
16540       if (reset)
16541         {
16542           mips_opts.gp32 = file_mips_gp32;
16543           mips_opts.fp32 = file_mips_fp32;
16544         }
16545     }
16546   else if (strcmp (name, "autoextend") == 0)
16547     mips_opts.noautoextend = 0;
16548   else if (strcmp (name, "noautoextend") == 0)
16549     mips_opts.noautoextend = 1;
16550   else if (strcmp (name, "push") == 0)
16551     {
16552       struct mips_option_stack *s;
16553
16554       s = (struct mips_option_stack *) xmalloc (sizeof *s);
16555       s->next = mips_opts_stack;
16556       s->options = mips_opts;
16557       mips_opts_stack = s;
16558     }
16559   else if (strcmp (name, "pop") == 0)
16560     {
16561       struct mips_option_stack *s;
16562
16563       s = mips_opts_stack;
16564       if (s == NULL)
16565         as_bad (_(".set pop with no .set push"));
16566       else
16567         {
16568           /* If we're changing the reorder mode we need to handle
16569              delay slots correctly.  */
16570           if (s->options.noreorder && ! mips_opts.noreorder)
16571             start_noreorder ();
16572           else if (! s->options.noreorder && mips_opts.noreorder)
16573             end_noreorder ();
16574
16575           mips_opts = s->options;
16576           mips_opts_stack = s->next;
16577           free (s);
16578         }
16579     }
16580   else if (strcmp (name, "sym32") == 0)
16581     mips_opts.sym32 = TRUE;
16582   else if (strcmp (name, "nosym32") == 0)
16583     mips_opts.sym32 = FALSE;
16584   else if (strchr (name, ','))
16585     {
16586       /* Generic ".set" directive; use the generic handler.  */
16587       *input_line_pointer = ch;
16588       input_line_pointer = name;
16589       s_set (0);
16590       return;
16591     }
16592   else
16593     {
16594       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
16595     }
16596   mips_check_isa_supports_ases ();
16597   *input_line_pointer = ch;
16598   demand_empty_rest_of_line ();
16599 }
16600
16601 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
16602    .option pic2.  It means to generate SVR4 PIC calls.  */
16603
16604 static void
16605 s_abicalls (int ignore ATTRIBUTE_UNUSED)
16606 {
16607   mips_pic = SVR4_PIC;
16608   mips_abicalls = TRUE;
16609
16610   if (g_switch_seen && g_switch_value != 0)
16611     as_warn (_("-G may not be used with SVR4 PIC code"));
16612   g_switch_value = 0;
16613
16614   bfd_set_gp_size (stdoutput, 0);
16615   demand_empty_rest_of_line ();
16616 }
16617
16618 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
16619    PIC code.  It sets the $gp register for the function based on the
16620    function address, which is in the register named in the argument.
16621    This uses a relocation against _gp_disp, which is handled specially
16622    by the linker.  The result is:
16623         lui     $gp,%hi(_gp_disp)
16624         addiu   $gp,$gp,%lo(_gp_disp)
16625         addu    $gp,$gp,.cpload argument
16626    The .cpload argument is normally $25 == $t9.
16627
16628    The -mno-shared option changes this to:
16629         lui     $gp,%hi(__gnu_local_gp)
16630         addiu   $gp,$gp,%lo(__gnu_local_gp)
16631    and the argument is ignored.  This saves an instruction, but the
16632    resulting code is not position independent; it uses an absolute
16633    address for __gnu_local_gp.  Thus code assembled with -mno-shared
16634    can go into an ordinary executable, but not into a shared library.  */
16635
16636 static void
16637 s_cpload (int ignore ATTRIBUTE_UNUSED)
16638 {
16639   expressionS ex;
16640   int reg;
16641   int in_shared;
16642
16643   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16644      .cpload is ignored.  */
16645   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16646     {
16647       s_ignore (0);
16648       return;
16649     }
16650
16651   if (mips_opts.mips16)
16652     {
16653       as_bad (_("%s not supported in MIPS16 mode"), ".cpload");
16654       ignore_rest_of_line ();
16655       return;
16656     }
16657
16658   /* .cpload should be in a .set noreorder section.  */
16659   if (mips_opts.noreorder == 0)
16660     as_warn (_(".cpload not in noreorder section"));
16661
16662   reg = tc_get_register (0);
16663
16664   /* If we need to produce a 64-bit address, we are better off using
16665      the default instruction sequence.  */
16666   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
16667
16668   ex.X_op = O_symbol;
16669   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
16670                                          "__gnu_local_gp");
16671   ex.X_op_symbol = NULL;
16672   ex.X_add_number = 0;
16673
16674   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
16675   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16676
16677   mips_mark_labels ();
16678   mips_assembling_insn = TRUE;
16679
16680   macro_start ();
16681   macro_build_lui (&ex, mips_gp_register);
16682   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16683                mips_gp_register, BFD_RELOC_LO16);
16684   if (in_shared)
16685     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
16686                  mips_gp_register, reg);
16687   macro_end ();
16688
16689   mips_assembling_insn = FALSE;
16690   demand_empty_rest_of_line ();
16691 }
16692
16693 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
16694      .cpsetup $reg1, offset|$reg2, label
16695
16696    If offset is given, this results in:
16697      sd         $gp, offset($sp)
16698      lui        $gp, %hi(%neg(%gp_rel(label)))
16699      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
16700      daddu      $gp, $gp, $reg1
16701
16702    If $reg2 is given, this results in:
16703      daddu      $reg2, $gp, $0
16704      lui        $gp, %hi(%neg(%gp_rel(label)))
16705      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
16706      daddu      $gp, $gp, $reg1
16707    $reg1 is normally $25 == $t9.
16708
16709    The -mno-shared option replaces the last three instructions with
16710         lui     $gp,%hi(_gp)
16711         addiu   $gp,$gp,%lo(_gp)  */
16712
16713 static void
16714 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
16715 {
16716   expressionS ex_off;
16717   expressionS ex_sym;
16718   int reg1;
16719
16720   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
16721      We also need NewABI support.  */
16722   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16723     {
16724       s_ignore (0);
16725       return;
16726     }
16727
16728   if (mips_opts.mips16)
16729     {
16730       as_bad (_("%s not supported in MIPS16 mode"), ".cpsetup");
16731       ignore_rest_of_line ();
16732       return;
16733     }
16734
16735   reg1 = tc_get_register (0);
16736   SKIP_WHITESPACE ();
16737   if (*input_line_pointer != ',')
16738     {
16739       as_bad (_("missing argument separator ',' for .cpsetup"));
16740       return;
16741     }
16742   else
16743     ++input_line_pointer;
16744   SKIP_WHITESPACE ();
16745   if (*input_line_pointer == '$')
16746     {
16747       mips_cpreturn_register = tc_get_register (0);
16748       mips_cpreturn_offset = -1;
16749     }
16750   else
16751     {
16752       mips_cpreturn_offset = get_absolute_expression ();
16753       mips_cpreturn_register = -1;
16754     }
16755   SKIP_WHITESPACE ();
16756   if (*input_line_pointer != ',')
16757     {
16758       as_bad (_("missing argument separator ',' for .cpsetup"));
16759       return;
16760     }
16761   else
16762     ++input_line_pointer;
16763   SKIP_WHITESPACE ();
16764   expression (&ex_sym);
16765
16766   mips_mark_labels ();
16767   mips_assembling_insn = TRUE;
16768
16769   macro_start ();
16770   if (mips_cpreturn_register == -1)
16771     {
16772       ex_off.X_op = O_constant;
16773       ex_off.X_add_symbol = NULL;
16774       ex_off.X_op_symbol = NULL;
16775       ex_off.X_add_number = mips_cpreturn_offset;
16776
16777       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
16778                    BFD_RELOC_LO16, SP);
16779     }
16780   else
16781     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
16782                  mips_gp_register, 0);
16783
16784   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
16785     {
16786       macro_build (&ex_sym, "lui", LUI_FMT, mips_gp_register,
16787                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
16788                    BFD_RELOC_HI16_S);
16789
16790       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
16791                    mips_gp_register, -1, BFD_RELOC_GPREL16,
16792                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
16793
16794       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
16795                    mips_gp_register, reg1);
16796     }
16797   else
16798     {
16799       expressionS ex;
16800
16801       ex.X_op = O_symbol;
16802       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
16803       ex.X_op_symbol = NULL;
16804       ex.X_add_number = 0;
16805
16806       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
16807       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16808
16809       macro_build_lui (&ex, mips_gp_register);
16810       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16811                    mips_gp_register, BFD_RELOC_LO16);
16812     }
16813
16814   macro_end ();
16815
16816   mips_assembling_insn = FALSE;
16817   demand_empty_rest_of_line ();
16818 }
16819
16820 static void
16821 s_cplocal (int ignore ATTRIBUTE_UNUSED)
16822 {
16823   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
16824      .cplocal is ignored.  */
16825   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16826     {
16827       s_ignore (0);
16828       return;
16829     }
16830
16831   if (mips_opts.mips16)
16832     {
16833       as_bad (_("%s not supported in MIPS16 mode"), ".cplocal");
16834       ignore_rest_of_line ();
16835       return;
16836     }
16837
16838   mips_gp_register = tc_get_register (0);
16839   demand_empty_rest_of_line ();
16840 }
16841
16842 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
16843    offset from $sp.  The offset is remembered, and after making a PIC
16844    call $gp is restored from that location.  */
16845
16846 static void
16847 s_cprestore (int ignore ATTRIBUTE_UNUSED)
16848 {
16849   expressionS ex;
16850
16851   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16852      .cprestore is ignored.  */
16853   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16854     {
16855       s_ignore (0);
16856       return;
16857     }
16858
16859   if (mips_opts.mips16)
16860     {
16861       as_bad (_("%s not supported in MIPS16 mode"), ".cprestore");
16862       ignore_rest_of_line ();
16863       return;
16864     }
16865
16866   mips_cprestore_offset = get_absolute_expression ();
16867   mips_cprestore_valid = 1;
16868
16869   ex.X_op = O_constant;
16870   ex.X_add_symbol = NULL;
16871   ex.X_op_symbol = NULL;
16872   ex.X_add_number = mips_cprestore_offset;
16873
16874   mips_mark_labels ();
16875   mips_assembling_insn = TRUE;
16876
16877   macro_start ();
16878   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
16879                                 SP, HAVE_64BIT_ADDRESSES);
16880   macro_end ();
16881
16882   mips_assembling_insn = FALSE;
16883   demand_empty_rest_of_line ();
16884 }
16885
16886 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
16887    was given in the preceding .cpsetup, it results in:
16888      ld         $gp, offset($sp)
16889
16890    If a register $reg2 was given there, it results in:
16891      daddu      $gp, $reg2, $0  */
16892
16893 static void
16894 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
16895 {
16896   expressionS ex;
16897
16898   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
16899      We also need NewABI support.  */
16900   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16901     {
16902       s_ignore (0);
16903       return;
16904     }
16905
16906   if (mips_opts.mips16)
16907     {
16908       as_bad (_("%s not supported in MIPS16 mode"), ".cpreturn");
16909       ignore_rest_of_line ();
16910       return;
16911     }
16912
16913   mips_mark_labels ();
16914   mips_assembling_insn = TRUE;
16915
16916   macro_start ();
16917   if (mips_cpreturn_register == -1)
16918     {
16919       ex.X_op = O_constant;
16920       ex.X_add_symbol = NULL;
16921       ex.X_op_symbol = NULL;
16922       ex.X_add_number = mips_cpreturn_offset;
16923
16924       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
16925     }
16926   else
16927     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
16928                  mips_cpreturn_register, 0);
16929   macro_end ();
16930
16931   mips_assembling_insn = FALSE;
16932   demand_empty_rest_of_line ();
16933 }
16934
16935 /* Handle a .dtprelword, .dtpreldword, .tprelword, or .tpreldword
16936    pseudo-op; DIRSTR says which. The pseudo-op generates a BYTES-size
16937    DTP- or TP-relative relocation of type RTYPE, for use in either DWARF
16938    debug information or MIPS16 TLS.  */
16939
16940 static void
16941 s_tls_rel_directive (const size_t bytes, const char *dirstr,
16942                      bfd_reloc_code_real_type rtype)
16943 {
16944   expressionS ex;
16945   char *p;
16946
16947   expression (&ex);
16948
16949   if (ex.X_op != O_symbol)
16950     {
16951       as_bad (_("Unsupported use of %s"), dirstr);
16952       ignore_rest_of_line ();
16953     }
16954
16955   p = frag_more (bytes);
16956   md_number_to_chars (p, 0, bytes);
16957   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE, rtype);
16958   demand_empty_rest_of_line ();
16959   mips_clear_insn_labels ();
16960 }
16961
16962 /* Handle .dtprelword.  */
16963
16964 static void
16965 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
16966 {
16967   s_tls_rel_directive (4, ".dtprelword", BFD_RELOC_MIPS_TLS_DTPREL32);
16968 }
16969
16970 /* Handle .dtpreldword.  */
16971
16972 static void
16973 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
16974 {
16975   s_tls_rel_directive (8, ".dtpreldword", BFD_RELOC_MIPS_TLS_DTPREL64);
16976 }
16977
16978 /* Handle .tprelword.  */
16979
16980 static void
16981 s_tprelword (int ignore ATTRIBUTE_UNUSED)
16982 {
16983   s_tls_rel_directive (4, ".tprelword", BFD_RELOC_MIPS_TLS_TPREL32);
16984 }
16985
16986 /* Handle .tpreldword.  */
16987
16988 static void
16989 s_tpreldword (int ignore ATTRIBUTE_UNUSED)
16990 {
16991   s_tls_rel_directive (8, ".tpreldword", BFD_RELOC_MIPS_TLS_TPREL64);
16992 }
16993
16994 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
16995    code.  It sets the offset to use in gp_rel relocations.  */
16996
16997 static void
16998 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
16999 {
17000   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
17001      We also need NewABI support.  */
17002   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
17003     {
17004       s_ignore (0);
17005       return;
17006     }
17007
17008   mips_gprel_offset = get_absolute_expression ();
17009
17010   demand_empty_rest_of_line ();
17011 }
17012
17013 /* Handle the .gpword pseudo-op.  This is used when generating PIC
17014    code.  It generates a 32 bit GP relative reloc.  */
17015
17016 static void
17017 s_gpword (int ignore ATTRIBUTE_UNUSED)
17018 {
17019   segment_info_type *si;
17020   struct insn_label_list *l;
17021   expressionS ex;
17022   char *p;
17023
17024   /* When not generating PIC code, this is treated as .word.  */
17025   if (mips_pic != SVR4_PIC)
17026     {
17027       s_cons (2);
17028       return;
17029     }
17030
17031   si = seg_info (now_seg);
17032   l = si->label_list;
17033   mips_emit_delays ();
17034   if (auto_align)
17035     mips_align (2, 0, l);
17036
17037   expression (&ex);
17038   mips_clear_insn_labels ();
17039
17040   if (ex.X_op != O_symbol || ex.X_add_number != 0)
17041     {
17042       as_bad (_("Unsupported use of .gpword"));
17043       ignore_rest_of_line ();
17044     }
17045
17046   p = frag_more (4);
17047   md_number_to_chars (p, 0, 4);
17048   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
17049                BFD_RELOC_GPREL32);
17050
17051   demand_empty_rest_of_line ();
17052 }
17053
17054 static void
17055 s_gpdword (int ignore ATTRIBUTE_UNUSED)
17056 {
17057   segment_info_type *si;
17058   struct insn_label_list *l;
17059   expressionS ex;
17060   char *p;
17061
17062   /* When not generating PIC code, this is treated as .dword.  */
17063   if (mips_pic != SVR4_PIC)
17064     {
17065       s_cons (3);
17066       return;
17067     }
17068
17069   si = seg_info (now_seg);
17070   l = si->label_list;
17071   mips_emit_delays ();
17072   if (auto_align)
17073     mips_align (3, 0, l);
17074
17075   expression (&ex);
17076   mips_clear_insn_labels ();
17077
17078   if (ex.X_op != O_symbol || ex.X_add_number != 0)
17079     {
17080       as_bad (_("Unsupported use of .gpdword"));
17081       ignore_rest_of_line ();
17082     }
17083
17084   p = frag_more (8);
17085   md_number_to_chars (p, 0, 8);
17086   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
17087                BFD_RELOC_GPREL32)->fx_tcbit = 1;
17088
17089   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
17090   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
17091            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
17092
17093   demand_empty_rest_of_line ();
17094 }
17095
17096 /* Handle the .ehword pseudo-op.  This is used when generating unwinding
17097    tables.  It generates a R_MIPS_EH reloc.  */
17098
17099 static void
17100 s_ehword (int ignore ATTRIBUTE_UNUSED)
17101 {
17102   expressionS ex;
17103   char *p;
17104
17105   mips_emit_delays ();
17106
17107   expression (&ex);
17108   mips_clear_insn_labels ();
17109
17110   if (ex.X_op != O_symbol || ex.X_add_number != 0)
17111     {
17112       as_bad (_("Unsupported use of .ehword"));
17113       ignore_rest_of_line ();
17114     }
17115
17116   p = frag_more (4);
17117   md_number_to_chars (p, 0, 4);
17118   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
17119                BFD_RELOC_MIPS_EH);
17120
17121   demand_empty_rest_of_line ();
17122 }
17123
17124 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
17125    tables in SVR4 PIC code.  */
17126
17127 static void
17128 s_cpadd (int ignore ATTRIBUTE_UNUSED)
17129 {
17130   int reg;
17131
17132   /* This is ignored when not generating SVR4 PIC code.  */
17133   if (mips_pic != SVR4_PIC)
17134     {
17135       s_ignore (0);
17136       return;
17137     }
17138
17139   mips_mark_labels ();
17140   mips_assembling_insn = TRUE;
17141
17142   /* Add $gp to the register named as an argument.  */
17143   macro_start ();
17144   reg = tc_get_register (0);
17145   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
17146   macro_end ();
17147
17148   mips_assembling_insn = FALSE;
17149   demand_empty_rest_of_line ();
17150 }
17151
17152 /* Handle the .insn pseudo-op.  This marks instruction labels in
17153    mips16/micromips mode.  This permits the linker to handle them specially,
17154    such as generating jalx instructions when needed.  We also make
17155    them odd for the duration of the assembly, in order to generate the
17156    right sort of code.  We will make them even in the adjust_symtab
17157    routine, while leaving them marked.  This is convenient for the
17158    debugger and the disassembler.  The linker knows to make them odd
17159    again.  */
17160
17161 static void
17162 s_insn (int ignore ATTRIBUTE_UNUSED)
17163 {
17164   mips_mark_labels ();
17165
17166   demand_empty_rest_of_line ();
17167 }
17168
17169 /* Handle a .stab[snd] directive.  Ideally these directives would be
17170    implemented in a transparent way, so that removing them would not
17171    have any effect on the generated instructions.  However, s_stab
17172    internally changes the section, so in practice we need to decide
17173    now whether the preceding label marks compressed code.  We do not
17174    support changing the compression mode of a label after a .stab*
17175    directive, such as in:
17176
17177    foo:
17178         .stabs ...
17179         .set mips16
17180
17181    so the current mode wins.  */
17182
17183 static void
17184 s_mips_stab (int type)
17185 {
17186   mips_mark_labels ();
17187   s_stab (type);
17188 }
17189
17190 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
17191
17192 static void
17193 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
17194 {
17195   char *name;
17196   int c;
17197   symbolS *symbolP;
17198   expressionS exp;
17199
17200   name = input_line_pointer;
17201   c = get_symbol_end ();
17202   symbolP = symbol_find_or_make (name);
17203   S_SET_WEAK (symbolP);
17204   *input_line_pointer = c;
17205
17206   SKIP_WHITESPACE ();
17207
17208   if (! is_end_of_line[(unsigned char) *input_line_pointer])
17209     {
17210       if (S_IS_DEFINED (symbolP))
17211         {
17212           as_bad (_("ignoring attempt to redefine symbol %s"),
17213                   S_GET_NAME (symbolP));
17214           ignore_rest_of_line ();
17215           return;
17216         }
17217
17218       if (*input_line_pointer == ',')
17219         {
17220           ++input_line_pointer;
17221           SKIP_WHITESPACE ();
17222         }
17223
17224       expression (&exp);
17225       if (exp.X_op != O_symbol)
17226         {
17227           as_bad (_("bad .weakext directive"));
17228           ignore_rest_of_line ();
17229           return;
17230         }
17231       symbol_set_value_expression (symbolP, &exp);
17232     }
17233
17234   demand_empty_rest_of_line ();
17235 }
17236
17237 /* Parse a register string into a number.  Called from the ECOFF code
17238    to parse .frame.  The argument is non-zero if this is the frame
17239    register, so that we can record it in mips_frame_reg.  */
17240
17241 int
17242 tc_get_register (int frame)
17243 {
17244   unsigned int reg;
17245
17246   SKIP_WHITESPACE ();
17247   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
17248     reg = 0;
17249   if (frame)
17250     {
17251       mips_frame_reg = reg != 0 ? reg : SP;
17252       mips_frame_reg_valid = 1;
17253       mips_cprestore_valid = 0;
17254     }
17255   return reg;
17256 }
17257
17258 valueT
17259 md_section_align (asection *seg, valueT addr)
17260 {
17261   int align = bfd_get_section_alignment (stdoutput, seg);
17262
17263   /* We don't need to align ELF sections to the full alignment.
17264      However, Irix 5 may prefer that we align them at least to a 16
17265      byte boundary.  We don't bother to align the sections if we
17266      are targeted for an embedded system.  */
17267   if (strncmp (TARGET_OS, "elf", 3) == 0)
17268     return addr;
17269   if (align > 4)
17270     align = 4;
17271
17272   return ((addr + (1 << align) - 1) & (-1 << align));
17273 }
17274
17275 /* Utility routine, called from above as well.  If called while the
17276    input file is still being read, it's only an approximation.  (For
17277    example, a symbol may later become defined which appeared to be
17278    undefined earlier.)  */
17279
17280 static int
17281 nopic_need_relax (symbolS *sym, int before_relaxing)
17282 {
17283   if (sym == 0)
17284     return 0;
17285
17286   if (g_switch_value > 0)
17287     {
17288       const char *symname;
17289       int change;
17290
17291       /* Find out whether this symbol can be referenced off the $gp
17292          register.  It can be if it is smaller than the -G size or if
17293          it is in the .sdata or .sbss section.  Certain symbols can
17294          not be referenced off the $gp, although it appears as though
17295          they can.  */
17296       symname = S_GET_NAME (sym);
17297       if (symname != (const char *) NULL
17298           && (strcmp (symname, "eprol") == 0
17299               || strcmp (symname, "etext") == 0
17300               || strcmp (symname, "_gp") == 0
17301               || strcmp (symname, "edata") == 0
17302               || strcmp (symname, "_fbss") == 0
17303               || strcmp (symname, "_fdata") == 0
17304               || strcmp (symname, "_ftext") == 0
17305               || strcmp (symname, "end") == 0
17306               || strcmp (symname, "_gp_disp") == 0))
17307         change = 1;
17308       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
17309                && (0
17310 #ifndef NO_ECOFF_DEBUGGING
17311                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
17312                        && (symbol_get_obj (sym)->ecoff_extern_size
17313                            <= g_switch_value))
17314 #endif
17315                    /* We must defer this decision until after the whole
17316                       file has been read, since there might be a .extern
17317                       after the first use of this symbol.  */
17318                    || (before_relaxing
17319 #ifndef NO_ECOFF_DEBUGGING
17320                        && symbol_get_obj (sym)->ecoff_extern_size == 0
17321 #endif
17322                        && S_GET_VALUE (sym) == 0)
17323                    || (S_GET_VALUE (sym) != 0
17324                        && S_GET_VALUE (sym) <= g_switch_value)))
17325         change = 0;
17326       else
17327         {
17328           const char *segname;
17329
17330           segname = segment_name (S_GET_SEGMENT (sym));
17331           gas_assert (strcmp (segname, ".lit8") != 0
17332                   && strcmp (segname, ".lit4") != 0);
17333           change = (strcmp (segname, ".sdata") != 0
17334                     && strcmp (segname, ".sbss") != 0
17335                     && strncmp (segname, ".sdata.", 7) != 0
17336                     && strncmp (segname, ".sbss.", 6) != 0
17337                     && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
17338                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
17339         }
17340       return change;
17341     }
17342   else
17343     /* We are not optimizing for the $gp register.  */
17344     return 1;
17345 }
17346
17347
17348 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
17349
17350 static bfd_boolean
17351 pic_need_relax (symbolS *sym, asection *segtype)
17352 {
17353   asection *symsec;
17354
17355   /* Handle the case of a symbol equated to another symbol.  */
17356   while (symbol_equated_reloc_p (sym))
17357     {
17358       symbolS *n;
17359
17360       /* It's possible to get a loop here in a badly written program.  */
17361       n = symbol_get_value_expression (sym)->X_add_symbol;
17362       if (n == sym)
17363         break;
17364       sym = n;
17365     }
17366
17367   if (symbol_section_p (sym))
17368     return TRUE;
17369
17370   symsec = S_GET_SEGMENT (sym);
17371
17372   /* This must duplicate the test in adjust_reloc_syms.  */
17373   return (!bfd_is_und_section (symsec)
17374           && !bfd_is_abs_section (symsec)
17375           && !bfd_is_com_section (symsec)
17376           && !s_is_linkonce (sym, segtype)
17377           /* A global or weak symbol is treated as external.  */
17378           && (!S_IS_WEAK (sym) && !S_IS_EXTERNAL (sym)));
17379 }
17380
17381
17382 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
17383    extended opcode.  SEC is the section the frag is in.  */
17384
17385 static int
17386 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
17387 {
17388   int type;
17389   const struct mips16_immed_operand *op;
17390   offsetT val;
17391   int mintiny, maxtiny;
17392   segT symsec;
17393   fragS *sym_frag;
17394
17395   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
17396     return 0;
17397   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
17398     return 1;
17399
17400   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
17401   op = mips16_immed_operands;
17402   while (op->type != type)
17403     {
17404       ++op;
17405       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
17406     }
17407
17408   if (op->unsp)
17409     {
17410       if (type == '<' || type == '>' || type == '[' || type == ']')
17411         {
17412           mintiny = 1;
17413           maxtiny = 1 << op->nbits;
17414         }
17415       else
17416         {
17417           mintiny = 0;
17418           maxtiny = (1 << op->nbits) - 1;
17419         }
17420     }
17421   else
17422     {
17423       mintiny = - (1 << (op->nbits - 1));
17424       maxtiny = (1 << (op->nbits - 1)) - 1;
17425     }
17426
17427   sym_frag = symbol_get_frag (fragp->fr_symbol);
17428   val = S_GET_VALUE (fragp->fr_symbol);
17429   symsec = S_GET_SEGMENT (fragp->fr_symbol);
17430
17431   if (op->pcrel)
17432     {
17433       addressT addr;
17434
17435       /* We won't have the section when we are called from
17436          mips_relax_frag.  However, we will always have been called
17437          from md_estimate_size_before_relax first.  If this is a
17438          branch to a different section, we mark it as such.  If SEC is
17439          NULL, and the frag is not marked, then it must be a branch to
17440          the same section.  */
17441       if (sec == NULL)
17442         {
17443           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
17444             return 1;
17445         }
17446       else
17447         {
17448           /* Must have been called from md_estimate_size_before_relax.  */
17449           if (symsec != sec)
17450             {
17451               fragp->fr_subtype =
17452                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17453
17454               /* FIXME: We should support this, and let the linker
17455                  catch branches and loads that are out of range.  */
17456               as_bad_where (fragp->fr_file, fragp->fr_line,
17457                             _("unsupported PC relative reference to different section"));
17458
17459               return 1;
17460             }
17461           if (fragp != sym_frag && sym_frag->fr_address == 0)
17462             /* Assume non-extended on the first relaxation pass.
17463                The address we have calculated will be bogus if this is
17464                a forward branch to another frag, as the forward frag
17465                will have fr_address == 0.  */
17466             return 0;
17467         }
17468
17469       /* In this case, we know for sure that the symbol fragment is in
17470          the same section.  If the relax_marker of the symbol fragment
17471          differs from the relax_marker of this fragment, we have not
17472          yet adjusted the symbol fragment fr_address.  We want to add
17473          in STRETCH in order to get a better estimate of the address.
17474          This particularly matters because of the shift bits.  */
17475       if (stretch != 0
17476           && sym_frag->relax_marker != fragp->relax_marker)
17477         {
17478           fragS *f;
17479
17480           /* Adjust stretch for any alignment frag.  Note that if have
17481              been expanding the earlier code, the symbol may be
17482              defined in what appears to be an earlier frag.  FIXME:
17483              This doesn't handle the fr_subtype field, which specifies
17484              a maximum number of bytes to skip when doing an
17485              alignment.  */
17486           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
17487             {
17488               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
17489                 {
17490                   if (stretch < 0)
17491                     stretch = - ((- stretch)
17492                                  & ~ ((1 << (int) f->fr_offset) - 1));
17493                   else
17494                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
17495                   if (stretch == 0)
17496                     break;
17497                 }
17498             }
17499           if (f != NULL)
17500             val += stretch;
17501         }
17502
17503       addr = fragp->fr_address + fragp->fr_fix;
17504
17505       /* The base address rules are complicated.  The base address of
17506          a branch is the following instruction.  The base address of a
17507          PC relative load or add is the instruction itself, but if it
17508          is in a delay slot (in which case it can not be extended) use
17509          the address of the instruction whose delay slot it is in.  */
17510       if (type == 'p' || type == 'q')
17511         {
17512           addr += 2;
17513
17514           /* If we are currently assuming that this frag should be
17515              extended, then, the current address is two bytes
17516              higher.  */
17517           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17518             addr += 2;
17519
17520           /* Ignore the low bit in the target, since it will be set
17521              for a text label.  */
17522           if ((val & 1) != 0)
17523             --val;
17524         }
17525       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
17526         addr -= 4;
17527       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
17528         addr -= 2;
17529
17530       val -= addr & ~ ((1 << op->shift) - 1);
17531
17532       /* Branch offsets have an implicit 0 in the lowest bit.  */
17533       if (type == 'p' || type == 'q')
17534         val /= 2;
17535
17536       /* If any of the shifted bits are set, we must use an extended
17537          opcode.  If the address depends on the size of this
17538          instruction, this can lead to a loop, so we arrange to always
17539          use an extended opcode.  We only check this when we are in
17540          the main relaxation loop, when SEC is NULL.  */
17541       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
17542         {
17543           fragp->fr_subtype =
17544             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17545           return 1;
17546         }
17547
17548       /* If we are about to mark a frag as extended because the value
17549          is precisely maxtiny + 1, then there is a chance of an
17550          infinite loop as in the following code:
17551              la $4,foo
17552              .skip      1020
17553              .align     2
17554            foo:
17555          In this case when the la is extended, foo is 0x3fc bytes
17556          away, so the la can be shrunk, but then foo is 0x400 away, so
17557          the la must be extended.  To avoid this loop, we mark the
17558          frag as extended if it was small, and is about to become
17559          extended with a value of maxtiny + 1.  */
17560       if (val == ((maxtiny + 1) << op->shift)
17561           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
17562           && sec == NULL)
17563         {
17564           fragp->fr_subtype =
17565             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17566           return 1;
17567         }
17568     }
17569   else if (symsec != absolute_section && sec != NULL)
17570     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
17571
17572   if ((val & ((1 << op->shift) - 1)) != 0
17573       || val < (mintiny << op->shift)
17574       || val > (maxtiny << op->shift))
17575     return 1;
17576   else
17577     return 0;
17578 }
17579
17580 /* Compute the length of a branch sequence, and adjust the
17581    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
17582    worst-case length is computed, with UPDATE being used to indicate
17583    whether an unconditional (-1), branch-likely (+1) or regular (0)
17584    branch is to be computed.  */
17585 static int
17586 relaxed_branch_length (fragS *fragp, asection *sec, int update)
17587 {
17588   bfd_boolean toofar;
17589   int length;
17590
17591   if (fragp
17592       && S_IS_DEFINED (fragp->fr_symbol)
17593       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17594     {
17595       addressT addr;
17596       offsetT val;
17597
17598       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17599
17600       addr = fragp->fr_address + fragp->fr_fix + 4;
17601
17602       val -= addr;
17603
17604       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
17605     }
17606   else if (fragp)
17607     /* If the symbol is not defined or it's in a different segment,
17608        assume the user knows what's going on and emit a short
17609        branch.  */
17610     toofar = FALSE;
17611   else
17612     toofar = TRUE;
17613
17614   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
17615     fragp->fr_subtype
17616       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_AT (fragp->fr_subtype),
17617                              RELAX_BRANCH_UNCOND (fragp->fr_subtype),
17618                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
17619                              RELAX_BRANCH_LINK (fragp->fr_subtype),
17620                              toofar);
17621
17622   length = 4;
17623   if (toofar)
17624     {
17625       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
17626         length += 8;
17627
17628       if (mips_pic != NO_PIC)
17629         {
17630           /* Additional space for PIC loading of target address.  */
17631           length += 8;
17632           if (mips_opts.isa == ISA_MIPS1)
17633             /* Additional space for $at-stabilizing nop.  */
17634             length += 4;
17635         }
17636
17637       /* If branch is conditional.  */
17638       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
17639         length += 8;
17640     }
17641
17642   return length;
17643 }
17644
17645 /* Compute the length of a branch sequence, and adjust the
17646    RELAX_MICROMIPS_TOOFAR32 bit accordingly.  If FRAGP is NULL, the
17647    worst-case length is computed, with UPDATE being used to indicate
17648    whether an unconditional (-1), or regular (0) branch is to be
17649    computed.  */
17650
17651 static int
17652 relaxed_micromips_32bit_branch_length (fragS *fragp, asection *sec, int update)
17653 {
17654   bfd_boolean toofar;
17655   int length;
17656
17657   if (fragp
17658       && S_IS_DEFINED (fragp->fr_symbol)
17659       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17660     {
17661       addressT addr;
17662       offsetT val;
17663
17664       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17665       /* Ignore the low bit in the target, since it will be set
17666          for a text label.  */
17667       if ((val & 1) != 0)
17668         --val;
17669
17670       addr = fragp->fr_address + fragp->fr_fix + 4;
17671
17672       val -= addr;
17673
17674       toofar = val < - (0x8000 << 1) || val >= (0x8000 << 1);
17675     }
17676   else if (fragp)
17677     /* If the symbol is not defined or it's in a different segment,
17678        assume the user knows what's going on and emit a short
17679        branch.  */
17680     toofar = FALSE;
17681   else
17682     toofar = TRUE;
17683
17684   if (fragp && update
17685       && toofar != RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
17686     fragp->fr_subtype = (toofar
17687                          ? RELAX_MICROMIPS_MARK_TOOFAR32 (fragp->fr_subtype)
17688                          : RELAX_MICROMIPS_CLEAR_TOOFAR32 (fragp->fr_subtype));
17689
17690   length = 4;
17691   if (toofar)
17692     {
17693       bfd_boolean compact_known = fragp != NULL;
17694       bfd_boolean compact = FALSE;
17695       bfd_boolean uncond;
17696
17697       if (compact_known)
17698         compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
17699       if (fragp)
17700         uncond = RELAX_MICROMIPS_UNCOND (fragp->fr_subtype);
17701       else
17702         uncond = update < 0;
17703
17704       /* If label is out of range, we turn branch <br>:
17705
17706                 <br>    label                   # 4 bytes
17707             0:
17708
17709          into:
17710
17711                 j       label                   # 4 bytes
17712                 nop                             # 2 bytes if compact && !PIC
17713             0:
17714        */
17715       if (mips_pic == NO_PIC && (!compact_known || compact))
17716         length += 2;
17717
17718       /* If assembling PIC code, we further turn:
17719
17720                         j       label                   # 4 bytes
17721
17722          into:
17723
17724                         lw/ld   at, %got(label)(gp)     # 4 bytes
17725                         d/addiu at, %lo(label)          # 4 bytes
17726                         jr/c    at                      # 2 bytes
17727        */
17728       if (mips_pic != NO_PIC)
17729         length += 6;
17730
17731       /* If branch <br> is conditional, we prepend negated branch <brneg>:
17732
17733                         <brneg> 0f                      # 4 bytes
17734                         nop                             # 2 bytes if !compact
17735        */
17736       if (!uncond)
17737         length += (compact_known && compact) ? 4 : 6;
17738     }
17739
17740   return length;
17741 }
17742
17743 /* Compute the length of a branch, and adjust the RELAX_MICROMIPS_TOOFAR16
17744    bit accordingly.  */
17745
17746 static int
17747 relaxed_micromips_16bit_branch_length (fragS *fragp, asection *sec, int update)
17748 {
17749   bfd_boolean toofar;
17750
17751   if (fragp
17752       && S_IS_DEFINED (fragp->fr_symbol)
17753       && sec == S_GET_SEGMENT (fragp->fr_symbol))
17754     {
17755       addressT addr;
17756       offsetT val;
17757       int type;
17758
17759       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17760       /* Ignore the low bit in the target, since it will be set
17761          for a text label.  */
17762       if ((val & 1) != 0)
17763         --val;
17764
17765       /* Assume this is a 2-byte branch.  */
17766       addr = fragp->fr_address + fragp->fr_fix + 2;
17767
17768       /* We try to avoid the infinite loop by not adding 2 more bytes for
17769          long branches.  */
17770
17771       val -= addr;
17772
17773       type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
17774       if (type == 'D')
17775         toofar = val < - (0x200 << 1) || val >= (0x200 << 1);
17776       else if (type == 'E')
17777         toofar = val < - (0x40 << 1) || val >= (0x40 << 1);
17778       else
17779         abort ();
17780     }
17781   else
17782     /* If the symbol is not defined or it's in a different segment,
17783        we emit a normal 32-bit branch.  */
17784     toofar = TRUE;
17785
17786   if (fragp && update
17787       && toofar != RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
17788     fragp->fr_subtype
17789       = toofar ? RELAX_MICROMIPS_MARK_TOOFAR16 (fragp->fr_subtype)
17790                : RELAX_MICROMIPS_CLEAR_TOOFAR16 (fragp->fr_subtype);
17791
17792   if (toofar)
17793     return 4;
17794
17795   return 2;
17796 }
17797
17798 /* Estimate the size of a frag before relaxing.  Unless this is the
17799    mips16, we are not really relaxing here, and the final size is
17800    encoded in the subtype information.  For the mips16, we have to
17801    decide whether we are using an extended opcode or not.  */
17802
17803 int
17804 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
17805 {
17806   int change;
17807
17808   if (RELAX_BRANCH_P (fragp->fr_subtype))
17809     {
17810
17811       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
17812
17813       return fragp->fr_var;
17814     }
17815
17816   if (RELAX_MIPS16_P (fragp->fr_subtype))
17817     /* We don't want to modify the EXTENDED bit here; it might get us
17818        into infinite loops.  We change it only in mips_relax_frag().  */
17819     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
17820
17821   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17822     {
17823       int length = 4;
17824
17825       if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
17826         length = relaxed_micromips_16bit_branch_length (fragp, segtype, FALSE);
17827       if (length == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
17828         length = relaxed_micromips_32bit_branch_length (fragp, segtype, FALSE);
17829       fragp->fr_var = length;
17830
17831       return length;
17832     }
17833
17834   if (mips_pic == NO_PIC)
17835     change = nopic_need_relax (fragp->fr_symbol, 0);
17836   else if (mips_pic == SVR4_PIC)
17837     change = pic_need_relax (fragp->fr_symbol, segtype);
17838   else if (mips_pic == VXWORKS_PIC)
17839     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
17840     change = 0;
17841   else
17842     abort ();
17843
17844   if (change)
17845     {
17846       fragp->fr_subtype |= RELAX_USE_SECOND;
17847       return -RELAX_FIRST (fragp->fr_subtype);
17848     }
17849   else
17850     return -RELAX_SECOND (fragp->fr_subtype);
17851 }
17852
17853 /* This is called to see whether a reloc against a defined symbol
17854    should be converted into a reloc against a section.  */
17855
17856 int
17857 mips_fix_adjustable (fixS *fixp)
17858 {
17859   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
17860       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17861     return 0;
17862
17863   if (fixp->fx_addsy == NULL)
17864     return 1;
17865
17866   /* If symbol SYM is in a mergeable section, relocations of the form
17867      SYM + 0 can usually be made section-relative.  The mergeable data
17868      is then identified by the section offset rather than by the symbol.
17869
17870      However, if we're generating REL LO16 relocations, the offset is split
17871      between the LO16 and parterning high part relocation.  The linker will
17872      need to recalculate the complete offset in order to correctly identify
17873      the merge data.
17874
17875      The linker has traditionally not looked for the parterning high part
17876      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
17877      placed anywhere.  Rather than break backwards compatibility by changing
17878      this, it seems better not to force the issue, and instead keep the
17879      original symbol.  This will work with either linker behavior.  */
17880   if ((lo16_reloc_p (fixp->fx_r_type)
17881        || reloc_needs_lo_p (fixp->fx_r_type))
17882       && HAVE_IN_PLACE_ADDENDS
17883       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
17884     return 0;
17885
17886   /* There is no place to store an in-place offset for JALR relocations.
17887      Likewise an in-range offset of limited PC-relative relocations may
17888      overflow the in-place relocatable field if recalculated against the
17889      start address of the symbol's containing section.  */
17890   if (HAVE_IN_PLACE_ADDENDS
17891       && (limited_pcrel_reloc_p (fixp->fx_r_type)
17892           || jalr_reloc_p (fixp->fx_r_type)))
17893     return 0;
17894
17895   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
17896      to a floating-point stub.  The same is true for non-R_MIPS16_26
17897      relocations against MIPS16 functions; in this case, the stub becomes
17898      the function's canonical address.
17899
17900      Floating-point stubs are stored in unique .mips16.call.* or
17901      .mips16.fn.* sections.  If a stub T for function F is in section S,
17902      the first relocation in section S must be against F; this is how the
17903      linker determines the target function.  All relocations that might
17904      resolve to T must also be against F.  We therefore have the following
17905      restrictions, which are given in an intentionally-redundant way:
17906
17907        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
17908           symbols.
17909
17910        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
17911           if that stub might be used.
17912
17913        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
17914           symbols.
17915
17916        4. We cannot reduce a stub's relocations against MIPS16 symbols if
17917           that stub might be used.
17918
17919      There is a further restriction:
17920
17921        5. We cannot reduce jump relocations (R_MIPS_26, R_MIPS16_26 or
17922           R_MICROMIPS_26_S1) against MIPS16 or microMIPS symbols on
17923           targets with in-place addends; the relocation field cannot
17924           encode the low bit.
17925
17926      For simplicity, we deal with (3)-(4) by not reducing _any_ relocation
17927      against a MIPS16 symbol.  We deal with (5) by by not reducing any
17928      such relocations on REL targets.
17929
17930      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
17931      relocation against some symbol R, no relocation against R may be
17932      reduced.  (Note that this deals with (2) as well as (1) because
17933      relocations against global symbols will never be reduced on ELF
17934      targets.)  This approach is a little simpler than trying to detect
17935      stub sections, and gives the "all or nothing" per-symbol consistency
17936      that we have for MIPS16 symbols.  */
17937   if (fixp->fx_subsy == NULL
17938       && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
17939           || *symbol_get_tc (fixp->fx_addsy)
17940           || (HAVE_IN_PLACE_ADDENDS
17941               && ELF_ST_IS_MICROMIPS (S_GET_OTHER (fixp->fx_addsy))
17942               && jmp_reloc_p (fixp->fx_r_type))))
17943     return 0;
17944
17945   return 1;
17946 }
17947
17948 /* Translate internal representation of relocation info to BFD target
17949    format.  */
17950
17951 arelent **
17952 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
17953 {
17954   static arelent *retval[4];
17955   arelent *reloc;
17956   bfd_reloc_code_real_type code;
17957
17958   memset (retval, 0, sizeof(retval));
17959   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
17960   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
17961   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
17962   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
17963
17964   if (fixp->fx_pcrel)
17965     {
17966       gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2
17967                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
17968                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
17969                   || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1
17970                   || fixp->fx_r_type == BFD_RELOC_32_PCREL);
17971
17972       /* At this point, fx_addnumber is "symbol offset - pcrel address".
17973          Relocations want only the symbol offset.  */
17974       reloc->addend = fixp->fx_addnumber + reloc->address;
17975     }
17976   else
17977     reloc->addend = fixp->fx_addnumber;
17978
17979   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
17980      entry to be used in the relocation's section offset.  */
17981   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17982     {
17983       reloc->address = reloc->addend;
17984       reloc->addend = 0;
17985     }
17986
17987   code = fixp->fx_r_type;
17988
17989   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
17990   if (reloc->howto == NULL)
17991     {
17992       as_bad_where (fixp->fx_file, fixp->fx_line,
17993                     _("Can not represent %s relocation in this object file format"),
17994                     bfd_get_reloc_code_name (code));
17995       retval[0] = NULL;
17996     }
17997
17998   return retval;
17999 }
18000
18001 /* Relax a machine dependent frag.  This returns the amount by which
18002    the current size of the frag should change.  */
18003
18004 int
18005 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
18006 {
18007   if (RELAX_BRANCH_P (fragp->fr_subtype))
18008     {
18009       offsetT old_var = fragp->fr_var;
18010
18011       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
18012
18013       return fragp->fr_var - old_var;
18014     }
18015
18016   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
18017     {
18018       offsetT old_var = fragp->fr_var;
18019       offsetT new_var = 4;
18020
18021       if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
18022         new_var = relaxed_micromips_16bit_branch_length (fragp, sec, TRUE);
18023       if (new_var == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
18024         new_var = relaxed_micromips_32bit_branch_length (fragp, sec, TRUE);
18025       fragp->fr_var = new_var;
18026
18027       return new_var - old_var;
18028     }
18029
18030   if (! RELAX_MIPS16_P (fragp->fr_subtype))
18031     return 0;
18032
18033   if (mips16_extended_frag (fragp, NULL, stretch))
18034     {
18035       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
18036         return 0;
18037       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
18038       return 2;
18039     }
18040   else
18041     {
18042       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
18043         return 0;
18044       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
18045       return -2;
18046     }
18047
18048   return 0;
18049 }
18050
18051 /* Convert a machine dependent frag.  */
18052
18053 void
18054 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
18055 {
18056   if (RELAX_BRANCH_P (fragp->fr_subtype))
18057     {
18058       char *buf;
18059       unsigned long insn;
18060       expressionS exp;
18061       fixS *fixp;
18062
18063       buf = fragp->fr_literal + fragp->fr_fix;
18064       insn = read_insn (buf);
18065
18066       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
18067         {
18068           /* We generate a fixup instead of applying it right now
18069              because, if there are linker relaxations, we're going to
18070              need the relocations.  */
18071           exp.X_op = O_symbol;
18072           exp.X_add_symbol = fragp->fr_symbol;
18073           exp.X_add_number = fragp->fr_offset;
18074
18075           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, TRUE,
18076                               BFD_RELOC_16_PCREL_S2);
18077           fixp->fx_file = fragp->fr_file;
18078           fixp->fx_line = fragp->fr_line;
18079
18080           buf = write_insn (buf, insn);
18081         }
18082       else
18083         {
18084           int i;
18085
18086           as_warn_where (fragp->fr_file, fragp->fr_line,
18087                          _("Relaxed out-of-range branch into a jump"));
18088
18089           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
18090             goto uncond;
18091
18092           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18093             {
18094               /* Reverse the branch.  */
18095               switch ((insn >> 28) & 0xf)
18096                 {
18097                 case 4:
18098                   /* bc[0-3][tf]l? instructions can have the condition
18099                      reversed by tweaking a single TF bit, and their
18100                      opcodes all have 0x4???????.  */
18101                   gas_assert ((insn & 0xf3e00000) == 0x41000000);
18102                   insn ^= 0x00010000;
18103                   break;
18104
18105                 case 0:
18106                   /* bltz       0x04000000      bgez    0x04010000
18107                      bltzal     0x04100000      bgezal  0x04110000  */
18108                   gas_assert ((insn & 0xfc0e0000) == 0x04000000);
18109                   insn ^= 0x00010000;
18110                   break;
18111
18112                 case 1:
18113                   /* beq        0x10000000      bne     0x14000000
18114                      blez       0x18000000      bgtz    0x1c000000  */
18115                   insn ^= 0x04000000;
18116                   break;
18117
18118                 default:
18119                   abort ();
18120                 }
18121             }
18122
18123           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
18124             {
18125               /* Clear the and-link bit.  */
18126               gas_assert ((insn & 0xfc1c0000) == 0x04100000);
18127
18128               /* bltzal         0x04100000      bgezal  0x04110000
18129                  bltzall        0x04120000      bgezall 0x04130000  */
18130               insn &= ~0x00100000;
18131             }
18132
18133           /* Branch over the branch (if the branch was likely) or the
18134              full jump (not likely case).  Compute the offset from the
18135              current instruction to branch to.  */
18136           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18137             i = 16;
18138           else
18139             {
18140               /* How many bytes in instructions we've already emitted?  */
18141               i = buf - fragp->fr_literal - fragp->fr_fix;
18142               /* How many bytes in instructions from here to the end?  */
18143               i = fragp->fr_var - i;
18144             }
18145           /* Convert to instruction count.  */
18146           i >>= 2;
18147           /* Branch counts from the next instruction.  */
18148           i--;
18149           insn |= i;
18150           /* Branch over the jump.  */
18151           buf = write_insn (buf, insn);
18152
18153           /* nop */
18154           buf = write_insn (buf, 0);
18155
18156           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18157             {
18158               /* beql $0, $0, 2f */
18159               insn = 0x50000000;
18160               /* Compute the PC offset from the current instruction to
18161                  the end of the variable frag.  */
18162               /* How many bytes in instructions we've already emitted?  */
18163               i = buf - fragp->fr_literal - fragp->fr_fix;
18164               /* How many bytes in instructions from here to the end?  */
18165               i = fragp->fr_var - i;
18166               /* Convert to instruction count.  */
18167               i >>= 2;
18168               /* Don't decrement i, because we want to branch over the
18169                  delay slot.  */
18170               insn |= i;
18171
18172               buf = write_insn (buf, insn);
18173               buf = write_insn (buf, 0);
18174             }
18175
18176         uncond:
18177           if (mips_pic == NO_PIC)
18178             {
18179               /* j or jal.  */
18180               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
18181                       ? 0x0c000000 : 0x08000000);
18182               exp.X_op = O_symbol;
18183               exp.X_add_symbol = fragp->fr_symbol;
18184               exp.X_add_number = fragp->fr_offset;
18185
18186               fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18187                                   FALSE, BFD_RELOC_MIPS_JMP);
18188               fixp->fx_file = fragp->fr_file;
18189               fixp->fx_line = fragp->fr_line;
18190
18191               buf = write_insn (buf, insn);
18192             }
18193           else
18194             {
18195               unsigned long at = RELAX_BRANCH_AT (fragp->fr_subtype);
18196
18197               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
18198               insn = HAVE_64BIT_ADDRESSES ? 0xdf800000 : 0x8f800000;
18199               insn |= at << OP_SH_RT;
18200               exp.X_op = O_symbol;
18201               exp.X_add_symbol = fragp->fr_symbol;
18202               exp.X_add_number = fragp->fr_offset;
18203
18204               if (fragp->fr_offset)
18205                 {
18206                   exp.X_add_symbol = make_expr_symbol (&exp);
18207                   exp.X_add_number = 0;
18208                 }
18209
18210               fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18211                                   FALSE, BFD_RELOC_MIPS_GOT16);
18212               fixp->fx_file = fragp->fr_file;
18213               fixp->fx_line = fragp->fr_line;
18214
18215               buf = write_insn (buf, insn);
18216
18217               if (mips_opts.isa == ISA_MIPS1)
18218                 /* nop */
18219                 buf = write_insn (buf, 0);
18220
18221               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
18222               insn = HAVE_64BIT_ADDRESSES ? 0x64000000 : 0x24000000;
18223               insn |= at << OP_SH_RS | at << OP_SH_RT;
18224
18225               fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18226                                   FALSE, BFD_RELOC_LO16);
18227               fixp->fx_file = fragp->fr_file;
18228               fixp->fx_line = fragp->fr_line;
18229
18230               buf = write_insn (buf, insn);
18231
18232               /* j(al)r $at.  */
18233               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
18234                 insn = 0x0000f809;
18235               else
18236                 insn = 0x00000008;
18237               insn |= at << OP_SH_RS;
18238
18239               buf = write_insn (buf, insn);
18240             }
18241         }
18242
18243       fragp->fr_fix += fragp->fr_var;
18244       gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18245       return;
18246     }
18247
18248   /* Relax microMIPS branches.  */
18249   if (RELAX_MICROMIPS_P (fragp->fr_subtype))
18250     {
18251       char *buf = fragp->fr_literal + fragp->fr_fix;
18252       bfd_boolean compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
18253       bfd_boolean al = RELAX_MICROMIPS_LINK (fragp->fr_subtype);
18254       int type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
18255       bfd_boolean short_ds;
18256       unsigned long insn;
18257       expressionS exp;
18258       fixS *fixp;
18259
18260       exp.X_op = O_symbol;
18261       exp.X_add_symbol = fragp->fr_symbol;
18262       exp.X_add_number = fragp->fr_offset;
18263
18264       fragp->fr_fix += fragp->fr_var;
18265
18266       /* Handle 16-bit branches that fit or are forced to fit.  */
18267       if (type != 0 && !RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
18268         {
18269           /* We generate a fixup instead of applying it right now,
18270              because if there is linker relaxation, we're going to
18271              need the relocations.  */
18272           if (type == 'D')
18273             fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 2, &exp, TRUE,
18274                                 BFD_RELOC_MICROMIPS_10_PCREL_S1);
18275           else if (type == 'E')
18276             fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 2, &exp, TRUE,
18277                                 BFD_RELOC_MICROMIPS_7_PCREL_S1);
18278           else
18279             abort ();
18280
18281           fixp->fx_file = fragp->fr_file;
18282           fixp->fx_line = fragp->fr_line;
18283
18284           /* These relocations can have an addend that won't fit in
18285              2 octets.  */
18286           fixp->fx_no_overflow = 1;
18287
18288           return;
18289         }
18290
18291       /* Handle 32-bit branches that fit or are forced to fit.  */
18292       if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
18293           || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
18294         {
18295           /* We generate a fixup instead of applying it right now,
18296              because if there is linker relaxation, we're going to
18297              need the relocations.  */
18298           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, TRUE,
18299                               BFD_RELOC_MICROMIPS_16_PCREL_S1);
18300           fixp->fx_file = fragp->fr_file;
18301           fixp->fx_line = fragp->fr_line;
18302
18303           if (type == 0)
18304             return;
18305         }
18306
18307       /* Relax 16-bit branches to 32-bit branches.  */
18308       if (type != 0)
18309         {
18310           insn = read_compressed_insn (buf, 2);
18311
18312           if ((insn & 0xfc00) == 0xcc00)                /* b16  */
18313             insn = 0x94000000;                          /* beq  */
18314           else if ((insn & 0xdc00) == 0x8c00)           /* beqz16/bnez16  */
18315             {
18316               unsigned long regno;
18317
18318               regno = (insn >> MICROMIPSOP_SH_MD) & MICROMIPSOP_MASK_MD;
18319               regno = micromips_to_32_reg_d_map [regno];
18320               insn = ((insn & 0x2000) << 16) | 0x94000000;      /* beq/bne  */
18321               insn |= regno << MICROMIPSOP_SH_RS;
18322             }
18323           else
18324             abort ();
18325
18326           /* Nothing else to do, just write it out.  */
18327           if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
18328               || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
18329             {
18330               buf = write_compressed_insn (buf, insn, 4);
18331               gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18332               return;
18333             }
18334         }
18335       else
18336         insn = read_compressed_insn (buf, 4);
18337
18338       /* Relax 32-bit branches to a sequence of instructions.  */
18339       as_warn_where (fragp->fr_file, fragp->fr_line,
18340                      _("Relaxed out-of-range branch into a jump"));
18341
18342       /* Set the short-delay-slot bit.  */
18343       short_ds = al && (insn & 0x02000000) != 0;
18344
18345       if (!RELAX_MICROMIPS_UNCOND (fragp->fr_subtype))
18346         {
18347           symbolS *l;
18348
18349           /* Reverse the branch.  */
18350           if ((insn & 0xfc000000) == 0x94000000                 /* beq  */
18351               || (insn & 0xfc000000) == 0xb4000000)             /* bne  */
18352             insn ^= 0x20000000;
18353           else if ((insn & 0xffe00000) == 0x40000000            /* bltz  */
18354                    || (insn & 0xffe00000) == 0x40400000         /* bgez  */
18355                    || (insn & 0xffe00000) == 0x40800000         /* blez  */
18356                    || (insn & 0xffe00000) == 0x40c00000         /* bgtz  */
18357                    || (insn & 0xffe00000) == 0x40a00000         /* bnezc  */
18358                    || (insn & 0xffe00000) == 0x40e00000         /* beqzc  */
18359                    || (insn & 0xffe00000) == 0x40200000         /* bltzal  */
18360                    || (insn & 0xffe00000) == 0x40600000         /* bgezal  */
18361                    || (insn & 0xffe00000) == 0x42200000         /* bltzals  */
18362                    || (insn & 0xffe00000) == 0x42600000)        /* bgezals  */
18363             insn ^= 0x00400000;
18364           else if ((insn & 0xffe30000) == 0x43800000            /* bc1f  */
18365                    || (insn & 0xffe30000) == 0x43a00000         /* bc1t  */
18366                    || (insn & 0xffe30000) == 0x42800000         /* bc2f  */
18367                    || (insn & 0xffe30000) == 0x42a00000)        /* bc2t  */
18368             insn ^= 0x00200000;
18369           else
18370             abort ();
18371
18372           if (al)
18373             {
18374               /* Clear the and-link and short-delay-slot bits.  */
18375               gas_assert ((insn & 0xfda00000) == 0x40200000);
18376
18377               /* bltzal  0x40200000     bgezal  0x40600000  */
18378               /* bltzals 0x42200000     bgezals 0x42600000  */
18379               insn &= ~0x02200000;
18380             }
18381
18382           /* Make a label at the end for use with the branch.  */
18383           l = symbol_new (micromips_label_name (), asec, fragp->fr_fix, fragp);
18384           micromips_label_inc ();
18385           S_SET_OTHER (l, ELF_ST_SET_MICROMIPS (S_GET_OTHER (l)));
18386
18387           /* Refer to it.  */
18388           fixp = fix_new (fragp, buf - fragp->fr_literal, 4, l, 0, TRUE,
18389                           BFD_RELOC_MICROMIPS_16_PCREL_S1);
18390           fixp->fx_file = fragp->fr_file;
18391           fixp->fx_line = fragp->fr_line;
18392
18393           /* Branch over the jump.  */
18394           buf = write_compressed_insn (buf, insn, 4);
18395           if (!compact)
18396             /* nop */
18397             buf = write_compressed_insn (buf, 0x0c00, 2);
18398         }
18399
18400       if (mips_pic == NO_PIC)
18401         {
18402           unsigned long jal = short_ds ? 0x74000000 : 0xf4000000; /* jal/s  */
18403
18404           /* j/jal/jals <sym>  R_MICROMIPS_26_S1  */
18405           insn = al ? jal : 0xd4000000;
18406
18407           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18408                               BFD_RELOC_MICROMIPS_JMP);
18409           fixp->fx_file = fragp->fr_file;
18410           fixp->fx_line = fragp->fr_line;
18411
18412           buf = write_compressed_insn (buf, insn, 4);
18413           if (compact)
18414             /* nop */
18415             buf = write_compressed_insn (buf, 0x0c00, 2);
18416         }
18417       else
18418         {
18419           unsigned long at = RELAX_MICROMIPS_AT (fragp->fr_subtype);
18420           unsigned long jalr = short_ds ? 0x45e0 : 0x45c0;      /* jalr/s  */
18421           unsigned long jr = compact ? 0x45a0 : 0x4580;         /* jr/c  */
18422
18423           /* lw/ld $at, <sym>($gp)  R_MICROMIPS_GOT16  */
18424           insn = HAVE_64BIT_ADDRESSES ? 0xdc1c0000 : 0xfc1c0000;
18425           insn |= at << MICROMIPSOP_SH_RT;
18426
18427           if (exp.X_add_number)
18428             {
18429               exp.X_add_symbol = make_expr_symbol (&exp);
18430               exp.X_add_number = 0;
18431             }
18432
18433           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18434                               BFD_RELOC_MICROMIPS_GOT16);
18435           fixp->fx_file = fragp->fr_file;
18436           fixp->fx_line = fragp->fr_line;
18437
18438           buf = write_compressed_insn (buf, insn, 4);
18439
18440           /* d/addiu $at, $at, <sym>  R_MICROMIPS_LO16  */
18441           insn = HAVE_64BIT_ADDRESSES ? 0x5c000000 : 0x30000000;
18442           insn |= at << MICROMIPSOP_SH_RT | at << MICROMIPSOP_SH_RS;
18443
18444           fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18445                               BFD_RELOC_MICROMIPS_LO16);
18446           fixp->fx_file = fragp->fr_file;
18447           fixp->fx_line = fragp->fr_line;
18448
18449           buf = write_compressed_insn (buf, insn, 4);
18450
18451           /* jr/jrc/jalr/jalrs $at  */
18452           insn = al ? jalr : jr;
18453           insn |= at << MICROMIPSOP_SH_MJ;
18454
18455           buf = write_compressed_insn (buf, insn, 2);
18456         }
18457
18458       gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18459       return;
18460     }
18461
18462   if (RELAX_MIPS16_P (fragp->fr_subtype))
18463     {
18464       int type;
18465       const struct mips16_immed_operand *op;
18466       offsetT val;
18467       char *buf;
18468       unsigned int user_length, length;
18469       unsigned long insn;
18470       bfd_boolean ext;
18471
18472       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
18473       op = mips16_immed_operands;
18474       while (op->type != type)
18475         ++op;
18476
18477       ext = RELAX_MIPS16_EXTENDED (fragp->fr_subtype);
18478       val = resolve_symbol_value (fragp->fr_symbol);
18479       if (op->pcrel)
18480         {
18481           addressT addr;
18482
18483           addr = fragp->fr_address + fragp->fr_fix;
18484
18485           /* The rules for the base address of a PC relative reloc are
18486              complicated; see mips16_extended_frag.  */
18487           if (type == 'p' || type == 'q')
18488             {
18489               addr += 2;
18490               if (ext)
18491                 addr += 2;
18492               /* Ignore the low bit in the target, since it will be
18493                  set for a text label.  */
18494               if ((val & 1) != 0)
18495                 --val;
18496             }
18497           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
18498             addr -= 4;
18499           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
18500             addr -= 2;
18501
18502           addr &= ~ (addressT) ((1 << op->shift) - 1);
18503           val -= addr;
18504
18505           /* Make sure the section winds up with the alignment we have
18506              assumed.  */
18507           if (op->shift > 0)
18508             record_alignment (asec, op->shift);
18509         }
18510
18511       if (ext
18512           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
18513               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
18514         as_warn_where (fragp->fr_file, fragp->fr_line,
18515                        _("extended instruction in delay slot"));
18516
18517       buf = fragp->fr_literal + fragp->fr_fix;
18518
18519       insn = read_compressed_insn (buf, 2);
18520       if (ext)
18521         insn |= MIPS16_EXTEND;
18522
18523       if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
18524         user_length = 4;
18525       else if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
18526         user_length = 2;
18527       else
18528         user_length = 0;
18529
18530       mips16_immed (fragp->fr_file, fragp->fr_line, type,
18531                     BFD_RELOC_UNUSED, val, user_length, &insn);
18532
18533       length = (ext ? 4 : 2);
18534       gas_assert (mips16_opcode_length (insn) == length);
18535       write_compressed_insn (buf, insn, length);
18536       fragp->fr_fix += length;
18537     }
18538   else
18539     {
18540       relax_substateT subtype = fragp->fr_subtype;
18541       bfd_boolean second_longer = (subtype & RELAX_SECOND_LONGER) != 0;
18542       bfd_boolean use_second = (subtype & RELAX_USE_SECOND) != 0;
18543       int first, second;
18544       fixS *fixp;
18545
18546       first = RELAX_FIRST (subtype);
18547       second = RELAX_SECOND (subtype);
18548       fixp = (fixS *) fragp->fr_opcode;
18549
18550       /* If the delay slot chosen does not match the size of the instruction,
18551          then emit a warning.  */
18552       if ((!use_second && (subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0)
18553            || (use_second && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0))
18554         {
18555           relax_substateT s;
18556           const char *msg;
18557
18558           s = subtype & (RELAX_DELAY_SLOT_16BIT
18559                          | RELAX_DELAY_SLOT_SIZE_FIRST
18560                          | RELAX_DELAY_SLOT_SIZE_SECOND);
18561           msg = macro_warning (s);
18562           if (msg != NULL)
18563             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18564           subtype &= ~s;
18565         }
18566
18567       /* Possibly emit a warning if we've chosen the longer option.  */
18568       if (use_second == second_longer)
18569         {
18570           relax_substateT s;
18571           const char *msg;
18572
18573           s = (subtype
18574                & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT));
18575           msg = macro_warning (s);
18576           if (msg != NULL)
18577             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18578           subtype &= ~s;
18579         }
18580
18581       /* Go through all the fixups for the first sequence.  Disable them
18582          (by marking them as done) if we're going to use the second
18583          sequence instead.  */
18584       while (fixp
18585              && fixp->fx_frag == fragp
18586              && fixp->fx_where < fragp->fr_fix - second)
18587         {
18588           if (subtype & RELAX_USE_SECOND)
18589             fixp->fx_done = 1;
18590           fixp = fixp->fx_next;
18591         }
18592
18593       /* Go through the fixups for the second sequence.  Disable them if
18594          we're going to use the first sequence, otherwise adjust their
18595          addresses to account for the relaxation.  */
18596       while (fixp && fixp->fx_frag == fragp)
18597         {
18598           if (subtype & RELAX_USE_SECOND)
18599             fixp->fx_where -= first;
18600           else
18601             fixp->fx_done = 1;
18602           fixp = fixp->fx_next;
18603         }
18604
18605       /* Now modify the frag contents.  */
18606       if (subtype & RELAX_USE_SECOND)
18607         {
18608           char *start;
18609
18610           start = fragp->fr_literal + fragp->fr_fix - first - second;
18611           memmove (start, start + first, second);
18612           fragp->fr_fix -= first;
18613         }
18614       else
18615         fragp->fr_fix -= second;
18616     }
18617 }
18618
18619 /* This function is called after the relocs have been generated.
18620    We've been storing mips16 text labels as odd.  Here we convert them
18621    back to even for the convenience of the debugger.  */
18622
18623 void
18624 mips_frob_file_after_relocs (void)
18625 {
18626   asymbol **syms;
18627   unsigned int count, i;
18628
18629   syms = bfd_get_outsymbols (stdoutput);
18630   count = bfd_get_symcount (stdoutput);
18631   for (i = 0; i < count; i++, syms++)
18632     if (ELF_ST_IS_COMPRESSED (elf_symbol (*syms)->internal_elf_sym.st_other)
18633         && ((*syms)->value & 1) != 0)
18634       {
18635         (*syms)->value &= ~1;
18636         /* If the symbol has an odd size, it was probably computed
18637            incorrectly, so adjust that as well.  */
18638         if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
18639           ++elf_symbol (*syms)->internal_elf_sym.st_size;
18640       }
18641 }
18642
18643 /* This function is called whenever a label is defined, including fake
18644    labels instantiated off the dot special symbol.  It is used when
18645    handling branch delays; if a branch has a label, we assume we cannot
18646    move it.  This also bumps the value of the symbol by 1 in compressed
18647    code.  */
18648
18649 static void
18650 mips_record_label (symbolS *sym)
18651 {
18652   segment_info_type *si = seg_info (now_seg);
18653   struct insn_label_list *l;
18654
18655   if (free_insn_labels == NULL)
18656     l = (struct insn_label_list *) xmalloc (sizeof *l);
18657   else
18658     {
18659       l = free_insn_labels;
18660       free_insn_labels = l->next;
18661     }
18662
18663   l->label = sym;
18664   l->next = si->label_list;
18665   si->label_list = l;
18666 }
18667
18668 /* This function is called as tc_frob_label() whenever a label is defined
18669    and adds a DWARF-2 record we only want for true labels.  */
18670
18671 void
18672 mips_define_label (symbolS *sym)
18673 {
18674   mips_record_label (sym);
18675   dwarf2_emit_label (sym);
18676 }
18677
18678 /* This function is called by tc_new_dot_label whenever a new dot symbol
18679    is defined.  */
18680
18681 void
18682 mips_add_dot_label (symbolS *sym)
18683 {
18684   mips_record_label (sym);
18685   if (mips_assembling_insn && HAVE_CODE_COMPRESSION)
18686     mips_compressed_mark_label (sym);
18687 }
18688 \f
18689 /* Some special processing for a MIPS ELF file.  */
18690
18691 void
18692 mips_elf_final_processing (void)
18693 {
18694   /* Write out the register information.  */
18695   if (mips_abi != N64_ABI)
18696     {
18697       Elf32_RegInfo s;
18698
18699       s.ri_gprmask = mips_gprmask;
18700       s.ri_cprmask[0] = mips_cprmask[0];
18701       s.ri_cprmask[1] = mips_cprmask[1];
18702       s.ri_cprmask[2] = mips_cprmask[2];
18703       s.ri_cprmask[3] = mips_cprmask[3];
18704       /* The gp_value field is set by the MIPS ELF backend.  */
18705
18706       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
18707                                        ((Elf32_External_RegInfo *)
18708                                         mips_regmask_frag));
18709     }
18710   else
18711     {
18712       Elf64_Internal_RegInfo s;
18713
18714       s.ri_gprmask = mips_gprmask;
18715       s.ri_pad = 0;
18716       s.ri_cprmask[0] = mips_cprmask[0];
18717       s.ri_cprmask[1] = mips_cprmask[1];
18718       s.ri_cprmask[2] = mips_cprmask[2];
18719       s.ri_cprmask[3] = mips_cprmask[3];
18720       /* The gp_value field is set by the MIPS ELF backend.  */
18721
18722       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
18723                                        ((Elf64_External_RegInfo *)
18724                                         mips_regmask_frag));
18725     }
18726
18727   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
18728      sort of BFD interface for this.  */
18729   if (mips_any_noreorder)
18730     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
18731   if (mips_pic != NO_PIC)
18732     {
18733       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
18734       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18735     }
18736   if (mips_abicalls)
18737     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18738
18739   /* Set MIPS ELF flags for ASEs.  Note that not all ASEs have flags
18740      defined at present; this might need to change in future.  */
18741   if (file_ase_mips16)
18742     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
18743   if (file_ase_micromips)
18744     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MICROMIPS;
18745   if (file_ase & ASE_MDMX)
18746     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
18747
18748   /* Set the MIPS ELF ABI flags.  */
18749   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
18750     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
18751   else if (mips_abi == O64_ABI)
18752     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
18753   else if (mips_abi == EABI_ABI)
18754     {
18755       if (!file_mips_gp32)
18756         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
18757       else
18758         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
18759     }
18760   else if (mips_abi == N32_ABI)
18761     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
18762
18763   /* Nothing to do for N64_ABI.  */
18764
18765   if (mips_32bitmode)
18766     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
18767
18768 #if 0 /* XXX FIXME */
18769   /* 32 bit code with 64 bit FP registers.  */
18770   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
18771     elf_elfheader (stdoutput)->e_flags |= ???;
18772 #endif
18773 }
18774 \f
18775 typedef struct proc {
18776   symbolS *func_sym;
18777   symbolS *func_end_sym;
18778   unsigned long reg_mask;
18779   unsigned long reg_offset;
18780   unsigned long fpreg_mask;
18781   unsigned long fpreg_offset;
18782   unsigned long frame_offset;
18783   unsigned long frame_reg;
18784   unsigned long pc_reg;
18785 } procS;
18786
18787 static procS cur_proc;
18788 static procS *cur_proc_ptr;
18789 static int numprocs;
18790
18791 /* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1", a microMIPS nop
18792    as "2", and a normal nop as "0".  */
18793
18794 #define NOP_OPCODE_MIPS         0
18795 #define NOP_OPCODE_MIPS16       1
18796 #define NOP_OPCODE_MICROMIPS    2
18797
18798 char
18799 mips_nop_opcode (void)
18800 {
18801   if (seg_info (now_seg)->tc_segment_info_data.micromips)
18802     return NOP_OPCODE_MICROMIPS;
18803   else if (seg_info (now_seg)->tc_segment_info_data.mips16)
18804     return NOP_OPCODE_MIPS16;
18805   else
18806     return NOP_OPCODE_MIPS;
18807 }
18808
18809 /* Fill in an rs_align_code fragment.  Unlike elsewhere we want to use
18810    32-bit microMIPS NOPs here (if applicable).  */
18811
18812 void
18813 mips_handle_align (fragS *fragp)
18814 {
18815   char nop_opcode;
18816   char *p;
18817   int bytes, size, excess;
18818   valueT opcode;
18819
18820   if (fragp->fr_type != rs_align_code)
18821     return;
18822
18823   p = fragp->fr_literal + fragp->fr_fix;
18824   nop_opcode = *p;
18825   switch (nop_opcode)
18826     {
18827     case NOP_OPCODE_MICROMIPS:
18828       opcode = micromips_nop32_insn.insn_opcode;
18829       size = 4;
18830       break;
18831     case NOP_OPCODE_MIPS16:
18832       opcode = mips16_nop_insn.insn_opcode;
18833       size = 2;
18834       break;
18835     case NOP_OPCODE_MIPS:
18836     default:
18837       opcode = nop_insn.insn_opcode;
18838       size = 4;
18839       break;
18840     }
18841
18842   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
18843   excess = bytes % size;
18844
18845   /* Handle the leading part if we're not inserting a whole number of
18846      instructions, and make it the end of the fixed part of the frag.
18847      Try to fit in a short microMIPS NOP if applicable and possible,
18848      and use zeroes otherwise.  */
18849   gas_assert (excess < 4);
18850   fragp->fr_fix += excess;
18851   switch (excess)
18852     {
18853     case 3:
18854       *p++ = '\0';
18855       /* Fall through.  */
18856     case 2:
18857       if (nop_opcode == NOP_OPCODE_MICROMIPS)
18858         {
18859           p = write_compressed_insn (p, micromips_nop16_insn.insn_opcode, 2);
18860           break;
18861         }
18862       *p++ = '\0';
18863       /* Fall through.  */
18864     case 1:
18865       *p++ = '\0';
18866       /* Fall through.  */
18867     case 0:
18868       break;
18869     }
18870
18871   md_number_to_chars (p, opcode, size);
18872   fragp->fr_var = size;
18873 }
18874
18875 static void
18876 md_obj_begin (void)
18877 {
18878 }
18879
18880 static void
18881 md_obj_end (void)
18882 {
18883   /* Check for premature end, nesting errors, etc.  */
18884   if (cur_proc_ptr)
18885     as_warn (_("missing .end at end of assembly"));
18886 }
18887
18888 static long
18889 get_number (void)
18890 {
18891   int negative = 0;
18892   long val = 0;
18893
18894   if (*input_line_pointer == '-')
18895     {
18896       ++input_line_pointer;
18897       negative = 1;
18898     }
18899   if (!ISDIGIT (*input_line_pointer))
18900     as_bad (_("expected simple number"));
18901   if (input_line_pointer[0] == '0')
18902     {
18903       if (input_line_pointer[1] == 'x')
18904         {
18905           input_line_pointer += 2;
18906           while (ISXDIGIT (*input_line_pointer))
18907             {
18908               val <<= 4;
18909               val |= hex_value (*input_line_pointer++);
18910             }
18911           return negative ? -val : val;
18912         }
18913       else
18914         {
18915           ++input_line_pointer;
18916           while (ISDIGIT (*input_line_pointer))
18917             {
18918               val <<= 3;
18919               val |= *input_line_pointer++ - '0';
18920             }
18921           return negative ? -val : val;
18922         }
18923     }
18924   if (!ISDIGIT (*input_line_pointer))
18925     {
18926       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
18927               *input_line_pointer, *input_line_pointer);
18928       as_warn (_("invalid number"));
18929       return -1;
18930     }
18931   while (ISDIGIT (*input_line_pointer))
18932     {
18933       val *= 10;
18934       val += *input_line_pointer++ - '0';
18935     }
18936   return negative ? -val : val;
18937 }
18938
18939 /* The .file directive; just like the usual .file directive, but there
18940    is an initial number which is the ECOFF file index.  In the non-ECOFF
18941    case .file implies DWARF-2.  */
18942
18943 static void
18944 s_mips_file (int x ATTRIBUTE_UNUSED)
18945 {
18946   static int first_file_directive = 0;
18947
18948   if (ECOFF_DEBUGGING)
18949     {
18950       get_number ();
18951       s_app_file (0);
18952     }
18953   else
18954     {
18955       char *filename;
18956
18957       filename = dwarf2_directive_file (0);
18958
18959       /* Versions of GCC up to 3.1 start files with a ".file"
18960          directive even for stabs output.  Make sure that this
18961          ".file" is handled.  Note that you need a version of GCC
18962          after 3.1 in order to support DWARF-2 on MIPS.  */
18963       if (filename != NULL && ! first_file_directive)
18964         {
18965           (void) new_logical_line (filename, -1);
18966           s_app_file_string (filename, 0);
18967         }
18968       first_file_directive = 1;
18969     }
18970 }
18971
18972 /* The .loc directive, implying DWARF-2.  */
18973
18974 static void
18975 s_mips_loc (int x ATTRIBUTE_UNUSED)
18976 {
18977   if (!ECOFF_DEBUGGING)
18978     dwarf2_directive_loc (0);
18979 }
18980
18981 /* The .end directive.  */
18982
18983 static void
18984 s_mips_end (int x ATTRIBUTE_UNUSED)
18985 {
18986   symbolS *p;
18987
18988   /* Following functions need their own .frame and .cprestore directives.  */
18989   mips_frame_reg_valid = 0;
18990   mips_cprestore_valid = 0;
18991
18992   if (!is_end_of_line[(unsigned char) *input_line_pointer])
18993     {
18994       p = get_symbol ();
18995       demand_empty_rest_of_line ();
18996     }
18997   else
18998     p = NULL;
18999
19000   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
19001     as_warn (_(".end not in text section"));
19002
19003   if (!cur_proc_ptr)
19004     {
19005       as_warn (_(".end directive without a preceding .ent directive."));
19006       demand_empty_rest_of_line ();
19007       return;
19008     }
19009
19010   if (p != NULL)
19011     {
19012       gas_assert (S_GET_NAME (p));
19013       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
19014         as_warn (_(".end symbol does not match .ent symbol."));
19015
19016       if (debug_type == DEBUG_STABS)
19017         stabs_generate_asm_endfunc (S_GET_NAME (p),
19018                                     S_GET_NAME (p));
19019     }
19020   else
19021     as_warn (_(".end directive missing or unknown symbol"));
19022
19023   /* Create an expression to calculate the size of the function.  */
19024   if (p && cur_proc_ptr)
19025     {
19026       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
19027       expressionS *exp = xmalloc (sizeof (expressionS));
19028
19029       obj->size = exp;
19030       exp->X_op = O_subtract;
19031       exp->X_add_symbol = symbol_temp_new_now ();
19032       exp->X_op_symbol = p;
19033       exp->X_add_number = 0;
19034
19035       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
19036     }
19037
19038   /* Generate a .pdr section.  */
19039   if (!ECOFF_DEBUGGING && mips_flag_pdr)
19040     {
19041       segT saved_seg = now_seg;
19042       subsegT saved_subseg = now_subseg;
19043       expressionS exp;
19044       char *fragp;
19045
19046 #ifdef md_flush_pending_output
19047       md_flush_pending_output ();
19048 #endif
19049
19050       gas_assert (pdr_seg);
19051       subseg_set (pdr_seg, 0);
19052
19053       /* Write the symbol.  */
19054       exp.X_op = O_symbol;
19055       exp.X_add_symbol = p;
19056       exp.X_add_number = 0;
19057       emit_expr (&exp, 4);
19058
19059       fragp = frag_more (7 * 4);
19060
19061       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
19062       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
19063       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
19064       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
19065       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
19066       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
19067       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
19068
19069       subseg_set (saved_seg, saved_subseg);
19070     }
19071
19072   cur_proc_ptr = NULL;
19073 }
19074
19075 /* The .aent and .ent directives.  */
19076
19077 static void
19078 s_mips_ent (int aent)
19079 {
19080   symbolS *symbolP;
19081
19082   symbolP = get_symbol ();
19083   if (*input_line_pointer == ',')
19084     ++input_line_pointer;
19085   SKIP_WHITESPACE ();
19086   if (ISDIGIT (*input_line_pointer)
19087       || *input_line_pointer == '-')
19088     get_number ();
19089
19090   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
19091     as_warn (_(".ent or .aent not in text section."));
19092
19093   if (!aent && cur_proc_ptr)
19094     as_warn (_("missing .end"));
19095
19096   if (!aent)
19097     {
19098       /* This function needs its own .frame and .cprestore directives.  */
19099       mips_frame_reg_valid = 0;
19100       mips_cprestore_valid = 0;
19101
19102       cur_proc_ptr = &cur_proc;
19103       memset (cur_proc_ptr, '\0', sizeof (procS));
19104
19105       cur_proc_ptr->func_sym = symbolP;
19106
19107       ++numprocs;
19108
19109       if (debug_type == DEBUG_STABS)
19110         stabs_generate_asm_func (S_GET_NAME (symbolP),
19111                                  S_GET_NAME (symbolP));
19112     }
19113
19114   symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
19115
19116   demand_empty_rest_of_line ();
19117 }
19118
19119 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
19120    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
19121    s_mips_frame is used so that we can set the PDR information correctly.
19122    We can't use the ecoff routines because they make reference to the ecoff
19123    symbol table (in the mdebug section).  */
19124
19125 static void
19126 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
19127 {
19128   if (ECOFF_DEBUGGING)
19129     s_ignore (ignore);
19130   else
19131     {
19132       long val;
19133
19134       if (cur_proc_ptr == (procS *) NULL)
19135         {
19136           as_warn (_(".frame outside of .ent"));
19137           demand_empty_rest_of_line ();
19138           return;
19139         }
19140
19141       cur_proc_ptr->frame_reg = tc_get_register (1);
19142
19143       SKIP_WHITESPACE ();
19144       if (*input_line_pointer++ != ','
19145           || get_absolute_expression_and_terminator (&val) != ',')
19146         {
19147           as_warn (_("Bad .frame directive"));
19148           --input_line_pointer;
19149           demand_empty_rest_of_line ();
19150           return;
19151         }
19152
19153       cur_proc_ptr->frame_offset = val;
19154       cur_proc_ptr->pc_reg = tc_get_register (0);
19155
19156       demand_empty_rest_of_line ();
19157     }
19158 }
19159
19160 /* The .fmask and .mask directives. If the mdebug section is present
19161    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
19162    embedded targets, s_mips_mask is used so that we can set the PDR
19163    information correctly. We can't use the ecoff routines because they
19164    make reference to the ecoff symbol table (in the mdebug section).  */
19165
19166 static void
19167 s_mips_mask (int reg_type)
19168 {
19169   if (ECOFF_DEBUGGING)
19170     s_ignore (reg_type);
19171   else
19172     {
19173       long mask, off;
19174
19175       if (cur_proc_ptr == (procS *) NULL)
19176         {
19177           as_warn (_(".mask/.fmask outside of .ent"));
19178           demand_empty_rest_of_line ();
19179           return;
19180         }
19181
19182       if (get_absolute_expression_and_terminator (&mask) != ',')
19183         {
19184           as_warn (_("Bad .mask/.fmask directive"));
19185           --input_line_pointer;
19186           demand_empty_rest_of_line ();
19187           return;
19188         }
19189
19190       off = get_absolute_expression ();
19191
19192       if (reg_type == 'F')
19193         {
19194           cur_proc_ptr->fpreg_mask = mask;
19195           cur_proc_ptr->fpreg_offset = off;
19196         }
19197       else
19198         {
19199           cur_proc_ptr->reg_mask = mask;
19200           cur_proc_ptr->reg_offset = off;
19201         }
19202
19203       demand_empty_rest_of_line ();
19204     }
19205 }
19206
19207 /* A table describing all the processors gas knows about.  Names are
19208    matched in the order listed.
19209
19210    To ease comparison, please keep this table in the same order as
19211    gcc's mips_cpu_info_table[].  */
19212 static const struct mips_cpu_info mips_cpu_info_table[] =
19213 {
19214   /* Entries for generic ISAs */
19215   { "mips1",          MIPS_CPU_IS_ISA, 0,       ISA_MIPS1,    CPU_R3000 },
19216   { "mips2",          MIPS_CPU_IS_ISA, 0,       ISA_MIPS2,    CPU_R6000 },
19217   { "mips3",          MIPS_CPU_IS_ISA, 0,       ISA_MIPS3,    CPU_R4000 },
19218   { "mips4",          MIPS_CPU_IS_ISA, 0,       ISA_MIPS4,    CPU_R8000 },
19219   { "mips5",          MIPS_CPU_IS_ISA, 0,       ISA_MIPS5,    CPU_MIPS5 },
19220   { "mips32",         MIPS_CPU_IS_ISA, 0,       ISA_MIPS32,   CPU_MIPS32 },
19221   { "mips32r2",       MIPS_CPU_IS_ISA, 0,       ISA_MIPS32R2, CPU_MIPS32R2 },
19222   { "mips64",         MIPS_CPU_IS_ISA, 0,       ISA_MIPS64,   CPU_MIPS64 },
19223   { "mips64r2",       MIPS_CPU_IS_ISA, 0,       ISA_MIPS64R2, CPU_MIPS64R2 },
19224
19225   /* MIPS I */
19226   { "r3000",          0, 0,                     ISA_MIPS1,    CPU_R3000 },
19227   { "r2000",          0, 0,                     ISA_MIPS1,    CPU_R3000 },
19228   { "r3900",          0, 0,                     ISA_MIPS1,    CPU_R3900 },
19229
19230   /* MIPS II */
19231   { "r6000",          0, 0,                     ISA_MIPS2,    CPU_R6000 },
19232
19233   /* MIPS III */
19234   { "r4000",          0, 0,                     ISA_MIPS3,    CPU_R4000 },
19235   { "r4010",          0, 0,                     ISA_MIPS2,    CPU_R4010 },
19236   { "vr4100",         0, 0,                     ISA_MIPS3,    CPU_VR4100 },
19237   { "vr4111",         0, 0,                     ISA_MIPS3,    CPU_R4111 },
19238   { "vr4120",         0, 0,                     ISA_MIPS3,    CPU_VR4120 },
19239   { "vr4130",         0, 0,                     ISA_MIPS3,    CPU_VR4120 },
19240   { "vr4181",         0, 0,                     ISA_MIPS3,    CPU_R4111 },
19241   { "vr4300",         0, 0,                     ISA_MIPS3,    CPU_R4300 },
19242   { "r4400",          0, 0,                     ISA_MIPS3,    CPU_R4400 },
19243   { "r4600",          0, 0,                     ISA_MIPS3,    CPU_R4600 },
19244   { "orion",          0, 0,                     ISA_MIPS3,    CPU_R4600 },
19245   { "r4650",          0, 0,                     ISA_MIPS3,    CPU_R4650 },
19246   { "r5900",          0, 0,                     ISA_MIPS3,    CPU_R5900 },
19247   /* ST Microelectronics Loongson 2E and 2F cores */
19248   { "loongson2e",     0, 0,                     ISA_MIPS3,    CPU_LOONGSON_2E },
19249   { "loongson2f",     0, 0,                     ISA_MIPS3,    CPU_LOONGSON_2F },
19250
19251   /* MIPS IV */
19252   { "r8000",          0, 0,                     ISA_MIPS4,    CPU_R8000 },
19253   { "r10000",         0, 0,                     ISA_MIPS4,    CPU_R10000 },
19254   { "r12000",         0, 0,                     ISA_MIPS4,    CPU_R12000 },
19255   { "r14000",         0, 0,                     ISA_MIPS4,    CPU_R14000 },
19256   { "r16000",         0, 0,                     ISA_MIPS4,    CPU_R16000 },
19257   { "vr5000",         0, 0,                     ISA_MIPS4,    CPU_R5000 },
19258   { "vr5400",         0, 0,                     ISA_MIPS4,    CPU_VR5400 },
19259   { "vr5500",         0, 0,                     ISA_MIPS4,    CPU_VR5500 },
19260   { "rm5200",         0, 0,                     ISA_MIPS4,    CPU_R5000 },
19261   { "rm5230",         0, 0,                     ISA_MIPS4,    CPU_R5000 },
19262   { "rm5231",         0, 0,                     ISA_MIPS4,    CPU_R5000 },
19263   { "rm5261",         0, 0,                     ISA_MIPS4,    CPU_R5000 },
19264   { "rm5721",         0, 0,                     ISA_MIPS4,    CPU_R5000 },
19265   { "rm7000",         0, 0,                     ISA_MIPS4,    CPU_RM7000 },
19266   { "rm9000",         0, 0,                     ISA_MIPS4,    CPU_RM9000 },
19267
19268   /* MIPS 32 */
19269   { "4kc",            0, 0,                     ISA_MIPS32,   CPU_MIPS32 },
19270   { "4km",            0, 0,                     ISA_MIPS32,   CPU_MIPS32 },
19271   { "4kp",            0, 0,                     ISA_MIPS32,   CPU_MIPS32 },
19272   { "4ksc",           0, ASE_SMARTMIPS,         ISA_MIPS32,   CPU_MIPS32 },
19273
19274   /* MIPS 32 Release 2 */
19275   { "4kec",           0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19276   { "4kem",           0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19277   { "4kep",           0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19278   { "4ksd",           0, ASE_SMARTMIPS,         ISA_MIPS32R2, CPU_MIPS32R2 },
19279   { "m4k",            0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19280   { "m4kp",           0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19281   { "m14k",           0, ASE_MCU,               ISA_MIPS32R2, CPU_MIPS32R2 },
19282   { "m14kc",          0, ASE_MCU,               ISA_MIPS32R2, CPU_MIPS32R2 },
19283   { "m14ke",          0, ASE_DSP | ASE_DSPR2 | ASE_MCU,
19284                                                 ISA_MIPS32R2, CPU_MIPS32R2 },
19285   { "m14kec",         0, ASE_DSP | ASE_DSPR2 | ASE_MCU,
19286                                                 ISA_MIPS32R2, CPU_MIPS32R2 },
19287   { "24kc",           0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19288   { "24kf2_1",        0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19289   { "24kf",           0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19290   { "24kf1_1",        0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19291   /* Deprecated forms of the above.  */
19292   { "24kfx",          0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19293   { "24kx",           0, 0,                     ISA_MIPS32R2, CPU_MIPS32R2 },
19294   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
19295   { "24kec",          0, ASE_DSP,               ISA_MIPS32R2, CPU_MIPS32R2 },
19296   { "24kef2_1",       0, ASE_DSP,               ISA_MIPS32R2, CPU_MIPS32R2 },
19297   { "24kef",          0, ASE_DSP,               ISA_MIPS32R2, CPU_MIPS32R2 },
19298   { "24kef1_1",       0, ASE_DSP,               ISA_MIPS32R2, CPU_MIPS32R2 },
19299   /* Deprecated forms of the above.  */
19300   { "24kefx",         0, ASE_DSP,               ISA_MIPS32R2, CPU_MIPS32R2 },
19301   { "24kex",          0, ASE_DSP,               ISA_MIPS32R2, CPU_MIPS32R2 },
19302   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
19303   { "34kc",           0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19304   { "34kf2_1",        0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19305   { "34kf",           0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19306   { "34kf1_1",        0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19307   /* Deprecated forms of the above.  */
19308   { "34kfx",          0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19309   { "34kx",           0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19310   /* 34Kn is a 34kc without DSP.  */
19311   { "34kn",           0, ASE_MT,                ISA_MIPS32R2, CPU_MIPS32R2 },
19312   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
19313   { "74kc",           0, ASE_DSP | ASE_DSPR2,   ISA_MIPS32R2, CPU_MIPS32R2 },
19314   { "74kf2_1",        0, ASE_DSP | ASE_DSPR2,   ISA_MIPS32R2, CPU_MIPS32R2 },
19315   { "74kf",           0, ASE_DSP | ASE_DSPR2,   ISA_MIPS32R2, CPU_MIPS32R2 },
19316   { "74kf1_1",        0, ASE_DSP | ASE_DSPR2,   ISA_MIPS32R2, CPU_MIPS32R2 },
19317   { "74kf3_2",        0, ASE_DSP | ASE_DSPR2,   ISA_MIPS32R2, CPU_MIPS32R2 },
19318   /* Deprecated forms of the above.  */
19319   { "74kfx",          0, ASE_DSP | ASE_DSPR2,   ISA_MIPS32R2, CPU_MIPS32R2 },
19320   { "74kx",           0, ASE_DSP | ASE_DSPR2,   ISA_MIPS32R2, CPU_MIPS32R2 },
19321   /* 1004K cores are multiprocessor versions of the 34K.  */
19322   { "1004kc",         0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19323   { "1004kf2_1",      0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19324   { "1004kf",         0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19325   { "1004kf1_1",      0, ASE_DSP | ASE_MT,      ISA_MIPS32R2, CPU_MIPS32R2 },
19326
19327   /* MIPS 64 */
19328   { "5kc",            0, 0,                     ISA_MIPS64,   CPU_MIPS64 },
19329   { "5kf",            0, 0,                     ISA_MIPS64,   CPU_MIPS64 },
19330   { "20kc",           0, ASE_MIPS3D,            ISA_MIPS64,   CPU_MIPS64 },
19331   { "25kf",           0, ASE_MIPS3D,            ISA_MIPS64,   CPU_MIPS64 },
19332
19333   /* Broadcom SB-1 CPU core */
19334   { "sb1",            0, ASE_MIPS3D | ASE_MDMX, ISA_MIPS64,   CPU_SB1 },
19335   /* Broadcom SB-1A CPU core */
19336   { "sb1a",           0, ASE_MIPS3D | ASE_MDMX, ISA_MIPS64,   CPU_SB1 },
19337   
19338   { "loongson3a",     0, 0,                     ISA_MIPS64,   CPU_LOONGSON_3A },
19339
19340   /* MIPS 64 Release 2 */
19341
19342   /* Cavium Networks Octeon CPU core */
19343   { "octeon",         0, 0,                     ISA_MIPS64R2, CPU_OCTEON },
19344   { "octeon+",        0, 0,                     ISA_MIPS64R2, CPU_OCTEONP },
19345   { "octeon2",        0, 0,                     ISA_MIPS64R2, CPU_OCTEON2 },
19346
19347   /* RMI Xlr */
19348   { "xlr",            0, 0,                     ISA_MIPS64,   CPU_XLR },
19349
19350   /* Broadcom XLP.
19351      XLP is mostly like XLR, with the prominent exception that it is
19352      MIPS64R2 rather than MIPS64.  */
19353   { "xlp",            0, 0,                     ISA_MIPS64R2, CPU_XLR },
19354
19355   /* End marker */
19356   { NULL, 0, 0, 0, 0 }
19357 };
19358
19359
19360 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
19361    with a final "000" replaced by "k".  Ignore case.
19362
19363    Note: this function is shared between GCC and GAS.  */
19364
19365 static bfd_boolean
19366 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
19367 {
19368   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
19369     given++, canonical++;
19370
19371   return ((*given == 0 && *canonical == 0)
19372           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
19373 }
19374
19375
19376 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
19377    CPU name.  We've traditionally allowed a lot of variation here.
19378
19379    Note: this function is shared between GCC and GAS.  */
19380
19381 static bfd_boolean
19382 mips_matching_cpu_name_p (const char *canonical, const char *given)
19383 {
19384   /* First see if the name matches exactly, or with a final "000"
19385      turned into "k".  */
19386   if (mips_strict_matching_cpu_name_p (canonical, given))
19387     return TRUE;
19388
19389   /* If not, try comparing based on numerical designation alone.
19390      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
19391   if (TOLOWER (*given) == 'r')
19392     given++;
19393   if (!ISDIGIT (*given))
19394     return FALSE;
19395
19396   /* Skip over some well-known prefixes in the canonical name,
19397      hoping to find a number there too.  */
19398   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
19399     canonical += 2;
19400   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
19401     canonical += 2;
19402   else if (TOLOWER (canonical[0]) == 'r')
19403     canonical += 1;
19404
19405   return mips_strict_matching_cpu_name_p (canonical, given);
19406 }
19407
19408
19409 /* Parse an option that takes the name of a processor as its argument.
19410    OPTION is the name of the option and CPU_STRING is the argument.
19411    Return the corresponding processor enumeration if the CPU_STRING is
19412    recognized, otherwise report an error and return null.
19413
19414    A similar function exists in GCC.  */
19415
19416 static const struct mips_cpu_info *
19417 mips_parse_cpu (const char *option, const char *cpu_string)
19418 {
19419   const struct mips_cpu_info *p;
19420
19421   /* 'from-abi' selects the most compatible architecture for the given
19422      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
19423      EABIs, we have to decide whether we're using the 32-bit or 64-bit
19424      version.  Look first at the -mgp options, if given, otherwise base
19425      the choice on MIPS_DEFAULT_64BIT.
19426
19427      Treat NO_ABI like the EABIs.  One reason to do this is that the
19428      plain 'mips' and 'mips64' configs have 'from-abi' as their default
19429      architecture.  This code picks MIPS I for 'mips' and MIPS III for
19430      'mips64', just as we did in the days before 'from-abi'.  */
19431   if (strcasecmp (cpu_string, "from-abi") == 0)
19432     {
19433       if (ABI_NEEDS_32BIT_REGS (mips_abi))
19434         return mips_cpu_info_from_isa (ISA_MIPS1);
19435
19436       if (ABI_NEEDS_64BIT_REGS (mips_abi))
19437         return mips_cpu_info_from_isa (ISA_MIPS3);
19438
19439       if (file_mips_gp32 >= 0)
19440         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
19441
19442       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
19443                                      ? ISA_MIPS3
19444                                      : ISA_MIPS1);
19445     }
19446
19447   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
19448   if (strcasecmp (cpu_string, "default") == 0)
19449     return 0;
19450
19451   for (p = mips_cpu_info_table; p->name != 0; p++)
19452     if (mips_matching_cpu_name_p (p->name, cpu_string))
19453       return p;
19454
19455   as_bad (_("Bad value (%s) for %s"), cpu_string, option);
19456   return 0;
19457 }
19458
19459 /* Return the canonical processor information for ISA (a member of the
19460    ISA_MIPS* enumeration).  */
19461
19462 static const struct mips_cpu_info *
19463 mips_cpu_info_from_isa (int isa)
19464 {
19465   int i;
19466
19467   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19468     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
19469         && isa == mips_cpu_info_table[i].isa)
19470       return (&mips_cpu_info_table[i]);
19471
19472   return NULL;
19473 }
19474
19475 static const struct mips_cpu_info *
19476 mips_cpu_info_from_arch (int arch)
19477 {
19478   int i;
19479
19480   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19481     if (arch == mips_cpu_info_table[i].cpu)
19482       return (&mips_cpu_info_table[i]);
19483
19484   return NULL;
19485 }
19486 \f
19487 static void
19488 show (FILE *stream, const char *string, int *col_p, int *first_p)
19489 {
19490   if (*first_p)
19491     {
19492       fprintf (stream, "%24s", "");
19493       *col_p = 24;
19494     }
19495   else
19496     {
19497       fprintf (stream, ", ");
19498       *col_p += 2;
19499     }
19500
19501   if (*col_p + strlen (string) > 72)
19502     {
19503       fprintf (stream, "\n%24s", "");
19504       *col_p = 24;
19505     }
19506
19507   fprintf (stream, "%s", string);
19508   *col_p += strlen (string);
19509
19510   *first_p = 0;
19511 }
19512
19513 void
19514 md_show_usage (FILE *stream)
19515 {
19516   int column, first;
19517   size_t i;
19518
19519   fprintf (stream, _("\
19520 MIPS options:\n\
19521 -EB                     generate big endian output\n\
19522 -EL                     generate little endian output\n\
19523 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
19524 -G NUM                  allow referencing objects up to NUM bytes\n\
19525                         implicitly with the gp register [default 8]\n"));
19526   fprintf (stream, _("\
19527 -mips1                  generate MIPS ISA I instructions\n\
19528 -mips2                  generate MIPS ISA II instructions\n\
19529 -mips3                  generate MIPS ISA III instructions\n\
19530 -mips4                  generate MIPS ISA IV instructions\n\
19531 -mips5                  generate MIPS ISA V instructions\n\
19532 -mips32                 generate MIPS32 ISA instructions\n\
19533 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
19534 -mips64                 generate MIPS64 ISA instructions\n\
19535 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
19536 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
19537
19538   first = 1;
19539
19540   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19541     show (stream, mips_cpu_info_table[i].name, &column, &first);
19542   show (stream, "from-abi", &column, &first);
19543   fputc ('\n', stream);
19544
19545   fprintf (stream, _("\
19546 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
19547 -no-mCPU                don't generate code specific to CPU.\n\
19548                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
19549
19550   first = 1;
19551
19552   show (stream, "3900", &column, &first);
19553   show (stream, "4010", &column, &first);
19554   show (stream, "4100", &column, &first);
19555   show (stream, "4650", &column, &first);
19556   fputc ('\n', stream);
19557
19558   fprintf (stream, _("\
19559 -mips16                 generate mips16 instructions\n\
19560 -no-mips16              do not generate mips16 instructions\n"));
19561   fprintf (stream, _("\
19562 -mmicromips             generate microMIPS instructions\n\
19563 -mno-micromips          do not generate microMIPS instructions\n"));
19564   fprintf (stream, _("\
19565 -msmartmips             generate smartmips instructions\n\
19566 -mno-smartmips          do not generate smartmips instructions\n"));  
19567   fprintf (stream, _("\
19568 -mdsp                   generate DSP instructions\n\
19569 -mno-dsp                do not generate DSP instructions\n"));
19570   fprintf (stream, _("\
19571 -mdspr2                 generate DSP R2 instructions\n\
19572 -mno-dspr2              do not generate DSP R2 instructions\n"));
19573   fprintf (stream, _("\
19574 -mmt                    generate MT instructions\n\
19575 -mno-mt                 do not generate MT instructions\n"));
19576   fprintf (stream, _("\
19577 -mmcu                   generate MCU instructions\n\
19578 -mno-mcu                do not generate MCU instructions\n"));
19579   fprintf (stream, _("\
19580 -mvirt                  generate Virtualization instructions\n\
19581 -mno-virt               do not generate Virtualization instructions\n"));
19582   fprintf (stream, _("\
19583 -mfix-loongson2f-jump   work around Loongson2F JUMP instructions\n\
19584 -mfix-loongson2f-nop    work around Loongson2F NOP errata\n\
19585 -mfix-vr4120            work around certain VR4120 errata\n\
19586 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
19587 -mfix-24k               insert a nop after ERET and DERET instructions\n\
19588 -mfix-cn63xxp1          work around CN63XXP1 PREF errata\n\
19589 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
19590 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
19591 -msym32                 assume all symbols have 32-bit values\n\
19592 -O0                     remove unneeded NOPs, do not swap branches\n\
19593 -O                      remove unneeded NOPs and swap branches\n\
19594 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
19595 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
19596   fprintf (stream, _("\
19597 -mhard-float            allow floating-point instructions\n\
19598 -msoft-float            do not allow floating-point instructions\n\
19599 -msingle-float          only allow 32-bit floating-point operations\n\
19600 -mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
19601 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
19602 --[no-]relax-branch     [dis]allow out-of-range branches to be relaxed\n"
19603                      ));
19604   fprintf (stream, _("\
19605 -KPIC, -call_shared     generate SVR4 position independent code\n\
19606 -call_nonpic            generate non-PIC code that can operate with DSOs\n\
19607 -mvxworks-pic           generate VxWorks position independent code\n\
19608 -non_shared             do not generate code that can operate with DSOs\n\
19609 -xgot                   assume a 32 bit GOT\n\
19610 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
19611 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
19612                         position dependent (non shared) code\n\
19613 -mabi=ABI               create ABI conformant object file for:\n"));
19614
19615   first = 1;
19616
19617   show (stream, "32", &column, &first);
19618   show (stream, "o64", &column, &first);
19619   show (stream, "n32", &column, &first);
19620   show (stream, "64", &column, &first);
19621   show (stream, "eabi", &column, &first);
19622
19623   fputc ('\n', stream);
19624
19625   fprintf (stream, _("\
19626 -32                     create o32 ABI object file (default)\n\
19627 -n32                    create n32 ABI object file\n\
19628 -64                     create 64 ABI object file\n"));
19629 }
19630
19631 #ifdef TE_IRIX
19632 enum dwarf2_format
19633 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
19634 {
19635   if (HAVE_64BIT_SYMBOLS)
19636     return dwarf2_format_64bit_irix;
19637   else
19638     return dwarf2_format_32bit;
19639 }
19640 #endif
19641
19642 int
19643 mips_dwarf2_addr_size (void)
19644 {
19645   if (HAVE_64BIT_OBJECTS)
19646     return 8;
19647   else
19648     return 4;
19649 }
19650
19651 /* Standard calling conventions leave the CFA at SP on entry.  */
19652 void
19653 mips_cfi_frame_initial_instructions (void)
19654 {
19655   cfi_add_CFA_def_cfa_register (SP);
19656 }
19657
19658 int
19659 tc_mips_regname_to_dw2regnum (char *regname)
19660 {
19661   unsigned int regnum = -1;
19662   unsigned int reg;
19663
19664   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
19665     regnum = reg;
19666
19667   return regnum;
19668 }