* config/tc-mips.h (TC_ADDRESS_BYTES): New macro.
[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 any MIPS16 code was produced.  */
286 static int file_ase_mips16;
287
288 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
289                               || mips_opts.isa == ISA_MIPS32R2          \
290                               || mips_opts.isa == ISA_MIPS64            \
291                               || mips_opts.isa == ISA_MIPS64R2)
292
293 /* True if we want to create R_MIPS_JALR for jalr $25.  */
294 #ifdef TE_IRIX
295 #define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
296 #else
297 /* As a GNU extension, we use R_MIPS_JALR for o32 too.  However,
298    because there's no place for any addend, the only acceptable
299    expression is a bare symbol.  */
300 #define MIPS_JALR_HINT_P(EXPR) \
301   (!HAVE_IN_PLACE_ADDENDS \
302    || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
303 #endif
304
305 /* True if -mips3d was passed or implied by arguments passed on the
306    command line (e.g., by -march).  */
307 static int file_ase_mips3d;
308
309 /* True if -mdmx was passed or implied by arguments passed on the
310    command line (e.g., by -march).  */
311 static int file_ase_mdmx;
312
313 /* True if -msmartmips was passed or implied by arguments passed on the
314    command line (e.g., by -march).  */
315 static int file_ase_smartmips;
316
317 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32             \
318                                 || mips_opts.isa == ISA_MIPS32R2)
319
320 /* True if -mdsp was passed or implied by arguments passed on the
321    command line (e.g., by -march).  */
322 static int file_ase_dsp;
323
324 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2             \
325                               || mips_opts.isa == ISA_MIPS64R2)
326
327 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
328
329 /* True if -mdspr2 was passed or implied by arguments passed on the
330    command line (e.g., by -march).  */
331 static int file_ase_dspr2;
332
333 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
334                                 || mips_opts.isa == ISA_MIPS64R2)
335
336 /* True if -mmt was passed or implied by arguments passed on the
337    command line (e.g., by -march).  */
338 static int file_ase_mt;
339
340 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
341                              || mips_opts.isa == ISA_MIPS64R2)
342
343 /* The argument of the -march= flag.  The architecture we are assembling.  */
344 static int file_mips_arch = CPU_UNKNOWN;
345 static const char *mips_arch_string;
346
347 /* The argument of the -mtune= flag.  The architecture for which we
348    are optimizing.  */
349 static int mips_tune = CPU_UNKNOWN;
350 static const char *mips_tune_string;
351
352 /* True when generating 32-bit code for a 64-bit processor.  */
353 static int mips_32bitmode = 0;
354
355 /* True if the given ABI requires 32-bit registers.  */
356 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
357
358 /* Likewise 64-bit registers.  */
359 #define ABI_NEEDS_64BIT_REGS(ABI)       \
360   ((ABI) == N32_ABI                     \
361    || (ABI) == N64_ABI                  \
362    || (ABI) == O64_ABI)
363
364 /*  Return true if ISA supports 64 bit wide gp registers.  */
365 #define ISA_HAS_64BIT_REGS(ISA)         \
366   ((ISA) == ISA_MIPS3                   \
367    || (ISA) == ISA_MIPS4                \
368    || (ISA) == ISA_MIPS5                \
369    || (ISA) == ISA_MIPS64               \
370    || (ISA) == ISA_MIPS64R2)
371
372 /*  Return true if ISA supports 64 bit wide float registers.  */
373 #define ISA_HAS_64BIT_FPRS(ISA)         \
374   ((ISA) == ISA_MIPS3                   \
375    || (ISA) == ISA_MIPS4                \
376    || (ISA) == ISA_MIPS5                \
377    || (ISA) == ISA_MIPS32R2             \
378    || (ISA) == ISA_MIPS64               \
379    || (ISA) == ISA_MIPS64R2)
380
381 /* Return true if ISA supports 64-bit right rotate (dror et al.)
382    instructions.  */
383 #define ISA_HAS_DROR(ISA)               \
384   ((ISA) == ISA_MIPS64R2)
385
386 /* Return true if ISA supports 32-bit right rotate (ror et al.)
387    instructions.  */
388 #define ISA_HAS_ROR(ISA)                \
389   ((ISA) == ISA_MIPS32R2                \
390    || (ISA) == ISA_MIPS64R2             \
391    || mips_opts.ase_smartmips)
392
393 /* Return true if ISA supports single-precision floats in odd registers.  */
394 #define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
395   ((ISA) == ISA_MIPS32                  \
396    || (ISA) == ISA_MIPS32R2             \
397    || (ISA) == ISA_MIPS64               \
398    || (ISA) == ISA_MIPS64R2)
399
400 /* Return true if ISA supports move to/from high part of a 64-bit
401    floating-point register. */
402 #define ISA_HAS_MXHC1(ISA)              \
403   ((ISA) == ISA_MIPS32R2                \
404    || (ISA) == ISA_MIPS64R2)
405
406 #define HAVE_32BIT_GPRS                            \
407     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
408
409 #define HAVE_32BIT_FPRS                            \
410     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
411
412 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
413 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
414
415 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
416
417 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
418
419 /* True if relocations are stored in-place.  */
420 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
421
422 /* The ABI-derived address size.  */
423 #define HAVE_64BIT_ADDRESSES \
424   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
425 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
426
427 /* The size of symbolic constants (i.e., expressions of the form
428    "SYMBOL" or "SYMBOL + OFFSET").  */
429 #define HAVE_32BIT_SYMBOLS \
430   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
431 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
432
433 /* Addresses are loaded in different ways, depending on the address size
434    in use.  The n32 ABI Documentation also mandates the use of additions
435    with overflow checking, but existing implementations don't follow it.  */
436 #define ADDRESS_ADD_INSN                                                \
437    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
438
439 #define ADDRESS_ADDI_INSN                                               \
440    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
441
442 #define ADDRESS_LOAD_INSN                                               \
443    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
444
445 #define ADDRESS_STORE_INSN                                              \
446    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
447
448 /* Return true if the given CPU supports the MIPS16 ASE.  */
449 #define CPU_HAS_MIPS16(cpu)                                             \
450    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
451     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
452
453 /* True if CPU has a dror instruction.  */
454 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
455
456 /* True if CPU has a ror instruction.  */
457 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
458
459 /* True if CPU has seq/sne and seqi/snei instructions.  */
460 #define CPU_HAS_SEQ(CPU)        ((CPU) == CPU_OCTEON)
461
462 /* True if CPU does not implement the all the coprocessor insns.  For these
463    CPUs only those COP insns are accepted that are explicitly marked to be
464    available on the CPU.  ISA membership for COP insns is ignored.  */
465 #define NO_ISA_COP(CPU)         ((CPU) == CPU_OCTEON)
466
467 /* True if mflo and mfhi can be immediately followed by instructions
468    which write to the HI and LO registers.
469
470    According to MIPS specifications, MIPS ISAs I, II, and III need
471    (at least) two instructions between the reads of HI/LO and
472    instructions which write them, and later ISAs do not.  Contradicting
473    the MIPS specifications, some MIPS IV processor user manuals (e.g.
474    the UM for the NEC Vr5000) document needing the instructions between
475    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
476    MIPS64 and later ISAs to have the interlocks, plus any specific
477    earlier-ISA CPUs for which CPU documentation declares that the
478    instructions are really interlocked.  */
479 #define hilo_interlocks \
480   (mips_opts.isa == ISA_MIPS32                        \
481    || mips_opts.isa == ISA_MIPS32R2                   \
482    || mips_opts.isa == ISA_MIPS64                     \
483    || mips_opts.isa == ISA_MIPS64R2                   \
484    || mips_opts.arch == CPU_R4010                     \
485    || mips_opts.arch == CPU_R10000                    \
486    || mips_opts.arch == CPU_R12000                    \
487    || mips_opts.arch == CPU_R14000                    \
488    || mips_opts.arch == CPU_R16000                    \
489    || mips_opts.arch == CPU_RM7000                    \
490    || mips_opts.arch == CPU_VR5500                    \
491    )
492
493 /* Whether the processor uses hardware interlocks to protect reads
494    from the GPRs after they are loaded from memory, and thus does not
495    require nops to be inserted.  This applies to instructions marked
496    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
497    level I.  */
498 #define gpr_interlocks \
499   (mips_opts.isa != ISA_MIPS1  \
500    || mips_opts.arch == CPU_R3900)
501
502 /* Whether the processor uses hardware interlocks to avoid delays
503    required by coprocessor instructions, and thus does not require
504    nops to be inserted.  This applies to instructions marked
505    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
506    between instructions marked INSN_WRITE_COND_CODE and ones marked
507    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
508    levels I, II, and III.  */
509 /* Itbl support may require additional care here.  */
510 #define cop_interlocks                                \
511   ((mips_opts.isa != ISA_MIPS1                        \
512     && mips_opts.isa != ISA_MIPS2                     \
513     && mips_opts.isa != ISA_MIPS3)                    \
514    || mips_opts.arch == CPU_R4300                     \
515    )
516
517 /* Whether the processor uses hardware interlocks to protect reads
518    from coprocessor registers after they are loaded from memory, and
519    thus does not require nops to be inserted.  This applies to
520    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
521    requires at MIPS ISA level I.  */
522 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
523
524 /* Is this a mfhi or mflo instruction?  */
525 #define MF_HILO_INSN(PINFO) \
526   ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
527
528 /* Returns true for a (non floating-point) coprocessor instruction.  Reading
529    or writing the condition code is only possible on the coprocessors and
530    these insns are not marked with INSN_COP.  Thus for these insns use the
531    condition-code flags.  */
532 #define COP_INSN(PINFO)                                                 \
533   (PINFO != INSN_MACRO                                                  \
534    && ((PINFO) & (FP_S | FP_D)) == 0                                    \
535    && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
536
537 /* MIPS PIC level.  */
538
539 enum mips_pic_level mips_pic;
540
541 /* 1 if we should generate 32 bit offsets from the $gp register in
542    SVR4_PIC mode.  Currently has no meaning in other modes.  */
543 static int mips_big_got = 0;
544
545 /* 1 if trap instructions should used for overflow rather than break
546    instructions.  */
547 static int mips_trap = 0;
548
549 /* 1 if double width floating point constants should not be constructed
550    by assembling two single width halves into two single width floating
551    point registers which just happen to alias the double width destination
552    register.  On some architectures this aliasing can be disabled by a bit
553    in the status register, and the setting of this bit cannot be determined
554    automatically at assemble time.  */
555 static int mips_disable_float_construction;
556
557 /* Non-zero if any .set noreorder directives were used.  */
558
559 static int mips_any_noreorder;
560
561 /* Non-zero if nops should be inserted when the register referenced in
562    an mfhi/mflo instruction is read in the next two instructions.  */
563 static int mips_7000_hilo_fix;
564
565 /* The size of objects in the small data section.  */
566 static unsigned int g_switch_value = 8;
567 /* Whether the -G option was used.  */
568 static int g_switch_seen = 0;
569
570 #define N_RMASK 0xc4
571 #define N_VFP   0xd4
572
573 /* If we can determine in advance that GP optimization won't be
574    possible, we can skip the relaxation stuff that tries to produce
575    GP-relative references.  This makes delay slot optimization work
576    better.
577
578    This function can only provide a guess, but it seems to work for
579    gcc output.  It needs to guess right for gcc, otherwise gcc
580    will put what it thinks is a GP-relative instruction in a branch
581    delay slot.
582
583    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
584    fixed it for the non-PIC mode.  KR 95/04/07  */
585 static int nopic_need_relax (symbolS *, int);
586
587 /* handle of the OPCODE hash table */
588 static struct hash_control *op_hash = NULL;
589
590 /* The opcode hash table we use for the mips16.  */
591 static struct hash_control *mips16_op_hash = NULL;
592
593 /* This array holds the chars that always start a comment.  If the
594     pre-processor is disabled, these aren't very useful */
595 const char comment_chars[] = "#";
596
597 /* This array holds the chars that only start a comment at the beginning of
598    a line.  If the line seems to have the form '# 123 filename'
599    .line and .file directives will appear in the pre-processed output */
600 /* Note that input_file.c hand checks for '#' at the beginning of the
601    first line of the input file.  This is because the compiler outputs
602    #NO_APP at the beginning of its output.  */
603 /* Also note that C style comments are always supported.  */
604 const char line_comment_chars[] = "#";
605
606 /* This array holds machine specific line separator characters.  */
607 const char line_separator_chars[] = ";";
608
609 /* Chars that can be used to separate mant from exp in floating point nums */
610 const char EXP_CHARS[] = "eE";
611
612 /* Chars that mean this number is a floating point constant */
613 /* As in 0f12.456 */
614 /* or    0d1.2345e12 */
615 const char FLT_CHARS[] = "rRsSfFdDxXpP";
616
617 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
618    changed in read.c .  Ideally it shouldn't have to know about it at all,
619    but nothing is ideal around here.
620  */
621
622 static char *insn_error;
623
624 static int auto_align = 1;
625
626 /* When outputting SVR4 PIC code, the assembler needs to know the
627    offset in the stack frame from which to restore the $gp register.
628    This is set by the .cprestore pseudo-op, and saved in this
629    variable.  */
630 static offsetT mips_cprestore_offset = -1;
631
632 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
633    more optimizations, it can use a register value instead of a memory-saved
634    offset and even an other register than $gp as global pointer.  */
635 static offsetT mips_cpreturn_offset = -1;
636 static int mips_cpreturn_register = -1;
637 static int mips_gp_register = GP;
638 static int mips_gprel_offset = 0;
639
640 /* Whether mips_cprestore_offset has been set in the current function
641    (or whether it has already been warned about, if not).  */
642 static int mips_cprestore_valid = 0;
643
644 /* This is the register which holds the stack frame, as set by the
645    .frame pseudo-op.  This is needed to implement .cprestore.  */
646 static int mips_frame_reg = SP;
647
648 /* Whether mips_frame_reg has been set in the current function
649    (or whether it has already been warned about, if not).  */
650 static int mips_frame_reg_valid = 0;
651
652 /* To output NOP instructions correctly, we need to keep information
653    about the previous two instructions.  */
654
655 /* Whether we are optimizing.  The default value of 2 means to remove
656    unneeded NOPs and swap branch instructions when possible.  A value
657    of 1 means to not swap branches.  A value of 0 means to always
658    insert NOPs.  */
659 static int mips_optimize = 2;
660
661 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
662    equivalent to seeing no -g option at all.  */
663 static int mips_debug = 0;
664
665 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
666 #define MAX_VR4130_NOPS 4
667
668 /* The maximum number of NOPs needed to fill delay slots.  */
669 #define MAX_DELAY_NOPS 2
670
671 /* The maximum number of NOPs needed for any purpose.  */
672 #define MAX_NOPS 4
673
674 /* A list of previous instructions, with index 0 being the most recent.
675    We need to look back MAX_NOPS instructions when filling delay slots
676    or working around processor errata.  We need to look back one
677    instruction further if we're thinking about using history[0] to
678    fill a branch delay slot.  */
679 static struct mips_cl_insn history[1 + MAX_NOPS];
680
681 /* Nop instructions used by emit_nop.  */
682 static struct mips_cl_insn nop_insn, mips16_nop_insn;
683
684 /* The appropriate nop for the current mode.  */
685 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
686
687 /* If this is set, it points to a frag holding nop instructions which
688    were inserted before the start of a noreorder section.  If those
689    nops turn out to be unnecessary, the size of the frag can be
690    decreased.  */
691 static fragS *prev_nop_frag;
692
693 /* The number of nop instructions we created in prev_nop_frag.  */
694 static int prev_nop_frag_holds;
695
696 /* The number of nop instructions that we know we need in
697    prev_nop_frag.  */
698 static int prev_nop_frag_required;
699
700 /* The number of instructions we've seen since prev_nop_frag.  */
701 static int prev_nop_frag_since;
702
703 /* For ECOFF and ELF, relocations against symbols are done in two
704    parts, with a HI relocation and a LO relocation.  Each relocation
705    has only 16 bits of space to store an addend.  This means that in
706    order for the linker to handle carries correctly, it must be able
707    to locate both the HI and the LO relocation.  This means that the
708    relocations must appear in order in the relocation table.
709
710    In order to implement this, we keep track of each unmatched HI
711    relocation.  We then sort them so that they immediately precede the
712    corresponding LO relocation.  */
713
714 struct mips_hi_fixup
715 {
716   /* Next HI fixup.  */
717   struct mips_hi_fixup *next;
718   /* This fixup.  */
719   fixS *fixp;
720   /* The section this fixup is in.  */
721   segT seg;
722 };
723
724 /* The list of unmatched HI relocs.  */
725
726 static struct mips_hi_fixup *mips_hi_fixup_list;
727
728 /* The frag containing the last explicit relocation operator.
729    Null if explicit relocations have not been used.  */
730
731 static fragS *prev_reloc_op_frag;
732
733 /* Map normal MIPS register numbers to mips16 register numbers.  */
734
735 #define X ILLEGAL_REG
736 static const int mips32_to_16_reg_map[] =
737 {
738   X, X, 2, 3, 4, 5, 6, 7,
739   X, X, X, X, X, X, X, X,
740   0, 1, X, X, X, X, X, X,
741   X, X, X, X, X, X, X, X
742 };
743 #undef X
744
745 /* Map mips16 register numbers to normal MIPS register numbers.  */
746
747 static const unsigned int mips16_to_32_reg_map[] =
748 {
749   16, 17, 2, 3, 4, 5, 6, 7
750 };
751
752 /* Classifies the kind of instructions we're interested in when
753    implementing -mfix-vr4120.  */
754 enum fix_vr4120_class
755 {
756   FIX_VR4120_MACC,
757   FIX_VR4120_DMACC,
758   FIX_VR4120_MULT,
759   FIX_VR4120_DMULT,
760   FIX_VR4120_DIV,
761   FIX_VR4120_MTHILO,
762   NUM_FIX_VR4120_CLASSES
763 };
764
765 /* ...likewise -mfix-loongson2f-jump.  */
766 static bfd_boolean mips_fix_loongson2f_jump;
767
768 /* ...likewise -mfix-loongson2f-nop.  */
769 static bfd_boolean mips_fix_loongson2f_nop;
770
771 /* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed.  */
772 static bfd_boolean mips_fix_loongson2f;
773
774 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
775    there must be at least one other instruction between an instruction
776    of type X and an instruction of type Y.  */
777 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
778
779 /* True if -mfix-vr4120 is in force.  */
780 static int mips_fix_vr4120;
781
782 /* ...likewise -mfix-vr4130.  */
783 static int mips_fix_vr4130;
784
785 /* ...likewise -mfix-24k.  */
786 static int mips_fix_24k;
787
788 /* ...likewise -mfix-cn63xxp1 */
789 static bfd_boolean mips_fix_cn63xxp1;
790
791 /* We don't relax branches by default, since this causes us to expand
792    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
793    fail to compute the offset before expanding the macro to the most
794    efficient expansion.  */
795
796 static int mips_relax_branch;
797 \f
798 /* The expansion of many macros depends on the type of symbol that
799    they refer to.  For example, when generating position-dependent code,
800    a macro that refers to a symbol may have two different expansions,
801    one which uses GP-relative addresses and one which uses absolute
802    addresses.  When generating SVR4-style PIC, a macro may have
803    different expansions for local and global symbols.
804
805    We handle these situations by generating both sequences and putting
806    them in variant frags.  In position-dependent code, the first sequence
807    will be the GP-relative one and the second sequence will be the
808    absolute one.  In SVR4 PIC, the first sequence will be for global
809    symbols and the second will be for local symbols.
810
811    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
812    SECOND are the lengths of the two sequences in bytes.  These fields
813    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
814    the subtype has the following flags:
815
816    RELAX_USE_SECOND
817         Set if it has been decided that we should use the second
818         sequence instead of the first.
819
820    RELAX_SECOND_LONGER
821         Set in the first variant frag if the macro's second implementation
822         is longer than its first.  This refers to the macro as a whole,
823         not an individual relaxation.
824
825    RELAX_NOMACRO
826         Set in the first variant frag if the macro appeared in a .set nomacro
827         block and if one alternative requires a warning but the other does not.
828
829    RELAX_DELAY_SLOT
830         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
831         delay slot.
832
833    The frag's "opcode" points to the first fixup for relaxable code.
834
835    Relaxable macros are generated using a sequence such as:
836
837       relax_start (SYMBOL);
838       ... generate first expansion ...
839       relax_switch ();
840       ... generate second expansion ...
841       relax_end ();
842
843    The code and fixups for the unwanted alternative are discarded
844    by md_convert_frag.  */
845 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
846
847 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
848 #define RELAX_SECOND(X) ((X) & 0xff)
849 #define RELAX_USE_SECOND 0x10000
850 #define RELAX_SECOND_LONGER 0x20000
851 #define RELAX_NOMACRO 0x40000
852 #define RELAX_DELAY_SLOT 0x80000
853
854 /* Branch without likely bit.  If label is out of range, we turn:
855
856         beq reg1, reg2, label
857         delay slot
858
859    into
860
861         bne reg1, reg2, 0f
862         nop
863         j label
864      0: delay slot
865
866    with the following opcode replacements:
867
868         beq <-> bne
869         blez <-> bgtz
870         bltz <-> bgez
871         bc1f <-> bc1t
872
873         bltzal <-> bgezal  (with jal label instead of j label)
874
875    Even though keeping the delay slot instruction in the delay slot of
876    the branch would be more efficient, it would be very tricky to do
877    correctly, because we'd have to introduce a variable frag *after*
878    the delay slot instruction, and expand that instead.  Let's do it
879    the easy way for now, even if the branch-not-taken case now costs
880    one additional instruction.  Out-of-range branches are not supposed
881    to be common, anyway.
882
883    Branch likely.  If label is out of range, we turn:
884
885         beql reg1, reg2, label
886         delay slot (annulled if branch not taken)
887
888    into
889
890         beql reg1, reg2, 1f
891         nop
892         beql $0, $0, 2f
893         nop
894      1: j[al] label
895         delay slot (executed only if branch taken)
896      2:
897
898    It would be possible to generate a shorter sequence by losing the
899    likely bit, generating something like:
900
901         bne reg1, reg2, 0f
902         nop
903         j[al] label
904         delay slot (executed only if branch taken)
905      0:
906
907         beql -> bne
908         bnel -> beq
909         blezl -> bgtz
910         bgtzl -> blez
911         bltzl -> bgez
912         bgezl -> bltz
913         bc1fl -> bc1t
914         bc1tl -> bc1f
915
916         bltzall -> bgezal  (with jal label instead of j label)
917         bgezall -> bltzal  (ditto)
918
919
920    but it's not clear that it would actually improve performance.  */
921 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
922   ((relax_substateT) \
923    (0xc0000000 \
924     | ((toofar) ? 1 : 0) \
925     | ((link) ? 2 : 0) \
926     | ((likely) ? 4 : 0) \
927     | ((uncond) ? 8 : 0)))
928 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
929 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
930 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
931 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
932 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
933
934 /* For mips16 code, we use an entirely different form of relaxation.
935    mips16 supports two versions of most instructions which take
936    immediate values: a small one which takes some small value, and a
937    larger one which takes a 16 bit value.  Since branches also follow
938    this pattern, relaxing these values is required.
939
940    We can assemble both mips16 and normal MIPS code in a single
941    object.  Therefore, we need to support this type of relaxation at
942    the same time that we support the relaxation described above.  We
943    use the high bit of the subtype field to distinguish these cases.
944
945    The information we store for this type of relaxation is the
946    argument code found in the opcode file for this relocation, whether
947    the user explicitly requested a small or extended form, and whether
948    the relocation is in a jump or jal delay slot.  That tells us the
949    size of the value, and how it should be stored.  We also store
950    whether the fragment is considered to be extended or not.  We also
951    store whether this is known to be a branch to a different section,
952    whether we have tried to relax this frag yet, and whether we have
953    ever extended a PC relative fragment because of a shift count.  */
954 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
955   (0x80000000                                                   \
956    | ((type) & 0xff)                                            \
957    | ((small) ? 0x100 : 0)                                      \
958    | ((ext) ? 0x200 : 0)                                        \
959    | ((dslot) ? 0x400 : 0)                                      \
960    | ((jal_dslot) ? 0x800 : 0))
961 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
962 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
963 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
964 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
965 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
966 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
967 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
968 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
969 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
970 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
971 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
972 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
973
974 /* Is the given value a sign-extended 32-bit value?  */
975 #define IS_SEXT_32BIT_NUM(x)                                            \
976   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
977    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
978
979 /* Is the given value a sign-extended 16-bit value?  */
980 #define IS_SEXT_16BIT_NUM(x)                                            \
981   (((x) &~ (offsetT) 0x7fff) == 0                                       \
982    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
983
984 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
985 #define IS_ZEXT_32BIT_NUM(x)                                            \
986   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
987    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
988
989 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
990    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
991 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
992   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
993               | (((VALUE) & (MASK)) << (SHIFT)))
994
995 /* Extract bits MASK << SHIFT from STRUCT and shift them right
996    SHIFT places.  */
997 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
998   (((STRUCT) >> (SHIFT)) & (MASK))
999
1000 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1001    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1002
1003    include/opcode/mips.h specifies operand fields using the macros
1004    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
1005    with "MIPS16OP" instead of "OP".  */
1006 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
1007   INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
1008 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1009   INSERT_BITS ((INSN).insn_opcode, VALUE, \
1010                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1011
1012 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
1013 #define EXTRACT_OPERAND(FIELD, INSN) \
1014   EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
1015 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1016   EXTRACT_BITS ((INSN).insn_opcode, \
1017                 MIPS16OP_MASK_##FIELD, \
1018                 MIPS16OP_SH_##FIELD)
1019 \f
1020 /* Global variables used when generating relaxable macros.  See the
1021    comment above RELAX_ENCODE for more details about how relaxation
1022    is used.  */
1023 static struct {
1024   /* 0 if we're not emitting a relaxable macro.
1025      1 if we're emitting the first of the two relaxation alternatives.
1026      2 if we're emitting the second alternative.  */
1027   int sequence;
1028
1029   /* The first relaxable fixup in the current frag.  (In other words,
1030      the first fixup that refers to relaxable code.)  */
1031   fixS *first_fixup;
1032
1033   /* sizes[0] says how many bytes of the first alternative are stored in
1034      the current frag.  Likewise sizes[1] for the second alternative.  */
1035   unsigned int sizes[2];
1036
1037   /* The symbol on which the choice of sequence depends.  */
1038   symbolS *symbol;
1039 } mips_relax;
1040 \f
1041 /* Global variables used to decide whether a macro needs a warning.  */
1042 static struct {
1043   /* True if the macro is in a branch delay slot.  */
1044   bfd_boolean delay_slot_p;
1045
1046   /* For relaxable macros, sizes[0] is the length of the first alternative
1047      in bytes and sizes[1] is the length of the second alternative.
1048      For non-relaxable macros, both elements give the length of the
1049      macro in bytes.  */
1050   unsigned int sizes[2];
1051
1052   /* The first variant frag for this macro.  */
1053   fragS *first_frag;
1054 } mips_macro_warning;
1055 \f
1056 /* Prototypes for static functions.  */
1057
1058 #define internalError()                                                 \
1059     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1060
1061 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1062
1063 static void append_insn
1064   (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *);
1065 static void mips_no_prev_insn (void);
1066 static void macro_build (expressionS *, const char *, const char *, ...);
1067 static void mips16_macro_build
1068   (expressionS *, const char *, const char *, va_list *);
1069 static void load_register (int, expressionS *, int);
1070 static void macro_start (void);
1071 static void macro_end (void);
1072 static void macro (struct mips_cl_insn * ip);
1073 static void mips16_macro (struct mips_cl_insn * ip);
1074 static void mips_ip (char *str, struct mips_cl_insn * ip);
1075 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1076 static void mips16_immed
1077   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1078    unsigned long *, bfd_boolean *, unsigned short *);
1079 static size_t my_getSmallExpression
1080   (expressionS *, bfd_reloc_code_real_type *, char *);
1081 static void my_getExpression (expressionS *, char *);
1082 static void s_align (int);
1083 static void s_change_sec (int);
1084 static void s_change_section (int);
1085 static void s_cons (int);
1086 static void s_float_cons (int);
1087 static void s_mips_globl (int);
1088 static void s_option (int);
1089 static void s_mipsset (int);
1090 static void s_abicalls (int);
1091 static void s_cpload (int);
1092 static void s_cpsetup (int);
1093 static void s_cplocal (int);
1094 static void s_cprestore (int);
1095 static void s_cpreturn (int);
1096 static void s_dtprelword (int);
1097 static void s_dtpreldword (int);
1098 static void s_gpvalue (int);
1099 static void s_gpword (int);
1100 static void s_gpdword (int);
1101 static void s_cpadd (int);
1102 static void s_insn (int);
1103 static void md_obj_begin (void);
1104 static void md_obj_end (void);
1105 static void s_mips_ent (int);
1106 static void s_mips_end (int);
1107 static void s_mips_frame (int);
1108 static void s_mips_mask (int reg_type);
1109 static void s_mips_stab (int);
1110 static void s_mips_weakext (int);
1111 static void s_mips_file (int);
1112 static void s_mips_loc (int);
1113 static bfd_boolean pic_need_relax (symbolS *, asection *);
1114 static int relaxed_branch_length (fragS *, asection *, int);
1115 static int validate_mips_insn (const struct mips_opcode *);
1116
1117 /* Table and functions used to map between CPU/ISA names, and
1118    ISA levels, and CPU numbers.  */
1119
1120 struct mips_cpu_info
1121 {
1122   const char *name;           /* CPU or ISA name.  */
1123   int flags;                  /* ASEs available, or ISA flag.  */
1124   int isa;                    /* ISA level.  */
1125   int cpu;                    /* CPU number (default CPU if ISA).  */
1126 };
1127
1128 #define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1129 #define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1130 #define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1131 #define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1132 #define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1133 #define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1134 #define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1135
1136 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1137 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1138 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1139 \f
1140 /* Pseudo-op table.
1141
1142    The following pseudo-ops from the Kane and Heinrich MIPS book
1143    should be defined here, but are currently unsupported: .alias,
1144    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1145
1146    The following pseudo-ops from the Kane and Heinrich MIPS book are
1147    specific to the type of debugging information being generated, and
1148    should be defined by the object format: .aent, .begin, .bend,
1149    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1150    .vreg.
1151
1152    The following pseudo-ops from the Kane and Heinrich MIPS book are
1153    not MIPS CPU specific, but are also not specific to the object file
1154    format.  This file is probably the best place to define them, but
1155    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1156
1157 static const pseudo_typeS mips_pseudo_table[] =
1158 {
1159   /* MIPS specific pseudo-ops.  */
1160   {"option", s_option, 0},
1161   {"set", s_mipsset, 0},
1162   {"rdata", s_change_sec, 'r'},
1163   {"sdata", s_change_sec, 's'},
1164   {"livereg", s_ignore, 0},
1165   {"abicalls", s_abicalls, 0},
1166   {"cpload", s_cpload, 0},
1167   {"cpsetup", s_cpsetup, 0},
1168   {"cplocal", s_cplocal, 0},
1169   {"cprestore", s_cprestore, 0},
1170   {"cpreturn", s_cpreturn, 0},
1171   {"dtprelword", s_dtprelword, 0},
1172   {"dtpreldword", s_dtpreldword, 0},
1173   {"gpvalue", s_gpvalue, 0},
1174   {"gpword", s_gpword, 0},
1175   {"gpdword", s_gpdword, 0},
1176   {"cpadd", s_cpadd, 0},
1177   {"insn", s_insn, 0},
1178
1179   /* Relatively generic pseudo-ops that happen to be used on MIPS
1180      chips.  */
1181   {"asciiz", stringer, 8 + 1},
1182   {"bss", s_change_sec, 'b'},
1183   {"err", s_err, 0},
1184   {"half", s_cons, 1},
1185   {"dword", s_cons, 3},
1186   {"weakext", s_mips_weakext, 0},
1187   {"origin", s_org, 0},
1188   {"repeat", s_rept, 0},
1189
1190   /* For MIPS this is non-standard, but we define it for consistency.  */
1191   {"sbss", s_change_sec, 'B'},
1192
1193   /* These pseudo-ops are defined in read.c, but must be overridden
1194      here for one reason or another.  */
1195   {"align", s_align, 0},
1196   {"byte", s_cons, 0},
1197   {"data", s_change_sec, 'd'},
1198   {"double", s_float_cons, 'd'},
1199   {"float", s_float_cons, 'f'},
1200   {"globl", s_mips_globl, 0},
1201   {"global", s_mips_globl, 0},
1202   {"hword", s_cons, 1},
1203   {"int", s_cons, 2},
1204   {"long", s_cons, 2},
1205   {"octa", s_cons, 4},
1206   {"quad", s_cons, 3},
1207   {"section", s_change_section, 0},
1208   {"short", s_cons, 1},
1209   {"single", s_float_cons, 'f'},
1210   {"stabn", s_mips_stab, 'n'},
1211   {"text", s_change_sec, 't'},
1212   {"word", s_cons, 2},
1213
1214   { "extern", ecoff_directive_extern, 0},
1215
1216   { NULL, NULL, 0 },
1217 };
1218
1219 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1220 {
1221   /* These pseudo-ops should be defined by the object file format.
1222      However, a.out doesn't support them, so we have versions here.  */
1223   {"aent", s_mips_ent, 1},
1224   {"bgnb", s_ignore, 0},
1225   {"end", s_mips_end, 0},
1226   {"endb", s_ignore, 0},
1227   {"ent", s_mips_ent, 0},
1228   {"file", s_mips_file, 0},
1229   {"fmask", s_mips_mask, 'F'},
1230   {"frame", s_mips_frame, 0},
1231   {"loc", s_mips_loc, 0},
1232   {"mask", s_mips_mask, 'R'},
1233   {"verstamp", s_ignore, 0},
1234   { NULL, NULL, 0 },
1235 };
1236
1237 /* Export the ABI address size for use by TC_ADDRESS_BYTES for the
1238    purpose of the `.dc.a' internal pseudo-op.  */
1239
1240 int
1241 mips_address_bytes (void)
1242 {
1243   return HAVE_64BIT_ADDRESSES ? 8 : 4;
1244 }
1245
1246 extern void pop_insert (const pseudo_typeS *);
1247
1248 void
1249 mips_pop_insert (void)
1250 {
1251   pop_insert (mips_pseudo_table);
1252   if (! ECOFF_DEBUGGING)
1253     pop_insert (mips_nonecoff_pseudo_table);
1254 }
1255 \f
1256 /* Symbols labelling the current insn.  */
1257
1258 struct insn_label_list
1259 {
1260   struct insn_label_list *next;
1261   symbolS *label;
1262 };
1263
1264 static struct insn_label_list *free_insn_labels;
1265 #define label_list tc_segment_info_data.labels
1266
1267 static void mips_clear_insn_labels (void);
1268
1269 static inline void
1270 mips_clear_insn_labels (void)
1271 {
1272   register struct insn_label_list **pl;
1273   segment_info_type *si;
1274
1275   if (now_seg)
1276     {
1277       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1278         ;
1279       
1280       si = seg_info (now_seg);
1281       *pl = si->label_list;
1282       si->label_list = NULL;
1283     }
1284 }
1285
1286 \f
1287 static char *expr_end;
1288
1289 /* Expressions which appear in instructions.  These are set by
1290    mips_ip.  */
1291
1292 static expressionS imm_expr;
1293 static expressionS imm2_expr;
1294 static expressionS offset_expr;
1295
1296 /* Relocs associated with imm_expr and offset_expr.  */
1297
1298 static bfd_reloc_code_real_type imm_reloc[3]
1299   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1300 static bfd_reloc_code_real_type offset_reloc[3]
1301   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1302
1303 /* These are set by mips16_ip if an explicit extension is used.  */
1304
1305 static bfd_boolean mips16_small, mips16_ext;
1306
1307 #ifdef OBJ_ELF
1308 /* The pdr segment for per procedure frame/regmask info.  Not used for
1309    ECOFF debugging.  */
1310
1311 static segT pdr_seg;
1312 #endif
1313
1314 /* The default target format to use.  */
1315
1316 const char *
1317 mips_target_format (void)
1318 {
1319   switch (OUTPUT_FLAVOR)
1320     {
1321     case bfd_target_ecoff_flavour:
1322       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1323     case bfd_target_coff_flavour:
1324       return "pe-mips";
1325     case bfd_target_elf_flavour:
1326 #ifdef TE_VXWORKS
1327       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1328         return (target_big_endian
1329                 ? "elf32-bigmips-vxworks"
1330                 : "elf32-littlemips-vxworks");
1331 #endif
1332 #ifdef TE_TMIPS
1333       /* This is traditional mips.  */
1334       return (target_big_endian
1335               ? (HAVE_64BIT_OBJECTS
1336                  ? "elf64-tradbigmips"
1337                  : (HAVE_NEWABI
1338                     ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1339               : (HAVE_64BIT_OBJECTS
1340                  ? "elf64-tradlittlemips"
1341                  : (HAVE_NEWABI
1342                     ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1343 #else
1344       return (target_big_endian
1345               ? (HAVE_64BIT_OBJECTS
1346                  ? "elf64-bigmips"
1347                  : (HAVE_NEWABI
1348                     ? "elf32-nbigmips" : "elf32-bigmips"))
1349               : (HAVE_64BIT_OBJECTS
1350                  ? "elf64-littlemips"
1351                  : (HAVE_NEWABI
1352                     ? "elf32-nlittlemips" : "elf32-littlemips")));
1353 #endif
1354     default:
1355       abort ();
1356       return NULL;
1357     }
1358 }
1359
1360 /* Return the length of instruction INSN.  */
1361
1362 static inline unsigned int
1363 insn_length (const struct mips_cl_insn *insn)
1364 {
1365   if (!mips_opts.mips16)
1366     return 4;
1367   return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1368 }
1369
1370 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1371
1372 static void
1373 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1374 {
1375   size_t i;
1376
1377   insn->insn_mo = mo;
1378   insn->use_extend = FALSE;
1379   insn->extend = 0;
1380   insn->insn_opcode = mo->match;
1381   insn->frag = NULL;
1382   insn->where = 0;
1383   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1384     insn->fixp[i] = NULL;
1385   insn->fixed_p = (mips_opts.noreorder > 0);
1386   insn->noreorder_p = (mips_opts.noreorder > 0);
1387   insn->mips16_absolute_jump_p = 0;
1388 }
1389
1390 /* Record the current MIPS16 mode in now_seg.  */
1391
1392 static void
1393 mips_record_mips16_mode (void)
1394 {
1395   segment_info_type *si;
1396
1397   si = seg_info (now_seg);
1398   if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1399     si->tc_segment_info_data.mips16 = mips_opts.mips16;
1400 }
1401
1402 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1403
1404 static void
1405 install_insn (const struct mips_cl_insn *insn)
1406 {
1407   char *f = insn->frag->fr_literal + insn->where;
1408   if (!mips_opts.mips16)
1409     md_number_to_chars (f, insn->insn_opcode, 4);
1410   else if (insn->mips16_absolute_jump_p)
1411     {
1412       md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1413       md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1414     }
1415   else
1416     {
1417       if (insn->use_extend)
1418         {
1419           md_number_to_chars (f, 0xf000 | insn->extend, 2);
1420           f += 2;
1421         }
1422       md_number_to_chars (f, insn->insn_opcode, 2);
1423     }
1424   mips_record_mips16_mode ();
1425 }
1426
1427 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1428    and install the opcode in the new location.  */
1429
1430 static void
1431 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1432 {
1433   size_t i;
1434
1435   insn->frag = frag;
1436   insn->where = where;
1437   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1438     if (insn->fixp[i] != NULL)
1439       {
1440         insn->fixp[i]->fx_frag = frag;
1441         insn->fixp[i]->fx_where = where;
1442       }
1443   install_insn (insn);
1444 }
1445
1446 /* Add INSN to the end of the output.  */
1447
1448 static void
1449 add_fixed_insn (struct mips_cl_insn *insn)
1450 {
1451   char *f = frag_more (insn_length (insn));
1452   move_insn (insn, frag_now, f - frag_now->fr_literal);
1453 }
1454
1455 /* Start a variant frag and move INSN to the start of the variant part,
1456    marking it as fixed.  The other arguments are as for frag_var.  */
1457
1458 static void
1459 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1460                   relax_substateT subtype, symbolS *symbol, offsetT offset)
1461 {
1462   frag_grow (max_chars);
1463   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1464   insn->fixed_p = 1;
1465   frag_var (rs_machine_dependent, max_chars, var,
1466             subtype, symbol, offset, NULL);
1467 }
1468
1469 /* Insert N copies of INSN into the history buffer, starting at
1470    position FIRST.  Neither FIRST nor N need to be clipped.  */
1471
1472 static void
1473 insert_into_history (unsigned int first, unsigned int n,
1474                      const struct mips_cl_insn *insn)
1475 {
1476   if (mips_relax.sequence != 2)
1477     {
1478       unsigned int i;
1479
1480       for (i = ARRAY_SIZE (history); i-- > first;)
1481         if (i >= first + n)
1482           history[i] = history[i - n];
1483         else
1484           history[i] = *insn;
1485     }
1486 }
1487
1488 /* Emit a nop instruction, recording it in the history buffer.  */
1489
1490 static void
1491 emit_nop (void)
1492 {
1493   add_fixed_insn (NOP_INSN);
1494   insert_into_history (0, 1, NOP_INSN);
1495 }
1496
1497 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1498    the idea is to make it obvious at a glance that each errata is
1499    included.  */
1500
1501 static void
1502 init_vr4120_conflicts (void)
1503 {
1504 #define CONFLICT(FIRST, SECOND) \
1505     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1506
1507   /* Errata 21 - [D]DIV[U] after [D]MACC */
1508   CONFLICT (MACC, DIV);
1509   CONFLICT (DMACC, DIV);
1510
1511   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1512   CONFLICT (DMULT, DMULT);
1513   CONFLICT (DMULT, DMACC);
1514   CONFLICT (DMACC, DMULT);
1515   CONFLICT (DMACC, DMACC);
1516
1517   /* Errata 24 - MT{LO,HI} after [D]MACC */
1518   CONFLICT (MACC, MTHILO);
1519   CONFLICT (DMACC, MTHILO);
1520
1521   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1522      instruction is executed immediately after a MACC or DMACC
1523      instruction, the result of [either instruction] is incorrect."  */
1524   CONFLICT (MACC, MULT);
1525   CONFLICT (MACC, DMULT);
1526   CONFLICT (DMACC, MULT);
1527   CONFLICT (DMACC, DMULT);
1528
1529   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1530      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1531      DDIV or DDIVU instruction, the result of the MACC or
1532      DMACC instruction is incorrect.".  */
1533   CONFLICT (DMULT, MACC);
1534   CONFLICT (DMULT, DMACC);
1535   CONFLICT (DIV, MACC);
1536   CONFLICT (DIV, DMACC);
1537
1538 #undef CONFLICT
1539 }
1540
1541 struct regname {
1542   const char *name;
1543   unsigned int num;
1544 };
1545
1546 #define RTYPE_MASK      0x1ff00
1547 #define RTYPE_NUM       0x00100
1548 #define RTYPE_FPU       0x00200
1549 #define RTYPE_FCC       0x00400
1550 #define RTYPE_VEC       0x00800
1551 #define RTYPE_GP        0x01000
1552 #define RTYPE_CP0       0x02000
1553 #define RTYPE_PC        0x04000
1554 #define RTYPE_ACC       0x08000
1555 #define RTYPE_CCC       0x10000
1556 #define RNUM_MASK       0x000ff
1557 #define RWARN           0x80000
1558
1559 #define GENERIC_REGISTER_NUMBERS \
1560     {"$0",      RTYPE_NUM | 0},  \
1561     {"$1",      RTYPE_NUM | 1},  \
1562     {"$2",      RTYPE_NUM | 2},  \
1563     {"$3",      RTYPE_NUM | 3},  \
1564     {"$4",      RTYPE_NUM | 4},  \
1565     {"$5",      RTYPE_NUM | 5},  \
1566     {"$6",      RTYPE_NUM | 6},  \
1567     {"$7",      RTYPE_NUM | 7},  \
1568     {"$8",      RTYPE_NUM | 8},  \
1569     {"$9",      RTYPE_NUM | 9},  \
1570     {"$10",     RTYPE_NUM | 10}, \
1571     {"$11",     RTYPE_NUM | 11}, \
1572     {"$12",     RTYPE_NUM | 12}, \
1573     {"$13",     RTYPE_NUM | 13}, \
1574     {"$14",     RTYPE_NUM | 14}, \
1575     {"$15",     RTYPE_NUM | 15}, \
1576     {"$16",     RTYPE_NUM | 16}, \
1577     {"$17",     RTYPE_NUM | 17}, \
1578     {"$18",     RTYPE_NUM | 18}, \
1579     {"$19",     RTYPE_NUM | 19}, \
1580     {"$20",     RTYPE_NUM | 20}, \
1581     {"$21",     RTYPE_NUM | 21}, \
1582     {"$22",     RTYPE_NUM | 22}, \
1583     {"$23",     RTYPE_NUM | 23}, \
1584     {"$24",     RTYPE_NUM | 24}, \
1585     {"$25",     RTYPE_NUM | 25}, \
1586     {"$26",     RTYPE_NUM | 26}, \
1587     {"$27",     RTYPE_NUM | 27}, \
1588     {"$28",     RTYPE_NUM | 28}, \
1589     {"$29",     RTYPE_NUM | 29}, \
1590     {"$30",     RTYPE_NUM | 30}, \
1591     {"$31",     RTYPE_NUM | 31} 
1592
1593 #define FPU_REGISTER_NAMES       \
1594     {"$f0",     RTYPE_FPU | 0},  \
1595     {"$f1",     RTYPE_FPU | 1},  \
1596     {"$f2",     RTYPE_FPU | 2},  \
1597     {"$f3",     RTYPE_FPU | 3},  \
1598     {"$f4",     RTYPE_FPU | 4},  \
1599     {"$f5",     RTYPE_FPU | 5},  \
1600     {"$f6",     RTYPE_FPU | 6},  \
1601     {"$f7",     RTYPE_FPU | 7},  \
1602     {"$f8",     RTYPE_FPU | 8},  \
1603     {"$f9",     RTYPE_FPU | 9},  \
1604     {"$f10",    RTYPE_FPU | 10}, \
1605     {"$f11",    RTYPE_FPU | 11}, \
1606     {"$f12",    RTYPE_FPU | 12}, \
1607     {"$f13",    RTYPE_FPU | 13}, \
1608     {"$f14",    RTYPE_FPU | 14}, \
1609     {"$f15",    RTYPE_FPU | 15}, \
1610     {"$f16",    RTYPE_FPU | 16}, \
1611     {"$f17",    RTYPE_FPU | 17}, \
1612     {"$f18",    RTYPE_FPU | 18}, \
1613     {"$f19",    RTYPE_FPU | 19}, \
1614     {"$f20",    RTYPE_FPU | 20}, \
1615     {"$f21",    RTYPE_FPU | 21}, \
1616     {"$f22",    RTYPE_FPU | 22}, \
1617     {"$f23",    RTYPE_FPU | 23}, \
1618     {"$f24",    RTYPE_FPU | 24}, \
1619     {"$f25",    RTYPE_FPU | 25}, \
1620     {"$f26",    RTYPE_FPU | 26}, \
1621     {"$f27",    RTYPE_FPU | 27}, \
1622     {"$f28",    RTYPE_FPU | 28}, \
1623     {"$f29",    RTYPE_FPU | 29}, \
1624     {"$f30",    RTYPE_FPU | 30}, \
1625     {"$f31",    RTYPE_FPU | 31}
1626
1627 #define FPU_CONDITION_CODE_NAMES \
1628     {"$fcc0",   RTYPE_FCC | 0},  \
1629     {"$fcc1",   RTYPE_FCC | 1},  \
1630     {"$fcc2",   RTYPE_FCC | 2},  \
1631     {"$fcc3",   RTYPE_FCC | 3},  \
1632     {"$fcc4",   RTYPE_FCC | 4},  \
1633     {"$fcc5",   RTYPE_FCC | 5},  \
1634     {"$fcc6",   RTYPE_FCC | 6},  \
1635     {"$fcc7",   RTYPE_FCC | 7}
1636
1637 #define COPROC_CONDITION_CODE_NAMES         \
1638     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1639     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1640     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1641     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1642     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1643     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1644     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1645     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1646
1647 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1648     {"$a4",     RTYPE_GP | 8},  \
1649     {"$a5",     RTYPE_GP | 9},  \
1650     {"$a6",     RTYPE_GP | 10}, \
1651     {"$a7",     RTYPE_GP | 11}, \
1652     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1653     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1654     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1655     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1656     {"$t0",     RTYPE_GP | 12}, \
1657     {"$t1",     RTYPE_GP | 13}, \
1658     {"$t2",     RTYPE_GP | 14}, \
1659     {"$t3",     RTYPE_GP | 15}
1660
1661 #define O32_SYMBOLIC_REGISTER_NAMES \
1662     {"$t0",     RTYPE_GP | 8},  \
1663     {"$t1",     RTYPE_GP | 9},  \
1664     {"$t2",     RTYPE_GP | 10}, \
1665     {"$t3",     RTYPE_GP | 11}, \
1666     {"$t4",     RTYPE_GP | 12}, \
1667     {"$t5",     RTYPE_GP | 13}, \
1668     {"$t6",     RTYPE_GP | 14}, \
1669     {"$t7",     RTYPE_GP | 15}, \
1670     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
1671     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
1672     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
1673     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */ 
1674
1675 /* Remaining symbolic register names */
1676 #define SYMBOLIC_REGISTER_NAMES \
1677     {"$zero",   RTYPE_GP | 0},  \
1678     {"$at",     RTYPE_GP | 1},  \
1679     {"$AT",     RTYPE_GP | 1},  \
1680     {"$v0",     RTYPE_GP | 2},  \
1681     {"$v1",     RTYPE_GP | 3},  \
1682     {"$a0",     RTYPE_GP | 4},  \
1683     {"$a1",     RTYPE_GP | 5},  \
1684     {"$a2",     RTYPE_GP | 6},  \
1685     {"$a3",     RTYPE_GP | 7},  \
1686     {"$s0",     RTYPE_GP | 16}, \
1687     {"$s1",     RTYPE_GP | 17}, \
1688     {"$s2",     RTYPE_GP | 18}, \
1689     {"$s3",     RTYPE_GP | 19}, \
1690     {"$s4",     RTYPE_GP | 20}, \
1691     {"$s5",     RTYPE_GP | 21}, \
1692     {"$s6",     RTYPE_GP | 22}, \
1693     {"$s7",     RTYPE_GP | 23}, \
1694     {"$t8",     RTYPE_GP | 24}, \
1695     {"$t9",     RTYPE_GP | 25}, \
1696     {"$k0",     RTYPE_GP | 26}, \
1697     {"$kt0",    RTYPE_GP | 26}, \
1698     {"$k1",     RTYPE_GP | 27}, \
1699     {"$kt1",    RTYPE_GP | 27}, \
1700     {"$gp",     RTYPE_GP | 28}, \
1701     {"$sp",     RTYPE_GP | 29}, \
1702     {"$s8",     RTYPE_GP | 30}, \
1703     {"$fp",     RTYPE_GP | 30}, \
1704     {"$ra",     RTYPE_GP | 31}
1705
1706 #define MIPS16_SPECIAL_REGISTER_NAMES \
1707     {"$pc",     RTYPE_PC | 0}
1708
1709 #define MDMX_VECTOR_REGISTER_NAMES \
1710     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
1711     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
1712     {"$v2",     RTYPE_VEC | 2},  \
1713     {"$v3",     RTYPE_VEC | 3},  \
1714     {"$v4",     RTYPE_VEC | 4},  \
1715     {"$v5",     RTYPE_VEC | 5},  \
1716     {"$v6",     RTYPE_VEC | 6},  \
1717     {"$v7",     RTYPE_VEC | 7},  \
1718     {"$v8",     RTYPE_VEC | 8},  \
1719     {"$v9",     RTYPE_VEC | 9},  \
1720     {"$v10",    RTYPE_VEC | 10}, \
1721     {"$v11",    RTYPE_VEC | 11}, \
1722     {"$v12",    RTYPE_VEC | 12}, \
1723     {"$v13",    RTYPE_VEC | 13}, \
1724     {"$v14",    RTYPE_VEC | 14}, \
1725     {"$v15",    RTYPE_VEC | 15}, \
1726     {"$v16",    RTYPE_VEC | 16}, \
1727     {"$v17",    RTYPE_VEC | 17}, \
1728     {"$v18",    RTYPE_VEC | 18}, \
1729     {"$v19",    RTYPE_VEC | 19}, \
1730     {"$v20",    RTYPE_VEC | 20}, \
1731     {"$v21",    RTYPE_VEC | 21}, \
1732     {"$v22",    RTYPE_VEC | 22}, \
1733     {"$v23",    RTYPE_VEC | 23}, \
1734     {"$v24",    RTYPE_VEC | 24}, \
1735     {"$v25",    RTYPE_VEC | 25}, \
1736     {"$v26",    RTYPE_VEC | 26}, \
1737     {"$v27",    RTYPE_VEC | 27}, \
1738     {"$v28",    RTYPE_VEC | 28}, \
1739     {"$v29",    RTYPE_VEC | 29}, \
1740     {"$v30",    RTYPE_VEC | 30}, \
1741     {"$v31",    RTYPE_VEC | 31}
1742
1743 #define MIPS_DSP_ACCUMULATOR_NAMES \
1744     {"$ac0",    RTYPE_ACC | 0}, \
1745     {"$ac1",    RTYPE_ACC | 1}, \
1746     {"$ac2",    RTYPE_ACC | 2}, \
1747     {"$ac3",    RTYPE_ACC | 3}
1748
1749 static const struct regname reg_names[] = {
1750   GENERIC_REGISTER_NUMBERS,
1751   FPU_REGISTER_NAMES,
1752   FPU_CONDITION_CODE_NAMES,
1753   COPROC_CONDITION_CODE_NAMES,
1754
1755   /* The $txx registers depends on the abi,
1756      these will be added later into the symbol table from
1757      one of the tables below once mips_abi is set after 
1758      parsing of arguments from the command line. */
1759   SYMBOLIC_REGISTER_NAMES,
1760
1761   MIPS16_SPECIAL_REGISTER_NAMES,
1762   MDMX_VECTOR_REGISTER_NAMES,
1763   MIPS_DSP_ACCUMULATOR_NAMES,
1764   {0, 0}
1765 };
1766
1767 static const struct regname reg_names_o32[] = {
1768   O32_SYMBOLIC_REGISTER_NAMES,
1769   {0, 0}
1770 };
1771
1772 static const struct regname reg_names_n32n64[] = {
1773   N32N64_SYMBOLIC_REGISTER_NAMES,
1774   {0, 0}
1775 };
1776
1777 static int
1778 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1779 {
1780   symbolS *symbolP;
1781   char *e;
1782   char save_c;
1783   int reg = -1;
1784
1785   /* Find end of name.  */
1786   e = *s;
1787   if (is_name_beginner (*e))
1788     ++e;
1789   while (is_part_of_name (*e))
1790     ++e;
1791
1792   /* Terminate name.  */
1793   save_c = *e;
1794   *e = '\0';
1795
1796   /* Look for a register symbol.  */
1797   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1798     {
1799       int r = S_GET_VALUE (symbolP);
1800       if (r & types)
1801         reg = r & RNUM_MASK;
1802       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1803         /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
1804         reg = (r & RNUM_MASK) - 2;
1805     }
1806   /* Else see if this is a register defined in an itbl entry.  */
1807   else if ((types & RTYPE_GP) && itbl_have_entries)
1808     {
1809       char *n = *s;
1810       unsigned long r;
1811
1812       if (*n == '$')
1813         ++n;
1814       if (itbl_get_reg_val (n, &r))
1815         reg = r & RNUM_MASK;
1816     }
1817
1818   /* Advance to next token if a register was recognised.  */
1819   if (reg >= 0)
1820     *s = e;
1821   else if (types & RWARN)
1822     as_warn (_("Unrecognized register name `%s'"), *s);
1823
1824   *e = save_c;
1825   if (regnop)
1826     *regnop = reg;
1827   return reg >= 0;
1828 }
1829
1830 /* Return TRUE if opcode MO is valid on the currently selected ISA and
1831    architecture.  Use is_opcode_valid_16 for MIPS16 opcodes.  */
1832
1833 static bfd_boolean
1834 is_opcode_valid (const struct mips_opcode *mo)
1835 {
1836   int isa = mips_opts.isa;
1837   int fp_s, fp_d;
1838
1839   if (mips_opts.ase_mdmx)
1840     isa |= INSN_MDMX;
1841   if (mips_opts.ase_dsp)
1842     isa |= INSN_DSP;
1843   if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
1844     isa |= INSN_DSP64;
1845   if (mips_opts.ase_dspr2)
1846     isa |= INSN_DSPR2;
1847   if (mips_opts.ase_mt)
1848     isa |= INSN_MT;
1849   if (mips_opts.ase_mips3d)
1850     isa |= INSN_MIPS3D;
1851   if (mips_opts.ase_smartmips)
1852     isa |= INSN_SMARTMIPS;
1853
1854   /* Don't accept instructions based on the ISA if the CPU does not implement
1855      all the coprocessor insns. */
1856   if (NO_ISA_COP (mips_opts.arch)
1857       && COP_INSN (mo->pinfo))
1858     isa = 0;
1859
1860   if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
1861     return FALSE;
1862
1863   /* Check whether the instruction or macro requires single-precision or
1864      double-precision floating-point support.  Note that this information is
1865      stored differently in the opcode table for insns and macros.  */
1866   if (mo->pinfo == INSN_MACRO)
1867     {
1868       fp_s = mo->pinfo2 & INSN2_M_FP_S;
1869       fp_d = mo->pinfo2 & INSN2_M_FP_D;
1870     }
1871   else
1872     {
1873       fp_s = mo->pinfo & FP_S;
1874       fp_d = mo->pinfo & FP_D;
1875     }
1876
1877   if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
1878     return FALSE;
1879
1880   if (fp_s && mips_opts.soft_float)
1881     return FALSE;
1882
1883   return TRUE;
1884 }
1885
1886 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
1887    selected ISA and architecture.  */
1888
1889 static bfd_boolean
1890 is_opcode_valid_16 (const struct mips_opcode *mo)
1891 {
1892   return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
1893 }
1894
1895 /* This function is called once, at assembler startup time.  It should set up
1896    all the tables, etc. that the MD part of the assembler will need.  */
1897
1898 void
1899 md_begin (void)
1900 {
1901   const char *retval = NULL;
1902   int i = 0;
1903   int broken = 0;
1904
1905   if (mips_pic != NO_PIC)
1906     {
1907       if (g_switch_seen && g_switch_value != 0)
1908         as_bad (_("-G may not be used in position-independent code"));
1909       g_switch_value = 0;
1910     }
1911
1912   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1913     as_warn (_("Could not set architecture and machine"));
1914
1915   op_hash = hash_new ();
1916
1917   for (i = 0; i < NUMOPCODES;)
1918     {
1919       const char *name = mips_opcodes[i].name;
1920
1921       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1922       if (retval != NULL)
1923         {
1924           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1925                    mips_opcodes[i].name, retval);
1926           /* Probably a memory allocation problem?  Give up now.  */
1927           as_fatal (_("Broken assembler.  No assembly attempted."));
1928         }
1929       do
1930         {
1931           if (mips_opcodes[i].pinfo != INSN_MACRO)
1932             {
1933               if (!validate_mips_insn (&mips_opcodes[i]))
1934                 broken = 1;
1935               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1936                 {
1937                   create_insn (&nop_insn, mips_opcodes + i);
1938                   if (mips_fix_loongson2f_nop)
1939                     nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
1940                   nop_insn.fixed_p = 1;
1941                 }
1942             }
1943           ++i;
1944         }
1945       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1946     }
1947
1948   mips16_op_hash = hash_new ();
1949
1950   i = 0;
1951   while (i < bfd_mips16_num_opcodes)
1952     {
1953       const char *name = mips16_opcodes[i].name;
1954
1955       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1956       if (retval != NULL)
1957         as_fatal (_("internal: can't hash `%s': %s"),
1958                   mips16_opcodes[i].name, retval);
1959       do
1960         {
1961           if (mips16_opcodes[i].pinfo != INSN_MACRO
1962               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1963                   != mips16_opcodes[i].match))
1964             {
1965               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1966                        mips16_opcodes[i].name, mips16_opcodes[i].args);
1967               broken = 1;
1968             }
1969           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1970             {
1971               create_insn (&mips16_nop_insn, mips16_opcodes + i);
1972               mips16_nop_insn.fixed_p = 1;
1973             }
1974           ++i;
1975         }
1976       while (i < bfd_mips16_num_opcodes
1977              && strcmp (mips16_opcodes[i].name, name) == 0);
1978     }
1979
1980   if (broken)
1981     as_fatal (_("Broken assembler.  No assembly attempted."));
1982
1983   /* We add all the general register names to the symbol table.  This
1984      helps us detect invalid uses of them.  */
1985   for (i = 0; reg_names[i].name; i++) 
1986     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1987                                      reg_names[i].num, /* & RNUM_MASK, */
1988                                      &zero_address_frag));
1989   if (HAVE_NEWABI)
1990     for (i = 0; reg_names_n32n64[i].name; i++) 
1991       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1992                                        reg_names_n32n64[i].num, /* & RNUM_MASK, */
1993                                        &zero_address_frag));
1994   else
1995     for (i = 0; reg_names_o32[i].name; i++) 
1996       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
1997                                        reg_names_o32[i].num, /* & RNUM_MASK, */
1998                                        &zero_address_frag));
1999
2000   mips_no_prev_insn ();
2001
2002   mips_gprmask = 0;
2003   mips_cprmask[0] = 0;
2004   mips_cprmask[1] = 0;
2005   mips_cprmask[2] = 0;
2006   mips_cprmask[3] = 0;
2007
2008   /* set the default alignment for the text section (2**2) */
2009   record_alignment (text_section, 2);
2010
2011   bfd_set_gp_size (stdoutput, g_switch_value);
2012
2013 #ifdef OBJ_ELF
2014   if (IS_ELF)
2015     {
2016       /* On a native system other than VxWorks, sections must be aligned
2017          to 16 byte boundaries.  When configured for an embedded ELF
2018          target, we don't bother.  */
2019       if (strncmp (TARGET_OS, "elf", 3) != 0
2020           && strncmp (TARGET_OS, "vxworks", 7) != 0)
2021         {
2022           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2023           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2024           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2025         }
2026
2027       /* Create a .reginfo section for register masks and a .mdebug
2028          section for debugging information.  */
2029       {
2030         segT seg;
2031         subsegT subseg;
2032         flagword flags;
2033         segT sec;
2034
2035         seg = now_seg;
2036         subseg = now_subseg;
2037
2038         /* The ABI says this section should be loaded so that the
2039            running program can access it.  However, we don't load it
2040            if we are configured for an embedded target */
2041         flags = SEC_READONLY | SEC_DATA;
2042         if (strncmp (TARGET_OS, "elf", 3) != 0)
2043           flags |= SEC_ALLOC | SEC_LOAD;
2044
2045         if (mips_abi != N64_ABI)
2046           {
2047             sec = subseg_new (".reginfo", (subsegT) 0);
2048
2049             bfd_set_section_flags (stdoutput, sec, flags);
2050             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2051
2052             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2053           }
2054         else
2055           {
2056             /* The 64-bit ABI uses a .MIPS.options section rather than
2057                .reginfo section.  */
2058             sec = subseg_new (".MIPS.options", (subsegT) 0);
2059             bfd_set_section_flags (stdoutput, sec, flags);
2060             bfd_set_section_alignment (stdoutput, sec, 3);
2061
2062             /* Set up the option header.  */
2063             {
2064               Elf_Internal_Options opthdr;
2065               char *f;
2066
2067               opthdr.kind = ODK_REGINFO;
2068               opthdr.size = (sizeof (Elf_External_Options)
2069                              + sizeof (Elf64_External_RegInfo));
2070               opthdr.section = 0;
2071               opthdr.info = 0;
2072               f = frag_more (sizeof (Elf_External_Options));
2073               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2074                                              (Elf_External_Options *) f);
2075
2076               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2077             }
2078           }
2079
2080         if (ECOFF_DEBUGGING)
2081           {
2082             sec = subseg_new (".mdebug", (subsegT) 0);
2083             (void) bfd_set_section_flags (stdoutput, sec,
2084                                           SEC_HAS_CONTENTS | SEC_READONLY);
2085             (void) bfd_set_section_alignment (stdoutput, sec, 2);
2086           }
2087         else if (mips_flag_pdr)
2088           {
2089             pdr_seg = subseg_new (".pdr", (subsegT) 0);
2090             (void) bfd_set_section_flags (stdoutput, pdr_seg,
2091                                           SEC_READONLY | SEC_RELOC
2092                                           | SEC_DEBUGGING);
2093             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2094           }
2095
2096         subseg_set (seg, subseg);
2097       }
2098     }
2099 #endif /* OBJ_ELF */
2100
2101   if (! ECOFF_DEBUGGING)
2102     md_obj_begin ();
2103
2104   if (mips_fix_vr4120)
2105     init_vr4120_conflicts ();
2106 }
2107
2108 void
2109 md_mips_end (void)
2110 {
2111   if (! ECOFF_DEBUGGING)
2112     md_obj_end ();
2113 }
2114
2115 void
2116 md_assemble (char *str)
2117 {
2118   struct mips_cl_insn insn;
2119   bfd_reloc_code_real_type unused_reloc[3]
2120     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2121
2122   imm_expr.X_op = O_absent;
2123   imm2_expr.X_op = O_absent;
2124   offset_expr.X_op = O_absent;
2125   imm_reloc[0] = BFD_RELOC_UNUSED;
2126   imm_reloc[1] = BFD_RELOC_UNUSED;
2127   imm_reloc[2] = BFD_RELOC_UNUSED;
2128   offset_reloc[0] = BFD_RELOC_UNUSED;
2129   offset_reloc[1] = BFD_RELOC_UNUSED;
2130   offset_reloc[2] = BFD_RELOC_UNUSED;
2131
2132   if (mips_opts.mips16)
2133     mips16_ip (str, &insn);
2134   else
2135     {
2136       mips_ip (str, &insn);
2137       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2138             str, insn.insn_opcode));
2139     }
2140
2141   if (insn_error)
2142     {
2143       as_bad ("%s `%s'", insn_error, str);
2144       return;
2145     }
2146
2147   if (insn.insn_mo->pinfo == INSN_MACRO)
2148     {
2149       macro_start ();
2150       if (mips_opts.mips16)
2151         mips16_macro (&insn);
2152       else
2153         macro (&insn);
2154       macro_end ();
2155     }
2156   else
2157     {
2158       if (imm_expr.X_op != O_absent)
2159         append_insn (&insn, &imm_expr, imm_reloc);
2160       else if (offset_expr.X_op != O_absent)
2161         append_insn (&insn, &offset_expr, offset_reloc);
2162       else
2163         append_insn (&insn, NULL, unused_reloc);
2164     }
2165 }
2166
2167 /* Convenience functions for abstracting away the differences between
2168    MIPS16 and non-MIPS16 relocations.  */
2169
2170 static inline bfd_boolean
2171 mips16_reloc_p (bfd_reloc_code_real_type reloc)
2172 {
2173   switch (reloc)
2174     {
2175     case BFD_RELOC_MIPS16_JMP:
2176     case BFD_RELOC_MIPS16_GPREL:
2177     case BFD_RELOC_MIPS16_GOT16:
2178     case BFD_RELOC_MIPS16_CALL16:
2179     case BFD_RELOC_MIPS16_HI16_S:
2180     case BFD_RELOC_MIPS16_HI16:
2181     case BFD_RELOC_MIPS16_LO16:
2182       return TRUE;
2183
2184     default:
2185       return FALSE;
2186     }
2187 }
2188
2189 static inline bfd_boolean
2190 got16_reloc_p (bfd_reloc_code_real_type reloc)
2191 {
2192   return reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16;
2193 }
2194
2195 static inline bfd_boolean
2196 hi16_reloc_p (bfd_reloc_code_real_type reloc)
2197 {
2198   return reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S;
2199 }
2200
2201 static inline bfd_boolean
2202 lo16_reloc_p (bfd_reloc_code_real_type reloc)
2203 {
2204   return reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16;
2205 }
2206
2207 /* Return true if the given relocation might need a matching %lo().
2208    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2209    need a matching %lo() when applied to local symbols.  */
2210
2211 static inline bfd_boolean
2212 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2213 {
2214   return (HAVE_IN_PLACE_ADDENDS
2215           && (hi16_reloc_p (reloc)
2216               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2217                  all GOT16 relocations evaluate to "G".  */
2218               || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2219 }
2220
2221 /* Return the type of %lo() reloc needed by RELOC, given that
2222    reloc_needs_lo_p.  */
2223
2224 static inline bfd_reloc_code_real_type
2225 matching_lo_reloc (bfd_reloc_code_real_type reloc)
2226 {
2227   return mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16 : BFD_RELOC_LO16;
2228 }
2229
2230 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2231    relocation.  */
2232
2233 static inline bfd_boolean
2234 fixup_has_matching_lo_p (fixS *fixp)
2235 {
2236   return (fixp->fx_next != NULL
2237           && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
2238           && fixp->fx_addsy == fixp->fx_next->fx_addsy
2239           && fixp->fx_offset == fixp->fx_next->fx_offset);
2240 }
2241
2242 /* See whether instruction IP reads register REG.  CLASS is the type
2243    of register.  */
2244
2245 static int
2246 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2247                enum mips_regclass regclass)
2248 {
2249   if (regclass == MIPS16_REG)
2250     {
2251       gas_assert (mips_opts.mips16);
2252       reg = mips16_to_32_reg_map[reg];
2253       regclass = MIPS_GR_REG;
2254     }
2255
2256   /* Don't report on general register ZERO, since it never changes.  */
2257   if (regclass == MIPS_GR_REG && reg == ZERO)
2258     return 0;
2259
2260   if (regclass == MIPS_FP_REG)
2261     {
2262       gas_assert (! mips_opts.mips16);
2263       /* If we are called with either $f0 or $f1, we must check $f0.
2264          This is not optimal, because it will introduce an unnecessary
2265          NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
2266          need to distinguish reading both $f0 and $f1 or just one of
2267          them.  Note that we don't have to check the other way,
2268          because there is no instruction that sets both $f0 and $f1
2269          and requires a delay.  */
2270       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2271           && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2272               == (reg &~ (unsigned) 1)))
2273         return 1;
2274       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2275           && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2276               == (reg &~ (unsigned) 1)))
2277         return 1;
2278     }
2279   else if (! mips_opts.mips16)
2280     {
2281       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2282           && EXTRACT_OPERAND (RS, *ip) == reg)
2283         return 1;
2284       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2285           && EXTRACT_OPERAND (RT, *ip) == reg)
2286         return 1;
2287     }
2288   else
2289     {
2290       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2291           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2292         return 1;
2293       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2294           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2295         return 1;
2296       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2297           && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2298               == reg))
2299         return 1;
2300       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2301         return 1;
2302       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2303         return 1;
2304       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2305         return 1;
2306       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2307           && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2308         return 1;
2309     }
2310
2311   return 0;
2312 }
2313
2314 /* This function returns true if modifying a register requires a
2315    delay.  */
2316
2317 static int
2318 reg_needs_delay (unsigned int reg)
2319 {
2320   unsigned long prev_pinfo;
2321
2322   prev_pinfo = history[0].insn_mo->pinfo;
2323   if (! mips_opts.noreorder
2324       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2325            && ! gpr_interlocks)
2326           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2327               && ! cop_interlocks)))
2328     {
2329       /* A load from a coprocessor or from memory.  All load delays
2330          delay the use of general register rt for one instruction.  */
2331       /* Itbl support may require additional care here.  */
2332       know (prev_pinfo & INSN_WRITE_GPR_T);
2333       if (reg == EXTRACT_OPERAND (RT, history[0]))
2334         return 1;
2335     }
2336
2337   return 0;
2338 }
2339
2340 /* Move all labels in insn_labels to the current insertion point.  */
2341
2342 static void
2343 mips_move_labels (void)
2344 {
2345   segment_info_type *si = seg_info (now_seg);
2346   struct insn_label_list *l;
2347   valueT val;
2348
2349   for (l = si->label_list; l != NULL; l = l->next)
2350     {
2351       gas_assert (S_GET_SEGMENT (l->label) == now_seg);
2352       symbol_set_frag (l->label, frag_now);
2353       val = (valueT) frag_now_fix ();
2354       /* mips16 text labels are stored as odd.  */
2355       if (mips_opts.mips16)
2356         ++val;
2357       S_SET_VALUE (l->label, val);
2358     }
2359 }
2360
2361 static bfd_boolean
2362 s_is_linkonce (symbolS *sym, segT from_seg)
2363 {
2364   bfd_boolean linkonce = FALSE;
2365   segT symseg = S_GET_SEGMENT (sym);
2366
2367   if (symseg != from_seg && !S_IS_LOCAL (sym))
2368     {
2369       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2370         linkonce = TRUE;
2371 #ifdef OBJ_ELF
2372       /* The GNU toolchain uses an extension for ELF: a section
2373          beginning with the magic string .gnu.linkonce is a
2374          linkonce section.  */
2375       if (strncmp (segment_name (symseg), ".gnu.linkonce",
2376                    sizeof ".gnu.linkonce" - 1) == 0)
2377         linkonce = TRUE;
2378 #endif
2379     }
2380   return linkonce;
2381 }
2382
2383 /* Mark instruction labels in mips16 mode.  This permits the linker to
2384    handle them specially, such as generating jalx instructions when
2385    needed.  We also make them odd for the duration of the assembly, in
2386    order to generate the right sort of code.  We will make them even
2387    in the adjust_symtab routine, while leaving them marked.  This is
2388    convenient for the debugger and the disassembler.  The linker knows
2389    to make them odd again.  */
2390
2391 static void
2392 mips16_mark_labels (void)
2393 {
2394   segment_info_type *si = seg_info (now_seg);
2395   struct insn_label_list *l;
2396
2397   if (!mips_opts.mips16)
2398     return;
2399
2400   for (l = si->label_list; l != NULL; l = l->next)
2401    {
2402       symbolS *label = l->label;
2403
2404 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2405       if (IS_ELF)
2406         S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2407 #endif
2408       if ((S_GET_VALUE (label) & 1) == 0
2409         /* Don't adjust the address if the label is global or weak, or
2410            in a link-once section, since we'll be emitting symbol reloc
2411            references to it which will be patched up by the linker, and
2412            the final value of the symbol may or may not be MIPS16.  */
2413           && ! S_IS_WEAK (label)
2414           && ! S_IS_EXTERNAL (label)
2415           && ! s_is_linkonce (label, now_seg))
2416         S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2417     }
2418 }
2419
2420 /* End the current frag.  Make it a variant frag and record the
2421    relaxation info.  */
2422
2423 static void
2424 relax_close_frag (void)
2425 {
2426   mips_macro_warning.first_frag = frag_now;
2427   frag_var (rs_machine_dependent, 0, 0,
2428             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2429             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2430
2431   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2432   mips_relax.first_fixup = 0;
2433 }
2434
2435 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2436    See the comment above RELAX_ENCODE for more details.  */
2437
2438 static void
2439 relax_start (symbolS *symbol)
2440 {
2441   gas_assert (mips_relax.sequence == 0);
2442   mips_relax.sequence = 1;
2443   mips_relax.symbol = symbol;
2444 }
2445
2446 /* Start generating the second version of a relaxable sequence.
2447    See the comment above RELAX_ENCODE for more details.  */
2448
2449 static void
2450 relax_switch (void)
2451 {
2452   gas_assert (mips_relax.sequence == 1);
2453   mips_relax.sequence = 2;
2454 }
2455
2456 /* End the current relaxable sequence.  */
2457
2458 static void
2459 relax_end (void)
2460 {
2461   gas_assert (mips_relax.sequence == 2);
2462   relax_close_frag ();
2463   mips_relax.sequence = 0;
2464 }
2465
2466 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2467    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2468    by VR4120 errata.  */
2469
2470 static unsigned int
2471 classify_vr4120_insn (const char *name)
2472 {
2473   if (strncmp (name, "macc", 4) == 0)
2474     return FIX_VR4120_MACC;
2475   if (strncmp (name, "dmacc", 5) == 0)
2476     return FIX_VR4120_DMACC;
2477   if (strncmp (name, "mult", 4) == 0)
2478     return FIX_VR4120_MULT;
2479   if (strncmp (name, "dmult", 5) == 0)
2480     return FIX_VR4120_DMULT;
2481   if (strstr (name, "div"))
2482     return FIX_VR4120_DIV;
2483   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2484     return FIX_VR4120_MTHILO;
2485   return NUM_FIX_VR4120_CLASSES;
2486 }
2487
2488 #define INSN_ERET  0x42000018
2489 #define INSN_DERET 0x4200001f
2490
2491 /* Return the number of instructions that must separate INSN1 and INSN2,
2492    where INSN1 is the earlier instruction.  Return the worst-case value
2493    for any INSN2 if INSN2 is null.  */
2494
2495 static unsigned int
2496 insns_between (const struct mips_cl_insn *insn1,
2497                const struct mips_cl_insn *insn2)
2498 {
2499   unsigned long pinfo1, pinfo2;
2500
2501   /* This function needs to know which pinfo flags are set for INSN2
2502      and which registers INSN2 uses.  The former is stored in PINFO2 and
2503      the latter is tested via INSN2_USES_REG.  If INSN2 is null, PINFO2
2504      will have every flag set and INSN2_USES_REG will always return true.  */
2505   pinfo1 = insn1->insn_mo->pinfo;
2506   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2507
2508 #define INSN2_USES_REG(REG, CLASS) \
2509    (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2510
2511   /* For most targets, write-after-read dependencies on the HI and LO
2512      registers must be separated by at least two instructions.  */
2513   if (!hilo_interlocks)
2514     {
2515       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2516         return 2;
2517       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2518         return 2;
2519     }
2520
2521   /* If we're working around r7000 errata, there must be two instructions
2522      between an mfhi or mflo and any instruction that uses the result.  */
2523   if (mips_7000_hilo_fix
2524       && MF_HILO_INSN (pinfo1)
2525       && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2526     return 2;
2527
2528   /* If we're working around 24K errata, one instruction is required
2529      if an ERET or DERET is followed by a branch instruction.  */
2530   if (mips_fix_24k)
2531     {
2532       if (insn1->insn_opcode == INSN_ERET
2533           || insn1->insn_opcode == INSN_DERET)
2534         {
2535           if (insn2 == NULL
2536               || insn2->insn_opcode == INSN_ERET
2537               || insn2->insn_opcode == INSN_DERET
2538               || (insn2->insn_mo->pinfo
2539                   & (INSN_UNCOND_BRANCH_DELAY
2540                      | INSN_COND_BRANCH_DELAY
2541                      | INSN_COND_BRANCH_LIKELY)) != 0)
2542             return 1;
2543         }
2544     }
2545
2546   /* If working around VR4120 errata, check for combinations that need
2547      a single intervening instruction.  */
2548   if (mips_fix_vr4120)
2549     {
2550       unsigned int class1, class2;
2551
2552       class1 = classify_vr4120_insn (insn1->insn_mo->name);
2553       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2554         {
2555           if (insn2 == NULL)
2556             return 1;
2557           class2 = classify_vr4120_insn (insn2->insn_mo->name);
2558           if (vr4120_conflicts[class1] & (1 << class2))
2559             return 1;
2560         }
2561     }
2562
2563   if (!mips_opts.mips16)
2564     {
2565       /* Check for GPR or coprocessor load delays.  All such delays
2566          are on the RT register.  */
2567       /* Itbl support may require additional care here.  */
2568       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2569           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2570         {
2571           know (pinfo1 & INSN_WRITE_GPR_T);
2572           if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2573             return 1;
2574         }
2575
2576       /* Check for generic coprocessor hazards.
2577
2578          This case is not handled very well.  There is no special
2579          knowledge of CP0 handling, and the coprocessors other than
2580          the floating point unit are not distinguished at all.  */
2581       /* Itbl support may require additional care here. FIXME!
2582          Need to modify this to include knowledge about
2583          user specified delays!  */
2584       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2585                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2586         {
2587           /* Handle cases where INSN1 writes to a known general coprocessor
2588              register.  There must be a one instruction delay before INSN2
2589              if INSN2 reads that register, otherwise no delay is needed.  */
2590           if (pinfo1 & INSN_WRITE_FPR_T)
2591             {
2592               if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2593                 return 1;
2594             }
2595           else if (pinfo1 & INSN_WRITE_FPR_S)
2596             {
2597               if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2598                 return 1;
2599             }
2600           else
2601             {
2602               /* Read-after-write dependencies on the control registers
2603                  require a two-instruction gap.  */
2604               if ((pinfo1 & INSN_WRITE_COND_CODE)
2605                   && (pinfo2 & INSN_READ_COND_CODE))
2606                 return 2;
2607
2608               /* We don't know exactly what INSN1 does.  If INSN2 is
2609                  also a coprocessor instruction, assume there must be
2610                  a one instruction gap.  */
2611               if (pinfo2 & INSN_COP)
2612                 return 1;
2613             }
2614         }
2615
2616       /* Check for read-after-write dependencies on the coprocessor
2617          control registers in cases where INSN1 does not need a general
2618          coprocessor delay.  This means that INSN1 is a floating point
2619          comparison instruction.  */
2620       /* Itbl support may require additional care here.  */
2621       else if (!cop_interlocks
2622                && (pinfo1 & INSN_WRITE_COND_CODE)
2623                && (pinfo2 & INSN_READ_COND_CODE))
2624         return 1;
2625     }
2626
2627 #undef INSN2_USES_REG
2628
2629   return 0;
2630 }
2631
2632 /* Return the number of nops that would be needed to work around the
2633    VR4130 mflo/mfhi errata if instruction INSN immediately followed
2634    the MAX_VR4130_NOPS instructions described by HIST.  */
2635
2636 static int
2637 nops_for_vr4130 (const struct mips_cl_insn *hist,
2638                  const struct mips_cl_insn *insn)
2639 {
2640   int i, j, reg;
2641
2642   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
2643      are not affected by the errata.  */
2644   if (insn != 0
2645       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2646           || strcmp (insn->insn_mo->name, "mtlo") == 0
2647           || strcmp (insn->insn_mo->name, "mthi") == 0))
2648     return 0;
2649
2650   /* Search for the first MFLO or MFHI.  */
2651   for (i = 0; i < MAX_VR4130_NOPS; i++)
2652     if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
2653       {
2654         /* Extract the destination register.  */
2655         if (mips_opts.mips16)
2656           reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, hist[i])];
2657         else
2658           reg = EXTRACT_OPERAND (RD, hist[i]);
2659
2660         /* No nops are needed if INSN reads that register.  */
2661         if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2662           return 0;
2663
2664         /* ...or if any of the intervening instructions do.  */
2665         for (j = 0; j < i; j++)
2666           if (insn_uses_reg (&hist[j], reg, MIPS_GR_REG))
2667             return 0;
2668
2669         return MAX_VR4130_NOPS - i;
2670       }
2671   return 0;
2672 }
2673
2674 /* Return the number of nops that would be needed if instruction INSN
2675    immediately followed the MAX_NOPS instructions given by HIST,
2676    where HIST[0] is the most recent instruction.  If INSN is null,
2677    return the worse-case number of nops for any instruction.  */
2678
2679 static int
2680 nops_for_insn (const struct mips_cl_insn *hist,
2681                const struct mips_cl_insn *insn)
2682 {
2683   int i, nops, tmp_nops;
2684
2685   nops = 0;
2686   for (i = 0; i < MAX_DELAY_NOPS; i++)
2687     {
2688       tmp_nops = insns_between (hist + i, insn) - i;
2689       if (tmp_nops > nops)
2690         nops = tmp_nops;
2691     }
2692
2693   if (mips_fix_vr4130)
2694     {
2695       tmp_nops = nops_for_vr4130 (hist, insn);
2696       if (tmp_nops > nops)
2697         nops = tmp_nops;
2698     }
2699
2700   return nops;
2701 }
2702
2703 /* The variable arguments provide NUM_INSNS extra instructions that
2704    might be added to HIST.  Return the largest number of nops that
2705    would be needed after the extended sequence.  */
2706
2707 static int
2708 nops_for_sequence (int num_insns, const struct mips_cl_insn *hist, ...)
2709 {
2710   va_list args;
2711   struct mips_cl_insn buffer[MAX_NOPS];
2712   struct mips_cl_insn *cursor;
2713   int nops;
2714
2715   va_start (args, hist);
2716   cursor = buffer + num_insns;
2717   memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
2718   while (cursor > buffer)
2719     *--cursor = *va_arg (args, const struct mips_cl_insn *);
2720
2721   nops = nops_for_insn (buffer, NULL);
2722   va_end (args);
2723   return nops;
2724 }
2725
2726 /* Like nops_for_insn, but if INSN is a branch, take into account the
2727    worst-case delay for the branch target.  */
2728
2729 static int
2730 nops_for_insn_or_target (const struct mips_cl_insn *hist,
2731                          const struct mips_cl_insn *insn)
2732 {
2733   int nops, tmp_nops;
2734
2735   nops = nops_for_insn (hist, insn);
2736   if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2737                               | INSN_COND_BRANCH_DELAY
2738                               | INSN_COND_BRANCH_LIKELY))
2739     {
2740       tmp_nops = nops_for_sequence (2, hist, insn, NOP_INSN);
2741       if (tmp_nops > nops)
2742         nops = tmp_nops;
2743     }
2744   else if (mips_opts.mips16
2745            && (insn->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
2746                                        | MIPS16_INSN_COND_BRANCH)))
2747     {
2748       tmp_nops = nops_for_sequence (1, hist, insn);
2749       if (tmp_nops > nops)
2750         nops = tmp_nops;
2751     }
2752   return nops;
2753 }
2754
2755 /* Fix NOP issue: Replace nops by "or at,at,zero".  */
2756
2757 static void
2758 fix_loongson2f_nop (struct mips_cl_insn * ip)
2759 {
2760   if (strcmp (ip->insn_mo->name, "nop") == 0)
2761     ip->insn_opcode = LOONGSON2F_NOP_INSN;
2762 }
2763
2764 /* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
2765                    jr target pc &= 'hffff_ffff_cfff_ffff.  */
2766
2767 static void
2768 fix_loongson2f_jump (struct mips_cl_insn * ip)
2769 {
2770   if (strcmp (ip->insn_mo->name, "j") == 0
2771       || strcmp (ip->insn_mo->name, "jr") == 0
2772       || strcmp (ip->insn_mo->name, "jalr") == 0)
2773     {
2774       int sreg;
2775       expressionS ep;
2776
2777       if (! mips_opts.at)
2778         return;
2779
2780       sreg = EXTRACT_OPERAND (RS, *ip);
2781       if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
2782         return;
2783
2784       ep.X_op = O_constant;
2785       ep.X_add_number = 0xcfff0000;
2786       macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
2787       ep.X_add_number = 0xffff;
2788       macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
2789       macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
2790     }
2791 }
2792
2793 static void
2794 fix_loongson2f (struct mips_cl_insn * ip)
2795 {
2796   if (mips_fix_loongson2f_nop)
2797     fix_loongson2f_nop (ip);
2798
2799   if (mips_fix_loongson2f_jump)
2800     fix_loongson2f_jump (ip);
2801 }
2802
2803 /* Output an instruction.  IP is the instruction information.
2804    ADDRESS_EXPR is an operand of the instruction to be used with
2805    RELOC_TYPE.  */
2806
2807 static void
2808 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2809              bfd_reloc_code_real_type *reloc_type)
2810 {
2811   unsigned long prev_pinfo, pinfo;
2812   relax_stateT prev_insn_frag_type = 0;
2813   bfd_boolean relaxed_branch = FALSE;
2814   segment_info_type *si = seg_info (now_seg);
2815
2816   if (mips_fix_loongson2f)
2817     fix_loongson2f (ip);
2818
2819   /* Mark instruction labels in mips16 mode.  */
2820   mips16_mark_labels ();
2821
2822   file_ase_mips16 |= mips_opts.mips16;
2823
2824   prev_pinfo = history[0].insn_mo->pinfo;
2825   pinfo = ip->insn_mo->pinfo;
2826
2827   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2828     {
2829       /* There are a lot of optimizations we could do that we don't.
2830          In particular, we do not, in general, reorder instructions.
2831          If you use gcc with optimization, it will reorder
2832          instructions and generally do much more optimization then we
2833          do here; repeating all that work in the assembler would only
2834          benefit hand written assembly code, and does not seem worth
2835          it.  */
2836       int nops = (mips_optimize == 0
2837                   ? nops_for_insn (history, NULL)
2838                   : nops_for_insn_or_target (history, ip));
2839       if (nops > 0)
2840         {
2841           fragS *old_frag;
2842           unsigned long old_frag_offset;
2843           int i;
2844
2845           old_frag = frag_now;
2846           old_frag_offset = frag_now_fix ();
2847
2848           for (i = 0; i < nops; i++)
2849             emit_nop ();
2850
2851           if (listing)
2852             {
2853               listing_prev_line ();
2854               /* We may be at the start of a variant frag.  In case we
2855                  are, make sure there is enough space for the frag
2856                  after the frags created by listing_prev_line.  The
2857                  argument to frag_grow here must be at least as large
2858                  as the argument to all other calls to frag_grow in
2859                  this file.  We don't have to worry about being in the
2860                  middle of a variant frag, because the variants insert
2861                  all needed nop instructions themselves.  */
2862               frag_grow (40);
2863             }
2864
2865           mips_move_labels ();
2866
2867 #ifndef NO_ECOFF_DEBUGGING
2868           if (ECOFF_DEBUGGING)
2869             ecoff_fix_loc (old_frag, old_frag_offset);
2870 #endif
2871         }
2872     }
2873   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2874     {
2875       /* Work out how many nops in prev_nop_frag are needed by IP.  */
2876       int nops = nops_for_insn_or_target (history, ip);
2877       gas_assert (nops <= prev_nop_frag_holds);
2878
2879       /* Enforce NOPS as a minimum.  */
2880       if (nops > prev_nop_frag_required)
2881         prev_nop_frag_required = nops;
2882
2883       if (prev_nop_frag_holds == prev_nop_frag_required)
2884         {
2885           /* Settle for the current number of nops.  Update the history
2886              accordingly (for the benefit of any future .set reorder code).  */
2887           prev_nop_frag = NULL;
2888           insert_into_history (prev_nop_frag_since,
2889                                prev_nop_frag_holds, NOP_INSN);
2890         }
2891       else
2892         {
2893           /* Allow this instruction to replace one of the nops that was
2894              tentatively added to prev_nop_frag.  */
2895           prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2896           prev_nop_frag_holds--;
2897           prev_nop_frag_since++;
2898         }
2899     }
2900
2901 #ifdef OBJ_ELF
2902   /* The value passed to dwarf2_emit_insn is the distance between
2903      the beginning of the current instruction and the address that
2904      should be recorded in the debug tables.  For MIPS16 debug info
2905      we want to use ISA-encoded addresses, so we pass -1 for an
2906      address higher by one than the current.  */
2907   dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2908 #endif
2909
2910   /* Record the frag type before frag_var.  */
2911   if (history[0].frag)
2912     prev_insn_frag_type = history[0].frag->fr_type;
2913
2914   if (address_expr
2915       && *reloc_type == BFD_RELOC_16_PCREL_S2
2916       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2917           || pinfo & INSN_COND_BRANCH_LIKELY)
2918       && mips_relax_branch
2919       /* Don't try branch relaxation within .set nomacro, or within
2920          .set noat if we use $at for PIC computations.  If it turns
2921          out that the branch was out-of-range, we'll get an error.  */
2922       && !mips_opts.warn_about_macros
2923       && (mips_opts.at || mips_pic == NO_PIC)
2924       && !mips_opts.mips16)
2925     {
2926       relaxed_branch = TRUE;
2927       add_relaxed_insn (ip, (relaxed_branch_length
2928                              (NULL, NULL,
2929                               (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2930                               : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2931                               : 0)), 4,
2932                         RELAX_BRANCH_ENCODE
2933                         (pinfo & INSN_UNCOND_BRANCH_DELAY,
2934                          pinfo & INSN_COND_BRANCH_LIKELY,
2935                          pinfo & INSN_WRITE_GPR_31,
2936                          0),
2937                         address_expr->X_add_symbol,
2938                         address_expr->X_add_number);
2939       *reloc_type = BFD_RELOC_UNUSED;
2940     }
2941   else if (*reloc_type > BFD_RELOC_UNUSED)
2942     {
2943       /* We need to set up a variant frag.  */
2944       gas_assert (mips_opts.mips16 && address_expr != NULL);
2945       add_relaxed_insn (ip, 4, 0,
2946                         RELAX_MIPS16_ENCODE
2947                         (*reloc_type - BFD_RELOC_UNUSED,
2948                          mips16_small, mips16_ext,
2949                          prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2950                          history[0].mips16_absolute_jump_p),
2951                         make_expr_symbol (address_expr), 0);
2952     }
2953   else if (mips_opts.mips16
2954            && ! ip->use_extend
2955            && *reloc_type != BFD_RELOC_MIPS16_JMP)
2956     {
2957       if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2958         /* Make sure there is enough room to swap this instruction with
2959            a following jump instruction.  */
2960         frag_grow (6);
2961       add_fixed_insn (ip);
2962     }
2963   else
2964     {
2965       if (mips_opts.mips16
2966           && mips_opts.noreorder
2967           && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2968         as_warn (_("extended instruction in delay slot"));
2969
2970       if (mips_relax.sequence)
2971         {
2972           /* If we've reached the end of this frag, turn it into a variant
2973              frag and record the information for the instructions we've
2974              written so far.  */
2975           if (frag_room () < 4)
2976             relax_close_frag ();
2977           mips_relax.sizes[mips_relax.sequence - 1] += 4;
2978         }
2979
2980       if (mips_relax.sequence != 2)
2981         mips_macro_warning.sizes[0] += 4;
2982       if (mips_relax.sequence != 1)
2983         mips_macro_warning.sizes[1] += 4;
2984
2985       if (mips_opts.mips16)
2986         {
2987           ip->fixed_p = 1;
2988           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2989         }
2990       add_fixed_insn (ip);
2991     }
2992
2993   if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2994     {
2995       if (address_expr->X_op == O_constant)
2996         {
2997           unsigned int tmp;
2998
2999           switch (*reloc_type)
3000             {
3001             case BFD_RELOC_32:
3002               ip->insn_opcode |= address_expr->X_add_number;
3003               break;
3004
3005             case BFD_RELOC_MIPS_HIGHEST:
3006               tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
3007               ip->insn_opcode |= tmp & 0xffff;
3008               break;
3009
3010             case BFD_RELOC_MIPS_HIGHER:
3011               tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
3012               ip->insn_opcode |= tmp & 0xffff;
3013               break;
3014
3015             case BFD_RELOC_HI16_S:
3016               tmp = (address_expr->X_add_number + 0x8000) >> 16;
3017               ip->insn_opcode |= tmp & 0xffff;
3018               break;
3019
3020             case BFD_RELOC_HI16:
3021               ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
3022               break;
3023
3024             case BFD_RELOC_UNUSED:
3025             case BFD_RELOC_LO16:
3026             case BFD_RELOC_MIPS_GOT_DISP:
3027               ip->insn_opcode |= address_expr->X_add_number & 0xffff;
3028               break;
3029
3030             case BFD_RELOC_MIPS_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 |= (address_expr->X_add_number >> 2) & 0x3ffffff;
3035               break;
3036
3037             case BFD_RELOC_MIPS16_JMP:
3038               if ((address_expr->X_add_number & 3) != 0)
3039                 as_bad (_("jump to misaligned address (0x%lx)"),
3040                         (unsigned long) address_expr->X_add_number);
3041               ip->insn_opcode |=
3042                 (((address_expr->X_add_number & 0x7c0000) << 3)
3043                  | ((address_expr->X_add_number & 0xf800000) >> 7)
3044                  | ((address_expr->X_add_number & 0x3fffc) >> 2));
3045               break;
3046
3047             case BFD_RELOC_16_PCREL_S2:
3048               if ((address_expr->X_add_number & 3) != 0)
3049                 as_bad (_("branch to misaligned address (0x%lx)"),
3050                         (unsigned long) address_expr->X_add_number);
3051               if (mips_relax_branch)
3052                 goto need_reloc;
3053               if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
3054                 as_bad (_("branch address range overflow (0x%lx)"),
3055                         (unsigned long) address_expr->X_add_number);
3056               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
3057               break;
3058
3059             default:
3060               internalError ();
3061             }
3062         }
3063       else if (*reloc_type < BFD_RELOC_UNUSED)
3064         need_reloc:
3065         {
3066           reloc_howto_type *howto;
3067           int i;
3068
3069           /* In a compound relocation, it is the final (outermost)
3070              operator that determines the relocated field.  */
3071           for (i = 1; i < 3; i++)
3072             if (reloc_type[i] == BFD_RELOC_UNUSED)
3073               break;
3074
3075           howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
3076           if (howto == NULL)
3077             {
3078               /* To reproduce this failure try assembling gas/testsuites/
3079                  gas/mips/mips16-intermix.s with a mips-ecoff targeted
3080                  assembler.  */
3081               as_bad (_("Unsupported MIPS relocation number %d"), reloc_type[i - 1]);
3082               howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
3083             }
3084           
3085           ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
3086                                      bfd_get_reloc_size (howto),
3087                                      address_expr,
3088                                      reloc_type[0] == BFD_RELOC_16_PCREL_S2,
3089                                      reloc_type[0]);
3090
3091           /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
3092           if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
3093               && ip->fixp[0]->fx_addsy)
3094             *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
3095
3096           /* These relocations can have an addend that won't fit in
3097              4 octets for 64bit assembly.  */
3098           if (HAVE_64BIT_GPRS
3099               && ! howto->partial_inplace
3100               && (reloc_type[0] == BFD_RELOC_16
3101                   || reloc_type[0] == BFD_RELOC_32
3102                   || reloc_type[0] == BFD_RELOC_MIPS_JMP
3103                   || reloc_type[0] == BFD_RELOC_GPREL16
3104                   || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
3105                   || reloc_type[0] == BFD_RELOC_GPREL32
3106                   || reloc_type[0] == BFD_RELOC_64
3107                   || reloc_type[0] == BFD_RELOC_CTOR
3108                   || reloc_type[0] == BFD_RELOC_MIPS_SUB
3109                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
3110                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
3111                   || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
3112                   || reloc_type[0] == BFD_RELOC_MIPS_REL16
3113                   || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
3114                   || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
3115                   || hi16_reloc_p (reloc_type[0])
3116                   || lo16_reloc_p (reloc_type[0])))
3117             ip->fixp[0]->fx_no_overflow = 1;
3118
3119           if (mips_relax.sequence)
3120             {
3121               if (mips_relax.first_fixup == 0)
3122                 mips_relax.first_fixup = ip->fixp[0];
3123             }
3124           else if (reloc_needs_lo_p (*reloc_type))
3125             {
3126               struct mips_hi_fixup *hi_fixup;
3127
3128               /* Reuse the last entry if it already has a matching %lo.  */
3129               hi_fixup = mips_hi_fixup_list;
3130               if (hi_fixup == 0
3131                   || !fixup_has_matching_lo_p (hi_fixup->fixp))
3132                 {
3133                   hi_fixup = ((struct mips_hi_fixup *)
3134                               xmalloc (sizeof (struct mips_hi_fixup)));
3135                   hi_fixup->next = mips_hi_fixup_list;
3136                   mips_hi_fixup_list = hi_fixup;
3137                 }
3138               hi_fixup->fixp = ip->fixp[0];
3139               hi_fixup->seg = now_seg;
3140             }
3141
3142           /* Add fixups for the second and third relocations, if given.
3143              Note that the ABI allows the second relocation to be
3144              against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
3145              moment we only use RSS_UNDEF, but we could add support
3146              for the others if it ever becomes necessary.  */
3147           for (i = 1; i < 3; i++)
3148             if (reloc_type[i] != BFD_RELOC_UNUSED)
3149               {
3150                 ip->fixp[i] = fix_new (ip->frag, ip->where,
3151                                        ip->fixp[0]->fx_size, NULL, 0,
3152                                        FALSE, reloc_type[i]);
3153
3154                 /* Use fx_tcbit to mark compound relocs.  */
3155                 ip->fixp[0]->fx_tcbit = 1;
3156                 ip->fixp[i]->fx_tcbit = 1;
3157               }
3158         }
3159     }
3160   install_insn (ip);
3161
3162   /* Update the register mask information.  */
3163   if (! mips_opts.mips16)
3164     {
3165       if (pinfo & INSN_WRITE_GPR_D)
3166         mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
3167       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
3168         mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
3169       if (pinfo & INSN_READ_GPR_S)
3170         mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
3171       if (pinfo & INSN_WRITE_GPR_31)
3172         mips_gprmask |= 1 << RA;
3173       if (pinfo & INSN_WRITE_FPR_D)
3174         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
3175       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
3176         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
3177       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
3178         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
3179       if ((pinfo & INSN_READ_FPR_R) != 0)
3180         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
3181       if (pinfo & INSN_COP)
3182         {
3183           /* We don't keep enough information to sort these cases out.
3184              The itbl support does keep this information however, although
3185              we currently don't support itbl fprmats as part of the cop
3186              instruction.  May want to add this support in the future.  */
3187         }
3188       /* Never set the bit for $0, which is always zero.  */
3189       mips_gprmask &= ~1 << 0;
3190     }
3191   else
3192     {
3193       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
3194         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
3195       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
3196         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
3197       if (pinfo & MIPS16_INSN_WRITE_Z)
3198         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
3199       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
3200         mips_gprmask |= 1 << TREG;
3201       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
3202         mips_gprmask |= 1 << SP;
3203       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
3204         mips_gprmask |= 1 << RA;
3205       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3206         mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3207       if (pinfo & MIPS16_INSN_READ_Z)
3208         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
3209       if (pinfo & MIPS16_INSN_READ_GPR_X)
3210         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3211     }
3212
3213   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
3214     {
3215       /* Filling the branch delay slot is more complex.  We try to
3216          switch the branch with the previous instruction, which we can
3217          do if the previous instruction does not set up a condition
3218          that the branch tests and if the branch is not itself the
3219          target of any branch.  */
3220       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
3221           || (pinfo & INSN_COND_BRANCH_DELAY))
3222         {
3223           if (mips_optimize < 2
3224               /* If we have seen .set volatile or .set nomove, don't
3225                  optimize.  */
3226               || mips_opts.nomove != 0
3227               /* We can't swap if the previous instruction's position
3228                  is fixed.  */
3229               || history[0].fixed_p
3230               /* If the previous previous insn was in a .set
3231                  noreorder, we can't swap.  Actually, the MIPS
3232                  assembler will swap in this situation.  However, gcc
3233                  configured -with-gnu-as will generate code like
3234                    .set noreorder
3235                    lw   $4,XXX
3236                    .set reorder
3237                    INSN
3238                    bne  $4,$0,foo
3239                  in which we can not swap the bne and INSN.  If gcc is
3240                  not configured -with-gnu-as, it does not output the
3241                  .set pseudo-ops.  */
3242               || history[1].noreorder_p
3243               /* If the branch is itself the target of a branch, we
3244                  can not swap.  We cheat on this; all we check for is
3245                  whether there is a label on this instruction.  If
3246                  there are any branches to anything other than a
3247                  label, users must use .set noreorder.  */
3248               || si->label_list != NULL
3249               /* If the previous instruction is in a variant frag
3250                  other than this branch's one, we cannot do the swap.
3251                  This does not apply to the mips16, which uses variant
3252                  frags for different purposes.  */
3253               || (! mips_opts.mips16
3254                   && prev_insn_frag_type == rs_machine_dependent)
3255               /* Check for conflicts between the branch and the instructions
3256                  before the candidate delay slot.  */
3257               || nops_for_insn (history + 1, ip) > 0
3258               /* Check for conflicts between the swapped sequence and the
3259                  target of the branch.  */
3260               || nops_for_sequence (2, history + 1, ip, history) > 0
3261               /* We do not swap with a trap instruction, since it
3262                  complicates trap handlers to have the trap
3263                  instruction be in a delay slot.  */
3264               || (prev_pinfo & INSN_TRAP)
3265               /* If the branch reads a register that the previous
3266                  instruction sets, we can not swap.  */
3267               || (! mips_opts.mips16
3268                   && (prev_pinfo & INSN_WRITE_GPR_T)
3269                   && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
3270                                     MIPS_GR_REG))
3271               || (! mips_opts.mips16
3272                   && (prev_pinfo & INSN_WRITE_GPR_D)
3273                   && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
3274                                     MIPS_GR_REG))
3275               || (mips_opts.mips16
3276                   && (((prev_pinfo & MIPS16_INSN_WRITE_X)
3277                        && (insn_uses_reg
3278                            (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3279                             MIPS16_REG)))
3280                       || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
3281                           && (insn_uses_reg
3282                               (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3283                                MIPS16_REG)))
3284                       || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
3285                           && (insn_uses_reg
3286                               (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3287                                MIPS16_REG)))
3288                       || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3289                           && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3290                       || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3291                           && insn_uses_reg (ip, RA, MIPS_GR_REG))
3292                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3293                           && insn_uses_reg (ip,
3294                                             MIPS16OP_EXTRACT_REG32R
3295                                               (history[0].insn_opcode),
3296                                             MIPS_GR_REG))))
3297               /* If the branch writes a register that the previous
3298                  instruction sets, we can not swap (we know that
3299                  branches write only to RD or to $31).  */
3300               || (! mips_opts.mips16
3301                   && (prev_pinfo & INSN_WRITE_GPR_T)
3302                   && (((pinfo & INSN_WRITE_GPR_D)
3303                        && (EXTRACT_OPERAND (RT, history[0])
3304                            == EXTRACT_OPERAND (RD, *ip)))
3305                       || ((pinfo & INSN_WRITE_GPR_31)
3306                           && EXTRACT_OPERAND (RT, history[0]) == RA)))
3307               || (! mips_opts.mips16
3308                   && (prev_pinfo & INSN_WRITE_GPR_D)
3309                   && (((pinfo & INSN_WRITE_GPR_D)
3310                        && (EXTRACT_OPERAND (RD, history[0])
3311                            == EXTRACT_OPERAND (RD, *ip)))
3312                       || ((pinfo & INSN_WRITE_GPR_31)
3313                           && EXTRACT_OPERAND (RD, history[0]) == RA)))
3314               || (mips_opts.mips16
3315                   && (pinfo & MIPS16_INSN_WRITE_31)
3316                   && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3317                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3318                           && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3319                               == RA))))
3320               /* If the branch writes a register that the previous
3321                  instruction reads, we can not swap (we know that
3322                  branches only write to RD or to $31).  */
3323               || (! mips_opts.mips16
3324                   && (pinfo & INSN_WRITE_GPR_D)
3325                   && insn_uses_reg (&history[0],
3326                                     EXTRACT_OPERAND (RD, *ip),
3327                                     MIPS_GR_REG))
3328               || (! mips_opts.mips16
3329                   && (pinfo & INSN_WRITE_GPR_31)
3330                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3331               || (mips_opts.mips16
3332                   && (pinfo & MIPS16_INSN_WRITE_31)
3333                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3334               /* If one instruction sets a condition code and the
3335                  other one uses a condition code, we can not swap.  */
3336               || ((pinfo & INSN_READ_COND_CODE)
3337                   && (prev_pinfo & INSN_WRITE_COND_CODE))
3338               || ((pinfo & INSN_WRITE_COND_CODE)
3339                   && (prev_pinfo & INSN_READ_COND_CODE))
3340               /* If the previous instruction uses the PC, we can not
3341                  swap.  */
3342               || (mips_opts.mips16
3343                   && (prev_pinfo & MIPS16_INSN_READ_PC))
3344               /* If the previous instruction had a fixup in mips16
3345                  mode, we can not swap.  This normally means that the
3346                  previous instruction was a 4 byte branch anyhow.  */
3347               || (mips_opts.mips16 && history[0].fixp[0])
3348               /* If the previous instruction is a sync, sync.l, or
3349                  sync.p, we can not swap.  */
3350               || (prev_pinfo & INSN_SYNC)
3351               /* If the previous instruction is an ERET or
3352                  DERET, avoid the swap.  */
3353               || (history[0].insn_opcode == INSN_ERET)
3354               || (history[0].insn_opcode == INSN_DERET))
3355             {
3356               if (mips_opts.mips16
3357                   && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3358                   && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3359                   && ISA_SUPPORTS_MIPS16E)
3360                 {
3361                   /* Convert MIPS16 jr/jalr into a "compact" jump.  */
3362                   ip->insn_opcode |= 0x0080;
3363                   install_insn (ip);
3364                   insert_into_history (0, 1, ip);
3365                 } 
3366               else
3367                 {
3368                   /* We could do even better for unconditional branches to
3369                      portions of this object file; we could pick up the
3370                      instruction at the destination, put it in the delay
3371                      slot, and bump the destination address.  */
3372                   insert_into_history (0, 1, ip);
3373                   emit_nop ();
3374                 }
3375                 
3376               if (mips_relax.sequence)
3377                 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3378             }
3379           else
3380             {
3381               /* It looks like we can actually do the swap.  */
3382               struct mips_cl_insn delay = history[0];
3383               if (mips_opts.mips16)
3384                 {
3385                   know (delay.frag == ip->frag);
3386                   move_insn (ip, delay.frag, delay.where);
3387                   move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3388                 }
3389               else if (relaxed_branch)
3390                 {
3391                   /* Add the delay slot instruction to the end of the
3392                      current frag and shrink the fixed part of the
3393                      original frag.  If the branch occupies the tail of
3394                      the latter, move it backwards to cover the gap.  */
3395                   delay.frag->fr_fix -= 4;
3396                   if (delay.frag == ip->frag)
3397                     move_insn (ip, ip->frag, ip->where - 4);
3398                   add_fixed_insn (&delay);
3399                 }
3400               else
3401                 {
3402                   move_insn (&delay, ip->frag, ip->where);
3403                   move_insn (ip, history[0].frag, history[0].where);
3404                 }
3405               history[0] = *ip;
3406               delay.fixed_p = 1;
3407               insert_into_history (0, 1, &delay);
3408             }
3409
3410           /* If that was an unconditional branch, forget the previous
3411              insn information.  */
3412           if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3413             {
3414               mips_no_prev_insn ();
3415             }
3416         }
3417       else if (pinfo & INSN_COND_BRANCH_LIKELY)
3418         {
3419           /* We don't yet optimize a branch likely.  What we should do
3420              is look at the target, copy the instruction found there
3421              into the delay slot, and increment the branch to jump to
3422              the next instruction.  */
3423           insert_into_history (0, 1, ip);
3424           emit_nop ();
3425         }
3426       else
3427         insert_into_history (0, 1, ip);
3428     }
3429   else
3430     insert_into_history (0, 1, ip);
3431
3432   /* We just output an insn, so the next one doesn't have a label.  */
3433   mips_clear_insn_labels ();
3434 }
3435
3436 /* Forget that there was any previous instruction or label.  */
3437
3438 static void
3439 mips_no_prev_insn (void)
3440 {
3441   prev_nop_frag = NULL;
3442   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3443   mips_clear_insn_labels ();
3444 }
3445
3446 /* This function must be called before we emit something other than
3447    instructions.  It is like mips_no_prev_insn except that it inserts
3448    any NOPS that might be needed by previous instructions.  */
3449
3450 void
3451 mips_emit_delays (void)
3452 {
3453   if (! mips_opts.noreorder)
3454     {
3455       int nops = nops_for_insn (history, NULL);
3456       if (nops > 0)
3457         {
3458           while (nops-- > 0)
3459             add_fixed_insn (NOP_INSN);
3460           mips_move_labels ();
3461         }
3462     }
3463   mips_no_prev_insn ();
3464 }
3465
3466 /* Start a (possibly nested) noreorder block.  */
3467
3468 static void
3469 start_noreorder (void)
3470 {
3471   if (mips_opts.noreorder == 0)
3472     {
3473       unsigned int i;
3474       int nops;
3475
3476       /* None of the instructions before the .set noreorder can be moved.  */
3477       for (i = 0; i < ARRAY_SIZE (history); i++)
3478         history[i].fixed_p = 1;
3479
3480       /* Insert any nops that might be needed between the .set noreorder
3481          block and the previous instructions.  We will later remove any
3482          nops that turn out not to be needed.  */
3483       nops = nops_for_insn (history, NULL);
3484       if (nops > 0)
3485         {
3486           if (mips_optimize != 0)
3487             {
3488               /* Record the frag which holds the nop instructions, so
3489                  that we can remove them if we don't need them.  */
3490               frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3491               prev_nop_frag = frag_now;
3492               prev_nop_frag_holds = nops;
3493               prev_nop_frag_required = 0;
3494               prev_nop_frag_since = 0;
3495             }
3496
3497           for (; nops > 0; --nops)
3498             add_fixed_insn (NOP_INSN);
3499
3500           /* Move on to a new frag, so that it is safe to simply
3501              decrease the size of prev_nop_frag.  */
3502           frag_wane (frag_now);
3503           frag_new (0);
3504           mips_move_labels ();
3505         }
3506       mips16_mark_labels ();
3507       mips_clear_insn_labels ();
3508     }
3509   mips_opts.noreorder++;
3510   mips_any_noreorder = 1;
3511 }
3512
3513 /* End a nested noreorder block.  */
3514
3515 static void
3516 end_noreorder (void)
3517 {
3518
3519   mips_opts.noreorder--;
3520   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3521     {
3522       /* Commit to inserting prev_nop_frag_required nops and go back to
3523          handling nop insertion the .set reorder way.  */
3524       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3525                                 * (mips_opts.mips16 ? 2 : 4));
3526       insert_into_history (prev_nop_frag_since,
3527                            prev_nop_frag_required, NOP_INSN);
3528       prev_nop_frag = NULL;
3529     }
3530 }
3531
3532 /* Set up global variables for the start of a new macro.  */
3533
3534 static void
3535 macro_start (void)
3536 {
3537   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3538   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3539                                      && (history[0].insn_mo->pinfo
3540                                          & (INSN_UNCOND_BRANCH_DELAY
3541                                             | INSN_COND_BRANCH_DELAY
3542                                             | INSN_COND_BRANCH_LIKELY)) != 0);
3543 }
3544
3545 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3546    for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
3547    RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
3548
3549 static const char *
3550 macro_warning (relax_substateT subtype)
3551 {
3552   if (subtype & RELAX_DELAY_SLOT)
3553     return _("Macro instruction expanded into multiple instructions"
3554              " in a branch delay slot");
3555   else if (subtype & RELAX_NOMACRO)
3556     return _("Macro instruction expanded into multiple instructions");
3557   else
3558     return 0;
3559 }
3560
3561 /* Finish up a macro.  Emit warnings as appropriate.  */
3562
3563 static void
3564 macro_end (void)
3565 {
3566   if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3567     {
3568       relax_substateT subtype;
3569
3570       /* Set up the relaxation warning flags.  */
3571       subtype = 0;
3572       if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3573         subtype |= RELAX_SECOND_LONGER;
3574       if (mips_opts.warn_about_macros)
3575         subtype |= RELAX_NOMACRO;
3576       if (mips_macro_warning.delay_slot_p)
3577         subtype |= RELAX_DELAY_SLOT;
3578
3579       if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3580         {
3581           /* Either the macro has a single implementation or both
3582              implementations are longer than 4 bytes.  Emit the
3583              warning now.  */
3584           const char *msg = macro_warning (subtype);
3585           if (msg != 0)
3586             as_warn ("%s", msg);
3587         }
3588       else
3589         {
3590           /* One implementation might need a warning but the other
3591              definitely doesn't.  */
3592           mips_macro_warning.first_frag->fr_subtype |= subtype;
3593         }
3594     }
3595 }
3596
3597 /* Read a macro's relocation codes from *ARGS and store them in *R.
3598    The first argument in *ARGS will be either the code for a single
3599    relocation or -1 followed by the three codes that make up a
3600    composite relocation.  */
3601
3602 static void
3603 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3604 {
3605   int i, next;
3606
3607   next = va_arg (*args, int);
3608   if (next >= 0)
3609     r[0] = (bfd_reloc_code_real_type) next;
3610   else
3611     for (i = 0; i < 3; i++)
3612       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3613 }
3614
3615 /* Build an instruction created by a macro expansion.  This is passed
3616    a pointer to the count of instructions created so far, an
3617    expression, the name of the instruction to build, an operand format
3618    string, and corresponding arguments.  */
3619
3620 static void
3621 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3622 {
3623   const struct mips_opcode *mo;
3624   struct mips_cl_insn insn;
3625   bfd_reloc_code_real_type r[3];
3626   va_list args;
3627
3628   va_start (args, fmt);
3629
3630   if (mips_opts.mips16)
3631     {
3632       mips16_macro_build (ep, name, fmt, &args);
3633       va_end (args);
3634       return;
3635     }
3636
3637   r[0] = BFD_RELOC_UNUSED;
3638   r[1] = BFD_RELOC_UNUSED;
3639   r[2] = BFD_RELOC_UNUSED;
3640   mo = (struct mips_opcode *) hash_find (op_hash, name);
3641   gas_assert (mo);
3642   gas_assert (strcmp (name, mo->name) == 0);
3643
3644   while (1)
3645     {
3646       /* Search until we get a match for NAME.  It is assumed here that
3647          macros will never generate MDMX, MIPS-3D, or MT instructions.  */
3648       if (strcmp (fmt, mo->args) == 0
3649           && mo->pinfo != INSN_MACRO
3650           && is_opcode_valid (mo))
3651         break;
3652
3653       ++mo;
3654       gas_assert (mo->name);
3655       gas_assert (strcmp (name, mo->name) == 0);
3656     }
3657
3658   create_insn (&insn, mo);
3659   for (;;)
3660     {
3661       switch (*fmt++)
3662         {
3663         case '\0':
3664           break;
3665
3666         case ',':
3667         case '(':
3668         case ')':
3669           continue;
3670
3671         case '+':
3672           switch (*fmt++)
3673             {
3674             case 'A':
3675             case 'E':
3676               INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3677               continue;
3678
3679             case 'B':
3680             case 'F':
3681               /* Note that in the macro case, these arguments are already
3682                  in MSB form.  (When handling the instruction in the
3683                  non-macro case, these arguments are sizes from which
3684                  MSB values must be calculated.)  */
3685               INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3686               continue;
3687
3688             case 'C':
3689             case 'G':
3690             case 'H':
3691               /* Note that in the macro case, these arguments are already
3692                  in MSBD form.  (When handling the instruction in the
3693                  non-macro case, these arguments are sizes from which
3694                  MSBD values must be calculated.)  */
3695               INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3696               continue;
3697
3698             case 'Q':
3699               INSERT_OPERAND (SEQI, insn, va_arg (args, int));
3700               continue;
3701
3702             default:
3703               internalError ();
3704             }
3705           continue;
3706
3707         case '2':
3708           INSERT_OPERAND (BP, insn, va_arg (args, int));
3709           continue;
3710
3711         case 't':
3712         case 'w':
3713         case 'E':
3714           INSERT_OPERAND (RT, insn, va_arg (args, int));
3715           continue;
3716
3717         case 'c':
3718           INSERT_OPERAND (CODE, insn, va_arg (args, int));
3719           continue;
3720
3721         case 'T':
3722         case 'W':
3723           INSERT_OPERAND (FT, insn, va_arg (args, int));
3724           continue;
3725
3726         case 'd':
3727         case 'G':
3728         case 'K':
3729           INSERT_OPERAND (RD, insn, va_arg (args, int));
3730           continue;
3731
3732         case 'U':
3733           {
3734             int tmp = va_arg (args, int);
3735
3736             INSERT_OPERAND (RT, insn, tmp);
3737             INSERT_OPERAND (RD, insn, tmp);
3738             continue;
3739           }
3740
3741         case 'V':
3742         case 'S':
3743           INSERT_OPERAND (FS, insn, va_arg (args, int));
3744           continue;
3745
3746         case 'z':
3747           continue;
3748
3749         case '<':
3750           INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3751           continue;
3752
3753         case 'D':
3754           INSERT_OPERAND (FD, insn, va_arg (args, int));
3755           continue;
3756
3757         case 'B':
3758           INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3759           continue;
3760
3761         case 'J':
3762           INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3763           continue;
3764
3765         case 'q':
3766           INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3767           continue;
3768
3769         case 'b':
3770         case 's':
3771         case 'r':
3772         case 'v':
3773           INSERT_OPERAND (RS, insn, va_arg (args, int));
3774           continue;
3775
3776         case 'i':
3777         case 'j':
3778           macro_read_relocs (&args, r);
3779           gas_assert (*r == BFD_RELOC_GPREL16
3780                       || *r == BFD_RELOC_MIPS_HIGHER
3781                       || *r == BFD_RELOC_HI16_S
3782                       || *r == BFD_RELOC_LO16
3783                       || *r == BFD_RELOC_MIPS_GOT_OFST);
3784           continue;
3785
3786         case 'o':
3787           macro_read_relocs (&args, r);
3788           continue;
3789
3790         case 'u':
3791           macro_read_relocs (&args, r);
3792           gas_assert (ep != NULL
3793                       && (ep->X_op == O_constant
3794                           || (ep->X_op == O_symbol
3795                               && (*r == BFD_RELOC_MIPS_HIGHEST
3796                                   || *r == BFD_RELOC_HI16_S
3797                                   || *r == BFD_RELOC_HI16
3798                                   || *r == BFD_RELOC_GPREL16
3799                                   || *r == BFD_RELOC_MIPS_GOT_HI16
3800                                   || *r == BFD_RELOC_MIPS_CALL_HI16))));
3801           continue;
3802
3803         case 'p':
3804           gas_assert (ep != NULL);
3805
3806           /*
3807            * This allows macro() to pass an immediate expression for
3808            * creating short branches without creating a symbol.
3809            *
3810            * We don't allow branch relaxation for these branches, as
3811            * they should only appear in ".set nomacro" anyway.
3812            */
3813           if (ep->X_op == O_constant)
3814             {
3815               if ((ep->X_add_number & 3) != 0)
3816                 as_bad (_("branch to misaligned address (0x%lx)"),
3817                         (unsigned long) ep->X_add_number);
3818               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3819                 as_bad (_("branch address range overflow (0x%lx)"),
3820                         (unsigned long) ep->X_add_number);
3821               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3822               ep = NULL;
3823             }
3824           else
3825             *r = BFD_RELOC_16_PCREL_S2;
3826           continue;
3827
3828         case 'a':
3829           gas_assert (ep != NULL);
3830           *r = BFD_RELOC_MIPS_JMP;
3831           continue;
3832
3833         case 'C':
3834           INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
3835           continue;
3836
3837         case 'k':
3838           INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
3839           continue;
3840
3841         default:
3842           internalError ();
3843         }
3844       break;
3845     }
3846   va_end (args);
3847   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3848
3849   append_insn (&insn, ep, r);
3850 }
3851
3852 static void
3853 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3854                     va_list *args)
3855 {
3856   struct mips_opcode *mo;
3857   struct mips_cl_insn insn;
3858   bfd_reloc_code_real_type r[3]
3859     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3860
3861   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3862   gas_assert (mo);
3863   gas_assert (strcmp (name, mo->name) == 0);
3864
3865   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3866     {
3867       ++mo;
3868       gas_assert (mo->name);
3869       gas_assert (strcmp (name, mo->name) == 0);
3870     }
3871
3872   create_insn (&insn, mo);
3873   for (;;)
3874     {
3875       int c;
3876
3877       c = *fmt++;
3878       switch (c)
3879         {
3880         case '\0':
3881           break;
3882
3883         case ',':
3884         case '(':
3885         case ')':
3886           continue;
3887
3888         case 'y':
3889         case 'w':
3890           MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
3891           continue;
3892
3893         case 'x':
3894         case 'v':
3895           MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
3896           continue;
3897
3898         case 'z':
3899           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
3900           continue;
3901
3902         case 'Z':
3903           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
3904           continue;
3905
3906         case '0':
3907         case 'S':
3908         case 'P':
3909         case 'R':
3910           continue;
3911
3912         case 'X':
3913           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
3914           continue;
3915
3916         case 'Y':
3917           {
3918             int regno;
3919
3920             regno = va_arg (*args, int);
3921             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3922             MIPS16_INSERT_OPERAND (REG32R, insn, regno);
3923           }
3924           continue;
3925
3926         case '<':
3927         case '>':
3928         case '4':
3929         case '5':
3930         case 'H':
3931         case 'W':
3932         case 'D':
3933         case 'j':
3934         case '8':
3935         case 'V':
3936         case 'C':
3937         case 'U':
3938         case 'k':
3939         case 'K':
3940         case 'p':
3941         case 'q':
3942           {
3943             gas_assert (ep != NULL);
3944
3945             if (ep->X_op != O_constant)
3946               *r = (int) BFD_RELOC_UNUSED + c;
3947             else
3948               {
3949                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3950                               FALSE, &insn.insn_opcode, &insn.use_extend,
3951                               &insn.extend);
3952                 ep = NULL;
3953                 *r = BFD_RELOC_UNUSED;
3954               }
3955           }
3956           continue;
3957
3958         case '6':
3959           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
3960           continue;
3961         }
3962
3963       break;
3964     }
3965
3966   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3967
3968   append_insn (&insn, ep, r);
3969 }
3970
3971 /*
3972  * Sign-extend 32-bit mode constants that have bit 31 set and all
3973  * higher bits unset.
3974  */
3975 static void
3976 normalize_constant_expr (expressionS *ex)
3977 {
3978   if (ex->X_op == O_constant
3979       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3980     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3981                         - 0x80000000);
3982 }
3983
3984 /*
3985  * Sign-extend 32-bit mode address offsets that have bit 31 set and
3986  * all higher bits unset.
3987  */
3988 static void
3989 normalize_address_expr (expressionS *ex)
3990 {
3991   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3992         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3993       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3994     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3995                         - 0x80000000);
3996 }
3997
3998 /*
3999  * Generate a "jalr" instruction with a relocation hint to the called
4000  * function.  This occurs in NewABI PIC code.
4001  */
4002 static void
4003 macro_build_jalr (expressionS *ep)
4004 {
4005   char *f = NULL;
4006
4007   if (MIPS_JALR_HINT_P (ep))
4008     {
4009       frag_grow (8);
4010       f = frag_more (0);
4011     }
4012   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
4013   if (MIPS_JALR_HINT_P (ep))
4014     fix_new_exp (frag_now, f - frag_now->fr_literal,
4015                  4, ep, FALSE, BFD_RELOC_MIPS_JALR);
4016 }
4017
4018 /*
4019  * Generate a "lui" instruction.
4020  */
4021 static void
4022 macro_build_lui (expressionS *ep, int regnum)
4023 {
4024   expressionS high_expr;
4025   const struct mips_opcode *mo;
4026   struct mips_cl_insn insn;
4027   bfd_reloc_code_real_type r[3]
4028     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
4029   const char *name = "lui";
4030   const char *fmt = "t,u";
4031
4032   gas_assert (! mips_opts.mips16);
4033
4034   high_expr = *ep;
4035
4036   if (high_expr.X_op == O_constant)
4037     {
4038       /* We can compute the instruction now without a relocation entry.  */
4039       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
4040                                 >> 16) & 0xffff;
4041       *r = BFD_RELOC_UNUSED;
4042     }
4043   else
4044     {
4045       gas_assert (ep->X_op == O_symbol);
4046       /* _gp_disp is a special case, used from s_cpload.
4047          __gnu_local_gp is used if mips_no_shared.  */
4048       gas_assert (mips_pic == NO_PIC
4049               || (! HAVE_NEWABI
4050                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
4051               || (! mips_in_shared
4052                   && strcmp (S_GET_NAME (ep->X_add_symbol),
4053                              "__gnu_local_gp") == 0));
4054       *r = BFD_RELOC_HI16_S;
4055     }
4056
4057   mo = hash_find (op_hash, name);
4058   gas_assert (strcmp (name, mo->name) == 0);
4059   gas_assert (strcmp (fmt, mo->args) == 0);
4060   create_insn (&insn, mo);
4061
4062   insn.insn_opcode = insn.insn_mo->match;
4063   INSERT_OPERAND (RT, insn, regnum);
4064   if (*r == BFD_RELOC_UNUSED)
4065     {
4066       insn.insn_opcode |= high_expr.X_add_number;
4067       append_insn (&insn, NULL, r);
4068     }
4069   else
4070     append_insn (&insn, &high_expr, r);
4071 }
4072
4073 /* Generate a sequence of instructions to do a load or store from a constant
4074    offset off of a base register (breg) into/from a target register (treg),
4075    using AT if necessary.  */
4076 static void
4077 macro_build_ldst_constoffset (expressionS *ep, const char *op,
4078                               int treg, int breg, int dbl)
4079 {
4080   gas_assert (ep->X_op == O_constant);
4081
4082   /* Sign-extending 32-bit constants makes their handling easier.  */
4083   if (!dbl)
4084     normalize_constant_expr (ep);
4085
4086   /* Right now, this routine can only handle signed 32-bit constants.  */
4087   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
4088     as_warn (_("operand overflow"));
4089
4090   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
4091     {
4092       /* Signed 16-bit offset will fit in the op.  Easy!  */
4093       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
4094     }
4095   else
4096     {
4097       /* 32-bit offset, need multiple instructions and AT, like:
4098            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
4099            addu     $tempreg,$tempreg,$breg
4100            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
4101          to handle the complete offset.  */
4102       macro_build_lui (ep, AT);
4103       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
4104       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
4105
4106       if (!mips_opts.at)
4107         as_bad (_("Macro used $at after \".set noat\""));
4108     }
4109 }
4110
4111 /*                      set_at()
4112  * Generates code to set the $at register to true (one)
4113  * if reg is less than the immediate expression.
4114  */
4115 static void
4116 set_at (int reg, int unsignedp)
4117 {
4118   if (imm_expr.X_op == O_constant
4119       && imm_expr.X_add_number >= -0x8000
4120       && imm_expr.X_add_number < 0x8000)
4121     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
4122                  AT, reg, BFD_RELOC_LO16);
4123   else
4124     {
4125       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4126       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
4127     }
4128 }
4129
4130 /* Warn if an expression is not a constant.  */
4131
4132 static void
4133 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
4134 {
4135   if (ex->X_op == O_big)
4136     as_bad (_("unsupported large constant"));
4137   else if (ex->X_op != O_constant)
4138     as_bad (_("Instruction %s requires absolute expression"),
4139             ip->insn_mo->name);
4140
4141   if (HAVE_32BIT_GPRS)
4142     normalize_constant_expr (ex);
4143 }
4144
4145 /* Count the leading zeroes by performing a binary chop. This is a
4146    bulky bit of source, but performance is a LOT better for the
4147    majority of values than a simple loop to count the bits:
4148        for (lcnt = 0; (lcnt < 32); lcnt++)
4149          if ((v) & (1 << (31 - lcnt)))
4150            break;
4151   However it is not code size friendly, and the gain will drop a bit
4152   on certain cached systems.
4153 */
4154 #define COUNT_TOP_ZEROES(v)             \
4155   (((v) & ~0xffff) == 0                 \
4156    ? ((v) & ~0xff) == 0                 \
4157      ? ((v) & ~0xf) == 0                \
4158        ? ((v) & ~0x3) == 0              \
4159          ? ((v) & ~0x1) == 0            \
4160            ? !(v)                       \
4161              ? 32                       \
4162              : 31                       \
4163            : 30                         \
4164          : ((v) & ~0x7) == 0            \
4165            ? 29                         \
4166            : 28                         \
4167        : ((v) & ~0x3f) == 0             \
4168          ? ((v) & ~0x1f) == 0           \
4169            ? 27                         \
4170            : 26                         \
4171          : ((v) & ~0x7f) == 0           \
4172            ? 25                         \
4173            : 24                         \
4174      : ((v) & ~0xfff) == 0              \
4175        ? ((v) & ~0x3ff) == 0            \
4176          ? ((v) & ~0x1ff) == 0          \
4177            ? 23                         \
4178            : 22                         \
4179          : ((v) & ~0x7ff) == 0          \
4180            ? 21                         \
4181            : 20                         \
4182        : ((v) & ~0x3fff) == 0           \
4183          ? ((v) & ~0x1fff) == 0         \
4184            ? 19                         \
4185            : 18                         \
4186          : ((v) & ~0x7fff) == 0         \
4187            ? 17                         \
4188            : 16                         \
4189    : ((v) & ~0xffffff) == 0             \
4190      ? ((v) & ~0xfffff) == 0            \
4191        ? ((v) & ~0x3ffff) == 0          \
4192          ? ((v) & ~0x1ffff) == 0        \
4193            ? 15                         \
4194            : 14                         \
4195          : ((v) & ~0x7ffff) == 0        \
4196            ? 13                         \
4197            : 12                         \
4198        : ((v) & ~0x3fffff) == 0         \
4199          ? ((v) & ~0x1fffff) == 0       \
4200            ? 11                         \
4201            : 10                         \
4202          : ((v) & ~0x7fffff) == 0       \
4203            ? 9                          \
4204            : 8                          \
4205      : ((v) & ~0xfffffff) == 0          \
4206        ? ((v) & ~0x3ffffff) == 0        \
4207          ? ((v) & ~0x1ffffff) == 0      \
4208            ? 7                          \
4209            : 6                          \
4210          : ((v) & ~0x7ffffff) == 0      \
4211            ? 5                          \
4212            : 4                          \
4213        : ((v) & ~0x3fffffff) == 0       \
4214          ? ((v) & ~0x1fffffff) == 0     \
4215            ? 3                          \
4216            : 2                          \
4217          : ((v) & ~0x7fffffff) == 0     \
4218            ? 1                          \
4219            : 0)
4220
4221 /*                      load_register()
4222  *  This routine generates the least number of instructions necessary to load
4223  *  an absolute expression value into a register.
4224  */
4225 static void
4226 load_register (int reg, expressionS *ep, int dbl)
4227 {
4228   int freg;
4229   expressionS hi32, lo32;
4230
4231   if (ep->X_op != O_big)
4232     {
4233       gas_assert (ep->X_op == O_constant);
4234
4235       /* Sign-extending 32-bit constants makes their handling easier.  */
4236       if (!dbl)
4237         normalize_constant_expr (ep);
4238
4239       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
4240         {
4241           /* We can handle 16 bit signed values with an addiu to
4242              $zero.  No need to ever use daddiu here, since $zero and
4243              the result are always correct in 32 bit mode.  */
4244           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4245           return;
4246         }
4247       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
4248         {
4249           /* We can handle 16 bit unsigned values with an ori to
4250              $zero.  */
4251           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4252           return;
4253         }
4254       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
4255         {
4256           /* 32 bit values require an lui.  */
4257           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
4258           if ((ep->X_add_number & 0xffff) != 0)
4259             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4260           return;
4261         }
4262     }
4263
4264   /* The value is larger than 32 bits.  */
4265
4266   if (!dbl || HAVE_32BIT_GPRS)
4267     {
4268       char value[32];
4269
4270       sprintf_vma (value, ep->X_add_number);
4271       as_bad (_("Number (0x%s) larger than 32 bits"), value);
4272       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4273       return;
4274     }
4275
4276   if (ep->X_op != O_big)
4277     {
4278       hi32 = *ep;
4279       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4280       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4281       hi32.X_add_number &= 0xffffffff;
4282       lo32 = *ep;
4283       lo32.X_add_number &= 0xffffffff;
4284     }
4285   else
4286     {
4287       gas_assert (ep->X_add_number > 2);
4288       if (ep->X_add_number == 3)
4289         generic_bignum[3] = 0;
4290       else if (ep->X_add_number > 4)
4291         as_bad (_("Number larger than 64 bits"));
4292       lo32.X_op = O_constant;
4293       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4294       hi32.X_op = O_constant;
4295       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4296     }
4297
4298   if (hi32.X_add_number == 0)
4299     freg = 0;
4300   else
4301     {
4302       int shift, bit;
4303       unsigned long hi, lo;
4304
4305       if (hi32.X_add_number == (offsetT) 0xffffffff)
4306         {
4307           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4308             {
4309               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4310               return;
4311             }
4312           if (lo32.X_add_number & 0x80000000)
4313             {
4314               macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4315               if (lo32.X_add_number & 0xffff)
4316                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4317               return;
4318             }
4319         }
4320
4321       /* Check for 16bit shifted constant.  We know that hi32 is
4322          non-zero, so start the mask on the first bit of the hi32
4323          value.  */
4324       shift = 17;
4325       do
4326         {
4327           unsigned long himask, lomask;
4328
4329           if (shift < 32)
4330             {
4331               himask = 0xffff >> (32 - shift);
4332               lomask = (0xffff << shift) & 0xffffffff;
4333             }
4334           else
4335             {
4336               himask = 0xffff << (shift - 32);
4337               lomask = 0;
4338             }
4339           if ((hi32.X_add_number & ~(offsetT) himask) == 0
4340               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4341             {
4342               expressionS tmp;
4343
4344               tmp.X_op = O_constant;
4345               if (shift < 32)
4346                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4347                                     | (lo32.X_add_number >> shift));
4348               else
4349                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4350               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4351               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4352                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4353               return;
4354             }
4355           ++shift;
4356         }
4357       while (shift <= (64 - 16));
4358
4359       /* Find the bit number of the lowest one bit, and store the
4360          shifted value in hi/lo.  */
4361       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4362       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4363       if (lo != 0)
4364         {
4365           bit = 0;
4366           while ((lo & 1) == 0)
4367             {
4368               lo >>= 1;
4369               ++bit;
4370             }
4371           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4372           hi >>= bit;
4373         }
4374       else
4375         {
4376           bit = 32;
4377           while ((hi & 1) == 0)
4378             {
4379               hi >>= 1;
4380               ++bit;
4381             }
4382           lo = hi;
4383           hi = 0;
4384         }
4385
4386       /* Optimize if the shifted value is a (power of 2) - 1.  */
4387       if ((hi == 0 && ((lo + 1) & lo) == 0)
4388           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4389         {
4390           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4391           if (shift != 0)
4392             {
4393               expressionS tmp;
4394
4395               /* This instruction will set the register to be all
4396                  ones.  */
4397               tmp.X_op = O_constant;
4398               tmp.X_add_number = (offsetT) -1;
4399               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4400               if (bit != 0)
4401                 {
4402                   bit += shift;
4403                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4404                                reg, reg, (bit >= 32) ? bit - 32 : bit);
4405                 }
4406               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4407                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4408               return;
4409             }
4410         }
4411
4412       /* Sign extend hi32 before calling load_register, because we can
4413          generally get better code when we load a sign extended value.  */
4414       if ((hi32.X_add_number & 0x80000000) != 0)
4415         hi32.X_add_number |= ~(offsetT) 0xffffffff;
4416       load_register (reg, &hi32, 0);
4417       freg = reg;
4418     }
4419   if ((lo32.X_add_number & 0xffff0000) == 0)
4420     {
4421       if (freg != 0)
4422         {
4423           macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4424           freg = reg;
4425         }
4426     }
4427   else
4428     {
4429       expressionS mid16;
4430
4431       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4432         {
4433           macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4434           macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4435           return;
4436         }
4437
4438       if (freg != 0)
4439         {
4440           macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4441           freg = reg;
4442         }
4443       mid16 = lo32;
4444       mid16.X_add_number >>= 16;
4445       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4446       macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4447       freg = reg;
4448     }
4449   if ((lo32.X_add_number & 0xffff) != 0)
4450     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4451 }
4452
4453 static inline void
4454 load_delay_nop (void)
4455 {
4456   if (!gpr_interlocks)
4457     macro_build (NULL, "nop", "");
4458 }
4459
4460 /* Load an address into a register.  */
4461
4462 static void
4463 load_address (int reg, expressionS *ep, int *used_at)
4464 {
4465   if (ep->X_op != O_constant
4466       && ep->X_op != O_symbol)
4467     {
4468       as_bad (_("expression too complex"));
4469       ep->X_op = O_constant;
4470     }
4471
4472   if (ep->X_op == O_constant)
4473     {
4474       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4475       return;
4476     }
4477
4478   if (mips_pic == NO_PIC)
4479     {
4480       /* If this is a reference to a GP relative symbol, we want
4481            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
4482          Otherwise we want
4483            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
4484            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4485          If we have an addend, we always use the latter form.
4486
4487          With 64bit address space and a usable $at we want
4488            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4489            lui          $at,<sym>               (BFD_RELOC_HI16_S)
4490            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4491            daddiu       $at,<sym>               (BFD_RELOC_LO16)
4492            dsll32       $reg,0
4493            daddu        $reg,$reg,$at
4494
4495          If $at is already in use, we use a path which is suboptimal
4496          on superscalar processors.
4497            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4498            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4499            dsll         $reg,16
4500            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
4501            dsll         $reg,16
4502            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
4503
4504          For GP relative symbols in 64bit address space we can use
4505          the same sequence as in 32bit address space.  */
4506       if (HAVE_64BIT_SYMBOLS)
4507         {
4508           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4509               && !nopic_need_relax (ep->X_add_symbol, 1))
4510             {
4511               relax_start (ep->X_add_symbol);
4512               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4513                            mips_gp_register, BFD_RELOC_GPREL16);
4514               relax_switch ();
4515             }
4516
4517           if (*used_at == 0 && mips_opts.at)
4518             {
4519               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4520               macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4521               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4522                            BFD_RELOC_MIPS_HIGHER);
4523               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4524               macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4525               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4526               *used_at = 1;
4527             }
4528           else
4529             {
4530               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4531               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4532                            BFD_RELOC_MIPS_HIGHER);
4533               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4534               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4535               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4536               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4537             }
4538
4539           if (mips_relax.sequence)
4540             relax_end ();
4541         }
4542       else
4543         {
4544           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4545               && !nopic_need_relax (ep->X_add_symbol, 1))
4546             {
4547               relax_start (ep->X_add_symbol);
4548               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4549                            mips_gp_register, BFD_RELOC_GPREL16);
4550               relax_switch ();
4551             }
4552           macro_build_lui (ep, reg);
4553           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4554                        reg, reg, BFD_RELOC_LO16);
4555           if (mips_relax.sequence)
4556             relax_end ();
4557         }
4558     }
4559   else if (!mips_big_got)
4560     {
4561       expressionS ex;
4562
4563       /* If this is a reference to an external symbol, we want
4564            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4565          Otherwise we want
4566            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4567            nop
4568            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4569          If there is a constant, it must be added in after.
4570
4571          If we have NewABI, we want
4572            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
4573          unless we're referencing a global symbol with a non-zero
4574          offset, in which case cst must be added separately.  */
4575       if (HAVE_NEWABI)
4576         {
4577           if (ep->X_add_number)
4578             {
4579               ex.X_add_number = ep->X_add_number;
4580               ep->X_add_number = 0;
4581               relax_start (ep->X_add_symbol);
4582               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4583                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4584               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4585                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4586               ex.X_op = O_constant;
4587               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4588                            reg, reg, BFD_RELOC_LO16);
4589               ep->X_add_number = ex.X_add_number;
4590               relax_switch ();
4591             }
4592           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4593                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4594           if (mips_relax.sequence)
4595             relax_end ();
4596         }
4597       else
4598         {
4599           ex.X_add_number = ep->X_add_number;
4600           ep->X_add_number = 0;
4601           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4602                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4603           load_delay_nop ();
4604           relax_start (ep->X_add_symbol);
4605           relax_switch ();
4606           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4607                        BFD_RELOC_LO16);
4608           relax_end ();
4609
4610           if (ex.X_add_number != 0)
4611             {
4612               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4613                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4614               ex.X_op = O_constant;
4615               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4616                            reg, reg, BFD_RELOC_LO16);
4617             }
4618         }
4619     }
4620   else if (mips_big_got)
4621     {
4622       expressionS ex;
4623
4624       /* This is the large GOT case.  If this is a reference to an
4625          external symbol, we want
4626            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
4627            addu         $reg,$reg,$gp
4628            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
4629
4630          Otherwise, for a reference to a local symbol in old ABI, we want
4631            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4632            nop
4633            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4634          If there is a constant, it must be added in after.
4635
4636          In the NewABI, for local symbols, with or without offsets, we want:
4637            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
4638            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
4639       */
4640       if (HAVE_NEWABI)
4641         {
4642           ex.X_add_number = ep->X_add_number;
4643           ep->X_add_number = 0;
4644           relax_start (ep->X_add_symbol);
4645           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4646           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4647                        reg, reg, mips_gp_register);
4648           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4649                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4650           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4651             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4652           else if (ex.X_add_number)
4653             {
4654               ex.X_op = O_constant;
4655               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4656                            BFD_RELOC_LO16);
4657             }
4658
4659           ep->X_add_number = ex.X_add_number;
4660           relax_switch ();
4661           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4662                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4663           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4664                        BFD_RELOC_MIPS_GOT_OFST);
4665           relax_end ();
4666         }
4667       else
4668         {
4669           ex.X_add_number = ep->X_add_number;
4670           ep->X_add_number = 0;
4671           relax_start (ep->X_add_symbol);
4672           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4673           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4674                        reg, reg, mips_gp_register);
4675           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4676                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4677           relax_switch ();
4678           if (reg_needs_delay (mips_gp_register))
4679             {
4680               /* We need a nop before loading from $gp.  This special
4681                  check is required because the lui which starts the main
4682                  instruction stream does not refer to $gp, and so will not
4683                  insert the nop which may be required.  */
4684               macro_build (NULL, "nop", "");
4685             }
4686           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4687                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4688           load_delay_nop ();
4689           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4690                        BFD_RELOC_LO16);
4691           relax_end ();
4692
4693           if (ex.X_add_number != 0)
4694             {
4695               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4696                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4697               ex.X_op = O_constant;
4698               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4699                            BFD_RELOC_LO16);
4700             }
4701         }
4702     }
4703   else
4704     abort ();
4705
4706   if (!mips_opts.at && *used_at == 1)
4707     as_bad (_("Macro used $at after \".set noat\""));
4708 }
4709
4710 /* Move the contents of register SOURCE into register DEST.  */
4711
4712 static void
4713 move_register (int dest, int source)
4714 {
4715   macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4716                dest, source, 0);
4717 }
4718
4719 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4720    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4721    The two alternatives are:
4722
4723    Global symbol                Local sybmol
4724    -------------                ------------
4725    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
4726    ...                          ...
4727    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4728
4729    load_got_offset emits the first instruction and add_got_offset
4730    emits the second for a 16-bit offset or add_got_offset_hilo emits
4731    a sequence to add a 32-bit offset using a scratch register.  */
4732
4733 static void
4734 load_got_offset (int dest, expressionS *local)
4735 {
4736   expressionS global;
4737
4738   global = *local;
4739   global.X_add_number = 0;
4740
4741   relax_start (local->X_add_symbol);
4742   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4743                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4744   relax_switch ();
4745   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4746                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4747   relax_end ();
4748 }
4749
4750 static void
4751 add_got_offset (int dest, expressionS *local)
4752 {
4753   expressionS global;
4754
4755   global.X_op = O_constant;
4756   global.X_op_symbol = NULL;
4757   global.X_add_symbol = NULL;
4758   global.X_add_number = local->X_add_number;
4759
4760   relax_start (local->X_add_symbol);
4761   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4762                dest, dest, BFD_RELOC_LO16);
4763   relax_switch ();
4764   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4765   relax_end ();
4766 }
4767
4768 static void
4769 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4770 {
4771   expressionS global;
4772   int hold_mips_optimize;
4773
4774   global.X_op = O_constant;
4775   global.X_op_symbol = NULL;
4776   global.X_add_symbol = NULL;
4777   global.X_add_number = local->X_add_number;
4778
4779   relax_start (local->X_add_symbol);
4780   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4781   relax_switch ();
4782   /* Set mips_optimize around the lui instruction to avoid
4783      inserting an unnecessary nop after the lw.  */
4784   hold_mips_optimize = mips_optimize;
4785   mips_optimize = 2;
4786   macro_build_lui (&global, tmp);
4787   mips_optimize = hold_mips_optimize;
4788   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4789   relax_end ();
4790
4791   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4792 }
4793
4794 /*
4795  *                      Build macros
4796  *   This routine implements the seemingly endless macro or synthesized
4797  * instructions and addressing modes in the mips assembly language. Many
4798  * of these macros are simple and are similar to each other. These could
4799  * probably be handled by some kind of table or grammar approach instead of
4800  * this verbose method. Others are not simple macros but are more like
4801  * optimizing code generation.
4802  *   One interesting optimization is when several store macros appear
4803  * consecutively that would load AT with the upper half of the same address.
4804  * The ensuing load upper instructions are ommited. This implies some kind
4805  * of global optimization. We currently only optimize within a single macro.
4806  *   For many of the load and store macros if the address is specified as a
4807  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4808  * first load register 'at' with zero and use it as the base register. The
4809  * mips assembler simply uses register $zero. Just one tiny optimization
4810  * we're missing.
4811  */
4812 static void
4813 macro (struct mips_cl_insn *ip)
4814 {
4815   unsigned int treg, sreg, dreg, breg;
4816   unsigned int tempreg;
4817   int mask;
4818   int used_at = 0;
4819   expressionS expr1;
4820   const char *s;
4821   const char *s2;
4822   const char *fmt;
4823   int likely = 0;
4824   int dbl = 0;
4825   int coproc = 0;
4826   int lr = 0;
4827   int imm = 0;
4828   int call = 0;
4829   int off;
4830   offsetT maxnum;
4831   bfd_reloc_code_real_type r;
4832   int hold_mips_optimize;
4833
4834   gas_assert (! mips_opts.mips16);
4835
4836   treg = EXTRACT_OPERAND (RT, *ip);
4837   dreg = EXTRACT_OPERAND (RD, *ip);
4838   sreg = breg = EXTRACT_OPERAND (RS, *ip);
4839   mask = ip->insn_mo->mask;
4840
4841   expr1.X_op = O_constant;
4842   expr1.X_op_symbol = NULL;
4843   expr1.X_add_symbol = NULL;
4844   expr1.X_add_number = 1;
4845
4846   switch (mask)
4847     {
4848     case M_DABS:
4849       dbl = 1;
4850     case M_ABS:
4851       /* bgez $a0,.+12
4852          move v0,$a0
4853          sub v0,$zero,$a0
4854          */
4855
4856       start_noreorder ();
4857
4858       expr1.X_add_number = 8;
4859       macro_build (&expr1, "bgez", "s,p", sreg);
4860       if (dreg == sreg)
4861         macro_build (NULL, "nop", "");
4862       else
4863         move_register (dreg, sreg);
4864       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4865
4866       end_noreorder ();
4867       break;
4868
4869     case M_ADD_I:
4870       s = "addi";
4871       s2 = "add";
4872       goto do_addi;
4873     case M_ADDU_I:
4874       s = "addiu";
4875       s2 = "addu";
4876       goto do_addi;
4877     case M_DADD_I:
4878       dbl = 1;
4879       s = "daddi";
4880       s2 = "dadd";
4881       goto do_addi;
4882     case M_DADDU_I:
4883       dbl = 1;
4884       s = "daddiu";
4885       s2 = "daddu";
4886     do_addi:
4887       if (imm_expr.X_op == O_constant
4888           && imm_expr.X_add_number >= -0x8000
4889           && imm_expr.X_add_number < 0x8000)
4890         {
4891           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4892           break;
4893         }
4894       used_at = 1;
4895       load_register (AT, &imm_expr, dbl);
4896       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4897       break;
4898
4899     case M_AND_I:
4900       s = "andi";
4901       s2 = "and";
4902       goto do_bit;
4903     case M_OR_I:
4904       s = "ori";
4905       s2 = "or";
4906       goto do_bit;
4907     case M_NOR_I:
4908       s = "";
4909       s2 = "nor";
4910       goto do_bit;
4911     case M_XOR_I:
4912       s = "xori";
4913       s2 = "xor";
4914     do_bit:
4915       if (imm_expr.X_op == O_constant
4916           && imm_expr.X_add_number >= 0
4917           && imm_expr.X_add_number < 0x10000)
4918         {
4919           if (mask != M_NOR_I)
4920             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4921           else
4922             {
4923               macro_build (&imm_expr, "ori", "t,r,i",
4924                            treg, sreg, BFD_RELOC_LO16);
4925               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4926             }
4927           break;
4928         }
4929
4930       used_at = 1;
4931       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4932       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4933       break;
4934
4935     case M_BALIGN:
4936       switch (imm_expr.X_add_number)
4937         {
4938         case 0:
4939           macro_build (NULL, "nop", "");
4940           break;
4941         case 2:
4942           macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4943           break;
4944         default:
4945           macro_build (NULL, "balign", "t,s,2", treg, sreg,
4946                        (int) imm_expr.X_add_number);
4947           break;
4948         }
4949       break;
4950
4951     case M_BEQ_I:
4952       s = "beq";
4953       goto beq_i;
4954     case M_BEQL_I:
4955       s = "beql";
4956       likely = 1;
4957       goto beq_i;
4958     case M_BNE_I:
4959       s = "bne";
4960       goto beq_i;
4961     case M_BNEL_I:
4962       s = "bnel";
4963       likely = 1;
4964     beq_i:
4965       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4966         {
4967           macro_build (&offset_expr, s, "s,t,p", sreg, ZERO);
4968           break;
4969         }
4970       used_at = 1;
4971       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4972       macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4973       break;
4974
4975     case M_BGEL:
4976       likely = 1;
4977     case M_BGE:
4978       if (treg == 0)
4979         {
4980           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4981           break;
4982         }
4983       if (sreg == 0)
4984         {
4985           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4986           break;
4987         }
4988       used_at = 1;
4989       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4990       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
4991       break;
4992
4993     case M_BGTL_I:
4994       likely = 1;
4995     case M_BGT_I:
4996       /* Check for > max integer.  */
4997       maxnum = 0x7fffffff;
4998       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4999         {
5000           maxnum <<= 16;
5001           maxnum |= 0xffff;
5002           maxnum <<= 16;
5003           maxnum |= 0xffff;
5004         }
5005       if (imm_expr.X_op == O_constant
5006           && imm_expr.X_add_number >= maxnum
5007           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5008         {
5009         do_false:
5010           /* Result is always false.  */
5011           if (! likely)
5012             macro_build (NULL, "nop", "");
5013           else
5014             macro_build (&offset_expr, "bnel", "s,t,p", ZERO, ZERO);
5015           break;
5016         }
5017       if (imm_expr.X_op != O_constant)
5018         as_bad (_("Unsupported large constant"));
5019       ++imm_expr.X_add_number;
5020       /* FALLTHROUGH */
5021     case M_BGE_I:
5022     case M_BGEL_I:
5023       if (mask == M_BGEL_I)
5024         likely = 1;
5025       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5026         {
5027           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
5028           break;
5029         }
5030       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5031         {
5032           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5033           break;
5034         }
5035       maxnum = 0x7fffffff;
5036       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5037         {
5038           maxnum <<= 16;
5039           maxnum |= 0xffff;
5040           maxnum <<= 16;
5041           maxnum |= 0xffff;
5042         }
5043       maxnum = - maxnum - 1;
5044       if (imm_expr.X_op == O_constant
5045           && imm_expr.X_add_number <= maxnum
5046           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5047         {
5048         do_true:
5049           /* result is always true */
5050           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
5051           macro_build (&offset_expr, "b", "p");
5052           break;
5053         }
5054       used_at = 1;
5055       set_at (sreg, 0);
5056       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5057       break;
5058
5059     case M_BGEUL:
5060       likely = 1;
5061     case M_BGEU:
5062       if (treg == 0)
5063         goto do_true;
5064       if (sreg == 0)
5065         {
5066           macro_build (&offset_expr, likely ? "beql" : "beq",
5067                        "s,t,p", ZERO, treg);
5068           break;
5069         }
5070       used_at = 1;
5071       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5072       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5073       break;
5074
5075     case M_BGTUL_I:
5076       likely = 1;
5077     case M_BGTU_I:
5078       if (sreg == 0
5079           || (HAVE_32BIT_GPRS
5080               && imm_expr.X_op == O_constant
5081               && imm_expr.X_add_number == -1))
5082         goto do_false;
5083       if (imm_expr.X_op != O_constant)
5084         as_bad (_("Unsupported large constant"));
5085       ++imm_expr.X_add_number;
5086       /* FALLTHROUGH */
5087     case M_BGEU_I:
5088     case M_BGEUL_I:
5089       if (mask == M_BGEUL_I)
5090         likely = 1;
5091       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5092         goto do_true;
5093       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5094         {
5095           macro_build (&offset_expr, likely ? "bnel" : "bne",
5096                        "s,t,p", sreg, ZERO);
5097           break;
5098         }
5099       used_at = 1;
5100       set_at (sreg, 1);
5101       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5102       break;
5103
5104     case M_BGTL:
5105       likely = 1;
5106     case M_BGT:
5107       if (treg == 0)
5108         {
5109           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5110           break;
5111         }
5112       if (sreg == 0)
5113         {
5114           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
5115           break;
5116         }
5117       used_at = 1;
5118       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5119       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5120       break;
5121
5122     case M_BGTUL:
5123       likely = 1;
5124     case M_BGTU:
5125       if (treg == 0)
5126         {
5127           macro_build (&offset_expr, likely ? "bnel" : "bne",
5128                        "s,t,p", sreg, ZERO);
5129           break;
5130         }
5131       if (sreg == 0)
5132         goto do_false;
5133       used_at = 1;
5134       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5135       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5136       break;
5137
5138     case M_BLEL:
5139       likely = 1;
5140     case M_BLE:
5141       if (treg == 0)
5142         {
5143           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5144           break;
5145         }
5146       if (sreg == 0)
5147         {
5148           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
5149           break;
5150         }
5151       used_at = 1;
5152       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5153       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5154       break;
5155
5156     case M_BLEL_I:
5157       likely = 1;
5158     case M_BLE_I:
5159       maxnum = 0x7fffffff;
5160       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5161         {
5162           maxnum <<= 16;
5163           maxnum |= 0xffff;
5164           maxnum <<= 16;
5165           maxnum |= 0xffff;
5166         }
5167       if (imm_expr.X_op == O_constant
5168           && imm_expr.X_add_number >= maxnum
5169           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5170         goto do_true;
5171       if (imm_expr.X_op != O_constant)
5172         as_bad (_("Unsupported large constant"));
5173       ++imm_expr.X_add_number;
5174       /* FALLTHROUGH */
5175     case M_BLT_I:
5176     case M_BLTL_I:
5177       if (mask == M_BLTL_I)
5178         likely = 1;
5179       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5180         {
5181           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5182           break;
5183         }
5184       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5185         {
5186           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5187           break;
5188         }
5189       used_at = 1;
5190       set_at (sreg, 0);
5191       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5192       break;
5193
5194     case M_BLEUL:
5195       likely = 1;
5196     case M_BLEU:
5197       if (treg == 0)
5198         {
5199           macro_build (&offset_expr, likely ? "beql" : "beq",
5200                        "s,t,p", sreg, ZERO);
5201           break;
5202         }
5203       if (sreg == 0)
5204         goto do_true;
5205       used_at = 1;
5206       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5207       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5208       break;
5209
5210     case M_BLEUL_I:
5211       likely = 1;
5212     case M_BLEU_I:
5213       if (sreg == 0
5214           || (HAVE_32BIT_GPRS
5215               && imm_expr.X_op == O_constant
5216               && imm_expr.X_add_number == -1))
5217         goto do_true;
5218       if (imm_expr.X_op != O_constant)
5219         as_bad (_("Unsupported large constant"));
5220       ++imm_expr.X_add_number;
5221       /* FALLTHROUGH */
5222     case M_BLTU_I:
5223     case M_BLTUL_I:
5224       if (mask == M_BLTUL_I)
5225         likely = 1;
5226       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5227         goto do_false;
5228       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5229         {
5230           macro_build (&offset_expr, likely ? "beql" : "beq",
5231                        "s,t,p", sreg, ZERO);
5232           break;
5233         }
5234       used_at = 1;
5235       set_at (sreg, 1);
5236       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5237       break;
5238
5239     case M_BLTL:
5240       likely = 1;
5241     case M_BLT:
5242       if (treg == 0)
5243         {
5244           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5245           break;
5246         }
5247       if (sreg == 0)
5248         {
5249           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
5250           break;
5251         }
5252       used_at = 1;
5253       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5254       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5255       break;
5256
5257     case M_BLTUL:
5258       likely = 1;
5259     case M_BLTU:
5260       if (treg == 0)
5261         goto do_false;
5262       if (sreg == 0)
5263         {
5264           macro_build (&offset_expr, likely ? "bnel" : "bne",
5265                        "s,t,p", ZERO, treg);
5266           break;
5267         }
5268       used_at = 1;
5269       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5270       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5271       break;
5272
5273     case M_DEXT:
5274       {
5275         /* Use unsigned arithmetic.  */
5276         addressT pos;
5277         addressT size;
5278
5279         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5280           {
5281             as_bad (_("Unsupported large constant"));
5282             pos = size = 1;
5283           }
5284         else
5285           {
5286             pos = imm_expr.X_add_number;
5287             size = imm2_expr.X_add_number;
5288           }
5289
5290         if (pos > 63)
5291           {
5292             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5293             pos = 1;
5294           }
5295         if (size == 0 || size > 64 || (pos + size - 1) > 63)
5296           {
5297             as_bad (_("Improper extract size (%lu, position %lu)"),
5298                     (unsigned long) size, (unsigned long) pos);
5299             size = 1;
5300           }
5301
5302         if (size <= 32 && pos < 32)
5303           {
5304             s = "dext";
5305             fmt = "t,r,+A,+C";
5306           }
5307         else if (size <= 32)
5308           {
5309             s = "dextu";
5310             fmt = "t,r,+E,+H";
5311           }
5312         else
5313           {
5314             s = "dextm";
5315             fmt = "t,r,+A,+G";
5316           }
5317         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5318                      (int) (size - 1));
5319       }
5320       break;
5321
5322     case M_DINS:
5323       {
5324         /* Use unsigned arithmetic.  */
5325         addressT pos;
5326         addressT size;
5327
5328         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5329           {
5330             as_bad (_("Unsupported large constant"));
5331             pos = size = 1;
5332           }
5333         else
5334           {
5335             pos = imm_expr.X_add_number;
5336             size = imm2_expr.X_add_number;
5337           }
5338
5339         if (pos > 63)
5340           {
5341             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5342             pos = 1;
5343           }
5344         if (size == 0 || size > 64 || (pos + size - 1) > 63)
5345           {
5346             as_bad (_("Improper insert size (%lu, position %lu)"),
5347                     (unsigned long) size, (unsigned long) pos);
5348             size = 1;
5349           }
5350
5351         if (pos < 32 && (pos + size - 1) < 32)
5352           {
5353             s = "dins";
5354             fmt = "t,r,+A,+B";
5355           }
5356         else if (pos >= 32)
5357           {
5358             s = "dinsu";
5359             fmt = "t,r,+E,+F";
5360           }
5361         else
5362           {
5363             s = "dinsm";
5364             fmt = "t,r,+A,+F";
5365           }
5366         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5367                      (int) (pos + size - 1));
5368       }
5369       break;
5370
5371     case M_DDIV_3:
5372       dbl = 1;
5373     case M_DIV_3:
5374       s = "mflo";
5375       goto do_div3;
5376     case M_DREM_3:
5377       dbl = 1;
5378     case M_REM_3:
5379       s = "mfhi";
5380     do_div3:
5381       if (treg == 0)
5382         {
5383           as_warn (_("Divide by zero."));
5384           if (mips_trap)
5385             macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
5386           else
5387             macro_build (NULL, "break", "c", 7);
5388           break;
5389         }
5390
5391       start_noreorder ();
5392       if (mips_trap)
5393         {
5394           macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
5395           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5396         }
5397       else
5398         {
5399           expr1.X_add_number = 8;
5400           macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
5401           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5402           macro_build (NULL, "break", "c", 7);
5403         }
5404       expr1.X_add_number = -1;
5405       used_at = 1;
5406       load_register (AT, &expr1, dbl);
5407       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5408       macro_build (&expr1, "bne", "s,t,p", treg, AT);
5409       if (dbl)
5410         {
5411           expr1.X_add_number = 1;
5412           load_register (AT, &expr1, dbl);
5413           macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5414         }
5415       else
5416         {
5417           expr1.X_add_number = 0x80000000;
5418           macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5419         }
5420       if (mips_trap)
5421         {
5422           macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5423           /* We want to close the noreorder block as soon as possible, so
5424              that later insns are available for delay slot filling.  */
5425           end_noreorder ();
5426         }
5427       else
5428         {
5429           expr1.X_add_number = 8;
5430           macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5431           macro_build (NULL, "nop", "");
5432
5433           /* We want to close the noreorder block as soon as possible, so
5434              that later insns are available for delay slot filling.  */
5435           end_noreorder ();
5436
5437           macro_build (NULL, "break", "c", 6);
5438         }
5439       macro_build (NULL, s, "d", dreg);
5440       break;
5441
5442     case M_DIV_3I:
5443       s = "div";
5444       s2 = "mflo";
5445       goto do_divi;
5446     case M_DIVU_3I:
5447       s = "divu";
5448       s2 = "mflo";
5449       goto do_divi;
5450     case M_REM_3I:
5451       s = "div";
5452       s2 = "mfhi";
5453       goto do_divi;
5454     case M_REMU_3I:
5455       s = "divu";
5456       s2 = "mfhi";
5457       goto do_divi;
5458     case M_DDIV_3I:
5459       dbl = 1;
5460       s = "ddiv";
5461       s2 = "mflo";
5462       goto do_divi;
5463     case M_DDIVU_3I:
5464       dbl = 1;
5465       s = "ddivu";
5466       s2 = "mflo";
5467       goto do_divi;
5468     case M_DREM_3I:
5469       dbl = 1;
5470       s = "ddiv";
5471       s2 = "mfhi";
5472       goto do_divi;
5473     case M_DREMU_3I:
5474       dbl = 1;
5475       s = "ddivu";
5476       s2 = "mfhi";
5477     do_divi:
5478       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5479         {
5480           as_warn (_("Divide by zero."));
5481           if (mips_trap)
5482             macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
5483           else
5484             macro_build (NULL, "break", "c", 7);
5485           break;
5486         }
5487       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5488         {
5489           if (strcmp (s2, "mflo") == 0)
5490             move_register (dreg, sreg);
5491           else
5492             move_register (dreg, ZERO);
5493           break;
5494         }
5495       if (imm_expr.X_op == O_constant
5496           && imm_expr.X_add_number == -1
5497           && s[strlen (s) - 1] != 'u')
5498         {
5499           if (strcmp (s2, "mflo") == 0)
5500             {
5501               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5502             }
5503           else
5504             move_register (dreg, ZERO);
5505           break;
5506         }
5507
5508       used_at = 1;
5509       load_register (AT, &imm_expr, dbl);
5510       macro_build (NULL, s, "z,s,t", sreg, AT);
5511       macro_build (NULL, s2, "d", dreg);
5512       break;
5513
5514     case M_DIVU_3:
5515       s = "divu";
5516       s2 = "mflo";
5517       goto do_divu3;
5518     case M_REMU_3:
5519       s = "divu";
5520       s2 = "mfhi";
5521       goto do_divu3;
5522     case M_DDIVU_3:
5523       s = "ddivu";
5524       s2 = "mflo";
5525       goto do_divu3;
5526     case M_DREMU_3:
5527       s = "ddivu";
5528       s2 = "mfhi";
5529     do_divu3:
5530       start_noreorder ();
5531       if (mips_trap)
5532         {
5533           macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
5534           macro_build (NULL, s, "z,s,t", sreg, treg);
5535           /* We want to close the noreorder block as soon as possible, so
5536              that later insns are available for delay slot filling.  */
5537           end_noreorder ();
5538         }
5539       else
5540         {
5541           expr1.X_add_number = 8;
5542           macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
5543           macro_build (NULL, s, "z,s,t", sreg, treg);
5544
5545           /* We want to close the noreorder block as soon as possible, so
5546              that later insns are available for delay slot filling.  */
5547           end_noreorder ();
5548           macro_build (NULL, "break", "c", 7);
5549         }
5550       macro_build (NULL, s2, "d", dreg);
5551       break;
5552
5553     case M_DLCA_AB:
5554       dbl = 1;
5555     case M_LCA_AB:
5556       call = 1;
5557       goto do_la;
5558     case M_DLA_AB:
5559       dbl = 1;
5560     case M_LA_AB:
5561     do_la:
5562       /* Load the address of a symbol into a register.  If breg is not
5563          zero, we then add a base register to it.  */
5564
5565       if (dbl && HAVE_32BIT_GPRS)
5566         as_warn (_("dla used to load 32-bit register"));
5567
5568       if (!dbl && HAVE_64BIT_OBJECTS)
5569         as_warn (_("la used to load 64-bit address"));
5570
5571       if (offset_expr.X_op == O_constant
5572           && offset_expr.X_add_number >= -0x8000
5573           && offset_expr.X_add_number < 0x8000)
5574         {
5575           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5576                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
5577           break;
5578         }
5579
5580       if (mips_opts.at && (treg == breg))
5581         {
5582           tempreg = AT;
5583           used_at = 1;
5584         }
5585       else
5586         {
5587           tempreg = treg;
5588         }
5589
5590       if (offset_expr.X_op != O_symbol
5591           && offset_expr.X_op != O_constant)
5592         {
5593           as_bad (_("Expression too complex"));
5594           offset_expr.X_op = O_constant;
5595         }
5596
5597       if (offset_expr.X_op == O_constant)
5598         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5599       else if (mips_pic == NO_PIC)
5600         {
5601           /* If this is a reference to a GP relative symbol, we want
5602                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
5603              Otherwise we want
5604                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5605                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5606              If we have a constant, we need two instructions anyhow,
5607              so we may as well always use the latter form.
5608
5609              With 64bit address space and a usable $at we want
5610                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5611                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5612                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5613                daddiu   $at,<sym>               (BFD_RELOC_LO16)
5614                dsll32   $tempreg,0
5615                daddu    $tempreg,$tempreg,$at
5616
5617              If $at is already in use, we use a path which is suboptimal
5618              on superscalar processors.
5619                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5620                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5621                dsll     $tempreg,16
5622                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5623                dsll     $tempreg,16
5624                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
5625
5626              For GP relative symbols in 64bit address space we can use
5627              the same sequence as in 32bit address space.  */
5628           if (HAVE_64BIT_SYMBOLS)
5629             {
5630               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5631                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5632                 {
5633                   relax_start (offset_expr.X_add_symbol);
5634                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5635                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5636                   relax_switch ();
5637                 }
5638
5639               if (used_at == 0 && mips_opts.at)
5640                 {
5641                   macro_build (&offset_expr, "lui", "t,u",
5642                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5643                   macro_build (&offset_expr, "lui", "t,u",
5644                                AT, BFD_RELOC_HI16_S);
5645                   macro_build (&offset_expr, "daddiu", "t,r,j",
5646                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5647                   macro_build (&offset_expr, "daddiu", "t,r,j",
5648                                AT, AT, BFD_RELOC_LO16);
5649                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5650                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5651                   used_at = 1;
5652                 }
5653               else
5654                 {
5655                   macro_build (&offset_expr, "lui", "t,u",
5656                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5657                   macro_build (&offset_expr, "daddiu", "t,r,j",
5658                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5659                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5660                   macro_build (&offset_expr, "daddiu", "t,r,j",
5661                                tempreg, tempreg, BFD_RELOC_HI16_S);
5662                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5663                   macro_build (&offset_expr, "daddiu", "t,r,j",
5664                                tempreg, tempreg, BFD_RELOC_LO16);
5665                 }
5666
5667               if (mips_relax.sequence)
5668                 relax_end ();
5669             }
5670           else
5671             {
5672               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5673                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5674                 {
5675                   relax_start (offset_expr.X_add_symbol);
5676                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5677                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5678                   relax_switch ();
5679                 }
5680               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5681                 as_bad (_("Offset too large"));
5682               macro_build_lui (&offset_expr, tempreg);
5683               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5684                            tempreg, tempreg, BFD_RELOC_LO16);
5685               if (mips_relax.sequence)
5686                 relax_end ();
5687             }
5688         }
5689       else if (!mips_big_got && !HAVE_NEWABI)
5690         {
5691           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5692
5693           /* If this is a reference to an external symbol, and there
5694              is no constant, we want
5695                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5696              or for lca or if tempreg is PIC_CALL_REG
5697                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5698              For a local symbol, we want
5699                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5700                nop
5701                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5702
5703              If we have a small constant, and this is a reference to
5704              an external symbol, we want
5705                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5706                nop
5707                addiu    $tempreg,$tempreg,<constant>
5708              For a local symbol, we want the same instruction
5709              sequence, but we output a BFD_RELOC_LO16 reloc on the
5710              addiu instruction.
5711
5712              If we have a large constant, and this is a reference to
5713              an external symbol, we want
5714                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5715                lui      $at,<hiconstant>
5716                addiu    $at,$at,<loconstant>
5717                addu     $tempreg,$tempreg,$at
5718              For a local symbol, we want the same instruction
5719              sequence, but we output a BFD_RELOC_LO16 reloc on the
5720              addiu instruction.
5721            */
5722
5723           if (offset_expr.X_add_number == 0)
5724             {
5725               if (mips_pic == SVR4_PIC
5726                   && breg == 0
5727                   && (call || tempreg == PIC_CALL_REG))
5728                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5729
5730               relax_start (offset_expr.X_add_symbol);
5731               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5732                            lw_reloc_type, mips_gp_register);
5733               if (breg != 0)
5734                 {
5735                   /* We're going to put in an addu instruction using
5736                      tempreg, so we may as well insert the nop right
5737                      now.  */
5738                   load_delay_nop ();
5739                 }
5740               relax_switch ();
5741               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5742                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5743               load_delay_nop ();
5744               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5745                            tempreg, tempreg, BFD_RELOC_LO16);
5746               relax_end ();
5747               /* FIXME: If breg == 0, and the next instruction uses
5748                  $tempreg, then if this variant case is used an extra
5749                  nop will be generated.  */
5750             }
5751           else if (offset_expr.X_add_number >= -0x8000
5752                    && offset_expr.X_add_number < 0x8000)
5753             {
5754               load_got_offset (tempreg, &offset_expr);
5755               load_delay_nop ();
5756               add_got_offset (tempreg, &offset_expr);
5757             }
5758           else
5759             {
5760               expr1.X_add_number = offset_expr.X_add_number;
5761               offset_expr.X_add_number =
5762                 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5763               load_got_offset (tempreg, &offset_expr);
5764               offset_expr.X_add_number = expr1.X_add_number;
5765               /* If we are going to add in a base register, and the
5766                  target register and the base register are the same,
5767                  then we are using AT as a temporary register.  Since
5768                  we want to load the constant into AT, we add our
5769                  current AT (from the global offset table) and the
5770                  register into the register now, and pretend we were
5771                  not using a base register.  */
5772               if (breg == treg)
5773                 {
5774                   load_delay_nop ();
5775                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5776                                treg, AT, breg);
5777                   breg = 0;
5778                   tempreg = treg;
5779                 }
5780               add_got_offset_hilo (tempreg, &offset_expr, AT);
5781               used_at = 1;
5782             }
5783         }
5784       else if (!mips_big_got && HAVE_NEWABI)
5785         {
5786           int add_breg_early = 0;
5787
5788           /* If this is a reference to an external, and there is no
5789              constant, or local symbol (*), with or without a
5790              constant, we want
5791                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5792              or for lca or if tempreg is PIC_CALL_REG
5793                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5794
5795              If we have a small constant, and this is a reference to
5796              an external symbol, we want
5797                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5798                addiu    $tempreg,$tempreg,<constant>
5799
5800              If we have a large constant, and this is a reference to
5801              an external symbol, we want
5802                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5803                lui      $at,<hiconstant>
5804                addiu    $at,$at,<loconstant>
5805                addu     $tempreg,$tempreg,$at
5806
5807              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5808              local symbols, even though it introduces an additional
5809              instruction.  */
5810
5811           if (offset_expr.X_add_number)
5812             {
5813               expr1.X_add_number = offset_expr.X_add_number;
5814               offset_expr.X_add_number = 0;
5815
5816               relax_start (offset_expr.X_add_symbol);
5817               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5818                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5819
5820               if (expr1.X_add_number >= -0x8000
5821                   && expr1.X_add_number < 0x8000)
5822                 {
5823                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5824                                tempreg, tempreg, BFD_RELOC_LO16);
5825                 }
5826               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5827                 {
5828                   /* If we are going to add in a base register, and the
5829                      target register and the base register are the same,
5830                      then we are using AT as a temporary register.  Since
5831                      we want to load the constant into AT, we add our
5832                      current AT (from the global offset table) and the
5833                      register into the register now, and pretend we were
5834                      not using a base register.  */
5835                   if (breg != treg)
5836                     dreg = tempreg;
5837                   else
5838                     {
5839                       gas_assert (tempreg == AT);
5840                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5841                                    treg, AT, breg);
5842                       dreg = treg;
5843                       add_breg_early = 1;
5844                     }
5845
5846                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5847                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5848                                dreg, dreg, AT);
5849
5850                   used_at = 1;
5851                 }
5852               else
5853                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5854
5855               relax_switch ();
5856               offset_expr.X_add_number = expr1.X_add_number;
5857
5858               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5859                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5860               if (add_breg_early)
5861                 {
5862                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5863                                treg, tempreg, breg);
5864                   breg = 0;
5865                   tempreg = treg;
5866                 }
5867               relax_end ();
5868             }
5869           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5870             {
5871               relax_start (offset_expr.X_add_symbol);
5872               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5873                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
5874               relax_switch ();
5875               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5876                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5877               relax_end ();
5878             }
5879           else
5880             {
5881               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5882                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5883             }
5884         }
5885       else if (mips_big_got && !HAVE_NEWABI)
5886         {
5887           int gpdelay;
5888           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5889           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5890           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5891
5892           /* This is the large GOT case.  If this is a reference to an
5893              external symbol, and there is no constant, we want
5894                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5895                addu     $tempreg,$tempreg,$gp
5896                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5897              or for lca or if tempreg is PIC_CALL_REG
5898                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5899                addu     $tempreg,$tempreg,$gp
5900                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5901              For a local symbol, we want
5902                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5903                nop
5904                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5905
5906              If we have a small constant, and this is a reference to
5907              an external symbol, we want
5908                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5909                addu     $tempreg,$tempreg,$gp
5910                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5911                nop
5912                addiu    $tempreg,$tempreg,<constant>
5913              For a local symbol, we want
5914                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5915                nop
5916                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5917
5918              If we have a large constant, and this is a reference to
5919              an external symbol, we want
5920                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5921                addu     $tempreg,$tempreg,$gp
5922                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5923                lui      $at,<hiconstant>
5924                addiu    $at,$at,<loconstant>
5925                addu     $tempreg,$tempreg,$at
5926              For a local symbol, we want
5927                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5928                lui      $at,<hiconstant>
5929                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
5930                addu     $tempreg,$tempreg,$at
5931           */
5932
5933           expr1.X_add_number = offset_expr.X_add_number;
5934           offset_expr.X_add_number = 0;
5935           relax_start (offset_expr.X_add_symbol);
5936           gpdelay = reg_needs_delay (mips_gp_register);
5937           if (expr1.X_add_number == 0 && breg == 0
5938               && (call || tempreg == PIC_CALL_REG))
5939             {
5940               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5941               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5942             }
5943           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5944           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5945                        tempreg, tempreg, mips_gp_register);
5946           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5947                        tempreg, lw_reloc_type, tempreg);
5948           if (expr1.X_add_number == 0)
5949             {
5950               if (breg != 0)
5951                 {
5952                   /* We're going to put in an addu instruction using
5953                      tempreg, so we may as well insert the nop right
5954                      now.  */
5955                   load_delay_nop ();
5956                 }
5957             }
5958           else if (expr1.X_add_number >= -0x8000
5959                    && expr1.X_add_number < 0x8000)
5960             {
5961               load_delay_nop ();
5962               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5963                            tempreg, tempreg, BFD_RELOC_LO16);
5964             }
5965           else
5966             {
5967               /* If we are going to add in a base register, and the
5968                  target register and the base register are the same,
5969                  then we are using AT as a temporary register.  Since
5970                  we want to load the constant into AT, we add our
5971                  current AT (from the global offset table) and the
5972                  register into the register now, and pretend we were
5973                  not using a base register.  */
5974               if (breg != treg)
5975                 dreg = tempreg;
5976               else
5977                 {
5978                   gas_assert (tempreg == AT);
5979                   load_delay_nop ();
5980                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5981                                treg, AT, breg);
5982                   dreg = treg;
5983                 }
5984
5985               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5986               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5987
5988               used_at = 1;
5989             }
5990           offset_expr.X_add_number =
5991             ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5992           relax_switch ();
5993
5994           if (gpdelay)
5995             {
5996               /* This is needed because this instruction uses $gp, but
5997                  the first instruction on the main stream does not.  */
5998               macro_build (NULL, "nop", "");
5999             }
6000
6001           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6002                        local_reloc_type, mips_gp_register);
6003           if (expr1.X_add_number >= -0x8000
6004               && expr1.X_add_number < 0x8000)
6005             {
6006               load_delay_nop ();
6007               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6008                            tempreg, tempreg, BFD_RELOC_LO16);
6009               /* FIXME: If add_number is 0, and there was no base
6010                  register, the external symbol case ended with a load,
6011                  so if the symbol turns out to not be external, and
6012                  the next instruction uses tempreg, an unnecessary nop
6013                  will be inserted.  */
6014             }
6015           else
6016             {
6017               if (breg == treg)
6018                 {
6019                   /* We must add in the base register now, as in the
6020                      external symbol case.  */
6021                   gas_assert (tempreg == AT);
6022                   load_delay_nop ();
6023                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6024                                treg, AT, breg);
6025                   tempreg = treg;
6026                   /* We set breg to 0 because we have arranged to add
6027                      it in in both cases.  */
6028                   breg = 0;
6029                 }
6030
6031               macro_build_lui (&expr1, AT);
6032               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6033                            AT, AT, BFD_RELOC_LO16);
6034               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6035                            tempreg, tempreg, AT);
6036               used_at = 1;
6037             }
6038           relax_end ();
6039         }
6040       else if (mips_big_got && HAVE_NEWABI)
6041         {
6042           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
6043           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
6044           int add_breg_early = 0;
6045
6046           /* This is the large GOT case.  If this is a reference to an
6047              external symbol, and there is no constant, we want
6048                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6049                add      $tempreg,$tempreg,$gp
6050                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6051              or for lca or if tempreg is PIC_CALL_REG
6052                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
6053                add      $tempreg,$tempreg,$gp
6054                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
6055
6056              If we have a small constant, and this is a reference to
6057              an external symbol, we want
6058                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6059                add      $tempreg,$tempreg,$gp
6060                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6061                addi     $tempreg,$tempreg,<constant>
6062
6063              If we have a large constant, and this is a reference to
6064              an external symbol, we want
6065                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6066                addu     $tempreg,$tempreg,$gp
6067                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6068                lui      $at,<hiconstant>
6069                addi     $at,$at,<loconstant>
6070                add      $tempreg,$tempreg,$at
6071
6072              If we have NewABI, and we know it's a local symbol, we want
6073                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
6074                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
6075              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
6076
6077           relax_start (offset_expr.X_add_symbol);
6078
6079           expr1.X_add_number = offset_expr.X_add_number;
6080           offset_expr.X_add_number = 0;
6081
6082           if (expr1.X_add_number == 0 && breg == 0
6083               && (call || tempreg == PIC_CALL_REG))
6084             {
6085               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6086               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6087             }
6088           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6089           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6090                        tempreg, tempreg, mips_gp_register);
6091           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6092                        tempreg, lw_reloc_type, tempreg);
6093
6094           if (expr1.X_add_number == 0)
6095             ;
6096           else if (expr1.X_add_number >= -0x8000
6097                    && expr1.X_add_number < 0x8000)
6098             {
6099               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6100                            tempreg, tempreg, BFD_RELOC_LO16);
6101             }
6102           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
6103             {
6104               /* If we are going to add in a base register, and the
6105                  target register and the base register are the same,
6106                  then we are using AT as a temporary register.  Since
6107                  we want to load the constant into AT, we add our
6108                  current AT (from the global offset table) and the
6109                  register into the register now, and pretend we were
6110                  not using a base register.  */
6111               if (breg != treg)
6112                 dreg = tempreg;
6113               else
6114                 {
6115                   gas_assert (tempreg == AT);
6116                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6117                                treg, AT, breg);
6118                   dreg = treg;
6119                   add_breg_early = 1;
6120                 }
6121
6122               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6123               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
6124
6125               used_at = 1;
6126             }
6127           else
6128             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6129
6130           relax_switch ();
6131           offset_expr.X_add_number = expr1.X_add_number;
6132           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6133                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6134           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6135                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
6136           if (add_breg_early)
6137             {
6138               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6139                            treg, tempreg, breg);
6140               breg = 0;
6141               tempreg = treg;
6142             }
6143           relax_end ();
6144         }
6145       else
6146         abort ();
6147
6148       if (breg != 0)
6149         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
6150       break;
6151
6152     case M_MSGSND:
6153       {
6154         unsigned long temp = (treg << 16) | (0x01);
6155         macro_build (NULL, "c2", "C", temp);
6156       }
6157       break;
6158
6159     case M_MSGLD:
6160       {
6161         unsigned long temp = (0x02);
6162         macro_build (NULL, "c2", "C", temp);
6163       }
6164       break;
6165
6166     case M_MSGLD_T:
6167       {
6168         unsigned long temp = (treg << 16) | (0x02);
6169         macro_build (NULL, "c2", "C", temp);
6170       }
6171       break;
6172
6173     case M_MSGWAIT:
6174       macro_build (NULL, "c2", "C", 3);
6175       break;
6176
6177     case M_MSGWAIT_T:
6178       {
6179         unsigned long temp = (treg << 16) | 0x03;
6180         macro_build (NULL, "c2", "C", temp);
6181       }
6182       break;
6183
6184     case M_J_A:
6185       /* The j instruction may not be used in PIC code, since it
6186          requires an absolute address.  We convert it to a b
6187          instruction.  */
6188       if (mips_pic == NO_PIC)
6189         macro_build (&offset_expr, "j", "a");
6190       else
6191         macro_build (&offset_expr, "b", "p");
6192       break;
6193
6194       /* The jal instructions must be handled as macros because when
6195          generating PIC code they expand to multi-instruction
6196          sequences.  Normally they are simple instructions.  */
6197     case M_JAL_1:
6198       dreg = RA;
6199       /* Fall through.  */
6200     case M_JAL_2:
6201       if (mips_pic == NO_PIC)
6202         macro_build (NULL, "jalr", "d,s", dreg, sreg);
6203       else
6204         {
6205           if (sreg != PIC_CALL_REG)
6206             as_warn (_("MIPS PIC call to register other than $25"));
6207
6208           macro_build (NULL, "jalr", "d,s", dreg, sreg);
6209           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
6210             {
6211               if (mips_cprestore_offset < 0)
6212                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6213               else
6214                 {
6215                   if (!mips_frame_reg_valid)
6216                     {
6217                       as_warn (_("No .frame pseudo-op used in PIC code"));
6218                       /* Quiet this warning.  */
6219                       mips_frame_reg_valid = 1;
6220                     }
6221                   if (!mips_cprestore_valid)
6222                     {
6223                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6224                       /* Quiet this warning.  */
6225                       mips_cprestore_valid = 1;
6226                     }
6227                   if (mips_opts.noreorder)
6228                     macro_build (NULL, "nop", "");
6229                   expr1.X_add_number = mips_cprestore_offset;
6230                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6231                                                 mips_gp_register,
6232                                                 mips_frame_reg,
6233                                                 HAVE_64BIT_ADDRESSES);
6234                 }
6235             }
6236         }
6237
6238       break;
6239
6240     case M_JAL_A:
6241       if (mips_pic == NO_PIC)
6242         macro_build (&offset_expr, "jal", "a");
6243       else if (mips_pic == SVR4_PIC)
6244         {
6245           /* If this is a reference to an external symbol, and we are
6246              using a small GOT, we want
6247                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
6248                nop
6249                jalr     $ra,$25
6250                nop
6251                lw       $gp,cprestore($sp)
6252              The cprestore value is set using the .cprestore
6253              pseudo-op.  If we are using a big GOT, we want
6254                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
6255                addu     $25,$25,$gp
6256                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
6257                nop
6258                jalr     $ra,$25
6259                nop
6260                lw       $gp,cprestore($sp)
6261              If the symbol is not external, we want
6262                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6263                nop
6264                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
6265                jalr     $ra,$25
6266                nop
6267                lw $gp,cprestore($sp)
6268
6269              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
6270              sequences above, minus nops, unless the symbol is local,
6271              which enables us to use GOT_PAGE/GOT_OFST (big got) or
6272              GOT_DISP.  */
6273           if (HAVE_NEWABI)
6274             {
6275               if (!mips_big_got)
6276                 {
6277                   relax_start (offset_expr.X_add_symbol);
6278                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6279                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6280                                mips_gp_register);
6281                   relax_switch ();
6282                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6283                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
6284                                mips_gp_register);
6285                   relax_end ();
6286                 }
6287               else
6288                 {
6289                   relax_start (offset_expr.X_add_symbol);
6290                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6291                                BFD_RELOC_MIPS_CALL_HI16);
6292                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6293                                PIC_CALL_REG, mips_gp_register);
6294                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6295                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6296                                PIC_CALL_REG);
6297                   relax_switch ();
6298                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6299                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6300                                mips_gp_register);
6301                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6302                                PIC_CALL_REG, PIC_CALL_REG,
6303                                BFD_RELOC_MIPS_GOT_OFST);
6304                   relax_end ();
6305                 }
6306
6307               macro_build_jalr (&offset_expr);
6308             }
6309           else
6310             {
6311               relax_start (offset_expr.X_add_symbol);
6312               if (!mips_big_got)
6313                 {
6314                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6315                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6316                                mips_gp_register);
6317                   load_delay_nop ();
6318                   relax_switch ();
6319                 }
6320               else
6321                 {
6322                   int gpdelay;
6323
6324                   gpdelay = reg_needs_delay (mips_gp_register);
6325                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6326                                BFD_RELOC_MIPS_CALL_HI16);
6327                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6328                                PIC_CALL_REG, mips_gp_register);
6329                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6330                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6331                                PIC_CALL_REG);
6332                   load_delay_nop ();
6333                   relax_switch ();
6334                   if (gpdelay)
6335                     macro_build (NULL, "nop", "");
6336                 }
6337               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6338                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6339                            mips_gp_register);
6340               load_delay_nop ();
6341               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6342                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6343               relax_end ();
6344               macro_build_jalr (&offset_expr);
6345
6346               if (mips_cprestore_offset < 0)
6347                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6348               else
6349                 {
6350                   if (!mips_frame_reg_valid)
6351                     {
6352                       as_warn (_("No .frame pseudo-op used in PIC code"));
6353                       /* Quiet this warning.  */
6354                       mips_frame_reg_valid = 1;
6355                     }
6356                   if (!mips_cprestore_valid)
6357                     {
6358                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6359                       /* Quiet this warning.  */
6360                       mips_cprestore_valid = 1;
6361                     }
6362                   if (mips_opts.noreorder)
6363                     macro_build (NULL, "nop", "");
6364                   expr1.X_add_number = mips_cprestore_offset;
6365                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6366                                                 mips_gp_register,
6367                                                 mips_frame_reg,
6368                                                 HAVE_64BIT_ADDRESSES);
6369                 }
6370             }
6371         }
6372       else if (mips_pic == VXWORKS_PIC)
6373         as_bad (_("Non-PIC jump used in PIC library"));
6374       else
6375         abort ();
6376
6377       break;
6378
6379     case M_LB_AB:
6380       s = "lb";
6381       goto ld;
6382     case M_LBU_AB:
6383       s = "lbu";
6384       goto ld;
6385     case M_LH_AB:
6386       s = "lh";
6387       goto ld;
6388     case M_LHU_AB:
6389       s = "lhu";
6390       goto ld;
6391     case M_LW_AB:
6392       s = "lw";
6393       goto ld;
6394     case M_LWC0_AB:
6395       s = "lwc0";
6396       /* Itbl support may require additional care here.  */
6397       coproc = 1;
6398       goto ld;
6399     case M_LWC1_AB:
6400       s = "lwc1";
6401       /* Itbl support may require additional care here.  */
6402       coproc = 1;
6403       goto ld;
6404     case M_LWC2_AB:
6405       s = "lwc2";
6406       /* Itbl support may require additional care here.  */
6407       coproc = 1;
6408       goto ld;
6409     case M_LWC3_AB:
6410       s = "lwc3";
6411       /* Itbl support may require additional care here.  */
6412       coproc = 1;
6413       goto ld;
6414     case M_LWL_AB:
6415       s = "lwl";
6416       lr = 1;
6417       goto ld;
6418     case M_LWR_AB:
6419       s = "lwr";
6420       lr = 1;
6421       goto ld;
6422     case M_LDC1_AB:
6423       s = "ldc1";
6424       /* Itbl support may require additional care here.  */
6425       coproc = 1;
6426       goto ld;
6427     case M_LDC2_AB:
6428       s = "ldc2";
6429       /* Itbl support may require additional care here.  */
6430       coproc = 1;
6431       goto ld;
6432     case M_LDC3_AB:
6433       s = "ldc3";
6434       /* Itbl support may require additional care here.  */
6435       coproc = 1;
6436       goto ld;
6437     case M_LDL_AB:
6438       s = "ldl";
6439       lr = 1;
6440       goto ld;
6441     case M_LDR_AB:
6442       s = "ldr";
6443       lr = 1;
6444       goto ld;
6445     case M_LL_AB:
6446       s = "ll";
6447       goto ld;
6448     case M_LLD_AB:
6449       s = "lld";
6450       goto ld;
6451     case M_LWU_AB:
6452       s = "lwu";
6453     ld:
6454       if (breg == treg || coproc || lr)
6455         {
6456           tempreg = AT;
6457           used_at = 1;
6458         }
6459       else
6460         {
6461           tempreg = treg;
6462         }
6463       goto ld_st;
6464     case M_SB_AB:
6465       s = "sb";
6466       goto st;
6467     case M_SH_AB:
6468       s = "sh";
6469       goto st;
6470     case M_SW_AB:
6471       s = "sw";
6472       goto st;
6473     case M_SWC0_AB:
6474       s = "swc0";
6475       /* Itbl support may require additional care here.  */
6476       coproc = 1;
6477       goto st;
6478     case M_SWC1_AB:
6479       s = "swc1";
6480       /* Itbl support may require additional care here.  */
6481       coproc = 1;
6482       goto st;
6483     case M_SWC2_AB:
6484       s = "swc2";
6485       /* Itbl support may require additional care here.  */
6486       coproc = 1;
6487       goto st;
6488     case M_SWC3_AB:
6489       s = "swc3";
6490       /* Itbl support may require additional care here.  */
6491       coproc = 1;
6492       goto st;
6493     case M_SWL_AB:
6494       s = "swl";
6495       goto st;
6496     case M_SWR_AB:
6497       s = "swr";
6498       goto st;
6499     case M_SC_AB:
6500       s = "sc";
6501       goto st;
6502     case M_SCD_AB:
6503       s = "scd";
6504       goto st;
6505     case M_CACHE_AB:
6506       s = "cache";
6507       goto st;
6508     case M_SDC1_AB:
6509       s = "sdc1";
6510       coproc = 1;
6511       /* Itbl support may require additional care here.  */
6512       goto st;
6513     case M_SDC2_AB:
6514       s = "sdc2";
6515       /* Itbl support may require additional care here.  */
6516       coproc = 1;
6517       goto st;
6518     case M_SDC3_AB:
6519       s = "sdc3";
6520       /* Itbl support may require additional care here.  */
6521       coproc = 1;
6522       goto st;
6523     case M_SDL_AB:
6524       s = "sdl";
6525       goto st;
6526     case M_SDR_AB:
6527       s = "sdr";
6528     st:
6529       tempreg = AT;
6530       used_at = 1;
6531     ld_st:
6532       if (coproc
6533           && NO_ISA_COP (mips_opts.arch)
6534           && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
6535         {
6536           as_bad (_("Opcode not supported on this processor: %s"),
6537                   mips_cpu_info_from_arch (mips_opts.arch)->name);
6538           break;
6539         }
6540
6541       /* Itbl support may require additional care here.  */
6542       if (mask == M_LWC1_AB
6543           || mask == M_SWC1_AB
6544           || mask == M_LDC1_AB
6545           || mask == M_SDC1_AB
6546           || mask == M_L_DAB
6547           || mask == M_S_DAB)
6548         fmt = "T,o(b)";
6549       else if (mask == M_CACHE_AB)
6550         fmt = "k,o(b)";
6551       else if (coproc)
6552         fmt = "E,o(b)";
6553       else
6554         fmt = "t,o(b)";
6555
6556       if (offset_expr.X_op != O_constant
6557           && offset_expr.X_op != O_symbol)
6558         {
6559           as_bad (_("Expression too complex"));
6560           offset_expr.X_op = O_constant;
6561         }
6562
6563       if (HAVE_32BIT_ADDRESSES
6564           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6565         {
6566           char value [32];
6567
6568           sprintf_vma (value, offset_expr.X_add_number);
6569           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6570         }
6571
6572       /* A constant expression in PIC code can be handled just as it
6573          is in non PIC code.  */
6574       if (offset_expr.X_op == O_constant)
6575         {
6576           expr1.X_add_number = offset_expr.X_add_number;
6577           normalize_address_expr (&expr1);
6578           if (!IS_SEXT_16BIT_NUM (expr1.X_add_number))
6579             {
6580               expr1.X_add_number = ((expr1.X_add_number + 0x8000)
6581                                     & ~(bfd_vma) 0xffff);
6582               load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6583               if (breg != 0)
6584                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6585                              tempreg, tempreg, breg);
6586               breg = tempreg;
6587             }
6588           macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
6589         }
6590       else if (mips_pic == NO_PIC)
6591         {
6592           /* If this is a reference to a GP relative symbol, and there
6593              is no base register, we want
6594                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6595              Otherwise, if there is no base register, we want
6596                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6597                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6598              If we have a constant, we need two instructions anyhow,
6599              so we always use the latter form.
6600
6601              If we have a base register, and this is a reference to a
6602              GP relative symbol, we want
6603                addu     $tempreg,$breg,$gp
6604                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
6605              Otherwise we want
6606                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6607                addu     $tempreg,$tempreg,$breg
6608                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6609              With a constant we always use the latter case.
6610
6611              With 64bit address space and no base register and $at usable,
6612              we want
6613                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6614                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6615                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6616                dsll32   $tempreg,0
6617                daddu    $tempreg,$at
6618                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6619              If we have a base register, we want
6620                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6621                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6622                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6623                daddu    $at,$breg
6624                dsll32   $tempreg,0
6625                daddu    $tempreg,$at
6626                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6627
6628              Without $at we can't generate the optimal path for superscalar
6629              processors here since this would require two temporary registers.
6630                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6631                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6632                dsll     $tempreg,16
6633                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6634                dsll     $tempreg,16
6635                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6636              If we have a base register, we want
6637                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6638                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6639                dsll     $tempreg,16
6640                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6641                dsll     $tempreg,16
6642                daddu    $tempreg,$tempreg,$breg
6643                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6644
6645              For GP relative symbols in 64bit address space we can use
6646              the same sequence as in 32bit address space.  */
6647           if (HAVE_64BIT_SYMBOLS)
6648             {
6649               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6650                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6651                 {
6652                   relax_start (offset_expr.X_add_symbol);
6653                   if (breg == 0)
6654                     {
6655                       macro_build (&offset_expr, s, fmt, treg,
6656                                    BFD_RELOC_GPREL16, mips_gp_register);
6657                     }
6658                   else
6659                     {
6660                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6661                                    tempreg, breg, mips_gp_register);
6662                       macro_build (&offset_expr, s, fmt, treg,
6663                                    BFD_RELOC_GPREL16, tempreg);
6664                     }
6665                   relax_switch ();
6666                 }
6667
6668               if (used_at == 0 && mips_opts.at)
6669                 {
6670                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6671                                BFD_RELOC_MIPS_HIGHEST);
6672                   macro_build (&offset_expr, "lui", "t,u", AT,
6673                                BFD_RELOC_HI16_S);
6674                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6675                                tempreg, BFD_RELOC_MIPS_HIGHER);
6676                   if (breg != 0)
6677                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6678                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6679                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6680                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6681                                tempreg);
6682                   used_at = 1;
6683                 }
6684               else
6685                 {
6686                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6687                                BFD_RELOC_MIPS_HIGHEST);
6688                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6689                                tempreg, BFD_RELOC_MIPS_HIGHER);
6690                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6691                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6692                                tempreg, BFD_RELOC_HI16_S);
6693                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6694                   if (breg != 0)
6695                     macro_build (NULL, "daddu", "d,v,t",
6696                                  tempreg, tempreg, breg);
6697                   macro_build (&offset_expr, s, fmt, treg,
6698                                BFD_RELOC_LO16, tempreg);
6699                 }
6700
6701               if (mips_relax.sequence)
6702                 relax_end ();
6703               break;
6704             }
6705
6706           if (breg == 0)
6707             {
6708               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6709                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6710                 {
6711                   relax_start (offset_expr.X_add_symbol);
6712                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6713                                mips_gp_register);
6714                   relax_switch ();
6715                 }
6716               macro_build_lui (&offset_expr, tempreg);
6717               macro_build (&offset_expr, s, fmt, treg,
6718                            BFD_RELOC_LO16, tempreg);
6719               if (mips_relax.sequence)
6720                 relax_end ();
6721             }
6722           else
6723             {
6724               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6725                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6726                 {
6727                   relax_start (offset_expr.X_add_symbol);
6728                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6729                                tempreg, breg, mips_gp_register);
6730                   macro_build (&offset_expr, s, fmt, treg,
6731                                BFD_RELOC_GPREL16, tempreg);
6732                   relax_switch ();
6733                 }
6734               macro_build_lui (&offset_expr, tempreg);
6735               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6736                            tempreg, tempreg, breg);
6737               macro_build (&offset_expr, s, fmt, treg,
6738                            BFD_RELOC_LO16, tempreg);
6739               if (mips_relax.sequence)
6740                 relax_end ();
6741             }
6742         }
6743       else if (!mips_big_got)
6744         {
6745           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6746
6747           /* If this is a reference to an external symbol, we want
6748                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6749                nop
6750                <op>     $treg,0($tempreg)
6751              Otherwise we want
6752                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6753                nop
6754                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6755                <op>     $treg,0($tempreg)
6756
6757              For NewABI, we want
6758                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6759                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6760
6761              If there is a base register, we add it to $tempreg before
6762              the <op>.  If there is a constant, we stick it in the
6763              <op> instruction.  We don't handle constants larger than
6764              16 bits, because we have no way to load the upper 16 bits
6765              (actually, we could handle them for the subset of cases
6766              in which we are not using $at).  */
6767           gas_assert (offset_expr.X_op == O_symbol);
6768           if (HAVE_NEWABI)
6769             {
6770               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6771                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6772               if (breg != 0)
6773                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6774                              tempreg, tempreg, breg);
6775               macro_build (&offset_expr, s, fmt, treg,
6776                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
6777               break;
6778             }
6779           expr1.X_add_number = offset_expr.X_add_number;
6780           offset_expr.X_add_number = 0;
6781           if (expr1.X_add_number < -0x8000
6782               || expr1.X_add_number >= 0x8000)
6783             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6784           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6785                        lw_reloc_type, mips_gp_register);
6786           load_delay_nop ();
6787           relax_start (offset_expr.X_add_symbol);
6788           relax_switch ();
6789           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6790                        tempreg, BFD_RELOC_LO16);
6791           relax_end ();
6792           if (breg != 0)
6793             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6794                          tempreg, tempreg, breg);
6795           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6796         }
6797       else if (mips_big_got && !HAVE_NEWABI)
6798         {
6799           int gpdelay;
6800
6801           /* If this is a reference to an external symbol, we want
6802                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6803                addu     $tempreg,$tempreg,$gp
6804                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6805                <op>     $treg,0($tempreg)
6806              Otherwise we want
6807                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6808                nop
6809                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6810                <op>     $treg,0($tempreg)
6811              If there is a base register, we add it to $tempreg before
6812              the <op>.  If there is a constant, we stick it in the
6813              <op> instruction.  We don't handle constants larger than
6814              16 bits, because we have no way to load the upper 16 bits
6815              (actually, we could handle them for the subset of cases
6816              in which we are not using $at).  */
6817           gas_assert (offset_expr.X_op == O_symbol);
6818           expr1.X_add_number = offset_expr.X_add_number;
6819           offset_expr.X_add_number = 0;
6820           if (expr1.X_add_number < -0x8000
6821               || expr1.X_add_number >= 0x8000)
6822             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6823           gpdelay = reg_needs_delay (mips_gp_register);
6824           relax_start (offset_expr.X_add_symbol);
6825           macro_build (&offset_expr, "lui", "t,u", tempreg,
6826                        BFD_RELOC_MIPS_GOT_HI16);
6827           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6828                        mips_gp_register);
6829           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6830                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6831           relax_switch ();
6832           if (gpdelay)
6833             macro_build (NULL, "nop", "");
6834           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6835                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6836           load_delay_nop ();
6837           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6838                        tempreg, BFD_RELOC_LO16);
6839           relax_end ();
6840
6841           if (breg != 0)
6842             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6843                          tempreg, tempreg, breg);
6844           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6845         }
6846       else if (mips_big_got && HAVE_NEWABI)
6847         {
6848           /* If this is a reference to an external symbol, we want
6849                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6850                add      $tempreg,$tempreg,$gp
6851                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6852                <op>     $treg,<ofst>($tempreg)
6853              Otherwise, for local symbols, we want:
6854                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6855                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
6856           gas_assert (offset_expr.X_op == O_symbol);
6857           expr1.X_add_number = offset_expr.X_add_number;
6858           offset_expr.X_add_number = 0;
6859           if (expr1.X_add_number < -0x8000
6860               || expr1.X_add_number >= 0x8000)
6861             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6862           relax_start (offset_expr.X_add_symbol);
6863           macro_build (&offset_expr, "lui", "t,u", tempreg,
6864                        BFD_RELOC_MIPS_GOT_HI16);
6865           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6866                        mips_gp_register);
6867           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6868                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6869           if (breg != 0)
6870             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6871                          tempreg, tempreg, breg);
6872           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6873
6874           relax_switch ();
6875           offset_expr.X_add_number = expr1.X_add_number;
6876           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6877                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6878           if (breg != 0)
6879             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6880                          tempreg, tempreg, breg);
6881           macro_build (&offset_expr, s, fmt, treg,
6882                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
6883           relax_end ();
6884         }
6885       else
6886         abort ();
6887
6888       break;
6889
6890     case M_LI:
6891     case M_LI_S:
6892       load_register (treg, &imm_expr, 0);
6893       break;
6894
6895     case M_DLI:
6896       load_register (treg, &imm_expr, 1);
6897       break;
6898
6899     case M_LI_SS:
6900       if (imm_expr.X_op == O_constant)
6901         {
6902           used_at = 1;
6903           load_register (AT, &imm_expr, 0);
6904           macro_build (NULL, "mtc1", "t,G", AT, treg);
6905           break;
6906         }
6907       else
6908         {
6909           gas_assert (offset_expr.X_op == O_symbol
6910                       && strcmp (segment_name (S_GET_SEGMENT
6911                                                (offset_expr.X_add_symbol)),
6912                                  ".lit4") == 0
6913                       && offset_expr.X_add_number == 0);
6914           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6915                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6916           break;
6917         }
6918
6919     case M_LI_D:
6920       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6921          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6922          order 32 bits of the value and the low order 32 bits are either
6923          zero or in OFFSET_EXPR.  */
6924       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6925         {
6926           if (HAVE_64BIT_GPRS)
6927             load_register (treg, &imm_expr, 1);
6928           else
6929             {
6930               int hreg, lreg;
6931
6932               if (target_big_endian)
6933                 {
6934                   hreg = treg;
6935                   lreg = treg + 1;
6936                 }
6937               else
6938                 {
6939                   hreg = treg + 1;
6940                   lreg = treg;
6941                 }
6942
6943               if (hreg <= 31)
6944                 load_register (hreg, &imm_expr, 0);
6945               if (lreg <= 31)
6946                 {
6947                   if (offset_expr.X_op == O_absent)
6948                     move_register (lreg, 0);
6949                   else
6950                     {
6951                       gas_assert (offset_expr.X_op == O_constant);
6952                       load_register (lreg, &offset_expr, 0);
6953                     }
6954                 }
6955             }
6956           break;
6957         }
6958
6959       /* We know that sym is in the .rdata section.  First we get the
6960          upper 16 bits of the address.  */
6961       if (mips_pic == NO_PIC)
6962         {
6963           macro_build_lui (&offset_expr, AT);
6964           used_at = 1;
6965         }
6966       else
6967         {
6968           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6969                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6970           used_at = 1;
6971         }
6972
6973       /* Now we load the register(s).  */
6974       if (HAVE_64BIT_GPRS)
6975         {
6976           used_at = 1;
6977           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6978         }
6979       else
6980         {
6981           used_at = 1;
6982           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6983           if (treg != RA)
6984             {
6985               /* FIXME: How in the world do we deal with the possible
6986                  overflow here?  */
6987               offset_expr.X_add_number += 4;
6988               macro_build (&offset_expr, "lw", "t,o(b)",
6989                            treg + 1, BFD_RELOC_LO16, AT);
6990             }
6991         }
6992       break;
6993
6994     case M_LI_DD:
6995       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
6996          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6997          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
6998          the value and the low order 32 bits are either zero or in
6999          OFFSET_EXPR.  */
7000       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
7001         {
7002           used_at = 1;
7003           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
7004           if (HAVE_64BIT_FPRS)
7005             {
7006               gas_assert (HAVE_64BIT_GPRS);
7007               macro_build (NULL, "dmtc1", "t,S", AT, treg);
7008             }
7009           else
7010             {
7011               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
7012               if (offset_expr.X_op == O_absent)
7013                 macro_build (NULL, "mtc1", "t,G", 0, treg);
7014               else
7015                 {
7016                   gas_assert (offset_expr.X_op == O_constant);
7017                   load_register (AT, &offset_expr, 0);
7018                   macro_build (NULL, "mtc1", "t,G", AT, treg);
7019                 }
7020             }
7021           break;
7022         }
7023
7024       gas_assert (offset_expr.X_op == O_symbol
7025                   && offset_expr.X_add_number == 0);
7026       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
7027       if (strcmp (s, ".lit8") == 0)
7028         {
7029           if (mips_opts.isa != ISA_MIPS1)
7030             {
7031               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
7032                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
7033               break;
7034             }
7035           breg = mips_gp_register;
7036           r = BFD_RELOC_MIPS_LITERAL;
7037           goto dob;
7038         }
7039       else
7040         {
7041           gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
7042           used_at = 1;
7043           if (mips_pic != NO_PIC)
7044             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7045                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
7046           else
7047             {
7048               /* FIXME: This won't work for a 64 bit address.  */
7049               macro_build_lui (&offset_expr, AT);
7050             }
7051
7052           if (mips_opts.isa != ISA_MIPS1)
7053             {
7054               macro_build (&offset_expr, "ldc1", "T,o(b)",
7055                            treg, BFD_RELOC_LO16, AT);
7056               break;
7057             }
7058           breg = AT;
7059           r = BFD_RELOC_LO16;
7060           goto dob;
7061         }
7062
7063     case M_L_DOB:
7064       /* Even on a big endian machine $fn comes before $fn+1.  We have
7065          to adjust when loading from memory.  */
7066       r = BFD_RELOC_LO16;
7067     dob:
7068       gas_assert (mips_opts.isa == ISA_MIPS1);
7069       macro_build (&offset_expr, "lwc1", "T,o(b)",
7070                    target_big_endian ? treg + 1 : treg, r, breg);
7071       /* FIXME: A possible overflow which I don't know how to deal
7072          with.  */
7073       offset_expr.X_add_number += 4;
7074       macro_build (&offset_expr, "lwc1", "T,o(b)",
7075                    target_big_endian ? treg : treg + 1, r, breg);
7076       break;
7077
7078     case M_S_DOB:
7079       gas_assert (mips_opts.isa == ISA_MIPS1);
7080       /* Even on a big endian machine $fn comes before $fn+1.  We have
7081          to adjust when storing to memory.  */
7082       macro_build (&offset_expr, "swc1", "T,o(b)",
7083                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7084       offset_expr.X_add_number += 4;
7085       macro_build (&offset_expr, "swc1", "T,o(b)",
7086                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7087       break;
7088
7089     case M_L_DAB:
7090       /*
7091        * The MIPS assembler seems to check for X_add_number not
7092        * being double aligned and generating:
7093        *        lui     at,%hi(foo+1)
7094        *        addu    at,at,v1
7095        *        addiu   at,at,%lo(foo+1)
7096        *        lwc1    f2,0(at)
7097        *        lwc1    f3,4(at)
7098        * But, the resulting address is the same after relocation so why
7099        * generate the extra instruction?
7100        */
7101       /* Itbl support may require additional care here.  */
7102       coproc = 1;
7103       if (mips_opts.isa != ISA_MIPS1)
7104         {
7105           s = "ldc1";
7106           goto ld;
7107         }
7108
7109       s = "lwc1";
7110       fmt = "T,o(b)";
7111       goto ldd_std;
7112
7113     case M_S_DAB:
7114       if (mips_opts.isa != ISA_MIPS1)
7115         {
7116           s = "sdc1";
7117           goto st;
7118         }
7119
7120       s = "swc1";
7121       fmt = "T,o(b)";
7122       /* Itbl support may require additional care here.  */
7123       coproc = 1;
7124       goto ldd_std;
7125
7126     case M_LD_AB:
7127       if (HAVE_64BIT_GPRS)
7128         {
7129           s = "ld";
7130           goto ld;
7131         }
7132
7133       s = "lw";
7134       fmt = "t,o(b)";
7135       goto ldd_std;
7136
7137     case M_SD_AB:
7138       if (HAVE_64BIT_GPRS)
7139         {
7140           s = "sd";
7141           goto st;
7142         }
7143
7144       s = "sw";
7145       fmt = "t,o(b)";
7146
7147     ldd_std:
7148       if (offset_expr.X_op != O_symbol
7149           && offset_expr.X_op != O_constant)
7150         {
7151           as_bad (_("Expression too complex"));
7152           offset_expr.X_op = O_constant;
7153         }
7154
7155       if (HAVE_32BIT_ADDRESSES
7156           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7157         {
7158           char value [32];
7159
7160           sprintf_vma (value, offset_expr.X_add_number);
7161           as_bad (_("Number (0x%s) larger than 32 bits"), value);
7162         }
7163
7164       /* Even on a big endian machine $fn comes before $fn+1.  We have
7165          to adjust when loading from memory.  We set coproc if we must
7166          load $fn+1 first.  */
7167       /* Itbl support may require additional care here.  */
7168       if (!target_big_endian)
7169         coproc = 0;
7170
7171       if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
7172         {
7173           /* If this is a reference to a GP relative symbol, we want
7174                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
7175                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
7176              If we have a base register, we use this
7177                addu     $at,$breg,$gp
7178                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
7179                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
7180              If this is not a GP relative symbol, we want
7181                lui      $at,<sym>               (BFD_RELOC_HI16_S)
7182                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7183                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7184              If there is a base register, we add it to $at after the
7185              lui instruction.  If there is a constant, we always use
7186              the last case.  */
7187           if (offset_expr.X_op == O_symbol
7188               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7189               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7190             {
7191               relax_start (offset_expr.X_add_symbol);
7192               if (breg == 0)
7193                 {
7194                   tempreg = mips_gp_register;
7195                 }
7196               else
7197                 {
7198                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7199                                AT, breg, mips_gp_register);
7200                   tempreg = AT;
7201                   used_at = 1;
7202                 }
7203
7204               /* Itbl support may require additional care here.  */
7205               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7206                            BFD_RELOC_GPREL16, tempreg);
7207               offset_expr.X_add_number += 4;
7208
7209               /* Set mips_optimize to 2 to avoid inserting an
7210                  undesired nop.  */
7211               hold_mips_optimize = mips_optimize;
7212               mips_optimize = 2;
7213               /* Itbl support may require additional care here.  */
7214               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7215                            BFD_RELOC_GPREL16, tempreg);
7216               mips_optimize = hold_mips_optimize;
7217
7218               relax_switch ();
7219
7220               offset_expr.X_add_number -= 4;
7221             }
7222           used_at = 1;
7223           macro_build_lui (&offset_expr, AT);
7224           if (breg != 0)
7225             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7226           /* Itbl support may require additional care here.  */
7227           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7228                        BFD_RELOC_LO16, AT);
7229           /* FIXME: How do we handle overflow here?  */
7230           offset_expr.X_add_number += 4;
7231           /* Itbl support may require additional care here.  */
7232           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7233                        BFD_RELOC_LO16, AT);
7234           if (mips_relax.sequence)
7235             relax_end ();
7236         }
7237       else if (!mips_big_got)
7238         {
7239           /* If this is a reference to an external symbol, we want
7240                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7241                nop
7242                <op>     $treg,0($at)
7243                <op>     $treg+1,4($at)
7244              Otherwise we want
7245                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7246                nop
7247                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7248                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7249              If there is a base register we add it to $at before the
7250              lwc1 instructions.  If there is a constant we include it
7251              in the lwc1 instructions.  */
7252           used_at = 1;
7253           expr1.X_add_number = offset_expr.X_add_number;
7254           if (expr1.X_add_number < -0x8000
7255               || expr1.X_add_number >= 0x8000 - 4)
7256             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7257           load_got_offset (AT, &offset_expr);
7258           load_delay_nop ();
7259           if (breg != 0)
7260             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7261
7262           /* Set mips_optimize to 2 to avoid inserting an undesired
7263              nop.  */
7264           hold_mips_optimize = mips_optimize;
7265           mips_optimize = 2;
7266
7267           /* Itbl support may require additional care here.  */
7268           relax_start (offset_expr.X_add_symbol);
7269           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7270                        BFD_RELOC_LO16, AT);
7271           expr1.X_add_number += 4;
7272           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7273                        BFD_RELOC_LO16, AT);
7274           relax_switch ();
7275           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7276                        BFD_RELOC_LO16, AT);
7277           offset_expr.X_add_number += 4;
7278           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7279                        BFD_RELOC_LO16, AT);
7280           relax_end ();
7281
7282           mips_optimize = hold_mips_optimize;
7283         }
7284       else if (mips_big_got)
7285         {
7286           int gpdelay;
7287
7288           /* If this is a reference to an external symbol, we want
7289                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
7290                addu     $at,$at,$gp
7291                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
7292                nop
7293                <op>     $treg,0($at)
7294                <op>     $treg+1,4($at)
7295              Otherwise we want
7296                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7297                nop
7298                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7299                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7300              If there is a base register we add it to $at before the
7301              lwc1 instructions.  If there is a constant we include it
7302              in the lwc1 instructions.  */
7303           used_at = 1;
7304           expr1.X_add_number = offset_expr.X_add_number;
7305           offset_expr.X_add_number = 0;
7306           if (expr1.X_add_number < -0x8000
7307               || expr1.X_add_number >= 0x8000 - 4)
7308             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7309           gpdelay = reg_needs_delay (mips_gp_register);
7310           relax_start (offset_expr.X_add_symbol);
7311           macro_build (&offset_expr, "lui", "t,u",
7312                        AT, BFD_RELOC_MIPS_GOT_HI16);
7313           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7314                        AT, AT, mips_gp_register);
7315           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7316                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7317           load_delay_nop ();
7318           if (breg != 0)
7319             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7320           /* Itbl support may require additional care here.  */
7321           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7322                        BFD_RELOC_LO16, AT);
7323           expr1.X_add_number += 4;
7324
7325           /* Set mips_optimize to 2 to avoid inserting an undesired
7326              nop.  */
7327           hold_mips_optimize = mips_optimize;
7328           mips_optimize = 2;
7329           /* Itbl support may require additional care here.  */
7330           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7331                        BFD_RELOC_LO16, AT);
7332           mips_optimize = hold_mips_optimize;
7333           expr1.X_add_number -= 4;
7334
7335           relax_switch ();
7336           offset_expr.X_add_number = expr1.X_add_number;
7337           if (gpdelay)
7338             macro_build (NULL, "nop", "");
7339           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7340                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
7341           load_delay_nop ();
7342           if (breg != 0)
7343             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7344           /* Itbl support may require additional care here.  */
7345           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7346                        BFD_RELOC_LO16, AT);
7347           offset_expr.X_add_number += 4;
7348
7349           /* Set mips_optimize to 2 to avoid inserting an undesired
7350              nop.  */
7351           hold_mips_optimize = mips_optimize;
7352           mips_optimize = 2;
7353           /* Itbl support may require additional care here.  */
7354           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7355                        BFD_RELOC_LO16, AT);
7356           mips_optimize = hold_mips_optimize;
7357           relax_end ();
7358         }
7359       else
7360         abort ();
7361
7362       break;
7363
7364     case M_LD_OB:
7365       s = HAVE_64BIT_GPRS ? "ld" : "lw";
7366       goto sd_ob;
7367     case M_SD_OB:
7368       s = HAVE_64BIT_GPRS ? "sd" : "sw";
7369     sd_ob:
7370       macro_build (&offset_expr, s, "t,o(b)", treg,
7371                    -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7372                    breg);
7373       if (!HAVE_64BIT_GPRS)
7374         {
7375           offset_expr.X_add_number += 4;
7376           macro_build (&offset_expr, s, "t,o(b)", treg + 1,
7377                        -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7378                        breg);
7379         }
7380       break;
7381
7382    /* New code added to support COPZ instructions.
7383       This code builds table entries out of the macros in mip_opcodes.
7384       R4000 uses interlocks to handle coproc delays.
7385       Other chips (like the R3000) require nops to be inserted for delays.
7386
7387       FIXME: Currently, we require that the user handle delays.
7388       In order to fill delay slots for non-interlocked chips,
7389       we must have a way to specify delays based on the coprocessor.
7390       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7391       What are the side-effects of the cop instruction?
7392       What cache support might we have and what are its effects?
7393       Both coprocessor & memory require delays. how long???
7394       What registers are read/set/modified?
7395
7396       If an itbl is provided to interpret cop instructions,
7397       this knowledge can be encoded in the itbl spec.  */
7398
7399     case M_COP0:
7400       s = "c0";
7401       goto copz;
7402     case M_COP1:
7403       s = "c1";
7404       goto copz;
7405     case M_COP2:
7406       s = "c2";
7407       goto copz;
7408     case M_COP3:
7409       s = "c3";
7410     copz:
7411       if (NO_ISA_COP (mips_opts.arch)
7412           && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
7413         {
7414           as_bad (_("opcode not supported on this processor: %s"),
7415                   mips_cpu_info_from_arch (mips_opts.arch)->name);
7416           break;
7417         }
7418
7419       /* For now we just do C (same as Cz).  The parameter will be
7420          stored in insn_opcode by mips_ip.  */
7421       macro_build (NULL, s, "C", ip->insn_opcode);
7422       break;
7423
7424     case M_MOVE:
7425       move_register (dreg, sreg);
7426       break;
7427
7428     case M_DMUL:
7429       dbl = 1;
7430     case M_MUL:
7431       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7432       macro_build (NULL, "mflo", "d", dreg);
7433       break;
7434
7435     case M_DMUL_I:
7436       dbl = 1;
7437     case M_MUL_I:
7438       /* The MIPS assembler some times generates shifts and adds.  I'm
7439          not trying to be that fancy. GCC should do this for us
7440          anyway.  */
7441       used_at = 1;
7442       load_register (AT, &imm_expr, dbl);
7443       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7444       macro_build (NULL, "mflo", "d", dreg);
7445       break;
7446
7447     case M_DMULO_I:
7448       dbl = 1;
7449     case M_MULO_I:
7450       imm = 1;
7451       goto do_mulo;
7452
7453     case M_DMULO:
7454       dbl = 1;
7455     case M_MULO:
7456     do_mulo:
7457       start_noreorder ();
7458       used_at = 1;
7459       if (imm)
7460         load_register (AT, &imm_expr, dbl);
7461       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7462       macro_build (NULL, "mflo", "d", dreg);
7463       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7464       macro_build (NULL, "mfhi", "d", AT);
7465       if (mips_trap)
7466         macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7467       else
7468         {
7469           expr1.X_add_number = 8;
7470           macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7471           macro_build (NULL, "nop", "");
7472           macro_build (NULL, "break", "c", 6);
7473         }
7474       end_noreorder ();
7475       macro_build (NULL, "mflo", "d", dreg);
7476       break;
7477
7478     case M_DMULOU_I:
7479       dbl = 1;
7480     case M_MULOU_I:
7481       imm = 1;
7482       goto do_mulou;
7483
7484     case M_DMULOU:
7485       dbl = 1;
7486     case M_MULOU:
7487     do_mulou:
7488       start_noreorder ();
7489       used_at = 1;
7490       if (imm)
7491         load_register (AT, &imm_expr, dbl);
7492       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7493                    sreg, imm ? AT : treg);
7494       macro_build (NULL, "mfhi", "d", AT);
7495       macro_build (NULL, "mflo", "d", dreg);
7496       if (mips_trap)
7497         macro_build (NULL, "tne", "s,t,q", AT, ZERO, 6);
7498       else
7499         {
7500           expr1.X_add_number = 8;
7501           macro_build (&expr1, "beq", "s,t,p", AT, ZERO);
7502           macro_build (NULL, "nop", "");
7503           macro_build (NULL, "break", "c", 6);
7504         }
7505       end_noreorder ();
7506       break;
7507
7508     case M_DROL:
7509       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7510         {
7511           if (dreg == sreg)
7512             {
7513               tempreg = AT;
7514               used_at = 1;
7515             }
7516           else
7517             {
7518               tempreg = dreg;
7519             }
7520           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7521           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7522           break;
7523         }
7524       used_at = 1;
7525       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
7526       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7527       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7528       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7529       break;
7530
7531     case M_ROL:
7532       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7533         {
7534           if (dreg == sreg)
7535             {
7536               tempreg = AT;
7537               used_at = 1;
7538             }
7539           else
7540             {
7541               tempreg = dreg;
7542             }
7543           macro_build (NULL, "negu", "d,w", tempreg, treg);
7544           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7545           break;
7546         }
7547       used_at = 1;
7548       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
7549       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7550       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7551       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7552       break;
7553
7554     case M_DROL_I:
7555       {
7556         unsigned int rot;
7557         char *l;
7558         char *rr;
7559
7560         if (imm_expr.X_op != O_constant)
7561           as_bad (_("Improper rotate count"));
7562         rot = imm_expr.X_add_number & 0x3f;
7563         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7564           {
7565             rot = (64 - rot) & 0x3f;
7566             if (rot >= 32)
7567               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7568             else
7569               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7570             break;
7571           }
7572         if (rot == 0)
7573           {
7574             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7575             break;
7576           }
7577         l = (rot < 0x20) ? "dsll" : "dsll32";
7578         rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7579         rot &= 0x1f;
7580         used_at = 1;
7581         macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7582         macro_build (NULL, rr, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7583         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7584       }
7585       break;
7586
7587     case M_ROL_I:
7588       {
7589         unsigned int rot;
7590
7591         if (imm_expr.X_op != O_constant)
7592           as_bad (_("Improper rotate count"));
7593         rot = imm_expr.X_add_number & 0x1f;
7594         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7595           {
7596             macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7597             break;
7598           }
7599         if (rot == 0)
7600           {
7601             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7602             break;
7603           }
7604         used_at = 1;
7605         macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7606         macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7607         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7608       }
7609       break;
7610
7611     case M_DROR:
7612       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7613         {
7614           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7615           break;
7616         }
7617       used_at = 1;
7618       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
7619       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7620       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7621       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7622       break;
7623
7624     case M_ROR:
7625       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7626         {
7627           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7628           break;
7629         }
7630       used_at = 1;
7631       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
7632       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7633       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7634       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7635       break;
7636
7637     case M_DROR_I:
7638       {
7639         unsigned int rot;
7640         char *l;
7641         char *rr;
7642
7643         if (imm_expr.X_op != O_constant)
7644           as_bad (_("Improper rotate count"));
7645         rot = imm_expr.X_add_number & 0x3f;
7646         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7647           {
7648             if (rot >= 32)
7649               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7650             else
7651               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7652             break;
7653           }
7654         if (rot == 0)
7655           {
7656             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7657             break;
7658           }
7659         rr = (rot < 0x20) ? "dsrl" : "dsrl32";
7660         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7661         rot &= 0x1f;
7662         used_at = 1;
7663         macro_build (NULL, rr, "d,w,<", AT, sreg, rot);
7664         macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7665         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7666       }
7667       break;
7668
7669     case M_ROR_I:
7670       {
7671         unsigned int rot;
7672
7673         if (imm_expr.X_op != O_constant)
7674           as_bad (_("Improper rotate count"));
7675         rot = imm_expr.X_add_number & 0x1f;
7676         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7677           {
7678             macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7679             break;
7680           }
7681         if (rot == 0)
7682           {
7683             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7684             break;
7685           }
7686         used_at = 1;
7687         macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7688         macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7689         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7690       }
7691       break;
7692
7693     case M_SEQ:
7694       if (sreg == 0)
7695         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7696       else if (treg == 0)
7697         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7698       else
7699         {
7700           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7701           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7702         }
7703       break;
7704
7705     case M_SEQ_I:
7706       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7707         {
7708           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7709           break;
7710         }
7711       if (sreg == 0)
7712         {
7713           as_warn (_("Instruction %s: result is always false"),
7714                    ip->insn_mo->name);
7715           move_register (dreg, 0);
7716           break;
7717         }
7718       if (CPU_HAS_SEQ (mips_opts.arch)
7719           && -512 <= imm_expr.X_add_number
7720           && imm_expr.X_add_number < 512)
7721         {
7722           macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
7723                        (int) imm_expr.X_add_number);
7724           break;
7725         }
7726       if (imm_expr.X_op == O_constant
7727           && imm_expr.X_add_number >= 0
7728           && imm_expr.X_add_number < 0x10000)
7729         {
7730           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7731         }
7732       else if (imm_expr.X_op == O_constant
7733                && imm_expr.X_add_number > -0x8000
7734                && imm_expr.X_add_number < 0)
7735         {
7736           imm_expr.X_add_number = -imm_expr.X_add_number;
7737           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7738                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7739         }
7740       else if (CPU_HAS_SEQ (mips_opts.arch))
7741         {
7742           used_at = 1;
7743           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7744           macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
7745           break;
7746         }
7747       else
7748         {
7749           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7750           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7751           used_at = 1;
7752         }
7753       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7754       break;
7755
7756     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7757       s = "slt";
7758       goto sge;
7759     case M_SGEU:
7760       s = "sltu";
7761     sge:
7762       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7763       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7764       break;
7765
7766     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7767     case M_SGEU_I:
7768       if (imm_expr.X_op == O_constant
7769           && imm_expr.X_add_number >= -0x8000
7770           && imm_expr.X_add_number < 0x8000)
7771         {
7772           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7773                        dreg, sreg, BFD_RELOC_LO16);
7774         }
7775       else
7776         {
7777           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7778           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7779                        dreg, sreg, AT);
7780           used_at = 1;
7781         }
7782       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7783       break;
7784
7785     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
7786       s = "slt";
7787       goto sgt;
7788     case M_SGTU:
7789       s = "sltu";
7790     sgt:
7791       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7792       break;
7793
7794     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
7795       s = "slt";
7796       goto sgti;
7797     case M_SGTU_I:
7798       s = "sltu";
7799     sgti:
7800       used_at = 1;
7801       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7802       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7803       break;
7804
7805     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7806       s = "slt";
7807       goto sle;
7808     case M_SLEU:
7809       s = "sltu";
7810     sle:
7811       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7812       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7813       break;
7814
7815     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7816       s = "slt";
7817       goto slei;
7818     case M_SLEU_I:
7819       s = "sltu";
7820     slei:
7821       used_at = 1;
7822       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7823       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7824       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7825       break;
7826
7827     case M_SLT_I:
7828       if (imm_expr.X_op == O_constant
7829           && imm_expr.X_add_number >= -0x8000
7830           && imm_expr.X_add_number < 0x8000)
7831         {
7832           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7833           break;
7834         }
7835       used_at = 1;
7836       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7837       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7838       break;
7839
7840     case M_SLTU_I:
7841       if (imm_expr.X_op == O_constant
7842           && imm_expr.X_add_number >= -0x8000
7843           && imm_expr.X_add_number < 0x8000)
7844         {
7845           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7846                        BFD_RELOC_LO16);
7847           break;
7848         }
7849       used_at = 1;
7850       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7851       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7852       break;
7853
7854     case M_SNE:
7855       if (sreg == 0)
7856         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7857       else if (treg == 0)
7858         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7859       else
7860         {
7861           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7862           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7863         }
7864       break;
7865
7866     case M_SNE_I:
7867       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7868         {
7869           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7870           break;
7871         }
7872       if (sreg == 0)
7873         {
7874           as_warn (_("Instruction %s: result is always true"),
7875                    ip->insn_mo->name);
7876           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7877                        dreg, 0, BFD_RELOC_LO16);
7878           break;
7879         }
7880       if (CPU_HAS_SEQ (mips_opts.arch)
7881           && -512 <= imm_expr.X_add_number
7882           && imm_expr.X_add_number < 512)
7883         {
7884           macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
7885                        (int) imm_expr.X_add_number);
7886           break;
7887         }
7888       if (imm_expr.X_op == O_constant
7889           && imm_expr.X_add_number >= 0
7890           && imm_expr.X_add_number < 0x10000)
7891         {
7892           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7893         }
7894       else if (imm_expr.X_op == O_constant
7895                && imm_expr.X_add_number > -0x8000
7896                && imm_expr.X_add_number < 0)
7897         {
7898           imm_expr.X_add_number = -imm_expr.X_add_number;
7899           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7900                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7901         }
7902       else if (CPU_HAS_SEQ (mips_opts.arch))
7903         {
7904           used_at = 1;
7905           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7906           macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
7907           break;
7908         }
7909       else
7910         {
7911           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7912           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7913           used_at = 1;
7914         }
7915       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7916       break;
7917
7918     case M_DSUB_I:
7919       dbl = 1;
7920     case M_SUB_I:
7921       if (imm_expr.X_op == O_constant
7922           && imm_expr.X_add_number > -0x8000
7923           && imm_expr.X_add_number <= 0x8000)
7924         {
7925           imm_expr.X_add_number = -imm_expr.X_add_number;
7926           macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7927                        dreg, sreg, BFD_RELOC_LO16);
7928           break;
7929         }
7930       used_at = 1;
7931       load_register (AT, &imm_expr, dbl);
7932       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7933       break;
7934
7935     case M_DSUBU_I:
7936       dbl = 1;
7937     case M_SUBU_I:
7938       if (imm_expr.X_op == O_constant
7939           && imm_expr.X_add_number > -0x8000
7940           && imm_expr.X_add_number <= 0x8000)
7941         {
7942           imm_expr.X_add_number = -imm_expr.X_add_number;
7943           macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7944                        dreg, sreg, BFD_RELOC_LO16);
7945           break;
7946         }
7947       used_at = 1;
7948       load_register (AT, &imm_expr, dbl);
7949       macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7950       break;
7951
7952     case M_TEQ_I:
7953       s = "teq";
7954       goto trap;
7955     case M_TGE_I:
7956       s = "tge";
7957       goto trap;
7958     case M_TGEU_I:
7959       s = "tgeu";
7960       goto trap;
7961     case M_TLT_I:
7962       s = "tlt";
7963       goto trap;
7964     case M_TLTU_I:
7965       s = "tltu";
7966       goto trap;
7967     case M_TNE_I:
7968       s = "tne";
7969     trap:
7970       used_at = 1;
7971       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7972       macro_build (NULL, s, "s,t", sreg, AT);
7973       break;
7974
7975     case M_TRUNCWS:
7976     case M_TRUNCWD:
7977       gas_assert (mips_opts.isa == ISA_MIPS1);
7978       used_at = 1;
7979       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
7980       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
7981
7982       /*
7983        * Is the double cfc1 instruction a bug in the mips assembler;
7984        * or is there a reason for it?
7985        */
7986       start_noreorder ();
7987       macro_build (NULL, "cfc1", "t,G", treg, RA);
7988       macro_build (NULL, "cfc1", "t,G", treg, RA);
7989       macro_build (NULL, "nop", "");
7990       expr1.X_add_number = 3;
7991       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7992       expr1.X_add_number = 2;
7993       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7994       macro_build (NULL, "ctc1", "t,G", AT, RA);
7995       macro_build (NULL, "nop", "");
7996       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7997                    dreg, sreg);
7998       macro_build (NULL, "ctc1", "t,G", treg, RA);
7999       macro_build (NULL, "nop", "");
8000       end_noreorder ();
8001       break;
8002
8003     case M_ULH:
8004       s = "lb";
8005       goto ulh;
8006     case M_ULHU:
8007       s = "lbu";
8008     ulh:
8009       used_at = 1;
8010       if (offset_expr.X_add_number >= 0x7fff)
8011         as_bad (_("Operand overflow"));
8012       if (!target_big_endian)
8013         ++offset_expr.X_add_number;
8014       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
8015       if (!target_big_endian)
8016         --offset_expr.X_add_number;
8017       else
8018         ++offset_expr.X_add_number;
8019       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8020       macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
8021       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8022       break;
8023
8024     case M_ULD:
8025       s = "ldl";
8026       s2 = "ldr";
8027       off = 7;
8028       goto ulw;
8029     case M_ULW:
8030       s = "lwl";
8031       s2 = "lwr";
8032       off = 3;
8033     ulw:
8034       if (offset_expr.X_add_number >= 0x8000 - off)
8035         as_bad (_("Operand overflow"));
8036       if (treg != breg)
8037         tempreg = treg;
8038       else
8039         {
8040           used_at = 1;
8041           tempreg = AT;
8042         }
8043       if (!target_big_endian)
8044         offset_expr.X_add_number += off;
8045       macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8046       if (!target_big_endian)
8047         offset_expr.X_add_number -= off;
8048       else
8049         offset_expr.X_add_number += off;
8050       macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8051
8052       /* If necessary, move the result in tempreg to the final destination.  */
8053       if (treg == tempreg)
8054         break;
8055       /* Protect second load's delay slot.  */
8056       load_delay_nop ();
8057       move_register (treg, tempreg);
8058       break;
8059
8060     case M_ULD_A:
8061       s = "ldl";
8062       s2 = "ldr";
8063       off = 7;
8064       goto ulwa;
8065     case M_ULW_A:
8066       s = "lwl";
8067       s2 = "lwr";
8068       off = 3;
8069     ulwa:
8070       used_at = 1;
8071       load_address (AT, &offset_expr, &used_at);
8072       if (breg != 0)
8073         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8074       if (!target_big_endian)
8075         expr1.X_add_number = off;
8076       else
8077         expr1.X_add_number = 0;
8078       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8079       if (!target_big_endian)
8080         expr1.X_add_number = 0;
8081       else
8082         expr1.X_add_number = off;
8083       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8084       break;
8085
8086     case M_ULH_A:
8087     case M_ULHU_A:
8088       used_at = 1;
8089       load_address (AT, &offset_expr, &used_at);
8090       if (breg != 0)
8091         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8092       if (target_big_endian)
8093         expr1.X_add_number = 0;
8094       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
8095                    treg, BFD_RELOC_LO16, AT);
8096       if (target_big_endian)
8097         expr1.X_add_number = 1;
8098       else
8099         expr1.X_add_number = 0;
8100       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8101       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8102       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8103       break;
8104
8105     case M_USH:
8106       used_at = 1;
8107       if (offset_expr.X_add_number >= 0x7fff)
8108         as_bad (_("Operand overflow"));
8109       if (target_big_endian)
8110         ++offset_expr.X_add_number;
8111       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8112       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
8113       if (target_big_endian)
8114         --offset_expr.X_add_number;
8115       else
8116         ++offset_expr.X_add_number;
8117       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
8118       break;
8119
8120     case M_USD:
8121       s = "sdl";
8122       s2 = "sdr";
8123       off = 7;
8124       goto usw;
8125     case M_USW:
8126       s = "swl";
8127       s2 = "swr";
8128       off = 3;
8129     usw:
8130       if (offset_expr.X_add_number >= 0x8000 - off)
8131         as_bad (_("Operand overflow"));
8132       if (!target_big_endian)
8133         offset_expr.X_add_number += off;
8134       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8135       if (!target_big_endian)
8136         offset_expr.X_add_number -= off;
8137       else
8138         offset_expr.X_add_number += off;
8139       macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8140       break;
8141
8142     case M_USD_A:
8143       s = "sdl";
8144       s2 = "sdr";
8145       off = 7;
8146       goto uswa;
8147     case M_USW_A:
8148       s = "swl";
8149       s2 = "swr";
8150       off = 3;
8151     uswa:
8152       used_at = 1;
8153       load_address (AT, &offset_expr, &used_at);
8154       if (breg != 0)
8155         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8156       if (!target_big_endian)
8157         expr1.X_add_number = off;
8158       else
8159         expr1.X_add_number = 0;
8160       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8161       if (!target_big_endian)
8162         expr1.X_add_number = 0;
8163       else
8164         expr1.X_add_number = off;
8165       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8166       break;
8167
8168     case M_USH_A:
8169       used_at = 1;
8170       load_address (AT, &offset_expr, &used_at);
8171       if (breg != 0)
8172         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8173       if (!target_big_endian)
8174         expr1.X_add_number = 0;
8175       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8176       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
8177       if (!target_big_endian)
8178         expr1.X_add_number = 1;
8179       else
8180         expr1.X_add_number = 0;
8181       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8182       if (!target_big_endian)
8183         expr1.X_add_number = 0;
8184       else
8185         expr1.X_add_number = 1;
8186       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8187       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8188       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8189       break;
8190
8191     default:
8192       /* FIXME: Check if this is one of the itbl macros, since they
8193          are added dynamically.  */
8194       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8195       break;
8196     }
8197   if (!mips_opts.at && used_at)
8198     as_bad (_("Macro used $at after \".set noat\""));
8199 }
8200
8201 /* Implement macros in mips16 mode.  */
8202
8203 static void
8204 mips16_macro (struct mips_cl_insn *ip)
8205 {
8206   int mask;
8207   int xreg, yreg, zreg, tmp;
8208   expressionS expr1;
8209   int dbl;
8210   const char *s, *s2, *s3;
8211
8212   mask = ip->insn_mo->mask;
8213
8214   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8215   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8216   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
8217
8218   expr1.X_op = O_constant;
8219   expr1.X_op_symbol = NULL;
8220   expr1.X_add_symbol = NULL;
8221   expr1.X_add_number = 1;
8222
8223   dbl = 0;
8224
8225   switch (mask)
8226     {
8227     default:
8228       internalError ();
8229
8230     case M_DDIV_3:
8231       dbl = 1;
8232     case M_DIV_3:
8233       s = "mflo";
8234       goto do_div3;
8235     case M_DREM_3:
8236       dbl = 1;
8237     case M_REM_3:
8238       s = "mfhi";
8239     do_div3:
8240       start_noreorder ();
8241       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
8242       expr1.X_add_number = 2;
8243       macro_build (&expr1, "bnez", "x,p", yreg);
8244       macro_build (NULL, "break", "6", 7);
8245
8246       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8247          since that causes an overflow.  We should do that as well,
8248          but I don't see how to do the comparisons without a temporary
8249          register.  */
8250       end_noreorder ();
8251       macro_build (NULL, s, "x", zreg);
8252       break;
8253
8254     case M_DIVU_3:
8255       s = "divu";
8256       s2 = "mflo";
8257       goto do_divu3;
8258     case M_REMU_3:
8259       s = "divu";
8260       s2 = "mfhi";
8261       goto do_divu3;
8262     case M_DDIVU_3:
8263       s = "ddivu";
8264       s2 = "mflo";
8265       goto do_divu3;
8266     case M_DREMU_3:
8267       s = "ddivu";
8268       s2 = "mfhi";
8269     do_divu3:
8270       start_noreorder ();
8271       macro_build (NULL, s, "0,x,y", xreg, yreg);
8272       expr1.X_add_number = 2;
8273       macro_build (&expr1, "bnez", "x,p", yreg);
8274       macro_build (NULL, "break", "6", 7);
8275       end_noreorder ();
8276       macro_build (NULL, s2, "x", zreg);
8277       break;
8278
8279     case M_DMUL:
8280       dbl = 1;
8281     case M_MUL:
8282       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8283       macro_build (NULL, "mflo", "x", zreg);
8284       break;
8285
8286     case M_DSUBU_I:
8287       dbl = 1;
8288       goto do_subu;
8289     case M_SUBU_I:
8290     do_subu:
8291       if (imm_expr.X_op != O_constant)
8292         as_bad (_("Unsupported large constant"));
8293       imm_expr.X_add_number = -imm_expr.X_add_number;
8294       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8295       break;
8296
8297     case M_SUBU_I_2:
8298       if (imm_expr.X_op != O_constant)
8299         as_bad (_("Unsupported large constant"));
8300       imm_expr.X_add_number = -imm_expr.X_add_number;
8301       macro_build (&imm_expr, "addiu", "x,k", xreg);
8302       break;
8303
8304     case M_DSUBU_I_2:
8305       if (imm_expr.X_op != O_constant)
8306         as_bad (_("Unsupported large constant"));
8307       imm_expr.X_add_number = -imm_expr.X_add_number;
8308       macro_build (&imm_expr, "daddiu", "y,j", yreg);
8309       break;
8310
8311     case M_BEQ:
8312       s = "cmp";
8313       s2 = "bteqz";
8314       goto do_branch;
8315     case M_BNE:
8316       s = "cmp";
8317       s2 = "btnez";
8318       goto do_branch;
8319     case M_BLT:
8320       s = "slt";
8321       s2 = "btnez";
8322       goto do_branch;
8323     case M_BLTU:
8324       s = "sltu";
8325       s2 = "btnez";
8326       goto do_branch;
8327     case M_BLE:
8328       s = "slt";
8329       s2 = "bteqz";
8330       goto do_reverse_branch;
8331     case M_BLEU:
8332       s = "sltu";
8333       s2 = "bteqz";
8334       goto do_reverse_branch;
8335     case M_BGE:
8336       s = "slt";
8337       s2 = "bteqz";
8338       goto do_branch;
8339     case M_BGEU:
8340       s = "sltu";
8341       s2 = "bteqz";
8342       goto do_branch;
8343     case M_BGT:
8344       s = "slt";
8345       s2 = "btnez";
8346       goto do_reverse_branch;
8347     case M_BGTU:
8348       s = "sltu";
8349       s2 = "btnez";
8350
8351     do_reverse_branch:
8352       tmp = xreg;
8353       xreg = yreg;
8354       yreg = tmp;
8355
8356     do_branch:
8357       macro_build (NULL, s, "x,y", xreg, yreg);
8358       macro_build (&offset_expr, s2, "p");
8359       break;
8360
8361     case M_BEQ_I:
8362       s = "cmpi";
8363       s2 = "bteqz";
8364       s3 = "x,U";
8365       goto do_branch_i;
8366     case M_BNE_I:
8367       s = "cmpi";
8368       s2 = "btnez";
8369       s3 = "x,U";
8370       goto do_branch_i;
8371     case M_BLT_I:
8372       s = "slti";
8373       s2 = "btnez";
8374       s3 = "x,8";
8375       goto do_branch_i;
8376     case M_BLTU_I:
8377       s = "sltiu";
8378       s2 = "btnez";
8379       s3 = "x,8";
8380       goto do_branch_i;
8381     case M_BLE_I:
8382       s = "slti";
8383       s2 = "btnez";
8384       s3 = "x,8";
8385       goto do_addone_branch_i;
8386     case M_BLEU_I:
8387       s = "sltiu";
8388       s2 = "btnez";
8389       s3 = "x,8";
8390       goto do_addone_branch_i;
8391     case M_BGE_I:
8392       s = "slti";
8393       s2 = "bteqz";
8394       s3 = "x,8";
8395       goto do_branch_i;
8396     case M_BGEU_I:
8397       s = "sltiu";
8398       s2 = "bteqz";
8399       s3 = "x,8";
8400       goto do_branch_i;
8401     case M_BGT_I:
8402       s = "slti";
8403       s2 = "bteqz";
8404       s3 = "x,8";
8405       goto do_addone_branch_i;
8406     case M_BGTU_I:
8407       s = "sltiu";
8408       s2 = "bteqz";
8409       s3 = "x,8";
8410
8411     do_addone_branch_i:
8412       if (imm_expr.X_op != O_constant)
8413         as_bad (_("Unsupported large constant"));
8414       ++imm_expr.X_add_number;
8415
8416     do_branch_i:
8417       macro_build (&imm_expr, s, s3, xreg);
8418       macro_build (&offset_expr, s2, "p");
8419       break;
8420
8421     case M_ABS:
8422       expr1.X_add_number = 0;
8423       macro_build (&expr1, "slti", "x,8", yreg);
8424       if (xreg != yreg)
8425         move_register (xreg, yreg);
8426       expr1.X_add_number = 2;
8427       macro_build (&expr1, "bteqz", "p");
8428       macro_build (NULL, "neg", "x,w", xreg, xreg);
8429     }
8430 }
8431
8432 /* For consistency checking, verify that all bits are specified either
8433    by the match/mask part of the instruction definition, or by the
8434    operand list.  */
8435 static int
8436 validate_mips_insn (const struct mips_opcode *opc)
8437 {
8438   const char *p = opc->args;
8439   char c;
8440   unsigned long used_bits = opc->mask;
8441
8442   if ((used_bits & opc->match) != opc->match)
8443     {
8444       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8445               opc->name, opc->args);
8446       return 0;
8447     }
8448 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
8449   while (*p)
8450     switch (c = *p++)
8451       {
8452       case ',': break;
8453       case '(': break;
8454       case ')': break;
8455       case '+':
8456         switch (c = *p++)
8457           {
8458           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
8459           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
8460           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
8461           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
8462           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8463           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8464           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8465           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
8466                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8467           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8468           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8469           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8470           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8471           case 'I': break;
8472           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
8473           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
8474                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8475           case 'x': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8476           case 'X': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8477           case 'p': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8478           case 'P': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8479           case 'Q': USE_BITS (OP_MASK_SEQI,     OP_SH_SEQI);    break;
8480           case 's': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8481           case 'S': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8482
8483           default:
8484             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8485                     c, opc->name, opc->args);
8486             return 0;
8487           }
8488         break;
8489       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8490       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8491       case 'A': break;
8492       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8493       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
8494       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8495       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8496       case 'F': break;
8497       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8498       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
8499       case 'I': break;
8500       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8501       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8502       case 'L': break;
8503       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
8504       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
8505       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
8506       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
8507                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8508       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
8509       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8510       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8511       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8512       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8513       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8514       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8515       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8516       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
8517       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8518       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
8519       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8520       case 'f': break;
8521       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
8522       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8523       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8524       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
8525       case 'l': break;
8526       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8527       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8528       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8529       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8530       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8531       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8532       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8533       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8534       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8535       case 'x': break;
8536       case 'z': break;
8537       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
8538       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8539                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8540       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
8541       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
8542       case '[': break;
8543       case ']': break;
8544       case '1': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8545       case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
8546       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
8547       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
8548       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
8549       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8550       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
8551       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
8552       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
8553       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
8554       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
8555       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
8556       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
8557       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
8558       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
8559       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
8560       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
8561       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8562       default:
8563         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8564                 c, opc->name, opc->args);
8565         return 0;
8566       }
8567 #undef USE_BITS
8568   if (used_bits != 0xffffffff)
8569     {
8570       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8571               ~used_bits & 0xffffffff, opc->name, opc->args);
8572       return 0;
8573     }
8574   return 1;
8575 }
8576
8577 /* UDI immediates.  */
8578 struct mips_immed {
8579   char          type;
8580   unsigned int  shift;
8581   unsigned long mask;
8582   const char *  desc;
8583 };
8584
8585 static const struct mips_immed mips_immed[] = {
8586   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
8587   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
8588   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
8589   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
8590   { 0,0,0,0 }
8591 };
8592
8593 /* Check whether an odd floating-point register is allowed.  */
8594 static int
8595 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8596 {
8597   const char *s = insn->name;
8598
8599   if (insn->pinfo == INSN_MACRO)
8600     /* Let a macro pass, we'll catch it later when it is expanded.  */
8601     return 1;
8602
8603   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8604     {
8605       /* Allow odd registers for single-precision ops.  */
8606       switch (insn->pinfo & (FP_S | FP_D))
8607         {
8608         case FP_S:
8609         case 0:
8610           return 1;     /* both single precision - ok */
8611         case FP_D:
8612           return 0;     /* both double precision - fail */
8613         default:
8614           break;
8615         }
8616
8617       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
8618       s = strchr (insn->name, '.');
8619       if (argnum == 2)
8620         s = s != NULL ? strchr (s + 1, '.') : NULL;
8621       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8622     } 
8623
8624   /* Single-precision coprocessor loads and moves are OK too.  */
8625   if ((insn->pinfo & FP_S)
8626       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8627                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8628     return 1;
8629
8630   return 0;
8631 }
8632
8633 /* This routine assembles an instruction into its binary format.  As a
8634    side effect, it sets one of the global variables imm_reloc or
8635    offset_reloc to the type of relocation to do if one of the operands
8636    is an address expression.  */
8637
8638 static void
8639 mips_ip (char *str, struct mips_cl_insn *ip)
8640 {
8641   char *s;
8642   const char *args;
8643   char c = 0;
8644   struct mips_opcode *insn;
8645   char *argsStart;
8646   unsigned int regno;
8647   unsigned int lastregno;
8648   unsigned int lastpos = 0;
8649   unsigned int limlo, limhi;
8650   char *s_reset;
8651   char save_c = 0;
8652   offsetT min_range, max_range;
8653   int argnum;
8654   unsigned int rtype;
8655
8656   insn_error = NULL;
8657
8658   /* If the instruction contains a '.', we first try to match an instruction
8659      including the '.'.  Then we try again without the '.'.  */
8660   insn = NULL;
8661   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8662     continue;
8663
8664   /* If we stopped on whitespace, then replace the whitespace with null for
8665      the call to hash_find.  Save the character we replaced just in case we
8666      have to re-parse the instruction.  */
8667   if (ISSPACE (*s))
8668     {
8669       save_c = *s;
8670       *s++ = '\0';
8671     }
8672
8673   insn = (struct mips_opcode *) hash_find (op_hash, str);
8674
8675   /* If we didn't find the instruction in the opcode table, try again, but
8676      this time with just the instruction up to, but not including the
8677      first '.'.  */
8678   if (insn == NULL)
8679     {
8680       /* Restore the character we overwrite above (if any).  */
8681       if (save_c)
8682         *(--s) = save_c;
8683
8684       /* Scan up to the first '.' or whitespace.  */
8685       for (s = str;
8686            *s != '\0' && *s != '.' && !ISSPACE (*s);
8687            ++s)
8688         continue;
8689
8690       /* If we did not find a '.', then we can quit now.  */
8691       if (*s != '.')
8692         {
8693           insn_error = _("Unrecognized opcode");
8694           return;
8695         }
8696
8697       /* Lookup the instruction in the hash table.  */
8698       *s++ = '\0';
8699       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8700         {
8701           insn_error = _("Unrecognized opcode");
8702           return;
8703         }
8704     }
8705
8706   argsStart = s;
8707   for (;;)
8708     {
8709       bfd_boolean ok;
8710
8711       gas_assert (strcmp (insn->name, str) == 0);
8712
8713       ok = is_opcode_valid (insn);
8714       if (! ok)
8715         {
8716           if (insn + 1 < &mips_opcodes[NUMOPCODES]
8717               && strcmp (insn->name, insn[1].name) == 0)
8718             {
8719               ++insn;
8720               continue;
8721             }
8722           else
8723             {
8724               if (!insn_error)
8725                 {
8726                   static char buf[100];
8727                   sprintf (buf,
8728                            _("opcode not supported on this processor: %s (%s)"),
8729                            mips_cpu_info_from_arch (mips_opts.arch)->name,
8730                            mips_cpu_info_from_isa (mips_opts.isa)->name);
8731                   insn_error = buf;
8732                 }
8733               if (save_c)
8734                 *(--s) = save_c;
8735               return;
8736             }
8737         }
8738
8739       create_insn (ip, insn);
8740       insn_error = NULL;
8741       argnum = 1;
8742       lastregno = 0xffffffff;
8743       for (args = insn->args;; ++args)
8744         {
8745           int is_mdmx;
8746
8747           s += strspn (s, " \t");
8748           is_mdmx = 0;
8749           switch (*args)
8750             {
8751             case '\0':          /* end of args */
8752               if (*s == '\0')
8753                 return;
8754               break;
8755
8756             case '2': /* DSP 2-bit unsigned immediate in bit 11.  */
8757               my_getExpression (&imm_expr, s);
8758               check_absolute_expr (ip, &imm_expr);
8759               if ((unsigned long) imm_expr.X_add_number != 1
8760                   && (unsigned long) imm_expr.X_add_number != 3)
8761                 {
8762                   as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8763                           (unsigned long) imm_expr.X_add_number);
8764                 }
8765               INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8766               imm_expr.X_op = O_absent;
8767               s = expr_end;
8768               continue;
8769
8770             case '3': /* DSP 3-bit unsigned immediate in bit 21.  */
8771               my_getExpression (&imm_expr, s);
8772               check_absolute_expr (ip, &imm_expr);
8773               if (imm_expr.X_add_number & ~OP_MASK_SA3)
8774                 {
8775                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8776                           OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8777                 }
8778               INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
8779               imm_expr.X_op = O_absent;
8780               s = expr_end;
8781               continue;
8782
8783             case '4': /* DSP 4-bit unsigned immediate in bit 21.  */
8784               my_getExpression (&imm_expr, s);
8785               check_absolute_expr (ip, &imm_expr);
8786               if (imm_expr.X_add_number & ~OP_MASK_SA4)
8787                 {
8788                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8789                           OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8790                 }
8791               INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
8792               imm_expr.X_op = O_absent;
8793               s = expr_end;
8794               continue;
8795
8796             case '5': /* DSP 8-bit unsigned immediate in bit 16.  */
8797               my_getExpression (&imm_expr, s);
8798               check_absolute_expr (ip, &imm_expr);
8799               if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8800                 {
8801                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8802                           OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8803                 }
8804               INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
8805               imm_expr.X_op = O_absent;
8806               s = expr_end;
8807               continue;
8808
8809             case '6': /* DSP 5-bit unsigned immediate in bit 21.  */
8810               my_getExpression (&imm_expr, s);
8811               check_absolute_expr (ip, &imm_expr);
8812               if (imm_expr.X_add_number & ~OP_MASK_RS)
8813                 {
8814                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8815                           OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8816                 }
8817               INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
8818               imm_expr.X_op = O_absent;
8819               s = expr_end;
8820               continue;
8821
8822             case '7': /* Four DSP accumulators in bits 11,12.  */
8823               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8824                   s[3] >= '0' && s[3] <= '3')
8825                 {
8826                   regno = s[3] - '0';
8827                   s += 4;
8828                   INSERT_OPERAND (DSPACC, *ip, regno);
8829                   continue;
8830                 }
8831               else
8832                 as_bad (_("Invalid dsp acc register"));
8833               break;
8834
8835             case '8': /* DSP 6-bit unsigned immediate in bit 11.  */
8836               my_getExpression (&imm_expr, s);
8837               check_absolute_expr (ip, &imm_expr);
8838               if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8839                 {
8840                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8841                           OP_MASK_WRDSP,
8842                           (unsigned long) imm_expr.X_add_number);
8843                 }
8844               INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
8845               imm_expr.X_op = O_absent;
8846               s = expr_end;
8847               continue;
8848
8849             case '9': /* Four DSP accumulators in bits 21,22.  */
8850               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8851                   s[3] >= '0' && s[3] <= '3')
8852                 {
8853                   regno = s[3] - '0';
8854                   s += 4;
8855                   INSERT_OPERAND (DSPACC_S, *ip, regno);
8856                   continue;
8857                 }
8858               else
8859                 as_bad (_("Invalid dsp acc register"));
8860               break;
8861
8862             case '0': /* DSP 6-bit signed immediate in bit 20.  */
8863               my_getExpression (&imm_expr, s);
8864               check_absolute_expr (ip, &imm_expr);
8865               min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8866               max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8867               if (imm_expr.X_add_number < min_range ||
8868                   imm_expr.X_add_number > max_range)
8869                 {
8870                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8871                           (long) min_range, (long) max_range,
8872                           (long) imm_expr.X_add_number);
8873                 }
8874               INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
8875               imm_expr.X_op = O_absent;
8876               s = expr_end;
8877               continue;
8878
8879             case '\'': /* DSP 6-bit unsigned immediate in bit 16.  */
8880               my_getExpression (&imm_expr, s);
8881               check_absolute_expr (ip, &imm_expr);
8882               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8883                 {
8884                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8885                           OP_MASK_RDDSP,
8886                           (unsigned long) imm_expr.X_add_number);
8887                 }
8888               INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
8889               imm_expr.X_op = O_absent;
8890               s = expr_end;
8891               continue;
8892
8893             case ':': /* DSP 7-bit signed immediate in bit 19.  */
8894               my_getExpression (&imm_expr, s);
8895               check_absolute_expr (ip, &imm_expr);
8896               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8897               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8898               if (imm_expr.X_add_number < min_range ||
8899                   imm_expr.X_add_number > max_range)
8900                 {
8901                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8902                           (long) min_range, (long) max_range,
8903                           (long) imm_expr.X_add_number);
8904                 }
8905               INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
8906               imm_expr.X_op = O_absent;
8907               s = expr_end;
8908               continue;
8909
8910             case '@': /* DSP 10-bit signed immediate in bit 16.  */
8911               my_getExpression (&imm_expr, s);
8912               check_absolute_expr (ip, &imm_expr);
8913               min_range = -((OP_MASK_IMM10 + 1) >> 1);
8914               max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8915               if (imm_expr.X_add_number < min_range ||
8916                   imm_expr.X_add_number > max_range)
8917                 {
8918                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8919                           (long) min_range, (long) max_range,
8920                           (long) imm_expr.X_add_number);
8921                 }
8922               INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
8923               imm_expr.X_op = O_absent;
8924               s = expr_end;
8925               continue;
8926
8927             case '!': /* MT usermode flag bit.  */
8928               my_getExpression (&imm_expr, s);
8929               check_absolute_expr (ip, &imm_expr);
8930               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
8931                 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
8932                         (unsigned long) imm_expr.X_add_number);
8933               INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
8934               imm_expr.X_op = O_absent;
8935               s = expr_end;
8936               continue;
8937
8938             case '$': /* MT load high flag bit.  */
8939               my_getExpression (&imm_expr, s);
8940               check_absolute_expr (ip, &imm_expr);
8941               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
8942                 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
8943                         (unsigned long) imm_expr.X_add_number);
8944               INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
8945               imm_expr.X_op = O_absent;
8946               s = expr_end;
8947               continue;
8948
8949             case '*': /* Four DSP accumulators in bits 18,19.  */
8950               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8951                   s[3] >= '0' && s[3] <= '3')
8952                 {
8953                   regno = s[3] - '0';
8954                   s += 4;
8955                   INSERT_OPERAND (MTACC_T, *ip, regno);
8956                   continue;
8957                 }
8958               else
8959                 as_bad (_("Invalid dsp/smartmips acc register"));
8960               break;
8961
8962             case '&': /* Four DSP accumulators in bits 13,14.  */
8963               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8964                   s[3] >= '0' && s[3] <= '3')
8965                 {
8966                   regno = s[3] - '0';
8967                   s += 4;
8968                   INSERT_OPERAND (MTACC_D, *ip, regno);
8969                   continue;
8970                 }
8971               else
8972                 as_bad (_("Invalid dsp/smartmips acc register"));
8973               break;
8974
8975             case ',':
8976               ++argnum;
8977               if (*s++ == *args)
8978                 continue;
8979               s--;
8980               switch (*++args)
8981                 {
8982                 case 'r':
8983                 case 'v':
8984                   INSERT_OPERAND (RS, *ip, lastregno);
8985                   continue;
8986
8987                 case 'w':
8988                   INSERT_OPERAND (RT, *ip, lastregno);
8989                   continue;
8990
8991                 case 'W':
8992                   INSERT_OPERAND (FT, *ip, lastregno);
8993                   continue;
8994
8995                 case 'V':
8996                   INSERT_OPERAND (FS, *ip, lastregno);
8997                   continue;
8998                 }
8999               break;
9000
9001             case '(':
9002               /* Handle optional base register.
9003                  Either the base register is omitted or
9004                  we must have a left paren.  */
9005               /* This is dependent on the next operand specifier
9006                  is a base register specification.  */
9007               gas_assert (args[1] == 'b');
9008               if (*s == '\0')
9009                 return;
9010
9011             case ')':           /* These must match exactly.  */
9012             case '[':
9013             case ']':
9014               if (*s++ == *args)
9015                 continue;
9016               break;
9017
9018             case '+':           /* Opcode extension character.  */
9019               switch (*++args)
9020                 {
9021                 case '1':       /* UDI immediates.  */
9022                 case '2':
9023                 case '3':
9024                 case '4':
9025                   {
9026                     const struct mips_immed *imm = mips_immed;
9027
9028                     while (imm->type && imm->type != *args)
9029                       ++imm;
9030                     if (! imm->type)
9031                       internalError ();
9032                     my_getExpression (&imm_expr, s);
9033                     check_absolute_expr (ip, &imm_expr);
9034                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
9035                       {
9036                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
9037                                  imm->desc ? imm->desc : ip->insn_mo->name,
9038                                  (unsigned long) imm_expr.X_add_number,
9039                                  (unsigned long) imm_expr.X_add_number);
9040                         imm_expr.X_add_number &= imm->mask;
9041                       }
9042                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
9043                                         << imm->shift);
9044                     imm_expr.X_op = O_absent;
9045                     s = expr_end;
9046                   }
9047                   continue;
9048
9049                 case 'A':               /* ins/ext position, becomes LSB.  */
9050                   limlo = 0;
9051                   limhi = 31;
9052                   goto do_lsb;
9053                 case 'E':
9054                   limlo = 32;
9055                   limhi = 63;
9056                   goto do_lsb;
9057                 do_lsb:
9058                   my_getExpression (&imm_expr, s);
9059                   check_absolute_expr (ip, &imm_expr);
9060                   if ((unsigned long) imm_expr.X_add_number < limlo
9061                       || (unsigned long) imm_expr.X_add_number > limhi)
9062                     {
9063                       as_bad (_("Improper position (%lu)"),
9064                               (unsigned long) imm_expr.X_add_number);
9065                       imm_expr.X_add_number = limlo;
9066                     }
9067                   lastpos = imm_expr.X_add_number;
9068                   INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9069                   imm_expr.X_op = O_absent;
9070                   s = expr_end;
9071                   continue;
9072
9073                 case 'B':               /* ins size, becomes MSB.  */
9074                   limlo = 1;
9075                   limhi = 32;
9076                   goto do_msb;
9077                 case 'F':
9078                   limlo = 33;
9079                   limhi = 64;
9080                   goto do_msb;
9081                 do_msb:
9082                   my_getExpression (&imm_expr, s);
9083                   check_absolute_expr (ip, &imm_expr);
9084                   /* Check for negative input so that small negative numbers
9085                      will not succeed incorrectly.  The checks against
9086                      (pos+size) transitively check "size" itself,
9087                      assuming that "pos" is reasonable.  */
9088                   if ((long) imm_expr.X_add_number < 0
9089                       || ((unsigned long) imm_expr.X_add_number
9090                           + lastpos) < limlo
9091                       || ((unsigned long) imm_expr.X_add_number
9092                           + lastpos) > limhi)
9093                     {
9094                       as_bad (_("Improper insert size (%lu, position %lu)"),
9095                               (unsigned long) imm_expr.X_add_number,
9096                               (unsigned long) lastpos);
9097                       imm_expr.X_add_number = limlo - lastpos;
9098                     }
9099                   INSERT_OPERAND (INSMSB, *ip,
9100                                  lastpos + imm_expr.X_add_number - 1);
9101                   imm_expr.X_op = O_absent;
9102                   s = expr_end;
9103                   continue;
9104
9105                 case 'C':               /* ext size, becomes MSBD.  */
9106                   limlo = 1;
9107                   limhi = 32;
9108                   goto do_msbd;
9109                 case 'G':
9110                   limlo = 33;
9111                   limhi = 64;
9112                   goto do_msbd;
9113                 case 'H':
9114                   limlo = 33;
9115                   limhi = 64;
9116                   goto do_msbd;
9117                 do_msbd:
9118                   my_getExpression (&imm_expr, s);
9119                   check_absolute_expr (ip, &imm_expr);
9120                   /* Check for negative input so that small negative numbers
9121                      will not succeed incorrectly.  The checks against
9122                      (pos+size) transitively check "size" itself,
9123                      assuming that "pos" is reasonable.  */
9124                   if ((long) imm_expr.X_add_number < 0
9125                       || ((unsigned long) imm_expr.X_add_number
9126                           + lastpos) < limlo
9127                       || ((unsigned long) imm_expr.X_add_number
9128                           + lastpos) > limhi)
9129                     {
9130                       as_bad (_("Improper extract size (%lu, position %lu)"),
9131                               (unsigned long) imm_expr.X_add_number,
9132                               (unsigned long) lastpos);
9133                       imm_expr.X_add_number = limlo - lastpos;
9134                     }
9135                   INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
9136                   imm_expr.X_op = O_absent;
9137                   s = expr_end;
9138                   continue;
9139
9140                 case 'D':
9141                   /* +D is for disassembly only; never match.  */
9142                   break;
9143
9144                 case 'I':
9145                   /* "+I" is like "I", except that imm2_expr is used.  */
9146                   my_getExpression (&imm2_expr, s);
9147                   if (imm2_expr.X_op != O_big
9148                       && imm2_expr.X_op != O_constant)
9149                   insn_error = _("absolute expression required");
9150                   if (HAVE_32BIT_GPRS)
9151                     normalize_constant_expr (&imm2_expr);
9152                   s = expr_end;
9153                   continue;
9154
9155                 case 'T': /* Coprocessor register.  */
9156                   /* +T is for disassembly only; never match.  */
9157                   break;
9158
9159                 case 't': /* Coprocessor register number.  */
9160                   if (s[0] == '$' && ISDIGIT (s[1]))
9161                     {
9162                       ++s;
9163                       regno = 0;
9164                       do
9165                         {
9166                           regno *= 10;
9167                           regno += *s - '0';
9168                           ++s;
9169                         }
9170                       while (ISDIGIT (*s));
9171                       if (regno > 31)
9172                         as_bad (_("Invalid register number (%d)"), regno);
9173                       else
9174                         {
9175                           INSERT_OPERAND (RT, *ip, regno);
9176                           continue;
9177                         }
9178                     }
9179                   else
9180                     as_bad (_("Invalid coprocessor 0 register number"));
9181                   break;
9182
9183                 case 'x':
9184                   /* bbit[01] and bbit[01]32 bit index.  Give error if index
9185                      is not in the valid range.  */
9186                   my_getExpression (&imm_expr, s);
9187                   check_absolute_expr (ip, &imm_expr);
9188                   if ((unsigned) imm_expr.X_add_number > 31)
9189                     {
9190                       as_bad (_("Improper bit index (%lu)"),
9191                               (unsigned long) imm_expr.X_add_number);
9192                       imm_expr.X_add_number = 0;
9193                     }
9194                   INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number);
9195                   imm_expr.X_op = O_absent;
9196                   s = expr_end;
9197                   continue;
9198
9199                 case 'X':
9200                   /* bbit[01] bit index when bbit is used but we generate
9201                      bbit[01]32 because the index is over 32.  Move to the
9202                      next candidate if index is not in the valid range.  */
9203                   my_getExpression (&imm_expr, s);
9204                   check_absolute_expr (ip, &imm_expr);
9205                   if ((unsigned) imm_expr.X_add_number < 32
9206                       || (unsigned) imm_expr.X_add_number > 63)
9207                     break;
9208                   INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number - 32);
9209                   imm_expr.X_op = O_absent;
9210                   s = expr_end;
9211                   continue;
9212
9213                 case 'p':
9214                   /* cins, cins32, exts and exts32 position field.  Give error
9215                      if it's not in the valid range.  */
9216                   my_getExpression (&imm_expr, s);
9217                   check_absolute_expr (ip, &imm_expr);
9218                   if ((unsigned) imm_expr.X_add_number > 31)
9219                     {
9220                       as_bad (_("Improper position (%lu)"),
9221                               (unsigned long) imm_expr.X_add_number);
9222                       imm_expr.X_add_number = 0;
9223                     }
9224                   /* Make the pos explicit to simplify +S.  */
9225                   lastpos = imm_expr.X_add_number + 32;
9226                   INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number);
9227                   imm_expr.X_op = O_absent;
9228                   s = expr_end;
9229                   continue;
9230
9231                 case 'P':
9232                   /* cins, cins32, exts and exts32 position field.  Move to
9233                      the next candidate if it's not in the valid range.  */
9234                   my_getExpression (&imm_expr, s);
9235                   check_absolute_expr (ip, &imm_expr);
9236                   if ((unsigned) imm_expr.X_add_number < 32
9237                       || (unsigned) imm_expr.X_add_number > 63)
9238                     break;
9239                   lastpos = imm_expr.X_add_number;
9240                   INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number - 32);
9241                   imm_expr.X_op = O_absent;
9242                   s = expr_end;
9243                   continue;
9244
9245                 case 's':
9246                   /* cins and exts length-minus-one field.  */
9247                   my_getExpression (&imm_expr, s);
9248                   check_absolute_expr (ip, &imm_expr);
9249                   if ((unsigned long) imm_expr.X_add_number > 31)
9250                     {
9251                       as_bad (_("Improper size (%lu)"),
9252                               (unsigned long) imm_expr.X_add_number);
9253                       imm_expr.X_add_number = 0;
9254                     }
9255                   INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9256                   imm_expr.X_op = O_absent;
9257                   s = expr_end;
9258                   continue;
9259
9260                 case 'S':
9261                   /* cins32/exts32 and cins/exts aliasing cint32/exts32
9262                      length-minus-one field.  */
9263                   my_getExpression (&imm_expr, s);
9264                   check_absolute_expr (ip, &imm_expr);
9265                   if ((long) imm_expr.X_add_number < 0
9266                       || (unsigned long) imm_expr.X_add_number + lastpos > 63)
9267                     {
9268                       as_bad (_("Improper size (%lu)"),
9269                               (unsigned long) imm_expr.X_add_number);
9270                       imm_expr.X_add_number = 0;
9271                     }
9272                   INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9273                   imm_expr.X_op = O_absent;
9274                   s = expr_end;
9275                   continue;
9276
9277                 case 'Q':
9278                   /* seqi/snei immediate field.  */
9279                   my_getExpression (&imm_expr, s);
9280                   check_absolute_expr (ip, &imm_expr);
9281                   if ((long) imm_expr.X_add_number < -512
9282                       || (long) imm_expr.X_add_number >= 512)
9283                     {
9284                       as_bad (_("Improper immediate (%ld)"),
9285                                (long) imm_expr.X_add_number);
9286                       imm_expr.X_add_number = 0;
9287                     }
9288                   INSERT_OPERAND (SEQI, *ip, imm_expr.X_add_number);
9289                   imm_expr.X_op = O_absent;
9290                   s = expr_end;
9291                   continue;
9292
9293                 default:
9294                   as_bad (_("Internal error: bad mips opcode "
9295                             "(unknown extension operand type `+%c'): %s %s"),
9296                           *args, insn->name, insn->args);
9297                   /* Further processing is fruitless.  */
9298                   return;
9299                 }
9300               break;
9301
9302             case '<':           /* must be at least one digit */
9303               /*
9304                * According to the manual, if the shift amount is greater
9305                * than 31 or less than 0, then the shift amount should be
9306                * mod 32.  In reality the mips assembler issues an error.
9307                * We issue a warning and mask out all but the low 5 bits.
9308                */
9309               my_getExpression (&imm_expr, s);
9310               check_absolute_expr (ip, &imm_expr);
9311               if ((unsigned long) imm_expr.X_add_number > 31)
9312                 as_warn (_("Improper shift amount (%lu)"),
9313                          (unsigned long) imm_expr.X_add_number);
9314               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9315               imm_expr.X_op = O_absent;
9316               s = expr_end;
9317               continue;
9318
9319             case '>':           /* shift amount minus 32 */
9320               my_getExpression (&imm_expr, s);
9321               check_absolute_expr (ip, &imm_expr);
9322               if ((unsigned long) imm_expr.X_add_number < 32
9323                   || (unsigned long) imm_expr.X_add_number > 63)
9324                 break;
9325               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
9326               imm_expr.X_op = O_absent;
9327               s = expr_end;
9328               continue;
9329
9330             case 'k':           /* CACHE code.  */
9331             case 'h':           /* PREFX code.  */
9332             case '1':           /* SYNC type.  */
9333               my_getExpression (&imm_expr, s);
9334               check_absolute_expr (ip, &imm_expr);
9335               if ((unsigned long) imm_expr.X_add_number > 31)
9336                 as_warn (_("Invalid value for `%s' (%lu)"),
9337                          ip->insn_mo->name,
9338                          (unsigned long) imm_expr.X_add_number);
9339               if (*args == 'k')
9340                 {
9341                   if (mips_fix_cn63xxp1 && strcmp ("pref", insn->name) == 0)
9342                     switch (imm_expr.X_add_number)
9343                       {
9344                       case 5:
9345                       case 25:
9346                       case 26:
9347                       case 27:
9348                       case 28:
9349                       case 29:
9350                       case 30:
9351                       case 31:  /* These are ok.  */
9352                         break;
9353
9354                       default:  /* The rest must be changed to 28.  */
9355                         imm_expr.X_add_number = 28;
9356                         break;
9357                       }
9358                   INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9359                 }
9360               else if (*args == 'h')
9361                 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
9362               else
9363                 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9364               imm_expr.X_op = O_absent;
9365               s = expr_end;
9366               continue;
9367
9368             case 'c':           /* BREAK code.  */
9369               my_getExpression (&imm_expr, s);
9370               check_absolute_expr (ip, &imm_expr);
9371               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9372                 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9373                          ip->insn_mo->name,
9374                          (unsigned long) imm_expr.X_add_number);
9375               INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9376               imm_expr.X_op = O_absent;
9377               s = expr_end;
9378               continue;
9379
9380             case 'q':           /* Lower BREAK code.  */
9381               my_getExpression (&imm_expr, s);
9382               check_absolute_expr (ip, &imm_expr);
9383               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9384                 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9385                          ip->insn_mo->name,
9386                          (unsigned long) imm_expr.X_add_number);
9387               INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9388               imm_expr.X_op = O_absent;
9389               s = expr_end;
9390               continue;
9391
9392             case 'B':           /* 20-bit SYSCALL/BREAK code.  */
9393               my_getExpression (&imm_expr, s);
9394               check_absolute_expr (ip, &imm_expr);
9395               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9396                 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9397                          ip->insn_mo->name,
9398                          (unsigned long) imm_expr.X_add_number);
9399               INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9400               imm_expr.X_op = O_absent;
9401               s = expr_end;
9402               continue;
9403
9404             case 'C':           /* Coprocessor code.  */
9405               my_getExpression (&imm_expr, s);
9406               check_absolute_expr (ip, &imm_expr);
9407               if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9408                 {
9409                   as_warn (_("Coproccesor code > 25 bits (%lu)"),
9410                            (unsigned long) imm_expr.X_add_number);
9411                   imm_expr.X_add_number &= OP_MASK_COPZ;
9412                 }
9413               INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9414               imm_expr.X_op = O_absent;
9415               s = expr_end;
9416               continue;
9417
9418             case 'J':           /* 19-bit WAIT code.  */
9419               my_getExpression (&imm_expr, s);
9420               check_absolute_expr (ip, &imm_expr);
9421               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9422                 {
9423                   as_warn (_("Illegal 19-bit code (%lu)"),
9424                            (unsigned long) imm_expr.X_add_number);
9425                   imm_expr.X_add_number &= OP_MASK_CODE19;
9426                 }
9427               INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9428               imm_expr.X_op = O_absent;
9429               s = expr_end;
9430               continue;
9431
9432             case 'P':           /* Performance register.  */
9433               my_getExpression (&imm_expr, s);
9434               check_absolute_expr (ip, &imm_expr);
9435               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9436                 as_warn (_("Invalid performance register (%lu)"),
9437                          (unsigned long) imm_expr.X_add_number);
9438               INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9439               imm_expr.X_op = O_absent;
9440               s = expr_end;
9441               continue;
9442
9443             case 'G':           /* Coprocessor destination register.  */
9444               if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9445                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9446               else
9447                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9448               INSERT_OPERAND (RD, *ip, regno);
9449               if (ok) 
9450                 {
9451                   lastregno = regno;
9452                   continue;
9453                 }
9454               else
9455                 break;
9456
9457             case 'b':           /* Base register.  */
9458             case 'd':           /* Destination register.  */
9459             case 's':           /* Source register.  */
9460             case 't':           /* Target register.  */
9461             case 'r':           /* Both target and source.  */
9462             case 'v':           /* Both dest and source.  */
9463             case 'w':           /* Both dest and target.  */
9464             case 'E':           /* Coprocessor target register.  */
9465             case 'K':           /* RDHWR destination register.  */
9466             case 'x':           /* Ignore register name.  */
9467             case 'z':           /* Must be zero register.  */
9468             case 'U':           /* Destination register (CLO/CLZ).  */
9469             case 'g':           /* Coprocessor destination register.  */
9470               s_reset = s;
9471               if (*args == 'E' || *args == 'K')
9472                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9473               else
9474                 {
9475                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9476                   if (regno == AT && mips_opts.at)
9477                     {
9478                       if (mips_opts.at == ATREG)
9479                         as_warn (_("Used $at without \".set noat\""));
9480                       else
9481                         as_warn (_("Used $%u with \".set at=$%u\""),
9482                                  regno, mips_opts.at);
9483                     }
9484                 }
9485               if (ok)
9486                 {
9487                   c = *args;
9488                   if (*s == ' ')
9489                     ++s;
9490                   if (args[1] != *s)
9491                     {
9492                       if (c == 'r' || c == 'v' || c == 'w')
9493                         {
9494                           regno = lastregno;
9495                           s = s_reset;
9496                           ++args;
9497                         }
9498                     }
9499                   /* 'z' only matches $0.  */
9500                   if (c == 'z' && regno != 0)
9501                     break;
9502
9503                   if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
9504                     {
9505                       if (regno == lastregno)
9506                         {
9507                           insn_error
9508                             = _("Source and destination must be different");
9509                           continue;
9510                         }
9511                       if (regno == 31 && lastregno == 0xffffffff)
9512                         {
9513                           insn_error
9514                             = _("A destination register must be supplied");
9515                           continue;
9516                         }
9517                     }
9518                   /* Now that we have assembled one operand, we use the args
9519                      string to figure out where it goes in the instruction.  */
9520                   switch (c)
9521                     {
9522                     case 'r':
9523                     case 's':
9524                     case 'v':
9525                     case 'b':
9526                       INSERT_OPERAND (RS, *ip, regno);
9527                       break;
9528                     case 'd':
9529                     case 'K':
9530                     case 'g':
9531                       INSERT_OPERAND (RD, *ip, regno);
9532                       break;
9533                     case 'U':
9534                       INSERT_OPERAND (RD, *ip, regno);
9535                       INSERT_OPERAND (RT, *ip, regno);
9536                       break;
9537                     case 'w':
9538                     case 't':
9539                     case 'E':
9540                       INSERT_OPERAND (RT, *ip, regno);
9541                       break;
9542                     case 'x':
9543                       /* This case exists because on the r3000 trunc
9544                          expands into a macro which requires a gp
9545                          register.  On the r6000 or r4000 it is
9546                          assembled into a single instruction which
9547                          ignores the register.  Thus the insn version
9548                          is MIPS_ISA2 and uses 'x', and the macro
9549                          version is MIPS_ISA1 and uses 't'.  */
9550                       break;
9551                     case 'z':
9552                       /* This case is for the div instruction, which
9553                          acts differently if the destination argument
9554                          is $0.  This only matches $0, and is checked
9555                          outside the switch.  */
9556                       break;
9557                     }
9558                   lastregno = regno;
9559                   continue;
9560                 }
9561               switch (*args++)
9562                 {
9563                 case 'r':
9564                 case 'v':
9565                   INSERT_OPERAND (RS, *ip, lastregno);
9566                   continue;
9567                 case 'w':
9568                   INSERT_OPERAND (RT, *ip, lastregno);
9569                   continue;
9570                 }
9571               break;
9572
9573             case 'O':           /* MDMX alignment immediate constant.  */
9574               my_getExpression (&imm_expr, s);
9575               check_absolute_expr (ip, &imm_expr);
9576               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9577                 as_warn (_("Improper align amount (%ld), using low bits"),
9578                          (long) imm_expr.X_add_number);
9579               INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9580               imm_expr.X_op = O_absent;
9581               s = expr_end;
9582               continue;
9583
9584             case 'Q':           /* MDMX vector, element sel, or const.  */
9585               if (s[0] != '$')
9586                 {
9587                   /* MDMX Immediate.  */
9588                   my_getExpression (&imm_expr, s);
9589                   check_absolute_expr (ip, &imm_expr);
9590                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9591                     as_warn (_("Invalid MDMX Immediate (%ld)"),
9592                              (long) imm_expr.X_add_number);
9593                   INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9594                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9595                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9596                   else
9597                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9598                   imm_expr.X_op = O_absent;
9599                   s = expr_end;
9600                   continue;
9601                 }
9602               /* Not MDMX Immediate.  Fall through.  */
9603             case 'X':           /* MDMX destination register.  */
9604             case 'Y':           /* MDMX source register.  */
9605             case 'Z':           /* MDMX target register.  */
9606               is_mdmx = 1;
9607             case 'D':           /* Floating point destination register.  */
9608             case 'S':           /* Floating point source register.  */
9609             case 'T':           /* Floating point target register.  */
9610             case 'R':           /* Floating point source register.  */
9611             case 'V':
9612             case 'W':
9613               rtype = RTYPE_FPU;
9614               if (is_mdmx
9615                   || (mips_opts.ase_mdmx
9616                       && (ip->insn_mo->pinfo & FP_D)
9617                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9618                                                 | INSN_COPROC_MEMORY_DELAY
9619                                                 | INSN_LOAD_COPROC_DELAY
9620                                                 | INSN_LOAD_MEMORY_DELAY
9621                                                 | INSN_STORE_MEMORY))))
9622                 rtype |= RTYPE_VEC;
9623               s_reset = s;
9624               if (reg_lookup (&s, rtype, &regno))
9625                 {
9626                   if ((regno & 1) != 0
9627                       && HAVE_32BIT_FPRS
9628                       && !mips_oddfpreg_ok (ip->insn_mo, argnum))
9629                     as_warn (_("Float register should be even, was %d"),
9630                              regno);
9631
9632                   c = *args;
9633                   if (*s == ' ')
9634                     ++s;
9635                   if (args[1] != *s)
9636                     {
9637                       if (c == 'V' || c == 'W')
9638                         {
9639                           regno = lastregno;
9640                           s = s_reset;
9641                           ++args;
9642                         }
9643                     }
9644                   switch (c)
9645                     {
9646                     case 'D':
9647                     case 'X':
9648                       INSERT_OPERAND (FD, *ip, regno);
9649                       break;
9650                     case 'V':
9651                     case 'S':
9652                     case 'Y':
9653                       INSERT_OPERAND (FS, *ip, regno);
9654                       break;
9655                     case 'Q':
9656                       /* This is like 'Z', but also needs to fix the MDMX
9657                          vector/scalar select bits.  Note that the
9658                          scalar immediate case is handled above.  */
9659                       if (*s == '[')
9660                         {
9661                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9662                           int max_el = (is_qh ? 3 : 7);
9663                           s++;
9664                           my_getExpression(&imm_expr, s);
9665                           check_absolute_expr (ip, &imm_expr);
9666                           s = expr_end;
9667                           if (imm_expr.X_add_number > max_el)
9668                             as_bad (_("Bad element selector %ld"),
9669                                     (long) imm_expr.X_add_number);
9670                           imm_expr.X_add_number &= max_el;
9671                           ip->insn_opcode |= (imm_expr.X_add_number
9672                                               << (OP_SH_VSEL +
9673                                                   (is_qh ? 2 : 1)));
9674                           imm_expr.X_op = O_absent;
9675                           if (*s != ']')
9676                             as_warn (_("Expecting ']' found '%s'"), s);
9677                           else
9678                             s++;
9679                         }
9680                       else
9681                         {
9682                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9683                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9684                                                 << OP_SH_VSEL);
9685                           else
9686                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9687                                                 OP_SH_VSEL);
9688                         }
9689                       /* Fall through.  */
9690                     case 'W':
9691                     case 'T':
9692                     case 'Z':
9693                       INSERT_OPERAND (FT, *ip, regno);
9694                       break;
9695                     case 'R':
9696                       INSERT_OPERAND (FR, *ip, regno);
9697                       break;
9698                     }
9699                   lastregno = regno;
9700                   continue;
9701                 }
9702
9703               switch (*args++)
9704                 {
9705                 case 'V':
9706                   INSERT_OPERAND (FS, *ip, lastregno);
9707                   continue;
9708                 case 'W':
9709                   INSERT_OPERAND (FT, *ip, lastregno);
9710                   continue;
9711                 }
9712               break;
9713
9714             case 'I':
9715               my_getExpression (&imm_expr, s);
9716               if (imm_expr.X_op != O_big
9717                   && imm_expr.X_op != O_constant)
9718                 insn_error = _("absolute expression required");
9719               if (HAVE_32BIT_GPRS)
9720                 normalize_constant_expr (&imm_expr);
9721               s = expr_end;
9722               continue;
9723
9724             case 'A':
9725               my_getExpression (&offset_expr, s);
9726               normalize_address_expr (&offset_expr);
9727               *imm_reloc = BFD_RELOC_32;
9728               s = expr_end;
9729               continue;
9730
9731             case 'F':
9732             case 'L':
9733             case 'f':
9734             case 'l':
9735               {
9736                 int f64;
9737                 int using_gprs;
9738                 char *save_in;
9739                 char *err;
9740                 unsigned char temp[8];
9741                 int len;
9742                 unsigned int length;
9743                 segT seg;
9744                 subsegT subseg;
9745                 char *p;
9746
9747                 /* These only appear as the last operand in an
9748                    instruction, and every instruction that accepts
9749                    them in any variant accepts them in all variants.
9750                    This means we don't have to worry about backing out
9751                    any changes if the instruction does not match.
9752
9753                    The difference between them is the size of the
9754                    floating point constant and where it goes.  For 'F'
9755                    and 'L' the constant is 64 bits; for 'f' and 'l' it
9756                    is 32 bits.  Where the constant is placed is based
9757                    on how the MIPS assembler does things:
9758                     F -- .rdata
9759                     L -- .lit8
9760                     f -- immediate value
9761                     l -- .lit4
9762
9763                     The .lit4 and .lit8 sections are only used if
9764                     permitted by the -G argument.
9765
9766                     The code below needs to know whether the target register
9767                     is 32 or 64 bits wide.  It relies on the fact 'f' and
9768                     'F' are used with GPR-based instructions and 'l' and
9769                     'L' are used with FPR-based instructions.  */
9770
9771                 f64 = *args == 'F' || *args == 'L';
9772                 using_gprs = *args == 'F' || *args == 'f';
9773
9774                 save_in = input_line_pointer;
9775                 input_line_pointer = s;
9776                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9777                 length = len;
9778                 s = input_line_pointer;
9779                 input_line_pointer = save_in;
9780                 if (err != NULL && *err != '\0')
9781                   {
9782                     as_bad (_("Bad floating point constant: %s"), err);
9783                     memset (temp, '\0', sizeof temp);
9784                     length = f64 ? 8 : 4;
9785                   }
9786
9787                 gas_assert (length == (unsigned) (f64 ? 8 : 4));
9788
9789                 if (*args == 'f'
9790                     || (*args == 'l'
9791                         && (g_switch_value < 4
9792                             || (temp[0] == 0 && temp[1] == 0)
9793                             || (temp[2] == 0 && temp[3] == 0))))
9794                   {
9795                     imm_expr.X_op = O_constant;
9796                     if (!target_big_endian)
9797                       imm_expr.X_add_number = bfd_getl32 (temp);
9798                     else
9799                       imm_expr.X_add_number = bfd_getb32 (temp);
9800                   }
9801                 else if (length > 4
9802                          && !mips_disable_float_construction
9803                          /* Constants can only be constructed in GPRs and
9804                             copied to FPRs if the GPRs are at least as wide
9805                             as the FPRs.  Force the constant into memory if
9806                             we are using 64-bit FPRs but the GPRs are only
9807                             32 bits wide.  */
9808                          && (using_gprs
9809                              || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9810                          && ((temp[0] == 0 && temp[1] == 0)
9811                              || (temp[2] == 0 && temp[3] == 0))
9812                          && ((temp[4] == 0 && temp[5] == 0)
9813                              || (temp[6] == 0 && temp[7] == 0)))
9814                   {
9815                     /* The value is simple enough to load with a couple of
9816                        instructions.  If using 32-bit registers, set
9817                        imm_expr to the high order 32 bits and offset_expr to
9818                        the low order 32 bits.  Otherwise, set imm_expr to
9819                        the entire 64 bit constant.  */
9820                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9821                       {
9822                         imm_expr.X_op = O_constant;
9823                         offset_expr.X_op = O_constant;
9824                         if (!target_big_endian)
9825                           {
9826                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
9827                             offset_expr.X_add_number = bfd_getl32 (temp);
9828                           }
9829                         else
9830                           {
9831                             imm_expr.X_add_number = bfd_getb32 (temp);
9832                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
9833                           }
9834                         if (offset_expr.X_add_number == 0)
9835                           offset_expr.X_op = O_absent;
9836                       }
9837                     else if (sizeof (imm_expr.X_add_number) > 4)
9838                       {
9839                         imm_expr.X_op = O_constant;
9840                         if (!target_big_endian)
9841                           imm_expr.X_add_number = bfd_getl64 (temp);
9842                         else
9843                           imm_expr.X_add_number = bfd_getb64 (temp);
9844                       }
9845                     else
9846                       {
9847                         imm_expr.X_op = O_big;
9848                         imm_expr.X_add_number = 4;
9849                         if (!target_big_endian)
9850                           {
9851                             generic_bignum[0] = bfd_getl16 (temp);
9852                             generic_bignum[1] = bfd_getl16 (temp + 2);
9853                             generic_bignum[2] = bfd_getl16 (temp + 4);
9854                             generic_bignum[3] = bfd_getl16 (temp + 6);
9855                           }
9856                         else
9857                           {
9858                             generic_bignum[0] = bfd_getb16 (temp + 6);
9859                             generic_bignum[1] = bfd_getb16 (temp + 4);
9860                             generic_bignum[2] = bfd_getb16 (temp + 2);
9861                             generic_bignum[3] = bfd_getb16 (temp);
9862                           }
9863                       }
9864                   }
9865                 else
9866                   {
9867                     const char *newname;
9868                     segT new_seg;
9869
9870                     /* Switch to the right section.  */
9871                     seg = now_seg;
9872                     subseg = now_subseg;
9873                     switch (*args)
9874                       {
9875                       default: /* unused default case avoids warnings.  */
9876                       case 'L':
9877                         newname = RDATA_SECTION_NAME;
9878                         if (g_switch_value >= 8)
9879                           newname = ".lit8";
9880                         break;
9881                       case 'F':
9882                         newname = RDATA_SECTION_NAME;
9883                         break;
9884                       case 'l':
9885                         gas_assert (g_switch_value >= 4);
9886                         newname = ".lit4";
9887                         break;
9888                       }
9889                     new_seg = subseg_new (newname, (subsegT) 0);
9890                     if (IS_ELF)
9891                       bfd_set_section_flags (stdoutput, new_seg,
9892                                              (SEC_ALLOC
9893                                               | SEC_LOAD
9894                                               | SEC_READONLY
9895                                               | SEC_DATA));
9896                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
9897                     if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
9898                       record_alignment (new_seg, 4);
9899                     else
9900                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
9901                     if (seg == now_seg)
9902                       as_bad (_("Can't use floating point insn in this section"));
9903
9904                     /* Set the argument to the current address in the
9905                        section.  */
9906                     offset_expr.X_op = O_symbol;
9907                     offset_expr.X_add_symbol = symbol_temp_new_now ();
9908                     offset_expr.X_add_number = 0;
9909
9910                     /* Put the floating point number into the section.  */
9911                     p = frag_more ((int) length);
9912                     memcpy (p, temp, length);
9913
9914                     /* Switch back to the original section.  */
9915                     subseg_set (seg, subseg);
9916                   }
9917               }
9918               continue;
9919
9920             case 'i':           /* 16-bit unsigned immediate.  */
9921             case 'j':           /* 16-bit signed immediate.  */
9922               *imm_reloc = BFD_RELOC_LO16;
9923               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9924                 {
9925                   int more;
9926                   offsetT minval, maxval;
9927
9928                   more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9929                           && strcmp (insn->name, insn[1].name) == 0);
9930
9931                   /* If the expression was written as an unsigned number,
9932                      only treat it as signed if there are no more
9933                      alternatives.  */
9934                   if (more
9935                       && *args == 'j'
9936                       && sizeof (imm_expr.X_add_number) <= 4
9937                       && imm_expr.X_op == O_constant
9938                       && imm_expr.X_add_number < 0
9939                       && imm_expr.X_unsigned
9940                       && HAVE_64BIT_GPRS)
9941                     break;
9942
9943                   /* For compatibility with older assemblers, we accept
9944                      0x8000-0xffff as signed 16-bit numbers when only
9945                      signed numbers are allowed.  */
9946                   if (*args == 'i')
9947                     minval = 0, maxval = 0xffff;
9948                   else if (more)
9949                     minval = -0x8000, maxval = 0x7fff;
9950                   else
9951                     minval = -0x8000, maxval = 0xffff;
9952
9953                   if (imm_expr.X_op != O_constant
9954                       || imm_expr.X_add_number < minval
9955                       || imm_expr.X_add_number > maxval)
9956                     {
9957                       if (more)
9958                         break;
9959                       if (imm_expr.X_op == O_constant
9960                           || imm_expr.X_op == O_big)
9961                         as_bad (_("Expression out of range"));
9962                     }
9963                 }
9964               s = expr_end;
9965               continue;
9966
9967             case 'o':           /* 16-bit offset.  */
9968               offset_reloc[0] = BFD_RELOC_LO16;
9969               offset_reloc[1] = BFD_RELOC_UNUSED;
9970               offset_reloc[2] = BFD_RELOC_UNUSED;
9971
9972               /* Check whether there is only a single bracketed expression
9973                  left.  If so, it must be the base register and the
9974                  constant must be zero.  */
9975               offset_reloc[0] = BFD_RELOC_LO16;
9976               offset_reloc[1] = BFD_RELOC_UNUSED;
9977               offset_reloc[2] = BFD_RELOC_UNUSED;
9978               if (*s == '(' && strchr (s + 1, '(') == 0)
9979                 {
9980                   offset_expr.X_op = O_constant;
9981                   offset_expr.X_add_number = 0;
9982                   continue;
9983                 }
9984
9985               /* If this value won't fit into a 16 bit offset, then go
9986                  find a macro that will generate the 32 bit offset
9987                  code pattern.  */
9988               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9989                   && (offset_expr.X_op != O_constant
9990                       || offset_expr.X_add_number >= 0x8000
9991                       || offset_expr.X_add_number < -0x8000))
9992                 break;
9993
9994               s = expr_end;
9995               continue;
9996
9997             case 'p':           /* PC-relative offset.  */
9998               *offset_reloc = BFD_RELOC_16_PCREL_S2;
9999               my_getExpression (&offset_expr, s);
10000               s = expr_end;
10001               continue;
10002
10003             case 'u':           /* Upper 16 bits.  */
10004               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
10005                   && imm_expr.X_op == O_constant
10006                   && (imm_expr.X_add_number < 0
10007                       || imm_expr.X_add_number >= 0x10000))
10008                 as_bad (_("lui expression (%lu) not in range 0..65535"),
10009                         (unsigned long) imm_expr.X_add_number);
10010               s = expr_end;
10011               continue;
10012
10013             case 'a':           /* 26-bit address.  */
10014               my_getExpression (&offset_expr, s);
10015               s = expr_end;
10016               *offset_reloc = BFD_RELOC_MIPS_JMP;
10017               continue;
10018
10019             case 'N':           /* 3-bit branch condition code.  */
10020             case 'M':           /* 3-bit compare condition code.  */
10021               rtype = RTYPE_CCC;
10022               if (ip->insn_mo->pinfo & (FP_D | FP_S))
10023                 rtype |= RTYPE_FCC;
10024               if (!reg_lookup (&s, rtype, &regno))
10025                 break;
10026               if ((strcmp (str + strlen (str) - 3, ".ps") == 0
10027                    || strcmp (str + strlen (str) - 5, "any2f") == 0
10028                    || strcmp (str + strlen (str) - 5, "any2t") == 0)
10029                   && (regno & 1) != 0)
10030                 as_warn (_("Condition code register should be even for %s, "
10031                            "was %d"),
10032                          str, regno);
10033               if ((strcmp (str + strlen (str) - 5, "any4f") == 0
10034                    || strcmp (str + strlen (str) - 5, "any4t") == 0)
10035                   && (regno & 3) != 0)
10036                 as_warn (_("Condition code register should be 0 or 4 for %s, "
10037                            "was %d"),
10038                          str, regno);
10039               if (*args == 'N')
10040                 INSERT_OPERAND (BCC, *ip, regno);
10041               else
10042                 INSERT_OPERAND (CCC, *ip, regno);
10043               continue;
10044
10045             case 'H':
10046               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
10047                 s += 2;
10048               if (ISDIGIT (*s))
10049                 {
10050                   c = 0;
10051                   do
10052                     {
10053                       c *= 10;
10054                       c += *s - '0';
10055                       ++s;
10056                     }
10057                   while (ISDIGIT (*s));
10058                 }
10059               else
10060                 c = 8; /* Invalid sel value.  */
10061
10062               if (c > 7)
10063                 as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
10064               ip->insn_opcode |= c;
10065               continue;
10066
10067             case 'e':
10068               /* Must be at least one digit.  */
10069               my_getExpression (&imm_expr, s);
10070               check_absolute_expr (ip, &imm_expr);
10071
10072               if ((unsigned long) imm_expr.X_add_number
10073                   > (unsigned long) OP_MASK_VECBYTE)
10074                 {
10075                   as_bad (_("bad byte vector index (%ld)"),
10076                            (long) imm_expr.X_add_number);
10077                   imm_expr.X_add_number = 0;
10078                 }
10079
10080               INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
10081               imm_expr.X_op = O_absent;
10082               s = expr_end;
10083               continue;
10084
10085             case '%':
10086               my_getExpression (&imm_expr, s);
10087               check_absolute_expr (ip, &imm_expr);
10088
10089               if ((unsigned long) imm_expr.X_add_number
10090                   > (unsigned long) OP_MASK_VECALIGN)
10091                 {
10092                   as_bad (_("bad byte vector index (%ld)"),
10093                            (long) imm_expr.X_add_number);
10094                   imm_expr.X_add_number = 0;
10095                 }
10096
10097               INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
10098               imm_expr.X_op = O_absent;
10099               s = expr_end;
10100               continue;
10101
10102             default:
10103               as_bad (_("Bad char = '%c'\n"), *args);
10104               internalError ();
10105             }
10106           break;
10107         }
10108       /* Args don't match.  */
10109       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
10110           !strcmp (insn->name, insn[1].name))
10111         {
10112           ++insn;
10113           s = argsStart;
10114           insn_error = _("Illegal operands");
10115           continue;
10116         }
10117       if (save_c)
10118         *(--argsStart) = save_c;
10119       insn_error = _("Illegal operands");
10120       return;
10121     }
10122 }
10123
10124 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10125
10126 /* This routine assembles an instruction into its binary format when
10127    assembling for the mips16.  As a side effect, it sets one of the
10128    global variables imm_reloc or offset_reloc to the type of
10129    relocation to do if one of the operands is an address expression.
10130    It also sets mips16_small and mips16_ext if the user explicitly
10131    requested a small or extended instruction.  */
10132
10133 static void
10134 mips16_ip (char *str, struct mips_cl_insn *ip)
10135 {
10136   char *s;
10137   const char *args;
10138   struct mips_opcode *insn;
10139   char *argsstart;
10140   unsigned int regno;
10141   unsigned int lastregno = 0;
10142   char *s_reset;
10143   size_t i;
10144
10145   insn_error = NULL;
10146
10147   mips16_small = FALSE;
10148   mips16_ext = FALSE;
10149
10150   for (s = str; ISLOWER (*s); ++s)
10151     ;
10152   switch (*s)
10153     {
10154     case '\0':
10155       break;
10156
10157     case ' ':
10158       *s++ = '\0';
10159       break;
10160
10161     case '.':
10162       if (s[1] == 't' && s[2] == ' ')
10163         {
10164           *s = '\0';
10165           mips16_small = TRUE;
10166           s += 3;
10167           break;
10168         }
10169       else if (s[1] == 'e' && s[2] == ' ')
10170         {
10171           *s = '\0';
10172           mips16_ext = TRUE;
10173           s += 3;
10174           break;
10175         }
10176       /* Fall through.  */
10177     default:
10178       insn_error = _("unknown opcode");
10179       return;
10180     }
10181
10182   if (mips_opts.noautoextend && ! mips16_ext)
10183     mips16_small = TRUE;
10184
10185   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10186     {
10187       insn_error = _("unrecognized opcode");
10188       return;
10189     }
10190
10191   argsstart = s;
10192   for (;;)
10193     {
10194       bfd_boolean ok;
10195
10196       gas_assert (strcmp (insn->name, str) == 0);
10197
10198       ok = is_opcode_valid_16 (insn);
10199       if (! ok)
10200         {
10201           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10202               && strcmp (insn->name, insn[1].name) == 0)
10203             {
10204               ++insn;
10205               continue;
10206             }
10207           else
10208             {
10209               if (!insn_error)
10210                 {
10211                   static char buf[100];
10212                   sprintf (buf,
10213                            _("opcode not supported on this processor: %s (%s)"),
10214                            mips_cpu_info_from_arch (mips_opts.arch)->name,
10215                            mips_cpu_info_from_isa (mips_opts.isa)->name);
10216                   insn_error = buf;
10217                 }
10218               return;
10219             }
10220         }
10221
10222       create_insn (ip, insn);
10223       imm_expr.X_op = O_absent;
10224       imm_reloc[0] = BFD_RELOC_UNUSED;
10225       imm_reloc[1] = BFD_RELOC_UNUSED;
10226       imm_reloc[2] = BFD_RELOC_UNUSED;
10227       imm2_expr.X_op = O_absent;
10228       offset_expr.X_op = O_absent;
10229       offset_reloc[0] = BFD_RELOC_UNUSED;
10230       offset_reloc[1] = BFD_RELOC_UNUSED;
10231       offset_reloc[2] = BFD_RELOC_UNUSED;
10232       for (args = insn->args; 1; ++args)
10233         {
10234           int c;
10235
10236           if (*s == ' ')
10237             ++s;
10238
10239           /* In this switch statement we call break if we did not find
10240              a match, continue if we did find a match, or return if we
10241              are done.  */
10242
10243           c = *args;
10244           switch (c)
10245             {
10246             case '\0':
10247               if (*s == '\0')
10248                 {
10249                   /* Stuff the immediate value in now, if we can.  */
10250                   if (imm_expr.X_op == O_constant
10251                       && *imm_reloc > BFD_RELOC_UNUSED
10252                       && *imm_reloc != BFD_RELOC_MIPS16_GOT16
10253                       && *imm_reloc != BFD_RELOC_MIPS16_CALL16
10254                       && insn->pinfo != INSN_MACRO)
10255                     {
10256                       valueT tmp;
10257
10258                       switch (*offset_reloc)
10259                         {
10260                           case BFD_RELOC_MIPS16_HI16_S:
10261                             tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10262                             break;
10263
10264                           case BFD_RELOC_MIPS16_HI16:
10265                             tmp = imm_expr.X_add_number >> 16;
10266                             break;
10267
10268                           case BFD_RELOC_MIPS16_LO16:
10269                             tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10270                                   - 0x8000;
10271                             break;
10272
10273                           case BFD_RELOC_UNUSED:
10274                             tmp = imm_expr.X_add_number;
10275                             break;
10276
10277                           default:
10278                             internalError ();
10279                         }
10280                       *offset_reloc = BFD_RELOC_UNUSED;
10281
10282                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
10283                                     tmp, TRUE, mips16_small,
10284                                     mips16_ext, &ip->insn_opcode,
10285                                     &ip->use_extend, &ip->extend);
10286                       imm_expr.X_op = O_absent;
10287                       *imm_reloc = BFD_RELOC_UNUSED;
10288                     }
10289
10290                   return;
10291                 }
10292               break;
10293
10294             case ',':
10295               if (*s++ == c)
10296                 continue;
10297               s--;
10298               switch (*++args)
10299                 {
10300                 case 'v':
10301                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10302                   continue;
10303                 case 'w':
10304                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10305                   continue;
10306                 }
10307               break;
10308
10309             case '(':
10310             case ')':
10311               if (*s++ == c)
10312                 continue;
10313               break;
10314
10315             case 'v':
10316             case 'w':
10317               if (s[0] != '$')
10318                 {
10319                   if (c == 'v')
10320                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10321                   else
10322                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10323                   ++args;
10324                   continue;
10325                 }
10326               /* Fall through.  */
10327             case 'x':
10328             case 'y':
10329             case 'z':
10330             case 'Z':
10331             case '0':
10332             case 'S':
10333             case 'R':
10334             case 'X':
10335             case 'Y':
10336               s_reset = s;
10337               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
10338                 {
10339                   if (c == 'v' || c == 'w')
10340                     {
10341                       if (c == 'v')
10342                         MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10343                       else
10344                         MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10345                       ++args;
10346                       continue;
10347                     }
10348                   break;
10349                 }
10350
10351               if (*s == ' ')
10352                 ++s;
10353               if (args[1] != *s)
10354                 {
10355                   if (c == 'v' || c == 'w')
10356                     {
10357                       regno = mips16_to_32_reg_map[lastregno];
10358                       s = s_reset;
10359                       ++args;
10360                     }
10361                 }
10362
10363               switch (c)
10364                 {
10365                 case 'x':
10366                 case 'y':
10367                 case 'z':
10368                 case 'v':
10369                 case 'w':
10370                 case 'Z':
10371                   regno = mips32_to_16_reg_map[regno];
10372                   break;
10373
10374                 case '0':
10375                   if (regno != 0)
10376                     regno = ILLEGAL_REG;
10377                   break;
10378
10379                 case 'S':
10380                   if (regno != SP)
10381                     regno = ILLEGAL_REG;
10382                   break;
10383
10384                 case 'R':
10385                   if (regno != RA)
10386                     regno = ILLEGAL_REG;
10387                   break;
10388
10389                 case 'X':
10390                 case 'Y':
10391                   if (regno == AT && mips_opts.at)
10392                     {
10393                       if (mips_opts.at == ATREG)
10394                         as_warn (_("used $at without \".set noat\""));
10395                       else
10396                         as_warn (_("used $%u with \".set at=$%u\""),
10397                                  regno, mips_opts.at);
10398                     }
10399                   break;
10400
10401                 default:
10402                   internalError ();
10403                 }
10404
10405               if (regno == ILLEGAL_REG)
10406                 break;
10407
10408               switch (c)
10409                 {
10410                 case 'x':
10411                 case 'v':
10412                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
10413                   break;
10414                 case 'y':
10415                 case 'w':
10416                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
10417                   break;
10418                 case 'z':
10419                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10420                   break;
10421                 case 'Z':
10422                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10423                 case '0':
10424                 case 'S':
10425                 case 'R':
10426                   break;
10427                 case 'X':
10428                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10429                   break;
10430                 case 'Y':
10431                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10432                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10433                   break;
10434                 default:
10435                   internalError ();
10436                 }
10437
10438               lastregno = regno;
10439               continue;
10440
10441             case 'P':
10442               if (strncmp (s, "$pc", 3) == 0)
10443                 {
10444                   s += 3;
10445                   continue;
10446                 }
10447               break;
10448
10449             case '5':
10450             case 'H':
10451             case 'W':
10452             case 'D':
10453             case 'j':
10454             case 'V':
10455             case 'C':
10456             case 'U':
10457             case 'k':
10458             case 'K':
10459               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10460               if (i > 0)
10461                 {
10462                   if (imm_expr.X_op != O_constant)
10463                     {
10464                       mips16_ext = TRUE;
10465                       ip->use_extend = TRUE;
10466                       ip->extend = 0;
10467                     }
10468                   else
10469                     {
10470                       /* We need to relax this instruction.  */
10471                       *offset_reloc = *imm_reloc;
10472                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10473                     }
10474                   s = expr_end;
10475                   continue;
10476                 }
10477               *imm_reloc = BFD_RELOC_UNUSED;
10478               /* Fall through.  */
10479             case '<':
10480             case '>':
10481             case '[':
10482             case ']':
10483             case '4':
10484             case '8':
10485               my_getExpression (&imm_expr, s);
10486               if (imm_expr.X_op == O_register)
10487                 {
10488                   /* What we thought was an expression turned out to
10489                      be a register.  */
10490
10491                   if (s[0] == '(' && args[1] == '(')
10492                     {
10493                       /* It looks like the expression was omitted
10494                          before a register indirection, which means
10495                          that the expression is implicitly zero.  We
10496                          still set up imm_expr, so that we handle
10497                          explicit extensions correctly.  */
10498                       imm_expr.X_op = O_constant;
10499                       imm_expr.X_add_number = 0;
10500                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10501                       continue;
10502                     }
10503
10504                   break;
10505                 }
10506
10507               /* We need to relax this instruction.  */
10508               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10509               s = expr_end;
10510               continue;
10511
10512             case 'p':
10513             case 'q':
10514             case 'A':
10515             case 'B':
10516             case 'E':
10517               /* We use offset_reloc rather than imm_reloc for the PC
10518                  relative operands.  This lets macros with both
10519                  immediate and address operands work correctly.  */
10520               my_getExpression (&offset_expr, s);
10521
10522               if (offset_expr.X_op == O_register)
10523                 break;
10524
10525               /* We need to relax this instruction.  */
10526               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10527               s = expr_end;
10528               continue;
10529
10530             case '6':           /* break code */
10531               my_getExpression (&imm_expr, s);
10532               check_absolute_expr (ip, &imm_expr);
10533               if ((unsigned long) imm_expr.X_add_number > 63)
10534                 as_warn (_("Invalid value for `%s' (%lu)"),
10535                          ip->insn_mo->name,
10536                          (unsigned long) imm_expr.X_add_number);
10537               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10538               imm_expr.X_op = O_absent;
10539               s = expr_end;
10540               continue;
10541
10542             case 'a':           /* 26 bit address */
10543               my_getExpression (&offset_expr, s);
10544               s = expr_end;
10545               *offset_reloc = BFD_RELOC_MIPS16_JMP;
10546               ip->insn_opcode <<= 16;
10547               continue;
10548
10549             case 'l':           /* register list for entry macro */
10550             case 'L':           /* register list for exit macro */
10551               {
10552                 int mask;
10553
10554                 if (c == 'l')
10555                   mask = 0;
10556                 else
10557                   mask = 7 << 3;
10558                 while (*s != '\0')
10559                   {
10560                     unsigned int freg, reg1, reg2;
10561
10562                     while (*s == ' ' || *s == ',')
10563                       ++s;
10564                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10565                       freg = 0;
10566                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10567                       freg = 1;
10568                     else
10569                       {
10570                         as_bad (_("can't parse register list"));
10571                         break;
10572                       }
10573                     if (*s == ' ')
10574                       ++s;
10575                     if (*s != '-')
10576                       reg2 = reg1;
10577                     else
10578                       {
10579                         ++s;
10580                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
10581                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
10582                           {
10583                             as_bad (_("invalid register list"));
10584                             break;
10585                           }
10586                       }
10587                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10588                       {
10589                         mask &= ~ (7 << 3);
10590                         mask |= 5 << 3;
10591                       }
10592                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10593                       {
10594                         mask &= ~ (7 << 3);
10595                         mask |= 6 << 3;
10596                       }
10597                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10598                       mask |= (reg2 - 3) << 3;
10599                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10600                       mask |= (reg2 - 15) << 1;
10601                     else if (reg1 == RA && reg2 == RA)
10602                       mask |= 1;
10603                     else
10604                       {
10605                         as_bad (_("invalid register list"));
10606                         break;
10607                       }
10608                   }
10609                 /* The mask is filled in in the opcode table for the
10610                    benefit of the disassembler.  We remove it before
10611                    applying the actual mask.  */
10612                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10613                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10614               }
10615             continue;
10616
10617             case 'm':           /* Register list for save insn.  */
10618             case 'M':           /* Register list for restore insn.  */
10619               {
10620                 int opcode = 0;
10621                 int framesz = 0, seen_framesz = 0;
10622                 int nargs = 0, statics = 0, sregs = 0;
10623
10624                 while (*s != '\0')
10625                   {
10626                     unsigned int reg1, reg2;
10627
10628                     SKIP_SPACE_TABS (s);
10629                     while (*s == ',')
10630                       ++s;
10631                     SKIP_SPACE_TABS (s);
10632
10633                     my_getExpression (&imm_expr, s);
10634                     if (imm_expr.X_op == O_constant)
10635                       {
10636                         /* Handle the frame size.  */
10637                         if (seen_framesz)
10638                           {
10639                             as_bad (_("more than one frame size in list"));
10640                             break;
10641                           }
10642                         seen_framesz = 1;
10643                         framesz = imm_expr.X_add_number;
10644                         imm_expr.X_op = O_absent;
10645                         s = expr_end;
10646                         continue;
10647                       }
10648
10649                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10650                       {
10651                         as_bad (_("can't parse register list"));
10652                         break;
10653                       }
10654
10655                     while (*s == ' ')
10656                       ++s;
10657
10658                     if (*s != '-')
10659                       reg2 = reg1;
10660                     else
10661                       {
10662                         ++s;
10663                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10664                             || reg2 < reg1)
10665                           {
10666                             as_bad (_("can't parse register list"));
10667                             break;
10668                           }
10669                       }
10670
10671                     while (reg1 <= reg2)
10672                       {
10673                         if (reg1 >= 4 && reg1 <= 7)
10674                           {
10675                             if (!seen_framesz)
10676                                 /* args $a0-$a3 */
10677                                 nargs |= 1 << (reg1 - 4);
10678                             else
10679                                 /* statics $a0-$a3 */
10680                                 statics |= 1 << (reg1 - 4);
10681                           }
10682                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10683                           {
10684                             /* $s0-$s8 */
10685                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10686                           }
10687                         else if (reg1 == 31)
10688                           {
10689                             /* Add $ra to insn.  */
10690                             opcode |= 0x40;
10691                           }
10692                         else
10693                           {
10694                             as_bad (_("unexpected register in list"));
10695                             break;
10696                           }
10697                         if (++reg1 == 24)
10698                           reg1 = 30;
10699                       }
10700                   }
10701
10702                 /* Encode args/statics combination.  */
10703                 if (nargs & statics)
10704                   as_bad (_("arg/static registers overlap"));
10705                 else if (nargs == 0xf)
10706                   /* All $a0-$a3 are args.  */
10707                   opcode |= MIPS16_ALL_ARGS << 16;
10708                 else if (statics == 0xf)
10709                   /* All $a0-$a3 are statics.  */
10710                   opcode |= MIPS16_ALL_STATICS << 16;
10711                 else 
10712                   {
10713                     int narg = 0, nstat = 0;
10714
10715                     /* Count arg registers.  */
10716                     while (nargs & 0x1)
10717                       {
10718                         nargs >>= 1;
10719                         narg++;
10720                       }
10721                     if (nargs != 0)
10722                       as_bad (_("invalid arg register list"));
10723
10724                     /* Count static registers.  */
10725                     while (statics & 0x8)
10726                       {
10727                         statics = (statics << 1) & 0xf;
10728                         nstat++;
10729                       }
10730                     if (statics != 0) 
10731                       as_bad (_("invalid static register list"));
10732
10733                     /* Encode args/statics.  */
10734                     opcode |= ((narg << 2) | nstat) << 16;
10735                   }
10736
10737                 /* Encode $s0/$s1.  */
10738                 if (sregs & (1 << 0))           /* $s0 */
10739                   opcode |= 0x20;
10740                 if (sregs & (1 << 1))           /* $s1 */
10741                   opcode |= 0x10;
10742                 sregs >>= 2;
10743
10744                 if (sregs != 0)
10745                   {
10746                     /* Count regs $s2-$s8.  */
10747                     int nsreg = 0;
10748                     while (sregs & 1)
10749                       {
10750                         sregs >>= 1;
10751                         nsreg++;
10752                       }
10753                     if (sregs != 0)
10754                       as_bad (_("invalid static register list"));
10755                     /* Encode $s2-$s8. */
10756                     opcode |= nsreg << 24;
10757                   }
10758
10759                 /* Encode frame size.  */
10760                 if (!seen_framesz)
10761                   as_bad (_("missing frame size"));
10762                 else if ((framesz & 7) != 0 || framesz < 0
10763                          || framesz > 0xff * 8)
10764                   as_bad (_("invalid frame size"));
10765                 else if (framesz != 128 || (opcode >> 16) != 0)
10766                   {
10767                     framesz /= 8;
10768                     opcode |= (((framesz & 0xf0) << 16)
10769                              | (framesz & 0x0f));
10770                   }
10771
10772                 /* Finally build the instruction.  */
10773                 if ((opcode >> 16) != 0 || framesz == 0)
10774                   {
10775                     ip->use_extend = TRUE;
10776                     ip->extend = opcode >> 16;
10777                   }
10778                 ip->insn_opcode |= opcode & 0x7f;
10779               }
10780             continue;
10781
10782             case 'e':           /* extend code */
10783               my_getExpression (&imm_expr, s);
10784               check_absolute_expr (ip, &imm_expr);
10785               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10786                 {
10787                   as_warn (_("Invalid value for `%s' (%lu)"),
10788                            ip->insn_mo->name,
10789                            (unsigned long) imm_expr.X_add_number);
10790                   imm_expr.X_add_number &= 0x7ff;
10791                 }
10792               ip->insn_opcode |= imm_expr.X_add_number;
10793               imm_expr.X_op = O_absent;
10794               s = expr_end;
10795               continue;
10796
10797             default:
10798               internalError ();
10799             }
10800           break;
10801         }
10802
10803       /* Args don't match.  */
10804       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10805           strcmp (insn->name, insn[1].name) == 0)
10806         {
10807           ++insn;
10808           s = argsstart;
10809           continue;
10810         }
10811
10812       insn_error = _("illegal operands");
10813
10814       return;
10815     }
10816 }
10817
10818 /* This structure holds information we know about a mips16 immediate
10819    argument type.  */
10820
10821 struct mips16_immed_operand
10822 {
10823   /* The type code used in the argument string in the opcode table.  */
10824   int type;
10825   /* The number of bits in the short form of the opcode.  */
10826   int nbits;
10827   /* The number of bits in the extended form of the opcode.  */
10828   int extbits;
10829   /* The amount by which the short form is shifted when it is used;
10830      for example, the sw instruction has a shift count of 2.  */
10831   int shift;
10832   /* The amount by which the short form is shifted when it is stored
10833      into the instruction code.  */
10834   int op_shift;
10835   /* Non-zero if the short form is unsigned.  */
10836   int unsp;
10837   /* Non-zero if the extended form is unsigned.  */
10838   int extu;
10839   /* Non-zero if the value is PC relative.  */
10840   int pcrel;
10841 };
10842
10843 /* The mips16 immediate operand types.  */
10844
10845 static const struct mips16_immed_operand mips16_immed_operands[] =
10846 {
10847   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10848   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10849   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10850   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10851   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10852   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10853   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10854   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10855   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10856   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10857   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10858   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10859   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10860   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10861   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10862   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10863   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10864   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10865   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10866   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10867   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10868 };
10869
10870 #define MIPS16_NUM_IMMED \
10871   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10872
10873 /* Handle a mips16 instruction with an immediate value.  This or's the
10874    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
10875    whether an extended value is needed; if one is needed, it sets
10876    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
10877    If SMALL is true, an unextended opcode was explicitly requested.
10878    If EXT is true, an extended opcode was explicitly requested.  If
10879    WARN is true, warn if EXT does not match reality.  */
10880
10881 static void
10882 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10883               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10884               unsigned long *insn, bfd_boolean *use_extend,
10885               unsigned short *extend)
10886 {
10887   const struct mips16_immed_operand *op;
10888   int mintiny, maxtiny;
10889   bfd_boolean needext;
10890
10891   op = mips16_immed_operands;
10892   while (op->type != type)
10893     {
10894       ++op;
10895       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10896     }
10897
10898   if (op->unsp)
10899     {
10900       if (type == '<' || type == '>' || type == '[' || type == ']')
10901         {
10902           mintiny = 1;
10903           maxtiny = 1 << op->nbits;
10904         }
10905       else
10906         {
10907           mintiny = 0;
10908           maxtiny = (1 << op->nbits) - 1;
10909         }
10910     }
10911   else
10912     {
10913       mintiny = - (1 << (op->nbits - 1));
10914       maxtiny = (1 << (op->nbits - 1)) - 1;
10915     }
10916
10917   /* Branch offsets have an implicit 0 in the lowest bit.  */
10918   if (type == 'p' || type == 'q')
10919     val /= 2;
10920
10921   if ((val & ((1 << op->shift) - 1)) != 0
10922       || val < (mintiny << op->shift)
10923       || val > (maxtiny << op->shift))
10924     needext = TRUE;
10925   else
10926     needext = FALSE;
10927
10928   if (warn && ext && ! needext)
10929     as_warn_where (file, line,
10930                    _("extended operand requested but not required"));
10931   if (small && needext)
10932     as_bad_where (file, line, _("invalid unextended operand value"));
10933
10934   if (small || (! ext && ! needext))
10935     {
10936       int insnval;
10937
10938       *use_extend = FALSE;
10939       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10940       insnval <<= op->op_shift;
10941       *insn |= insnval;
10942     }
10943   else
10944     {
10945       long minext, maxext;
10946       int extval;
10947
10948       if (op->extu)
10949         {
10950           minext = 0;
10951           maxext = (1 << op->extbits) - 1;
10952         }
10953       else
10954         {
10955           minext = - (1 << (op->extbits - 1));
10956           maxext = (1 << (op->extbits - 1)) - 1;
10957         }
10958       if (val < minext || val > maxext)
10959         as_bad_where (file, line,
10960                       _("operand value out of range for instruction"));
10961
10962       *use_extend = TRUE;
10963       if (op->extbits == 16)
10964         {
10965           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10966           val &= 0x1f;
10967         }
10968       else if (op->extbits == 15)
10969         {
10970           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10971           val &= 0xf;
10972         }
10973       else
10974         {
10975           extval = ((val & 0x1f) << 6) | (val & 0x20);
10976           val = 0;
10977         }
10978
10979       *extend = (unsigned short) extval;
10980       *insn |= val;
10981     }
10982 }
10983 \f
10984 struct percent_op_match
10985 {
10986   const char *str;
10987   bfd_reloc_code_real_type reloc;
10988 };
10989
10990 static const struct percent_op_match mips_percent_op[] =
10991 {
10992   {"%lo", BFD_RELOC_LO16},
10993 #ifdef OBJ_ELF
10994   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10995   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10996   {"%call16", BFD_RELOC_MIPS_CALL16},
10997   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10998   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10999   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
11000   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
11001   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
11002   {"%got", BFD_RELOC_MIPS_GOT16},
11003   {"%gp_rel", BFD_RELOC_GPREL16},
11004   {"%half", BFD_RELOC_16},
11005   {"%highest", BFD_RELOC_MIPS_HIGHEST},
11006   {"%higher", BFD_RELOC_MIPS_HIGHER},
11007   {"%neg", BFD_RELOC_MIPS_SUB},
11008   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
11009   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
11010   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
11011   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
11012   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
11013   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
11014   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
11015 #endif
11016   {"%hi", BFD_RELOC_HI16_S}
11017 };
11018
11019 static const struct percent_op_match mips16_percent_op[] =
11020 {
11021   {"%lo", BFD_RELOC_MIPS16_LO16},
11022   {"%gprel", BFD_RELOC_MIPS16_GPREL},
11023   {"%got", BFD_RELOC_MIPS16_GOT16},
11024   {"%call16", BFD_RELOC_MIPS16_CALL16},
11025   {"%hi", BFD_RELOC_MIPS16_HI16_S}
11026 };
11027
11028
11029 /* Return true if *STR points to a relocation operator.  When returning true,
11030    move *STR over the operator and store its relocation code in *RELOC.
11031    Leave both *STR and *RELOC alone when returning false.  */
11032
11033 static bfd_boolean
11034 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
11035 {
11036   const struct percent_op_match *percent_op;
11037   size_t limit, i;
11038
11039   if (mips_opts.mips16)
11040     {
11041       percent_op = mips16_percent_op;
11042       limit = ARRAY_SIZE (mips16_percent_op);
11043     }
11044   else
11045     {
11046       percent_op = mips_percent_op;
11047       limit = ARRAY_SIZE (mips_percent_op);
11048     }
11049
11050   for (i = 0; i < limit; i++)
11051     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
11052       {
11053         int len = strlen (percent_op[i].str);
11054
11055         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
11056           continue;
11057
11058         *str += strlen (percent_op[i].str);
11059         *reloc = percent_op[i].reloc;
11060
11061         /* Check whether the output BFD supports this relocation.
11062            If not, issue an error and fall back on something safe.  */
11063         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
11064           {
11065             as_bad (_("relocation %s isn't supported by the current ABI"),
11066                     percent_op[i].str);
11067             *reloc = BFD_RELOC_UNUSED;
11068           }
11069         return TRUE;
11070       }
11071   return FALSE;
11072 }
11073
11074
11075 /* Parse string STR as a 16-bit relocatable operand.  Store the
11076    expression in *EP and the relocations in the array starting
11077    at RELOC.  Return the number of relocation operators used.
11078
11079    On exit, EXPR_END points to the first character after the expression.  */
11080
11081 static size_t
11082 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
11083                        char *str)
11084 {
11085   bfd_reloc_code_real_type reversed_reloc[3];
11086   size_t reloc_index, i;
11087   int crux_depth, str_depth;
11088   char *crux;
11089
11090   /* Search for the start of the main expression, recoding relocations
11091      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
11092      of the main expression and with CRUX_DEPTH containing the number
11093      of open brackets at that point.  */
11094   reloc_index = -1;
11095   str_depth = 0;
11096   do
11097     {
11098       reloc_index++;
11099       crux = str;
11100       crux_depth = str_depth;
11101
11102       /* Skip over whitespace and brackets, keeping count of the number
11103          of brackets.  */
11104       while (*str == ' ' || *str == '\t' || *str == '(')
11105         if (*str++ == '(')
11106           str_depth++;
11107     }
11108   while (*str == '%'
11109          && reloc_index < (HAVE_NEWABI ? 3 : 1)
11110          && parse_relocation (&str, &reversed_reloc[reloc_index]));
11111
11112   my_getExpression (ep, crux);
11113   str = expr_end;
11114
11115   /* Match every open bracket.  */
11116   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
11117     if (*str++ == ')')
11118       crux_depth--;
11119
11120   if (crux_depth > 0)
11121     as_bad (_("unclosed '('"));
11122
11123   expr_end = str;
11124
11125   if (reloc_index != 0)
11126     {
11127       prev_reloc_op_frag = frag_now;
11128       for (i = 0; i < reloc_index; i++)
11129         reloc[i] = reversed_reloc[reloc_index - 1 - i];
11130     }
11131
11132   return reloc_index;
11133 }
11134
11135 static void
11136 my_getExpression (expressionS *ep, char *str)
11137 {
11138   char *save_in;
11139   valueT val;
11140
11141   save_in = input_line_pointer;
11142   input_line_pointer = str;
11143   expression (ep);
11144   expr_end = input_line_pointer;
11145   input_line_pointer = save_in;
11146
11147   /* If we are in mips16 mode, and this is an expression based on `.',
11148      then we bump the value of the symbol by 1 since that is how other
11149      text symbols are handled.  We don't bother to handle complex
11150      expressions, just `.' plus or minus a constant.  */
11151   if (mips_opts.mips16
11152       && ep->X_op == O_symbol
11153       && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
11154       && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
11155       && symbol_get_frag (ep->X_add_symbol) == frag_now
11156       && symbol_constant_p (ep->X_add_symbol)
11157       && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
11158     S_SET_VALUE (ep->X_add_symbol, val + 1);
11159 }
11160
11161 char *
11162 md_atof (int type, char *litP, int *sizeP)
11163 {
11164   return ieee_md_atof (type, litP, sizeP, target_big_endian);
11165 }
11166
11167 void
11168 md_number_to_chars (char *buf, valueT val, int n)
11169 {
11170   if (target_big_endian)
11171     number_to_chars_bigendian (buf, val, n);
11172   else
11173     number_to_chars_littleendian (buf, val, n);
11174 }
11175 \f
11176 #ifdef OBJ_ELF
11177 static int support_64bit_objects(void)
11178 {
11179   const char **list, **l;
11180   int yes;
11181
11182   list = bfd_target_list ();
11183   for (l = list; *l != NULL; l++)
11184 #ifdef TE_TMIPS
11185     /* This is traditional mips */
11186     if (strcmp (*l, "elf64-tradbigmips") == 0
11187         || strcmp (*l, "elf64-tradlittlemips") == 0)
11188 #else
11189     if (strcmp (*l, "elf64-bigmips") == 0
11190         || strcmp (*l, "elf64-littlemips") == 0)
11191 #endif
11192       break;
11193   yes = (*l != NULL);
11194   free (list);
11195   return yes;
11196 }
11197 #endif /* OBJ_ELF */
11198
11199 const char *md_shortopts = "O::g::G:";
11200
11201 enum options
11202   {
11203     OPTION_MARCH = OPTION_MD_BASE,
11204     OPTION_MTUNE,
11205     OPTION_MIPS1,
11206     OPTION_MIPS2,
11207     OPTION_MIPS3,
11208     OPTION_MIPS4,
11209     OPTION_MIPS5,
11210     OPTION_MIPS32,
11211     OPTION_MIPS64,
11212     OPTION_MIPS32R2,
11213     OPTION_MIPS64R2,
11214     OPTION_MIPS16,
11215     OPTION_NO_MIPS16,
11216     OPTION_MIPS3D,
11217     OPTION_NO_MIPS3D,
11218     OPTION_MDMX,
11219     OPTION_NO_MDMX,
11220     OPTION_DSP,
11221     OPTION_NO_DSP,
11222     OPTION_MT,
11223     OPTION_NO_MT,
11224     OPTION_SMARTMIPS,
11225     OPTION_NO_SMARTMIPS,
11226     OPTION_DSPR2,
11227     OPTION_NO_DSPR2,
11228     OPTION_COMPAT_ARCH_BASE,
11229     OPTION_M4650,
11230     OPTION_NO_M4650,
11231     OPTION_M4010,
11232     OPTION_NO_M4010,
11233     OPTION_M4100,
11234     OPTION_NO_M4100,
11235     OPTION_M3900,
11236     OPTION_NO_M3900,
11237     OPTION_M7000_HILO_FIX,
11238     OPTION_MNO_7000_HILO_FIX, 
11239     OPTION_FIX_24K,
11240     OPTION_NO_FIX_24K,
11241     OPTION_FIX_LOONGSON2F_JUMP,
11242     OPTION_NO_FIX_LOONGSON2F_JUMP,
11243     OPTION_FIX_LOONGSON2F_NOP,
11244     OPTION_NO_FIX_LOONGSON2F_NOP,
11245     OPTION_FIX_VR4120,
11246     OPTION_NO_FIX_VR4120,
11247     OPTION_FIX_VR4130,
11248     OPTION_NO_FIX_VR4130,
11249     OPTION_FIX_CN63XXP1,
11250     OPTION_NO_FIX_CN63XXP1,
11251     OPTION_TRAP,
11252     OPTION_BREAK,
11253     OPTION_EB,
11254     OPTION_EL,
11255     OPTION_FP32,
11256     OPTION_GP32,
11257     OPTION_CONSTRUCT_FLOATS,
11258     OPTION_NO_CONSTRUCT_FLOATS,
11259     OPTION_FP64,
11260     OPTION_GP64,
11261     OPTION_RELAX_BRANCH,
11262     OPTION_NO_RELAX_BRANCH,
11263     OPTION_MSHARED,
11264     OPTION_MNO_SHARED,
11265     OPTION_MSYM32,
11266     OPTION_MNO_SYM32,
11267     OPTION_SOFT_FLOAT,
11268     OPTION_HARD_FLOAT,
11269     OPTION_SINGLE_FLOAT,
11270     OPTION_DOUBLE_FLOAT,
11271     OPTION_32,
11272 #ifdef OBJ_ELF
11273     OPTION_CALL_SHARED,
11274     OPTION_CALL_NONPIC,
11275     OPTION_NON_SHARED,
11276     OPTION_XGOT,
11277     OPTION_MABI,
11278     OPTION_N32,
11279     OPTION_64,
11280     OPTION_MDEBUG,
11281     OPTION_NO_MDEBUG,
11282     OPTION_PDR,
11283     OPTION_NO_PDR,
11284     OPTION_MVXWORKS_PIC,
11285 #endif /* OBJ_ELF */
11286     OPTION_END_OF_ENUM    
11287   };
11288   
11289 struct option md_longopts[] =
11290 {
11291   /* Options which specify architecture.  */
11292   {"march", required_argument, NULL, OPTION_MARCH},
11293   {"mtune", required_argument, NULL, OPTION_MTUNE},
11294   {"mips0", no_argument, NULL, OPTION_MIPS1},
11295   {"mips1", no_argument, NULL, OPTION_MIPS1},
11296   {"mips2", no_argument, NULL, OPTION_MIPS2},
11297   {"mips3", no_argument, NULL, OPTION_MIPS3},
11298   {"mips4", no_argument, NULL, OPTION_MIPS4},
11299   {"mips5", no_argument, NULL, OPTION_MIPS5},
11300   {"mips32", no_argument, NULL, OPTION_MIPS32},
11301   {"mips64", no_argument, NULL, OPTION_MIPS64},
11302   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
11303   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
11304
11305   /* Options which specify Application Specific Extensions (ASEs).  */
11306   {"mips16", no_argument, NULL, OPTION_MIPS16},
11307   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
11308   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
11309   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
11310   {"mdmx", no_argument, NULL, OPTION_MDMX},
11311   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
11312   {"mdsp", no_argument, NULL, OPTION_DSP},
11313   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
11314   {"mmt", no_argument, NULL, OPTION_MT},
11315   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
11316   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
11317   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
11318   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
11319   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
11320
11321   /* Old-style architecture options.  Don't add more of these.  */
11322   {"m4650", no_argument, NULL, OPTION_M4650},
11323   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
11324   {"m4010", no_argument, NULL, OPTION_M4010},
11325   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
11326   {"m4100", no_argument, NULL, OPTION_M4100},
11327   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
11328   {"m3900", no_argument, NULL, OPTION_M3900},
11329   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11330
11331   /* Options which enable bug fixes.  */
11332   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
11333   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11334   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11335   {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
11336   {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
11337   {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
11338   {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
11339   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
11340   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
11341   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
11342   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
11343   {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
11344   {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
11345   {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
11346   {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
11347
11348   /* Miscellaneous options.  */
11349   {"trap", no_argument, NULL, OPTION_TRAP},
11350   {"no-break", no_argument, NULL, OPTION_TRAP},
11351   {"break", no_argument, NULL, OPTION_BREAK},
11352   {"no-trap", no_argument, NULL, OPTION_BREAK},
11353   {"EB", no_argument, NULL, OPTION_EB},
11354   {"EL", no_argument, NULL, OPTION_EL},
11355   {"mfp32", no_argument, NULL, OPTION_FP32},
11356   {"mgp32", no_argument, NULL, OPTION_GP32},
11357   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
11358   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
11359   {"mfp64", no_argument, NULL, OPTION_FP64},
11360   {"mgp64", no_argument, NULL, OPTION_GP64},
11361   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11362   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
11363   {"mshared", no_argument, NULL, OPTION_MSHARED},
11364   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
11365   {"msym32", no_argument, NULL, OPTION_MSYM32},
11366   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
11367   {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
11368   {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
11369   {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
11370   {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
11371
11372   /* Strictly speaking this next option is ELF specific,
11373      but we allow it for other ports as well in order to
11374      make testing easier.  */
11375   {"32",          no_argument, NULL, OPTION_32},
11376   
11377   /* ELF-specific options.  */
11378 #ifdef OBJ_ELF
11379   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
11380   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
11381   {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
11382   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
11383   {"xgot",        no_argument, NULL, OPTION_XGOT},
11384   {"mabi", required_argument, NULL, OPTION_MABI},
11385   {"n32",         no_argument, NULL, OPTION_N32},
11386   {"64",          no_argument, NULL, OPTION_64},
11387   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
11388   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
11389   {"mpdr", no_argument, NULL, OPTION_PDR},
11390   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
11391   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
11392 #endif /* OBJ_ELF */
11393
11394   {NULL, no_argument, NULL, 0}
11395 };
11396 size_t md_longopts_size = sizeof (md_longopts);
11397
11398 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11399    NEW_VALUE.  Warn if another value was already specified.  Note:
11400    we have to defer parsing the -march and -mtune arguments in order
11401    to handle 'from-abi' correctly, since the ABI might be specified
11402    in a later argument.  */
11403
11404 static void
11405 mips_set_option_string (const char **string_ptr, const char *new_value)
11406 {
11407   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11408     as_warn (_("A different %s was already specified, is now %s"),
11409              string_ptr == &mips_arch_string ? "-march" : "-mtune",
11410              new_value);
11411
11412   *string_ptr = new_value;
11413 }
11414
11415 int
11416 md_parse_option (int c, char *arg)
11417 {
11418   switch (c)
11419     {
11420     case OPTION_CONSTRUCT_FLOATS:
11421       mips_disable_float_construction = 0;
11422       break;
11423
11424     case OPTION_NO_CONSTRUCT_FLOATS:
11425       mips_disable_float_construction = 1;
11426       break;
11427
11428     case OPTION_TRAP:
11429       mips_trap = 1;
11430       break;
11431
11432     case OPTION_BREAK:
11433       mips_trap = 0;
11434       break;
11435
11436     case OPTION_EB:
11437       target_big_endian = 1;
11438       break;
11439
11440     case OPTION_EL:
11441       target_big_endian = 0;
11442       break;
11443
11444     case 'O':
11445       if (arg == NULL)
11446         mips_optimize = 1;
11447       else if (arg[0] == '0')
11448         mips_optimize = 0;
11449       else if (arg[0] == '1')
11450         mips_optimize = 1;
11451       else
11452         mips_optimize = 2;
11453       break;
11454
11455     case 'g':
11456       if (arg == NULL)
11457         mips_debug = 2;
11458       else
11459         mips_debug = atoi (arg);
11460       break;
11461
11462     case OPTION_MIPS1:
11463       file_mips_isa = ISA_MIPS1;
11464       break;
11465
11466     case OPTION_MIPS2:
11467       file_mips_isa = ISA_MIPS2;
11468       break;
11469
11470     case OPTION_MIPS3:
11471       file_mips_isa = ISA_MIPS3;
11472       break;
11473
11474     case OPTION_MIPS4:
11475       file_mips_isa = ISA_MIPS4;
11476       break;
11477
11478     case OPTION_MIPS5:
11479       file_mips_isa = ISA_MIPS5;
11480       break;
11481
11482     case OPTION_MIPS32:
11483       file_mips_isa = ISA_MIPS32;
11484       break;
11485
11486     case OPTION_MIPS32R2:
11487       file_mips_isa = ISA_MIPS32R2;
11488       break;
11489
11490     case OPTION_MIPS64R2:
11491       file_mips_isa = ISA_MIPS64R2;
11492       break;
11493
11494     case OPTION_MIPS64:
11495       file_mips_isa = ISA_MIPS64;
11496       break;
11497
11498     case OPTION_MTUNE:
11499       mips_set_option_string (&mips_tune_string, arg);
11500       break;
11501
11502     case OPTION_MARCH:
11503       mips_set_option_string (&mips_arch_string, arg);
11504       break;
11505
11506     case OPTION_M4650:
11507       mips_set_option_string (&mips_arch_string, "4650");
11508       mips_set_option_string (&mips_tune_string, "4650");
11509       break;
11510
11511     case OPTION_NO_M4650:
11512       break;
11513
11514     case OPTION_M4010:
11515       mips_set_option_string (&mips_arch_string, "4010");
11516       mips_set_option_string (&mips_tune_string, "4010");
11517       break;
11518
11519     case OPTION_NO_M4010:
11520       break;
11521
11522     case OPTION_M4100:
11523       mips_set_option_string (&mips_arch_string, "4100");
11524       mips_set_option_string (&mips_tune_string, "4100");
11525       break;
11526
11527     case OPTION_NO_M4100:
11528       break;
11529
11530     case OPTION_M3900:
11531       mips_set_option_string (&mips_arch_string, "3900");
11532       mips_set_option_string (&mips_tune_string, "3900");
11533       break;
11534
11535     case OPTION_NO_M3900:
11536       break;
11537
11538     case OPTION_MDMX:
11539       mips_opts.ase_mdmx = 1;
11540       break;
11541
11542     case OPTION_NO_MDMX:
11543       mips_opts.ase_mdmx = 0;
11544       break;
11545
11546     case OPTION_DSP:
11547       mips_opts.ase_dsp = 1;
11548       mips_opts.ase_dspr2 = 0;
11549       break;
11550
11551     case OPTION_NO_DSP:
11552       mips_opts.ase_dsp = 0;
11553       mips_opts.ase_dspr2 = 0;
11554       break;
11555
11556     case OPTION_DSPR2:
11557       mips_opts.ase_dspr2 = 1;
11558       mips_opts.ase_dsp = 1;
11559       break;
11560
11561     case OPTION_NO_DSPR2:
11562       mips_opts.ase_dspr2 = 0;
11563       mips_opts.ase_dsp = 0;
11564       break;
11565
11566     case OPTION_MT:
11567       mips_opts.ase_mt = 1;
11568       break;
11569
11570     case OPTION_NO_MT:
11571       mips_opts.ase_mt = 0;
11572       break;
11573
11574     case OPTION_MIPS16:
11575       mips_opts.mips16 = 1;
11576       mips_no_prev_insn ();
11577       break;
11578
11579     case OPTION_NO_MIPS16:
11580       mips_opts.mips16 = 0;
11581       mips_no_prev_insn ();
11582       break;
11583
11584     case OPTION_MIPS3D:
11585       mips_opts.ase_mips3d = 1;
11586       break;
11587
11588     case OPTION_NO_MIPS3D:
11589       mips_opts.ase_mips3d = 0;
11590       break;
11591
11592     case OPTION_SMARTMIPS:
11593       mips_opts.ase_smartmips = 1;
11594       break;
11595
11596     case OPTION_NO_SMARTMIPS:
11597       mips_opts.ase_smartmips = 0;
11598       break;
11599
11600     case OPTION_FIX_24K:
11601       mips_fix_24k = 1;
11602       break;
11603
11604     case OPTION_NO_FIX_24K:
11605       mips_fix_24k = 0;
11606       break;
11607
11608     case OPTION_FIX_LOONGSON2F_JUMP:
11609       mips_fix_loongson2f_jump = TRUE;
11610       break;
11611
11612     case OPTION_NO_FIX_LOONGSON2F_JUMP:
11613       mips_fix_loongson2f_jump = FALSE;
11614       break;
11615
11616     case OPTION_FIX_LOONGSON2F_NOP:
11617       mips_fix_loongson2f_nop = TRUE;
11618       break;
11619
11620     case OPTION_NO_FIX_LOONGSON2F_NOP:
11621       mips_fix_loongson2f_nop = FALSE;
11622       break;
11623
11624     case OPTION_FIX_VR4120:
11625       mips_fix_vr4120 = 1;
11626       break;
11627
11628     case OPTION_NO_FIX_VR4120:
11629       mips_fix_vr4120 = 0;
11630       break;
11631
11632     case OPTION_FIX_VR4130:
11633       mips_fix_vr4130 = 1;
11634       break;
11635
11636     case OPTION_NO_FIX_VR4130:
11637       mips_fix_vr4130 = 0;
11638       break;
11639
11640     case OPTION_FIX_CN63XXP1:
11641       mips_fix_cn63xxp1 = TRUE;
11642       break;
11643
11644     case OPTION_NO_FIX_CN63XXP1:
11645       mips_fix_cn63xxp1 = FALSE;
11646       break;
11647
11648     case OPTION_RELAX_BRANCH:
11649       mips_relax_branch = 1;
11650       break;
11651
11652     case OPTION_NO_RELAX_BRANCH:
11653       mips_relax_branch = 0;
11654       break;
11655
11656     case OPTION_MSHARED:
11657       mips_in_shared = TRUE;
11658       break;
11659
11660     case OPTION_MNO_SHARED:
11661       mips_in_shared = FALSE;
11662       break;
11663
11664     case OPTION_MSYM32:
11665       mips_opts.sym32 = TRUE;
11666       break;
11667
11668     case OPTION_MNO_SYM32:
11669       mips_opts.sym32 = FALSE;
11670       break;
11671
11672 #ifdef OBJ_ELF
11673       /* When generating ELF code, we permit -KPIC and -call_shared to
11674          select SVR4_PIC, and -non_shared to select no PIC.  This is
11675          intended to be compatible with Irix 5.  */
11676     case OPTION_CALL_SHARED:
11677       if (!IS_ELF)
11678         {
11679           as_bad (_("-call_shared is supported only for ELF format"));
11680           return 0;
11681         }
11682       mips_pic = SVR4_PIC;
11683       mips_abicalls = TRUE;
11684       break;
11685
11686     case OPTION_CALL_NONPIC:
11687       if (!IS_ELF)
11688         {
11689           as_bad (_("-call_nonpic is supported only for ELF format"));
11690           return 0;
11691         }
11692       mips_pic = NO_PIC;
11693       mips_abicalls = TRUE;
11694       break;
11695
11696     case OPTION_NON_SHARED:
11697       if (!IS_ELF)
11698         {
11699           as_bad (_("-non_shared is supported only for ELF format"));
11700           return 0;
11701         }
11702       mips_pic = NO_PIC;
11703       mips_abicalls = FALSE;
11704       break;
11705
11706       /* The -xgot option tells the assembler to use 32 bit offsets
11707          when accessing the got in SVR4_PIC mode.  It is for Irix
11708          compatibility.  */
11709     case OPTION_XGOT:
11710       mips_big_got = 1;
11711       break;
11712 #endif /* OBJ_ELF */
11713
11714     case 'G':
11715       g_switch_value = atoi (arg);
11716       g_switch_seen = 1;
11717       break;
11718
11719       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11720          and -mabi=64.  */
11721     case OPTION_32:
11722       if (IS_ELF)
11723         mips_abi = O32_ABI;
11724       /* We silently ignore -32 for non-ELF targets.  This greatly
11725          simplifies the construction of the MIPS GAS test cases.  */
11726       break;
11727
11728 #ifdef OBJ_ELF
11729     case OPTION_N32:
11730       if (!IS_ELF)
11731         {
11732           as_bad (_("-n32 is supported for ELF format only"));
11733           return 0;
11734         }
11735       mips_abi = N32_ABI;
11736       break;
11737
11738     case OPTION_64:
11739       if (!IS_ELF)
11740         {
11741           as_bad (_("-64 is supported for ELF format only"));
11742           return 0;
11743         }
11744       mips_abi = N64_ABI;
11745       if (!support_64bit_objects())
11746         as_fatal (_("No compiled in support for 64 bit object file format"));
11747       break;
11748 #endif /* OBJ_ELF */
11749
11750     case OPTION_GP32:
11751       file_mips_gp32 = 1;
11752       break;
11753
11754     case OPTION_GP64:
11755       file_mips_gp32 = 0;
11756       break;
11757
11758     case OPTION_FP32:
11759       file_mips_fp32 = 1;
11760       break;
11761
11762     case OPTION_FP64:
11763       file_mips_fp32 = 0;
11764       break;
11765
11766     case OPTION_SINGLE_FLOAT:
11767       file_mips_single_float = 1;
11768       break;
11769
11770     case OPTION_DOUBLE_FLOAT:
11771       file_mips_single_float = 0;
11772       break;
11773
11774     case OPTION_SOFT_FLOAT:
11775       file_mips_soft_float = 1;
11776       break;
11777
11778     case OPTION_HARD_FLOAT:
11779       file_mips_soft_float = 0;
11780       break;
11781
11782 #ifdef OBJ_ELF
11783     case OPTION_MABI:
11784       if (!IS_ELF)
11785         {
11786           as_bad (_("-mabi is supported for ELF format only"));
11787           return 0;
11788         }
11789       if (strcmp (arg, "32") == 0)
11790         mips_abi = O32_ABI;
11791       else if (strcmp (arg, "o64") == 0)
11792         mips_abi = O64_ABI;
11793       else if (strcmp (arg, "n32") == 0)
11794         mips_abi = N32_ABI;
11795       else if (strcmp (arg, "64") == 0)
11796         {
11797           mips_abi = N64_ABI;
11798           if (! support_64bit_objects())
11799             as_fatal (_("No compiled in support for 64 bit object file "
11800                         "format"));
11801         }
11802       else if (strcmp (arg, "eabi") == 0)
11803         mips_abi = EABI_ABI;
11804       else
11805         {
11806           as_fatal (_("invalid abi -mabi=%s"), arg);
11807           return 0;
11808         }
11809       break;
11810 #endif /* OBJ_ELF */
11811
11812     case OPTION_M7000_HILO_FIX:
11813       mips_7000_hilo_fix = TRUE;
11814       break;
11815
11816     case OPTION_MNO_7000_HILO_FIX:
11817       mips_7000_hilo_fix = FALSE;
11818       break;
11819
11820 #ifdef OBJ_ELF
11821     case OPTION_MDEBUG:
11822       mips_flag_mdebug = TRUE;
11823       break;
11824
11825     case OPTION_NO_MDEBUG:
11826       mips_flag_mdebug = FALSE;
11827       break;
11828
11829     case OPTION_PDR:
11830       mips_flag_pdr = TRUE;
11831       break;
11832
11833     case OPTION_NO_PDR:
11834       mips_flag_pdr = FALSE;
11835       break;
11836
11837     case OPTION_MVXWORKS_PIC:
11838       mips_pic = VXWORKS_PIC;
11839       break;
11840 #endif /* OBJ_ELF */
11841
11842     default:
11843       return 0;
11844     }
11845
11846     mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
11847
11848   return 1;
11849 }
11850 \f
11851 /* Set up globals to generate code for the ISA or processor
11852    described by INFO.  */
11853
11854 static void
11855 mips_set_architecture (const struct mips_cpu_info *info)
11856 {
11857   if (info != 0)
11858     {
11859       file_mips_arch = info->cpu;
11860       mips_opts.arch = info->cpu;
11861       mips_opts.isa = info->isa;
11862     }
11863 }
11864
11865
11866 /* Likewise for tuning.  */
11867
11868 static void
11869 mips_set_tune (const struct mips_cpu_info *info)
11870 {
11871   if (info != 0)
11872     mips_tune = info->cpu;
11873 }
11874
11875
11876 void
11877 mips_after_parse_args (void)
11878 {
11879   const struct mips_cpu_info *arch_info = 0;
11880   const struct mips_cpu_info *tune_info = 0;
11881
11882   /* GP relative stuff not working for PE */
11883   if (strncmp (TARGET_OS, "pe", 2) == 0)
11884     {
11885       if (g_switch_seen && g_switch_value != 0)
11886         as_bad (_("-G not supported in this configuration."));
11887       g_switch_value = 0;
11888     }
11889
11890   if (mips_abi == NO_ABI)
11891     mips_abi = MIPS_DEFAULT_ABI;
11892
11893   /* The following code determines the architecture and register size.
11894      Similar code was added to GCC 3.3 (see override_options() in
11895      config/mips/mips.c).  The GAS and GCC code should be kept in sync
11896      as much as possible.  */
11897
11898   if (mips_arch_string != 0)
11899     arch_info = mips_parse_cpu ("-march", mips_arch_string);
11900
11901   if (file_mips_isa != ISA_UNKNOWN)
11902     {
11903       /* Handle -mipsN.  At this point, file_mips_isa contains the
11904          ISA level specified by -mipsN, while arch_info->isa contains
11905          the -march selection (if any).  */
11906       if (arch_info != 0)
11907         {
11908           /* -march takes precedence over -mipsN, since it is more descriptive.
11909              There's no harm in specifying both as long as the ISA levels
11910              are the same.  */
11911           if (file_mips_isa != arch_info->isa)
11912             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11913                     mips_cpu_info_from_isa (file_mips_isa)->name,
11914                     mips_cpu_info_from_isa (arch_info->isa)->name);
11915         }
11916       else
11917         arch_info = mips_cpu_info_from_isa (file_mips_isa);
11918     }
11919
11920   if (arch_info == 0)
11921     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11922
11923   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11924     as_bad (_("-march=%s is not compatible with the selected ABI"),
11925             arch_info->name);
11926
11927   mips_set_architecture (arch_info);
11928
11929   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
11930   if (mips_tune_string != 0)
11931     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11932
11933   if (tune_info == 0)
11934     mips_set_tune (arch_info);
11935   else
11936     mips_set_tune (tune_info);
11937
11938   if (file_mips_gp32 >= 0)
11939     {
11940       /* The user specified the size of the integer registers.  Make sure
11941          it agrees with the ABI and ISA.  */
11942       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11943         as_bad (_("-mgp64 used with a 32-bit processor"));
11944       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11945         as_bad (_("-mgp32 used with a 64-bit ABI"));
11946       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11947         as_bad (_("-mgp64 used with a 32-bit ABI"));
11948     }
11949   else
11950     {
11951       /* Infer the integer register size from the ABI and processor.
11952          Restrict ourselves to 32-bit registers if that's all the
11953          processor has, or if the ABI cannot handle 64-bit registers.  */
11954       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11955                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
11956     }
11957
11958   switch (file_mips_fp32)
11959     {
11960     default:
11961     case -1:
11962       /* No user specified float register size.
11963          ??? GAS treats single-float processors as though they had 64-bit
11964          float registers (although it complains when double-precision
11965          instructions are used).  As things stand, saying they have 32-bit
11966          registers would lead to spurious "register must be even" messages.
11967          So here we assume float registers are never smaller than the
11968          integer ones.  */
11969       if (file_mips_gp32 == 0)
11970         /* 64-bit integer registers implies 64-bit float registers.  */
11971         file_mips_fp32 = 0;
11972       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
11973                && ISA_HAS_64BIT_FPRS (mips_opts.isa))
11974         /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
11975         file_mips_fp32 = 0;
11976       else
11977         /* 32-bit float registers.  */
11978         file_mips_fp32 = 1;
11979       break;
11980
11981     /* The user specified the size of the float registers.  Check if it
11982        agrees with the ABI and ISA.  */
11983     case 0:
11984       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
11985         as_bad (_("-mfp64 used with a 32-bit fpu"));
11986       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
11987                && !ISA_HAS_MXHC1 (mips_opts.isa))
11988         as_warn (_("-mfp64 used with a 32-bit ABI"));
11989       break;
11990     case 1:
11991       if (ABI_NEEDS_64BIT_REGS (mips_abi))
11992         as_warn (_("-mfp32 used with a 64-bit ABI"));
11993       break;
11994     }
11995
11996   /* End of GCC-shared inference code.  */
11997
11998   /* This flag is set when we have a 64-bit capable CPU but use only
11999      32-bit wide registers.  Note that EABI does not use it.  */
12000   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
12001       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
12002           || mips_abi == O32_ABI))
12003     mips_32bitmode = 1;
12004
12005   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
12006     as_bad (_("trap exception not supported at ISA 1"));
12007
12008   /* If the selected architecture includes support for ASEs, enable
12009      generation of code for them.  */
12010   if (mips_opts.mips16 == -1)
12011     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
12012   if (mips_opts.ase_mips3d == -1)
12013     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
12014                             && file_mips_fp32 == 0) ? 1 : 0;
12015   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
12016     as_bad (_("-mfp32 used with -mips3d"));
12017
12018   if (mips_opts.ase_mdmx == -1)
12019     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
12020                           && file_mips_fp32 == 0) ? 1 : 0;
12021   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
12022     as_bad (_("-mfp32 used with -mdmx"));
12023
12024   if (mips_opts.ase_smartmips == -1)
12025     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
12026   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
12027     as_warn (_("%s ISA does not support SmartMIPS"), 
12028              mips_cpu_info_from_isa (mips_opts.isa)->name);
12029
12030   if (mips_opts.ase_dsp == -1)
12031     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12032   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
12033     as_warn (_("%s ISA does not support DSP ASE"), 
12034              mips_cpu_info_from_isa (mips_opts.isa)->name);
12035
12036   if (mips_opts.ase_dspr2 == -1)
12037     {
12038       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
12039       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12040     }
12041   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
12042     as_warn (_("%s ISA does not support DSP R2 ASE"),
12043              mips_cpu_info_from_isa (mips_opts.isa)->name);
12044
12045   if (mips_opts.ase_mt == -1)
12046     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
12047   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
12048     as_warn (_("%s ISA does not support MT ASE"),
12049              mips_cpu_info_from_isa (mips_opts.isa)->name);
12050
12051   file_mips_isa = mips_opts.isa;
12052   file_ase_mips3d = mips_opts.ase_mips3d;
12053   file_ase_mdmx = mips_opts.ase_mdmx;
12054   file_ase_smartmips = mips_opts.ase_smartmips;
12055   file_ase_dsp = mips_opts.ase_dsp;
12056   file_ase_dspr2 = mips_opts.ase_dspr2;
12057   file_ase_mt = mips_opts.ase_mt;
12058   mips_opts.gp32 = file_mips_gp32;
12059   mips_opts.fp32 = file_mips_fp32;
12060   mips_opts.soft_float = file_mips_soft_float;
12061   mips_opts.single_float = file_mips_single_float;
12062
12063   if (mips_flag_mdebug < 0)
12064     {
12065 #ifdef OBJ_MAYBE_ECOFF
12066       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
12067         mips_flag_mdebug = 1;
12068       else
12069 #endif /* OBJ_MAYBE_ECOFF */
12070         mips_flag_mdebug = 0;
12071     }
12072 }
12073 \f
12074 void
12075 mips_init_after_args (void)
12076 {
12077   /* initialize opcodes */
12078   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
12079   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
12080 }
12081
12082 long
12083 md_pcrel_from (fixS *fixP)
12084 {
12085   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
12086   switch (fixP->fx_r_type)
12087     {
12088     case BFD_RELOC_16_PCREL_S2:
12089     case BFD_RELOC_MIPS_JMP:
12090       /* Return the address of the delay slot.  */
12091       return addr + 4;
12092     default:
12093       /* We have no relocation type for PC relative MIPS16 instructions.  */
12094       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
12095         as_bad_where (fixP->fx_file, fixP->fx_line,
12096                       _("PC relative MIPS16 instruction references a different section"));
12097       return addr;
12098     }
12099 }
12100
12101 /* This is called before the symbol table is processed.  In order to
12102    work with gcc when using mips-tfile, we must keep all local labels.
12103    However, in other cases, we want to discard them.  If we were
12104    called with -g, but we didn't see any debugging information, it may
12105    mean that gcc is smuggling debugging information through to
12106    mips-tfile, in which case we must generate all local labels.  */
12107
12108 void
12109 mips_frob_file_before_adjust (void)
12110 {
12111 #ifndef NO_ECOFF_DEBUGGING
12112   if (ECOFF_DEBUGGING
12113       && mips_debug != 0
12114       && ! ecoff_debugging_seen)
12115     flag_keep_locals = 1;
12116 #endif
12117 }
12118
12119 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
12120    the corresponding LO16 reloc.  This is called before md_apply_fix and
12121    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
12122    relocation operators.
12123
12124    For our purposes, a %lo() expression matches a %got() or %hi()
12125    expression if:
12126
12127       (a) it refers to the same symbol; and
12128       (b) the offset applied in the %lo() expression is no lower than
12129           the offset applied in the %got() or %hi().
12130
12131    (b) allows us to cope with code like:
12132
12133         lui     $4,%hi(foo)
12134         lh      $4,%lo(foo+2)($4)
12135
12136    ...which is legal on RELA targets, and has a well-defined behaviour
12137    if the user knows that adding 2 to "foo" will not induce a carry to
12138    the high 16 bits.
12139
12140    When several %lo()s match a particular %got() or %hi(), we use the
12141    following rules to distinguish them:
12142
12143      (1) %lo()s with smaller offsets are a better match than %lo()s with
12144          higher offsets.
12145
12146      (2) %lo()s with no matching %got() or %hi() are better than those
12147          that already have a matching %got() or %hi().
12148
12149      (3) later %lo()s are better than earlier %lo()s.
12150
12151    These rules are applied in order.
12152
12153    (1) means, among other things, that %lo()s with identical offsets are
12154    chosen if they exist.
12155
12156    (2) means that we won't associate several high-part relocations with
12157    the same low-part relocation unless there's no alternative.  Having
12158    several high parts for the same low part is a GNU extension; this rule
12159    allows careful users to avoid it.
12160
12161    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
12162    with the last high-part relocation being at the front of the list.
12163    It therefore makes sense to choose the last matching low-part
12164    relocation, all other things being equal.  It's also easier
12165    to code that way.  */
12166
12167 void
12168 mips_frob_file (void)
12169 {
12170   struct mips_hi_fixup *l;
12171   bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
12172
12173   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12174     {
12175       segment_info_type *seginfo;
12176       bfd_boolean matched_lo_p;
12177       fixS **hi_pos, **lo_pos, **pos;
12178
12179       gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
12180
12181       /* If a GOT16 relocation turns out to be against a global symbol,
12182          there isn't supposed to be a matching LO.  */
12183       if (got16_reloc_p (l->fixp->fx_r_type)
12184           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12185         continue;
12186
12187       /* Check quickly whether the next fixup happens to be a matching %lo.  */
12188       if (fixup_has_matching_lo_p (l->fixp))
12189         continue;
12190
12191       seginfo = seg_info (l->seg);
12192
12193       /* Set HI_POS to the position of this relocation in the chain.
12194          Set LO_POS to the position of the chosen low-part relocation.
12195          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12196          relocation that matches an immediately-preceding high-part
12197          relocation.  */
12198       hi_pos = NULL;
12199       lo_pos = NULL;
12200       matched_lo_p = FALSE;
12201       looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
12202
12203       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12204         {
12205           if (*pos == l->fixp)
12206             hi_pos = pos;
12207
12208           if ((*pos)->fx_r_type == looking_for_rtype
12209               && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
12210               && (*pos)->fx_offset >= l->fixp->fx_offset
12211               && (lo_pos == NULL
12212                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
12213                   || (!matched_lo_p
12214                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12215             lo_pos = pos;
12216
12217           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12218                           && fixup_has_matching_lo_p (*pos));
12219         }
12220
12221       /* If we found a match, remove the high-part relocation from its
12222          current position and insert it before the low-part relocation.
12223          Make the offsets match so that fixup_has_matching_lo_p()
12224          will return true.
12225
12226          We don't warn about unmatched high-part relocations since some
12227          versions of gcc have been known to emit dead "lui ...%hi(...)"
12228          instructions.  */
12229       if (lo_pos != NULL)
12230         {
12231           l->fixp->fx_offset = (*lo_pos)->fx_offset;
12232           if (l->fixp->fx_next != *lo_pos)
12233             {
12234               *hi_pos = l->fixp->fx_next;
12235               l->fixp->fx_next = *lo_pos;
12236               *lo_pos = l->fixp;
12237             }
12238         }
12239     }
12240 }
12241
12242 /* We may have combined relocations without symbols in the N32/N64 ABI.
12243    We have to prevent gas from dropping them.  */
12244
12245 int
12246 mips_force_relocation (fixS *fixp)
12247 {
12248   if (generic_force_reloc (fixp))
12249     return 1;
12250
12251   if (HAVE_NEWABI
12252       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12253       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
12254           || hi16_reloc_p (fixp->fx_r_type)
12255           || lo16_reloc_p (fixp->fx_r_type)))
12256     return 1;
12257
12258   return 0;
12259 }
12260
12261 /* Apply a fixup to the object file.  */
12262
12263 void
12264 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
12265 {
12266   bfd_byte *buf;
12267   long insn;
12268   reloc_howto_type *howto;
12269
12270   /* We ignore generic BFD relocations we don't know about.  */
12271   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12272   if (! howto)
12273     return;
12274
12275   gas_assert (fixP->fx_size == 4
12276               || fixP->fx_r_type == BFD_RELOC_16
12277               || fixP->fx_r_type == BFD_RELOC_64
12278               || fixP->fx_r_type == BFD_RELOC_CTOR
12279               || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12280               || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12281               || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12282               || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
12283
12284   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
12285
12286   gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
12287
12288   /* Don't treat parts of a composite relocation as done.  There are two
12289      reasons for this:
12290
12291      (1) The second and third parts will be against 0 (RSS_UNDEF) but
12292          should nevertheless be emitted if the first part is.
12293
12294      (2) In normal usage, composite relocations are never assembly-time
12295          constants.  The easiest way of dealing with the pathological
12296          exceptions is to generate a relocation against STN_UNDEF and
12297          leave everything up to the linker.  */
12298   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
12299     fixP->fx_done = 1;
12300
12301   switch (fixP->fx_r_type)
12302     {
12303     case BFD_RELOC_MIPS_TLS_GD:
12304     case BFD_RELOC_MIPS_TLS_LDM:
12305     case BFD_RELOC_MIPS_TLS_DTPREL32:
12306     case BFD_RELOC_MIPS_TLS_DTPREL64:
12307     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12308     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12309     case BFD_RELOC_MIPS_TLS_GOTTPREL:
12310     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12311     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12312       S_SET_THREAD_LOCAL (fixP->fx_addsy);
12313       /* fall through */
12314
12315     case BFD_RELOC_MIPS_JMP:
12316     case BFD_RELOC_MIPS_SHIFT5:
12317     case BFD_RELOC_MIPS_SHIFT6:
12318     case BFD_RELOC_MIPS_GOT_DISP:
12319     case BFD_RELOC_MIPS_GOT_PAGE:
12320     case BFD_RELOC_MIPS_GOT_OFST:
12321     case BFD_RELOC_MIPS_SUB:
12322     case BFD_RELOC_MIPS_INSERT_A:
12323     case BFD_RELOC_MIPS_INSERT_B:
12324     case BFD_RELOC_MIPS_DELETE:
12325     case BFD_RELOC_MIPS_HIGHEST:
12326     case BFD_RELOC_MIPS_HIGHER:
12327     case BFD_RELOC_MIPS_SCN_DISP:
12328     case BFD_RELOC_MIPS_REL16:
12329     case BFD_RELOC_MIPS_RELGOT:
12330     case BFD_RELOC_MIPS_JALR:
12331     case BFD_RELOC_HI16:
12332     case BFD_RELOC_HI16_S:
12333     case BFD_RELOC_GPREL16:
12334     case BFD_RELOC_MIPS_LITERAL:
12335     case BFD_RELOC_MIPS_CALL16:
12336     case BFD_RELOC_MIPS_GOT16:
12337     case BFD_RELOC_GPREL32:
12338     case BFD_RELOC_MIPS_GOT_HI16:
12339     case BFD_RELOC_MIPS_GOT_LO16:
12340     case BFD_RELOC_MIPS_CALL_HI16:
12341     case BFD_RELOC_MIPS_CALL_LO16:
12342     case BFD_RELOC_MIPS16_GPREL:
12343     case BFD_RELOC_MIPS16_GOT16:
12344     case BFD_RELOC_MIPS16_CALL16:
12345     case BFD_RELOC_MIPS16_HI16:
12346     case BFD_RELOC_MIPS16_HI16_S:
12347     case BFD_RELOC_MIPS16_JMP:
12348       /* Nothing needed to do.  The value comes from the reloc entry.  */
12349       break;
12350
12351     case BFD_RELOC_64:
12352       /* This is handled like BFD_RELOC_32, but we output a sign
12353          extended value if we are only 32 bits.  */
12354       if (fixP->fx_done)
12355         {
12356           if (8 <= sizeof (valueT))
12357             md_number_to_chars ((char *) buf, *valP, 8);
12358           else
12359             {
12360               valueT hiv;
12361
12362               if ((*valP & 0x80000000) != 0)
12363                 hiv = 0xffffffff;
12364               else
12365                 hiv = 0;
12366               md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
12367                                   *valP, 4);
12368               md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
12369                                   hiv, 4);
12370             }
12371         }
12372       break;
12373
12374     case BFD_RELOC_RVA:
12375     case BFD_RELOC_32:
12376     case BFD_RELOC_16:
12377       /* If we are deleting this reloc entry, we must fill in the
12378          value now.  This can happen if we have a .word which is not
12379          resolved when it appears but is later defined.  */
12380       if (fixP->fx_done)
12381         md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
12382       break;
12383
12384     case BFD_RELOC_LO16:
12385     case BFD_RELOC_MIPS16_LO16:
12386       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12387          may be safe to remove, but if so it's not obvious.  */
12388       /* When handling an embedded PIC switch statement, we can wind
12389          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
12390       if (fixP->fx_done)
12391         {
12392           if (*valP + 0x8000 > 0xffff)
12393             as_bad_where (fixP->fx_file, fixP->fx_line,
12394                           _("relocation overflow"));
12395           if (target_big_endian)
12396             buf += 2;
12397           md_number_to_chars ((char *) buf, *valP, 2);
12398         }
12399       break;
12400
12401     case BFD_RELOC_16_PCREL_S2:
12402       if ((*valP & 0x3) != 0)
12403         as_bad_where (fixP->fx_file, fixP->fx_line,
12404                       _("Branch to misaligned address (%lx)"), (long) *valP);
12405
12406       /* We need to save the bits in the instruction since fixup_segment()
12407          might be deleting the relocation entry (i.e., a branch within
12408          the current segment).  */
12409       if (! fixP->fx_done)
12410         break;
12411
12412       /* Update old instruction data.  */
12413       if (target_big_endian)
12414         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12415       else
12416         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12417
12418       if (*valP + 0x20000 <= 0x3ffff)
12419         {
12420           insn |= (*valP >> 2) & 0xffff;
12421           md_number_to_chars ((char *) buf, insn, 4);
12422         }
12423       else if (mips_pic == NO_PIC
12424                && fixP->fx_done
12425                && fixP->fx_frag->fr_address >= text_section->vma
12426                && (fixP->fx_frag->fr_address
12427                    < text_section->vma + bfd_get_section_size (text_section))
12428                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
12429                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
12430                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
12431         {
12432           /* The branch offset is too large.  If this is an
12433              unconditional branch, and we are not generating PIC code,
12434              we can convert it to an absolute jump instruction.  */
12435           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
12436             insn = 0x0c000000;  /* jal */
12437           else
12438             insn = 0x08000000;  /* j */
12439           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12440           fixP->fx_done = 0;
12441           fixP->fx_addsy = section_symbol (text_section);
12442           *valP += md_pcrel_from (fixP);
12443           md_number_to_chars ((char *) buf, insn, 4);
12444         }
12445       else
12446         {
12447           /* If we got here, we have branch-relaxation disabled,
12448              and there's nothing we can do to fix this instruction
12449              without turning it into a longer sequence.  */
12450           as_bad_where (fixP->fx_file, fixP->fx_line,
12451                         _("Branch out of range"));
12452         }
12453       break;
12454
12455     case BFD_RELOC_VTABLE_INHERIT:
12456       fixP->fx_done = 0;
12457       if (fixP->fx_addsy
12458           && !S_IS_DEFINED (fixP->fx_addsy)
12459           && !S_IS_WEAK (fixP->fx_addsy))
12460         S_SET_WEAK (fixP->fx_addsy);
12461       break;
12462
12463     case BFD_RELOC_VTABLE_ENTRY:
12464       fixP->fx_done = 0;
12465       break;
12466
12467     default:
12468       internalError ();
12469     }
12470
12471   /* Remember value for tc_gen_reloc.  */
12472   fixP->fx_addnumber = *valP;
12473 }
12474
12475 static symbolS *
12476 get_symbol (void)
12477 {
12478   int c;
12479   char *name;
12480   symbolS *p;
12481
12482   name = input_line_pointer;
12483   c = get_symbol_end ();
12484   p = (symbolS *) symbol_find_or_make (name);
12485   *input_line_pointer = c;
12486   return p;
12487 }
12488
12489 /* Align the current frag to a given power of two.  If a particular
12490    fill byte should be used, FILL points to an integer that contains
12491    that byte, otherwise FILL is null.
12492
12493    The MIPS assembler also automatically adjusts any preceding
12494    label.  */
12495
12496 static void
12497 mips_align (int to, int *fill, symbolS *label)
12498 {
12499   mips_emit_delays ();
12500   mips_record_mips16_mode ();
12501   if (fill == NULL && subseg_text_p (now_seg))
12502     frag_align_code (to, 0);
12503   else
12504     frag_align (to, fill ? *fill : 0, 0);
12505   record_alignment (now_seg, to);
12506   if (label != NULL)
12507     {
12508       gas_assert (S_GET_SEGMENT (label) == now_seg);
12509       symbol_set_frag (label, frag_now);
12510       S_SET_VALUE (label, (valueT) frag_now_fix ());
12511     }
12512 }
12513
12514 /* Align to a given power of two.  .align 0 turns off the automatic
12515    alignment used by the data creating pseudo-ops.  */
12516
12517 static void
12518 s_align (int x ATTRIBUTE_UNUSED)
12519 {
12520   int temp, fill_value, *fill_ptr;
12521   long max_alignment = 28;
12522
12523   /* o Note that the assembler pulls down any immediately preceding label
12524        to the aligned address.
12525      o It's not documented but auto alignment is reinstated by
12526        a .align pseudo instruction.
12527      o Note also that after auto alignment is turned off the mips assembler
12528        issues an error on attempt to assemble an improperly aligned data item.
12529        We don't.  */
12530
12531   temp = get_absolute_expression ();
12532   if (temp > max_alignment)
12533     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12534   else if (temp < 0)
12535     {
12536       as_warn (_("Alignment negative: 0 assumed."));
12537       temp = 0;
12538     }
12539   if (*input_line_pointer == ',')
12540     {
12541       ++input_line_pointer;
12542       fill_value = get_absolute_expression ();
12543       fill_ptr = &fill_value;
12544     }
12545   else
12546     fill_ptr = 0;
12547   if (temp)
12548     {
12549       segment_info_type *si = seg_info (now_seg);
12550       struct insn_label_list *l = si->label_list;
12551       /* Auto alignment should be switched on by next section change.  */
12552       auto_align = 1;
12553       mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
12554     }
12555   else
12556     {
12557       auto_align = 0;
12558     }
12559
12560   demand_empty_rest_of_line ();
12561 }
12562
12563 static void
12564 s_change_sec (int sec)
12565 {
12566   segT seg;
12567
12568 #ifdef OBJ_ELF
12569   /* The ELF backend needs to know that we are changing sections, so
12570      that .previous works correctly.  We could do something like check
12571      for an obj_section_change_hook macro, but that might be confusing
12572      as it would not be appropriate to use it in the section changing
12573      functions in read.c, since obj-elf.c intercepts those.  FIXME:
12574      This should be cleaner, somehow.  */
12575   if (IS_ELF)
12576     obj_elf_section_change_hook ();
12577 #endif
12578
12579   mips_emit_delays ();
12580
12581   switch (sec)
12582     {
12583     case 't':
12584       s_text (0);
12585       break;
12586     case 'd':
12587       s_data (0);
12588       break;
12589     case 'b':
12590       subseg_set (bss_section, (subsegT) get_absolute_expression ());
12591       demand_empty_rest_of_line ();
12592       break;
12593
12594     case 'r':
12595       seg = subseg_new (RDATA_SECTION_NAME,
12596                         (subsegT) get_absolute_expression ());
12597       if (IS_ELF)
12598         {
12599           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12600                                                   | SEC_READONLY | SEC_RELOC
12601                                                   | SEC_DATA));
12602           if (strncmp (TARGET_OS, "elf", 3) != 0)
12603             record_alignment (seg, 4);
12604         }
12605       demand_empty_rest_of_line ();
12606       break;
12607
12608     case 's':
12609       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12610       if (IS_ELF)
12611         {
12612           bfd_set_section_flags (stdoutput, seg,
12613                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12614           if (strncmp (TARGET_OS, "elf", 3) != 0)
12615             record_alignment (seg, 4);
12616         }
12617       demand_empty_rest_of_line ();
12618       break;
12619
12620     case 'B':
12621       seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
12622       if (IS_ELF)
12623         {
12624           bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
12625           if (strncmp (TARGET_OS, "elf", 3) != 0)
12626             record_alignment (seg, 4);
12627         }
12628       demand_empty_rest_of_line ();
12629       break;
12630     }
12631
12632   auto_align = 1;
12633 }
12634
12635 void
12636 s_change_section (int ignore ATTRIBUTE_UNUSED)
12637 {
12638 #ifdef OBJ_ELF
12639   char *section_name;
12640   char c;
12641   char next_c = 0;
12642   int section_type;
12643   int section_flag;
12644   int section_entry_size;
12645   int section_alignment;
12646
12647   if (!IS_ELF)
12648     return;
12649
12650   section_name = input_line_pointer;
12651   c = get_symbol_end ();
12652   if (c)
12653     next_c = *(input_line_pointer + 1);
12654
12655   /* Do we have .section Name<,"flags">?  */
12656   if (c != ',' || (c == ',' && next_c == '"'))
12657     {
12658       /* just after name is now '\0'.  */
12659       *input_line_pointer = c;
12660       input_line_pointer = section_name;
12661       obj_elf_section (ignore);
12662       return;
12663     }
12664   input_line_pointer++;
12665
12666   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
12667   if (c == ',')
12668     section_type = get_absolute_expression ();
12669   else
12670     section_type = 0;
12671   if (*input_line_pointer++ == ',')
12672     section_flag = get_absolute_expression ();
12673   else
12674     section_flag = 0;
12675   if (*input_line_pointer++ == ',')
12676     section_entry_size = get_absolute_expression ();
12677   else
12678     section_entry_size = 0;
12679   if (*input_line_pointer++ == ',')
12680     section_alignment = get_absolute_expression ();
12681   else
12682     section_alignment = 0;
12683   /* FIXME: really ignore?  */
12684   (void) section_alignment;
12685
12686   section_name = xstrdup (section_name);
12687
12688   /* When using the generic form of .section (as implemented by obj-elf.c),
12689      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
12690      traditionally had to fall back on the more common @progbits instead.
12691
12692      There's nothing really harmful in this, since bfd will correct
12693      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
12694      means that, for backwards compatibility, the special_section entries
12695      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12696
12697      Even so, we shouldn't force users of the MIPS .section syntax to
12698      incorrectly label the sections as SHT_PROGBITS.  The best compromise
12699      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12700      generic type-checking code.  */
12701   if (section_type == SHT_MIPS_DWARF)
12702     section_type = SHT_PROGBITS;
12703
12704   obj_elf_change_section (section_name, section_type, section_flag,
12705                           section_entry_size, 0, 0, 0);
12706
12707   if (now_seg->name != section_name)
12708     free (section_name);
12709 #endif /* OBJ_ELF */
12710 }
12711
12712 void
12713 mips_enable_auto_align (void)
12714 {
12715   auto_align = 1;
12716 }
12717
12718 static void
12719 s_cons (int log_size)
12720 {
12721   segment_info_type *si = seg_info (now_seg);
12722   struct insn_label_list *l = si->label_list;
12723   symbolS *label;
12724
12725   label = l != NULL ? l->label : NULL;
12726   mips_emit_delays ();
12727   if (log_size > 0 && auto_align)
12728     mips_align (log_size, 0, label);
12729   mips_clear_insn_labels ();
12730   cons (1 << log_size);
12731 }
12732
12733 static void
12734 s_float_cons (int type)
12735 {
12736   segment_info_type *si = seg_info (now_seg);
12737   struct insn_label_list *l = si->label_list;
12738   symbolS *label;
12739
12740   label = l != NULL ? l->label : NULL;
12741
12742   mips_emit_delays ();
12743
12744   if (auto_align)
12745     {
12746       if (type == 'd')
12747         mips_align (3, 0, label);
12748       else
12749         mips_align (2, 0, label);
12750     }
12751
12752   mips_clear_insn_labels ();
12753
12754   float_cons (type);
12755 }
12756
12757 /* Handle .globl.  We need to override it because on Irix 5 you are
12758    permitted to say
12759        .globl foo .text
12760    where foo is an undefined symbol, to mean that foo should be
12761    considered to be the address of a function.  */
12762
12763 static void
12764 s_mips_globl (int x ATTRIBUTE_UNUSED)
12765 {
12766   char *name;
12767   int c;
12768   symbolS *symbolP;
12769   flagword flag;
12770
12771   do
12772     {
12773       name = input_line_pointer;
12774       c = get_symbol_end ();
12775       symbolP = symbol_find_or_make (name);
12776       S_SET_EXTERNAL (symbolP);
12777
12778       *input_line_pointer = c;
12779       SKIP_WHITESPACE ();
12780
12781       /* On Irix 5, every global symbol that is not explicitly labelled as
12782          being a function is apparently labelled as being an object.  */
12783       flag = BSF_OBJECT;
12784
12785       if (!is_end_of_line[(unsigned char) *input_line_pointer]
12786           && (*input_line_pointer != ','))
12787         {
12788           char *secname;
12789           asection *sec;
12790
12791           secname = input_line_pointer;
12792           c = get_symbol_end ();
12793           sec = bfd_get_section_by_name (stdoutput, secname);
12794           if (sec == NULL)
12795             as_bad (_("%s: no such section"), secname);
12796           *input_line_pointer = c;
12797
12798           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12799             flag = BSF_FUNCTION;
12800         }
12801
12802       symbol_get_bfdsym (symbolP)->flags |= flag;
12803
12804       c = *input_line_pointer;
12805       if (c == ',')
12806         {
12807           input_line_pointer++;
12808           SKIP_WHITESPACE ();
12809           if (is_end_of_line[(unsigned char) *input_line_pointer])
12810             c = '\n';
12811         }
12812     }
12813   while (c == ',');
12814
12815   demand_empty_rest_of_line ();
12816 }
12817
12818 static void
12819 s_option (int x ATTRIBUTE_UNUSED)
12820 {
12821   char *opt;
12822   char c;
12823
12824   opt = input_line_pointer;
12825   c = get_symbol_end ();
12826
12827   if (*opt == 'O')
12828     {
12829       /* FIXME: What does this mean?  */
12830     }
12831   else if (strncmp (opt, "pic", 3) == 0)
12832     {
12833       int i;
12834
12835       i = atoi (opt + 3);
12836       if (i == 0)
12837         mips_pic = NO_PIC;
12838       else if (i == 2)
12839         {
12840         mips_pic = SVR4_PIC;
12841           mips_abicalls = TRUE;
12842         }
12843       else
12844         as_bad (_(".option pic%d not supported"), i);
12845
12846       if (mips_pic == SVR4_PIC)
12847         {
12848           if (g_switch_seen && g_switch_value != 0)
12849             as_warn (_("-G may not be used with SVR4 PIC code"));
12850           g_switch_value = 0;
12851           bfd_set_gp_size (stdoutput, 0);
12852         }
12853     }
12854   else
12855     as_warn (_("Unrecognized option \"%s\""), opt);
12856
12857   *input_line_pointer = c;
12858   demand_empty_rest_of_line ();
12859 }
12860
12861 /* This structure is used to hold a stack of .set values.  */
12862
12863 struct mips_option_stack
12864 {
12865   struct mips_option_stack *next;
12866   struct mips_set_options options;
12867 };
12868
12869 static struct mips_option_stack *mips_opts_stack;
12870
12871 /* Handle the .set pseudo-op.  */
12872
12873 static void
12874 s_mipsset (int x ATTRIBUTE_UNUSED)
12875 {
12876   char *name = input_line_pointer, ch;
12877
12878   while (!is_end_of_line[(unsigned char) *input_line_pointer])
12879     ++input_line_pointer;
12880   ch = *input_line_pointer;
12881   *input_line_pointer = '\0';
12882
12883   if (strcmp (name, "reorder") == 0)
12884     {
12885       if (mips_opts.noreorder)
12886         end_noreorder ();
12887     }
12888   else if (strcmp (name, "noreorder") == 0)
12889     {
12890       if (!mips_opts.noreorder)
12891         start_noreorder ();
12892     }
12893   else if (strncmp (name, "at=", 3) == 0)
12894     {
12895       char *s = name + 3;
12896
12897       if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
12898         as_bad (_("Unrecognized register name `%s'"), s);
12899     }
12900   else if (strcmp (name, "at") == 0)
12901     {
12902       mips_opts.at = ATREG;
12903     }
12904   else if (strcmp (name, "noat") == 0)
12905     {
12906       mips_opts.at = ZERO;
12907     }
12908   else if (strcmp (name, "macro") == 0)
12909     {
12910       mips_opts.warn_about_macros = 0;
12911     }
12912   else if (strcmp (name, "nomacro") == 0)
12913     {
12914       if (mips_opts.noreorder == 0)
12915         as_bad (_("`noreorder' must be set before `nomacro'"));
12916       mips_opts.warn_about_macros = 1;
12917     }
12918   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12919     {
12920       mips_opts.nomove = 0;
12921     }
12922   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12923     {
12924       mips_opts.nomove = 1;
12925     }
12926   else if (strcmp (name, "bopt") == 0)
12927     {
12928       mips_opts.nobopt = 0;
12929     }
12930   else if (strcmp (name, "nobopt") == 0)
12931     {
12932       mips_opts.nobopt = 1;
12933     }
12934   else if (strcmp (name, "gp=default") == 0)
12935     mips_opts.gp32 = file_mips_gp32;
12936   else if (strcmp (name, "gp=32") == 0)
12937     mips_opts.gp32 = 1;
12938   else if (strcmp (name, "gp=64") == 0)
12939     {
12940       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
12941         as_warn (_("%s isa does not support 64-bit registers"),
12942                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12943       mips_opts.gp32 = 0;
12944     }
12945   else if (strcmp (name, "fp=default") == 0)
12946     mips_opts.fp32 = file_mips_fp32;
12947   else if (strcmp (name, "fp=32") == 0)
12948     mips_opts.fp32 = 1;
12949   else if (strcmp (name, "fp=64") == 0)
12950     {
12951       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12952         as_warn (_("%s isa does not support 64-bit floating point registers"),
12953                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12954       mips_opts.fp32 = 0;
12955     }
12956   else if (strcmp (name, "softfloat") == 0)
12957     mips_opts.soft_float = 1;
12958   else if (strcmp (name, "hardfloat") == 0)
12959     mips_opts.soft_float = 0;
12960   else if (strcmp (name, "singlefloat") == 0)
12961     mips_opts.single_float = 1;
12962   else if (strcmp (name, "doublefloat") == 0)
12963     mips_opts.single_float = 0;
12964   else if (strcmp (name, "mips16") == 0
12965            || strcmp (name, "MIPS-16") == 0)
12966     mips_opts.mips16 = 1;
12967   else if (strcmp (name, "nomips16") == 0
12968            || strcmp (name, "noMIPS-16") == 0)
12969     mips_opts.mips16 = 0;
12970   else if (strcmp (name, "smartmips") == 0)
12971     {
12972       if (!ISA_SUPPORTS_SMARTMIPS)
12973         as_warn (_("%s ISA does not support SmartMIPS ASE"), 
12974                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12975       mips_opts.ase_smartmips = 1;
12976     }
12977   else if (strcmp (name, "nosmartmips") == 0)
12978     mips_opts.ase_smartmips = 0;
12979   else if (strcmp (name, "mips3d") == 0)
12980     mips_opts.ase_mips3d = 1;
12981   else if (strcmp (name, "nomips3d") == 0)
12982     mips_opts.ase_mips3d = 0;
12983   else if (strcmp (name, "mdmx") == 0)
12984     mips_opts.ase_mdmx = 1;
12985   else if (strcmp (name, "nomdmx") == 0)
12986     mips_opts.ase_mdmx = 0;
12987   else if (strcmp (name, "dsp") == 0)
12988     {
12989       if (!ISA_SUPPORTS_DSP_ASE)
12990         as_warn (_("%s ISA does not support DSP ASE"), 
12991                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12992       mips_opts.ase_dsp = 1;
12993       mips_opts.ase_dspr2 = 0;
12994     }
12995   else if (strcmp (name, "nodsp") == 0)
12996     {
12997       mips_opts.ase_dsp = 0;
12998       mips_opts.ase_dspr2 = 0;
12999     }
13000   else if (strcmp (name, "dspr2") == 0)
13001     {
13002       if (!ISA_SUPPORTS_DSPR2_ASE)
13003         as_warn (_("%s ISA does not support DSP R2 ASE"),
13004                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13005       mips_opts.ase_dspr2 = 1;
13006       mips_opts.ase_dsp = 1;
13007     }
13008   else if (strcmp (name, "nodspr2") == 0)
13009     {
13010       mips_opts.ase_dspr2 = 0;
13011       mips_opts.ase_dsp = 0;
13012     }
13013   else if (strcmp (name, "mt") == 0)
13014     {
13015       if (!ISA_SUPPORTS_MT_ASE)
13016         as_warn (_("%s ISA does not support MT ASE"), 
13017                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13018       mips_opts.ase_mt = 1;
13019     }
13020   else if (strcmp (name, "nomt") == 0)
13021     mips_opts.ase_mt = 0;
13022   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
13023     {
13024       int reset = 0;
13025
13026       /* Permit the user to change the ISA and architecture on the fly.
13027          Needless to say, misuse can cause serious problems.  */
13028       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
13029         {
13030           reset = 1;
13031           mips_opts.isa = file_mips_isa;
13032           mips_opts.arch = file_mips_arch;
13033         }
13034       else if (strncmp (name, "arch=", 5) == 0)
13035         {
13036           const struct mips_cpu_info *p;
13037
13038           p = mips_parse_cpu("internal use", name + 5);
13039           if (!p)
13040             as_bad (_("unknown architecture %s"), name + 5);
13041           else
13042             {
13043               mips_opts.arch = p->cpu;
13044               mips_opts.isa = p->isa;
13045             }
13046         }
13047       else if (strncmp (name, "mips", 4) == 0)
13048         {
13049           const struct mips_cpu_info *p;
13050
13051           p = mips_parse_cpu("internal use", name);
13052           if (!p)
13053             as_bad (_("unknown ISA level %s"), name + 4);
13054           else
13055             {
13056               mips_opts.arch = p->cpu;
13057               mips_opts.isa = p->isa;
13058             }
13059         }
13060       else
13061         as_bad (_("unknown ISA or architecture %s"), name);
13062
13063       switch (mips_opts.isa)
13064         {
13065         case  0:
13066           break;
13067         case ISA_MIPS1:
13068         case ISA_MIPS2:
13069         case ISA_MIPS32:
13070         case ISA_MIPS32R2:
13071           mips_opts.gp32 = 1;
13072           mips_opts.fp32 = 1;
13073           break;
13074         case ISA_MIPS3:
13075         case ISA_MIPS4:
13076         case ISA_MIPS5:
13077         case ISA_MIPS64:
13078         case ISA_MIPS64R2:
13079           mips_opts.gp32 = 0;
13080           mips_opts.fp32 = 0;
13081           break;
13082         default:
13083           as_bad (_("unknown ISA level %s"), name + 4);
13084           break;
13085         }
13086       if (reset)
13087         {
13088           mips_opts.gp32 = file_mips_gp32;
13089           mips_opts.fp32 = file_mips_fp32;
13090         }
13091     }
13092   else if (strcmp (name, "autoextend") == 0)
13093     mips_opts.noautoextend = 0;
13094   else if (strcmp (name, "noautoextend") == 0)
13095     mips_opts.noautoextend = 1;
13096   else if (strcmp (name, "push") == 0)
13097     {
13098       struct mips_option_stack *s;
13099
13100       s = (struct mips_option_stack *) xmalloc (sizeof *s);
13101       s->next = mips_opts_stack;
13102       s->options = mips_opts;
13103       mips_opts_stack = s;
13104     }
13105   else if (strcmp (name, "pop") == 0)
13106     {
13107       struct mips_option_stack *s;
13108
13109       s = mips_opts_stack;
13110       if (s == NULL)
13111         as_bad (_(".set pop with no .set push"));
13112       else
13113         {
13114           /* If we're changing the reorder mode we need to handle
13115              delay slots correctly.  */
13116           if (s->options.noreorder && ! mips_opts.noreorder)
13117             start_noreorder ();
13118           else if (! s->options.noreorder && mips_opts.noreorder)
13119             end_noreorder ();
13120
13121           mips_opts = s->options;
13122           mips_opts_stack = s->next;
13123           free (s);
13124         }
13125     }
13126   else if (strcmp (name, "sym32") == 0)
13127     mips_opts.sym32 = TRUE;
13128   else if (strcmp (name, "nosym32") == 0)
13129     mips_opts.sym32 = FALSE;
13130   else if (strchr (name, ','))
13131     {
13132       /* Generic ".set" directive; use the generic handler.  */
13133       *input_line_pointer = ch;
13134       input_line_pointer = name;
13135       s_set (0);
13136       return;
13137     }
13138   else
13139     {
13140       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
13141     }
13142   *input_line_pointer = ch;
13143   demand_empty_rest_of_line ();
13144 }
13145
13146 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
13147    .option pic2.  It means to generate SVR4 PIC calls.  */
13148
13149 static void
13150 s_abicalls (int ignore ATTRIBUTE_UNUSED)
13151 {
13152   mips_pic = SVR4_PIC;
13153   mips_abicalls = TRUE;
13154
13155   if (g_switch_seen && g_switch_value != 0)
13156     as_warn (_("-G may not be used with SVR4 PIC code"));
13157   g_switch_value = 0;
13158
13159   bfd_set_gp_size (stdoutput, 0);
13160   demand_empty_rest_of_line ();
13161 }
13162
13163 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
13164    PIC code.  It sets the $gp register for the function based on the
13165    function address, which is in the register named in the argument.
13166    This uses a relocation against _gp_disp, which is handled specially
13167    by the linker.  The result is:
13168         lui     $gp,%hi(_gp_disp)
13169         addiu   $gp,$gp,%lo(_gp_disp)
13170         addu    $gp,$gp,.cpload argument
13171    The .cpload argument is normally $25 == $t9.
13172
13173    The -mno-shared option changes this to:
13174         lui     $gp,%hi(__gnu_local_gp)
13175         addiu   $gp,$gp,%lo(__gnu_local_gp)
13176    and the argument is ignored.  This saves an instruction, but the
13177    resulting code is not position independent; it uses an absolute
13178    address for __gnu_local_gp.  Thus code assembled with -mno-shared
13179    can go into an ordinary executable, but not into a shared library.  */
13180
13181 static void
13182 s_cpload (int ignore ATTRIBUTE_UNUSED)
13183 {
13184   expressionS ex;
13185   int reg;
13186   int in_shared;
13187
13188   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13189      .cpload is ignored.  */
13190   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13191     {
13192       s_ignore (0);
13193       return;
13194     }
13195
13196   /* .cpload should be in a .set noreorder section.  */
13197   if (mips_opts.noreorder == 0)
13198     as_warn (_(".cpload not in noreorder section"));
13199
13200   reg = tc_get_register (0);
13201
13202   /* If we need to produce a 64-bit address, we are better off using
13203      the default instruction sequence.  */
13204   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
13205
13206   ex.X_op = O_symbol;
13207   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13208                                          "__gnu_local_gp");
13209   ex.X_op_symbol = NULL;
13210   ex.X_add_number = 0;
13211
13212   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13213   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13214
13215   macro_start ();
13216   macro_build_lui (&ex, mips_gp_register);
13217   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13218                mips_gp_register, BFD_RELOC_LO16);
13219   if (in_shared)
13220     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13221                  mips_gp_register, reg);
13222   macro_end ();
13223
13224   demand_empty_rest_of_line ();
13225 }
13226
13227 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
13228      .cpsetup $reg1, offset|$reg2, label
13229
13230    If offset is given, this results in:
13231      sd         $gp, offset($sp)
13232      lui        $gp, %hi(%neg(%gp_rel(label)))
13233      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13234      daddu      $gp, $gp, $reg1
13235
13236    If $reg2 is given, this results in:
13237      daddu      $reg2, $gp, $0
13238      lui        $gp, %hi(%neg(%gp_rel(label)))
13239      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13240      daddu      $gp, $gp, $reg1
13241    $reg1 is normally $25 == $t9.
13242
13243    The -mno-shared option replaces the last three instructions with
13244         lui     $gp,%hi(_gp)
13245         addiu   $gp,$gp,%lo(_gp)  */
13246
13247 static void
13248 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
13249 {
13250   expressionS ex_off;
13251   expressionS ex_sym;
13252   int reg1;
13253
13254   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
13255      We also need NewABI support.  */
13256   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13257     {
13258       s_ignore (0);
13259       return;
13260     }
13261
13262   reg1 = tc_get_register (0);
13263   SKIP_WHITESPACE ();
13264   if (*input_line_pointer != ',')
13265     {
13266       as_bad (_("missing argument separator ',' for .cpsetup"));
13267       return;
13268     }
13269   else
13270     ++input_line_pointer;
13271   SKIP_WHITESPACE ();
13272   if (*input_line_pointer == '$')
13273     {
13274       mips_cpreturn_register = tc_get_register (0);
13275       mips_cpreturn_offset = -1;
13276     }
13277   else
13278     {
13279       mips_cpreturn_offset = get_absolute_expression ();
13280       mips_cpreturn_register = -1;
13281     }
13282   SKIP_WHITESPACE ();
13283   if (*input_line_pointer != ',')
13284     {
13285       as_bad (_("missing argument separator ',' for .cpsetup"));
13286       return;
13287     }
13288   else
13289     ++input_line_pointer;
13290   SKIP_WHITESPACE ();
13291   expression (&ex_sym);
13292
13293   macro_start ();
13294   if (mips_cpreturn_register == -1)
13295     {
13296       ex_off.X_op = O_constant;
13297       ex_off.X_add_symbol = NULL;
13298       ex_off.X_op_symbol = NULL;
13299       ex_off.X_add_number = mips_cpreturn_offset;
13300
13301       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
13302                    BFD_RELOC_LO16, SP);
13303     }
13304   else
13305     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
13306                  mips_gp_register, 0);
13307
13308   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
13309     {
13310       macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13311                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13312                    BFD_RELOC_HI16_S);
13313
13314       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13315                    mips_gp_register, -1, BFD_RELOC_GPREL16,
13316                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13317
13318       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13319                    mips_gp_register, reg1);
13320     }
13321   else
13322     {
13323       expressionS ex;
13324
13325       ex.X_op = O_symbol;
13326       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
13327       ex.X_op_symbol = NULL;
13328       ex.X_add_number = 0;
13329
13330       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13331       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13332
13333       macro_build_lui (&ex, mips_gp_register);
13334       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13335                    mips_gp_register, BFD_RELOC_LO16);
13336     }
13337
13338   macro_end ();
13339
13340   demand_empty_rest_of_line ();
13341 }
13342
13343 static void
13344 s_cplocal (int ignore ATTRIBUTE_UNUSED)
13345 {
13346   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
13347      .cplocal is ignored.  */
13348   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13349     {
13350       s_ignore (0);
13351       return;
13352     }
13353
13354   mips_gp_register = tc_get_register (0);
13355   demand_empty_rest_of_line ();
13356 }
13357
13358 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
13359    offset from $sp.  The offset is remembered, and after making a PIC
13360    call $gp is restored from that location.  */
13361
13362 static void
13363 s_cprestore (int ignore ATTRIBUTE_UNUSED)
13364 {
13365   expressionS ex;
13366
13367   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13368      .cprestore is ignored.  */
13369   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13370     {
13371       s_ignore (0);
13372       return;
13373     }
13374
13375   mips_cprestore_offset = get_absolute_expression ();
13376   mips_cprestore_valid = 1;
13377
13378   ex.X_op = O_constant;
13379   ex.X_add_symbol = NULL;
13380   ex.X_op_symbol = NULL;
13381   ex.X_add_number = mips_cprestore_offset;
13382
13383   macro_start ();
13384   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13385                                 SP, HAVE_64BIT_ADDRESSES);
13386   macro_end ();
13387
13388   demand_empty_rest_of_line ();
13389 }
13390
13391 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
13392    was given in the preceding .cpsetup, it results in:
13393      ld         $gp, offset($sp)
13394
13395    If a register $reg2 was given there, it results in:
13396      daddu      $gp, $reg2, $0  */
13397
13398 static void
13399 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
13400 {
13401   expressionS ex;
13402
13403   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13404      We also need NewABI support.  */
13405   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13406     {
13407       s_ignore (0);
13408       return;
13409     }
13410
13411   macro_start ();
13412   if (mips_cpreturn_register == -1)
13413     {
13414       ex.X_op = O_constant;
13415       ex.X_add_symbol = NULL;
13416       ex.X_op_symbol = NULL;
13417       ex.X_add_number = mips_cpreturn_offset;
13418
13419       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
13420     }
13421   else
13422     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
13423                  mips_cpreturn_register, 0);
13424   macro_end ();
13425
13426   demand_empty_rest_of_line ();
13427 }
13428
13429 /* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
13430    a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13431    use in DWARF debug information.  */
13432
13433 static void
13434 s_dtprel_internal (size_t bytes)
13435 {
13436   expressionS ex;
13437   char *p;
13438
13439   expression (&ex);
13440
13441   if (ex.X_op != O_symbol)
13442     {
13443       as_bad (_("Unsupported use of %s"), (bytes == 8
13444                                            ? ".dtpreldword"
13445                                            : ".dtprelword"));
13446       ignore_rest_of_line ();
13447     }
13448
13449   p = frag_more (bytes);
13450   md_number_to_chars (p, 0, bytes);
13451   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13452                (bytes == 8
13453                 ? BFD_RELOC_MIPS_TLS_DTPREL64
13454                 : BFD_RELOC_MIPS_TLS_DTPREL32));
13455
13456   demand_empty_rest_of_line ();
13457 }
13458
13459 /* Handle .dtprelword.  */
13460
13461 static void
13462 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13463 {
13464   s_dtprel_internal (4);
13465 }
13466
13467 /* Handle .dtpreldword.  */
13468
13469 static void
13470 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13471 {
13472   s_dtprel_internal (8);
13473 }
13474
13475 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
13476    code.  It sets the offset to use in gp_rel relocations.  */
13477
13478 static void
13479 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
13480 {
13481   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13482      We also need NewABI support.  */
13483   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13484     {
13485       s_ignore (0);
13486       return;
13487     }
13488
13489   mips_gprel_offset = get_absolute_expression ();
13490
13491   demand_empty_rest_of_line ();
13492 }
13493
13494 /* Handle the .gpword pseudo-op.  This is used when generating PIC
13495    code.  It generates a 32 bit GP relative reloc.  */
13496
13497 static void
13498 s_gpword (int ignore ATTRIBUTE_UNUSED)
13499 {
13500   segment_info_type *si;
13501   struct insn_label_list *l;
13502   symbolS *label;
13503   expressionS ex;
13504   char *p;
13505
13506   /* When not generating PIC code, this is treated as .word.  */
13507   if (mips_pic != SVR4_PIC)
13508     {
13509       s_cons (2);
13510       return;
13511     }
13512
13513   si = seg_info (now_seg);
13514   l = si->label_list;
13515   label = l != NULL ? l->label : NULL;
13516   mips_emit_delays ();
13517   if (auto_align)
13518     mips_align (2, 0, label);
13519   mips_clear_insn_labels ();
13520
13521   expression (&ex);
13522
13523   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13524     {
13525       as_bad (_("Unsupported use of .gpword"));
13526       ignore_rest_of_line ();
13527     }
13528
13529   p = frag_more (4);
13530   md_number_to_chars (p, 0, 4);
13531   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13532                BFD_RELOC_GPREL32);
13533
13534   demand_empty_rest_of_line ();
13535 }
13536
13537 static void
13538 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13539 {
13540   segment_info_type *si;
13541   struct insn_label_list *l;
13542   symbolS *label;
13543   expressionS ex;
13544   char *p;
13545
13546   /* When not generating PIC code, this is treated as .dword.  */
13547   if (mips_pic != SVR4_PIC)
13548     {
13549       s_cons (3);
13550       return;
13551     }
13552
13553   si = seg_info (now_seg);
13554   l = si->label_list;
13555   label = l != NULL ? l->label : NULL;
13556   mips_emit_delays ();
13557   if (auto_align)
13558     mips_align (3, 0, label);
13559   mips_clear_insn_labels ();
13560
13561   expression (&ex);
13562
13563   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13564     {
13565       as_bad (_("Unsupported use of .gpdword"));
13566       ignore_rest_of_line ();
13567     }
13568
13569   p = frag_more (8);
13570   md_number_to_chars (p, 0, 8);
13571   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13572                BFD_RELOC_GPREL32)->fx_tcbit = 1;
13573
13574   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
13575   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13576            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13577
13578   demand_empty_rest_of_line ();
13579 }
13580
13581 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
13582    tables in SVR4 PIC code.  */
13583
13584 static void
13585 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13586 {
13587   int reg;
13588
13589   /* This is ignored when not generating SVR4 PIC code.  */
13590   if (mips_pic != SVR4_PIC)
13591     {
13592       s_ignore (0);
13593       return;
13594     }
13595
13596   /* Add $gp to the register named as an argument.  */
13597   macro_start ();
13598   reg = tc_get_register (0);
13599   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13600   macro_end ();
13601
13602   demand_empty_rest_of_line ();
13603 }
13604
13605 /* Handle the .insn pseudo-op.  This marks instruction labels in
13606    mips16 mode.  This permits the linker to handle them specially,
13607    such as generating jalx instructions when needed.  We also make
13608    them odd for the duration of the assembly, in order to generate the
13609    right sort of code.  We will make them even in the adjust_symtab
13610    routine, while leaving them marked.  This is convenient for the
13611    debugger and the disassembler.  The linker knows to make them odd
13612    again.  */
13613
13614 static void
13615 s_insn (int ignore ATTRIBUTE_UNUSED)
13616 {
13617   mips16_mark_labels ();
13618
13619   demand_empty_rest_of_line ();
13620 }
13621
13622 /* Handle a .stabn directive.  We need these in order to mark a label
13623    as being a mips16 text label correctly.  Sometimes the compiler
13624    will emit a label, followed by a .stabn, and then switch sections.
13625    If the label and .stabn are in mips16 mode, then the label is
13626    really a mips16 text label.  */
13627
13628 static void
13629 s_mips_stab (int type)
13630 {
13631   if (type == 'n')
13632     mips16_mark_labels ();
13633
13634   s_stab (type);
13635 }
13636
13637 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
13638
13639 static void
13640 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13641 {
13642   char *name;
13643   int c;
13644   symbolS *symbolP;
13645   expressionS exp;
13646
13647   name = input_line_pointer;
13648   c = get_symbol_end ();
13649   symbolP = symbol_find_or_make (name);
13650   S_SET_WEAK (symbolP);
13651   *input_line_pointer = c;
13652
13653   SKIP_WHITESPACE ();
13654
13655   if (! is_end_of_line[(unsigned char) *input_line_pointer])
13656     {
13657       if (S_IS_DEFINED (symbolP))
13658         {
13659           as_bad (_("ignoring attempt to redefine symbol %s"),
13660                   S_GET_NAME (symbolP));
13661           ignore_rest_of_line ();
13662           return;
13663         }
13664
13665       if (*input_line_pointer == ',')
13666         {
13667           ++input_line_pointer;
13668           SKIP_WHITESPACE ();
13669         }
13670
13671       expression (&exp);
13672       if (exp.X_op != O_symbol)
13673         {
13674           as_bad (_("bad .weakext directive"));
13675           ignore_rest_of_line ();
13676           return;
13677         }
13678       symbol_set_value_expression (symbolP, &exp);
13679     }
13680
13681   demand_empty_rest_of_line ();
13682 }
13683
13684 /* Parse a register string into a number.  Called from the ECOFF code
13685    to parse .frame.  The argument is non-zero if this is the frame
13686    register, so that we can record it in mips_frame_reg.  */
13687
13688 int
13689 tc_get_register (int frame)
13690 {
13691   unsigned int reg;
13692
13693   SKIP_WHITESPACE ();
13694   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13695     reg = 0;
13696   if (frame)
13697     {
13698       mips_frame_reg = reg != 0 ? reg : SP;
13699       mips_frame_reg_valid = 1;
13700       mips_cprestore_valid = 0;
13701     }
13702   return reg;
13703 }
13704
13705 valueT
13706 md_section_align (asection *seg, valueT addr)
13707 {
13708   int align = bfd_get_section_alignment (stdoutput, seg);
13709
13710   if (IS_ELF)
13711     {
13712       /* We don't need to align ELF sections to the full alignment.
13713          However, Irix 5 may prefer that we align them at least to a 16
13714          byte boundary.  We don't bother to align the sections if we
13715          are targeted for an embedded system.  */
13716       if (strncmp (TARGET_OS, "elf", 3) == 0)
13717         return addr;
13718       if (align > 4)
13719         align = 4;
13720     }
13721
13722   return ((addr + (1 << align) - 1) & (-1 << align));
13723 }
13724
13725 /* Utility routine, called from above as well.  If called while the
13726    input file is still being read, it's only an approximation.  (For
13727    example, a symbol may later become defined which appeared to be
13728    undefined earlier.)  */
13729
13730 static int
13731 nopic_need_relax (symbolS *sym, int before_relaxing)
13732 {
13733   if (sym == 0)
13734     return 0;
13735
13736   if (g_switch_value > 0)
13737     {
13738       const char *symname;
13739       int change;
13740
13741       /* Find out whether this symbol can be referenced off the $gp
13742          register.  It can be if it is smaller than the -G size or if
13743          it is in the .sdata or .sbss section.  Certain symbols can
13744          not be referenced off the $gp, although it appears as though
13745          they can.  */
13746       symname = S_GET_NAME (sym);
13747       if (symname != (const char *) NULL
13748           && (strcmp (symname, "eprol") == 0
13749               || strcmp (symname, "etext") == 0
13750               || strcmp (symname, "_gp") == 0
13751               || strcmp (symname, "edata") == 0
13752               || strcmp (symname, "_fbss") == 0
13753               || strcmp (symname, "_fdata") == 0
13754               || strcmp (symname, "_ftext") == 0
13755               || strcmp (symname, "end") == 0
13756               || strcmp (symname, "_gp_disp") == 0))
13757         change = 1;
13758       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13759                && (0
13760 #ifndef NO_ECOFF_DEBUGGING
13761                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
13762                        && (symbol_get_obj (sym)->ecoff_extern_size
13763                            <= g_switch_value))
13764 #endif
13765                    /* We must defer this decision until after the whole
13766                       file has been read, since there might be a .extern
13767                       after the first use of this symbol.  */
13768                    || (before_relaxing
13769 #ifndef NO_ECOFF_DEBUGGING
13770                        && symbol_get_obj (sym)->ecoff_extern_size == 0
13771 #endif
13772                        && S_GET_VALUE (sym) == 0)
13773                    || (S_GET_VALUE (sym) != 0
13774                        && S_GET_VALUE (sym) <= g_switch_value)))
13775         change = 0;
13776       else
13777         {
13778           const char *segname;
13779
13780           segname = segment_name (S_GET_SEGMENT (sym));
13781           gas_assert (strcmp (segname, ".lit8") != 0
13782                   && strcmp (segname, ".lit4") != 0);
13783           change = (strcmp (segname, ".sdata") != 0
13784                     && strcmp (segname, ".sbss") != 0
13785                     && strncmp (segname, ".sdata.", 7) != 0
13786                     && strncmp (segname, ".sbss.", 6) != 0
13787                     && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
13788                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13789         }
13790       return change;
13791     }
13792   else
13793     /* We are not optimizing for the $gp register.  */
13794     return 1;
13795 }
13796
13797
13798 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
13799
13800 static bfd_boolean
13801 pic_need_relax (symbolS *sym, asection *segtype)
13802 {
13803   asection *symsec;
13804
13805   /* Handle the case of a symbol equated to another symbol.  */
13806   while (symbol_equated_reloc_p (sym))
13807     {
13808       symbolS *n;
13809
13810       /* It's possible to get a loop here in a badly written program.  */
13811       n = symbol_get_value_expression (sym)->X_add_symbol;
13812       if (n == sym)
13813         break;
13814       sym = n;
13815     }
13816
13817   if (symbol_section_p (sym))
13818     return TRUE;
13819
13820   symsec = S_GET_SEGMENT (sym);
13821
13822   /* This must duplicate the test in adjust_reloc_syms.  */
13823   return (symsec != &bfd_und_section
13824           && symsec != &bfd_abs_section
13825           && !bfd_is_com_section (symsec)
13826           && !s_is_linkonce (sym, segtype)
13827 #ifdef OBJ_ELF
13828           /* A global or weak symbol is treated as external.  */
13829           && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13830 #endif
13831           );
13832 }
13833
13834
13835 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13836    extended opcode.  SEC is the section the frag is in.  */
13837
13838 static int
13839 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13840 {
13841   int type;
13842   const struct mips16_immed_operand *op;
13843   offsetT val;
13844   int mintiny, maxtiny;
13845   segT symsec;
13846   fragS *sym_frag;
13847
13848   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13849     return 0;
13850   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13851     return 1;
13852
13853   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13854   op = mips16_immed_operands;
13855   while (op->type != type)
13856     {
13857       ++op;
13858       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13859     }
13860
13861   if (op->unsp)
13862     {
13863       if (type == '<' || type == '>' || type == '[' || type == ']')
13864         {
13865           mintiny = 1;
13866           maxtiny = 1 << op->nbits;
13867         }
13868       else
13869         {
13870           mintiny = 0;
13871           maxtiny = (1 << op->nbits) - 1;
13872         }
13873     }
13874   else
13875     {
13876       mintiny = - (1 << (op->nbits - 1));
13877       maxtiny = (1 << (op->nbits - 1)) - 1;
13878     }
13879
13880   sym_frag = symbol_get_frag (fragp->fr_symbol);
13881   val = S_GET_VALUE (fragp->fr_symbol);
13882   symsec = S_GET_SEGMENT (fragp->fr_symbol);
13883
13884   if (op->pcrel)
13885     {
13886       addressT addr;
13887
13888       /* We won't have the section when we are called from
13889          mips_relax_frag.  However, we will always have been called
13890          from md_estimate_size_before_relax first.  If this is a
13891          branch to a different section, we mark it as such.  If SEC is
13892          NULL, and the frag is not marked, then it must be a branch to
13893          the same section.  */
13894       if (sec == NULL)
13895         {
13896           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13897             return 1;
13898         }
13899       else
13900         {
13901           /* Must have been called from md_estimate_size_before_relax.  */
13902           if (symsec != sec)
13903             {
13904               fragp->fr_subtype =
13905                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13906
13907               /* FIXME: We should support this, and let the linker
13908                  catch branches and loads that are out of range.  */
13909               as_bad_where (fragp->fr_file, fragp->fr_line,
13910                             _("unsupported PC relative reference to different section"));
13911
13912               return 1;
13913             }
13914           if (fragp != sym_frag && sym_frag->fr_address == 0)
13915             /* Assume non-extended on the first relaxation pass.
13916                The address we have calculated will be bogus if this is
13917                a forward branch to another frag, as the forward frag
13918                will have fr_address == 0.  */
13919             return 0;
13920         }
13921
13922       /* In this case, we know for sure that the symbol fragment is in
13923          the same section.  If the relax_marker of the symbol fragment
13924          differs from the relax_marker of this fragment, we have not
13925          yet adjusted the symbol fragment fr_address.  We want to add
13926          in STRETCH in order to get a better estimate of the address.
13927          This particularly matters because of the shift bits.  */
13928       if (stretch != 0
13929           && sym_frag->relax_marker != fragp->relax_marker)
13930         {
13931           fragS *f;
13932
13933           /* Adjust stretch for any alignment frag.  Note that if have
13934              been expanding the earlier code, the symbol may be
13935              defined in what appears to be an earlier frag.  FIXME:
13936              This doesn't handle the fr_subtype field, which specifies
13937              a maximum number of bytes to skip when doing an
13938              alignment.  */
13939           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
13940             {
13941               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13942                 {
13943                   if (stretch < 0)
13944                     stretch = - ((- stretch)
13945                                  & ~ ((1 << (int) f->fr_offset) - 1));
13946                   else
13947                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13948                   if (stretch == 0)
13949                     break;
13950                 }
13951             }
13952           if (f != NULL)
13953             val += stretch;
13954         }
13955
13956       addr = fragp->fr_address + fragp->fr_fix;
13957
13958       /* The base address rules are complicated.  The base address of
13959          a branch is the following instruction.  The base address of a
13960          PC relative load or add is the instruction itself, but if it
13961          is in a delay slot (in which case it can not be extended) use
13962          the address of the instruction whose delay slot it is in.  */
13963       if (type == 'p' || type == 'q')
13964         {
13965           addr += 2;
13966
13967           /* If we are currently assuming that this frag should be
13968              extended, then, the current address is two bytes
13969              higher.  */
13970           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13971             addr += 2;
13972
13973           /* Ignore the low bit in the target, since it will be set
13974              for a text label.  */
13975           if ((val & 1) != 0)
13976             --val;
13977         }
13978       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13979         addr -= 4;
13980       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13981         addr -= 2;
13982
13983       val -= addr & ~ ((1 << op->shift) - 1);
13984
13985       /* Branch offsets have an implicit 0 in the lowest bit.  */
13986       if (type == 'p' || type == 'q')
13987         val /= 2;
13988
13989       /* If any of the shifted bits are set, we must use an extended
13990          opcode.  If the address depends on the size of this
13991          instruction, this can lead to a loop, so we arrange to always
13992          use an extended opcode.  We only check this when we are in
13993          the main relaxation loop, when SEC is NULL.  */
13994       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13995         {
13996           fragp->fr_subtype =
13997             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13998           return 1;
13999         }
14000
14001       /* If we are about to mark a frag as extended because the value
14002          is precisely maxtiny + 1, then there is a chance of an
14003          infinite loop as in the following code:
14004              la $4,foo
14005              .skip      1020
14006              .align     2
14007            foo:
14008          In this case when the la is extended, foo is 0x3fc bytes
14009          away, so the la can be shrunk, but then foo is 0x400 away, so
14010          the la must be extended.  To avoid this loop, we mark the
14011          frag as extended if it was small, and is about to become
14012          extended with a value of maxtiny + 1.  */
14013       if (val == ((maxtiny + 1) << op->shift)
14014           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
14015           && sec == NULL)
14016         {
14017           fragp->fr_subtype =
14018             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14019           return 1;
14020         }
14021     }
14022   else if (symsec != absolute_section && sec != NULL)
14023     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
14024
14025   if ((val & ((1 << op->shift) - 1)) != 0
14026       || val < (mintiny << op->shift)
14027       || val > (maxtiny << op->shift))
14028     return 1;
14029   else
14030     return 0;
14031 }
14032
14033 /* Compute the length of a branch sequence, and adjust the
14034    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
14035    worst-case length is computed, with UPDATE being used to indicate
14036    whether an unconditional (-1), branch-likely (+1) or regular (0)
14037    branch is to be computed.  */
14038 static int
14039 relaxed_branch_length (fragS *fragp, asection *sec, int update)
14040 {
14041   bfd_boolean toofar;
14042   int length;
14043
14044   if (fragp
14045       && S_IS_DEFINED (fragp->fr_symbol)
14046       && sec == S_GET_SEGMENT (fragp->fr_symbol))
14047     {
14048       addressT addr;
14049       offsetT val;
14050
14051       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
14052
14053       addr = fragp->fr_address + fragp->fr_fix + 4;
14054
14055       val -= addr;
14056
14057       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
14058     }
14059   else if (fragp)
14060     /* If the symbol is not defined or it's in a different segment,
14061        assume the user knows what's going on and emit a short
14062        branch.  */
14063     toofar = FALSE;
14064   else
14065     toofar = TRUE;
14066
14067   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14068     fragp->fr_subtype
14069       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
14070                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
14071                              RELAX_BRANCH_LINK (fragp->fr_subtype),
14072                              toofar);
14073
14074   length = 4;
14075   if (toofar)
14076     {
14077       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
14078         length += 8;
14079
14080       if (mips_pic != NO_PIC)
14081         {
14082           /* Additional space for PIC loading of target address.  */
14083           length += 8;
14084           if (mips_opts.isa == ISA_MIPS1)
14085             /* Additional space for $at-stabilizing nop.  */
14086             length += 4;
14087         }
14088
14089       /* If branch is conditional.  */
14090       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
14091         length += 8;
14092     }
14093
14094   return length;
14095 }
14096
14097 /* Estimate the size of a frag before relaxing.  Unless this is the
14098    mips16, we are not really relaxing here, and the final size is
14099    encoded in the subtype information.  For the mips16, we have to
14100    decide whether we are using an extended opcode or not.  */
14101
14102 int
14103 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
14104 {
14105   int change;
14106
14107   if (RELAX_BRANCH_P (fragp->fr_subtype))
14108     {
14109
14110       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
14111
14112       return fragp->fr_var;
14113     }
14114
14115   if (RELAX_MIPS16_P (fragp->fr_subtype))
14116     /* We don't want to modify the EXTENDED bit here; it might get us
14117        into infinite loops.  We change it only in mips_relax_frag().  */
14118     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
14119
14120   if (mips_pic == NO_PIC)
14121     change = nopic_need_relax (fragp->fr_symbol, 0);
14122   else if (mips_pic == SVR4_PIC)
14123     change = pic_need_relax (fragp->fr_symbol, segtype);
14124   else if (mips_pic == VXWORKS_PIC)
14125     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
14126     change = 0;
14127   else
14128     abort ();
14129
14130   if (change)
14131     {
14132       fragp->fr_subtype |= RELAX_USE_SECOND;
14133       return -RELAX_FIRST (fragp->fr_subtype);
14134     }
14135   else
14136     return -RELAX_SECOND (fragp->fr_subtype);
14137 }
14138
14139 /* This is called to see whether a reloc against a defined symbol
14140    should be converted into a reloc against a section.  */
14141
14142 int
14143 mips_fix_adjustable (fixS *fixp)
14144 {
14145   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
14146       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14147     return 0;
14148
14149   if (fixp->fx_addsy == NULL)
14150     return 1;
14151
14152   /* If symbol SYM is in a mergeable section, relocations of the form
14153      SYM + 0 can usually be made section-relative.  The mergeable data
14154      is then identified by the section offset rather than by the symbol.
14155
14156      However, if we're generating REL LO16 relocations, the offset is split
14157      between the LO16 and parterning high part relocation.  The linker will
14158      need to recalculate the complete offset in order to correctly identify
14159      the merge data.
14160
14161      The linker has traditionally not looked for the parterning high part
14162      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
14163      placed anywhere.  Rather than break backwards compatibility by changing
14164      this, it seems better not to force the issue, and instead keep the
14165      original symbol.  This will work with either linker behavior.  */
14166   if ((lo16_reloc_p (fixp->fx_r_type)
14167        || reloc_needs_lo_p (fixp->fx_r_type))
14168       && HAVE_IN_PLACE_ADDENDS
14169       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
14170     return 0;
14171
14172   /* There is no place to store an in-place offset for JALR relocations.  */
14173   if (fixp->fx_r_type == BFD_RELOC_MIPS_JALR && HAVE_IN_PLACE_ADDENDS)
14174     return 0;
14175
14176 #ifdef OBJ_ELF
14177   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
14178      to a floating-point stub.  The same is true for non-R_MIPS16_26
14179      relocations against MIPS16 functions; in this case, the stub becomes
14180      the function's canonical address.
14181
14182      Floating-point stubs are stored in unique .mips16.call.* or
14183      .mips16.fn.* sections.  If a stub T for function F is in section S,
14184      the first relocation in section S must be against F; this is how the
14185      linker determines the target function.  All relocations that might
14186      resolve to T must also be against F.  We therefore have the following
14187      restrictions, which are given in an intentionally-redundant way:
14188
14189        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14190           symbols.
14191
14192        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14193           if that stub might be used.
14194
14195        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14196           symbols.
14197
14198        4. We cannot reduce a stub's relocations against MIPS16 symbols if
14199           that stub might be used.
14200
14201      There is a further restriction:
14202
14203        5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14204           on targets with in-place addends; the relocation field cannot
14205           encode the low bit.
14206
14207      For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14208      against a MIPS16 symbol.
14209
14210      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14211      relocation against some symbol R, no relocation against R may be
14212      reduced.  (Note that this deals with (2) as well as (1) because
14213      relocations against global symbols will never be reduced on ELF
14214      targets.)  This approach is a little simpler than trying to detect
14215      stub sections, and gives the "all or nothing" per-symbol consistency
14216      that we have for MIPS16 symbols.  */
14217   if (IS_ELF
14218       && fixp->fx_subsy == NULL
14219       && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
14220           || *symbol_get_tc (fixp->fx_addsy)))
14221     return 0;
14222 #endif
14223
14224   return 1;
14225 }
14226
14227 /* Translate internal representation of relocation info to BFD target
14228    format.  */
14229
14230 arelent **
14231 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
14232 {
14233   static arelent *retval[4];
14234   arelent *reloc;
14235   bfd_reloc_code_real_type code;
14236
14237   memset (retval, 0, sizeof(retval));
14238   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
14239   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14240   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
14241   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14242
14243   if (fixp->fx_pcrel)
14244     {
14245       gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
14246
14247       /* At this point, fx_addnumber is "symbol offset - pcrel address".
14248          Relocations want only the symbol offset.  */
14249       reloc->addend = fixp->fx_addnumber + reloc->address;
14250       if (!IS_ELF)
14251         {
14252           /* A gruesome hack which is a result of the gruesome gas
14253              reloc handling.  What's worse, for COFF (as opposed to
14254              ECOFF), we might need yet another copy of reloc->address.
14255              See bfd_install_relocation.  */
14256           reloc->addend += reloc->address;
14257         }
14258     }
14259   else
14260     reloc->addend = fixp->fx_addnumber;
14261
14262   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14263      entry to be used in the relocation's section offset.  */
14264   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14265     {
14266       reloc->address = reloc->addend;
14267       reloc->addend = 0;
14268     }
14269
14270   code = fixp->fx_r_type;
14271
14272   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
14273   if (reloc->howto == NULL)
14274     {
14275       as_bad_where (fixp->fx_file, fixp->fx_line,
14276                     _("Can not represent %s relocation in this object file format"),
14277                     bfd_get_reloc_code_name (code));
14278       retval[0] = NULL;
14279     }
14280
14281   return retval;
14282 }
14283
14284 /* Relax a machine dependent frag.  This returns the amount by which
14285    the current size of the frag should change.  */
14286
14287 int
14288 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
14289 {
14290   if (RELAX_BRANCH_P (fragp->fr_subtype))
14291     {
14292       offsetT old_var = fragp->fr_var;
14293
14294       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
14295
14296       return fragp->fr_var - old_var;
14297     }
14298
14299   if (! RELAX_MIPS16_P (fragp->fr_subtype))
14300     return 0;
14301
14302   if (mips16_extended_frag (fragp, NULL, stretch))
14303     {
14304       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14305         return 0;
14306       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14307       return 2;
14308     }
14309   else
14310     {
14311       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14312         return 0;
14313       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14314       return -2;
14315     }
14316
14317   return 0;
14318 }
14319
14320 /* Convert a machine dependent frag.  */
14321
14322 void
14323 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
14324 {
14325   if (RELAX_BRANCH_P (fragp->fr_subtype))
14326     {
14327       bfd_byte *buf;
14328       unsigned long insn;
14329       expressionS exp;
14330       fixS *fixp;
14331
14332       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14333
14334       if (target_big_endian)
14335         insn = bfd_getb32 (buf);
14336       else
14337         insn = bfd_getl32 (buf);
14338
14339       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14340         {
14341           /* We generate a fixup instead of applying it right now
14342              because, if there are linker relaxations, we're going to
14343              need the relocations.  */
14344           exp.X_op = O_symbol;
14345           exp.X_add_symbol = fragp->fr_symbol;
14346           exp.X_add_number = fragp->fr_offset;
14347
14348           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14349                               4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
14350           fixp->fx_file = fragp->fr_file;
14351           fixp->fx_line = fragp->fr_line;
14352
14353           md_number_to_chars ((char *) buf, insn, 4);
14354           buf += 4;
14355         }
14356       else
14357         {
14358           int i;
14359
14360           as_warn_where (fragp->fr_file, fragp->fr_line,
14361                          _("relaxed out-of-range branch into a jump"));
14362
14363           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14364             goto uncond;
14365
14366           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14367             {
14368               /* Reverse the branch.  */
14369               switch ((insn >> 28) & 0xf)
14370                 {
14371                 case 4:
14372                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14373                      have the condition reversed by tweaking a single
14374                      bit, and their opcodes all have 0x4???????.  */
14375                   gas_assert ((insn & 0xf1000000) == 0x41000000);
14376                   insn ^= 0x00010000;
14377                   break;
14378
14379                 case 0:
14380                   /* bltz       0x04000000      bgez    0x04010000
14381                      bltzal     0x04100000      bgezal  0x04110000  */
14382                   gas_assert ((insn & 0xfc0e0000) == 0x04000000);
14383                   insn ^= 0x00010000;
14384                   break;
14385
14386                 case 1:
14387                   /* beq        0x10000000      bne     0x14000000
14388                      blez       0x18000000      bgtz    0x1c000000  */
14389                   insn ^= 0x04000000;
14390                   break;
14391
14392                 default:
14393                   abort ();
14394                 }
14395             }
14396
14397           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14398             {
14399               /* Clear the and-link bit.  */
14400               gas_assert ((insn & 0xfc1c0000) == 0x04100000);
14401
14402               /* bltzal         0x04100000      bgezal  0x04110000
14403                  bltzall        0x04120000      bgezall 0x04130000  */
14404               insn &= ~0x00100000;
14405             }
14406
14407           /* Branch over the branch (if the branch was likely) or the
14408              full jump (not likely case).  Compute the offset from the
14409              current instruction to branch to.  */
14410           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14411             i = 16;
14412           else
14413             {
14414               /* How many bytes in instructions we've already emitted?  */
14415               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14416               /* How many bytes in instructions from here to the end?  */
14417               i = fragp->fr_var - i;
14418             }
14419           /* Convert to instruction count.  */
14420           i >>= 2;
14421           /* Branch counts from the next instruction.  */
14422           i--;
14423           insn |= i;
14424           /* Branch over the jump.  */
14425           md_number_to_chars ((char *) buf, insn, 4);
14426           buf += 4;
14427
14428           /* nop */
14429           md_number_to_chars ((char *) buf, 0, 4);
14430           buf += 4;
14431
14432           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14433             {
14434               /* beql $0, $0, 2f */
14435               insn = 0x50000000;
14436               /* Compute the PC offset from the current instruction to
14437                  the end of the variable frag.  */
14438               /* How many bytes in instructions we've already emitted?  */
14439               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14440               /* How many bytes in instructions from here to the end?  */
14441               i = fragp->fr_var - i;
14442               /* Convert to instruction count.  */
14443               i >>= 2;
14444               /* Don't decrement i, because we want to branch over the
14445                  delay slot.  */
14446
14447               insn |= i;
14448               md_number_to_chars ((char *) buf, insn, 4);
14449               buf += 4;
14450
14451               md_number_to_chars ((char *) buf, 0, 4);
14452               buf += 4;
14453             }
14454
14455         uncond:
14456           if (mips_pic == NO_PIC)
14457             {
14458               /* j or jal.  */
14459               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14460                       ? 0x0c000000 : 0x08000000);
14461               exp.X_op = O_symbol;
14462               exp.X_add_symbol = fragp->fr_symbol;
14463               exp.X_add_number = fragp->fr_offset;
14464
14465               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14466                                   4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
14467               fixp->fx_file = fragp->fr_file;
14468               fixp->fx_line = fragp->fr_line;
14469
14470               md_number_to_chars ((char *) buf, insn, 4);
14471               buf += 4;
14472             }
14473           else
14474             {
14475               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
14476               insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
14477               exp.X_op = O_symbol;
14478               exp.X_add_symbol = fragp->fr_symbol;
14479               exp.X_add_number = fragp->fr_offset;
14480
14481               if (fragp->fr_offset)
14482                 {
14483                   exp.X_add_symbol = make_expr_symbol (&exp);
14484                   exp.X_add_number = 0;
14485                 }
14486
14487               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14488                                   4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
14489               fixp->fx_file = fragp->fr_file;
14490               fixp->fx_line = fragp->fr_line;
14491
14492               md_number_to_chars ((char *) buf, insn, 4);
14493               buf += 4;
14494
14495               if (mips_opts.isa == ISA_MIPS1)
14496                 {
14497                   /* nop */
14498                   md_number_to_chars ((char *) buf, 0, 4);
14499                   buf += 4;
14500                 }
14501
14502               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
14503               insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14504
14505               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14506                                   4, &exp, FALSE, BFD_RELOC_LO16);
14507               fixp->fx_file = fragp->fr_file;
14508               fixp->fx_line = fragp->fr_line;
14509
14510               md_number_to_chars ((char *) buf, insn, 4);
14511               buf += 4;
14512
14513               /* j(al)r $at.  */
14514               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14515                 insn = 0x0020f809;
14516               else
14517                 insn = 0x00200008;
14518
14519               md_number_to_chars ((char *) buf, insn, 4);
14520               buf += 4;
14521             }
14522         }
14523
14524       gas_assert (buf == (bfd_byte *)fragp->fr_literal
14525               + fragp->fr_fix + fragp->fr_var);
14526
14527       fragp->fr_fix += fragp->fr_var;
14528
14529       return;
14530     }
14531
14532   if (RELAX_MIPS16_P (fragp->fr_subtype))
14533     {
14534       int type;
14535       const struct mips16_immed_operand *op;
14536       bfd_boolean small, ext;
14537       offsetT val;
14538       bfd_byte *buf;
14539       unsigned long insn;
14540       bfd_boolean use_extend;
14541       unsigned short extend;
14542
14543       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14544       op = mips16_immed_operands;
14545       while (op->type != type)
14546         ++op;
14547
14548       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14549         {
14550           small = FALSE;
14551           ext = TRUE;
14552         }
14553       else
14554         {
14555           small = TRUE;
14556           ext = FALSE;
14557         }
14558
14559       val = resolve_symbol_value (fragp->fr_symbol);
14560       if (op->pcrel)
14561         {
14562           addressT addr;
14563
14564           addr = fragp->fr_address + fragp->fr_fix;
14565
14566           /* The rules for the base address of a PC relative reloc are
14567              complicated; see mips16_extended_frag.  */
14568           if (type == 'p' || type == 'q')
14569             {
14570               addr += 2;
14571               if (ext)
14572                 addr += 2;
14573               /* Ignore the low bit in the target, since it will be
14574                  set for a text label.  */
14575               if ((val & 1) != 0)
14576                 --val;
14577             }
14578           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14579             addr -= 4;
14580           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14581             addr -= 2;
14582
14583           addr &= ~ (addressT) ((1 << op->shift) - 1);
14584           val -= addr;
14585
14586           /* Make sure the section winds up with the alignment we have
14587              assumed.  */
14588           if (op->shift > 0)
14589             record_alignment (asec, op->shift);
14590         }
14591
14592       if (ext
14593           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14594               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14595         as_warn_where (fragp->fr_file, fragp->fr_line,
14596                        _("extended instruction in delay slot"));
14597
14598       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14599
14600       if (target_big_endian)
14601         insn = bfd_getb16 (buf);
14602       else
14603         insn = bfd_getl16 (buf);
14604
14605       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14606                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14607                     small, ext, &insn, &use_extend, &extend);
14608
14609       if (use_extend)
14610         {
14611           md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14612           fragp->fr_fix += 2;
14613           buf += 2;
14614         }
14615
14616       md_number_to_chars ((char *) buf, insn, 2);
14617       fragp->fr_fix += 2;
14618       buf += 2;
14619     }
14620   else
14621     {
14622       int first, second;
14623       fixS *fixp;
14624
14625       first = RELAX_FIRST (fragp->fr_subtype);
14626       second = RELAX_SECOND (fragp->fr_subtype);
14627       fixp = (fixS *) fragp->fr_opcode;
14628
14629       /* Possibly emit a warning if we've chosen the longer option.  */
14630       if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14631           == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14632         {
14633           const char *msg = macro_warning (fragp->fr_subtype);
14634           if (msg != 0)
14635             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
14636         }
14637
14638       /* Go through all the fixups for the first sequence.  Disable them
14639          (by marking them as done) if we're going to use the second
14640          sequence instead.  */
14641       while (fixp
14642              && fixp->fx_frag == fragp
14643              && fixp->fx_where < fragp->fr_fix - second)
14644         {
14645           if (fragp->fr_subtype & RELAX_USE_SECOND)
14646             fixp->fx_done = 1;
14647           fixp = fixp->fx_next;
14648         }
14649
14650       /* Go through the fixups for the second sequence.  Disable them if
14651          we're going to use the first sequence, otherwise adjust their
14652          addresses to account for the relaxation.  */
14653       while (fixp && fixp->fx_frag == fragp)
14654         {
14655           if (fragp->fr_subtype & RELAX_USE_SECOND)
14656             fixp->fx_where -= first;
14657           else
14658             fixp->fx_done = 1;
14659           fixp = fixp->fx_next;
14660         }
14661
14662       /* Now modify the frag contents.  */
14663       if (fragp->fr_subtype & RELAX_USE_SECOND)
14664         {
14665           char *start;
14666
14667           start = fragp->fr_literal + fragp->fr_fix - first - second;
14668           memmove (start, start + first, second);
14669           fragp->fr_fix -= first;
14670         }
14671       else
14672         fragp->fr_fix -= second;
14673     }
14674 }
14675
14676 #ifdef OBJ_ELF
14677
14678 /* This function is called after the relocs have been generated.
14679    We've been storing mips16 text labels as odd.  Here we convert them
14680    back to even for the convenience of the debugger.  */
14681
14682 void
14683 mips_frob_file_after_relocs (void)
14684 {
14685   asymbol **syms;
14686   unsigned int count, i;
14687
14688   if (!IS_ELF)
14689     return;
14690
14691   syms = bfd_get_outsymbols (stdoutput);
14692   count = bfd_get_symcount (stdoutput);
14693   for (i = 0; i < count; i++, syms++)
14694     {
14695       if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
14696           && ((*syms)->value & 1) != 0)
14697         {
14698           (*syms)->value &= ~1;
14699           /* If the symbol has an odd size, it was probably computed
14700              incorrectly, so adjust that as well.  */
14701           if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14702             ++elf_symbol (*syms)->internal_elf_sym.st_size;
14703         }
14704     }
14705 }
14706
14707 #endif
14708
14709 /* This function is called whenever a label is defined.  It is used
14710    when handling branch delays; if a branch has a label, we assume we
14711    can not move it.  */
14712
14713 void
14714 mips_define_label (symbolS *sym)
14715 {
14716   segment_info_type *si = seg_info (now_seg);
14717   struct insn_label_list *l;
14718
14719   if (free_insn_labels == NULL)
14720     l = (struct insn_label_list *) xmalloc (sizeof *l);
14721   else
14722     {
14723       l = free_insn_labels;
14724       free_insn_labels = l->next;
14725     }
14726
14727   l->label = sym;
14728   l->next = si->label_list;
14729   si->label_list = l;
14730
14731 #ifdef OBJ_ELF
14732   dwarf2_emit_label (sym);
14733 #endif
14734 }
14735 \f
14736 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14737
14738 /* Some special processing for a MIPS ELF file.  */
14739
14740 void
14741 mips_elf_final_processing (void)
14742 {
14743   /* Write out the register information.  */
14744   if (mips_abi != N64_ABI)
14745     {
14746       Elf32_RegInfo s;
14747
14748       s.ri_gprmask = mips_gprmask;
14749       s.ri_cprmask[0] = mips_cprmask[0];
14750       s.ri_cprmask[1] = mips_cprmask[1];
14751       s.ri_cprmask[2] = mips_cprmask[2];
14752       s.ri_cprmask[3] = mips_cprmask[3];
14753       /* The gp_value field is set by the MIPS ELF backend.  */
14754
14755       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14756                                        ((Elf32_External_RegInfo *)
14757                                         mips_regmask_frag));
14758     }
14759   else
14760     {
14761       Elf64_Internal_RegInfo s;
14762
14763       s.ri_gprmask = mips_gprmask;
14764       s.ri_pad = 0;
14765       s.ri_cprmask[0] = mips_cprmask[0];
14766       s.ri_cprmask[1] = mips_cprmask[1];
14767       s.ri_cprmask[2] = mips_cprmask[2];
14768       s.ri_cprmask[3] = mips_cprmask[3];
14769       /* The gp_value field is set by the MIPS ELF backend.  */
14770
14771       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14772                                        ((Elf64_External_RegInfo *)
14773                                         mips_regmask_frag));
14774     }
14775
14776   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
14777      sort of BFD interface for this.  */
14778   if (mips_any_noreorder)
14779     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14780   if (mips_pic != NO_PIC)
14781     {
14782     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
14783       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14784     }
14785   if (mips_abicalls)
14786     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14787
14788   /* Set MIPS ELF flags for ASEs.  */
14789   /* We may need to define a new flag for DSP ASE, and set this flag when
14790      file_ase_dsp is true.  */
14791   /* Same for DSP R2.  */
14792   /* We may need to define a new flag for MT ASE, and set this flag when
14793      file_ase_mt is true.  */
14794   if (file_ase_mips16)
14795     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
14796 #if 0 /* XXX FIXME */
14797   if (file_ase_mips3d)
14798     elf_elfheader (stdoutput)->e_flags |= ???;
14799 #endif
14800   if (file_ase_mdmx)
14801     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
14802
14803   /* Set the MIPS ELF ABI flags.  */
14804   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
14805     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
14806   else if (mips_abi == O64_ABI)
14807     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14808   else if (mips_abi == EABI_ABI)
14809     {
14810       if (!file_mips_gp32)
14811         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14812       else
14813         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14814     }
14815   else if (mips_abi == N32_ABI)
14816     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14817
14818   /* Nothing to do for N64_ABI.  */
14819
14820   if (mips_32bitmode)
14821     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14822
14823 #if 0 /* XXX FIXME */
14824   /* 32 bit code with 64 bit FP registers.  */
14825   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
14826     elf_elfheader (stdoutput)->e_flags |= ???;
14827 #endif
14828 }
14829
14830 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14831 \f
14832 typedef struct proc {
14833   symbolS *func_sym;
14834   symbolS *func_end_sym;
14835   unsigned long reg_mask;
14836   unsigned long reg_offset;
14837   unsigned long fpreg_mask;
14838   unsigned long fpreg_offset;
14839   unsigned long frame_offset;
14840   unsigned long frame_reg;
14841   unsigned long pc_reg;
14842 } procS;
14843
14844 static procS cur_proc;
14845 static procS *cur_proc_ptr;
14846 static int numprocs;
14847
14848 /* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1" and a normal
14849    nop as "0".  */
14850
14851 char
14852 mips_nop_opcode (void)
14853 {
14854   return seg_info (now_seg)->tc_segment_info_data.mips16;
14855 }
14856
14857 /* Fill in an rs_align_code fragment.  This only needs to do something
14858    for MIPS16 code, where 0 is not a nop.  */
14859
14860 void
14861 mips_handle_align (fragS *fragp)
14862 {
14863   char *p;
14864   int bytes, size, excess;
14865   valueT opcode;
14866
14867   if (fragp->fr_type != rs_align_code)
14868     return;
14869
14870   p = fragp->fr_literal + fragp->fr_fix;
14871   if (*p)
14872     {
14873       opcode = mips16_nop_insn.insn_opcode;
14874       size = 2;
14875     }
14876   else
14877     {
14878       opcode = nop_insn.insn_opcode;
14879       size = 4;
14880     }
14881
14882   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14883   excess = bytes % size;
14884   if (excess != 0)
14885     {
14886       /* If we're not inserting a whole number of instructions,
14887          pad the end of the fixed part of the frag with zeros.  */
14888       memset (p, 0, excess);
14889       p += excess;
14890       fragp->fr_fix += excess;
14891     }
14892
14893   md_number_to_chars (p, opcode, size);
14894   fragp->fr_var = size;
14895 }
14896
14897 static void
14898 md_obj_begin (void)
14899 {
14900 }
14901
14902 static void
14903 md_obj_end (void)
14904 {
14905   /* Check for premature end, nesting errors, etc.  */
14906   if (cur_proc_ptr)
14907     as_warn (_("missing .end at end of assembly"));
14908 }
14909
14910 static long
14911 get_number (void)
14912 {
14913   int negative = 0;
14914   long val = 0;
14915
14916   if (*input_line_pointer == '-')
14917     {
14918       ++input_line_pointer;
14919       negative = 1;
14920     }
14921   if (!ISDIGIT (*input_line_pointer))
14922     as_bad (_("expected simple number"));
14923   if (input_line_pointer[0] == '0')
14924     {
14925       if (input_line_pointer[1] == 'x')
14926         {
14927           input_line_pointer += 2;
14928           while (ISXDIGIT (*input_line_pointer))
14929             {
14930               val <<= 4;
14931               val |= hex_value (*input_line_pointer++);
14932             }
14933           return negative ? -val : val;
14934         }
14935       else
14936         {
14937           ++input_line_pointer;
14938           while (ISDIGIT (*input_line_pointer))
14939             {
14940               val <<= 3;
14941               val |= *input_line_pointer++ - '0';
14942             }
14943           return negative ? -val : val;
14944         }
14945     }
14946   if (!ISDIGIT (*input_line_pointer))
14947     {
14948       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14949               *input_line_pointer, *input_line_pointer);
14950       as_warn (_("invalid number"));
14951       return -1;
14952     }
14953   while (ISDIGIT (*input_line_pointer))
14954     {
14955       val *= 10;
14956       val += *input_line_pointer++ - '0';
14957     }
14958   return negative ? -val : val;
14959 }
14960
14961 /* The .file directive; just like the usual .file directive, but there
14962    is an initial number which is the ECOFF file index.  In the non-ECOFF
14963    case .file implies DWARF-2.  */
14964
14965 static void
14966 s_mips_file (int x ATTRIBUTE_UNUSED)
14967 {
14968   static int first_file_directive = 0;
14969
14970   if (ECOFF_DEBUGGING)
14971     {
14972       get_number ();
14973       s_app_file (0);
14974     }
14975   else
14976     {
14977       char *filename;
14978
14979       filename = dwarf2_directive_file (0);
14980
14981       /* Versions of GCC up to 3.1 start files with a ".file"
14982          directive even for stabs output.  Make sure that this
14983          ".file" is handled.  Note that you need a version of GCC
14984          after 3.1 in order to support DWARF-2 on MIPS.  */
14985       if (filename != NULL && ! first_file_directive)
14986         {
14987           (void) new_logical_line (filename, -1);
14988           s_app_file_string (filename, 0);
14989         }
14990       first_file_directive = 1;
14991     }
14992 }
14993
14994 /* The .loc directive, implying DWARF-2.  */
14995
14996 static void
14997 s_mips_loc (int x ATTRIBUTE_UNUSED)
14998 {
14999   if (!ECOFF_DEBUGGING)
15000     dwarf2_directive_loc (0);
15001 }
15002
15003 /* The .end directive.  */
15004
15005 static void
15006 s_mips_end (int x ATTRIBUTE_UNUSED)
15007 {
15008   symbolS *p;
15009
15010   /* Following functions need their own .frame and .cprestore directives.  */
15011   mips_frame_reg_valid = 0;
15012   mips_cprestore_valid = 0;
15013
15014   if (!is_end_of_line[(unsigned char) *input_line_pointer])
15015     {
15016       p = get_symbol ();
15017       demand_empty_rest_of_line ();
15018     }
15019   else
15020     p = NULL;
15021
15022   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15023     as_warn (_(".end not in text section"));
15024
15025   if (!cur_proc_ptr)
15026     {
15027       as_warn (_(".end directive without a preceding .ent directive."));
15028       demand_empty_rest_of_line ();
15029       return;
15030     }
15031
15032   if (p != NULL)
15033     {
15034       gas_assert (S_GET_NAME (p));
15035       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
15036         as_warn (_(".end symbol does not match .ent symbol."));
15037
15038       if (debug_type == DEBUG_STABS)
15039         stabs_generate_asm_endfunc (S_GET_NAME (p),
15040                                     S_GET_NAME (p));
15041     }
15042   else
15043     as_warn (_(".end directive missing or unknown symbol"));
15044
15045 #ifdef OBJ_ELF
15046   /* Create an expression to calculate the size of the function.  */
15047   if (p && cur_proc_ptr)
15048     {
15049       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
15050       expressionS *exp = xmalloc (sizeof (expressionS));
15051
15052       obj->size = exp;
15053       exp->X_op = O_subtract;
15054       exp->X_add_symbol = symbol_temp_new_now ();
15055       exp->X_op_symbol = p;
15056       exp->X_add_number = 0;
15057
15058       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
15059     }
15060
15061   /* Generate a .pdr section.  */
15062   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
15063     {
15064       segT saved_seg = now_seg;
15065       subsegT saved_subseg = now_subseg;
15066       expressionS exp;
15067       char *fragp;
15068
15069 #ifdef md_flush_pending_output
15070       md_flush_pending_output ();
15071 #endif
15072
15073       gas_assert (pdr_seg);
15074       subseg_set (pdr_seg, 0);
15075
15076       /* Write the symbol.  */
15077       exp.X_op = O_symbol;
15078       exp.X_add_symbol = p;
15079       exp.X_add_number = 0;
15080       emit_expr (&exp, 4);
15081
15082       fragp = frag_more (7 * 4);
15083
15084       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
15085       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
15086       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
15087       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
15088       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
15089       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
15090       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
15091
15092       subseg_set (saved_seg, saved_subseg);
15093     }
15094 #endif /* OBJ_ELF */
15095
15096   cur_proc_ptr = NULL;
15097 }
15098
15099 /* The .aent and .ent directives.  */
15100
15101 static void
15102 s_mips_ent (int aent)
15103 {
15104   symbolS *symbolP;
15105
15106   symbolP = get_symbol ();
15107   if (*input_line_pointer == ',')
15108     ++input_line_pointer;
15109   SKIP_WHITESPACE ();
15110   if (ISDIGIT (*input_line_pointer)
15111       || *input_line_pointer == '-')
15112     get_number ();
15113
15114   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15115     as_warn (_(".ent or .aent not in text section."));
15116
15117   if (!aent && cur_proc_ptr)
15118     as_warn (_("missing .end"));
15119
15120   if (!aent)
15121     {
15122       /* This function needs its own .frame and .cprestore directives.  */
15123       mips_frame_reg_valid = 0;
15124       mips_cprestore_valid = 0;
15125
15126       cur_proc_ptr = &cur_proc;
15127       memset (cur_proc_ptr, '\0', sizeof (procS));
15128
15129       cur_proc_ptr->func_sym = symbolP;
15130
15131       ++numprocs;
15132
15133       if (debug_type == DEBUG_STABS)
15134         stabs_generate_asm_func (S_GET_NAME (symbolP),
15135                                  S_GET_NAME (symbolP));
15136     }
15137
15138   symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
15139
15140   demand_empty_rest_of_line ();
15141 }
15142
15143 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
15144    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
15145    s_mips_frame is used so that we can set the PDR information correctly.
15146    We can't use the ecoff routines because they make reference to the ecoff
15147    symbol table (in the mdebug section).  */
15148
15149 static void
15150 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
15151 {
15152 #ifdef OBJ_ELF
15153   if (IS_ELF && !ECOFF_DEBUGGING)
15154     {
15155       long val;
15156
15157       if (cur_proc_ptr == (procS *) NULL)
15158         {
15159           as_warn (_(".frame outside of .ent"));
15160           demand_empty_rest_of_line ();
15161           return;
15162         }
15163
15164       cur_proc_ptr->frame_reg = tc_get_register (1);
15165
15166       SKIP_WHITESPACE ();
15167       if (*input_line_pointer++ != ','
15168           || get_absolute_expression_and_terminator (&val) != ',')
15169         {
15170           as_warn (_("Bad .frame directive"));
15171           --input_line_pointer;
15172           demand_empty_rest_of_line ();
15173           return;
15174         }
15175
15176       cur_proc_ptr->frame_offset = val;
15177       cur_proc_ptr->pc_reg = tc_get_register (0);
15178
15179       demand_empty_rest_of_line ();
15180     }
15181   else
15182 #endif /* OBJ_ELF */
15183     s_ignore (ignore);
15184 }
15185
15186 /* The .fmask and .mask directives. If the mdebug section is present
15187    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
15188    embedded targets, s_mips_mask is used so that we can set the PDR
15189    information correctly. We can't use the ecoff routines because they
15190    make reference to the ecoff symbol table (in the mdebug section).  */
15191
15192 static void
15193 s_mips_mask (int reg_type)
15194 {
15195 #ifdef OBJ_ELF
15196   if (IS_ELF && !ECOFF_DEBUGGING)
15197     {
15198       long mask, off;
15199
15200       if (cur_proc_ptr == (procS *) NULL)
15201         {
15202           as_warn (_(".mask/.fmask outside of .ent"));
15203           demand_empty_rest_of_line ();
15204           return;
15205         }
15206
15207       if (get_absolute_expression_and_terminator (&mask) != ',')
15208         {
15209           as_warn (_("Bad .mask/.fmask directive"));
15210           --input_line_pointer;
15211           demand_empty_rest_of_line ();
15212           return;
15213         }
15214
15215       off = get_absolute_expression ();
15216
15217       if (reg_type == 'F')
15218         {
15219           cur_proc_ptr->fpreg_mask = mask;
15220           cur_proc_ptr->fpreg_offset = off;
15221         }
15222       else
15223         {
15224           cur_proc_ptr->reg_mask = mask;
15225           cur_proc_ptr->reg_offset = off;
15226         }
15227
15228       demand_empty_rest_of_line ();
15229     }
15230   else
15231 #endif /* OBJ_ELF */
15232     s_ignore (reg_type);
15233 }
15234
15235 /* A table describing all the processors gas knows about.  Names are
15236    matched in the order listed.
15237
15238    To ease comparison, please keep this table in the same order as
15239    gcc's mips_cpu_info_table[].  */
15240 static const struct mips_cpu_info mips_cpu_info_table[] =
15241 {
15242   /* Entries for generic ISAs */
15243   { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
15244   { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
15245   { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
15246   { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
15247   { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
15248   { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
15249   { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
15250   { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
15251   { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
15252
15253   /* MIPS I */
15254   { "r3000",          0,                        ISA_MIPS1,      CPU_R3000 },
15255   { "r2000",          0,                        ISA_MIPS1,      CPU_R3000 },
15256   { "r3900",          0,                        ISA_MIPS1,      CPU_R3900 },
15257
15258   /* MIPS II */
15259   { "r6000",          0,                        ISA_MIPS2,      CPU_R6000 },
15260
15261   /* MIPS III */
15262   { "r4000",          0,                        ISA_MIPS3,      CPU_R4000 },
15263   { "r4010",          0,                        ISA_MIPS2,      CPU_R4010 },
15264   { "vr4100",         0,                        ISA_MIPS3,      CPU_VR4100 },
15265   { "vr4111",         0,                        ISA_MIPS3,      CPU_R4111 },
15266   { "vr4120",         0,                        ISA_MIPS3,      CPU_VR4120 },
15267   { "vr4130",         0,                        ISA_MIPS3,      CPU_VR4120 },
15268   { "vr4181",         0,                        ISA_MIPS3,      CPU_R4111 },
15269   { "vr4300",         0,                        ISA_MIPS3,      CPU_R4300 },
15270   { "r4400",          0,                        ISA_MIPS3,      CPU_R4400 },
15271   { "r4600",          0,                        ISA_MIPS3,      CPU_R4600 },
15272   { "orion",          0,                        ISA_MIPS3,      CPU_R4600 },
15273   { "r4650",          0,                        ISA_MIPS3,      CPU_R4650 },
15274   /* ST Microelectronics Loongson 2E and 2F cores */
15275   { "loongson2e",     0,                        ISA_MIPS3,   CPU_LOONGSON_2E },
15276   { "loongson2f",     0,                        ISA_MIPS3,   CPU_LOONGSON_2F },
15277
15278   /* MIPS IV */
15279   { "r8000",          0,                        ISA_MIPS4,      CPU_R8000 },
15280   { "r10000",         0,                        ISA_MIPS4,      CPU_R10000 },
15281   { "r12000",         0,                        ISA_MIPS4,      CPU_R12000 },
15282   { "r14000",         0,                        ISA_MIPS4,      CPU_R14000 },
15283   { "r16000",         0,                        ISA_MIPS4,      CPU_R16000 },
15284   { "vr5000",         0,                        ISA_MIPS4,      CPU_R5000 },
15285   { "vr5400",         0,                        ISA_MIPS4,      CPU_VR5400 },
15286   { "vr5500",         0,                        ISA_MIPS4,      CPU_VR5500 },
15287   { "rm5200",         0,                        ISA_MIPS4,      CPU_R5000 },
15288   { "rm5230",         0,                        ISA_MIPS4,      CPU_R5000 },
15289   { "rm5231",         0,                        ISA_MIPS4,      CPU_R5000 },
15290   { "rm5261",         0,                        ISA_MIPS4,      CPU_R5000 },
15291   { "rm5721",         0,                        ISA_MIPS4,      CPU_R5000 },
15292   { "rm7000",         0,                        ISA_MIPS4,      CPU_RM7000 },
15293   { "rm9000",         0,                        ISA_MIPS4,      CPU_RM9000 },
15294
15295   /* MIPS 32 */
15296   { "4kc",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15297   { "4km",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15298   { "4kp",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15299   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
15300
15301   /* MIPS 32 Release 2 */
15302   { "4kec",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15303   { "4kem",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15304   { "4kep",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15305   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
15306   { "m4k",            0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15307   { "m4kp",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15308   { "24kc",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15309   { "24kf2_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15310   { "24kf",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15311   { "24kf1_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15312   /* Deprecated forms of the above.  */
15313   { "24kfx",          0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15314   { "24kx",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15315   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
15316   { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15317   { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15318   { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15319   { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15320   /* Deprecated forms of the above.  */
15321   { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15322   { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15323   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
15324   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15325                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15326   { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15327                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15328   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15329                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15330   { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15331                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15332   /* Deprecated forms of the above.  */
15333   { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15334                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15335   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15336                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15337   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
15338   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15339                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15340   { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15341                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15342   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15343                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15344   { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15345                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15346   { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15347                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15348   /* Deprecated forms of the above.  */
15349   { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15350                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15351   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15352                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15353   /* 1004K cores are multiprocessor versions of the 34K.  */
15354   { "1004kc",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15355                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15356   { "1004kf2_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15357                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15358   { "1004kf",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15359                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15360   { "1004kf1_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15361                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15362
15363   /* MIPS 64 */
15364   { "5kc",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15365   { "5kf",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15366   { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15367   { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15368
15369   /* Broadcom SB-1 CPU core */
15370   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15371                                                 ISA_MIPS64,     CPU_SB1 },
15372   /* Broadcom SB-1A CPU core */
15373   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15374                                                 ISA_MIPS64,     CPU_SB1 },
15375   
15376   { "loongson3a",     0,                        ISA_MIPS64,     CPU_LOONGSON_3A },
15377
15378   /* MIPS 64 Release 2 */
15379
15380   /* Cavium Networks Octeon CPU core */
15381   { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
15382
15383   /* RMI Xlr */
15384   { "xlr",            0,      ISA_MIPS64,     CPU_XLR },
15385
15386   /* End marker */
15387   { NULL, 0, 0, 0 }
15388 };
15389
15390
15391 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15392    with a final "000" replaced by "k".  Ignore case.
15393
15394    Note: this function is shared between GCC and GAS.  */
15395
15396 static bfd_boolean
15397 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15398 {
15399   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15400     given++, canonical++;
15401
15402   return ((*given == 0 && *canonical == 0)
15403           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15404 }
15405
15406
15407 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15408    CPU name.  We've traditionally allowed a lot of variation here.
15409
15410    Note: this function is shared between GCC and GAS.  */
15411
15412 static bfd_boolean
15413 mips_matching_cpu_name_p (const char *canonical, const char *given)
15414 {
15415   /* First see if the name matches exactly, or with a final "000"
15416      turned into "k".  */
15417   if (mips_strict_matching_cpu_name_p (canonical, given))
15418     return TRUE;
15419
15420   /* If not, try comparing based on numerical designation alone.
15421      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
15422   if (TOLOWER (*given) == 'r')
15423     given++;
15424   if (!ISDIGIT (*given))
15425     return FALSE;
15426
15427   /* Skip over some well-known prefixes in the canonical name,
15428      hoping to find a number there too.  */
15429   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15430     canonical += 2;
15431   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15432     canonical += 2;
15433   else if (TOLOWER (canonical[0]) == 'r')
15434     canonical += 1;
15435
15436   return mips_strict_matching_cpu_name_p (canonical, given);
15437 }
15438
15439
15440 /* Parse an option that takes the name of a processor as its argument.
15441    OPTION is the name of the option and CPU_STRING is the argument.
15442    Return the corresponding processor enumeration if the CPU_STRING is
15443    recognized, otherwise report an error and return null.
15444
15445    A similar function exists in GCC.  */
15446
15447 static const struct mips_cpu_info *
15448 mips_parse_cpu (const char *option, const char *cpu_string)
15449 {
15450   const struct mips_cpu_info *p;
15451
15452   /* 'from-abi' selects the most compatible architecture for the given
15453      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
15454      EABIs, we have to decide whether we're using the 32-bit or 64-bit
15455      version.  Look first at the -mgp options, if given, otherwise base
15456      the choice on MIPS_DEFAULT_64BIT.
15457
15458      Treat NO_ABI like the EABIs.  One reason to do this is that the
15459      plain 'mips' and 'mips64' configs have 'from-abi' as their default
15460      architecture.  This code picks MIPS I for 'mips' and MIPS III for
15461      'mips64', just as we did in the days before 'from-abi'.  */
15462   if (strcasecmp (cpu_string, "from-abi") == 0)
15463     {
15464       if (ABI_NEEDS_32BIT_REGS (mips_abi))
15465         return mips_cpu_info_from_isa (ISA_MIPS1);
15466
15467       if (ABI_NEEDS_64BIT_REGS (mips_abi))
15468         return mips_cpu_info_from_isa (ISA_MIPS3);
15469
15470       if (file_mips_gp32 >= 0)
15471         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15472
15473       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15474                                      ? ISA_MIPS3
15475                                      : ISA_MIPS1);
15476     }
15477
15478   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
15479   if (strcasecmp (cpu_string, "default") == 0)
15480     return 0;
15481
15482   for (p = mips_cpu_info_table; p->name != 0; p++)
15483     if (mips_matching_cpu_name_p (p->name, cpu_string))
15484       return p;
15485
15486   as_bad (_("Bad value (%s) for %s"), cpu_string, option);
15487   return 0;
15488 }
15489
15490 /* Return the canonical processor information for ISA (a member of the
15491    ISA_MIPS* enumeration).  */
15492
15493 static const struct mips_cpu_info *
15494 mips_cpu_info_from_isa (int isa)
15495 {
15496   int i;
15497
15498   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15499     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
15500         && isa == mips_cpu_info_table[i].isa)
15501       return (&mips_cpu_info_table[i]);
15502
15503   return NULL;
15504 }
15505
15506 static const struct mips_cpu_info *
15507 mips_cpu_info_from_arch (int arch)
15508 {
15509   int i;
15510
15511   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15512     if (arch == mips_cpu_info_table[i].cpu)
15513       return (&mips_cpu_info_table[i]);
15514
15515   return NULL;
15516 }
15517 \f
15518 static void
15519 show (FILE *stream, const char *string, int *col_p, int *first_p)
15520 {
15521   if (*first_p)
15522     {
15523       fprintf (stream, "%24s", "");
15524       *col_p = 24;
15525     }
15526   else
15527     {
15528       fprintf (stream, ", ");
15529       *col_p += 2;
15530     }
15531
15532   if (*col_p + strlen (string) > 72)
15533     {
15534       fprintf (stream, "\n%24s", "");
15535       *col_p = 24;
15536     }
15537
15538   fprintf (stream, "%s", string);
15539   *col_p += strlen (string);
15540
15541   *first_p = 0;
15542 }
15543
15544 void
15545 md_show_usage (FILE *stream)
15546 {
15547   int column, first;
15548   size_t i;
15549
15550   fprintf (stream, _("\
15551 MIPS options:\n\
15552 -EB                     generate big endian output\n\
15553 -EL                     generate little endian output\n\
15554 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
15555 -G NUM                  allow referencing objects up to NUM bytes\n\
15556                         implicitly with the gp register [default 8]\n"));
15557   fprintf (stream, _("\
15558 -mips1                  generate MIPS ISA I instructions\n\
15559 -mips2                  generate MIPS ISA II instructions\n\
15560 -mips3                  generate MIPS ISA III instructions\n\
15561 -mips4                  generate MIPS ISA IV instructions\n\
15562 -mips5                  generate MIPS ISA V instructions\n\
15563 -mips32                 generate MIPS32 ISA instructions\n\
15564 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
15565 -mips64                 generate MIPS64 ISA instructions\n\
15566 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
15567 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
15568
15569   first = 1;
15570
15571   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15572     show (stream, mips_cpu_info_table[i].name, &column, &first);
15573   show (stream, "from-abi", &column, &first);
15574   fputc ('\n', stream);
15575
15576   fprintf (stream, _("\
15577 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15578 -no-mCPU                don't generate code specific to CPU.\n\
15579                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
15580
15581   first = 1;
15582
15583   show (stream, "3900", &column, &first);
15584   show (stream, "4010", &column, &first);
15585   show (stream, "4100", &column, &first);
15586   show (stream, "4650", &column, &first);
15587   fputc ('\n', stream);
15588
15589   fprintf (stream, _("\
15590 -mips16                 generate mips16 instructions\n\
15591 -no-mips16              do not generate mips16 instructions\n"));
15592   fprintf (stream, _("\
15593 -msmartmips             generate smartmips instructions\n\
15594 -mno-smartmips          do not generate smartmips instructions\n"));  
15595   fprintf (stream, _("\
15596 -mdsp                   generate DSP instructions\n\
15597 -mno-dsp                do not generate DSP instructions\n"));
15598   fprintf (stream, _("\
15599 -mdspr2                 generate DSP R2 instructions\n\
15600 -mno-dspr2              do not generate DSP R2 instructions\n"));
15601   fprintf (stream, _("\
15602 -mmt                    generate MT instructions\n\
15603 -mno-mt                 do not generate MT instructions\n"));
15604   fprintf (stream, _("\
15605 -mfix-loongson2f-jump   work around Loongson2F JUMP instructions\n\
15606 -mfix-loongson2f-nop    work around Loongson2F NOP errata\n\
15607 -mfix-vr4120            work around certain VR4120 errata\n\
15608 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
15609 -mfix-24k               insert a nop after ERET and DERET instructions\n\
15610 -mfix-cn63xxp1          work around CN63XXP1 PREF errata\n\
15611 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
15612 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
15613 -msym32                 assume all symbols have 32-bit values\n\
15614 -O0                     remove unneeded NOPs, do not swap branches\n\
15615 -O                      remove unneeded NOPs and swap branches\n\
15616 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
15617 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
15618   fprintf (stream, _("\
15619 -mhard-float            allow floating-point instructions\n\
15620 -msoft-float            do not allow floating-point instructions\n\
15621 -msingle-float          only allow 32-bit floating-point operations\n\
15622 -mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
15623 --[no-]construct-floats [dis]allow floating point values to be constructed\n"
15624                      ));
15625 #ifdef OBJ_ELF
15626   fprintf (stream, _("\
15627 -KPIC, -call_shared     generate SVR4 position independent code\n\
15628 -call_nonpic            generate non-PIC code that can operate with DSOs\n\
15629 -mvxworks-pic           generate VxWorks position independent code\n\
15630 -non_shared             do not generate code that can operate with DSOs\n\
15631 -xgot                   assume a 32 bit GOT\n\
15632 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
15633 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
15634                         position dependent (non shared) code\n\
15635 -mabi=ABI               create ABI conformant object file for:\n"));
15636
15637   first = 1;
15638
15639   show (stream, "32", &column, &first);
15640   show (stream, "o64", &column, &first);
15641   show (stream, "n32", &column, &first);
15642   show (stream, "64", &column, &first);
15643   show (stream, "eabi", &column, &first);
15644
15645   fputc ('\n', stream);
15646
15647   fprintf (stream, _("\
15648 -32                     create o32 ABI object file (default)\n\
15649 -n32                    create n32 ABI object file\n\
15650 -64                     create 64 ABI object file\n"));
15651 #endif
15652 }
15653
15654 #ifdef TE_IRIX
15655 enum dwarf2_format
15656 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
15657 {
15658   if (HAVE_64BIT_SYMBOLS)
15659     return dwarf2_format_64bit_irix;
15660   else
15661     return dwarf2_format_32bit;
15662 }
15663 #endif
15664
15665 int
15666 mips_dwarf2_addr_size (void)
15667 {
15668   if (HAVE_64BIT_OBJECTS)
15669     return 8;
15670   else
15671     return 4;
15672 }
15673
15674 /* Standard calling conventions leave the CFA at SP on entry.  */
15675 void
15676 mips_cfi_frame_initial_instructions (void)
15677 {
15678   cfi_add_CFA_def_cfa_register (SP);
15679 }
15680
15681 int
15682 tc_mips_regname_to_dw2regnum (char *regname)
15683 {
15684   unsigned int regnum = -1;
15685   unsigned int reg;
15686
15687   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15688     regnum = reg;
15689
15690   return regnum;
15691 }