* config/tc-mips.c (mips_pseudo_table): Add "sbss".
[external/binutils.git] / gas / config / tc-mips.c
1 /* tc-mips.c -- assemble code for a MIPS chip.
2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3    2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4    Free Software Foundation, Inc.
5    Contributed by the OSF and Ralph Campbell.
6    Written by Keith Knowles and Ralph Campbell, working independently.
7    Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
8    Support.
9
10    This file is part of GAS.
11
12    GAS is free software; you can redistribute it and/or modify
13    it under the terms of the GNU General Public License as published by
14    the Free Software Foundation; either version 3, or (at your option)
15    any later version.
16
17    GAS is distributed in the hope that it will be useful,
18    but WITHOUT ANY WARRANTY; without even the implied warranty of
19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20    GNU General Public License for more details.
21
22    You should have received a copy of the GNU General Public License
23    along with GAS; see the file COPYING.  If not, write to the Free
24    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
25    02110-1301, USA.  */
26
27 #include "as.h"
28 #include "config.h"
29 #include "subsegs.h"
30 #include "safe-ctype.h"
31
32 #include "opcode/mips.h"
33 #include "itbl-ops.h"
34 #include "dwarf2dbg.h"
35 #include "dw2gencfi.h"
36
37 #ifdef DEBUG
38 #define DBG(x) printf x
39 #else
40 #define DBG(x)
41 #endif
42
43 #ifdef OBJ_MAYBE_ELF
44 /* Clean up namespace so we can include obj-elf.h too.  */
45 static int mips_output_flavor (void);
46 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
47 #undef OBJ_PROCESS_STAB
48 #undef OUTPUT_FLAVOR
49 #undef S_GET_ALIGN
50 #undef S_GET_SIZE
51 #undef S_SET_ALIGN
52 #undef S_SET_SIZE
53 #undef obj_frob_file
54 #undef obj_frob_file_after_relocs
55 #undef obj_frob_symbol
56 #undef obj_pop_insert
57 #undef obj_sec_sym_ok_for_reloc
58 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
59
60 #include "obj-elf.h"
61 /* Fix any of them that we actually care about.  */
62 #undef OUTPUT_FLAVOR
63 #define OUTPUT_FLAVOR mips_output_flavor()
64 #endif
65
66 #if defined (OBJ_ELF)
67 #include "elf/mips.h"
68 #endif
69
70 #ifndef ECOFF_DEBUGGING
71 #define NO_ECOFF_DEBUGGING
72 #define ECOFF_DEBUGGING 0
73 #endif
74
75 int mips_flag_mdebug = -1;
76
77 /* Control generation of .pdr sections.  Off by default on IRIX: the native
78    linker doesn't know about and discards them, but relocations against them
79    remain, leading to rld crashes.  */
80 #ifdef TE_IRIX
81 int mips_flag_pdr = FALSE;
82 #else
83 int mips_flag_pdr = TRUE;
84 #endif
85
86 #include "ecoff.h"
87
88 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
89 static char *mips_regmask_frag;
90 #endif
91
92 #define ZERO 0
93 #define ATREG 1
94 #define 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 /* Allow override of standard little-endian ECOFF format.  */
108
109 #ifndef ECOFF_LITTLE_FORMAT
110 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
111 #endif
112
113 extern int target_big_endian;
114
115 /* The name of the readonly data section.  */
116 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
117                             ? ".rdata" \
118                             : OUTPUT_FLAVOR == bfd_target_coff_flavour \
119                             ? ".rdata" \
120                             : OUTPUT_FLAVOR == bfd_target_elf_flavour \
121                             ? ".rodata" \
122                             : (abort (), ""))
123
124 /* Information about an instruction, including its format, operands
125    and fixups.  */
126 struct mips_cl_insn
127 {
128   /* The opcode's entry in mips_opcodes or mips16_opcodes.  */
129   const struct mips_opcode *insn_mo;
130
131   /* True if this is a mips16 instruction and if we want the extended
132      form of INSN_MO.  */
133   bfd_boolean use_extend;
134
135   /* The 16-bit extension instruction to use when USE_EXTEND is true.  */
136   unsigned short extend;
137
138   /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
139      a copy of INSN_MO->match with the operands filled in.  */
140   unsigned long insn_opcode;
141
142   /* The frag that contains the instruction.  */
143   struct frag *frag;
144
145   /* The offset into FRAG of the first instruction byte.  */
146   long where;
147
148   /* The relocs associated with the instruction, if any.  */
149   fixS *fixp[3];
150
151   /* True if this entry cannot be moved from its current position.  */
152   unsigned int fixed_p : 1;
153
154   /* True if this instruction occurred in a .set noreorder block.  */
155   unsigned int noreorder_p : 1;
156
157   /* True for mips16 instructions that jump to an absolute address.  */
158   unsigned int mips16_absolute_jump_p : 1;
159 };
160
161 /* The ABI to use.  */
162 enum mips_abi_level
163 {
164   NO_ABI = 0,
165   O32_ABI,
166   O64_ABI,
167   N32_ABI,
168   N64_ABI,
169   EABI_ABI
170 };
171
172 /* MIPS ABI we are using for this output file.  */
173 static enum mips_abi_level mips_abi = NO_ABI;
174
175 /* Whether or not we have code that can call pic code.  */
176 int mips_abicalls = FALSE;
177
178 /* Whether or not we have code which can be put into a shared
179    library.  */
180 static bfd_boolean mips_in_shared = TRUE;
181
182 /* This is the set of options which may be modified by the .set
183    pseudo-op.  We use a struct so that .set push and .set pop are more
184    reliable.  */
185
186 struct mips_set_options
187 {
188   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
189      if it has not been initialized.  Changed by `.set mipsN', and the
190      -mipsN command line option, and the default CPU.  */
191   int isa;
192   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
193      if they have not been initialized.  Changed by `.set <asename>', by
194      command line options, and based on the default architecture.  */
195   int ase_mips3d;
196   int ase_mdmx;
197   int ase_smartmips;
198   int ase_dsp;
199   int ase_dspr2;
200   int ase_mt;
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   /* Non-zero if we should not reorder instructions.  Changed by `.set
207      reorder' and `.set noreorder'.  */
208   int noreorder;
209   /* Non-zero if we should not permit the register designated "assembler
210      temporary" to be used in instructions.  The value is the register
211      number, normally $at ($1).  Changed by `.set at=REG', `.set noat'
212      (same as `.set at=$0') and `.set at' (same as `.set at=$1').  */
213   unsigned int at;
214   /* Non-zero if we should warn when a macro instruction expands into
215      more than one machine instruction.  Changed by `.set nomacro' and
216      `.set macro'.  */
217   int warn_about_macros;
218   /* Non-zero if we should not move instructions.  Changed by `.set
219      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
220   int nomove;
221   /* Non-zero if we should not optimize branches by moving the target
222      of the branch into the delay slot.  Actually, we don't perform
223      this optimization anyhow.  Changed by `.set bopt' and `.set
224      nobopt'.  */
225   int nobopt;
226   /* Non-zero if we should not autoextend mips16 instructions.
227      Changed by `.set autoextend' and `.set noautoextend'.  */
228   int noautoextend;
229   /* Restrict general purpose registers and floating point registers
230      to 32 bit.  This is initially determined when -mgp32 or -mfp32
231      is passed but can changed if the assembler code uses .set mipsN.  */
232   int gp32;
233   int fp32;
234   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
235      command line option, and the default CPU.  */
236   int arch;
237   /* True if ".set sym32" is in effect.  */
238   bfd_boolean sym32;
239   /* True if floating-point operations are not allowed.  Changed by .set
240      softfloat or .set hardfloat, by command line options -msoft-float or
241      -mhard-float.  The default is false.  */
242   bfd_boolean soft_float;
243
244   /* True if only single-precision floating-point operations are allowed.
245      Changed by .set singlefloat or .set doublefloat, command-line options
246      -msingle-float or -mdouble-float.  The default is false.  */
247   bfd_boolean single_float;
248 };
249
250 /* This is the struct we use to hold the current set of options.  Note
251    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
252    -1 to indicate that they have not been initialized.  */
253
254 /* True if -mgp32 was passed.  */
255 static int file_mips_gp32 = -1;
256
257 /* True if -mfp32 was passed.  */
258 static int file_mips_fp32 = -1;
259
260 /* 1 if -msoft-float, 0 if -mhard-float.  The default is 0.  */
261 static int file_mips_soft_float = 0;
262
263 /* 1 if -msingle-float, 0 if -mdouble-float.  The default is 0.   */
264 static int file_mips_single_float = 0;
265
266 static struct mips_set_options mips_opts =
267 {
268   /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
269   /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
270   /* mips16 */ -1, /* noreorder */ 0, /* at */ ATREG,
271   /* warn_about_macros */ 0, /* nomove */ 0, /* nobopt */ 0,
272   /* noautoextend */ 0, /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN,
273   /* sym32 */ FALSE, /* soft_float */ FALSE, /* single_float */ FALSE
274 };
275
276 /* These variables are filled in with the masks of registers used.
277    The object format code reads them and puts them in the appropriate
278    place.  */
279 unsigned long mips_gprmask;
280 unsigned long mips_cprmask[4];
281
282 /* MIPS ISA we are using for this output file.  */
283 static int file_mips_isa = ISA_UNKNOWN;
284
285 /* True if -mips16 was passed or implied by arguments passed on the
286    command line (e.g., by -march).  */
287 static int file_ase_mips16;
288
289 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
290                               || mips_opts.isa == ISA_MIPS32R2          \
291                               || mips_opts.isa == ISA_MIPS64            \
292                               || mips_opts.isa == ISA_MIPS64R2)
293
294 /* True if we want to create R_MIPS_JALR for jalr $25.  */
295 #ifdef TE_IRIX
296 #define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
297 #else
298 /* As a GNU extension, we use R_MIPS_JALR for o32 too.  However,
299    because there's no place for any addend, the only acceptable
300    expression is a bare symbol.  */
301 #define MIPS_JALR_HINT_P(EXPR) \
302   (!HAVE_IN_PLACE_ADDENDS \
303    || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
304 #endif
305
306 /* True if -mips3d was passed or implied by arguments passed on the
307    command line (e.g., by -march).  */
308 static int file_ase_mips3d;
309
310 /* True if -mdmx was passed or implied by arguments passed on the
311    command line (e.g., by -march).  */
312 static int file_ase_mdmx;
313
314 /* True if -msmartmips was passed or implied by arguments passed on the
315    command line (e.g., by -march).  */
316 static int file_ase_smartmips;
317
318 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32             \
319                                 || mips_opts.isa == ISA_MIPS32R2)
320
321 /* True if -mdsp was passed or implied by arguments passed on the
322    command line (e.g., by -march).  */
323 static int file_ase_dsp;
324
325 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2             \
326                               || mips_opts.isa == ISA_MIPS64R2)
327
328 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
329
330 /* True if -mdspr2 was passed or implied by arguments passed on the
331    command line (e.g., by -march).  */
332 static int file_ase_dspr2;
333
334 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
335                                 || mips_opts.isa == ISA_MIPS64R2)
336
337 /* True if -mmt was passed or implied by arguments passed on the
338    command line (e.g., by -march).  */
339 static int file_ase_mt;
340
341 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
342                              || mips_opts.isa == ISA_MIPS64R2)
343
344 /* The argument of the -march= flag.  The architecture we are assembling.  */
345 static int file_mips_arch = CPU_UNKNOWN;
346 static const char *mips_arch_string;
347
348 /* The argument of the -mtune= flag.  The architecture for which we
349    are optimizing.  */
350 static int mips_tune = CPU_UNKNOWN;
351 static const char *mips_tune_string;
352
353 /* True when generating 32-bit code for a 64-bit processor.  */
354 static int mips_32bitmode = 0;
355
356 /* True if the given ABI requires 32-bit registers.  */
357 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
358
359 /* Likewise 64-bit registers.  */
360 #define ABI_NEEDS_64BIT_REGS(ABI)       \
361   ((ABI) == N32_ABI                     \
362    || (ABI) == N64_ABI                  \
363    || (ABI) == O64_ABI)
364
365 /*  Return true if ISA supports 64 bit wide gp registers.  */
366 #define ISA_HAS_64BIT_REGS(ISA)         \
367   ((ISA) == ISA_MIPS3                   \
368    || (ISA) == ISA_MIPS4                \
369    || (ISA) == ISA_MIPS5                \
370    || (ISA) == ISA_MIPS64               \
371    || (ISA) == ISA_MIPS64R2)
372
373 /*  Return true if ISA supports 64 bit wide float registers.  */
374 #define ISA_HAS_64BIT_FPRS(ISA)         \
375   ((ISA) == ISA_MIPS3                   \
376    || (ISA) == ISA_MIPS4                \
377    || (ISA) == ISA_MIPS5                \
378    || (ISA) == ISA_MIPS32R2             \
379    || (ISA) == ISA_MIPS64               \
380    || (ISA) == ISA_MIPS64R2)
381
382 /* Return true if ISA supports 64-bit right rotate (dror et al.)
383    instructions.  */
384 #define ISA_HAS_DROR(ISA)               \
385   ((ISA) == ISA_MIPS64R2)
386
387 /* Return true if ISA supports 32-bit right rotate (ror et al.)
388    instructions.  */
389 #define ISA_HAS_ROR(ISA)                \
390   ((ISA) == ISA_MIPS32R2                \
391    || (ISA) == ISA_MIPS64R2             \
392    || mips_opts.ase_smartmips)
393
394 /* Return true if ISA supports single-precision floats in odd registers.  */
395 #define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
396   ((ISA) == ISA_MIPS32                  \
397    || (ISA) == ISA_MIPS32R2             \
398    || (ISA) == ISA_MIPS64               \
399    || (ISA) == ISA_MIPS64R2)
400
401 /* Return true if ISA supports move to/from high part of a 64-bit
402    floating-point register. */
403 #define ISA_HAS_MXHC1(ISA)              \
404   ((ISA) == ISA_MIPS32R2                \
405    || (ISA) == ISA_MIPS64R2)
406
407 #define HAVE_32BIT_GPRS                            \
408     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
409
410 #define HAVE_32BIT_FPRS                            \
411     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
412
413 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
414 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
415
416 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
417
418 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
419
420 /* True if relocations are stored in-place.  */
421 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
422
423 /* The ABI-derived address size.  */
424 #define HAVE_64BIT_ADDRESSES \
425   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
426 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
427
428 /* The size of symbolic constants (i.e., expressions of the form
429    "SYMBOL" or "SYMBOL + OFFSET").  */
430 #define HAVE_32BIT_SYMBOLS \
431   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
432 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
433
434 /* Addresses are loaded in different ways, depending on the address size
435    in use.  The n32 ABI Documentation also mandates the use of additions
436    with overflow checking, but existing implementations don't follow it.  */
437 #define ADDRESS_ADD_INSN                                                \
438    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
439
440 #define ADDRESS_ADDI_INSN                                               \
441    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
442
443 #define ADDRESS_LOAD_INSN                                               \
444    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
445
446 #define ADDRESS_STORE_INSN                                              \
447    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
448
449 /* Return true if the given CPU supports the MIPS16 ASE.  */
450 #define CPU_HAS_MIPS16(cpu)                                             \
451    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
452     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
453
454 /* True if CPU has a dror instruction.  */
455 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
456
457 /* True if CPU has a ror instruction.  */
458 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
459
460 /* True if CPU has seq/sne and seqi/snei instructions.  */
461 #define CPU_HAS_SEQ(CPU)        ((CPU) == CPU_OCTEON)
462
463 /* True if CPU does not implement the all the coprocessor insns.  For these
464    CPUs only those COP insns are accepted that are explicitly marked to be
465    available on the CPU.  ISA membership for COP insns is ignored.  */
466 #define NO_ISA_COP(CPU)         ((CPU) == CPU_OCTEON)
467
468 /* True if mflo and mfhi can be immediately followed by instructions
469    which write to the HI and LO registers.
470
471    According to MIPS specifications, MIPS ISAs I, II, and III need
472    (at least) two instructions between the reads of HI/LO and
473    instructions which write them, and later ISAs do not.  Contradicting
474    the MIPS specifications, some MIPS IV processor user manuals (e.g.
475    the UM for the NEC Vr5000) document needing the instructions between
476    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
477    MIPS64 and later ISAs to have the interlocks, plus any specific
478    earlier-ISA CPUs for which CPU documentation declares that the
479    instructions are really interlocked.  */
480 #define hilo_interlocks \
481   (mips_opts.isa == ISA_MIPS32                        \
482    || mips_opts.isa == ISA_MIPS32R2                   \
483    || mips_opts.isa == ISA_MIPS64                     \
484    || mips_opts.isa == ISA_MIPS64R2                   \
485    || mips_opts.arch == CPU_R4010                     \
486    || mips_opts.arch == CPU_R10000                    \
487    || mips_opts.arch == CPU_R12000                    \
488    || mips_opts.arch == CPU_R14000                    \
489    || mips_opts.arch == CPU_R16000                    \
490    || mips_opts.arch == CPU_RM7000                    \
491    || mips_opts.arch == CPU_VR5500                    \
492    )
493
494 /* Whether the processor uses hardware interlocks to protect reads
495    from the GPRs after they are loaded from memory, and thus does not
496    require nops to be inserted.  This applies to instructions marked
497    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
498    level I.  */
499 #define gpr_interlocks \
500   (mips_opts.isa != ISA_MIPS1  \
501    || mips_opts.arch == CPU_R3900)
502
503 /* Whether the processor uses hardware interlocks to avoid delays
504    required by coprocessor instructions, and thus does not require
505    nops to be inserted.  This applies to instructions marked
506    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
507    between instructions marked INSN_WRITE_COND_CODE and ones marked
508    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
509    levels I, II, and III.  */
510 /* Itbl support may require additional care here.  */
511 #define cop_interlocks                                \
512   ((mips_opts.isa != ISA_MIPS1                        \
513     && mips_opts.isa != ISA_MIPS2                     \
514     && mips_opts.isa != ISA_MIPS3)                    \
515    || mips_opts.arch == CPU_R4300                     \
516    )
517
518 /* Whether the processor uses hardware interlocks to protect reads
519    from coprocessor registers after they are loaded from memory, and
520    thus does not require nops to be inserted.  This applies to
521    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
522    requires at MIPS ISA level I.  */
523 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
524
525 /* Is this a mfhi or mflo instruction?  */
526 #define MF_HILO_INSN(PINFO) \
527   ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
528
529 /* Returns true for a (non floating-point) coprocessor instruction.  Reading
530    or writing the condition code is only possible on the coprocessors and
531    these insns are not marked with INSN_COP.  Thus for these insns use the
532    condition-code flags.  */
533 #define COP_INSN(PINFO)                                                 \
534   (PINFO != INSN_MACRO                                                  \
535    && ((PINFO) & (FP_S | FP_D)) == 0                                    \
536    && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
537
538 /* MIPS PIC level.  */
539
540 enum mips_pic_level mips_pic;
541
542 /* 1 if we should generate 32 bit offsets from the $gp register in
543    SVR4_PIC mode.  Currently has no meaning in other modes.  */
544 static int mips_big_got = 0;
545
546 /* 1 if trap instructions should used for overflow rather than break
547    instructions.  */
548 static int mips_trap = 0;
549
550 /* 1 if double width floating point constants should not be constructed
551    by assembling two single width halves into two single width floating
552    point registers which just happen to alias the double width destination
553    register.  On some architectures this aliasing can be disabled by a bit
554    in the status register, and the setting of this bit cannot be determined
555    automatically at assemble time.  */
556 static int mips_disable_float_construction;
557
558 /* Non-zero if any .set noreorder directives were used.  */
559
560 static int mips_any_noreorder;
561
562 /* Non-zero if nops should be inserted when the register referenced in
563    an mfhi/mflo instruction is read in the next two instructions.  */
564 static int mips_7000_hilo_fix;
565
566 /* The size of objects in the small data section.  */
567 static unsigned int g_switch_value = 8;
568 /* Whether the -G option was used.  */
569 static int g_switch_seen = 0;
570
571 #define N_RMASK 0xc4
572 #define N_VFP   0xd4
573
574 /* If we can determine in advance that GP optimization won't be
575    possible, we can skip the relaxation stuff that tries to produce
576    GP-relative references.  This makes delay slot optimization work
577    better.
578
579    This function can only provide a guess, but it seems to work for
580    gcc output.  It needs to guess right for gcc, otherwise gcc
581    will put what it thinks is a GP-relative instruction in a branch
582    delay slot.
583
584    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
585    fixed it for the non-PIC mode.  KR 95/04/07  */
586 static int nopic_need_relax (symbolS *, int);
587
588 /* handle of the OPCODE hash table */
589 static struct hash_control *op_hash = NULL;
590
591 /* The opcode hash table we use for the mips16.  */
592 static struct hash_control *mips16_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, mips16_nop_insn;
684
685 /* The appropriate nop for the current mode.  */
686 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
687
688 /* If this is set, it points to a frag holding nop instructions which
689    were inserted before the start of a noreorder section.  If those
690    nops turn out to be unnecessary, the size of the frag can be
691    decreased.  */
692 static fragS *prev_nop_frag;
693
694 /* The number of nop instructions we created in prev_nop_frag.  */
695 static int prev_nop_frag_holds;
696
697 /* The number of nop instructions that we know we need in
698    prev_nop_frag.  */
699 static int prev_nop_frag_required;
700
701 /* The number of instructions we've seen since prev_nop_frag.  */
702 static int prev_nop_frag_since;
703
704 /* For ECOFF and ELF, relocations against symbols are done in two
705    parts, with a HI relocation and a LO relocation.  Each relocation
706    has only 16 bits of space to store an addend.  This means that in
707    order for the linker to handle carries correctly, it must be able
708    to locate both the HI and the LO relocation.  This means that the
709    relocations must appear in order in the relocation table.
710
711    In order to implement this, we keep track of each unmatched HI
712    relocation.  We then sort them so that they immediately precede the
713    corresponding LO relocation.  */
714
715 struct mips_hi_fixup
716 {
717   /* Next HI fixup.  */
718   struct mips_hi_fixup *next;
719   /* This fixup.  */
720   fixS *fixp;
721   /* The section this fixup is in.  */
722   segT seg;
723 };
724
725 /* The list of unmatched HI relocs.  */
726
727 static struct mips_hi_fixup *mips_hi_fixup_list;
728
729 /* The frag containing the last explicit relocation operator.
730    Null if explicit relocations have not been used.  */
731
732 static fragS *prev_reloc_op_frag;
733
734 /* Map normal MIPS register numbers to mips16 register numbers.  */
735
736 #define X ILLEGAL_REG
737 static const int mips32_to_16_reg_map[] =
738 {
739   X, X, 2, 3, 4, 5, 6, 7,
740   X, X, X, X, X, X, X, X,
741   0, 1, X, X, X, X, X, X,
742   X, X, X, X, X, X, X, X
743 };
744 #undef X
745
746 /* Map mips16 register numbers to normal MIPS register numbers.  */
747
748 static const unsigned int mips16_to_32_reg_map[] =
749 {
750   16, 17, 2, 3, 4, 5, 6, 7
751 };
752
753 /* Classifies the kind of instructions we're interested in when
754    implementing -mfix-vr4120.  */
755 enum fix_vr4120_class
756 {
757   FIX_VR4120_MACC,
758   FIX_VR4120_DMACC,
759   FIX_VR4120_MULT,
760   FIX_VR4120_DMULT,
761   FIX_VR4120_DIV,
762   FIX_VR4120_MTHILO,
763   NUM_FIX_VR4120_CLASSES
764 };
765
766 /* ...likewise -mfix-loongson2f-jump.  */
767 static bfd_boolean mips_fix_loongson2f_jump;
768
769 /* ...likewise -mfix-loongson2f-nop.  */
770 static bfd_boolean mips_fix_loongson2f_nop;
771
772 /* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed.  */
773 static bfd_boolean mips_fix_loongson2f;
774
775 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
776    there must be at least one other instruction between an instruction
777    of type X and an instruction of type Y.  */
778 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
779
780 /* True if -mfix-vr4120 is in force.  */
781 static int mips_fix_vr4120;
782
783 /* ...likewise -mfix-vr4130.  */
784 static int mips_fix_vr4130;
785
786 /* ...likewise -mfix-24k.  */
787 static int mips_fix_24k;
788
789 /* ...likewise -mfix-cn63xxp1 */
790 static bfd_boolean mips_fix_cn63xxp1;
791
792 /* We don't relax branches by default, since this causes us to expand
793    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
794    fail to compute the offset before expanding the macro to the most
795    efficient expansion.  */
796
797 static int mips_relax_branch;
798 \f
799 /* The expansion of many macros depends on the type of symbol that
800    they refer to.  For example, when generating position-dependent code,
801    a macro that refers to a symbol may have two different expansions,
802    one which uses GP-relative addresses and one which uses absolute
803    addresses.  When generating SVR4-style PIC, a macro may have
804    different expansions for local and global symbols.
805
806    We handle these situations by generating both sequences and putting
807    them in variant frags.  In position-dependent code, the first sequence
808    will be the GP-relative one and the second sequence will be the
809    absolute one.  In SVR4 PIC, the first sequence will be for global
810    symbols and the second will be for local symbols.
811
812    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
813    SECOND are the lengths of the two sequences in bytes.  These fields
814    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
815    the subtype has the following flags:
816
817    RELAX_USE_SECOND
818         Set if it has been decided that we should use the second
819         sequence instead of the first.
820
821    RELAX_SECOND_LONGER
822         Set in the first variant frag if the macro's second implementation
823         is longer than its first.  This refers to the macro as a whole,
824         not an individual relaxation.
825
826    RELAX_NOMACRO
827         Set in the first variant frag if the macro appeared in a .set nomacro
828         block and if one alternative requires a warning but the other does not.
829
830    RELAX_DELAY_SLOT
831         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
832         delay slot.
833
834    The frag's "opcode" points to the first fixup for relaxable code.
835
836    Relaxable macros are generated using a sequence such as:
837
838       relax_start (SYMBOL);
839       ... generate first expansion ...
840       relax_switch ();
841       ... generate second expansion ...
842       relax_end ();
843
844    The code and fixups for the unwanted alternative are discarded
845    by md_convert_frag.  */
846 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
847
848 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
849 #define RELAX_SECOND(X) ((X) & 0xff)
850 #define RELAX_USE_SECOND 0x10000
851 #define RELAX_SECOND_LONGER 0x20000
852 #define RELAX_NOMACRO 0x40000
853 #define RELAX_DELAY_SLOT 0x80000
854
855 /* Branch without likely bit.  If label is out of range, we turn:
856
857         beq reg1, reg2, label
858         delay slot
859
860    into
861
862         bne reg1, reg2, 0f
863         nop
864         j label
865      0: delay slot
866
867    with the following opcode replacements:
868
869         beq <-> bne
870         blez <-> bgtz
871         bltz <-> bgez
872         bc1f <-> bc1t
873
874         bltzal <-> bgezal  (with jal label instead of j label)
875
876    Even though keeping the delay slot instruction in the delay slot of
877    the branch would be more efficient, it would be very tricky to do
878    correctly, because we'd have to introduce a variable frag *after*
879    the delay slot instruction, and expand that instead.  Let's do it
880    the easy way for now, even if the branch-not-taken case now costs
881    one additional instruction.  Out-of-range branches are not supposed
882    to be common, anyway.
883
884    Branch likely.  If label is out of range, we turn:
885
886         beql reg1, reg2, label
887         delay slot (annulled if branch not taken)
888
889    into
890
891         beql reg1, reg2, 1f
892         nop
893         beql $0, $0, 2f
894         nop
895      1: j[al] label
896         delay slot (executed only if branch taken)
897      2:
898
899    It would be possible to generate a shorter sequence by losing the
900    likely bit, generating something like:
901
902         bne reg1, reg2, 0f
903         nop
904         j[al] label
905         delay slot (executed only if branch taken)
906      0:
907
908         beql -> bne
909         bnel -> beq
910         blezl -> bgtz
911         bgtzl -> blez
912         bltzl -> bgez
913         bgezl -> bltz
914         bc1fl -> bc1t
915         bc1tl -> bc1f
916
917         bltzall -> bgezal  (with jal label instead of j label)
918         bgezall -> bltzal  (ditto)
919
920
921    but it's not clear that it would actually improve performance.  */
922 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
923   ((relax_substateT) \
924    (0xc0000000 \
925     | ((toofar) ? 1 : 0) \
926     | ((link) ? 2 : 0) \
927     | ((likely) ? 4 : 0) \
928     | ((uncond) ? 8 : 0)))
929 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
930 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
931 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
932 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
933 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
934
935 /* For mips16 code, we use an entirely different form of relaxation.
936    mips16 supports two versions of most instructions which take
937    immediate values: a small one which takes some small value, and a
938    larger one which takes a 16 bit value.  Since branches also follow
939    this pattern, relaxing these values is required.
940
941    We can assemble both mips16 and normal MIPS code in a single
942    object.  Therefore, we need to support this type of relaxation at
943    the same time that we support the relaxation described above.  We
944    use the high bit of the subtype field to distinguish these cases.
945
946    The information we store for this type of relaxation is the
947    argument code found in the opcode file for this relocation, whether
948    the user explicitly requested a small or extended form, and whether
949    the relocation is in a jump or jal delay slot.  That tells us the
950    size of the value, and how it should be stored.  We also store
951    whether the fragment is considered to be extended or not.  We also
952    store whether this is known to be a branch to a different section,
953    whether we have tried to relax this frag yet, and whether we have
954    ever extended a PC relative fragment because of a shift count.  */
955 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
956   (0x80000000                                                   \
957    | ((type) & 0xff)                                            \
958    | ((small) ? 0x100 : 0)                                      \
959    | ((ext) ? 0x200 : 0)                                        \
960    | ((dslot) ? 0x400 : 0)                                      \
961    | ((jal_dslot) ? 0x800 : 0))
962 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
963 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
964 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
965 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
966 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
967 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
968 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
969 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
970 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
971 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
972 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
973 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
974
975 /* Is the given value a sign-extended 32-bit value?  */
976 #define IS_SEXT_32BIT_NUM(x)                                            \
977   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
978    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
979
980 /* Is the given value a sign-extended 16-bit value?  */
981 #define IS_SEXT_16BIT_NUM(x)                                            \
982   (((x) &~ (offsetT) 0x7fff) == 0                                       \
983    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
984
985 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
986 #define IS_ZEXT_32BIT_NUM(x)                                            \
987   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
988    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
989
990 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
991    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
992 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
993   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
994               | (((VALUE) & (MASK)) << (SHIFT)))
995
996 /* Extract bits MASK << SHIFT from STRUCT and shift them right
997    SHIFT places.  */
998 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
999   (((STRUCT) >> (SHIFT)) & (MASK))
1000
1001 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1002    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1003
1004    include/opcode/mips.h specifies operand fields using the macros
1005    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
1006    with "MIPS16OP" instead of "OP".  */
1007 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
1008   INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
1009 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1010   INSERT_BITS ((INSN).insn_opcode, VALUE, \
1011                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1012
1013 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
1014 #define EXTRACT_OPERAND(FIELD, INSN) \
1015   EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
1016 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1017   EXTRACT_BITS ((INSN).insn_opcode, \
1018                 MIPS16OP_MASK_##FIELD, \
1019                 MIPS16OP_SH_##FIELD)
1020 \f
1021 /* Global variables used when generating relaxable macros.  See the
1022    comment above RELAX_ENCODE for more details about how relaxation
1023    is used.  */
1024 static struct {
1025   /* 0 if we're not emitting a relaxable macro.
1026      1 if we're emitting the first of the two relaxation alternatives.
1027      2 if we're emitting the second alternative.  */
1028   int sequence;
1029
1030   /* The first relaxable fixup in the current frag.  (In other words,
1031      the first fixup that refers to relaxable code.)  */
1032   fixS *first_fixup;
1033
1034   /* sizes[0] says how many bytes of the first alternative are stored in
1035      the current frag.  Likewise sizes[1] for the second alternative.  */
1036   unsigned int sizes[2];
1037
1038   /* The symbol on which the choice of sequence depends.  */
1039   symbolS *symbol;
1040 } mips_relax;
1041 \f
1042 /* Global variables used to decide whether a macro needs a warning.  */
1043 static struct {
1044   /* True if the macro is in a branch delay slot.  */
1045   bfd_boolean delay_slot_p;
1046
1047   /* For relaxable macros, sizes[0] is the length of the first alternative
1048      in bytes and sizes[1] is the length of the second alternative.
1049      For non-relaxable macros, both elements give the length of the
1050      macro in bytes.  */
1051   unsigned int sizes[2];
1052
1053   /* The first variant frag for this macro.  */
1054   fragS *first_frag;
1055 } mips_macro_warning;
1056 \f
1057 /* Prototypes for static functions.  */
1058
1059 #define internalError()                                                 \
1060     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1061
1062 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1063
1064 static void append_insn
1065   (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *);
1066 static void mips_no_prev_insn (void);
1067 static void macro_build (expressionS *, const char *, const char *, ...);
1068 static void mips16_macro_build
1069   (expressionS *, const char *, const char *, va_list *);
1070 static void load_register (int, expressionS *, int);
1071 static void macro_start (void);
1072 static void macro_end (void);
1073 static void macro (struct mips_cl_insn * ip);
1074 static void mips16_macro (struct mips_cl_insn * ip);
1075 #ifdef LOSING_COMPILER
1076 static void macro2 (struct mips_cl_insn * ip);
1077 #endif
1078 static void mips_ip (char *str, struct mips_cl_insn * ip);
1079 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1080 static void mips16_immed
1081   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1082    unsigned long *, bfd_boolean *, unsigned short *);
1083 static size_t my_getSmallExpression
1084   (expressionS *, bfd_reloc_code_real_type *, char *);
1085 static void my_getExpression (expressionS *, char *);
1086 static void s_align (int);
1087 static void s_change_sec (int);
1088 static void s_change_section (int);
1089 static void s_cons (int);
1090 static void s_float_cons (int);
1091 static void s_mips_globl (int);
1092 static void s_option (int);
1093 static void s_mipsset (int);
1094 static void s_abicalls (int);
1095 static void s_cpload (int);
1096 static void s_cpsetup (int);
1097 static void s_cplocal (int);
1098 static void s_cprestore (int);
1099 static void s_cpreturn (int);
1100 static void s_dtprelword (int);
1101 static void s_dtpreldword (int);
1102 static void s_gpvalue (int);
1103 static void s_gpword (int);
1104 static void s_gpdword (int);
1105 static void s_cpadd (int);
1106 static void s_insn (int);
1107 static void md_obj_begin (void);
1108 static void md_obj_end (void);
1109 static void s_mips_ent (int);
1110 static void s_mips_end (int);
1111 static void s_mips_frame (int);
1112 static void s_mips_mask (int reg_type);
1113 static void s_mips_stab (int);
1114 static void s_mips_weakext (int);
1115 static void s_mips_file (int);
1116 static void s_mips_loc (int);
1117 static bfd_boolean pic_need_relax (symbolS *, asection *);
1118 static int relaxed_branch_length (fragS *, asection *, int);
1119 static int validate_mips_insn (const struct mips_opcode *);
1120
1121 /* Table and functions used to map between CPU/ISA names, and
1122    ISA levels, and CPU numbers.  */
1123
1124 struct mips_cpu_info
1125 {
1126   const char *name;           /* CPU or ISA name.  */
1127   int flags;                  /* ASEs available, or ISA flag.  */
1128   int isa;                    /* ISA level.  */
1129   int cpu;                    /* CPU number (default CPU if ISA).  */
1130 };
1131
1132 #define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1133 #define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1134 #define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1135 #define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1136 #define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1137 #define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1138 #define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1139
1140 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1141 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1142 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1143 \f
1144 /* Pseudo-op table.
1145
1146    The following pseudo-ops from the Kane and Heinrich MIPS book
1147    should be defined here, but are currently unsupported: .alias,
1148    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1149
1150    The following pseudo-ops from the Kane and Heinrich MIPS book are
1151    specific to the type of debugging information being generated, and
1152    should be defined by the object format: .aent, .begin, .bend,
1153    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1154    .vreg.
1155
1156    The following pseudo-ops from the Kane and Heinrich MIPS book are
1157    not MIPS CPU specific, but are also not specific to the object file
1158    format.  This file is probably the best place to define them, but
1159    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1160
1161 static const pseudo_typeS mips_pseudo_table[] =
1162 {
1163   /* MIPS specific pseudo-ops.  */
1164   {"option", s_option, 0},
1165   {"set", s_mipsset, 0},
1166   {"rdata", s_change_sec, 'r'},
1167   {"sdata", s_change_sec, 's'},
1168   {"livereg", s_ignore, 0},
1169   {"abicalls", s_abicalls, 0},
1170   {"cpload", s_cpload, 0},
1171   {"cpsetup", s_cpsetup, 0},
1172   {"cplocal", s_cplocal, 0},
1173   {"cprestore", s_cprestore, 0},
1174   {"cpreturn", s_cpreturn, 0},
1175   {"dtprelword", s_dtprelword, 0},
1176   {"dtpreldword", s_dtpreldword, 0},
1177   {"gpvalue", s_gpvalue, 0},
1178   {"gpword", s_gpword, 0},
1179   {"gpdword", s_gpdword, 0},
1180   {"cpadd", s_cpadd, 0},
1181   {"insn", s_insn, 0},
1182
1183   /* Relatively generic pseudo-ops that happen to be used on MIPS
1184      chips.  */
1185   {"asciiz", stringer, 8 + 1},
1186   {"bss", s_change_sec, 'b'},
1187   {"err", s_err, 0},
1188   {"half", s_cons, 1},
1189   {"dword", s_cons, 3},
1190   {"weakext", s_mips_weakext, 0},
1191   {"origin", s_org, 0},
1192   {"repeat", s_rept, 0},
1193
1194   /* For MIPS this is non-standard, but we define it for consistency.  */
1195   {"sbss", s_change_sec, 'B'},
1196
1197   /* These pseudo-ops are defined in read.c, but must be overridden
1198      here for one reason or another.  */
1199   {"align", s_align, 0},
1200   {"byte", s_cons, 0},
1201   {"data", s_change_sec, 'd'},
1202   {"double", s_float_cons, 'd'},
1203   {"float", s_float_cons, 'f'},
1204   {"globl", s_mips_globl, 0},
1205   {"global", s_mips_globl, 0},
1206   {"hword", s_cons, 1},
1207   {"int", s_cons, 2},
1208   {"long", s_cons, 2},
1209   {"octa", s_cons, 4},
1210   {"quad", s_cons, 3},
1211   {"section", s_change_section, 0},
1212   {"short", s_cons, 1},
1213   {"single", s_float_cons, 'f'},
1214   {"stabn", s_mips_stab, 'n'},
1215   {"text", s_change_sec, 't'},
1216   {"word", s_cons, 2},
1217
1218   { "extern", ecoff_directive_extern, 0},
1219
1220   { NULL, NULL, 0 },
1221 };
1222
1223 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1224 {
1225   /* These pseudo-ops should be defined by the object file format.
1226      However, a.out doesn't support them, so we have versions here.  */
1227   {"aent", s_mips_ent, 1},
1228   {"bgnb", s_ignore, 0},
1229   {"end", s_mips_end, 0},
1230   {"endb", s_ignore, 0},
1231   {"ent", s_mips_ent, 0},
1232   {"file", s_mips_file, 0},
1233   {"fmask", s_mips_mask, 'F'},
1234   {"frame", s_mips_frame, 0},
1235   {"loc", s_mips_loc, 0},
1236   {"mask", s_mips_mask, 'R'},
1237   {"verstamp", s_ignore, 0},
1238   { NULL, NULL, 0 },
1239 };
1240
1241 extern void pop_insert (const pseudo_typeS *);
1242
1243 void
1244 mips_pop_insert (void)
1245 {
1246   pop_insert (mips_pseudo_table);
1247   if (! ECOFF_DEBUGGING)
1248     pop_insert (mips_nonecoff_pseudo_table);
1249 }
1250 \f
1251 /* Symbols labelling the current insn.  */
1252
1253 struct insn_label_list
1254 {
1255   struct insn_label_list *next;
1256   symbolS *label;
1257 };
1258
1259 static struct insn_label_list *free_insn_labels;
1260 #define label_list tc_segment_info_data.labels
1261
1262 static void mips_clear_insn_labels (void);
1263
1264 static inline void
1265 mips_clear_insn_labels (void)
1266 {
1267   register struct insn_label_list **pl;
1268   segment_info_type *si;
1269
1270   if (now_seg)
1271     {
1272       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1273         ;
1274       
1275       si = seg_info (now_seg);
1276       *pl = si->label_list;
1277       si->label_list = NULL;
1278     }
1279 }
1280
1281 \f
1282 static char *expr_end;
1283
1284 /* Expressions which appear in instructions.  These are set by
1285    mips_ip.  */
1286
1287 static expressionS imm_expr;
1288 static expressionS imm2_expr;
1289 static expressionS offset_expr;
1290
1291 /* Relocs associated with imm_expr and offset_expr.  */
1292
1293 static bfd_reloc_code_real_type imm_reloc[3]
1294   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1295 static bfd_reloc_code_real_type offset_reloc[3]
1296   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1297
1298 /* These are set by mips16_ip if an explicit extension is used.  */
1299
1300 static bfd_boolean mips16_small, mips16_ext;
1301
1302 #ifdef OBJ_ELF
1303 /* The pdr segment for per procedure frame/regmask info.  Not used for
1304    ECOFF debugging.  */
1305
1306 static segT pdr_seg;
1307 #endif
1308
1309 /* The default target format to use.  */
1310
1311 const char *
1312 mips_target_format (void)
1313 {
1314   switch (OUTPUT_FLAVOR)
1315     {
1316     case bfd_target_ecoff_flavour:
1317       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1318     case bfd_target_coff_flavour:
1319       return "pe-mips";
1320     case bfd_target_elf_flavour:
1321 #ifdef TE_VXWORKS
1322       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1323         return (target_big_endian
1324                 ? "elf32-bigmips-vxworks"
1325                 : "elf32-littlemips-vxworks");
1326 #endif
1327 #ifdef TE_TMIPS
1328       /* This is traditional mips.  */
1329       return (target_big_endian
1330               ? (HAVE_64BIT_OBJECTS
1331                  ? "elf64-tradbigmips"
1332                  : (HAVE_NEWABI
1333                     ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1334               : (HAVE_64BIT_OBJECTS
1335                  ? "elf64-tradlittlemips"
1336                  : (HAVE_NEWABI
1337                     ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1338 #else
1339       return (target_big_endian
1340               ? (HAVE_64BIT_OBJECTS
1341                  ? "elf64-bigmips"
1342                  : (HAVE_NEWABI
1343                     ? "elf32-nbigmips" : "elf32-bigmips"))
1344               : (HAVE_64BIT_OBJECTS
1345                  ? "elf64-littlemips"
1346                  : (HAVE_NEWABI
1347                     ? "elf32-nlittlemips" : "elf32-littlemips")));
1348 #endif
1349     default:
1350       abort ();
1351       return NULL;
1352     }
1353 }
1354
1355 /* Return the length of instruction INSN.  */
1356
1357 static inline unsigned int
1358 insn_length (const struct mips_cl_insn *insn)
1359 {
1360   if (!mips_opts.mips16)
1361     return 4;
1362   return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1363 }
1364
1365 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1366
1367 static void
1368 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1369 {
1370   size_t i;
1371
1372   insn->insn_mo = mo;
1373   insn->use_extend = FALSE;
1374   insn->extend = 0;
1375   insn->insn_opcode = mo->match;
1376   insn->frag = NULL;
1377   insn->where = 0;
1378   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1379     insn->fixp[i] = NULL;
1380   insn->fixed_p = (mips_opts.noreorder > 0);
1381   insn->noreorder_p = (mips_opts.noreorder > 0);
1382   insn->mips16_absolute_jump_p = 0;
1383 }
1384
1385 /* Record the current MIPS16 mode in now_seg.  */
1386
1387 static void
1388 mips_record_mips16_mode (void)
1389 {
1390   segment_info_type *si;
1391
1392   si = seg_info (now_seg);
1393   if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1394     si->tc_segment_info_data.mips16 = mips_opts.mips16;
1395 }
1396
1397 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1398
1399 static void
1400 install_insn (const struct mips_cl_insn *insn)
1401 {
1402   char *f = insn->frag->fr_literal + insn->where;
1403   if (!mips_opts.mips16)
1404     md_number_to_chars (f, insn->insn_opcode, 4);
1405   else if (insn->mips16_absolute_jump_p)
1406     {
1407       md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1408       md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1409     }
1410   else
1411     {
1412       if (insn->use_extend)
1413         {
1414           md_number_to_chars (f, 0xf000 | insn->extend, 2);
1415           f += 2;
1416         }
1417       md_number_to_chars (f, insn->insn_opcode, 2);
1418     }
1419   mips_record_mips16_mode ();
1420 }
1421
1422 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1423    and install the opcode in the new location.  */
1424
1425 static void
1426 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1427 {
1428   size_t i;
1429
1430   insn->frag = frag;
1431   insn->where = where;
1432   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1433     if (insn->fixp[i] != NULL)
1434       {
1435         insn->fixp[i]->fx_frag = frag;
1436         insn->fixp[i]->fx_where = where;
1437       }
1438   install_insn (insn);
1439 }
1440
1441 /* Add INSN to the end of the output.  */
1442
1443 static void
1444 add_fixed_insn (struct mips_cl_insn *insn)
1445 {
1446   char *f = frag_more (insn_length (insn));
1447   move_insn (insn, frag_now, f - frag_now->fr_literal);
1448 }
1449
1450 /* Start a variant frag and move INSN to the start of the variant part,
1451    marking it as fixed.  The other arguments are as for frag_var.  */
1452
1453 static void
1454 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1455                   relax_substateT subtype, symbolS *symbol, offsetT offset)
1456 {
1457   frag_grow (max_chars);
1458   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1459   insn->fixed_p = 1;
1460   frag_var (rs_machine_dependent, max_chars, var,
1461             subtype, symbol, offset, NULL);
1462 }
1463
1464 /* Insert N copies of INSN into the history buffer, starting at
1465    position FIRST.  Neither FIRST nor N need to be clipped.  */
1466
1467 static void
1468 insert_into_history (unsigned int first, unsigned int n,
1469                      const struct mips_cl_insn *insn)
1470 {
1471   if (mips_relax.sequence != 2)
1472     {
1473       unsigned int i;
1474
1475       for (i = ARRAY_SIZE (history); i-- > first;)
1476         if (i >= first + n)
1477           history[i] = history[i - n];
1478         else
1479           history[i] = *insn;
1480     }
1481 }
1482
1483 /* Emit a nop instruction, recording it in the history buffer.  */
1484
1485 static void
1486 emit_nop (void)
1487 {
1488   add_fixed_insn (NOP_INSN);
1489   insert_into_history (0, 1, NOP_INSN);
1490 }
1491
1492 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1493    the idea is to make it obvious at a glance that each errata is
1494    included.  */
1495
1496 static void
1497 init_vr4120_conflicts (void)
1498 {
1499 #define CONFLICT(FIRST, SECOND) \
1500     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1501
1502   /* Errata 21 - [D]DIV[U] after [D]MACC */
1503   CONFLICT (MACC, DIV);
1504   CONFLICT (DMACC, DIV);
1505
1506   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1507   CONFLICT (DMULT, DMULT);
1508   CONFLICT (DMULT, DMACC);
1509   CONFLICT (DMACC, DMULT);
1510   CONFLICT (DMACC, DMACC);
1511
1512   /* Errata 24 - MT{LO,HI} after [D]MACC */
1513   CONFLICT (MACC, MTHILO);
1514   CONFLICT (DMACC, MTHILO);
1515
1516   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1517      instruction is executed immediately after a MACC or DMACC
1518      instruction, the result of [either instruction] is incorrect."  */
1519   CONFLICT (MACC, MULT);
1520   CONFLICT (MACC, DMULT);
1521   CONFLICT (DMACC, MULT);
1522   CONFLICT (DMACC, DMULT);
1523
1524   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1525      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1526      DDIV or DDIVU instruction, the result of the MACC or
1527      DMACC instruction is incorrect.".  */
1528   CONFLICT (DMULT, MACC);
1529   CONFLICT (DMULT, DMACC);
1530   CONFLICT (DIV, MACC);
1531   CONFLICT (DIV, DMACC);
1532
1533 #undef CONFLICT
1534 }
1535
1536 struct regname {
1537   const char *name;
1538   unsigned int num;
1539 };
1540
1541 #define RTYPE_MASK      0x1ff00
1542 #define RTYPE_NUM       0x00100
1543 #define RTYPE_FPU       0x00200
1544 #define RTYPE_FCC       0x00400
1545 #define RTYPE_VEC       0x00800
1546 #define RTYPE_GP        0x01000
1547 #define RTYPE_CP0       0x02000
1548 #define RTYPE_PC        0x04000
1549 #define RTYPE_ACC       0x08000
1550 #define RTYPE_CCC       0x10000
1551 #define RNUM_MASK       0x000ff
1552 #define RWARN           0x80000
1553
1554 #define GENERIC_REGISTER_NUMBERS \
1555     {"$0",      RTYPE_NUM | 0},  \
1556     {"$1",      RTYPE_NUM | 1},  \
1557     {"$2",      RTYPE_NUM | 2},  \
1558     {"$3",      RTYPE_NUM | 3},  \
1559     {"$4",      RTYPE_NUM | 4},  \
1560     {"$5",      RTYPE_NUM | 5},  \
1561     {"$6",      RTYPE_NUM | 6},  \
1562     {"$7",      RTYPE_NUM | 7},  \
1563     {"$8",      RTYPE_NUM | 8},  \
1564     {"$9",      RTYPE_NUM | 9},  \
1565     {"$10",     RTYPE_NUM | 10}, \
1566     {"$11",     RTYPE_NUM | 11}, \
1567     {"$12",     RTYPE_NUM | 12}, \
1568     {"$13",     RTYPE_NUM | 13}, \
1569     {"$14",     RTYPE_NUM | 14}, \
1570     {"$15",     RTYPE_NUM | 15}, \
1571     {"$16",     RTYPE_NUM | 16}, \
1572     {"$17",     RTYPE_NUM | 17}, \
1573     {"$18",     RTYPE_NUM | 18}, \
1574     {"$19",     RTYPE_NUM | 19}, \
1575     {"$20",     RTYPE_NUM | 20}, \
1576     {"$21",     RTYPE_NUM | 21}, \
1577     {"$22",     RTYPE_NUM | 22}, \
1578     {"$23",     RTYPE_NUM | 23}, \
1579     {"$24",     RTYPE_NUM | 24}, \
1580     {"$25",     RTYPE_NUM | 25}, \
1581     {"$26",     RTYPE_NUM | 26}, \
1582     {"$27",     RTYPE_NUM | 27}, \
1583     {"$28",     RTYPE_NUM | 28}, \
1584     {"$29",     RTYPE_NUM | 29}, \
1585     {"$30",     RTYPE_NUM | 30}, \
1586     {"$31",     RTYPE_NUM | 31} 
1587
1588 #define FPU_REGISTER_NAMES       \
1589     {"$f0",     RTYPE_FPU | 0},  \
1590     {"$f1",     RTYPE_FPU | 1},  \
1591     {"$f2",     RTYPE_FPU | 2},  \
1592     {"$f3",     RTYPE_FPU | 3},  \
1593     {"$f4",     RTYPE_FPU | 4},  \
1594     {"$f5",     RTYPE_FPU | 5},  \
1595     {"$f6",     RTYPE_FPU | 6},  \
1596     {"$f7",     RTYPE_FPU | 7},  \
1597     {"$f8",     RTYPE_FPU | 8},  \
1598     {"$f9",     RTYPE_FPU | 9},  \
1599     {"$f10",    RTYPE_FPU | 10}, \
1600     {"$f11",    RTYPE_FPU | 11}, \
1601     {"$f12",    RTYPE_FPU | 12}, \
1602     {"$f13",    RTYPE_FPU | 13}, \
1603     {"$f14",    RTYPE_FPU | 14}, \
1604     {"$f15",    RTYPE_FPU | 15}, \
1605     {"$f16",    RTYPE_FPU | 16}, \
1606     {"$f17",    RTYPE_FPU | 17}, \
1607     {"$f18",    RTYPE_FPU | 18}, \
1608     {"$f19",    RTYPE_FPU | 19}, \
1609     {"$f20",    RTYPE_FPU | 20}, \
1610     {"$f21",    RTYPE_FPU | 21}, \
1611     {"$f22",    RTYPE_FPU | 22}, \
1612     {"$f23",    RTYPE_FPU | 23}, \
1613     {"$f24",    RTYPE_FPU | 24}, \
1614     {"$f25",    RTYPE_FPU | 25}, \
1615     {"$f26",    RTYPE_FPU | 26}, \
1616     {"$f27",    RTYPE_FPU | 27}, \
1617     {"$f28",    RTYPE_FPU | 28}, \
1618     {"$f29",    RTYPE_FPU | 29}, \
1619     {"$f30",    RTYPE_FPU | 30}, \
1620     {"$f31",    RTYPE_FPU | 31}
1621
1622 #define FPU_CONDITION_CODE_NAMES \
1623     {"$fcc0",   RTYPE_FCC | 0},  \
1624     {"$fcc1",   RTYPE_FCC | 1},  \
1625     {"$fcc2",   RTYPE_FCC | 2},  \
1626     {"$fcc3",   RTYPE_FCC | 3},  \
1627     {"$fcc4",   RTYPE_FCC | 4},  \
1628     {"$fcc5",   RTYPE_FCC | 5},  \
1629     {"$fcc6",   RTYPE_FCC | 6},  \
1630     {"$fcc7",   RTYPE_FCC | 7}
1631
1632 #define COPROC_CONDITION_CODE_NAMES         \
1633     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1634     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1635     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1636     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1637     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1638     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1639     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1640     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1641
1642 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1643     {"$a4",     RTYPE_GP | 8},  \
1644     {"$a5",     RTYPE_GP | 9},  \
1645     {"$a6",     RTYPE_GP | 10}, \
1646     {"$a7",     RTYPE_GP | 11}, \
1647     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1648     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1649     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1650     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1651     {"$t0",     RTYPE_GP | 12}, \
1652     {"$t1",     RTYPE_GP | 13}, \
1653     {"$t2",     RTYPE_GP | 14}, \
1654     {"$t3",     RTYPE_GP | 15}
1655
1656 #define O32_SYMBOLIC_REGISTER_NAMES \
1657     {"$t0",     RTYPE_GP | 8},  \
1658     {"$t1",     RTYPE_GP | 9},  \
1659     {"$t2",     RTYPE_GP | 10}, \
1660     {"$t3",     RTYPE_GP | 11}, \
1661     {"$t4",     RTYPE_GP | 12}, \
1662     {"$t5",     RTYPE_GP | 13}, \
1663     {"$t6",     RTYPE_GP | 14}, \
1664     {"$t7",     RTYPE_GP | 15}, \
1665     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
1666     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
1667     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
1668     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */ 
1669
1670 /* Remaining symbolic register names */
1671 #define SYMBOLIC_REGISTER_NAMES \
1672     {"$zero",   RTYPE_GP | 0},  \
1673     {"$at",     RTYPE_GP | 1},  \
1674     {"$AT",     RTYPE_GP | 1},  \
1675     {"$v0",     RTYPE_GP | 2},  \
1676     {"$v1",     RTYPE_GP | 3},  \
1677     {"$a0",     RTYPE_GP | 4},  \
1678     {"$a1",     RTYPE_GP | 5},  \
1679     {"$a2",     RTYPE_GP | 6},  \
1680     {"$a3",     RTYPE_GP | 7},  \
1681     {"$s0",     RTYPE_GP | 16}, \
1682     {"$s1",     RTYPE_GP | 17}, \
1683     {"$s2",     RTYPE_GP | 18}, \
1684     {"$s3",     RTYPE_GP | 19}, \
1685     {"$s4",     RTYPE_GP | 20}, \
1686     {"$s5",     RTYPE_GP | 21}, \
1687     {"$s6",     RTYPE_GP | 22}, \
1688     {"$s7",     RTYPE_GP | 23}, \
1689     {"$t8",     RTYPE_GP | 24}, \
1690     {"$t9",     RTYPE_GP | 25}, \
1691     {"$k0",     RTYPE_GP | 26}, \
1692     {"$kt0",    RTYPE_GP | 26}, \
1693     {"$k1",     RTYPE_GP | 27}, \
1694     {"$kt1",    RTYPE_GP | 27}, \
1695     {"$gp",     RTYPE_GP | 28}, \
1696     {"$sp",     RTYPE_GP | 29}, \
1697     {"$s8",     RTYPE_GP | 30}, \
1698     {"$fp",     RTYPE_GP | 30}, \
1699     {"$ra",     RTYPE_GP | 31}
1700
1701 #define MIPS16_SPECIAL_REGISTER_NAMES \
1702     {"$pc",     RTYPE_PC | 0}
1703
1704 #define MDMX_VECTOR_REGISTER_NAMES \
1705     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
1706     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
1707     {"$v2",     RTYPE_VEC | 2},  \
1708     {"$v3",     RTYPE_VEC | 3},  \
1709     {"$v4",     RTYPE_VEC | 4},  \
1710     {"$v5",     RTYPE_VEC | 5},  \
1711     {"$v6",     RTYPE_VEC | 6},  \
1712     {"$v7",     RTYPE_VEC | 7},  \
1713     {"$v8",     RTYPE_VEC | 8},  \
1714     {"$v9",     RTYPE_VEC | 9},  \
1715     {"$v10",    RTYPE_VEC | 10}, \
1716     {"$v11",    RTYPE_VEC | 11}, \
1717     {"$v12",    RTYPE_VEC | 12}, \
1718     {"$v13",    RTYPE_VEC | 13}, \
1719     {"$v14",    RTYPE_VEC | 14}, \
1720     {"$v15",    RTYPE_VEC | 15}, \
1721     {"$v16",    RTYPE_VEC | 16}, \
1722     {"$v17",    RTYPE_VEC | 17}, \
1723     {"$v18",    RTYPE_VEC | 18}, \
1724     {"$v19",    RTYPE_VEC | 19}, \
1725     {"$v20",    RTYPE_VEC | 20}, \
1726     {"$v21",    RTYPE_VEC | 21}, \
1727     {"$v22",    RTYPE_VEC | 22}, \
1728     {"$v23",    RTYPE_VEC | 23}, \
1729     {"$v24",    RTYPE_VEC | 24}, \
1730     {"$v25",    RTYPE_VEC | 25}, \
1731     {"$v26",    RTYPE_VEC | 26}, \
1732     {"$v27",    RTYPE_VEC | 27}, \
1733     {"$v28",    RTYPE_VEC | 28}, \
1734     {"$v29",    RTYPE_VEC | 29}, \
1735     {"$v30",    RTYPE_VEC | 30}, \
1736     {"$v31",    RTYPE_VEC | 31}
1737
1738 #define MIPS_DSP_ACCUMULATOR_NAMES \
1739     {"$ac0",    RTYPE_ACC | 0}, \
1740     {"$ac1",    RTYPE_ACC | 1}, \
1741     {"$ac2",    RTYPE_ACC | 2}, \
1742     {"$ac3",    RTYPE_ACC | 3}
1743
1744 static const struct regname reg_names[] = {
1745   GENERIC_REGISTER_NUMBERS,
1746   FPU_REGISTER_NAMES,
1747   FPU_CONDITION_CODE_NAMES,
1748   COPROC_CONDITION_CODE_NAMES,
1749
1750   /* The $txx registers depends on the abi,
1751      these will be added later into the symbol table from
1752      one of the tables below once mips_abi is set after 
1753      parsing of arguments from the command line. */
1754   SYMBOLIC_REGISTER_NAMES,
1755
1756   MIPS16_SPECIAL_REGISTER_NAMES,
1757   MDMX_VECTOR_REGISTER_NAMES,
1758   MIPS_DSP_ACCUMULATOR_NAMES,
1759   {0, 0}
1760 };
1761
1762 static const struct regname reg_names_o32[] = {
1763   O32_SYMBOLIC_REGISTER_NAMES,
1764   {0, 0}
1765 };
1766
1767 static const struct regname reg_names_n32n64[] = {
1768   N32N64_SYMBOLIC_REGISTER_NAMES,
1769   {0, 0}
1770 };
1771
1772 static int
1773 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1774 {
1775   symbolS *symbolP;
1776   char *e;
1777   char save_c;
1778   int reg = -1;
1779
1780   /* Find end of name.  */
1781   e = *s;
1782   if (is_name_beginner (*e))
1783     ++e;
1784   while (is_part_of_name (*e))
1785     ++e;
1786
1787   /* Terminate name.  */
1788   save_c = *e;
1789   *e = '\0';
1790
1791   /* Look for a register symbol.  */
1792   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1793     {
1794       int r = S_GET_VALUE (symbolP);
1795       if (r & types)
1796         reg = r & RNUM_MASK;
1797       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1798         /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
1799         reg = (r & RNUM_MASK) - 2;
1800     }
1801   /* Else see if this is a register defined in an itbl entry.  */
1802   else if ((types & RTYPE_GP) && itbl_have_entries)
1803     {
1804       char *n = *s;
1805       unsigned long r;
1806
1807       if (*n == '$')
1808         ++n;
1809       if (itbl_get_reg_val (n, &r))
1810         reg = r & RNUM_MASK;
1811     }
1812
1813   /* Advance to next token if a register was recognised.  */
1814   if (reg >= 0)
1815     *s = e;
1816   else if (types & RWARN)
1817     as_warn (_("Unrecognized register name `%s'"), *s);
1818
1819   *e = save_c;
1820   if (regnop)
1821     *regnop = reg;
1822   return reg >= 0;
1823 }
1824
1825 /* Return TRUE if opcode MO is valid on the currently selected ISA and
1826    architecture.  Use is_opcode_valid_16 for MIPS16 opcodes.  */
1827
1828 static bfd_boolean
1829 is_opcode_valid (const struct mips_opcode *mo)
1830 {
1831   int isa = mips_opts.isa;
1832   int fp_s, fp_d;
1833
1834   if (mips_opts.ase_mdmx)
1835     isa |= INSN_MDMX;
1836   if (mips_opts.ase_dsp)
1837     isa |= INSN_DSP;
1838   if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
1839     isa |= INSN_DSP64;
1840   if (mips_opts.ase_dspr2)
1841     isa |= INSN_DSPR2;
1842   if (mips_opts.ase_mt)
1843     isa |= INSN_MT;
1844   if (mips_opts.ase_mips3d)
1845     isa |= INSN_MIPS3D;
1846   if (mips_opts.ase_smartmips)
1847     isa |= INSN_SMARTMIPS;
1848
1849   /* Don't accept instructions based on the ISA if the CPU does not implement
1850      all the coprocessor insns. */
1851   if (NO_ISA_COP (mips_opts.arch)
1852       && COP_INSN (mo->pinfo))
1853     isa = 0;
1854
1855   if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
1856     return FALSE;
1857
1858   /* Check whether the instruction or macro requires single-precision or
1859      double-precision floating-point support.  Note that this information is
1860      stored differently in the opcode table for insns and macros.  */
1861   if (mo->pinfo == INSN_MACRO)
1862     {
1863       fp_s = mo->pinfo2 & INSN2_M_FP_S;
1864       fp_d = mo->pinfo2 & INSN2_M_FP_D;
1865     }
1866   else
1867     {
1868       fp_s = mo->pinfo & FP_S;
1869       fp_d = mo->pinfo & FP_D;
1870     }
1871
1872   if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
1873     return FALSE;
1874
1875   if (fp_s && mips_opts.soft_float)
1876     return FALSE;
1877
1878   return TRUE;
1879 }
1880
1881 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
1882    selected ISA and architecture.  */
1883
1884 static bfd_boolean
1885 is_opcode_valid_16 (const struct mips_opcode *mo)
1886 {
1887   return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
1888 }
1889
1890 /* This function is called once, at assembler startup time.  It should set up
1891    all the tables, etc. that the MD part of the assembler will need.  */
1892
1893 void
1894 md_begin (void)
1895 {
1896   const char *retval = NULL;
1897   int i = 0;
1898   int broken = 0;
1899
1900   if (mips_pic != NO_PIC)
1901     {
1902       if (g_switch_seen && g_switch_value != 0)
1903         as_bad (_("-G may not be used in position-independent code"));
1904       g_switch_value = 0;
1905     }
1906
1907   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1908     as_warn (_("Could not set architecture and machine"));
1909
1910   op_hash = hash_new ();
1911
1912   for (i = 0; i < NUMOPCODES;)
1913     {
1914       const char *name = mips_opcodes[i].name;
1915
1916       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1917       if (retval != NULL)
1918         {
1919           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1920                    mips_opcodes[i].name, retval);
1921           /* Probably a memory allocation problem?  Give up now.  */
1922           as_fatal (_("Broken assembler.  No assembly attempted."));
1923         }
1924       do
1925         {
1926           if (mips_opcodes[i].pinfo != INSN_MACRO)
1927             {
1928               if (!validate_mips_insn (&mips_opcodes[i]))
1929                 broken = 1;
1930               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1931                 {
1932                   create_insn (&nop_insn, mips_opcodes + i);
1933                   if (mips_fix_loongson2f_nop)
1934                     nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
1935                   nop_insn.fixed_p = 1;
1936                 }
1937             }
1938           ++i;
1939         }
1940       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1941     }
1942
1943   mips16_op_hash = hash_new ();
1944
1945   i = 0;
1946   while (i < bfd_mips16_num_opcodes)
1947     {
1948       const char *name = mips16_opcodes[i].name;
1949
1950       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1951       if (retval != NULL)
1952         as_fatal (_("internal: can't hash `%s': %s"),
1953                   mips16_opcodes[i].name, retval);
1954       do
1955         {
1956           if (mips16_opcodes[i].pinfo != INSN_MACRO
1957               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1958                   != mips16_opcodes[i].match))
1959             {
1960               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1961                        mips16_opcodes[i].name, mips16_opcodes[i].args);
1962               broken = 1;
1963             }
1964           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1965             {
1966               create_insn (&mips16_nop_insn, mips16_opcodes + i);
1967               mips16_nop_insn.fixed_p = 1;
1968             }
1969           ++i;
1970         }
1971       while (i < bfd_mips16_num_opcodes
1972              && strcmp (mips16_opcodes[i].name, name) == 0);
1973     }
1974
1975   if (broken)
1976     as_fatal (_("Broken assembler.  No assembly attempted."));
1977
1978   /* We add all the general register names to the symbol table.  This
1979      helps us detect invalid uses of them.  */
1980   for (i = 0; reg_names[i].name; i++) 
1981     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1982                                      reg_names[i].num, /* & RNUM_MASK, */
1983                                      &zero_address_frag));
1984   if (HAVE_NEWABI)
1985     for (i = 0; reg_names_n32n64[i].name; i++) 
1986       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1987                                        reg_names_n32n64[i].num, /* & RNUM_MASK, */
1988                                        &zero_address_frag));
1989   else
1990     for (i = 0; reg_names_o32[i].name; i++) 
1991       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
1992                                        reg_names_o32[i].num, /* & RNUM_MASK, */
1993                                        &zero_address_frag));
1994
1995   mips_no_prev_insn ();
1996
1997   mips_gprmask = 0;
1998   mips_cprmask[0] = 0;
1999   mips_cprmask[1] = 0;
2000   mips_cprmask[2] = 0;
2001   mips_cprmask[3] = 0;
2002
2003   /* set the default alignment for the text section (2**2) */
2004   record_alignment (text_section, 2);
2005
2006   bfd_set_gp_size (stdoutput, g_switch_value);
2007
2008 #ifdef OBJ_ELF
2009   if (IS_ELF)
2010     {
2011       /* On a native system other than VxWorks, sections must be aligned
2012          to 16 byte boundaries.  When configured for an embedded ELF
2013          target, we don't bother.  */
2014       if (strncmp (TARGET_OS, "elf", 3) != 0
2015           && strncmp (TARGET_OS, "vxworks", 7) != 0)
2016         {
2017           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2018           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2019           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2020         }
2021
2022       /* Create a .reginfo section for register masks and a .mdebug
2023          section for debugging information.  */
2024       {
2025         segT seg;
2026         subsegT subseg;
2027         flagword flags;
2028         segT sec;
2029
2030         seg = now_seg;
2031         subseg = now_subseg;
2032
2033         /* The ABI says this section should be loaded so that the
2034            running program can access it.  However, we don't load it
2035            if we are configured for an embedded target */
2036         flags = SEC_READONLY | SEC_DATA;
2037         if (strncmp (TARGET_OS, "elf", 3) != 0)
2038           flags |= SEC_ALLOC | SEC_LOAD;
2039
2040         if (mips_abi != N64_ABI)
2041           {
2042             sec = subseg_new (".reginfo", (subsegT) 0);
2043
2044             bfd_set_section_flags (stdoutput, sec, flags);
2045             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2046
2047             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2048           }
2049         else
2050           {
2051             /* The 64-bit ABI uses a .MIPS.options section rather than
2052                .reginfo section.  */
2053             sec = subseg_new (".MIPS.options", (subsegT) 0);
2054             bfd_set_section_flags (stdoutput, sec, flags);
2055             bfd_set_section_alignment (stdoutput, sec, 3);
2056
2057             /* Set up the option header.  */
2058             {
2059               Elf_Internal_Options opthdr;
2060               char *f;
2061
2062               opthdr.kind = ODK_REGINFO;
2063               opthdr.size = (sizeof (Elf_External_Options)
2064                              + sizeof (Elf64_External_RegInfo));
2065               opthdr.section = 0;
2066               opthdr.info = 0;
2067               f = frag_more (sizeof (Elf_External_Options));
2068               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2069                                              (Elf_External_Options *) f);
2070
2071               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2072             }
2073           }
2074
2075         if (ECOFF_DEBUGGING)
2076           {
2077             sec = subseg_new (".mdebug", (subsegT) 0);
2078             (void) bfd_set_section_flags (stdoutput, sec,
2079                                           SEC_HAS_CONTENTS | SEC_READONLY);
2080             (void) bfd_set_section_alignment (stdoutput, sec, 2);
2081           }
2082         else if (mips_flag_pdr)
2083           {
2084             pdr_seg = subseg_new (".pdr", (subsegT) 0);
2085             (void) bfd_set_section_flags (stdoutput, pdr_seg,
2086                                           SEC_READONLY | SEC_RELOC
2087                                           | SEC_DEBUGGING);
2088             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2089           }
2090
2091         subseg_set (seg, subseg);
2092       }
2093     }
2094 #endif /* OBJ_ELF */
2095
2096   if (! ECOFF_DEBUGGING)
2097     md_obj_begin ();
2098
2099   if (mips_fix_vr4120)
2100     init_vr4120_conflicts ();
2101 }
2102
2103 void
2104 md_mips_end (void)
2105 {
2106   if (! ECOFF_DEBUGGING)
2107     md_obj_end ();
2108 }
2109
2110 void
2111 md_assemble (char *str)
2112 {
2113   struct mips_cl_insn insn;
2114   bfd_reloc_code_real_type unused_reloc[3]
2115     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2116
2117   imm_expr.X_op = O_absent;
2118   imm2_expr.X_op = O_absent;
2119   offset_expr.X_op = O_absent;
2120   imm_reloc[0] = BFD_RELOC_UNUSED;
2121   imm_reloc[1] = BFD_RELOC_UNUSED;
2122   imm_reloc[2] = BFD_RELOC_UNUSED;
2123   offset_reloc[0] = BFD_RELOC_UNUSED;
2124   offset_reloc[1] = BFD_RELOC_UNUSED;
2125   offset_reloc[2] = BFD_RELOC_UNUSED;
2126
2127   if (mips_opts.mips16)
2128     mips16_ip (str, &insn);
2129   else
2130     {
2131       mips_ip (str, &insn);
2132       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2133             str, insn.insn_opcode));
2134     }
2135
2136   if (insn_error)
2137     {
2138       as_bad ("%s `%s'", insn_error, str);
2139       return;
2140     }
2141
2142   if (insn.insn_mo->pinfo == INSN_MACRO)
2143     {
2144       macro_start ();
2145       if (mips_opts.mips16)
2146         mips16_macro (&insn);
2147       else
2148         macro (&insn);
2149       macro_end ();
2150     }
2151   else
2152     {
2153       if (imm_expr.X_op != O_absent)
2154         append_insn (&insn, &imm_expr, imm_reloc);
2155       else if (offset_expr.X_op != O_absent)
2156         append_insn (&insn, &offset_expr, offset_reloc);
2157       else
2158         append_insn (&insn, NULL, unused_reloc);
2159     }
2160 }
2161
2162 /* Convenience functions for abstracting away the differences between
2163    MIPS16 and non-MIPS16 relocations.  */
2164
2165 static inline bfd_boolean
2166 mips16_reloc_p (bfd_reloc_code_real_type reloc)
2167 {
2168   switch (reloc)
2169     {
2170     case BFD_RELOC_MIPS16_JMP:
2171     case BFD_RELOC_MIPS16_GPREL:
2172     case BFD_RELOC_MIPS16_GOT16:
2173     case BFD_RELOC_MIPS16_CALL16:
2174     case BFD_RELOC_MIPS16_HI16_S:
2175     case BFD_RELOC_MIPS16_HI16:
2176     case BFD_RELOC_MIPS16_LO16:
2177       return TRUE;
2178
2179     default:
2180       return FALSE;
2181     }
2182 }
2183
2184 static inline bfd_boolean
2185 got16_reloc_p (bfd_reloc_code_real_type reloc)
2186 {
2187   return reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16;
2188 }
2189
2190 static inline bfd_boolean
2191 hi16_reloc_p (bfd_reloc_code_real_type reloc)
2192 {
2193   return reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S;
2194 }
2195
2196 static inline bfd_boolean
2197 lo16_reloc_p (bfd_reloc_code_real_type reloc)
2198 {
2199   return reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16;
2200 }
2201
2202 /* Return true if the given relocation might need a matching %lo().
2203    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2204    need a matching %lo() when applied to local symbols.  */
2205
2206 static inline bfd_boolean
2207 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2208 {
2209   return (HAVE_IN_PLACE_ADDENDS
2210           && (hi16_reloc_p (reloc)
2211               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2212                  all GOT16 relocations evaluate to "G".  */
2213               || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2214 }
2215
2216 /* Return the type of %lo() reloc needed by RELOC, given that
2217    reloc_needs_lo_p.  */
2218
2219 static inline bfd_reloc_code_real_type
2220 matching_lo_reloc (bfd_reloc_code_real_type reloc)
2221 {
2222   return mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16 : BFD_RELOC_LO16;
2223 }
2224
2225 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2226    relocation.  */
2227
2228 static inline bfd_boolean
2229 fixup_has_matching_lo_p (fixS *fixp)
2230 {
2231   return (fixp->fx_next != NULL
2232           && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
2233           && fixp->fx_addsy == fixp->fx_next->fx_addsy
2234           && fixp->fx_offset == fixp->fx_next->fx_offset);
2235 }
2236
2237 /* See whether instruction IP reads register REG.  CLASS is the type
2238    of register.  */
2239
2240 static int
2241 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2242                enum mips_regclass regclass)
2243 {
2244   if (regclass == MIPS16_REG)
2245     {
2246       gas_assert (mips_opts.mips16);
2247       reg = mips16_to_32_reg_map[reg];
2248       regclass = MIPS_GR_REG;
2249     }
2250
2251   /* Don't report on general register ZERO, since it never changes.  */
2252   if (regclass == MIPS_GR_REG && reg == ZERO)
2253     return 0;
2254
2255   if (regclass == MIPS_FP_REG)
2256     {
2257       gas_assert (! mips_opts.mips16);
2258       /* If we are called with either $f0 or $f1, we must check $f0.
2259          This is not optimal, because it will introduce an unnecessary
2260          NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
2261          need to distinguish reading both $f0 and $f1 or just one of
2262          them.  Note that we don't have to check the other way,
2263          because there is no instruction that sets both $f0 and $f1
2264          and requires a delay.  */
2265       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2266           && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2267               == (reg &~ (unsigned) 1)))
2268         return 1;
2269       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2270           && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2271               == (reg &~ (unsigned) 1)))
2272         return 1;
2273     }
2274   else if (! mips_opts.mips16)
2275     {
2276       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2277           && EXTRACT_OPERAND (RS, *ip) == reg)
2278         return 1;
2279       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2280           && EXTRACT_OPERAND (RT, *ip) == reg)
2281         return 1;
2282     }
2283   else
2284     {
2285       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2286           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2287         return 1;
2288       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2289           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2290         return 1;
2291       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2292           && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2293               == reg))
2294         return 1;
2295       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2296         return 1;
2297       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2298         return 1;
2299       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2300         return 1;
2301       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2302           && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2303         return 1;
2304     }
2305
2306   return 0;
2307 }
2308
2309 /* This function returns true if modifying a register requires a
2310    delay.  */
2311
2312 static int
2313 reg_needs_delay (unsigned int reg)
2314 {
2315   unsigned long prev_pinfo;
2316
2317   prev_pinfo = history[0].insn_mo->pinfo;
2318   if (! mips_opts.noreorder
2319       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2320            && ! gpr_interlocks)
2321           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2322               && ! cop_interlocks)))
2323     {
2324       /* A load from a coprocessor or from memory.  All load delays
2325          delay the use of general register rt for one instruction.  */
2326       /* Itbl support may require additional care here.  */
2327       know (prev_pinfo & INSN_WRITE_GPR_T);
2328       if (reg == EXTRACT_OPERAND (RT, history[0]))
2329         return 1;
2330     }
2331
2332   return 0;
2333 }
2334
2335 /* Move all labels in insn_labels to the current insertion point.  */
2336
2337 static void
2338 mips_move_labels (void)
2339 {
2340   segment_info_type *si = seg_info (now_seg);
2341   struct insn_label_list *l;
2342   valueT val;
2343
2344   for (l = si->label_list; l != NULL; l = l->next)
2345     {
2346       gas_assert (S_GET_SEGMENT (l->label) == now_seg);
2347       symbol_set_frag (l->label, frag_now);
2348       val = (valueT) frag_now_fix ();
2349       /* mips16 text labels are stored as odd.  */
2350       if (mips_opts.mips16)
2351         ++val;
2352       S_SET_VALUE (l->label, val);
2353     }
2354 }
2355
2356 static bfd_boolean
2357 s_is_linkonce (symbolS *sym, segT from_seg)
2358 {
2359   bfd_boolean linkonce = FALSE;
2360   segT symseg = S_GET_SEGMENT (sym);
2361
2362   if (symseg != from_seg && !S_IS_LOCAL (sym))
2363     {
2364       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2365         linkonce = TRUE;
2366 #ifdef OBJ_ELF
2367       /* The GNU toolchain uses an extension for ELF: a section
2368          beginning with the magic string .gnu.linkonce is a
2369          linkonce section.  */
2370       if (strncmp (segment_name (symseg), ".gnu.linkonce",
2371                    sizeof ".gnu.linkonce" - 1) == 0)
2372         linkonce = TRUE;
2373 #endif
2374     }
2375   return linkonce;
2376 }
2377
2378 /* Mark instruction labels in mips16 mode.  This permits the linker to
2379    handle them specially, such as generating jalx instructions when
2380    needed.  We also make them odd for the duration of the assembly, in
2381    order to generate the right sort of code.  We will make them even
2382    in the adjust_symtab routine, while leaving them marked.  This is
2383    convenient for the debugger and the disassembler.  The linker knows
2384    to make them odd again.  */
2385
2386 static void
2387 mips16_mark_labels (void)
2388 {
2389   segment_info_type *si = seg_info (now_seg);
2390   struct insn_label_list *l;
2391
2392   if (!mips_opts.mips16)
2393     return;
2394
2395   for (l = si->label_list; l != NULL; l = l->next)
2396    {
2397       symbolS *label = l->label;
2398
2399 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2400       if (IS_ELF)
2401         S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2402 #endif
2403       if ((S_GET_VALUE (label) & 1) == 0
2404         /* Don't adjust the address if the label is global or weak, or
2405            in a link-once section, since we'll be emitting symbol reloc
2406            references to it which will be patched up by the linker, and
2407            the final value of the symbol may or may not be MIPS16.  */
2408           && ! S_IS_WEAK (label)
2409           && ! S_IS_EXTERNAL (label)
2410           && ! s_is_linkonce (label, now_seg))
2411         S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2412     }
2413 }
2414
2415 /* End the current frag.  Make it a variant frag and record the
2416    relaxation info.  */
2417
2418 static void
2419 relax_close_frag (void)
2420 {
2421   mips_macro_warning.first_frag = frag_now;
2422   frag_var (rs_machine_dependent, 0, 0,
2423             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2424             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2425
2426   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2427   mips_relax.first_fixup = 0;
2428 }
2429
2430 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2431    See the comment above RELAX_ENCODE for more details.  */
2432
2433 static void
2434 relax_start (symbolS *symbol)
2435 {
2436   gas_assert (mips_relax.sequence == 0);
2437   mips_relax.sequence = 1;
2438   mips_relax.symbol = symbol;
2439 }
2440
2441 /* Start generating the second version of a relaxable sequence.
2442    See the comment above RELAX_ENCODE for more details.  */
2443
2444 static void
2445 relax_switch (void)
2446 {
2447   gas_assert (mips_relax.sequence == 1);
2448   mips_relax.sequence = 2;
2449 }
2450
2451 /* End the current relaxable sequence.  */
2452
2453 static void
2454 relax_end (void)
2455 {
2456   gas_assert (mips_relax.sequence == 2);
2457   relax_close_frag ();
2458   mips_relax.sequence = 0;
2459 }
2460
2461 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2462    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2463    by VR4120 errata.  */
2464
2465 static unsigned int
2466 classify_vr4120_insn (const char *name)
2467 {
2468   if (strncmp (name, "macc", 4) == 0)
2469     return FIX_VR4120_MACC;
2470   if (strncmp (name, "dmacc", 5) == 0)
2471     return FIX_VR4120_DMACC;
2472   if (strncmp (name, "mult", 4) == 0)
2473     return FIX_VR4120_MULT;
2474   if (strncmp (name, "dmult", 5) == 0)
2475     return FIX_VR4120_DMULT;
2476   if (strstr (name, "div"))
2477     return FIX_VR4120_DIV;
2478   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2479     return FIX_VR4120_MTHILO;
2480   return NUM_FIX_VR4120_CLASSES;
2481 }
2482
2483 #define INSN_ERET  0x42000018
2484 #define INSN_DERET 0x4200001f
2485
2486 /* Return the number of instructions that must separate INSN1 and INSN2,
2487    where INSN1 is the earlier instruction.  Return the worst-case value
2488    for any INSN2 if INSN2 is null.  */
2489
2490 static unsigned int
2491 insns_between (const struct mips_cl_insn *insn1,
2492                const struct mips_cl_insn *insn2)
2493 {
2494   unsigned long pinfo1, pinfo2;
2495
2496   /* This function needs to know which pinfo flags are set for INSN2
2497      and which registers INSN2 uses.  The former is stored in PINFO2 and
2498      the latter is tested via INSN2_USES_REG.  If INSN2 is null, PINFO2
2499      will have every flag set and INSN2_USES_REG will always return true.  */
2500   pinfo1 = insn1->insn_mo->pinfo;
2501   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2502
2503 #define INSN2_USES_REG(REG, CLASS) \
2504    (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2505
2506   /* For most targets, write-after-read dependencies on the HI and LO
2507      registers must be separated by at least two instructions.  */
2508   if (!hilo_interlocks)
2509     {
2510       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2511         return 2;
2512       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2513         return 2;
2514     }
2515
2516   /* If we're working around r7000 errata, there must be two instructions
2517      between an mfhi or mflo and any instruction that uses the result.  */
2518   if (mips_7000_hilo_fix
2519       && MF_HILO_INSN (pinfo1)
2520       && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2521     return 2;
2522
2523   /* If we're working around 24K errata, one instruction is required
2524      if an ERET or DERET is followed by a branch instruction.  */
2525   if (mips_fix_24k)
2526     {
2527       if (insn1->insn_opcode == INSN_ERET
2528           || insn1->insn_opcode == INSN_DERET)
2529         {
2530           if (insn2 == NULL
2531               || insn2->insn_opcode == INSN_ERET
2532               || insn2->insn_opcode == INSN_DERET
2533               || (insn2->insn_mo->pinfo
2534                   & (INSN_UNCOND_BRANCH_DELAY
2535                      | INSN_COND_BRANCH_DELAY
2536                      | INSN_COND_BRANCH_LIKELY)) != 0)
2537             return 1;
2538         }
2539     }
2540
2541   /* If working around VR4120 errata, check for combinations that need
2542      a single intervening instruction.  */
2543   if (mips_fix_vr4120)
2544     {
2545       unsigned int class1, class2;
2546
2547       class1 = classify_vr4120_insn (insn1->insn_mo->name);
2548       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2549         {
2550           if (insn2 == NULL)
2551             return 1;
2552           class2 = classify_vr4120_insn (insn2->insn_mo->name);
2553           if (vr4120_conflicts[class1] & (1 << class2))
2554             return 1;
2555         }
2556     }
2557
2558   if (!mips_opts.mips16)
2559     {
2560       /* Check for GPR or coprocessor load delays.  All such delays
2561          are on the RT register.  */
2562       /* Itbl support may require additional care here.  */
2563       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2564           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2565         {
2566           know (pinfo1 & INSN_WRITE_GPR_T);
2567           if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2568             return 1;
2569         }
2570
2571       /* Check for generic coprocessor hazards.
2572
2573          This case is not handled very well.  There is no special
2574          knowledge of CP0 handling, and the coprocessors other than
2575          the floating point unit are not distinguished at all.  */
2576       /* Itbl support may require additional care here. FIXME!
2577          Need to modify this to include knowledge about
2578          user specified delays!  */
2579       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2580                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2581         {
2582           /* Handle cases where INSN1 writes to a known general coprocessor
2583              register.  There must be a one instruction delay before INSN2
2584              if INSN2 reads that register, otherwise no delay is needed.  */
2585           if (pinfo1 & INSN_WRITE_FPR_T)
2586             {
2587               if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2588                 return 1;
2589             }
2590           else if (pinfo1 & INSN_WRITE_FPR_S)
2591             {
2592               if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2593                 return 1;
2594             }
2595           else
2596             {
2597               /* Read-after-write dependencies on the control registers
2598                  require a two-instruction gap.  */
2599               if ((pinfo1 & INSN_WRITE_COND_CODE)
2600                   && (pinfo2 & INSN_READ_COND_CODE))
2601                 return 2;
2602
2603               /* We don't know exactly what INSN1 does.  If INSN2 is
2604                  also a coprocessor instruction, assume there must be
2605                  a one instruction gap.  */
2606               if (pinfo2 & INSN_COP)
2607                 return 1;
2608             }
2609         }
2610
2611       /* Check for read-after-write dependencies on the coprocessor
2612          control registers in cases where INSN1 does not need a general
2613          coprocessor delay.  This means that INSN1 is a floating point
2614          comparison instruction.  */
2615       /* Itbl support may require additional care here.  */
2616       else if (!cop_interlocks
2617                && (pinfo1 & INSN_WRITE_COND_CODE)
2618                && (pinfo2 & INSN_READ_COND_CODE))
2619         return 1;
2620     }
2621
2622 #undef INSN2_USES_REG
2623
2624   return 0;
2625 }
2626
2627 /* Return the number of nops that would be needed to work around the
2628    VR4130 mflo/mfhi errata if instruction INSN immediately followed
2629    the MAX_VR4130_NOPS instructions described by HIST.  */
2630
2631 static int
2632 nops_for_vr4130 (const struct mips_cl_insn *hist,
2633                  const struct mips_cl_insn *insn)
2634 {
2635   int i, j, reg;
2636
2637   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
2638      are not affected by the errata.  */
2639   if (insn != 0
2640       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2641           || strcmp (insn->insn_mo->name, "mtlo") == 0
2642           || strcmp (insn->insn_mo->name, "mthi") == 0))
2643     return 0;
2644
2645   /* Search for the first MFLO or MFHI.  */
2646   for (i = 0; i < MAX_VR4130_NOPS; i++)
2647     if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
2648       {
2649         /* Extract the destination register.  */
2650         if (mips_opts.mips16)
2651           reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, hist[i])];
2652         else
2653           reg = EXTRACT_OPERAND (RD, hist[i]);
2654
2655         /* No nops are needed if INSN reads that register.  */
2656         if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2657           return 0;
2658
2659         /* ...or if any of the intervening instructions do.  */
2660         for (j = 0; j < i; j++)
2661           if (insn_uses_reg (&hist[j], reg, MIPS_GR_REG))
2662             return 0;
2663
2664         return MAX_VR4130_NOPS - i;
2665       }
2666   return 0;
2667 }
2668
2669 /* Return the number of nops that would be needed if instruction INSN
2670    immediately followed the MAX_NOPS instructions given by HIST,
2671    where HIST[0] is the most recent instruction.  If INSN is null,
2672    return the worse-case number of nops for any instruction.  */
2673
2674 static int
2675 nops_for_insn (const struct mips_cl_insn *hist,
2676                const struct mips_cl_insn *insn)
2677 {
2678   int i, nops, tmp_nops;
2679
2680   nops = 0;
2681   for (i = 0; i < MAX_DELAY_NOPS; i++)
2682     {
2683       tmp_nops = insns_between (hist + i, insn) - i;
2684       if (tmp_nops > nops)
2685         nops = tmp_nops;
2686     }
2687
2688   if (mips_fix_vr4130)
2689     {
2690       tmp_nops = nops_for_vr4130 (hist, insn);
2691       if (tmp_nops > nops)
2692         nops = tmp_nops;
2693     }
2694
2695   return nops;
2696 }
2697
2698 /* The variable arguments provide NUM_INSNS extra instructions that
2699    might be added to HIST.  Return the largest number of nops that
2700    would be needed after the extended sequence.  */
2701
2702 static int
2703 nops_for_sequence (int num_insns, const struct mips_cl_insn *hist, ...)
2704 {
2705   va_list args;
2706   struct mips_cl_insn buffer[MAX_NOPS];
2707   struct mips_cl_insn *cursor;
2708   int nops;
2709
2710   va_start (args, hist);
2711   cursor = buffer + num_insns;
2712   memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
2713   while (cursor > buffer)
2714     *--cursor = *va_arg (args, const struct mips_cl_insn *);
2715
2716   nops = nops_for_insn (buffer, NULL);
2717   va_end (args);
2718   return nops;
2719 }
2720
2721 /* Like nops_for_insn, but if INSN is a branch, take into account the
2722    worst-case delay for the branch target.  */
2723
2724 static int
2725 nops_for_insn_or_target (const struct mips_cl_insn *hist,
2726                          const struct mips_cl_insn *insn)
2727 {
2728   int nops, tmp_nops;
2729
2730   nops = nops_for_insn (hist, insn);
2731   if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2732                               | INSN_COND_BRANCH_DELAY
2733                               | INSN_COND_BRANCH_LIKELY))
2734     {
2735       tmp_nops = nops_for_sequence (2, hist, insn, NOP_INSN);
2736       if (tmp_nops > nops)
2737         nops = tmp_nops;
2738     }
2739   else if (mips_opts.mips16
2740            && (insn->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
2741                                        | MIPS16_INSN_COND_BRANCH)))
2742     {
2743       tmp_nops = nops_for_sequence (1, hist, insn);
2744       if (tmp_nops > nops)
2745         nops = tmp_nops;
2746     }
2747   return nops;
2748 }
2749
2750 /* Fix NOP issue: Replace nops by "or at,at,zero".  */
2751
2752 static void
2753 fix_loongson2f_nop (struct mips_cl_insn * ip)
2754 {
2755   if (strcmp (ip->insn_mo->name, "nop") == 0)
2756     ip->insn_opcode = LOONGSON2F_NOP_INSN;
2757 }
2758
2759 /* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
2760                    jr target pc &= 'hffff_ffff_cfff_ffff.  */
2761
2762 static void
2763 fix_loongson2f_jump (struct mips_cl_insn * ip)
2764 {
2765   if (strcmp (ip->insn_mo->name, "j") == 0
2766       || strcmp (ip->insn_mo->name, "jr") == 0
2767       || strcmp (ip->insn_mo->name, "jalr") == 0)
2768     {
2769       int sreg;
2770       expressionS ep;
2771
2772       if (! mips_opts.at)
2773         return;
2774
2775       sreg = EXTRACT_OPERAND (RS, *ip);
2776       if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
2777         return;
2778
2779       ep.X_op = O_constant;
2780       ep.X_add_number = 0xcfff0000;
2781       macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
2782       ep.X_add_number = 0xffff;
2783       macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
2784       macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
2785     }
2786 }
2787
2788 static void
2789 fix_loongson2f (struct mips_cl_insn * ip)
2790 {
2791   if (mips_fix_loongson2f_nop)
2792     fix_loongson2f_nop (ip);
2793
2794   if (mips_fix_loongson2f_jump)
2795     fix_loongson2f_jump (ip);
2796 }
2797
2798 /* Output an instruction.  IP is the instruction information.
2799    ADDRESS_EXPR is an operand of the instruction to be used with
2800    RELOC_TYPE.  */
2801
2802 static void
2803 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2804              bfd_reloc_code_real_type *reloc_type)
2805 {
2806   unsigned long prev_pinfo, pinfo;
2807   relax_stateT prev_insn_frag_type = 0;
2808   bfd_boolean relaxed_branch = FALSE;
2809   segment_info_type *si = seg_info (now_seg);
2810
2811   if (mips_fix_loongson2f)
2812     fix_loongson2f (ip);
2813
2814   /* Mark instruction labels in mips16 mode.  */
2815   mips16_mark_labels ();
2816
2817   prev_pinfo = history[0].insn_mo->pinfo;
2818   pinfo = ip->insn_mo->pinfo;
2819
2820   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2821     {
2822       /* There are a lot of optimizations we could do that we don't.
2823          In particular, we do not, in general, reorder instructions.
2824          If you use gcc with optimization, it will reorder
2825          instructions and generally do much more optimization then we
2826          do here; repeating all that work in the assembler would only
2827          benefit hand written assembly code, and does not seem worth
2828          it.  */
2829       int nops = (mips_optimize == 0
2830                   ? nops_for_insn (history, NULL)
2831                   : nops_for_insn_or_target (history, ip));
2832       if (nops > 0)
2833         {
2834           fragS *old_frag;
2835           unsigned long old_frag_offset;
2836           int i;
2837
2838           old_frag = frag_now;
2839           old_frag_offset = frag_now_fix ();
2840
2841           for (i = 0; i < nops; i++)
2842             emit_nop ();
2843
2844           if (listing)
2845             {
2846               listing_prev_line ();
2847               /* We may be at the start of a variant frag.  In case we
2848                  are, make sure there is enough space for the frag
2849                  after the frags created by listing_prev_line.  The
2850                  argument to frag_grow here must be at least as large
2851                  as the argument to all other calls to frag_grow in
2852                  this file.  We don't have to worry about being in the
2853                  middle of a variant frag, because the variants insert
2854                  all needed nop instructions themselves.  */
2855               frag_grow (40);
2856             }
2857
2858           mips_move_labels ();
2859
2860 #ifndef NO_ECOFF_DEBUGGING
2861           if (ECOFF_DEBUGGING)
2862             ecoff_fix_loc (old_frag, old_frag_offset);
2863 #endif
2864         }
2865     }
2866   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2867     {
2868       /* Work out how many nops in prev_nop_frag are needed by IP.  */
2869       int nops = nops_for_insn_or_target (history, ip);
2870       gas_assert (nops <= prev_nop_frag_holds);
2871
2872       /* Enforce NOPS as a minimum.  */
2873       if (nops > prev_nop_frag_required)
2874         prev_nop_frag_required = nops;
2875
2876       if (prev_nop_frag_holds == prev_nop_frag_required)
2877         {
2878           /* Settle for the current number of nops.  Update the history
2879              accordingly (for the benefit of any future .set reorder code).  */
2880           prev_nop_frag = NULL;
2881           insert_into_history (prev_nop_frag_since,
2882                                prev_nop_frag_holds, NOP_INSN);
2883         }
2884       else
2885         {
2886           /* Allow this instruction to replace one of the nops that was
2887              tentatively added to prev_nop_frag.  */
2888           prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2889           prev_nop_frag_holds--;
2890           prev_nop_frag_since++;
2891         }
2892     }
2893
2894 #ifdef OBJ_ELF
2895   /* The value passed to dwarf2_emit_insn is the distance between
2896      the beginning of the current instruction and the address that
2897      should be recorded in the debug tables.  For MIPS16 debug info
2898      we want to use ISA-encoded addresses, so we pass -1 for an
2899      address higher by one than the current.  */
2900   dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2901 #endif
2902
2903   /* Record the frag type before frag_var.  */
2904   if (history[0].frag)
2905     prev_insn_frag_type = history[0].frag->fr_type;
2906
2907   if (address_expr
2908       && *reloc_type == BFD_RELOC_16_PCREL_S2
2909       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2910           || pinfo & INSN_COND_BRANCH_LIKELY)
2911       && mips_relax_branch
2912       /* Don't try branch relaxation within .set nomacro, or within
2913          .set noat if we use $at for PIC computations.  If it turns
2914          out that the branch was out-of-range, we'll get an error.  */
2915       && !mips_opts.warn_about_macros
2916       && (mips_opts.at || mips_pic == NO_PIC)
2917       && !mips_opts.mips16)
2918     {
2919       relaxed_branch = TRUE;
2920       add_relaxed_insn (ip, (relaxed_branch_length
2921                              (NULL, NULL,
2922                               (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2923                               : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2924                               : 0)), 4,
2925                         RELAX_BRANCH_ENCODE
2926                         (pinfo & INSN_UNCOND_BRANCH_DELAY,
2927                          pinfo & INSN_COND_BRANCH_LIKELY,
2928                          pinfo & INSN_WRITE_GPR_31,
2929                          0),
2930                         address_expr->X_add_symbol,
2931                         address_expr->X_add_number);
2932       *reloc_type = BFD_RELOC_UNUSED;
2933     }
2934   else if (*reloc_type > BFD_RELOC_UNUSED)
2935     {
2936       /* We need to set up a variant frag.  */
2937       gas_assert (mips_opts.mips16 && address_expr != NULL);
2938       add_relaxed_insn (ip, 4, 0,
2939                         RELAX_MIPS16_ENCODE
2940                         (*reloc_type - BFD_RELOC_UNUSED,
2941                          mips16_small, mips16_ext,
2942                          prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2943                          history[0].mips16_absolute_jump_p),
2944                         make_expr_symbol (address_expr), 0);
2945     }
2946   else if (mips_opts.mips16
2947            && ! ip->use_extend
2948            && *reloc_type != BFD_RELOC_MIPS16_JMP)
2949     {
2950       if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2951         /* Make sure there is enough room to swap this instruction with
2952            a following jump instruction.  */
2953         frag_grow (6);
2954       add_fixed_insn (ip);
2955     }
2956   else
2957     {
2958       if (mips_opts.mips16
2959           && mips_opts.noreorder
2960           && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2961         as_warn (_("extended instruction in delay slot"));
2962
2963       if (mips_relax.sequence)
2964         {
2965           /* If we've reached the end of this frag, turn it into a variant
2966              frag and record the information for the instructions we've
2967              written so far.  */
2968           if (frag_room () < 4)
2969             relax_close_frag ();
2970           mips_relax.sizes[mips_relax.sequence - 1] += 4;
2971         }
2972
2973       if (mips_relax.sequence != 2)
2974         mips_macro_warning.sizes[0] += 4;
2975       if (mips_relax.sequence != 1)
2976         mips_macro_warning.sizes[1] += 4;
2977
2978       if (mips_opts.mips16)
2979         {
2980           ip->fixed_p = 1;
2981           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2982         }
2983       add_fixed_insn (ip);
2984     }
2985
2986   if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2987     {
2988       if (address_expr->X_op == O_constant)
2989         {
2990           unsigned int tmp;
2991
2992           switch (*reloc_type)
2993             {
2994             case BFD_RELOC_32:
2995               ip->insn_opcode |= address_expr->X_add_number;
2996               break;
2997
2998             case BFD_RELOC_MIPS_HIGHEST:
2999               tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
3000               ip->insn_opcode |= tmp & 0xffff;
3001               break;
3002
3003             case BFD_RELOC_MIPS_HIGHER:
3004               tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
3005               ip->insn_opcode |= tmp & 0xffff;
3006               break;
3007
3008             case BFD_RELOC_HI16_S:
3009               tmp = (address_expr->X_add_number + 0x8000) >> 16;
3010               ip->insn_opcode |= tmp & 0xffff;
3011               break;
3012
3013             case BFD_RELOC_HI16:
3014               ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
3015               break;
3016
3017             case BFD_RELOC_UNUSED:
3018             case BFD_RELOC_LO16:
3019             case BFD_RELOC_MIPS_GOT_DISP:
3020               ip->insn_opcode |= address_expr->X_add_number & 0xffff;
3021               break;
3022
3023             case BFD_RELOC_MIPS_JMP:
3024               if ((address_expr->X_add_number & 3) != 0)
3025                 as_bad (_("jump to misaligned address (0x%lx)"),
3026                         (unsigned long) address_expr->X_add_number);
3027               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
3028               break;
3029
3030             case BFD_RELOC_MIPS16_JMP:
3031               if ((address_expr->X_add_number & 3) != 0)
3032                 as_bad (_("jump to misaligned address (0x%lx)"),
3033                         (unsigned long) address_expr->X_add_number);
3034               ip->insn_opcode |=
3035                 (((address_expr->X_add_number & 0x7c0000) << 3)
3036                  | ((address_expr->X_add_number & 0xf800000) >> 7)
3037                  | ((address_expr->X_add_number & 0x3fffc) >> 2));
3038               break;
3039
3040             case BFD_RELOC_16_PCREL_S2:
3041               if ((address_expr->X_add_number & 3) != 0)
3042                 as_bad (_("branch to misaligned address (0x%lx)"),
3043                         (unsigned long) address_expr->X_add_number);
3044               if (mips_relax_branch)
3045                 goto need_reloc;
3046               if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
3047                 as_bad (_("branch address range overflow (0x%lx)"),
3048                         (unsigned long) address_expr->X_add_number);
3049               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
3050               break;
3051
3052             default:
3053               internalError ();
3054             }
3055         }
3056       else if (*reloc_type < BFD_RELOC_UNUSED)
3057         need_reloc:
3058         {
3059           reloc_howto_type *howto;
3060           int i;
3061
3062           /* In a compound relocation, it is the final (outermost)
3063              operator that determines the relocated field.  */
3064           for (i = 1; i < 3; i++)
3065             if (reloc_type[i] == BFD_RELOC_UNUSED)
3066               break;
3067
3068           howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
3069           if (howto == NULL)
3070             {
3071               /* To reproduce this failure try assembling gas/testsuites/
3072                  gas/mips/mips16-intermix.s with a mips-ecoff targeted
3073                  assembler.  */
3074               as_bad (_("Unsupported MIPS relocation number %d"), reloc_type[i - 1]);
3075               howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
3076             }
3077           
3078           ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
3079                                      bfd_get_reloc_size (howto),
3080                                      address_expr,
3081                                      reloc_type[0] == BFD_RELOC_16_PCREL_S2,
3082                                      reloc_type[0]);
3083
3084           /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
3085           if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
3086               && ip->fixp[0]->fx_addsy)
3087             *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
3088
3089           /* These relocations can have an addend that won't fit in
3090              4 octets for 64bit assembly.  */
3091           if (HAVE_64BIT_GPRS
3092               && ! howto->partial_inplace
3093               && (reloc_type[0] == BFD_RELOC_16
3094                   || reloc_type[0] == BFD_RELOC_32
3095                   || reloc_type[0] == BFD_RELOC_MIPS_JMP
3096                   || reloc_type[0] == BFD_RELOC_GPREL16
3097                   || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
3098                   || reloc_type[0] == BFD_RELOC_GPREL32
3099                   || reloc_type[0] == BFD_RELOC_64
3100                   || reloc_type[0] == BFD_RELOC_CTOR
3101                   || reloc_type[0] == BFD_RELOC_MIPS_SUB
3102                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
3103                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
3104                   || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
3105                   || reloc_type[0] == BFD_RELOC_MIPS_REL16
3106                   || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
3107                   || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
3108                   || hi16_reloc_p (reloc_type[0])
3109                   || lo16_reloc_p (reloc_type[0])))
3110             ip->fixp[0]->fx_no_overflow = 1;
3111
3112           if (mips_relax.sequence)
3113             {
3114               if (mips_relax.first_fixup == 0)
3115                 mips_relax.first_fixup = ip->fixp[0];
3116             }
3117           else if (reloc_needs_lo_p (*reloc_type))
3118             {
3119               struct mips_hi_fixup *hi_fixup;
3120
3121               /* Reuse the last entry if it already has a matching %lo.  */
3122               hi_fixup = mips_hi_fixup_list;
3123               if (hi_fixup == 0
3124                   || !fixup_has_matching_lo_p (hi_fixup->fixp))
3125                 {
3126                   hi_fixup = ((struct mips_hi_fixup *)
3127                               xmalloc (sizeof (struct mips_hi_fixup)));
3128                   hi_fixup->next = mips_hi_fixup_list;
3129                   mips_hi_fixup_list = hi_fixup;
3130                 }
3131               hi_fixup->fixp = ip->fixp[0];
3132               hi_fixup->seg = now_seg;
3133             }
3134
3135           /* Add fixups for the second and third relocations, if given.
3136              Note that the ABI allows the second relocation to be
3137              against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
3138              moment we only use RSS_UNDEF, but we could add support
3139              for the others if it ever becomes necessary.  */
3140           for (i = 1; i < 3; i++)
3141             if (reloc_type[i] != BFD_RELOC_UNUSED)
3142               {
3143                 ip->fixp[i] = fix_new (ip->frag, ip->where,
3144                                        ip->fixp[0]->fx_size, NULL, 0,
3145                                        FALSE, reloc_type[i]);
3146
3147                 /* Use fx_tcbit to mark compound relocs.  */
3148                 ip->fixp[0]->fx_tcbit = 1;
3149                 ip->fixp[i]->fx_tcbit = 1;
3150               }
3151         }
3152     }
3153   install_insn (ip);
3154
3155   /* Update the register mask information.  */
3156   if (! mips_opts.mips16)
3157     {
3158       if (pinfo & INSN_WRITE_GPR_D)
3159         mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
3160       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
3161         mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
3162       if (pinfo & INSN_READ_GPR_S)
3163         mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
3164       if (pinfo & INSN_WRITE_GPR_31)
3165         mips_gprmask |= 1 << RA;
3166       if (pinfo & INSN_WRITE_FPR_D)
3167         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
3168       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
3169         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
3170       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
3171         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
3172       if ((pinfo & INSN_READ_FPR_R) != 0)
3173         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
3174       if (pinfo & INSN_COP)
3175         {
3176           /* We don't keep enough information to sort these cases out.
3177              The itbl support does keep this information however, although
3178              we currently don't support itbl fprmats as part of the cop
3179              instruction.  May want to add this support in the future.  */
3180         }
3181       /* Never set the bit for $0, which is always zero.  */
3182       mips_gprmask &= ~1 << 0;
3183     }
3184   else
3185     {
3186       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
3187         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
3188       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
3189         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
3190       if (pinfo & MIPS16_INSN_WRITE_Z)
3191         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
3192       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
3193         mips_gprmask |= 1 << TREG;
3194       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
3195         mips_gprmask |= 1 << SP;
3196       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
3197         mips_gprmask |= 1 << RA;
3198       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3199         mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3200       if (pinfo & MIPS16_INSN_READ_Z)
3201         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
3202       if (pinfo & MIPS16_INSN_READ_GPR_X)
3203         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3204     }
3205
3206   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
3207     {
3208       /* Filling the branch delay slot is more complex.  We try to
3209          switch the branch with the previous instruction, which we can
3210          do if the previous instruction does not set up a condition
3211          that the branch tests and if the branch is not itself the
3212          target of any branch.  */
3213       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
3214           || (pinfo & INSN_COND_BRANCH_DELAY))
3215         {
3216           if (mips_optimize < 2
3217               /* If we have seen .set volatile or .set nomove, don't
3218                  optimize.  */
3219               || mips_opts.nomove != 0
3220               /* We can't swap if the previous instruction's position
3221                  is fixed.  */
3222               || history[0].fixed_p
3223               /* If the previous previous insn was in a .set
3224                  noreorder, we can't swap.  Actually, the MIPS
3225                  assembler will swap in this situation.  However, gcc
3226                  configured -with-gnu-as will generate code like
3227                    .set noreorder
3228                    lw   $4,XXX
3229                    .set reorder
3230                    INSN
3231                    bne  $4,$0,foo
3232                  in which we can not swap the bne and INSN.  If gcc is
3233                  not configured -with-gnu-as, it does not output the
3234                  .set pseudo-ops.  */
3235               || history[1].noreorder_p
3236               /* If the branch is itself the target of a branch, we
3237                  can not swap.  We cheat on this; all we check for is
3238                  whether there is a label on this instruction.  If
3239                  there are any branches to anything other than a
3240                  label, users must use .set noreorder.  */
3241               || si->label_list != NULL
3242               /* If the previous instruction is in a variant frag
3243                  other than this branch's one, we cannot do the swap.
3244                  This does not apply to the mips16, which uses variant
3245                  frags for different purposes.  */
3246               || (! mips_opts.mips16
3247                   && prev_insn_frag_type == rs_machine_dependent)
3248               /* Check for conflicts between the branch and the instructions
3249                  before the candidate delay slot.  */
3250               || nops_for_insn (history + 1, ip) > 0
3251               /* Check for conflicts between the swapped sequence and the
3252                  target of the branch.  */
3253               || nops_for_sequence (2, history + 1, ip, history) > 0
3254               /* We do not swap with a trap instruction, since it
3255                  complicates trap handlers to have the trap
3256                  instruction be in a delay slot.  */
3257               || (prev_pinfo & INSN_TRAP)
3258               /* If the branch reads a register that the previous
3259                  instruction sets, we can not swap.  */
3260               || (! mips_opts.mips16
3261                   && (prev_pinfo & INSN_WRITE_GPR_T)
3262                   && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
3263                                     MIPS_GR_REG))
3264               || (! mips_opts.mips16
3265                   && (prev_pinfo & INSN_WRITE_GPR_D)
3266                   && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
3267                                     MIPS_GR_REG))
3268               || (mips_opts.mips16
3269                   && (((prev_pinfo & MIPS16_INSN_WRITE_X)
3270                        && (insn_uses_reg
3271                            (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3272                             MIPS16_REG)))
3273                       || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
3274                           && (insn_uses_reg
3275                               (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3276                                MIPS16_REG)))
3277                       || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
3278                           && (insn_uses_reg
3279                               (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3280                                MIPS16_REG)))
3281                       || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3282                           && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3283                       || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3284                           && insn_uses_reg (ip, RA, MIPS_GR_REG))
3285                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3286                           && insn_uses_reg (ip,
3287                                             MIPS16OP_EXTRACT_REG32R
3288                                               (history[0].insn_opcode),
3289                                             MIPS_GR_REG))))
3290               /* If the branch writes a register that the previous
3291                  instruction sets, we can not swap (we know that
3292                  branches write only to RD or to $31).  */
3293               || (! mips_opts.mips16
3294                   && (prev_pinfo & INSN_WRITE_GPR_T)
3295                   && (((pinfo & INSN_WRITE_GPR_D)
3296                        && (EXTRACT_OPERAND (RT, history[0])
3297                            == EXTRACT_OPERAND (RD, *ip)))
3298                       || ((pinfo & INSN_WRITE_GPR_31)
3299                           && EXTRACT_OPERAND (RT, history[0]) == RA)))
3300               || (! mips_opts.mips16
3301                   && (prev_pinfo & INSN_WRITE_GPR_D)
3302                   && (((pinfo & INSN_WRITE_GPR_D)
3303                        && (EXTRACT_OPERAND (RD, history[0])
3304                            == EXTRACT_OPERAND (RD, *ip)))
3305                       || ((pinfo & INSN_WRITE_GPR_31)
3306                           && EXTRACT_OPERAND (RD, history[0]) == RA)))
3307               || (mips_opts.mips16
3308                   && (pinfo & MIPS16_INSN_WRITE_31)
3309                   && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3310                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3311                           && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3312                               == RA))))
3313               /* If the branch writes a register that the previous
3314                  instruction reads, we can not swap (we know that
3315                  branches only write to RD or to $31).  */
3316               || (! mips_opts.mips16
3317                   && (pinfo & INSN_WRITE_GPR_D)
3318                   && insn_uses_reg (&history[0],
3319                                     EXTRACT_OPERAND (RD, *ip),
3320                                     MIPS_GR_REG))
3321               || (! mips_opts.mips16
3322                   && (pinfo & INSN_WRITE_GPR_31)
3323                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3324               || (mips_opts.mips16
3325                   && (pinfo & MIPS16_INSN_WRITE_31)
3326                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3327               /* If one instruction sets a condition code and the
3328                  other one uses a condition code, we can not swap.  */
3329               || ((pinfo & INSN_READ_COND_CODE)
3330                   && (prev_pinfo & INSN_WRITE_COND_CODE))
3331               || ((pinfo & INSN_WRITE_COND_CODE)
3332                   && (prev_pinfo & INSN_READ_COND_CODE))
3333               /* If the previous instruction uses the PC, we can not
3334                  swap.  */
3335               || (mips_opts.mips16
3336                   && (prev_pinfo & MIPS16_INSN_READ_PC))
3337               /* If the previous instruction had a fixup in mips16
3338                  mode, we can not swap.  This normally means that the
3339                  previous instruction was a 4 byte branch anyhow.  */
3340               || (mips_opts.mips16 && history[0].fixp[0])
3341               /* If the previous instruction is a sync, sync.l, or
3342                  sync.p, we can not swap.  */
3343               || (prev_pinfo & INSN_SYNC)
3344               /* If the previous instruction is an ERET or
3345                  DERET, avoid the swap.  */
3346               || (history[0].insn_opcode == INSN_ERET)
3347               || (history[0].insn_opcode == INSN_DERET))
3348             {
3349               if (mips_opts.mips16
3350                   && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3351                   && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3352                   && ISA_SUPPORTS_MIPS16E)
3353                 {
3354                   /* Convert MIPS16 jr/jalr into a "compact" jump.  */
3355                   ip->insn_opcode |= 0x0080;
3356                   install_insn (ip);
3357                   insert_into_history (0, 1, ip);
3358                 } 
3359               else
3360                 {
3361                   /* We could do even better for unconditional branches to
3362                      portions of this object file; we could pick up the
3363                      instruction at the destination, put it in the delay
3364                      slot, and bump the destination address.  */
3365                   insert_into_history (0, 1, ip);
3366                   emit_nop ();
3367                 }
3368                 
3369               if (mips_relax.sequence)
3370                 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3371             }
3372           else
3373             {
3374               /* It looks like we can actually do the swap.  */
3375               struct mips_cl_insn delay = history[0];
3376               if (mips_opts.mips16)
3377                 {
3378                   know (delay.frag == ip->frag);
3379                   move_insn (ip, delay.frag, delay.where);
3380                   move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3381                 }
3382               else if (relaxed_branch)
3383                 {
3384                   /* Add the delay slot instruction to the end of the
3385                      current frag and shrink the fixed part of the
3386                      original frag.  If the branch occupies the tail of
3387                      the latter, move it backwards to cover the gap.  */
3388                   delay.frag->fr_fix -= 4;
3389                   if (delay.frag == ip->frag)
3390                     move_insn (ip, ip->frag, ip->where - 4);
3391                   add_fixed_insn (&delay);
3392                 }
3393               else
3394                 {
3395                   move_insn (&delay, ip->frag, ip->where);
3396                   move_insn (ip, history[0].frag, history[0].where);
3397                 }
3398               history[0] = *ip;
3399               delay.fixed_p = 1;
3400               insert_into_history (0, 1, &delay);
3401             }
3402
3403           /* If that was an unconditional branch, forget the previous
3404              insn information.  */
3405           if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3406             {
3407               mips_no_prev_insn ();
3408             }
3409         }
3410       else if (pinfo & INSN_COND_BRANCH_LIKELY)
3411         {
3412           /* We don't yet optimize a branch likely.  What we should do
3413              is look at the target, copy the instruction found there
3414              into the delay slot, and increment the branch to jump to
3415              the next instruction.  */
3416           insert_into_history (0, 1, ip);
3417           emit_nop ();
3418         }
3419       else
3420         insert_into_history (0, 1, ip);
3421     }
3422   else
3423     insert_into_history (0, 1, ip);
3424
3425   /* We just output an insn, so the next one doesn't have a label.  */
3426   mips_clear_insn_labels ();
3427 }
3428
3429 /* Forget that there was any previous instruction or label.  */
3430
3431 static void
3432 mips_no_prev_insn (void)
3433 {
3434   prev_nop_frag = NULL;
3435   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3436   mips_clear_insn_labels ();
3437 }
3438
3439 /* This function must be called before we emit something other than
3440    instructions.  It is like mips_no_prev_insn except that it inserts
3441    any NOPS that might be needed by previous instructions.  */
3442
3443 void
3444 mips_emit_delays (void)
3445 {
3446   if (! mips_opts.noreorder)
3447     {
3448       int nops = nops_for_insn (history, NULL);
3449       if (nops > 0)
3450         {
3451           while (nops-- > 0)
3452             add_fixed_insn (NOP_INSN);
3453           mips_move_labels ();
3454         }
3455     }
3456   mips_no_prev_insn ();
3457 }
3458
3459 /* Start a (possibly nested) noreorder block.  */
3460
3461 static void
3462 start_noreorder (void)
3463 {
3464   if (mips_opts.noreorder == 0)
3465     {
3466       unsigned int i;
3467       int nops;
3468
3469       /* None of the instructions before the .set noreorder can be moved.  */
3470       for (i = 0; i < ARRAY_SIZE (history); i++)
3471         history[i].fixed_p = 1;
3472
3473       /* Insert any nops that might be needed between the .set noreorder
3474          block and the previous instructions.  We will later remove any
3475          nops that turn out not to be needed.  */
3476       nops = nops_for_insn (history, NULL);
3477       if (nops > 0)
3478         {
3479           if (mips_optimize != 0)
3480             {
3481               /* Record the frag which holds the nop instructions, so
3482                  that we can remove them if we don't need them.  */
3483               frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3484               prev_nop_frag = frag_now;
3485               prev_nop_frag_holds = nops;
3486               prev_nop_frag_required = 0;
3487               prev_nop_frag_since = 0;
3488             }
3489
3490           for (; nops > 0; --nops)
3491             add_fixed_insn (NOP_INSN);
3492
3493           /* Move on to a new frag, so that it is safe to simply
3494              decrease the size of prev_nop_frag.  */
3495           frag_wane (frag_now);
3496           frag_new (0);
3497           mips_move_labels ();
3498         }
3499       mips16_mark_labels ();
3500       mips_clear_insn_labels ();
3501     }
3502   mips_opts.noreorder++;
3503   mips_any_noreorder = 1;
3504 }
3505
3506 /* End a nested noreorder block.  */
3507
3508 static void
3509 end_noreorder (void)
3510 {
3511
3512   mips_opts.noreorder--;
3513   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3514     {
3515       /* Commit to inserting prev_nop_frag_required nops and go back to
3516          handling nop insertion the .set reorder way.  */
3517       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3518                                 * (mips_opts.mips16 ? 2 : 4));
3519       insert_into_history (prev_nop_frag_since,
3520                            prev_nop_frag_required, NOP_INSN);
3521       prev_nop_frag = NULL;
3522     }
3523 }
3524
3525 /* Set up global variables for the start of a new macro.  */
3526
3527 static void
3528 macro_start (void)
3529 {
3530   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3531   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3532                                      && (history[0].insn_mo->pinfo
3533                                          & (INSN_UNCOND_BRANCH_DELAY
3534                                             | INSN_COND_BRANCH_DELAY
3535                                             | INSN_COND_BRANCH_LIKELY)) != 0);
3536 }
3537
3538 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3539    for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
3540    RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
3541
3542 static const char *
3543 macro_warning (relax_substateT subtype)
3544 {
3545   if (subtype & RELAX_DELAY_SLOT)
3546     return _("Macro instruction expanded into multiple instructions"
3547              " in a branch delay slot");
3548   else if (subtype & RELAX_NOMACRO)
3549     return _("Macro instruction expanded into multiple instructions");
3550   else
3551     return 0;
3552 }
3553
3554 /* Finish up a macro.  Emit warnings as appropriate.  */
3555
3556 static void
3557 macro_end (void)
3558 {
3559   if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3560     {
3561       relax_substateT subtype;
3562
3563       /* Set up the relaxation warning flags.  */
3564       subtype = 0;
3565       if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3566         subtype |= RELAX_SECOND_LONGER;
3567       if (mips_opts.warn_about_macros)
3568         subtype |= RELAX_NOMACRO;
3569       if (mips_macro_warning.delay_slot_p)
3570         subtype |= RELAX_DELAY_SLOT;
3571
3572       if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3573         {
3574           /* Either the macro has a single implementation or both
3575              implementations are longer than 4 bytes.  Emit the
3576              warning now.  */
3577           const char *msg = macro_warning (subtype);
3578           if (msg != 0)
3579             as_warn ("%s", msg);
3580         }
3581       else
3582         {
3583           /* One implementation might need a warning but the other
3584              definitely doesn't.  */
3585           mips_macro_warning.first_frag->fr_subtype |= subtype;
3586         }
3587     }
3588 }
3589
3590 /* Read a macro's relocation codes from *ARGS and store them in *R.
3591    The first argument in *ARGS will be either the code for a single
3592    relocation or -1 followed by the three codes that make up a
3593    composite relocation.  */
3594
3595 static void
3596 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3597 {
3598   int i, next;
3599
3600   next = va_arg (*args, int);
3601   if (next >= 0)
3602     r[0] = (bfd_reloc_code_real_type) next;
3603   else
3604     for (i = 0; i < 3; i++)
3605       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3606 }
3607
3608 /* Build an instruction created by a macro expansion.  This is passed
3609    a pointer to the count of instructions created so far, an
3610    expression, the name of the instruction to build, an operand format
3611    string, and corresponding arguments.  */
3612
3613 static void
3614 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3615 {
3616   const struct mips_opcode *mo;
3617   struct mips_cl_insn insn;
3618   bfd_reloc_code_real_type r[3];
3619   va_list args;
3620
3621   va_start (args, fmt);
3622
3623   if (mips_opts.mips16)
3624     {
3625       mips16_macro_build (ep, name, fmt, &args);
3626       va_end (args);
3627       return;
3628     }
3629
3630   r[0] = BFD_RELOC_UNUSED;
3631   r[1] = BFD_RELOC_UNUSED;
3632   r[2] = BFD_RELOC_UNUSED;
3633   mo = (struct mips_opcode *) hash_find (op_hash, name);
3634   gas_assert (mo);
3635   gas_assert (strcmp (name, mo->name) == 0);
3636
3637   while (1)
3638     {
3639       /* Search until we get a match for NAME.  It is assumed here that
3640          macros will never generate MDMX, MIPS-3D, or MT instructions.  */
3641       if (strcmp (fmt, mo->args) == 0
3642           && mo->pinfo != INSN_MACRO
3643           && is_opcode_valid (mo))
3644         break;
3645
3646       ++mo;
3647       gas_assert (mo->name);
3648       gas_assert (strcmp (name, mo->name) == 0);
3649     }
3650
3651   create_insn (&insn, mo);
3652   for (;;)
3653     {
3654       switch (*fmt++)
3655         {
3656         case '\0':
3657           break;
3658
3659         case ',':
3660         case '(':
3661         case ')':
3662           continue;
3663
3664         case '+':
3665           switch (*fmt++)
3666             {
3667             case 'A':
3668             case 'E':
3669               INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3670               continue;
3671
3672             case 'B':
3673             case 'F':
3674               /* Note that in the macro case, these arguments are already
3675                  in MSB form.  (When handling the instruction in the
3676                  non-macro case, these arguments are sizes from which
3677                  MSB values must be calculated.)  */
3678               INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3679               continue;
3680
3681             case 'C':
3682             case 'G':
3683             case 'H':
3684               /* Note that in the macro case, these arguments are already
3685                  in MSBD form.  (When handling the instruction in the
3686                  non-macro case, these arguments are sizes from which
3687                  MSBD values must be calculated.)  */
3688               INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3689               continue;
3690
3691             case 'Q':
3692               INSERT_OPERAND (SEQI, insn, va_arg (args, int));
3693               continue;
3694
3695             default:
3696               internalError ();
3697             }
3698           continue;
3699
3700         case '2':
3701           INSERT_OPERAND (BP, insn, va_arg (args, int));
3702           continue;
3703
3704         case 't':
3705         case 'w':
3706         case 'E':
3707           INSERT_OPERAND (RT, insn, va_arg (args, int));
3708           continue;
3709
3710         case 'c':
3711           INSERT_OPERAND (CODE, insn, va_arg (args, int));
3712           continue;
3713
3714         case 'T':
3715         case 'W':
3716           INSERT_OPERAND (FT, insn, va_arg (args, int));
3717           continue;
3718
3719         case 'd':
3720         case 'G':
3721         case 'K':
3722           INSERT_OPERAND (RD, insn, va_arg (args, int));
3723           continue;
3724
3725         case 'U':
3726           {
3727             int tmp = va_arg (args, int);
3728
3729             INSERT_OPERAND (RT, insn, tmp);
3730             INSERT_OPERAND (RD, insn, tmp);
3731             continue;
3732           }
3733
3734         case 'V':
3735         case 'S':
3736           INSERT_OPERAND (FS, insn, va_arg (args, int));
3737           continue;
3738
3739         case 'z':
3740           continue;
3741
3742         case '<':
3743           INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3744           continue;
3745
3746         case 'D':
3747           INSERT_OPERAND (FD, insn, va_arg (args, int));
3748           continue;
3749
3750         case 'B':
3751           INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3752           continue;
3753
3754         case 'J':
3755           INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3756           continue;
3757
3758         case 'q':
3759           INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3760           continue;
3761
3762         case 'b':
3763         case 's':
3764         case 'r':
3765         case 'v':
3766           INSERT_OPERAND (RS, insn, va_arg (args, int));
3767           continue;
3768
3769         case 'i':
3770         case 'j':
3771         case 'o':
3772           macro_read_relocs (&args, r);
3773           gas_assert (*r == BFD_RELOC_GPREL16
3774                   || *r == BFD_RELOC_MIPS_LITERAL
3775                   || *r == BFD_RELOC_MIPS_HIGHER
3776                   || *r == BFD_RELOC_HI16_S
3777                   || *r == BFD_RELOC_LO16
3778                   || *r == BFD_RELOC_MIPS_GOT16
3779                   || *r == BFD_RELOC_MIPS_CALL16
3780                   || *r == BFD_RELOC_MIPS_GOT_DISP
3781                   || *r == BFD_RELOC_MIPS_GOT_PAGE
3782                   || *r == BFD_RELOC_MIPS_GOT_OFST
3783                   || *r == BFD_RELOC_MIPS_GOT_LO16
3784                   || *r == BFD_RELOC_MIPS_CALL_LO16);
3785           continue;
3786
3787         case 'u':
3788           macro_read_relocs (&args, r);
3789           gas_assert (ep != NULL
3790                   && (ep->X_op == O_constant
3791                       || (ep->X_op == O_symbol
3792                           && (*r == BFD_RELOC_MIPS_HIGHEST
3793                               || *r == BFD_RELOC_HI16_S
3794                               || *r == BFD_RELOC_HI16
3795                               || *r == BFD_RELOC_GPREL16
3796                               || *r == BFD_RELOC_MIPS_GOT_HI16
3797                               || *r == BFD_RELOC_MIPS_CALL_HI16))));
3798           continue;
3799
3800         case 'p':
3801           gas_assert (ep != NULL);
3802
3803           /*
3804            * This allows macro() to pass an immediate expression for
3805            * creating short branches without creating a symbol.
3806            *
3807            * We don't allow branch relaxation for these branches, as
3808            * they should only appear in ".set nomacro" anyway.
3809            */
3810           if (ep->X_op == O_constant)
3811             {
3812               if ((ep->X_add_number & 3) != 0)
3813                 as_bad (_("branch to misaligned address (0x%lx)"),
3814                         (unsigned long) ep->X_add_number);
3815               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3816                 as_bad (_("branch address range overflow (0x%lx)"),
3817                         (unsigned long) ep->X_add_number);
3818               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3819               ep = NULL;
3820             }
3821           else
3822             *r = BFD_RELOC_16_PCREL_S2;
3823           continue;
3824
3825         case 'a':
3826           gas_assert (ep != NULL);
3827           *r = BFD_RELOC_MIPS_JMP;
3828           continue;
3829
3830         case 'C':
3831           INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
3832           continue;
3833
3834         case 'k':
3835           INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
3836           continue;
3837
3838         default:
3839           internalError ();
3840         }
3841       break;
3842     }
3843   va_end (args);
3844   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3845
3846   append_insn (&insn, ep, r);
3847 }
3848
3849 static void
3850 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3851                     va_list *args)
3852 {
3853   struct mips_opcode *mo;
3854   struct mips_cl_insn insn;
3855   bfd_reloc_code_real_type r[3]
3856     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3857
3858   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3859   gas_assert (mo);
3860   gas_assert (strcmp (name, mo->name) == 0);
3861
3862   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3863     {
3864       ++mo;
3865       gas_assert (mo->name);
3866       gas_assert (strcmp (name, mo->name) == 0);
3867     }
3868
3869   create_insn (&insn, mo);
3870   for (;;)
3871     {
3872       int c;
3873
3874       c = *fmt++;
3875       switch (c)
3876         {
3877         case '\0':
3878           break;
3879
3880         case ',':
3881         case '(':
3882         case ')':
3883           continue;
3884
3885         case 'y':
3886         case 'w':
3887           MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
3888           continue;
3889
3890         case 'x':
3891         case 'v':
3892           MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
3893           continue;
3894
3895         case 'z':
3896           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
3897           continue;
3898
3899         case 'Z':
3900           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
3901           continue;
3902
3903         case '0':
3904         case 'S':
3905         case 'P':
3906         case 'R':
3907           continue;
3908
3909         case 'X':
3910           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
3911           continue;
3912
3913         case 'Y':
3914           {
3915             int regno;
3916
3917             regno = va_arg (*args, int);
3918             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3919             MIPS16_INSERT_OPERAND (REG32R, insn, regno);
3920           }
3921           continue;
3922
3923         case '<':
3924         case '>':
3925         case '4':
3926         case '5':
3927         case 'H':
3928         case 'W':
3929         case 'D':
3930         case 'j':
3931         case '8':
3932         case 'V':
3933         case 'C':
3934         case 'U':
3935         case 'k':
3936         case 'K':
3937         case 'p':
3938         case 'q':
3939           {
3940             gas_assert (ep != NULL);
3941
3942             if (ep->X_op != O_constant)
3943               *r = (int) BFD_RELOC_UNUSED + c;
3944             else
3945               {
3946                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3947                               FALSE, &insn.insn_opcode, &insn.use_extend,
3948                               &insn.extend);
3949                 ep = NULL;
3950                 *r = BFD_RELOC_UNUSED;
3951               }
3952           }
3953           continue;
3954
3955         case '6':
3956           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
3957           continue;
3958         }
3959
3960       break;
3961     }
3962
3963   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3964
3965   append_insn (&insn, ep, r);
3966 }
3967
3968 /*
3969  * Sign-extend 32-bit mode constants that have bit 31 set and all
3970  * higher bits unset.
3971  */
3972 static void
3973 normalize_constant_expr (expressionS *ex)
3974 {
3975   if (ex->X_op == O_constant
3976       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3977     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3978                         - 0x80000000);
3979 }
3980
3981 /*
3982  * Sign-extend 32-bit mode address offsets that have bit 31 set and
3983  * all higher bits unset.
3984  */
3985 static void
3986 normalize_address_expr (expressionS *ex)
3987 {
3988   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3989         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3990       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3991     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3992                         - 0x80000000);
3993 }
3994
3995 /*
3996  * Generate a "jalr" instruction with a relocation hint to the called
3997  * function.  This occurs in NewABI PIC code.
3998  */
3999 static void
4000 macro_build_jalr (expressionS *ep)
4001 {
4002   char *f = NULL;
4003
4004   if (MIPS_JALR_HINT_P (ep))
4005     {
4006       frag_grow (8);
4007       f = frag_more (0);
4008     }
4009   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
4010   if (MIPS_JALR_HINT_P (ep))
4011     fix_new_exp (frag_now, f - frag_now->fr_literal,
4012                  4, ep, FALSE, BFD_RELOC_MIPS_JALR);
4013 }
4014
4015 /*
4016  * Generate a "lui" instruction.
4017  */
4018 static void
4019 macro_build_lui (expressionS *ep, int regnum)
4020 {
4021   expressionS high_expr;
4022   const struct mips_opcode *mo;
4023   struct mips_cl_insn insn;
4024   bfd_reloc_code_real_type r[3]
4025     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
4026   const char *name = "lui";
4027   const char *fmt = "t,u";
4028
4029   gas_assert (! mips_opts.mips16);
4030
4031   high_expr = *ep;
4032
4033   if (high_expr.X_op == O_constant)
4034     {
4035       /* We can compute the instruction now without a relocation entry.  */
4036       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
4037                                 >> 16) & 0xffff;
4038       *r = BFD_RELOC_UNUSED;
4039     }
4040   else
4041     {
4042       gas_assert (ep->X_op == O_symbol);
4043       /* _gp_disp is a special case, used from s_cpload.
4044          __gnu_local_gp is used if mips_no_shared.  */
4045       gas_assert (mips_pic == NO_PIC
4046               || (! HAVE_NEWABI
4047                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
4048               || (! mips_in_shared
4049                   && strcmp (S_GET_NAME (ep->X_add_symbol),
4050                              "__gnu_local_gp") == 0));
4051       *r = BFD_RELOC_HI16_S;
4052     }
4053
4054   mo = hash_find (op_hash, name);
4055   gas_assert (strcmp (name, mo->name) == 0);
4056   gas_assert (strcmp (fmt, mo->args) == 0);
4057   create_insn (&insn, mo);
4058
4059   insn.insn_opcode = insn.insn_mo->match;
4060   INSERT_OPERAND (RT, insn, regnum);
4061   if (*r == BFD_RELOC_UNUSED)
4062     {
4063       insn.insn_opcode |= high_expr.X_add_number;
4064       append_insn (&insn, NULL, r);
4065     }
4066   else
4067     append_insn (&insn, &high_expr, r);
4068 }
4069
4070 /* Generate a sequence of instructions to do a load or store from a constant
4071    offset off of a base register (breg) into/from a target register (treg),
4072    using AT if necessary.  */
4073 static void
4074 macro_build_ldst_constoffset (expressionS *ep, const char *op,
4075                               int treg, int breg, int dbl)
4076 {
4077   gas_assert (ep->X_op == O_constant);
4078
4079   /* Sign-extending 32-bit constants makes their handling easier.  */
4080   if (!dbl)
4081     normalize_constant_expr (ep);
4082
4083   /* Right now, this routine can only handle signed 32-bit constants.  */
4084   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
4085     as_warn (_("operand overflow"));
4086
4087   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
4088     {
4089       /* Signed 16-bit offset will fit in the op.  Easy!  */
4090       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
4091     }
4092   else
4093     {
4094       /* 32-bit offset, need multiple instructions and AT, like:
4095            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
4096            addu     $tempreg,$tempreg,$breg
4097            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
4098          to handle the complete offset.  */
4099       macro_build_lui (ep, AT);
4100       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
4101       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
4102
4103       if (!mips_opts.at)
4104         as_bad (_("Macro used $at after \".set noat\""));
4105     }
4106 }
4107
4108 /*                      set_at()
4109  * Generates code to set the $at register to true (one)
4110  * if reg is less than the immediate expression.
4111  */
4112 static void
4113 set_at (int reg, int unsignedp)
4114 {
4115   if (imm_expr.X_op == O_constant
4116       && imm_expr.X_add_number >= -0x8000
4117       && imm_expr.X_add_number < 0x8000)
4118     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
4119                  AT, reg, BFD_RELOC_LO16);
4120   else
4121     {
4122       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4123       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
4124     }
4125 }
4126
4127 /* Warn if an expression is not a constant.  */
4128
4129 static void
4130 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
4131 {
4132   if (ex->X_op == O_big)
4133     as_bad (_("unsupported large constant"));
4134   else if (ex->X_op != O_constant)
4135     as_bad (_("Instruction %s requires absolute expression"),
4136             ip->insn_mo->name);
4137
4138   if (HAVE_32BIT_GPRS)
4139     normalize_constant_expr (ex);
4140 }
4141
4142 /* Count the leading zeroes by performing a binary chop. This is a
4143    bulky bit of source, but performance is a LOT better for the
4144    majority of values than a simple loop to count the bits:
4145        for (lcnt = 0; (lcnt < 32); lcnt++)
4146          if ((v) & (1 << (31 - lcnt)))
4147            break;
4148   However it is not code size friendly, and the gain will drop a bit
4149   on certain cached systems.
4150 */
4151 #define COUNT_TOP_ZEROES(v)             \
4152   (((v) & ~0xffff) == 0                 \
4153    ? ((v) & ~0xff) == 0                 \
4154      ? ((v) & ~0xf) == 0                \
4155        ? ((v) & ~0x3) == 0              \
4156          ? ((v) & ~0x1) == 0            \
4157            ? !(v)                       \
4158              ? 32                       \
4159              : 31                       \
4160            : 30                         \
4161          : ((v) & ~0x7) == 0            \
4162            ? 29                         \
4163            : 28                         \
4164        : ((v) & ~0x3f) == 0             \
4165          ? ((v) & ~0x1f) == 0           \
4166            ? 27                         \
4167            : 26                         \
4168          : ((v) & ~0x7f) == 0           \
4169            ? 25                         \
4170            : 24                         \
4171      : ((v) & ~0xfff) == 0              \
4172        ? ((v) & ~0x3ff) == 0            \
4173          ? ((v) & ~0x1ff) == 0          \
4174            ? 23                         \
4175            : 22                         \
4176          : ((v) & ~0x7ff) == 0          \
4177            ? 21                         \
4178            : 20                         \
4179        : ((v) & ~0x3fff) == 0           \
4180          ? ((v) & ~0x1fff) == 0         \
4181            ? 19                         \
4182            : 18                         \
4183          : ((v) & ~0x7fff) == 0         \
4184            ? 17                         \
4185            : 16                         \
4186    : ((v) & ~0xffffff) == 0             \
4187      ? ((v) & ~0xfffff) == 0            \
4188        ? ((v) & ~0x3ffff) == 0          \
4189          ? ((v) & ~0x1ffff) == 0        \
4190            ? 15                         \
4191            : 14                         \
4192          : ((v) & ~0x7ffff) == 0        \
4193            ? 13                         \
4194            : 12                         \
4195        : ((v) & ~0x3fffff) == 0         \
4196          ? ((v) & ~0x1fffff) == 0       \
4197            ? 11                         \
4198            : 10                         \
4199          : ((v) & ~0x7fffff) == 0       \
4200            ? 9                          \
4201            : 8                          \
4202      : ((v) & ~0xfffffff) == 0          \
4203        ? ((v) & ~0x3ffffff) == 0        \
4204          ? ((v) & ~0x1ffffff) == 0      \
4205            ? 7                          \
4206            : 6                          \
4207          : ((v) & ~0x7ffffff) == 0      \
4208            ? 5                          \
4209            : 4                          \
4210        : ((v) & ~0x3fffffff) == 0       \
4211          ? ((v) & ~0x1fffffff) == 0     \
4212            ? 3                          \
4213            : 2                          \
4214          : ((v) & ~0x7fffffff) == 0     \
4215            ? 1                          \
4216            : 0)
4217
4218 /*                      load_register()
4219  *  This routine generates the least number of instructions necessary to load
4220  *  an absolute expression value into a register.
4221  */
4222 static void
4223 load_register (int reg, expressionS *ep, int dbl)
4224 {
4225   int freg;
4226   expressionS hi32, lo32;
4227
4228   if (ep->X_op != O_big)
4229     {
4230       gas_assert (ep->X_op == O_constant);
4231
4232       /* Sign-extending 32-bit constants makes their handling easier.  */
4233       if (!dbl)
4234         normalize_constant_expr (ep);
4235
4236       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
4237         {
4238           /* We can handle 16 bit signed values with an addiu to
4239              $zero.  No need to ever use daddiu here, since $zero and
4240              the result are always correct in 32 bit mode.  */
4241           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4242           return;
4243         }
4244       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
4245         {
4246           /* We can handle 16 bit unsigned values with an ori to
4247              $zero.  */
4248           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4249           return;
4250         }
4251       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
4252         {
4253           /* 32 bit values require an lui.  */
4254           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
4255           if ((ep->X_add_number & 0xffff) != 0)
4256             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4257           return;
4258         }
4259     }
4260
4261   /* The value is larger than 32 bits.  */
4262
4263   if (!dbl || HAVE_32BIT_GPRS)
4264     {
4265       char value[32];
4266
4267       sprintf_vma (value, ep->X_add_number);
4268       as_bad (_("Number (0x%s) larger than 32 bits"), value);
4269       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4270       return;
4271     }
4272
4273   if (ep->X_op != O_big)
4274     {
4275       hi32 = *ep;
4276       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4277       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4278       hi32.X_add_number &= 0xffffffff;
4279       lo32 = *ep;
4280       lo32.X_add_number &= 0xffffffff;
4281     }
4282   else
4283     {
4284       gas_assert (ep->X_add_number > 2);
4285       if (ep->X_add_number == 3)
4286         generic_bignum[3] = 0;
4287       else if (ep->X_add_number > 4)
4288         as_bad (_("Number larger than 64 bits"));
4289       lo32.X_op = O_constant;
4290       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4291       hi32.X_op = O_constant;
4292       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4293     }
4294
4295   if (hi32.X_add_number == 0)
4296     freg = 0;
4297   else
4298     {
4299       int shift, bit;
4300       unsigned long hi, lo;
4301
4302       if (hi32.X_add_number == (offsetT) 0xffffffff)
4303         {
4304           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4305             {
4306               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4307               return;
4308             }
4309           if (lo32.X_add_number & 0x80000000)
4310             {
4311               macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4312               if (lo32.X_add_number & 0xffff)
4313                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4314               return;
4315             }
4316         }
4317
4318       /* Check for 16bit shifted constant.  We know that hi32 is
4319          non-zero, so start the mask on the first bit of the hi32
4320          value.  */
4321       shift = 17;
4322       do
4323         {
4324           unsigned long himask, lomask;
4325
4326           if (shift < 32)
4327             {
4328               himask = 0xffff >> (32 - shift);
4329               lomask = (0xffff << shift) & 0xffffffff;
4330             }
4331           else
4332             {
4333               himask = 0xffff << (shift - 32);
4334               lomask = 0;
4335             }
4336           if ((hi32.X_add_number & ~(offsetT) himask) == 0
4337               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4338             {
4339               expressionS tmp;
4340
4341               tmp.X_op = O_constant;
4342               if (shift < 32)
4343                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4344                                     | (lo32.X_add_number >> shift));
4345               else
4346                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4347               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4348               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4349                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4350               return;
4351             }
4352           ++shift;
4353         }
4354       while (shift <= (64 - 16));
4355
4356       /* Find the bit number of the lowest one bit, and store the
4357          shifted value in hi/lo.  */
4358       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4359       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4360       if (lo != 0)
4361         {
4362           bit = 0;
4363           while ((lo & 1) == 0)
4364             {
4365               lo >>= 1;
4366               ++bit;
4367             }
4368           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4369           hi >>= bit;
4370         }
4371       else
4372         {
4373           bit = 32;
4374           while ((hi & 1) == 0)
4375             {
4376               hi >>= 1;
4377               ++bit;
4378             }
4379           lo = hi;
4380           hi = 0;
4381         }
4382
4383       /* Optimize if the shifted value is a (power of 2) - 1.  */
4384       if ((hi == 0 && ((lo + 1) & lo) == 0)
4385           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4386         {
4387           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4388           if (shift != 0)
4389             {
4390               expressionS tmp;
4391
4392               /* This instruction will set the register to be all
4393                  ones.  */
4394               tmp.X_op = O_constant;
4395               tmp.X_add_number = (offsetT) -1;
4396               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4397               if (bit != 0)
4398                 {
4399                   bit += shift;
4400                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4401                                reg, reg, (bit >= 32) ? bit - 32 : bit);
4402                 }
4403               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4404                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4405               return;
4406             }
4407         }
4408
4409       /* Sign extend hi32 before calling load_register, because we can
4410          generally get better code when we load a sign extended value.  */
4411       if ((hi32.X_add_number & 0x80000000) != 0)
4412         hi32.X_add_number |= ~(offsetT) 0xffffffff;
4413       load_register (reg, &hi32, 0);
4414       freg = reg;
4415     }
4416   if ((lo32.X_add_number & 0xffff0000) == 0)
4417     {
4418       if (freg != 0)
4419         {
4420           macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4421           freg = reg;
4422         }
4423     }
4424   else
4425     {
4426       expressionS mid16;
4427
4428       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4429         {
4430           macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4431           macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4432           return;
4433         }
4434
4435       if (freg != 0)
4436         {
4437           macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4438           freg = reg;
4439         }
4440       mid16 = lo32;
4441       mid16.X_add_number >>= 16;
4442       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4443       macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4444       freg = reg;
4445     }
4446   if ((lo32.X_add_number & 0xffff) != 0)
4447     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4448 }
4449
4450 static inline void
4451 load_delay_nop (void)
4452 {
4453   if (!gpr_interlocks)
4454     macro_build (NULL, "nop", "");
4455 }
4456
4457 /* Load an address into a register.  */
4458
4459 static void
4460 load_address (int reg, expressionS *ep, int *used_at)
4461 {
4462   if (ep->X_op != O_constant
4463       && ep->X_op != O_symbol)
4464     {
4465       as_bad (_("expression too complex"));
4466       ep->X_op = O_constant;
4467     }
4468
4469   if (ep->X_op == O_constant)
4470     {
4471       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4472       return;
4473     }
4474
4475   if (mips_pic == NO_PIC)
4476     {
4477       /* If this is a reference to a GP relative symbol, we want
4478            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
4479          Otherwise we want
4480            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
4481            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4482          If we have an addend, we always use the latter form.
4483
4484          With 64bit address space and a usable $at we want
4485            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4486            lui          $at,<sym>               (BFD_RELOC_HI16_S)
4487            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4488            daddiu       $at,<sym>               (BFD_RELOC_LO16)
4489            dsll32       $reg,0
4490            daddu        $reg,$reg,$at
4491
4492          If $at is already in use, we use a path which is suboptimal
4493          on superscalar processors.
4494            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4495            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4496            dsll         $reg,16
4497            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
4498            dsll         $reg,16
4499            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
4500
4501          For GP relative symbols in 64bit address space we can use
4502          the same sequence as in 32bit address space.  */
4503       if (HAVE_64BIT_SYMBOLS)
4504         {
4505           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4506               && !nopic_need_relax (ep->X_add_symbol, 1))
4507             {
4508               relax_start (ep->X_add_symbol);
4509               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4510                            mips_gp_register, BFD_RELOC_GPREL16);
4511               relax_switch ();
4512             }
4513
4514           if (*used_at == 0 && mips_opts.at)
4515             {
4516               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4517               macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4518               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4519                            BFD_RELOC_MIPS_HIGHER);
4520               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4521               macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4522               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4523               *used_at = 1;
4524             }
4525           else
4526             {
4527               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4528               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4529                            BFD_RELOC_MIPS_HIGHER);
4530               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4531               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4532               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4533               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4534             }
4535
4536           if (mips_relax.sequence)
4537             relax_end ();
4538         }
4539       else
4540         {
4541           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4542               && !nopic_need_relax (ep->X_add_symbol, 1))
4543             {
4544               relax_start (ep->X_add_symbol);
4545               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4546                            mips_gp_register, BFD_RELOC_GPREL16);
4547               relax_switch ();
4548             }
4549           macro_build_lui (ep, reg);
4550           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4551                        reg, reg, BFD_RELOC_LO16);
4552           if (mips_relax.sequence)
4553             relax_end ();
4554         }
4555     }
4556   else if (!mips_big_got)
4557     {
4558       expressionS ex;
4559
4560       /* If this is a reference to an external symbol, we want
4561            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4562          Otherwise we want
4563            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4564            nop
4565            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4566          If there is a constant, it must be added in after.
4567
4568          If we have NewABI, we want
4569            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
4570          unless we're referencing a global symbol with a non-zero
4571          offset, in which case cst must be added separately.  */
4572       if (HAVE_NEWABI)
4573         {
4574           if (ep->X_add_number)
4575             {
4576               ex.X_add_number = ep->X_add_number;
4577               ep->X_add_number = 0;
4578               relax_start (ep->X_add_symbol);
4579               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4580                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4581               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4582                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4583               ex.X_op = O_constant;
4584               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4585                            reg, reg, BFD_RELOC_LO16);
4586               ep->X_add_number = ex.X_add_number;
4587               relax_switch ();
4588             }
4589           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4590                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4591           if (mips_relax.sequence)
4592             relax_end ();
4593         }
4594       else
4595         {
4596           ex.X_add_number = ep->X_add_number;
4597           ep->X_add_number = 0;
4598           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4599                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4600           load_delay_nop ();
4601           relax_start (ep->X_add_symbol);
4602           relax_switch ();
4603           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4604                        BFD_RELOC_LO16);
4605           relax_end ();
4606
4607           if (ex.X_add_number != 0)
4608             {
4609               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4610                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4611               ex.X_op = O_constant;
4612               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4613                            reg, reg, BFD_RELOC_LO16);
4614             }
4615         }
4616     }
4617   else if (mips_big_got)
4618     {
4619       expressionS ex;
4620
4621       /* This is the large GOT case.  If this is a reference to an
4622          external symbol, we want
4623            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
4624            addu         $reg,$reg,$gp
4625            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
4626
4627          Otherwise, for a reference to a local symbol in old ABI, we want
4628            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4629            nop
4630            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4631          If there is a constant, it must be added in after.
4632
4633          In the NewABI, for local symbols, with or without offsets, we want:
4634            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
4635            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
4636       */
4637       if (HAVE_NEWABI)
4638         {
4639           ex.X_add_number = ep->X_add_number;
4640           ep->X_add_number = 0;
4641           relax_start (ep->X_add_symbol);
4642           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4643           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4644                        reg, reg, mips_gp_register);
4645           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4646                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4647           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4648             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4649           else if (ex.X_add_number)
4650             {
4651               ex.X_op = O_constant;
4652               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4653                            BFD_RELOC_LO16);
4654             }
4655
4656           ep->X_add_number = ex.X_add_number;
4657           relax_switch ();
4658           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4659                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4660           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4661                        BFD_RELOC_MIPS_GOT_OFST);
4662           relax_end ();
4663         }
4664       else
4665         {
4666           ex.X_add_number = ep->X_add_number;
4667           ep->X_add_number = 0;
4668           relax_start (ep->X_add_symbol);
4669           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4670           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4671                        reg, reg, mips_gp_register);
4672           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4673                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4674           relax_switch ();
4675           if (reg_needs_delay (mips_gp_register))
4676             {
4677               /* We need a nop before loading from $gp.  This special
4678                  check is required because the lui which starts the main
4679                  instruction stream does not refer to $gp, and so will not
4680                  insert the nop which may be required.  */
4681               macro_build (NULL, "nop", "");
4682             }
4683           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4684                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4685           load_delay_nop ();
4686           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4687                        BFD_RELOC_LO16);
4688           relax_end ();
4689
4690           if (ex.X_add_number != 0)
4691             {
4692               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4693                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4694               ex.X_op = O_constant;
4695               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4696                            BFD_RELOC_LO16);
4697             }
4698         }
4699     }
4700   else
4701     abort ();
4702
4703   if (!mips_opts.at && *used_at == 1)
4704     as_bad (_("Macro used $at after \".set noat\""));
4705 }
4706
4707 /* Move the contents of register SOURCE into register DEST.  */
4708
4709 static void
4710 move_register (int dest, int source)
4711 {
4712   macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4713                dest, source, 0);
4714 }
4715
4716 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4717    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4718    The two alternatives are:
4719
4720    Global symbol                Local sybmol
4721    -------------                ------------
4722    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
4723    ...                          ...
4724    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4725
4726    load_got_offset emits the first instruction and add_got_offset
4727    emits the second for a 16-bit offset or add_got_offset_hilo emits
4728    a sequence to add a 32-bit offset using a scratch register.  */
4729
4730 static void
4731 load_got_offset (int dest, expressionS *local)
4732 {
4733   expressionS global;
4734
4735   global = *local;
4736   global.X_add_number = 0;
4737
4738   relax_start (local->X_add_symbol);
4739   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4740                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4741   relax_switch ();
4742   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4743                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4744   relax_end ();
4745 }
4746
4747 static void
4748 add_got_offset (int dest, expressionS *local)
4749 {
4750   expressionS global;
4751
4752   global.X_op = O_constant;
4753   global.X_op_symbol = NULL;
4754   global.X_add_symbol = NULL;
4755   global.X_add_number = local->X_add_number;
4756
4757   relax_start (local->X_add_symbol);
4758   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4759                dest, dest, BFD_RELOC_LO16);
4760   relax_switch ();
4761   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4762   relax_end ();
4763 }
4764
4765 static void
4766 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4767 {
4768   expressionS global;
4769   int hold_mips_optimize;
4770
4771   global.X_op = O_constant;
4772   global.X_op_symbol = NULL;
4773   global.X_add_symbol = NULL;
4774   global.X_add_number = local->X_add_number;
4775
4776   relax_start (local->X_add_symbol);
4777   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4778   relax_switch ();
4779   /* Set mips_optimize around the lui instruction to avoid
4780      inserting an unnecessary nop after the lw.  */
4781   hold_mips_optimize = mips_optimize;
4782   mips_optimize = 2;
4783   macro_build_lui (&global, tmp);
4784   mips_optimize = hold_mips_optimize;
4785   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4786   relax_end ();
4787
4788   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4789 }
4790
4791 /*
4792  *                      Build macros
4793  *   This routine implements the seemingly endless macro or synthesized
4794  * instructions and addressing modes in the mips assembly language. Many
4795  * of these macros are simple and are similar to each other. These could
4796  * probably be handled by some kind of table or grammar approach instead of
4797  * this verbose method. Others are not simple macros but are more like
4798  * optimizing code generation.
4799  *   One interesting optimization is when several store macros appear
4800  * consecutively that would load AT with the upper half of the same address.
4801  * The ensuing load upper instructions are ommited. This implies some kind
4802  * of global optimization. We currently only optimize within a single macro.
4803  *   For many of the load and store macros if the address is specified as a
4804  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4805  * first load register 'at' with zero and use it as the base register. The
4806  * mips assembler simply uses register $zero. Just one tiny optimization
4807  * we're missing.
4808  */
4809 static void
4810 macro (struct mips_cl_insn *ip)
4811 {
4812   unsigned int treg, sreg, dreg, breg;
4813   unsigned int tempreg;
4814   int mask;
4815   int used_at = 0;
4816   expressionS expr1;
4817   const char *s;
4818   const char *s2;
4819   const char *fmt;
4820   int likely = 0;
4821   int dbl = 0;
4822   int coproc = 0;
4823   int lr = 0;
4824   int imm = 0;
4825   int call = 0;
4826   int off;
4827   offsetT maxnum;
4828   bfd_reloc_code_real_type r;
4829   int hold_mips_optimize;
4830
4831   gas_assert (! mips_opts.mips16);
4832
4833   treg = (ip->insn_opcode >> 16) & 0x1f;
4834   dreg = (ip->insn_opcode >> 11) & 0x1f;
4835   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4836   mask = ip->insn_mo->mask;
4837
4838   expr1.X_op = O_constant;
4839   expr1.X_op_symbol = NULL;
4840   expr1.X_add_symbol = NULL;
4841   expr1.X_add_number = 1;
4842
4843   switch (mask)
4844     {
4845     case M_DABS:
4846       dbl = 1;
4847     case M_ABS:
4848       /* bgez $a0,.+12
4849          move v0,$a0
4850          sub v0,$zero,$a0
4851          */
4852
4853       start_noreorder ();
4854
4855       expr1.X_add_number = 8;
4856       macro_build (&expr1, "bgez", "s,p", sreg);
4857       if (dreg == sreg)
4858         macro_build (NULL, "nop", "", 0);
4859       else
4860         move_register (dreg, sreg);
4861       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4862
4863       end_noreorder ();
4864       break;
4865
4866     case M_ADD_I:
4867       s = "addi";
4868       s2 = "add";
4869       goto do_addi;
4870     case M_ADDU_I:
4871       s = "addiu";
4872       s2 = "addu";
4873       goto do_addi;
4874     case M_DADD_I:
4875       dbl = 1;
4876       s = "daddi";
4877       s2 = "dadd";
4878       goto do_addi;
4879     case M_DADDU_I:
4880       dbl = 1;
4881       s = "daddiu";
4882       s2 = "daddu";
4883     do_addi:
4884       if (imm_expr.X_op == O_constant
4885           && imm_expr.X_add_number >= -0x8000
4886           && imm_expr.X_add_number < 0x8000)
4887         {
4888           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4889           break;
4890         }
4891       used_at = 1;
4892       load_register (AT, &imm_expr, dbl);
4893       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4894       break;
4895
4896     case M_AND_I:
4897       s = "andi";
4898       s2 = "and";
4899       goto do_bit;
4900     case M_OR_I:
4901       s = "ori";
4902       s2 = "or";
4903       goto do_bit;
4904     case M_NOR_I:
4905       s = "";
4906       s2 = "nor";
4907       goto do_bit;
4908     case M_XOR_I:
4909       s = "xori";
4910       s2 = "xor";
4911     do_bit:
4912       if (imm_expr.X_op == O_constant
4913           && imm_expr.X_add_number >= 0
4914           && imm_expr.X_add_number < 0x10000)
4915         {
4916           if (mask != M_NOR_I)
4917             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4918           else
4919             {
4920               macro_build (&imm_expr, "ori", "t,r,i",
4921                            treg, sreg, BFD_RELOC_LO16);
4922               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4923             }
4924           break;
4925         }
4926
4927       used_at = 1;
4928       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4929       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4930       break;
4931
4932     case M_BALIGN:
4933       switch (imm_expr.X_add_number)
4934         {
4935         case 0:
4936           macro_build (NULL, "nop", "");
4937           break;
4938         case 2:
4939           macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4940           break;
4941         default:
4942           macro_build (NULL, "balign", "t,s,2", treg, sreg,
4943                        (int)imm_expr.X_add_number);
4944           break;
4945         }
4946       break;
4947
4948     case M_BEQ_I:
4949       s = "beq";
4950       goto beq_i;
4951     case M_BEQL_I:
4952       s = "beql";
4953       likely = 1;
4954       goto beq_i;
4955     case M_BNE_I:
4956       s = "bne";
4957       goto beq_i;
4958     case M_BNEL_I:
4959       s = "bnel";
4960       likely = 1;
4961     beq_i:
4962       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4963         {
4964           macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4965           break;
4966         }
4967       used_at = 1;
4968       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4969       macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4970       break;
4971
4972     case M_BGEL:
4973       likely = 1;
4974     case M_BGE:
4975       if (treg == 0)
4976         {
4977           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4978           break;
4979         }
4980       if (sreg == 0)
4981         {
4982           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4983           break;
4984         }
4985       used_at = 1;
4986       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4987       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4988       break;
4989
4990     case M_BGTL_I:
4991       likely = 1;
4992     case M_BGT_I:
4993       /* check for > max integer */
4994       maxnum = 0x7fffffff;
4995       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4996         {
4997           maxnum <<= 16;
4998           maxnum |= 0xffff;
4999           maxnum <<= 16;
5000           maxnum |= 0xffff;
5001         }
5002       if (imm_expr.X_op == O_constant
5003           && imm_expr.X_add_number >= maxnum
5004           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5005         {
5006         do_false:
5007           /* result is always false */
5008           if (! likely)
5009             macro_build (NULL, "nop", "", 0);
5010           else
5011             macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
5012           break;
5013         }
5014       if (imm_expr.X_op != O_constant)
5015         as_bad (_("Unsupported large constant"));
5016       ++imm_expr.X_add_number;
5017       /* FALLTHROUGH */
5018     case M_BGE_I:
5019     case M_BGEL_I:
5020       if (mask == M_BGEL_I)
5021         likely = 1;
5022       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5023         {
5024           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
5025           break;
5026         }
5027       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5028         {
5029           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5030           break;
5031         }
5032       maxnum = 0x7fffffff;
5033       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5034         {
5035           maxnum <<= 16;
5036           maxnum |= 0xffff;
5037           maxnum <<= 16;
5038           maxnum |= 0xffff;
5039         }
5040       maxnum = - maxnum - 1;
5041       if (imm_expr.X_op == O_constant
5042           && imm_expr.X_add_number <= maxnum
5043           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5044         {
5045         do_true:
5046           /* result is always true */
5047           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
5048           macro_build (&offset_expr, "b", "p");
5049           break;
5050         }
5051       used_at = 1;
5052       set_at (sreg, 0);
5053       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5054       break;
5055
5056     case M_BGEUL:
5057       likely = 1;
5058     case M_BGEU:
5059       if (treg == 0)
5060         goto do_true;
5061       if (sreg == 0)
5062         {
5063           macro_build (&offset_expr, likely ? "beql" : "beq",
5064                        "s,t,p", 0, treg);
5065           break;
5066         }
5067       used_at = 1;
5068       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5069       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5070       break;
5071
5072     case M_BGTUL_I:
5073       likely = 1;
5074     case M_BGTU_I:
5075       if (sreg == 0
5076           || (HAVE_32BIT_GPRS
5077               && imm_expr.X_op == O_constant
5078               && imm_expr.X_add_number == (offsetT) 0xffffffff))
5079         goto do_false;
5080       if (imm_expr.X_op != O_constant)
5081         as_bad (_("Unsupported large constant"));
5082       ++imm_expr.X_add_number;
5083       /* FALLTHROUGH */
5084     case M_BGEU_I:
5085     case M_BGEUL_I:
5086       if (mask == M_BGEUL_I)
5087         likely = 1;
5088       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5089         goto do_true;
5090       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5091         {
5092           macro_build (&offset_expr, likely ? "bnel" : "bne",
5093                        "s,t,p", sreg, 0);
5094           break;
5095         }
5096       used_at = 1;
5097       set_at (sreg, 1);
5098       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5099       break;
5100
5101     case M_BGTL:
5102       likely = 1;
5103     case M_BGT:
5104       if (treg == 0)
5105         {
5106           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5107           break;
5108         }
5109       if (sreg == 0)
5110         {
5111           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
5112           break;
5113         }
5114       used_at = 1;
5115       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5116       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5117       break;
5118
5119     case M_BGTUL:
5120       likely = 1;
5121     case M_BGTU:
5122       if (treg == 0)
5123         {
5124           macro_build (&offset_expr, likely ? "bnel" : "bne",
5125                        "s,t,p", sreg, 0);
5126           break;
5127         }
5128       if (sreg == 0)
5129         goto do_false;
5130       used_at = 1;
5131       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5132       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5133       break;
5134
5135     case M_BLEL:
5136       likely = 1;
5137     case M_BLE:
5138       if (treg == 0)
5139         {
5140           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5141           break;
5142         }
5143       if (sreg == 0)
5144         {
5145           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
5146           break;
5147         }
5148       used_at = 1;
5149       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5150       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5151       break;
5152
5153     case M_BLEL_I:
5154       likely = 1;
5155     case M_BLE_I:
5156       maxnum = 0x7fffffff;
5157       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5158         {
5159           maxnum <<= 16;
5160           maxnum |= 0xffff;
5161           maxnum <<= 16;
5162           maxnum |= 0xffff;
5163         }
5164       if (imm_expr.X_op == O_constant
5165           && imm_expr.X_add_number >= maxnum
5166           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5167         goto do_true;
5168       if (imm_expr.X_op != O_constant)
5169         as_bad (_("Unsupported large constant"));
5170       ++imm_expr.X_add_number;
5171       /* FALLTHROUGH */
5172     case M_BLT_I:
5173     case M_BLTL_I:
5174       if (mask == M_BLTL_I)
5175         likely = 1;
5176       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5177         {
5178           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5179           break;
5180         }
5181       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5182         {
5183           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5184           break;
5185         }
5186       used_at = 1;
5187       set_at (sreg, 0);
5188       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5189       break;
5190
5191     case M_BLEUL:
5192       likely = 1;
5193     case M_BLEU:
5194       if (treg == 0)
5195         {
5196           macro_build (&offset_expr, likely ? "beql" : "beq",
5197                        "s,t,p", sreg, 0);
5198           break;
5199         }
5200       if (sreg == 0)
5201         goto do_true;
5202       used_at = 1;
5203       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5204       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5205       break;
5206
5207     case M_BLEUL_I:
5208       likely = 1;
5209     case M_BLEU_I:
5210       if (sreg == 0
5211           || (HAVE_32BIT_GPRS
5212               && imm_expr.X_op == O_constant
5213               && imm_expr.X_add_number == (offsetT) 0xffffffff))
5214         goto do_true;
5215       if (imm_expr.X_op != O_constant)
5216         as_bad (_("Unsupported large constant"));
5217       ++imm_expr.X_add_number;
5218       /* FALLTHROUGH */
5219     case M_BLTU_I:
5220     case M_BLTUL_I:
5221       if (mask == M_BLTUL_I)
5222         likely = 1;
5223       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5224         goto do_false;
5225       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5226         {
5227           macro_build (&offset_expr, likely ? "beql" : "beq",
5228                        "s,t,p", sreg, 0);
5229           break;
5230         }
5231       used_at = 1;
5232       set_at (sreg, 1);
5233       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5234       break;
5235
5236     case M_BLTL:
5237       likely = 1;
5238     case M_BLT:
5239       if (treg == 0)
5240         {
5241           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5242           break;
5243         }
5244       if (sreg == 0)
5245         {
5246           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
5247           break;
5248         }
5249       used_at = 1;
5250       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5251       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5252       break;
5253
5254     case M_BLTUL:
5255       likely = 1;
5256     case M_BLTU:
5257       if (treg == 0)
5258         goto do_false;
5259       if (sreg == 0)
5260         {
5261           macro_build (&offset_expr, likely ? "bnel" : "bne",
5262                        "s,t,p", 0, treg);
5263           break;
5264         }
5265       used_at = 1;
5266       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5267       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5268       break;
5269
5270     case M_DEXT:
5271       {
5272         unsigned long pos;
5273         unsigned long size;
5274
5275         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5276           {
5277             as_bad (_("Unsupported large constant"));
5278             pos = size = 1;
5279           }
5280         else
5281           {
5282             pos = (unsigned long) imm_expr.X_add_number;
5283             size = (unsigned long) imm2_expr.X_add_number;
5284           }
5285
5286         if (pos > 63)
5287           {
5288             as_bad (_("Improper position (%lu)"), pos);
5289             pos = 1;
5290           }
5291         if (size == 0 || size > 64
5292             || (pos + size - 1) > 63)
5293           {
5294             as_bad (_("Improper extract size (%lu, position %lu)"),
5295                     size, pos);
5296             size = 1;
5297           }
5298
5299         if (size <= 32 && pos < 32)
5300           {
5301             s = "dext";
5302             fmt = "t,r,+A,+C";
5303           }
5304         else if (size <= 32)
5305           {
5306             s = "dextu";
5307             fmt = "t,r,+E,+H";
5308           }
5309         else
5310           {
5311             s = "dextm";
5312             fmt = "t,r,+A,+G";
5313           }
5314         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
5315       }
5316       break;
5317
5318     case M_DINS:
5319       {
5320         unsigned long pos;
5321         unsigned long size;
5322
5323         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5324           {
5325             as_bad (_("Unsupported large constant"));
5326             pos = size = 1;
5327           }
5328         else
5329           {
5330             pos = (unsigned long) imm_expr.X_add_number;
5331             size = (unsigned long) imm2_expr.X_add_number;
5332           }
5333
5334         if (pos > 63)
5335           {
5336             as_bad (_("Improper position (%lu)"), pos);
5337             pos = 1;
5338           }
5339         if (size == 0 || size > 64
5340             || (pos + size - 1) > 63)
5341           {
5342             as_bad (_("Improper insert size (%lu, position %lu)"),
5343                     size, pos);
5344             size = 1;
5345           }
5346
5347         if (pos < 32 && (pos + size - 1) < 32)
5348           {
5349             s = "dins";
5350             fmt = "t,r,+A,+B";
5351           }
5352         else if (pos >= 32)
5353           {
5354             s = "dinsu";
5355             fmt = "t,r,+E,+F";
5356           }
5357         else
5358           {
5359             s = "dinsm";
5360             fmt = "t,r,+A,+F";
5361           }
5362         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5363                      (int) (pos + size - 1));
5364       }
5365       break;
5366
5367     case M_DDIV_3:
5368       dbl = 1;
5369     case M_DIV_3:
5370       s = "mflo";
5371       goto do_div3;
5372     case M_DREM_3:
5373       dbl = 1;
5374     case M_REM_3:
5375       s = "mfhi";
5376     do_div3:
5377       if (treg == 0)
5378         {
5379           as_warn (_("Divide by zero."));
5380           if (mips_trap)
5381             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5382           else
5383             macro_build (NULL, "break", "c", 7);
5384           break;
5385         }
5386
5387       start_noreorder ();
5388       if (mips_trap)
5389         {
5390           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5391           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5392         }
5393       else
5394         {
5395           expr1.X_add_number = 8;
5396           macro_build (&expr1, "bne", "s,t,p", treg, 0);
5397           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5398           macro_build (NULL, "break", "c", 7);
5399         }
5400       expr1.X_add_number = -1;
5401       used_at = 1;
5402       load_register (AT, &expr1, dbl);
5403       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5404       macro_build (&expr1, "bne", "s,t,p", treg, AT);
5405       if (dbl)
5406         {
5407           expr1.X_add_number = 1;
5408           load_register (AT, &expr1, dbl);
5409           macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5410         }
5411       else
5412         {
5413           expr1.X_add_number = 0x80000000;
5414           macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5415         }
5416       if (mips_trap)
5417         {
5418           macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5419           /* We want to close the noreorder block as soon as possible, so
5420              that later insns are available for delay slot filling.  */
5421           end_noreorder ();
5422         }
5423       else
5424         {
5425           expr1.X_add_number = 8;
5426           macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5427           macro_build (NULL, "nop", "", 0);
5428
5429           /* We want to close the noreorder block as soon as possible, so
5430              that later insns are available for delay slot filling.  */
5431           end_noreorder ();
5432
5433           macro_build (NULL, "break", "c", 6);
5434         }
5435       macro_build (NULL, s, "d", dreg);
5436       break;
5437
5438     case M_DIV_3I:
5439       s = "div";
5440       s2 = "mflo";
5441       goto do_divi;
5442     case M_DIVU_3I:
5443       s = "divu";
5444       s2 = "mflo";
5445       goto do_divi;
5446     case M_REM_3I:
5447       s = "div";
5448       s2 = "mfhi";
5449       goto do_divi;
5450     case M_REMU_3I:
5451       s = "divu";
5452       s2 = "mfhi";
5453       goto do_divi;
5454     case M_DDIV_3I:
5455       dbl = 1;
5456       s = "ddiv";
5457       s2 = "mflo";
5458       goto do_divi;
5459     case M_DDIVU_3I:
5460       dbl = 1;
5461       s = "ddivu";
5462       s2 = "mflo";
5463       goto do_divi;
5464     case M_DREM_3I:
5465       dbl = 1;
5466       s = "ddiv";
5467       s2 = "mfhi";
5468       goto do_divi;
5469     case M_DREMU_3I:
5470       dbl = 1;
5471       s = "ddivu";
5472       s2 = "mfhi";
5473     do_divi:
5474       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5475         {
5476           as_warn (_("Divide by zero."));
5477           if (mips_trap)
5478             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5479           else
5480             macro_build (NULL, "break", "c", 7);
5481           break;
5482         }
5483       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5484         {
5485           if (strcmp (s2, "mflo") == 0)
5486             move_register (dreg, sreg);
5487           else
5488             move_register (dreg, 0);
5489           break;
5490         }
5491       if (imm_expr.X_op == O_constant
5492           && imm_expr.X_add_number == -1
5493           && s[strlen (s) - 1] != 'u')
5494         {
5495           if (strcmp (s2, "mflo") == 0)
5496             {
5497               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5498             }
5499           else
5500             move_register (dreg, 0);
5501           break;
5502         }
5503
5504       used_at = 1;
5505       load_register (AT, &imm_expr, dbl);
5506       macro_build (NULL, s, "z,s,t", sreg, AT);
5507       macro_build (NULL, s2, "d", dreg);
5508       break;
5509
5510     case M_DIVU_3:
5511       s = "divu";
5512       s2 = "mflo";
5513       goto do_divu3;
5514     case M_REMU_3:
5515       s = "divu";
5516       s2 = "mfhi";
5517       goto do_divu3;
5518     case M_DDIVU_3:
5519       s = "ddivu";
5520       s2 = "mflo";
5521       goto do_divu3;
5522     case M_DREMU_3:
5523       s = "ddivu";
5524       s2 = "mfhi";
5525     do_divu3:
5526       start_noreorder ();
5527       if (mips_trap)
5528         {
5529           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5530           macro_build (NULL, s, "z,s,t", sreg, treg);
5531           /* We want to close the noreorder block as soon as possible, so
5532              that later insns are available for delay slot filling.  */
5533           end_noreorder ();
5534         }
5535       else
5536         {
5537           expr1.X_add_number = 8;
5538           macro_build (&expr1, "bne", "s,t,p", treg, 0);
5539           macro_build (NULL, s, "z,s,t", sreg, treg);
5540
5541           /* We want to close the noreorder block as soon as possible, so
5542              that later insns are available for delay slot filling.  */
5543           end_noreorder ();
5544           macro_build (NULL, "break", "c", 7);
5545         }
5546       macro_build (NULL, s2, "d", dreg);
5547       break;
5548
5549     case M_DLCA_AB:
5550       dbl = 1;
5551     case M_LCA_AB:
5552       call = 1;
5553       goto do_la;
5554     case M_DLA_AB:
5555       dbl = 1;
5556     case M_LA_AB:
5557     do_la:
5558       /* Load the address of a symbol into a register.  If breg is not
5559          zero, we then add a base register to it.  */
5560
5561       if (dbl && HAVE_32BIT_GPRS)
5562         as_warn (_("dla used to load 32-bit register"));
5563
5564       if (! dbl && HAVE_64BIT_OBJECTS)
5565         as_warn (_("la used to load 64-bit address"));
5566
5567       if (offset_expr.X_op == O_constant
5568           && offset_expr.X_add_number >= -0x8000
5569           && offset_expr.X_add_number < 0x8000)
5570         {
5571           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5572                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
5573           break;
5574         }
5575
5576       if (mips_opts.at && (treg == breg))
5577         {
5578           tempreg = AT;
5579           used_at = 1;
5580         }
5581       else
5582         {
5583           tempreg = treg;
5584         }
5585
5586       if (offset_expr.X_op != O_symbol
5587           && offset_expr.X_op != O_constant)
5588         {
5589           as_bad (_("expression too complex"));
5590           offset_expr.X_op = O_constant;
5591         }
5592
5593       if (offset_expr.X_op == O_constant)
5594         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5595       else if (mips_pic == NO_PIC)
5596         {
5597           /* If this is a reference to a GP relative symbol, we want
5598                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
5599              Otherwise we want
5600                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5601                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5602              If we have a constant, we need two instructions anyhow,
5603              so we may as well always use the latter form.
5604
5605              With 64bit address space and a usable $at we want
5606                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5607                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5608                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5609                daddiu   $at,<sym>               (BFD_RELOC_LO16)
5610                dsll32   $tempreg,0
5611                daddu    $tempreg,$tempreg,$at
5612
5613              If $at is already in use, we use a path which is suboptimal
5614              on superscalar processors.
5615                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5616                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5617                dsll     $tempreg,16
5618                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5619                dsll     $tempreg,16
5620                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
5621
5622              For GP relative symbols in 64bit address space we can use
5623              the same sequence as in 32bit address space.  */
5624           if (HAVE_64BIT_SYMBOLS)
5625             {
5626               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5627                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5628                 {
5629                   relax_start (offset_expr.X_add_symbol);
5630                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5631                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5632                   relax_switch ();
5633                 }
5634
5635               if (used_at == 0 && mips_opts.at)
5636                 {
5637                   macro_build (&offset_expr, "lui", "t,u",
5638                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5639                   macro_build (&offset_expr, "lui", "t,u",
5640                                AT, BFD_RELOC_HI16_S);
5641                   macro_build (&offset_expr, "daddiu", "t,r,j",
5642                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5643                   macro_build (&offset_expr, "daddiu", "t,r,j",
5644                                AT, AT, BFD_RELOC_LO16);
5645                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5646                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5647                   used_at = 1;
5648                 }
5649               else
5650                 {
5651                   macro_build (&offset_expr, "lui", "t,u",
5652                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5653                   macro_build (&offset_expr, "daddiu", "t,r,j",
5654                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5655                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5656                   macro_build (&offset_expr, "daddiu", "t,r,j",
5657                                tempreg, tempreg, BFD_RELOC_HI16_S);
5658                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5659                   macro_build (&offset_expr, "daddiu", "t,r,j",
5660                                tempreg, tempreg, BFD_RELOC_LO16);
5661                 }
5662
5663               if (mips_relax.sequence)
5664                 relax_end ();
5665             }
5666           else
5667             {
5668               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5669                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5670                 {
5671                   relax_start (offset_expr.X_add_symbol);
5672                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5673                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5674                   relax_switch ();
5675                 }
5676               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5677                 as_bad (_("offset too large"));
5678               macro_build_lui (&offset_expr, tempreg);
5679               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5680                            tempreg, tempreg, BFD_RELOC_LO16);
5681               if (mips_relax.sequence)
5682                 relax_end ();
5683             }
5684         }
5685       else if (!mips_big_got && !HAVE_NEWABI)
5686         {
5687           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5688
5689           /* If this is a reference to an external symbol, and there
5690              is no constant, we want
5691                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5692              or for lca or if tempreg is PIC_CALL_REG
5693                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5694              For a local symbol, we want
5695                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5696                nop
5697                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5698
5699              If we have a small constant, and this is a reference to
5700              an external symbol, we want
5701                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5702                nop
5703                addiu    $tempreg,$tempreg,<constant>
5704              For a local symbol, we want the same instruction
5705              sequence, but we output a BFD_RELOC_LO16 reloc on the
5706              addiu instruction.
5707
5708              If we have a large constant, and this is a reference to
5709              an external symbol, we want
5710                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5711                lui      $at,<hiconstant>
5712                addiu    $at,$at,<loconstant>
5713                addu     $tempreg,$tempreg,$at
5714              For a local symbol, we want the same instruction
5715              sequence, but we output a BFD_RELOC_LO16 reloc on the
5716              addiu instruction.
5717            */
5718
5719           if (offset_expr.X_add_number == 0)
5720             {
5721               if (mips_pic == SVR4_PIC
5722                   && breg == 0
5723                   && (call || tempreg == PIC_CALL_REG))
5724                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5725
5726               relax_start (offset_expr.X_add_symbol);
5727               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5728                            lw_reloc_type, mips_gp_register);
5729               if (breg != 0)
5730                 {
5731                   /* We're going to put in an addu instruction using
5732                      tempreg, so we may as well insert the nop right
5733                      now.  */
5734                   load_delay_nop ();
5735                 }
5736               relax_switch ();
5737               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5738                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5739               load_delay_nop ();
5740               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5741                            tempreg, tempreg, BFD_RELOC_LO16);
5742               relax_end ();
5743               /* FIXME: If breg == 0, and the next instruction uses
5744                  $tempreg, then if this variant case is used an extra
5745                  nop will be generated.  */
5746             }
5747           else if (offset_expr.X_add_number >= -0x8000
5748                    && offset_expr.X_add_number < 0x8000)
5749             {
5750               load_got_offset (tempreg, &offset_expr);
5751               load_delay_nop ();
5752               add_got_offset (tempreg, &offset_expr);
5753             }
5754           else
5755             {
5756               expr1.X_add_number = offset_expr.X_add_number;
5757               offset_expr.X_add_number =
5758                 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5759               load_got_offset (tempreg, &offset_expr);
5760               offset_expr.X_add_number = expr1.X_add_number;
5761               /* If we are going to add in a base register, and the
5762                  target register and the base register are the same,
5763                  then we are using AT as a temporary register.  Since
5764                  we want to load the constant into AT, we add our
5765                  current AT (from the global offset table) and the
5766                  register into the register now, and pretend we were
5767                  not using a base register.  */
5768               if (breg == treg)
5769                 {
5770                   load_delay_nop ();
5771                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5772                                treg, AT, breg);
5773                   breg = 0;
5774                   tempreg = treg;
5775                 }
5776               add_got_offset_hilo (tempreg, &offset_expr, AT);
5777               used_at = 1;
5778             }
5779         }
5780       else if (!mips_big_got && HAVE_NEWABI)
5781         {
5782           int add_breg_early = 0;
5783
5784           /* If this is a reference to an external, and there is no
5785              constant, or local symbol (*), with or without a
5786              constant, we want
5787                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5788              or for lca or if tempreg is PIC_CALL_REG
5789                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5790
5791              If we have a small constant, and this is a reference to
5792              an external symbol, we want
5793                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5794                addiu    $tempreg,$tempreg,<constant>
5795
5796              If we have a large constant, and this is a reference to
5797              an external symbol, we want
5798                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5799                lui      $at,<hiconstant>
5800                addiu    $at,$at,<loconstant>
5801                addu     $tempreg,$tempreg,$at
5802
5803              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5804              local symbols, even though it introduces an additional
5805              instruction.  */
5806
5807           if (offset_expr.X_add_number)
5808             {
5809               expr1.X_add_number = offset_expr.X_add_number;
5810               offset_expr.X_add_number = 0;
5811
5812               relax_start (offset_expr.X_add_symbol);
5813               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5814                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5815
5816               if (expr1.X_add_number >= -0x8000
5817                   && expr1.X_add_number < 0x8000)
5818                 {
5819                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5820                                tempreg, tempreg, BFD_RELOC_LO16);
5821                 }
5822               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5823                 {
5824                   /* If we are going to add in a base register, and the
5825                      target register and the base register are the same,
5826                      then we are using AT as a temporary register.  Since
5827                      we want to load the constant into AT, we add our
5828                      current AT (from the global offset table) and the
5829                      register into the register now, and pretend we were
5830                      not using a base register.  */
5831                   if (breg != treg)
5832                     dreg = tempreg;
5833                   else
5834                     {
5835                       gas_assert (tempreg == AT);
5836                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5837                                    treg, AT, breg);
5838                       dreg = treg;
5839                       add_breg_early = 1;
5840                     }
5841
5842                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5843                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5844                                dreg, dreg, AT);
5845
5846                   used_at = 1;
5847                 }
5848               else
5849                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5850
5851               relax_switch ();
5852               offset_expr.X_add_number = expr1.X_add_number;
5853
5854               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5855                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5856               if (add_breg_early)
5857                 {
5858                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5859                                treg, tempreg, breg);
5860                   breg = 0;
5861                   tempreg = treg;
5862                 }
5863               relax_end ();
5864             }
5865           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5866             {
5867               relax_start (offset_expr.X_add_symbol);
5868               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5869                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
5870               relax_switch ();
5871               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5872                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5873               relax_end ();
5874             }
5875           else
5876             {
5877               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5878                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5879             }
5880         }
5881       else if (mips_big_got && !HAVE_NEWABI)
5882         {
5883           int gpdelay;
5884           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5885           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5886           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5887
5888           /* This is the large GOT case.  If this is a reference to an
5889              external symbol, and there is no constant, we want
5890                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5891                addu     $tempreg,$tempreg,$gp
5892                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5893              or for lca or if tempreg is PIC_CALL_REG
5894                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5895                addu     $tempreg,$tempreg,$gp
5896                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5897              For a local symbol, we want
5898                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5899                nop
5900                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5901
5902              If we have a small constant, and this is a reference to
5903              an external symbol, we want
5904                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5905                addu     $tempreg,$tempreg,$gp
5906                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5907                nop
5908                addiu    $tempreg,$tempreg,<constant>
5909              For a local symbol, we want
5910                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5911                nop
5912                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5913
5914              If we have a large constant, and this is a reference to
5915              an external symbol, we want
5916                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5917                addu     $tempreg,$tempreg,$gp
5918                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5919                lui      $at,<hiconstant>
5920                addiu    $at,$at,<loconstant>
5921                addu     $tempreg,$tempreg,$at
5922              For a local symbol, we want
5923                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5924                lui      $at,<hiconstant>
5925                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
5926                addu     $tempreg,$tempreg,$at
5927           */
5928
5929           expr1.X_add_number = offset_expr.X_add_number;
5930           offset_expr.X_add_number = 0;
5931           relax_start (offset_expr.X_add_symbol);
5932           gpdelay = reg_needs_delay (mips_gp_register);
5933           if (expr1.X_add_number == 0 && breg == 0
5934               && (call || tempreg == PIC_CALL_REG))
5935             {
5936               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5937               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5938             }
5939           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5940           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5941                        tempreg, tempreg, mips_gp_register);
5942           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5943                        tempreg, lw_reloc_type, tempreg);
5944           if (expr1.X_add_number == 0)
5945             {
5946               if (breg != 0)
5947                 {
5948                   /* We're going to put in an addu instruction using
5949                      tempreg, so we may as well insert the nop right
5950                      now.  */
5951                   load_delay_nop ();
5952                 }
5953             }
5954           else if (expr1.X_add_number >= -0x8000
5955                    && expr1.X_add_number < 0x8000)
5956             {
5957               load_delay_nop ();
5958               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5959                            tempreg, tempreg, BFD_RELOC_LO16);
5960             }
5961           else
5962             {
5963               /* If we are going to add in a base register, and the
5964                  target register and the base register are the same,
5965                  then we are using AT as a temporary register.  Since
5966                  we want to load the constant into AT, we add our
5967                  current AT (from the global offset table) and the
5968                  register into the register now, and pretend we were
5969                  not using a base register.  */
5970               if (breg != treg)
5971                 dreg = tempreg;
5972               else
5973                 {
5974                   gas_assert (tempreg == AT);
5975                   load_delay_nop ();
5976                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5977                                treg, AT, breg);
5978                   dreg = treg;
5979                 }
5980
5981               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5982               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5983
5984               used_at = 1;
5985             }
5986           offset_expr.X_add_number =
5987             ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5988           relax_switch ();
5989
5990           if (gpdelay)
5991             {
5992               /* This is needed because this instruction uses $gp, but
5993                  the first instruction on the main stream does not.  */
5994               macro_build (NULL, "nop", "");
5995             }
5996
5997           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5998                        local_reloc_type, mips_gp_register);
5999           if (expr1.X_add_number >= -0x8000
6000               && expr1.X_add_number < 0x8000)
6001             {
6002               load_delay_nop ();
6003               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6004                            tempreg, tempreg, BFD_RELOC_LO16);
6005               /* FIXME: If add_number is 0, and there was no base
6006                  register, the external symbol case ended with a load,
6007                  so if the symbol turns out to not be external, and
6008                  the next instruction uses tempreg, an unnecessary nop
6009                  will be inserted.  */
6010             }
6011           else
6012             {
6013               if (breg == treg)
6014                 {
6015                   /* We must add in the base register now, as in the
6016                      external symbol case.  */
6017                   gas_assert (tempreg == AT);
6018                   load_delay_nop ();
6019                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6020                                treg, AT, breg);
6021                   tempreg = treg;
6022                   /* We set breg to 0 because we have arranged to add
6023                      it in in both cases.  */
6024                   breg = 0;
6025                 }
6026
6027               macro_build_lui (&expr1, AT);
6028               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6029                            AT, AT, BFD_RELOC_LO16);
6030               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6031                            tempreg, tempreg, AT);
6032               used_at = 1;
6033             }
6034           relax_end ();
6035         }
6036       else if (mips_big_got && HAVE_NEWABI)
6037         {
6038           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
6039           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
6040           int add_breg_early = 0;
6041
6042           /* This is the large GOT case.  If this is a reference to an
6043              external symbol, and there is no constant, we want
6044                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6045                add      $tempreg,$tempreg,$gp
6046                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6047              or for lca or if tempreg is PIC_CALL_REG
6048                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
6049                add      $tempreg,$tempreg,$gp
6050                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
6051
6052              If we have a small constant, and this is a reference to
6053              an external symbol, we want
6054                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6055                add      $tempreg,$tempreg,$gp
6056                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6057                addi     $tempreg,$tempreg,<constant>
6058
6059              If we have a large constant, and this is a reference to
6060              an external symbol, we want
6061                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6062                addu     $tempreg,$tempreg,$gp
6063                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6064                lui      $at,<hiconstant>
6065                addi     $at,$at,<loconstant>
6066                add      $tempreg,$tempreg,$at
6067
6068              If we have NewABI, and we know it's a local symbol, we want
6069                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
6070                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
6071              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
6072
6073           relax_start (offset_expr.X_add_symbol);
6074
6075           expr1.X_add_number = offset_expr.X_add_number;
6076           offset_expr.X_add_number = 0;
6077
6078           if (expr1.X_add_number == 0 && breg == 0
6079               && (call || tempreg == PIC_CALL_REG))
6080             {
6081               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6082               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6083             }
6084           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6085           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6086                        tempreg, tempreg, mips_gp_register);
6087           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6088                        tempreg, lw_reloc_type, tempreg);
6089
6090           if (expr1.X_add_number == 0)
6091             ;
6092           else if (expr1.X_add_number >= -0x8000
6093                    && expr1.X_add_number < 0x8000)
6094             {
6095               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6096                            tempreg, tempreg, BFD_RELOC_LO16);
6097             }
6098           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
6099             {
6100               /* If we are going to add in a base register, and the
6101                  target register and the base register are the same,
6102                  then we are using AT as a temporary register.  Since
6103                  we want to load the constant into AT, we add our
6104                  current AT (from the global offset table) and the
6105                  register into the register now, and pretend we were
6106                  not using a base register.  */
6107               if (breg != treg)
6108                 dreg = tempreg;
6109               else
6110                 {
6111                   gas_assert (tempreg == AT);
6112                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6113                                treg, AT, breg);
6114                   dreg = treg;
6115                   add_breg_early = 1;
6116                 }
6117
6118               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6119               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
6120
6121               used_at = 1;
6122             }
6123           else
6124             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6125
6126           relax_switch ();
6127           offset_expr.X_add_number = expr1.X_add_number;
6128           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6129                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6130           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6131                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
6132           if (add_breg_early)
6133             {
6134               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6135                            treg, tempreg, breg);
6136               breg = 0;
6137               tempreg = treg;
6138             }
6139           relax_end ();
6140         }
6141       else
6142         abort ();
6143
6144       if (breg != 0)
6145         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
6146       break;
6147
6148     case M_MSGSND:
6149       {
6150         unsigned long temp = (treg << 16) | (0x01);
6151         macro_build (NULL, "c2", "C", temp);
6152       }
6153       /* AT is not used, just return */
6154       return;
6155
6156     case M_MSGLD:
6157       {
6158         unsigned long temp = (0x02);
6159         macro_build (NULL, "c2", "C", temp);
6160       }
6161       /* AT is not used, just return */
6162       return;
6163
6164     case M_MSGLD_T:
6165       {
6166         unsigned long temp = (treg << 16) | (0x02);
6167         macro_build (NULL, "c2", "C", temp);
6168       }
6169       /* AT is not used, just return */
6170       return;
6171
6172     case M_MSGWAIT:
6173       macro_build (NULL, "c2", "C", 3);
6174       /* AT is not used, just return */
6175       return;
6176
6177     case M_MSGWAIT_T:
6178       {
6179         unsigned long temp = (treg << 16) | 0x03;
6180         macro_build (NULL, "c2", "C", temp);
6181       }
6182       /* AT is not used, just return */
6183       return;
6184
6185     case M_J_A:
6186       /* The j instruction may not be used in PIC code, since it
6187          requires an absolute address.  We convert it to a b
6188          instruction.  */
6189       if (mips_pic == NO_PIC)
6190         macro_build (&offset_expr, "j", "a");
6191       else
6192         macro_build (&offset_expr, "b", "p");
6193       break;
6194
6195       /* The jal instructions must be handled as macros because when
6196          generating PIC code they expand to multi-instruction
6197          sequences.  Normally they are simple instructions.  */
6198     case M_JAL_1:
6199       dreg = RA;
6200       /* Fall through.  */
6201     case M_JAL_2:
6202       if (mips_pic == NO_PIC)
6203         macro_build (NULL, "jalr", "d,s", dreg, sreg);
6204       else
6205         {
6206           if (sreg != PIC_CALL_REG)
6207             as_warn (_("MIPS PIC call to register other than $25"));
6208
6209           macro_build (NULL, "jalr", "d,s", dreg, sreg);
6210           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
6211             {
6212               if (mips_cprestore_offset < 0)
6213                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6214               else
6215                 {
6216                   if (! mips_frame_reg_valid)
6217                     {
6218                       as_warn (_("No .frame pseudo-op used in PIC code"));
6219                       /* Quiet this warning.  */
6220                       mips_frame_reg_valid = 1;
6221                     }
6222                   if (! mips_cprestore_valid)
6223                     {
6224                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6225                       /* Quiet this warning.  */
6226                       mips_cprestore_valid = 1;
6227                     }
6228                   if (mips_opts.noreorder)
6229                     macro_build (NULL, "nop", "");
6230                   expr1.X_add_number = mips_cprestore_offset;
6231                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6232                                                 mips_gp_register,
6233                                                 mips_frame_reg,
6234                                                 HAVE_64BIT_ADDRESSES);
6235                 }
6236             }
6237         }
6238
6239       break;
6240
6241     case M_JAL_A:
6242       if (mips_pic == NO_PIC)
6243         macro_build (&offset_expr, "jal", "a");
6244       else if (mips_pic == SVR4_PIC)
6245         {
6246           /* If this is a reference to an external symbol, and we are
6247              using a small GOT, we want
6248                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
6249                nop
6250                jalr     $ra,$25
6251                nop
6252                lw       $gp,cprestore($sp)
6253              The cprestore value is set using the .cprestore
6254              pseudo-op.  If we are using a big GOT, we want
6255                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
6256                addu     $25,$25,$gp
6257                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
6258                nop
6259                jalr     $ra,$25
6260                nop
6261                lw       $gp,cprestore($sp)
6262              If the symbol is not external, we want
6263                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6264                nop
6265                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
6266                jalr     $ra,$25
6267                nop
6268                lw $gp,cprestore($sp)
6269
6270              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
6271              sequences above, minus nops, unless the symbol is local,
6272              which enables us to use GOT_PAGE/GOT_OFST (big got) or
6273              GOT_DISP.  */
6274           if (HAVE_NEWABI)
6275             {
6276               if (! mips_big_got)
6277                 {
6278                   relax_start (offset_expr.X_add_symbol);
6279                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6280                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6281                                mips_gp_register);
6282                   relax_switch ();
6283                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6284                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
6285                                mips_gp_register);
6286                   relax_end ();
6287                 }
6288               else
6289                 {
6290                   relax_start (offset_expr.X_add_symbol);
6291                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6292                                BFD_RELOC_MIPS_CALL_HI16);
6293                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6294                                PIC_CALL_REG, mips_gp_register);
6295                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6296                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6297                                PIC_CALL_REG);
6298                   relax_switch ();
6299                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6300                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6301                                mips_gp_register);
6302                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6303                                PIC_CALL_REG, PIC_CALL_REG,
6304                                BFD_RELOC_MIPS_GOT_OFST);
6305                   relax_end ();
6306                 }
6307
6308               macro_build_jalr (&offset_expr);
6309             }
6310           else
6311             {
6312               relax_start (offset_expr.X_add_symbol);
6313               if (! mips_big_got)
6314                 {
6315                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6316                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6317                                mips_gp_register);
6318                   load_delay_nop ();
6319                   relax_switch ();
6320                 }
6321               else
6322                 {
6323                   int gpdelay;
6324
6325                   gpdelay = reg_needs_delay (mips_gp_register);
6326                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6327                                BFD_RELOC_MIPS_CALL_HI16);
6328                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6329                                PIC_CALL_REG, mips_gp_register);
6330                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6331                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6332                                PIC_CALL_REG);
6333                   load_delay_nop ();
6334                   relax_switch ();
6335                   if (gpdelay)
6336                     macro_build (NULL, "nop", "");
6337                 }
6338               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6339                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6340                            mips_gp_register);
6341               load_delay_nop ();
6342               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6343                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6344               relax_end ();
6345               macro_build_jalr (&offset_expr);
6346
6347               if (mips_cprestore_offset < 0)
6348                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6349               else
6350                 {
6351                   if (! mips_frame_reg_valid)
6352                     {
6353                       as_warn (_("No .frame pseudo-op used in PIC code"));
6354                       /* Quiet this warning.  */
6355                       mips_frame_reg_valid = 1;
6356                     }
6357                   if (! mips_cprestore_valid)
6358                     {
6359                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6360                       /* Quiet this warning.  */
6361                       mips_cprestore_valid = 1;
6362                     }
6363                   if (mips_opts.noreorder)
6364                     macro_build (NULL, "nop", "");
6365                   expr1.X_add_number = mips_cprestore_offset;
6366                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6367                                                 mips_gp_register,
6368                                                 mips_frame_reg,
6369                                                 HAVE_64BIT_ADDRESSES);
6370                 }
6371             }
6372         }
6373       else if (mips_pic == VXWORKS_PIC)
6374         as_bad (_("Non-PIC jump used in PIC library"));
6375       else
6376         abort ();
6377
6378       break;
6379
6380     case M_LB_AB:
6381       s = "lb";
6382       goto ld;
6383     case M_LBU_AB:
6384       s = "lbu";
6385       goto ld;
6386     case M_LH_AB:
6387       s = "lh";
6388       goto ld;
6389     case M_LHU_AB:
6390       s = "lhu";
6391       goto ld;
6392     case M_LW_AB:
6393       s = "lw";
6394       goto ld;
6395     case M_LWC0_AB:
6396       s = "lwc0";
6397       /* Itbl support may require additional care here.  */
6398       coproc = 1;
6399       goto ld;
6400     case M_LWC1_AB:
6401       s = "lwc1";
6402       /* Itbl support may require additional care here.  */
6403       coproc = 1;
6404       goto ld;
6405     case M_LWC2_AB:
6406       s = "lwc2";
6407       /* Itbl support may require additional care here.  */
6408       coproc = 1;
6409       goto ld;
6410     case M_LWC3_AB:
6411       s = "lwc3";
6412       /* Itbl support may require additional care here.  */
6413       coproc = 1;
6414       goto ld;
6415     case M_LWL_AB:
6416       s = "lwl";
6417       lr = 1;
6418       goto ld;
6419     case M_LWR_AB:
6420       s = "lwr";
6421       lr = 1;
6422       goto ld;
6423     case M_LDC1_AB:
6424       s = "ldc1";
6425       /* Itbl support may require additional care here.  */
6426       coproc = 1;
6427       goto ld;
6428     case M_LDC2_AB:
6429       s = "ldc2";
6430       /* Itbl support may require additional care here.  */
6431       coproc = 1;
6432       goto ld;
6433     case M_LDC3_AB:
6434       s = "ldc3";
6435       /* Itbl support may require additional care here.  */
6436       coproc = 1;
6437       goto ld;
6438     case M_LDL_AB:
6439       s = "ldl";
6440       lr = 1;
6441       goto ld;
6442     case M_LDR_AB:
6443       s = "ldr";
6444       lr = 1;
6445       goto ld;
6446     case M_LL_AB:
6447       s = "ll";
6448       goto ld;
6449     case M_LLD_AB:
6450       s = "lld";
6451       goto ld;
6452     case M_LWU_AB:
6453       s = "lwu";
6454     ld:
6455       if (breg == treg || coproc || lr)
6456         {
6457           tempreg = AT;
6458           used_at = 1;
6459         }
6460       else
6461         {
6462           tempreg = treg;
6463         }
6464       goto ld_st;
6465     case M_SB_AB:
6466       s = "sb";
6467       goto st;
6468     case M_SH_AB:
6469       s = "sh";
6470       goto st;
6471     case M_SW_AB:
6472       s = "sw";
6473       goto st;
6474     case M_SWC0_AB:
6475       s = "swc0";
6476       /* Itbl support may require additional care here.  */
6477       coproc = 1;
6478       goto st;
6479     case M_SWC1_AB:
6480       s = "swc1";
6481       /* Itbl support may require additional care here.  */
6482       coproc = 1;
6483       goto st;
6484     case M_SWC2_AB:
6485       s = "swc2";
6486       /* Itbl support may require additional care here.  */
6487       coproc = 1;
6488       goto st;
6489     case M_SWC3_AB:
6490       s = "swc3";
6491       /* Itbl support may require additional care here.  */
6492       coproc = 1;
6493       goto st;
6494     case M_SWL_AB:
6495       s = "swl";
6496       goto st;
6497     case M_SWR_AB:
6498       s = "swr";
6499       goto st;
6500     case M_SC_AB:
6501       s = "sc";
6502       goto st;
6503     case M_SCD_AB:
6504       s = "scd";
6505       goto st;
6506     case M_CACHE_AB:
6507       s = "cache";
6508       goto st;
6509     case M_SDC1_AB:
6510       s = "sdc1";
6511       coproc = 1;
6512       /* Itbl support may require additional care here.  */
6513       goto st;
6514     case M_SDC2_AB:
6515       s = "sdc2";
6516       /* Itbl support may require additional care here.  */
6517       coproc = 1;
6518       goto st;
6519     case M_SDC3_AB:
6520       s = "sdc3";
6521       /* Itbl support may require additional care here.  */
6522       coproc = 1;
6523       goto st;
6524     case M_SDL_AB:
6525       s = "sdl";
6526       goto st;
6527     case M_SDR_AB:
6528       s = "sdr";
6529     st:
6530       tempreg = AT;
6531       used_at = 1;
6532     ld_st:
6533       if (coproc
6534           && NO_ISA_COP (mips_opts.arch)
6535           && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
6536         {
6537           as_bad (_("opcode not supported on this processor: %s"),
6538                   mips_cpu_info_from_arch (mips_opts.arch)->name);
6539           break;
6540         }
6541
6542       /* Itbl support may require additional care here.  */
6543       if (mask == M_LWC1_AB
6544           || mask == M_SWC1_AB
6545           || mask == M_LDC1_AB
6546           || mask == M_SDC1_AB
6547           || mask == M_L_DAB
6548           || mask == M_S_DAB)
6549         fmt = "T,o(b)";
6550       else if (mask == M_CACHE_AB)
6551         fmt = "k,o(b)";
6552       else if (coproc)
6553         fmt = "E,o(b)";
6554       else
6555         fmt = "t,o(b)";
6556
6557       if (offset_expr.X_op != O_constant
6558           && offset_expr.X_op != O_symbol)
6559         {
6560           as_bad (_("expression too complex"));
6561           offset_expr.X_op = O_constant;
6562         }
6563
6564       if (HAVE_32BIT_ADDRESSES
6565           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6566         {
6567           char value [32];
6568
6569           sprintf_vma (value, offset_expr.X_add_number);
6570           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6571         }
6572
6573       /* A constant expression in PIC code can be handled just as it
6574          is in non PIC code.  */
6575       if (offset_expr.X_op == O_constant)
6576         {
6577           expr1.X_add_number = ((offset_expr.X_add_number + 0x8000)
6578                                 & ~(bfd_vma) 0xffff);
6579           normalize_address_expr (&expr1);
6580           load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6581           if (breg != 0)
6582             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6583                          tempreg, tempreg, breg);
6584           macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6585         }
6586       else if (mips_pic == NO_PIC)
6587         {
6588           /* If this is a reference to a GP relative symbol, and there
6589              is no base register, we want
6590                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6591              Otherwise, if there is no base register, we want
6592                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6593                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6594              If we have a constant, we need two instructions anyhow,
6595              so we always use the latter form.
6596
6597              If we have a base register, and this is a reference to a
6598              GP relative symbol, we want
6599                addu     $tempreg,$breg,$gp
6600                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
6601              Otherwise we want
6602                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6603                addu     $tempreg,$tempreg,$breg
6604                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6605              With a constant we always use the latter case.
6606
6607              With 64bit address space and no base register and $at usable,
6608              we want
6609                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6610                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6611                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6612                dsll32   $tempreg,0
6613                daddu    $tempreg,$at
6614                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6615              If we have a base register, we want
6616                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6617                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6618                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6619                daddu    $at,$breg
6620                dsll32   $tempreg,0
6621                daddu    $tempreg,$at
6622                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6623
6624              Without $at we can't generate the optimal path for superscalar
6625              processors here since this would require two temporary registers.
6626                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6627                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6628                dsll     $tempreg,16
6629                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6630                dsll     $tempreg,16
6631                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6632              If we have a base register, we want
6633                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6634                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6635                dsll     $tempreg,16
6636                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6637                dsll     $tempreg,16
6638                daddu    $tempreg,$tempreg,$breg
6639                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6640
6641              For GP relative symbols in 64bit address space we can use
6642              the same sequence as in 32bit address space.  */
6643           if (HAVE_64BIT_SYMBOLS)
6644             {
6645               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6646                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6647                 {
6648                   relax_start (offset_expr.X_add_symbol);
6649                   if (breg == 0)
6650                     {
6651                       macro_build (&offset_expr, s, fmt, treg,
6652                                    BFD_RELOC_GPREL16, mips_gp_register);
6653                     }
6654                   else
6655                     {
6656                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6657                                    tempreg, breg, mips_gp_register);
6658                       macro_build (&offset_expr, s, fmt, treg,
6659                                    BFD_RELOC_GPREL16, tempreg);
6660                     }
6661                   relax_switch ();
6662                 }
6663
6664               if (used_at == 0 && mips_opts.at)
6665                 {
6666                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6667                                BFD_RELOC_MIPS_HIGHEST);
6668                   macro_build (&offset_expr, "lui", "t,u", AT,
6669                                BFD_RELOC_HI16_S);
6670                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6671                                tempreg, BFD_RELOC_MIPS_HIGHER);
6672                   if (breg != 0)
6673                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6674                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6675                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6676                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6677                                tempreg);
6678                   used_at = 1;
6679                 }
6680               else
6681                 {
6682                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6683                                BFD_RELOC_MIPS_HIGHEST);
6684                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6685                                tempreg, BFD_RELOC_MIPS_HIGHER);
6686                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6687                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6688                                tempreg, BFD_RELOC_HI16_S);
6689                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6690                   if (breg != 0)
6691                     macro_build (NULL, "daddu", "d,v,t",
6692                                  tempreg, tempreg, breg);
6693                   macro_build (&offset_expr, s, fmt, treg,
6694                                BFD_RELOC_LO16, tempreg);
6695                 }
6696
6697               if (mips_relax.sequence)
6698                 relax_end ();
6699               break;
6700             }
6701
6702           if (breg == 0)
6703             {
6704               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6705                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6706                 {
6707                   relax_start (offset_expr.X_add_symbol);
6708                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6709                                mips_gp_register);
6710                   relax_switch ();
6711                 }
6712               macro_build_lui (&offset_expr, tempreg);
6713               macro_build (&offset_expr, s, fmt, treg,
6714                            BFD_RELOC_LO16, tempreg);
6715               if (mips_relax.sequence)
6716                 relax_end ();
6717             }
6718           else
6719             {
6720               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6721                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6722                 {
6723                   relax_start (offset_expr.X_add_symbol);
6724                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6725                                tempreg, breg, mips_gp_register);
6726                   macro_build (&offset_expr, s, fmt, treg,
6727                                BFD_RELOC_GPREL16, tempreg);
6728                   relax_switch ();
6729                 }
6730               macro_build_lui (&offset_expr, tempreg);
6731               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6732                            tempreg, tempreg, breg);
6733               macro_build (&offset_expr, s, fmt, treg,
6734                            BFD_RELOC_LO16, tempreg);
6735               if (mips_relax.sequence)
6736                 relax_end ();
6737             }
6738         }
6739       else if (!mips_big_got)
6740         {
6741           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6742
6743           /* If this is a reference to an external symbol, we want
6744                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6745                nop
6746                <op>     $treg,0($tempreg)
6747              Otherwise we want
6748                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6749                nop
6750                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6751                <op>     $treg,0($tempreg)
6752
6753              For NewABI, we want
6754                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6755                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6756
6757              If there is a base register, we add it to $tempreg before
6758              the <op>.  If there is a constant, we stick it in the
6759              <op> instruction.  We don't handle constants larger than
6760              16 bits, because we have no way to load the upper 16 bits
6761              (actually, we could handle them for the subset of cases
6762              in which we are not using $at).  */
6763           gas_assert (offset_expr.X_op == O_symbol);
6764           if (HAVE_NEWABI)
6765             {
6766               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6767                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6768               if (breg != 0)
6769                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6770                              tempreg, tempreg, breg);
6771               macro_build (&offset_expr, s, fmt, treg,
6772                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
6773               break;
6774             }
6775           expr1.X_add_number = offset_expr.X_add_number;
6776           offset_expr.X_add_number = 0;
6777           if (expr1.X_add_number < -0x8000
6778               || expr1.X_add_number >= 0x8000)
6779             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6780           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6781                        lw_reloc_type, mips_gp_register);
6782           load_delay_nop ();
6783           relax_start (offset_expr.X_add_symbol);
6784           relax_switch ();
6785           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6786                        tempreg, BFD_RELOC_LO16);
6787           relax_end ();
6788           if (breg != 0)
6789             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6790                          tempreg, tempreg, breg);
6791           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6792         }
6793       else if (mips_big_got && !HAVE_NEWABI)
6794         {
6795           int gpdelay;
6796
6797           /* If this is a reference to an external symbol, we want
6798                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6799                addu     $tempreg,$tempreg,$gp
6800                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6801                <op>     $treg,0($tempreg)
6802              Otherwise we want
6803                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6804                nop
6805                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6806                <op>     $treg,0($tempreg)
6807              If there is a base register, we add it to $tempreg before
6808              the <op>.  If there is a constant, we stick it in the
6809              <op> instruction.  We don't handle constants larger than
6810              16 bits, because we have no way to load the upper 16 bits
6811              (actually, we could handle them for the subset of cases
6812              in which we are not using $at).  */
6813           gas_assert (offset_expr.X_op == O_symbol);
6814           expr1.X_add_number = offset_expr.X_add_number;
6815           offset_expr.X_add_number = 0;
6816           if (expr1.X_add_number < -0x8000
6817               || expr1.X_add_number >= 0x8000)
6818             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6819           gpdelay = reg_needs_delay (mips_gp_register);
6820           relax_start (offset_expr.X_add_symbol);
6821           macro_build (&offset_expr, "lui", "t,u", tempreg,
6822                        BFD_RELOC_MIPS_GOT_HI16);
6823           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6824                        mips_gp_register);
6825           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6826                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6827           relax_switch ();
6828           if (gpdelay)
6829             macro_build (NULL, "nop", "");
6830           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6831                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6832           load_delay_nop ();
6833           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6834                        tempreg, BFD_RELOC_LO16);
6835           relax_end ();
6836
6837           if (breg != 0)
6838             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6839                          tempreg, tempreg, breg);
6840           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6841         }
6842       else if (mips_big_got && HAVE_NEWABI)
6843         {
6844           /* If this is a reference to an external symbol, we want
6845                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6846                add      $tempreg,$tempreg,$gp
6847                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6848                <op>     $treg,<ofst>($tempreg)
6849              Otherwise, for local symbols, we want:
6850                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6851                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
6852           gas_assert (offset_expr.X_op == O_symbol);
6853           expr1.X_add_number = offset_expr.X_add_number;
6854           offset_expr.X_add_number = 0;
6855           if (expr1.X_add_number < -0x8000
6856               || expr1.X_add_number >= 0x8000)
6857             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6858           relax_start (offset_expr.X_add_symbol);
6859           macro_build (&offset_expr, "lui", "t,u", tempreg,
6860                        BFD_RELOC_MIPS_GOT_HI16);
6861           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6862                        mips_gp_register);
6863           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6864                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6865           if (breg != 0)
6866             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6867                          tempreg, tempreg, breg);
6868           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6869
6870           relax_switch ();
6871           offset_expr.X_add_number = expr1.X_add_number;
6872           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6873                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6874           if (breg != 0)
6875             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6876                          tempreg, tempreg, breg);
6877           macro_build (&offset_expr, s, fmt, treg,
6878                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
6879           relax_end ();
6880         }
6881       else
6882         abort ();
6883
6884       break;
6885
6886     case M_LI:
6887     case M_LI_S:
6888       load_register (treg, &imm_expr, 0);
6889       break;
6890
6891     case M_DLI:
6892       load_register (treg, &imm_expr, 1);
6893       break;
6894
6895     case M_LI_SS:
6896       if (imm_expr.X_op == O_constant)
6897         {
6898           used_at = 1;
6899           load_register (AT, &imm_expr, 0);
6900           macro_build (NULL, "mtc1", "t,G", AT, treg);
6901           break;
6902         }
6903       else
6904         {
6905           gas_assert (offset_expr.X_op == O_symbol
6906                   && strcmp (segment_name (S_GET_SEGMENT
6907                                            (offset_expr.X_add_symbol)),
6908                              ".lit4") == 0
6909                   && offset_expr.X_add_number == 0);
6910           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6911                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6912           break;
6913         }
6914
6915     case M_LI_D:
6916       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6917          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6918          order 32 bits of the value and the low order 32 bits are either
6919          zero or in OFFSET_EXPR.  */
6920       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6921         {
6922           if (HAVE_64BIT_GPRS)
6923             load_register (treg, &imm_expr, 1);
6924           else
6925             {
6926               int hreg, lreg;
6927
6928               if (target_big_endian)
6929                 {
6930                   hreg = treg;
6931                   lreg = treg + 1;
6932                 }
6933               else
6934                 {
6935                   hreg = treg + 1;
6936                   lreg = treg;
6937                 }
6938
6939               if (hreg <= 31)
6940                 load_register (hreg, &imm_expr, 0);
6941               if (lreg <= 31)
6942                 {
6943                   if (offset_expr.X_op == O_absent)
6944                     move_register (lreg, 0);
6945                   else
6946                     {
6947                       gas_assert (offset_expr.X_op == O_constant);
6948                       load_register (lreg, &offset_expr, 0);
6949                     }
6950                 }
6951             }
6952           break;
6953         }
6954
6955       /* We know that sym is in the .rdata section.  First we get the
6956          upper 16 bits of the address.  */
6957       if (mips_pic == NO_PIC)
6958         {
6959           macro_build_lui (&offset_expr, AT);
6960           used_at = 1;
6961         }
6962       else
6963         {
6964           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6965                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6966           used_at = 1;
6967         }
6968
6969       /* Now we load the register(s).  */
6970       if (HAVE_64BIT_GPRS)
6971         {
6972           used_at = 1;
6973           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6974         }
6975       else
6976         {
6977           used_at = 1;
6978           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6979           if (treg != RA)
6980             {
6981               /* FIXME: How in the world do we deal with the possible
6982                  overflow here?  */
6983               offset_expr.X_add_number += 4;
6984               macro_build (&offset_expr, "lw", "t,o(b)",
6985                            treg + 1, BFD_RELOC_LO16, AT);
6986             }
6987         }
6988       break;
6989
6990     case M_LI_DD:
6991       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
6992          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6993          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
6994          the value and the low order 32 bits are either zero or in
6995          OFFSET_EXPR.  */
6996       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6997         {
6998           used_at = 1;
6999           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
7000           if (HAVE_64BIT_FPRS)
7001             {
7002               gas_assert (HAVE_64BIT_GPRS);
7003               macro_build (NULL, "dmtc1", "t,S", AT, treg);
7004             }
7005           else
7006             {
7007               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
7008               if (offset_expr.X_op == O_absent)
7009                 macro_build (NULL, "mtc1", "t,G", 0, treg);
7010               else
7011                 {
7012                   gas_assert (offset_expr.X_op == O_constant);
7013                   load_register (AT, &offset_expr, 0);
7014                   macro_build (NULL, "mtc1", "t,G", AT, treg);
7015                 }
7016             }
7017           break;
7018         }
7019
7020       gas_assert (offset_expr.X_op == O_symbol
7021               && offset_expr.X_add_number == 0);
7022       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
7023       if (strcmp (s, ".lit8") == 0)
7024         {
7025           if (mips_opts.isa != ISA_MIPS1)
7026             {
7027               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
7028                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
7029               break;
7030             }
7031           breg = mips_gp_register;
7032           r = BFD_RELOC_MIPS_LITERAL;
7033           goto dob;
7034         }
7035       else
7036         {
7037           gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
7038           used_at = 1;
7039           if (mips_pic != NO_PIC)
7040             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7041                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
7042           else
7043             {
7044               /* FIXME: This won't work for a 64 bit address.  */
7045               macro_build_lui (&offset_expr, AT);
7046             }
7047
7048           if (mips_opts.isa != ISA_MIPS1)
7049             {
7050               macro_build (&offset_expr, "ldc1", "T,o(b)",
7051                            treg, BFD_RELOC_LO16, AT);
7052               break;
7053             }
7054           breg = AT;
7055           r = BFD_RELOC_LO16;
7056           goto dob;
7057         }
7058
7059     case M_L_DOB:
7060       /* Even on a big endian machine $fn comes before $fn+1.  We have
7061          to adjust when loading from memory.  */
7062       r = BFD_RELOC_LO16;
7063     dob:
7064       gas_assert (mips_opts.isa == ISA_MIPS1);
7065       macro_build (&offset_expr, "lwc1", "T,o(b)",
7066                    target_big_endian ? treg + 1 : treg, r, breg);
7067       /* FIXME: A possible overflow which I don't know how to deal
7068          with.  */
7069       offset_expr.X_add_number += 4;
7070       macro_build (&offset_expr, "lwc1", "T,o(b)",
7071                    target_big_endian ? treg : treg + 1, r, breg);
7072       break;
7073
7074     case M_L_DAB:
7075       /*
7076        * The MIPS assembler seems to check for X_add_number not
7077        * being double aligned and generating:
7078        *        lui     at,%hi(foo+1)
7079        *        addu    at,at,v1
7080        *        addiu   at,at,%lo(foo+1)
7081        *        lwc1    f2,0(at)
7082        *        lwc1    f3,4(at)
7083        * But, the resulting address is the same after relocation so why
7084        * generate the extra instruction?
7085        */
7086       /* Itbl support may require additional care here.  */
7087       coproc = 1;
7088       if (mips_opts.isa != ISA_MIPS1)
7089         {
7090           s = "ldc1";
7091           goto ld;
7092         }
7093
7094       s = "lwc1";
7095       fmt = "T,o(b)";
7096       goto ldd_std;
7097
7098     case M_S_DAB:
7099       if (mips_opts.isa != ISA_MIPS1)
7100         {
7101           s = "sdc1";
7102           goto st;
7103         }
7104
7105       s = "swc1";
7106       fmt = "T,o(b)";
7107       /* Itbl support may require additional care here.  */
7108       coproc = 1;
7109       goto ldd_std;
7110
7111     case M_LD_AB:
7112       if (HAVE_64BIT_GPRS)
7113         {
7114           s = "ld";
7115           goto ld;
7116         }
7117
7118       s = "lw";
7119       fmt = "t,o(b)";
7120       goto ldd_std;
7121
7122     case M_SD_AB:
7123       if (HAVE_64BIT_GPRS)
7124         {
7125           s = "sd";
7126           goto st;
7127         }
7128
7129       s = "sw";
7130       fmt = "t,o(b)";
7131
7132     ldd_std:
7133       if (offset_expr.X_op != O_symbol
7134           && offset_expr.X_op != O_constant)
7135         {
7136           as_bad (_("expression too complex"));
7137           offset_expr.X_op = O_constant;
7138         }
7139
7140       if (HAVE_32BIT_ADDRESSES
7141           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7142         {
7143           char value [32];
7144
7145           sprintf_vma (value, offset_expr.X_add_number);
7146           as_bad (_("Number (0x%s) larger than 32 bits"), value);
7147         }
7148
7149       /* Even on a big endian machine $fn comes before $fn+1.  We have
7150          to adjust when loading from memory.  We set coproc if we must
7151          load $fn+1 first.  */
7152       /* Itbl support may require additional care here.  */
7153       if (! target_big_endian)
7154         coproc = 0;
7155
7156       if (mips_pic == NO_PIC
7157           || offset_expr.X_op == O_constant)
7158         {
7159           /* If this is a reference to a GP relative symbol, we want
7160                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
7161                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
7162              If we have a base register, we use this
7163                addu     $at,$breg,$gp
7164                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
7165                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
7166              If this is not a GP relative symbol, we want
7167                lui      $at,<sym>               (BFD_RELOC_HI16_S)
7168                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7169                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7170              If there is a base register, we add it to $at after the
7171              lui instruction.  If there is a constant, we always use
7172              the last case.  */
7173           if (offset_expr.X_op == O_symbol
7174               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7175               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7176             {
7177               relax_start (offset_expr.X_add_symbol);
7178               if (breg == 0)
7179                 {
7180                   tempreg = mips_gp_register;
7181                 }
7182               else
7183                 {
7184                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7185                                AT, breg, mips_gp_register);
7186                   tempreg = AT;
7187                   used_at = 1;
7188                 }
7189
7190               /* Itbl support may require additional care here.  */
7191               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7192                            BFD_RELOC_GPREL16, tempreg);
7193               offset_expr.X_add_number += 4;
7194
7195               /* Set mips_optimize to 2 to avoid inserting an
7196                  undesired nop.  */
7197               hold_mips_optimize = mips_optimize;
7198               mips_optimize = 2;
7199               /* Itbl support may require additional care here.  */
7200               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7201                            BFD_RELOC_GPREL16, tempreg);
7202               mips_optimize = hold_mips_optimize;
7203
7204               relax_switch ();
7205
7206               /* We just generated two relocs.  When tc_gen_reloc
7207                  handles this case, it will skip the first reloc and
7208                  handle the second.  The second reloc already has an
7209                  extra addend of 4, which we added above.  We must
7210                  subtract it out, and then subtract another 4 to make
7211                  the first reloc come out right.  The second reloc
7212                  will come out right because we are going to add 4 to
7213                  offset_expr when we build its instruction below.
7214
7215                  If we have a symbol, then we don't want to include
7216                  the offset, because it will wind up being included
7217                  when we generate the reloc.  */
7218
7219               if (offset_expr.X_op == O_constant)
7220                 offset_expr.X_add_number -= 8;
7221               else
7222                 {
7223                   offset_expr.X_add_number = -4;
7224                   offset_expr.X_op = O_constant;
7225                 }
7226             }
7227           used_at = 1;
7228           macro_build_lui (&offset_expr, AT);
7229           if (breg != 0)
7230             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7231           /* Itbl support may require additional care here.  */
7232           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7233                        BFD_RELOC_LO16, AT);
7234           /* FIXME: How do we handle overflow here?  */
7235           offset_expr.X_add_number += 4;
7236           /* Itbl support may require additional care here.  */
7237           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7238                        BFD_RELOC_LO16, AT);
7239           if (mips_relax.sequence)
7240             relax_end ();
7241         }
7242       else if (!mips_big_got)
7243         {
7244           /* If this is a reference to an external symbol, we want
7245                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7246                nop
7247                <op>     $treg,0($at)
7248                <op>     $treg+1,4($at)
7249              Otherwise we want
7250                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7251                nop
7252                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7253                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7254              If there is a base register we add it to $at before the
7255              lwc1 instructions.  If there is a constant we include it
7256              in the lwc1 instructions.  */
7257           used_at = 1;
7258           expr1.X_add_number = offset_expr.X_add_number;
7259           if (expr1.X_add_number < -0x8000
7260               || expr1.X_add_number >= 0x8000 - 4)
7261             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7262           load_got_offset (AT, &offset_expr);
7263           load_delay_nop ();
7264           if (breg != 0)
7265             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7266
7267           /* Set mips_optimize to 2 to avoid inserting an undesired
7268              nop.  */
7269           hold_mips_optimize = mips_optimize;
7270           mips_optimize = 2;
7271
7272           /* Itbl support may require additional care here.  */
7273           relax_start (offset_expr.X_add_symbol);
7274           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7275                        BFD_RELOC_LO16, AT);
7276           expr1.X_add_number += 4;
7277           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7278                        BFD_RELOC_LO16, AT);
7279           relax_switch ();
7280           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7281                        BFD_RELOC_LO16, AT);
7282           offset_expr.X_add_number += 4;
7283           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7284                        BFD_RELOC_LO16, AT);
7285           relax_end ();
7286
7287           mips_optimize = hold_mips_optimize;
7288         }
7289       else if (mips_big_got)
7290         {
7291           int gpdelay;
7292
7293           /* If this is a reference to an external symbol, we want
7294                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
7295                addu     $at,$at,$gp
7296                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
7297                nop
7298                <op>     $treg,0($at)
7299                <op>     $treg+1,4($at)
7300              Otherwise we want
7301                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7302                nop
7303                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7304                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7305              If there is a base register we add it to $at before the
7306              lwc1 instructions.  If there is a constant we include it
7307              in the lwc1 instructions.  */
7308           used_at = 1;
7309           expr1.X_add_number = offset_expr.X_add_number;
7310           offset_expr.X_add_number = 0;
7311           if (expr1.X_add_number < -0x8000
7312               || expr1.X_add_number >= 0x8000 - 4)
7313             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7314           gpdelay = reg_needs_delay (mips_gp_register);
7315           relax_start (offset_expr.X_add_symbol);
7316           macro_build (&offset_expr, "lui", "t,u",
7317                        AT, BFD_RELOC_MIPS_GOT_HI16);
7318           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7319                        AT, AT, mips_gp_register);
7320           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7321                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7322           load_delay_nop ();
7323           if (breg != 0)
7324             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7325           /* Itbl support may require additional care here.  */
7326           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7327                        BFD_RELOC_LO16, AT);
7328           expr1.X_add_number += 4;
7329
7330           /* Set mips_optimize to 2 to avoid inserting an undesired
7331              nop.  */
7332           hold_mips_optimize = mips_optimize;
7333           mips_optimize = 2;
7334           /* Itbl support may require additional care here.  */
7335           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7336                        BFD_RELOC_LO16, AT);
7337           mips_optimize = hold_mips_optimize;
7338           expr1.X_add_number -= 4;
7339
7340           relax_switch ();
7341           offset_expr.X_add_number = expr1.X_add_number;
7342           if (gpdelay)
7343             macro_build (NULL, "nop", "");
7344           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7345                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
7346           load_delay_nop ();
7347           if (breg != 0)
7348             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7349           /* Itbl support may require additional care here.  */
7350           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7351                        BFD_RELOC_LO16, AT);
7352           offset_expr.X_add_number += 4;
7353
7354           /* Set mips_optimize to 2 to avoid inserting an undesired
7355              nop.  */
7356           hold_mips_optimize = mips_optimize;
7357           mips_optimize = 2;
7358           /* Itbl support may require additional care here.  */
7359           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7360                        BFD_RELOC_LO16, AT);
7361           mips_optimize = hold_mips_optimize;
7362           relax_end ();
7363         }
7364       else
7365         abort ();
7366
7367       break;
7368
7369     case M_LD_OB:
7370       s = "lw";
7371       goto sd_ob;
7372     case M_SD_OB:
7373       s = "sw";
7374     sd_ob:
7375       gas_assert (HAVE_32BIT_ADDRESSES);
7376       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7377       offset_expr.X_add_number += 4;
7378       macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
7379       break;
7380
7381    /* New code added to support COPZ instructions.
7382       This code builds table entries out of the macros in mip_opcodes.
7383       R4000 uses interlocks to handle coproc delays.
7384       Other chips (like the R3000) require nops to be inserted for delays.
7385
7386       FIXME: Currently, we require that the user handle delays.
7387       In order to fill delay slots for non-interlocked chips,
7388       we must have a way to specify delays based on the coprocessor.
7389       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7390       What are the side-effects of the cop instruction?
7391       What cache support might we have and what are its effects?
7392       Both coprocessor & memory require delays. how long???
7393       What registers are read/set/modified?
7394
7395       If an itbl is provided to interpret cop instructions,
7396       this knowledge can be encoded in the itbl spec.  */
7397
7398     case M_COP0:
7399       s = "c0";
7400       goto copz;
7401     case M_COP1:
7402       s = "c1";
7403       goto copz;
7404     case M_COP2:
7405       s = "c2";
7406       goto copz;
7407     case M_COP3:
7408       s = "c3";
7409     copz:
7410       if (NO_ISA_COP (mips_opts.arch)
7411           && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
7412         {
7413           as_bad (_("opcode not supported on this processor: %s"),
7414                   mips_cpu_info_from_arch (mips_opts.arch)->name);
7415           break;
7416         }
7417
7418       /* For now we just do C (same as Cz).  The parameter will be
7419          stored in insn_opcode by mips_ip.  */
7420       macro_build (NULL, s, "C", ip->insn_opcode);
7421       break;
7422
7423     case M_MOVE:
7424       move_register (dreg, sreg);
7425       break;
7426
7427 #ifdef LOSING_COMPILER
7428     default:
7429       /* Try and see if this is a new itbl instruction.
7430          This code builds table entries out of the macros in mip_opcodes.
7431          FIXME: For now we just assemble the expression and pass it's
7432          value along as a 32-bit immediate.
7433          We may want to have the assembler assemble this value,
7434          so that we gain the assembler's knowledge of delay slots,
7435          symbols, etc.
7436          Would it be more efficient to use mask (id) here? */
7437       if (itbl_have_entries
7438           && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
7439         {
7440           s = ip->insn_mo->name;
7441           s2 = "cop3";
7442           coproc = ITBL_DECODE_PNUM (immed_expr);;
7443           macro_build (&immed_expr, s, "C");
7444           break;
7445         }
7446       macro2 (ip);
7447       break;
7448     }
7449   if (!mips_opts.at && used_at)
7450     as_bad (_("Macro used $at after \".set noat\""));
7451 }
7452
7453 static void
7454 macro2 (struct mips_cl_insn *ip)
7455 {
7456   unsigned int treg, sreg, dreg, breg;
7457   unsigned int tempreg;
7458   int mask;
7459   int used_at;
7460   expressionS expr1;
7461   const char *s;
7462   const char *s2;
7463   const char *fmt;
7464   int likely = 0;
7465   int dbl = 0;
7466   int coproc = 0;
7467   int lr = 0;
7468   int imm = 0;
7469   int off;
7470   offsetT maxnum;
7471   bfd_reloc_code_real_type r;
7472
7473   treg = (ip->insn_opcode >> 16) & 0x1f;
7474   dreg = (ip->insn_opcode >> 11) & 0x1f;
7475   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7476   mask = ip->insn_mo->mask;
7477
7478   expr1.X_op = O_constant;
7479   expr1.X_op_symbol = NULL;
7480   expr1.X_add_symbol = NULL;
7481   expr1.X_add_number = 1;
7482
7483   switch (mask)
7484     {
7485 #endif /* LOSING_COMPILER */
7486
7487     case M_DMUL:
7488       dbl = 1;
7489     case M_MUL:
7490       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7491       macro_build (NULL, "mflo", "d", dreg);
7492       break;
7493
7494     case M_DMUL_I:
7495       dbl = 1;
7496     case M_MUL_I:
7497       /* The MIPS assembler some times generates shifts and adds.  I'm
7498          not trying to be that fancy. GCC should do this for us
7499          anyway.  */
7500       used_at = 1;
7501       load_register (AT, &imm_expr, dbl);
7502       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7503       macro_build (NULL, "mflo", "d", dreg);
7504       break;
7505
7506     case M_DMULO_I:
7507       dbl = 1;
7508     case M_MULO_I:
7509       imm = 1;
7510       goto do_mulo;
7511
7512     case M_DMULO:
7513       dbl = 1;
7514     case M_MULO:
7515     do_mulo:
7516       start_noreorder ();
7517       used_at = 1;
7518       if (imm)
7519         load_register (AT, &imm_expr, dbl);
7520       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7521       macro_build (NULL, "mflo", "d", dreg);
7522       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7523       macro_build (NULL, "mfhi", "d", AT);
7524       if (mips_trap)
7525         macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7526       else
7527         {
7528           expr1.X_add_number = 8;
7529           macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7530           macro_build (NULL, "nop", "", 0);
7531           macro_build (NULL, "break", "c", 6);
7532         }
7533       end_noreorder ();
7534       macro_build (NULL, "mflo", "d", dreg);
7535       break;
7536
7537     case M_DMULOU_I:
7538       dbl = 1;
7539     case M_MULOU_I:
7540       imm = 1;
7541       goto do_mulou;
7542
7543     case M_DMULOU:
7544       dbl = 1;
7545     case M_MULOU:
7546     do_mulou:
7547       start_noreorder ();
7548       used_at = 1;
7549       if (imm)
7550         load_register (AT, &imm_expr, dbl);
7551       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7552                    sreg, imm ? AT : treg);
7553       macro_build (NULL, "mfhi", "d", AT);
7554       macro_build (NULL, "mflo", "d", dreg);
7555       if (mips_trap)
7556         macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7557       else
7558         {
7559           expr1.X_add_number = 8;
7560           macro_build (&expr1, "beq", "s,t,p", AT, 0);
7561           macro_build (NULL, "nop", "", 0);
7562           macro_build (NULL, "break", "c", 6);
7563         }
7564       end_noreorder ();
7565       break;
7566
7567     case M_DROL:
7568       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7569         {
7570           if (dreg == sreg)
7571             {
7572               tempreg = AT;
7573               used_at = 1;
7574             }
7575           else
7576             {
7577               tempreg = dreg;
7578             }
7579           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7580           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7581           break;
7582         }
7583       used_at = 1;
7584       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7585       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7586       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7587       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7588       break;
7589
7590     case M_ROL:
7591       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7592         {
7593           if (dreg == sreg)
7594             {
7595               tempreg = AT;
7596               used_at = 1;
7597             }
7598           else
7599             {
7600               tempreg = dreg;
7601             }
7602           macro_build (NULL, "negu", "d,w", tempreg, treg);
7603           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7604           break;
7605         }
7606       used_at = 1;
7607       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7608       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7609       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7610       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7611       break;
7612
7613     case M_DROL_I:
7614       {
7615         unsigned int rot;
7616         char *l;
7617         char *rr;
7618
7619         if (imm_expr.X_op != O_constant)
7620           as_bad (_("Improper rotate count"));
7621         rot = imm_expr.X_add_number & 0x3f;
7622         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7623           {
7624             rot = (64 - rot) & 0x3f;
7625             if (rot >= 32)
7626               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7627             else
7628               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7629             break;
7630           }
7631         if (rot == 0)
7632           {
7633             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7634             break;
7635           }
7636         l = (rot < 0x20) ? "dsll" : "dsll32";
7637         rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7638         rot &= 0x1f;
7639         used_at = 1;
7640         macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7641         macro_build (NULL, rr, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7642         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7643       }
7644       break;
7645
7646     case M_ROL_I:
7647       {
7648         unsigned int rot;
7649
7650         if (imm_expr.X_op != O_constant)
7651           as_bad (_("Improper rotate count"));
7652         rot = imm_expr.X_add_number & 0x1f;
7653         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7654           {
7655             macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7656             break;
7657           }
7658         if (rot == 0)
7659           {
7660             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7661             break;
7662           }
7663         used_at = 1;
7664         macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7665         macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7666         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7667       }
7668       break;
7669
7670     case M_DROR:
7671       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7672         {
7673           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7674           break;
7675         }
7676       used_at = 1;
7677       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7678       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7679       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7680       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7681       break;
7682
7683     case M_ROR:
7684       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7685         {
7686           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7687           break;
7688         }
7689       used_at = 1;
7690       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7691       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7692       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7693       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7694       break;
7695
7696     case M_DROR_I:
7697       {
7698         unsigned int rot;
7699         char *l;
7700         char *rr;
7701
7702         if (imm_expr.X_op != O_constant)
7703           as_bad (_("Improper rotate count"));
7704         rot = imm_expr.X_add_number & 0x3f;
7705         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7706           {
7707             if (rot >= 32)
7708               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7709             else
7710               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7711             break;
7712           }
7713         if (rot == 0)
7714           {
7715             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7716             break;
7717           }
7718         rr = (rot < 0x20) ? "dsrl" : "dsrl32";
7719         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7720         rot &= 0x1f;
7721         used_at = 1;
7722         macro_build (NULL, rr, "d,w,<", AT, sreg, rot);
7723         macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7724         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7725       }
7726       break;
7727
7728     case M_ROR_I:
7729       {
7730         unsigned int rot;
7731
7732         if (imm_expr.X_op != O_constant)
7733           as_bad (_("Improper rotate count"));
7734         rot = imm_expr.X_add_number & 0x1f;
7735         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7736           {
7737             macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7738             break;
7739           }
7740         if (rot == 0)
7741           {
7742             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7743             break;
7744           }
7745         used_at = 1;
7746         macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7747         macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7748         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7749       }
7750       break;
7751
7752     case M_S_DOB:
7753       gas_assert (mips_opts.isa == ISA_MIPS1);
7754       /* Even on a big endian machine $fn comes before $fn+1.  We have
7755          to adjust when storing to memory.  */
7756       macro_build (&offset_expr, "swc1", "T,o(b)",
7757                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7758       offset_expr.X_add_number += 4;
7759       macro_build (&offset_expr, "swc1", "T,o(b)",
7760                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7761       break;
7762
7763     case M_SEQ:
7764       if (sreg == 0)
7765         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7766       else if (treg == 0)
7767         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7768       else
7769         {
7770           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7771           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7772         }
7773       break;
7774
7775     case M_SEQ_I:
7776       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7777         {
7778           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7779           break;
7780         }
7781       if (sreg == 0)
7782         {
7783           as_warn (_("Instruction %s: result is always false"),
7784                    ip->insn_mo->name);
7785           move_register (dreg, 0);
7786           break;
7787         }
7788       if (CPU_HAS_SEQ (mips_opts.arch)
7789           && -512 <= imm_expr.X_add_number
7790           && imm_expr.X_add_number < 512)
7791         {
7792           macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
7793                        (int) imm_expr.X_add_number);
7794           break;
7795         }
7796       if (imm_expr.X_op == O_constant
7797           && imm_expr.X_add_number >= 0
7798           && imm_expr.X_add_number < 0x10000)
7799         {
7800           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7801         }
7802       else if (imm_expr.X_op == O_constant
7803                && imm_expr.X_add_number > -0x8000
7804                && imm_expr.X_add_number < 0)
7805         {
7806           imm_expr.X_add_number = -imm_expr.X_add_number;
7807           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7808                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7809         }
7810       else if (CPU_HAS_SEQ (mips_opts.arch))
7811         {
7812           used_at = 1;
7813           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7814           macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
7815           break;
7816         }
7817       else
7818         {
7819           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7820           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7821           used_at = 1;
7822         }
7823       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7824       break;
7825
7826     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7827       s = "slt";
7828       goto sge;
7829     case M_SGEU:
7830       s = "sltu";
7831     sge:
7832       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7833       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7834       break;
7835
7836     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7837     case M_SGEU_I:
7838       if (imm_expr.X_op == O_constant
7839           && imm_expr.X_add_number >= -0x8000
7840           && imm_expr.X_add_number < 0x8000)
7841         {
7842           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7843                        dreg, sreg, BFD_RELOC_LO16);
7844         }
7845       else
7846         {
7847           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7848           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7849                        dreg, sreg, AT);
7850           used_at = 1;
7851         }
7852       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7853       break;
7854
7855     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
7856       s = "slt";
7857       goto sgt;
7858     case M_SGTU:
7859       s = "sltu";
7860     sgt:
7861       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7862       break;
7863
7864     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
7865       s = "slt";
7866       goto sgti;
7867     case M_SGTU_I:
7868       s = "sltu";
7869     sgti:
7870       used_at = 1;
7871       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7872       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7873       break;
7874
7875     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7876       s = "slt";
7877       goto sle;
7878     case M_SLEU:
7879       s = "sltu";
7880     sle:
7881       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7882       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7883       break;
7884
7885     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7886       s = "slt";
7887       goto slei;
7888     case M_SLEU_I:
7889       s = "sltu";
7890     slei:
7891       used_at = 1;
7892       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7893       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7894       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7895       break;
7896
7897     case M_SLT_I:
7898       if (imm_expr.X_op == O_constant
7899           && imm_expr.X_add_number >= -0x8000
7900           && imm_expr.X_add_number < 0x8000)
7901         {
7902           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7903           break;
7904         }
7905       used_at = 1;
7906       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7907       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7908       break;
7909
7910     case M_SLTU_I:
7911       if (imm_expr.X_op == O_constant
7912           && imm_expr.X_add_number >= -0x8000
7913           && imm_expr.X_add_number < 0x8000)
7914         {
7915           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7916                        BFD_RELOC_LO16);
7917           break;
7918         }
7919       used_at = 1;
7920       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7921       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7922       break;
7923
7924     case M_SNE:
7925       if (sreg == 0)
7926         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7927       else if (treg == 0)
7928         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7929       else
7930         {
7931           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7932           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7933         }
7934       break;
7935
7936     case M_SNE_I:
7937       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7938         {
7939           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7940           break;
7941         }
7942       if (sreg == 0)
7943         {
7944           as_warn (_("Instruction %s: result is always true"),
7945                    ip->insn_mo->name);
7946           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7947                        dreg, 0, BFD_RELOC_LO16);
7948           break;
7949         }
7950       if (CPU_HAS_SEQ (mips_opts.arch)
7951           && -512 <= imm_expr.X_add_number
7952           && imm_expr.X_add_number < 512)
7953         {
7954           macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
7955                        (int) imm_expr.X_add_number);
7956           break;
7957         }
7958       if (imm_expr.X_op == O_constant
7959           && imm_expr.X_add_number >= 0
7960           && imm_expr.X_add_number < 0x10000)
7961         {
7962           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7963         }
7964       else if (imm_expr.X_op == O_constant
7965                && imm_expr.X_add_number > -0x8000
7966                && imm_expr.X_add_number < 0)
7967         {
7968           imm_expr.X_add_number = -imm_expr.X_add_number;
7969           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7970                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7971         }
7972       else if (CPU_HAS_SEQ (mips_opts.arch))
7973         {
7974           used_at = 1;
7975           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7976           macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
7977           break;
7978         }
7979       else
7980         {
7981           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7982           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7983           used_at = 1;
7984         }
7985       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7986       break;
7987
7988     case M_DSUB_I:
7989       dbl = 1;
7990     case M_SUB_I:
7991       if (imm_expr.X_op == O_constant
7992           && imm_expr.X_add_number > -0x8000
7993           && imm_expr.X_add_number <= 0x8000)
7994         {
7995           imm_expr.X_add_number = -imm_expr.X_add_number;
7996           macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7997                        dreg, sreg, BFD_RELOC_LO16);
7998           break;
7999         }
8000       used_at = 1;
8001       load_register (AT, &imm_expr, dbl);
8002       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
8003       break;
8004
8005     case M_DSUBU_I:
8006       dbl = 1;
8007     case M_SUBU_I:
8008       if (imm_expr.X_op == O_constant
8009           && imm_expr.X_add_number > -0x8000
8010           && imm_expr.X_add_number <= 0x8000)
8011         {
8012           imm_expr.X_add_number = -imm_expr.X_add_number;
8013           macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
8014                        dreg, sreg, BFD_RELOC_LO16);
8015           break;
8016         }
8017       used_at = 1;
8018       load_register (AT, &imm_expr, dbl);
8019       macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
8020       break;
8021
8022     case M_TEQ_I:
8023       s = "teq";
8024       goto trap;
8025     case M_TGE_I:
8026       s = "tge";
8027       goto trap;
8028     case M_TGEU_I:
8029       s = "tgeu";
8030       goto trap;
8031     case M_TLT_I:
8032       s = "tlt";
8033       goto trap;
8034     case M_TLTU_I:
8035       s = "tltu";
8036       goto trap;
8037     case M_TNE_I:
8038       s = "tne";
8039     trap:
8040       used_at = 1;
8041       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8042       macro_build (NULL, s, "s,t", sreg, AT);
8043       break;
8044
8045     case M_TRUNCWS:
8046     case M_TRUNCWD:
8047       gas_assert (mips_opts.isa == ISA_MIPS1);
8048       used_at = 1;
8049       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
8050       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
8051
8052       /*
8053        * Is the double cfc1 instruction a bug in the mips assembler;
8054        * or is there a reason for it?
8055        */
8056       start_noreorder ();
8057       macro_build (NULL, "cfc1", "t,G", treg, RA);
8058       macro_build (NULL, "cfc1", "t,G", treg, RA);
8059       macro_build (NULL, "nop", "");
8060       expr1.X_add_number = 3;
8061       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
8062       expr1.X_add_number = 2;
8063       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
8064       macro_build (NULL, "ctc1", "t,G", AT, RA);
8065       macro_build (NULL, "nop", "");
8066       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
8067                    dreg, sreg);
8068       macro_build (NULL, "ctc1", "t,G", treg, RA);
8069       macro_build (NULL, "nop", "");
8070       end_noreorder ();
8071       break;
8072
8073     case M_ULH:
8074       s = "lb";
8075       goto ulh;
8076     case M_ULHU:
8077       s = "lbu";
8078     ulh:
8079       used_at = 1;
8080       if (offset_expr.X_add_number >= 0x7fff)
8081         as_bad (_("operand overflow"));
8082       if (! target_big_endian)
8083         ++offset_expr.X_add_number;
8084       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
8085       if (! target_big_endian)
8086         --offset_expr.X_add_number;
8087       else
8088         ++offset_expr.X_add_number;
8089       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8090       macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
8091       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8092       break;
8093
8094     case M_ULD:
8095       s = "ldl";
8096       s2 = "ldr";
8097       off = 7;
8098       goto ulw;
8099     case M_ULW:
8100       s = "lwl";
8101       s2 = "lwr";
8102       off = 3;
8103     ulw:
8104       if (offset_expr.X_add_number >= 0x8000 - off)
8105         as_bad (_("operand overflow"));
8106       if (treg != breg)
8107         tempreg = treg;
8108       else
8109         {
8110           used_at = 1;
8111           tempreg = AT;
8112         }
8113       if (! target_big_endian)
8114         offset_expr.X_add_number += off;
8115       macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8116       if (! target_big_endian)
8117         offset_expr.X_add_number -= off;
8118       else
8119         offset_expr.X_add_number += off;
8120       macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8121
8122       /* If necessary, move the result in tempreg the final destination.  */
8123       if (treg == tempreg)
8124         break;
8125       /* Protect second load's delay slot.  */
8126       load_delay_nop ();
8127       move_register (treg, tempreg);
8128       break;
8129
8130     case M_ULD_A:
8131       s = "ldl";
8132       s2 = "ldr";
8133       off = 7;
8134       goto ulwa;
8135     case M_ULW_A:
8136       s = "lwl";
8137       s2 = "lwr";
8138       off = 3;
8139     ulwa:
8140       used_at = 1;
8141       load_address (AT, &offset_expr, &used_at);
8142       if (breg != 0)
8143         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8144       if (! target_big_endian)
8145         expr1.X_add_number = off;
8146       else
8147         expr1.X_add_number = 0;
8148       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8149       if (! target_big_endian)
8150         expr1.X_add_number = 0;
8151       else
8152         expr1.X_add_number = off;
8153       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8154       break;
8155
8156     case M_ULH_A:
8157     case M_ULHU_A:
8158       used_at = 1;
8159       load_address (AT, &offset_expr, &used_at);
8160       if (breg != 0)
8161         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8162       if (target_big_endian)
8163         expr1.X_add_number = 0;
8164       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
8165                    treg, BFD_RELOC_LO16, AT);
8166       if (target_big_endian)
8167         expr1.X_add_number = 1;
8168       else
8169         expr1.X_add_number = 0;
8170       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8171       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8172       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8173       break;
8174
8175     case M_USH:
8176       used_at = 1;
8177       if (offset_expr.X_add_number >= 0x7fff)
8178         as_bad (_("operand overflow"));
8179       if (target_big_endian)
8180         ++offset_expr.X_add_number;
8181       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8182       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
8183       if (target_big_endian)
8184         --offset_expr.X_add_number;
8185       else
8186         ++offset_expr.X_add_number;
8187       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
8188       break;
8189
8190     case M_USD:
8191       s = "sdl";
8192       s2 = "sdr";
8193       off = 7;
8194       goto usw;
8195     case M_USW:
8196       s = "swl";
8197       s2 = "swr";
8198       off = 3;
8199     usw:
8200       if (offset_expr.X_add_number >= 0x8000 - off)
8201         as_bad (_("operand overflow"));
8202       if (! target_big_endian)
8203         offset_expr.X_add_number += off;
8204       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8205       if (! target_big_endian)
8206         offset_expr.X_add_number -= off;
8207       else
8208         offset_expr.X_add_number += off;
8209       macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8210       break;
8211
8212     case M_USD_A:
8213       s = "sdl";
8214       s2 = "sdr";
8215       off = 7;
8216       goto uswa;
8217     case M_USW_A:
8218       s = "swl";
8219       s2 = "swr";
8220       off = 3;
8221     uswa:
8222       used_at = 1;
8223       load_address (AT, &offset_expr, &used_at);
8224       if (breg != 0)
8225         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8226       if (! target_big_endian)
8227         expr1.X_add_number = off;
8228       else
8229         expr1.X_add_number = 0;
8230       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8231       if (! target_big_endian)
8232         expr1.X_add_number = 0;
8233       else
8234         expr1.X_add_number = off;
8235       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8236       break;
8237
8238     case M_USH_A:
8239       used_at = 1;
8240       load_address (AT, &offset_expr, &used_at);
8241       if (breg != 0)
8242         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8243       if (! target_big_endian)
8244         expr1.X_add_number = 0;
8245       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8246       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
8247       if (! target_big_endian)
8248         expr1.X_add_number = 1;
8249       else
8250         expr1.X_add_number = 0;
8251       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8252       if (! target_big_endian)
8253         expr1.X_add_number = 0;
8254       else
8255         expr1.X_add_number = 1;
8256       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8257       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8258       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8259       break;
8260
8261     default:
8262       /* FIXME: Check if this is one of the itbl macros, since they
8263          are added dynamically.  */
8264       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8265       break;
8266     }
8267   if (!mips_opts.at && used_at)
8268     as_bad (_("Macro used $at after \".set noat\""));
8269 }
8270
8271 /* Implement macros in mips16 mode.  */
8272
8273 static void
8274 mips16_macro (struct mips_cl_insn *ip)
8275 {
8276   int mask;
8277   int xreg, yreg, zreg, tmp;
8278   expressionS expr1;
8279   int dbl;
8280   const char *s, *s2, *s3;
8281
8282   mask = ip->insn_mo->mask;
8283
8284   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8285   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8286   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
8287
8288   expr1.X_op = O_constant;
8289   expr1.X_op_symbol = NULL;
8290   expr1.X_add_symbol = NULL;
8291   expr1.X_add_number = 1;
8292
8293   dbl = 0;
8294
8295   switch (mask)
8296     {
8297     default:
8298       internalError ();
8299
8300     case M_DDIV_3:
8301       dbl = 1;
8302     case M_DIV_3:
8303       s = "mflo";
8304       goto do_div3;
8305     case M_DREM_3:
8306       dbl = 1;
8307     case M_REM_3:
8308       s = "mfhi";
8309     do_div3:
8310       start_noreorder ();
8311       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
8312       expr1.X_add_number = 2;
8313       macro_build (&expr1, "bnez", "x,p", yreg);
8314       macro_build (NULL, "break", "6", 7);
8315
8316       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8317          since that causes an overflow.  We should do that as well,
8318          but I don't see how to do the comparisons without a temporary
8319          register.  */
8320       end_noreorder ();
8321       macro_build (NULL, s, "x", zreg);
8322       break;
8323
8324     case M_DIVU_3:
8325       s = "divu";
8326       s2 = "mflo";
8327       goto do_divu3;
8328     case M_REMU_3:
8329       s = "divu";
8330       s2 = "mfhi";
8331       goto do_divu3;
8332     case M_DDIVU_3:
8333       s = "ddivu";
8334       s2 = "mflo";
8335       goto do_divu3;
8336     case M_DREMU_3:
8337       s = "ddivu";
8338       s2 = "mfhi";
8339     do_divu3:
8340       start_noreorder ();
8341       macro_build (NULL, s, "0,x,y", xreg, yreg);
8342       expr1.X_add_number = 2;
8343       macro_build (&expr1, "bnez", "x,p", yreg);
8344       macro_build (NULL, "break", "6", 7);
8345       end_noreorder ();
8346       macro_build (NULL, s2, "x", zreg);
8347       break;
8348
8349     case M_DMUL:
8350       dbl = 1;
8351     case M_MUL:
8352       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8353       macro_build (NULL, "mflo", "x", zreg);
8354       break;
8355
8356     case M_DSUBU_I:
8357       dbl = 1;
8358       goto do_subu;
8359     case M_SUBU_I:
8360     do_subu:
8361       if (imm_expr.X_op != O_constant)
8362         as_bad (_("Unsupported large constant"));
8363       imm_expr.X_add_number = -imm_expr.X_add_number;
8364       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8365       break;
8366
8367     case M_SUBU_I_2:
8368       if (imm_expr.X_op != O_constant)
8369         as_bad (_("Unsupported large constant"));
8370       imm_expr.X_add_number = -imm_expr.X_add_number;
8371       macro_build (&imm_expr, "addiu", "x,k", xreg);
8372       break;
8373
8374     case M_DSUBU_I_2:
8375       if (imm_expr.X_op != O_constant)
8376         as_bad (_("Unsupported large constant"));
8377       imm_expr.X_add_number = -imm_expr.X_add_number;
8378       macro_build (&imm_expr, "daddiu", "y,j", yreg);
8379       break;
8380
8381     case M_BEQ:
8382       s = "cmp";
8383       s2 = "bteqz";
8384       goto do_branch;
8385     case M_BNE:
8386       s = "cmp";
8387       s2 = "btnez";
8388       goto do_branch;
8389     case M_BLT:
8390       s = "slt";
8391       s2 = "btnez";
8392       goto do_branch;
8393     case M_BLTU:
8394       s = "sltu";
8395       s2 = "btnez";
8396       goto do_branch;
8397     case M_BLE:
8398       s = "slt";
8399       s2 = "bteqz";
8400       goto do_reverse_branch;
8401     case M_BLEU:
8402       s = "sltu";
8403       s2 = "bteqz";
8404       goto do_reverse_branch;
8405     case M_BGE:
8406       s = "slt";
8407       s2 = "bteqz";
8408       goto do_branch;
8409     case M_BGEU:
8410       s = "sltu";
8411       s2 = "bteqz";
8412       goto do_branch;
8413     case M_BGT:
8414       s = "slt";
8415       s2 = "btnez";
8416       goto do_reverse_branch;
8417     case M_BGTU:
8418       s = "sltu";
8419       s2 = "btnez";
8420
8421     do_reverse_branch:
8422       tmp = xreg;
8423       xreg = yreg;
8424       yreg = tmp;
8425
8426     do_branch:
8427       macro_build (NULL, s, "x,y", xreg, yreg);
8428       macro_build (&offset_expr, s2, "p");
8429       break;
8430
8431     case M_BEQ_I:
8432       s = "cmpi";
8433       s2 = "bteqz";
8434       s3 = "x,U";
8435       goto do_branch_i;
8436     case M_BNE_I:
8437       s = "cmpi";
8438       s2 = "btnez";
8439       s3 = "x,U";
8440       goto do_branch_i;
8441     case M_BLT_I:
8442       s = "slti";
8443       s2 = "btnez";
8444       s3 = "x,8";
8445       goto do_branch_i;
8446     case M_BLTU_I:
8447       s = "sltiu";
8448       s2 = "btnez";
8449       s3 = "x,8";
8450       goto do_branch_i;
8451     case M_BLE_I:
8452       s = "slti";
8453       s2 = "btnez";
8454       s3 = "x,8";
8455       goto do_addone_branch_i;
8456     case M_BLEU_I:
8457       s = "sltiu";
8458       s2 = "btnez";
8459       s3 = "x,8";
8460       goto do_addone_branch_i;
8461     case M_BGE_I:
8462       s = "slti";
8463       s2 = "bteqz";
8464       s3 = "x,8";
8465       goto do_branch_i;
8466     case M_BGEU_I:
8467       s = "sltiu";
8468       s2 = "bteqz";
8469       s3 = "x,8";
8470       goto do_branch_i;
8471     case M_BGT_I:
8472       s = "slti";
8473       s2 = "bteqz";
8474       s3 = "x,8";
8475       goto do_addone_branch_i;
8476     case M_BGTU_I:
8477       s = "sltiu";
8478       s2 = "bteqz";
8479       s3 = "x,8";
8480
8481     do_addone_branch_i:
8482       if (imm_expr.X_op != O_constant)
8483         as_bad (_("Unsupported large constant"));
8484       ++imm_expr.X_add_number;
8485
8486     do_branch_i:
8487       macro_build (&imm_expr, s, s3, xreg);
8488       macro_build (&offset_expr, s2, "p");
8489       break;
8490
8491     case M_ABS:
8492       expr1.X_add_number = 0;
8493       macro_build (&expr1, "slti", "x,8", yreg);
8494       if (xreg != yreg)
8495         move_register (xreg, yreg);
8496       expr1.X_add_number = 2;
8497       macro_build (&expr1, "bteqz", "p");
8498       macro_build (NULL, "neg", "x,w", xreg, xreg);
8499     }
8500 }
8501
8502 /* For consistency checking, verify that all bits are specified either
8503    by the match/mask part of the instruction definition, or by the
8504    operand list.  */
8505 static int
8506 validate_mips_insn (const struct mips_opcode *opc)
8507 {
8508   const char *p = opc->args;
8509   char c;
8510   unsigned long used_bits = opc->mask;
8511
8512   if ((used_bits & opc->match) != opc->match)
8513     {
8514       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8515               opc->name, opc->args);
8516       return 0;
8517     }
8518 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
8519   while (*p)
8520     switch (c = *p++)
8521       {
8522       case ',': break;
8523       case '(': break;
8524       case ')': break;
8525       case '+':
8526         switch (c = *p++)
8527           {
8528           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
8529           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
8530           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
8531           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
8532           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8533           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8534           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8535           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
8536                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8537           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8538           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8539           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8540           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8541           case 'I': break;
8542           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
8543           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
8544                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8545           case 'x': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8546           case 'X': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8547           case 'p': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8548           case 'P': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8549           case 'Q': USE_BITS (OP_MASK_SEQI,     OP_SH_SEQI);    break;
8550           case 's': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8551           case 'S': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8552
8553           default:
8554             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8555                     c, opc->name, opc->args);
8556             return 0;
8557           }
8558         break;
8559       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8560       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8561       case 'A': break;
8562       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8563       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
8564       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8565       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8566       case 'F': break;
8567       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8568       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
8569       case 'I': break;
8570       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8571       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8572       case 'L': break;
8573       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
8574       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
8575       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
8576       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
8577                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8578       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
8579       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8580       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8581       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8582       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8583       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8584       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8585       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8586       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
8587       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8588       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
8589       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8590       case 'f': break;
8591       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
8592       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8593       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8594       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
8595       case 'l': break;
8596       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8597       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8598       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8599       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8600       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8601       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8602       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8603       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8604       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8605       case 'x': break;
8606       case 'z': break;
8607       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
8608       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8609                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8610       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
8611       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
8612       case '[': break;
8613       case ']': break;
8614       case '1': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8615       case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
8616       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
8617       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
8618       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
8619       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8620       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
8621       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
8622       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
8623       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
8624       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
8625       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
8626       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
8627       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
8628       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
8629       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
8630       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
8631       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8632       default:
8633         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8634                 c, opc->name, opc->args);
8635         return 0;
8636       }
8637 #undef USE_BITS
8638   if (used_bits != 0xffffffff)
8639     {
8640       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8641               ~used_bits & 0xffffffff, opc->name, opc->args);
8642       return 0;
8643     }
8644   return 1;
8645 }
8646
8647 /* UDI immediates.  */
8648 struct mips_immed {
8649   char          type;
8650   unsigned int  shift;
8651   unsigned long mask;
8652   const char *  desc;
8653 };
8654
8655 static const struct mips_immed mips_immed[] = {
8656   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
8657   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
8658   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
8659   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
8660   { 0,0,0,0 }
8661 };
8662
8663 /* Check whether an odd floating-point register is allowed.  */
8664 static int
8665 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8666 {
8667   const char *s = insn->name;
8668
8669   if (insn->pinfo == INSN_MACRO)
8670     /* Let a macro pass, we'll catch it later when it is expanded.  */
8671     return 1;
8672
8673   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8674     {
8675       /* Allow odd registers for single-precision ops.  */
8676       switch (insn->pinfo & (FP_S | FP_D))
8677         {
8678         case FP_S:
8679         case 0:
8680           return 1;     /* both single precision - ok */
8681         case FP_D:
8682           return 0;     /* both double precision - fail */
8683         default:
8684           break;
8685         }
8686
8687       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
8688       s = strchr (insn->name, '.');
8689       if (argnum == 2)
8690         s = s != NULL ? strchr (s + 1, '.') : NULL;
8691       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8692     } 
8693
8694   /* Single-precision coprocessor loads and moves are OK too.  */
8695   if ((insn->pinfo & FP_S)
8696       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8697                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8698     return 1;
8699
8700   return 0;
8701 }
8702
8703 /* This routine assembles an instruction into its binary format.  As a
8704    side effect, it sets one of the global variables imm_reloc or
8705    offset_reloc to the type of relocation to do if one of the operands
8706    is an address expression.  */
8707
8708 static void
8709 mips_ip (char *str, struct mips_cl_insn *ip)
8710 {
8711   char *s;
8712   const char *args;
8713   char c = 0;
8714   struct mips_opcode *insn;
8715   char *argsStart;
8716   unsigned int regno;
8717   unsigned int lastregno = 0;
8718   unsigned int lastpos = 0;
8719   unsigned int limlo, limhi;
8720   char *s_reset;
8721   char save_c = 0;
8722   offsetT min_range, max_range;
8723   int argnum;
8724   unsigned int rtype;
8725
8726   insn_error = NULL;
8727
8728   /* If the instruction contains a '.', we first try to match an instruction
8729      including the '.'.  Then we try again without the '.'.  */
8730   insn = NULL;
8731   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8732     continue;
8733
8734   /* If we stopped on whitespace, then replace the whitespace with null for
8735      the call to hash_find.  Save the character we replaced just in case we
8736      have to re-parse the instruction.  */
8737   if (ISSPACE (*s))
8738     {
8739       save_c = *s;
8740       *s++ = '\0';
8741     }
8742
8743   insn = (struct mips_opcode *) hash_find (op_hash, str);
8744
8745   /* If we didn't find the instruction in the opcode table, try again, but
8746      this time with just the instruction up to, but not including the
8747      first '.'.  */
8748   if (insn == NULL)
8749     {
8750       /* Restore the character we overwrite above (if any).  */
8751       if (save_c)
8752         *(--s) = save_c;
8753
8754       /* Scan up to the first '.' or whitespace.  */
8755       for (s = str;
8756            *s != '\0' && *s != '.' && !ISSPACE (*s);
8757            ++s)
8758         continue;
8759
8760       /* If we did not find a '.', then we can quit now.  */
8761       if (*s != '.')
8762         {
8763           insn_error = _("unrecognized opcode");
8764           return;
8765         }
8766
8767       /* Lookup the instruction in the hash table.  */
8768       *s++ = '\0';
8769       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8770         {
8771           insn_error = _("unrecognized opcode");
8772           return;
8773         }
8774     }
8775
8776   argsStart = s;
8777   for (;;)
8778     {
8779       bfd_boolean ok;
8780
8781       gas_assert (strcmp (insn->name, str) == 0);
8782
8783       ok = is_opcode_valid (insn);
8784       if (! ok)
8785         {
8786           if (insn + 1 < &mips_opcodes[NUMOPCODES]
8787               && strcmp (insn->name, insn[1].name) == 0)
8788             {
8789               ++insn;
8790               continue;
8791             }
8792           else
8793             {
8794               if (!insn_error)
8795                 {
8796                   static char buf[100];
8797                   sprintf (buf,
8798                            _("opcode not supported on this processor: %s (%s)"),
8799                            mips_cpu_info_from_arch (mips_opts.arch)->name,
8800                            mips_cpu_info_from_isa (mips_opts.isa)->name);
8801                   insn_error = buf;
8802                 }
8803               if (save_c)
8804                 *(--s) = save_c;
8805               return;
8806             }
8807         }
8808
8809       create_insn (ip, insn);
8810       insn_error = NULL;
8811       argnum = 1;
8812       lastregno = 0xffffffff;
8813       for (args = insn->args;; ++args)
8814         {
8815           int is_mdmx;
8816
8817           s += strspn (s, " \t");
8818           is_mdmx = 0;
8819           switch (*args)
8820             {
8821             case '\0':          /* end of args */
8822               if (*s == '\0')
8823                 return;
8824               break;
8825
8826             case '2': /* dsp 2-bit unsigned immediate in bit 11 */
8827               my_getExpression (&imm_expr, s);
8828               check_absolute_expr (ip, &imm_expr);
8829               if ((unsigned long) imm_expr.X_add_number != 1
8830                   && (unsigned long) imm_expr.X_add_number != 3)
8831                 {
8832                   as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8833                           (unsigned long) imm_expr.X_add_number);
8834                 }
8835               INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8836               imm_expr.X_op = O_absent;
8837               s = expr_end;
8838               continue;
8839
8840             case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8841               my_getExpression (&imm_expr, s);
8842               check_absolute_expr (ip, &imm_expr);
8843               if (imm_expr.X_add_number & ~OP_MASK_SA3)
8844                 {
8845                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8846                           OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8847                 }
8848               INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
8849               imm_expr.X_op = O_absent;
8850               s = expr_end;
8851               continue;
8852
8853             case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8854               my_getExpression (&imm_expr, s);
8855               check_absolute_expr (ip, &imm_expr);
8856               if (imm_expr.X_add_number & ~OP_MASK_SA4)
8857                 {
8858                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8859                           OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8860                 }
8861               INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
8862               imm_expr.X_op = O_absent;
8863               s = expr_end;
8864               continue;
8865
8866             case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8867               my_getExpression (&imm_expr, s);
8868               check_absolute_expr (ip, &imm_expr);
8869               if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8870                 {
8871                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8872                           OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8873                 }
8874               INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
8875               imm_expr.X_op = O_absent;
8876               s = expr_end;
8877               continue;
8878
8879             case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8880               my_getExpression (&imm_expr, s);
8881               check_absolute_expr (ip, &imm_expr);
8882               if (imm_expr.X_add_number & ~OP_MASK_RS)
8883                 {
8884                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8885                           OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8886                 }
8887               INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
8888               imm_expr.X_op = O_absent;
8889               s = expr_end;
8890               continue;
8891
8892             case '7': /* four dsp accumulators in bits 11,12 */ 
8893               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8894                   s[3] >= '0' && s[3] <= '3')
8895                 {
8896                   regno = s[3] - '0';
8897                   s += 4;
8898                   INSERT_OPERAND (DSPACC, *ip, regno);
8899                   continue;
8900                 }
8901               else
8902                 as_bad (_("Invalid dsp acc register"));
8903               break;
8904
8905             case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8906               my_getExpression (&imm_expr, s);
8907               check_absolute_expr (ip, &imm_expr);
8908               if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8909                 {
8910                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8911                           OP_MASK_WRDSP,
8912                           (unsigned long) imm_expr.X_add_number);
8913                 }
8914               INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
8915               imm_expr.X_op = O_absent;
8916               s = expr_end;
8917               continue;
8918
8919             case '9': /* four dsp accumulators in bits 21,22 */
8920               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8921                   s[3] >= '0' && s[3] <= '3')
8922                 {
8923                   regno = s[3] - '0';
8924                   s += 4;
8925                   INSERT_OPERAND (DSPACC_S, *ip, regno);
8926                   continue;
8927                 }
8928               else
8929                 as_bad (_("Invalid dsp acc register"));
8930               break;
8931
8932             case '0': /* dsp 6-bit signed immediate in bit 20 */
8933               my_getExpression (&imm_expr, s);
8934               check_absolute_expr (ip, &imm_expr);
8935               min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8936               max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8937               if (imm_expr.X_add_number < min_range ||
8938                   imm_expr.X_add_number > max_range)
8939                 {
8940                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8941                           (long) min_range, (long) max_range,
8942                           (long) imm_expr.X_add_number);
8943                 }
8944               INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
8945               imm_expr.X_op = O_absent;
8946               s = expr_end;
8947               continue;
8948
8949             case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8950               my_getExpression (&imm_expr, s);
8951               check_absolute_expr (ip, &imm_expr);
8952               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8953                 {
8954                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8955                           OP_MASK_RDDSP,
8956                           (unsigned long) imm_expr.X_add_number);
8957                 }
8958               INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
8959               imm_expr.X_op = O_absent;
8960               s = expr_end;
8961               continue;
8962
8963             case ':': /* dsp 7-bit signed immediate in bit 19 */
8964               my_getExpression (&imm_expr, s);
8965               check_absolute_expr (ip, &imm_expr);
8966               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8967               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8968               if (imm_expr.X_add_number < min_range ||
8969                   imm_expr.X_add_number > max_range)
8970                 {
8971                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8972                           (long) min_range, (long) max_range,
8973                           (long) imm_expr.X_add_number);
8974                 }
8975               INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
8976               imm_expr.X_op = O_absent;
8977               s = expr_end;
8978               continue;
8979
8980             case '@': /* dsp 10-bit signed immediate in bit 16 */
8981               my_getExpression (&imm_expr, s);
8982               check_absolute_expr (ip, &imm_expr);
8983               min_range = -((OP_MASK_IMM10 + 1) >> 1);
8984               max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8985               if (imm_expr.X_add_number < min_range ||
8986                   imm_expr.X_add_number > max_range)
8987                 {
8988                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8989                           (long) min_range, (long) max_range,
8990                           (long) imm_expr.X_add_number);
8991                 }
8992               INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
8993               imm_expr.X_op = O_absent;
8994               s = expr_end;
8995               continue;
8996
8997             case '!': /* MT usermode flag bit.  */
8998               my_getExpression (&imm_expr, s);
8999               check_absolute_expr (ip, &imm_expr);
9000               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
9001                 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
9002                         (unsigned long) imm_expr.X_add_number);
9003               INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
9004               imm_expr.X_op = O_absent;
9005               s = expr_end;
9006               continue;
9007
9008             case '$': /* MT load high flag bit.  */
9009               my_getExpression (&imm_expr, s);
9010               check_absolute_expr (ip, &imm_expr);
9011               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
9012                 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
9013                         (unsigned long) imm_expr.X_add_number);
9014               INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
9015               imm_expr.X_op = O_absent;
9016               s = expr_end;
9017               continue;
9018
9019             case '*': /* four dsp accumulators in bits 18,19 */ 
9020               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9021                   s[3] >= '0' && s[3] <= '3')
9022                 {
9023                   regno = s[3] - '0';
9024                   s += 4;
9025                   INSERT_OPERAND (MTACC_T, *ip, regno);
9026                   continue;
9027                 }
9028               else
9029                 as_bad (_("Invalid dsp/smartmips acc register"));
9030               break;
9031
9032             case '&': /* four dsp accumulators in bits 13,14 */ 
9033               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9034                   s[3] >= '0' && s[3] <= '3')
9035                 {
9036                   regno = s[3] - '0';
9037                   s += 4;
9038                   INSERT_OPERAND (MTACC_D, *ip, regno);
9039                   continue;
9040                 }
9041               else
9042                 as_bad (_("Invalid dsp/smartmips acc register"));
9043               break;
9044
9045             case ',':
9046               ++argnum;
9047               if (*s++ == *args)
9048                 continue;
9049               s--;
9050               switch (*++args)
9051                 {
9052                 case 'r':
9053                 case 'v':
9054                   INSERT_OPERAND (RS, *ip, lastregno);
9055                   continue;
9056
9057                 case 'w':
9058                   INSERT_OPERAND (RT, *ip, lastregno);
9059                   continue;
9060
9061                 case 'W':
9062                   INSERT_OPERAND (FT, *ip, lastregno);
9063                   continue;
9064
9065                 case 'V':
9066                   INSERT_OPERAND (FS, *ip, lastregno);
9067                   continue;
9068                 }
9069               break;
9070
9071             case '(':
9072               /* Handle optional base register.
9073                  Either the base register is omitted or
9074                  we must have a left paren.  */
9075               /* This is dependent on the next operand specifier
9076                  is a base register specification.  */
9077               gas_assert (args[1] == 'b' || args[1] == '5'
9078                       || args[1] == '-' || args[1] == '4');
9079               if (*s == '\0')
9080                 return;
9081
9082             case ')':           /* these must match exactly */
9083             case '[':
9084             case ']':
9085               if (*s++ == *args)
9086                 continue;
9087               break;
9088
9089             case '+':           /* Opcode extension character.  */
9090               switch (*++args)
9091                 {
9092                 case '1':       /* UDI immediates.  */
9093                 case '2':
9094                 case '3':
9095                 case '4':
9096                   {
9097                     const struct mips_immed *imm = mips_immed;
9098
9099                     while (imm->type && imm->type != *args)
9100                       ++imm;
9101                     if (! imm->type)
9102                       internalError ();
9103                     my_getExpression (&imm_expr, s);
9104                     check_absolute_expr (ip, &imm_expr);
9105                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
9106                       {
9107                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
9108                                  imm->desc ? imm->desc : ip->insn_mo->name,
9109                                  (unsigned long) imm_expr.X_add_number,
9110                                  (unsigned long) imm_expr.X_add_number);
9111                               imm_expr.X_add_number &= imm->mask;
9112                       }
9113                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
9114                                         << imm->shift);
9115                     imm_expr.X_op = O_absent;
9116                     s = expr_end;
9117                   }
9118                   continue;
9119                   
9120                 case 'A':               /* ins/ext position, becomes LSB.  */
9121                   limlo = 0;
9122                   limhi = 31;
9123                   goto do_lsb;
9124                 case 'E':
9125                   limlo = 32;
9126                   limhi = 63;
9127                   goto do_lsb;
9128 do_lsb:
9129                   my_getExpression (&imm_expr, s);
9130                   check_absolute_expr (ip, &imm_expr);
9131                   if ((unsigned long) imm_expr.X_add_number < limlo
9132                       || (unsigned long) imm_expr.X_add_number > limhi)
9133                     {
9134                       as_bad (_("Improper position (%lu)"),
9135                               (unsigned long) imm_expr.X_add_number);
9136                       imm_expr.X_add_number = limlo;
9137                     }
9138                   lastpos = imm_expr.X_add_number;
9139                   INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9140                   imm_expr.X_op = O_absent;
9141                   s = expr_end;
9142                   continue;
9143
9144                 case 'B':               /* ins size, becomes MSB.  */
9145                   limlo = 1;
9146                   limhi = 32;
9147                   goto do_msb;
9148                 case 'F':
9149                   limlo = 33;
9150                   limhi = 64;
9151                   goto do_msb;
9152 do_msb:
9153                   my_getExpression (&imm_expr, s);
9154                   check_absolute_expr (ip, &imm_expr);
9155                   /* Check for negative input so that small negative numbers
9156                      will not succeed incorrectly.  The checks against
9157                      (pos+size) transitively check "size" itself,
9158                      assuming that "pos" is reasonable.  */
9159                   if ((long) imm_expr.X_add_number < 0
9160                       || ((unsigned long) imm_expr.X_add_number
9161                           + lastpos) < limlo
9162                       || ((unsigned long) imm_expr.X_add_number
9163                           + lastpos) > limhi)
9164                     {
9165                       as_bad (_("Improper insert size (%lu, position %lu)"),
9166                               (unsigned long) imm_expr.X_add_number,
9167                               (unsigned long) lastpos);
9168                       imm_expr.X_add_number = limlo - lastpos;
9169                     }
9170                   INSERT_OPERAND (INSMSB, *ip,
9171                                  lastpos + imm_expr.X_add_number - 1);
9172                   imm_expr.X_op = O_absent;
9173                   s = expr_end;
9174                   continue;
9175
9176                 case 'C':               /* ext size, becomes MSBD.  */
9177                   limlo = 1;
9178                   limhi = 32;
9179                   goto do_msbd;
9180                 case 'G':
9181                   limlo = 33;
9182                   limhi = 64;
9183                   goto do_msbd;
9184                 case 'H':
9185                   limlo = 33;
9186                   limhi = 64;
9187                   goto do_msbd;
9188 do_msbd:
9189                   my_getExpression (&imm_expr, s);
9190                   check_absolute_expr (ip, &imm_expr);
9191                   /* Check for negative input so that small negative numbers
9192                      will not succeed incorrectly.  The checks against
9193                      (pos+size) transitively check "size" itself,
9194                      assuming that "pos" is reasonable.  */
9195                   if ((long) imm_expr.X_add_number < 0
9196                       || ((unsigned long) imm_expr.X_add_number
9197                           + lastpos) < limlo
9198                       || ((unsigned long) imm_expr.X_add_number
9199                           + lastpos) > limhi)
9200                     {
9201                       as_bad (_("Improper extract size (%lu, position %lu)"),
9202                               (unsigned long) imm_expr.X_add_number,
9203                               (unsigned long) lastpos);
9204                       imm_expr.X_add_number = limlo - lastpos;
9205                     }
9206                   INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
9207                   imm_expr.X_op = O_absent;
9208                   s = expr_end;
9209                   continue;
9210
9211                 case 'D':
9212                   /* +D is for disassembly only; never match.  */
9213                   break;
9214
9215                 case 'I':
9216                   /* "+I" is like "I", except that imm2_expr is used.  */
9217                   my_getExpression (&imm2_expr, s);
9218                   if (imm2_expr.X_op != O_big
9219                       && imm2_expr.X_op != O_constant)
9220                   insn_error = _("absolute expression required");
9221                   if (HAVE_32BIT_GPRS)
9222                     normalize_constant_expr (&imm2_expr);
9223                   s = expr_end;
9224                   continue;
9225
9226                 case 'T': /* Coprocessor register.  */
9227                   /* +T is for disassembly only; never match.  */
9228                   break;
9229
9230                 case 't': /* Coprocessor register number.  */
9231                   if (s[0] == '$' && ISDIGIT (s[1]))
9232                     {
9233                       ++s;
9234                       regno = 0;
9235                       do
9236                         {
9237                           regno *= 10;
9238                           regno += *s - '0';
9239                           ++s;
9240                         }
9241                       while (ISDIGIT (*s));
9242                       if (regno > 31)
9243                         as_bad (_("Invalid register number (%d)"), regno);
9244                       else
9245                         {
9246                           INSERT_OPERAND (RT, *ip, regno);
9247                           continue;
9248                         }
9249                     }
9250                   else
9251                     as_bad (_("Invalid coprocessor 0 register number"));
9252                   break;
9253
9254                 case 'x':
9255                   /* bbit[01] and bbit[01]32 bit index.  Give error if index
9256                      is not in the valid range.  */
9257                   my_getExpression (&imm_expr, s);
9258                   check_absolute_expr (ip, &imm_expr);
9259                   if ((unsigned) imm_expr.X_add_number > 31)
9260                     {
9261                       as_bad (_("Improper bit index (%lu)"),
9262                               (unsigned long) imm_expr.X_add_number);
9263                       imm_expr.X_add_number = 0;
9264                     }
9265                   INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number);
9266                   imm_expr.X_op = O_absent;
9267                   s = expr_end;
9268                   continue;
9269
9270                 case 'X':
9271                   /* bbit[01] bit index when bbit is used but we generate
9272                      bbit[01]32 because the index is over 32.  Move to the
9273                      next candidate if index is not in the valid range.  */
9274                   my_getExpression (&imm_expr, s);
9275                   check_absolute_expr (ip, &imm_expr);
9276                   if ((unsigned) imm_expr.X_add_number < 32
9277                       || (unsigned) imm_expr.X_add_number > 63)
9278                     break;
9279                   INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number - 32);
9280                   imm_expr.X_op = O_absent;
9281                   s = expr_end;
9282                   continue;
9283
9284                 case 'p':
9285                   /* cins, cins32, exts and exts32 position field.  Give error
9286                      if it's not in the valid range.  */
9287                   my_getExpression (&imm_expr, s);
9288                   check_absolute_expr (ip, &imm_expr);
9289                   if ((unsigned) imm_expr.X_add_number > 31)
9290                     {
9291                       as_bad (_("Improper position (%lu)"),
9292                               (unsigned long) imm_expr.X_add_number);
9293                       imm_expr.X_add_number = 0;
9294                     }
9295                   /* Make the pos explicit to simplify +S.  */
9296                   lastpos = imm_expr.X_add_number + 32;
9297                   INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number);
9298                   imm_expr.X_op = O_absent;
9299                   s = expr_end;
9300                   continue;
9301
9302                 case 'P':
9303                   /* cins, cins32, exts and exts32 position field.  Move to
9304                      the next candidate if it's not in the valid range.  */
9305                   my_getExpression (&imm_expr, s);
9306                   check_absolute_expr (ip, &imm_expr);
9307                   if ((unsigned) imm_expr.X_add_number < 32
9308                       || (unsigned) imm_expr.X_add_number > 63)
9309                     break;
9310                   lastpos = imm_expr.X_add_number;
9311                   INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number - 32);
9312                   imm_expr.X_op = O_absent;
9313                   s = expr_end;
9314                   continue;
9315
9316                 case 's':
9317                   /* cins and exts length-minus-one field.  */
9318                   my_getExpression (&imm_expr, s);
9319                   check_absolute_expr (ip, &imm_expr);
9320                   if ((unsigned long) imm_expr.X_add_number > 31)
9321                     {
9322                       as_bad (_("Improper size (%lu)"),
9323                               (unsigned long) imm_expr.X_add_number);
9324                       imm_expr.X_add_number = 0;
9325                     }
9326                   INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9327                   imm_expr.X_op = O_absent;
9328                   s = expr_end;
9329                   continue;
9330
9331                 case 'S':
9332                   /* cins32/exts32 and cins/exts aliasing cint32/exts32
9333                      length-minus-one field.  */
9334                   my_getExpression (&imm_expr, s);
9335                   check_absolute_expr (ip, &imm_expr);
9336                   if ((long) imm_expr.X_add_number < 0
9337                       || (unsigned long) imm_expr.X_add_number + lastpos > 63)
9338                     {
9339                       as_bad (_("Improper size (%lu)"),
9340                               (unsigned long) imm_expr.X_add_number);
9341                       imm_expr.X_add_number = 0;
9342                     }
9343                   INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9344                   imm_expr.X_op = O_absent;
9345                   s = expr_end;
9346                   continue;
9347
9348                 case 'Q':
9349                   /* seqi/snei immediate field.  */
9350                   my_getExpression (&imm_expr, s);
9351                   check_absolute_expr (ip, &imm_expr);
9352                   if ((long) imm_expr.X_add_number < -512
9353                       || (long) imm_expr.X_add_number >= 512)
9354                     {
9355                       as_bad (_("Improper immediate (%ld)"),
9356                                (long) imm_expr.X_add_number);
9357                       imm_expr.X_add_number = 0;
9358                     }
9359                   INSERT_OPERAND (SEQI, *ip, imm_expr.X_add_number);
9360                   imm_expr.X_op = O_absent;
9361                   s = expr_end;
9362                   continue;
9363
9364                 default:
9365                   as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
9366                     *args, insn->name, insn->args);
9367                   /* Further processing is fruitless.  */
9368                   return;
9369                 }
9370               break;
9371
9372             case '<':           /* must be at least one digit */
9373               /*
9374                * According to the manual, if the shift amount is greater
9375                * than 31 or less than 0, then the shift amount should be
9376                * mod 32.  In reality the mips assembler issues an error.
9377                * We issue a warning and mask out all but the low 5 bits.
9378                */
9379               my_getExpression (&imm_expr, s);
9380               check_absolute_expr (ip, &imm_expr);
9381               if ((unsigned long) imm_expr.X_add_number > 31)
9382                 as_warn (_("Improper shift amount (%lu)"),
9383                          (unsigned long) imm_expr.X_add_number);
9384               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9385               imm_expr.X_op = O_absent;
9386               s = expr_end;
9387               continue;
9388
9389             case '>':           /* shift amount minus 32 */
9390               my_getExpression (&imm_expr, s);
9391               check_absolute_expr (ip, &imm_expr);
9392               if ((unsigned long) imm_expr.X_add_number < 32
9393                   || (unsigned long) imm_expr.X_add_number > 63)
9394                 break;
9395               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
9396               imm_expr.X_op = O_absent;
9397               s = expr_end;
9398               continue;
9399
9400             case 'k':           /* cache code */
9401             case 'h':           /* prefx code */
9402             case '1':           /* sync type */
9403               my_getExpression (&imm_expr, s);
9404               check_absolute_expr (ip, &imm_expr);
9405               if ((unsigned long) imm_expr.X_add_number > 31)
9406                 as_warn (_("Invalid value for `%s' (%lu)"),
9407                          ip->insn_mo->name,
9408                          (unsigned long) imm_expr.X_add_number);
9409               if (*args == 'k')
9410                 {
9411                   if (mips_fix_cn63xxp1 && strcmp ("pref", insn->name) == 0)
9412                     switch (imm_expr.X_add_number)
9413                       {
9414                       case 5:
9415                       case 25:
9416                       case 26:
9417                       case 27:
9418                       case 28:
9419                       case 29:
9420                       case 30:
9421                       case 31:  /* These are ok.  */
9422                         break;
9423
9424                       default:  /* The rest must be changed to 28.  */
9425                         imm_expr.X_add_number = 28;
9426                         break;
9427                       }
9428                   INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9429                 }
9430               else if (*args == 'h')
9431                 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
9432               else
9433                 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9434               imm_expr.X_op = O_absent;
9435               s = expr_end;
9436               continue;
9437
9438             case 'c':           /* break code */
9439               my_getExpression (&imm_expr, s);
9440               check_absolute_expr (ip, &imm_expr);
9441               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9442                 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9443                          ip->insn_mo->name,
9444                          (unsigned long) imm_expr.X_add_number);
9445               INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9446               imm_expr.X_op = O_absent;
9447               s = expr_end;
9448               continue;
9449
9450             case 'q':           /* lower break code */
9451               my_getExpression (&imm_expr, s);
9452               check_absolute_expr (ip, &imm_expr);
9453               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9454                 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9455                          ip->insn_mo->name,
9456                          (unsigned long) imm_expr.X_add_number);
9457               INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9458               imm_expr.X_op = O_absent;
9459               s = expr_end;
9460               continue;
9461
9462             case 'B':           /* 20-bit syscall/break code.  */
9463               my_getExpression (&imm_expr, s);
9464               check_absolute_expr (ip, &imm_expr);
9465               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9466                 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9467                          ip->insn_mo->name,
9468                          (unsigned long) imm_expr.X_add_number);
9469               INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9470               imm_expr.X_op = O_absent;
9471               s = expr_end;
9472               continue;
9473
9474             case 'C':           /* Coprocessor code */
9475               my_getExpression (&imm_expr, s);
9476               check_absolute_expr (ip, &imm_expr);
9477               if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9478                 {
9479                   as_warn (_("Coproccesor code > 25 bits (%lu)"),
9480                            (unsigned long) imm_expr.X_add_number);
9481                   imm_expr.X_add_number &= OP_MASK_COPZ;
9482                 }
9483               INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9484               imm_expr.X_op = O_absent;
9485               s = expr_end;
9486               continue;
9487
9488             case 'J':           /* 19-bit wait code.  */
9489               my_getExpression (&imm_expr, s);
9490               check_absolute_expr (ip, &imm_expr);
9491               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9492                 {
9493                   as_warn (_("Illegal 19-bit code (%lu)"),
9494                            (unsigned long) imm_expr.X_add_number);
9495                   imm_expr.X_add_number &= OP_MASK_CODE19;
9496                 }
9497               INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9498               imm_expr.X_op = O_absent;
9499               s = expr_end;
9500               continue;
9501
9502             case 'P':           /* Performance register.  */
9503               my_getExpression (&imm_expr, s);
9504               check_absolute_expr (ip, &imm_expr);
9505               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9506                 as_warn (_("Invalid performance register (%lu)"),
9507                          (unsigned long) imm_expr.X_add_number);
9508               INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9509               imm_expr.X_op = O_absent;
9510               s = expr_end;
9511               continue;
9512
9513             case 'G':           /* Coprocessor destination register.  */
9514               if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9515                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9516               else
9517                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9518               INSERT_OPERAND (RD, *ip, regno);
9519               if (ok) 
9520                 {
9521                   lastregno = regno;
9522                   continue;
9523                 }
9524               else
9525                 break;
9526
9527             case 'b':           /* base register */
9528             case 'd':           /* destination register */
9529             case 's':           /* source register */
9530             case 't':           /* target register */
9531             case 'r':           /* both target and source */
9532             case 'v':           /* both dest and source */
9533             case 'w':           /* both dest and target */
9534             case 'E':           /* coprocessor target register */
9535             case 'K':           /* 'rdhwr' destination register */
9536             case 'x':           /* ignore register name */
9537             case 'z':           /* must be zero register */
9538             case 'U':           /* destination register (clo/clz).  */
9539             case 'g':           /* coprocessor destination register */
9540               s_reset = s;            
9541               if (*args == 'E' || *args == 'K')
9542                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9543               else
9544                 {
9545                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9546                   if (regno == AT && mips_opts.at)
9547                     {
9548                       if (mips_opts.at == ATREG)
9549                         as_warn (_("used $at without \".set noat\""));
9550                       else
9551                         as_warn (_("used $%u with \".set at=$%u\""),
9552                                  regno, mips_opts.at);
9553                     }
9554                 }
9555               if (ok)
9556                 {
9557                   c = *args;
9558                   if (*s == ' ')
9559                     ++s;
9560                   if (args[1] != *s)
9561                     {
9562                       if (c == 'r' || c == 'v' || c == 'w')
9563                         {
9564                           regno = lastregno;
9565                           s = s_reset;
9566                           ++args;
9567                         }
9568                     }
9569                   /* 'z' only matches $0.  */
9570                   if (c == 'z' && regno != 0)
9571                     break;
9572
9573                   if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
9574                     {
9575                       if (regno == lastregno)
9576                         {
9577                           insn_error = _("source and destination must be different");
9578                           continue;
9579                         }
9580                       if (regno == 31 && lastregno == 0xffffffff)
9581                         {
9582                           insn_error = _("a destination register must be supplied");
9583                           continue;
9584                         }
9585                     }
9586         /* Now that we have assembled one operand, we use the args string
9587          * to figure out where it goes in the instruction.  */
9588                   switch (c)
9589                     {
9590                     case 'r':
9591                     case 's':
9592                     case 'v':
9593                     case 'b':
9594                       INSERT_OPERAND (RS, *ip, regno);
9595                       break;
9596                     case 'd':
9597                     case 'G':
9598                     case 'K':
9599                     case 'g':
9600                       INSERT_OPERAND (RD, *ip, regno);
9601                       break;
9602                     case 'U':
9603                       INSERT_OPERAND (RD, *ip, regno);
9604                       INSERT_OPERAND (RT, *ip, regno);
9605                       break;
9606                     case 'w':
9607                     case 't':
9608                     case 'E':
9609                       INSERT_OPERAND (RT, *ip, regno);
9610                       break;
9611                     case 'x':
9612                       /* This case exists because on the r3000 trunc
9613                          expands into a macro which requires a gp
9614                          register.  On the r6000 or r4000 it is
9615                          assembled into a single instruction which
9616                          ignores the register.  Thus the insn version
9617                          is MIPS_ISA2 and uses 'x', and the macro
9618                          version is MIPS_ISA1 and uses 't'.  */
9619                       break;
9620                     case 'z':
9621                       /* This case is for the div instruction, which
9622                          acts differently if the destination argument
9623                          is $0.  This only matches $0, and is checked
9624                          outside the switch.  */
9625                       break;
9626                     case 'D':
9627                       /* Itbl operand; not yet implemented. FIXME ?? */
9628                       break;
9629                       /* What about all other operands like 'i', which
9630                          can be specified in the opcode table? */
9631                     }
9632                   lastregno = regno;
9633                   continue;
9634                 }
9635               switch (*args++)
9636                 {
9637                 case 'r':
9638                 case 'v':
9639                   INSERT_OPERAND (RS, *ip, lastregno);
9640                   continue;
9641                 case 'w':
9642                   INSERT_OPERAND (RT, *ip, lastregno);
9643                   continue;
9644                 }
9645               break;
9646
9647             case 'O':           /* MDMX alignment immediate constant.  */
9648               my_getExpression (&imm_expr, s);
9649               check_absolute_expr (ip, &imm_expr);
9650               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9651                 as_warn (_("Improper align amount (%ld), using low bits"),
9652                          (long) imm_expr.X_add_number);
9653               INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9654               imm_expr.X_op = O_absent;
9655               s = expr_end;
9656               continue;
9657
9658             case 'Q':           /* MDMX vector, element sel, or const.  */
9659               if (s[0] != '$')
9660                 {
9661                   /* MDMX Immediate.  */
9662                   my_getExpression (&imm_expr, s);
9663                   check_absolute_expr (ip, &imm_expr);
9664                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9665                     as_warn (_("Invalid MDMX Immediate (%ld)"),
9666                              (long) imm_expr.X_add_number);
9667                   INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9668                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9669                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9670                   else
9671                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9672                   imm_expr.X_op = O_absent;
9673                   s = expr_end;
9674                   continue;
9675                 }
9676               /* Not MDMX Immediate.  Fall through.  */
9677             case 'X':           /* MDMX destination register.  */
9678             case 'Y':           /* MDMX source register.  */
9679             case 'Z':           /* MDMX target register.  */
9680               is_mdmx = 1;
9681             case 'D':           /* floating point destination register */
9682             case 'S':           /* floating point source register */
9683             case 'T':           /* floating point target register */
9684             case 'R':           /* floating point source register */
9685             case 'V':
9686             case 'W':
9687               rtype = RTYPE_FPU;
9688               if (is_mdmx
9689                   || (mips_opts.ase_mdmx
9690                       && (ip->insn_mo->pinfo & FP_D)
9691                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9692                                                 | INSN_COPROC_MEMORY_DELAY
9693                                                 | INSN_LOAD_COPROC_DELAY
9694                                                 | INSN_LOAD_MEMORY_DELAY
9695                                                 | INSN_STORE_MEMORY))))
9696                 rtype |= RTYPE_VEC;
9697               s_reset = s;
9698               if (reg_lookup (&s, rtype, &regno))
9699                 {
9700                   if ((regno & 1) != 0
9701                       && HAVE_32BIT_FPRS
9702                       && ! mips_oddfpreg_ok (ip->insn_mo, argnum))
9703                     as_warn (_("Float register should be even, was %d"),
9704                              regno);
9705
9706                   c = *args;
9707                   if (*s == ' ')
9708                     ++s;
9709                   if (args[1] != *s)
9710                     {
9711                       if (c == 'V' || c == 'W')
9712                         {
9713                           regno = lastregno;
9714                           s = s_reset;
9715                           ++args;
9716                         }
9717                     }
9718                   switch (c)
9719                     {
9720                     case 'D':
9721                     case 'X':
9722                       INSERT_OPERAND (FD, *ip, regno);
9723                       break;
9724                     case 'V':
9725                     case 'S':
9726                     case 'Y':
9727                       INSERT_OPERAND (FS, *ip, regno);
9728                       break;
9729                     case 'Q':
9730                       /* This is like 'Z', but also needs to fix the MDMX
9731                          vector/scalar select bits.  Note that the
9732                          scalar immediate case is handled above.  */
9733                       if (*s == '[')
9734                         {
9735                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9736                           int max_el = (is_qh ? 3 : 7);
9737                           s++;
9738                           my_getExpression(&imm_expr, s);
9739                           check_absolute_expr (ip, &imm_expr);
9740                           s = expr_end;
9741                           if (imm_expr.X_add_number > max_el)
9742                             as_bad (_("Bad element selector %ld"),
9743                                     (long) imm_expr.X_add_number);
9744                           imm_expr.X_add_number &= max_el;
9745                           ip->insn_opcode |= (imm_expr.X_add_number
9746                                               << (OP_SH_VSEL +
9747                                                   (is_qh ? 2 : 1)));
9748                           imm_expr.X_op = O_absent;
9749                           if (*s != ']')
9750                             as_warn (_("Expecting ']' found '%s'"), s);
9751                           else
9752                             s++;
9753                         }
9754                       else
9755                         {
9756                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9757                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9758                                                 << OP_SH_VSEL);
9759                           else
9760                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9761                                                 OP_SH_VSEL);
9762                         }
9763                       /* Fall through */
9764                     case 'W':
9765                     case 'T':
9766                     case 'Z':
9767                       INSERT_OPERAND (FT, *ip, regno);
9768                       break;
9769                     case 'R':
9770                       INSERT_OPERAND (FR, *ip, regno);
9771                       break;
9772                     }
9773                   lastregno = regno;
9774                   continue;
9775                 }
9776
9777               switch (*args++)
9778                 {
9779                 case 'V':
9780                   INSERT_OPERAND (FS, *ip, lastregno);
9781                   continue;
9782                 case 'W':
9783                   INSERT_OPERAND (FT, *ip, lastregno);
9784                   continue;
9785                 }
9786               break;
9787
9788             case 'I':
9789               my_getExpression (&imm_expr, s);
9790               if (imm_expr.X_op != O_big
9791                   && imm_expr.X_op != O_constant)
9792                 insn_error = _("absolute expression required");
9793               if (HAVE_32BIT_GPRS)
9794                 normalize_constant_expr (&imm_expr);
9795               s = expr_end;
9796               continue;
9797
9798             case 'A':
9799               my_getExpression (&offset_expr, s);
9800               normalize_address_expr (&offset_expr);
9801               *imm_reloc = BFD_RELOC_32;
9802               s = expr_end;
9803               continue;
9804
9805             case 'F':
9806             case 'L':
9807             case 'f':
9808             case 'l':
9809               {
9810                 int f64;
9811                 int using_gprs;
9812                 char *save_in;
9813                 char *err;
9814                 unsigned char temp[8];
9815                 int len;
9816                 unsigned int length;
9817                 segT seg;
9818                 subsegT subseg;
9819                 char *p;
9820
9821                 /* These only appear as the last operand in an
9822                    instruction, and every instruction that accepts
9823                    them in any variant accepts them in all variants.
9824                    This means we don't have to worry about backing out
9825                    any changes if the instruction does not match.
9826
9827                    The difference between them is the size of the
9828                    floating point constant and where it goes.  For 'F'
9829                    and 'L' the constant is 64 bits; for 'f' and 'l' it
9830                    is 32 bits.  Where the constant is placed is based
9831                    on how the MIPS assembler does things:
9832                     F -- .rdata
9833                     L -- .lit8
9834                     f -- immediate value
9835                     l -- .lit4
9836
9837                     The .lit4 and .lit8 sections are only used if
9838                     permitted by the -G argument.
9839
9840                     The code below needs to know whether the target register
9841                     is 32 or 64 bits wide.  It relies on the fact 'f' and
9842                     'F' are used with GPR-based instructions and 'l' and
9843                     'L' are used with FPR-based instructions.  */
9844
9845                 f64 = *args == 'F' || *args == 'L';
9846                 using_gprs = *args == 'F' || *args == 'f';
9847
9848                 save_in = input_line_pointer;
9849                 input_line_pointer = s;
9850                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9851                 length = len;
9852                 s = input_line_pointer;
9853                 input_line_pointer = save_in;
9854                 if (err != NULL && *err != '\0')
9855                   {
9856                     as_bad (_("Bad floating point constant: %s"), err);
9857                     memset (temp, '\0', sizeof temp);
9858                     length = f64 ? 8 : 4;
9859                   }
9860
9861                 gas_assert (length == (unsigned) (f64 ? 8 : 4));
9862
9863                 if (*args == 'f'
9864                     || (*args == 'l'
9865                         && (g_switch_value < 4
9866                             || (temp[0] == 0 && temp[1] == 0)
9867                             || (temp[2] == 0 && temp[3] == 0))))
9868                   {
9869                     imm_expr.X_op = O_constant;
9870                     if (! target_big_endian)
9871                       imm_expr.X_add_number = bfd_getl32 (temp);
9872                     else
9873                       imm_expr.X_add_number = bfd_getb32 (temp);
9874                   }
9875                 else if (length > 4
9876                          && ! mips_disable_float_construction
9877                          /* Constants can only be constructed in GPRs and
9878                             copied to FPRs if the GPRs are at least as wide
9879                             as the FPRs.  Force the constant into memory if
9880                             we are using 64-bit FPRs but the GPRs are only
9881                             32 bits wide.  */
9882                          && (using_gprs
9883                              || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9884                          && ((temp[0] == 0 && temp[1] == 0)
9885                              || (temp[2] == 0 && temp[3] == 0))
9886                          && ((temp[4] == 0 && temp[5] == 0)
9887                              || (temp[6] == 0 && temp[7] == 0)))
9888                   {
9889                     /* The value is simple enough to load with a couple of
9890                        instructions.  If using 32-bit registers, set
9891                        imm_expr to the high order 32 bits and offset_expr to
9892                        the low order 32 bits.  Otherwise, set imm_expr to
9893                        the entire 64 bit constant.  */
9894                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9895                       {
9896                         imm_expr.X_op = O_constant;
9897                         offset_expr.X_op = O_constant;
9898                         if (! target_big_endian)
9899                           {
9900                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
9901                             offset_expr.X_add_number = bfd_getl32 (temp);
9902                           }
9903                         else
9904                           {
9905                             imm_expr.X_add_number = bfd_getb32 (temp);
9906                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
9907                           }
9908                         if (offset_expr.X_add_number == 0)
9909                           offset_expr.X_op = O_absent;
9910                       }
9911                     else if (sizeof (imm_expr.X_add_number) > 4)
9912                       {
9913                         imm_expr.X_op = O_constant;
9914                         if (! target_big_endian)
9915                           imm_expr.X_add_number = bfd_getl64 (temp);
9916                         else
9917                           imm_expr.X_add_number = bfd_getb64 (temp);
9918                       }
9919                     else
9920                       {
9921                         imm_expr.X_op = O_big;
9922                         imm_expr.X_add_number = 4;
9923                         if (! target_big_endian)
9924                           {
9925                             generic_bignum[0] = bfd_getl16 (temp);
9926                             generic_bignum[1] = bfd_getl16 (temp + 2);
9927                             generic_bignum[2] = bfd_getl16 (temp + 4);
9928                             generic_bignum[3] = bfd_getl16 (temp + 6);
9929                           }
9930                         else
9931                           {
9932                             generic_bignum[0] = bfd_getb16 (temp + 6);
9933                             generic_bignum[1] = bfd_getb16 (temp + 4);
9934                             generic_bignum[2] = bfd_getb16 (temp + 2);
9935                             generic_bignum[3] = bfd_getb16 (temp);
9936                           }
9937                       }
9938                   }
9939                 else
9940                   {
9941                     const char *newname;
9942                     segT new_seg;
9943
9944                     /* Switch to the right section.  */
9945                     seg = now_seg;
9946                     subseg = now_subseg;
9947                     switch (*args)
9948                       {
9949                       default: /* unused default case avoids warnings.  */
9950                       case 'L':
9951                         newname = RDATA_SECTION_NAME;
9952                         if (g_switch_value >= 8)
9953                           newname = ".lit8";
9954                         break;
9955                       case 'F':
9956                         newname = RDATA_SECTION_NAME;
9957                         break;
9958                       case 'l':
9959                         gas_assert (g_switch_value >= 4);
9960                         newname = ".lit4";
9961                         break;
9962                       }
9963                     new_seg = subseg_new (newname, (subsegT) 0);
9964                     if (IS_ELF)
9965                       bfd_set_section_flags (stdoutput, new_seg,
9966                                              (SEC_ALLOC
9967                                               | SEC_LOAD
9968                                               | SEC_READONLY
9969                                               | SEC_DATA));
9970                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
9971                     if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
9972                       record_alignment (new_seg, 4);
9973                     else
9974                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
9975                     if (seg == now_seg)
9976                       as_bad (_("Can't use floating point insn in this section"));
9977
9978                     /* Set the argument to the current address in the
9979                        section.  */
9980                     offset_expr.X_op = O_symbol;
9981                     offset_expr.X_add_symbol = symbol_temp_new_now ();
9982                     offset_expr.X_add_number = 0;
9983
9984                     /* Put the floating point number into the section.  */
9985                     p = frag_more ((int) length);
9986                     memcpy (p, temp, length);
9987
9988                     /* Switch back to the original section.  */
9989                     subseg_set (seg, subseg);
9990                   }
9991               }
9992               continue;
9993
9994             case 'i':           /* 16 bit unsigned immediate */
9995             case 'j':           /* 16 bit signed immediate */
9996               *imm_reloc = BFD_RELOC_LO16;
9997               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9998                 {
9999                   int more;
10000                   offsetT minval, maxval;
10001
10002                   more = (insn + 1 < &mips_opcodes[NUMOPCODES]
10003                           && strcmp (insn->name, insn[1].name) == 0);
10004
10005                   /* If the expression was written as an unsigned number,
10006                      only treat it as signed if there are no more
10007                      alternatives.  */
10008                   if (more
10009                       && *args == 'j'
10010                       && sizeof (imm_expr.X_add_number) <= 4
10011                       && imm_expr.X_op == O_constant
10012                       && imm_expr.X_add_number < 0
10013                       && imm_expr.X_unsigned
10014                       && HAVE_64BIT_GPRS)
10015                     break;
10016
10017                   /* For compatibility with older assemblers, we accept
10018                      0x8000-0xffff as signed 16-bit numbers when only
10019                      signed numbers are allowed.  */
10020                   if (*args == 'i')
10021                     minval = 0, maxval = 0xffff;
10022                   else if (more)
10023                     minval = -0x8000, maxval = 0x7fff;
10024                   else
10025                     minval = -0x8000, maxval = 0xffff;
10026
10027                   if (imm_expr.X_op != O_constant
10028                       || imm_expr.X_add_number < minval
10029                       || imm_expr.X_add_number > maxval)
10030                     {
10031                       if (more)
10032                         break;
10033                       if (imm_expr.X_op == O_constant
10034                           || imm_expr.X_op == O_big)
10035                         as_bad (_("expression out of range"));
10036                     }
10037                 }
10038               s = expr_end;
10039               continue;
10040
10041             case 'o':           /* 16 bit offset */
10042               /* Check whether there is only a single bracketed expression
10043                  left.  If so, it must be the base register and the
10044                  constant must be zero.  */
10045               if (*s == '(' && strchr (s + 1, '(') == 0)
10046                 {
10047                   offset_expr.X_op = O_constant;
10048                   offset_expr.X_add_number = 0;
10049                   continue;
10050                 }
10051
10052               /* If this value won't fit into a 16 bit offset, then go
10053                  find a macro that will generate the 32 bit offset
10054                  code pattern.  */
10055               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
10056                   && (offset_expr.X_op != O_constant
10057                       || offset_expr.X_add_number >= 0x8000
10058                       || offset_expr.X_add_number < -0x8000))
10059                 break;
10060
10061               s = expr_end;
10062               continue;
10063
10064             case 'p':           /* pc relative offset */
10065               *offset_reloc = BFD_RELOC_16_PCREL_S2;
10066               my_getExpression (&offset_expr, s);
10067               s = expr_end;
10068               continue;
10069
10070             case 'u':           /* upper 16 bits */
10071               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
10072                   && imm_expr.X_op == O_constant
10073                   && (imm_expr.X_add_number < 0
10074                       || imm_expr.X_add_number >= 0x10000))
10075                 as_bad (_("lui expression not in range 0..65535"));
10076               s = expr_end;
10077               continue;
10078
10079             case 'a':           /* 26 bit address */
10080               my_getExpression (&offset_expr, s);
10081               s = expr_end;
10082               *offset_reloc = BFD_RELOC_MIPS_JMP;
10083               continue;
10084
10085             case 'N':           /* 3 bit branch condition code */
10086             case 'M':           /* 3 bit compare condition code */
10087               rtype = RTYPE_CCC;
10088               if (ip->insn_mo->pinfo & (FP_D| FP_S))
10089                 rtype |= RTYPE_FCC;
10090               if (!reg_lookup (&s, rtype, &regno))
10091                 break;
10092               if ((strcmp(str + strlen(str) - 3, ".ps") == 0
10093                    || strcmp(str + strlen(str) - 5, "any2f") == 0
10094                    || strcmp(str + strlen(str) - 5, "any2t") == 0)
10095                   && (regno & 1) != 0)
10096                 as_warn (_("Condition code register should be even for %s, was %d"),
10097                          str, regno);
10098               if ((strcmp(str + strlen(str) - 5, "any4f") == 0
10099                    || strcmp(str + strlen(str) - 5, "any4t") == 0)
10100                   && (regno & 3) != 0)
10101                 as_warn (_("Condition code register should be 0 or 4 for %s, was %d"),
10102                          str, regno);
10103               if (*args == 'N')
10104                 INSERT_OPERAND (BCC, *ip, regno);
10105               else
10106                 INSERT_OPERAND (CCC, *ip, regno);
10107               continue;
10108
10109             case 'H':
10110               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
10111                 s += 2;
10112               if (ISDIGIT (*s))
10113                 {
10114                   c = 0;
10115                   do
10116                     {
10117                       c *= 10;
10118                       c += *s - '0';
10119                       ++s;
10120                     }
10121                   while (ISDIGIT (*s));
10122                 }
10123               else
10124                 c = 8; /* Invalid sel value.  */
10125
10126               if (c > 7)
10127                 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
10128               ip->insn_opcode |= c;
10129               continue;
10130
10131             case 'e':
10132               /* Must be at least one digit.  */
10133               my_getExpression (&imm_expr, s);
10134               check_absolute_expr (ip, &imm_expr);
10135
10136               if ((unsigned long) imm_expr.X_add_number
10137                   > (unsigned long) OP_MASK_VECBYTE)
10138                 {
10139                   as_bad (_("bad byte vector index (%ld)"),
10140                            (long) imm_expr.X_add_number);
10141                   imm_expr.X_add_number = 0;
10142                 }
10143
10144               INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
10145               imm_expr.X_op = O_absent;
10146               s = expr_end;
10147               continue;
10148
10149             case '%':
10150               my_getExpression (&imm_expr, s);
10151               check_absolute_expr (ip, &imm_expr);
10152
10153               if ((unsigned long) imm_expr.X_add_number
10154                   > (unsigned long) OP_MASK_VECALIGN)
10155                 {
10156                   as_bad (_("bad byte vector index (%ld)"),
10157                            (long) imm_expr.X_add_number);
10158                   imm_expr.X_add_number = 0;
10159                 }
10160
10161               INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
10162               imm_expr.X_op = O_absent;
10163               s = expr_end;
10164               continue;
10165
10166             default:
10167               as_bad (_("bad char = '%c'\n"), *args);
10168               internalError ();
10169             }
10170           break;
10171         }
10172       /* Args don't match.  */
10173       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
10174           !strcmp (insn->name, insn[1].name))
10175         {
10176           ++insn;
10177           s = argsStart;
10178           insn_error = _("illegal operands");
10179           continue;
10180         }
10181       if (save_c)
10182         *(--argsStart) = save_c;
10183       insn_error = _("illegal operands");
10184       return;
10185     }
10186 }
10187
10188 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10189
10190 /* This routine assembles an instruction into its binary format when
10191    assembling for the mips16.  As a side effect, it sets one of the
10192    global variables imm_reloc or offset_reloc to the type of
10193    relocation to do if one of the operands is an address expression.
10194    It also sets mips16_small and mips16_ext if the user explicitly
10195    requested a small or extended instruction.  */
10196
10197 static void
10198 mips16_ip (char *str, struct mips_cl_insn *ip)
10199 {
10200   char *s;
10201   const char *args;
10202   struct mips_opcode *insn;
10203   char *argsstart;
10204   unsigned int regno;
10205   unsigned int lastregno = 0;
10206   char *s_reset;
10207   size_t i;
10208
10209   insn_error = NULL;
10210
10211   mips16_small = FALSE;
10212   mips16_ext = FALSE;
10213
10214   for (s = str; ISLOWER (*s); ++s)
10215     ;
10216   switch (*s)
10217     {
10218     case '\0':
10219       break;
10220
10221     case ' ':
10222       *s++ = '\0';
10223       break;
10224
10225     case '.':
10226       if (s[1] == 't' && s[2] == ' ')
10227         {
10228           *s = '\0';
10229           mips16_small = TRUE;
10230           s += 3;
10231           break;
10232         }
10233       else if (s[1] == 'e' && s[2] == ' ')
10234         {
10235           *s = '\0';
10236           mips16_ext = TRUE;
10237           s += 3;
10238           break;
10239         }
10240       /* Fall through.  */
10241     default:
10242       insn_error = _("unknown opcode");
10243       return;
10244     }
10245
10246   if (mips_opts.noautoextend && ! mips16_ext)
10247     mips16_small = TRUE;
10248
10249   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10250     {
10251       insn_error = _("unrecognized opcode");
10252       return;
10253     }
10254
10255   argsstart = s;
10256   for (;;)
10257     {
10258       bfd_boolean ok;
10259
10260       gas_assert (strcmp (insn->name, str) == 0);
10261
10262       ok = is_opcode_valid_16 (insn);
10263       if (! ok)
10264         {
10265           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10266               && strcmp (insn->name, insn[1].name) == 0)
10267             {
10268               ++insn;
10269               continue;
10270             }
10271           else
10272             {
10273               if (!insn_error)
10274                 {
10275                   static char buf[100];
10276                   sprintf (buf,
10277                            _("opcode not supported on this processor: %s (%s)"),
10278                            mips_cpu_info_from_arch (mips_opts.arch)->name,
10279                            mips_cpu_info_from_isa (mips_opts.isa)->name);
10280                   insn_error = buf;
10281                 }
10282               return;
10283             }
10284         }
10285
10286       create_insn (ip, insn);
10287       imm_expr.X_op = O_absent;
10288       imm_reloc[0] = BFD_RELOC_UNUSED;
10289       imm_reloc[1] = BFD_RELOC_UNUSED;
10290       imm_reloc[2] = BFD_RELOC_UNUSED;
10291       imm2_expr.X_op = O_absent;
10292       offset_expr.X_op = O_absent;
10293       offset_reloc[0] = BFD_RELOC_UNUSED;
10294       offset_reloc[1] = BFD_RELOC_UNUSED;
10295       offset_reloc[2] = BFD_RELOC_UNUSED;
10296       for (args = insn->args; 1; ++args)
10297         {
10298           int c;
10299
10300           if (*s == ' ')
10301             ++s;
10302
10303           /* In this switch statement we call break if we did not find
10304              a match, continue if we did find a match, or return if we
10305              are done.  */
10306
10307           c = *args;
10308           switch (c)
10309             {
10310             case '\0':
10311               if (*s == '\0')
10312                 {
10313                   /* Stuff the immediate value in now, if we can.  */
10314                   if (imm_expr.X_op == O_constant
10315                       && *imm_reloc > BFD_RELOC_UNUSED
10316                       && *imm_reloc != BFD_RELOC_MIPS16_GOT16
10317                       && *imm_reloc != BFD_RELOC_MIPS16_CALL16
10318                       && insn->pinfo != INSN_MACRO)
10319                     {
10320                       valueT tmp;
10321
10322                       switch (*offset_reloc)
10323                         {
10324                           case BFD_RELOC_MIPS16_HI16_S:
10325                             tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10326                             break;
10327
10328                           case BFD_RELOC_MIPS16_HI16:
10329                             tmp = imm_expr.X_add_number >> 16;
10330                             break;
10331
10332                           case BFD_RELOC_MIPS16_LO16:
10333                             tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10334                                   - 0x8000;
10335                             break;
10336
10337                           case BFD_RELOC_UNUSED:
10338                             tmp = imm_expr.X_add_number;
10339                             break;
10340
10341                           default:
10342                             internalError ();
10343                         }
10344                       *offset_reloc = BFD_RELOC_UNUSED;
10345
10346                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
10347                                     tmp, TRUE, mips16_small,
10348                                     mips16_ext, &ip->insn_opcode,
10349                                     &ip->use_extend, &ip->extend);
10350                       imm_expr.X_op = O_absent;
10351                       *imm_reloc = BFD_RELOC_UNUSED;
10352                     }
10353
10354                   return;
10355                 }
10356               break;
10357
10358             case ',':
10359               if (*s++ == c)
10360                 continue;
10361               s--;
10362               switch (*++args)
10363                 {
10364                 case 'v':
10365                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10366                   continue;
10367                 case 'w':
10368                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10369                   continue;
10370                 }
10371               break;
10372
10373             case '(':
10374             case ')':
10375               if (*s++ == c)
10376                 continue;
10377               break;
10378
10379             case 'v':
10380             case 'w':
10381               if (s[0] != '$')
10382                 {
10383                   if (c == 'v')
10384                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10385                   else
10386                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10387                   ++args;
10388                   continue;
10389                 }
10390               /* Fall through.  */
10391             case 'x':
10392             case 'y':
10393             case 'z':
10394             case 'Z':
10395             case '0':
10396             case 'S':
10397             case 'R':
10398             case 'X':
10399             case 'Y':
10400               s_reset = s;
10401               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
10402                 {
10403                   if (c == 'v' || c == 'w')
10404                     {
10405                       if (c == 'v')
10406                         MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10407                       else
10408                         MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10409                       ++args;
10410                       continue;
10411                     }
10412                   break;
10413                 }
10414
10415               if (*s == ' ')
10416                 ++s;
10417               if (args[1] != *s)
10418                 {
10419                   if (c == 'v' || c == 'w')
10420                     {
10421                       regno = mips16_to_32_reg_map[lastregno];
10422                       s = s_reset;
10423                       ++args;
10424                     }
10425                 }
10426
10427               switch (c)
10428                 {
10429                 case 'x':
10430                 case 'y':
10431                 case 'z':
10432                 case 'v':
10433                 case 'w':
10434                 case 'Z':
10435                   regno = mips32_to_16_reg_map[regno];
10436                   break;
10437
10438                 case '0':
10439                   if (regno != 0)
10440                     regno = ILLEGAL_REG;
10441                   break;
10442
10443                 case 'S':
10444                   if (regno != SP)
10445                     regno = ILLEGAL_REG;
10446                   break;
10447
10448                 case 'R':
10449                   if (regno != RA)
10450                     regno = ILLEGAL_REG;
10451                   break;
10452
10453                 case 'X':
10454                 case 'Y':
10455                   if (regno == AT && mips_opts.at)
10456                     {
10457                       if (mips_opts.at == ATREG)
10458                         as_warn (_("used $at without \".set noat\""));
10459                       else
10460                         as_warn (_("used $%u with \".set at=$%u\""),
10461                                  regno, mips_opts.at);
10462                     }
10463                   break;
10464
10465                 default:
10466                   internalError ();
10467                 }
10468
10469               if (regno == ILLEGAL_REG)
10470                 break;
10471
10472               switch (c)
10473                 {
10474                 case 'x':
10475                 case 'v':
10476                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
10477                   break;
10478                 case 'y':
10479                 case 'w':
10480                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
10481                   break;
10482                 case 'z':
10483                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10484                   break;
10485                 case 'Z':
10486                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10487                 case '0':
10488                 case 'S':
10489                 case 'R':
10490                   break;
10491                 case 'X':
10492                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10493                   break;
10494                 case 'Y':
10495                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10496                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10497                   break;
10498                 default:
10499                   internalError ();
10500                 }
10501
10502               lastregno = regno;
10503               continue;
10504
10505             case 'P':
10506               if (strncmp (s, "$pc", 3) == 0)
10507                 {
10508                   s += 3;
10509                   continue;
10510                 }
10511               break;
10512
10513             case '5':
10514             case 'H':
10515             case 'W':
10516             case 'D':
10517             case 'j':
10518             case 'V':
10519             case 'C':
10520             case 'U':
10521             case 'k':
10522             case 'K':
10523               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10524               if (i > 0)
10525                 {
10526                   if (imm_expr.X_op != O_constant)
10527                     {
10528                       mips16_ext = TRUE;
10529                       ip->use_extend = TRUE;
10530                       ip->extend = 0;
10531                     }
10532                   else
10533                     {
10534                       /* We need to relax this instruction.  */
10535                       *offset_reloc = *imm_reloc;
10536                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10537                     }
10538                   s = expr_end;
10539                   continue;
10540                 }
10541               *imm_reloc = BFD_RELOC_UNUSED;
10542               /* Fall through.  */
10543             case '<':
10544             case '>':
10545             case '[':
10546             case ']':
10547             case '4':
10548             case '8':
10549               my_getExpression (&imm_expr, s);
10550               if (imm_expr.X_op == O_register)
10551                 {
10552                   /* What we thought was an expression turned out to
10553                      be a register.  */
10554
10555                   if (s[0] == '(' && args[1] == '(')
10556                     {
10557                       /* It looks like the expression was omitted
10558                          before a register indirection, which means
10559                          that the expression is implicitly zero.  We
10560                          still set up imm_expr, so that we handle
10561                          explicit extensions correctly.  */
10562                       imm_expr.X_op = O_constant;
10563                       imm_expr.X_add_number = 0;
10564                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10565                       continue;
10566                     }
10567
10568                   break;
10569                 }
10570
10571               /* We need to relax this instruction.  */
10572               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10573               s = expr_end;
10574               continue;
10575
10576             case 'p':
10577             case 'q':
10578             case 'A':
10579             case 'B':
10580             case 'E':
10581               /* We use offset_reloc rather than imm_reloc for the PC
10582                  relative operands.  This lets macros with both
10583                  immediate and address operands work correctly.  */
10584               my_getExpression (&offset_expr, s);
10585
10586               if (offset_expr.X_op == O_register)
10587                 break;
10588
10589               /* We need to relax this instruction.  */
10590               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10591               s = expr_end;
10592               continue;
10593
10594             case '6':           /* break code */
10595               my_getExpression (&imm_expr, s);
10596               check_absolute_expr (ip, &imm_expr);
10597               if ((unsigned long) imm_expr.X_add_number > 63)
10598                 as_warn (_("Invalid value for `%s' (%lu)"),
10599                          ip->insn_mo->name,
10600                          (unsigned long) imm_expr.X_add_number);
10601               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10602               imm_expr.X_op = O_absent;
10603               s = expr_end;
10604               continue;
10605
10606             case 'a':           /* 26 bit address */
10607               my_getExpression (&offset_expr, s);
10608               s = expr_end;
10609               *offset_reloc = BFD_RELOC_MIPS16_JMP;
10610               ip->insn_opcode <<= 16;
10611               continue;
10612
10613             case 'l':           /* register list for entry macro */
10614             case 'L':           /* register list for exit macro */
10615               {
10616                 int mask;
10617
10618                 if (c == 'l')
10619                   mask = 0;
10620                 else
10621                   mask = 7 << 3;
10622                 while (*s != '\0')
10623                   {
10624                     unsigned int freg, reg1, reg2;
10625
10626                     while (*s == ' ' || *s == ',')
10627                       ++s;
10628                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10629                       freg = 0;
10630                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10631                       freg = 1;
10632                     else
10633                       {
10634                         as_bad (_("can't parse register list"));
10635                         break;
10636                       }
10637                     if (*s == ' ')
10638                       ++s;
10639                     if (*s != '-')
10640                       reg2 = reg1;
10641                     else
10642                       {
10643                         ++s;
10644                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
10645                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
10646                           {
10647                             as_bad (_("invalid register list"));
10648                             break;
10649                           }
10650                       }
10651                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10652                       {
10653                         mask &= ~ (7 << 3);
10654                         mask |= 5 << 3;
10655                       }
10656                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10657                       {
10658                         mask &= ~ (7 << 3);
10659                         mask |= 6 << 3;
10660                       }
10661                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10662                       mask |= (reg2 - 3) << 3;
10663                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10664                       mask |= (reg2 - 15) << 1;
10665                     else if (reg1 == RA && reg2 == RA)
10666                       mask |= 1;
10667                     else
10668                       {
10669                         as_bad (_("invalid register list"));
10670                         break;
10671                       }
10672                   }
10673                 /* The mask is filled in in the opcode table for the
10674                    benefit of the disassembler.  We remove it before
10675                    applying the actual mask.  */
10676                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10677                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10678               }
10679             continue;
10680
10681             case 'm':           /* Register list for save insn.  */
10682             case 'M':           /* Register list for restore insn.  */
10683               {
10684                 int opcode = 0;
10685                 int framesz = 0, seen_framesz = 0;
10686                 int nargs = 0, statics = 0, sregs = 0;
10687
10688                 while (*s != '\0')
10689                   {
10690                     unsigned int reg1, reg2;
10691
10692                     SKIP_SPACE_TABS (s);
10693                     while (*s == ',')
10694                       ++s;
10695                     SKIP_SPACE_TABS (s);
10696
10697                     my_getExpression (&imm_expr, s);
10698                     if (imm_expr.X_op == O_constant)
10699                       {
10700                         /* Handle the frame size.  */
10701                         if (seen_framesz)
10702                           {
10703                             as_bad (_("more than one frame size in list"));
10704                             break;
10705                           }
10706                         seen_framesz = 1;
10707                         framesz = imm_expr.X_add_number;
10708                         imm_expr.X_op = O_absent;
10709                         s = expr_end;
10710                         continue;
10711                       }
10712
10713                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10714                       {
10715                         as_bad (_("can't parse register list"));
10716                         break;
10717                       }
10718
10719                     while (*s == ' ')
10720                       ++s;
10721
10722                     if (*s != '-')
10723                       reg2 = reg1;
10724                     else
10725                       {
10726                         ++s;
10727                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10728                             || reg2 < reg1)
10729                           {
10730                             as_bad (_("can't parse register list"));
10731                             break;
10732                           }
10733                       }
10734
10735                     while (reg1 <= reg2)
10736                       {
10737                         if (reg1 >= 4 && reg1 <= 7)
10738                           {
10739                             if (!seen_framesz)
10740                                 /* args $a0-$a3 */
10741                                 nargs |= 1 << (reg1 - 4);
10742                             else
10743                                 /* statics $a0-$a3 */
10744                                 statics |= 1 << (reg1 - 4);
10745                           }
10746                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10747                           {
10748                             /* $s0-$s8 */
10749                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10750                           }
10751                         else if (reg1 == 31)
10752                           {
10753                             /* Add $ra to insn.  */
10754                             opcode |= 0x40;
10755                           }
10756                         else
10757                           {
10758                             as_bad (_("unexpected register in list"));
10759                             break;
10760                           }
10761                         if (++reg1 == 24)
10762                           reg1 = 30;
10763                       }
10764                   }
10765
10766                 /* Encode args/statics combination.  */
10767                 if (nargs & statics)
10768                   as_bad (_("arg/static registers overlap"));
10769                 else if (nargs == 0xf)
10770                   /* All $a0-$a3 are args.  */
10771                   opcode |= MIPS16_ALL_ARGS << 16;
10772                 else if (statics == 0xf)
10773                   /* All $a0-$a3 are statics.  */
10774                   opcode |= MIPS16_ALL_STATICS << 16;
10775                 else 
10776                   {
10777                     int narg = 0, nstat = 0;
10778
10779                     /* Count arg registers.  */
10780                     while (nargs & 0x1)
10781                       {
10782                         nargs >>= 1;
10783                         narg++;
10784                       }
10785                     if (nargs != 0)
10786                       as_bad (_("invalid arg register list"));
10787
10788                     /* Count static registers.  */
10789                     while (statics & 0x8)
10790                       {
10791                         statics = (statics << 1) & 0xf;
10792                         nstat++;
10793                       }
10794                     if (statics != 0) 
10795                       as_bad (_("invalid static register list"));
10796
10797                     /* Encode args/statics.  */
10798                     opcode |= ((narg << 2) | nstat) << 16;
10799                   }
10800
10801                 /* Encode $s0/$s1.  */
10802                 if (sregs & (1 << 0))           /* $s0 */
10803                   opcode |= 0x20;
10804                 if (sregs & (1 << 1))           /* $s1 */
10805                   opcode |= 0x10;
10806                 sregs >>= 2;
10807
10808                 if (sregs != 0)
10809                   {
10810                     /* Count regs $s2-$s8.  */
10811                     int nsreg = 0;
10812                     while (sregs & 1)
10813                       {
10814                         sregs >>= 1;
10815                         nsreg++;
10816                       }
10817                     if (sregs != 0)
10818                       as_bad (_("invalid static register list"));
10819                     /* Encode $s2-$s8. */
10820                     opcode |= nsreg << 24;
10821                   }
10822
10823                 /* Encode frame size.  */
10824                 if (!seen_framesz)
10825                   as_bad (_("missing frame size"));
10826                 else if ((framesz & 7) != 0 || framesz < 0
10827                          || framesz > 0xff * 8)
10828                   as_bad (_("invalid frame size"));
10829                 else if (framesz != 128 || (opcode >> 16) != 0)
10830                   {
10831                     framesz /= 8;
10832                     opcode |= (((framesz & 0xf0) << 16)
10833                              | (framesz & 0x0f));
10834                   }
10835
10836                 /* Finally build the instruction.  */
10837                 if ((opcode >> 16) != 0 || framesz == 0)
10838                   {
10839                     ip->use_extend = TRUE;
10840                     ip->extend = opcode >> 16;
10841                   }
10842                 ip->insn_opcode |= opcode & 0x7f;
10843               }
10844             continue;
10845
10846             case 'e':           /* extend code */
10847               my_getExpression (&imm_expr, s);
10848               check_absolute_expr (ip, &imm_expr);
10849               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10850                 {
10851                   as_warn (_("Invalid value for `%s' (%lu)"),
10852                            ip->insn_mo->name,
10853                            (unsigned long) imm_expr.X_add_number);
10854                   imm_expr.X_add_number &= 0x7ff;
10855                 }
10856               ip->insn_opcode |= imm_expr.X_add_number;
10857               imm_expr.X_op = O_absent;
10858               s = expr_end;
10859               continue;
10860
10861             default:
10862               internalError ();
10863             }
10864           break;
10865         }
10866
10867       /* Args don't match.  */
10868       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10869           strcmp (insn->name, insn[1].name) == 0)
10870         {
10871           ++insn;
10872           s = argsstart;
10873           continue;
10874         }
10875
10876       insn_error = _("illegal operands");
10877
10878       return;
10879     }
10880 }
10881
10882 /* This structure holds information we know about a mips16 immediate
10883    argument type.  */
10884
10885 struct mips16_immed_operand
10886 {
10887   /* The type code used in the argument string in the opcode table.  */
10888   int type;
10889   /* The number of bits in the short form of the opcode.  */
10890   int nbits;
10891   /* The number of bits in the extended form of the opcode.  */
10892   int extbits;
10893   /* The amount by which the short form is shifted when it is used;
10894      for example, the sw instruction has a shift count of 2.  */
10895   int shift;
10896   /* The amount by which the short form is shifted when it is stored
10897      into the instruction code.  */
10898   int op_shift;
10899   /* Non-zero if the short form is unsigned.  */
10900   int unsp;
10901   /* Non-zero if the extended form is unsigned.  */
10902   int extu;
10903   /* Non-zero if the value is PC relative.  */
10904   int pcrel;
10905 };
10906
10907 /* The mips16 immediate operand types.  */
10908
10909 static const struct mips16_immed_operand mips16_immed_operands[] =
10910 {
10911   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10912   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10913   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10914   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10915   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10916   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10917   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10918   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10919   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10920   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10921   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10922   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10923   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10924   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10925   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10926   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10927   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10928   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10929   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10930   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10931   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10932 };
10933
10934 #define MIPS16_NUM_IMMED \
10935   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10936
10937 /* Handle a mips16 instruction with an immediate value.  This or's the
10938    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
10939    whether an extended value is needed; if one is needed, it sets
10940    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
10941    If SMALL is true, an unextended opcode was explicitly requested.
10942    If EXT is true, an extended opcode was explicitly requested.  If
10943    WARN is true, warn if EXT does not match reality.  */
10944
10945 static void
10946 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10947               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10948               unsigned long *insn, bfd_boolean *use_extend,
10949               unsigned short *extend)
10950 {
10951   const struct mips16_immed_operand *op;
10952   int mintiny, maxtiny;
10953   bfd_boolean needext;
10954
10955   op = mips16_immed_operands;
10956   while (op->type != type)
10957     {
10958       ++op;
10959       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10960     }
10961
10962   if (op->unsp)
10963     {
10964       if (type == '<' || type == '>' || type == '[' || type == ']')
10965         {
10966           mintiny = 1;
10967           maxtiny = 1 << op->nbits;
10968         }
10969       else
10970         {
10971           mintiny = 0;
10972           maxtiny = (1 << op->nbits) - 1;
10973         }
10974     }
10975   else
10976     {
10977       mintiny = - (1 << (op->nbits - 1));
10978       maxtiny = (1 << (op->nbits - 1)) - 1;
10979     }
10980
10981   /* Branch offsets have an implicit 0 in the lowest bit.  */
10982   if (type == 'p' || type == 'q')
10983     val /= 2;
10984
10985   if ((val & ((1 << op->shift) - 1)) != 0
10986       || val < (mintiny << op->shift)
10987       || val > (maxtiny << op->shift))
10988     needext = TRUE;
10989   else
10990     needext = FALSE;
10991
10992   if (warn && ext && ! needext)
10993     as_warn_where (file, line,
10994                    _("extended operand requested but not required"));
10995   if (small && needext)
10996     as_bad_where (file, line, _("invalid unextended operand value"));
10997
10998   if (small || (! ext && ! needext))
10999     {
11000       int insnval;
11001
11002       *use_extend = FALSE;
11003       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
11004       insnval <<= op->op_shift;
11005       *insn |= insnval;
11006     }
11007   else
11008     {
11009       long minext, maxext;
11010       int extval;
11011
11012       if (op->extu)
11013         {
11014           minext = 0;
11015           maxext = (1 << op->extbits) - 1;
11016         }
11017       else
11018         {
11019           minext = - (1 << (op->extbits - 1));
11020           maxext = (1 << (op->extbits - 1)) - 1;
11021         }
11022       if (val < minext || val > maxext)
11023         as_bad_where (file, line,
11024                       _("operand value out of range for instruction"));
11025
11026       *use_extend = TRUE;
11027       if (op->extbits == 16)
11028         {
11029           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
11030           val &= 0x1f;
11031         }
11032       else if (op->extbits == 15)
11033         {
11034           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
11035           val &= 0xf;
11036         }
11037       else
11038         {
11039           extval = ((val & 0x1f) << 6) | (val & 0x20);
11040           val = 0;
11041         }
11042
11043       *extend = (unsigned short) extval;
11044       *insn |= val;
11045     }
11046 }
11047 \f
11048 struct percent_op_match
11049 {
11050   const char *str;
11051   bfd_reloc_code_real_type reloc;
11052 };
11053
11054 static const struct percent_op_match mips_percent_op[] =
11055 {
11056   {"%lo", BFD_RELOC_LO16},
11057 #ifdef OBJ_ELF
11058   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
11059   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
11060   {"%call16", BFD_RELOC_MIPS_CALL16},
11061   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
11062   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
11063   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
11064   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
11065   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
11066   {"%got", BFD_RELOC_MIPS_GOT16},
11067   {"%gp_rel", BFD_RELOC_GPREL16},
11068   {"%half", BFD_RELOC_16},
11069   {"%highest", BFD_RELOC_MIPS_HIGHEST},
11070   {"%higher", BFD_RELOC_MIPS_HIGHER},
11071   {"%neg", BFD_RELOC_MIPS_SUB},
11072   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
11073   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
11074   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
11075   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
11076   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
11077   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
11078   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
11079 #endif
11080   {"%hi", BFD_RELOC_HI16_S}
11081 };
11082
11083 static const struct percent_op_match mips16_percent_op[] =
11084 {
11085   {"%lo", BFD_RELOC_MIPS16_LO16},
11086   {"%gprel", BFD_RELOC_MIPS16_GPREL},
11087   {"%got", BFD_RELOC_MIPS16_GOT16},
11088   {"%call16", BFD_RELOC_MIPS16_CALL16},
11089   {"%hi", BFD_RELOC_MIPS16_HI16_S}
11090 };
11091
11092
11093 /* Return true if *STR points to a relocation operator.  When returning true,
11094    move *STR over the operator and store its relocation code in *RELOC.
11095    Leave both *STR and *RELOC alone when returning false.  */
11096
11097 static bfd_boolean
11098 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
11099 {
11100   const struct percent_op_match *percent_op;
11101   size_t limit, i;
11102
11103   if (mips_opts.mips16)
11104     {
11105       percent_op = mips16_percent_op;
11106       limit = ARRAY_SIZE (mips16_percent_op);
11107     }
11108   else
11109     {
11110       percent_op = mips_percent_op;
11111       limit = ARRAY_SIZE (mips_percent_op);
11112     }
11113
11114   for (i = 0; i < limit; i++)
11115     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
11116       {
11117         int len = strlen (percent_op[i].str);
11118
11119         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
11120           continue;
11121
11122         *str += strlen (percent_op[i].str);
11123         *reloc = percent_op[i].reloc;
11124
11125         /* Check whether the output BFD supports this relocation.
11126            If not, issue an error and fall back on something safe.  */
11127         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
11128           {
11129             as_bad (_("relocation %s isn't supported by the current ABI"),
11130                     percent_op[i].str);
11131             *reloc = BFD_RELOC_UNUSED;
11132           }
11133         return TRUE;
11134       }
11135   return FALSE;
11136 }
11137
11138
11139 /* Parse string STR as a 16-bit relocatable operand.  Store the
11140    expression in *EP and the relocations in the array starting
11141    at RELOC.  Return the number of relocation operators used.
11142
11143    On exit, EXPR_END points to the first character after the expression.  */
11144
11145 static size_t
11146 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
11147                        char *str)
11148 {
11149   bfd_reloc_code_real_type reversed_reloc[3];
11150   size_t reloc_index, i;
11151   int crux_depth, str_depth;
11152   char *crux;
11153
11154   /* Search for the start of the main expression, recoding relocations
11155      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
11156      of the main expression and with CRUX_DEPTH containing the number
11157      of open brackets at that point.  */
11158   reloc_index = -1;
11159   str_depth = 0;
11160   do
11161     {
11162       reloc_index++;
11163       crux = str;
11164       crux_depth = str_depth;
11165
11166       /* Skip over whitespace and brackets, keeping count of the number
11167          of brackets.  */
11168       while (*str == ' ' || *str == '\t' || *str == '(')
11169         if (*str++ == '(')
11170           str_depth++;
11171     }
11172   while (*str == '%'
11173          && reloc_index < (HAVE_NEWABI ? 3 : 1)
11174          && parse_relocation (&str, &reversed_reloc[reloc_index]));
11175
11176   my_getExpression (ep, crux);
11177   str = expr_end;
11178
11179   /* Match every open bracket.  */
11180   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
11181     if (*str++ == ')')
11182       crux_depth--;
11183
11184   if (crux_depth > 0)
11185     as_bad (_("unclosed '('"));
11186
11187   expr_end = str;
11188
11189   if (reloc_index != 0)
11190     {
11191       prev_reloc_op_frag = frag_now;
11192       for (i = 0; i < reloc_index; i++)
11193         reloc[i] = reversed_reloc[reloc_index - 1 - i];
11194     }
11195
11196   return reloc_index;
11197 }
11198
11199 static void
11200 my_getExpression (expressionS *ep, char *str)
11201 {
11202   char *save_in;
11203   valueT val;
11204
11205   save_in = input_line_pointer;
11206   input_line_pointer = str;
11207   expression (ep);
11208   expr_end = input_line_pointer;
11209   input_line_pointer = save_in;
11210
11211   /* If we are in mips16 mode, and this is an expression based on `.',
11212      then we bump the value of the symbol by 1 since that is how other
11213      text symbols are handled.  We don't bother to handle complex
11214      expressions, just `.' plus or minus a constant.  */
11215   if (mips_opts.mips16
11216       && ep->X_op == O_symbol
11217       && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
11218       && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
11219       && symbol_get_frag (ep->X_add_symbol) == frag_now
11220       && symbol_constant_p (ep->X_add_symbol)
11221       && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
11222     S_SET_VALUE (ep->X_add_symbol, val + 1);
11223 }
11224
11225 char *
11226 md_atof (int type, char *litP, int *sizeP)
11227 {
11228   return ieee_md_atof (type, litP, sizeP, target_big_endian);
11229 }
11230
11231 void
11232 md_number_to_chars (char *buf, valueT val, int n)
11233 {
11234   if (target_big_endian)
11235     number_to_chars_bigendian (buf, val, n);
11236   else
11237     number_to_chars_littleendian (buf, val, n);
11238 }
11239 \f
11240 #ifdef OBJ_ELF
11241 static int support_64bit_objects(void)
11242 {
11243   const char **list, **l;
11244   int yes;
11245
11246   list = bfd_target_list ();
11247   for (l = list; *l != NULL; l++)
11248 #ifdef TE_TMIPS
11249     /* This is traditional mips */
11250     if (strcmp (*l, "elf64-tradbigmips") == 0
11251         || strcmp (*l, "elf64-tradlittlemips") == 0)
11252 #else
11253     if (strcmp (*l, "elf64-bigmips") == 0
11254         || strcmp (*l, "elf64-littlemips") == 0)
11255 #endif
11256       break;
11257   yes = (*l != NULL);
11258   free (list);
11259   return yes;
11260 }
11261 #endif /* OBJ_ELF */
11262
11263 const char *md_shortopts = "O::g::G:";
11264
11265 enum options
11266   {
11267     OPTION_MARCH = OPTION_MD_BASE,
11268     OPTION_MTUNE,
11269     OPTION_MIPS1,
11270     OPTION_MIPS2,
11271     OPTION_MIPS3,
11272     OPTION_MIPS4,
11273     OPTION_MIPS5,
11274     OPTION_MIPS32,
11275     OPTION_MIPS64,
11276     OPTION_MIPS32R2,
11277     OPTION_MIPS64R2,
11278     OPTION_MIPS16,
11279     OPTION_NO_MIPS16,
11280     OPTION_MIPS3D,
11281     OPTION_NO_MIPS3D,
11282     OPTION_MDMX,
11283     OPTION_NO_MDMX,
11284     OPTION_DSP,
11285     OPTION_NO_DSP,
11286     OPTION_MT,
11287     OPTION_NO_MT,
11288     OPTION_SMARTMIPS,
11289     OPTION_NO_SMARTMIPS,
11290     OPTION_DSPR2,
11291     OPTION_NO_DSPR2,
11292     OPTION_COMPAT_ARCH_BASE,
11293     OPTION_M4650,
11294     OPTION_NO_M4650,
11295     OPTION_M4010,
11296     OPTION_NO_M4010,
11297     OPTION_M4100,
11298     OPTION_NO_M4100,
11299     OPTION_M3900,
11300     OPTION_NO_M3900,
11301     OPTION_M7000_HILO_FIX,
11302     OPTION_MNO_7000_HILO_FIX, 
11303     OPTION_FIX_24K,
11304     OPTION_NO_FIX_24K,
11305     OPTION_FIX_LOONGSON2F_JUMP,
11306     OPTION_NO_FIX_LOONGSON2F_JUMP,
11307     OPTION_FIX_LOONGSON2F_NOP,
11308     OPTION_NO_FIX_LOONGSON2F_NOP,
11309     OPTION_FIX_VR4120,
11310     OPTION_NO_FIX_VR4120,
11311     OPTION_FIX_VR4130,
11312     OPTION_NO_FIX_VR4130,
11313     OPTION_FIX_CN63XXP1,
11314     OPTION_NO_FIX_CN63XXP1,
11315     OPTION_TRAP,
11316     OPTION_BREAK,
11317     OPTION_EB,
11318     OPTION_EL,
11319     OPTION_FP32,
11320     OPTION_GP32,
11321     OPTION_CONSTRUCT_FLOATS,
11322     OPTION_NO_CONSTRUCT_FLOATS,
11323     OPTION_FP64,
11324     OPTION_GP64,
11325     OPTION_RELAX_BRANCH,
11326     OPTION_NO_RELAX_BRANCH,
11327     OPTION_MSHARED,
11328     OPTION_MNO_SHARED,
11329     OPTION_MSYM32,
11330     OPTION_MNO_SYM32,
11331     OPTION_SOFT_FLOAT,
11332     OPTION_HARD_FLOAT,
11333     OPTION_SINGLE_FLOAT,
11334     OPTION_DOUBLE_FLOAT,
11335     OPTION_32,
11336 #ifdef OBJ_ELF
11337     OPTION_CALL_SHARED,
11338     OPTION_CALL_NONPIC,
11339     OPTION_NON_SHARED,
11340     OPTION_XGOT,
11341     OPTION_MABI,
11342     OPTION_N32,
11343     OPTION_64,
11344     OPTION_MDEBUG,
11345     OPTION_NO_MDEBUG,
11346     OPTION_PDR,
11347     OPTION_NO_PDR,
11348     OPTION_MVXWORKS_PIC,
11349 #endif /* OBJ_ELF */
11350     OPTION_END_OF_ENUM    
11351   };
11352   
11353 struct option md_longopts[] =
11354 {
11355   /* Options which specify architecture.  */
11356   {"march", required_argument, NULL, OPTION_MARCH},
11357   {"mtune", required_argument, NULL, OPTION_MTUNE},
11358   {"mips0", no_argument, NULL, OPTION_MIPS1},
11359   {"mips1", no_argument, NULL, OPTION_MIPS1},
11360   {"mips2", no_argument, NULL, OPTION_MIPS2},
11361   {"mips3", no_argument, NULL, OPTION_MIPS3},
11362   {"mips4", no_argument, NULL, OPTION_MIPS4},
11363   {"mips5", no_argument, NULL, OPTION_MIPS5},
11364   {"mips32", no_argument, NULL, OPTION_MIPS32},
11365   {"mips64", no_argument, NULL, OPTION_MIPS64},
11366   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
11367   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
11368
11369   /* Options which specify Application Specific Extensions (ASEs).  */
11370   {"mips16", no_argument, NULL, OPTION_MIPS16},
11371   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
11372   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
11373   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
11374   {"mdmx", no_argument, NULL, OPTION_MDMX},
11375   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
11376   {"mdsp", no_argument, NULL, OPTION_DSP},
11377   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
11378   {"mmt", no_argument, NULL, OPTION_MT},
11379   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
11380   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
11381   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
11382   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
11383   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
11384
11385   /* Old-style architecture options.  Don't add more of these.  */
11386   {"m4650", no_argument, NULL, OPTION_M4650},
11387   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
11388   {"m4010", no_argument, NULL, OPTION_M4010},
11389   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
11390   {"m4100", no_argument, NULL, OPTION_M4100},
11391   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
11392   {"m3900", no_argument, NULL, OPTION_M3900},
11393   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11394
11395   /* Options which enable bug fixes.  */
11396   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
11397   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11398   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11399   {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
11400   {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
11401   {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
11402   {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
11403   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
11404   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
11405   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
11406   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
11407   {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
11408   {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
11409   {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
11410   {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
11411
11412   /* Miscellaneous options.  */
11413   {"trap", no_argument, NULL, OPTION_TRAP},
11414   {"no-break", no_argument, NULL, OPTION_TRAP},
11415   {"break", no_argument, NULL, OPTION_BREAK},
11416   {"no-trap", no_argument, NULL, OPTION_BREAK},
11417   {"EB", no_argument, NULL, OPTION_EB},
11418   {"EL", no_argument, NULL, OPTION_EL},
11419   {"mfp32", no_argument, NULL, OPTION_FP32},
11420   {"mgp32", no_argument, NULL, OPTION_GP32},
11421   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
11422   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
11423   {"mfp64", no_argument, NULL, OPTION_FP64},
11424   {"mgp64", no_argument, NULL, OPTION_GP64},
11425   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11426   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
11427   {"mshared", no_argument, NULL, OPTION_MSHARED},
11428   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
11429   {"msym32", no_argument, NULL, OPTION_MSYM32},
11430   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
11431   {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
11432   {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
11433   {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
11434   {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
11435
11436   /* Strictly speaking this next option is ELF specific,
11437      but we allow it for other ports as well in order to
11438      make testing easier.  */
11439   {"32",          no_argument, NULL, OPTION_32},
11440   
11441   /* ELF-specific options.  */
11442 #ifdef OBJ_ELF
11443   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
11444   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
11445   {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
11446   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
11447   {"xgot",        no_argument, NULL, OPTION_XGOT},
11448   {"mabi", required_argument, NULL, OPTION_MABI},
11449   {"n32",         no_argument, NULL, OPTION_N32},
11450   {"64",          no_argument, NULL, OPTION_64},
11451   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
11452   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
11453   {"mpdr", no_argument, NULL, OPTION_PDR},
11454   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
11455   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
11456 #endif /* OBJ_ELF */
11457
11458   {NULL, no_argument, NULL, 0}
11459 };
11460 size_t md_longopts_size = sizeof (md_longopts);
11461
11462 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11463    NEW_VALUE.  Warn if another value was already specified.  Note:
11464    we have to defer parsing the -march and -mtune arguments in order
11465    to handle 'from-abi' correctly, since the ABI might be specified
11466    in a later argument.  */
11467
11468 static void
11469 mips_set_option_string (const char **string_ptr, const char *new_value)
11470 {
11471   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11472     as_warn (_("A different %s was already specified, is now %s"),
11473              string_ptr == &mips_arch_string ? "-march" : "-mtune",
11474              new_value);
11475
11476   *string_ptr = new_value;
11477 }
11478
11479 int
11480 md_parse_option (int c, char *arg)
11481 {
11482   switch (c)
11483     {
11484     case OPTION_CONSTRUCT_FLOATS:
11485       mips_disable_float_construction = 0;
11486       break;
11487
11488     case OPTION_NO_CONSTRUCT_FLOATS:
11489       mips_disable_float_construction = 1;
11490       break;
11491
11492     case OPTION_TRAP:
11493       mips_trap = 1;
11494       break;
11495
11496     case OPTION_BREAK:
11497       mips_trap = 0;
11498       break;
11499
11500     case OPTION_EB:
11501       target_big_endian = 1;
11502       break;
11503
11504     case OPTION_EL:
11505       target_big_endian = 0;
11506       break;
11507
11508     case 'O':
11509       if (arg == NULL)
11510         mips_optimize = 1;
11511       else if (arg[0] == '0')
11512         mips_optimize = 0;
11513       else if (arg[0] == '1')
11514         mips_optimize = 1;
11515       else
11516         mips_optimize = 2;
11517       break;
11518
11519     case 'g':
11520       if (arg == NULL)
11521         mips_debug = 2;
11522       else
11523         mips_debug = atoi (arg);
11524       break;
11525
11526     case OPTION_MIPS1:
11527       file_mips_isa = ISA_MIPS1;
11528       break;
11529
11530     case OPTION_MIPS2:
11531       file_mips_isa = ISA_MIPS2;
11532       break;
11533
11534     case OPTION_MIPS3:
11535       file_mips_isa = ISA_MIPS3;
11536       break;
11537
11538     case OPTION_MIPS4:
11539       file_mips_isa = ISA_MIPS4;
11540       break;
11541
11542     case OPTION_MIPS5:
11543       file_mips_isa = ISA_MIPS5;
11544       break;
11545
11546     case OPTION_MIPS32:
11547       file_mips_isa = ISA_MIPS32;
11548       break;
11549
11550     case OPTION_MIPS32R2:
11551       file_mips_isa = ISA_MIPS32R2;
11552       break;
11553
11554     case OPTION_MIPS64R2:
11555       file_mips_isa = ISA_MIPS64R2;
11556       break;
11557
11558     case OPTION_MIPS64:
11559       file_mips_isa = ISA_MIPS64;
11560       break;
11561
11562     case OPTION_MTUNE:
11563       mips_set_option_string (&mips_tune_string, arg);
11564       break;
11565
11566     case OPTION_MARCH:
11567       mips_set_option_string (&mips_arch_string, arg);
11568       break;
11569
11570     case OPTION_M4650:
11571       mips_set_option_string (&mips_arch_string, "4650");
11572       mips_set_option_string (&mips_tune_string, "4650");
11573       break;
11574
11575     case OPTION_NO_M4650:
11576       break;
11577
11578     case OPTION_M4010:
11579       mips_set_option_string (&mips_arch_string, "4010");
11580       mips_set_option_string (&mips_tune_string, "4010");
11581       break;
11582
11583     case OPTION_NO_M4010:
11584       break;
11585
11586     case OPTION_M4100:
11587       mips_set_option_string (&mips_arch_string, "4100");
11588       mips_set_option_string (&mips_tune_string, "4100");
11589       break;
11590
11591     case OPTION_NO_M4100:
11592       break;
11593
11594     case OPTION_M3900:
11595       mips_set_option_string (&mips_arch_string, "3900");
11596       mips_set_option_string (&mips_tune_string, "3900");
11597       break;
11598
11599     case OPTION_NO_M3900:
11600       break;
11601
11602     case OPTION_MDMX:
11603       mips_opts.ase_mdmx = 1;
11604       break;
11605
11606     case OPTION_NO_MDMX:
11607       mips_opts.ase_mdmx = 0;
11608       break;
11609
11610     case OPTION_DSP:
11611       mips_opts.ase_dsp = 1;
11612       mips_opts.ase_dspr2 = 0;
11613       break;
11614
11615     case OPTION_NO_DSP:
11616       mips_opts.ase_dsp = 0;
11617       mips_opts.ase_dspr2 = 0;
11618       break;
11619
11620     case OPTION_DSPR2:
11621       mips_opts.ase_dspr2 = 1;
11622       mips_opts.ase_dsp = 1;
11623       break;
11624
11625     case OPTION_NO_DSPR2:
11626       mips_opts.ase_dspr2 = 0;
11627       mips_opts.ase_dsp = 0;
11628       break;
11629
11630     case OPTION_MT:
11631       mips_opts.ase_mt = 1;
11632       break;
11633
11634     case OPTION_NO_MT:
11635       mips_opts.ase_mt = 0;
11636       break;
11637
11638     case OPTION_MIPS16:
11639       mips_opts.mips16 = 1;
11640       mips_no_prev_insn ();
11641       break;
11642
11643     case OPTION_NO_MIPS16:
11644       mips_opts.mips16 = 0;
11645       mips_no_prev_insn ();
11646       break;
11647
11648     case OPTION_MIPS3D:
11649       mips_opts.ase_mips3d = 1;
11650       break;
11651
11652     case OPTION_NO_MIPS3D:
11653       mips_opts.ase_mips3d = 0;
11654       break;
11655
11656     case OPTION_SMARTMIPS:
11657       mips_opts.ase_smartmips = 1;
11658       break;
11659
11660     case OPTION_NO_SMARTMIPS:
11661       mips_opts.ase_smartmips = 0;
11662       break;
11663
11664     case OPTION_FIX_24K:
11665       mips_fix_24k = 1;
11666       break;
11667
11668     case OPTION_NO_FIX_24K:
11669       mips_fix_24k = 0;
11670       break;
11671
11672     case OPTION_FIX_LOONGSON2F_JUMP:
11673       mips_fix_loongson2f_jump = TRUE;
11674       break;
11675
11676     case OPTION_NO_FIX_LOONGSON2F_JUMP:
11677       mips_fix_loongson2f_jump = FALSE;
11678       break;
11679
11680     case OPTION_FIX_LOONGSON2F_NOP:
11681       mips_fix_loongson2f_nop = TRUE;
11682       break;
11683
11684     case OPTION_NO_FIX_LOONGSON2F_NOP:
11685       mips_fix_loongson2f_nop = FALSE;
11686       break;
11687
11688     case OPTION_FIX_VR4120:
11689       mips_fix_vr4120 = 1;
11690       break;
11691
11692     case OPTION_NO_FIX_VR4120:
11693       mips_fix_vr4120 = 0;
11694       break;
11695
11696     case OPTION_FIX_VR4130:
11697       mips_fix_vr4130 = 1;
11698       break;
11699
11700     case OPTION_NO_FIX_VR4130:
11701       mips_fix_vr4130 = 0;
11702       break;
11703
11704     case OPTION_FIX_CN63XXP1:
11705       mips_fix_cn63xxp1 = TRUE;
11706       break;
11707
11708     case OPTION_NO_FIX_CN63XXP1:
11709       mips_fix_cn63xxp1 = FALSE;
11710       break;
11711
11712     case OPTION_RELAX_BRANCH:
11713       mips_relax_branch = 1;
11714       break;
11715
11716     case OPTION_NO_RELAX_BRANCH:
11717       mips_relax_branch = 0;
11718       break;
11719
11720     case OPTION_MSHARED:
11721       mips_in_shared = TRUE;
11722       break;
11723
11724     case OPTION_MNO_SHARED:
11725       mips_in_shared = FALSE;
11726       break;
11727
11728     case OPTION_MSYM32:
11729       mips_opts.sym32 = TRUE;
11730       break;
11731
11732     case OPTION_MNO_SYM32:
11733       mips_opts.sym32 = FALSE;
11734       break;
11735
11736 #ifdef OBJ_ELF
11737       /* When generating ELF code, we permit -KPIC and -call_shared to
11738          select SVR4_PIC, and -non_shared to select no PIC.  This is
11739          intended to be compatible with Irix 5.  */
11740     case OPTION_CALL_SHARED:
11741       if (!IS_ELF)
11742         {
11743           as_bad (_("-call_shared is supported only for ELF format"));
11744           return 0;
11745         }
11746       mips_pic = SVR4_PIC;
11747       mips_abicalls = TRUE;
11748       break;
11749
11750     case OPTION_CALL_NONPIC:
11751       if (!IS_ELF)
11752         {
11753           as_bad (_("-call_nonpic is supported only for ELF format"));
11754           return 0;
11755         }
11756       mips_pic = NO_PIC;
11757       mips_abicalls = TRUE;
11758       break;
11759
11760     case OPTION_NON_SHARED:
11761       if (!IS_ELF)
11762         {
11763           as_bad (_("-non_shared is supported only for ELF format"));
11764           return 0;
11765         }
11766       mips_pic = NO_PIC;
11767       mips_abicalls = FALSE;
11768       break;
11769
11770       /* The -xgot option tells the assembler to use 32 bit offsets
11771          when accessing the got in SVR4_PIC mode.  It is for Irix
11772          compatibility.  */
11773     case OPTION_XGOT:
11774       mips_big_got = 1;
11775       break;
11776 #endif /* OBJ_ELF */
11777
11778     case 'G':
11779       g_switch_value = atoi (arg);
11780       g_switch_seen = 1;
11781       break;
11782
11783       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11784          and -mabi=64.  */
11785     case OPTION_32:
11786       if (IS_ELF)
11787         mips_abi = O32_ABI;
11788       /* We silently ignore -32 for non-ELF targets.  This greatly
11789          simplifies the construction of the MIPS GAS test cases.  */
11790       break;
11791
11792 #ifdef OBJ_ELF
11793     case OPTION_N32:
11794       if (!IS_ELF)
11795         {
11796           as_bad (_("-n32 is supported for ELF format only"));
11797           return 0;
11798         }
11799       mips_abi = N32_ABI;
11800       break;
11801
11802     case OPTION_64:
11803       if (!IS_ELF)
11804         {
11805           as_bad (_("-64 is supported for ELF format only"));
11806           return 0;
11807         }
11808       mips_abi = N64_ABI;
11809       if (!support_64bit_objects())
11810         as_fatal (_("No compiled in support for 64 bit object file format"));
11811       break;
11812 #endif /* OBJ_ELF */
11813
11814     case OPTION_GP32:
11815       file_mips_gp32 = 1;
11816       break;
11817
11818     case OPTION_GP64:
11819       file_mips_gp32 = 0;
11820       break;
11821
11822     case OPTION_FP32:
11823       file_mips_fp32 = 1;
11824       break;
11825
11826     case OPTION_FP64:
11827       file_mips_fp32 = 0;
11828       break;
11829
11830     case OPTION_SINGLE_FLOAT:
11831       file_mips_single_float = 1;
11832       break;
11833
11834     case OPTION_DOUBLE_FLOAT:
11835       file_mips_single_float = 0;
11836       break;
11837
11838     case OPTION_SOFT_FLOAT:
11839       file_mips_soft_float = 1;
11840       break;
11841
11842     case OPTION_HARD_FLOAT:
11843       file_mips_soft_float = 0;
11844       break;
11845
11846 #ifdef OBJ_ELF
11847     case OPTION_MABI:
11848       if (!IS_ELF)
11849         {
11850           as_bad (_("-mabi is supported for ELF format only"));
11851           return 0;
11852         }
11853       if (strcmp (arg, "32") == 0)
11854         mips_abi = O32_ABI;
11855       else if (strcmp (arg, "o64") == 0)
11856         mips_abi = O64_ABI;
11857       else if (strcmp (arg, "n32") == 0)
11858         mips_abi = N32_ABI;
11859       else if (strcmp (arg, "64") == 0)
11860         {
11861           mips_abi = N64_ABI;
11862           if (! support_64bit_objects())
11863             as_fatal (_("No compiled in support for 64 bit object file "
11864                         "format"));
11865         }
11866       else if (strcmp (arg, "eabi") == 0)
11867         mips_abi = EABI_ABI;
11868       else
11869         {
11870           as_fatal (_("invalid abi -mabi=%s"), arg);
11871           return 0;
11872         }
11873       break;
11874 #endif /* OBJ_ELF */
11875
11876     case OPTION_M7000_HILO_FIX:
11877       mips_7000_hilo_fix = TRUE;
11878       break;
11879
11880     case OPTION_MNO_7000_HILO_FIX:
11881       mips_7000_hilo_fix = FALSE;
11882       break;
11883
11884 #ifdef OBJ_ELF
11885     case OPTION_MDEBUG:
11886       mips_flag_mdebug = TRUE;
11887       break;
11888
11889     case OPTION_NO_MDEBUG:
11890       mips_flag_mdebug = FALSE;
11891       break;
11892
11893     case OPTION_PDR:
11894       mips_flag_pdr = TRUE;
11895       break;
11896
11897     case OPTION_NO_PDR:
11898       mips_flag_pdr = FALSE;
11899       break;
11900
11901     case OPTION_MVXWORKS_PIC:
11902       mips_pic = VXWORKS_PIC;
11903       break;
11904 #endif /* OBJ_ELF */
11905
11906     default:
11907       return 0;
11908     }
11909
11910     mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
11911
11912   return 1;
11913 }
11914 \f
11915 /* Set up globals to generate code for the ISA or processor
11916    described by INFO.  */
11917
11918 static void
11919 mips_set_architecture (const struct mips_cpu_info *info)
11920 {
11921   if (info != 0)
11922     {
11923       file_mips_arch = info->cpu;
11924       mips_opts.arch = info->cpu;
11925       mips_opts.isa = info->isa;
11926     }
11927 }
11928
11929
11930 /* Likewise for tuning.  */
11931
11932 static void
11933 mips_set_tune (const struct mips_cpu_info *info)
11934 {
11935   if (info != 0)
11936     mips_tune = info->cpu;
11937 }
11938
11939
11940 void
11941 mips_after_parse_args (void)
11942 {
11943   const struct mips_cpu_info *arch_info = 0;
11944   const struct mips_cpu_info *tune_info = 0;
11945
11946   /* GP relative stuff not working for PE */
11947   if (strncmp (TARGET_OS, "pe", 2) == 0)
11948     {
11949       if (g_switch_seen && g_switch_value != 0)
11950         as_bad (_("-G not supported in this configuration."));
11951       g_switch_value = 0;
11952     }
11953
11954   if (mips_abi == NO_ABI)
11955     mips_abi = MIPS_DEFAULT_ABI;
11956
11957   /* The following code determines the architecture and register size.
11958      Similar code was added to GCC 3.3 (see override_options() in
11959      config/mips/mips.c).  The GAS and GCC code should be kept in sync
11960      as much as possible.  */
11961
11962   if (mips_arch_string != 0)
11963     arch_info = mips_parse_cpu ("-march", mips_arch_string);
11964
11965   if (file_mips_isa != ISA_UNKNOWN)
11966     {
11967       /* Handle -mipsN.  At this point, file_mips_isa contains the
11968          ISA level specified by -mipsN, while arch_info->isa contains
11969          the -march selection (if any).  */
11970       if (arch_info != 0)
11971         {
11972           /* -march takes precedence over -mipsN, since it is more descriptive.
11973              There's no harm in specifying both as long as the ISA levels
11974              are the same.  */
11975           if (file_mips_isa != arch_info->isa)
11976             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11977                     mips_cpu_info_from_isa (file_mips_isa)->name,
11978                     mips_cpu_info_from_isa (arch_info->isa)->name);
11979         }
11980       else
11981         arch_info = mips_cpu_info_from_isa (file_mips_isa);
11982     }
11983
11984   if (arch_info == 0)
11985     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11986
11987   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11988     as_bad (_("-march=%s is not compatible with the selected ABI"),
11989             arch_info->name);
11990
11991   mips_set_architecture (arch_info);
11992
11993   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
11994   if (mips_tune_string != 0)
11995     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11996
11997   if (tune_info == 0)
11998     mips_set_tune (arch_info);
11999   else
12000     mips_set_tune (tune_info);
12001
12002   if (file_mips_gp32 >= 0)
12003     {
12004       /* The user specified the size of the integer registers.  Make sure
12005          it agrees with the ABI and ISA.  */
12006       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
12007         as_bad (_("-mgp64 used with a 32-bit processor"));
12008       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
12009         as_bad (_("-mgp32 used with a 64-bit ABI"));
12010       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
12011         as_bad (_("-mgp64 used with a 32-bit ABI"));
12012     }
12013   else
12014     {
12015       /* Infer the integer register size from the ABI and processor.
12016          Restrict ourselves to 32-bit registers if that's all the
12017          processor has, or if the ABI cannot handle 64-bit registers.  */
12018       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
12019                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
12020     }
12021
12022   switch (file_mips_fp32)
12023     {
12024     default:
12025     case -1:
12026       /* No user specified float register size.
12027          ??? GAS treats single-float processors as though they had 64-bit
12028          float registers (although it complains when double-precision
12029          instructions are used).  As things stand, saying they have 32-bit
12030          registers would lead to spurious "register must be even" messages.
12031          So here we assume float registers are never smaller than the
12032          integer ones.  */
12033       if (file_mips_gp32 == 0)
12034         /* 64-bit integer registers implies 64-bit float registers.  */
12035         file_mips_fp32 = 0;
12036       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
12037                && ISA_HAS_64BIT_FPRS (mips_opts.isa))
12038         /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
12039         file_mips_fp32 = 0;
12040       else
12041         /* 32-bit float registers.  */
12042         file_mips_fp32 = 1;
12043       break;
12044
12045     /* The user specified the size of the float registers.  Check if it
12046        agrees with the ABI and ISA.  */
12047     case 0:
12048       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12049         as_bad (_("-mfp64 used with a 32-bit fpu"));
12050       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
12051                && !ISA_HAS_MXHC1 (mips_opts.isa))
12052         as_warn (_("-mfp64 used with a 32-bit ABI"));
12053       break;
12054     case 1:
12055       if (ABI_NEEDS_64BIT_REGS (mips_abi))
12056         as_warn (_("-mfp32 used with a 64-bit ABI"));
12057       break;
12058     }
12059
12060   /* End of GCC-shared inference code.  */
12061
12062   /* This flag is set when we have a 64-bit capable CPU but use only
12063      32-bit wide registers.  Note that EABI does not use it.  */
12064   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
12065       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
12066           || mips_abi == O32_ABI))
12067     mips_32bitmode = 1;
12068
12069   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
12070     as_bad (_("trap exception not supported at ISA 1"));
12071
12072   /* If the selected architecture includes support for ASEs, enable
12073      generation of code for them.  */
12074   if (mips_opts.mips16 == -1)
12075     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
12076   if (mips_opts.ase_mips3d == -1)
12077     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
12078                             && file_mips_fp32 == 0) ? 1 : 0;
12079   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
12080     as_bad (_("-mfp32 used with -mips3d"));
12081
12082   if (mips_opts.ase_mdmx == -1)
12083     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
12084                           && file_mips_fp32 == 0) ? 1 : 0;
12085   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
12086     as_bad (_("-mfp32 used with -mdmx"));
12087
12088   if (mips_opts.ase_smartmips == -1)
12089     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
12090   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
12091     as_warn (_("%s ISA does not support SmartMIPS"), 
12092              mips_cpu_info_from_isa (mips_opts.isa)->name);
12093
12094   if (mips_opts.ase_dsp == -1)
12095     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12096   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
12097     as_warn (_("%s ISA does not support DSP ASE"), 
12098              mips_cpu_info_from_isa (mips_opts.isa)->name);
12099
12100   if (mips_opts.ase_dspr2 == -1)
12101     {
12102       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
12103       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12104     }
12105   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
12106     as_warn (_("%s ISA does not support DSP R2 ASE"),
12107              mips_cpu_info_from_isa (mips_opts.isa)->name);
12108
12109   if (mips_opts.ase_mt == -1)
12110     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
12111   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
12112     as_warn (_("%s ISA does not support MT ASE"),
12113              mips_cpu_info_from_isa (mips_opts.isa)->name);
12114
12115   file_mips_isa = mips_opts.isa;
12116   file_ase_mips16 = mips_opts.mips16;
12117   file_ase_mips3d = mips_opts.ase_mips3d;
12118   file_ase_mdmx = mips_opts.ase_mdmx;
12119   file_ase_smartmips = mips_opts.ase_smartmips;
12120   file_ase_dsp = mips_opts.ase_dsp;
12121   file_ase_dspr2 = mips_opts.ase_dspr2;
12122   file_ase_mt = mips_opts.ase_mt;
12123   mips_opts.gp32 = file_mips_gp32;
12124   mips_opts.fp32 = file_mips_fp32;
12125   mips_opts.soft_float = file_mips_soft_float;
12126   mips_opts.single_float = file_mips_single_float;
12127
12128   if (mips_flag_mdebug < 0)
12129     {
12130 #ifdef OBJ_MAYBE_ECOFF
12131       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
12132         mips_flag_mdebug = 1;
12133       else
12134 #endif /* OBJ_MAYBE_ECOFF */
12135         mips_flag_mdebug = 0;
12136     }
12137 }
12138 \f
12139 void
12140 mips_init_after_args (void)
12141 {
12142   /* initialize opcodes */
12143   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
12144   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
12145 }
12146
12147 long
12148 md_pcrel_from (fixS *fixP)
12149 {
12150   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
12151   switch (fixP->fx_r_type)
12152     {
12153     case BFD_RELOC_16_PCREL_S2:
12154     case BFD_RELOC_MIPS_JMP:
12155       /* Return the address of the delay slot.  */
12156       return addr + 4;
12157     default:
12158       /* We have no relocation type for PC relative MIPS16 instructions.  */
12159       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
12160         as_bad_where (fixP->fx_file, fixP->fx_line,
12161                       _("PC relative MIPS16 instruction references a different section"));
12162       return addr;
12163     }
12164 }
12165
12166 /* This is called before the symbol table is processed.  In order to
12167    work with gcc when using mips-tfile, we must keep all local labels.
12168    However, in other cases, we want to discard them.  If we were
12169    called with -g, but we didn't see any debugging information, it may
12170    mean that gcc is smuggling debugging information through to
12171    mips-tfile, in which case we must generate all local labels.  */
12172
12173 void
12174 mips_frob_file_before_adjust (void)
12175 {
12176 #ifndef NO_ECOFF_DEBUGGING
12177   if (ECOFF_DEBUGGING
12178       && mips_debug != 0
12179       && ! ecoff_debugging_seen)
12180     flag_keep_locals = 1;
12181 #endif
12182 }
12183
12184 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
12185    the corresponding LO16 reloc.  This is called before md_apply_fix and
12186    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
12187    relocation operators.
12188
12189    For our purposes, a %lo() expression matches a %got() or %hi()
12190    expression if:
12191
12192       (a) it refers to the same symbol; and
12193       (b) the offset applied in the %lo() expression is no lower than
12194           the offset applied in the %got() or %hi().
12195
12196    (b) allows us to cope with code like:
12197
12198         lui     $4,%hi(foo)
12199         lh      $4,%lo(foo+2)($4)
12200
12201    ...which is legal on RELA targets, and has a well-defined behaviour
12202    if the user knows that adding 2 to "foo" will not induce a carry to
12203    the high 16 bits.
12204
12205    When several %lo()s match a particular %got() or %hi(), we use the
12206    following rules to distinguish them:
12207
12208      (1) %lo()s with smaller offsets are a better match than %lo()s with
12209          higher offsets.
12210
12211      (2) %lo()s with no matching %got() or %hi() are better than those
12212          that already have a matching %got() or %hi().
12213
12214      (3) later %lo()s are better than earlier %lo()s.
12215
12216    These rules are applied in order.
12217
12218    (1) means, among other things, that %lo()s with identical offsets are
12219    chosen if they exist.
12220
12221    (2) means that we won't associate several high-part relocations with
12222    the same low-part relocation unless there's no alternative.  Having
12223    several high parts for the same low part is a GNU extension; this rule
12224    allows careful users to avoid it.
12225
12226    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
12227    with the last high-part relocation being at the front of the list.
12228    It therefore makes sense to choose the last matching low-part
12229    relocation, all other things being equal.  It's also easier
12230    to code that way.  */
12231
12232 void
12233 mips_frob_file (void)
12234 {
12235   struct mips_hi_fixup *l;
12236   bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
12237
12238   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12239     {
12240       segment_info_type *seginfo;
12241       bfd_boolean matched_lo_p;
12242       fixS **hi_pos, **lo_pos, **pos;
12243
12244       gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
12245
12246       /* If a GOT16 relocation turns out to be against a global symbol,
12247          there isn't supposed to be a matching LO.  */
12248       if (got16_reloc_p (l->fixp->fx_r_type)
12249           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12250         continue;
12251
12252       /* Check quickly whether the next fixup happens to be a matching %lo.  */
12253       if (fixup_has_matching_lo_p (l->fixp))
12254         continue;
12255
12256       seginfo = seg_info (l->seg);
12257
12258       /* Set HI_POS to the position of this relocation in the chain.
12259          Set LO_POS to the position of the chosen low-part relocation.
12260          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12261          relocation that matches an immediately-preceding high-part
12262          relocation.  */
12263       hi_pos = NULL;
12264       lo_pos = NULL;
12265       matched_lo_p = FALSE;
12266       looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
12267
12268       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12269         {
12270           if (*pos == l->fixp)
12271             hi_pos = pos;
12272
12273           if ((*pos)->fx_r_type == looking_for_rtype
12274               && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
12275               && (*pos)->fx_offset >= l->fixp->fx_offset
12276               && (lo_pos == NULL
12277                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
12278                   || (!matched_lo_p
12279                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12280             lo_pos = pos;
12281
12282           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12283                           && fixup_has_matching_lo_p (*pos));
12284         }
12285
12286       /* If we found a match, remove the high-part relocation from its
12287          current position and insert it before the low-part relocation.
12288          Make the offsets match so that fixup_has_matching_lo_p()
12289          will return true.
12290
12291          We don't warn about unmatched high-part relocations since some
12292          versions of gcc have been known to emit dead "lui ...%hi(...)"
12293          instructions.  */
12294       if (lo_pos != NULL)
12295         {
12296           l->fixp->fx_offset = (*lo_pos)->fx_offset;
12297           if (l->fixp->fx_next != *lo_pos)
12298             {
12299               *hi_pos = l->fixp->fx_next;
12300               l->fixp->fx_next = *lo_pos;
12301               *lo_pos = l->fixp;
12302             }
12303         }
12304     }
12305 }
12306
12307 /* We may have combined relocations without symbols in the N32/N64 ABI.
12308    We have to prevent gas from dropping them.  */
12309
12310 int
12311 mips_force_relocation (fixS *fixp)
12312 {
12313   if (generic_force_reloc (fixp))
12314     return 1;
12315
12316   if (HAVE_NEWABI
12317       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12318       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
12319           || hi16_reloc_p (fixp->fx_r_type)
12320           || lo16_reloc_p (fixp->fx_r_type)))
12321     return 1;
12322
12323   return 0;
12324 }
12325
12326 /* Apply a fixup to the object file.  */
12327
12328 void
12329 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
12330 {
12331   bfd_byte *buf;
12332   long insn;
12333   reloc_howto_type *howto;
12334
12335   /* We ignore generic BFD relocations we don't know about.  */
12336   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12337   if (! howto)
12338     return;
12339
12340   gas_assert (fixP->fx_size == 4
12341           || fixP->fx_r_type == BFD_RELOC_16
12342           || fixP->fx_r_type == BFD_RELOC_64
12343           || fixP->fx_r_type == BFD_RELOC_CTOR
12344           || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12345           || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12346           || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12347           || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
12348
12349   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
12350
12351   gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
12352
12353   /* Don't treat parts of a composite relocation as done.  There are two
12354      reasons for this:
12355
12356      (1) The second and third parts will be against 0 (RSS_UNDEF) but
12357          should nevertheless be emitted if the first part is.
12358
12359      (2) In normal usage, composite relocations are never assembly-time
12360          constants.  The easiest way of dealing with the pathological
12361          exceptions is to generate a relocation against STN_UNDEF and
12362          leave everything up to the linker.  */
12363   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
12364     fixP->fx_done = 1;
12365
12366   switch (fixP->fx_r_type)
12367     {
12368     case BFD_RELOC_MIPS_TLS_GD:
12369     case BFD_RELOC_MIPS_TLS_LDM:
12370     case BFD_RELOC_MIPS_TLS_DTPREL32:
12371     case BFD_RELOC_MIPS_TLS_DTPREL64:
12372     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12373     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12374     case BFD_RELOC_MIPS_TLS_GOTTPREL:
12375     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12376     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12377       S_SET_THREAD_LOCAL (fixP->fx_addsy);
12378       /* fall through */
12379
12380     case BFD_RELOC_MIPS_JMP:
12381     case BFD_RELOC_MIPS_SHIFT5:
12382     case BFD_RELOC_MIPS_SHIFT6:
12383     case BFD_RELOC_MIPS_GOT_DISP:
12384     case BFD_RELOC_MIPS_GOT_PAGE:
12385     case BFD_RELOC_MIPS_GOT_OFST:
12386     case BFD_RELOC_MIPS_SUB:
12387     case BFD_RELOC_MIPS_INSERT_A:
12388     case BFD_RELOC_MIPS_INSERT_B:
12389     case BFD_RELOC_MIPS_DELETE:
12390     case BFD_RELOC_MIPS_HIGHEST:
12391     case BFD_RELOC_MIPS_HIGHER:
12392     case BFD_RELOC_MIPS_SCN_DISP:
12393     case BFD_RELOC_MIPS_REL16:
12394     case BFD_RELOC_MIPS_RELGOT:
12395     case BFD_RELOC_MIPS_JALR:
12396     case BFD_RELOC_HI16:
12397     case BFD_RELOC_HI16_S:
12398     case BFD_RELOC_GPREL16:
12399     case BFD_RELOC_MIPS_LITERAL:
12400     case BFD_RELOC_MIPS_CALL16:
12401     case BFD_RELOC_MIPS_GOT16:
12402     case BFD_RELOC_GPREL32:
12403     case BFD_RELOC_MIPS_GOT_HI16:
12404     case BFD_RELOC_MIPS_GOT_LO16:
12405     case BFD_RELOC_MIPS_CALL_HI16:
12406     case BFD_RELOC_MIPS_CALL_LO16:
12407     case BFD_RELOC_MIPS16_GPREL:
12408     case BFD_RELOC_MIPS16_GOT16:
12409     case BFD_RELOC_MIPS16_CALL16:
12410     case BFD_RELOC_MIPS16_HI16:
12411     case BFD_RELOC_MIPS16_HI16_S:
12412     case BFD_RELOC_MIPS16_JMP:
12413       /* Nothing needed to do.  The value comes from the reloc entry.  */
12414       break;
12415
12416     case BFD_RELOC_64:
12417       /* This is handled like BFD_RELOC_32, but we output a sign
12418          extended value if we are only 32 bits.  */
12419       if (fixP->fx_done)
12420         {
12421           if (8 <= sizeof (valueT))
12422             md_number_to_chars ((char *) buf, *valP, 8);
12423           else
12424             {
12425               valueT hiv;
12426
12427               if ((*valP & 0x80000000) != 0)
12428                 hiv = 0xffffffff;
12429               else
12430                 hiv = 0;
12431               md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
12432                                   *valP, 4);
12433               md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
12434                                   hiv, 4);
12435             }
12436         }
12437       break;
12438
12439     case BFD_RELOC_RVA:
12440     case BFD_RELOC_32:
12441     case BFD_RELOC_16:
12442       /* If we are deleting this reloc entry, we must fill in the
12443          value now.  This can happen if we have a .word which is not
12444          resolved when it appears but is later defined.  */
12445       if (fixP->fx_done)
12446         md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
12447       break;
12448
12449     case BFD_RELOC_LO16:
12450     case BFD_RELOC_MIPS16_LO16:
12451       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12452          may be safe to remove, but if so it's not obvious.  */
12453       /* When handling an embedded PIC switch statement, we can wind
12454          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
12455       if (fixP->fx_done)
12456         {
12457           if (*valP + 0x8000 > 0xffff)
12458             as_bad_where (fixP->fx_file, fixP->fx_line,
12459                           _("relocation overflow"));
12460           if (target_big_endian)
12461             buf += 2;
12462           md_number_to_chars ((char *) buf, *valP, 2);
12463         }
12464       break;
12465
12466     case BFD_RELOC_16_PCREL_S2:
12467       if ((*valP & 0x3) != 0)
12468         as_bad_where (fixP->fx_file, fixP->fx_line,
12469                       _("Branch to misaligned address (%lx)"), (long) *valP);
12470
12471       /* We need to save the bits in the instruction since fixup_segment()
12472          might be deleting the relocation entry (i.e., a branch within
12473          the current segment).  */
12474       if (! fixP->fx_done)
12475         break;
12476
12477       /* Update old instruction data.  */
12478       if (target_big_endian)
12479         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12480       else
12481         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12482
12483       if (*valP + 0x20000 <= 0x3ffff)
12484         {
12485           insn |= (*valP >> 2) & 0xffff;
12486           md_number_to_chars ((char *) buf, insn, 4);
12487         }
12488       else if (mips_pic == NO_PIC
12489                && fixP->fx_done
12490                && fixP->fx_frag->fr_address >= text_section->vma
12491                && (fixP->fx_frag->fr_address
12492                    < text_section->vma + bfd_get_section_size (text_section))
12493                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
12494                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
12495                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
12496         {
12497           /* The branch offset is too large.  If this is an
12498              unconditional branch, and we are not generating PIC code,
12499              we can convert it to an absolute jump instruction.  */
12500           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
12501             insn = 0x0c000000;  /* jal */
12502           else
12503             insn = 0x08000000;  /* j */
12504           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12505           fixP->fx_done = 0;
12506           fixP->fx_addsy = section_symbol (text_section);
12507           *valP += md_pcrel_from (fixP);
12508           md_number_to_chars ((char *) buf, insn, 4);
12509         }
12510       else
12511         {
12512           /* If we got here, we have branch-relaxation disabled,
12513              and there's nothing we can do to fix this instruction
12514              without turning it into a longer sequence.  */
12515           as_bad_where (fixP->fx_file, fixP->fx_line,
12516                         _("Branch out of range"));
12517         }
12518       break;
12519
12520     case BFD_RELOC_VTABLE_INHERIT:
12521       fixP->fx_done = 0;
12522       if (fixP->fx_addsy
12523           && !S_IS_DEFINED (fixP->fx_addsy)
12524           && !S_IS_WEAK (fixP->fx_addsy))
12525         S_SET_WEAK (fixP->fx_addsy);
12526       break;
12527
12528     case BFD_RELOC_VTABLE_ENTRY:
12529       fixP->fx_done = 0;
12530       break;
12531
12532     default:
12533       internalError ();
12534     }
12535
12536   /* Remember value for tc_gen_reloc.  */
12537   fixP->fx_addnumber = *valP;
12538 }
12539
12540 static symbolS *
12541 get_symbol (void)
12542 {
12543   int c;
12544   char *name;
12545   symbolS *p;
12546
12547   name = input_line_pointer;
12548   c = get_symbol_end ();
12549   p = (symbolS *) symbol_find_or_make (name);
12550   *input_line_pointer = c;
12551   return p;
12552 }
12553
12554 /* Align the current frag to a given power of two.  If a particular
12555    fill byte should be used, FILL points to an integer that contains
12556    that byte, otherwise FILL is null.
12557
12558    The MIPS assembler also automatically adjusts any preceding
12559    label.  */
12560
12561 static void
12562 mips_align (int to, int *fill, symbolS *label)
12563 {
12564   mips_emit_delays ();
12565   mips_record_mips16_mode ();
12566   if (fill == NULL && subseg_text_p (now_seg))
12567     frag_align_code (to, 0);
12568   else
12569     frag_align (to, fill ? *fill : 0, 0);
12570   record_alignment (now_seg, to);
12571   if (label != NULL)
12572     {
12573       gas_assert (S_GET_SEGMENT (label) == now_seg);
12574       symbol_set_frag (label, frag_now);
12575       S_SET_VALUE (label, (valueT) frag_now_fix ());
12576     }
12577 }
12578
12579 /* Align to a given power of two.  .align 0 turns off the automatic
12580    alignment used by the data creating pseudo-ops.  */
12581
12582 static void
12583 s_align (int x ATTRIBUTE_UNUSED)
12584 {
12585   int temp, fill_value, *fill_ptr;
12586   long max_alignment = 28;
12587
12588   /* o Note that the assembler pulls down any immediately preceding label
12589        to the aligned address.
12590      o It's not documented but auto alignment is reinstated by
12591        a .align pseudo instruction.
12592      o Note also that after auto alignment is turned off the mips assembler
12593        issues an error on attempt to assemble an improperly aligned data item.
12594        We don't.  */
12595
12596   temp = get_absolute_expression ();
12597   if (temp > max_alignment)
12598     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12599   else if (temp < 0)
12600     {
12601       as_warn (_("Alignment negative: 0 assumed."));
12602       temp = 0;
12603     }
12604   if (*input_line_pointer == ',')
12605     {
12606       ++input_line_pointer;
12607       fill_value = get_absolute_expression ();
12608       fill_ptr = &fill_value;
12609     }
12610   else
12611     fill_ptr = 0;
12612   if (temp)
12613     {
12614       segment_info_type *si = seg_info (now_seg);
12615       struct insn_label_list *l = si->label_list;
12616       /* Auto alignment should be switched on by next section change.  */
12617       auto_align = 1;
12618       mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
12619     }
12620   else
12621     {
12622       auto_align = 0;
12623     }
12624
12625   demand_empty_rest_of_line ();
12626 }
12627
12628 static void
12629 s_change_sec (int sec)
12630 {
12631   segT seg;
12632
12633 #ifdef OBJ_ELF
12634   /* The ELF backend needs to know that we are changing sections, so
12635      that .previous works correctly.  We could do something like check
12636      for an obj_section_change_hook macro, but that might be confusing
12637      as it would not be appropriate to use it in the section changing
12638      functions in read.c, since obj-elf.c intercepts those.  FIXME:
12639      This should be cleaner, somehow.  */
12640   if (IS_ELF)
12641     obj_elf_section_change_hook ();
12642 #endif
12643
12644   mips_emit_delays ();
12645
12646   switch (sec)
12647     {
12648     case 't':
12649       s_text (0);
12650       break;
12651     case 'd':
12652       s_data (0);
12653       break;
12654     case 'b':
12655       subseg_set (bss_section, (subsegT) get_absolute_expression ());
12656       demand_empty_rest_of_line ();
12657       break;
12658
12659     case 'r':
12660       seg = subseg_new (RDATA_SECTION_NAME,
12661                         (subsegT) get_absolute_expression ());
12662       if (IS_ELF)
12663         {
12664           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12665                                                   | SEC_READONLY | SEC_RELOC
12666                                                   | SEC_DATA));
12667           if (strncmp (TARGET_OS, "elf", 3) != 0)
12668             record_alignment (seg, 4);
12669         }
12670       demand_empty_rest_of_line ();
12671       break;
12672
12673     case 's':
12674       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12675       if (IS_ELF)
12676         {
12677           bfd_set_section_flags (stdoutput, seg,
12678                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12679           if (strncmp (TARGET_OS, "elf", 3) != 0)
12680             record_alignment (seg, 4);
12681         }
12682       demand_empty_rest_of_line ();
12683       break;
12684
12685     case 'B':
12686       seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
12687       if (IS_ELF)
12688         {
12689           bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
12690           if (strncmp (TARGET_OS, "elf", 3) != 0)
12691             record_alignment (seg, 4);
12692         }
12693       demand_empty_rest_of_line ();
12694       break;
12695     }
12696
12697   auto_align = 1;
12698 }
12699
12700 void
12701 s_change_section (int ignore ATTRIBUTE_UNUSED)
12702 {
12703 #ifdef OBJ_ELF
12704   char *section_name;
12705   char c;
12706   char next_c = 0;
12707   int section_type;
12708   int section_flag;
12709   int section_entry_size;
12710   int section_alignment;
12711
12712   if (!IS_ELF)
12713     return;
12714
12715   section_name = input_line_pointer;
12716   c = get_symbol_end ();
12717   if (c)
12718     next_c = *(input_line_pointer + 1);
12719
12720   /* Do we have .section Name<,"flags">?  */
12721   if (c != ',' || (c == ',' && next_c == '"'))
12722     {
12723       /* just after name is now '\0'.  */
12724       *input_line_pointer = c;
12725       input_line_pointer = section_name;
12726       obj_elf_section (ignore);
12727       return;
12728     }
12729   input_line_pointer++;
12730
12731   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
12732   if (c == ',')
12733     section_type = get_absolute_expression ();
12734   else
12735     section_type = 0;
12736   if (*input_line_pointer++ == ',')
12737     section_flag = get_absolute_expression ();
12738   else
12739     section_flag = 0;
12740   if (*input_line_pointer++ == ',')
12741     section_entry_size = get_absolute_expression ();
12742   else
12743     section_entry_size = 0;
12744   if (*input_line_pointer++ == ',')
12745     section_alignment = get_absolute_expression ();
12746   else
12747     section_alignment = 0;
12748   /* FIXME: really ignore?  */
12749   (void) section_alignment;
12750
12751   section_name = xstrdup (section_name);
12752
12753   /* When using the generic form of .section (as implemented by obj-elf.c),
12754      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
12755      traditionally had to fall back on the more common @progbits instead.
12756
12757      There's nothing really harmful in this, since bfd will correct
12758      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
12759      means that, for backwards compatibility, the special_section entries
12760      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12761
12762      Even so, we shouldn't force users of the MIPS .section syntax to
12763      incorrectly label the sections as SHT_PROGBITS.  The best compromise
12764      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12765      generic type-checking code.  */
12766   if (section_type == SHT_MIPS_DWARF)
12767     section_type = SHT_PROGBITS;
12768
12769   obj_elf_change_section (section_name, section_type, section_flag,
12770                           section_entry_size, 0, 0, 0);
12771
12772   if (now_seg->name != section_name)
12773     free (section_name);
12774 #endif /* OBJ_ELF */
12775 }
12776
12777 void
12778 mips_enable_auto_align (void)
12779 {
12780   auto_align = 1;
12781 }
12782
12783 static void
12784 s_cons (int log_size)
12785 {
12786   segment_info_type *si = seg_info (now_seg);
12787   struct insn_label_list *l = si->label_list;
12788   symbolS *label;
12789
12790   label = l != NULL ? l->label : NULL;
12791   mips_emit_delays ();
12792   if (log_size > 0 && auto_align)
12793     mips_align (log_size, 0, label);
12794   mips_clear_insn_labels ();
12795   cons (1 << log_size);
12796 }
12797
12798 static void
12799 s_float_cons (int type)
12800 {
12801   segment_info_type *si = seg_info (now_seg);
12802   struct insn_label_list *l = si->label_list;
12803   symbolS *label;
12804
12805   label = l != NULL ? l->label : NULL;
12806
12807   mips_emit_delays ();
12808
12809   if (auto_align)
12810     {
12811       if (type == 'd')
12812         mips_align (3, 0, label);
12813       else
12814         mips_align (2, 0, label);
12815     }
12816
12817   mips_clear_insn_labels ();
12818
12819   float_cons (type);
12820 }
12821
12822 /* Handle .globl.  We need to override it because on Irix 5 you are
12823    permitted to say
12824        .globl foo .text
12825    where foo is an undefined symbol, to mean that foo should be
12826    considered to be the address of a function.  */
12827
12828 static void
12829 s_mips_globl (int x ATTRIBUTE_UNUSED)
12830 {
12831   char *name;
12832   int c;
12833   symbolS *symbolP;
12834   flagword flag;
12835
12836   do
12837     {
12838       name = input_line_pointer;
12839       c = get_symbol_end ();
12840       symbolP = symbol_find_or_make (name);
12841       S_SET_EXTERNAL (symbolP);
12842
12843       *input_line_pointer = c;
12844       SKIP_WHITESPACE ();
12845
12846       /* On Irix 5, every global symbol that is not explicitly labelled as
12847          being a function is apparently labelled as being an object.  */
12848       flag = BSF_OBJECT;
12849
12850       if (!is_end_of_line[(unsigned char) *input_line_pointer]
12851           && (*input_line_pointer != ','))
12852         {
12853           char *secname;
12854           asection *sec;
12855
12856           secname = input_line_pointer;
12857           c = get_symbol_end ();
12858           sec = bfd_get_section_by_name (stdoutput, secname);
12859           if (sec == NULL)
12860             as_bad (_("%s: no such section"), secname);
12861           *input_line_pointer = c;
12862
12863           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12864             flag = BSF_FUNCTION;
12865         }
12866
12867       symbol_get_bfdsym (symbolP)->flags |= flag;
12868
12869       c = *input_line_pointer;
12870       if (c == ',')
12871         {
12872           input_line_pointer++;
12873           SKIP_WHITESPACE ();
12874           if (is_end_of_line[(unsigned char) *input_line_pointer])
12875             c = '\n';
12876         }
12877     }
12878   while (c == ',');
12879
12880   demand_empty_rest_of_line ();
12881 }
12882
12883 static void
12884 s_option (int x ATTRIBUTE_UNUSED)
12885 {
12886   char *opt;
12887   char c;
12888
12889   opt = input_line_pointer;
12890   c = get_symbol_end ();
12891
12892   if (*opt == 'O')
12893     {
12894       /* FIXME: What does this mean?  */
12895     }
12896   else if (strncmp (opt, "pic", 3) == 0)
12897     {
12898       int i;
12899
12900       i = atoi (opt + 3);
12901       if (i == 0)
12902         mips_pic = NO_PIC;
12903       else if (i == 2)
12904         {
12905         mips_pic = SVR4_PIC;
12906           mips_abicalls = TRUE;
12907         }
12908       else
12909         as_bad (_(".option pic%d not supported"), i);
12910
12911       if (mips_pic == SVR4_PIC)
12912         {
12913           if (g_switch_seen && g_switch_value != 0)
12914             as_warn (_("-G may not be used with SVR4 PIC code"));
12915           g_switch_value = 0;
12916           bfd_set_gp_size (stdoutput, 0);
12917         }
12918     }
12919   else
12920     as_warn (_("Unrecognized option \"%s\""), opt);
12921
12922   *input_line_pointer = c;
12923   demand_empty_rest_of_line ();
12924 }
12925
12926 /* This structure is used to hold a stack of .set values.  */
12927
12928 struct mips_option_stack
12929 {
12930   struct mips_option_stack *next;
12931   struct mips_set_options options;
12932 };
12933
12934 static struct mips_option_stack *mips_opts_stack;
12935
12936 /* Handle the .set pseudo-op.  */
12937
12938 static void
12939 s_mipsset (int x ATTRIBUTE_UNUSED)
12940 {
12941   char *name = input_line_pointer, ch;
12942
12943   while (!is_end_of_line[(unsigned char) *input_line_pointer])
12944     ++input_line_pointer;
12945   ch = *input_line_pointer;
12946   *input_line_pointer = '\0';
12947
12948   if (strcmp (name, "reorder") == 0)
12949     {
12950       if (mips_opts.noreorder)
12951         end_noreorder ();
12952     }
12953   else if (strcmp (name, "noreorder") == 0)
12954     {
12955       if (!mips_opts.noreorder)
12956         start_noreorder ();
12957     }
12958   else if (strncmp (name, "at=", 3) == 0)
12959     {
12960       char *s = name + 3;
12961
12962       if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
12963         as_bad (_("Unrecognized register name `%s'"), s);
12964     }
12965   else if (strcmp (name, "at") == 0)
12966     {
12967       mips_opts.at = ATREG;
12968     }
12969   else if (strcmp (name, "noat") == 0)
12970     {
12971       mips_opts.at = ZERO;
12972     }
12973   else if (strcmp (name, "macro") == 0)
12974     {
12975       mips_opts.warn_about_macros = 0;
12976     }
12977   else if (strcmp (name, "nomacro") == 0)
12978     {
12979       if (mips_opts.noreorder == 0)
12980         as_bad (_("`noreorder' must be set before `nomacro'"));
12981       mips_opts.warn_about_macros = 1;
12982     }
12983   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12984     {
12985       mips_opts.nomove = 0;
12986     }
12987   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12988     {
12989       mips_opts.nomove = 1;
12990     }
12991   else if (strcmp (name, "bopt") == 0)
12992     {
12993       mips_opts.nobopt = 0;
12994     }
12995   else if (strcmp (name, "nobopt") == 0)
12996     {
12997       mips_opts.nobopt = 1;
12998     }
12999   else if (strcmp (name, "gp=default") == 0)
13000     mips_opts.gp32 = file_mips_gp32;
13001   else if (strcmp (name, "gp=32") == 0)
13002     mips_opts.gp32 = 1;
13003   else if (strcmp (name, "gp=64") == 0)
13004     {
13005       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
13006         as_warn (_("%s isa does not support 64-bit registers"),
13007                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13008       mips_opts.gp32 = 0;
13009     }
13010   else if (strcmp (name, "fp=default") == 0)
13011     mips_opts.fp32 = file_mips_fp32;
13012   else if (strcmp (name, "fp=32") == 0)
13013     mips_opts.fp32 = 1;
13014   else if (strcmp (name, "fp=64") == 0)
13015     {
13016       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
13017         as_warn (_("%s isa does not support 64-bit floating point registers"),
13018                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13019       mips_opts.fp32 = 0;
13020     }
13021   else if (strcmp (name, "softfloat") == 0)
13022     mips_opts.soft_float = 1;
13023   else if (strcmp (name, "hardfloat") == 0)
13024     mips_opts.soft_float = 0;
13025   else if (strcmp (name, "singlefloat") == 0)
13026     mips_opts.single_float = 1;
13027   else if (strcmp (name, "doublefloat") == 0)
13028     mips_opts.single_float = 0;
13029   else if (strcmp (name, "mips16") == 0
13030            || strcmp (name, "MIPS-16") == 0)
13031     mips_opts.mips16 = 1;
13032   else if (strcmp (name, "nomips16") == 0
13033            || strcmp (name, "noMIPS-16") == 0)
13034     mips_opts.mips16 = 0;
13035   else if (strcmp (name, "smartmips") == 0)
13036     {
13037       if (!ISA_SUPPORTS_SMARTMIPS)
13038         as_warn (_("%s ISA does not support SmartMIPS ASE"), 
13039                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13040       mips_opts.ase_smartmips = 1;
13041     }
13042   else if (strcmp (name, "nosmartmips") == 0)
13043     mips_opts.ase_smartmips = 0;
13044   else if (strcmp (name, "mips3d") == 0)
13045     mips_opts.ase_mips3d = 1;
13046   else if (strcmp (name, "nomips3d") == 0)
13047     mips_opts.ase_mips3d = 0;
13048   else if (strcmp (name, "mdmx") == 0)
13049     mips_opts.ase_mdmx = 1;
13050   else if (strcmp (name, "nomdmx") == 0)
13051     mips_opts.ase_mdmx = 0;
13052   else if (strcmp (name, "dsp") == 0)
13053     {
13054       if (!ISA_SUPPORTS_DSP_ASE)
13055         as_warn (_("%s ISA does not support DSP ASE"), 
13056                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13057       mips_opts.ase_dsp = 1;
13058       mips_opts.ase_dspr2 = 0;
13059     }
13060   else if (strcmp (name, "nodsp") == 0)
13061     {
13062       mips_opts.ase_dsp = 0;
13063       mips_opts.ase_dspr2 = 0;
13064     }
13065   else if (strcmp (name, "dspr2") == 0)
13066     {
13067       if (!ISA_SUPPORTS_DSPR2_ASE)
13068         as_warn (_("%s ISA does not support DSP R2 ASE"),
13069                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13070       mips_opts.ase_dspr2 = 1;
13071       mips_opts.ase_dsp = 1;
13072     }
13073   else if (strcmp (name, "nodspr2") == 0)
13074     {
13075       mips_opts.ase_dspr2 = 0;
13076       mips_opts.ase_dsp = 0;
13077     }
13078   else if (strcmp (name, "mt") == 0)
13079     {
13080       if (!ISA_SUPPORTS_MT_ASE)
13081         as_warn (_("%s ISA does not support MT ASE"), 
13082                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13083       mips_opts.ase_mt = 1;
13084     }
13085   else if (strcmp (name, "nomt") == 0)
13086     mips_opts.ase_mt = 0;
13087   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
13088     {
13089       int reset = 0;
13090
13091       /* Permit the user to change the ISA and architecture on the fly.
13092          Needless to say, misuse can cause serious problems.  */
13093       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
13094         {
13095           reset = 1;
13096           mips_opts.isa = file_mips_isa;
13097           mips_opts.arch = file_mips_arch;
13098         }
13099       else if (strncmp (name, "arch=", 5) == 0)
13100         {
13101           const struct mips_cpu_info *p;
13102
13103           p = mips_parse_cpu("internal use", name + 5);
13104           if (!p)
13105             as_bad (_("unknown architecture %s"), name + 5);
13106           else
13107             {
13108               mips_opts.arch = p->cpu;
13109               mips_opts.isa = p->isa;
13110             }
13111         }
13112       else if (strncmp (name, "mips", 4) == 0)
13113         {
13114           const struct mips_cpu_info *p;
13115
13116           p = mips_parse_cpu("internal use", name);
13117           if (!p)
13118             as_bad (_("unknown ISA level %s"), name + 4);
13119           else
13120             {
13121               mips_opts.arch = p->cpu;
13122               mips_opts.isa = p->isa;
13123             }
13124         }
13125       else
13126         as_bad (_("unknown ISA or architecture %s"), name);
13127
13128       switch (mips_opts.isa)
13129         {
13130         case  0:
13131           break;
13132         case ISA_MIPS1:
13133         case ISA_MIPS2:
13134         case ISA_MIPS32:
13135         case ISA_MIPS32R2:
13136           mips_opts.gp32 = 1;
13137           mips_opts.fp32 = 1;
13138           break;
13139         case ISA_MIPS3:
13140         case ISA_MIPS4:
13141         case ISA_MIPS5:
13142         case ISA_MIPS64:
13143         case ISA_MIPS64R2:
13144           mips_opts.gp32 = 0;
13145           mips_opts.fp32 = 0;
13146           break;
13147         default:
13148           as_bad (_("unknown ISA level %s"), name + 4);
13149           break;
13150         }
13151       if (reset)
13152         {
13153           mips_opts.gp32 = file_mips_gp32;
13154           mips_opts.fp32 = file_mips_fp32;
13155         }
13156     }
13157   else if (strcmp (name, "autoextend") == 0)
13158     mips_opts.noautoextend = 0;
13159   else if (strcmp (name, "noautoextend") == 0)
13160     mips_opts.noautoextend = 1;
13161   else if (strcmp (name, "push") == 0)
13162     {
13163       struct mips_option_stack *s;
13164
13165       s = (struct mips_option_stack *) xmalloc (sizeof *s);
13166       s->next = mips_opts_stack;
13167       s->options = mips_opts;
13168       mips_opts_stack = s;
13169     }
13170   else if (strcmp (name, "pop") == 0)
13171     {
13172       struct mips_option_stack *s;
13173
13174       s = mips_opts_stack;
13175       if (s == NULL)
13176         as_bad (_(".set pop with no .set push"));
13177       else
13178         {
13179           /* If we're changing the reorder mode we need to handle
13180              delay slots correctly.  */
13181           if (s->options.noreorder && ! mips_opts.noreorder)
13182             start_noreorder ();
13183           else if (! s->options.noreorder && mips_opts.noreorder)
13184             end_noreorder ();
13185
13186           mips_opts = s->options;
13187           mips_opts_stack = s->next;
13188           free (s);
13189         }
13190     }
13191   else if (strcmp (name, "sym32") == 0)
13192     mips_opts.sym32 = TRUE;
13193   else if (strcmp (name, "nosym32") == 0)
13194     mips_opts.sym32 = FALSE;
13195   else if (strchr (name, ','))
13196     {
13197       /* Generic ".set" directive; use the generic handler.  */
13198       *input_line_pointer = ch;
13199       input_line_pointer = name;
13200       s_set (0);
13201       return;
13202     }
13203   else
13204     {
13205       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
13206     }
13207   *input_line_pointer = ch;
13208   demand_empty_rest_of_line ();
13209 }
13210
13211 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
13212    .option pic2.  It means to generate SVR4 PIC calls.  */
13213
13214 static void
13215 s_abicalls (int ignore ATTRIBUTE_UNUSED)
13216 {
13217   mips_pic = SVR4_PIC;
13218   mips_abicalls = TRUE;
13219
13220   if (g_switch_seen && g_switch_value != 0)
13221     as_warn (_("-G may not be used with SVR4 PIC code"));
13222   g_switch_value = 0;
13223
13224   bfd_set_gp_size (stdoutput, 0);
13225   demand_empty_rest_of_line ();
13226 }
13227
13228 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
13229    PIC code.  It sets the $gp register for the function based on the
13230    function address, which is in the register named in the argument.
13231    This uses a relocation against _gp_disp, which is handled specially
13232    by the linker.  The result is:
13233         lui     $gp,%hi(_gp_disp)
13234         addiu   $gp,$gp,%lo(_gp_disp)
13235         addu    $gp,$gp,.cpload argument
13236    The .cpload argument is normally $25 == $t9.
13237
13238    The -mno-shared option changes this to:
13239         lui     $gp,%hi(__gnu_local_gp)
13240         addiu   $gp,$gp,%lo(__gnu_local_gp)
13241    and the argument is ignored.  This saves an instruction, but the
13242    resulting code is not position independent; it uses an absolute
13243    address for __gnu_local_gp.  Thus code assembled with -mno-shared
13244    can go into an ordinary executable, but not into a shared library.  */
13245
13246 static void
13247 s_cpload (int ignore ATTRIBUTE_UNUSED)
13248 {
13249   expressionS ex;
13250   int reg;
13251   int in_shared;
13252
13253   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13254      .cpload is ignored.  */
13255   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13256     {
13257       s_ignore (0);
13258       return;
13259     }
13260
13261   /* .cpload should be in a .set noreorder section.  */
13262   if (mips_opts.noreorder == 0)
13263     as_warn (_(".cpload not in noreorder section"));
13264
13265   reg = tc_get_register (0);
13266
13267   /* If we need to produce a 64-bit address, we are better off using
13268      the default instruction sequence.  */
13269   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
13270
13271   ex.X_op = O_symbol;
13272   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13273                                          "__gnu_local_gp");
13274   ex.X_op_symbol = NULL;
13275   ex.X_add_number = 0;
13276
13277   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13278   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13279
13280   macro_start ();
13281   macro_build_lui (&ex, mips_gp_register);
13282   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13283                mips_gp_register, BFD_RELOC_LO16);
13284   if (in_shared)
13285     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13286                  mips_gp_register, reg);
13287   macro_end ();
13288
13289   demand_empty_rest_of_line ();
13290 }
13291
13292 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
13293      .cpsetup $reg1, offset|$reg2, label
13294
13295    If offset is given, this results in:
13296      sd         $gp, offset($sp)
13297      lui        $gp, %hi(%neg(%gp_rel(label)))
13298      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13299      daddu      $gp, $gp, $reg1
13300
13301    If $reg2 is given, this results in:
13302      daddu      $reg2, $gp, $0
13303      lui        $gp, %hi(%neg(%gp_rel(label)))
13304      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13305      daddu      $gp, $gp, $reg1
13306    $reg1 is normally $25 == $t9.
13307
13308    The -mno-shared option replaces the last three instructions with
13309         lui     $gp,%hi(_gp)
13310         addiu   $gp,$gp,%lo(_gp)  */
13311
13312 static void
13313 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
13314 {
13315   expressionS ex_off;
13316   expressionS ex_sym;
13317   int reg1;
13318
13319   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
13320      We also need NewABI support.  */
13321   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13322     {
13323       s_ignore (0);
13324       return;
13325     }
13326
13327   reg1 = tc_get_register (0);
13328   SKIP_WHITESPACE ();
13329   if (*input_line_pointer != ',')
13330     {
13331       as_bad (_("missing argument separator ',' for .cpsetup"));
13332       return;
13333     }
13334   else
13335     ++input_line_pointer;
13336   SKIP_WHITESPACE ();
13337   if (*input_line_pointer == '$')
13338     {
13339       mips_cpreturn_register = tc_get_register (0);
13340       mips_cpreturn_offset = -1;
13341     }
13342   else
13343     {
13344       mips_cpreturn_offset = get_absolute_expression ();
13345       mips_cpreturn_register = -1;
13346     }
13347   SKIP_WHITESPACE ();
13348   if (*input_line_pointer != ',')
13349     {
13350       as_bad (_("missing argument separator ',' for .cpsetup"));
13351       return;
13352     }
13353   else
13354     ++input_line_pointer;
13355   SKIP_WHITESPACE ();
13356   expression (&ex_sym);
13357
13358   macro_start ();
13359   if (mips_cpreturn_register == -1)
13360     {
13361       ex_off.X_op = O_constant;
13362       ex_off.X_add_symbol = NULL;
13363       ex_off.X_op_symbol = NULL;
13364       ex_off.X_add_number = mips_cpreturn_offset;
13365
13366       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
13367                    BFD_RELOC_LO16, SP);
13368     }
13369   else
13370     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
13371                  mips_gp_register, 0);
13372
13373   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
13374     {
13375       macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13376                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13377                    BFD_RELOC_HI16_S);
13378
13379       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13380                    mips_gp_register, -1, BFD_RELOC_GPREL16,
13381                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13382
13383       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13384                    mips_gp_register, reg1);
13385     }
13386   else
13387     {
13388       expressionS ex;
13389
13390       ex.X_op = O_symbol;
13391       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
13392       ex.X_op_symbol = NULL;
13393       ex.X_add_number = 0;
13394
13395       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13396       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13397
13398       macro_build_lui (&ex, mips_gp_register);
13399       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13400                    mips_gp_register, BFD_RELOC_LO16);
13401     }
13402
13403   macro_end ();
13404
13405   demand_empty_rest_of_line ();
13406 }
13407
13408 static void
13409 s_cplocal (int ignore ATTRIBUTE_UNUSED)
13410 {
13411   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
13412      .cplocal is ignored.  */
13413   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13414     {
13415       s_ignore (0);
13416       return;
13417     }
13418
13419   mips_gp_register = tc_get_register (0);
13420   demand_empty_rest_of_line ();
13421 }
13422
13423 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
13424    offset from $sp.  The offset is remembered, and after making a PIC
13425    call $gp is restored from that location.  */
13426
13427 static void
13428 s_cprestore (int ignore ATTRIBUTE_UNUSED)
13429 {
13430   expressionS ex;
13431
13432   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13433      .cprestore is ignored.  */
13434   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13435     {
13436       s_ignore (0);
13437       return;
13438     }
13439
13440   mips_cprestore_offset = get_absolute_expression ();
13441   mips_cprestore_valid = 1;
13442
13443   ex.X_op = O_constant;
13444   ex.X_add_symbol = NULL;
13445   ex.X_op_symbol = NULL;
13446   ex.X_add_number = mips_cprestore_offset;
13447
13448   macro_start ();
13449   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13450                                 SP, HAVE_64BIT_ADDRESSES);
13451   macro_end ();
13452
13453   demand_empty_rest_of_line ();
13454 }
13455
13456 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
13457    was given in the preceding .cpsetup, it results in:
13458      ld         $gp, offset($sp)
13459
13460    If a register $reg2 was given there, it results in:
13461      daddu      $gp, $reg2, $0  */
13462
13463 static void
13464 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
13465 {
13466   expressionS ex;
13467
13468   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13469      We also need NewABI support.  */
13470   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13471     {
13472       s_ignore (0);
13473       return;
13474     }
13475
13476   macro_start ();
13477   if (mips_cpreturn_register == -1)
13478     {
13479       ex.X_op = O_constant;
13480       ex.X_add_symbol = NULL;
13481       ex.X_op_symbol = NULL;
13482       ex.X_add_number = mips_cpreturn_offset;
13483
13484       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
13485     }
13486   else
13487     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
13488                  mips_cpreturn_register, 0);
13489   macro_end ();
13490
13491   demand_empty_rest_of_line ();
13492 }
13493
13494 /* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
13495    a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13496    use in DWARF debug information.  */
13497
13498 static void
13499 s_dtprel_internal (size_t bytes)
13500 {
13501   expressionS ex;
13502   char *p;
13503
13504   expression (&ex);
13505
13506   if (ex.X_op != O_symbol)
13507     {
13508       as_bad (_("Unsupported use of %s"), (bytes == 8
13509                                            ? ".dtpreldword"
13510                                            : ".dtprelword"));
13511       ignore_rest_of_line ();
13512     }
13513
13514   p = frag_more (bytes);
13515   md_number_to_chars (p, 0, bytes);
13516   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13517                (bytes == 8
13518                 ? BFD_RELOC_MIPS_TLS_DTPREL64
13519                 : BFD_RELOC_MIPS_TLS_DTPREL32));
13520
13521   demand_empty_rest_of_line ();
13522 }
13523
13524 /* Handle .dtprelword.  */
13525
13526 static void
13527 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13528 {
13529   s_dtprel_internal (4);
13530 }
13531
13532 /* Handle .dtpreldword.  */
13533
13534 static void
13535 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13536 {
13537   s_dtprel_internal (8);
13538 }
13539
13540 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
13541    code.  It sets the offset to use in gp_rel relocations.  */
13542
13543 static void
13544 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
13545 {
13546   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13547      We also need NewABI support.  */
13548   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13549     {
13550       s_ignore (0);
13551       return;
13552     }
13553
13554   mips_gprel_offset = get_absolute_expression ();
13555
13556   demand_empty_rest_of_line ();
13557 }
13558
13559 /* Handle the .gpword pseudo-op.  This is used when generating PIC
13560    code.  It generates a 32 bit GP relative reloc.  */
13561
13562 static void
13563 s_gpword (int ignore ATTRIBUTE_UNUSED)
13564 {
13565   segment_info_type *si;
13566   struct insn_label_list *l;
13567   symbolS *label;
13568   expressionS ex;
13569   char *p;
13570
13571   /* When not generating PIC code, this is treated as .word.  */
13572   if (mips_pic != SVR4_PIC)
13573     {
13574       s_cons (2);
13575       return;
13576     }
13577
13578   si = seg_info (now_seg);
13579   l = si->label_list;
13580   label = l != NULL ? l->label : NULL;
13581   mips_emit_delays ();
13582   if (auto_align)
13583     mips_align (2, 0, label);
13584   mips_clear_insn_labels ();
13585
13586   expression (&ex);
13587
13588   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13589     {
13590       as_bad (_("Unsupported use of .gpword"));
13591       ignore_rest_of_line ();
13592     }
13593
13594   p = frag_more (4);
13595   md_number_to_chars (p, 0, 4);
13596   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13597                BFD_RELOC_GPREL32);
13598
13599   demand_empty_rest_of_line ();
13600 }
13601
13602 static void
13603 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13604 {
13605   segment_info_type *si;
13606   struct insn_label_list *l;
13607   symbolS *label;
13608   expressionS ex;
13609   char *p;
13610
13611   /* When not generating PIC code, this is treated as .dword.  */
13612   if (mips_pic != SVR4_PIC)
13613     {
13614       s_cons (3);
13615       return;
13616     }
13617
13618   si = seg_info (now_seg);
13619   l = si->label_list;
13620   label = l != NULL ? l->label : NULL;
13621   mips_emit_delays ();
13622   if (auto_align)
13623     mips_align (3, 0, label);
13624   mips_clear_insn_labels ();
13625
13626   expression (&ex);
13627
13628   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13629     {
13630       as_bad (_("Unsupported use of .gpdword"));
13631       ignore_rest_of_line ();
13632     }
13633
13634   p = frag_more (8);
13635   md_number_to_chars (p, 0, 8);
13636   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13637                BFD_RELOC_GPREL32)->fx_tcbit = 1;
13638
13639   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
13640   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13641            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13642
13643   demand_empty_rest_of_line ();
13644 }
13645
13646 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
13647    tables in SVR4 PIC code.  */
13648
13649 static void
13650 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13651 {
13652   int reg;
13653
13654   /* This is ignored when not generating SVR4 PIC code.  */
13655   if (mips_pic != SVR4_PIC)
13656     {
13657       s_ignore (0);
13658       return;
13659     }
13660
13661   /* Add $gp to the register named as an argument.  */
13662   macro_start ();
13663   reg = tc_get_register (0);
13664   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13665   macro_end ();
13666
13667   demand_empty_rest_of_line ();
13668 }
13669
13670 /* Handle the .insn pseudo-op.  This marks instruction labels in
13671    mips16 mode.  This permits the linker to handle them specially,
13672    such as generating jalx instructions when needed.  We also make
13673    them odd for the duration of the assembly, in order to generate the
13674    right sort of code.  We will make them even in the adjust_symtab
13675    routine, while leaving them marked.  This is convenient for the
13676    debugger and the disassembler.  The linker knows to make them odd
13677    again.  */
13678
13679 static void
13680 s_insn (int ignore ATTRIBUTE_UNUSED)
13681 {
13682   mips16_mark_labels ();
13683
13684   demand_empty_rest_of_line ();
13685 }
13686
13687 /* Handle a .stabn directive.  We need these in order to mark a label
13688    as being a mips16 text label correctly.  Sometimes the compiler
13689    will emit a label, followed by a .stabn, and then switch sections.
13690    If the label and .stabn are in mips16 mode, then the label is
13691    really a mips16 text label.  */
13692
13693 static void
13694 s_mips_stab (int type)
13695 {
13696   if (type == 'n')
13697     mips16_mark_labels ();
13698
13699   s_stab (type);
13700 }
13701
13702 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
13703
13704 static void
13705 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13706 {
13707   char *name;
13708   int c;
13709   symbolS *symbolP;
13710   expressionS exp;
13711
13712   name = input_line_pointer;
13713   c = get_symbol_end ();
13714   symbolP = symbol_find_or_make (name);
13715   S_SET_WEAK (symbolP);
13716   *input_line_pointer = c;
13717
13718   SKIP_WHITESPACE ();
13719
13720   if (! is_end_of_line[(unsigned char) *input_line_pointer])
13721     {
13722       if (S_IS_DEFINED (symbolP))
13723         {
13724           as_bad (_("ignoring attempt to redefine symbol %s"),
13725                   S_GET_NAME (symbolP));
13726           ignore_rest_of_line ();
13727           return;
13728         }
13729
13730       if (*input_line_pointer == ',')
13731         {
13732           ++input_line_pointer;
13733           SKIP_WHITESPACE ();
13734         }
13735
13736       expression (&exp);
13737       if (exp.X_op != O_symbol)
13738         {
13739           as_bad (_("bad .weakext directive"));
13740           ignore_rest_of_line ();
13741           return;
13742         }
13743       symbol_set_value_expression (symbolP, &exp);
13744     }
13745
13746   demand_empty_rest_of_line ();
13747 }
13748
13749 /* Parse a register string into a number.  Called from the ECOFF code
13750    to parse .frame.  The argument is non-zero if this is the frame
13751    register, so that we can record it in mips_frame_reg.  */
13752
13753 int
13754 tc_get_register (int frame)
13755 {
13756   unsigned int reg;
13757
13758   SKIP_WHITESPACE ();
13759   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13760     reg = 0;
13761   if (frame)
13762     {
13763       mips_frame_reg = reg != 0 ? reg : SP;
13764       mips_frame_reg_valid = 1;
13765       mips_cprestore_valid = 0;
13766     }
13767   return reg;
13768 }
13769
13770 valueT
13771 md_section_align (asection *seg, valueT addr)
13772 {
13773   int align = bfd_get_section_alignment (stdoutput, seg);
13774
13775   if (IS_ELF)
13776     {
13777       /* We don't need to align ELF sections to the full alignment.
13778          However, Irix 5 may prefer that we align them at least to a 16
13779          byte boundary.  We don't bother to align the sections if we
13780          are targeted for an embedded system.  */
13781       if (strncmp (TARGET_OS, "elf", 3) == 0)
13782         return addr;
13783       if (align > 4)
13784         align = 4;
13785     }
13786
13787   return ((addr + (1 << align) - 1) & (-1 << align));
13788 }
13789
13790 /* Utility routine, called from above as well.  If called while the
13791    input file is still being read, it's only an approximation.  (For
13792    example, a symbol may later become defined which appeared to be
13793    undefined earlier.)  */
13794
13795 static int
13796 nopic_need_relax (symbolS *sym, int before_relaxing)
13797 {
13798   if (sym == 0)
13799     return 0;
13800
13801   if (g_switch_value > 0)
13802     {
13803       const char *symname;
13804       int change;
13805
13806       /* Find out whether this symbol can be referenced off the $gp
13807          register.  It can be if it is smaller than the -G size or if
13808          it is in the .sdata or .sbss section.  Certain symbols can
13809          not be referenced off the $gp, although it appears as though
13810          they can.  */
13811       symname = S_GET_NAME (sym);
13812       if (symname != (const char *) NULL
13813           && (strcmp (symname, "eprol") == 0
13814               || strcmp (symname, "etext") == 0
13815               || strcmp (symname, "_gp") == 0
13816               || strcmp (symname, "edata") == 0
13817               || strcmp (symname, "_fbss") == 0
13818               || strcmp (symname, "_fdata") == 0
13819               || strcmp (symname, "_ftext") == 0
13820               || strcmp (symname, "end") == 0
13821               || strcmp (symname, "_gp_disp") == 0))
13822         change = 1;
13823       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13824                && (0
13825 #ifndef NO_ECOFF_DEBUGGING
13826                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
13827                        && (symbol_get_obj (sym)->ecoff_extern_size
13828                            <= g_switch_value))
13829 #endif
13830                    /* We must defer this decision until after the whole
13831                       file has been read, since there might be a .extern
13832                       after the first use of this symbol.  */
13833                    || (before_relaxing
13834 #ifndef NO_ECOFF_DEBUGGING
13835                        && symbol_get_obj (sym)->ecoff_extern_size == 0
13836 #endif
13837                        && S_GET_VALUE (sym) == 0)
13838                    || (S_GET_VALUE (sym) != 0
13839                        && S_GET_VALUE (sym) <= g_switch_value)))
13840         change = 0;
13841       else
13842         {
13843           const char *segname;
13844
13845           segname = segment_name (S_GET_SEGMENT (sym));
13846           gas_assert (strcmp (segname, ".lit8") != 0
13847                   && strcmp (segname, ".lit4") != 0);
13848           change = (strcmp (segname, ".sdata") != 0
13849                     && strcmp (segname, ".sbss") != 0
13850                     && strncmp (segname, ".sdata.", 7) != 0
13851                     && strncmp (segname, ".sbss.", 6) != 0
13852                     && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
13853                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13854         }
13855       return change;
13856     }
13857   else
13858     /* We are not optimizing for the $gp register.  */
13859     return 1;
13860 }
13861
13862
13863 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
13864
13865 static bfd_boolean
13866 pic_need_relax (symbolS *sym, asection *segtype)
13867 {
13868   asection *symsec;
13869
13870   /* Handle the case of a symbol equated to another symbol.  */
13871   while (symbol_equated_reloc_p (sym))
13872     {
13873       symbolS *n;
13874
13875       /* It's possible to get a loop here in a badly written program.  */
13876       n = symbol_get_value_expression (sym)->X_add_symbol;
13877       if (n == sym)
13878         break;
13879       sym = n;
13880     }
13881
13882   if (symbol_section_p (sym))
13883     return TRUE;
13884
13885   symsec = S_GET_SEGMENT (sym);
13886
13887   /* This must duplicate the test in adjust_reloc_syms.  */
13888   return (symsec != &bfd_und_section
13889           && symsec != &bfd_abs_section
13890           && !bfd_is_com_section (symsec)
13891           && !s_is_linkonce (sym, segtype)
13892 #ifdef OBJ_ELF
13893           /* A global or weak symbol is treated as external.  */
13894           && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13895 #endif
13896           );
13897 }
13898
13899
13900 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13901    extended opcode.  SEC is the section the frag is in.  */
13902
13903 static int
13904 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13905 {
13906   int type;
13907   const struct mips16_immed_operand *op;
13908   offsetT val;
13909   int mintiny, maxtiny;
13910   segT symsec;
13911   fragS *sym_frag;
13912
13913   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13914     return 0;
13915   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13916     return 1;
13917
13918   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13919   op = mips16_immed_operands;
13920   while (op->type != type)
13921     {
13922       ++op;
13923       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13924     }
13925
13926   if (op->unsp)
13927     {
13928       if (type == '<' || type == '>' || type == '[' || type == ']')
13929         {
13930           mintiny = 1;
13931           maxtiny = 1 << op->nbits;
13932         }
13933       else
13934         {
13935           mintiny = 0;
13936           maxtiny = (1 << op->nbits) - 1;
13937         }
13938     }
13939   else
13940     {
13941       mintiny = - (1 << (op->nbits - 1));
13942       maxtiny = (1 << (op->nbits - 1)) - 1;
13943     }
13944
13945   sym_frag = symbol_get_frag (fragp->fr_symbol);
13946   val = S_GET_VALUE (fragp->fr_symbol);
13947   symsec = S_GET_SEGMENT (fragp->fr_symbol);
13948
13949   if (op->pcrel)
13950     {
13951       addressT addr;
13952
13953       /* We won't have the section when we are called from
13954          mips_relax_frag.  However, we will always have been called
13955          from md_estimate_size_before_relax first.  If this is a
13956          branch to a different section, we mark it as such.  If SEC is
13957          NULL, and the frag is not marked, then it must be a branch to
13958          the same section.  */
13959       if (sec == NULL)
13960         {
13961           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13962             return 1;
13963         }
13964       else
13965         {
13966           /* Must have been called from md_estimate_size_before_relax.  */
13967           if (symsec != sec)
13968             {
13969               fragp->fr_subtype =
13970                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13971
13972               /* FIXME: We should support this, and let the linker
13973                  catch branches and loads that are out of range.  */
13974               as_bad_where (fragp->fr_file, fragp->fr_line,
13975                             _("unsupported PC relative reference to different section"));
13976
13977               return 1;
13978             }
13979           if (fragp != sym_frag && sym_frag->fr_address == 0)
13980             /* Assume non-extended on the first relaxation pass.
13981                The address we have calculated will be bogus if this is
13982                a forward branch to another frag, as the forward frag
13983                will have fr_address == 0.  */
13984             return 0;
13985         }
13986
13987       /* In this case, we know for sure that the symbol fragment is in
13988          the same section.  If the relax_marker of the symbol fragment
13989          differs from the relax_marker of this fragment, we have not
13990          yet adjusted the symbol fragment fr_address.  We want to add
13991          in STRETCH in order to get a better estimate of the address.
13992          This particularly matters because of the shift bits.  */
13993       if (stretch != 0
13994           && sym_frag->relax_marker != fragp->relax_marker)
13995         {
13996           fragS *f;
13997
13998           /* Adjust stretch for any alignment frag.  Note that if have
13999              been expanding the earlier code, the symbol may be
14000              defined in what appears to be an earlier frag.  FIXME:
14001              This doesn't handle the fr_subtype field, which specifies
14002              a maximum number of bytes to skip when doing an
14003              alignment.  */
14004           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
14005             {
14006               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
14007                 {
14008                   if (stretch < 0)
14009                     stretch = - ((- stretch)
14010                                  & ~ ((1 << (int) f->fr_offset) - 1));
14011                   else
14012                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
14013                   if (stretch == 0)
14014                     break;
14015                 }
14016             }
14017           if (f != NULL)
14018             val += stretch;
14019         }
14020
14021       addr = fragp->fr_address + fragp->fr_fix;
14022
14023       /* The base address rules are complicated.  The base address of
14024          a branch is the following instruction.  The base address of a
14025          PC relative load or add is the instruction itself, but if it
14026          is in a delay slot (in which case it can not be extended) use
14027          the address of the instruction whose delay slot it is in.  */
14028       if (type == 'p' || type == 'q')
14029         {
14030           addr += 2;
14031
14032           /* If we are currently assuming that this frag should be
14033              extended, then, the current address is two bytes
14034              higher.  */
14035           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14036             addr += 2;
14037
14038           /* Ignore the low bit in the target, since it will be set
14039              for a text label.  */
14040           if ((val & 1) != 0)
14041             --val;
14042         }
14043       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14044         addr -= 4;
14045       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14046         addr -= 2;
14047
14048       val -= addr & ~ ((1 << op->shift) - 1);
14049
14050       /* Branch offsets have an implicit 0 in the lowest bit.  */
14051       if (type == 'p' || type == 'q')
14052         val /= 2;
14053
14054       /* If any of the shifted bits are set, we must use an extended
14055          opcode.  If the address depends on the size of this
14056          instruction, this can lead to a loop, so we arrange to always
14057          use an extended opcode.  We only check this when we are in
14058          the main relaxation loop, when SEC is NULL.  */
14059       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
14060         {
14061           fragp->fr_subtype =
14062             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14063           return 1;
14064         }
14065
14066       /* If we are about to mark a frag as extended because the value
14067          is precisely maxtiny + 1, then there is a chance of an
14068          infinite loop as in the following code:
14069              la $4,foo
14070              .skip      1020
14071              .align     2
14072            foo:
14073          In this case when the la is extended, foo is 0x3fc bytes
14074          away, so the la can be shrunk, but then foo is 0x400 away, so
14075          the la must be extended.  To avoid this loop, we mark the
14076          frag as extended if it was small, and is about to become
14077          extended with a value of maxtiny + 1.  */
14078       if (val == ((maxtiny + 1) << op->shift)
14079           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
14080           && sec == NULL)
14081         {
14082           fragp->fr_subtype =
14083             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14084           return 1;
14085         }
14086     }
14087   else if (symsec != absolute_section && sec != NULL)
14088     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
14089
14090   if ((val & ((1 << op->shift) - 1)) != 0
14091       || val < (mintiny << op->shift)
14092       || val > (maxtiny << op->shift))
14093     return 1;
14094   else
14095     return 0;
14096 }
14097
14098 /* Compute the length of a branch sequence, and adjust the
14099    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
14100    worst-case length is computed, with UPDATE being used to indicate
14101    whether an unconditional (-1), branch-likely (+1) or regular (0)
14102    branch is to be computed.  */
14103 static int
14104 relaxed_branch_length (fragS *fragp, asection *sec, int update)
14105 {
14106   bfd_boolean toofar;
14107   int length;
14108
14109   if (fragp
14110       && S_IS_DEFINED (fragp->fr_symbol)
14111       && sec == S_GET_SEGMENT (fragp->fr_symbol))
14112     {
14113       addressT addr;
14114       offsetT val;
14115
14116       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
14117
14118       addr = fragp->fr_address + fragp->fr_fix + 4;
14119
14120       val -= addr;
14121
14122       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
14123     }
14124   else if (fragp)
14125     /* If the symbol is not defined or it's in a different segment,
14126        assume the user knows what's going on and emit a short
14127        branch.  */
14128     toofar = FALSE;
14129   else
14130     toofar = TRUE;
14131
14132   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14133     fragp->fr_subtype
14134       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
14135                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
14136                              RELAX_BRANCH_LINK (fragp->fr_subtype),
14137                              toofar);
14138
14139   length = 4;
14140   if (toofar)
14141     {
14142       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
14143         length += 8;
14144
14145       if (mips_pic != NO_PIC)
14146         {
14147           /* Additional space for PIC loading of target address.  */
14148           length += 8;
14149           if (mips_opts.isa == ISA_MIPS1)
14150             /* Additional space for $at-stabilizing nop.  */
14151             length += 4;
14152         }
14153
14154       /* If branch is conditional.  */
14155       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
14156         length += 8;
14157     }
14158
14159   return length;
14160 }
14161
14162 /* Estimate the size of a frag before relaxing.  Unless this is the
14163    mips16, we are not really relaxing here, and the final size is
14164    encoded in the subtype information.  For the mips16, we have to
14165    decide whether we are using an extended opcode or not.  */
14166
14167 int
14168 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
14169 {
14170   int change;
14171
14172   if (RELAX_BRANCH_P (fragp->fr_subtype))
14173     {
14174
14175       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
14176
14177       return fragp->fr_var;
14178     }
14179
14180   if (RELAX_MIPS16_P (fragp->fr_subtype))
14181     /* We don't want to modify the EXTENDED bit here; it might get us
14182        into infinite loops.  We change it only in mips_relax_frag().  */
14183     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
14184
14185   if (mips_pic == NO_PIC)
14186     change = nopic_need_relax (fragp->fr_symbol, 0);
14187   else if (mips_pic == SVR4_PIC)
14188     change = pic_need_relax (fragp->fr_symbol, segtype);
14189   else if (mips_pic == VXWORKS_PIC)
14190     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
14191     change = 0;
14192   else
14193     abort ();
14194
14195   if (change)
14196     {
14197       fragp->fr_subtype |= RELAX_USE_SECOND;
14198       return -RELAX_FIRST (fragp->fr_subtype);
14199     }
14200   else
14201     return -RELAX_SECOND (fragp->fr_subtype);
14202 }
14203
14204 /* This is called to see whether a reloc against a defined symbol
14205    should be converted into a reloc against a section.  */
14206
14207 int
14208 mips_fix_adjustable (fixS *fixp)
14209 {
14210   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
14211       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14212     return 0;
14213
14214   if (fixp->fx_addsy == NULL)
14215     return 1;
14216
14217   /* If symbol SYM is in a mergeable section, relocations of the form
14218      SYM + 0 can usually be made section-relative.  The mergeable data
14219      is then identified by the section offset rather than by the symbol.
14220
14221      However, if we're generating REL LO16 relocations, the offset is split
14222      between the LO16 and parterning high part relocation.  The linker will
14223      need to recalculate the complete offset in order to correctly identify
14224      the merge data.
14225
14226      The linker has traditionally not looked for the parterning high part
14227      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
14228      placed anywhere.  Rather than break backwards compatibility by changing
14229      this, it seems better not to force the issue, and instead keep the
14230      original symbol.  This will work with either linker behavior.  */
14231   if ((lo16_reloc_p (fixp->fx_r_type)
14232        || reloc_needs_lo_p (fixp->fx_r_type))
14233       && HAVE_IN_PLACE_ADDENDS
14234       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
14235     return 0;
14236
14237   /* There is no place to store an in-place offset for JALR relocations.  */
14238   if (fixp->fx_r_type == BFD_RELOC_MIPS_JALR && HAVE_IN_PLACE_ADDENDS)
14239     return 0;
14240
14241 #ifdef OBJ_ELF
14242   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
14243      to a floating-point stub.  The same is true for non-R_MIPS16_26
14244      relocations against MIPS16 functions; in this case, the stub becomes
14245      the function's canonical address.
14246
14247      Floating-point stubs are stored in unique .mips16.call.* or
14248      .mips16.fn.* sections.  If a stub T for function F is in section S,
14249      the first relocation in section S must be against F; this is how the
14250      linker determines the target function.  All relocations that might
14251      resolve to T must also be against F.  We therefore have the following
14252      restrictions, which are given in an intentionally-redundant way:
14253
14254        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14255           symbols.
14256
14257        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14258           if that stub might be used.
14259
14260        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14261           symbols.
14262
14263        4. We cannot reduce a stub's relocations against MIPS16 symbols if
14264           that stub might be used.
14265
14266      There is a further restriction:
14267
14268        5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14269           on targets with in-place addends; the relocation field cannot
14270           encode the low bit.
14271
14272      For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14273      against a MIPS16 symbol.
14274
14275      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14276      relocation against some symbol R, no relocation against R may be
14277      reduced.  (Note that this deals with (2) as well as (1) because
14278      relocations against global symbols will never be reduced on ELF
14279      targets.)  This approach is a little simpler than trying to detect
14280      stub sections, and gives the "all or nothing" per-symbol consistency
14281      that we have for MIPS16 symbols.  */
14282   if (IS_ELF
14283       && fixp->fx_subsy == NULL
14284       && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
14285           || *symbol_get_tc (fixp->fx_addsy)))
14286     return 0;
14287 #endif
14288
14289   return 1;
14290 }
14291
14292 /* Translate internal representation of relocation info to BFD target
14293    format.  */
14294
14295 arelent **
14296 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
14297 {
14298   static arelent *retval[4];
14299   arelent *reloc;
14300   bfd_reloc_code_real_type code;
14301
14302   memset (retval, 0, sizeof(retval));
14303   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
14304   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14305   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
14306   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14307
14308   if (fixp->fx_pcrel)
14309     {
14310       gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
14311
14312       /* At this point, fx_addnumber is "symbol offset - pcrel address".
14313          Relocations want only the symbol offset.  */
14314       reloc->addend = fixp->fx_addnumber + reloc->address;
14315       if (!IS_ELF)
14316         {
14317           /* A gruesome hack which is a result of the gruesome gas
14318              reloc handling.  What's worse, for COFF (as opposed to
14319              ECOFF), we might need yet another copy of reloc->address.
14320              See bfd_install_relocation.  */
14321           reloc->addend += reloc->address;
14322         }
14323     }
14324   else
14325     reloc->addend = fixp->fx_addnumber;
14326
14327   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14328      entry to be used in the relocation's section offset.  */
14329   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14330     {
14331       reloc->address = reloc->addend;
14332       reloc->addend = 0;
14333     }
14334
14335   code = fixp->fx_r_type;
14336
14337   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
14338   if (reloc->howto == NULL)
14339     {
14340       as_bad_where (fixp->fx_file, fixp->fx_line,
14341                     _("Can not represent %s relocation in this object file format"),
14342                     bfd_get_reloc_code_name (code));
14343       retval[0] = NULL;
14344     }
14345
14346   return retval;
14347 }
14348
14349 /* Relax a machine dependent frag.  This returns the amount by which
14350    the current size of the frag should change.  */
14351
14352 int
14353 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
14354 {
14355   if (RELAX_BRANCH_P (fragp->fr_subtype))
14356     {
14357       offsetT old_var = fragp->fr_var;
14358
14359       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
14360
14361       return fragp->fr_var - old_var;
14362     }
14363
14364   if (! RELAX_MIPS16_P (fragp->fr_subtype))
14365     return 0;
14366
14367   if (mips16_extended_frag (fragp, NULL, stretch))
14368     {
14369       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14370         return 0;
14371       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14372       return 2;
14373     }
14374   else
14375     {
14376       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14377         return 0;
14378       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14379       return -2;
14380     }
14381
14382   return 0;
14383 }
14384
14385 /* Convert a machine dependent frag.  */
14386
14387 void
14388 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
14389 {
14390   if (RELAX_BRANCH_P (fragp->fr_subtype))
14391     {
14392       bfd_byte *buf;
14393       unsigned long insn;
14394       expressionS exp;
14395       fixS *fixp;
14396
14397       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14398
14399       if (target_big_endian)
14400         insn = bfd_getb32 (buf);
14401       else
14402         insn = bfd_getl32 (buf);
14403
14404       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14405         {
14406           /* We generate a fixup instead of applying it right now
14407              because, if there are linker relaxations, we're going to
14408              need the relocations.  */
14409           exp.X_op = O_symbol;
14410           exp.X_add_symbol = fragp->fr_symbol;
14411           exp.X_add_number = fragp->fr_offset;
14412
14413           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14414                               4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
14415           fixp->fx_file = fragp->fr_file;
14416           fixp->fx_line = fragp->fr_line;
14417
14418           md_number_to_chars ((char *) buf, insn, 4);
14419           buf += 4;
14420         }
14421       else
14422         {
14423           int i;
14424
14425           as_warn_where (fragp->fr_file, fragp->fr_line,
14426                          _("relaxed out-of-range branch into a jump"));
14427
14428           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14429             goto uncond;
14430
14431           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14432             {
14433               /* Reverse the branch.  */
14434               switch ((insn >> 28) & 0xf)
14435                 {
14436                 case 4:
14437                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14438                      have the condition reversed by tweaking a single
14439                      bit, and their opcodes all have 0x4???????.  */
14440                   gas_assert ((insn & 0xf1000000) == 0x41000000);
14441                   insn ^= 0x00010000;
14442                   break;
14443
14444                 case 0:
14445                   /* bltz       0x04000000      bgez    0x04010000
14446                      bltzal     0x04100000      bgezal  0x04110000  */
14447                   gas_assert ((insn & 0xfc0e0000) == 0x04000000);
14448                   insn ^= 0x00010000;
14449                   break;
14450
14451                 case 1:
14452                   /* beq        0x10000000      bne     0x14000000
14453                      blez       0x18000000      bgtz    0x1c000000  */
14454                   insn ^= 0x04000000;
14455                   break;
14456
14457                 default:
14458                   abort ();
14459                 }
14460             }
14461
14462           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14463             {
14464               /* Clear the and-link bit.  */
14465               gas_assert ((insn & 0xfc1c0000) == 0x04100000);
14466
14467               /* bltzal         0x04100000      bgezal  0x04110000
14468                  bltzall        0x04120000      bgezall 0x04130000  */
14469               insn &= ~0x00100000;
14470             }
14471
14472           /* Branch over the branch (if the branch was likely) or the
14473              full jump (not likely case).  Compute the offset from the
14474              current instruction to branch to.  */
14475           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14476             i = 16;
14477           else
14478             {
14479               /* How many bytes in instructions we've already emitted?  */
14480               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14481               /* How many bytes in instructions from here to the end?  */
14482               i = fragp->fr_var - i;
14483             }
14484           /* Convert to instruction count.  */
14485           i >>= 2;
14486           /* Branch counts from the next instruction.  */
14487           i--;
14488           insn |= i;
14489           /* Branch over the jump.  */
14490           md_number_to_chars ((char *) buf, insn, 4);
14491           buf += 4;
14492
14493           /* nop */
14494           md_number_to_chars ((char *) buf, 0, 4);
14495           buf += 4;
14496
14497           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14498             {
14499               /* beql $0, $0, 2f */
14500               insn = 0x50000000;
14501               /* Compute the PC offset from the current instruction to
14502                  the end of the variable frag.  */
14503               /* How many bytes in instructions we've already emitted?  */
14504               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14505               /* How many bytes in instructions from here to the end?  */
14506               i = fragp->fr_var - i;
14507               /* Convert to instruction count.  */
14508               i >>= 2;
14509               /* Don't decrement i, because we want to branch over the
14510                  delay slot.  */
14511
14512               insn |= i;
14513               md_number_to_chars ((char *) buf, insn, 4);
14514               buf += 4;
14515
14516               md_number_to_chars ((char *) buf, 0, 4);
14517               buf += 4;
14518             }
14519
14520         uncond:
14521           if (mips_pic == NO_PIC)
14522             {
14523               /* j or jal.  */
14524               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14525                       ? 0x0c000000 : 0x08000000);
14526               exp.X_op = O_symbol;
14527               exp.X_add_symbol = fragp->fr_symbol;
14528               exp.X_add_number = fragp->fr_offset;
14529
14530               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14531                                   4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
14532               fixp->fx_file = fragp->fr_file;
14533               fixp->fx_line = fragp->fr_line;
14534
14535               md_number_to_chars ((char *) buf, insn, 4);
14536               buf += 4;
14537             }
14538           else
14539             {
14540               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
14541               insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
14542               exp.X_op = O_symbol;
14543               exp.X_add_symbol = fragp->fr_symbol;
14544               exp.X_add_number = fragp->fr_offset;
14545
14546               if (fragp->fr_offset)
14547                 {
14548                   exp.X_add_symbol = make_expr_symbol (&exp);
14549                   exp.X_add_number = 0;
14550                 }
14551
14552               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14553                                   4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
14554               fixp->fx_file = fragp->fr_file;
14555               fixp->fx_line = fragp->fr_line;
14556
14557               md_number_to_chars ((char *) buf, insn, 4);
14558               buf += 4;
14559
14560               if (mips_opts.isa == ISA_MIPS1)
14561                 {
14562                   /* nop */
14563                   md_number_to_chars ((char *) buf, 0, 4);
14564                   buf += 4;
14565                 }
14566
14567               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
14568               insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14569
14570               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14571                                   4, &exp, FALSE, BFD_RELOC_LO16);
14572               fixp->fx_file = fragp->fr_file;
14573               fixp->fx_line = fragp->fr_line;
14574
14575               md_number_to_chars ((char *) buf, insn, 4);
14576               buf += 4;
14577
14578               /* j(al)r $at.  */
14579               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14580                 insn = 0x0020f809;
14581               else
14582                 insn = 0x00200008;
14583
14584               md_number_to_chars ((char *) buf, insn, 4);
14585               buf += 4;
14586             }
14587         }
14588
14589       gas_assert (buf == (bfd_byte *)fragp->fr_literal
14590               + fragp->fr_fix + fragp->fr_var);
14591
14592       fragp->fr_fix += fragp->fr_var;
14593
14594       return;
14595     }
14596
14597   if (RELAX_MIPS16_P (fragp->fr_subtype))
14598     {
14599       int type;
14600       const struct mips16_immed_operand *op;
14601       bfd_boolean small, ext;
14602       offsetT val;
14603       bfd_byte *buf;
14604       unsigned long insn;
14605       bfd_boolean use_extend;
14606       unsigned short extend;
14607
14608       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14609       op = mips16_immed_operands;
14610       while (op->type != type)
14611         ++op;
14612
14613       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14614         {
14615           small = FALSE;
14616           ext = TRUE;
14617         }
14618       else
14619         {
14620           small = TRUE;
14621           ext = FALSE;
14622         }
14623
14624       resolve_symbol_value (fragp->fr_symbol);
14625       val = S_GET_VALUE (fragp->fr_symbol);
14626       if (op->pcrel)
14627         {
14628           addressT addr;
14629
14630           addr = fragp->fr_address + fragp->fr_fix;
14631
14632           /* The rules for the base address of a PC relative reloc are
14633              complicated; see mips16_extended_frag.  */
14634           if (type == 'p' || type == 'q')
14635             {
14636               addr += 2;
14637               if (ext)
14638                 addr += 2;
14639               /* Ignore the low bit in the target, since it will be
14640                  set for a text label.  */
14641               if ((val & 1) != 0)
14642                 --val;
14643             }
14644           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14645             addr -= 4;
14646           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14647             addr -= 2;
14648
14649           addr &= ~ (addressT) ((1 << op->shift) - 1);
14650           val -= addr;
14651
14652           /* Make sure the section winds up with the alignment we have
14653              assumed.  */
14654           if (op->shift > 0)
14655             record_alignment (asec, op->shift);
14656         }
14657
14658       if (ext
14659           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14660               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14661         as_warn_where (fragp->fr_file, fragp->fr_line,
14662                        _("extended instruction in delay slot"));
14663
14664       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14665
14666       if (target_big_endian)
14667         insn = bfd_getb16 (buf);
14668       else
14669         insn = bfd_getl16 (buf);
14670
14671       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14672                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14673                     small, ext, &insn, &use_extend, &extend);
14674
14675       if (use_extend)
14676         {
14677           md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14678           fragp->fr_fix += 2;
14679           buf += 2;
14680         }
14681
14682       md_number_to_chars ((char *) buf, insn, 2);
14683       fragp->fr_fix += 2;
14684       buf += 2;
14685     }
14686   else
14687     {
14688       int first, second;
14689       fixS *fixp;
14690
14691       first = RELAX_FIRST (fragp->fr_subtype);
14692       second = RELAX_SECOND (fragp->fr_subtype);
14693       fixp = (fixS *) fragp->fr_opcode;
14694
14695       /* Possibly emit a warning if we've chosen the longer option.  */
14696       if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14697           == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14698         {
14699           const char *msg = macro_warning (fragp->fr_subtype);
14700           if (msg != 0)
14701             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
14702         }
14703
14704       /* Go through all the fixups for the first sequence.  Disable them
14705          (by marking them as done) if we're going to use the second
14706          sequence instead.  */
14707       while (fixp
14708              && fixp->fx_frag == fragp
14709              && fixp->fx_where < fragp->fr_fix - second)
14710         {
14711           if (fragp->fr_subtype & RELAX_USE_SECOND)
14712             fixp->fx_done = 1;
14713           fixp = fixp->fx_next;
14714         }
14715
14716       /* Go through the fixups for the second sequence.  Disable them if
14717          we're going to use the first sequence, otherwise adjust their
14718          addresses to account for the relaxation.  */
14719       while (fixp && fixp->fx_frag == fragp)
14720         {
14721           if (fragp->fr_subtype & RELAX_USE_SECOND)
14722             fixp->fx_where -= first;
14723           else
14724             fixp->fx_done = 1;
14725           fixp = fixp->fx_next;
14726         }
14727
14728       /* Now modify the frag contents.  */
14729       if (fragp->fr_subtype & RELAX_USE_SECOND)
14730         {
14731           char *start;
14732
14733           start = fragp->fr_literal + fragp->fr_fix - first - second;
14734           memmove (start, start + first, second);
14735           fragp->fr_fix -= first;
14736         }
14737       else
14738         fragp->fr_fix -= second;
14739     }
14740 }
14741
14742 #ifdef OBJ_ELF
14743
14744 /* This function is called after the relocs have been generated.
14745    We've been storing mips16 text labels as odd.  Here we convert them
14746    back to even for the convenience of the debugger.  */
14747
14748 void
14749 mips_frob_file_after_relocs (void)
14750 {
14751   asymbol **syms;
14752   unsigned int count, i;
14753
14754   if (!IS_ELF)
14755     return;
14756
14757   syms = bfd_get_outsymbols (stdoutput);
14758   count = bfd_get_symcount (stdoutput);
14759   for (i = 0; i < count; i++, syms++)
14760     {
14761       if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
14762           && ((*syms)->value & 1) != 0)
14763         {
14764           (*syms)->value &= ~1;
14765           /* If the symbol has an odd size, it was probably computed
14766              incorrectly, so adjust that as well.  */
14767           if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14768             ++elf_symbol (*syms)->internal_elf_sym.st_size;
14769         }
14770     }
14771 }
14772
14773 #endif
14774
14775 /* This function is called whenever a label is defined.  It is used
14776    when handling branch delays; if a branch has a label, we assume we
14777    can not move it.  */
14778
14779 void
14780 mips_define_label (symbolS *sym)
14781 {
14782   segment_info_type *si = seg_info (now_seg);
14783   struct insn_label_list *l;
14784
14785   if (free_insn_labels == NULL)
14786     l = (struct insn_label_list *) xmalloc (sizeof *l);
14787   else
14788     {
14789       l = free_insn_labels;
14790       free_insn_labels = l->next;
14791     }
14792
14793   l->label = sym;
14794   l->next = si->label_list;
14795   si->label_list = l;
14796
14797 #ifdef OBJ_ELF
14798   dwarf2_emit_label (sym);
14799 #endif
14800 }
14801 \f
14802 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14803
14804 /* Some special processing for a MIPS ELF file.  */
14805
14806 void
14807 mips_elf_final_processing (void)
14808 {
14809   /* Write out the register information.  */
14810   if (mips_abi != N64_ABI)
14811     {
14812       Elf32_RegInfo s;
14813
14814       s.ri_gprmask = mips_gprmask;
14815       s.ri_cprmask[0] = mips_cprmask[0];
14816       s.ri_cprmask[1] = mips_cprmask[1];
14817       s.ri_cprmask[2] = mips_cprmask[2];
14818       s.ri_cprmask[3] = mips_cprmask[3];
14819       /* The gp_value field is set by the MIPS ELF backend.  */
14820
14821       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14822                                        ((Elf32_External_RegInfo *)
14823                                         mips_regmask_frag));
14824     }
14825   else
14826     {
14827       Elf64_Internal_RegInfo s;
14828
14829       s.ri_gprmask = mips_gprmask;
14830       s.ri_pad = 0;
14831       s.ri_cprmask[0] = mips_cprmask[0];
14832       s.ri_cprmask[1] = mips_cprmask[1];
14833       s.ri_cprmask[2] = mips_cprmask[2];
14834       s.ri_cprmask[3] = mips_cprmask[3];
14835       /* The gp_value field is set by the MIPS ELF backend.  */
14836
14837       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14838                                        ((Elf64_External_RegInfo *)
14839                                         mips_regmask_frag));
14840     }
14841
14842   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
14843      sort of BFD interface for this.  */
14844   if (mips_any_noreorder)
14845     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14846   if (mips_pic != NO_PIC)
14847     {
14848     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
14849       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14850     }
14851   if (mips_abicalls)
14852     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14853
14854   /* Set MIPS ELF flags for ASEs.  */
14855   /* We may need to define a new flag for DSP ASE, and set this flag when
14856      file_ase_dsp is true.  */
14857   /* Same for DSP R2.  */
14858   /* We may need to define a new flag for MT ASE, and set this flag when
14859      file_ase_mt is true.  */
14860   if (file_ase_mips16)
14861     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
14862 #if 0 /* XXX FIXME */
14863   if (file_ase_mips3d)
14864     elf_elfheader (stdoutput)->e_flags |= ???;
14865 #endif
14866   if (file_ase_mdmx)
14867     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
14868
14869   /* Set the MIPS ELF ABI flags.  */
14870   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
14871     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
14872   else if (mips_abi == O64_ABI)
14873     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14874   else if (mips_abi == EABI_ABI)
14875     {
14876       if (!file_mips_gp32)
14877         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14878       else
14879         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14880     }
14881   else if (mips_abi == N32_ABI)
14882     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14883
14884   /* Nothing to do for N64_ABI.  */
14885
14886   if (mips_32bitmode)
14887     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14888
14889 #if 0 /* XXX FIXME */
14890   /* 32 bit code with 64 bit FP registers.  */
14891   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
14892     elf_elfheader (stdoutput)->e_flags |= ???;
14893 #endif
14894 }
14895
14896 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14897 \f
14898 typedef struct proc {
14899   symbolS *func_sym;
14900   symbolS *func_end_sym;
14901   unsigned long reg_mask;
14902   unsigned long reg_offset;
14903   unsigned long fpreg_mask;
14904   unsigned long fpreg_offset;
14905   unsigned long frame_offset;
14906   unsigned long frame_reg;
14907   unsigned long pc_reg;
14908 } procS;
14909
14910 static procS cur_proc;
14911 static procS *cur_proc_ptr;
14912 static int numprocs;
14913
14914 /* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1" and a normal
14915    nop as "0".  */
14916
14917 char
14918 mips_nop_opcode (void)
14919 {
14920   return seg_info (now_seg)->tc_segment_info_data.mips16;
14921 }
14922
14923 /* Fill in an rs_align_code fragment.  This only needs to do something
14924    for MIPS16 code, where 0 is not a nop.  */
14925
14926 void
14927 mips_handle_align (fragS *fragp)
14928 {
14929   char *p;
14930   int bytes, size, excess;
14931   valueT opcode;
14932
14933   if (fragp->fr_type != rs_align_code)
14934     return;
14935
14936   p = fragp->fr_literal + fragp->fr_fix;
14937   if (*p)
14938     {
14939       opcode = mips16_nop_insn.insn_opcode;
14940       size = 2;
14941     }
14942   else
14943     {
14944       opcode = nop_insn.insn_opcode;
14945       size = 4;
14946     }
14947
14948   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14949   excess = bytes % size;
14950   if (excess != 0)
14951     {
14952       /* If we're not inserting a whole number of instructions,
14953          pad the end of the fixed part of the frag with zeros.  */
14954       memset (p, 0, excess);
14955       p += excess;
14956       fragp->fr_fix += excess;
14957     }
14958
14959   md_number_to_chars (p, opcode, size);
14960   fragp->fr_var = size;
14961 }
14962
14963 static void
14964 md_obj_begin (void)
14965 {
14966 }
14967
14968 static void
14969 md_obj_end (void)
14970 {
14971   /* Check for premature end, nesting errors, etc.  */
14972   if (cur_proc_ptr)
14973     as_warn (_("missing .end at end of assembly"));
14974 }
14975
14976 static long
14977 get_number (void)
14978 {
14979   int negative = 0;
14980   long val = 0;
14981
14982   if (*input_line_pointer == '-')
14983     {
14984       ++input_line_pointer;
14985       negative = 1;
14986     }
14987   if (!ISDIGIT (*input_line_pointer))
14988     as_bad (_("expected simple number"));
14989   if (input_line_pointer[0] == '0')
14990     {
14991       if (input_line_pointer[1] == 'x')
14992         {
14993           input_line_pointer += 2;
14994           while (ISXDIGIT (*input_line_pointer))
14995             {
14996               val <<= 4;
14997               val |= hex_value (*input_line_pointer++);
14998             }
14999           return negative ? -val : val;
15000         }
15001       else
15002         {
15003           ++input_line_pointer;
15004           while (ISDIGIT (*input_line_pointer))
15005             {
15006               val <<= 3;
15007               val |= *input_line_pointer++ - '0';
15008             }
15009           return negative ? -val : val;
15010         }
15011     }
15012   if (!ISDIGIT (*input_line_pointer))
15013     {
15014       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
15015               *input_line_pointer, *input_line_pointer);
15016       as_warn (_("invalid number"));
15017       return -1;
15018     }
15019   while (ISDIGIT (*input_line_pointer))
15020     {
15021       val *= 10;
15022       val += *input_line_pointer++ - '0';
15023     }
15024   return negative ? -val : val;
15025 }
15026
15027 /* The .file directive; just like the usual .file directive, but there
15028    is an initial number which is the ECOFF file index.  In the non-ECOFF
15029    case .file implies DWARF-2.  */
15030
15031 static void
15032 s_mips_file (int x ATTRIBUTE_UNUSED)
15033 {
15034   static int first_file_directive = 0;
15035
15036   if (ECOFF_DEBUGGING)
15037     {
15038       get_number ();
15039       s_app_file (0);
15040     }
15041   else
15042     {
15043       char *filename;
15044
15045       filename = dwarf2_directive_file (0);
15046
15047       /* Versions of GCC up to 3.1 start files with a ".file"
15048          directive even for stabs output.  Make sure that this
15049          ".file" is handled.  Note that you need a version of GCC
15050          after 3.1 in order to support DWARF-2 on MIPS.  */
15051       if (filename != NULL && ! first_file_directive)
15052         {
15053           (void) new_logical_line (filename, -1);
15054           s_app_file_string (filename, 0);
15055         }
15056       first_file_directive = 1;
15057     }
15058 }
15059
15060 /* The .loc directive, implying DWARF-2.  */
15061
15062 static void
15063 s_mips_loc (int x ATTRIBUTE_UNUSED)
15064 {
15065   if (!ECOFF_DEBUGGING)
15066     dwarf2_directive_loc (0);
15067 }
15068
15069 /* The .end directive.  */
15070
15071 static void
15072 s_mips_end (int x ATTRIBUTE_UNUSED)
15073 {
15074   symbolS *p;
15075
15076   /* Following functions need their own .frame and .cprestore directives.  */
15077   mips_frame_reg_valid = 0;
15078   mips_cprestore_valid = 0;
15079
15080   if (!is_end_of_line[(unsigned char) *input_line_pointer])
15081     {
15082       p = get_symbol ();
15083       demand_empty_rest_of_line ();
15084     }
15085   else
15086     p = NULL;
15087
15088   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15089     as_warn (_(".end not in text section"));
15090
15091   if (!cur_proc_ptr)
15092     {
15093       as_warn (_(".end directive without a preceding .ent directive."));
15094       demand_empty_rest_of_line ();
15095       return;
15096     }
15097
15098   if (p != NULL)
15099     {
15100       gas_assert (S_GET_NAME (p));
15101       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
15102         as_warn (_(".end symbol does not match .ent symbol."));
15103
15104       if (debug_type == DEBUG_STABS)
15105         stabs_generate_asm_endfunc (S_GET_NAME (p),
15106                                     S_GET_NAME (p));
15107     }
15108   else
15109     as_warn (_(".end directive missing or unknown symbol"));
15110
15111 #ifdef OBJ_ELF
15112   /* Create an expression to calculate the size of the function.  */
15113   if (p && cur_proc_ptr)
15114     {
15115       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
15116       expressionS *exp = xmalloc (sizeof (expressionS));
15117
15118       obj->size = exp;
15119       exp->X_op = O_subtract;
15120       exp->X_add_symbol = symbol_temp_new_now ();
15121       exp->X_op_symbol = p;
15122       exp->X_add_number = 0;
15123
15124       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
15125     }
15126
15127   /* Generate a .pdr section.  */
15128   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
15129     {
15130       segT saved_seg = now_seg;
15131       subsegT saved_subseg = now_subseg;
15132       expressionS exp;
15133       char *fragp;
15134
15135 #ifdef md_flush_pending_output
15136       md_flush_pending_output ();
15137 #endif
15138
15139       gas_assert (pdr_seg);
15140       subseg_set (pdr_seg, 0);
15141
15142       /* Write the symbol.  */
15143       exp.X_op = O_symbol;
15144       exp.X_add_symbol = p;
15145       exp.X_add_number = 0;
15146       emit_expr (&exp, 4);
15147
15148       fragp = frag_more (7 * 4);
15149
15150       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
15151       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
15152       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
15153       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
15154       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
15155       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
15156       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
15157
15158       subseg_set (saved_seg, saved_subseg);
15159     }
15160 #endif /* OBJ_ELF */
15161
15162   cur_proc_ptr = NULL;
15163 }
15164
15165 /* The .aent and .ent directives.  */
15166
15167 static void
15168 s_mips_ent (int aent)
15169 {
15170   symbolS *symbolP;
15171
15172   symbolP = get_symbol ();
15173   if (*input_line_pointer == ',')
15174     ++input_line_pointer;
15175   SKIP_WHITESPACE ();
15176   if (ISDIGIT (*input_line_pointer)
15177       || *input_line_pointer == '-')
15178     get_number ();
15179
15180   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15181     as_warn (_(".ent or .aent not in text section."));
15182
15183   if (!aent && cur_proc_ptr)
15184     as_warn (_("missing .end"));
15185
15186   if (!aent)
15187     {
15188       /* This function needs its own .frame and .cprestore directives.  */
15189       mips_frame_reg_valid = 0;
15190       mips_cprestore_valid = 0;
15191
15192       cur_proc_ptr = &cur_proc;
15193       memset (cur_proc_ptr, '\0', sizeof (procS));
15194
15195       cur_proc_ptr->func_sym = symbolP;
15196
15197       ++numprocs;
15198
15199       if (debug_type == DEBUG_STABS)
15200         stabs_generate_asm_func (S_GET_NAME (symbolP),
15201                                  S_GET_NAME (symbolP));
15202     }
15203
15204   symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
15205
15206   demand_empty_rest_of_line ();
15207 }
15208
15209 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
15210    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
15211    s_mips_frame is used so that we can set the PDR information correctly.
15212    We can't use the ecoff routines because they make reference to the ecoff
15213    symbol table (in the mdebug section).  */
15214
15215 static void
15216 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
15217 {
15218 #ifdef OBJ_ELF
15219   if (IS_ELF && !ECOFF_DEBUGGING)
15220     {
15221       long val;
15222
15223       if (cur_proc_ptr == (procS *) NULL)
15224         {
15225           as_warn (_(".frame outside of .ent"));
15226           demand_empty_rest_of_line ();
15227           return;
15228         }
15229
15230       cur_proc_ptr->frame_reg = tc_get_register (1);
15231
15232       SKIP_WHITESPACE ();
15233       if (*input_line_pointer++ != ','
15234           || get_absolute_expression_and_terminator (&val) != ',')
15235         {
15236           as_warn (_("Bad .frame directive"));
15237           --input_line_pointer;
15238           demand_empty_rest_of_line ();
15239           return;
15240         }
15241
15242       cur_proc_ptr->frame_offset = val;
15243       cur_proc_ptr->pc_reg = tc_get_register (0);
15244
15245       demand_empty_rest_of_line ();
15246     }
15247   else
15248 #endif /* OBJ_ELF */
15249     s_ignore (ignore);
15250 }
15251
15252 /* The .fmask and .mask directives. If the mdebug section is present
15253    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
15254    embedded targets, s_mips_mask is used so that we can set the PDR
15255    information correctly. We can't use the ecoff routines because they
15256    make reference to the ecoff symbol table (in the mdebug section).  */
15257
15258 static void
15259 s_mips_mask (int reg_type)
15260 {
15261 #ifdef OBJ_ELF
15262   if (IS_ELF && !ECOFF_DEBUGGING)
15263     {
15264       long mask, off;
15265
15266       if (cur_proc_ptr == (procS *) NULL)
15267         {
15268           as_warn (_(".mask/.fmask outside of .ent"));
15269           demand_empty_rest_of_line ();
15270           return;
15271         }
15272
15273       if (get_absolute_expression_and_terminator (&mask) != ',')
15274         {
15275           as_warn (_("Bad .mask/.fmask directive"));
15276           --input_line_pointer;
15277           demand_empty_rest_of_line ();
15278           return;
15279         }
15280
15281       off = get_absolute_expression ();
15282
15283       if (reg_type == 'F')
15284         {
15285           cur_proc_ptr->fpreg_mask = mask;
15286           cur_proc_ptr->fpreg_offset = off;
15287         }
15288       else
15289         {
15290           cur_proc_ptr->reg_mask = mask;
15291           cur_proc_ptr->reg_offset = off;
15292         }
15293
15294       demand_empty_rest_of_line ();
15295     }
15296   else
15297 #endif /* OBJ_ELF */
15298     s_ignore (reg_type);
15299 }
15300
15301 /* A table describing all the processors gas knows about.  Names are
15302    matched in the order listed.
15303
15304    To ease comparison, please keep this table in the same order as
15305    gcc's mips_cpu_info_table[].  */
15306 static const struct mips_cpu_info mips_cpu_info_table[] =
15307 {
15308   /* Entries for generic ISAs */
15309   { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
15310   { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
15311   { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
15312   { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
15313   { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
15314   { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
15315   { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
15316   { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
15317   { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
15318
15319   /* MIPS I */
15320   { "r3000",          0,                        ISA_MIPS1,      CPU_R3000 },
15321   { "r2000",          0,                        ISA_MIPS1,      CPU_R3000 },
15322   { "r3900",          0,                        ISA_MIPS1,      CPU_R3900 },
15323
15324   /* MIPS II */
15325   { "r6000",          0,                        ISA_MIPS2,      CPU_R6000 },
15326
15327   /* MIPS III */
15328   { "r4000",          0,                        ISA_MIPS3,      CPU_R4000 },
15329   { "r4010",          0,                        ISA_MIPS2,      CPU_R4010 },
15330   { "vr4100",         0,                        ISA_MIPS3,      CPU_VR4100 },
15331   { "vr4111",         0,                        ISA_MIPS3,      CPU_R4111 },
15332   { "vr4120",         0,                        ISA_MIPS3,      CPU_VR4120 },
15333   { "vr4130",         0,                        ISA_MIPS3,      CPU_VR4120 },
15334   { "vr4181",         0,                        ISA_MIPS3,      CPU_R4111 },
15335   { "vr4300",         0,                        ISA_MIPS3,      CPU_R4300 },
15336   { "r4400",          0,                        ISA_MIPS3,      CPU_R4400 },
15337   { "r4600",          0,                        ISA_MIPS3,      CPU_R4600 },
15338   { "orion",          0,                        ISA_MIPS3,      CPU_R4600 },
15339   { "r4650",          0,                        ISA_MIPS3,      CPU_R4650 },
15340   /* ST Microelectronics Loongson 2E and 2F cores */
15341   { "loongson2e",     0,                        ISA_MIPS3,   CPU_LOONGSON_2E },
15342   { "loongson2f",     0,                        ISA_MIPS3,   CPU_LOONGSON_2F },
15343
15344   /* MIPS IV */
15345   { "r8000",          0,                        ISA_MIPS4,      CPU_R8000 },
15346   { "r10000",         0,                        ISA_MIPS4,      CPU_R10000 },
15347   { "r12000",         0,                        ISA_MIPS4,      CPU_R12000 },
15348   { "r14000",         0,                        ISA_MIPS4,      CPU_R14000 },
15349   { "r16000",         0,                        ISA_MIPS4,      CPU_R16000 },
15350   { "vr5000",         0,                        ISA_MIPS4,      CPU_R5000 },
15351   { "vr5400",         0,                        ISA_MIPS4,      CPU_VR5400 },
15352   { "vr5500",         0,                        ISA_MIPS4,      CPU_VR5500 },
15353   { "rm5200",         0,                        ISA_MIPS4,      CPU_R5000 },
15354   { "rm5230",         0,                        ISA_MIPS4,      CPU_R5000 },
15355   { "rm5231",         0,                        ISA_MIPS4,      CPU_R5000 },
15356   { "rm5261",         0,                        ISA_MIPS4,      CPU_R5000 },
15357   { "rm5721",         0,                        ISA_MIPS4,      CPU_R5000 },
15358   { "rm7000",         0,                        ISA_MIPS4,      CPU_RM7000 },
15359   { "rm9000",         0,                        ISA_MIPS4,      CPU_RM9000 },
15360
15361   /* MIPS 32 */
15362   { "4kc",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15363   { "4km",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15364   { "4kp",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15365   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
15366
15367   /* MIPS 32 Release 2 */
15368   { "4kec",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15369   { "4kem",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15370   { "4kep",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15371   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
15372   { "m4k",            0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15373   { "m4kp",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15374   { "24kc",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15375   { "24kf2_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15376   { "24kf",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15377   { "24kf1_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15378   /* Deprecated forms of the above.  */
15379   { "24kfx",          0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15380   { "24kx",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15381   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
15382   { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15383   { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15384   { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15385   { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15386   /* Deprecated forms of the above.  */
15387   { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15388   { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15389   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
15390   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15391                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15392   { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15393                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15394   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15395                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15396   { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15397                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15398   /* Deprecated forms of the above.  */
15399   { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15400                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15401   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15402                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15403   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
15404   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15405                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15406   { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15407                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15408   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15409                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15410   { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15411                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15412   { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15413                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15414   /* Deprecated forms of the above.  */
15415   { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15416                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15417   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15418                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15419   /* 1004K cores are multiprocessor versions of the 34K.  */
15420   { "1004kc",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15421                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15422   { "1004kf2_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15423                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15424   { "1004kf",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15425                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15426   { "1004kf1_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15427                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15428
15429   /* MIPS 64 */
15430   { "5kc",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15431   { "5kf",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15432   { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15433   { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15434
15435   /* Broadcom SB-1 CPU core */
15436   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15437                                                 ISA_MIPS64,     CPU_SB1 },
15438   /* Broadcom SB-1A CPU core */
15439   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15440                                                 ISA_MIPS64,     CPU_SB1 },
15441
15442   /* MIPS 64 Release 2 */
15443
15444   /* Cavium Networks Octeon CPU core */
15445   { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
15446
15447   /* RMI Xlr */
15448   { "xlr",            0,      ISA_MIPS64,     CPU_XLR },
15449
15450   /* End marker */
15451   { NULL, 0, 0, 0 }
15452 };
15453
15454
15455 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15456    with a final "000" replaced by "k".  Ignore case.
15457
15458    Note: this function is shared between GCC and GAS.  */
15459
15460 static bfd_boolean
15461 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15462 {
15463   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15464     given++, canonical++;
15465
15466   return ((*given == 0 && *canonical == 0)
15467           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15468 }
15469
15470
15471 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15472    CPU name.  We've traditionally allowed a lot of variation here.
15473
15474    Note: this function is shared between GCC and GAS.  */
15475
15476 static bfd_boolean
15477 mips_matching_cpu_name_p (const char *canonical, const char *given)
15478 {
15479   /* First see if the name matches exactly, or with a final "000"
15480      turned into "k".  */
15481   if (mips_strict_matching_cpu_name_p (canonical, given))
15482     return TRUE;
15483
15484   /* If not, try comparing based on numerical designation alone.
15485      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
15486   if (TOLOWER (*given) == 'r')
15487     given++;
15488   if (!ISDIGIT (*given))
15489     return FALSE;
15490
15491   /* Skip over some well-known prefixes in the canonical name,
15492      hoping to find a number there too.  */
15493   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15494     canonical += 2;
15495   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15496     canonical += 2;
15497   else if (TOLOWER (canonical[0]) == 'r')
15498     canonical += 1;
15499
15500   return mips_strict_matching_cpu_name_p (canonical, given);
15501 }
15502
15503
15504 /* Parse an option that takes the name of a processor as its argument.
15505    OPTION is the name of the option and CPU_STRING is the argument.
15506    Return the corresponding processor enumeration if the CPU_STRING is
15507    recognized, otherwise report an error and return null.
15508
15509    A similar function exists in GCC.  */
15510
15511 static const struct mips_cpu_info *
15512 mips_parse_cpu (const char *option, const char *cpu_string)
15513 {
15514   const struct mips_cpu_info *p;
15515
15516   /* 'from-abi' selects the most compatible architecture for the given
15517      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
15518      EABIs, we have to decide whether we're using the 32-bit or 64-bit
15519      version.  Look first at the -mgp options, if given, otherwise base
15520      the choice on MIPS_DEFAULT_64BIT.
15521
15522      Treat NO_ABI like the EABIs.  One reason to do this is that the
15523      plain 'mips' and 'mips64' configs have 'from-abi' as their default
15524      architecture.  This code picks MIPS I for 'mips' and MIPS III for
15525      'mips64', just as we did in the days before 'from-abi'.  */
15526   if (strcasecmp (cpu_string, "from-abi") == 0)
15527     {
15528       if (ABI_NEEDS_32BIT_REGS (mips_abi))
15529         return mips_cpu_info_from_isa (ISA_MIPS1);
15530
15531       if (ABI_NEEDS_64BIT_REGS (mips_abi))
15532         return mips_cpu_info_from_isa (ISA_MIPS3);
15533
15534       if (file_mips_gp32 >= 0)
15535         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15536
15537       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15538                                      ? ISA_MIPS3
15539                                      : ISA_MIPS1);
15540     }
15541
15542   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
15543   if (strcasecmp (cpu_string, "default") == 0)
15544     return 0;
15545
15546   for (p = mips_cpu_info_table; p->name != 0; p++)
15547     if (mips_matching_cpu_name_p (p->name, cpu_string))
15548       return p;
15549
15550   as_bad (_("Bad value (%s) for %s"), cpu_string, option);
15551   return 0;
15552 }
15553
15554 /* Return the canonical processor information for ISA (a member of the
15555    ISA_MIPS* enumeration).  */
15556
15557 static const struct mips_cpu_info *
15558 mips_cpu_info_from_isa (int isa)
15559 {
15560   int i;
15561
15562   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15563     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
15564         && isa == mips_cpu_info_table[i].isa)
15565       return (&mips_cpu_info_table[i]);
15566
15567   return NULL;
15568 }
15569
15570 static const struct mips_cpu_info *
15571 mips_cpu_info_from_arch (int arch)
15572 {
15573   int i;
15574
15575   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15576     if (arch == mips_cpu_info_table[i].cpu)
15577       return (&mips_cpu_info_table[i]);
15578
15579   return NULL;
15580 }
15581 \f
15582 static void
15583 show (FILE *stream, const char *string, int *col_p, int *first_p)
15584 {
15585   if (*first_p)
15586     {
15587       fprintf (stream, "%24s", "");
15588       *col_p = 24;
15589     }
15590   else
15591     {
15592       fprintf (stream, ", ");
15593       *col_p += 2;
15594     }
15595
15596   if (*col_p + strlen (string) > 72)
15597     {
15598       fprintf (stream, "\n%24s", "");
15599       *col_p = 24;
15600     }
15601
15602   fprintf (stream, "%s", string);
15603   *col_p += strlen (string);
15604
15605   *first_p = 0;
15606 }
15607
15608 void
15609 md_show_usage (FILE *stream)
15610 {
15611   int column, first;
15612   size_t i;
15613
15614   fprintf (stream, _("\
15615 MIPS options:\n\
15616 -EB                     generate big endian output\n\
15617 -EL                     generate little endian output\n\
15618 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
15619 -G NUM                  allow referencing objects up to NUM bytes\n\
15620                         implicitly with the gp register [default 8]\n"));
15621   fprintf (stream, _("\
15622 -mips1                  generate MIPS ISA I instructions\n\
15623 -mips2                  generate MIPS ISA II instructions\n\
15624 -mips3                  generate MIPS ISA III instructions\n\
15625 -mips4                  generate MIPS ISA IV instructions\n\
15626 -mips5                  generate MIPS ISA V instructions\n\
15627 -mips32                 generate MIPS32 ISA instructions\n\
15628 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
15629 -mips64                 generate MIPS64 ISA instructions\n\
15630 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
15631 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
15632
15633   first = 1;
15634
15635   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15636     show (stream, mips_cpu_info_table[i].name, &column, &first);
15637   show (stream, "from-abi", &column, &first);
15638   fputc ('\n', stream);
15639
15640   fprintf (stream, _("\
15641 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15642 -no-mCPU                don't generate code specific to CPU.\n\
15643                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
15644
15645   first = 1;
15646
15647   show (stream, "3900", &column, &first);
15648   show (stream, "4010", &column, &first);
15649   show (stream, "4100", &column, &first);
15650   show (stream, "4650", &column, &first);
15651   fputc ('\n', stream);
15652
15653   fprintf (stream, _("\
15654 -mips16                 generate mips16 instructions\n\
15655 -no-mips16              do not generate mips16 instructions\n"));
15656   fprintf (stream, _("\
15657 -msmartmips             generate smartmips instructions\n\
15658 -mno-smartmips          do not generate smartmips instructions\n"));  
15659   fprintf (stream, _("\
15660 -mdsp                   generate DSP instructions\n\
15661 -mno-dsp                do not generate DSP instructions\n"));
15662   fprintf (stream, _("\
15663 -mdspr2                 generate DSP R2 instructions\n\
15664 -mno-dspr2              do not generate DSP R2 instructions\n"));
15665   fprintf (stream, _("\
15666 -mmt                    generate MT instructions\n\
15667 -mno-mt                 do not generate MT instructions\n"));
15668   fprintf (stream, _("\
15669 -mfix-loongson2f-jump   work around Loongson2F JUMP instructions\n\
15670 -mfix-loongson2f-nop    work around Loongson2F NOP errata\n\
15671 -mfix-vr4120            work around certain VR4120 errata\n\
15672 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
15673 -mfix-24k               insert a nop after ERET and DERET instructions\n\
15674 -mfix-cn63xxp1          work around CN63XXP1 PREF errata\n\
15675 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
15676 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
15677 -msym32                 assume all symbols have 32-bit values\n\
15678 -O0                     remove unneeded NOPs, do not swap branches\n\
15679 -O                      remove unneeded NOPs and swap branches\n\
15680 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
15681 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
15682   fprintf (stream, _("\
15683 -mhard-float            allow floating-point instructions\n\
15684 -msoft-float            do not allow floating-point instructions\n\
15685 -msingle-float          only allow 32-bit floating-point operations\n\
15686 -mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
15687 --[no-]construct-floats [dis]allow floating point values to be constructed\n"
15688                      ));
15689 #ifdef OBJ_ELF
15690   fprintf (stream, _("\
15691 -KPIC, -call_shared     generate SVR4 position independent code\n\
15692 -call_nonpic            generate non-PIC code that can operate with DSOs\n\
15693 -mvxworks-pic           generate VxWorks position independent code\n\
15694 -non_shared             do not generate code that can operate with DSOs\n\
15695 -xgot                   assume a 32 bit GOT\n\
15696 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
15697 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
15698                         position dependent (non shared) code\n\
15699 -mabi=ABI               create ABI conformant object file for:\n"));
15700
15701   first = 1;
15702
15703   show (stream, "32", &column, &first);
15704   show (stream, "o64", &column, &first);
15705   show (stream, "n32", &column, &first);
15706   show (stream, "64", &column, &first);
15707   show (stream, "eabi", &column, &first);
15708
15709   fputc ('\n', stream);
15710
15711   fprintf (stream, _("\
15712 -32                     create o32 ABI object file (default)\n\
15713 -n32                    create n32 ABI object file\n\
15714 -64                     create 64 ABI object file\n"));
15715 #endif
15716 }
15717
15718 #ifdef TE_IRIX
15719 enum dwarf2_format
15720 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
15721 {
15722   if (HAVE_64BIT_SYMBOLS)
15723     return dwarf2_format_64bit_irix;
15724   else
15725     return dwarf2_format_32bit;
15726 }
15727 #endif
15728
15729 int
15730 mips_dwarf2_addr_size (void)
15731 {
15732   if (HAVE_64BIT_OBJECTS)
15733     return 8;
15734   else
15735     return 4;
15736 }
15737
15738 /* Standard calling conventions leave the CFA at SP on entry.  */
15739 void
15740 mips_cfi_frame_initial_instructions (void)
15741 {
15742   cfi_add_CFA_def_cfa_register (SP);
15743 }
15744
15745 int
15746 tc_mips_regname_to_dw2regnum (char *regname)
15747 {
15748   unsigned int regnum = -1;
15749   unsigned int reg;
15750
15751   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15752     regnum = reg;
15753
15754   return regnum;
15755 }