Upload Tizen:Base source
[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   /* True if this instruction is complete.  */
161   unsigned int complete_p : 1;
162 };
163
164 /* The ABI to use.  */
165 enum mips_abi_level
166 {
167   NO_ABI = 0,
168   O32_ABI,
169   O64_ABI,
170   N32_ABI,
171   N64_ABI,
172   EABI_ABI
173 };
174
175 /* MIPS ABI we are using for this output file.  */
176 static enum mips_abi_level mips_abi = NO_ABI;
177
178 /* Whether or not we have code that can call pic code.  */
179 int mips_abicalls = FALSE;
180
181 /* Whether or not we have code which can be put into a shared
182    library.  */
183 static bfd_boolean mips_in_shared = TRUE;
184
185 /* This is the set of options which may be modified by the .set
186    pseudo-op.  We use a struct so that .set push and .set pop are more
187    reliable.  */
188
189 struct mips_set_options
190 {
191   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
192      if it has not been initialized.  Changed by `.set mipsN', and the
193      -mipsN command line option, and the default CPU.  */
194   int isa;
195   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
196      if they have not been initialized.  Changed by `.set <asename>', by
197      command line options, and based on the default architecture.  */
198   int ase_mips3d;
199   int ase_mdmx;
200   int ase_smartmips;
201   int ase_dsp;
202   int ase_dspr2;
203   int ase_mt;
204   /* Whether we are assembling for the mips16 processor.  0 if we are
205      not, 1 if we are, and -1 if the value has not been initialized.
206      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
207      -nomips16 command line options, and the default CPU.  */
208   int mips16;
209   /* Non-zero if we should not reorder instructions.  Changed by `.set
210      reorder' and `.set noreorder'.  */
211   int noreorder;
212   /* Non-zero if we should not permit the register designated "assembler
213      temporary" to be used in instructions.  The value is the register
214      number, normally $at ($1).  Changed by `.set at=REG', `.set noat'
215      (same as `.set at=$0') and `.set at' (same as `.set at=$1').  */
216   unsigned int at;
217   /* Non-zero if we should warn when a macro instruction expands into
218      more than one machine instruction.  Changed by `.set nomacro' and
219      `.set macro'.  */
220   int warn_about_macros;
221   /* Non-zero if we should not move instructions.  Changed by `.set
222      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
223   int nomove;
224   /* Non-zero if we should not optimize branches by moving the target
225      of the branch into the delay slot.  Actually, we don't perform
226      this optimization anyhow.  Changed by `.set bopt' and `.set
227      nobopt'.  */
228   int nobopt;
229   /* Non-zero if we should not autoextend mips16 instructions.
230      Changed by `.set autoextend' and `.set noautoextend'.  */
231   int noautoextend;
232   /* Restrict general purpose registers and floating point registers
233      to 32 bit.  This is initially determined when -mgp32 or -mfp32
234      is passed but can changed if the assembler code uses .set mipsN.  */
235   int gp32;
236   int fp32;
237   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
238      command line option, and the default CPU.  */
239   int arch;
240   /* True if ".set sym32" is in effect.  */
241   bfd_boolean sym32;
242   /* True if floating-point operations are not allowed.  Changed by .set
243      softfloat or .set hardfloat, by command line options -msoft-float or
244      -mhard-float.  The default is false.  */
245   bfd_boolean soft_float;
246
247   /* True if only single-precision floating-point operations are allowed.
248      Changed by .set singlefloat or .set doublefloat, command-line options
249      -msingle-float or -mdouble-float.  The default is false.  */
250   bfd_boolean single_float;
251 };
252
253 /* This is the struct we use to hold the current set of options.  Note
254    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
255    -1 to indicate that they have not been initialized.  */
256
257 /* True if -mgp32 was passed.  */
258 static int file_mips_gp32 = -1;
259
260 /* True if -mfp32 was passed.  */
261 static int file_mips_fp32 = -1;
262
263 /* 1 if -msoft-float, 0 if -mhard-float.  The default is 0.  */
264 static int file_mips_soft_float = 0;
265
266 /* 1 if -msingle-float, 0 if -mdouble-float.  The default is 0.   */
267 static int file_mips_single_float = 0;
268
269 static struct mips_set_options mips_opts =
270 {
271   /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
272   /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
273   /* mips16 */ -1, /* noreorder */ 0, /* at */ ATREG,
274   /* warn_about_macros */ 0, /* nomove */ 0, /* nobopt */ 0,
275   /* noautoextend */ 0, /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN,
276   /* sym32 */ FALSE, /* soft_float */ FALSE, /* single_float */ FALSE
277 };
278
279 /* These variables are filled in with the masks of registers used.
280    The object format code reads them and puts them in the appropriate
281    place.  */
282 unsigned long mips_gprmask;
283 unsigned long mips_cprmask[4];
284
285 /* MIPS ISA we are using for this output file.  */
286 static int file_mips_isa = ISA_UNKNOWN;
287
288 /* True if any MIPS16 code was produced.  */
289 static int file_ase_mips16;
290
291 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
292                               || mips_opts.isa == ISA_MIPS32R2          \
293                               || mips_opts.isa == ISA_MIPS64            \
294                               || mips_opts.isa == ISA_MIPS64R2)
295
296 /* True if we want to create R_MIPS_JALR for jalr $25.  */
297 #ifdef TE_IRIX
298 #define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
299 #else
300 /* As a GNU extension, we use R_MIPS_JALR for o32 too.  However,
301    because there's no place for any addend, the only acceptable
302    expression is a bare symbol.  */
303 #define MIPS_JALR_HINT_P(EXPR) \
304   (!HAVE_IN_PLACE_ADDENDS \
305    || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
306 #endif
307
308 /* True if -mips3d was passed or implied by arguments passed on the
309    command line (e.g., by -march).  */
310 static int file_ase_mips3d;
311
312 /* True if -mdmx was passed or implied by arguments passed on the
313    command line (e.g., by -march).  */
314 static int file_ase_mdmx;
315
316 /* True if -msmartmips was passed or implied by arguments passed on the
317    command line (e.g., by -march).  */
318 static int file_ase_smartmips;
319
320 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32             \
321                                 || mips_opts.isa == ISA_MIPS32R2)
322
323 /* True if -mdsp was passed or implied by arguments passed on the
324    command line (e.g., by -march).  */
325 static int file_ase_dsp;
326
327 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2             \
328                               || mips_opts.isa == ISA_MIPS64R2)
329
330 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
331
332 /* True if -mdspr2 was passed or implied by arguments passed on the
333    command line (e.g., by -march).  */
334 static int file_ase_dspr2;
335
336 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
337                                 || mips_opts.isa == ISA_MIPS64R2)
338
339 /* True if -mmt was passed or implied by arguments passed on the
340    command line (e.g., by -march).  */
341 static int file_ase_mt;
342
343 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
344                              || mips_opts.isa == ISA_MIPS64R2)
345
346 /* The argument of the -march= flag.  The architecture we are assembling.  */
347 static int file_mips_arch = CPU_UNKNOWN;
348 static const char *mips_arch_string;
349
350 /* The argument of the -mtune= flag.  The architecture for which we
351    are optimizing.  */
352 static int mips_tune = CPU_UNKNOWN;
353 static const char *mips_tune_string;
354
355 /* True when generating 32-bit code for a 64-bit processor.  */
356 static int mips_32bitmode = 0;
357
358 /* True if the given ABI requires 32-bit registers.  */
359 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
360
361 /* Likewise 64-bit registers.  */
362 #define ABI_NEEDS_64BIT_REGS(ABI)       \
363   ((ABI) == N32_ABI                     \
364    || (ABI) == N64_ABI                  \
365    || (ABI) == O64_ABI)
366
367 /*  Return true if ISA supports 64 bit wide gp registers.  */
368 #define ISA_HAS_64BIT_REGS(ISA)         \
369   ((ISA) == ISA_MIPS3                   \
370    || (ISA) == ISA_MIPS4                \
371    || (ISA) == ISA_MIPS5                \
372    || (ISA) == ISA_MIPS64               \
373    || (ISA) == ISA_MIPS64R2)
374
375 /*  Return true if ISA supports 64 bit wide float registers.  */
376 #define ISA_HAS_64BIT_FPRS(ISA)         \
377   ((ISA) == ISA_MIPS3                   \
378    || (ISA) == ISA_MIPS4                \
379    || (ISA) == ISA_MIPS5                \
380    || (ISA) == ISA_MIPS32R2             \
381    || (ISA) == ISA_MIPS64               \
382    || (ISA) == ISA_MIPS64R2)
383
384 /* Return true if ISA supports 64-bit right rotate (dror et al.)
385    instructions.  */
386 #define ISA_HAS_DROR(ISA)               \
387   ((ISA) == ISA_MIPS64R2)
388
389 /* Return true if ISA supports 32-bit right rotate (ror et al.)
390    instructions.  */
391 #define ISA_HAS_ROR(ISA)                \
392   ((ISA) == ISA_MIPS32R2                \
393    || (ISA) == ISA_MIPS64R2             \
394    || mips_opts.ase_smartmips)
395
396 /* Return true if ISA supports single-precision floats in odd registers.  */
397 #define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
398   ((ISA) == ISA_MIPS32                  \
399    || (ISA) == ISA_MIPS32R2             \
400    || (ISA) == ISA_MIPS64               \
401    || (ISA) == ISA_MIPS64R2)
402
403 /* Return true if ISA supports move to/from high part of a 64-bit
404    floating-point register. */
405 #define ISA_HAS_MXHC1(ISA)              \
406   ((ISA) == ISA_MIPS32R2                \
407    || (ISA) == ISA_MIPS64R2)
408
409 #define HAVE_32BIT_GPRS                            \
410     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
411
412 #define HAVE_32BIT_FPRS                            \
413     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
414
415 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
416 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
417
418 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
419
420 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
421
422 /* True if relocations are stored in-place.  */
423 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
424
425 /* The ABI-derived address size.  */
426 #define HAVE_64BIT_ADDRESSES \
427   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
428 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
429
430 /* The size of symbolic constants (i.e., expressions of the form
431    "SYMBOL" or "SYMBOL + OFFSET").  */
432 #define HAVE_32BIT_SYMBOLS \
433   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
434 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
435
436 /* Addresses are loaded in different ways, depending on the address size
437    in use.  The n32 ABI Documentation also mandates the use of additions
438    with overflow checking, but existing implementations don't follow it.  */
439 #define ADDRESS_ADD_INSN                                                \
440    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
441
442 #define ADDRESS_ADDI_INSN                                               \
443    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
444
445 #define ADDRESS_LOAD_INSN                                               \
446    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
447
448 #define ADDRESS_STORE_INSN                                              \
449    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
450
451 /* Return true if the given CPU supports the MIPS16 ASE.  */
452 #define CPU_HAS_MIPS16(cpu)                                             \
453    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
454     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
455
456 /* True if CPU has a dror instruction.  */
457 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
458
459 /* True if CPU has a ror instruction.  */
460 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
461
462 /* True if CPU has seq/sne and seqi/snei instructions.  */
463 #define CPU_HAS_SEQ(CPU)        ((CPU) == CPU_OCTEON)
464
465 /* True if CPU does not implement the all the coprocessor insns.  For these
466    CPUs only those COP insns are accepted that are explicitly marked to be
467    available on the CPU.  ISA membership for COP insns is ignored.  */
468 #define NO_ISA_COP(CPU)         ((CPU) == CPU_OCTEON)
469
470 /* True if mflo and mfhi can be immediately followed by instructions
471    which write to the HI and LO registers.
472
473    According to MIPS specifications, MIPS ISAs I, II, and III need
474    (at least) two instructions between the reads of HI/LO and
475    instructions which write them, and later ISAs do not.  Contradicting
476    the MIPS specifications, some MIPS IV processor user manuals (e.g.
477    the UM for the NEC Vr5000) document needing the instructions between
478    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
479    MIPS64 and later ISAs to have the interlocks, plus any specific
480    earlier-ISA CPUs for which CPU documentation declares that the
481    instructions are really interlocked.  */
482 #define hilo_interlocks \
483   (mips_opts.isa == ISA_MIPS32                        \
484    || mips_opts.isa == ISA_MIPS32R2                   \
485    || mips_opts.isa == ISA_MIPS64                     \
486    || mips_opts.isa == ISA_MIPS64R2                   \
487    || mips_opts.arch == CPU_R4010                     \
488    || mips_opts.arch == CPU_R10000                    \
489    || mips_opts.arch == CPU_R12000                    \
490    || mips_opts.arch == CPU_R14000                    \
491    || mips_opts.arch == CPU_R16000                    \
492    || mips_opts.arch == CPU_RM7000                    \
493    || mips_opts.arch == CPU_VR5500                    \
494    )
495
496 /* Whether the processor uses hardware interlocks to protect reads
497    from the GPRs after they are loaded from memory, and thus does not
498    require nops to be inserted.  This applies to instructions marked
499    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
500    level I.  */
501 #define gpr_interlocks \
502   (mips_opts.isa != ISA_MIPS1  \
503    || mips_opts.arch == CPU_R3900)
504
505 /* Whether the processor uses hardware interlocks to avoid delays
506    required by coprocessor instructions, and thus does not require
507    nops to be inserted.  This applies to instructions marked
508    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
509    between instructions marked INSN_WRITE_COND_CODE and ones marked
510    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
511    levels I, II, and III.  */
512 /* Itbl support may require additional care here.  */
513 #define cop_interlocks                                \
514   ((mips_opts.isa != ISA_MIPS1                        \
515     && mips_opts.isa != ISA_MIPS2                     \
516     && mips_opts.isa != ISA_MIPS3)                    \
517    || mips_opts.arch == CPU_R4300                     \
518    )
519
520 /* Whether the processor uses hardware interlocks to protect reads
521    from coprocessor registers after they are loaded from memory, and
522    thus does not require nops to be inserted.  This applies to
523    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
524    requires at MIPS ISA level I.  */
525 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
526
527 /* Is this a mfhi or mflo instruction?  */
528 #define MF_HILO_INSN(PINFO) \
529   ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
530
531 /* Returns true for a (non floating-point) coprocessor instruction.  Reading
532    or writing the condition code is only possible on the coprocessors and
533    these insns are not marked with INSN_COP.  Thus for these insns use the
534    condition-code flags.  */
535 #define COP_INSN(PINFO)                                                 \
536   (PINFO != INSN_MACRO                                                  \
537    && ((PINFO) & (FP_S | FP_D)) == 0                                    \
538    && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
539
540 /* MIPS PIC level.  */
541
542 enum mips_pic_level mips_pic;
543
544 /* 1 if we should generate 32 bit offsets from the $gp register in
545    SVR4_PIC mode.  Currently has no meaning in other modes.  */
546 static int mips_big_got = 0;
547
548 /* 1 if trap instructions should used for overflow rather than break
549    instructions.  */
550 static int mips_trap = 0;
551
552 /* 1 if double width floating point constants should not be constructed
553    by assembling two single width halves into two single width floating
554    point registers which just happen to alias the double width destination
555    register.  On some architectures this aliasing can be disabled by a bit
556    in the status register, and the setting of this bit cannot be determined
557    automatically at assemble time.  */
558 static int mips_disable_float_construction;
559
560 /* Non-zero if any .set noreorder directives were used.  */
561
562 static int mips_any_noreorder;
563
564 /* Non-zero if nops should be inserted when the register referenced in
565    an mfhi/mflo instruction is read in the next two instructions.  */
566 static int mips_7000_hilo_fix;
567
568 /* The size of objects in the small data section.  */
569 static unsigned int g_switch_value = 8;
570 /* Whether the -G option was used.  */
571 static int g_switch_seen = 0;
572
573 #define N_RMASK 0xc4
574 #define N_VFP   0xd4
575
576 /* If we can determine in advance that GP optimization won't be
577    possible, we can skip the relaxation stuff that tries to produce
578    GP-relative references.  This makes delay slot optimization work
579    better.
580
581    This function can only provide a guess, but it seems to work for
582    gcc output.  It needs to guess right for gcc, otherwise gcc
583    will put what it thinks is a GP-relative instruction in a branch
584    delay slot.
585
586    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
587    fixed it for the non-PIC mode.  KR 95/04/07  */
588 static int nopic_need_relax (symbolS *, int);
589
590 /* handle of the OPCODE hash table */
591 static struct hash_control *op_hash = NULL;
592
593 /* The opcode hash table we use for the mips16.  */
594 static struct hash_control *mips16_op_hash = NULL;
595
596 /* This array holds the chars that always start a comment.  If the
597     pre-processor is disabled, these aren't very useful */
598 const char comment_chars[] = "#";
599
600 /* This array holds the chars that only start a comment at the beginning of
601    a line.  If the line seems to have the form '# 123 filename'
602    .line and .file directives will appear in the pre-processed output */
603 /* Note that input_file.c hand checks for '#' at the beginning of the
604    first line of the input file.  This is because the compiler outputs
605    #NO_APP at the beginning of its output.  */
606 /* Also note that C style comments are always supported.  */
607 const char line_comment_chars[] = "#";
608
609 /* This array holds machine specific line separator characters.  */
610 const char line_separator_chars[] = ";";
611
612 /* Chars that can be used to separate mant from exp in floating point nums */
613 const char EXP_CHARS[] = "eE";
614
615 /* Chars that mean this number is a floating point constant */
616 /* As in 0f12.456 */
617 /* or    0d1.2345e12 */
618 const char FLT_CHARS[] = "rRsSfFdDxXpP";
619
620 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
621    changed in read.c .  Ideally it shouldn't have to know about it at all,
622    but nothing is ideal around here.
623  */
624
625 static char *insn_error;
626
627 static int auto_align = 1;
628
629 /* When outputting SVR4 PIC code, the assembler needs to know the
630    offset in the stack frame from which to restore the $gp register.
631    This is set by the .cprestore pseudo-op, and saved in this
632    variable.  */
633 static offsetT mips_cprestore_offset = -1;
634
635 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
636    more optimizations, it can use a register value instead of a memory-saved
637    offset and even an other register than $gp as global pointer.  */
638 static offsetT mips_cpreturn_offset = -1;
639 static int mips_cpreturn_register = -1;
640 static int mips_gp_register = GP;
641 static int mips_gprel_offset = 0;
642
643 /* Whether mips_cprestore_offset has been set in the current function
644    (or whether it has already been warned about, if not).  */
645 static int mips_cprestore_valid = 0;
646
647 /* This is the register which holds the stack frame, as set by the
648    .frame pseudo-op.  This is needed to implement .cprestore.  */
649 static int mips_frame_reg = SP;
650
651 /* Whether mips_frame_reg has been set in the current function
652    (or whether it has already been warned about, if not).  */
653 static int mips_frame_reg_valid = 0;
654
655 /* To output NOP instructions correctly, we need to keep information
656    about the previous two instructions.  */
657
658 /* Whether we are optimizing.  The default value of 2 means to remove
659    unneeded NOPs and swap branch instructions when possible.  A value
660    of 1 means to not swap branches.  A value of 0 means to always
661    insert NOPs.  */
662 static int mips_optimize = 2;
663
664 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
665    equivalent to seeing no -g option at all.  */
666 static int mips_debug = 0;
667
668 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
669 #define MAX_VR4130_NOPS 4
670
671 /* The maximum number of NOPs needed to fill delay slots.  */
672 #define MAX_DELAY_NOPS 2
673
674 /* The maximum number of NOPs needed for any purpose.  */
675 #define MAX_NOPS 4
676
677 /* A list of previous instructions, with index 0 being the most recent.
678    We need to look back MAX_NOPS instructions when filling delay slots
679    or working around processor errata.  We need to look back one
680    instruction further if we're thinking about using history[0] to
681    fill a branch delay slot.  */
682 static struct mips_cl_insn history[1 + MAX_NOPS];
683
684 /* Nop instructions used by emit_nop.  */
685 static struct mips_cl_insn nop_insn, mips16_nop_insn;
686
687 /* The appropriate nop for the current mode.  */
688 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
689
690 /* If this is set, it points to a frag holding nop instructions which
691    were inserted before the start of a noreorder section.  If those
692    nops turn out to be unnecessary, the size of the frag can be
693    decreased.  */
694 static fragS *prev_nop_frag;
695
696 /* The number of nop instructions we created in prev_nop_frag.  */
697 static int prev_nop_frag_holds;
698
699 /* The number of nop instructions that we know we need in
700    prev_nop_frag.  */
701 static int prev_nop_frag_required;
702
703 /* The number of instructions we've seen since prev_nop_frag.  */
704 static int prev_nop_frag_since;
705
706 /* For ECOFF and ELF, relocations against symbols are done in two
707    parts, with a HI relocation and a LO relocation.  Each relocation
708    has only 16 bits of space to store an addend.  This means that in
709    order for the linker to handle carries correctly, it must be able
710    to locate both the HI and the LO relocation.  This means that the
711    relocations must appear in order in the relocation table.
712
713    In order to implement this, we keep track of each unmatched HI
714    relocation.  We then sort them so that they immediately precede the
715    corresponding LO relocation.  */
716
717 struct mips_hi_fixup
718 {
719   /* Next HI fixup.  */
720   struct mips_hi_fixup *next;
721   /* This fixup.  */
722   fixS *fixp;
723   /* The section this fixup is in.  */
724   segT seg;
725 };
726
727 /* The list of unmatched HI relocs.  */
728
729 static struct mips_hi_fixup *mips_hi_fixup_list;
730
731 /* The frag containing the last explicit relocation operator.
732    Null if explicit relocations have not been used.  */
733
734 static fragS *prev_reloc_op_frag;
735
736 /* Map normal MIPS register numbers to mips16 register numbers.  */
737
738 #define X ILLEGAL_REG
739 static const int mips32_to_16_reg_map[] =
740 {
741   X, X, 2, 3, 4, 5, 6, 7,
742   X, X, X, X, X, X, X, X,
743   0, 1, X, X, X, X, X, X,
744   X, X, X, X, X, X, X, X
745 };
746 #undef X
747
748 /* Map mips16 register numbers to normal MIPS register numbers.  */
749
750 static const unsigned int mips16_to_32_reg_map[] =
751 {
752   16, 17, 2, 3, 4, 5, 6, 7
753 };
754
755 /* Classifies the kind of instructions we're interested in when
756    implementing -mfix-vr4120.  */
757 enum fix_vr4120_class
758 {
759   FIX_VR4120_MACC,
760   FIX_VR4120_DMACC,
761   FIX_VR4120_MULT,
762   FIX_VR4120_DMULT,
763   FIX_VR4120_DIV,
764   FIX_VR4120_MTHILO,
765   NUM_FIX_VR4120_CLASSES
766 };
767
768 /* ...likewise -mfix-loongson2f-jump.  */
769 static bfd_boolean mips_fix_loongson2f_jump;
770
771 /* ...likewise -mfix-loongson2f-nop.  */
772 static bfd_boolean mips_fix_loongson2f_nop;
773
774 /* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed.  */
775 static bfd_boolean mips_fix_loongson2f;
776
777 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
778    there must be at least one other instruction between an instruction
779    of type X and an instruction of type Y.  */
780 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
781
782 /* True if -mfix-vr4120 is in force.  */
783 static int mips_fix_vr4120;
784
785 /* ...likewise -mfix-vr4130.  */
786 static int mips_fix_vr4130;
787
788 /* ...likewise -mfix-24k.  */
789 static int mips_fix_24k;
790
791 /* ...likewise -mfix-cn63xxp1 */
792 static bfd_boolean mips_fix_cn63xxp1;
793
794 /* We don't relax branches by default, since this causes us to expand
795    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
796    fail to compute the offset before expanding the macro to the most
797    efficient expansion.  */
798
799 static int mips_relax_branch;
800 \f
801 /* The expansion of many macros depends on the type of symbol that
802    they refer to.  For example, when generating position-dependent code,
803    a macro that refers to a symbol may have two different expansions,
804    one which uses GP-relative addresses and one which uses absolute
805    addresses.  When generating SVR4-style PIC, a macro may have
806    different expansions for local and global symbols.
807
808    We handle these situations by generating both sequences and putting
809    them in variant frags.  In position-dependent code, the first sequence
810    will be the GP-relative one and the second sequence will be the
811    absolute one.  In SVR4 PIC, the first sequence will be for global
812    symbols and the second will be for local symbols.
813
814    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
815    SECOND are the lengths of the two sequences in bytes.  These fields
816    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
817    the subtype has the following flags:
818
819    RELAX_USE_SECOND
820         Set if it has been decided that we should use the second
821         sequence instead of the first.
822
823    RELAX_SECOND_LONGER
824         Set in the first variant frag if the macro's second implementation
825         is longer than its first.  This refers to the macro as a whole,
826         not an individual relaxation.
827
828    RELAX_NOMACRO
829         Set in the first variant frag if the macro appeared in a .set nomacro
830         block and if one alternative requires a warning but the other does not.
831
832    RELAX_DELAY_SLOT
833         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
834         delay slot.
835
836    The frag's "opcode" points to the first fixup for relaxable code.
837
838    Relaxable macros are generated using a sequence such as:
839
840       relax_start (SYMBOL);
841       ... generate first expansion ...
842       relax_switch ();
843       ... generate second expansion ...
844       relax_end ();
845
846    The code and fixups for the unwanted alternative are discarded
847    by md_convert_frag.  */
848 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
849
850 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
851 #define RELAX_SECOND(X) ((X) & 0xff)
852 #define RELAX_USE_SECOND 0x10000
853 #define RELAX_SECOND_LONGER 0x20000
854 #define RELAX_NOMACRO 0x40000
855 #define RELAX_DELAY_SLOT 0x80000
856
857 /* Branch without likely bit.  If label is out of range, we turn:
858
859         beq reg1, reg2, label
860         delay slot
861
862    into
863
864         bne reg1, reg2, 0f
865         nop
866         j label
867      0: delay slot
868
869    with the following opcode replacements:
870
871         beq <-> bne
872         blez <-> bgtz
873         bltz <-> bgez
874         bc1f <-> bc1t
875
876         bltzal <-> bgezal  (with jal label instead of j label)
877
878    Even though keeping the delay slot instruction in the delay slot of
879    the branch would be more efficient, it would be very tricky to do
880    correctly, because we'd have to introduce a variable frag *after*
881    the delay slot instruction, and expand that instead.  Let's do it
882    the easy way for now, even if the branch-not-taken case now costs
883    one additional instruction.  Out-of-range branches are not supposed
884    to be common, anyway.
885
886    Branch likely.  If label is out of range, we turn:
887
888         beql reg1, reg2, label
889         delay slot (annulled if branch not taken)
890
891    into
892
893         beql reg1, reg2, 1f
894         nop
895         beql $0, $0, 2f
896         nop
897      1: j[al] label
898         delay slot (executed only if branch taken)
899      2:
900
901    It would be possible to generate a shorter sequence by losing the
902    likely bit, generating something like:
903
904         bne reg1, reg2, 0f
905         nop
906         j[al] label
907         delay slot (executed only if branch taken)
908      0:
909
910         beql -> bne
911         bnel -> beq
912         blezl -> bgtz
913         bgtzl -> blez
914         bltzl -> bgez
915         bgezl -> bltz
916         bc1fl -> bc1t
917         bc1tl -> bc1f
918
919         bltzall -> bgezal  (with jal label instead of j label)
920         bgezall -> bltzal  (ditto)
921
922
923    but it's not clear that it would actually improve performance.  */
924 #define RELAX_BRANCH_ENCODE(at, uncond, likely, link, toofar)   \
925   ((relax_substateT)                                            \
926    (0xc0000000                                                  \
927     | ((at) & 0x1f)                                             \
928     | ((toofar) ? 0x20 : 0)                                     \
929     | ((link) ? 0x40 : 0)                                       \
930     | ((likely) ? 0x80 : 0)                                     \
931     | ((uncond) ? 0x100 : 0)))
932 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
933 #define RELAX_BRANCH_UNCOND(i) (((i) & 0x100) != 0)
934 #define RELAX_BRANCH_LIKELY(i) (((i) & 0x80) != 0)
935 #define RELAX_BRANCH_LINK(i) (((i) & 0x40) != 0)
936 #define RELAX_BRANCH_TOOFAR(i) (((i) & 0x20) != 0)
937 #define RELAX_BRANCH_AT(i) ((i) & 0x1f)
938
939 /* For mips16 code, we use an entirely different form of relaxation.
940    mips16 supports two versions of most instructions which take
941    immediate values: a small one which takes some small value, and a
942    larger one which takes a 16 bit value.  Since branches also follow
943    this pattern, relaxing these values is required.
944
945    We can assemble both mips16 and normal MIPS code in a single
946    object.  Therefore, we need to support this type of relaxation at
947    the same time that we support the relaxation described above.  We
948    use the high bit of the subtype field to distinguish these cases.
949
950    The information we store for this type of relaxation is the
951    argument code found in the opcode file for this relocation, whether
952    the user explicitly requested a small or extended form, and whether
953    the relocation is in a jump or jal delay slot.  That tells us the
954    size of the value, and how it should be stored.  We also store
955    whether the fragment is considered to be extended or not.  We also
956    store whether this is known to be a branch to a different section,
957    whether we have tried to relax this frag yet, and whether we have
958    ever extended a PC relative fragment because of a shift count.  */
959 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
960   (0x80000000                                                   \
961    | ((type) & 0xff)                                            \
962    | ((small) ? 0x100 : 0)                                      \
963    | ((ext) ? 0x200 : 0)                                        \
964    | ((dslot) ? 0x400 : 0)                                      \
965    | ((jal_dslot) ? 0x800 : 0))
966 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
967 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
968 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
969 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
970 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
971 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
972 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
973 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
974 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
975 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
976 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
977 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
978
979 /* Is the given value a sign-extended 32-bit value?  */
980 #define IS_SEXT_32BIT_NUM(x)                                            \
981   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
982    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
983
984 /* Is the given value a sign-extended 16-bit value?  */
985 #define IS_SEXT_16BIT_NUM(x)                                            \
986   (((x) &~ (offsetT) 0x7fff) == 0                                       \
987    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
988
989 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
990 #define IS_ZEXT_32BIT_NUM(x)                                            \
991   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
992    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
993
994 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
995    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
996 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
997   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
998               | (((VALUE) & (MASK)) << (SHIFT)))
999
1000 /* Extract bits MASK << SHIFT from STRUCT and shift them right
1001    SHIFT places.  */
1002 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
1003   (((STRUCT) >> (SHIFT)) & (MASK))
1004
1005 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1006    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1007
1008    include/opcode/mips.h specifies operand fields using the macros
1009    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
1010    with "MIPS16OP" instead of "OP".  */
1011 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
1012   INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
1013 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1014   INSERT_BITS ((INSN).insn_opcode, VALUE, \
1015                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1016
1017 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
1018 #define EXTRACT_OPERAND(FIELD, INSN) \
1019   EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
1020 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1021   EXTRACT_BITS ((INSN).insn_opcode, \
1022                 MIPS16OP_MASK_##FIELD, \
1023                 MIPS16OP_SH_##FIELD)
1024 \f
1025 /* Global variables used when generating relaxable macros.  See the
1026    comment above RELAX_ENCODE for more details about how relaxation
1027    is used.  */
1028 static struct {
1029   /* 0 if we're not emitting a relaxable macro.
1030      1 if we're emitting the first of the two relaxation alternatives.
1031      2 if we're emitting the second alternative.  */
1032   int sequence;
1033
1034   /* The first relaxable fixup in the current frag.  (In other words,
1035      the first fixup that refers to relaxable code.)  */
1036   fixS *first_fixup;
1037
1038   /* sizes[0] says how many bytes of the first alternative are stored in
1039      the current frag.  Likewise sizes[1] for the second alternative.  */
1040   unsigned int sizes[2];
1041
1042   /* The symbol on which the choice of sequence depends.  */
1043   symbolS *symbol;
1044 } mips_relax;
1045 \f
1046 /* Global variables used to decide whether a macro needs a warning.  */
1047 static struct {
1048   /* True if the macro is in a branch delay slot.  */
1049   bfd_boolean delay_slot_p;
1050
1051   /* For relaxable macros, sizes[0] is the length of the first alternative
1052      in bytes and sizes[1] is the length of the second alternative.
1053      For non-relaxable macros, both elements give the length of the
1054      macro in bytes.  */
1055   unsigned int sizes[2];
1056
1057   /* The first variant frag for this macro.  */
1058   fragS *first_frag;
1059 } mips_macro_warning;
1060 \f
1061 /* Prototypes for static functions.  */
1062
1063 #define internalError()                                                 \
1064     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1065
1066 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1067
1068 static void append_insn
1069   (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *);
1070 static void mips_no_prev_insn (void);
1071 static void macro_build (expressionS *, const char *, const char *, ...);
1072 static void mips16_macro_build
1073   (expressionS *, const char *, const char *, va_list *);
1074 static void load_register (int, expressionS *, int);
1075 static void macro_start (void);
1076 static void macro_end (void);
1077 static void macro (struct mips_cl_insn * ip);
1078 static void mips16_macro (struct mips_cl_insn * ip);
1079 static void mips_ip (char *str, struct mips_cl_insn * ip);
1080 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1081 static void mips16_immed
1082   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1083    unsigned long *, bfd_boolean *, unsigned short *);
1084 static size_t my_getSmallExpression
1085   (expressionS *, bfd_reloc_code_real_type *, char *);
1086 static void my_getExpression (expressionS *, char *);
1087 static void s_align (int);
1088 static void s_change_sec (int);
1089 static void s_change_section (int);
1090 static void s_cons (int);
1091 static void s_float_cons (int);
1092 static void s_mips_globl (int);
1093 static void s_option (int);
1094 static void s_mipsset (int);
1095 static void s_abicalls (int);
1096 static void s_cpload (int);
1097 static void s_cpsetup (int);
1098 static void s_cplocal (int);
1099 static void s_cprestore (int);
1100 static void s_cpreturn (int);
1101 static void s_dtprelword (int);
1102 static void s_dtpreldword (int);
1103 static void s_gpvalue (int);
1104 static void s_gpword (int);
1105 static void s_gpdword (int);
1106 static void s_cpadd (int);
1107 static void s_insn (int);
1108 static void md_obj_begin (void);
1109 static void md_obj_end (void);
1110 static void s_mips_ent (int);
1111 static void s_mips_end (int);
1112 static void s_mips_frame (int);
1113 static void s_mips_mask (int reg_type);
1114 static void s_mips_stab (int);
1115 static void s_mips_weakext (int);
1116 static void s_mips_file (int);
1117 static void s_mips_loc (int);
1118 static bfd_boolean pic_need_relax (symbolS *, asection *);
1119 static int relaxed_branch_length (fragS *, asection *, int);
1120 static int validate_mips_insn (const struct mips_opcode *);
1121
1122 /* Table and functions used to map between CPU/ISA names, and
1123    ISA levels, and CPU numbers.  */
1124
1125 struct mips_cpu_info
1126 {
1127   const char *name;           /* CPU or ISA name.  */
1128   int flags;                  /* ASEs available, or ISA flag.  */
1129   int isa;                    /* ISA level.  */
1130   int cpu;                    /* CPU number (default CPU if ISA).  */
1131 };
1132
1133 #define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1134 #define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1135 #define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1136 #define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1137 #define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1138 #define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1139 #define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1140
1141 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1142 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1143 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1144 \f
1145 /* Pseudo-op table.
1146
1147    The following pseudo-ops from the Kane and Heinrich MIPS book
1148    should be defined here, but are currently unsupported: .alias,
1149    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1150
1151    The following pseudo-ops from the Kane and Heinrich MIPS book are
1152    specific to the type of debugging information being generated, and
1153    should be defined by the object format: .aent, .begin, .bend,
1154    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1155    .vreg.
1156
1157    The following pseudo-ops from the Kane and Heinrich MIPS book are
1158    not MIPS CPU specific, but are also not specific to the object file
1159    format.  This file is probably the best place to define them, but
1160    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1161
1162 static const pseudo_typeS mips_pseudo_table[] =
1163 {
1164   /* MIPS specific pseudo-ops.  */
1165   {"option", s_option, 0},
1166   {"set", s_mipsset, 0},
1167   {"rdata", s_change_sec, 'r'},
1168   {"sdata", s_change_sec, 's'},
1169   {"livereg", s_ignore, 0},
1170   {"abicalls", s_abicalls, 0},
1171   {"cpload", s_cpload, 0},
1172   {"cpsetup", s_cpsetup, 0},
1173   {"cplocal", s_cplocal, 0},
1174   {"cprestore", s_cprestore, 0},
1175   {"cpreturn", s_cpreturn, 0},
1176   {"dtprelword", s_dtprelword, 0},
1177   {"dtpreldword", s_dtpreldword, 0},
1178   {"gpvalue", s_gpvalue, 0},
1179   {"gpword", s_gpword, 0},
1180   {"gpdword", s_gpdword, 0},
1181   {"cpadd", s_cpadd, 0},
1182   {"insn", s_insn, 0},
1183
1184   /* Relatively generic pseudo-ops that happen to be used on MIPS
1185      chips.  */
1186   {"asciiz", stringer, 8 + 1},
1187   {"bss", s_change_sec, 'b'},
1188   {"err", s_err, 0},
1189   {"half", s_cons, 1},
1190   {"dword", s_cons, 3},
1191   {"weakext", s_mips_weakext, 0},
1192   {"origin", s_org, 0},
1193   {"repeat", s_rept, 0},
1194
1195   /* For MIPS this is non-standard, but we define it for consistency.  */
1196   {"sbss", s_change_sec, 'B'},
1197
1198   /* These pseudo-ops are defined in read.c, but must be overridden
1199      here for one reason or another.  */
1200   {"align", s_align, 0},
1201   {"byte", s_cons, 0},
1202   {"data", s_change_sec, 'd'},
1203   {"double", s_float_cons, 'd'},
1204   {"float", s_float_cons, 'f'},
1205   {"globl", s_mips_globl, 0},
1206   {"global", s_mips_globl, 0},
1207   {"hword", s_cons, 1},
1208   {"int", s_cons, 2},
1209   {"long", s_cons, 2},
1210   {"octa", s_cons, 4},
1211   {"quad", s_cons, 3},
1212   {"section", s_change_section, 0},
1213   {"short", s_cons, 1},
1214   {"single", s_float_cons, 'f'},
1215   {"stabn", s_mips_stab, 'n'},
1216   {"text", s_change_sec, 't'},
1217   {"word", s_cons, 2},
1218
1219   { "extern", ecoff_directive_extern, 0},
1220
1221   { NULL, NULL, 0 },
1222 };
1223
1224 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1225 {
1226   /* These pseudo-ops should be defined by the object file format.
1227      However, a.out doesn't support them, so we have versions here.  */
1228   {"aent", s_mips_ent, 1},
1229   {"bgnb", s_ignore, 0},
1230   {"end", s_mips_end, 0},
1231   {"endb", s_ignore, 0},
1232   {"ent", s_mips_ent, 0},
1233   {"file", s_mips_file, 0},
1234   {"fmask", s_mips_mask, 'F'},
1235   {"frame", s_mips_frame, 0},
1236   {"loc", s_mips_loc, 0},
1237   {"mask", s_mips_mask, 'R'},
1238   {"verstamp", s_ignore, 0},
1239   { NULL, NULL, 0 },
1240 };
1241
1242 /* Export the ABI address size for use by TC_ADDRESS_BYTES for the
1243    purpose of the `.dc.a' internal pseudo-op.  */
1244
1245 int
1246 mips_address_bytes (void)
1247 {
1248   return HAVE_64BIT_ADDRESSES ? 8 : 4;
1249 }
1250
1251 extern void pop_insert (const pseudo_typeS *);
1252
1253 void
1254 mips_pop_insert (void)
1255 {
1256   pop_insert (mips_pseudo_table);
1257   if (! ECOFF_DEBUGGING)
1258     pop_insert (mips_nonecoff_pseudo_table);
1259 }
1260 \f
1261 /* Symbols labelling the current insn.  */
1262
1263 struct insn_label_list
1264 {
1265   struct insn_label_list *next;
1266   symbolS *label;
1267 };
1268
1269 static struct insn_label_list *free_insn_labels;
1270 #define label_list tc_segment_info_data.labels
1271
1272 static void mips_clear_insn_labels (void);
1273
1274 static inline void
1275 mips_clear_insn_labels (void)
1276 {
1277   register struct insn_label_list **pl;
1278   segment_info_type *si;
1279
1280   if (now_seg)
1281     {
1282       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1283         ;
1284       
1285       si = seg_info (now_seg);
1286       *pl = si->label_list;
1287       si->label_list = NULL;
1288     }
1289 }
1290
1291 \f
1292 static char *expr_end;
1293
1294 /* Expressions which appear in instructions.  These are set by
1295    mips_ip.  */
1296
1297 static expressionS imm_expr;
1298 static expressionS imm2_expr;
1299 static expressionS offset_expr;
1300
1301 /* Relocs associated with imm_expr and offset_expr.  */
1302
1303 static bfd_reloc_code_real_type imm_reloc[3]
1304   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1305 static bfd_reloc_code_real_type offset_reloc[3]
1306   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1307
1308 /* These are set by mips16_ip if an explicit extension is used.  */
1309
1310 static bfd_boolean mips16_small, mips16_ext;
1311
1312 #ifdef OBJ_ELF
1313 /* The pdr segment for per procedure frame/regmask info.  Not used for
1314    ECOFF debugging.  */
1315
1316 static segT pdr_seg;
1317 #endif
1318
1319 /* The default target format to use.  */
1320
1321 #if defined (TE_FreeBSD)
1322 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips-freebsd"
1323 #elif defined (TE_TMIPS)
1324 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips"
1325 #else
1326 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX ENDIAN "mips"
1327 #endif
1328
1329 const char *
1330 mips_target_format (void)
1331 {
1332   switch (OUTPUT_FLAVOR)
1333     {
1334     case bfd_target_ecoff_flavour:
1335       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1336     case bfd_target_coff_flavour:
1337       return "pe-mips";
1338     case bfd_target_elf_flavour:
1339 #ifdef TE_VXWORKS
1340       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1341         return (target_big_endian
1342                 ? "elf32-bigmips-vxworks"
1343                 : "elf32-littlemips-vxworks");
1344 #endif
1345       return (target_big_endian
1346               ? (HAVE_64BIT_OBJECTS
1347                  ? ELF_TARGET ("elf64-", "big")
1348                  : (HAVE_NEWABI
1349                     ? ELF_TARGET ("elf32-n", "big")
1350                     : ELF_TARGET ("elf32-", "big")))
1351               : (HAVE_64BIT_OBJECTS
1352                  ? ELF_TARGET ("elf64-", "little")
1353                  : (HAVE_NEWABI
1354                     ? ELF_TARGET ("elf32-n", "little")
1355                     : ELF_TARGET ("elf32-", "little"))));
1356     default:
1357       abort ();
1358       return NULL;
1359     }
1360 }
1361
1362 /* Return the length of instruction INSN.  */
1363
1364 static inline unsigned int
1365 insn_length (const struct mips_cl_insn *insn)
1366 {
1367   if (!mips_opts.mips16)
1368     return 4;
1369   return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1370 }
1371
1372 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1373
1374 static void
1375 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1376 {
1377   size_t i;
1378
1379   insn->insn_mo = mo;
1380   insn->use_extend = FALSE;
1381   insn->extend = 0;
1382   insn->insn_opcode = mo->match;
1383   insn->frag = NULL;
1384   insn->where = 0;
1385   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1386     insn->fixp[i] = NULL;
1387   insn->fixed_p = (mips_opts.noreorder > 0);
1388   insn->noreorder_p = (mips_opts.noreorder > 0);
1389   insn->mips16_absolute_jump_p = 0;
1390   insn->complete_p = 0;
1391 }
1392
1393 /* Record the current MIPS16 mode in now_seg.  */
1394
1395 static void
1396 mips_record_mips16_mode (void)
1397 {
1398   segment_info_type *si;
1399
1400   si = seg_info (now_seg);
1401   if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1402     si->tc_segment_info_data.mips16 = mips_opts.mips16;
1403 }
1404
1405 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1406
1407 static void
1408 install_insn (const struct mips_cl_insn *insn)
1409 {
1410   char *f = insn->frag->fr_literal + insn->where;
1411   if (!mips_opts.mips16)
1412     md_number_to_chars (f, insn->insn_opcode, 4);
1413   else if (insn->mips16_absolute_jump_p)
1414     {
1415       md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1416       md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1417     }
1418   else
1419     {
1420       if (insn->use_extend)
1421         {
1422           md_number_to_chars (f, 0xf000 | insn->extend, 2);
1423           f += 2;
1424         }
1425       md_number_to_chars (f, insn->insn_opcode, 2);
1426     }
1427   mips_record_mips16_mode ();
1428 }
1429
1430 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1431    and install the opcode in the new location.  */
1432
1433 static void
1434 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1435 {
1436   size_t i;
1437
1438   insn->frag = frag;
1439   insn->where = where;
1440   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1441     if (insn->fixp[i] != NULL)
1442       {
1443         insn->fixp[i]->fx_frag = frag;
1444         insn->fixp[i]->fx_where = where;
1445       }
1446   install_insn (insn);
1447 }
1448
1449 /* Add INSN to the end of the output.  */
1450
1451 static void
1452 add_fixed_insn (struct mips_cl_insn *insn)
1453 {
1454   char *f = frag_more (insn_length (insn));
1455   move_insn (insn, frag_now, f - frag_now->fr_literal);
1456 }
1457
1458 /* Start a variant frag and move INSN to the start of the variant part,
1459    marking it as fixed.  The other arguments are as for frag_var.  */
1460
1461 static void
1462 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1463                   relax_substateT subtype, symbolS *symbol, offsetT offset)
1464 {
1465   frag_grow (max_chars);
1466   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1467   insn->fixed_p = 1;
1468   frag_var (rs_machine_dependent, max_chars, var,
1469             subtype, symbol, offset, NULL);
1470 }
1471
1472 /* Insert N copies of INSN into the history buffer, starting at
1473    position FIRST.  Neither FIRST nor N need to be clipped.  */
1474
1475 static void
1476 insert_into_history (unsigned int first, unsigned int n,
1477                      const struct mips_cl_insn *insn)
1478 {
1479   if (mips_relax.sequence != 2)
1480     {
1481       unsigned int i;
1482
1483       for (i = ARRAY_SIZE (history); i-- > first;)
1484         if (i >= first + n)
1485           history[i] = history[i - n];
1486         else
1487           history[i] = *insn;
1488     }
1489 }
1490
1491 /* Emit a nop instruction, recording it in the history buffer.  */
1492
1493 static void
1494 emit_nop (void)
1495 {
1496   add_fixed_insn (NOP_INSN);
1497   insert_into_history (0, 1, NOP_INSN);
1498 }
1499
1500 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1501    the idea is to make it obvious at a glance that each errata is
1502    included.  */
1503
1504 static void
1505 init_vr4120_conflicts (void)
1506 {
1507 #define CONFLICT(FIRST, SECOND) \
1508     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1509
1510   /* Errata 21 - [D]DIV[U] after [D]MACC */
1511   CONFLICT (MACC, DIV);
1512   CONFLICT (DMACC, DIV);
1513
1514   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1515   CONFLICT (DMULT, DMULT);
1516   CONFLICT (DMULT, DMACC);
1517   CONFLICT (DMACC, DMULT);
1518   CONFLICT (DMACC, DMACC);
1519
1520   /* Errata 24 - MT{LO,HI} after [D]MACC */
1521   CONFLICT (MACC, MTHILO);
1522   CONFLICT (DMACC, MTHILO);
1523
1524   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1525      instruction is executed immediately after a MACC or DMACC
1526      instruction, the result of [either instruction] is incorrect."  */
1527   CONFLICT (MACC, MULT);
1528   CONFLICT (MACC, DMULT);
1529   CONFLICT (DMACC, MULT);
1530   CONFLICT (DMACC, DMULT);
1531
1532   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1533      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1534      DDIV or DDIVU instruction, the result of the MACC or
1535      DMACC instruction is incorrect.".  */
1536   CONFLICT (DMULT, MACC);
1537   CONFLICT (DMULT, DMACC);
1538   CONFLICT (DIV, MACC);
1539   CONFLICT (DIV, DMACC);
1540
1541 #undef CONFLICT
1542 }
1543
1544 struct regname {
1545   const char *name;
1546   unsigned int num;
1547 };
1548
1549 #define RTYPE_MASK      0x1ff00
1550 #define RTYPE_NUM       0x00100
1551 #define RTYPE_FPU       0x00200
1552 #define RTYPE_FCC       0x00400
1553 #define RTYPE_VEC       0x00800
1554 #define RTYPE_GP        0x01000
1555 #define RTYPE_CP0       0x02000
1556 #define RTYPE_PC        0x04000
1557 #define RTYPE_ACC       0x08000
1558 #define RTYPE_CCC       0x10000
1559 #define RNUM_MASK       0x000ff
1560 #define RWARN           0x80000
1561
1562 #define GENERIC_REGISTER_NUMBERS \
1563     {"$0",      RTYPE_NUM | 0},  \
1564     {"$1",      RTYPE_NUM | 1},  \
1565     {"$2",      RTYPE_NUM | 2},  \
1566     {"$3",      RTYPE_NUM | 3},  \
1567     {"$4",      RTYPE_NUM | 4},  \
1568     {"$5",      RTYPE_NUM | 5},  \
1569     {"$6",      RTYPE_NUM | 6},  \
1570     {"$7",      RTYPE_NUM | 7},  \
1571     {"$8",      RTYPE_NUM | 8},  \
1572     {"$9",      RTYPE_NUM | 9},  \
1573     {"$10",     RTYPE_NUM | 10}, \
1574     {"$11",     RTYPE_NUM | 11}, \
1575     {"$12",     RTYPE_NUM | 12}, \
1576     {"$13",     RTYPE_NUM | 13}, \
1577     {"$14",     RTYPE_NUM | 14}, \
1578     {"$15",     RTYPE_NUM | 15}, \
1579     {"$16",     RTYPE_NUM | 16}, \
1580     {"$17",     RTYPE_NUM | 17}, \
1581     {"$18",     RTYPE_NUM | 18}, \
1582     {"$19",     RTYPE_NUM | 19}, \
1583     {"$20",     RTYPE_NUM | 20}, \
1584     {"$21",     RTYPE_NUM | 21}, \
1585     {"$22",     RTYPE_NUM | 22}, \
1586     {"$23",     RTYPE_NUM | 23}, \
1587     {"$24",     RTYPE_NUM | 24}, \
1588     {"$25",     RTYPE_NUM | 25}, \
1589     {"$26",     RTYPE_NUM | 26}, \
1590     {"$27",     RTYPE_NUM | 27}, \
1591     {"$28",     RTYPE_NUM | 28}, \
1592     {"$29",     RTYPE_NUM | 29}, \
1593     {"$30",     RTYPE_NUM | 30}, \
1594     {"$31",     RTYPE_NUM | 31} 
1595
1596 #define FPU_REGISTER_NAMES       \
1597     {"$f0",     RTYPE_FPU | 0},  \
1598     {"$f1",     RTYPE_FPU | 1},  \
1599     {"$f2",     RTYPE_FPU | 2},  \
1600     {"$f3",     RTYPE_FPU | 3},  \
1601     {"$f4",     RTYPE_FPU | 4},  \
1602     {"$f5",     RTYPE_FPU | 5},  \
1603     {"$f6",     RTYPE_FPU | 6},  \
1604     {"$f7",     RTYPE_FPU | 7},  \
1605     {"$f8",     RTYPE_FPU | 8},  \
1606     {"$f9",     RTYPE_FPU | 9},  \
1607     {"$f10",    RTYPE_FPU | 10}, \
1608     {"$f11",    RTYPE_FPU | 11}, \
1609     {"$f12",    RTYPE_FPU | 12}, \
1610     {"$f13",    RTYPE_FPU | 13}, \
1611     {"$f14",    RTYPE_FPU | 14}, \
1612     {"$f15",    RTYPE_FPU | 15}, \
1613     {"$f16",    RTYPE_FPU | 16}, \
1614     {"$f17",    RTYPE_FPU | 17}, \
1615     {"$f18",    RTYPE_FPU | 18}, \
1616     {"$f19",    RTYPE_FPU | 19}, \
1617     {"$f20",    RTYPE_FPU | 20}, \
1618     {"$f21",    RTYPE_FPU | 21}, \
1619     {"$f22",    RTYPE_FPU | 22}, \
1620     {"$f23",    RTYPE_FPU | 23}, \
1621     {"$f24",    RTYPE_FPU | 24}, \
1622     {"$f25",    RTYPE_FPU | 25}, \
1623     {"$f26",    RTYPE_FPU | 26}, \
1624     {"$f27",    RTYPE_FPU | 27}, \
1625     {"$f28",    RTYPE_FPU | 28}, \
1626     {"$f29",    RTYPE_FPU | 29}, \
1627     {"$f30",    RTYPE_FPU | 30}, \
1628     {"$f31",    RTYPE_FPU | 31}
1629
1630 #define FPU_CONDITION_CODE_NAMES \
1631     {"$fcc0",   RTYPE_FCC | 0},  \
1632     {"$fcc1",   RTYPE_FCC | 1},  \
1633     {"$fcc2",   RTYPE_FCC | 2},  \
1634     {"$fcc3",   RTYPE_FCC | 3},  \
1635     {"$fcc4",   RTYPE_FCC | 4},  \
1636     {"$fcc5",   RTYPE_FCC | 5},  \
1637     {"$fcc6",   RTYPE_FCC | 6},  \
1638     {"$fcc7",   RTYPE_FCC | 7}
1639
1640 #define COPROC_CONDITION_CODE_NAMES         \
1641     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1642     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1643     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1644     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1645     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1646     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1647     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1648     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1649
1650 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1651     {"$a4",     RTYPE_GP | 8},  \
1652     {"$a5",     RTYPE_GP | 9},  \
1653     {"$a6",     RTYPE_GP | 10}, \
1654     {"$a7",     RTYPE_GP | 11}, \
1655     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1656     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1657     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1658     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1659     {"$t0",     RTYPE_GP | 12}, \
1660     {"$t1",     RTYPE_GP | 13}, \
1661     {"$t2",     RTYPE_GP | 14}, \
1662     {"$t3",     RTYPE_GP | 15}
1663
1664 #define O32_SYMBOLIC_REGISTER_NAMES \
1665     {"$t0",     RTYPE_GP | 8},  \
1666     {"$t1",     RTYPE_GP | 9},  \
1667     {"$t2",     RTYPE_GP | 10}, \
1668     {"$t3",     RTYPE_GP | 11}, \
1669     {"$t4",     RTYPE_GP | 12}, \
1670     {"$t5",     RTYPE_GP | 13}, \
1671     {"$t6",     RTYPE_GP | 14}, \
1672     {"$t7",     RTYPE_GP | 15}, \
1673     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
1674     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
1675     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
1676     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */ 
1677
1678 /* Remaining symbolic register names */
1679 #define SYMBOLIC_REGISTER_NAMES \
1680     {"$zero",   RTYPE_GP | 0},  \
1681     {"$at",     RTYPE_GP | 1},  \
1682     {"$AT",     RTYPE_GP | 1},  \
1683     {"$v0",     RTYPE_GP | 2},  \
1684     {"$v1",     RTYPE_GP | 3},  \
1685     {"$a0",     RTYPE_GP | 4},  \
1686     {"$a1",     RTYPE_GP | 5},  \
1687     {"$a2",     RTYPE_GP | 6},  \
1688     {"$a3",     RTYPE_GP | 7},  \
1689     {"$s0",     RTYPE_GP | 16}, \
1690     {"$s1",     RTYPE_GP | 17}, \
1691     {"$s2",     RTYPE_GP | 18}, \
1692     {"$s3",     RTYPE_GP | 19}, \
1693     {"$s4",     RTYPE_GP | 20}, \
1694     {"$s5",     RTYPE_GP | 21}, \
1695     {"$s6",     RTYPE_GP | 22}, \
1696     {"$s7",     RTYPE_GP | 23}, \
1697     {"$t8",     RTYPE_GP | 24}, \
1698     {"$t9",     RTYPE_GP | 25}, \
1699     {"$k0",     RTYPE_GP | 26}, \
1700     {"$kt0",    RTYPE_GP | 26}, \
1701     {"$k1",     RTYPE_GP | 27}, \
1702     {"$kt1",    RTYPE_GP | 27}, \
1703     {"$gp",     RTYPE_GP | 28}, \
1704     {"$sp",     RTYPE_GP | 29}, \
1705     {"$s8",     RTYPE_GP | 30}, \
1706     {"$fp",     RTYPE_GP | 30}, \
1707     {"$ra",     RTYPE_GP | 31}
1708
1709 #define MIPS16_SPECIAL_REGISTER_NAMES \
1710     {"$pc",     RTYPE_PC | 0}
1711
1712 #define MDMX_VECTOR_REGISTER_NAMES \
1713     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
1714     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
1715     {"$v2",     RTYPE_VEC | 2},  \
1716     {"$v3",     RTYPE_VEC | 3},  \
1717     {"$v4",     RTYPE_VEC | 4},  \
1718     {"$v5",     RTYPE_VEC | 5},  \
1719     {"$v6",     RTYPE_VEC | 6},  \
1720     {"$v7",     RTYPE_VEC | 7},  \
1721     {"$v8",     RTYPE_VEC | 8},  \
1722     {"$v9",     RTYPE_VEC | 9},  \
1723     {"$v10",    RTYPE_VEC | 10}, \
1724     {"$v11",    RTYPE_VEC | 11}, \
1725     {"$v12",    RTYPE_VEC | 12}, \
1726     {"$v13",    RTYPE_VEC | 13}, \
1727     {"$v14",    RTYPE_VEC | 14}, \
1728     {"$v15",    RTYPE_VEC | 15}, \
1729     {"$v16",    RTYPE_VEC | 16}, \
1730     {"$v17",    RTYPE_VEC | 17}, \
1731     {"$v18",    RTYPE_VEC | 18}, \
1732     {"$v19",    RTYPE_VEC | 19}, \
1733     {"$v20",    RTYPE_VEC | 20}, \
1734     {"$v21",    RTYPE_VEC | 21}, \
1735     {"$v22",    RTYPE_VEC | 22}, \
1736     {"$v23",    RTYPE_VEC | 23}, \
1737     {"$v24",    RTYPE_VEC | 24}, \
1738     {"$v25",    RTYPE_VEC | 25}, \
1739     {"$v26",    RTYPE_VEC | 26}, \
1740     {"$v27",    RTYPE_VEC | 27}, \
1741     {"$v28",    RTYPE_VEC | 28}, \
1742     {"$v29",    RTYPE_VEC | 29}, \
1743     {"$v30",    RTYPE_VEC | 30}, \
1744     {"$v31",    RTYPE_VEC | 31}
1745
1746 #define MIPS_DSP_ACCUMULATOR_NAMES \
1747     {"$ac0",    RTYPE_ACC | 0}, \
1748     {"$ac1",    RTYPE_ACC | 1}, \
1749     {"$ac2",    RTYPE_ACC | 2}, \
1750     {"$ac3",    RTYPE_ACC | 3}
1751
1752 static const struct regname reg_names[] = {
1753   GENERIC_REGISTER_NUMBERS,
1754   FPU_REGISTER_NAMES,
1755   FPU_CONDITION_CODE_NAMES,
1756   COPROC_CONDITION_CODE_NAMES,
1757
1758   /* The $txx registers depends on the abi,
1759      these will be added later into the symbol table from
1760      one of the tables below once mips_abi is set after 
1761      parsing of arguments from the command line. */
1762   SYMBOLIC_REGISTER_NAMES,
1763
1764   MIPS16_SPECIAL_REGISTER_NAMES,
1765   MDMX_VECTOR_REGISTER_NAMES,
1766   MIPS_DSP_ACCUMULATOR_NAMES,
1767   {0, 0}
1768 };
1769
1770 static const struct regname reg_names_o32[] = {
1771   O32_SYMBOLIC_REGISTER_NAMES,
1772   {0, 0}
1773 };
1774
1775 static const struct regname reg_names_n32n64[] = {
1776   N32N64_SYMBOLIC_REGISTER_NAMES,
1777   {0, 0}
1778 };
1779
1780 static int
1781 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1782 {
1783   symbolS *symbolP;
1784   char *e;
1785   char save_c;
1786   int reg = -1;
1787
1788   /* Find end of name.  */
1789   e = *s;
1790   if (is_name_beginner (*e))
1791     ++e;
1792   while (is_part_of_name (*e))
1793     ++e;
1794
1795   /* Terminate name.  */
1796   save_c = *e;
1797   *e = '\0';
1798
1799   /* Look for a register symbol.  */
1800   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1801     {
1802       int r = S_GET_VALUE (symbolP);
1803       if (r & types)
1804         reg = r & RNUM_MASK;
1805       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1806         /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
1807         reg = (r & RNUM_MASK) - 2;
1808     }
1809   /* Else see if this is a register defined in an itbl entry.  */
1810   else if ((types & RTYPE_GP) && itbl_have_entries)
1811     {
1812       char *n = *s;
1813       unsigned long r;
1814
1815       if (*n == '$')
1816         ++n;
1817       if (itbl_get_reg_val (n, &r))
1818         reg = r & RNUM_MASK;
1819     }
1820
1821   /* Advance to next token if a register was recognised.  */
1822   if (reg >= 0)
1823     *s = e;
1824   else if (types & RWARN)
1825     as_warn (_("Unrecognized register name `%s'"), *s);
1826
1827   *e = save_c;
1828   if (regnop)
1829     *regnop = reg;
1830   return reg >= 0;
1831 }
1832
1833 /* Return TRUE if opcode MO is valid on the currently selected ISA and
1834    architecture.  Use is_opcode_valid_16 for MIPS16 opcodes.  */
1835
1836 static bfd_boolean
1837 is_opcode_valid (const struct mips_opcode *mo)
1838 {
1839   int isa = mips_opts.isa;
1840   int fp_s, fp_d;
1841
1842   if (mips_opts.ase_mdmx)
1843     isa |= INSN_MDMX;
1844   if (mips_opts.ase_dsp)
1845     isa |= INSN_DSP;
1846   if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
1847     isa |= INSN_DSP64;
1848   if (mips_opts.ase_dspr2)
1849     isa |= INSN_DSPR2;
1850   if (mips_opts.ase_mt)
1851     isa |= INSN_MT;
1852   if (mips_opts.ase_mips3d)
1853     isa |= INSN_MIPS3D;
1854   if (mips_opts.ase_smartmips)
1855     isa |= INSN_SMARTMIPS;
1856
1857   /* Don't accept instructions based on the ISA if the CPU does not implement
1858      all the coprocessor insns. */
1859   if (NO_ISA_COP (mips_opts.arch)
1860       && COP_INSN (mo->pinfo))
1861     isa = 0;
1862
1863   if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
1864     return FALSE;
1865
1866   /* Check whether the instruction or macro requires single-precision or
1867      double-precision floating-point support.  Note that this information is
1868      stored differently in the opcode table for insns and macros.  */
1869   if (mo->pinfo == INSN_MACRO)
1870     {
1871       fp_s = mo->pinfo2 & INSN2_M_FP_S;
1872       fp_d = mo->pinfo2 & INSN2_M_FP_D;
1873     }
1874   else
1875     {
1876       fp_s = mo->pinfo & FP_S;
1877       fp_d = mo->pinfo & FP_D;
1878     }
1879
1880   if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
1881     return FALSE;
1882
1883   if (fp_s && mips_opts.soft_float)
1884     return FALSE;
1885
1886   return TRUE;
1887 }
1888
1889 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
1890    selected ISA and architecture.  */
1891
1892 static bfd_boolean
1893 is_opcode_valid_16 (const struct mips_opcode *mo)
1894 {
1895   return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
1896 }
1897
1898 /* This function is called once, at assembler startup time.  It should set up
1899    all the tables, etc. that the MD part of the assembler will need.  */
1900
1901 void
1902 md_begin (void)
1903 {
1904   const char *retval = NULL;
1905   int i = 0;
1906   int broken = 0;
1907
1908   if (mips_pic != NO_PIC)
1909     {
1910       if (g_switch_seen && g_switch_value != 0)
1911         as_bad (_("-G may not be used in position-independent code"));
1912       g_switch_value = 0;
1913     }
1914
1915   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1916     as_warn (_("Could not set architecture and machine"));
1917
1918   op_hash = hash_new ();
1919
1920   for (i = 0; i < NUMOPCODES;)
1921     {
1922       const char *name = mips_opcodes[i].name;
1923
1924       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1925       if (retval != NULL)
1926         {
1927           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1928                    mips_opcodes[i].name, retval);
1929           /* Probably a memory allocation problem?  Give up now.  */
1930           as_fatal (_("Broken assembler.  No assembly attempted."));
1931         }
1932       do
1933         {
1934           if (mips_opcodes[i].pinfo != INSN_MACRO)
1935             {
1936               if (!validate_mips_insn (&mips_opcodes[i]))
1937                 broken = 1;
1938               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1939                 {
1940                   create_insn (&nop_insn, mips_opcodes + i);
1941                   if (mips_fix_loongson2f_nop)
1942                     nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
1943                   nop_insn.fixed_p = 1;
1944                 }
1945             }
1946           ++i;
1947         }
1948       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1949     }
1950
1951   mips16_op_hash = hash_new ();
1952
1953   i = 0;
1954   while (i < bfd_mips16_num_opcodes)
1955     {
1956       const char *name = mips16_opcodes[i].name;
1957
1958       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1959       if (retval != NULL)
1960         as_fatal (_("internal: can't hash `%s': %s"),
1961                   mips16_opcodes[i].name, retval);
1962       do
1963         {
1964           if (mips16_opcodes[i].pinfo != INSN_MACRO
1965               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1966                   != mips16_opcodes[i].match))
1967             {
1968               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1969                        mips16_opcodes[i].name, mips16_opcodes[i].args);
1970               broken = 1;
1971             }
1972           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1973             {
1974               create_insn (&mips16_nop_insn, mips16_opcodes + i);
1975               mips16_nop_insn.fixed_p = 1;
1976             }
1977           ++i;
1978         }
1979       while (i < bfd_mips16_num_opcodes
1980              && strcmp (mips16_opcodes[i].name, name) == 0);
1981     }
1982
1983   if (broken)
1984     as_fatal (_("Broken assembler.  No assembly attempted."));
1985
1986   /* We add all the general register names to the symbol table.  This
1987      helps us detect invalid uses of them.  */
1988   for (i = 0; reg_names[i].name; i++) 
1989     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1990                                      reg_names[i].num, /* & RNUM_MASK, */
1991                                      &zero_address_frag));
1992   if (HAVE_NEWABI)
1993     for (i = 0; reg_names_n32n64[i].name; i++) 
1994       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1995                                        reg_names_n32n64[i].num, /* & RNUM_MASK, */
1996                                        &zero_address_frag));
1997   else
1998     for (i = 0; reg_names_o32[i].name; i++) 
1999       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
2000                                        reg_names_o32[i].num, /* & RNUM_MASK, */
2001                                        &zero_address_frag));
2002
2003   mips_no_prev_insn ();
2004
2005   mips_gprmask = 0;
2006   mips_cprmask[0] = 0;
2007   mips_cprmask[1] = 0;
2008   mips_cprmask[2] = 0;
2009   mips_cprmask[3] = 0;
2010
2011   /* set the default alignment for the text section (2**2) */
2012   record_alignment (text_section, 2);
2013
2014   bfd_set_gp_size (stdoutput, g_switch_value);
2015
2016 #ifdef OBJ_ELF
2017   if (IS_ELF)
2018     {
2019       /* On a native system other than VxWorks, sections must be aligned
2020          to 16 byte boundaries.  When configured for an embedded ELF
2021          target, we don't bother.  */
2022       if (strncmp (TARGET_OS, "elf", 3) != 0
2023           && strncmp (TARGET_OS, "vxworks", 7) != 0)
2024         {
2025           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2026           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2027           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2028         }
2029
2030       /* Create a .reginfo section for register masks and a .mdebug
2031          section for debugging information.  */
2032       {
2033         segT seg;
2034         subsegT subseg;
2035         flagword flags;
2036         segT sec;
2037
2038         seg = now_seg;
2039         subseg = now_subseg;
2040
2041         /* The ABI says this section should be loaded so that the
2042            running program can access it.  However, we don't load it
2043            if we are configured for an embedded target */
2044         flags = SEC_READONLY | SEC_DATA;
2045         if (strncmp (TARGET_OS, "elf", 3) != 0)
2046           flags |= SEC_ALLOC | SEC_LOAD;
2047
2048         if (mips_abi != N64_ABI)
2049           {
2050             sec = subseg_new (".reginfo", (subsegT) 0);
2051
2052             bfd_set_section_flags (stdoutput, sec, flags);
2053             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2054
2055             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2056           }
2057         else
2058           {
2059             /* The 64-bit ABI uses a .MIPS.options section rather than
2060                .reginfo section.  */
2061             sec = subseg_new (".MIPS.options", (subsegT) 0);
2062             bfd_set_section_flags (stdoutput, sec, flags);
2063             bfd_set_section_alignment (stdoutput, sec, 3);
2064
2065             /* Set up the option header.  */
2066             {
2067               Elf_Internal_Options opthdr;
2068               char *f;
2069
2070               opthdr.kind = ODK_REGINFO;
2071               opthdr.size = (sizeof (Elf_External_Options)
2072                              + sizeof (Elf64_External_RegInfo));
2073               opthdr.section = 0;
2074               opthdr.info = 0;
2075               f = frag_more (sizeof (Elf_External_Options));
2076               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2077                                              (Elf_External_Options *) f);
2078
2079               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2080             }
2081           }
2082
2083         if (ECOFF_DEBUGGING)
2084           {
2085             sec = subseg_new (".mdebug", (subsegT) 0);
2086             (void) bfd_set_section_flags (stdoutput, sec,
2087                                           SEC_HAS_CONTENTS | SEC_READONLY);
2088             (void) bfd_set_section_alignment (stdoutput, sec, 2);
2089           }
2090         else if (mips_flag_pdr)
2091           {
2092             pdr_seg = subseg_new (".pdr", (subsegT) 0);
2093             (void) bfd_set_section_flags (stdoutput, pdr_seg,
2094                                           SEC_READONLY | SEC_RELOC
2095                                           | SEC_DEBUGGING);
2096             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2097           }
2098
2099         subseg_set (seg, subseg);
2100       }
2101     }
2102 #endif /* OBJ_ELF */
2103
2104   if (! ECOFF_DEBUGGING)
2105     md_obj_begin ();
2106
2107   if (mips_fix_vr4120)
2108     init_vr4120_conflicts ();
2109 }
2110
2111 void
2112 md_mips_end (void)
2113 {
2114   if (! ECOFF_DEBUGGING)
2115     md_obj_end ();
2116 }
2117
2118 void
2119 md_assemble (char *str)
2120 {
2121   struct mips_cl_insn insn;
2122   bfd_reloc_code_real_type unused_reloc[3]
2123     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2124
2125   imm_expr.X_op = O_absent;
2126   imm2_expr.X_op = O_absent;
2127   offset_expr.X_op = O_absent;
2128   imm_reloc[0] = BFD_RELOC_UNUSED;
2129   imm_reloc[1] = BFD_RELOC_UNUSED;
2130   imm_reloc[2] = BFD_RELOC_UNUSED;
2131   offset_reloc[0] = BFD_RELOC_UNUSED;
2132   offset_reloc[1] = BFD_RELOC_UNUSED;
2133   offset_reloc[2] = BFD_RELOC_UNUSED;
2134
2135   if (mips_opts.mips16)
2136     mips16_ip (str, &insn);
2137   else
2138     {
2139       mips_ip (str, &insn);
2140       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2141             str, insn.insn_opcode));
2142     }
2143
2144   if (insn_error)
2145     {
2146       as_bad ("%s `%s'", insn_error, str);
2147       return;
2148     }
2149
2150   if (insn.insn_mo->pinfo == INSN_MACRO)
2151     {
2152       macro_start ();
2153       if (mips_opts.mips16)
2154         mips16_macro (&insn);
2155       else
2156         macro (&insn);
2157       macro_end ();
2158     }
2159   else
2160     {
2161       if (imm_expr.X_op != O_absent)
2162         append_insn (&insn, &imm_expr, imm_reloc);
2163       else if (offset_expr.X_op != O_absent)
2164         append_insn (&insn, &offset_expr, offset_reloc);
2165       else
2166         append_insn (&insn, NULL, unused_reloc);
2167     }
2168 }
2169
2170 /* Convenience functions for abstracting away the differences between
2171    MIPS16 and non-MIPS16 relocations.  */
2172
2173 static inline bfd_boolean
2174 mips16_reloc_p (bfd_reloc_code_real_type reloc)
2175 {
2176   switch (reloc)
2177     {
2178     case BFD_RELOC_MIPS16_JMP:
2179     case BFD_RELOC_MIPS16_GPREL:
2180     case BFD_RELOC_MIPS16_GOT16:
2181     case BFD_RELOC_MIPS16_CALL16:
2182     case BFD_RELOC_MIPS16_HI16_S:
2183     case BFD_RELOC_MIPS16_HI16:
2184     case BFD_RELOC_MIPS16_LO16:
2185       return TRUE;
2186
2187     default:
2188       return FALSE;
2189     }
2190 }
2191
2192 static inline bfd_boolean
2193 got16_reloc_p (bfd_reloc_code_real_type reloc)
2194 {
2195   return reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16;
2196 }
2197
2198 static inline bfd_boolean
2199 hi16_reloc_p (bfd_reloc_code_real_type reloc)
2200 {
2201   return reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S;
2202 }
2203
2204 static inline bfd_boolean
2205 lo16_reloc_p (bfd_reloc_code_real_type reloc)
2206 {
2207   return reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16;
2208 }
2209
2210 /* Return true if the given relocation might need a matching %lo().
2211    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2212    need a matching %lo() when applied to local symbols.  */
2213
2214 static inline bfd_boolean
2215 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2216 {
2217   return (HAVE_IN_PLACE_ADDENDS
2218           && (hi16_reloc_p (reloc)
2219               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2220                  all GOT16 relocations evaluate to "G".  */
2221               || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2222 }
2223
2224 /* Return the type of %lo() reloc needed by RELOC, given that
2225    reloc_needs_lo_p.  */
2226
2227 static inline bfd_reloc_code_real_type
2228 matching_lo_reloc (bfd_reloc_code_real_type reloc)
2229 {
2230   return mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16 : BFD_RELOC_LO16;
2231 }
2232
2233 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2234    relocation.  */
2235
2236 static inline bfd_boolean
2237 fixup_has_matching_lo_p (fixS *fixp)
2238 {
2239   return (fixp->fx_next != NULL
2240           && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
2241           && fixp->fx_addsy == fixp->fx_next->fx_addsy
2242           && fixp->fx_offset == fixp->fx_next->fx_offset);
2243 }
2244
2245 /* See whether instruction IP reads register REG.  CLASS is the type
2246    of register.  */
2247
2248 static int
2249 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2250                enum mips_regclass regclass)
2251 {
2252   if (regclass == MIPS16_REG)
2253     {
2254       gas_assert (mips_opts.mips16);
2255       reg = mips16_to_32_reg_map[reg];
2256       regclass = MIPS_GR_REG;
2257     }
2258
2259   /* Don't report on general register ZERO, since it never changes.  */
2260   if (regclass == MIPS_GR_REG && reg == ZERO)
2261     return 0;
2262
2263   if (regclass == MIPS_FP_REG)
2264     {
2265       gas_assert (! mips_opts.mips16);
2266       /* If we are called with either $f0 or $f1, we must check $f0.
2267          This is not optimal, because it will introduce an unnecessary
2268          NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
2269          need to distinguish reading both $f0 and $f1 or just one of
2270          them.  Note that we don't have to check the other way,
2271          because there is no instruction that sets both $f0 and $f1
2272          and requires a delay.  */
2273       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2274           && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2275               == (reg &~ (unsigned) 1)))
2276         return 1;
2277       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2278           && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2279               == (reg &~ (unsigned) 1)))
2280         return 1;
2281       if ((ip->insn_mo->pinfo2 & INSN2_READ_FPR_Z)
2282           && ((EXTRACT_OPERAND (FZ, *ip) & ~(unsigned) 1)
2283               == (reg &~ (unsigned) 1)))
2284         return 1;
2285     }
2286   else if (! mips_opts.mips16)
2287     {
2288       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2289           && EXTRACT_OPERAND (RS, *ip) == reg)
2290         return 1;
2291       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2292           && EXTRACT_OPERAND (RT, *ip) == reg)
2293         return 1;
2294       if ((ip->insn_mo->pinfo2 & INSN2_READ_GPR_D)
2295           && EXTRACT_OPERAND (RD, *ip) == reg)
2296         return 1;
2297       if ((ip->insn_mo->pinfo2 & INSN2_READ_GPR_Z)
2298           && EXTRACT_OPERAND (RZ, *ip) == reg)
2299         return 1;
2300     }
2301   else
2302     {
2303       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2304           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2305         return 1;
2306       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2307           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2308         return 1;
2309       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2310           && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2311               == reg))
2312         return 1;
2313       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2314         return 1;
2315       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2316         return 1;
2317       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2318         return 1;
2319       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2320           && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2321         return 1;
2322     }
2323
2324   return 0;
2325 }
2326
2327 /* This function returns true if modifying a register requires a
2328    delay.  */
2329
2330 static int
2331 reg_needs_delay (unsigned int reg)
2332 {
2333   unsigned long prev_pinfo;
2334
2335   prev_pinfo = history[0].insn_mo->pinfo;
2336   if (! mips_opts.noreorder
2337       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2338            && ! gpr_interlocks)
2339           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2340               && ! cop_interlocks)))
2341     {
2342       /* A load from a coprocessor or from memory.  All load delays
2343          delay the use of general register rt for one instruction.  */
2344       /* Itbl support may require additional care here.  */
2345       know (prev_pinfo & INSN_WRITE_GPR_T);
2346       if (reg == EXTRACT_OPERAND (RT, history[0]))
2347         return 1;
2348     }
2349
2350   return 0;
2351 }
2352
2353 /* Move all labels in insn_labels to the current insertion point.  */
2354
2355 static void
2356 mips_move_labels (void)
2357 {
2358   segment_info_type *si = seg_info (now_seg);
2359   struct insn_label_list *l;
2360   valueT val;
2361
2362   for (l = si->label_list; l != NULL; l = l->next)
2363     {
2364       gas_assert (S_GET_SEGMENT (l->label) == now_seg);
2365       symbol_set_frag (l->label, frag_now);
2366       val = (valueT) frag_now_fix ();
2367       /* mips16 text labels are stored as odd.  */
2368       if (mips_opts.mips16)
2369         ++val;
2370       S_SET_VALUE (l->label, val);
2371     }
2372 }
2373
2374 static bfd_boolean
2375 s_is_linkonce (symbolS *sym, segT from_seg)
2376 {
2377   bfd_boolean linkonce = FALSE;
2378   segT symseg = S_GET_SEGMENT (sym);
2379
2380   if (symseg != from_seg && !S_IS_LOCAL (sym))
2381     {
2382       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2383         linkonce = TRUE;
2384 #ifdef OBJ_ELF
2385       /* The GNU toolchain uses an extension for ELF: a section
2386          beginning with the magic string .gnu.linkonce is a
2387          linkonce section.  */
2388       if (strncmp (segment_name (symseg), ".gnu.linkonce",
2389                    sizeof ".gnu.linkonce" - 1) == 0)
2390         linkonce = TRUE;
2391 #endif
2392     }
2393   return linkonce;
2394 }
2395
2396 /* Mark instruction labels in mips16 mode.  This permits the linker to
2397    handle them specially, such as generating jalx instructions when
2398    needed.  We also make them odd for the duration of the assembly, in
2399    order to generate the right sort of code.  We will make them even
2400    in the adjust_symtab routine, while leaving them marked.  This is
2401    convenient for the debugger and the disassembler.  The linker knows
2402    to make them odd again.  */
2403
2404 static void
2405 mips16_mark_labels (void)
2406 {
2407   segment_info_type *si = seg_info (now_seg);
2408   struct insn_label_list *l;
2409
2410   if (!mips_opts.mips16)
2411     return;
2412
2413   for (l = si->label_list; l != NULL; l = l->next)
2414    {
2415       symbolS *label = l->label;
2416
2417 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2418       if (IS_ELF)
2419         S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2420 #endif
2421       if ((S_GET_VALUE (label) & 1) == 0
2422         /* Don't adjust the address if the label is global or weak, or
2423            in a link-once section, since we'll be emitting symbol reloc
2424            references to it which will be patched up by the linker, and
2425            the final value of the symbol may or may not be MIPS16.  */
2426           && ! S_IS_WEAK (label)
2427           && ! S_IS_EXTERNAL (label)
2428           && ! s_is_linkonce (label, now_seg))
2429         S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2430     }
2431 }
2432
2433 /* End the current frag.  Make it a variant frag and record the
2434    relaxation info.  */
2435
2436 static void
2437 relax_close_frag (void)
2438 {
2439   mips_macro_warning.first_frag = frag_now;
2440   frag_var (rs_machine_dependent, 0, 0,
2441             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2442             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2443
2444   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2445   mips_relax.first_fixup = 0;
2446 }
2447
2448 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2449    See the comment above RELAX_ENCODE for more details.  */
2450
2451 static void
2452 relax_start (symbolS *symbol)
2453 {
2454   gas_assert (mips_relax.sequence == 0);
2455   mips_relax.sequence = 1;
2456   mips_relax.symbol = symbol;
2457 }
2458
2459 /* Start generating the second version of a relaxable sequence.
2460    See the comment above RELAX_ENCODE for more details.  */
2461
2462 static void
2463 relax_switch (void)
2464 {
2465   gas_assert (mips_relax.sequence == 1);
2466   mips_relax.sequence = 2;
2467 }
2468
2469 /* End the current relaxable sequence.  */
2470
2471 static void
2472 relax_end (void)
2473 {
2474   gas_assert (mips_relax.sequence == 2);
2475   relax_close_frag ();
2476   mips_relax.sequence = 0;
2477 }
2478
2479 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2480    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2481    by VR4120 errata.  */
2482
2483 static unsigned int
2484 classify_vr4120_insn (const char *name)
2485 {
2486   if (strncmp (name, "macc", 4) == 0)
2487     return FIX_VR4120_MACC;
2488   if (strncmp (name, "dmacc", 5) == 0)
2489     return FIX_VR4120_DMACC;
2490   if (strncmp (name, "mult", 4) == 0)
2491     return FIX_VR4120_MULT;
2492   if (strncmp (name, "dmult", 5) == 0)
2493     return FIX_VR4120_DMULT;
2494   if (strstr (name, "div"))
2495     return FIX_VR4120_DIV;
2496   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2497     return FIX_VR4120_MTHILO;
2498   return NUM_FIX_VR4120_CLASSES;
2499 }
2500
2501 #define INSN_ERET  0x42000018
2502 #define INSN_DERET 0x4200001f
2503
2504 /* Return the number of instructions that must separate INSN1 and INSN2,
2505    where INSN1 is the earlier instruction.  Return the worst-case value
2506    for any INSN2 if INSN2 is null.  */
2507
2508 static unsigned int
2509 insns_between (const struct mips_cl_insn *insn1,
2510                const struct mips_cl_insn *insn2)
2511 {
2512   unsigned long pinfo1, pinfo2;
2513
2514   /* This function needs to know which pinfo flags are set for INSN2
2515      and which registers INSN2 uses.  The former is stored in PINFO2 and
2516      the latter is tested via INSN2_USES_REG.  If INSN2 is null, PINFO2
2517      will have every flag set and INSN2_USES_REG will always return true.  */
2518   pinfo1 = insn1->insn_mo->pinfo;
2519   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2520
2521 #define INSN2_USES_REG(REG, CLASS) \
2522    (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2523
2524   /* For most targets, write-after-read dependencies on the HI and LO
2525      registers must be separated by at least two instructions.  */
2526   if (!hilo_interlocks)
2527     {
2528       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2529         return 2;
2530       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2531         return 2;
2532     }
2533
2534   /* If we're working around r7000 errata, there must be two instructions
2535      between an mfhi or mflo and any instruction that uses the result.  */
2536   if (mips_7000_hilo_fix
2537       && MF_HILO_INSN (pinfo1)
2538       && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2539     return 2;
2540
2541   /* If we're working around 24K errata, one instruction is required
2542      if an ERET or DERET is followed by a branch instruction.  */
2543   if (mips_fix_24k)
2544     {
2545       if (insn1->insn_opcode == INSN_ERET
2546           || insn1->insn_opcode == INSN_DERET)
2547         {
2548           if (insn2 == NULL
2549               || insn2->insn_opcode == INSN_ERET
2550               || insn2->insn_opcode == INSN_DERET
2551               || (insn2->insn_mo->pinfo
2552                   & (INSN_UNCOND_BRANCH_DELAY
2553                      | INSN_COND_BRANCH_DELAY
2554                      | INSN_COND_BRANCH_LIKELY)) != 0)
2555             return 1;
2556         }
2557     }
2558
2559   /* If working around VR4120 errata, check for combinations that need
2560      a single intervening instruction.  */
2561   if (mips_fix_vr4120)
2562     {
2563       unsigned int class1, class2;
2564
2565       class1 = classify_vr4120_insn (insn1->insn_mo->name);
2566       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2567         {
2568           if (insn2 == NULL)
2569             return 1;
2570           class2 = classify_vr4120_insn (insn2->insn_mo->name);
2571           if (vr4120_conflicts[class1] & (1 << class2))
2572             return 1;
2573         }
2574     }
2575
2576   if (!mips_opts.mips16)
2577     {
2578       /* Check for GPR or coprocessor load delays.  All such delays
2579          are on the RT register.  */
2580       /* Itbl support may require additional care here.  */
2581       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2582           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2583         {
2584           know (pinfo1 & INSN_WRITE_GPR_T);
2585           if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2586             return 1;
2587         }
2588
2589       /* Check for generic coprocessor hazards.
2590
2591          This case is not handled very well.  There is no special
2592          knowledge of CP0 handling, and the coprocessors other than
2593          the floating point unit are not distinguished at all.  */
2594       /* Itbl support may require additional care here. FIXME!
2595          Need to modify this to include knowledge about
2596          user specified delays!  */
2597       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2598                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2599         {
2600           /* Handle cases where INSN1 writes to a known general coprocessor
2601              register.  There must be a one instruction delay before INSN2
2602              if INSN2 reads that register, otherwise no delay is needed.  */
2603           if (pinfo1 & INSN_WRITE_FPR_T)
2604             {
2605               if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2606                 return 1;
2607             }
2608           else if (pinfo1 & INSN_WRITE_FPR_S)
2609             {
2610               if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2611                 return 1;
2612             }
2613           else
2614             {
2615               /* Read-after-write dependencies on the control registers
2616                  require a two-instruction gap.  */
2617               if ((pinfo1 & INSN_WRITE_COND_CODE)
2618                   && (pinfo2 & INSN_READ_COND_CODE))
2619                 return 2;
2620
2621               /* We don't know exactly what INSN1 does.  If INSN2 is
2622                  also a coprocessor instruction, assume there must be
2623                  a one instruction gap.  */
2624               if (pinfo2 & INSN_COP)
2625                 return 1;
2626             }
2627         }
2628
2629       /* Check for read-after-write dependencies on the coprocessor
2630          control registers in cases where INSN1 does not need a general
2631          coprocessor delay.  This means that INSN1 is a floating point
2632          comparison instruction.  */
2633       /* Itbl support may require additional care here.  */
2634       else if (!cop_interlocks
2635                && (pinfo1 & INSN_WRITE_COND_CODE)
2636                && (pinfo2 & INSN_READ_COND_CODE))
2637         return 1;
2638     }
2639
2640 #undef INSN2_USES_REG
2641
2642   return 0;
2643 }
2644
2645 /* Return the number of nops that would be needed to work around the
2646    VR4130 mflo/mfhi errata if instruction INSN immediately followed
2647    the MAX_VR4130_NOPS instructions described by HIST.  */
2648
2649 static int
2650 nops_for_vr4130 (const struct mips_cl_insn *hist,
2651                  const struct mips_cl_insn *insn)
2652 {
2653   int i, j, reg;
2654
2655   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
2656      are not affected by the errata.  */
2657   if (insn != 0
2658       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2659           || strcmp (insn->insn_mo->name, "mtlo") == 0
2660           || strcmp (insn->insn_mo->name, "mthi") == 0))
2661     return 0;
2662
2663   /* Search for the first MFLO or MFHI.  */
2664   for (i = 0; i < MAX_VR4130_NOPS; i++)
2665     if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
2666       {
2667         /* Extract the destination register.  */
2668         if (mips_opts.mips16)
2669           reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, hist[i])];
2670         else
2671           reg = EXTRACT_OPERAND (RD, hist[i]);
2672
2673         /* No nops are needed if INSN reads that register.  */
2674         if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2675           return 0;
2676
2677         /* ...or if any of the intervening instructions do.  */
2678         for (j = 0; j < i; j++)
2679           if (insn_uses_reg (&hist[j], reg, MIPS_GR_REG))
2680             return 0;
2681
2682         return MAX_VR4130_NOPS - i;
2683       }
2684   return 0;
2685 }
2686
2687 #define BASE_REG_EQ(INSN1, INSN2)       \
2688   ((((INSN1) >> OP_SH_RS) & OP_MASK_RS) \
2689       == (((INSN2) >> OP_SH_RS) & OP_MASK_RS))
2690
2691 /* Return the minimum alignment for this store instruction.  */
2692
2693 static int
2694 fix_24k_align_to (const struct mips_opcode *mo)
2695 {
2696   if (strcmp (mo->name, "sh") == 0)
2697     return 2;
2698
2699   if (strcmp (mo->name, "swc1") == 0
2700       || strcmp (mo->name, "swc2") == 0
2701       || strcmp (mo->name, "sw") == 0
2702       || strcmp (mo->name, "sc") == 0
2703       || strcmp (mo->name, "s.s") == 0)
2704     return 4;
2705
2706   if (strcmp (mo->name, "sdc1") == 0
2707       || strcmp (mo->name, "sdc2") == 0
2708       || strcmp (mo->name, "s.d") == 0)
2709     return 8;
2710
2711   /* sb, swl, swr */
2712   return 1;
2713 }
2714
2715 struct fix_24k_store_info
2716   {
2717     /* Immediate offset, if any, for this store instruction.  */
2718     short off;
2719     /* Alignment required by this store instruction.  */
2720     int align_to;
2721     /* True for register offsets.  */
2722     int register_offset;
2723   };
2724
2725 /* Comparison function used by qsort.  */
2726
2727 static int
2728 fix_24k_sort (const void *a, const void *b)
2729 {
2730   const struct fix_24k_store_info *pos1 = a;
2731   const struct fix_24k_store_info *pos2 = b;
2732
2733   return (pos1->off - pos2->off);
2734 }
2735
2736 /* INSN is a store instruction.  Try to record the store information
2737    in STINFO.  Return false if the information isn't known.  */
2738
2739 static bfd_boolean
2740 fix_24k_record_store_info (struct fix_24k_store_info *stinfo,
2741                       const struct mips_cl_insn *insn)
2742 {
2743   /* The instruction must have a known offset.  */
2744   if (!insn->complete_p || !strstr (insn->insn_mo->args, "o("))
2745     return FALSE;
2746
2747   stinfo->off = (insn->insn_opcode >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE;
2748   stinfo->align_to = fix_24k_align_to (insn->insn_mo);
2749   return TRUE;
2750 }
2751
2752 /* 24K Errata: Lost Data on Stores During Refill. 
2753   
2754   Problem: The FSB (fetch store buffer) acts as an intermediate buffer
2755   for the data cache refills and store data. The following describes
2756   the scenario where the store data could be lost.
2757   
2758   * A data cache miss, due to either a load or a store, causing fill
2759     data to be supplied by the memory subsystem
2760   * The first three doublewords of fill data are returned and written
2761     into the cache
2762   * A sequence of four stores occurs in consecutive cycles around the
2763     final doubleword of the fill:
2764   * Store A
2765   * Store B
2766   * Store C
2767   * Zero, One or more instructions
2768   * Store D
2769   
2770   The four stores A-D must be to different doublewords of the line that
2771   is being filled. The fourth instruction in the sequence above permits
2772   the fill of the final doubleword to be transferred from the FSB into
2773   the cache. In the sequence above, the stores may be either integer
2774   (sb, sh, sw, swr, swl, sc) or coprocessor (swc1/swc2, sdc1/sdc2,
2775   swxc1, sdxc1, suxc1) stores, as long as the four stores are to
2776   different doublewords on the line. If the floating point unit is
2777   running in 1:2 mode, it is not possible to create the sequence above
2778   using only floating point store instructions.
2779
2780    In this case, the cache line being filled is incorrectly marked
2781    invalid, thereby losing the data from any store to the line that
2782    occurs between the original miss and the completion of the five
2783    cycle sequence shown above.
2784
2785   The workarounds are:
2786
2787   * Run the data cache in write-through mode.
2788   * Insert a non-store instruction between
2789     Store A and Store B or Store B and Store C.  */
2790   
2791 static int
2792 nops_for_24k (const struct mips_cl_insn *hist,
2793               const struct mips_cl_insn *insn)
2794 {
2795   struct fix_24k_store_info pos[3];
2796   int align, i, base_offset;
2797
2798   /* If INSN is definitely not a store, there's nothing to worry about.  */
2799   if (insn && (insn->insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
2800     return 0;
2801
2802   /* Likewise, the previous instruction wasn't a store.  */
2803   if ((hist[0].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
2804     return 0;
2805
2806   /* If we don't know what came before, assume the worst.  */
2807   if (hist[1].frag == NULL)
2808     return 1;
2809
2810   /* If the instruction was not a store, there's nothing to worry about.  */
2811   if ((hist[1].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
2812     return 0;
2813
2814   /* If we don't know the relationship between the store addresses,
2815      assume the worst.  */
2816   if (insn == NULL
2817       || !BASE_REG_EQ (insn->insn_opcode, hist[0].insn_opcode)
2818       || !BASE_REG_EQ (insn->insn_opcode, hist[1].insn_opcode))
2819     return 1;
2820
2821   if (!fix_24k_record_store_info (&pos[0], insn)
2822       || !fix_24k_record_store_info (&pos[1], &hist[0])
2823       || !fix_24k_record_store_info (&pos[2], &hist[1]))
2824     return 1;
2825
2826   qsort (&pos, 3, sizeof (struct fix_24k_store_info), fix_24k_sort);
2827
2828   /* Pick a value of ALIGN and X such that all offsets are adjusted by
2829      X bytes and such that the base register + X is known to be aligned
2830      to align bytes.  */
2831
2832   if (((insn->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == SP)
2833     align = 8;
2834   else
2835     {
2836       align = pos[0].align_to;
2837       base_offset = pos[0].off;
2838       for (i = 1; i < 3; i++)
2839         if (align < pos[i].align_to)
2840           {
2841             align = pos[i].align_to;
2842             base_offset = pos[i].off;
2843           }
2844       for (i = 0; i < 3; i++)
2845         pos[i].off -= base_offset;
2846     }
2847
2848   pos[0].off &= ~align + 1;
2849   pos[1].off &= ~align + 1;
2850   pos[2].off &= ~align + 1;
2851
2852   /* If any two stores write to the same chunk, they also write to the
2853      same doubleword.  The offsets are still sorted at this point.  */
2854   if (pos[0].off == pos[1].off || pos[1].off == pos[2].off)
2855     return 0;
2856
2857   /* A range of at least 9 bytes is needed for the stores to be in
2858      non-overlapping doublewords.  */
2859   if (pos[2].off - pos[0].off <= 8)
2860     return 0;
2861
2862   if (pos[2].off - pos[1].off >= 24
2863       || pos[1].off - pos[0].off >= 24
2864       || pos[2].off - pos[0].off >= 32)
2865     return 0;
2866
2867   return 1;
2868 }
2869
2870 /* Return the number of nops that would be needed if instruction INSN
2871    immediately followed the MAX_NOPS instructions given by HIST,
2872    where HIST[0] is the most recent instruction.  If INSN is null,
2873    return the worse-case number of nops for any instruction.  */
2874
2875 static int
2876 nops_for_insn (const struct mips_cl_insn *hist,
2877                const struct mips_cl_insn *insn)
2878 {
2879   int i, nops, tmp_nops;
2880
2881   nops = 0;
2882   for (i = 0; i < MAX_DELAY_NOPS; i++)
2883     {
2884       tmp_nops = insns_between (hist + i, insn) - i;
2885       if (tmp_nops > nops)
2886         nops = tmp_nops;
2887     }
2888
2889   if (mips_fix_vr4130)
2890     {
2891       tmp_nops = nops_for_vr4130 (hist, insn);
2892       if (tmp_nops > nops)
2893         nops = tmp_nops;
2894     }
2895
2896   if (mips_fix_24k)
2897     {
2898       tmp_nops = nops_for_24k (hist, insn);
2899       if (tmp_nops > nops)
2900         nops = tmp_nops;
2901     }
2902
2903   return nops;
2904 }
2905
2906 /* The variable arguments provide NUM_INSNS extra instructions that
2907    might be added to HIST.  Return the largest number of nops that
2908    would be needed after the extended sequence.  */
2909
2910 static int
2911 nops_for_sequence (int num_insns, const struct mips_cl_insn *hist, ...)
2912 {
2913   va_list args;
2914   struct mips_cl_insn buffer[MAX_NOPS];
2915   struct mips_cl_insn *cursor;
2916   int nops;
2917
2918   va_start (args, hist);
2919   cursor = buffer + num_insns;
2920   memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
2921   while (cursor > buffer)
2922     *--cursor = *va_arg (args, const struct mips_cl_insn *);
2923
2924   nops = nops_for_insn (buffer, NULL);
2925   va_end (args);
2926   return nops;
2927 }
2928
2929 /* Like nops_for_insn, but if INSN is a branch, take into account the
2930    worst-case delay for the branch target.  */
2931
2932 static int
2933 nops_for_insn_or_target (const struct mips_cl_insn *hist,
2934                          const struct mips_cl_insn *insn)
2935 {
2936   int nops, tmp_nops;
2937
2938   nops = nops_for_insn (hist, insn);
2939   if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2940                               | INSN_COND_BRANCH_DELAY
2941                               | INSN_COND_BRANCH_LIKELY))
2942     {
2943       tmp_nops = nops_for_sequence (2, hist, insn, NOP_INSN);
2944       if (tmp_nops > nops)
2945         nops = tmp_nops;
2946     }
2947   else if (mips_opts.mips16
2948            && (insn->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
2949                                        | MIPS16_INSN_COND_BRANCH)))
2950     {
2951       tmp_nops = nops_for_sequence (1, hist, insn);
2952       if (tmp_nops > nops)
2953         nops = tmp_nops;
2954     }
2955   return nops;
2956 }
2957
2958 /* Fix NOP issue: Replace nops by "or at,at,zero".  */
2959
2960 static void
2961 fix_loongson2f_nop (struct mips_cl_insn * ip)
2962 {
2963   if (strcmp (ip->insn_mo->name, "nop") == 0)
2964     ip->insn_opcode = LOONGSON2F_NOP_INSN;
2965 }
2966
2967 /* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
2968                    jr target pc &= 'hffff_ffff_cfff_ffff.  */
2969
2970 static void
2971 fix_loongson2f_jump (struct mips_cl_insn * ip)
2972 {
2973   if (strcmp (ip->insn_mo->name, "j") == 0
2974       || strcmp (ip->insn_mo->name, "jr") == 0
2975       || strcmp (ip->insn_mo->name, "jalr") == 0)
2976     {
2977       int sreg;
2978       expressionS ep;
2979
2980       if (! mips_opts.at)
2981         return;
2982
2983       sreg = EXTRACT_OPERAND (RS, *ip);
2984       if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
2985         return;
2986
2987       ep.X_op = O_constant;
2988       ep.X_add_number = 0xcfff0000;
2989       macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
2990       ep.X_add_number = 0xffff;
2991       macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
2992       macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
2993     }
2994 }
2995
2996 static void
2997 fix_loongson2f (struct mips_cl_insn * ip)
2998 {
2999   if (mips_fix_loongson2f_nop)
3000     fix_loongson2f_nop (ip);
3001
3002   if (mips_fix_loongson2f_jump)
3003     fix_loongson2f_jump (ip);
3004 }
3005
3006 /* Output an instruction.  IP is the instruction information.
3007    ADDRESS_EXPR is an operand of the instruction to be used with
3008    RELOC_TYPE.  */
3009
3010 static void
3011 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
3012              bfd_reloc_code_real_type *reloc_type)
3013 {
3014   unsigned long prev_pinfo, pinfo;
3015   unsigned long prev_pinfo2, pinfo2;
3016   relax_stateT prev_insn_frag_type = 0;
3017   bfd_boolean relaxed_branch = FALSE;
3018   segment_info_type *si = seg_info (now_seg);
3019
3020   if (mips_fix_loongson2f)
3021     fix_loongson2f (ip);
3022
3023   /* Mark instruction labels in mips16 mode.  */
3024   mips16_mark_labels ();
3025
3026   file_ase_mips16 |= mips_opts.mips16;
3027
3028   prev_pinfo = history[0].insn_mo->pinfo;
3029   prev_pinfo2 = history[0].insn_mo->pinfo2;
3030   pinfo = ip->insn_mo->pinfo;
3031   pinfo2 = ip->insn_mo->pinfo2;
3032
3033   if (address_expr == NULL)
3034     ip->complete_p = 1;
3035   else if (*reloc_type <= BFD_RELOC_UNUSED
3036            && address_expr->X_op == O_constant)
3037     {
3038       unsigned int tmp;
3039
3040       ip->complete_p = 1;
3041       switch (*reloc_type)
3042         {
3043         case BFD_RELOC_32:
3044           ip->insn_opcode |= address_expr->X_add_number;
3045           break;
3046
3047         case BFD_RELOC_MIPS_HIGHEST:
3048           tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
3049           ip->insn_opcode |= tmp & 0xffff;
3050           break;
3051
3052         case BFD_RELOC_MIPS_HIGHER:
3053           tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
3054           ip->insn_opcode |= tmp & 0xffff;
3055           break;
3056
3057         case BFD_RELOC_HI16_S:
3058           tmp = (address_expr->X_add_number + 0x8000) >> 16;
3059           ip->insn_opcode |= tmp & 0xffff;
3060           break;
3061
3062         case BFD_RELOC_HI16:
3063           ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
3064           break;
3065
3066         case BFD_RELOC_UNUSED:
3067         case BFD_RELOC_LO16:
3068         case BFD_RELOC_MIPS_GOT_DISP:
3069           ip->insn_opcode |= address_expr->X_add_number & 0xffff;
3070           break;
3071
3072         case BFD_RELOC_MIPS_JMP:
3073           if ((address_expr->X_add_number & 3) != 0)
3074             as_bad (_("jump to misaligned address (0x%lx)"),
3075                     (unsigned long) address_expr->X_add_number);
3076           ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
3077           ip->complete_p = 0;
3078           break;
3079
3080         case BFD_RELOC_MIPS16_JMP:
3081           if ((address_expr->X_add_number & 3) != 0)
3082             as_bad (_("jump to misaligned address (0x%lx)"),
3083                     (unsigned long) address_expr->X_add_number);
3084           ip->insn_opcode |=
3085             (((address_expr->X_add_number & 0x7c0000) << 3)
3086                | ((address_expr->X_add_number & 0xf800000) >> 7)
3087                | ((address_expr->X_add_number & 0x3fffc) >> 2));
3088           ip->complete_p = 0;
3089           break;
3090
3091         case BFD_RELOC_16_PCREL_S2:
3092           if ((address_expr->X_add_number & 3) != 0)
3093             as_bad (_("branch to misaligned address (0x%lx)"),
3094                     (unsigned long) address_expr->X_add_number);
3095           if (mips_relax_branch)
3096             goto need_reloc;
3097           if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
3098             as_bad (_("branch address range overflow (0x%lx)"),
3099                     (unsigned long) address_expr->X_add_number);
3100           ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
3101           ip->complete_p = 0;
3102           break;
3103
3104         default:
3105           internalError ();
3106         }       
3107     }
3108
3109   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
3110     {
3111       /* There are a lot of optimizations we could do that we don't.
3112          In particular, we do not, in general, reorder instructions.
3113          If you use gcc with optimization, it will reorder
3114          instructions and generally do much more optimization then we
3115          do here; repeating all that work in the assembler would only
3116          benefit hand written assembly code, and does not seem worth
3117          it.  */
3118       int nops = (mips_optimize == 0
3119                   ? nops_for_insn (history, NULL)
3120                   : nops_for_insn_or_target (history, ip));
3121       if (nops > 0)
3122         {
3123           fragS *old_frag;
3124           unsigned long old_frag_offset;
3125           int i;
3126
3127           old_frag = frag_now;
3128           old_frag_offset = frag_now_fix ();
3129
3130           for (i = 0; i < nops; i++)
3131             emit_nop ();
3132
3133           if (listing)
3134             {
3135               listing_prev_line ();
3136               /* We may be at the start of a variant frag.  In case we
3137                  are, make sure there is enough space for the frag
3138                  after the frags created by listing_prev_line.  The
3139                  argument to frag_grow here must be at least as large
3140                  as the argument to all other calls to frag_grow in
3141                  this file.  We don't have to worry about being in the
3142                  middle of a variant frag, because the variants insert
3143                  all needed nop instructions themselves.  */
3144               frag_grow (40);
3145             }
3146
3147           mips_move_labels ();
3148
3149 #ifndef NO_ECOFF_DEBUGGING
3150           if (ECOFF_DEBUGGING)
3151             ecoff_fix_loc (old_frag, old_frag_offset);
3152 #endif
3153         }
3154     }
3155   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
3156     {
3157       /* Work out how many nops in prev_nop_frag are needed by IP.  */
3158       int nops = nops_for_insn_or_target (history, ip);
3159       gas_assert (nops <= prev_nop_frag_holds);
3160
3161       /* Enforce NOPS as a minimum.  */
3162       if (nops > prev_nop_frag_required)
3163         prev_nop_frag_required = nops;
3164
3165       if (prev_nop_frag_holds == prev_nop_frag_required)
3166         {
3167           /* Settle for the current number of nops.  Update the history
3168              accordingly (for the benefit of any future .set reorder code).  */
3169           prev_nop_frag = NULL;
3170           insert_into_history (prev_nop_frag_since,
3171                                prev_nop_frag_holds, NOP_INSN);
3172         }
3173       else
3174         {
3175           /* Allow this instruction to replace one of the nops that was
3176              tentatively added to prev_nop_frag.  */
3177           prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
3178           prev_nop_frag_holds--;
3179           prev_nop_frag_since++;
3180         }
3181     }
3182
3183 #ifdef OBJ_ELF
3184   /* The value passed to dwarf2_emit_insn is the distance between
3185      the beginning of the current instruction and the address that
3186      should be recorded in the debug tables.  For MIPS16 debug info
3187      we want to use ISA-encoded addresses, so we pass -1 for an
3188      address higher by one than the current.  */
3189   dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
3190 #endif
3191
3192   /* Record the frag type before frag_var.  */
3193   if (history[0].frag)
3194     prev_insn_frag_type = history[0].frag->fr_type;
3195
3196   if (address_expr
3197       && *reloc_type == BFD_RELOC_16_PCREL_S2
3198       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
3199           || pinfo & INSN_COND_BRANCH_LIKELY)
3200       && mips_relax_branch
3201       /* Don't try branch relaxation within .set nomacro, or within
3202          .set noat if we use $at for PIC computations.  If it turns
3203          out that the branch was out-of-range, we'll get an error.  */
3204       && !mips_opts.warn_about_macros
3205       && (mips_opts.at || mips_pic == NO_PIC)
3206       /* Don't relax BPOSGE32/64 as they have no complementing branches.  */
3207       && !(ip->insn_mo->membership & (INSN_DSP64 | INSN_DSP))
3208       && !mips_opts.mips16)
3209     {
3210       relaxed_branch = TRUE;
3211       add_relaxed_insn (ip, (relaxed_branch_length
3212                              (NULL, NULL,
3213                               (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
3214                               : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
3215                               : 0)), 4,
3216                         RELAX_BRANCH_ENCODE
3217                         (AT,
3218                          pinfo & INSN_UNCOND_BRANCH_DELAY,
3219                          pinfo & INSN_COND_BRANCH_LIKELY,
3220                          pinfo & INSN_WRITE_GPR_31,
3221                          0),
3222                         address_expr->X_add_symbol,
3223                         address_expr->X_add_number);
3224       *reloc_type = BFD_RELOC_UNUSED;
3225     }
3226   else if (*reloc_type > BFD_RELOC_UNUSED)
3227     {
3228       /* We need to set up a variant frag.  */
3229       gas_assert (mips_opts.mips16 && address_expr != NULL);
3230       add_relaxed_insn (ip, 4, 0,
3231                         RELAX_MIPS16_ENCODE
3232                         (*reloc_type - BFD_RELOC_UNUSED,
3233                          mips16_small, mips16_ext,
3234                          prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
3235                          history[0].mips16_absolute_jump_p),
3236                         make_expr_symbol (address_expr), 0);
3237     }
3238   else if (mips_opts.mips16
3239            && ! ip->use_extend
3240            && *reloc_type != BFD_RELOC_MIPS16_JMP)
3241     {
3242       if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
3243         /* Make sure there is enough room to swap this instruction with
3244            a following jump instruction.  */
3245         frag_grow (6);
3246       add_fixed_insn (ip);
3247     }
3248   else
3249     {
3250       if (mips_opts.mips16
3251           && mips_opts.noreorder
3252           && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
3253         as_warn (_("extended instruction in delay slot"));
3254
3255       if (mips_relax.sequence)
3256         {
3257           /* If we've reached the end of this frag, turn it into a variant
3258              frag and record the information for the instructions we've
3259              written so far.  */
3260           if (frag_room () < 4)
3261             relax_close_frag ();
3262           mips_relax.sizes[mips_relax.sequence - 1] += 4;
3263         }
3264
3265       if (mips_relax.sequence != 2)
3266         mips_macro_warning.sizes[0] += 4;
3267       if (mips_relax.sequence != 1)
3268         mips_macro_warning.sizes[1] += 4;
3269
3270       if (mips_opts.mips16)
3271         {
3272           ip->fixed_p = 1;
3273           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
3274         }
3275       add_fixed_insn (ip);
3276     }
3277
3278   if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
3279     {
3280       if (!ip->complete_p
3281           && *reloc_type < BFD_RELOC_UNUSED)
3282         need_reloc:
3283         {
3284           reloc_howto_type *howto;
3285           int i;
3286
3287           /* In a compound relocation, it is the final (outermost)
3288              operator that determines the relocated field.  */
3289           for (i = 1; i < 3; i++)
3290             if (reloc_type[i] == BFD_RELOC_UNUSED)
3291               break;
3292
3293           howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
3294           if (howto == NULL)
3295             {
3296               /* To reproduce this failure try assembling gas/testsuites/
3297                  gas/mips/mips16-intermix.s with a mips-ecoff targeted
3298                  assembler.  */
3299               as_bad (_("Unsupported MIPS relocation number %d"), reloc_type[i - 1]);
3300               howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
3301             }
3302           
3303           ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
3304                                      bfd_get_reloc_size (howto),
3305                                      address_expr,
3306                                      reloc_type[0] == BFD_RELOC_16_PCREL_S2,
3307                                      reloc_type[0]);
3308
3309           /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
3310           if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
3311               && ip->fixp[0]->fx_addsy)
3312             *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
3313
3314           /* These relocations can have an addend that won't fit in
3315              4 octets for 64bit assembly.  */
3316           if (HAVE_64BIT_GPRS
3317               && ! howto->partial_inplace
3318               && (reloc_type[0] == BFD_RELOC_16
3319                   || reloc_type[0] == BFD_RELOC_32
3320                   || reloc_type[0] == BFD_RELOC_MIPS_JMP
3321                   || reloc_type[0] == BFD_RELOC_GPREL16
3322                   || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
3323                   || reloc_type[0] == BFD_RELOC_GPREL32
3324                   || reloc_type[0] == BFD_RELOC_64
3325                   || reloc_type[0] == BFD_RELOC_CTOR
3326                   || reloc_type[0] == BFD_RELOC_MIPS_SUB
3327                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
3328                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
3329                   || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
3330                   || reloc_type[0] == BFD_RELOC_MIPS_REL16
3331                   || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
3332                   || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
3333                   || hi16_reloc_p (reloc_type[0])
3334                   || lo16_reloc_p (reloc_type[0])))
3335             ip->fixp[0]->fx_no_overflow = 1;
3336
3337           if (mips_relax.sequence)
3338             {
3339               if (mips_relax.first_fixup == 0)
3340                 mips_relax.first_fixup = ip->fixp[0];
3341             }
3342           else if (reloc_needs_lo_p (*reloc_type))
3343             {
3344               struct mips_hi_fixup *hi_fixup;
3345
3346               /* Reuse the last entry if it already has a matching %lo.  */
3347               hi_fixup = mips_hi_fixup_list;
3348               if (hi_fixup == 0
3349                   || !fixup_has_matching_lo_p (hi_fixup->fixp))
3350                 {
3351                   hi_fixup = ((struct mips_hi_fixup *)
3352                               xmalloc (sizeof (struct mips_hi_fixup)));
3353                   hi_fixup->next = mips_hi_fixup_list;
3354                   mips_hi_fixup_list = hi_fixup;
3355                 }
3356               hi_fixup->fixp = ip->fixp[0];
3357               hi_fixup->seg = now_seg;
3358             }
3359
3360           /* Add fixups for the second and third relocations, if given.
3361              Note that the ABI allows the second relocation to be
3362              against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
3363              moment we only use RSS_UNDEF, but we could add support
3364              for the others if it ever becomes necessary.  */
3365           for (i = 1; i < 3; i++)
3366             if (reloc_type[i] != BFD_RELOC_UNUSED)
3367               {
3368                 ip->fixp[i] = fix_new (ip->frag, ip->where,
3369                                        ip->fixp[0]->fx_size, NULL, 0,
3370                                        FALSE, reloc_type[i]);
3371
3372                 /* Use fx_tcbit to mark compound relocs.  */
3373                 ip->fixp[0]->fx_tcbit = 1;
3374                 ip->fixp[i]->fx_tcbit = 1;
3375               }
3376         }
3377     }
3378   install_insn (ip);
3379
3380   /* Update the register mask information.  */
3381   if (! mips_opts.mips16)
3382     {
3383       if ((pinfo & INSN_WRITE_GPR_D) || (pinfo2 & INSN2_READ_GPR_D))
3384         mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
3385       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
3386         mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
3387       if (pinfo & INSN_READ_GPR_S)
3388         mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
3389       if (pinfo & INSN_WRITE_GPR_31)
3390         mips_gprmask |= 1 << RA;
3391       if (pinfo2 & (INSN2_WRITE_GPR_Z | INSN2_READ_GPR_Z))
3392         mips_gprmask |= 1 << EXTRACT_OPERAND (RZ, *ip);
3393       if (pinfo & INSN_WRITE_FPR_D)
3394         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
3395       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
3396         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
3397       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
3398         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
3399       if ((pinfo & INSN_READ_FPR_R) != 0)
3400         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
3401       if (pinfo2 & (INSN2_WRITE_FPR_Z | INSN2_READ_FPR_Z))
3402         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FZ, *ip);
3403       if (pinfo & INSN_COP)
3404         {
3405           /* We don't keep enough information to sort these cases out.
3406              The itbl support does keep this information however, although
3407              we currently don't support itbl fprmats as part of the cop
3408              instruction.  May want to add this support in the future.  */
3409         }
3410       /* Never set the bit for $0, which is always zero.  */
3411       mips_gprmask &= ~1 << 0;
3412     }
3413   else
3414     {
3415       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
3416         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
3417       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
3418         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
3419       if (pinfo & MIPS16_INSN_WRITE_Z)
3420         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
3421       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
3422         mips_gprmask |= 1 << TREG;
3423       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
3424         mips_gprmask |= 1 << SP;
3425       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
3426         mips_gprmask |= 1 << RA;
3427       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3428         mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3429       if (pinfo & MIPS16_INSN_READ_Z)
3430         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
3431       if (pinfo & MIPS16_INSN_READ_GPR_X)
3432         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3433     }
3434
3435   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
3436     {
3437       /* Filling the branch delay slot is more complex.  We try to
3438          switch the branch with the previous instruction, which we can
3439          do if the previous instruction does not set up a condition
3440          that the branch tests and if the branch is not itself the
3441          target of any branch.  */
3442       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
3443           || (pinfo & INSN_COND_BRANCH_DELAY))
3444         {
3445           if (mips_optimize < 2
3446               /* If we have seen .set volatile or .set nomove, don't
3447                  optimize.  */
3448               || mips_opts.nomove != 0
3449               /* We can't swap if the previous instruction's position
3450                  is fixed.  */
3451               || history[0].fixed_p
3452               /* If the previous previous insn was in a .set
3453                  noreorder, we can't swap.  Actually, the MIPS
3454                  assembler will swap in this situation.  However, gcc
3455                  configured -with-gnu-as will generate code like
3456                    .set noreorder
3457                    lw   $4,XXX
3458                    .set reorder
3459                    INSN
3460                    bne  $4,$0,foo
3461                  in which we can not swap the bne and INSN.  If gcc is
3462                  not configured -with-gnu-as, it does not output the
3463                  .set pseudo-ops.  */
3464               || history[1].noreorder_p
3465               /* If the branch is itself the target of a branch, we
3466                  can not swap.  We cheat on this; all we check for is
3467                  whether there is a label on this instruction.  If
3468                  there are any branches to anything other than a
3469                  label, users must use .set noreorder.  */
3470               || si->label_list != NULL
3471               /* If the previous instruction is in a variant frag
3472                  other than this branch's one, we cannot do the swap.
3473                  This does not apply to the mips16, which uses variant
3474                  frags for different purposes.  */
3475               || (! mips_opts.mips16
3476                   && prev_insn_frag_type == rs_machine_dependent)
3477               /* Check for conflicts between the branch and the instructions
3478                  before the candidate delay slot.  */
3479               || nops_for_insn (history + 1, ip) > 0
3480               /* Check for conflicts between the swapped sequence and the
3481                  target of the branch.  */
3482               || nops_for_sequence (2, history + 1, ip, history) > 0
3483               /* We do not swap with a trap instruction, since it
3484                  complicates trap handlers to have the trap
3485                  instruction be in a delay slot.  */
3486               || (prev_pinfo & INSN_TRAP)
3487               /* If the branch reads a register that the previous
3488                  instruction sets, we can not swap.  */
3489               || (! mips_opts.mips16
3490                   && (prev_pinfo & INSN_WRITE_GPR_T)
3491                   && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
3492                                     MIPS_GR_REG))
3493               || (! mips_opts.mips16
3494                   && (prev_pinfo & INSN_WRITE_GPR_D)
3495                   && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
3496                                     MIPS_GR_REG))
3497               || (! mips_opts.mips16
3498                   && (prev_pinfo2 & INSN2_WRITE_GPR_Z)
3499                   && insn_uses_reg (ip, EXTRACT_OPERAND (RZ, history[0]),
3500                                     MIPS_GR_REG))
3501               || (mips_opts.mips16
3502                   && (((prev_pinfo & MIPS16_INSN_WRITE_X)
3503                        && (insn_uses_reg
3504                            (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3505                             MIPS16_REG)))
3506                       || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
3507                           && (insn_uses_reg
3508                               (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3509                                MIPS16_REG)))
3510                       || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
3511                           && (insn_uses_reg
3512                               (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3513                                MIPS16_REG)))
3514                       || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3515                           && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3516                       || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3517                           && insn_uses_reg (ip, RA, MIPS_GR_REG))
3518                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3519                           && insn_uses_reg (ip,
3520                                             MIPS16OP_EXTRACT_REG32R
3521                                               (history[0].insn_opcode),
3522                                             MIPS_GR_REG))))
3523               /* If the branch writes a register that the previous
3524                  instruction sets, we can not swap (we know that
3525                  branches write only to RD or to $31).  */
3526               || (! mips_opts.mips16
3527                   && (prev_pinfo & INSN_WRITE_GPR_T)
3528                   && (((pinfo & INSN_WRITE_GPR_D)
3529                        && (EXTRACT_OPERAND (RT, history[0])
3530                            == EXTRACT_OPERAND (RD, *ip)))
3531                       || ((pinfo & INSN_WRITE_GPR_31)
3532                           && EXTRACT_OPERAND (RT, history[0]) == RA)))
3533               || (! mips_opts.mips16
3534                   && (prev_pinfo & INSN_WRITE_GPR_D)
3535                   && (((pinfo & INSN_WRITE_GPR_D)
3536                        && (EXTRACT_OPERAND (RD, history[0])
3537                            == EXTRACT_OPERAND (RD, *ip)))
3538                       || ((pinfo & INSN_WRITE_GPR_31)
3539                           && EXTRACT_OPERAND (RD, history[0]) == RA)))
3540               || (mips_opts.mips16
3541                   && (pinfo & MIPS16_INSN_WRITE_31)
3542                   && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3543                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3544                           && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3545                               == RA))))
3546               /* If the branch writes a register that the previous
3547                  instruction reads, we can not swap (we know that
3548                  branches only write to RD or to $31).  */
3549               || (! mips_opts.mips16
3550                   && (pinfo & INSN_WRITE_GPR_D)
3551                   && insn_uses_reg (&history[0],
3552                                     EXTRACT_OPERAND (RD, *ip),
3553                                     MIPS_GR_REG))
3554               || (! mips_opts.mips16
3555                   && (pinfo & INSN_WRITE_GPR_31)
3556                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3557               || (mips_opts.mips16
3558                   && (pinfo & MIPS16_INSN_WRITE_31)
3559                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3560               /* If one instruction sets a condition code and the
3561                  other one uses a condition code, we can not swap.  */
3562               || ((pinfo & INSN_READ_COND_CODE)
3563                   && (prev_pinfo & INSN_WRITE_COND_CODE))
3564               || ((pinfo & INSN_WRITE_COND_CODE)
3565                   && (prev_pinfo & INSN_READ_COND_CODE))
3566               /* If the previous instruction uses the PC, we can not
3567                  swap.  */
3568               || (mips_opts.mips16
3569                   && (prev_pinfo & MIPS16_INSN_READ_PC))
3570               /* If the previous instruction had a fixup in mips16
3571                  mode, we can not swap.  This normally means that the
3572                  previous instruction was a 4 byte branch anyhow.  */
3573               || (mips_opts.mips16 && history[0].fixp[0])
3574               /* If the previous instruction is a sync, sync.l, or
3575                  sync.p, we can not swap.  */
3576               || (prev_pinfo & INSN_SYNC)
3577               /* If the previous instruction is an ERET or
3578                  DERET, avoid the swap.  */
3579               || (history[0].insn_opcode == INSN_ERET)
3580               || (history[0].insn_opcode == INSN_DERET))
3581             {
3582               if (mips_opts.mips16
3583                   && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3584                   && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3585                   && ISA_SUPPORTS_MIPS16E)
3586                 {
3587                   /* Convert MIPS16 jr/jalr into a "compact" jump.  */
3588                   ip->insn_opcode |= 0x0080;
3589                   install_insn (ip);
3590                   insert_into_history (0, 1, ip);
3591                 } 
3592               else
3593                 {
3594                   /* We could do even better for unconditional branches to
3595                      portions of this object file; we could pick up the
3596                      instruction at the destination, put it in the delay
3597                      slot, and bump the destination address.  */
3598                   insert_into_history (0, 1, ip);
3599                   emit_nop ();
3600                 }
3601                 
3602               if (mips_relax.sequence)
3603                 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3604             }
3605           else
3606             {
3607               /* It looks like we can actually do the swap.  */
3608               struct mips_cl_insn delay = history[0];
3609               if (mips_opts.mips16)
3610                 {
3611                   know (delay.frag == ip->frag);
3612                   move_insn (ip, delay.frag, delay.where);
3613                   move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3614                 }
3615               else if (relaxed_branch)
3616                 {
3617                   /* Add the delay slot instruction to the end of the
3618                      current frag and shrink the fixed part of the
3619                      original frag.  If the branch occupies the tail of
3620                      the latter, move it backwards to cover the gap.  */
3621                   delay.frag->fr_fix -= 4;
3622                   if (delay.frag == ip->frag)
3623                     move_insn (ip, ip->frag, ip->where - 4);
3624                   add_fixed_insn (&delay);
3625                 }
3626               else
3627                 {
3628                   move_insn (&delay, ip->frag, ip->where);
3629                   move_insn (ip, history[0].frag, history[0].where);
3630                 }
3631               history[0] = *ip;
3632               delay.fixed_p = 1;
3633               insert_into_history (0, 1, &delay);
3634             }
3635
3636           /* If that was an unconditional branch, forget the previous
3637              insn information.  */
3638           if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3639             {
3640               mips_no_prev_insn ();
3641             }
3642         }
3643       else if (pinfo & INSN_COND_BRANCH_LIKELY)
3644         {
3645           /* We don't yet optimize a branch likely.  What we should do
3646              is look at the target, copy the instruction found there
3647              into the delay slot, and increment the branch to jump to
3648              the next instruction.  */
3649           insert_into_history (0, 1, ip);
3650           emit_nop ();
3651         }
3652       else
3653         insert_into_history (0, 1, ip);
3654     }
3655   else
3656     insert_into_history (0, 1, ip);
3657
3658   /* We just output an insn, so the next one doesn't have a label.  */
3659   mips_clear_insn_labels ();
3660 }
3661
3662 /* Forget that there was any previous instruction or label.  */
3663
3664 static void
3665 mips_no_prev_insn (void)
3666 {
3667   prev_nop_frag = NULL;
3668   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3669   mips_clear_insn_labels ();
3670 }
3671
3672 /* This function must be called before we emit something other than
3673    instructions.  It is like mips_no_prev_insn except that it inserts
3674    any NOPS that might be needed by previous instructions.  */
3675
3676 void
3677 mips_emit_delays (void)
3678 {
3679   if (! mips_opts.noreorder)
3680     {
3681       int nops = nops_for_insn (history, NULL);
3682       if (nops > 0)
3683         {
3684           while (nops-- > 0)
3685             add_fixed_insn (NOP_INSN);
3686           mips_move_labels ();
3687         }
3688     }
3689   mips_no_prev_insn ();
3690 }
3691
3692 /* Start a (possibly nested) noreorder block.  */
3693
3694 static void
3695 start_noreorder (void)
3696 {
3697   if (mips_opts.noreorder == 0)
3698     {
3699       unsigned int i;
3700       int nops;
3701
3702       /* None of the instructions before the .set noreorder can be moved.  */
3703       for (i = 0; i < ARRAY_SIZE (history); i++)
3704         history[i].fixed_p = 1;
3705
3706       /* Insert any nops that might be needed between the .set noreorder
3707          block and the previous instructions.  We will later remove any
3708          nops that turn out not to be needed.  */
3709       nops = nops_for_insn (history, NULL);
3710       if (nops > 0)
3711         {
3712           if (mips_optimize != 0)
3713             {
3714               /* Record the frag which holds the nop instructions, so
3715                  that we can remove them if we don't need them.  */
3716               frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3717               prev_nop_frag = frag_now;
3718               prev_nop_frag_holds = nops;
3719               prev_nop_frag_required = 0;
3720               prev_nop_frag_since = 0;
3721             }
3722
3723           for (; nops > 0; --nops)
3724             add_fixed_insn (NOP_INSN);
3725
3726           /* Move on to a new frag, so that it is safe to simply
3727              decrease the size of prev_nop_frag.  */
3728           frag_wane (frag_now);
3729           frag_new (0);
3730           mips_move_labels ();
3731         }
3732       mips16_mark_labels ();
3733       mips_clear_insn_labels ();
3734     }
3735   mips_opts.noreorder++;
3736   mips_any_noreorder = 1;
3737 }
3738
3739 /* End a nested noreorder block.  */
3740
3741 static void
3742 end_noreorder (void)
3743 {
3744
3745   mips_opts.noreorder--;
3746   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3747     {
3748       /* Commit to inserting prev_nop_frag_required nops and go back to
3749          handling nop insertion the .set reorder way.  */
3750       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3751                                 * (mips_opts.mips16 ? 2 : 4));
3752       insert_into_history (prev_nop_frag_since,
3753                            prev_nop_frag_required, NOP_INSN);
3754       prev_nop_frag = NULL;
3755     }
3756 }
3757
3758 /* Set up global variables for the start of a new macro.  */
3759
3760 static void
3761 macro_start (void)
3762 {
3763   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3764   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3765                                      && (history[0].insn_mo->pinfo
3766                                          & (INSN_UNCOND_BRANCH_DELAY
3767                                             | INSN_COND_BRANCH_DELAY
3768                                             | INSN_COND_BRANCH_LIKELY)) != 0);
3769 }
3770
3771 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3772    for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
3773    RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
3774
3775 static const char *
3776 macro_warning (relax_substateT subtype)
3777 {
3778   if (subtype & RELAX_DELAY_SLOT)
3779     return _("Macro instruction expanded into multiple instructions"
3780              " in a branch delay slot");
3781   else if (subtype & RELAX_NOMACRO)
3782     return _("Macro instruction expanded into multiple instructions");
3783   else
3784     return 0;
3785 }
3786
3787 /* Finish up a macro.  Emit warnings as appropriate.  */
3788
3789 static void
3790 macro_end (void)
3791 {
3792   if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3793     {
3794       relax_substateT subtype;
3795
3796       /* Set up the relaxation warning flags.  */
3797       subtype = 0;
3798       if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3799         subtype |= RELAX_SECOND_LONGER;
3800       if (mips_opts.warn_about_macros)
3801         subtype |= RELAX_NOMACRO;
3802       if (mips_macro_warning.delay_slot_p)
3803         subtype |= RELAX_DELAY_SLOT;
3804
3805       if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3806         {
3807           /* Either the macro has a single implementation or both
3808              implementations are longer than 4 bytes.  Emit the
3809              warning now.  */
3810           const char *msg = macro_warning (subtype);
3811           if (msg != 0)
3812             as_warn ("%s", msg);
3813         }
3814       else
3815         {
3816           /* One implementation might need a warning but the other
3817              definitely doesn't.  */
3818           mips_macro_warning.first_frag->fr_subtype |= subtype;
3819         }
3820     }
3821 }
3822
3823 /* Read a macro's relocation codes from *ARGS and store them in *R.
3824    The first argument in *ARGS will be either the code for a single
3825    relocation or -1 followed by the three codes that make up a
3826    composite relocation.  */
3827
3828 static void
3829 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3830 {
3831   int i, next;
3832
3833   next = va_arg (*args, int);
3834   if (next >= 0)
3835     r[0] = (bfd_reloc_code_real_type) next;
3836   else
3837     for (i = 0; i < 3; i++)
3838       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3839 }
3840
3841 /* Build an instruction created by a macro expansion.  This is passed
3842    a pointer to the count of instructions created so far, an
3843    expression, the name of the instruction to build, an operand format
3844    string, and corresponding arguments.  */
3845
3846 static void
3847 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3848 {
3849   const struct mips_opcode *mo;
3850   struct mips_cl_insn insn;
3851   bfd_reloc_code_real_type r[3];
3852   va_list args;
3853
3854   va_start (args, fmt);
3855
3856   if (mips_opts.mips16)
3857     {
3858       mips16_macro_build (ep, name, fmt, &args);
3859       va_end (args);
3860       return;
3861     }
3862
3863   r[0] = BFD_RELOC_UNUSED;
3864   r[1] = BFD_RELOC_UNUSED;
3865   r[2] = BFD_RELOC_UNUSED;
3866   mo = (struct mips_opcode *) hash_find (op_hash, name);
3867   gas_assert (mo);
3868   gas_assert (strcmp (name, mo->name) == 0);
3869
3870   while (1)
3871     {
3872       /* Search until we get a match for NAME.  It is assumed here that
3873          macros will never generate MDMX, MIPS-3D, or MT instructions.  */
3874       if (strcmp (fmt, mo->args) == 0
3875           && mo->pinfo != INSN_MACRO
3876           && is_opcode_valid (mo))
3877         break;
3878
3879       ++mo;
3880       gas_assert (mo->name);
3881       gas_assert (strcmp (name, mo->name) == 0);
3882     }
3883
3884   create_insn (&insn, mo);
3885   for (;;)
3886     {
3887       switch (*fmt++)
3888         {
3889         case '\0':
3890           break;
3891
3892         case ',':
3893         case '(':
3894         case ')':
3895           continue;
3896
3897         case '+':
3898           switch (*fmt++)
3899             {
3900             case 'A':
3901             case 'E':
3902               INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3903               continue;
3904
3905             case 'B':
3906             case 'F':
3907               /* Note that in the macro case, these arguments are already
3908                  in MSB form.  (When handling the instruction in the
3909                  non-macro case, these arguments are sizes from which
3910                  MSB values must be calculated.)  */
3911               INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3912               continue;
3913
3914             case 'C':
3915             case 'G':
3916             case 'H':
3917               /* Note that in the macro case, these arguments are already
3918                  in MSBD form.  (When handling the instruction in the
3919                  non-macro case, these arguments are sizes from which
3920                  MSBD values must be calculated.)  */
3921               INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3922               continue;
3923
3924             case 'Q':
3925               INSERT_OPERAND (SEQI, insn, va_arg (args, int));
3926               continue;
3927
3928             default:
3929               internalError ();
3930             }
3931           continue;
3932
3933         case '2':
3934           INSERT_OPERAND (BP, insn, va_arg (args, int));
3935           continue;
3936
3937         case 't':
3938         case 'w':
3939         case 'E':
3940           INSERT_OPERAND (RT, insn, va_arg (args, int));
3941           continue;
3942
3943         case 'c':
3944           INSERT_OPERAND (CODE, insn, va_arg (args, int));
3945           continue;
3946
3947         case 'T':
3948         case 'W':
3949           INSERT_OPERAND (FT, insn, va_arg (args, int));
3950           continue;
3951
3952         case 'd':
3953         case 'G':
3954         case 'K':
3955           INSERT_OPERAND (RD, insn, va_arg (args, int));
3956           continue;
3957
3958         case 'U':
3959           {
3960             int tmp = va_arg (args, int);
3961
3962             INSERT_OPERAND (RT, insn, tmp);
3963             INSERT_OPERAND (RD, insn, tmp);
3964             continue;
3965           }
3966
3967         case 'V':
3968         case 'S':
3969           INSERT_OPERAND (FS, insn, va_arg (args, int));
3970           continue;
3971
3972         case 'z':
3973           continue;
3974
3975         case '<':
3976           INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3977           continue;
3978
3979         case 'D':
3980           INSERT_OPERAND (FD, insn, va_arg (args, int));
3981           continue;
3982
3983         case 'B':
3984           INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3985           continue;
3986
3987         case 'J':
3988           INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3989           continue;
3990
3991         case 'q':
3992           INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3993           continue;
3994
3995         case 'b':
3996         case 's':
3997         case 'r':
3998         case 'v':
3999           INSERT_OPERAND (RS, insn, va_arg (args, int));
4000           continue;
4001
4002         case 'i':
4003         case 'j':
4004           macro_read_relocs (&args, r);
4005           gas_assert (*r == BFD_RELOC_GPREL16
4006                       || *r == BFD_RELOC_MIPS_HIGHER
4007                       || *r == BFD_RELOC_HI16_S
4008                       || *r == BFD_RELOC_LO16
4009                       || *r == BFD_RELOC_MIPS_GOT_OFST);
4010           continue;
4011
4012         case 'o':
4013           macro_read_relocs (&args, r);
4014           continue;
4015
4016         case 'u':
4017           macro_read_relocs (&args, r);
4018           gas_assert (ep != NULL
4019                       && (ep->X_op == O_constant
4020                           || (ep->X_op == O_symbol
4021                               && (*r == BFD_RELOC_MIPS_HIGHEST
4022                                   || *r == BFD_RELOC_HI16_S
4023                                   || *r == BFD_RELOC_HI16
4024                                   || *r == BFD_RELOC_GPREL16
4025                                   || *r == BFD_RELOC_MIPS_GOT_HI16
4026                                   || *r == BFD_RELOC_MIPS_CALL_HI16))));
4027           continue;
4028
4029         case 'p':
4030           gas_assert (ep != NULL);
4031
4032           /*
4033            * This allows macro() to pass an immediate expression for
4034            * creating short branches without creating a symbol.
4035            *
4036            * We don't allow branch relaxation for these branches, as
4037            * they should only appear in ".set nomacro" anyway.
4038            */
4039           if (ep->X_op == O_constant)
4040             {
4041               if ((ep->X_add_number & 3) != 0)
4042                 as_bad (_("branch to misaligned address (0x%lx)"),
4043                         (unsigned long) ep->X_add_number);
4044               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
4045                 as_bad (_("branch address range overflow (0x%lx)"),
4046                         (unsigned long) ep->X_add_number);
4047               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
4048               ep = NULL;
4049             }
4050           else
4051             *r = BFD_RELOC_16_PCREL_S2;
4052           continue;
4053
4054         case 'a':
4055           gas_assert (ep != NULL);
4056           *r = BFD_RELOC_MIPS_JMP;
4057           continue;
4058
4059         case 'C':
4060           INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
4061           continue;
4062
4063         case 'k':
4064           INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
4065           continue;
4066
4067         default:
4068           internalError ();
4069         }
4070       break;
4071     }
4072   va_end (args);
4073   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
4074
4075   append_insn (&insn, ep, r);
4076 }
4077
4078 static void
4079 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
4080                     va_list *args)
4081 {
4082   struct mips_opcode *mo;
4083   struct mips_cl_insn insn;
4084   bfd_reloc_code_real_type r[3]
4085     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
4086
4087   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
4088   gas_assert (mo);
4089   gas_assert (strcmp (name, mo->name) == 0);
4090
4091   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
4092     {
4093       ++mo;
4094       gas_assert (mo->name);
4095       gas_assert (strcmp (name, mo->name) == 0);
4096     }
4097
4098   create_insn (&insn, mo);
4099   for (;;)
4100     {
4101       int c;
4102
4103       c = *fmt++;
4104       switch (c)
4105         {
4106         case '\0':
4107           break;
4108
4109         case ',':
4110         case '(':
4111         case ')':
4112           continue;
4113
4114         case 'y':
4115         case 'w':
4116           MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
4117           continue;
4118
4119         case 'x':
4120         case 'v':
4121           MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
4122           continue;
4123
4124         case 'z':
4125           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
4126           continue;
4127
4128         case 'Z':
4129           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
4130           continue;
4131
4132         case '0':
4133         case 'S':
4134         case 'P':
4135         case 'R':
4136           continue;
4137
4138         case 'X':
4139           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
4140           continue;
4141
4142         case 'Y':
4143           {
4144             int regno;
4145
4146             regno = va_arg (*args, int);
4147             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
4148             MIPS16_INSERT_OPERAND (REG32R, insn, regno);
4149           }
4150           continue;
4151
4152         case '<':
4153         case '>':
4154         case '4':
4155         case '5':
4156         case 'H':
4157         case 'W':
4158         case 'D':
4159         case 'j':
4160         case '8':
4161         case 'V':
4162         case 'C':
4163         case 'U':
4164         case 'k':
4165         case 'K':
4166         case 'p':
4167         case 'q':
4168           {
4169             gas_assert (ep != NULL);
4170
4171             if (ep->X_op != O_constant)
4172               *r = (int) BFD_RELOC_UNUSED + c;
4173             else
4174               {
4175                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
4176                               FALSE, &insn.insn_opcode, &insn.use_extend,
4177                               &insn.extend);
4178                 ep = NULL;
4179                 *r = BFD_RELOC_UNUSED;
4180               }
4181           }
4182           continue;
4183
4184         case '6':
4185           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
4186           continue;
4187         }
4188
4189       break;
4190     }
4191
4192   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
4193
4194   append_insn (&insn, ep, r);
4195 }
4196
4197 /*
4198  * Sign-extend 32-bit mode constants that have bit 31 set and all
4199  * higher bits unset.
4200  */
4201 static void
4202 normalize_constant_expr (expressionS *ex)
4203 {
4204   if (ex->X_op == O_constant
4205       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
4206     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
4207                         - 0x80000000);
4208 }
4209
4210 /*
4211  * Sign-extend 32-bit mode address offsets that have bit 31 set and
4212  * all higher bits unset.
4213  */
4214 static void
4215 normalize_address_expr (expressionS *ex)
4216 {
4217   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
4218         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
4219       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
4220     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
4221                         - 0x80000000);
4222 }
4223
4224 /*
4225  * Generate a "jalr" instruction with a relocation hint to the called
4226  * function.  This occurs in NewABI PIC code.
4227  */
4228 static void
4229 macro_build_jalr (expressionS *ep)
4230 {
4231   char *f = NULL;
4232
4233   if (MIPS_JALR_HINT_P (ep))
4234     {
4235       frag_grow (8);
4236       f = frag_more (0);
4237     }
4238   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
4239   if (MIPS_JALR_HINT_P (ep))
4240     fix_new_exp (frag_now, f - frag_now->fr_literal,
4241                  4, ep, FALSE, BFD_RELOC_MIPS_JALR);
4242 }
4243
4244 /*
4245  * Generate a "lui" instruction.
4246  */
4247 static void
4248 macro_build_lui (expressionS *ep, int regnum)
4249 {
4250   expressionS high_expr;
4251   const struct mips_opcode *mo;
4252   struct mips_cl_insn insn;
4253   bfd_reloc_code_real_type r[3]
4254     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
4255   const char *name = "lui";
4256   const char *fmt = "t,u";
4257
4258   gas_assert (! mips_opts.mips16);
4259
4260   high_expr = *ep;
4261
4262   if (high_expr.X_op == O_constant)
4263     {
4264       /* We can compute the instruction now without a relocation entry.  */
4265       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
4266                                 >> 16) & 0xffff;
4267       *r = BFD_RELOC_UNUSED;
4268     }
4269   else
4270     {
4271       gas_assert (ep->X_op == O_symbol);
4272       /* _gp_disp is a special case, used from s_cpload.
4273          __gnu_local_gp is used if mips_no_shared.  */
4274       gas_assert (mips_pic == NO_PIC
4275               || (! HAVE_NEWABI
4276                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
4277               || (! mips_in_shared
4278                   && strcmp (S_GET_NAME (ep->X_add_symbol),
4279                              "__gnu_local_gp") == 0));
4280       *r = BFD_RELOC_HI16_S;
4281     }
4282
4283   mo = hash_find (op_hash, name);
4284   gas_assert (strcmp (name, mo->name) == 0);
4285   gas_assert (strcmp (fmt, mo->args) == 0);
4286   create_insn (&insn, mo);
4287
4288   insn.insn_opcode = insn.insn_mo->match;
4289   INSERT_OPERAND (RT, insn, regnum);
4290   if (*r == BFD_RELOC_UNUSED)
4291     {
4292       insn.insn_opcode |= high_expr.X_add_number;
4293       append_insn (&insn, NULL, r);
4294     }
4295   else
4296     append_insn (&insn, &high_expr, r);
4297 }
4298
4299 /* Generate a sequence of instructions to do a load or store from a constant
4300    offset off of a base register (breg) into/from a target register (treg),
4301    using AT if necessary.  */
4302 static void
4303 macro_build_ldst_constoffset (expressionS *ep, const char *op,
4304                               int treg, int breg, int dbl)
4305 {
4306   gas_assert (ep->X_op == O_constant);
4307
4308   /* Sign-extending 32-bit constants makes their handling easier.  */
4309   if (!dbl)
4310     normalize_constant_expr (ep);
4311
4312   /* Right now, this routine can only handle signed 32-bit constants.  */
4313   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
4314     as_warn (_("operand overflow"));
4315
4316   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
4317     {
4318       /* Signed 16-bit offset will fit in the op.  Easy!  */
4319       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
4320     }
4321   else
4322     {
4323       /* 32-bit offset, need multiple instructions and AT, like:
4324            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
4325            addu     $tempreg,$tempreg,$breg
4326            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
4327          to handle the complete offset.  */
4328       macro_build_lui (ep, AT);
4329       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
4330       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
4331
4332       if (!mips_opts.at)
4333         as_bad (_("Macro used $at after \".set noat\""));
4334     }
4335 }
4336
4337 /*                      set_at()
4338  * Generates code to set the $at register to true (one)
4339  * if reg is less than the immediate expression.
4340  */
4341 static void
4342 set_at (int reg, int unsignedp)
4343 {
4344   if (imm_expr.X_op == O_constant
4345       && imm_expr.X_add_number >= -0x8000
4346       && imm_expr.X_add_number < 0x8000)
4347     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
4348                  AT, reg, BFD_RELOC_LO16);
4349   else
4350     {
4351       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4352       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
4353     }
4354 }
4355
4356 /* Warn if an expression is not a constant.  */
4357
4358 static void
4359 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
4360 {
4361   if (ex->X_op == O_big)
4362     as_bad (_("unsupported large constant"));
4363   else if (ex->X_op != O_constant)
4364     as_bad (_("Instruction %s requires absolute expression"),
4365             ip->insn_mo->name);
4366
4367   if (HAVE_32BIT_GPRS)
4368     normalize_constant_expr (ex);
4369 }
4370
4371 /* Count the leading zeroes by performing a binary chop. This is a
4372    bulky bit of source, but performance is a LOT better for the
4373    majority of values than a simple loop to count the bits:
4374        for (lcnt = 0; (lcnt < 32); lcnt++)
4375          if ((v) & (1 << (31 - lcnt)))
4376            break;
4377   However it is not code size friendly, and the gain will drop a bit
4378   on certain cached systems.
4379 */
4380 #define COUNT_TOP_ZEROES(v)             \
4381   (((v) & ~0xffff) == 0                 \
4382    ? ((v) & ~0xff) == 0                 \
4383      ? ((v) & ~0xf) == 0                \
4384        ? ((v) & ~0x3) == 0              \
4385          ? ((v) & ~0x1) == 0            \
4386            ? !(v)                       \
4387              ? 32                       \
4388              : 31                       \
4389            : 30                         \
4390          : ((v) & ~0x7) == 0            \
4391            ? 29                         \
4392            : 28                         \
4393        : ((v) & ~0x3f) == 0             \
4394          ? ((v) & ~0x1f) == 0           \
4395            ? 27                         \
4396            : 26                         \
4397          : ((v) & ~0x7f) == 0           \
4398            ? 25                         \
4399            : 24                         \
4400      : ((v) & ~0xfff) == 0              \
4401        ? ((v) & ~0x3ff) == 0            \
4402          ? ((v) & ~0x1ff) == 0          \
4403            ? 23                         \
4404            : 22                         \
4405          : ((v) & ~0x7ff) == 0          \
4406            ? 21                         \
4407            : 20                         \
4408        : ((v) & ~0x3fff) == 0           \
4409          ? ((v) & ~0x1fff) == 0         \
4410            ? 19                         \
4411            : 18                         \
4412          : ((v) & ~0x7fff) == 0         \
4413            ? 17                         \
4414            : 16                         \
4415    : ((v) & ~0xffffff) == 0             \
4416      ? ((v) & ~0xfffff) == 0            \
4417        ? ((v) & ~0x3ffff) == 0          \
4418          ? ((v) & ~0x1ffff) == 0        \
4419            ? 15                         \
4420            : 14                         \
4421          : ((v) & ~0x7ffff) == 0        \
4422            ? 13                         \
4423            : 12                         \
4424        : ((v) & ~0x3fffff) == 0         \
4425          ? ((v) & ~0x1fffff) == 0       \
4426            ? 11                         \
4427            : 10                         \
4428          : ((v) & ~0x7fffff) == 0       \
4429            ? 9                          \
4430            : 8                          \
4431      : ((v) & ~0xfffffff) == 0          \
4432        ? ((v) & ~0x3ffffff) == 0        \
4433          ? ((v) & ~0x1ffffff) == 0      \
4434            ? 7                          \
4435            : 6                          \
4436          : ((v) & ~0x7ffffff) == 0      \
4437            ? 5                          \
4438            : 4                          \
4439        : ((v) & ~0x3fffffff) == 0       \
4440          ? ((v) & ~0x1fffffff) == 0     \
4441            ? 3                          \
4442            : 2                          \
4443          : ((v) & ~0x7fffffff) == 0     \
4444            ? 1                          \
4445            : 0)
4446
4447 /*                      load_register()
4448  *  This routine generates the least number of instructions necessary to load
4449  *  an absolute expression value into a register.
4450  */
4451 static void
4452 load_register (int reg, expressionS *ep, int dbl)
4453 {
4454   int freg;
4455   expressionS hi32, lo32;
4456
4457   if (ep->X_op != O_big)
4458     {
4459       gas_assert (ep->X_op == O_constant);
4460
4461       /* Sign-extending 32-bit constants makes their handling easier.  */
4462       if (!dbl)
4463         normalize_constant_expr (ep);
4464
4465       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
4466         {
4467           /* We can handle 16 bit signed values with an addiu to
4468              $zero.  No need to ever use daddiu here, since $zero and
4469              the result are always correct in 32 bit mode.  */
4470           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4471           return;
4472         }
4473       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
4474         {
4475           /* We can handle 16 bit unsigned values with an ori to
4476              $zero.  */
4477           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4478           return;
4479         }
4480       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
4481         {
4482           /* 32 bit values require an lui.  */
4483           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
4484           if ((ep->X_add_number & 0xffff) != 0)
4485             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4486           return;
4487         }
4488     }
4489
4490   /* The value is larger than 32 bits.  */
4491
4492   if (!dbl || HAVE_32BIT_GPRS)
4493     {
4494       char value[32];
4495
4496       sprintf_vma (value, ep->X_add_number);
4497       as_bad (_("Number (0x%s) larger than 32 bits"), value);
4498       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4499       return;
4500     }
4501
4502   if (ep->X_op != O_big)
4503     {
4504       hi32 = *ep;
4505       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4506       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4507       hi32.X_add_number &= 0xffffffff;
4508       lo32 = *ep;
4509       lo32.X_add_number &= 0xffffffff;
4510     }
4511   else
4512     {
4513       gas_assert (ep->X_add_number > 2);
4514       if (ep->X_add_number == 3)
4515         generic_bignum[3] = 0;
4516       else if (ep->X_add_number > 4)
4517         as_bad (_("Number larger than 64 bits"));
4518       lo32.X_op = O_constant;
4519       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4520       hi32.X_op = O_constant;
4521       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4522     }
4523
4524   if (hi32.X_add_number == 0)
4525     freg = 0;
4526   else
4527     {
4528       int shift, bit;
4529       unsigned long hi, lo;
4530
4531       if (hi32.X_add_number == (offsetT) 0xffffffff)
4532         {
4533           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4534             {
4535               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4536               return;
4537             }
4538           if (lo32.X_add_number & 0x80000000)
4539             {
4540               macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4541               if (lo32.X_add_number & 0xffff)
4542                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4543               return;
4544             }
4545         }
4546
4547       /* Check for 16bit shifted constant.  We know that hi32 is
4548          non-zero, so start the mask on the first bit of the hi32
4549          value.  */
4550       shift = 17;
4551       do
4552         {
4553           unsigned long himask, lomask;
4554
4555           if (shift < 32)
4556             {
4557               himask = 0xffff >> (32 - shift);
4558               lomask = (0xffff << shift) & 0xffffffff;
4559             }
4560           else
4561             {
4562               himask = 0xffff << (shift - 32);
4563               lomask = 0;
4564             }
4565           if ((hi32.X_add_number & ~(offsetT) himask) == 0
4566               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4567             {
4568               expressionS tmp;
4569
4570               tmp.X_op = O_constant;
4571               if (shift < 32)
4572                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4573                                     | (lo32.X_add_number >> shift));
4574               else
4575                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4576               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4577               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4578                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4579               return;
4580             }
4581           ++shift;
4582         }
4583       while (shift <= (64 - 16));
4584
4585       /* Find the bit number of the lowest one bit, and store the
4586          shifted value in hi/lo.  */
4587       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4588       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4589       if (lo != 0)
4590         {
4591           bit = 0;
4592           while ((lo & 1) == 0)
4593             {
4594               lo >>= 1;
4595               ++bit;
4596             }
4597           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4598           hi >>= bit;
4599         }
4600       else
4601         {
4602           bit = 32;
4603           while ((hi & 1) == 0)
4604             {
4605               hi >>= 1;
4606               ++bit;
4607             }
4608           lo = hi;
4609           hi = 0;
4610         }
4611
4612       /* Optimize if the shifted value is a (power of 2) - 1.  */
4613       if ((hi == 0 && ((lo + 1) & lo) == 0)
4614           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4615         {
4616           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4617           if (shift != 0)
4618             {
4619               expressionS tmp;
4620
4621               /* This instruction will set the register to be all
4622                  ones.  */
4623               tmp.X_op = O_constant;
4624               tmp.X_add_number = (offsetT) -1;
4625               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4626               if (bit != 0)
4627                 {
4628                   bit += shift;
4629                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4630                                reg, reg, (bit >= 32) ? bit - 32 : bit);
4631                 }
4632               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4633                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4634               return;
4635             }
4636         }
4637
4638       /* Sign extend hi32 before calling load_register, because we can
4639          generally get better code when we load a sign extended value.  */
4640       if ((hi32.X_add_number & 0x80000000) != 0)
4641         hi32.X_add_number |= ~(offsetT) 0xffffffff;
4642       load_register (reg, &hi32, 0);
4643       freg = reg;
4644     }
4645   if ((lo32.X_add_number & 0xffff0000) == 0)
4646     {
4647       if (freg != 0)
4648         {
4649           macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4650           freg = reg;
4651         }
4652     }
4653   else
4654     {
4655       expressionS mid16;
4656
4657       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4658         {
4659           macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4660           macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4661           return;
4662         }
4663
4664       if (freg != 0)
4665         {
4666           macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4667           freg = reg;
4668         }
4669       mid16 = lo32;
4670       mid16.X_add_number >>= 16;
4671       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4672       macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4673       freg = reg;
4674     }
4675   if ((lo32.X_add_number & 0xffff) != 0)
4676     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4677 }
4678
4679 static inline void
4680 load_delay_nop (void)
4681 {
4682   if (!gpr_interlocks)
4683     macro_build (NULL, "nop", "");
4684 }
4685
4686 /* Load an address into a register.  */
4687
4688 static void
4689 load_address (int reg, expressionS *ep, int *used_at)
4690 {
4691   if (ep->X_op != O_constant
4692       && ep->X_op != O_symbol)
4693     {
4694       as_bad (_("expression too complex"));
4695       ep->X_op = O_constant;
4696     }
4697
4698   if (ep->X_op == O_constant)
4699     {
4700       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4701       return;
4702     }
4703
4704   if (mips_pic == NO_PIC)
4705     {
4706       /* If this is a reference to a GP relative symbol, we want
4707            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
4708          Otherwise we want
4709            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
4710            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4711          If we have an addend, we always use the latter form.
4712
4713          With 64bit address space and a usable $at we want
4714            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4715            lui          $at,<sym>               (BFD_RELOC_HI16_S)
4716            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4717            daddiu       $at,<sym>               (BFD_RELOC_LO16)
4718            dsll32       $reg,0
4719            daddu        $reg,$reg,$at
4720
4721          If $at is already in use, we use a path which is suboptimal
4722          on superscalar processors.
4723            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4724            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4725            dsll         $reg,16
4726            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
4727            dsll         $reg,16
4728            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
4729
4730          For GP relative symbols in 64bit address space we can use
4731          the same sequence as in 32bit address space.  */
4732       if (HAVE_64BIT_SYMBOLS)
4733         {
4734           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4735               && !nopic_need_relax (ep->X_add_symbol, 1))
4736             {
4737               relax_start (ep->X_add_symbol);
4738               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4739                            mips_gp_register, BFD_RELOC_GPREL16);
4740               relax_switch ();
4741             }
4742
4743           if (*used_at == 0 && mips_opts.at)
4744             {
4745               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4746               macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4747               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4748                            BFD_RELOC_MIPS_HIGHER);
4749               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4750               macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4751               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4752               *used_at = 1;
4753             }
4754           else
4755             {
4756               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4757               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4758                            BFD_RELOC_MIPS_HIGHER);
4759               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4760               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4761               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4762               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4763             }
4764
4765           if (mips_relax.sequence)
4766             relax_end ();
4767         }
4768       else
4769         {
4770           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4771               && !nopic_need_relax (ep->X_add_symbol, 1))
4772             {
4773               relax_start (ep->X_add_symbol);
4774               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4775                            mips_gp_register, BFD_RELOC_GPREL16);
4776               relax_switch ();
4777             }
4778           macro_build_lui (ep, reg);
4779           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4780                        reg, reg, BFD_RELOC_LO16);
4781           if (mips_relax.sequence)
4782             relax_end ();
4783         }
4784     }
4785   else if (!mips_big_got)
4786     {
4787       expressionS ex;
4788
4789       /* If this is a reference to an external symbol, we want
4790            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4791          Otherwise we want
4792            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4793            nop
4794            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4795          If there is a constant, it must be added in after.
4796
4797          If we have NewABI, we want
4798            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
4799          unless we're referencing a global symbol with a non-zero
4800          offset, in which case cst must be added separately.  */
4801       if (HAVE_NEWABI)
4802         {
4803           if (ep->X_add_number)
4804             {
4805               ex.X_add_number = ep->X_add_number;
4806               ep->X_add_number = 0;
4807               relax_start (ep->X_add_symbol);
4808               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4809                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4810               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4811                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4812               ex.X_op = O_constant;
4813               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4814                            reg, reg, BFD_RELOC_LO16);
4815               ep->X_add_number = ex.X_add_number;
4816               relax_switch ();
4817             }
4818           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4819                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4820           if (mips_relax.sequence)
4821             relax_end ();
4822         }
4823       else
4824         {
4825           ex.X_add_number = ep->X_add_number;
4826           ep->X_add_number = 0;
4827           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4828                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4829           load_delay_nop ();
4830           relax_start (ep->X_add_symbol);
4831           relax_switch ();
4832           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4833                        BFD_RELOC_LO16);
4834           relax_end ();
4835
4836           if (ex.X_add_number != 0)
4837             {
4838               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4839                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4840               ex.X_op = O_constant;
4841               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4842                            reg, reg, BFD_RELOC_LO16);
4843             }
4844         }
4845     }
4846   else if (mips_big_got)
4847     {
4848       expressionS ex;
4849
4850       /* This is the large GOT case.  If this is a reference to an
4851          external symbol, we want
4852            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
4853            addu         $reg,$reg,$gp
4854            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
4855
4856          Otherwise, for a reference to a local symbol in old ABI, we want
4857            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4858            nop
4859            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4860          If there is a constant, it must be added in after.
4861
4862          In the NewABI, for local symbols, with or without offsets, we want:
4863            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
4864            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
4865       */
4866       if (HAVE_NEWABI)
4867         {
4868           ex.X_add_number = ep->X_add_number;
4869           ep->X_add_number = 0;
4870           relax_start (ep->X_add_symbol);
4871           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4872           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4873                        reg, reg, mips_gp_register);
4874           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4875                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4876           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4877             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4878           else if (ex.X_add_number)
4879             {
4880               ex.X_op = O_constant;
4881               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4882                            BFD_RELOC_LO16);
4883             }
4884
4885           ep->X_add_number = ex.X_add_number;
4886           relax_switch ();
4887           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4888                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4889           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4890                        BFD_RELOC_MIPS_GOT_OFST);
4891           relax_end ();
4892         }
4893       else
4894         {
4895           ex.X_add_number = ep->X_add_number;
4896           ep->X_add_number = 0;
4897           relax_start (ep->X_add_symbol);
4898           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4899           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4900                        reg, reg, mips_gp_register);
4901           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4902                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4903           relax_switch ();
4904           if (reg_needs_delay (mips_gp_register))
4905             {
4906               /* We need a nop before loading from $gp.  This special
4907                  check is required because the lui which starts the main
4908                  instruction stream does not refer to $gp, and so will not
4909                  insert the nop which may be required.  */
4910               macro_build (NULL, "nop", "");
4911             }
4912           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4913                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4914           load_delay_nop ();
4915           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4916                        BFD_RELOC_LO16);
4917           relax_end ();
4918
4919           if (ex.X_add_number != 0)
4920             {
4921               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4922                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4923               ex.X_op = O_constant;
4924               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4925                            BFD_RELOC_LO16);
4926             }
4927         }
4928     }
4929   else
4930     abort ();
4931
4932   if (!mips_opts.at && *used_at == 1)
4933     as_bad (_("Macro used $at after \".set noat\""));
4934 }
4935
4936 /* Move the contents of register SOURCE into register DEST.  */
4937
4938 static void
4939 move_register (int dest, int source)
4940 {
4941   macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4942                dest, source, 0);
4943 }
4944
4945 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4946    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4947    The two alternatives are:
4948
4949    Global symbol                Local sybmol
4950    -------------                ------------
4951    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
4952    ...                          ...
4953    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4954
4955    load_got_offset emits the first instruction and add_got_offset
4956    emits the second for a 16-bit offset or add_got_offset_hilo emits
4957    a sequence to add a 32-bit offset using a scratch register.  */
4958
4959 static void
4960 load_got_offset (int dest, expressionS *local)
4961 {
4962   expressionS global;
4963
4964   global = *local;
4965   global.X_add_number = 0;
4966
4967   relax_start (local->X_add_symbol);
4968   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4969                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4970   relax_switch ();
4971   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4972                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4973   relax_end ();
4974 }
4975
4976 static void
4977 add_got_offset (int dest, expressionS *local)
4978 {
4979   expressionS global;
4980
4981   global.X_op = O_constant;
4982   global.X_op_symbol = NULL;
4983   global.X_add_symbol = NULL;
4984   global.X_add_number = local->X_add_number;
4985
4986   relax_start (local->X_add_symbol);
4987   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4988                dest, dest, BFD_RELOC_LO16);
4989   relax_switch ();
4990   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4991   relax_end ();
4992 }
4993
4994 static void
4995 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4996 {
4997   expressionS global;
4998   int hold_mips_optimize;
4999
5000   global.X_op = O_constant;
5001   global.X_op_symbol = NULL;
5002   global.X_add_symbol = NULL;
5003   global.X_add_number = local->X_add_number;
5004
5005   relax_start (local->X_add_symbol);
5006   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
5007   relax_switch ();
5008   /* Set mips_optimize around the lui instruction to avoid
5009      inserting an unnecessary nop after the lw.  */
5010   hold_mips_optimize = mips_optimize;
5011   mips_optimize = 2;
5012   macro_build_lui (&global, tmp);
5013   mips_optimize = hold_mips_optimize;
5014   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
5015   relax_end ();
5016
5017   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
5018 }
5019
5020 /*
5021  *                      Build macros
5022  *   This routine implements the seemingly endless macro or synthesized
5023  * instructions and addressing modes in the mips assembly language. Many
5024  * of these macros are simple and are similar to each other. These could
5025  * probably be handled by some kind of table or grammar approach instead of
5026  * this verbose method. Others are not simple macros but are more like
5027  * optimizing code generation.
5028  *   One interesting optimization is when several store macros appear
5029  * consecutively that would load AT with the upper half of the same address.
5030  * The ensuing load upper instructions are ommited. This implies some kind
5031  * of global optimization. We currently only optimize within a single macro.
5032  *   For many of the load and store macros if the address is specified as a
5033  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
5034  * first load register 'at' with zero and use it as the base register. The
5035  * mips assembler simply uses register $zero. Just one tiny optimization
5036  * we're missing.
5037  */
5038 static void
5039 macro (struct mips_cl_insn *ip)
5040 {
5041   unsigned int treg, sreg, dreg, breg;
5042   unsigned int tempreg;
5043   int mask;
5044   int used_at = 0;
5045   expressionS expr1;
5046   const char *s;
5047   const char *s2;
5048   const char *fmt;
5049   int likely = 0;
5050   int dbl = 0;
5051   int coproc = 0;
5052   int lr = 0;
5053   int imm = 0;
5054   int call = 0;
5055   int off;
5056   offsetT maxnum;
5057   bfd_reloc_code_real_type r;
5058   int hold_mips_optimize;
5059
5060   gas_assert (! mips_opts.mips16);
5061
5062   treg = EXTRACT_OPERAND (RT, *ip);
5063   dreg = EXTRACT_OPERAND (RD, *ip);
5064   sreg = breg = EXTRACT_OPERAND (RS, *ip);
5065   mask = ip->insn_mo->mask;
5066
5067   expr1.X_op = O_constant;
5068   expr1.X_op_symbol = NULL;
5069   expr1.X_add_symbol = NULL;
5070   expr1.X_add_number = 1;
5071
5072   switch (mask)
5073     {
5074     case M_DABS:
5075       dbl = 1;
5076     case M_ABS:
5077       /* bgez $a0,.+12
5078          move v0,$a0
5079          sub v0,$zero,$a0
5080          */
5081
5082       start_noreorder ();
5083
5084       expr1.X_add_number = 8;
5085       macro_build (&expr1, "bgez", "s,p", sreg);
5086       if (dreg == sreg)
5087         macro_build (NULL, "nop", "");
5088       else
5089         move_register (dreg, sreg);
5090       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
5091
5092       end_noreorder ();
5093       break;
5094
5095     case M_ADD_I:
5096       s = "addi";
5097       s2 = "add";
5098       goto do_addi;
5099     case M_ADDU_I:
5100       s = "addiu";
5101       s2 = "addu";
5102       goto do_addi;
5103     case M_DADD_I:
5104       dbl = 1;
5105       s = "daddi";
5106       s2 = "dadd";
5107       goto do_addi;
5108     case M_DADDU_I:
5109       dbl = 1;
5110       s = "daddiu";
5111       s2 = "daddu";
5112     do_addi:
5113       if (imm_expr.X_op == O_constant
5114           && imm_expr.X_add_number >= -0x8000
5115           && imm_expr.X_add_number < 0x8000)
5116         {
5117           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
5118           break;
5119         }
5120       used_at = 1;
5121       load_register (AT, &imm_expr, dbl);
5122       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
5123       break;
5124
5125     case M_AND_I:
5126       s = "andi";
5127       s2 = "and";
5128       goto do_bit;
5129     case M_OR_I:
5130       s = "ori";
5131       s2 = "or";
5132       goto do_bit;
5133     case M_NOR_I:
5134       s = "";
5135       s2 = "nor";
5136       goto do_bit;
5137     case M_XOR_I:
5138       s = "xori";
5139       s2 = "xor";
5140     do_bit:
5141       if (imm_expr.X_op == O_constant
5142           && imm_expr.X_add_number >= 0
5143           && imm_expr.X_add_number < 0x10000)
5144         {
5145           if (mask != M_NOR_I)
5146             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
5147           else
5148             {
5149               macro_build (&imm_expr, "ori", "t,r,i",
5150                            treg, sreg, BFD_RELOC_LO16);
5151               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
5152             }
5153           break;
5154         }
5155
5156       used_at = 1;
5157       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5158       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
5159       break;
5160
5161     case M_BALIGN:
5162       switch (imm_expr.X_add_number)
5163         {
5164         case 0:
5165           macro_build (NULL, "nop", "");
5166           break;
5167         case 2:
5168           macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
5169           break;
5170         default:
5171           macro_build (NULL, "balign", "t,s,2", treg, sreg,
5172                        (int) imm_expr.X_add_number);
5173           break;
5174         }
5175       break;
5176
5177     case M_BEQ_I:
5178       s = "beq";
5179       goto beq_i;
5180     case M_BEQL_I:
5181       s = "beql";
5182       likely = 1;
5183       goto beq_i;
5184     case M_BNE_I:
5185       s = "bne";
5186       goto beq_i;
5187     case M_BNEL_I:
5188       s = "bnel";
5189       likely = 1;
5190     beq_i:
5191       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5192         {
5193           macro_build (&offset_expr, s, "s,t,p", sreg, ZERO);
5194           break;
5195         }
5196       used_at = 1;
5197       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5198       macro_build (&offset_expr, s, "s,t,p", sreg, AT);
5199       break;
5200
5201     case M_BGEL:
5202       likely = 1;
5203     case M_BGE:
5204       if (treg == 0)
5205         {
5206           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
5207           break;
5208         }
5209       if (sreg == 0)
5210         {
5211           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
5212           break;
5213         }
5214       used_at = 1;
5215       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5216       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5217       break;
5218
5219     case M_BGTL_I:
5220       likely = 1;
5221     case M_BGT_I:
5222       /* Check for > max integer.  */
5223       maxnum = 0x7fffffff;
5224       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5225         {
5226           maxnum <<= 16;
5227           maxnum |= 0xffff;
5228           maxnum <<= 16;
5229           maxnum |= 0xffff;
5230         }
5231       if (imm_expr.X_op == O_constant
5232           && imm_expr.X_add_number >= maxnum
5233           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5234         {
5235         do_false:
5236           /* Result is always false.  */
5237           if (! likely)
5238             macro_build (NULL, "nop", "");
5239           else
5240             macro_build (&offset_expr, "bnel", "s,t,p", ZERO, ZERO);
5241           break;
5242         }
5243       if (imm_expr.X_op != O_constant)
5244         as_bad (_("Unsupported large constant"));
5245       ++imm_expr.X_add_number;
5246       /* FALLTHROUGH */
5247     case M_BGE_I:
5248     case M_BGEL_I:
5249       if (mask == M_BGEL_I)
5250         likely = 1;
5251       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5252         {
5253           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
5254           break;
5255         }
5256       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5257         {
5258           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5259           break;
5260         }
5261       maxnum = 0x7fffffff;
5262       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5263         {
5264           maxnum <<= 16;
5265           maxnum |= 0xffff;
5266           maxnum <<= 16;
5267           maxnum |= 0xffff;
5268         }
5269       maxnum = - maxnum - 1;
5270       if (imm_expr.X_op == O_constant
5271           && imm_expr.X_add_number <= maxnum
5272           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5273         {
5274         do_true:
5275           /* result is always true */
5276           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
5277           macro_build (&offset_expr, "b", "p");
5278           break;
5279         }
5280       used_at = 1;
5281       set_at (sreg, 0);
5282       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5283       break;
5284
5285     case M_BGEUL:
5286       likely = 1;
5287     case M_BGEU:
5288       if (treg == 0)
5289         goto do_true;
5290       if (sreg == 0)
5291         {
5292           macro_build (&offset_expr, likely ? "beql" : "beq",
5293                        "s,t,p", ZERO, treg);
5294           break;
5295         }
5296       used_at = 1;
5297       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5298       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5299       break;
5300
5301     case M_BGTUL_I:
5302       likely = 1;
5303     case M_BGTU_I:
5304       if (sreg == 0
5305           || (HAVE_32BIT_GPRS
5306               && imm_expr.X_op == O_constant
5307               && imm_expr.X_add_number == -1))
5308         goto do_false;
5309       if (imm_expr.X_op != O_constant)
5310         as_bad (_("Unsupported large constant"));
5311       ++imm_expr.X_add_number;
5312       /* FALLTHROUGH */
5313     case M_BGEU_I:
5314     case M_BGEUL_I:
5315       if (mask == M_BGEUL_I)
5316         likely = 1;
5317       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5318         goto do_true;
5319       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5320         {
5321           macro_build (&offset_expr, likely ? "bnel" : "bne",
5322                        "s,t,p", sreg, ZERO);
5323           break;
5324         }
5325       used_at = 1;
5326       set_at (sreg, 1);
5327       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5328       break;
5329
5330     case M_BGTL:
5331       likely = 1;
5332     case M_BGT:
5333       if (treg == 0)
5334         {
5335           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5336           break;
5337         }
5338       if (sreg == 0)
5339         {
5340           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
5341           break;
5342         }
5343       used_at = 1;
5344       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5345       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5346       break;
5347
5348     case M_BGTUL:
5349       likely = 1;
5350     case M_BGTU:
5351       if (treg == 0)
5352         {
5353           macro_build (&offset_expr, likely ? "bnel" : "bne",
5354                        "s,t,p", sreg, ZERO);
5355           break;
5356         }
5357       if (sreg == 0)
5358         goto do_false;
5359       used_at = 1;
5360       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5361       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5362       break;
5363
5364     case M_BLEL:
5365       likely = 1;
5366     case M_BLE:
5367       if (treg == 0)
5368         {
5369           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5370           break;
5371         }
5372       if (sreg == 0)
5373         {
5374           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
5375           break;
5376         }
5377       used_at = 1;
5378       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5379       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5380       break;
5381
5382     case M_BLEL_I:
5383       likely = 1;
5384     case M_BLE_I:
5385       maxnum = 0x7fffffff;
5386       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5387         {
5388           maxnum <<= 16;
5389           maxnum |= 0xffff;
5390           maxnum <<= 16;
5391           maxnum |= 0xffff;
5392         }
5393       if (imm_expr.X_op == O_constant
5394           && imm_expr.X_add_number >= maxnum
5395           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5396         goto do_true;
5397       if (imm_expr.X_op != O_constant)
5398         as_bad (_("Unsupported large constant"));
5399       ++imm_expr.X_add_number;
5400       /* FALLTHROUGH */
5401     case M_BLT_I:
5402     case M_BLTL_I:
5403       if (mask == M_BLTL_I)
5404         likely = 1;
5405       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5406         {
5407           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5408           break;
5409         }
5410       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5411         {
5412           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5413           break;
5414         }
5415       used_at = 1;
5416       set_at (sreg, 0);
5417       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5418       break;
5419
5420     case M_BLEUL:
5421       likely = 1;
5422     case M_BLEU:
5423       if (treg == 0)
5424         {
5425           macro_build (&offset_expr, likely ? "beql" : "beq",
5426                        "s,t,p", sreg, ZERO);
5427           break;
5428         }
5429       if (sreg == 0)
5430         goto do_true;
5431       used_at = 1;
5432       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5433       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5434       break;
5435
5436     case M_BLEUL_I:
5437       likely = 1;
5438     case M_BLEU_I:
5439       if (sreg == 0
5440           || (HAVE_32BIT_GPRS
5441               && imm_expr.X_op == O_constant
5442               && imm_expr.X_add_number == -1))
5443         goto do_true;
5444       if (imm_expr.X_op != O_constant)
5445         as_bad (_("Unsupported large constant"));
5446       ++imm_expr.X_add_number;
5447       /* FALLTHROUGH */
5448     case M_BLTU_I:
5449     case M_BLTUL_I:
5450       if (mask == M_BLTUL_I)
5451         likely = 1;
5452       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5453         goto do_false;
5454       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5455         {
5456           macro_build (&offset_expr, likely ? "beql" : "beq",
5457                        "s,t,p", sreg, ZERO);
5458           break;
5459         }
5460       used_at = 1;
5461       set_at (sreg, 1);
5462       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5463       break;
5464
5465     case M_BLTL:
5466       likely = 1;
5467     case M_BLT:
5468       if (treg == 0)
5469         {
5470           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5471           break;
5472         }
5473       if (sreg == 0)
5474         {
5475           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
5476           break;
5477         }
5478       used_at = 1;
5479       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5480       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5481       break;
5482
5483     case M_BLTUL:
5484       likely = 1;
5485     case M_BLTU:
5486       if (treg == 0)
5487         goto do_false;
5488       if (sreg == 0)
5489         {
5490           macro_build (&offset_expr, likely ? "bnel" : "bne",
5491                        "s,t,p", ZERO, treg);
5492           break;
5493         }
5494       used_at = 1;
5495       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5496       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5497       break;
5498
5499     case M_DEXT:
5500       {
5501         /* Use unsigned arithmetic.  */
5502         addressT pos;
5503         addressT size;
5504
5505         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5506           {
5507             as_bad (_("Unsupported large constant"));
5508             pos = size = 1;
5509           }
5510         else
5511           {
5512             pos = imm_expr.X_add_number;
5513             size = imm2_expr.X_add_number;
5514           }
5515
5516         if (pos > 63)
5517           {
5518             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5519             pos = 1;
5520           }
5521         if (size == 0 || size > 64 || (pos + size - 1) > 63)
5522           {
5523             as_bad (_("Improper extract size (%lu, position %lu)"),
5524                     (unsigned long) size, (unsigned long) pos);
5525             size = 1;
5526           }
5527
5528         if (size <= 32 && pos < 32)
5529           {
5530             s = "dext";
5531             fmt = "t,r,+A,+C";
5532           }
5533         else if (size <= 32)
5534           {
5535             s = "dextu";
5536             fmt = "t,r,+E,+H";
5537           }
5538         else
5539           {
5540             s = "dextm";
5541             fmt = "t,r,+A,+G";
5542           }
5543         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5544                      (int) (size - 1));
5545       }
5546       break;
5547
5548     case M_DINS:
5549       {
5550         /* Use unsigned arithmetic.  */
5551         addressT pos;
5552         addressT size;
5553
5554         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5555           {
5556             as_bad (_("Unsupported large constant"));
5557             pos = size = 1;
5558           }
5559         else
5560           {
5561             pos = imm_expr.X_add_number;
5562             size = imm2_expr.X_add_number;
5563           }
5564
5565         if (pos > 63)
5566           {
5567             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5568             pos = 1;
5569           }
5570         if (size == 0 || size > 64 || (pos + size - 1) > 63)
5571           {
5572             as_bad (_("Improper insert size (%lu, position %lu)"),
5573                     (unsigned long) size, (unsigned long) pos);
5574             size = 1;
5575           }
5576
5577         if (pos < 32 && (pos + size - 1) < 32)
5578           {
5579             s = "dins";
5580             fmt = "t,r,+A,+B";
5581           }
5582         else if (pos >= 32)
5583           {
5584             s = "dinsu";
5585             fmt = "t,r,+E,+F";
5586           }
5587         else
5588           {
5589             s = "dinsm";
5590             fmt = "t,r,+A,+F";
5591           }
5592         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5593                      (int) (pos + size - 1));
5594       }
5595       break;
5596
5597     case M_DDIV_3:
5598       dbl = 1;
5599     case M_DIV_3:
5600       s = "mflo";
5601       goto do_div3;
5602     case M_DREM_3:
5603       dbl = 1;
5604     case M_REM_3:
5605       s = "mfhi";
5606     do_div3:
5607       if (treg == 0)
5608         {
5609           as_warn (_("Divide by zero."));
5610           if (mips_trap)
5611             macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
5612           else
5613             macro_build (NULL, "break", "c", 7);
5614           break;
5615         }
5616
5617       start_noreorder ();
5618       if (mips_trap)
5619         {
5620           macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
5621           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5622         }
5623       else
5624         {
5625           expr1.X_add_number = 8;
5626           macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
5627           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5628           macro_build (NULL, "break", "c", 7);
5629         }
5630       expr1.X_add_number = -1;
5631       used_at = 1;
5632       load_register (AT, &expr1, dbl);
5633       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5634       macro_build (&expr1, "bne", "s,t,p", treg, AT);
5635       if (dbl)
5636         {
5637           expr1.X_add_number = 1;
5638           load_register (AT, &expr1, dbl);
5639           macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5640         }
5641       else
5642         {
5643           expr1.X_add_number = 0x80000000;
5644           macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5645         }
5646       if (mips_trap)
5647         {
5648           macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5649           /* We want to close the noreorder block as soon as possible, so
5650              that later insns are available for delay slot filling.  */
5651           end_noreorder ();
5652         }
5653       else
5654         {
5655           expr1.X_add_number = 8;
5656           macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5657           macro_build (NULL, "nop", "");
5658
5659           /* We want to close the noreorder block as soon as possible, so
5660              that later insns are available for delay slot filling.  */
5661           end_noreorder ();
5662
5663           macro_build (NULL, "break", "c", 6);
5664         }
5665       macro_build (NULL, s, "d", dreg);
5666       break;
5667
5668     case M_DIV_3I:
5669       s = "div";
5670       s2 = "mflo";
5671       goto do_divi;
5672     case M_DIVU_3I:
5673       s = "divu";
5674       s2 = "mflo";
5675       goto do_divi;
5676     case M_REM_3I:
5677       s = "div";
5678       s2 = "mfhi";
5679       goto do_divi;
5680     case M_REMU_3I:
5681       s = "divu";
5682       s2 = "mfhi";
5683       goto do_divi;
5684     case M_DDIV_3I:
5685       dbl = 1;
5686       s = "ddiv";
5687       s2 = "mflo";
5688       goto do_divi;
5689     case M_DDIVU_3I:
5690       dbl = 1;
5691       s = "ddivu";
5692       s2 = "mflo";
5693       goto do_divi;
5694     case M_DREM_3I:
5695       dbl = 1;
5696       s = "ddiv";
5697       s2 = "mfhi";
5698       goto do_divi;
5699     case M_DREMU_3I:
5700       dbl = 1;
5701       s = "ddivu";
5702       s2 = "mfhi";
5703     do_divi:
5704       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5705         {
5706           as_warn (_("Divide by zero."));
5707           if (mips_trap)
5708             macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
5709           else
5710             macro_build (NULL, "break", "c", 7);
5711           break;
5712         }
5713       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5714         {
5715           if (strcmp (s2, "mflo") == 0)
5716             move_register (dreg, sreg);
5717           else
5718             move_register (dreg, ZERO);
5719           break;
5720         }
5721       if (imm_expr.X_op == O_constant
5722           && imm_expr.X_add_number == -1
5723           && s[strlen (s) - 1] != 'u')
5724         {
5725           if (strcmp (s2, "mflo") == 0)
5726             {
5727               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5728             }
5729           else
5730             move_register (dreg, ZERO);
5731           break;
5732         }
5733
5734       used_at = 1;
5735       load_register (AT, &imm_expr, dbl);
5736       macro_build (NULL, s, "z,s,t", sreg, AT);
5737       macro_build (NULL, s2, "d", dreg);
5738       break;
5739
5740     case M_DIVU_3:
5741       s = "divu";
5742       s2 = "mflo";
5743       goto do_divu3;
5744     case M_REMU_3:
5745       s = "divu";
5746       s2 = "mfhi";
5747       goto do_divu3;
5748     case M_DDIVU_3:
5749       s = "ddivu";
5750       s2 = "mflo";
5751       goto do_divu3;
5752     case M_DREMU_3:
5753       s = "ddivu";
5754       s2 = "mfhi";
5755     do_divu3:
5756       start_noreorder ();
5757       if (mips_trap)
5758         {
5759           macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
5760           macro_build (NULL, s, "z,s,t", sreg, treg);
5761           /* We want to close the noreorder block as soon as possible, so
5762              that later insns are available for delay slot filling.  */
5763           end_noreorder ();
5764         }
5765       else
5766         {
5767           expr1.X_add_number = 8;
5768           macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
5769           macro_build (NULL, s, "z,s,t", sreg, treg);
5770
5771           /* We want to close the noreorder block as soon as possible, so
5772              that later insns are available for delay slot filling.  */
5773           end_noreorder ();
5774           macro_build (NULL, "break", "c", 7);
5775         }
5776       macro_build (NULL, s2, "d", dreg);
5777       break;
5778
5779     case M_DLCA_AB:
5780       dbl = 1;
5781     case M_LCA_AB:
5782       call = 1;
5783       goto do_la;
5784     case M_DLA_AB:
5785       dbl = 1;
5786     case M_LA_AB:
5787     do_la:
5788       /* Load the address of a symbol into a register.  If breg is not
5789          zero, we then add a base register to it.  */
5790
5791       if (dbl && HAVE_32BIT_GPRS)
5792         as_warn (_("dla used to load 32-bit register"));
5793
5794       if (!dbl && HAVE_64BIT_OBJECTS)
5795         as_warn (_("la used to load 64-bit address"));
5796
5797       if (offset_expr.X_op == O_constant
5798           && offset_expr.X_add_number >= -0x8000
5799           && offset_expr.X_add_number < 0x8000)
5800         {
5801           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5802                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
5803           break;
5804         }
5805
5806       if (mips_opts.at && (treg == breg))
5807         {
5808           tempreg = AT;
5809           used_at = 1;
5810         }
5811       else
5812         {
5813           tempreg = treg;
5814         }
5815
5816       if (offset_expr.X_op != O_symbol
5817           && offset_expr.X_op != O_constant)
5818         {
5819           as_bad (_("Expression too complex"));
5820           offset_expr.X_op = O_constant;
5821         }
5822
5823       if (offset_expr.X_op == O_constant)
5824         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5825       else if (mips_pic == NO_PIC)
5826         {
5827           /* If this is a reference to a GP relative symbol, we want
5828                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
5829              Otherwise we want
5830                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5831                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5832              If we have a constant, we need two instructions anyhow,
5833              so we may as well always use the latter form.
5834
5835              With 64bit address space and a usable $at we want
5836                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5837                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5838                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5839                daddiu   $at,<sym>               (BFD_RELOC_LO16)
5840                dsll32   $tempreg,0
5841                daddu    $tempreg,$tempreg,$at
5842
5843              If $at is already in use, we use a path which is suboptimal
5844              on superscalar processors.
5845                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5846                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5847                dsll     $tempreg,16
5848                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5849                dsll     $tempreg,16
5850                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
5851
5852              For GP relative symbols in 64bit address space we can use
5853              the same sequence as in 32bit address space.  */
5854           if (HAVE_64BIT_SYMBOLS)
5855             {
5856               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5857                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5858                 {
5859                   relax_start (offset_expr.X_add_symbol);
5860                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5861                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5862                   relax_switch ();
5863                 }
5864
5865               if (used_at == 0 && mips_opts.at)
5866                 {
5867                   macro_build (&offset_expr, "lui", "t,u",
5868                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5869                   macro_build (&offset_expr, "lui", "t,u",
5870                                AT, BFD_RELOC_HI16_S);
5871                   macro_build (&offset_expr, "daddiu", "t,r,j",
5872                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5873                   macro_build (&offset_expr, "daddiu", "t,r,j",
5874                                AT, AT, BFD_RELOC_LO16);
5875                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5876                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5877                   used_at = 1;
5878                 }
5879               else
5880                 {
5881                   macro_build (&offset_expr, "lui", "t,u",
5882                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5883                   macro_build (&offset_expr, "daddiu", "t,r,j",
5884                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5885                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5886                   macro_build (&offset_expr, "daddiu", "t,r,j",
5887                                tempreg, tempreg, BFD_RELOC_HI16_S);
5888                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5889                   macro_build (&offset_expr, "daddiu", "t,r,j",
5890                                tempreg, tempreg, BFD_RELOC_LO16);
5891                 }
5892
5893               if (mips_relax.sequence)
5894                 relax_end ();
5895             }
5896           else
5897             {
5898               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5899                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5900                 {
5901                   relax_start (offset_expr.X_add_symbol);
5902                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5903                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5904                   relax_switch ();
5905                 }
5906               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5907                 as_bad (_("Offset too large"));
5908               macro_build_lui (&offset_expr, tempreg);
5909               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5910                            tempreg, tempreg, BFD_RELOC_LO16);
5911               if (mips_relax.sequence)
5912                 relax_end ();
5913             }
5914         }
5915       else if (!mips_big_got && !HAVE_NEWABI)
5916         {
5917           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5918
5919           /* If this is a reference to an external symbol, and there
5920              is no constant, we want
5921                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5922              or for lca or if tempreg is PIC_CALL_REG
5923                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5924              For a local symbol, we want
5925                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5926                nop
5927                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5928
5929              If we have a small constant, and this is a reference to
5930              an external symbol, we want
5931                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5932                nop
5933                addiu    $tempreg,$tempreg,<constant>
5934              For a local symbol, we want the same instruction
5935              sequence, but we output a BFD_RELOC_LO16 reloc on the
5936              addiu instruction.
5937
5938              If we have a large constant, and this is a reference to
5939              an external symbol, we want
5940                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5941                lui      $at,<hiconstant>
5942                addiu    $at,$at,<loconstant>
5943                addu     $tempreg,$tempreg,$at
5944              For a local symbol, we want the same instruction
5945              sequence, but we output a BFD_RELOC_LO16 reloc on the
5946              addiu instruction.
5947            */
5948
5949           if (offset_expr.X_add_number == 0)
5950             {
5951               if (mips_pic == SVR4_PIC
5952                   && breg == 0
5953                   && (call || tempreg == PIC_CALL_REG))
5954                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5955
5956               relax_start (offset_expr.X_add_symbol);
5957               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5958                            lw_reloc_type, mips_gp_register);
5959               if (breg != 0)
5960                 {
5961                   /* We're going to put in an addu instruction using
5962                      tempreg, so we may as well insert the nop right
5963                      now.  */
5964                   load_delay_nop ();
5965                 }
5966               relax_switch ();
5967               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5968                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5969               load_delay_nop ();
5970               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5971                            tempreg, tempreg, BFD_RELOC_LO16);
5972               relax_end ();
5973               /* FIXME: If breg == 0, and the next instruction uses
5974                  $tempreg, then if this variant case is used an extra
5975                  nop will be generated.  */
5976             }
5977           else if (offset_expr.X_add_number >= -0x8000
5978                    && offset_expr.X_add_number < 0x8000)
5979             {
5980               load_got_offset (tempreg, &offset_expr);
5981               load_delay_nop ();
5982               add_got_offset (tempreg, &offset_expr);
5983             }
5984           else
5985             {
5986               expr1.X_add_number = offset_expr.X_add_number;
5987               offset_expr.X_add_number =
5988                 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5989               load_got_offset (tempreg, &offset_expr);
5990               offset_expr.X_add_number = expr1.X_add_number;
5991               /* If we are going to add in a base register, and the
5992                  target register and the base register are the same,
5993                  then we are using AT as a temporary register.  Since
5994                  we want to load the constant into AT, we add our
5995                  current AT (from the global offset table) and the
5996                  register into the register now, and pretend we were
5997                  not using a base register.  */
5998               if (breg == treg)
5999                 {
6000                   load_delay_nop ();
6001                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6002                                treg, AT, breg);
6003                   breg = 0;
6004                   tempreg = treg;
6005                 }
6006               add_got_offset_hilo (tempreg, &offset_expr, AT);
6007               used_at = 1;
6008             }
6009         }
6010       else if (!mips_big_got && HAVE_NEWABI)
6011         {
6012           int add_breg_early = 0;
6013
6014           /* If this is a reference to an external, and there is no
6015              constant, or local symbol (*), with or without a
6016              constant, we want
6017                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
6018              or for lca or if tempreg is PIC_CALL_REG
6019                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
6020
6021              If we have a small constant, and this is a reference to
6022              an external symbol, we want
6023                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
6024                addiu    $tempreg,$tempreg,<constant>
6025
6026              If we have a large constant, and this is a reference to
6027              an external symbol, we want
6028                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
6029                lui      $at,<hiconstant>
6030                addiu    $at,$at,<loconstant>
6031                addu     $tempreg,$tempreg,$at
6032
6033              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
6034              local symbols, even though it introduces an additional
6035              instruction.  */
6036
6037           if (offset_expr.X_add_number)
6038             {
6039               expr1.X_add_number = offset_expr.X_add_number;
6040               offset_expr.X_add_number = 0;
6041
6042               relax_start (offset_expr.X_add_symbol);
6043               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6044                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6045
6046               if (expr1.X_add_number >= -0x8000
6047                   && expr1.X_add_number < 0x8000)
6048                 {
6049                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6050                                tempreg, tempreg, BFD_RELOC_LO16);
6051                 }
6052               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
6053                 {
6054                   /* If we are going to add in a base register, and the
6055                      target register and the base register are the same,
6056                      then we are using AT as a temporary register.  Since
6057                      we want to load the constant into AT, we add our
6058                      current AT (from the global offset table) and the
6059                      register into the register now, and pretend we were
6060                      not using a base register.  */
6061                   if (breg != treg)
6062                     dreg = tempreg;
6063                   else
6064                     {
6065                       gas_assert (tempreg == AT);
6066                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6067                                    treg, AT, breg);
6068                       dreg = treg;
6069                       add_breg_early = 1;
6070                     }
6071
6072                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6073                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6074                                dreg, dreg, AT);
6075
6076                   used_at = 1;
6077                 }
6078               else
6079                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6080
6081               relax_switch ();
6082               offset_expr.X_add_number = expr1.X_add_number;
6083
6084               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6085                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6086               if (add_breg_early)
6087                 {
6088                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6089                                treg, tempreg, breg);
6090                   breg = 0;
6091                   tempreg = treg;
6092                 }
6093               relax_end ();
6094             }
6095           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
6096             {
6097               relax_start (offset_expr.X_add_symbol);
6098               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6099                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
6100               relax_switch ();
6101               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6102                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6103               relax_end ();
6104             }
6105           else
6106             {
6107               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6108                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6109             }
6110         }
6111       else if (mips_big_got && !HAVE_NEWABI)
6112         {
6113           int gpdelay;
6114           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
6115           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
6116           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6117
6118           /* This is the large GOT case.  If this is a reference to an
6119              external symbol, and there is no constant, we want
6120                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6121                addu     $tempreg,$tempreg,$gp
6122                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6123              or for lca or if tempreg is PIC_CALL_REG
6124                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
6125                addu     $tempreg,$tempreg,$gp
6126                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
6127              For a local symbol, we want
6128                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6129                nop
6130                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6131
6132              If we have a small constant, and this is a reference to
6133              an external symbol, we want
6134                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6135                addu     $tempreg,$tempreg,$gp
6136                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6137                nop
6138                addiu    $tempreg,$tempreg,<constant>
6139              For a local symbol, we want
6140                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6141                nop
6142                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
6143
6144              If we have a large constant, and this is a reference to
6145              an external symbol, we want
6146                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6147                addu     $tempreg,$tempreg,$gp
6148                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6149                lui      $at,<hiconstant>
6150                addiu    $at,$at,<loconstant>
6151                addu     $tempreg,$tempreg,$at
6152              For a local symbol, we want
6153                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6154                lui      $at,<hiconstant>
6155                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
6156                addu     $tempreg,$tempreg,$at
6157           */
6158
6159           expr1.X_add_number = offset_expr.X_add_number;
6160           offset_expr.X_add_number = 0;
6161           relax_start (offset_expr.X_add_symbol);
6162           gpdelay = reg_needs_delay (mips_gp_register);
6163           if (expr1.X_add_number == 0 && breg == 0
6164               && (call || tempreg == PIC_CALL_REG))
6165             {
6166               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6167               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6168             }
6169           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6170           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6171                        tempreg, tempreg, mips_gp_register);
6172           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6173                        tempreg, lw_reloc_type, tempreg);
6174           if (expr1.X_add_number == 0)
6175             {
6176               if (breg != 0)
6177                 {
6178                   /* We're going to put in an addu instruction using
6179                      tempreg, so we may as well insert the nop right
6180                      now.  */
6181                   load_delay_nop ();
6182                 }
6183             }
6184           else if (expr1.X_add_number >= -0x8000
6185                    && expr1.X_add_number < 0x8000)
6186             {
6187               load_delay_nop ();
6188               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6189                            tempreg, tempreg, BFD_RELOC_LO16);
6190             }
6191           else
6192             {
6193               /* If we are going to add in a base register, and the
6194                  target register and the base register are the same,
6195                  then we are using AT as a temporary register.  Since
6196                  we want to load the constant into AT, we add our
6197                  current AT (from the global offset table) and the
6198                  register into the register now, and pretend we were
6199                  not using a base register.  */
6200               if (breg != treg)
6201                 dreg = tempreg;
6202               else
6203                 {
6204                   gas_assert (tempreg == AT);
6205                   load_delay_nop ();
6206                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6207                                treg, AT, breg);
6208                   dreg = treg;
6209                 }
6210
6211               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6212               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
6213
6214               used_at = 1;
6215             }
6216           offset_expr.X_add_number =
6217             ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
6218           relax_switch ();
6219
6220           if (gpdelay)
6221             {
6222               /* This is needed because this instruction uses $gp, but
6223                  the first instruction on the main stream does not.  */
6224               macro_build (NULL, "nop", "");
6225             }
6226
6227           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6228                        local_reloc_type, mips_gp_register);
6229           if (expr1.X_add_number >= -0x8000
6230               && expr1.X_add_number < 0x8000)
6231             {
6232               load_delay_nop ();
6233               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6234                            tempreg, tempreg, BFD_RELOC_LO16);
6235               /* FIXME: If add_number is 0, and there was no base
6236                  register, the external symbol case ended with a load,
6237                  so if the symbol turns out to not be external, and
6238                  the next instruction uses tempreg, an unnecessary nop
6239                  will be inserted.  */
6240             }
6241           else
6242             {
6243               if (breg == treg)
6244                 {
6245                   /* We must add in the base register now, as in the
6246                      external symbol case.  */
6247                   gas_assert (tempreg == AT);
6248                   load_delay_nop ();
6249                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6250                                treg, AT, breg);
6251                   tempreg = treg;
6252                   /* We set breg to 0 because we have arranged to add
6253                      it in in both cases.  */
6254                   breg = 0;
6255                 }
6256
6257               macro_build_lui (&expr1, AT);
6258               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6259                            AT, AT, BFD_RELOC_LO16);
6260               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6261                            tempreg, tempreg, AT);
6262               used_at = 1;
6263             }
6264           relax_end ();
6265         }
6266       else if (mips_big_got && HAVE_NEWABI)
6267         {
6268           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
6269           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
6270           int add_breg_early = 0;
6271
6272           /* This is the large GOT case.  If this is a reference to an
6273              external symbol, and there is no constant, we want
6274                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6275                add      $tempreg,$tempreg,$gp
6276                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6277              or for lca or if tempreg is PIC_CALL_REG
6278                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
6279                add      $tempreg,$tempreg,$gp
6280                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
6281
6282              If we have a small constant, and this is a reference to
6283              an external symbol, we want
6284                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6285                add      $tempreg,$tempreg,$gp
6286                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6287                addi     $tempreg,$tempreg,<constant>
6288
6289              If we have a large constant, and this is a reference to
6290              an external symbol, we want
6291                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6292                addu     $tempreg,$tempreg,$gp
6293                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6294                lui      $at,<hiconstant>
6295                addi     $at,$at,<loconstant>
6296                add      $tempreg,$tempreg,$at
6297
6298              If we have NewABI, and we know it's a local symbol, we want
6299                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
6300                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
6301              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
6302
6303           relax_start (offset_expr.X_add_symbol);
6304
6305           expr1.X_add_number = offset_expr.X_add_number;
6306           offset_expr.X_add_number = 0;
6307
6308           if (expr1.X_add_number == 0 && breg == 0
6309               && (call || tempreg == PIC_CALL_REG))
6310             {
6311               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6312               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6313             }
6314           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6315           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6316                        tempreg, tempreg, mips_gp_register);
6317           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6318                        tempreg, lw_reloc_type, tempreg);
6319
6320           if (expr1.X_add_number == 0)
6321             ;
6322           else if (expr1.X_add_number >= -0x8000
6323                    && expr1.X_add_number < 0x8000)
6324             {
6325               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6326                            tempreg, tempreg, BFD_RELOC_LO16);
6327             }
6328           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
6329             {
6330               /* If we are going to add in a base register, and the
6331                  target register and the base register are the same,
6332                  then we are using AT as a temporary register.  Since
6333                  we want to load the constant into AT, we add our
6334                  current AT (from the global offset table) and the
6335                  register into the register now, and pretend we were
6336                  not using a base register.  */
6337               if (breg != treg)
6338                 dreg = tempreg;
6339               else
6340                 {
6341                   gas_assert (tempreg == AT);
6342                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6343                                treg, AT, breg);
6344                   dreg = treg;
6345                   add_breg_early = 1;
6346                 }
6347
6348               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6349               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
6350
6351               used_at = 1;
6352             }
6353           else
6354             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6355
6356           relax_switch ();
6357           offset_expr.X_add_number = expr1.X_add_number;
6358           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6359                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6360           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6361                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
6362           if (add_breg_early)
6363             {
6364               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6365                            treg, tempreg, breg);
6366               breg = 0;
6367               tempreg = treg;
6368             }
6369           relax_end ();
6370         }
6371       else
6372         abort ();
6373
6374       if (breg != 0)
6375         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
6376       break;
6377
6378     case M_MSGSND:
6379       {
6380         unsigned long temp = (treg << 16) | (0x01);
6381         macro_build (NULL, "c2", "C", temp);
6382       }
6383       break;
6384
6385     case M_MSGLD:
6386       {
6387         unsigned long temp = (0x02);
6388         macro_build (NULL, "c2", "C", temp);
6389       }
6390       break;
6391
6392     case M_MSGLD_T:
6393       {
6394         unsigned long temp = (treg << 16) | (0x02);
6395         macro_build (NULL, "c2", "C", temp);
6396       }
6397       break;
6398
6399     case M_MSGWAIT:
6400       macro_build (NULL, "c2", "C", 3);
6401       break;
6402
6403     case M_MSGWAIT_T:
6404       {
6405         unsigned long temp = (treg << 16) | 0x03;
6406         macro_build (NULL, "c2", "C", temp);
6407       }
6408       break;
6409
6410     case M_J_A:
6411       /* The j instruction may not be used in PIC code, since it
6412          requires an absolute address.  We convert it to a b
6413          instruction.  */
6414       if (mips_pic == NO_PIC)
6415         macro_build (&offset_expr, "j", "a");
6416       else
6417         macro_build (&offset_expr, "b", "p");
6418       break;
6419
6420       /* The jal instructions must be handled as macros because when
6421          generating PIC code they expand to multi-instruction
6422          sequences.  Normally they are simple instructions.  */
6423     case M_JAL_1:
6424       dreg = RA;
6425       /* Fall through.  */
6426     case M_JAL_2:
6427       if (mips_pic == NO_PIC)
6428         macro_build (NULL, "jalr", "d,s", dreg, sreg);
6429       else
6430         {
6431           if (sreg != PIC_CALL_REG)
6432             as_warn (_("MIPS PIC call to register other than $25"));
6433
6434           macro_build (NULL, "jalr", "d,s", dreg, sreg);
6435           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
6436             {
6437               if (mips_cprestore_offset < 0)
6438                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6439               else
6440                 {
6441                   if (!mips_frame_reg_valid)
6442                     {
6443                       as_warn (_("No .frame pseudo-op used in PIC code"));
6444                       /* Quiet this warning.  */
6445                       mips_frame_reg_valid = 1;
6446                     }
6447                   if (!mips_cprestore_valid)
6448                     {
6449                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6450                       /* Quiet this warning.  */
6451                       mips_cprestore_valid = 1;
6452                     }
6453                   if (mips_opts.noreorder)
6454                     macro_build (NULL, "nop", "");
6455                   expr1.X_add_number = mips_cprestore_offset;
6456                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6457                                                 mips_gp_register,
6458                                                 mips_frame_reg,
6459                                                 HAVE_64BIT_ADDRESSES);
6460                 }
6461             }
6462         }
6463
6464       break;
6465
6466     case M_JAL_A:
6467       if (mips_pic == NO_PIC)
6468         macro_build (&offset_expr, "jal", "a");
6469       else if (mips_pic == SVR4_PIC)
6470         {
6471           /* If this is a reference to an external symbol, and we are
6472              using a small GOT, we want
6473                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
6474                nop
6475                jalr     $ra,$25
6476                nop
6477                lw       $gp,cprestore($sp)
6478              The cprestore value is set using the .cprestore
6479              pseudo-op.  If we are using a big GOT, we want
6480                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
6481                addu     $25,$25,$gp
6482                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
6483                nop
6484                jalr     $ra,$25
6485                nop
6486                lw       $gp,cprestore($sp)
6487              If the symbol is not external, we want
6488                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6489                nop
6490                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
6491                jalr     $ra,$25
6492                nop
6493                lw $gp,cprestore($sp)
6494
6495              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
6496              sequences above, minus nops, unless the symbol is local,
6497              which enables us to use GOT_PAGE/GOT_OFST (big got) or
6498              GOT_DISP.  */
6499           if (HAVE_NEWABI)
6500             {
6501               if (!mips_big_got)
6502                 {
6503                   relax_start (offset_expr.X_add_symbol);
6504                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6505                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6506                                mips_gp_register);
6507                   relax_switch ();
6508                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6509                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
6510                                mips_gp_register);
6511                   relax_end ();
6512                 }
6513               else
6514                 {
6515                   relax_start (offset_expr.X_add_symbol);
6516                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6517                                BFD_RELOC_MIPS_CALL_HI16);
6518                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6519                                PIC_CALL_REG, mips_gp_register);
6520                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6521                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6522                                PIC_CALL_REG);
6523                   relax_switch ();
6524                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6525                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6526                                mips_gp_register);
6527                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6528                                PIC_CALL_REG, PIC_CALL_REG,
6529                                BFD_RELOC_MIPS_GOT_OFST);
6530                   relax_end ();
6531                 }
6532
6533               macro_build_jalr (&offset_expr);
6534             }
6535           else
6536             {
6537               relax_start (offset_expr.X_add_symbol);
6538               if (!mips_big_got)
6539                 {
6540                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6541                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6542                                mips_gp_register);
6543                   load_delay_nop ();
6544                   relax_switch ();
6545                 }
6546               else
6547                 {
6548                   int gpdelay;
6549
6550                   gpdelay = reg_needs_delay (mips_gp_register);
6551                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6552                                BFD_RELOC_MIPS_CALL_HI16);
6553                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6554                                PIC_CALL_REG, mips_gp_register);
6555                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6556                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6557                                PIC_CALL_REG);
6558                   load_delay_nop ();
6559                   relax_switch ();
6560                   if (gpdelay)
6561                     macro_build (NULL, "nop", "");
6562                 }
6563               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6564                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6565                            mips_gp_register);
6566               load_delay_nop ();
6567               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6568                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6569               relax_end ();
6570               macro_build_jalr (&offset_expr);
6571
6572               if (mips_cprestore_offset < 0)
6573                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6574               else
6575                 {
6576                   if (!mips_frame_reg_valid)
6577                     {
6578                       as_warn (_("No .frame pseudo-op used in PIC code"));
6579                       /* Quiet this warning.  */
6580                       mips_frame_reg_valid = 1;
6581                     }
6582                   if (!mips_cprestore_valid)
6583                     {
6584                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6585                       /* Quiet this warning.  */
6586                       mips_cprestore_valid = 1;
6587                     }
6588                   if (mips_opts.noreorder)
6589                     macro_build (NULL, "nop", "");
6590                   expr1.X_add_number = mips_cprestore_offset;
6591                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6592                                                 mips_gp_register,
6593                                                 mips_frame_reg,
6594                                                 HAVE_64BIT_ADDRESSES);
6595                 }
6596             }
6597         }
6598       else if (mips_pic == VXWORKS_PIC)
6599         as_bad (_("Non-PIC jump used in PIC library"));
6600       else
6601         abort ();
6602
6603       break;
6604
6605     case M_LB_AB:
6606       s = "lb";
6607       goto ld;
6608     case M_LBU_AB:
6609       s = "lbu";
6610       goto ld;
6611     case M_LH_AB:
6612       s = "lh";
6613       goto ld;
6614     case M_LHU_AB:
6615       s = "lhu";
6616       goto ld;
6617     case M_LW_AB:
6618       s = "lw";
6619       goto ld;
6620     case M_LWC0_AB:
6621       s = "lwc0";
6622       /* Itbl support may require additional care here.  */
6623       coproc = 1;
6624       goto ld;
6625     case M_LWC1_AB:
6626       s = "lwc1";
6627       /* Itbl support may require additional care here.  */
6628       coproc = 1;
6629       goto ld;
6630     case M_LWC2_AB:
6631       s = "lwc2";
6632       /* Itbl support may require additional care here.  */
6633       coproc = 1;
6634       goto ld;
6635     case M_LWC3_AB:
6636       s = "lwc3";
6637       /* Itbl support may require additional care here.  */
6638       coproc = 1;
6639       goto ld;
6640     case M_LWL_AB:
6641       s = "lwl";
6642       lr = 1;
6643       goto ld;
6644     case M_LWR_AB:
6645       s = "lwr";
6646       lr = 1;
6647       goto ld;
6648     case M_LDC1_AB:
6649       s = "ldc1";
6650       /* Itbl support may require additional care here.  */
6651       coproc = 1;
6652       goto ld;
6653     case M_LDC2_AB:
6654       s = "ldc2";
6655       /* Itbl support may require additional care here.  */
6656       coproc = 1;
6657       goto ld;
6658     case M_LDC3_AB:
6659       s = "ldc3";
6660       /* Itbl support may require additional care here.  */
6661       coproc = 1;
6662       goto ld;
6663     case M_LDL_AB:
6664       s = "ldl";
6665       lr = 1;
6666       goto ld;
6667     case M_LDR_AB:
6668       s = "ldr";
6669       lr = 1;
6670       goto ld;
6671     case M_LL_AB:
6672       s = "ll";
6673       goto ld;
6674     case M_LLD_AB:
6675       s = "lld";
6676       goto ld;
6677     case M_LWU_AB:
6678       s = "lwu";
6679     ld:
6680       if (breg == treg || coproc || lr)
6681         {
6682           tempreg = AT;
6683           used_at = 1;
6684         }
6685       else
6686         {
6687           tempreg = treg;
6688         }
6689       goto ld_st;
6690     case M_SB_AB:
6691       s = "sb";
6692       goto st;
6693     case M_SH_AB:
6694       s = "sh";
6695       goto st;
6696     case M_SW_AB:
6697       s = "sw";
6698       goto st;
6699     case M_SWC0_AB:
6700       s = "swc0";
6701       /* Itbl support may require additional care here.  */
6702       coproc = 1;
6703       goto st;
6704     case M_SWC1_AB:
6705       s = "swc1";
6706       /* Itbl support may require additional care here.  */
6707       coproc = 1;
6708       goto st;
6709     case M_SWC2_AB:
6710       s = "swc2";
6711       /* Itbl support may require additional care here.  */
6712       coproc = 1;
6713       goto st;
6714     case M_SWC3_AB:
6715       s = "swc3";
6716       /* Itbl support may require additional care here.  */
6717       coproc = 1;
6718       goto st;
6719     case M_SWL_AB:
6720       s = "swl";
6721       goto st;
6722     case M_SWR_AB:
6723       s = "swr";
6724       goto st;
6725     case M_SC_AB:
6726       s = "sc";
6727       goto st;
6728     case M_SCD_AB:
6729       s = "scd";
6730       goto st;
6731     case M_CACHE_AB:
6732       s = "cache";
6733       goto st;
6734     case M_PREF_AB:
6735       s = "pref";
6736       goto st;
6737     case M_SDC1_AB:
6738       s = "sdc1";
6739       coproc = 1;
6740       /* Itbl support may require additional care here.  */
6741       goto st;
6742     case M_SDC2_AB:
6743       s = "sdc2";
6744       /* Itbl support may require additional care here.  */
6745       coproc = 1;
6746       goto st;
6747     case M_SDC3_AB:
6748       s = "sdc3";
6749       /* Itbl support may require additional care here.  */
6750       coproc = 1;
6751       goto st;
6752     case M_SDL_AB:
6753       s = "sdl";
6754       goto st;
6755     case M_SDR_AB:
6756       s = "sdr";
6757     st:
6758       tempreg = AT;
6759       used_at = 1;
6760     ld_st:
6761       if (coproc
6762           && NO_ISA_COP (mips_opts.arch)
6763           && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
6764         {
6765           as_bad (_("Opcode not supported on this processor: %s"),
6766                   mips_cpu_info_from_arch (mips_opts.arch)->name);
6767           break;
6768         }
6769
6770       /* Itbl support may require additional care here.  */
6771       if (mask == M_LWC1_AB
6772           || mask == M_SWC1_AB
6773           || mask == M_LDC1_AB
6774           || mask == M_SDC1_AB
6775           || mask == M_L_DAB
6776           || mask == M_S_DAB)
6777         fmt = "T,o(b)";
6778       else if (mask == M_CACHE_AB || mask == M_PREF_AB)
6779         fmt = "k,o(b)";
6780       else if (coproc)
6781         fmt = "E,o(b)";
6782       else
6783         fmt = "t,o(b)";
6784
6785       if (offset_expr.X_op != O_constant
6786           && offset_expr.X_op != O_symbol)
6787         {
6788           as_bad (_("Expression too complex"));
6789           offset_expr.X_op = O_constant;
6790         }
6791
6792       if (HAVE_32BIT_ADDRESSES
6793           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6794         {
6795           char value [32];
6796
6797           sprintf_vma (value, offset_expr.X_add_number);
6798           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6799         }
6800
6801       /* A constant expression in PIC code can be handled just as it
6802          is in non PIC code.  */
6803       if (offset_expr.X_op == O_constant)
6804         {
6805           expr1.X_add_number = offset_expr.X_add_number;
6806           normalize_address_expr (&expr1);
6807           if (!IS_SEXT_16BIT_NUM (expr1.X_add_number))
6808             {
6809               expr1.X_add_number = ((expr1.X_add_number + 0x8000)
6810                                     & ~(bfd_vma) 0xffff);
6811               load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6812               if (breg != 0)
6813                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6814                              tempreg, tempreg, breg);
6815               breg = tempreg;
6816             }
6817           macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
6818         }
6819       else if (mips_pic == NO_PIC)
6820         {
6821           /* If this is a reference to a GP relative symbol, and there
6822              is no base register, we want
6823                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6824              Otherwise, if there is no base register, we want
6825                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6826                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6827              If we have a constant, we need two instructions anyhow,
6828              so we always use the latter form.
6829
6830              If we have a base register, and this is a reference to a
6831              GP relative symbol, we want
6832                addu     $tempreg,$breg,$gp
6833                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
6834              Otherwise we want
6835                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6836                addu     $tempreg,$tempreg,$breg
6837                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6838              With a constant we always use the latter case.
6839
6840              With 64bit address space and no base register and $at usable,
6841              we want
6842                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6843                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6844                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6845                dsll32   $tempreg,0
6846                daddu    $tempreg,$at
6847                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6848              If we have a base register, we want
6849                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6850                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6851                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6852                daddu    $at,$breg
6853                dsll32   $tempreg,0
6854                daddu    $tempreg,$at
6855                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6856
6857              Without $at we can't generate the optimal path for superscalar
6858              processors here since this would require two temporary registers.
6859                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6860                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6861                dsll     $tempreg,16
6862                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6863                dsll     $tempreg,16
6864                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6865              If we have a base register, we want
6866                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6867                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6868                dsll     $tempreg,16
6869                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6870                dsll     $tempreg,16
6871                daddu    $tempreg,$tempreg,$breg
6872                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6873
6874              For GP relative symbols in 64bit address space we can use
6875              the same sequence as in 32bit address space.  */
6876           if (HAVE_64BIT_SYMBOLS)
6877             {
6878               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6879                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6880                 {
6881                   relax_start (offset_expr.X_add_symbol);
6882                   if (breg == 0)
6883                     {
6884                       macro_build (&offset_expr, s, fmt, treg,
6885                                    BFD_RELOC_GPREL16, mips_gp_register);
6886                     }
6887                   else
6888                     {
6889                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6890                                    tempreg, breg, mips_gp_register);
6891                       macro_build (&offset_expr, s, fmt, treg,
6892                                    BFD_RELOC_GPREL16, tempreg);
6893                     }
6894                   relax_switch ();
6895                 }
6896
6897               if (used_at == 0 && mips_opts.at)
6898                 {
6899                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6900                                BFD_RELOC_MIPS_HIGHEST);
6901                   macro_build (&offset_expr, "lui", "t,u", AT,
6902                                BFD_RELOC_HI16_S);
6903                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6904                                tempreg, BFD_RELOC_MIPS_HIGHER);
6905                   if (breg != 0)
6906                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6907                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6908                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6909                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6910                                tempreg);
6911                   used_at = 1;
6912                 }
6913               else
6914                 {
6915                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6916                                BFD_RELOC_MIPS_HIGHEST);
6917                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6918                                tempreg, BFD_RELOC_MIPS_HIGHER);
6919                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6920                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6921                                tempreg, BFD_RELOC_HI16_S);
6922                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6923                   if (breg != 0)
6924                     macro_build (NULL, "daddu", "d,v,t",
6925                                  tempreg, tempreg, breg);
6926                   macro_build (&offset_expr, s, fmt, treg,
6927                                BFD_RELOC_LO16, tempreg);
6928                 }
6929
6930               if (mips_relax.sequence)
6931                 relax_end ();
6932               break;
6933             }
6934
6935           if (breg == 0)
6936             {
6937               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6938                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6939                 {
6940                   relax_start (offset_expr.X_add_symbol);
6941                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6942                                mips_gp_register);
6943                   relax_switch ();
6944                 }
6945               macro_build_lui (&offset_expr, tempreg);
6946               macro_build (&offset_expr, s, fmt, treg,
6947                            BFD_RELOC_LO16, tempreg);
6948               if (mips_relax.sequence)
6949                 relax_end ();
6950             }
6951           else
6952             {
6953               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6954                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6955                 {
6956                   relax_start (offset_expr.X_add_symbol);
6957                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6958                                tempreg, breg, mips_gp_register);
6959                   macro_build (&offset_expr, s, fmt, treg,
6960                                BFD_RELOC_GPREL16, tempreg);
6961                   relax_switch ();
6962                 }
6963               macro_build_lui (&offset_expr, tempreg);
6964               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6965                            tempreg, tempreg, breg);
6966               macro_build (&offset_expr, s, fmt, treg,
6967                            BFD_RELOC_LO16, tempreg);
6968               if (mips_relax.sequence)
6969                 relax_end ();
6970             }
6971         }
6972       else if (!mips_big_got)
6973         {
6974           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6975
6976           /* If this is a reference to an external symbol, we want
6977                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6978                nop
6979                <op>     $treg,0($tempreg)
6980              Otherwise we want
6981                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6982                nop
6983                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6984                <op>     $treg,0($tempreg)
6985
6986              For NewABI, we want
6987                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6988                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6989
6990              If there is a base register, we add it to $tempreg before
6991              the <op>.  If there is a constant, we stick it in the
6992              <op> instruction.  We don't handle constants larger than
6993              16 bits, because we have no way to load the upper 16 bits
6994              (actually, we could handle them for the subset of cases
6995              in which we are not using $at).  */
6996           gas_assert (offset_expr.X_op == O_symbol);
6997           if (HAVE_NEWABI)
6998             {
6999               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7000                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
7001               if (breg != 0)
7002                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7003                              tempreg, tempreg, breg);
7004               macro_build (&offset_expr, s, fmt, treg,
7005                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
7006               break;
7007             }
7008           expr1.X_add_number = offset_expr.X_add_number;
7009           offset_expr.X_add_number = 0;
7010           if (expr1.X_add_number < -0x8000
7011               || expr1.X_add_number >= 0x8000)
7012             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7013           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7014                        lw_reloc_type, mips_gp_register);
7015           load_delay_nop ();
7016           relax_start (offset_expr.X_add_symbol);
7017           relax_switch ();
7018           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
7019                        tempreg, BFD_RELOC_LO16);
7020           relax_end ();
7021           if (breg != 0)
7022             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7023                          tempreg, tempreg, breg);
7024           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
7025         }
7026       else if (mips_big_got && !HAVE_NEWABI)
7027         {
7028           int gpdelay;
7029
7030           /* If this is a reference to an external symbol, we want
7031                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7032                addu     $tempreg,$tempreg,$gp
7033                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7034                <op>     $treg,0($tempreg)
7035              Otherwise we want
7036                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7037                nop
7038                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7039                <op>     $treg,0($tempreg)
7040              If there is a base register, we add it to $tempreg before
7041              the <op>.  If there is a constant, we stick it in the
7042              <op> instruction.  We don't handle constants larger than
7043              16 bits, because we have no way to load the upper 16 bits
7044              (actually, we could handle them for the subset of cases
7045              in which we are not using $at).  */
7046           gas_assert (offset_expr.X_op == O_symbol);
7047           expr1.X_add_number = offset_expr.X_add_number;
7048           offset_expr.X_add_number = 0;
7049           if (expr1.X_add_number < -0x8000
7050               || expr1.X_add_number >= 0x8000)
7051             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7052           gpdelay = reg_needs_delay (mips_gp_register);
7053           relax_start (offset_expr.X_add_symbol);
7054           macro_build (&offset_expr, "lui", "t,u", tempreg,
7055                        BFD_RELOC_MIPS_GOT_HI16);
7056           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
7057                        mips_gp_register);
7058           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7059                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
7060           relax_switch ();
7061           if (gpdelay)
7062             macro_build (NULL, "nop", "");
7063           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7064                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
7065           load_delay_nop ();
7066           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
7067                        tempreg, BFD_RELOC_LO16);
7068           relax_end ();
7069
7070           if (breg != 0)
7071             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7072                          tempreg, tempreg, breg);
7073           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
7074         }
7075       else if (mips_big_got && HAVE_NEWABI)
7076         {
7077           /* If this is a reference to an external symbol, we want
7078                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7079                add      $tempreg,$tempreg,$gp
7080                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7081                <op>     $treg,<ofst>($tempreg)
7082              Otherwise, for local symbols, we want:
7083                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
7084                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
7085           gas_assert (offset_expr.X_op == O_symbol);
7086           expr1.X_add_number = offset_expr.X_add_number;
7087           offset_expr.X_add_number = 0;
7088           if (expr1.X_add_number < -0x8000
7089               || expr1.X_add_number >= 0x8000)
7090             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7091           relax_start (offset_expr.X_add_symbol);
7092           macro_build (&offset_expr, "lui", "t,u", tempreg,
7093                        BFD_RELOC_MIPS_GOT_HI16);
7094           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
7095                        mips_gp_register);
7096           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7097                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
7098           if (breg != 0)
7099             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7100                          tempreg, tempreg, breg);
7101           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
7102
7103           relax_switch ();
7104           offset_expr.X_add_number = expr1.X_add_number;
7105           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7106                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
7107           if (breg != 0)
7108             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7109                          tempreg, tempreg, breg);
7110           macro_build (&offset_expr, s, fmt, treg,
7111                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
7112           relax_end ();
7113         }
7114       else
7115         abort ();
7116
7117       break;
7118
7119     case M_LI:
7120     case M_LI_S:
7121       load_register (treg, &imm_expr, 0);
7122       break;
7123
7124     case M_DLI:
7125       load_register (treg, &imm_expr, 1);
7126       break;
7127
7128     case M_LI_SS:
7129       if (imm_expr.X_op == O_constant)
7130         {
7131           used_at = 1;
7132           load_register (AT, &imm_expr, 0);
7133           macro_build (NULL, "mtc1", "t,G", AT, treg);
7134           break;
7135         }
7136       else
7137         {
7138           gas_assert (offset_expr.X_op == O_symbol
7139                       && strcmp (segment_name (S_GET_SEGMENT
7140                                                (offset_expr.X_add_symbol)),
7141                                  ".lit4") == 0
7142                       && offset_expr.X_add_number == 0);
7143           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
7144                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
7145           break;
7146         }
7147
7148     case M_LI_D:
7149       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
7150          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
7151          order 32 bits of the value and the low order 32 bits are either
7152          zero or in OFFSET_EXPR.  */
7153       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
7154         {
7155           if (HAVE_64BIT_GPRS)
7156             load_register (treg, &imm_expr, 1);
7157           else
7158             {
7159               int hreg, lreg;
7160
7161               if (target_big_endian)
7162                 {
7163                   hreg = treg;
7164                   lreg = treg + 1;
7165                 }
7166               else
7167                 {
7168                   hreg = treg + 1;
7169                   lreg = treg;
7170                 }
7171
7172               if (hreg <= 31)
7173                 load_register (hreg, &imm_expr, 0);
7174               if (lreg <= 31)
7175                 {
7176                   if (offset_expr.X_op == O_absent)
7177                     move_register (lreg, 0);
7178                   else
7179                     {
7180                       gas_assert (offset_expr.X_op == O_constant);
7181                       load_register (lreg, &offset_expr, 0);
7182                     }
7183                 }
7184             }
7185           break;
7186         }
7187
7188       /* We know that sym is in the .rdata section.  First we get the
7189          upper 16 bits of the address.  */
7190       if (mips_pic == NO_PIC)
7191         {
7192           macro_build_lui (&offset_expr, AT);
7193           used_at = 1;
7194         }
7195       else
7196         {
7197           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7198                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
7199           used_at = 1;
7200         }
7201
7202       /* Now we load the register(s).  */
7203       if (HAVE_64BIT_GPRS)
7204         {
7205           used_at = 1;
7206           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7207         }
7208       else
7209         {
7210           used_at = 1;
7211           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7212           if (treg != RA)
7213             {
7214               /* FIXME: How in the world do we deal with the possible
7215                  overflow here?  */
7216               offset_expr.X_add_number += 4;
7217               macro_build (&offset_expr, "lw", "t,o(b)",
7218                            treg + 1, BFD_RELOC_LO16, AT);
7219             }
7220         }
7221       break;
7222
7223     case M_LI_DD:
7224       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
7225          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
7226          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
7227          the value and the low order 32 bits are either zero or in
7228          OFFSET_EXPR.  */
7229       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
7230         {
7231           used_at = 1;
7232           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
7233           if (HAVE_64BIT_FPRS)
7234             {
7235               gas_assert (HAVE_64BIT_GPRS);
7236               macro_build (NULL, "dmtc1", "t,S", AT, treg);
7237             }
7238           else
7239             {
7240               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
7241               if (offset_expr.X_op == O_absent)
7242                 macro_build (NULL, "mtc1", "t,G", 0, treg);
7243               else
7244                 {
7245                   gas_assert (offset_expr.X_op == O_constant);
7246                   load_register (AT, &offset_expr, 0);
7247                   macro_build (NULL, "mtc1", "t,G", AT, treg);
7248                 }
7249             }
7250           break;
7251         }
7252
7253       gas_assert (offset_expr.X_op == O_symbol
7254                   && offset_expr.X_add_number == 0);
7255       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
7256       if (strcmp (s, ".lit8") == 0)
7257         {
7258           if (mips_opts.isa != ISA_MIPS1)
7259             {
7260               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
7261                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
7262               break;
7263             }
7264           breg = mips_gp_register;
7265           r = BFD_RELOC_MIPS_LITERAL;
7266           goto dob;
7267         }
7268       else
7269         {
7270           gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
7271           used_at = 1;
7272           if (mips_pic != NO_PIC)
7273             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7274                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
7275           else
7276             {
7277               /* FIXME: This won't work for a 64 bit address.  */
7278               macro_build_lui (&offset_expr, AT);
7279             }
7280
7281           if (mips_opts.isa != ISA_MIPS1)
7282             {
7283               macro_build (&offset_expr, "ldc1", "T,o(b)",
7284                            treg, BFD_RELOC_LO16, AT);
7285               break;
7286             }
7287           breg = AT;
7288           r = BFD_RELOC_LO16;
7289           goto dob;
7290         }
7291
7292     case M_L_DOB:
7293       /* Even on a big endian machine $fn comes before $fn+1.  We have
7294          to adjust when loading from memory.  */
7295       r = BFD_RELOC_LO16;
7296     dob:
7297       gas_assert (mips_opts.isa == ISA_MIPS1);
7298       macro_build (&offset_expr, "lwc1", "T,o(b)",
7299                    target_big_endian ? treg + 1 : treg, r, breg);
7300       /* FIXME: A possible overflow which I don't know how to deal
7301          with.  */
7302       offset_expr.X_add_number += 4;
7303       macro_build (&offset_expr, "lwc1", "T,o(b)",
7304                    target_big_endian ? treg : treg + 1, r, breg);
7305       break;
7306
7307     case M_S_DOB:
7308       gas_assert (mips_opts.isa == ISA_MIPS1);
7309       /* Even on a big endian machine $fn comes before $fn+1.  We have
7310          to adjust when storing to memory.  */
7311       macro_build (&offset_expr, "swc1", "T,o(b)",
7312                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7313       offset_expr.X_add_number += 4;
7314       macro_build (&offset_expr, "swc1", "T,o(b)",
7315                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7316       break;
7317
7318     case M_L_DAB:
7319       /*
7320        * The MIPS assembler seems to check for X_add_number not
7321        * being double aligned and generating:
7322        *        lui     at,%hi(foo+1)
7323        *        addu    at,at,v1
7324        *        addiu   at,at,%lo(foo+1)
7325        *        lwc1    f2,0(at)
7326        *        lwc1    f3,4(at)
7327        * But, the resulting address is the same after relocation so why
7328        * generate the extra instruction?
7329        */
7330       /* Itbl support may require additional care here.  */
7331       coproc = 1;
7332       if (mips_opts.isa != ISA_MIPS1)
7333         {
7334           s = "ldc1";
7335           goto ld;
7336         }
7337
7338       s = "lwc1";
7339       fmt = "T,o(b)";
7340       goto ldd_std;
7341
7342     case M_S_DAB:
7343       if (mips_opts.isa != ISA_MIPS1)
7344         {
7345           s = "sdc1";
7346           goto st;
7347         }
7348
7349       s = "swc1";
7350       fmt = "T,o(b)";
7351       /* Itbl support may require additional care here.  */
7352       coproc = 1;
7353       goto ldd_std;
7354
7355     case M_LD_AB:
7356       if (HAVE_64BIT_GPRS)
7357         {
7358           s = "ld";
7359           goto ld;
7360         }
7361
7362       s = "lw";
7363       fmt = "t,o(b)";
7364       goto ldd_std;
7365
7366     case M_SD_AB:
7367       if (HAVE_64BIT_GPRS)
7368         {
7369           s = "sd";
7370           goto st;
7371         }
7372
7373       s = "sw";
7374       fmt = "t,o(b)";
7375
7376     ldd_std:
7377       if (offset_expr.X_op != O_symbol
7378           && offset_expr.X_op != O_constant)
7379         {
7380           as_bad (_("Expression too complex"));
7381           offset_expr.X_op = O_constant;
7382         }
7383
7384       if (HAVE_32BIT_ADDRESSES
7385           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7386         {
7387           char value [32];
7388
7389           sprintf_vma (value, offset_expr.X_add_number);
7390           as_bad (_("Number (0x%s) larger than 32 bits"), value);
7391         }
7392
7393       /* Even on a big endian machine $fn comes before $fn+1.  We have
7394          to adjust when loading from memory.  We set coproc if we must
7395          load $fn+1 first.  */
7396       /* Itbl support may require additional care here.  */
7397       if (!target_big_endian)
7398         coproc = 0;
7399
7400       if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
7401         {
7402           /* If this is a reference to a GP relative symbol, we want
7403                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
7404                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
7405              If we have a base register, we use this
7406                addu     $at,$breg,$gp
7407                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
7408                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
7409              If this is not a GP relative symbol, we want
7410                lui      $at,<sym>               (BFD_RELOC_HI16_S)
7411                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7412                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7413              If there is a base register, we add it to $at after the
7414              lui instruction.  If there is a constant, we always use
7415              the last case.  */
7416           if (offset_expr.X_op == O_symbol
7417               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7418               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7419             {
7420               relax_start (offset_expr.X_add_symbol);
7421               if (breg == 0)
7422                 {
7423                   tempreg = mips_gp_register;
7424                 }
7425               else
7426                 {
7427                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7428                                AT, breg, mips_gp_register);
7429                   tempreg = AT;
7430                   used_at = 1;
7431                 }
7432
7433               /* Itbl support may require additional care here.  */
7434               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7435                            BFD_RELOC_GPREL16, tempreg);
7436               offset_expr.X_add_number += 4;
7437
7438               /* Set mips_optimize to 2 to avoid inserting an
7439                  undesired nop.  */
7440               hold_mips_optimize = mips_optimize;
7441               mips_optimize = 2;
7442               /* Itbl support may require additional care here.  */
7443               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7444                            BFD_RELOC_GPREL16, tempreg);
7445               mips_optimize = hold_mips_optimize;
7446
7447               relax_switch ();
7448
7449               offset_expr.X_add_number -= 4;
7450             }
7451           used_at = 1;
7452           macro_build_lui (&offset_expr, AT);
7453           if (breg != 0)
7454             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7455           /* Itbl support may require additional care here.  */
7456           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7457                        BFD_RELOC_LO16, AT);
7458           /* FIXME: How do we handle overflow here?  */
7459           offset_expr.X_add_number += 4;
7460           /* Itbl support may require additional care here.  */
7461           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7462                        BFD_RELOC_LO16, AT);
7463           if (mips_relax.sequence)
7464             relax_end ();
7465         }
7466       else if (!mips_big_got)
7467         {
7468           /* If this is a reference to an external symbol, we want
7469                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7470                nop
7471                <op>     $treg,0($at)
7472                <op>     $treg+1,4($at)
7473              Otherwise we want
7474                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7475                nop
7476                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7477                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7478              If there is a base register we add it to $at before the
7479              lwc1 instructions.  If there is a constant we include it
7480              in the lwc1 instructions.  */
7481           used_at = 1;
7482           expr1.X_add_number = offset_expr.X_add_number;
7483           if (expr1.X_add_number < -0x8000
7484               || expr1.X_add_number >= 0x8000 - 4)
7485             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7486           load_got_offset (AT, &offset_expr);
7487           load_delay_nop ();
7488           if (breg != 0)
7489             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7490
7491           /* Set mips_optimize to 2 to avoid inserting an undesired
7492              nop.  */
7493           hold_mips_optimize = mips_optimize;
7494           mips_optimize = 2;
7495
7496           /* Itbl support may require additional care here.  */
7497           relax_start (offset_expr.X_add_symbol);
7498           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7499                        BFD_RELOC_LO16, AT);
7500           expr1.X_add_number += 4;
7501           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7502                        BFD_RELOC_LO16, AT);
7503           relax_switch ();
7504           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7505                        BFD_RELOC_LO16, AT);
7506           offset_expr.X_add_number += 4;
7507           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7508                        BFD_RELOC_LO16, AT);
7509           relax_end ();
7510
7511           mips_optimize = hold_mips_optimize;
7512         }
7513       else if (mips_big_got)
7514         {
7515           int gpdelay;
7516
7517           /* If this is a reference to an external symbol, we want
7518                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
7519                addu     $at,$at,$gp
7520                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
7521                nop
7522                <op>     $treg,0($at)
7523                <op>     $treg+1,4($at)
7524              Otherwise we want
7525                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7526                nop
7527                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7528                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7529              If there is a base register we add it to $at before the
7530              lwc1 instructions.  If there is a constant we include it
7531              in the lwc1 instructions.  */
7532           used_at = 1;
7533           expr1.X_add_number = offset_expr.X_add_number;
7534           offset_expr.X_add_number = 0;
7535           if (expr1.X_add_number < -0x8000
7536               || expr1.X_add_number >= 0x8000 - 4)
7537             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7538           gpdelay = reg_needs_delay (mips_gp_register);
7539           relax_start (offset_expr.X_add_symbol);
7540           macro_build (&offset_expr, "lui", "t,u",
7541                        AT, BFD_RELOC_MIPS_GOT_HI16);
7542           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7543                        AT, AT, mips_gp_register);
7544           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7545                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7546           load_delay_nop ();
7547           if (breg != 0)
7548             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7549           /* Itbl support may require additional care here.  */
7550           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7551                        BFD_RELOC_LO16, AT);
7552           expr1.X_add_number += 4;
7553
7554           /* Set mips_optimize to 2 to avoid inserting an undesired
7555              nop.  */
7556           hold_mips_optimize = mips_optimize;
7557           mips_optimize = 2;
7558           /* Itbl support may require additional care here.  */
7559           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7560                        BFD_RELOC_LO16, AT);
7561           mips_optimize = hold_mips_optimize;
7562           expr1.X_add_number -= 4;
7563
7564           relax_switch ();
7565           offset_expr.X_add_number = expr1.X_add_number;
7566           if (gpdelay)
7567             macro_build (NULL, "nop", "");
7568           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7569                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
7570           load_delay_nop ();
7571           if (breg != 0)
7572             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7573           /* Itbl support may require additional care here.  */
7574           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7575                        BFD_RELOC_LO16, AT);
7576           offset_expr.X_add_number += 4;
7577
7578           /* Set mips_optimize to 2 to avoid inserting an undesired
7579              nop.  */
7580           hold_mips_optimize = mips_optimize;
7581           mips_optimize = 2;
7582           /* Itbl support may require additional care here.  */
7583           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7584                        BFD_RELOC_LO16, AT);
7585           mips_optimize = hold_mips_optimize;
7586           relax_end ();
7587         }
7588       else
7589         abort ();
7590
7591       break;
7592
7593     case M_LD_OB:
7594       s = HAVE_64BIT_GPRS ? "ld" : "lw";
7595       goto sd_ob;
7596     case M_SD_OB:
7597       s = HAVE_64BIT_GPRS ? "sd" : "sw";
7598     sd_ob:
7599       macro_build (&offset_expr, s, "t,o(b)", treg,
7600                    -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7601                    breg);
7602       if (!HAVE_64BIT_GPRS)
7603         {
7604           offset_expr.X_add_number += 4;
7605           macro_build (&offset_expr, s, "t,o(b)", treg + 1,
7606                        -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7607                        breg);
7608         }
7609       break;
7610
7611    /* New code added to support COPZ instructions.
7612       This code builds table entries out of the macros in mip_opcodes.
7613       R4000 uses interlocks to handle coproc delays.
7614       Other chips (like the R3000) require nops to be inserted for delays.
7615
7616       FIXME: Currently, we require that the user handle delays.
7617       In order to fill delay slots for non-interlocked chips,
7618       we must have a way to specify delays based on the coprocessor.
7619       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7620       What are the side-effects of the cop instruction?
7621       What cache support might we have and what are its effects?
7622       Both coprocessor & memory require delays. how long???
7623       What registers are read/set/modified?
7624
7625       If an itbl is provided to interpret cop instructions,
7626       this knowledge can be encoded in the itbl spec.  */
7627
7628     case M_COP0:
7629       s = "c0";
7630       goto copz;
7631     case M_COP1:
7632       s = "c1";
7633       goto copz;
7634     case M_COP2:
7635       s = "c2";
7636       goto copz;
7637     case M_COP3:
7638       s = "c3";
7639     copz:
7640       if (NO_ISA_COP (mips_opts.arch)
7641           && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
7642         {
7643           as_bad (_("opcode not supported on this processor: %s"),
7644                   mips_cpu_info_from_arch (mips_opts.arch)->name);
7645           break;
7646         }
7647
7648       /* For now we just do C (same as Cz).  The parameter will be
7649          stored in insn_opcode by mips_ip.  */
7650       macro_build (NULL, s, "C", ip->insn_opcode);
7651       break;
7652
7653     case M_MOVE:
7654       move_register (dreg, sreg);
7655       break;
7656
7657     case M_DMUL:
7658       dbl = 1;
7659     case M_MUL:
7660       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7661       macro_build (NULL, "mflo", "d", dreg);
7662       break;
7663
7664     case M_DMUL_I:
7665       dbl = 1;
7666     case M_MUL_I:
7667       /* The MIPS assembler some times generates shifts and adds.  I'm
7668          not trying to be that fancy. GCC should do this for us
7669          anyway.  */
7670       used_at = 1;
7671       load_register (AT, &imm_expr, dbl);
7672       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7673       macro_build (NULL, "mflo", "d", dreg);
7674       break;
7675
7676     case M_DMULO_I:
7677       dbl = 1;
7678     case M_MULO_I:
7679       imm = 1;
7680       goto do_mulo;
7681
7682     case M_DMULO:
7683       dbl = 1;
7684     case M_MULO:
7685     do_mulo:
7686       start_noreorder ();
7687       used_at = 1;
7688       if (imm)
7689         load_register (AT, &imm_expr, dbl);
7690       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7691       macro_build (NULL, "mflo", "d", dreg);
7692       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7693       macro_build (NULL, "mfhi", "d", AT);
7694       if (mips_trap)
7695         macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7696       else
7697         {
7698           expr1.X_add_number = 8;
7699           macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7700           macro_build (NULL, "nop", "");
7701           macro_build (NULL, "break", "c", 6);
7702         }
7703       end_noreorder ();
7704       macro_build (NULL, "mflo", "d", dreg);
7705       break;
7706
7707     case M_DMULOU_I:
7708       dbl = 1;
7709     case M_MULOU_I:
7710       imm = 1;
7711       goto do_mulou;
7712
7713     case M_DMULOU:
7714       dbl = 1;
7715     case M_MULOU:
7716     do_mulou:
7717       start_noreorder ();
7718       used_at = 1;
7719       if (imm)
7720         load_register (AT, &imm_expr, dbl);
7721       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7722                    sreg, imm ? AT : treg);
7723       macro_build (NULL, "mfhi", "d", AT);
7724       macro_build (NULL, "mflo", "d", dreg);
7725       if (mips_trap)
7726         macro_build (NULL, "tne", "s,t,q", AT, ZERO, 6);
7727       else
7728         {
7729           expr1.X_add_number = 8;
7730           macro_build (&expr1, "beq", "s,t,p", AT, ZERO);
7731           macro_build (NULL, "nop", "");
7732           macro_build (NULL, "break", "c", 6);
7733         }
7734       end_noreorder ();
7735       break;
7736
7737     case M_DROL:
7738       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7739         {
7740           if (dreg == sreg)
7741             {
7742               tempreg = AT;
7743               used_at = 1;
7744             }
7745           else
7746             {
7747               tempreg = dreg;
7748             }
7749           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7750           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7751           break;
7752         }
7753       used_at = 1;
7754       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
7755       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7756       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7757       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7758       break;
7759
7760     case M_ROL:
7761       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7762         {
7763           if (dreg == sreg)
7764             {
7765               tempreg = AT;
7766               used_at = 1;
7767             }
7768           else
7769             {
7770               tempreg = dreg;
7771             }
7772           macro_build (NULL, "negu", "d,w", tempreg, treg);
7773           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7774           break;
7775         }
7776       used_at = 1;
7777       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
7778       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7779       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7780       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7781       break;
7782
7783     case M_DROL_I:
7784       {
7785         unsigned int rot;
7786         char *l;
7787         char *rr;
7788
7789         if (imm_expr.X_op != O_constant)
7790           as_bad (_("Improper rotate count"));
7791         rot = imm_expr.X_add_number & 0x3f;
7792         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7793           {
7794             rot = (64 - rot) & 0x3f;
7795             if (rot >= 32)
7796               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7797             else
7798               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7799             break;
7800           }
7801         if (rot == 0)
7802           {
7803             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7804             break;
7805           }
7806         l = (rot < 0x20) ? "dsll" : "dsll32";
7807         rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7808         rot &= 0x1f;
7809         used_at = 1;
7810         macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7811         macro_build (NULL, rr, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7812         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7813       }
7814       break;
7815
7816     case M_ROL_I:
7817       {
7818         unsigned int rot;
7819
7820         if (imm_expr.X_op != O_constant)
7821           as_bad (_("Improper rotate count"));
7822         rot = imm_expr.X_add_number & 0x1f;
7823         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7824           {
7825             macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7826             break;
7827           }
7828         if (rot == 0)
7829           {
7830             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7831             break;
7832           }
7833         used_at = 1;
7834         macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7835         macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7836         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7837       }
7838       break;
7839
7840     case M_DROR:
7841       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7842         {
7843           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7844           break;
7845         }
7846       used_at = 1;
7847       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
7848       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7849       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7850       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7851       break;
7852
7853     case M_ROR:
7854       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7855         {
7856           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7857           break;
7858         }
7859       used_at = 1;
7860       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
7861       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7862       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7863       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7864       break;
7865
7866     case M_DROR_I:
7867       {
7868         unsigned int rot;
7869         char *l;
7870         char *rr;
7871
7872         if (imm_expr.X_op != O_constant)
7873           as_bad (_("Improper rotate count"));
7874         rot = imm_expr.X_add_number & 0x3f;
7875         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7876           {
7877             if (rot >= 32)
7878               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7879             else
7880               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7881             break;
7882           }
7883         if (rot == 0)
7884           {
7885             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7886             break;
7887           }
7888         rr = (rot < 0x20) ? "dsrl" : "dsrl32";
7889         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7890         rot &= 0x1f;
7891         used_at = 1;
7892         macro_build (NULL, rr, "d,w,<", AT, sreg, rot);
7893         macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7894         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7895       }
7896       break;
7897
7898     case M_ROR_I:
7899       {
7900         unsigned int rot;
7901
7902         if (imm_expr.X_op != O_constant)
7903           as_bad (_("Improper rotate count"));
7904         rot = imm_expr.X_add_number & 0x1f;
7905         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7906           {
7907             macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7908             break;
7909           }
7910         if (rot == 0)
7911           {
7912             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7913             break;
7914           }
7915         used_at = 1;
7916         macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7917         macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7918         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7919       }
7920       break;
7921
7922     case M_SEQ:
7923       if (sreg == 0)
7924         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7925       else if (treg == 0)
7926         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7927       else
7928         {
7929           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7930           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7931         }
7932       break;
7933
7934     case M_SEQ_I:
7935       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7936         {
7937           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7938           break;
7939         }
7940       if (sreg == 0)
7941         {
7942           as_warn (_("Instruction %s: result is always false"),
7943                    ip->insn_mo->name);
7944           move_register (dreg, 0);
7945           break;
7946         }
7947       if (CPU_HAS_SEQ (mips_opts.arch)
7948           && -512 <= imm_expr.X_add_number
7949           && imm_expr.X_add_number < 512)
7950         {
7951           macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
7952                        (int) imm_expr.X_add_number);
7953           break;
7954         }
7955       if (imm_expr.X_op == O_constant
7956           && imm_expr.X_add_number >= 0
7957           && imm_expr.X_add_number < 0x10000)
7958         {
7959           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7960         }
7961       else if (imm_expr.X_op == O_constant
7962                && imm_expr.X_add_number > -0x8000
7963                && imm_expr.X_add_number < 0)
7964         {
7965           imm_expr.X_add_number = -imm_expr.X_add_number;
7966           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7967                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7968         }
7969       else if (CPU_HAS_SEQ (mips_opts.arch))
7970         {
7971           used_at = 1;
7972           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7973           macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
7974           break;
7975         }
7976       else
7977         {
7978           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7979           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7980           used_at = 1;
7981         }
7982       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7983       break;
7984
7985     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7986       s = "slt";
7987       goto sge;
7988     case M_SGEU:
7989       s = "sltu";
7990     sge:
7991       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7992       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7993       break;
7994
7995     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7996     case M_SGEU_I:
7997       if (imm_expr.X_op == O_constant
7998           && imm_expr.X_add_number >= -0x8000
7999           && imm_expr.X_add_number < 0x8000)
8000         {
8001           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
8002                        dreg, sreg, BFD_RELOC_LO16);
8003         }
8004       else
8005         {
8006           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8007           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
8008                        dreg, sreg, AT);
8009           used_at = 1;
8010         }
8011       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8012       break;
8013
8014     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
8015       s = "slt";
8016       goto sgt;
8017     case M_SGTU:
8018       s = "sltu";
8019     sgt:
8020       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
8021       break;
8022
8023     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
8024       s = "slt";
8025       goto sgti;
8026     case M_SGTU_I:
8027       s = "sltu";
8028     sgti:
8029       used_at = 1;
8030       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8031       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
8032       break;
8033
8034     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
8035       s = "slt";
8036       goto sle;
8037     case M_SLEU:
8038       s = "sltu";
8039     sle:
8040       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
8041       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8042       break;
8043
8044     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
8045       s = "slt";
8046       goto slei;
8047     case M_SLEU_I:
8048       s = "sltu";
8049     slei:
8050       used_at = 1;
8051       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8052       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
8053       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8054       break;
8055
8056     case M_SLT_I:
8057       if (imm_expr.X_op == O_constant
8058           && imm_expr.X_add_number >= -0x8000
8059           && imm_expr.X_add_number < 0x8000)
8060         {
8061           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
8062           break;
8063         }
8064       used_at = 1;
8065       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8066       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
8067       break;
8068
8069     case M_SLTU_I:
8070       if (imm_expr.X_op == O_constant
8071           && imm_expr.X_add_number >= -0x8000
8072           && imm_expr.X_add_number < 0x8000)
8073         {
8074           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
8075                        BFD_RELOC_LO16);
8076           break;
8077         }
8078       used_at = 1;
8079       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8080       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
8081       break;
8082
8083     case M_SNE:
8084       if (sreg == 0)
8085         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
8086       else if (treg == 0)
8087         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
8088       else
8089         {
8090           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
8091           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
8092         }
8093       break;
8094
8095     case M_SNE_I:
8096       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
8097         {
8098           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
8099           break;
8100         }
8101       if (sreg == 0)
8102         {
8103           as_warn (_("Instruction %s: result is always true"),
8104                    ip->insn_mo->name);
8105           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
8106                        dreg, 0, BFD_RELOC_LO16);
8107           break;
8108         }
8109       if (CPU_HAS_SEQ (mips_opts.arch)
8110           && -512 <= imm_expr.X_add_number
8111           && imm_expr.X_add_number < 512)
8112         {
8113           macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
8114                        (int) imm_expr.X_add_number);
8115           break;
8116         }
8117       if (imm_expr.X_op == O_constant
8118           && imm_expr.X_add_number >= 0
8119           && imm_expr.X_add_number < 0x10000)
8120         {
8121           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
8122         }
8123       else if (imm_expr.X_op == O_constant
8124                && imm_expr.X_add_number > -0x8000
8125                && imm_expr.X_add_number < 0)
8126         {
8127           imm_expr.X_add_number = -imm_expr.X_add_number;
8128           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
8129                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
8130         }
8131       else if (CPU_HAS_SEQ (mips_opts.arch))
8132         {
8133           used_at = 1;
8134           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8135           macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
8136           break;
8137         }
8138       else
8139         {
8140           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8141           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
8142           used_at = 1;
8143         }
8144       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
8145       break;
8146
8147     case M_DSUB_I:
8148       dbl = 1;
8149     case M_SUB_I:
8150       if (imm_expr.X_op == O_constant
8151           && imm_expr.X_add_number > -0x8000
8152           && imm_expr.X_add_number <= 0x8000)
8153         {
8154           imm_expr.X_add_number = -imm_expr.X_add_number;
8155           macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
8156                        dreg, sreg, BFD_RELOC_LO16);
8157           break;
8158         }
8159       used_at = 1;
8160       load_register (AT, &imm_expr, dbl);
8161       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
8162       break;
8163
8164     case M_DSUBU_I:
8165       dbl = 1;
8166     case M_SUBU_I:
8167       if (imm_expr.X_op == O_constant
8168           && imm_expr.X_add_number > -0x8000
8169           && imm_expr.X_add_number <= 0x8000)
8170         {
8171           imm_expr.X_add_number = -imm_expr.X_add_number;
8172           macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
8173                        dreg, sreg, BFD_RELOC_LO16);
8174           break;
8175         }
8176       used_at = 1;
8177       load_register (AT, &imm_expr, dbl);
8178       macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
8179       break;
8180
8181     case M_TEQ_I:
8182       s = "teq";
8183       goto trap;
8184     case M_TGE_I:
8185       s = "tge";
8186       goto trap;
8187     case M_TGEU_I:
8188       s = "tgeu";
8189       goto trap;
8190     case M_TLT_I:
8191       s = "tlt";
8192       goto trap;
8193     case M_TLTU_I:
8194       s = "tltu";
8195       goto trap;
8196     case M_TNE_I:
8197       s = "tne";
8198     trap:
8199       used_at = 1;
8200       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8201       macro_build (NULL, s, "s,t", sreg, AT);
8202       break;
8203
8204     case M_TRUNCWS:
8205     case M_TRUNCWD:
8206       gas_assert (mips_opts.isa == ISA_MIPS1);
8207       used_at = 1;
8208       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
8209       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
8210
8211       /*
8212        * Is the double cfc1 instruction a bug in the mips assembler;
8213        * or is there a reason for it?
8214        */
8215       start_noreorder ();
8216       macro_build (NULL, "cfc1", "t,G", treg, RA);
8217       macro_build (NULL, "cfc1", "t,G", treg, RA);
8218       macro_build (NULL, "nop", "");
8219       expr1.X_add_number = 3;
8220       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
8221       expr1.X_add_number = 2;
8222       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
8223       macro_build (NULL, "ctc1", "t,G", AT, RA);
8224       macro_build (NULL, "nop", "");
8225       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
8226                    dreg, sreg);
8227       macro_build (NULL, "ctc1", "t,G", treg, RA);
8228       macro_build (NULL, "nop", "");
8229       end_noreorder ();
8230       break;
8231
8232     case M_ULH:
8233       s = "lb";
8234       goto ulh;
8235     case M_ULHU:
8236       s = "lbu";
8237     ulh:
8238       used_at = 1;
8239       if (offset_expr.X_add_number >= 0x7fff)
8240         as_bad (_("Operand overflow"));
8241       if (!target_big_endian)
8242         ++offset_expr.X_add_number;
8243       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
8244       if (!target_big_endian)
8245         --offset_expr.X_add_number;
8246       else
8247         ++offset_expr.X_add_number;
8248       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8249       macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
8250       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8251       break;
8252
8253     case M_ULD:
8254       s = "ldl";
8255       s2 = "ldr";
8256       off = 7;
8257       goto ulw;
8258     case M_ULW:
8259       s = "lwl";
8260       s2 = "lwr";
8261       off = 3;
8262     ulw:
8263       if (offset_expr.X_add_number >= 0x8000 - off)
8264         as_bad (_("Operand overflow"));
8265       if (treg != breg)
8266         tempreg = treg;
8267       else
8268         {
8269           used_at = 1;
8270           tempreg = AT;
8271         }
8272       if (!target_big_endian)
8273         offset_expr.X_add_number += off;
8274       macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8275       if (!target_big_endian)
8276         offset_expr.X_add_number -= off;
8277       else
8278         offset_expr.X_add_number += off;
8279       macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8280
8281       /* If necessary, move the result in tempreg to the final destination.  */
8282       if (treg == tempreg)
8283         break;
8284       /* Protect second load's delay slot.  */
8285       load_delay_nop ();
8286       move_register (treg, tempreg);
8287       break;
8288
8289     case M_ULD_A:
8290       s = "ldl";
8291       s2 = "ldr";
8292       off = 7;
8293       goto ulwa;
8294     case M_ULW_A:
8295       s = "lwl";
8296       s2 = "lwr";
8297       off = 3;
8298     ulwa:
8299       used_at = 1;
8300       load_address (AT, &offset_expr, &used_at);
8301       if (breg != 0)
8302         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8303       if (!target_big_endian)
8304         expr1.X_add_number = off;
8305       else
8306         expr1.X_add_number = 0;
8307       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8308       if (!target_big_endian)
8309         expr1.X_add_number = 0;
8310       else
8311         expr1.X_add_number = off;
8312       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8313       break;
8314
8315     case M_ULH_A:
8316     case M_ULHU_A:
8317       used_at = 1;
8318       load_address (AT, &offset_expr, &used_at);
8319       if (breg != 0)
8320         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8321       if (target_big_endian)
8322         expr1.X_add_number = 0;
8323       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
8324                    treg, BFD_RELOC_LO16, AT);
8325       if (target_big_endian)
8326         expr1.X_add_number = 1;
8327       else
8328         expr1.X_add_number = 0;
8329       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8330       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8331       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8332       break;
8333
8334     case M_USH:
8335       used_at = 1;
8336       if (offset_expr.X_add_number >= 0x7fff)
8337         as_bad (_("Operand overflow"));
8338       if (target_big_endian)
8339         ++offset_expr.X_add_number;
8340       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8341       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
8342       if (target_big_endian)
8343         --offset_expr.X_add_number;
8344       else
8345         ++offset_expr.X_add_number;
8346       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
8347       break;
8348
8349     case M_USD:
8350       s = "sdl";
8351       s2 = "sdr";
8352       off = 7;
8353       goto usw;
8354     case M_USW:
8355       s = "swl";
8356       s2 = "swr";
8357       off = 3;
8358     usw:
8359       if (offset_expr.X_add_number >= 0x8000 - off)
8360         as_bad (_("Operand overflow"));
8361       if (!target_big_endian)
8362         offset_expr.X_add_number += off;
8363       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8364       if (!target_big_endian)
8365         offset_expr.X_add_number -= off;
8366       else
8367         offset_expr.X_add_number += off;
8368       macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8369       break;
8370
8371     case M_USD_A:
8372       s = "sdl";
8373       s2 = "sdr";
8374       off = 7;
8375       goto uswa;
8376     case M_USW_A:
8377       s = "swl";
8378       s2 = "swr";
8379       off = 3;
8380     uswa:
8381       used_at = 1;
8382       load_address (AT, &offset_expr, &used_at);
8383       if (breg != 0)
8384         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8385       if (!target_big_endian)
8386         expr1.X_add_number = off;
8387       else
8388         expr1.X_add_number = 0;
8389       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8390       if (!target_big_endian)
8391         expr1.X_add_number = 0;
8392       else
8393         expr1.X_add_number = off;
8394       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8395       break;
8396
8397     case M_USH_A:
8398       used_at = 1;
8399       load_address (AT, &offset_expr, &used_at);
8400       if (breg != 0)
8401         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8402       if (!target_big_endian)
8403         expr1.X_add_number = 0;
8404       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8405       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
8406       if (!target_big_endian)
8407         expr1.X_add_number = 1;
8408       else
8409         expr1.X_add_number = 0;
8410       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8411       if (!target_big_endian)
8412         expr1.X_add_number = 0;
8413       else
8414         expr1.X_add_number = 1;
8415       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8416       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8417       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8418       break;
8419
8420     default:
8421       /* FIXME: Check if this is one of the itbl macros, since they
8422          are added dynamically.  */
8423       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8424       break;
8425     }
8426   if (!mips_opts.at && used_at)
8427     as_bad (_("Macro used $at after \".set noat\""));
8428 }
8429
8430 /* Implement macros in mips16 mode.  */
8431
8432 static void
8433 mips16_macro (struct mips_cl_insn *ip)
8434 {
8435   int mask;
8436   int xreg, yreg, zreg, tmp;
8437   expressionS expr1;
8438   int dbl;
8439   const char *s, *s2, *s3;
8440
8441   mask = ip->insn_mo->mask;
8442
8443   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8444   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8445   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
8446
8447   expr1.X_op = O_constant;
8448   expr1.X_op_symbol = NULL;
8449   expr1.X_add_symbol = NULL;
8450   expr1.X_add_number = 1;
8451
8452   dbl = 0;
8453
8454   switch (mask)
8455     {
8456     default:
8457       internalError ();
8458
8459     case M_DDIV_3:
8460       dbl = 1;
8461     case M_DIV_3:
8462       s = "mflo";
8463       goto do_div3;
8464     case M_DREM_3:
8465       dbl = 1;
8466     case M_REM_3:
8467       s = "mfhi";
8468     do_div3:
8469       start_noreorder ();
8470       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
8471       expr1.X_add_number = 2;
8472       macro_build (&expr1, "bnez", "x,p", yreg);
8473       macro_build (NULL, "break", "6", 7);
8474
8475       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8476          since that causes an overflow.  We should do that as well,
8477          but I don't see how to do the comparisons without a temporary
8478          register.  */
8479       end_noreorder ();
8480       macro_build (NULL, s, "x", zreg);
8481       break;
8482
8483     case M_DIVU_3:
8484       s = "divu";
8485       s2 = "mflo";
8486       goto do_divu3;
8487     case M_REMU_3:
8488       s = "divu";
8489       s2 = "mfhi";
8490       goto do_divu3;
8491     case M_DDIVU_3:
8492       s = "ddivu";
8493       s2 = "mflo";
8494       goto do_divu3;
8495     case M_DREMU_3:
8496       s = "ddivu";
8497       s2 = "mfhi";
8498     do_divu3:
8499       start_noreorder ();
8500       macro_build (NULL, s, "0,x,y", xreg, yreg);
8501       expr1.X_add_number = 2;
8502       macro_build (&expr1, "bnez", "x,p", yreg);
8503       macro_build (NULL, "break", "6", 7);
8504       end_noreorder ();
8505       macro_build (NULL, s2, "x", zreg);
8506       break;
8507
8508     case M_DMUL:
8509       dbl = 1;
8510     case M_MUL:
8511       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8512       macro_build (NULL, "mflo", "x", zreg);
8513       break;
8514
8515     case M_DSUBU_I:
8516       dbl = 1;
8517       goto do_subu;
8518     case M_SUBU_I:
8519     do_subu:
8520       if (imm_expr.X_op != O_constant)
8521         as_bad (_("Unsupported large constant"));
8522       imm_expr.X_add_number = -imm_expr.X_add_number;
8523       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8524       break;
8525
8526     case M_SUBU_I_2:
8527       if (imm_expr.X_op != O_constant)
8528         as_bad (_("Unsupported large constant"));
8529       imm_expr.X_add_number = -imm_expr.X_add_number;
8530       macro_build (&imm_expr, "addiu", "x,k", xreg);
8531       break;
8532
8533     case M_DSUBU_I_2:
8534       if (imm_expr.X_op != O_constant)
8535         as_bad (_("Unsupported large constant"));
8536       imm_expr.X_add_number = -imm_expr.X_add_number;
8537       macro_build (&imm_expr, "daddiu", "y,j", yreg);
8538       break;
8539
8540     case M_BEQ:
8541       s = "cmp";
8542       s2 = "bteqz";
8543       goto do_branch;
8544     case M_BNE:
8545       s = "cmp";
8546       s2 = "btnez";
8547       goto do_branch;
8548     case M_BLT:
8549       s = "slt";
8550       s2 = "btnez";
8551       goto do_branch;
8552     case M_BLTU:
8553       s = "sltu";
8554       s2 = "btnez";
8555       goto do_branch;
8556     case M_BLE:
8557       s = "slt";
8558       s2 = "bteqz";
8559       goto do_reverse_branch;
8560     case M_BLEU:
8561       s = "sltu";
8562       s2 = "bteqz";
8563       goto do_reverse_branch;
8564     case M_BGE:
8565       s = "slt";
8566       s2 = "bteqz";
8567       goto do_branch;
8568     case M_BGEU:
8569       s = "sltu";
8570       s2 = "bteqz";
8571       goto do_branch;
8572     case M_BGT:
8573       s = "slt";
8574       s2 = "btnez";
8575       goto do_reverse_branch;
8576     case M_BGTU:
8577       s = "sltu";
8578       s2 = "btnez";
8579
8580     do_reverse_branch:
8581       tmp = xreg;
8582       xreg = yreg;
8583       yreg = tmp;
8584
8585     do_branch:
8586       macro_build (NULL, s, "x,y", xreg, yreg);
8587       macro_build (&offset_expr, s2, "p");
8588       break;
8589
8590     case M_BEQ_I:
8591       s = "cmpi";
8592       s2 = "bteqz";
8593       s3 = "x,U";
8594       goto do_branch_i;
8595     case M_BNE_I:
8596       s = "cmpi";
8597       s2 = "btnez";
8598       s3 = "x,U";
8599       goto do_branch_i;
8600     case M_BLT_I:
8601       s = "slti";
8602       s2 = "btnez";
8603       s3 = "x,8";
8604       goto do_branch_i;
8605     case M_BLTU_I:
8606       s = "sltiu";
8607       s2 = "btnez";
8608       s3 = "x,8";
8609       goto do_branch_i;
8610     case M_BLE_I:
8611       s = "slti";
8612       s2 = "btnez";
8613       s3 = "x,8";
8614       goto do_addone_branch_i;
8615     case M_BLEU_I:
8616       s = "sltiu";
8617       s2 = "btnez";
8618       s3 = "x,8";
8619       goto do_addone_branch_i;
8620     case M_BGE_I:
8621       s = "slti";
8622       s2 = "bteqz";
8623       s3 = "x,8";
8624       goto do_branch_i;
8625     case M_BGEU_I:
8626       s = "sltiu";
8627       s2 = "bteqz";
8628       s3 = "x,8";
8629       goto do_branch_i;
8630     case M_BGT_I:
8631       s = "slti";
8632       s2 = "bteqz";
8633       s3 = "x,8";
8634       goto do_addone_branch_i;
8635     case M_BGTU_I:
8636       s = "sltiu";
8637       s2 = "bteqz";
8638       s3 = "x,8";
8639
8640     do_addone_branch_i:
8641       if (imm_expr.X_op != O_constant)
8642         as_bad (_("Unsupported large constant"));
8643       ++imm_expr.X_add_number;
8644
8645     do_branch_i:
8646       macro_build (&imm_expr, s, s3, xreg);
8647       macro_build (&offset_expr, s2, "p");
8648       break;
8649
8650     case M_ABS:
8651       expr1.X_add_number = 0;
8652       macro_build (&expr1, "slti", "x,8", yreg);
8653       if (xreg != yreg)
8654         move_register (xreg, yreg);
8655       expr1.X_add_number = 2;
8656       macro_build (&expr1, "bteqz", "p");
8657       macro_build (NULL, "neg", "x,w", xreg, xreg);
8658     }
8659 }
8660
8661 /* For consistency checking, verify that all bits are specified either
8662    by the match/mask part of the instruction definition, or by the
8663    operand list.  */
8664 static int
8665 validate_mips_insn (const struct mips_opcode *opc)
8666 {
8667   const char *p = opc->args;
8668   char c;
8669   unsigned long used_bits = opc->mask;
8670
8671   if ((used_bits & opc->match) != opc->match)
8672     {
8673       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8674               opc->name, opc->args);
8675       return 0;
8676     }
8677 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
8678   while (*p)
8679     switch (c = *p++)
8680       {
8681       case ',': break;
8682       case '(': break;
8683       case ')': break;
8684       case '+':
8685         switch (c = *p++)
8686           {
8687           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
8688           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
8689           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
8690           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
8691           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8692           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8693           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8694           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
8695                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8696           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8697           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8698           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8699           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8700           case 'I': break;
8701           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
8702           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
8703                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8704           case 'x': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8705           case 'X': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8706           case 'p': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8707           case 'P': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8708           case 'Q': USE_BITS (OP_MASK_SEQI,     OP_SH_SEQI);    break;
8709           case 's': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8710           case 'S': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8711           case 'z': USE_BITS (OP_MASK_RZ,       OP_SH_RZ);      break;
8712           case 'Z': USE_BITS (OP_MASK_FZ,       OP_SH_FZ);      break;
8713           case 'a': USE_BITS (OP_MASK_OFFSET_A, OP_SH_OFFSET_A); break;
8714           case 'b': USE_BITS (OP_MASK_OFFSET_B, OP_SH_OFFSET_B); break;
8715           case 'c': USE_BITS (OP_MASK_OFFSET_C, OP_SH_OFFSET_C); break;
8716
8717           default:
8718             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8719                     c, opc->name, opc->args);
8720             return 0;
8721           }
8722         break;
8723       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8724       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8725       case 'A': break;
8726       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8727       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
8728       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8729       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8730       case 'F': break;
8731       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8732       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
8733       case 'I': break;
8734       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8735       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8736       case 'L': break;
8737       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
8738       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
8739       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
8740       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
8741                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8742       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
8743       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8744       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8745       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8746       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8747       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8748       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8749       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8750       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
8751       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8752       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
8753       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8754       case 'f': break;
8755       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
8756       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8757       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8758       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
8759       case 'l': break;
8760       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8761       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8762       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8763       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8764       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8765       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8766       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8767       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8768       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8769       case 'x': break;
8770       case 'z': break;
8771       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
8772       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8773                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8774       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
8775       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
8776       case '[': break;
8777       case ']': break;
8778       case '1': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8779       case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
8780       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
8781       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
8782       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
8783       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8784       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
8785       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
8786       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
8787       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
8788       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
8789       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
8790       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
8791       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
8792       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
8793       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
8794       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
8795       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8796       default:
8797         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8798                 c, opc->name, opc->args);
8799         return 0;
8800       }
8801 #undef USE_BITS
8802   if (used_bits != 0xffffffff)
8803     {
8804       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8805               ~used_bits & 0xffffffff, opc->name, opc->args);
8806       return 0;
8807     }
8808   return 1;
8809 }
8810
8811 /* UDI immediates.  */
8812 struct mips_immed {
8813   char          type;
8814   unsigned int  shift;
8815   unsigned long mask;
8816   const char *  desc;
8817 };
8818
8819 static const struct mips_immed mips_immed[] = {
8820   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
8821   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
8822   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
8823   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
8824   { 0,0,0,0 }
8825 };
8826
8827 /* Check whether an odd floating-point register is allowed.  */
8828 static int
8829 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8830 {
8831   const char *s = insn->name;
8832
8833   if (insn->pinfo == INSN_MACRO)
8834     /* Let a macro pass, we'll catch it later when it is expanded.  */
8835     return 1;
8836
8837   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8838     {
8839       /* Allow odd registers for single-precision ops.  */
8840       switch (insn->pinfo & (FP_S | FP_D))
8841         {
8842         case FP_S:
8843         case 0:
8844           return 1;     /* both single precision - ok */
8845         case FP_D:
8846           return 0;     /* both double precision - fail */
8847         default:
8848           break;
8849         }
8850
8851       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
8852       s = strchr (insn->name, '.');
8853       if (argnum == 2)
8854         s = s != NULL ? strchr (s + 1, '.') : NULL;
8855       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8856     } 
8857
8858   /* Single-precision coprocessor loads and moves are OK too.  */
8859   if ((insn->pinfo & FP_S)
8860       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8861                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8862     return 1;
8863
8864   return 0;
8865 }
8866
8867 /* This routine assembles an instruction into its binary format.  As a
8868    side effect, it sets one of the global variables imm_reloc or
8869    offset_reloc to the type of relocation to do if one of the operands
8870    is an address expression.  */
8871
8872 static void
8873 mips_ip (char *str, struct mips_cl_insn *ip)
8874 {
8875   char *s;
8876   const char *args;
8877   char c = 0;
8878   struct mips_opcode *insn;
8879   char *argsStart;
8880   unsigned int regno;
8881   unsigned int lastregno;
8882   unsigned int lastpos = 0;
8883   unsigned int limlo, limhi;
8884   char *s_reset;
8885   char save_c = 0;
8886   offsetT min_range, max_range;
8887   int argnum;
8888   unsigned int rtype;
8889
8890   insn_error = NULL;
8891
8892   /* If the instruction contains a '.', we first try to match an instruction
8893      including the '.'.  Then we try again without the '.'.  */
8894   insn = NULL;
8895   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8896     continue;
8897
8898   /* If we stopped on whitespace, then replace the whitespace with null for
8899      the call to hash_find.  Save the character we replaced just in case we
8900      have to re-parse the instruction.  */
8901   if (ISSPACE (*s))
8902     {
8903       save_c = *s;
8904       *s++ = '\0';
8905     }
8906
8907   insn = (struct mips_opcode *) hash_find (op_hash, str);
8908
8909   /* If we didn't find the instruction in the opcode table, try again, but
8910      this time with just the instruction up to, but not including the
8911      first '.'.  */
8912   if (insn == NULL)
8913     {
8914       /* Restore the character we overwrite above (if any).  */
8915       if (save_c)
8916         *(--s) = save_c;
8917
8918       /* Scan up to the first '.' or whitespace.  */
8919       for (s = str;
8920            *s != '\0' && *s != '.' && !ISSPACE (*s);
8921            ++s)
8922         continue;
8923
8924       /* If we did not find a '.', then we can quit now.  */
8925       if (*s != '.')
8926         {
8927           insn_error = _("Unrecognized opcode");
8928           return;
8929         }
8930
8931       /* Lookup the instruction in the hash table.  */
8932       *s++ = '\0';
8933       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8934         {
8935           insn_error = _("Unrecognized opcode");
8936           return;
8937         }
8938     }
8939
8940   argsStart = s;
8941   for (;;)
8942     {
8943       bfd_boolean ok;
8944
8945       gas_assert (strcmp (insn->name, str) == 0);
8946
8947       ok = is_opcode_valid (insn);
8948       if (! ok)
8949         {
8950           if (insn + 1 < &mips_opcodes[NUMOPCODES]
8951               && strcmp (insn->name, insn[1].name) == 0)
8952             {
8953               ++insn;
8954               continue;
8955             }
8956           else
8957             {
8958               if (!insn_error)
8959                 {
8960                   static char buf[100];
8961                   sprintf (buf,
8962                            _("opcode not supported on this processor: %s (%s)"),
8963                            mips_cpu_info_from_arch (mips_opts.arch)->name,
8964                            mips_cpu_info_from_isa (mips_opts.isa)->name);
8965                   insn_error = buf;
8966                 }
8967               if (save_c)
8968                 *(--s) = save_c;
8969               return;
8970             }
8971         }
8972
8973       create_insn (ip, insn);
8974       insn_error = NULL;
8975       argnum = 1;
8976       lastregno = 0xffffffff;
8977       for (args = insn->args;; ++args)
8978         {
8979           int is_mdmx;
8980
8981           s += strspn (s, " \t");
8982           is_mdmx = 0;
8983           switch (*args)
8984             {
8985             case '\0':          /* end of args */
8986               if (*s == '\0')
8987                 return;
8988               break;
8989
8990             case '2': /* DSP 2-bit unsigned immediate in bit 11.  */
8991               my_getExpression (&imm_expr, s);
8992               check_absolute_expr (ip, &imm_expr);
8993               if ((unsigned long) imm_expr.X_add_number != 1
8994                   && (unsigned long) imm_expr.X_add_number != 3)
8995                 {
8996                   as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8997                           (unsigned long) imm_expr.X_add_number);
8998                 }
8999               INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
9000               imm_expr.X_op = O_absent;
9001               s = expr_end;
9002               continue;
9003
9004             case '3': /* DSP 3-bit unsigned immediate in bit 21.  */
9005               my_getExpression (&imm_expr, s);
9006               check_absolute_expr (ip, &imm_expr);
9007               if (imm_expr.X_add_number & ~OP_MASK_SA3)
9008                 {
9009                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9010                           OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
9011                 }
9012               INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
9013               imm_expr.X_op = O_absent;
9014               s = expr_end;
9015               continue;
9016
9017             case '4': /* DSP 4-bit unsigned immediate in bit 21.  */
9018               my_getExpression (&imm_expr, s);
9019               check_absolute_expr (ip, &imm_expr);
9020               if (imm_expr.X_add_number & ~OP_MASK_SA4)
9021                 {
9022                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9023                           OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
9024                 }
9025               INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
9026               imm_expr.X_op = O_absent;
9027               s = expr_end;
9028               continue;
9029
9030             case '5': /* DSP 8-bit unsigned immediate in bit 16.  */
9031               my_getExpression (&imm_expr, s);
9032               check_absolute_expr (ip, &imm_expr);
9033               if (imm_expr.X_add_number & ~OP_MASK_IMM8)
9034                 {
9035                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9036                           OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
9037                 }
9038               INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
9039               imm_expr.X_op = O_absent;
9040               s = expr_end;
9041               continue;
9042
9043             case '6': /* DSP 5-bit unsigned immediate in bit 21.  */
9044               my_getExpression (&imm_expr, s);
9045               check_absolute_expr (ip, &imm_expr);
9046               if (imm_expr.X_add_number & ~OP_MASK_RS)
9047                 {
9048                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9049                           OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
9050                 }
9051               INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
9052               imm_expr.X_op = O_absent;
9053               s = expr_end;
9054               continue;
9055
9056             case '7': /* Four DSP accumulators in bits 11,12.  */
9057               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9058                   s[3] >= '0' && s[3] <= '3')
9059                 {
9060                   regno = s[3] - '0';
9061                   s += 4;
9062                   INSERT_OPERAND (DSPACC, *ip, regno);
9063                   continue;
9064                 }
9065               else
9066                 as_bad (_("Invalid dsp acc register"));
9067               break;
9068
9069             case '8': /* DSP 6-bit unsigned immediate in bit 11.  */
9070               my_getExpression (&imm_expr, s);
9071               check_absolute_expr (ip, &imm_expr);
9072               if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
9073                 {
9074                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9075                           OP_MASK_WRDSP,
9076                           (unsigned long) imm_expr.X_add_number);
9077                 }
9078               INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
9079               imm_expr.X_op = O_absent;
9080               s = expr_end;
9081               continue;
9082
9083             case '9': /* Four DSP accumulators in bits 21,22.  */
9084               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9085                   s[3] >= '0' && s[3] <= '3')
9086                 {
9087                   regno = s[3] - '0';
9088                   s += 4;
9089                   INSERT_OPERAND (DSPACC_S, *ip, regno);
9090                   continue;
9091                 }
9092               else
9093                 as_bad (_("Invalid dsp acc register"));
9094               break;
9095
9096             case '0': /* DSP 6-bit signed immediate in bit 20.  */
9097               my_getExpression (&imm_expr, s);
9098               check_absolute_expr (ip, &imm_expr);
9099               min_range = -((OP_MASK_DSPSFT + 1) >> 1);
9100               max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
9101               if (imm_expr.X_add_number < min_range ||
9102                   imm_expr.X_add_number > max_range)
9103                 {
9104                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
9105                           (long) min_range, (long) max_range,
9106                           (long) imm_expr.X_add_number);
9107                 }
9108               INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
9109               imm_expr.X_op = O_absent;
9110               s = expr_end;
9111               continue;
9112
9113             case '\'': /* DSP 6-bit unsigned immediate in bit 16.  */
9114               my_getExpression (&imm_expr, s);
9115               check_absolute_expr (ip, &imm_expr);
9116               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
9117                 {
9118                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9119                           OP_MASK_RDDSP,
9120                           (unsigned long) imm_expr.X_add_number);
9121                 }
9122               INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
9123               imm_expr.X_op = O_absent;
9124               s = expr_end;
9125               continue;
9126
9127             case ':': /* DSP 7-bit signed immediate in bit 19.  */
9128               my_getExpression (&imm_expr, s);
9129               check_absolute_expr (ip, &imm_expr);
9130               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
9131               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
9132               if (imm_expr.X_add_number < min_range ||
9133                   imm_expr.X_add_number > max_range)
9134                 {
9135                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
9136                           (long) min_range, (long) max_range,
9137                           (long) imm_expr.X_add_number);
9138                 }
9139               INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
9140               imm_expr.X_op = O_absent;
9141               s = expr_end;
9142               continue;
9143
9144             case '@': /* DSP 10-bit signed immediate in bit 16.  */
9145               my_getExpression (&imm_expr, s);
9146               check_absolute_expr (ip, &imm_expr);
9147               min_range = -((OP_MASK_IMM10 + 1) >> 1);
9148               max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
9149               if (imm_expr.X_add_number < min_range ||
9150                   imm_expr.X_add_number > max_range)
9151                 {
9152                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
9153                           (long) min_range, (long) max_range,
9154                           (long) imm_expr.X_add_number);
9155                 }
9156               INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
9157               imm_expr.X_op = O_absent;
9158               s = expr_end;
9159               continue;
9160
9161             case '!': /* MT usermode flag bit.  */
9162               my_getExpression (&imm_expr, s);
9163               check_absolute_expr (ip, &imm_expr);
9164               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
9165                 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
9166                         (unsigned long) imm_expr.X_add_number);
9167               INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
9168               imm_expr.X_op = O_absent;
9169               s = expr_end;
9170               continue;
9171
9172             case '$': /* MT load high flag bit.  */
9173               my_getExpression (&imm_expr, s);
9174               check_absolute_expr (ip, &imm_expr);
9175               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
9176                 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
9177                         (unsigned long) imm_expr.X_add_number);
9178               INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
9179               imm_expr.X_op = O_absent;
9180               s = expr_end;
9181               continue;
9182
9183             case '*': /* Four DSP accumulators in bits 18,19.  */
9184               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9185                   s[3] >= '0' && s[3] <= '3')
9186                 {
9187                   regno = s[3] - '0';
9188                   s += 4;
9189                   INSERT_OPERAND (MTACC_T, *ip, regno);
9190                   continue;
9191                 }
9192               else
9193                 as_bad (_("Invalid dsp/smartmips acc register"));
9194               break;
9195
9196             case '&': /* Four DSP accumulators in bits 13,14.  */
9197               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9198                   s[3] >= '0' && s[3] <= '3')
9199                 {
9200                   regno = s[3] - '0';
9201                   s += 4;
9202                   INSERT_OPERAND (MTACC_D, *ip, regno);
9203                   continue;
9204                 }
9205               else
9206                 as_bad (_("Invalid dsp/smartmips acc register"));
9207               break;
9208
9209             case ',':
9210               ++argnum;
9211               if (*s++ == *args)
9212                 continue;
9213               s--;
9214               switch (*++args)
9215                 {
9216                 case 'r':
9217                 case 'v':
9218                   INSERT_OPERAND (RS, *ip, lastregno);
9219                   continue;
9220
9221                 case 'w':
9222                   INSERT_OPERAND (RT, *ip, lastregno);
9223                   continue;
9224
9225                 case 'W':
9226                   INSERT_OPERAND (FT, *ip, lastregno);
9227                   continue;
9228
9229                 case 'V':
9230                   INSERT_OPERAND (FS, *ip, lastregno);
9231                   continue;
9232                 }
9233               break;
9234
9235             case '(':
9236               /* Handle optional base register.
9237                  Either the base register is omitted or
9238                  we must have a left paren.  */
9239               /* This is dependent on the next operand specifier
9240                  is a base register specification.  */
9241               gas_assert (args[1] == 'b');
9242               if (*s == '\0')
9243                 return;
9244
9245             case ')':           /* These must match exactly.  */
9246             case '[':
9247             case ']':
9248               if (*s++ == *args)
9249                 continue;
9250               break;
9251
9252             case '+':           /* Opcode extension character.  */
9253               switch (*++args)
9254                 {
9255                 case '1':       /* UDI immediates.  */
9256                 case '2':
9257                 case '3':
9258                 case '4':
9259                   {
9260                     const struct mips_immed *imm = mips_immed;
9261
9262                     while (imm->type && imm->type != *args)
9263                       ++imm;
9264                     if (! imm->type)
9265                       internalError ();
9266                     my_getExpression (&imm_expr, s);
9267                     check_absolute_expr (ip, &imm_expr);
9268                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
9269                       {
9270                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
9271                                  imm->desc ? imm->desc : ip->insn_mo->name,
9272                                  (unsigned long) imm_expr.X_add_number,
9273                                  (unsigned long) imm_expr.X_add_number);
9274                         imm_expr.X_add_number &= imm->mask;
9275                       }
9276                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
9277                                         << imm->shift);
9278                     imm_expr.X_op = O_absent;
9279                     s = expr_end;
9280                   }
9281                   continue;
9282
9283                 case 'A':               /* ins/ext position, becomes LSB.  */
9284                   limlo = 0;
9285                   limhi = 31;
9286                   goto do_lsb;
9287                 case 'E':
9288                   limlo = 32;
9289                   limhi = 63;
9290                   goto do_lsb;
9291                 do_lsb:
9292                   my_getExpression (&imm_expr, s);
9293                   check_absolute_expr (ip, &imm_expr);
9294                   if ((unsigned long) imm_expr.X_add_number < limlo
9295                       || (unsigned long) imm_expr.X_add_number > limhi)
9296                     {
9297                       as_bad (_("Improper position (%lu)"),
9298                               (unsigned long) imm_expr.X_add_number);
9299                       imm_expr.X_add_number = limlo;
9300                     }
9301                   lastpos = imm_expr.X_add_number;
9302                   INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9303                   imm_expr.X_op = O_absent;
9304                   s = expr_end;
9305                   continue;
9306
9307                 case 'B':               /* ins size, becomes MSB.  */
9308                   limlo = 1;
9309                   limhi = 32;
9310                   goto do_msb;
9311                 case 'F':
9312                   limlo = 33;
9313                   limhi = 64;
9314                   goto do_msb;
9315                 do_msb:
9316                   my_getExpression (&imm_expr, s);
9317                   check_absolute_expr (ip, &imm_expr);
9318                   /* Check for negative input so that small negative numbers
9319                      will not succeed incorrectly.  The checks against
9320                      (pos+size) transitively check "size" itself,
9321                      assuming that "pos" is reasonable.  */
9322                   if ((long) imm_expr.X_add_number < 0
9323                       || ((unsigned long) imm_expr.X_add_number
9324                           + lastpos) < limlo
9325                       || ((unsigned long) imm_expr.X_add_number
9326                           + lastpos) > limhi)
9327                     {
9328                       as_bad (_("Improper insert size (%lu, position %lu)"),
9329                               (unsigned long) imm_expr.X_add_number,
9330                               (unsigned long) lastpos);
9331                       imm_expr.X_add_number = limlo - lastpos;
9332                     }
9333                   INSERT_OPERAND (INSMSB, *ip,
9334                                  lastpos + imm_expr.X_add_number - 1);
9335                   imm_expr.X_op = O_absent;
9336                   s = expr_end;
9337                   continue;
9338
9339                 case 'C':               /* ext size, becomes MSBD.  */
9340                   limlo = 1;
9341                   limhi = 32;
9342                   goto do_msbd;
9343                 case 'G':
9344                   limlo = 33;
9345                   limhi = 64;
9346                   goto do_msbd;
9347                 case 'H':
9348                   limlo = 33;
9349                   limhi = 64;
9350                   goto do_msbd;
9351                 do_msbd:
9352                   my_getExpression (&imm_expr, s);
9353                   check_absolute_expr (ip, &imm_expr);
9354                   /* Check for negative input so that small negative numbers
9355                      will not succeed incorrectly.  The checks against
9356                      (pos+size) transitively check "size" itself,
9357                      assuming that "pos" is reasonable.  */
9358                   if ((long) imm_expr.X_add_number < 0
9359                       || ((unsigned long) imm_expr.X_add_number
9360                           + lastpos) < limlo
9361                       || ((unsigned long) imm_expr.X_add_number
9362                           + lastpos) > limhi)
9363                     {
9364                       as_bad (_("Improper extract size (%lu, position %lu)"),
9365                               (unsigned long) imm_expr.X_add_number,
9366                               (unsigned long) lastpos);
9367                       imm_expr.X_add_number = limlo - lastpos;
9368                     }
9369                   INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
9370                   imm_expr.X_op = O_absent;
9371                   s = expr_end;
9372                   continue;
9373
9374                 case 'D':
9375                   /* +D is for disassembly only; never match.  */
9376                   break;
9377
9378                 case 'I':
9379                   /* "+I" is like "I", except that imm2_expr is used.  */
9380                   my_getExpression (&imm2_expr, s);
9381                   if (imm2_expr.X_op != O_big
9382                       && imm2_expr.X_op != O_constant)
9383                   insn_error = _("absolute expression required");
9384                   if (HAVE_32BIT_GPRS)
9385                     normalize_constant_expr (&imm2_expr);
9386                   s = expr_end;
9387                   continue;
9388
9389                 case 'T': /* Coprocessor register.  */
9390                   /* +T is for disassembly only; never match.  */
9391                   break;
9392
9393                 case 't': /* Coprocessor register number.  */
9394                   if (s[0] == '$' && ISDIGIT (s[1]))
9395                     {
9396                       ++s;
9397                       regno = 0;
9398                       do
9399                         {
9400                           regno *= 10;
9401                           regno += *s - '0';
9402                           ++s;
9403                         }
9404                       while (ISDIGIT (*s));
9405                       if (regno > 31)
9406                         as_bad (_("Invalid register number (%d)"), regno);
9407                       else
9408                         {
9409                           INSERT_OPERAND (RT, *ip, regno);
9410                           continue;
9411                         }
9412                     }
9413                   else
9414                     as_bad (_("Invalid coprocessor 0 register number"));
9415                   break;
9416
9417                 case 'x':
9418                   /* bbit[01] and bbit[01]32 bit index.  Give error if index
9419                      is not in the valid range.  */
9420                   my_getExpression (&imm_expr, s);
9421                   check_absolute_expr (ip, &imm_expr);
9422                   if ((unsigned) imm_expr.X_add_number > 31)
9423                     {
9424                       as_bad (_("Improper bit index (%lu)"),
9425                               (unsigned long) imm_expr.X_add_number);
9426                       imm_expr.X_add_number = 0;
9427                     }
9428                   INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number);
9429                   imm_expr.X_op = O_absent;
9430                   s = expr_end;
9431                   continue;
9432
9433                 case 'X':
9434                   /* bbit[01] bit index when bbit is used but we generate
9435                      bbit[01]32 because the index is over 32.  Move to the
9436                      next candidate if index is not in the valid range.  */
9437                   my_getExpression (&imm_expr, s);
9438                   check_absolute_expr (ip, &imm_expr);
9439                   if ((unsigned) imm_expr.X_add_number < 32
9440                       || (unsigned) imm_expr.X_add_number > 63)
9441                     break;
9442                   INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number - 32);
9443                   imm_expr.X_op = O_absent;
9444                   s = expr_end;
9445                   continue;
9446
9447                 case 'p':
9448                   /* cins, cins32, exts and exts32 position field.  Give error
9449                      if it's not in the valid range.  */
9450                   my_getExpression (&imm_expr, s);
9451                   check_absolute_expr (ip, &imm_expr);
9452                   if ((unsigned) imm_expr.X_add_number > 31)
9453                     {
9454                       as_bad (_("Improper position (%lu)"),
9455                               (unsigned long) imm_expr.X_add_number);
9456                       imm_expr.X_add_number = 0;
9457                     }
9458                   /* Make the pos explicit to simplify +S.  */
9459                   lastpos = imm_expr.X_add_number + 32;
9460                   INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number);
9461                   imm_expr.X_op = O_absent;
9462                   s = expr_end;
9463                   continue;
9464
9465                 case 'P':
9466                   /* cins, cins32, exts and exts32 position field.  Move to
9467                      the next candidate if it's not in the valid range.  */
9468                   my_getExpression (&imm_expr, s);
9469                   check_absolute_expr (ip, &imm_expr);
9470                   if ((unsigned) imm_expr.X_add_number < 32
9471                       || (unsigned) imm_expr.X_add_number > 63)
9472                     break;
9473                   lastpos = imm_expr.X_add_number;
9474                   INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number - 32);
9475                   imm_expr.X_op = O_absent;
9476                   s = expr_end;
9477                   continue;
9478
9479                 case 's':
9480                   /* cins and exts length-minus-one field.  */
9481                   my_getExpression (&imm_expr, s);
9482                   check_absolute_expr (ip, &imm_expr);
9483                   if ((unsigned long) imm_expr.X_add_number > 31)
9484                     {
9485                       as_bad (_("Improper size (%lu)"),
9486                               (unsigned long) imm_expr.X_add_number);
9487                       imm_expr.X_add_number = 0;
9488                     }
9489                   INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9490                   imm_expr.X_op = O_absent;
9491                   s = expr_end;
9492                   continue;
9493
9494                 case 'S':
9495                   /* cins32/exts32 and cins/exts aliasing cint32/exts32
9496                      length-minus-one field.  */
9497                   my_getExpression (&imm_expr, s);
9498                   check_absolute_expr (ip, &imm_expr);
9499                   if ((long) imm_expr.X_add_number < 0
9500                       || (unsigned long) imm_expr.X_add_number + lastpos > 63)
9501                     {
9502                       as_bad (_("Improper size (%lu)"),
9503                               (unsigned long) imm_expr.X_add_number);
9504                       imm_expr.X_add_number = 0;
9505                     }
9506                   INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9507                   imm_expr.X_op = O_absent;
9508                   s = expr_end;
9509                   continue;
9510
9511                 case 'Q':
9512                   /* seqi/snei immediate field.  */
9513                   my_getExpression (&imm_expr, s);
9514                   check_absolute_expr (ip, &imm_expr);
9515                   if ((long) imm_expr.X_add_number < -512
9516                       || (long) imm_expr.X_add_number >= 512)
9517                     {
9518                       as_bad (_("Improper immediate (%ld)"),
9519                                (long) imm_expr.X_add_number);
9520                       imm_expr.X_add_number = 0;
9521                     }
9522                   INSERT_OPERAND (SEQI, *ip, imm_expr.X_add_number);
9523                   imm_expr.X_op = O_absent;
9524                   s = expr_end;
9525                   continue;
9526
9527                 case 'a': /* 8-bit signed offset in bit 6 */
9528                   my_getExpression (&imm_expr, s);
9529                   check_absolute_expr (ip, &imm_expr);
9530                   min_range = -((OP_MASK_OFFSET_A + 1) >> 1);
9531                   max_range = ((OP_MASK_OFFSET_A + 1) >> 1) - 1;
9532                   if (imm_expr.X_add_number < min_range
9533                       || imm_expr.X_add_number > max_range)
9534                     {
9535                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
9536                               (long) min_range, (long) max_range,
9537                               (long) imm_expr.X_add_number);
9538                     }
9539                   INSERT_OPERAND (OFFSET_A, *ip, imm_expr.X_add_number);
9540                   imm_expr.X_op = O_absent;
9541                   s = expr_end;
9542                   continue;
9543
9544                 case 'b': /* 8-bit signed offset in bit 3 */
9545                   my_getExpression (&imm_expr, s);
9546                   check_absolute_expr (ip, &imm_expr);
9547                   min_range = -((OP_MASK_OFFSET_B + 1) >> 1);
9548                   max_range = ((OP_MASK_OFFSET_B + 1) >> 1) - 1;
9549                   if (imm_expr.X_add_number < min_range
9550                       || imm_expr.X_add_number > max_range)
9551                     {
9552                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
9553                               (long) min_range, (long) max_range,
9554                               (long) imm_expr.X_add_number);
9555                     }
9556                   INSERT_OPERAND (OFFSET_B, *ip, imm_expr.X_add_number);
9557                   imm_expr.X_op = O_absent;
9558                   s = expr_end;
9559                   continue;
9560
9561                 case 'c': /* 9-bit signed offset in bit 6 */
9562                   my_getExpression (&imm_expr, s);
9563                   check_absolute_expr (ip, &imm_expr);
9564                   min_range = -((OP_MASK_OFFSET_C + 1) >> 1);
9565                   max_range = ((OP_MASK_OFFSET_C + 1) >> 1) - 1;
9566                   /* We check the offset range before adjusted.  */
9567                   min_range <<= 4;
9568                   max_range <<= 4;
9569                   if (imm_expr.X_add_number < min_range
9570                       || imm_expr.X_add_number > max_range)
9571                     {
9572                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
9573                               (long) min_range, (long) max_range,
9574                               (long) imm_expr.X_add_number);
9575                     }
9576                   if (imm_expr.X_add_number & 0xf)
9577                     {
9578                       as_bad (_("Offset not 16 bytes alignment (%ld)"),
9579                               (long) imm_expr.X_add_number);
9580                     }
9581                   /* Right shift 4 bits to adjust the offset operand.  */
9582                   INSERT_OPERAND (OFFSET_C, *ip, imm_expr.X_add_number >> 4);
9583                   imm_expr.X_op = O_absent;
9584                   s = expr_end;
9585                   continue;
9586
9587                 case 'z':
9588                   if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
9589                     break;
9590                   if (regno == AT && mips_opts.at)
9591                     {
9592                       if (mips_opts.at == ATREG)
9593                         as_warn (_("used $at without \".set noat\""));
9594                       else
9595                         as_warn (_("used $%u with \".set at=$%u\""),
9596                                  regno, mips_opts.at);
9597                     }
9598                   INSERT_OPERAND (RZ, *ip, regno);
9599                   continue;
9600
9601                 case 'Z':
9602                   if (!reg_lookup (&s, RTYPE_FPU, &regno))
9603                     break;
9604                   INSERT_OPERAND (FZ, *ip, regno);
9605                   continue;
9606
9607                 default:
9608                   as_bad (_("Internal error: bad mips opcode "
9609                             "(unknown extension operand type `+%c'): %s %s"),
9610                           *args, insn->name, insn->args);
9611                   /* Further processing is fruitless.  */
9612                   return;
9613                 }
9614               break;
9615
9616             case '<':           /* must be at least one digit */
9617               /*
9618                * According to the manual, if the shift amount is greater
9619                * than 31 or less than 0, then the shift amount should be
9620                * mod 32.  In reality the mips assembler issues an error.
9621                * We issue a warning and mask out all but the low 5 bits.
9622                */
9623               my_getExpression (&imm_expr, s);
9624               check_absolute_expr (ip, &imm_expr);
9625               if ((unsigned long) imm_expr.X_add_number > 31)
9626                 as_warn (_("Improper shift amount (%lu)"),
9627                          (unsigned long) imm_expr.X_add_number);
9628               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9629               imm_expr.X_op = O_absent;
9630               s = expr_end;
9631               continue;
9632
9633             case '>':           /* shift amount minus 32 */
9634               my_getExpression (&imm_expr, s);
9635               check_absolute_expr (ip, &imm_expr);
9636               if ((unsigned long) imm_expr.X_add_number < 32
9637                   || (unsigned long) imm_expr.X_add_number > 63)
9638                 break;
9639               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
9640               imm_expr.X_op = O_absent;
9641               s = expr_end;
9642               continue;
9643
9644             case 'k':           /* CACHE code.  */
9645             case 'h':           /* PREFX code.  */
9646             case '1':           /* SYNC type.  */
9647               my_getExpression (&imm_expr, s);
9648               check_absolute_expr (ip, &imm_expr);
9649               if ((unsigned long) imm_expr.X_add_number > 31)
9650                 as_warn (_("Invalid value for `%s' (%lu)"),
9651                          ip->insn_mo->name,
9652                          (unsigned long) imm_expr.X_add_number);
9653               if (*args == 'k')
9654                 {
9655                   if (mips_fix_cn63xxp1 && strcmp ("pref", insn->name) == 0)
9656                     switch (imm_expr.X_add_number)
9657                       {
9658                       case 5:
9659                       case 25:
9660                       case 26:
9661                       case 27:
9662                       case 28:
9663                       case 29:
9664                       case 30:
9665                       case 31:  /* These are ok.  */
9666                         break;
9667
9668                       default:  /* The rest must be changed to 28.  */
9669                         imm_expr.X_add_number = 28;
9670                         break;
9671                       }
9672                   INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9673                 }
9674               else if (*args == 'h')
9675                 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
9676               else
9677                 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9678               imm_expr.X_op = O_absent;
9679               s = expr_end;
9680               continue;
9681
9682             case 'c':           /* BREAK code.  */
9683               my_getExpression (&imm_expr, s);
9684               check_absolute_expr (ip, &imm_expr);
9685               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9686                 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9687                          ip->insn_mo->name,
9688                          (unsigned long) imm_expr.X_add_number);
9689               INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9690               imm_expr.X_op = O_absent;
9691               s = expr_end;
9692               continue;
9693
9694             case 'q':           /* Lower BREAK code.  */
9695               my_getExpression (&imm_expr, s);
9696               check_absolute_expr (ip, &imm_expr);
9697               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9698                 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9699                          ip->insn_mo->name,
9700                          (unsigned long) imm_expr.X_add_number);
9701               INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9702               imm_expr.X_op = O_absent;
9703               s = expr_end;
9704               continue;
9705
9706             case 'B':           /* 20-bit SYSCALL/BREAK code.  */
9707               my_getExpression (&imm_expr, s);
9708               check_absolute_expr (ip, &imm_expr);
9709               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9710                 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9711                          ip->insn_mo->name,
9712                          (unsigned long) imm_expr.X_add_number);
9713               INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9714               imm_expr.X_op = O_absent;
9715               s = expr_end;
9716               continue;
9717
9718             case 'C':           /* Coprocessor code.  */
9719               my_getExpression (&imm_expr, s);
9720               check_absolute_expr (ip, &imm_expr);
9721               if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9722                 {
9723                   as_warn (_("Coproccesor code > 25 bits (%lu)"),
9724                            (unsigned long) imm_expr.X_add_number);
9725                   imm_expr.X_add_number &= OP_MASK_COPZ;
9726                 }
9727               INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9728               imm_expr.X_op = O_absent;
9729               s = expr_end;
9730               continue;
9731
9732             case 'J':           /* 19-bit WAIT code.  */
9733               my_getExpression (&imm_expr, s);
9734               check_absolute_expr (ip, &imm_expr);
9735               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9736                 {
9737                   as_warn (_("Illegal 19-bit code (%lu)"),
9738                            (unsigned long) imm_expr.X_add_number);
9739                   imm_expr.X_add_number &= OP_MASK_CODE19;
9740                 }
9741               INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9742               imm_expr.X_op = O_absent;
9743               s = expr_end;
9744               continue;
9745
9746             case 'P':           /* Performance register.  */
9747               my_getExpression (&imm_expr, s);
9748               check_absolute_expr (ip, &imm_expr);
9749               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9750                 as_warn (_("Invalid performance register (%lu)"),
9751                          (unsigned long) imm_expr.X_add_number);
9752               INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9753               imm_expr.X_op = O_absent;
9754               s = expr_end;
9755               continue;
9756
9757             case 'G':           /* Coprocessor destination register.  */
9758               if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9759                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9760               else
9761                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9762               INSERT_OPERAND (RD, *ip, regno);
9763               if (ok) 
9764                 {
9765                   lastregno = regno;
9766                   continue;
9767                 }
9768               else
9769                 break;
9770
9771             case 'b':           /* Base register.  */
9772             case 'd':           /* Destination register.  */
9773             case 's':           /* Source register.  */
9774             case 't':           /* Target register.  */
9775             case 'r':           /* Both target and source.  */
9776             case 'v':           /* Both dest and source.  */
9777             case 'w':           /* Both dest and target.  */
9778             case 'E':           /* Coprocessor target register.  */
9779             case 'K':           /* RDHWR destination register.  */
9780             case 'x':           /* Ignore register name.  */
9781             case 'z':           /* Must be zero register.  */
9782             case 'U':           /* Destination register (CLO/CLZ).  */
9783             case 'g':           /* Coprocessor destination register.  */
9784               s_reset = s;
9785               if (*args == 'E' || *args == 'K')
9786                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9787               else
9788                 {
9789                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9790                   if (regno == AT && mips_opts.at)
9791                     {
9792                       if (mips_opts.at == ATREG)
9793                         as_warn (_("Used $at without \".set noat\""));
9794                       else
9795                         as_warn (_("Used $%u with \".set at=$%u\""),
9796                                  regno, mips_opts.at);
9797                     }
9798                 }
9799               if (ok)
9800                 {
9801                   c = *args;
9802                   if (*s == ' ')
9803                     ++s;
9804                   if (args[1] != *s)
9805                     {
9806                       if (c == 'r' || c == 'v' || c == 'w')
9807                         {
9808                           regno = lastregno;
9809                           s = s_reset;
9810                           ++args;
9811                         }
9812                     }
9813                   /* 'z' only matches $0.  */
9814                   if (c == 'z' && regno != 0)
9815                     break;
9816
9817                   if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
9818                     {
9819                       if (regno == lastregno)
9820                         {
9821                           insn_error
9822                             = _("Source and destination must be different");
9823                           continue;
9824                         }
9825                       if (regno == 31 && lastregno == 0xffffffff)
9826                         {
9827                           insn_error
9828                             = _("A destination register must be supplied");
9829                           continue;
9830                         }
9831                     }
9832                   /* Now that we have assembled one operand, we use the args
9833                      string to figure out where it goes in the instruction.  */
9834                   switch (c)
9835                     {
9836                     case 'r':
9837                     case 's':
9838                     case 'v':
9839                     case 'b':
9840                       INSERT_OPERAND (RS, *ip, regno);
9841                       break;
9842                     case 'd':
9843                     case 'K':
9844                     case 'g':
9845                       INSERT_OPERAND (RD, *ip, regno);
9846                       break;
9847                     case 'U':
9848                       INSERT_OPERAND (RD, *ip, regno);
9849                       INSERT_OPERAND (RT, *ip, regno);
9850                       break;
9851                     case 'w':
9852                     case 't':
9853                     case 'E':
9854                       INSERT_OPERAND (RT, *ip, regno);
9855                       break;
9856                     case 'x':
9857                       /* This case exists because on the r3000 trunc
9858                          expands into a macro which requires a gp
9859                          register.  On the r6000 or r4000 it is
9860                          assembled into a single instruction which
9861                          ignores the register.  Thus the insn version
9862                          is MIPS_ISA2 and uses 'x', and the macro
9863                          version is MIPS_ISA1 and uses 't'.  */
9864                       break;
9865                     case 'z':
9866                       /* This case is for the div instruction, which
9867                          acts differently if the destination argument
9868                          is $0.  This only matches $0, and is checked
9869                          outside the switch.  */
9870                       break;
9871                     }
9872                   lastregno = regno;
9873                   continue;
9874                 }
9875               switch (*args++)
9876                 {
9877                 case 'r':
9878                 case 'v':
9879                   INSERT_OPERAND (RS, *ip, lastregno);
9880                   continue;
9881                 case 'w':
9882                   INSERT_OPERAND (RT, *ip, lastregno);
9883                   continue;
9884                 }
9885               break;
9886
9887             case 'O':           /* MDMX alignment immediate constant.  */
9888               my_getExpression (&imm_expr, s);
9889               check_absolute_expr (ip, &imm_expr);
9890               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9891                 as_warn (_("Improper align amount (%ld), using low bits"),
9892                          (long) imm_expr.X_add_number);
9893               INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9894               imm_expr.X_op = O_absent;
9895               s = expr_end;
9896               continue;
9897
9898             case 'Q':           /* MDMX vector, element sel, or const.  */
9899               if (s[0] != '$')
9900                 {
9901                   /* MDMX Immediate.  */
9902                   my_getExpression (&imm_expr, s);
9903                   check_absolute_expr (ip, &imm_expr);
9904                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9905                     as_warn (_("Invalid MDMX Immediate (%ld)"),
9906                              (long) imm_expr.X_add_number);
9907                   INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9908                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9909                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9910                   else
9911                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9912                   imm_expr.X_op = O_absent;
9913                   s = expr_end;
9914                   continue;
9915                 }
9916               /* Not MDMX Immediate.  Fall through.  */
9917             case 'X':           /* MDMX destination register.  */
9918             case 'Y':           /* MDMX source register.  */
9919             case 'Z':           /* MDMX target register.  */
9920               is_mdmx = 1;
9921             case 'D':           /* Floating point destination register.  */
9922             case 'S':           /* Floating point source register.  */
9923             case 'T':           /* Floating point target register.  */
9924             case 'R':           /* Floating point source register.  */
9925             case 'V':
9926             case 'W':
9927               rtype = RTYPE_FPU;
9928               if (is_mdmx
9929                   || (mips_opts.ase_mdmx
9930                       && (ip->insn_mo->pinfo & FP_D)
9931                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9932                                                 | INSN_COPROC_MEMORY_DELAY
9933                                                 | INSN_LOAD_COPROC_DELAY
9934                                                 | INSN_LOAD_MEMORY_DELAY
9935                                                 | INSN_STORE_MEMORY))))
9936                 rtype |= RTYPE_VEC;
9937               s_reset = s;
9938               if (reg_lookup (&s, rtype, &regno))
9939                 {
9940                   if ((regno & 1) != 0
9941                       && HAVE_32BIT_FPRS
9942                       && !mips_oddfpreg_ok (ip->insn_mo, argnum))
9943                     as_warn (_("Float register should be even, was %d"),
9944                              regno);
9945
9946                   c = *args;
9947                   if (*s == ' ')
9948                     ++s;
9949                   if (args[1] != *s)
9950                     {
9951                       if (c == 'V' || c == 'W')
9952                         {
9953                           regno = lastregno;
9954                           s = s_reset;
9955                           ++args;
9956                         }
9957                     }
9958                   switch (c)
9959                     {
9960                     case 'D':
9961                     case 'X':
9962                       INSERT_OPERAND (FD, *ip, regno);
9963                       break;
9964                     case 'V':
9965                     case 'S':
9966                     case 'Y':
9967                       INSERT_OPERAND (FS, *ip, regno);
9968                       break;
9969                     case 'Q':
9970                       /* This is like 'Z', but also needs to fix the MDMX
9971                          vector/scalar select bits.  Note that the
9972                          scalar immediate case is handled above.  */
9973                       if (*s == '[')
9974                         {
9975                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9976                           int max_el = (is_qh ? 3 : 7);
9977                           s++;
9978                           my_getExpression(&imm_expr, s);
9979                           check_absolute_expr (ip, &imm_expr);
9980                           s = expr_end;
9981                           if (imm_expr.X_add_number > max_el)
9982                             as_bad (_("Bad element selector %ld"),
9983                                     (long) imm_expr.X_add_number);
9984                           imm_expr.X_add_number &= max_el;
9985                           ip->insn_opcode |= (imm_expr.X_add_number
9986                                               << (OP_SH_VSEL +
9987                                                   (is_qh ? 2 : 1)));
9988                           imm_expr.X_op = O_absent;
9989                           if (*s != ']')
9990                             as_warn (_("Expecting ']' found '%s'"), s);
9991                           else
9992                             s++;
9993                         }
9994                       else
9995                         {
9996                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9997                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9998                                                 << OP_SH_VSEL);
9999                           else
10000                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
10001                                                 OP_SH_VSEL);
10002                         }
10003                       /* Fall through.  */
10004                     case 'W':
10005                     case 'T':
10006                     case 'Z':
10007                       INSERT_OPERAND (FT, *ip, regno);
10008                       break;
10009                     case 'R':
10010                       INSERT_OPERAND (FR, *ip, regno);
10011                       break;
10012                     }
10013                   lastregno = regno;
10014                   continue;
10015                 }
10016
10017               switch (*args++)
10018                 {
10019                 case 'V':
10020                   INSERT_OPERAND (FS, *ip, lastregno);
10021                   continue;
10022                 case 'W':
10023                   INSERT_OPERAND (FT, *ip, lastregno);
10024                   continue;
10025                 }
10026               break;
10027
10028             case 'I':
10029               my_getExpression (&imm_expr, s);
10030               if (imm_expr.X_op != O_big
10031                   && imm_expr.X_op != O_constant)
10032                 insn_error = _("absolute expression required");
10033               if (HAVE_32BIT_GPRS)
10034                 normalize_constant_expr (&imm_expr);
10035               s = expr_end;
10036               continue;
10037
10038             case 'A':
10039               my_getExpression (&offset_expr, s);
10040               normalize_address_expr (&offset_expr);
10041               *imm_reloc = BFD_RELOC_32;
10042               s = expr_end;
10043               continue;
10044
10045             case 'F':
10046             case 'L':
10047             case 'f':
10048             case 'l':
10049               {
10050                 int f64;
10051                 int using_gprs;
10052                 char *save_in;
10053                 char *err;
10054                 unsigned char temp[8];
10055                 int len;
10056                 unsigned int length;
10057                 segT seg;
10058                 subsegT subseg;
10059                 char *p;
10060
10061                 /* These only appear as the last operand in an
10062                    instruction, and every instruction that accepts
10063                    them in any variant accepts them in all variants.
10064                    This means we don't have to worry about backing out
10065                    any changes if the instruction does not match.
10066
10067                    The difference between them is the size of the
10068                    floating point constant and where it goes.  For 'F'
10069                    and 'L' the constant is 64 bits; for 'f' and 'l' it
10070                    is 32 bits.  Where the constant is placed is based
10071                    on how the MIPS assembler does things:
10072                     F -- .rdata
10073                     L -- .lit8
10074                     f -- immediate value
10075                     l -- .lit4
10076
10077                     The .lit4 and .lit8 sections are only used if
10078                     permitted by the -G argument.
10079
10080                     The code below needs to know whether the target register
10081                     is 32 or 64 bits wide.  It relies on the fact 'f' and
10082                     'F' are used with GPR-based instructions and 'l' and
10083                     'L' are used with FPR-based instructions.  */
10084
10085                 f64 = *args == 'F' || *args == 'L';
10086                 using_gprs = *args == 'F' || *args == 'f';
10087
10088                 save_in = input_line_pointer;
10089                 input_line_pointer = s;
10090                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
10091                 length = len;
10092                 s = input_line_pointer;
10093                 input_line_pointer = save_in;
10094                 if (err != NULL && *err != '\0')
10095                   {
10096                     as_bad (_("Bad floating point constant: %s"), err);
10097                     memset (temp, '\0', sizeof temp);
10098                     length = f64 ? 8 : 4;
10099                   }
10100
10101                 gas_assert (length == (unsigned) (f64 ? 8 : 4));
10102
10103                 if (*args == 'f'
10104                     || (*args == 'l'
10105                         && (g_switch_value < 4
10106                             || (temp[0] == 0 && temp[1] == 0)
10107                             || (temp[2] == 0 && temp[3] == 0))))
10108                   {
10109                     imm_expr.X_op = O_constant;
10110                     if (!target_big_endian)
10111                       imm_expr.X_add_number = bfd_getl32 (temp);
10112                     else
10113                       imm_expr.X_add_number = bfd_getb32 (temp);
10114                   }
10115                 else if (length > 4
10116                          && !mips_disable_float_construction
10117                          /* Constants can only be constructed in GPRs and
10118                             copied to FPRs if the GPRs are at least as wide
10119                             as the FPRs.  Force the constant into memory if
10120                             we are using 64-bit FPRs but the GPRs are only
10121                             32 bits wide.  */
10122                          && (using_gprs
10123                              || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
10124                          && ((temp[0] == 0 && temp[1] == 0)
10125                              || (temp[2] == 0 && temp[3] == 0))
10126                          && ((temp[4] == 0 && temp[5] == 0)
10127                              || (temp[6] == 0 && temp[7] == 0)))
10128                   {
10129                     /* The value is simple enough to load with a couple of
10130                        instructions.  If using 32-bit registers, set
10131                        imm_expr to the high order 32 bits and offset_expr to
10132                        the low order 32 bits.  Otherwise, set imm_expr to
10133                        the entire 64 bit constant.  */
10134                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
10135                       {
10136                         imm_expr.X_op = O_constant;
10137                         offset_expr.X_op = O_constant;
10138                         if (!target_big_endian)
10139                           {
10140                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
10141                             offset_expr.X_add_number = bfd_getl32 (temp);
10142                           }
10143                         else
10144                           {
10145                             imm_expr.X_add_number = bfd_getb32 (temp);
10146                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
10147                           }
10148                         if (offset_expr.X_add_number == 0)
10149                           offset_expr.X_op = O_absent;
10150                       }
10151                     else if (sizeof (imm_expr.X_add_number) > 4)
10152                       {
10153                         imm_expr.X_op = O_constant;
10154                         if (!target_big_endian)
10155                           imm_expr.X_add_number = bfd_getl64 (temp);
10156                         else
10157                           imm_expr.X_add_number = bfd_getb64 (temp);
10158                       }
10159                     else
10160                       {
10161                         imm_expr.X_op = O_big;
10162                         imm_expr.X_add_number = 4;
10163                         if (!target_big_endian)
10164                           {
10165                             generic_bignum[0] = bfd_getl16 (temp);
10166                             generic_bignum[1] = bfd_getl16 (temp + 2);
10167                             generic_bignum[2] = bfd_getl16 (temp + 4);
10168                             generic_bignum[3] = bfd_getl16 (temp + 6);
10169                           }
10170                         else
10171                           {
10172                             generic_bignum[0] = bfd_getb16 (temp + 6);
10173                             generic_bignum[1] = bfd_getb16 (temp + 4);
10174                             generic_bignum[2] = bfd_getb16 (temp + 2);
10175                             generic_bignum[3] = bfd_getb16 (temp);
10176                           }
10177                       }
10178                   }
10179                 else
10180                   {
10181                     const char *newname;
10182                     segT new_seg;
10183
10184                     /* Switch to the right section.  */
10185                     seg = now_seg;
10186                     subseg = now_subseg;
10187                     switch (*args)
10188                       {
10189                       default: /* unused default case avoids warnings.  */
10190                       case 'L':
10191                         newname = RDATA_SECTION_NAME;
10192                         if (g_switch_value >= 8)
10193                           newname = ".lit8";
10194                         break;
10195                       case 'F':
10196                         newname = RDATA_SECTION_NAME;
10197                         break;
10198                       case 'l':
10199                         gas_assert (g_switch_value >= 4);
10200                         newname = ".lit4";
10201                         break;
10202                       }
10203                     new_seg = subseg_new (newname, (subsegT) 0);
10204                     if (IS_ELF)
10205                       bfd_set_section_flags (stdoutput, new_seg,
10206                                              (SEC_ALLOC
10207                                               | SEC_LOAD
10208                                               | SEC_READONLY
10209                                               | SEC_DATA));
10210                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
10211                     if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
10212                       record_alignment (new_seg, 4);
10213                     else
10214                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
10215                     if (seg == now_seg)
10216                       as_bad (_("Can't use floating point insn in this section"));
10217
10218                     /* Set the argument to the current address in the
10219                        section.  */
10220                     offset_expr.X_op = O_symbol;
10221                     offset_expr.X_add_symbol = symbol_temp_new_now ();
10222                     offset_expr.X_add_number = 0;
10223
10224                     /* Put the floating point number into the section.  */
10225                     p = frag_more ((int) length);
10226                     memcpy (p, temp, length);
10227
10228                     /* Switch back to the original section.  */
10229                     subseg_set (seg, subseg);
10230                   }
10231               }
10232               continue;
10233
10234             case 'i':           /* 16-bit unsigned immediate.  */
10235             case 'j':           /* 16-bit signed immediate.  */
10236               *imm_reloc = BFD_RELOC_LO16;
10237               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
10238                 {
10239                   int more;
10240                   offsetT minval, maxval;
10241
10242                   more = (insn + 1 < &mips_opcodes[NUMOPCODES]
10243                           && strcmp (insn->name, insn[1].name) == 0);
10244
10245                   /* If the expression was written as an unsigned number,
10246                      only treat it as signed if there are no more
10247                      alternatives.  */
10248                   if (more
10249                       && *args == 'j'
10250                       && sizeof (imm_expr.X_add_number) <= 4
10251                       && imm_expr.X_op == O_constant
10252                       && imm_expr.X_add_number < 0
10253                       && imm_expr.X_unsigned
10254                       && HAVE_64BIT_GPRS)
10255                     break;
10256
10257                   /* For compatibility with older assemblers, we accept
10258                      0x8000-0xffff as signed 16-bit numbers when only
10259                      signed numbers are allowed.  */
10260                   if (*args == 'i')
10261                     minval = 0, maxval = 0xffff;
10262                   else if (more)
10263                     minval = -0x8000, maxval = 0x7fff;
10264                   else
10265                     minval = -0x8000, maxval = 0xffff;
10266
10267                   if (imm_expr.X_op != O_constant
10268                       || imm_expr.X_add_number < minval
10269                       || imm_expr.X_add_number > maxval)
10270                     {
10271                       if (more)
10272                         break;
10273                       if (imm_expr.X_op == O_constant
10274                           || imm_expr.X_op == O_big)
10275                         as_bad (_("Expression out of range"));
10276                     }
10277                 }
10278               s = expr_end;
10279               continue;
10280
10281             case 'o':           /* 16-bit offset.  */
10282               offset_reloc[0] = BFD_RELOC_LO16;
10283               offset_reloc[1] = BFD_RELOC_UNUSED;
10284               offset_reloc[2] = BFD_RELOC_UNUSED;
10285
10286               /* Check whether there is only a single bracketed expression
10287                  left.  If so, it must be the base register and the
10288                  constant must be zero.  */
10289               if (*s == '(' && strchr (s + 1, '(') == 0)
10290                 {
10291                   offset_expr.X_op = O_constant;
10292                   offset_expr.X_add_number = 0;
10293                   continue;
10294                 }
10295
10296               /* If this value won't fit into a 16 bit offset, then go
10297                  find a macro that will generate the 32 bit offset
10298                  code pattern.  */
10299               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
10300                   && (offset_expr.X_op != O_constant
10301                       || offset_expr.X_add_number >= 0x8000
10302                       || offset_expr.X_add_number < -0x8000))
10303                 break;
10304
10305               s = expr_end;
10306               continue;
10307
10308             case 'p':           /* PC-relative offset.  */
10309               *offset_reloc = BFD_RELOC_16_PCREL_S2;
10310               my_getExpression (&offset_expr, s);
10311               s = expr_end;
10312               continue;
10313
10314             case 'u':           /* Upper 16 bits.  */
10315               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
10316                   && imm_expr.X_op == O_constant
10317                   && (imm_expr.X_add_number < 0
10318                       || imm_expr.X_add_number >= 0x10000))
10319                 as_bad (_("lui expression (%lu) not in range 0..65535"),
10320                         (unsigned long) imm_expr.X_add_number);
10321               s = expr_end;
10322               continue;
10323
10324             case 'a':           /* 26-bit address.  */
10325               my_getExpression (&offset_expr, s);
10326               s = expr_end;
10327               *offset_reloc = BFD_RELOC_MIPS_JMP;
10328               continue;
10329
10330             case 'N':           /* 3-bit branch condition code.  */
10331             case 'M':           /* 3-bit compare condition code.  */
10332               rtype = RTYPE_CCC;
10333               if (ip->insn_mo->pinfo & (FP_D | FP_S))
10334                 rtype |= RTYPE_FCC;
10335               if (!reg_lookup (&s, rtype, &regno))
10336                 break;
10337               if ((strcmp (str + strlen (str) - 3, ".ps") == 0
10338                    || strcmp (str + strlen (str) - 5, "any2f") == 0
10339                    || strcmp (str + strlen (str) - 5, "any2t") == 0)
10340                   && (regno & 1) != 0)
10341                 as_warn (_("Condition code register should be even for %s, "
10342                            "was %d"),
10343                          str, regno);
10344               if ((strcmp (str + strlen (str) - 5, "any4f") == 0
10345                    || strcmp (str + strlen (str) - 5, "any4t") == 0)
10346                   && (regno & 3) != 0)
10347                 as_warn (_("Condition code register should be 0 or 4 for %s, "
10348                            "was %d"),
10349                          str, regno);
10350               if (*args == 'N')
10351                 INSERT_OPERAND (BCC, *ip, regno);
10352               else
10353                 INSERT_OPERAND (CCC, *ip, regno);
10354               continue;
10355
10356             case 'H':
10357               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
10358                 s += 2;
10359               if (ISDIGIT (*s))
10360                 {
10361                   c = 0;
10362                   do
10363                     {
10364                       c *= 10;
10365                       c += *s - '0';
10366                       ++s;
10367                     }
10368                   while (ISDIGIT (*s));
10369                 }
10370               else
10371                 c = 8; /* Invalid sel value.  */
10372
10373               if (c > 7)
10374                 as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
10375               ip->insn_opcode |= c;
10376               continue;
10377
10378             case 'e':
10379               /* Must be at least one digit.  */
10380               my_getExpression (&imm_expr, s);
10381               check_absolute_expr (ip, &imm_expr);
10382
10383               if ((unsigned long) imm_expr.X_add_number
10384                   > (unsigned long) OP_MASK_VECBYTE)
10385                 {
10386                   as_bad (_("bad byte vector index (%ld)"),
10387                            (long) imm_expr.X_add_number);
10388                   imm_expr.X_add_number = 0;
10389                 }
10390
10391               INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
10392               imm_expr.X_op = O_absent;
10393               s = expr_end;
10394               continue;
10395
10396             case '%':
10397               my_getExpression (&imm_expr, s);
10398               check_absolute_expr (ip, &imm_expr);
10399
10400               if ((unsigned long) imm_expr.X_add_number
10401                   > (unsigned long) OP_MASK_VECALIGN)
10402                 {
10403                   as_bad (_("bad byte vector index (%ld)"),
10404                            (long) imm_expr.X_add_number);
10405                   imm_expr.X_add_number = 0;
10406                 }
10407
10408               INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
10409               imm_expr.X_op = O_absent;
10410               s = expr_end;
10411               continue;
10412
10413             default:
10414               as_bad (_("Bad char = '%c'\n"), *args);
10415               internalError ();
10416             }
10417           break;
10418         }
10419       /* Args don't match.  */
10420       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
10421           !strcmp (insn->name, insn[1].name))
10422         {
10423           ++insn;
10424           s = argsStart;
10425           insn_error = _("Illegal operands");
10426           continue;
10427         }
10428       if (save_c)
10429         *(--argsStart) = save_c;
10430       insn_error = _("Illegal operands");
10431       return;
10432     }
10433 }
10434
10435 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10436
10437 /* This routine assembles an instruction into its binary format when
10438    assembling for the mips16.  As a side effect, it sets one of the
10439    global variables imm_reloc or offset_reloc to the type of
10440    relocation to do if one of the operands is an address expression.
10441    It also sets mips16_small and mips16_ext if the user explicitly
10442    requested a small or extended instruction.  */
10443
10444 static void
10445 mips16_ip (char *str, struct mips_cl_insn *ip)
10446 {
10447   char *s;
10448   const char *args;
10449   struct mips_opcode *insn;
10450   char *argsstart;
10451   unsigned int regno;
10452   unsigned int lastregno = 0;
10453   char *s_reset;
10454   size_t i;
10455
10456   insn_error = NULL;
10457
10458   mips16_small = FALSE;
10459   mips16_ext = FALSE;
10460
10461   for (s = str; ISLOWER (*s); ++s)
10462     ;
10463   switch (*s)
10464     {
10465     case '\0':
10466       break;
10467
10468     case ' ':
10469       *s++ = '\0';
10470       break;
10471
10472     case '.':
10473       if (s[1] == 't' && s[2] == ' ')
10474         {
10475           *s = '\0';
10476           mips16_small = TRUE;
10477           s += 3;
10478           break;
10479         }
10480       else if (s[1] == 'e' && s[2] == ' ')
10481         {
10482           *s = '\0';
10483           mips16_ext = TRUE;
10484           s += 3;
10485           break;
10486         }
10487       /* Fall through.  */
10488     default:
10489       insn_error = _("unknown opcode");
10490       return;
10491     }
10492
10493   if (mips_opts.noautoextend && ! mips16_ext)
10494     mips16_small = TRUE;
10495
10496   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10497     {
10498       insn_error = _("unrecognized opcode");
10499       return;
10500     }
10501
10502   argsstart = s;
10503   for (;;)
10504     {
10505       bfd_boolean ok;
10506
10507       gas_assert (strcmp (insn->name, str) == 0);
10508
10509       ok = is_opcode_valid_16 (insn);
10510       if (! ok)
10511         {
10512           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10513               && strcmp (insn->name, insn[1].name) == 0)
10514             {
10515               ++insn;
10516               continue;
10517             }
10518           else
10519             {
10520               if (!insn_error)
10521                 {
10522                   static char buf[100];
10523                   sprintf (buf,
10524                            _("opcode not supported on this processor: %s (%s)"),
10525                            mips_cpu_info_from_arch (mips_opts.arch)->name,
10526                            mips_cpu_info_from_isa (mips_opts.isa)->name);
10527                   insn_error = buf;
10528                 }
10529               return;
10530             }
10531         }
10532
10533       create_insn (ip, insn);
10534       imm_expr.X_op = O_absent;
10535       imm_reloc[0] = BFD_RELOC_UNUSED;
10536       imm_reloc[1] = BFD_RELOC_UNUSED;
10537       imm_reloc[2] = BFD_RELOC_UNUSED;
10538       imm2_expr.X_op = O_absent;
10539       offset_expr.X_op = O_absent;
10540       offset_reloc[0] = BFD_RELOC_UNUSED;
10541       offset_reloc[1] = BFD_RELOC_UNUSED;
10542       offset_reloc[2] = BFD_RELOC_UNUSED;
10543       for (args = insn->args; 1; ++args)
10544         {
10545           int c;
10546
10547           if (*s == ' ')
10548             ++s;
10549
10550           /* In this switch statement we call break if we did not find
10551              a match, continue if we did find a match, or return if we
10552              are done.  */
10553
10554           c = *args;
10555           switch (c)
10556             {
10557             case '\0':
10558               if (*s == '\0')
10559                 {
10560                   /* Stuff the immediate value in now, if we can.  */
10561                   if (imm_expr.X_op == O_constant
10562                       && *imm_reloc > BFD_RELOC_UNUSED
10563                       && *imm_reloc != BFD_RELOC_MIPS16_GOT16
10564                       && *imm_reloc != BFD_RELOC_MIPS16_CALL16
10565                       && insn->pinfo != INSN_MACRO)
10566                     {
10567                       valueT tmp;
10568
10569                       switch (*offset_reloc)
10570                         {
10571                           case BFD_RELOC_MIPS16_HI16_S:
10572                             tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10573                             break;
10574
10575                           case BFD_RELOC_MIPS16_HI16:
10576                             tmp = imm_expr.X_add_number >> 16;
10577                             break;
10578
10579                           case BFD_RELOC_MIPS16_LO16:
10580                             tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10581                                   - 0x8000;
10582                             break;
10583
10584                           case BFD_RELOC_UNUSED:
10585                             tmp = imm_expr.X_add_number;
10586                             break;
10587
10588                           default:
10589                             internalError ();
10590                         }
10591                       *offset_reloc = BFD_RELOC_UNUSED;
10592
10593                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
10594                                     tmp, TRUE, mips16_small,
10595                                     mips16_ext, &ip->insn_opcode,
10596                                     &ip->use_extend, &ip->extend);
10597                       imm_expr.X_op = O_absent;
10598                       *imm_reloc = BFD_RELOC_UNUSED;
10599                     }
10600
10601                   return;
10602                 }
10603               break;
10604
10605             case ',':
10606               if (*s++ == c)
10607                 continue;
10608               s--;
10609               switch (*++args)
10610                 {
10611                 case 'v':
10612                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10613                   continue;
10614                 case 'w':
10615                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10616                   continue;
10617                 }
10618               break;
10619
10620             case '(':
10621             case ')':
10622               if (*s++ == c)
10623                 continue;
10624               break;
10625
10626             case 'v':
10627             case 'w':
10628               if (s[0] != '$')
10629                 {
10630                   if (c == 'v')
10631                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10632                   else
10633                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10634                   ++args;
10635                   continue;
10636                 }
10637               /* Fall through.  */
10638             case 'x':
10639             case 'y':
10640             case 'z':
10641             case 'Z':
10642             case '0':
10643             case 'S':
10644             case 'R':
10645             case 'X':
10646             case 'Y':
10647               s_reset = s;
10648               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
10649                 {
10650                   if (c == 'v' || c == 'w')
10651                     {
10652                       if (c == 'v')
10653                         MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10654                       else
10655                         MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10656                       ++args;
10657                       continue;
10658                     }
10659                   break;
10660                 }
10661
10662               if (*s == ' ')
10663                 ++s;
10664               if (args[1] != *s)
10665                 {
10666                   if (c == 'v' || c == 'w')
10667                     {
10668                       regno = mips16_to_32_reg_map[lastregno];
10669                       s = s_reset;
10670                       ++args;
10671                     }
10672                 }
10673
10674               switch (c)
10675                 {
10676                 case 'x':
10677                 case 'y':
10678                 case 'z':
10679                 case 'v':
10680                 case 'w':
10681                 case 'Z':
10682                   regno = mips32_to_16_reg_map[regno];
10683                   break;
10684
10685                 case '0':
10686                   if (regno != 0)
10687                     regno = ILLEGAL_REG;
10688                   break;
10689
10690                 case 'S':
10691                   if (regno != SP)
10692                     regno = ILLEGAL_REG;
10693                   break;
10694
10695                 case 'R':
10696                   if (regno != RA)
10697                     regno = ILLEGAL_REG;
10698                   break;
10699
10700                 case 'X':
10701                 case 'Y':
10702                   if (regno == AT && mips_opts.at)
10703                     {
10704                       if (mips_opts.at == ATREG)
10705                         as_warn (_("used $at without \".set noat\""));
10706                       else
10707                         as_warn (_("used $%u with \".set at=$%u\""),
10708                                  regno, mips_opts.at);
10709                     }
10710                   break;
10711
10712                 default:
10713                   internalError ();
10714                 }
10715
10716               if (regno == ILLEGAL_REG)
10717                 break;
10718
10719               switch (c)
10720                 {
10721                 case 'x':
10722                 case 'v':
10723                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
10724                   break;
10725                 case 'y':
10726                 case 'w':
10727                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
10728                   break;
10729                 case 'z':
10730                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10731                   break;
10732                 case 'Z':
10733                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10734                 case '0':
10735                 case 'S':
10736                 case 'R':
10737                   break;
10738                 case 'X':
10739                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10740                   break;
10741                 case 'Y':
10742                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10743                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10744                   break;
10745                 default:
10746                   internalError ();
10747                 }
10748
10749               lastregno = regno;
10750               continue;
10751
10752             case 'P':
10753               if (strncmp (s, "$pc", 3) == 0)
10754                 {
10755                   s += 3;
10756                   continue;
10757                 }
10758               break;
10759
10760             case '5':
10761             case 'H':
10762             case 'W':
10763             case 'D':
10764             case 'j':
10765             case 'V':
10766             case 'C':
10767             case 'U':
10768             case 'k':
10769             case 'K':
10770               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10771               if (i > 0)
10772                 {
10773                   if (imm_expr.X_op != O_constant)
10774                     {
10775                       mips16_ext = TRUE;
10776                       ip->use_extend = TRUE;
10777                       ip->extend = 0;
10778                     }
10779                   else
10780                     {
10781                       /* We need to relax this instruction.  */
10782                       *offset_reloc = *imm_reloc;
10783                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10784                     }
10785                   s = expr_end;
10786                   continue;
10787                 }
10788               *imm_reloc = BFD_RELOC_UNUSED;
10789               /* Fall through.  */
10790             case '<':
10791             case '>':
10792             case '[':
10793             case ']':
10794             case '4':
10795             case '8':
10796               my_getExpression (&imm_expr, s);
10797               if (imm_expr.X_op == O_register)
10798                 {
10799                   /* What we thought was an expression turned out to
10800                      be a register.  */
10801
10802                   if (s[0] == '(' && args[1] == '(')
10803                     {
10804                       /* It looks like the expression was omitted
10805                          before a register indirection, which means
10806                          that the expression is implicitly zero.  We
10807                          still set up imm_expr, so that we handle
10808                          explicit extensions correctly.  */
10809                       imm_expr.X_op = O_constant;
10810                       imm_expr.X_add_number = 0;
10811                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10812                       continue;
10813                     }
10814
10815                   break;
10816                 }
10817
10818               /* We need to relax this instruction.  */
10819               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10820               s = expr_end;
10821               continue;
10822
10823             case 'p':
10824             case 'q':
10825             case 'A':
10826             case 'B':
10827             case 'E':
10828               /* We use offset_reloc rather than imm_reloc for the PC
10829                  relative operands.  This lets macros with both
10830                  immediate and address operands work correctly.  */
10831               my_getExpression (&offset_expr, s);
10832
10833               if (offset_expr.X_op == O_register)
10834                 break;
10835
10836               /* We need to relax this instruction.  */
10837               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10838               s = expr_end;
10839               continue;
10840
10841             case '6':           /* break code */
10842               my_getExpression (&imm_expr, s);
10843               check_absolute_expr (ip, &imm_expr);
10844               if ((unsigned long) imm_expr.X_add_number > 63)
10845                 as_warn (_("Invalid value for `%s' (%lu)"),
10846                          ip->insn_mo->name,
10847                          (unsigned long) imm_expr.X_add_number);
10848               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10849               imm_expr.X_op = O_absent;
10850               s = expr_end;
10851               continue;
10852
10853             case 'a':           /* 26 bit address */
10854               my_getExpression (&offset_expr, s);
10855               s = expr_end;
10856               *offset_reloc = BFD_RELOC_MIPS16_JMP;
10857               ip->insn_opcode <<= 16;
10858               continue;
10859
10860             case 'l':           /* register list for entry macro */
10861             case 'L':           /* register list for exit macro */
10862               {
10863                 int mask;
10864
10865                 if (c == 'l')
10866                   mask = 0;
10867                 else
10868                   mask = 7 << 3;
10869                 while (*s != '\0')
10870                   {
10871                     unsigned int freg, reg1, reg2;
10872
10873                     while (*s == ' ' || *s == ',')
10874                       ++s;
10875                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10876                       freg = 0;
10877                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10878                       freg = 1;
10879                     else
10880                       {
10881                         as_bad (_("can't parse register list"));
10882                         break;
10883                       }
10884                     if (*s == ' ')
10885                       ++s;
10886                     if (*s != '-')
10887                       reg2 = reg1;
10888                     else
10889                       {
10890                         ++s;
10891                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
10892                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
10893                           {
10894                             as_bad (_("invalid register list"));
10895                             break;
10896                           }
10897                       }
10898                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10899                       {
10900                         mask &= ~ (7 << 3);
10901                         mask |= 5 << 3;
10902                       }
10903                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10904                       {
10905                         mask &= ~ (7 << 3);
10906                         mask |= 6 << 3;
10907                       }
10908                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10909                       mask |= (reg2 - 3) << 3;
10910                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10911                       mask |= (reg2 - 15) << 1;
10912                     else if (reg1 == RA && reg2 == RA)
10913                       mask |= 1;
10914                     else
10915                       {
10916                         as_bad (_("invalid register list"));
10917                         break;
10918                       }
10919                   }
10920                 /* The mask is filled in in the opcode table for the
10921                    benefit of the disassembler.  We remove it before
10922                    applying the actual mask.  */
10923                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10924                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10925               }
10926             continue;
10927
10928             case 'm':           /* Register list for save insn.  */
10929             case 'M':           /* Register list for restore insn.  */
10930               {
10931                 int opcode = 0;
10932                 int framesz = 0, seen_framesz = 0;
10933                 int nargs = 0, statics = 0, sregs = 0;
10934
10935                 while (*s != '\0')
10936                   {
10937                     unsigned int reg1, reg2;
10938
10939                     SKIP_SPACE_TABS (s);
10940                     while (*s == ',')
10941                       ++s;
10942                     SKIP_SPACE_TABS (s);
10943
10944                     my_getExpression (&imm_expr, s);
10945                     if (imm_expr.X_op == O_constant)
10946                       {
10947                         /* Handle the frame size.  */
10948                         if (seen_framesz)
10949                           {
10950                             as_bad (_("more than one frame size in list"));
10951                             break;
10952                           }
10953                         seen_framesz = 1;
10954                         framesz = imm_expr.X_add_number;
10955                         imm_expr.X_op = O_absent;
10956                         s = expr_end;
10957                         continue;
10958                       }
10959
10960                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10961                       {
10962                         as_bad (_("can't parse register list"));
10963                         break;
10964                       }
10965
10966                     while (*s == ' ')
10967                       ++s;
10968
10969                     if (*s != '-')
10970                       reg2 = reg1;
10971                     else
10972                       {
10973                         ++s;
10974                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10975                             || reg2 < reg1)
10976                           {
10977                             as_bad (_("can't parse register list"));
10978                             break;
10979                           }
10980                       }
10981
10982                     while (reg1 <= reg2)
10983                       {
10984                         if (reg1 >= 4 && reg1 <= 7)
10985                           {
10986                             if (!seen_framesz)
10987                                 /* args $a0-$a3 */
10988                                 nargs |= 1 << (reg1 - 4);
10989                             else
10990                                 /* statics $a0-$a3 */
10991                                 statics |= 1 << (reg1 - 4);
10992                           }
10993                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10994                           {
10995                             /* $s0-$s8 */
10996                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10997                           }
10998                         else if (reg1 == 31)
10999                           {
11000                             /* Add $ra to insn.  */
11001                             opcode |= 0x40;
11002                           }
11003                         else
11004                           {
11005                             as_bad (_("unexpected register in list"));
11006                             break;
11007                           }
11008                         if (++reg1 == 24)
11009                           reg1 = 30;
11010                       }
11011                   }
11012
11013                 /* Encode args/statics combination.  */
11014                 if (nargs & statics)
11015                   as_bad (_("arg/static registers overlap"));
11016                 else if (nargs == 0xf)
11017                   /* All $a0-$a3 are args.  */
11018                   opcode |= MIPS16_ALL_ARGS << 16;
11019                 else if (statics == 0xf)
11020                   /* All $a0-$a3 are statics.  */
11021                   opcode |= MIPS16_ALL_STATICS << 16;
11022                 else 
11023                   {
11024                     int narg = 0, nstat = 0;
11025
11026                     /* Count arg registers.  */
11027                     while (nargs & 0x1)
11028                       {
11029                         nargs >>= 1;
11030                         narg++;
11031                       }
11032                     if (nargs != 0)
11033                       as_bad (_("invalid arg register list"));
11034
11035                     /* Count static registers.  */
11036                     while (statics & 0x8)
11037                       {
11038                         statics = (statics << 1) & 0xf;
11039                         nstat++;
11040                       }
11041                     if (statics != 0) 
11042                       as_bad (_("invalid static register list"));
11043
11044                     /* Encode args/statics.  */
11045                     opcode |= ((narg << 2) | nstat) << 16;
11046                   }
11047
11048                 /* Encode $s0/$s1.  */
11049                 if (sregs & (1 << 0))           /* $s0 */
11050                   opcode |= 0x20;
11051                 if (sregs & (1 << 1))           /* $s1 */
11052                   opcode |= 0x10;
11053                 sregs >>= 2;
11054
11055                 if (sregs != 0)
11056                   {
11057                     /* Count regs $s2-$s8.  */
11058                     int nsreg = 0;
11059                     while (sregs & 1)
11060                       {
11061                         sregs >>= 1;
11062                         nsreg++;
11063                       }
11064                     if (sregs != 0)
11065                       as_bad (_("invalid static register list"));
11066                     /* Encode $s2-$s8. */
11067                     opcode |= nsreg << 24;
11068                   }
11069
11070                 /* Encode frame size.  */
11071                 if (!seen_framesz)
11072                   as_bad (_("missing frame size"));
11073                 else if ((framesz & 7) != 0 || framesz < 0
11074                          || framesz > 0xff * 8)
11075                   as_bad (_("invalid frame size"));
11076                 else if (framesz != 128 || (opcode >> 16) != 0)
11077                   {
11078                     framesz /= 8;
11079                     opcode |= (((framesz & 0xf0) << 16)
11080                              | (framesz & 0x0f));
11081                   }
11082
11083                 /* Finally build the instruction.  */
11084                 if ((opcode >> 16) != 0 || framesz == 0)
11085                   {
11086                     ip->use_extend = TRUE;
11087                     ip->extend = opcode >> 16;
11088                   }
11089                 ip->insn_opcode |= opcode & 0x7f;
11090               }
11091             continue;
11092
11093             case 'e':           /* extend code */
11094               my_getExpression (&imm_expr, s);
11095               check_absolute_expr (ip, &imm_expr);
11096               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
11097                 {
11098                   as_warn (_("Invalid value for `%s' (%lu)"),
11099                            ip->insn_mo->name,
11100                            (unsigned long) imm_expr.X_add_number);
11101                   imm_expr.X_add_number &= 0x7ff;
11102                 }
11103               ip->insn_opcode |= imm_expr.X_add_number;
11104               imm_expr.X_op = O_absent;
11105               s = expr_end;
11106               continue;
11107
11108             default:
11109               internalError ();
11110             }
11111           break;
11112         }
11113
11114       /* Args don't match.  */
11115       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
11116           strcmp (insn->name, insn[1].name) == 0)
11117         {
11118           ++insn;
11119           s = argsstart;
11120           continue;
11121         }
11122
11123       insn_error = _("illegal operands");
11124
11125       return;
11126     }
11127 }
11128
11129 /* This structure holds information we know about a mips16 immediate
11130    argument type.  */
11131
11132 struct mips16_immed_operand
11133 {
11134   /* The type code used in the argument string in the opcode table.  */
11135   int type;
11136   /* The number of bits in the short form of the opcode.  */
11137   int nbits;
11138   /* The number of bits in the extended form of the opcode.  */
11139   int extbits;
11140   /* The amount by which the short form is shifted when it is used;
11141      for example, the sw instruction has a shift count of 2.  */
11142   int shift;
11143   /* The amount by which the short form is shifted when it is stored
11144      into the instruction code.  */
11145   int op_shift;
11146   /* Non-zero if the short form is unsigned.  */
11147   int unsp;
11148   /* Non-zero if the extended form is unsigned.  */
11149   int extu;
11150   /* Non-zero if the value is PC relative.  */
11151   int pcrel;
11152 };
11153
11154 /* The mips16 immediate operand types.  */
11155
11156 static const struct mips16_immed_operand mips16_immed_operands[] =
11157 {
11158   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
11159   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
11160   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
11161   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
11162   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
11163   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
11164   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
11165   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
11166   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
11167   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
11168   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
11169   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
11170   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
11171   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
11172   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
11173   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
11174   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
11175   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
11176   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
11177   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
11178   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
11179 };
11180
11181 #define MIPS16_NUM_IMMED \
11182   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
11183
11184 /* Handle a mips16 instruction with an immediate value.  This or's the
11185    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
11186    whether an extended value is needed; if one is needed, it sets
11187    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
11188    If SMALL is true, an unextended opcode was explicitly requested.
11189    If EXT is true, an extended opcode was explicitly requested.  If
11190    WARN is true, warn if EXT does not match reality.  */
11191
11192 static void
11193 mips16_immed (char *file, unsigned int line, int type, offsetT val,
11194               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
11195               unsigned long *insn, bfd_boolean *use_extend,
11196               unsigned short *extend)
11197 {
11198   const struct mips16_immed_operand *op;
11199   int mintiny, maxtiny;
11200   bfd_boolean needext;
11201
11202   op = mips16_immed_operands;
11203   while (op->type != type)
11204     {
11205       ++op;
11206       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
11207     }
11208
11209   if (op->unsp)
11210     {
11211       if (type == '<' || type == '>' || type == '[' || type == ']')
11212         {
11213           mintiny = 1;
11214           maxtiny = 1 << op->nbits;
11215         }
11216       else
11217         {
11218           mintiny = 0;
11219           maxtiny = (1 << op->nbits) - 1;
11220         }
11221     }
11222   else
11223     {
11224       mintiny = - (1 << (op->nbits - 1));
11225       maxtiny = (1 << (op->nbits - 1)) - 1;
11226     }
11227
11228   /* Branch offsets have an implicit 0 in the lowest bit.  */
11229   if (type == 'p' || type == 'q')
11230     val /= 2;
11231
11232   if ((val & ((1 << op->shift) - 1)) != 0
11233       || val < (mintiny << op->shift)
11234       || val > (maxtiny << op->shift))
11235     needext = TRUE;
11236   else
11237     needext = FALSE;
11238
11239   if (warn && ext && ! needext)
11240     as_warn_where (file, line,
11241                    _("extended operand requested but not required"));
11242   if (small && needext)
11243     as_bad_where (file, line, _("invalid unextended operand value"));
11244
11245   if (small || (! ext && ! needext))
11246     {
11247       int insnval;
11248
11249       *use_extend = FALSE;
11250       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
11251       insnval <<= op->op_shift;
11252       *insn |= insnval;
11253     }
11254   else
11255     {
11256       long minext, maxext;
11257       int extval;
11258
11259       if (op->extu)
11260         {
11261           minext = 0;
11262           maxext = (1 << op->extbits) - 1;
11263         }
11264       else
11265         {
11266           minext = - (1 << (op->extbits - 1));
11267           maxext = (1 << (op->extbits - 1)) - 1;
11268         }
11269       if (val < minext || val > maxext)
11270         as_bad_where (file, line,
11271                       _("operand value out of range for instruction"));
11272
11273       *use_extend = TRUE;
11274       if (op->extbits == 16)
11275         {
11276           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
11277           val &= 0x1f;
11278         }
11279       else if (op->extbits == 15)
11280         {
11281           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
11282           val &= 0xf;
11283         }
11284       else
11285         {
11286           extval = ((val & 0x1f) << 6) | (val & 0x20);
11287           val = 0;
11288         }
11289
11290       *extend = (unsigned short) extval;
11291       *insn |= val;
11292     }
11293 }
11294 \f
11295 struct percent_op_match
11296 {
11297   const char *str;
11298   bfd_reloc_code_real_type reloc;
11299 };
11300
11301 static const struct percent_op_match mips_percent_op[] =
11302 {
11303   {"%lo", BFD_RELOC_LO16},
11304 #ifdef OBJ_ELF
11305   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
11306   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
11307   {"%call16", BFD_RELOC_MIPS_CALL16},
11308   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
11309   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
11310   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
11311   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
11312   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
11313   {"%got", BFD_RELOC_MIPS_GOT16},
11314   {"%gp_rel", BFD_RELOC_GPREL16},
11315   {"%half", BFD_RELOC_16},
11316   {"%highest", BFD_RELOC_MIPS_HIGHEST},
11317   {"%higher", BFD_RELOC_MIPS_HIGHER},
11318   {"%neg", BFD_RELOC_MIPS_SUB},
11319   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
11320   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
11321   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
11322   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
11323   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
11324   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
11325   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
11326 #endif
11327   {"%hi", BFD_RELOC_HI16_S}
11328 };
11329
11330 static const struct percent_op_match mips16_percent_op[] =
11331 {
11332   {"%lo", BFD_RELOC_MIPS16_LO16},
11333   {"%gprel", BFD_RELOC_MIPS16_GPREL},
11334   {"%got", BFD_RELOC_MIPS16_GOT16},
11335   {"%call16", BFD_RELOC_MIPS16_CALL16},
11336   {"%hi", BFD_RELOC_MIPS16_HI16_S}
11337 };
11338
11339
11340 /* Return true if *STR points to a relocation operator.  When returning true,
11341    move *STR over the operator and store its relocation code in *RELOC.
11342    Leave both *STR and *RELOC alone when returning false.  */
11343
11344 static bfd_boolean
11345 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
11346 {
11347   const struct percent_op_match *percent_op;
11348   size_t limit, i;
11349
11350   if (mips_opts.mips16)
11351     {
11352       percent_op = mips16_percent_op;
11353       limit = ARRAY_SIZE (mips16_percent_op);
11354     }
11355   else
11356     {
11357       percent_op = mips_percent_op;
11358       limit = ARRAY_SIZE (mips_percent_op);
11359     }
11360
11361   for (i = 0; i < limit; i++)
11362     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
11363       {
11364         int len = strlen (percent_op[i].str);
11365
11366         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
11367           continue;
11368
11369         *str += strlen (percent_op[i].str);
11370         *reloc = percent_op[i].reloc;
11371
11372         /* Check whether the output BFD supports this relocation.
11373            If not, issue an error and fall back on something safe.  */
11374         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
11375           {
11376             as_bad (_("relocation %s isn't supported by the current ABI"),
11377                     percent_op[i].str);
11378             *reloc = BFD_RELOC_UNUSED;
11379           }
11380         return TRUE;
11381       }
11382   return FALSE;
11383 }
11384
11385
11386 /* Parse string STR as a 16-bit relocatable operand.  Store the
11387    expression in *EP and the relocations in the array starting
11388    at RELOC.  Return the number of relocation operators used.
11389
11390    On exit, EXPR_END points to the first character after the expression.  */
11391
11392 static size_t
11393 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
11394                        char *str)
11395 {
11396   bfd_reloc_code_real_type reversed_reloc[3];
11397   size_t reloc_index, i;
11398   int crux_depth, str_depth;
11399   char *crux;
11400
11401   /* Search for the start of the main expression, recoding relocations
11402      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
11403      of the main expression and with CRUX_DEPTH containing the number
11404      of open brackets at that point.  */
11405   reloc_index = -1;
11406   str_depth = 0;
11407   do
11408     {
11409       reloc_index++;
11410       crux = str;
11411       crux_depth = str_depth;
11412
11413       /* Skip over whitespace and brackets, keeping count of the number
11414          of brackets.  */
11415       while (*str == ' ' || *str == '\t' || *str == '(')
11416         if (*str++ == '(')
11417           str_depth++;
11418     }
11419   while (*str == '%'
11420          && reloc_index < (HAVE_NEWABI ? 3 : 1)
11421          && parse_relocation (&str, &reversed_reloc[reloc_index]));
11422
11423   my_getExpression (ep, crux);
11424   str = expr_end;
11425
11426   /* Match every open bracket.  */
11427   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
11428     if (*str++ == ')')
11429       crux_depth--;
11430
11431   if (crux_depth > 0)
11432     as_bad (_("unclosed '('"));
11433
11434   expr_end = str;
11435
11436   if (reloc_index != 0)
11437     {
11438       prev_reloc_op_frag = frag_now;
11439       for (i = 0; i < reloc_index; i++)
11440         reloc[i] = reversed_reloc[reloc_index - 1 - i];
11441     }
11442
11443   return reloc_index;
11444 }
11445
11446 static void
11447 my_getExpression (expressionS *ep, char *str)
11448 {
11449   char *save_in;
11450
11451   save_in = input_line_pointer;
11452   input_line_pointer = str;
11453   expression (ep);
11454   expr_end = input_line_pointer;
11455   input_line_pointer = save_in;
11456 }
11457
11458 char *
11459 md_atof (int type, char *litP, int *sizeP)
11460 {
11461   return ieee_md_atof (type, litP, sizeP, target_big_endian);
11462 }
11463
11464 void
11465 md_number_to_chars (char *buf, valueT val, int n)
11466 {
11467   if (target_big_endian)
11468     number_to_chars_bigendian (buf, val, n);
11469   else
11470     number_to_chars_littleendian (buf, val, n);
11471 }
11472 \f
11473 #ifdef OBJ_ELF
11474 static int support_64bit_objects(void)
11475 {
11476   const char **list, **l;
11477   int yes;
11478
11479   list = bfd_target_list ();
11480   for (l = list; *l != NULL; l++)
11481     if (strcmp (*l, ELF_TARGET ("elf64-", "big")) == 0
11482         || strcmp (*l, ELF_TARGET ("elf64-", "little")) == 0)
11483       break;
11484   yes = (*l != NULL);
11485   free (list);
11486   return yes;
11487 }
11488 #endif /* OBJ_ELF */
11489
11490 const char *md_shortopts = "O::g::G:";
11491
11492 enum options
11493   {
11494     OPTION_MARCH = OPTION_MD_BASE,
11495     OPTION_MTUNE,
11496     OPTION_MIPS1,
11497     OPTION_MIPS2,
11498     OPTION_MIPS3,
11499     OPTION_MIPS4,
11500     OPTION_MIPS5,
11501     OPTION_MIPS32,
11502     OPTION_MIPS64,
11503     OPTION_MIPS32R2,
11504     OPTION_MIPS64R2,
11505     OPTION_MIPS16,
11506     OPTION_NO_MIPS16,
11507     OPTION_MIPS3D,
11508     OPTION_NO_MIPS3D,
11509     OPTION_MDMX,
11510     OPTION_NO_MDMX,
11511     OPTION_DSP,
11512     OPTION_NO_DSP,
11513     OPTION_MT,
11514     OPTION_NO_MT,
11515     OPTION_SMARTMIPS,
11516     OPTION_NO_SMARTMIPS,
11517     OPTION_DSPR2,
11518     OPTION_NO_DSPR2,
11519     OPTION_COMPAT_ARCH_BASE,
11520     OPTION_M4650,
11521     OPTION_NO_M4650,
11522     OPTION_M4010,
11523     OPTION_NO_M4010,
11524     OPTION_M4100,
11525     OPTION_NO_M4100,
11526     OPTION_M3900,
11527     OPTION_NO_M3900,
11528     OPTION_M7000_HILO_FIX,
11529     OPTION_MNO_7000_HILO_FIX, 
11530     OPTION_FIX_24K,
11531     OPTION_NO_FIX_24K,
11532     OPTION_FIX_LOONGSON2F_JUMP,
11533     OPTION_NO_FIX_LOONGSON2F_JUMP,
11534     OPTION_FIX_LOONGSON2F_NOP,
11535     OPTION_NO_FIX_LOONGSON2F_NOP,
11536     OPTION_FIX_VR4120,
11537     OPTION_NO_FIX_VR4120,
11538     OPTION_FIX_VR4130,
11539     OPTION_NO_FIX_VR4130,
11540     OPTION_FIX_CN63XXP1,
11541     OPTION_NO_FIX_CN63XXP1,
11542     OPTION_TRAP,
11543     OPTION_BREAK,
11544     OPTION_EB,
11545     OPTION_EL,
11546     OPTION_FP32,
11547     OPTION_GP32,
11548     OPTION_CONSTRUCT_FLOATS,
11549     OPTION_NO_CONSTRUCT_FLOATS,
11550     OPTION_FP64,
11551     OPTION_GP64,
11552     OPTION_RELAX_BRANCH,
11553     OPTION_NO_RELAX_BRANCH,
11554     OPTION_MSHARED,
11555     OPTION_MNO_SHARED,
11556     OPTION_MSYM32,
11557     OPTION_MNO_SYM32,
11558     OPTION_SOFT_FLOAT,
11559     OPTION_HARD_FLOAT,
11560     OPTION_SINGLE_FLOAT,
11561     OPTION_DOUBLE_FLOAT,
11562     OPTION_32,
11563 #ifdef OBJ_ELF
11564     OPTION_CALL_SHARED,
11565     OPTION_CALL_NONPIC,
11566     OPTION_NON_SHARED,
11567     OPTION_XGOT,
11568     OPTION_MABI,
11569     OPTION_N32,
11570     OPTION_64,
11571     OPTION_MDEBUG,
11572     OPTION_NO_MDEBUG,
11573     OPTION_PDR,
11574     OPTION_NO_PDR,
11575     OPTION_MVXWORKS_PIC,
11576 #endif /* OBJ_ELF */
11577     OPTION_END_OF_ENUM    
11578   };
11579   
11580 struct option md_longopts[] =
11581 {
11582   /* Options which specify architecture.  */
11583   {"march", required_argument, NULL, OPTION_MARCH},
11584   {"mtune", required_argument, NULL, OPTION_MTUNE},
11585   {"mips0", no_argument, NULL, OPTION_MIPS1},
11586   {"mips1", no_argument, NULL, OPTION_MIPS1},
11587   {"mips2", no_argument, NULL, OPTION_MIPS2},
11588   {"mips3", no_argument, NULL, OPTION_MIPS3},
11589   {"mips4", no_argument, NULL, OPTION_MIPS4},
11590   {"mips5", no_argument, NULL, OPTION_MIPS5},
11591   {"mips32", no_argument, NULL, OPTION_MIPS32},
11592   {"mips64", no_argument, NULL, OPTION_MIPS64},
11593   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
11594   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
11595
11596   /* Options which specify Application Specific Extensions (ASEs).  */
11597   {"mips16", no_argument, NULL, OPTION_MIPS16},
11598   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
11599   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
11600   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
11601   {"mdmx", no_argument, NULL, OPTION_MDMX},
11602   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
11603   {"mdsp", no_argument, NULL, OPTION_DSP},
11604   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
11605   {"mmt", no_argument, NULL, OPTION_MT},
11606   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
11607   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
11608   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
11609   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
11610   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
11611
11612   /* Old-style architecture options.  Don't add more of these.  */
11613   {"m4650", no_argument, NULL, OPTION_M4650},
11614   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
11615   {"m4010", no_argument, NULL, OPTION_M4010},
11616   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
11617   {"m4100", no_argument, NULL, OPTION_M4100},
11618   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
11619   {"m3900", no_argument, NULL, OPTION_M3900},
11620   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11621
11622   /* Options which enable bug fixes.  */
11623   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
11624   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11625   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11626   {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
11627   {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
11628   {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
11629   {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
11630   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
11631   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
11632   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
11633   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
11634   {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
11635   {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
11636   {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
11637   {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
11638
11639   /* Miscellaneous options.  */
11640   {"trap", no_argument, NULL, OPTION_TRAP},
11641   {"no-break", no_argument, NULL, OPTION_TRAP},
11642   {"break", no_argument, NULL, OPTION_BREAK},
11643   {"no-trap", no_argument, NULL, OPTION_BREAK},
11644   {"EB", no_argument, NULL, OPTION_EB},
11645   {"EL", no_argument, NULL, OPTION_EL},
11646   {"mfp32", no_argument, NULL, OPTION_FP32},
11647   {"mgp32", no_argument, NULL, OPTION_GP32},
11648   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
11649   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
11650   {"mfp64", no_argument, NULL, OPTION_FP64},
11651   {"mgp64", no_argument, NULL, OPTION_GP64},
11652   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11653   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
11654   {"mshared", no_argument, NULL, OPTION_MSHARED},
11655   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
11656   {"msym32", no_argument, NULL, OPTION_MSYM32},
11657   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
11658   {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
11659   {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
11660   {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
11661   {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
11662
11663   /* Strictly speaking this next option is ELF specific,
11664      but we allow it for other ports as well in order to
11665      make testing easier.  */
11666   {"32",          no_argument, NULL, OPTION_32},
11667   
11668   /* ELF-specific options.  */
11669 #ifdef OBJ_ELF
11670   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
11671   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
11672   {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
11673   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
11674   {"xgot",        no_argument, NULL, OPTION_XGOT},
11675   {"mabi", required_argument, NULL, OPTION_MABI},
11676   {"n32",         no_argument, NULL, OPTION_N32},
11677   {"64",          no_argument, NULL, OPTION_64},
11678   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
11679   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
11680   {"mpdr", no_argument, NULL, OPTION_PDR},
11681   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
11682   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
11683 #endif /* OBJ_ELF */
11684
11685   {NULL, no_argument, NULL, 0}
11686 };
11687 size_t md_longopts_size = sizeof (md_longopts);
11688
11689 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11690    NEW_VALUE.  Warn if another value was already specified.  Note:
11691    we have to defer parsing the -march and -mtune arguments in order
11692    to handle 'from-abi' correctly, since the ABI might be specified
11693    in a later argument.  */
11694
11695 static void
11696 mips_set_option_string (const char **string_ptr, const char *new_value)
11697 {
11698   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11699     as_warn (_("A different %s was already specified, is now %s"),
11700              string_ptr == &mips_arch_string ? "-march" : "-mtune",
11701              new_value);
11702
11703   *string_ptr = new_value;
11704 }
11705
11706 int
11707 md_parse_option (int c, char *arg)
11708 {
11709   switch (c)
11710     {
11711     case OPTION_CONSTRUCT_FLOATS:
11712       mips_disable_float_construction = 0;
11713       break;
11714
11715     case OPTION_NO_CONSTRUCT_FLOATS:
11716       mips_disable_float_construction = 1;
11717       break;
11718
11719     case OPTION_TRAP:
11720       mips_trap = 1;
11721       break;
11722
11723     case OPTION_BREAK:
11724       mips_trap = 0;
11725       break;
11726
11727     case OPTION_EB:
11728       target_big_endian = 1;
11729       break;
11730
11731     case OPTION_EL:
11732       target_big_endian = 0;
11733       break;
11734
11735     case 'O':
11736       if (arg == NULL)
11737         mips_optimize = 1;
11738       else if (arg[0] == '0')
11739         mips_optimize = 0;
11740       else if (arg[0] == '1')
11741         mips_optimize = 1;
11742       else
11743         mips_optimize = 2;
11744       break;
11745
11746     case 'g':
11747       if (arg == NULL)
11748         mips_debug = 2;
11749       else
11750         mips_debug = atoi (arg);
11751       break;
11752
11753     case OPTION_MIPS1:
11754       file_mips_isa = ISA_MIPS1;
11755       break;
11756
11757     case OPTION_MIPS2:
11758       file_mips_isa = ISA_MIPS2;
11759       break;
11760
11761     case OPTION_MIPS3:
11762       file_mips_isa = ISA_MIPS3;
11763       break;
11764
11765     case OPTION_MIPS4:
11766       file_mips_isa = ISA_MIPS4;
11767       break;
11768
11769     case OPTION_MIPS5:
11770       file_mips_isa = ISA_MIPS5;
11771       break;
11772
11773     case OPTION_MIPS32:
11774       file_mips_isa = ISA_MIPS32;
11775       break;
11776
11777     case OPTION_MIPS32R2:
11778       file_mips_isa = ISA_MIPS32R2;
11779       break;
11780
11781     case OPTION_MIPS64R2:
11782       file_mips_isa = ISA_MIPS64R2;
11783       break;
11784
11785     case OPTION_MIPS64:
11786       file_mips_isa = ISA_MIPS64;
11787       break;
11788
11789     case OPTION_MTUNE:
11790       mips_set_option_string (&mips_tune_string, arg);
11791       break;
11792
11793     case OPTION_MARCH:
11794       mips_set_option_string (&mips_arch_string, arg);
11795       break;
11796
11797     case OPTION_M4650:
11798       mips_set_option_string (&mips_arch_string, "4650");
11799       mips_set_option_string (&mips_tune_string, "4650");
11800       break;
11801
11802     case OPTION_NO_M4650:
11803       break;
11804
11805     case OPTION_M4010:
11806       mips_set_option_string (&mips_arch_string, "4010");
11807       mips_set_option_string (&mips_tune_string, "4010");
11808       break;
11809
11810     case OPTION_NO_M4010:
11811       break;
11812
11813     case OPTION_M4100:
11814       mips_set_option_string (&mips_arch_string, "4100");
11815       mips_set_option_string (&mips_tune_string, "4100");
11816       break;
11817
11818     case OPTION_NO_M4100:
11819       break;
11820
11821     case OPTION_M3900:
11822       mips_set_option_string (&mips_arch_string, "3900");
11823       mips_set_option_string (&mips_tune_string, "3900");
11824       break;
11825
11826     case OPTION_NO_M3900:
11827       break;
11828
11829     case OPTION_MDMX:
11830       mips_opts.ase_mdmx = 1;
11831       break;
11832
11833     case OPTION_NO_MDMX:
11834       mips_opts.ase_mdmx = 0;
11835       break;
11836
11837     case OPTION_DSP:
11838       mips_opts.ase_dsp = 1;
11839       mips_opts.ase_dspr2 = 0;
11840       break;
11841
11842     case OPTION_NO_DSP:
11843       mips_opts.ase_dsp = 0;
11844       mips_opts.ase_dspr2 = 0;
11845       break;
11846
11847     case OPTION_DSPR2:
11848       mips_opts.ase_dspr2 = 1;
11849       mips_opts.ase_dsp = 1;
11850       break;
11851
11852     case OPTION_NO_DSPR2:
11853       mips_opts.ase_dspr2 = 0;
11854       mips_opts.ase_dsp = 0;
11855       break;
11856
11857     case OPTION_MT:
11858       mips_opts.ase_mt = 1;
11859       break;
11860
11861     case OPTION_NO_MT:
11862       mips_opts.ase_mt = 0;
11863       break;
11864
11865     case OPTION_MIPS16:
11866       mips_opts.mips16 = 1;
11867       mips_no_prev_insn ();
11868       break;
11869
11870     case OPTION_NO_MIPS16:
11871       mips_opts.mips16 = 0;
11872       mips_no_prev_insn ();
11873       break;
11874
11875     case OPTION_MIPS3D:
11876       mips_opts.ase_mips3d = 1;
11877       break;
11878
11879     case OPTION_NO_MIPS3D:
11880       mips_opts.ase_mips3d = 0;
11881       break;
11882
11883     case OPTION_SMARTMIPS:
11884       mips_opts.ase_smartmips = 1;
11885       break;
11886
11887     case OPTION_NO_SMARTMIPS:
11888       mips_opts.ase_smartmips = 0;
11889       break;
11890
11891     case OPTION_FIX_24K:
11892       mips_fix_24k = 1;
11893       break;
11894
11895     case OPTION_NO_FIX_24K:
11896       mips_fix_24k = 0;
11897       break;
11898
11899     case OPTION_FIX_LOONGSON2F_JUMP:
11900       mips_fix_loongson2f_jump = TRUE;
11901       break;
11902
11903     case OPTION_NO_FIX_LOONGSON2F_JUMP:
11904       mips_fix_loongson2f_jump = FALSE;
11905       break;
11906
11907     case OPTION_FIX_LOONGSON2F_NOP:
11908       mips_fix_loongson2f_nop = TRUE;
11909       break;
11910
11911     case OPTION_NO_FIX_LOONGSON2F_NOP:
11912       mips_fix_loongson2f_nop = FALSE;
11913       break;
11914
11915     case OPTION_FIX_VR4120:
11916       mips_fix_vr4120 = 1;
11917       break;
11918
11919     case OPTION_NO_FIX_VR4120:
11920       mips_fix_vr4120 = 0;
11921       break;
11922
11923     case OPTION_FIX_VR4130:
11924       mips_fix_vr4130 = 1;
11925       break;
11926
11927     case OPTION_NO_FIX_VR4130:
11928       mips_fix_vr4130 = 0;
11929       break;
11930
11931     case OPTION_FIX_CN63XXP1:
11932       mips_fix_cn63xxp1 = TRUE;
11933       break;
11934
11935     case OPTION_NO_FIX_CN63XXP1:
11936       mips_fix_cn63xxp1 = FALSE;
11937       break;
11938
11939     case OPTION_RELAX_BRANCH:
11940       mips_relax_branch = 1;
11941       break;
11942
11943     case OPTION_NO_RELAX_BRANCH:
11944       mips_relax_branch = 0;
11945       break;
11946
11947     case OPTION_MSHARED:
11948       mips_in_shared = TRUE;
11949       break;
11950
11951     case OPTION_MNO_SHARED:
11952       mips_in_shared = FALSE;
11953       break;
11954
11955     case OPTION_MSYM32:
11956       mips_opts.sym32 = TRUE;
11957       break;
11958
11959     case OPTION_MNO_SYM32:
11960       mips_opts.sym32 = FALSE;
11961       break;
11962
11963 #ifdef OBJ_ELF
11964       /* When generating ELF code, we permit -KPIC and -call_shared to
11965          select SVR4_PIC, and -non_shared to select no PIC.  This is
11966          intended to be compatible with Irix 5.  */
11967     case OPTION_CALL_SHARED:
11968       if (!IS_ELF)
11969         {
11970           as_bad (_("-call_shared is supported only for ELF format"));
11971           return 0;
11972         }
11973       mips_pic = SVR4_PIC;
11974       mips_abicalls = TRUE;
11975       break;
11976
11977     case OPTION_CALL_NONPIC:
11978       if (!IS_ELF)
11979         {
11980           as_bad (_("-call_nonpic is supported only for ELF format"));
11981           return 0;
11982         }
11983       mips_pic = NO_PIC;
11984       mips_abicalls = TRUE;
11985       break;
11986
11987     case OPTION_NON_SHARED:
11988       if (!IS_ELF)
11989         {
11990           as_bad (_("-non_shared is supported only for ELF format"));
11991           return 0;
11992         }
11993       mips_pic = NO_PIC;
11994       mips_abicalls = FALSE;
11995       break;
11996
11997       /* The -xgot option tells the assembler to use 32 bit offsets
11998          when accessing the got in SVR4_PIC mode.  It is for Irix
11999          compatibility.  */
12000     case OPTION_XGOT:
12001       mips_big_got = 1;
12002       break;
12003 #endif /* OBJ_ELF */
12004
12005     case 'G':
12006       g_switch_value = atoi (arg);
12007       g_switch_seen = 1;
12008       break;
12009
12010       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
12011          and -mabi=64.  */
12012     case OPTION_32:
12013       if (IS_ELF)
12014         mips_abi = O32_ABI;
12015       /* We silently ignore -32 for non-ELF targets.  This greatly
12016          simplifies the construction of the MIPS GAS test cases.  */
12017       break;
12018
12019 #ifdef OBJ_ELF
12020     case OPTION_N32:
12021       if (!IS_ELF)
12022         {
12023           as_bad (_("-n32 is supported for ELF format only"));
12024           return 0;
12025         }
12026       mips_abi = N32_ABI;
12027       break;
12028
12029     case OPTION_64:
12030       if (!IS_ELF)
12031         {
12032           as_bad (_("-64 is supported for ELF format only"));
12033           return 0;
12034         }
12035       mips_abi = N64_ABI;
12036       if (!support_64bit_objects())
12037         as_fatal (_("No compiled in support for 64 bit object file format"));
12038       break;
12039 #endif /* OBJ_ELF */
12040
12041     case OPTION_GP32:
12042       file_mips_gp32 = 1;
12043       break;
12044
12045     case OPTION_GP64:
12046       file_mips_gp32 = 0;
12047       break;
12048
12049     case OPTION_FP32:
12050       file_mips_fp32 = 1;
12051       break;
12052
12053     case OPTION_FP64:
12054       file_mips_fp32 = 0;
12055       break;
12056
12057     case OPTION_SINGLE_FLOAT:
12058       file_mips_single_float = 1;
12059       break;
12060
12061     case OPTION_DOUBLE_FLOAT:
12062       file_mips_single_float = 0;
12063       break;
12064
12065     case OPTION_SOFT_FLOAT:
12066       file_mips_soft_float = 1;
12067       break;
12068
12069     case OPTION_HARD_FLOAT:
12070       file_mips_soft_float = 0;
12071       break;
12072
12073 #ifdef OBJ_ELF
12074     case OPTION_MABI:
12075       if (!IS_ELF)
12076         {
12077           as_bad (_("-mabi is supported for ELF format only"));
12078           return 0;
12079         }
12080       if (strcmp (arg, "32") == 0)
12081         mips_abi = O32_ABI;
12082       else if (strcmp (arg, "o64") == 0)
12083         mips_abi = O64_ABI;
12084       else if (strcmp (arg, "n32") == 0)
12085         mips_abi = N32_ABI;
12086       else if (strcmp (arg, "64") == 0)
12087         {
12088           mips_abi = N64_ABI;
12089           if (! support_64bit_objects())
12090             as_fatal (_("No compiled in support for 64 bit object file "
12091                         "format"));
12092         }
12093       else if (strcmp (arg, "eabi") == 0)
12094         mips_abi = EABI_ABI;
12095       else
12096         {
12097           as_fatal (_("invalid abi -mabi=%s"), arg);
12098           return 0;
12099         }
12100       break;
12101 #endif /* OBJ_ELF */
12102
12103     case OPTION_M7000_HILO_FIX:
12104       mips_7000_hilo_fix = TRUE;
12105       break;
12106
12107     case OPTION_MNO_7000_HILO_FIX:
12108       mips_7000_hilo_fix = FALSE;
12109       break;
12110
12111 #ifdef OBJ_ELF
12112     case OPTION_MDEBUG:
12113       mips_flag_mdebug = TRUE;
12114       break;
12115
12116     case OPTION_NO_MDEBUG:
12117       mips_flag_mdebug = FALSE;
12118       break;
12119
12120     case OPTION_PDR:
12121       mips_flag_pdr = TRUE;
12122       break;
12123
12124     case OPTION_NO_PDR:
12125       mips_flag_pdr = FALSE;
12126       break;
12127
12128     case OPTION_MVXWORKS_PIC:
12129       mips_pic = VXWORKS_PIC;
12130       break;
12131 #endif /* OBJ_ELF */
12132
12133     default:
12134       return 0;
12135     }
12136
12137     mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
12138
12139   return 1;
12140 }
12141 \f
12142 /* Set up globals to generate code for the ISA or processor
12143    described by INFO.  */
12144
12145 static void
12146 mips_set_architecture (const struct mips_cpu_info *info)
12147 {
12148   if (info != 0)
12149     {
12150       file_mips_arch = info->cpu;
12151       mips_opts.arch = info->cpu;
12152       mips_opts.isa = info->isa;
12153     }
12154 }
12155
12156
12157 /* Likewise for tuning.  */
12158
12159 static void
12160 mips_set_tune (const struct mips_cpu_info *info)
12161 {
12162   if (info != 0)
12163     mips_tune = info->cpu;
12164 }
12165
12166
12167 void
12168 mips_after_parse_args (void)
12169 {
12170   const struct mips_cpu_info *arch_info = 0;
12171   const struct mips_cpu_info *tune_info = 0;
12172
12173   /* GP relative stuff not working for PE */
12174   if (strncmp (TARGET_OS, "pe", 2) == 0)
12175     {
12176       if (g_switch_seen && g_switch_value != 0)
12177         as_bad (_("-G not supported in this configuration."));
12178       g_switch_value = 0;
12179     }
12180
12181   if (mips_abi == NO_ABI)
12182     mips_abi = MIPS_DEFAULT_ABI;
12183
12184   /* The following code determines the architecture and register size.
12185      Similar code was added to GCC 3.3 (see override_options() in
12186      config/mips/mips.c).  The GAS and GCC code should be kept in sync
12187      as much as possible.  */
12188
12189   if (mips_arch_string != 0)
12190     arch_info = mips_parse_cpu ("-march", mips_arch_string);
12191
12192   if (file_mips_isa != ISA_UNKNOWN)
12193     {
12194       /* Handle -mipsN.  At this point, file_mips_isa contains the
12195          ISA level specified by -mipsN, while arch_info->isa contains
12196          the -march selection (if any).  */
12197       if (arch_info != 0)
12198         {
12199           /* -march takes precedence over -mipsN, since it is more descriptive.
12200              There's no harm in specifying both as long as the ISA levels
12201              are the same.  */
12202           if (file_mips_isa != arch_info->isa)
12203             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
12204                     mips_cpu_info_from_isa (file_mips_isa)->name,
12205                     mips_cpu_info_from_isa (arch_info->isa)->name);
12206         }
12207       else
12208         arch_info = mips_cpu_info_from_isa (file_mips_isa);
12209     }
12210
12211   if (arch_info == 0)
12212     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
12213
12214   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
12215     as_bad (_("-march=%s is not compatible with the selected ABI"),
12216             arch_info->name);
12217
12218   mips_set_architecture (arch_info);
12219
12220   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
12221   if (mips_tune_string != 0)
12222     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
12223
12224   if (tune_info == 0)
12225     mips_set_tune (arch_info);
12226   else
12227     mips_set_tune (tune_info);
12228
12229   if (file_mips_gp32 >= 0)
12230     {
12231       /* The user specified the size of the integer registers.  Make sure
12232          it agrees with the ABI and ISA.  */
12233       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
12234         as_bad (_("-mgp64 used with a 32-bit processor"));
12235       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
12236         as_bad (_("-mgp32 used with a 64-bit ABI"));
12237       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
12238         as_bad (_("-mgp64 used with a 32-bit ABI"));
12239     }
12240   else
12241     {
12242       /* Infer the integer register size from the ABI and processor.
12243          Restrict ourselves to 32-bit registers if that's all the
12244          processor has, or if the ABI cannot handle 64-bit registers.  */
12245       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
12246                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
12247     }
12248
12249   switch (file_mips_fp32)
12250     {
12251     default:
12252     case -1:
12253       /* No user specified float register size.
12254          ??? GAS treats single-float processors as though they had 64-bit
12255          float registers (although it complains when double-precision
12256          instructions are used).  As things stand, saying they have 32-bit
12257          registers would lead to spurious "register must be even" messages.
12258          So here we assume float registers are never smaller than the
12259          integer ones.  */
12260       if (file_mips_gp32 == 0)
12261         /* 64-bit integer registers implies 64-bit float registers.  */
12262         file_mips_fp32 = 0;
12263       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
12264                && ISA_HAS_64BIT_FPRS (mips_opts.isa))
12265         /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
12266         file_mips_fp32 = 0;
12267       else
12268         /* 32-bit float registers.  */
12269         file_mips_fp32 = 1;
12270       break;
12271
12272     /* The user specified the size of the float registers.  Check if it
12273        agrees with the ABI and ISA.  */
12274     case 0:
12275       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12276         as_bad (_("-mfp64 used with a 32-bit fpu"));
12277       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
12278                && !ISA_HAS_MXHC1 (mips_opts.isa))
12279         as_warn (_("-mfp64 used with a 32-bit ABI"));
12280       break;
12281     case 1:
12282       if (ABI_NEEDS_64BIT_REGS (mips_abi))
12283         as_warn (_("-mfp32 used with a 64-bit ABI"));
12284       break;
12285     }
12286
12287   /* End of GCC-shared inference code.  */
12288
12289   /* This flag is set when we have a 64-bit capable CPU but use only
12290      32-bit wide registers.  Note that EABI does not use it.  */
12291   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
12292       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
12293           || mips_abi == O32_ABI))
12294     mips_32bitmode = 1;
12295
12296   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
12297     as_bad (_("trap exception not supported at ISA 1"));
12298
12299   /* If the selected architecture includes support for ASEs, enable
12300      generation of code for them.  */
12301   if (mips_opts.mips16 == -1)
12302     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
12303   if (mips_opts.ase_mips3d == -1)
12304     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
12305                             && file_mips_fp32 == 0) ? 1 : 0;
12306   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
12307     as_bad (_("-mfp32 used with -mips3d"));
12308
12309   if (mips_opts.ase_mdmx == -1)
12310     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
12311                           && file_mips_fp32 == 0) ? 1 : 0;
12312   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
12313     as_bad (_("-mfp32 used with -mdmx"));
12314
12315   if (mips_opts.ase_smartmips == -1)
12316     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
12317   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
12318     as_warn (_("%s ISA does not support SmartMIPS"), 
12319              mips_cpu_info_from_isa (mips_opts.isa)->name);
12320
12321   if (mips_opts.ase_dsp == -1)
12322     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12323   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
12324     as_warn (_("%s ISA does not support DSP ASE"), 
12325              mips_cpu_info_from_isa (mips_opts.isa)->name);
12326
12327   if (mips_opts.ase_dspr2 == -1)
12328     {
12329       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
12330       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12331     }
12332   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
12333     as_warn (_("%s ISA does not support DSP R2 ASE"),
12334              mips_cpu_info_from_isa (mips_opts.isa)->name);
12335
12336   if (mips_opts.ase_mt == -1)
12337     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
12338   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
12339     as_warn (_("%s ISA does not support MT ASE"),
12340              mips_cpu_info_from_isa (mips_opts.isa)->name);
12341
12342   file_mips_isa = mips_opts.isa;
12343   file_ase_mips3d = mips_opts.ase_mips3d;
12344   file_ase_mdmx = mips_opts.ase_mdmx;
12345   file_ase_smartmips = mips_opts.ase_smartmips;
12346   file_ase_dsp = mips_opts.ase_dsp;
12347   file_ase_dspr2 = mips_opts.ase_dspr2;
12348   file_ase_mt = mips_opts.ase_mt;
12349   mips_opts.gp32 = file_mips_gp32;
12350   mips_opts.fp32 = file_mips_fp32;
12351   mips_opts.soft_float = file_mips_soft_float;
12352   mips_opts.single_float = file_mips_single_float;
12353
12354   if (mips_flag_mdebug < 0)
12355     {
12356 #ifdef OBJ_MAYBE_ECOFF
12357       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
12358         mips_flag_mdebug = 1;
12359       else
12360 #endif /* OBJ_MAYBE_ECOFF */
12361         mips_flag_mdebug = 0;
12362     }
12363 }
12364 \f
12365 void
12366 mips_init_after_args (void)
12367 {
12368   /* initialize opcodes */
12369   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
12370   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
12371 }
12372
12373 long
12374 md_pcrel_from (fixS *fixP)
12375 {
12376   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
12377   switch (fixP->fx_r_type)
12378     {
12379     case BFD_RELOC_16_PCREL_S2:
12380     case BFD_RELOC_MIPS_JMP:
12381       /* Return the address of the delay slot.  */
12382       return addr + 4;
12383     default:
12384       /* We have no relocation type for PC relative MIPS16 instructions.  */
12385       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
12386         as_bad_where (fixP->fx_file, fixP->fx_line,
12387                       _("PC relative MIPS16 instruction references a different section"));
12388       return addr;
12389     }
12390 }
12391
12392 /* This is called before the symbol table is processed.  In order to
12393    work with gcc when using mips-tfile, we must keep all local labels.
12394    However, in other cases, we want to discard them.  If we were
12395    called with -g, but we didn't see any debugging information, it may
12396    mean that gcc is smuggling debugging information through to
12397    mips-tfile, in which case we must generate all local labels.  */
12398
12399 void
12400 mips_frob_file_before_adjust (void)
12401 {
12402 #ifndef NO_ECOFF_DEBUGGING
12403   if (ECOFF_DEBUGGING
12404       && mips_debug != 0
12405       && ! ecoff_debugging_seen)
12406     flag_keep_locals = 1;
12407 #endif
12408 }
12409
12410 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
12411    the corresponding LO16 reloc.  This is called before md_apply_fix and
12412    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
12413    relocation operators.
12414
12415    For our purposes, a %lo() expression matches a %got() or %hi()
12416    expression if:
12417
12418       (a) it refers to the same symbol; and
12419       (b) the offset applied in the %lo() expression is no lower than
12420           the offset applied in the %got() or %hi().
12421
12422    (b) allows us to cope with code like:
12423
12424         lui     $4,%hi(foo)
12425         lh      $4,%lo(foo+2)($4)
12426
12427    ...which is legal on RELA targets, and has a well-defined behaviour
12428    if the user knows that adding 2 to "foo" will not induce a carry to
12429    the high 16 bits.
12430
12431    When several %lo()s match a particular %got() or %hi(), we use the
12432    following rules to distinguish them:
12433
12434      (1) %lo()s with smaller offsets are a better match than %lo()s with
12435          higher offsets.
12436
12437      (2) %lo()s with no matching %got() or %hi() are better than those
12438          that already have a matching %got() or %hi().
12439
12440      (3) later %lo()s are better than earlier %lo()s.
12441
12442    These rules are applied in order.
12443
12444    (1) means, among other things, that %lo()s with identical offsets are
12445    chosen if they exist.
12446
12447    (2) means that we won't associate several high-part relocations with
12448    the same low-part relocation unless there's no alternative.  Having
12449    several high parts for the same low part is a GNU extension; this rule
12450    allows careful users to avoid it.
12451
12452    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
12453    with the last high-part relocation being at the front of the list.
12454    It therefore makes sense to choose the last matching low-part
12455    relocation, all other things being equal.  It's also easier
12456    to code that way.  */
12457
12458 void
12459 mips_frob_file (void)
12460 {
12461   struct mips_hi_fixup *l;
12462   bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
12463
12464   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12465     {
12466       segment_info_type *seginfo;
12467       bfd_boolean matched_lo_p;
12468       fixS **hi_pos, **lo_pos, **pos;
12469
12470       gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
12471
12472       /* If a GOT16 relocation turns out to be against a global symbol,
12473          there isn't supposed to be a matching LO.  */
12474       if (got16_reloc_p (l->fixp->fx_r_type)
12475           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12476         continue;
12477
12478       /* Check quickly whether the next fixup happens to be a matching %lo.  */
12479       if (fixup_has_matching_lo_p (l->fixp))
12480         continue;
12481
12482       seginfo = seg_info (l->seg);
12483
12484       /* Set HI_POS to the position of this relocation in the chain.
12485          Set LO_POS to the position of the chosen low-part relocation.
12486          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12487          relocation that matches an immediately-preceding high-part
12488          relocation.  */
12489       hi_pos = NULL;
12490       lo_pos = NULL;
12491       matched_lo_p = FALSE;
12492       looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
12493
12494       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12495         {
12496           if (*pos == l->fixp)
12497             hi_pos = pos;
12498
12499           if ((*pos)->fx_r_type == looking_for_rtype
12500               && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
12501               && (*pos)->fx_offset >= l->fixp->fx_offset
12502               && (lo_pos == NULL
12503                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
12504                   || (!matched_lo_p
12505                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12506             lo_pos = pos;
12507
12508           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12509                           && fixup_has_matching_lo_p (*pos));
12510         }
12511
12512       /* If we found a match, remove the high-part relocation from its
12513          current position and insert it before the low-part relocation.
12514          Make the offsets match so that fixup_has_matching_lo_p()
12515          will return true.
12516
12517          We don't warn about unmatched high-part relocations since some
12518          versions of gcc have been known to emit dead "lui ...%hi(...)"
12519          instructions.  */
12520       if (lo_pos != NULL)
12521         {
12522           l->fixp->fx_offset = (*lo_pos)->fx_offset;
12523           if (l->fixp->fx_next != *lo_pos)
12524             {
12525               *hi_pos = l->fixp->fx_next;
12526               l->fixp->fx_next = *lo_pos;
12527               *lo_pos = l->fixp;
12528             }
12529         }
12530     }
12531 }
12532
12533 /* We may have combined relocations without symbols in the N32/N64 ABI.
12534    We have to prevent gas from dropping them.  */
12535
12536 int
12537 mips_force_relocation (fixS *fixp)
12538 {
12539   if (generic_force_reloc (fixp))
12540     return 1;
12541
12542   if (HAVE_NEWABI
12543       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12544       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
12545           || hi16_reloc_p (fixp->fx_r_type)
12546           || lo16_reloc_p (fixp->fx_r_type)))
12547     return 1;
12548
12549   return 0;
12550 }
12551
12552 /* Apply a fixup to the object file.  */
12553
12554 void
12555 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
12556 {
12557   bfd_byte *buf;
12558   long insn;
12559   reloc_howto_type *howto;
12560
12561   /* We ignore generic BFD relocations we don't know about.  */
12562   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12563   if (! howto)
12564     return;
12565
12566   gas_assert (fixP->fx_size == 4
12567               || fixP->fx_r_type == BFD_RELOC_16
12568               || fixP->fx_r_type == BFD_RELOC_64
12569               || fixP->fx_r_type == BFD_RELOC_CTOR
12570               || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12571               || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12572               || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12573               || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
12574
12575   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
12576
12577   gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
12578
12579   /* Don't treat parts of a composite relocation as done.  There are two
12580      reasons for this:
12581
12582      (1) The second and third parts will be against 0 (RSS_UNDEF) but
12583          should nevertheless be emitted if the first part is.
12584
12585      (2) In normal usage, composite relocations are never assembly-time
12586          constants.  The easiest way of dealing with the pathological
12587          exceptions is to generate a relocation against STN_UNDEF and
12588          leave everything up to the linker.  */
12589   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
12590     fixP->fx_done = 1;
12591
12592   switch (fixP->fx_r_type)
12593     {
12594     case BFD_RELOC_MIPS_TLS_GD:
12595     case BFD_RELOC_MIPS_TLS_LDM:
12596     case BFD_RELOC_MIPS_TLS_DTPREL32:
12597     case BFD_RELOC_MIPS_TLS_DTPREL64:
12598     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12599     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12600     case BFD_RELOC_MIPS_TLS_GOTTPREL:
12601     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12602     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12603       S_SET_THREAD_LOCAL (fixP->fx_addsy);
12604       /* fall through */
12605
12606     case BFD_RELOC_MIPS_JMP:
12607     case BFD_RELOC_MIPS_SHIFT5:
12608     case BFD_RELOC_MIPS_SHIFT6:
12609     case BFD_RELOC_MIPS_GOT_DISP:
12610     case BFD_RELOC_MIPS_GOT_PAGE:
12611     case BFD_RELOC_MIPS_GOT_OFST:
12612     case BFD_RELOC_MIPS_SUB:
12613     case BFD_RELOC_MIPS_INSERT_A:
12614     case BFD_RELOC_MIPS_INSERT_B:
12615     case BFD_RELOC_MIPS_DELETE:
12616     case BFD_RELOC_MIPS_HIGHEST:
12617     case BFD_RELOC_MIPS_HIGHER:
12618     case BFD_RELOC_MIPS_SCN_DISP:
12619     case BFD_RELOC_MIPS_REL16:
12620     case BFD_RELOC_MIPS_RELGOT:
12621     case BFD_RELOC_MIPS_JALR:
12622     case BFD_RELOC_HI16:
12623     case BFD_RELOC_HI16_S:
12624     case BFD_RELOC_GPREL16:
12625     case BFD_RELOC_MIPS_LITERAL:
12626     case BFD_RELOC_MIPS_CALL16:
12627     case BFD_RELOC_MIPS_GOT16:
12628     case BFD_RELOC_GPREL32:
12629     case BFD_RELOC_MIPS_GOT_HI16:
12630     case BFD_RELOC_MIPS_GOT_LO16:
12631     case BFD_RELOC_MIPS_CALL_HI16:
12632     case BFD_RELOC_MIPS_CALL_LO16:
12633     case BFD_RELOC_MIPS16_GPREL:
12634     case BFD_RELOC_MIPS16_GOT16:
12635     case BFD_RELOC_MIPS16_CALL16:
12636     case BFD_RELOC_MIPS16_HI16:
12637     case BFD_RELOC_MIPS16_HI16_S:
12638     case BFD_RELOC_MIPS16_JMP:
12639       /* Nothing needed to do.  The value comes from the reloc entry.  */
12640       break;
12641
12642     case BFD_RELOC_64:
12643       /* This is handled like BFD_RELOC_32, but we output a sign
12644          extended value if we are only 32 bits.  */
12645       if (fixP->fx_done)
12646         {
12647           if (8 <= sizeof (valueT))
12648             md_number_to_chars ((char *) buf, *valP, 8);
12649           else
12650             {
12651               valueT hiv;
12652
12653               if ((*valP & 0x80000000) != 0)
12654                 hiv = 0xffffffff;
12655               else
12656                 hiv = 0;
12657               md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
12658                                   *valP, 4);
12659               md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
12660                                   hiv, 4);
12661             }
12662         }
12663       break;
12664
12665     case BFD_RELOC_RVA:
12666     case BFD_RELOC_32:
12667     case BFD_RELOC_16:
12668       /* If we are deleting this reloc entry, we must fill in the
12669          value now.  This can happen if we have a .word which is not
12670          resolved when it appears but is later defined.  */
12671       if (fixP->fx_done)
12672         md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
12673       break;
12674
12675     case BFD_RELOC_LO16:
12676     case BFD_RELOC_MIPS16_LO16:
12677       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12678          may be safe to remove, but if so it's not obvious.  */
12679       /* When handling an embedded PIC switch statement, we can wind
12680          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
12681       if (fixP->fx_done)
12682         {
12683           if (*valP + 0x8000 > 0xffff)
12684             as_bad_where (fixP->fx_file, fixP->fx_line,
12685                           _("relocation overflow"));
12686           if (target_big_endian)
12687             buf += 2;
12688           md_number_to_chars ((char *) buf, *valP, 2);
12689         }
12690       break;
12691
12692     case BFD_RELOC_16_PCREL_S2:
12693       if ((*valP & 0x3) != 0)
12694         as_bad_where (fixP->fx_file, fixP->fx_line,
12695                       _("Branch to misaligned address (%lx)"), (long) *valP);
12696
12697       /* We need to save the bits in the instruction since fixup_segment()
12698          might be deleting the relocation entry (i.e., a branch within
12699          the current segment).  */
12700       if (! fixP->fx_done)
12701         break;
12702
12703       /* Update old instruction data.  */
12704       if (target_big_endian)
12705         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12706       else
12707         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12708
12709       if (*valP + 0x20000 <= 0x3ffff)
12710         {
12711           insn |= (*valP >> 2) & 0xffff;
12712           md_number_to_chars ((char *) buf, insn, 4);
12713         }
12714       else if (mips_pic == NO_PIC
12715                && fixP->fx_done
12716                && fixP->fx_frag->fr_address >= text_section->vma
12717                && (fixP->fx_frag->fr_address
12718                    < text_section->vma + bfd_get_section_size (text_section))
12719                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
12720                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
12721                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
12722         {
12723           /* The branch offset is too large.  If this is an
12724              unconditional branch, and we are not generating PIC code,
12725              we can convert it to an absolute jump instruction.  */
12726           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
12727             insn = 0x0c000000;  /* jal */
12728           else
12729             insn = 0x08000000;  /* j */
12730           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12731           fixP->fx_done = 0;
12732           fixP->fx_addsy = section_symbol (text_section);
12733           *valP += md_pcrel_from (fixP);
12734           md_number_to_chars ((char *) buf, insn, 4);
12735         }
12736       else
12737         {
12738           /* If we got here, we have branch-relaxation disabled,
12739              and there's nothing we can do to fix this instruction
12740              without turning it into a longer sequence.  */
12741           as_bad_where (fixP->fx_file, fixP->fx_line,
12742                         _("Branch out of range"));
12743         }
12744       break;
12745
12746     case BFD_RELOC_VTABLE_INHERIT:
12747       fixP->fx_done = 0;
12748       if (fixP->fx_addsy
12749           && !S_IS_DEFINED (fixP->fx_addsy)
12750           && !S_IS_WEAK (fixP->fx_addsy))
12751         S_SET_WEAK (fixP->fx_addsy);
12752       break;
12753
12754     case BFD_RELOC_VTABLE_ENTRY:
12755       fixP->fx_done = 0;
12756       break;
12757
12758     default:
12759       internalError ();
12760     }
12761
12762   /* Remember value for tc_gen_reloc.  */
12763   fixP->fx_addnumber = *valP;
12764 }
12765
12766 static symbolS *
12767 get_symbol (void)
12768 {
12769   int c;
12770   char *name;
12771   symbolS *p;
12772
12773   name = input_line_pointer;
12774   c = get_symbol_end ();
12775   p = (symbolS *) symbol_find_or_make (name);
12776   *input_line_pointer = c;
12777   return p;
12778 }
12779
12780 /* Align the current frag to a given power of two.  If a particular
12781    fill byte should be used, FILL points to an integer that contains
12782    that byte, otherwise FILL is null.
12783
12784    The MIPS assembler also automatically adjusts any preceding
12785    label.  */
12786
12787 static void
12788 mips_align (int to, int *fill, symbolS *label)
12789 {
12790   mips_emit_delays ();
12791   mips_record_mips16_mode ();
12792   if (fill == NULL && subseg_text_p (now_seg))
12793     frag_align_code (to, 0);
12794   else
12795     frag_align (to, fill ? *fill : 0, 0);
12796   record_alignment (now_seg, to);
12797   if (label != NULL)
12798     {
12799       gas_assert (S_GET_SEGMENT (label) == now_seg);
12800       symbol_set_frag (label, frag_now);
12801       S_SET_VALUE (label, (valueT) frag_now_fix ());
12802     }
12803 }
12804
12805 /* Align to a given power of two.  .align 0 turns off the automatic
12806    alignment used by the data creating pseudo-ops.  */
12807
12808 static void
12809 s_align (int x ATTRIBUTE_UNUSED)
12810 {
12811   int temp, fill_value, *fill_ptr;
12812   long max_alignment = 28;
12813
12814   /* o Note that the assembler pulls down any immediately preceding label
12815        to the aligned address.
12816      o It's not documented but auto alignment is reinstated by
12817        a .align pseudo instruction.
12818      o Note also that after auto alignment is turned off the mips assembler
12819        issues an error on attempt to assemble an improperly aligned data item.
12820        We don't.  */
12821
12822   temp = get_absolute_expression ();
12823   if (temp > max_alignment)
12824     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12825   else if (temp < 0)
12826     {
12827       as_warn (_("Alignment negative: 0 assumed."));
12828       temp = 0;
12829     }
12830   if (*input_line_pointer == ',')
12831     {
12832       ++input_line_pointer;
12833       fill_value = get_absolute_expression ();
12834       fill_ptr = &fill_value;
12835     }
12836   else
12837     fill_ptr = 0;
12838   if (temp)
12839     {
12840       segment_info_type *si = seg_info (now_seg);
12841       struct insn_label_list *l = si->label_list;
12842       /* Auto alignment should be switched on by next section change.  */
12843       auto_align = 1;
12844       mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
12845     }
12846   else
12847     {
12848       auto_align = 0;
12849     }
12850
12851   demand_empty_rest_of_line ();
12852 }
12853
12854 static void
12855 s_change_sec (int sec)
12856 {
12857   segT seg;
12858
12859 #ifdef OBJ_ELF
12860   /* The ELF backend needs to know that we are changing sections, so
12861      that .previous works correctly.  We could do something like check
12862      for an obj_section_change_hook macro, but that might be confusing
12863      as it would not be appropriate to use it in the section changing
12864      functions in read.c, since obj-elf.c intercepts those.  FIXME:
12865      This should be cleaner, somehow.  */
12866   if (IS_ELF)
12867     obj_elf_section_change_hook ();
12868 #endif
12869
12870   mips_emit_delays ();
12871
12872   switch (sec)
12873     {
12874     case 't':
12875       s_text (0);
12876       break;
12877     case 'd':
12878       s_data (0);
12879       break;
12880     case 'b':
12881       subseg_set (bss_section, (subsegT) get_absolute_expression ());
12882       demand_empty_rest_of_line ();
12883       break;
12884
12885     case 'r':
12886       seg = subseg_new (RDATA_SECTION_NAME,
12887                         (subsegT) get_absolute_expression ());
12888       if (IS_ELF)
12889         {
12890           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12891                                                   | SEC_READONLY | SEC_RELOC
12892                                                   | SEC_DATA));
12893           if (strncmp (TARGET_OS, "elf", 3) != 0)
12894             record_alignment (seg, 4);
12895         }
12896       demand_empty_rest_of_line ();
12897       break;
12898
12899     case 's':
12900       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12901       if (IS_ELF)
12902         {
12903           bfd_set_section_flags (stdoutput, seg,
12904                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12905           if (strncmp (TARGET_OS, "elf", 3) != 0)
12906             record_alignment (seg, 4);
12907         }
12908       demand_empty_rest_of_line ();
12909       break;
12910
12911     case 'B':
12912       seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
12913       if (IS_ELF)
12914         {
12915           bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
12916           if (strncmp (TARGET_OS, "elf", 3) != 0)
12917             record_alignment (seg, 4);
12918         }
12919       demand_empty_rest_of_line ();
12920       break;
12921     }
12922
12923   auto_align = 1;
12924 }
12925
12926 void
12927 s_change_section (int ignore ATTRIBUTE_UNUSED)
12928 {
12929 #ifdef OBJ_ELF
12930   char *section_name;
12931   char c;
12932   char next_c = 0;
12933   int section_type;
12934   int section_flag;
12935   int section_entry_size;
12936   int section_alignment;
12937
12938   if (!IS_ELF)
12939     return;
12940
12941   section_name = input_line_pointer;
12942   c = get_symbol_end ();
12943   if (c)
12944     next_c = *(input_line_pointer + 1);
12945
12946   /* Do we have .section Name<,"flags">?  */
12947   if (c != ',' || (c == ',' && next_c == '"'))
12948     {
12949       /* just after name is now '\0'.  */
12950       *input_line_pointer = c;
12951       input_line_pointer = section_name;
12952       obj_elf_section (ignore);
12953       return;
12954     }
12955   input_line_pointer++;
12956
12957   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
12958   if (c == ',')
12959     section_type = get_absolute_expression ();
12960   else
12961     section_type = 0;
12962   if (*input_line_pointer++ == ',')
12963     section_flag = get_absolute_expression ();
12964   else
12965     section_flag = 0;
12966   if (*input_line_pointer++ == ',')
12967     section_entry_size = get_absolute_expression ();
12968   else
12969     section_entry_size = 0;
12970   if (*input_line_pointer++ == ',')
12971     section_alignment = get_absolute_expression ();
12972   else
12973     section_alignment = 0;
12974   /* FIXME: really ignore?  */
12975   (void) section_alignment;
12976
12977   section_name = xstrdup (section_name);
12978
12979   /* When using the generic form of .section (as implemented by obj-elf.c),
12980      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
12981      traditionally had to fall back on the more common @progbits instead.
12982
12983      There's nothing really harmful in this, since bfd will correct
12984      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
12985      means that, for backwards compatibility, the special_section entries
12986      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12987
12988      Even so, we shouldn't force users of the MIPS .section syntax to
12989      incorrectly label the sections as SHT_PROGBITS.  The best compromise
12990      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12991      generic type-checking code.  */
12992   if (section_type == SHT_MIPS_DWARF)
12993     section_type = SHT_PROGBITS;
12994
12995   obj_elf_change_section (section_name, section_type, section_flag,
12996                           section_entry_size, 0, 0, 0);
12997
12998   if (now_seg->name != section_name)
12999     free (section_name);
13000 #endif /* OBJ_ELF */
13001 }
13002
13003 void
13004 mips_enable_auto_align (void)
13005 {
13006   auto_align = 1;
13007 }
13008
13009 static void
13010 s_cons (int log_size)
13011 {
13012   segment_info_type *si = seg_info (now_seg);
13013   struct insn_label_list *l = si->label_list;
13014   symbolS *label;
13015
13016   label = l != NULL ? l->label : NULL;
13017   mips_emit_delays ();
13018   if (log_size > 0 && auto_align)
13019     mips_align (log_size, 0, label);
13020   cons (1 << log_size);
13021   mips_clear_insn_labels ();
13022 }
13023
13024 static void
13025 s_float_cons (int type)
13026 {
13027   segment_info_type *si = seg_info (now_seg);
13028   struct insn_label_list *l = si->label_list;
13029   symbolS *label;
13030
13031   label = l != NULL ? l->label : NULL;
13032
13033   mips_emit_delays ();
13034
13035   if (auto_align)
13036     {
13037       if (type == 'd')
13038         mips_align (3, 0, label);
13039       else
13040         mips_align (2, 0, label);
13041     }
13042
13043   float_cons (type);
13044   mips_clear_insn_labels ();
13045 }
13046
13047 /* Handle .globl.  We need to override it because on Irix 5 you are
13048    permitted to say
13049        .globl foo .text
13050    where foo is an undefined symbol, to mean that foo should be
13051    considered to be the address of a function.  */
13052
13053 static void
13054 s_mips_globl (int x ATTRIBUTE_UNUSED)
13055 {
13056   char *name;
13057   int c;
13058   symbolS *symbolP;
13059   flagword flag;
13060
13061   do
13062     {
13063       name = input_line_pointer;
13064       c = get_symbol_end ();
13065       symbolP = symbol_find_or_make (name);
13066       S_SET_EXTERNAL (symbolP);
13067
13068       *input_line_pointer = c;
13069       SKIP_WHITESPACE ();
13070
13071       /* On Irix 5, every global symbol that is not explicitly labelled as
13072          being a function is apparently labelled as being an object.  */
13073       flag = BSF_OBJECT;
13074
13075       if (!is_end_of_line[(unsigned char) *input_line_pointer]
13076           && (*input_line_pointer != ','))
13077         {
13078           char *secname;
13079           asection *sec;
13080
13081           secname = input_line_pointer;
13082           c = get_symbol_end ();
13083           sec = bfd_get_section_by_name (stdoutput, secname);
13084           if (sec == NULL)
13085             as_bad (_("%s: no such section"), secname);
13086           *input_line_pointer = c;
13087
13088           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
13089             flag = BSF_FUNCTION;
13090         }
13091
13092       symbol_get_bfdsym (symbolP)->flags |= flag;
13093
13094       c = *input_line_pointer;
13095       if (c == ',')
13096         {
13097           input_line_pointer++;
13098           SKIP_WHITESPACE ();
13099           if (is_end_of_line[(unsigned char) *input_line_pointer])
13100             c = '\n';
13101         }
13102     }
13103   while (c == ',');
13104
13105   demand_empty_rest_of_line ();
13106 }
13107
13108 static void
13109 s_option (int x ATTRIBUTE_UNUSED)
13110 {
13111   char *opt;
13112   char c;
13113
13114   opt = input_line_pointer;
13115   c = get_symbol_end ();
13116
13117   if (*opt == 'O')
13118     {
13119       /* FIXME: What does this mean?  */
13120     }
13121   else if (strncmp (opt, "pic", 3) == 0)
13122     {
13123       int i;
13124
13125       i = atoi (opt + 3);
13126       if (i == 0)
13127         mips_pic = NO_PIC;
13128       else if (i == 2)
13129         {
13130         mips_pic = SVR4_PIC;
13131           mips_abicalls = TRUE;
13132         }
13133       else
13134         as_bad (_(".option pic%d not supported"), i);
13135
13136       if (mips_pic == SVR4_PIC)
13137         {
13138           if (g_switch_seen && g_switch_value != 0)
13139             as_warn (_("-G may not be used with SVR4 PIC code"));
13140           g_switch_value = 0;
13141           bfd_set_gp_size (stdoutput, 0);
13142         }
13143     }
13144   else
13145     as_warn (_("Unrecognized option \"%s\""), opt);
13146
13147   *input_line_pointer = c;
13148   demand_empty_rest_of_line ();
13149 }
13150
13151 /* This structure is used to hold a stack of .set values.  */
13152
13153 struct mips_option_stack
13154 {
13155   struct mips_option_stack *next;
13156   struct mips_set_options options;
13157 };
13158
13159 static struct mips_option_stack *mips_opts_stack;
13160
13161 /* Handle the .set pseudo-op.  */
13162
13163 static void
13164 s_mipsset (int x ATTRIBUTE_UNUSED)
13165 {
13166   char *name = input_line_pointer, ch;
13167
13168   while (!is_end_of_line[(unsigned char) *input_line_pointer])
13169     ++input_line_pointer;
13170   ch = *input_line_pointer;
13171   *input_line_pointer = '\0';
13172
13173   if (strcmp (name, "reorder") == 0)
13174     {
13175       if (mips_opts.noreorder)
13176         end_noreorder ();
13177     }
13178   else if (strcmp (name, "noreorder") == 0)
13179     {
13180       if (!mips_opts.noreorder)
13181         start_noreorder ();
13182     }
13183   else if (strncmp (name, "at=", 3) == 0)
13184     {
13185       char *s = name + 3;
13186
13187       if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
13188         as_bad (_("Unrecognized register name `%s'"), s);
13189     }
13190   else if (strcmp (name, "at") == 0)
13191     {
13192       mips_opts.at = ATREG;
13193     }
13194   else if (strcmp (name, "noat") == 0)
13195     {
13196       mips_opts.at = ZERO;
13197     }
13198   else if (strcmp (name, "macro") == 0)
13199     {
13200       mips_opts.warn_about_macros = 0;
13201     }
13202   else if (strcmp (name, "nomacro") == 0)
13203     {
13204       if (mips_opts.noreorder == 0)
13205         as_bad (_("`noreorder' must be set before `nomacro'"));
13206       mips_opts.warn_about_macros = 1;
13207     }
13208   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
13209     {
13210       mips_opts.nomove = 0;
13211     }
13212   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
13213     {
13214       mips_opts.nomove = 1;
13215     }
13216   else if (strcmp (name, "bopt") == 0)
13217     {
13218       mips_opts.nobopt = 0;
13219     }
13220   else if (strcmp (name, "nobopt") == 0)
13221     {
13222       mips_opts.nobopt = 1;
13223     }
13224   else if (strcmp (name, "gp=default") == 0)
13225     mips_opts.gp32 = file_mips_gp32;
13226   else if (strcmp (name, "gp=32") == 0)
13227     mips_opts.gp32 = 1;
13228   else if (strcmp (name, "gp=64") == 0)
13229     {
13230       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
13231         as_warn (_("%s isa does not support 64-bit registers"),
13232                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13233       mips_opts.gp32 = 0;
13234     }
13235   else if (strcmp (name, "fp=default") == 0)
13236     mips_opts.fp32 = file_mips_fp32;
13237   else if (strcmp (name, "fp=32") == 0)
13238     mips_opts.fp32 = 1;
13239   else if (strcmp (name, "fp=64") == 0)
13240     {
13241       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
13242         as_warn (_("%s isa does not support 64-bit floating point registers"),
13243                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13244       mips_opts.fp32 = 0;
13245     }
13246   else if (strcmp (name, "softfloat") == 0)
13247     mips_opts.soft_float = 1;
13248   else if (strcmp (name, "hardfloat") == 0)
13249     mips_opts.soft_float = 0;
13250   else if (strcmp (name, "singlefloat") == 0)
13251     mips_opts.single_float = 1;
13252   else if (strcmp (name, "doublefloat") == 0)
13253     mips_opts.single_float = 0;
13254   else if (strcmp (name, "mips16") == 0
13255            || strcmp (name, "MIPS-16") == 0)
13256     mips_opts.mips16 = 1;
13257   else if (strcmp (name, "nomips16") == 0
13258            || strcmp (name, "noMIPS-16") == 0)
13259     mips_opts.mips16 = 0;
13260   else if (strcmp (name, "smartmips") == 0)
13261     {
13262       if (!ISA_SUPPORTS_SMARTMIPS)
13263         as_warn (_("%s ISA does not support SmartMIPS ASE"), 
13264                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13265       mips_opts.ase_smartmips = 1;
13266     }
13267   else if (strcmp (name, "nosmartmips") == 0)
13268     mips_opts.ase_smartmips = 0;
13269   else if (strcmp (name, "mips3d") == 0)
13270     mips_opts.ase_mips3d = 1;
13271   else if (strcmp (name, "nomips3d") == 0)
13272     mips_opts.ase_mips3d = 0;
13273   else if (strcmp (name, "mdmx") == 0)
13274     mips_opts.ase_mdmx = 1;
13275   else if (strcmp (name, "nomdmx") == 0)
13276     mips_opts.ase_mdmx = 0;
13277   else if (strcmp (name, "dsp") == 0)
13278     {
13279       if (!ISA_SUPPORTS_DSP_ASE)
13280         as_warn (_("%s ISA does not support DSP ASE"), 
13281                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13282       mips_opts.ase_dsp = 1;
13283       mips_opts.ase_dspr2 = 0;
13284     }
13285   else if (strcmp (name, "nodsp") == 0)
13286     {
13287       mips_opts.ase_dsp = 0;
13288       mips_opts.ase_dspr2 = 0;
13289     }
13290   else if (strcmp (name, "dspr2") == 0)
13291     {
13292       if (!ISA_SUPPORTS_DSPR2_ASE)
13293         as_warn (_("%s ISA does not support DSP R2 ASE"),
13294                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13295       mips_opts.ase_dspr2 = 1;
13296       mips_opts.ase_dsp = 1;
13297     }
13298   else if (strcmp (name, "nodspr2") == 0)
13299     {
13300       mips_opts.ase_dspr2 = 0;
13301       mips_opts.ase_dsp = 0;
13302     }
13303   else if (strcmp (name, "mt") == 0)
13304     {
13305       if (!ISA_SUPPORTS_MT_ASE)
13306         as_warn (_("%s ISA does not support MT ASE"), 
13307                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13308       mips_opts.ase_mt = 1;
13309     }
13310   else if (strcmp (name, "nomt") == 0)
13311     mips_opts.ase_mt = 0;
13312   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
13313     {
13314       int reset = 0;
13315
13316       /* Permit the user to change the ISA and architecture on the fly.
13317          Needless to say, misuse can cause serious problems.  */
13318       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
13319         {
13320           reset = 1;
13321           mips_opts.isa = file_mips_isa;
13322           mips_opts.arch = file_mips_arch;
13323         }
13324       else if (strncmp (name, "arch=", 5) == 0)
13325         {
13326           const struct mips_cpu_info *p;
13327
13328           p = mips_parse_cpu("internal use", name + 5);
13329           if (!p)
13330             as_bad (_("unknown architecture %s"), name + 5);
13331           else
13332             {
13333               mips_opts.arch = p->cpu;
13334               mips_opts.isa = p->isa;
13335             }
13336         }
13337       else if (strncmp (name, "mips", 4) == 0)
13338         {
13339           const struct mips_cpu_info *p;
13340
13341           p = mips_parse_cpu("internal use", name);
13342           if (!p)
13343             as_bad (_("unknown ISA level %s"), name + 4);
13344           else
13345             {
13346               mips_opts.arch = p->cpu;
13347               mips_opts.isa = p->isa;
13348             }
13349         }
13350       else
13351         as_bad (_("unknown ISA or architecture %s"), name);
13352
13353       switch (mips_opts.isa)
13354         {
13355         case  0:
13356           break;
13357         case ISA_MIPS1:
13358         case ISA_MIPS2:
13359         case ISA_MIPS32:
13360         case ISA_MIPS32R2:
13361           mips_opts.gp32 = 1;
13362           mips_opts.fp32 = 1;
13363           break;
13364         case ISA_MIPS3:
13365         case ISA_MIPS4:
13366         case ISA_MIPS5:
13367         case ISA_MIPS64:
13368         case ISA_MIPS64R2:
13369           mips_opts.gp32 = 0;
13370           mips_opts.fp32 = 0;
13371           break;
13372         default:
13373           as_bad (_("unknown ISA level %s"), name + 4);
13374           break;
13375         }
13376       if (reset)
13377         {
13378           mips_opts.gp32 = file_mips_gp32;
13379           mips_opts.fp32 = file_mips_fp32;
13380         }
13381     }
13382   else if (strcmp (name, "autoextend") == 0)
13383     mips_opts.noautoextend = 0;
13384   else if (strcmp (name, "noautoextend") == 0)
13385     mips_opts.noautoextend = 1;
13386   else if (strcmp (name, "push") == 0)
13387     {
13388       struct mips_option_stack *s;
13389
13390       s = (struct mips_option_stack *) xmalloc (sizeof *s);
13391       s->next = mips_opts_stack;
13392       s->options = mips_opts;
13393       mips_opts_stack = s;
13394     }
13395   else if (strcmp (name, "pop") == 0)
13396     {
13397       struct mips_option_stack *s;
13398
13399       s = mips_opts_stack;
13400       if (s == NULL)
13401         as_bad (_(".set pop with no .set push"));
13402       else
13403         {
13404           /* If we're changing the reorder mode we need to handle
13405              delay slots correctly.  */
13406           if (s->options.noreorder && ! mips_opts.noreorder)
13407             start_noreorder ();
13408           else if (! s->options.noreorder && mips_opts.noreorder)
13409             end_noreorder ();
13410
13411           mips_opts = s->options;
13412           mips_opts_stack = s->next;
13413           free (s);
13414         }
13415     }
13416   else if (strcmp (name, "sym32") == 0)
13417     mips_opts.sym32 = TRUE;
13418   else if (strcmp (name, "nosym32") == 0)
13419     mips_opts.sym32 = FALSE;
13420   else if (strchr (name, ','))
13421     {
13422       /* Generic ".set" directive; use the generic handler.  */
13423       *input_line_pointer = ch;
13424       input_line_pointer = name;
13425       s_set (0);
13426       return;
13427     }
13428   else
13429     {
13430       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
13431     }
13432   *input_line_pointer = ch;
13433   demand_empty_rest_of_line ();
13434 }
13435
13436 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
13437    .option pic2.  It means to generate SVR4 PIC calls.  */
13438
13439 static void
13440 s_abicalls (int ignore ATTRIBUTE_UNUSED)
13441 {
13442   mips_pic = SVR4_PIC;
13443   mips_abicalls = TRUE;
13444
13445   if (g_switch_seen && g_switch_value != 0)
13446     as_warn (_("-G may not be used with SVR4 PIC code"));
13447   g_switch_value = 0;
13448
13449   bfd_set_gp_size (stdoutput, 0);
13450   demand_empty_rest_of_line ();
13451 }
13452
13453 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
13454    PIC code.  It sets the $gp register for the function based on the
13455    function address, which is in the register named in the argument.
13456    This uses a relocation against _gp_disp, which is handled specially
13457    by the linker.  The result is:
13458         lui     $gp,%hi(_gp_disp)
13459         addiu   $gp,$gp,%lo(_gp_disp)
13460         addu    $gp,$gp,.cpload argument
13461    The .cpload argument is normally $25 == $t9.
13462
13463    The -mno-shared option changes this to:
13464         lui     $gp,%hi(__gnu_local_gp)
13465         addiu   $gp,$gp,%lo(__gnu_local_gp)
13466    and the argument is ignored.  This saves an instruction, but the
13467    resulting code is not position independent; it uses an absolute
13468    address for __gnu_local_gp.  Thus code assembled with -mno-shared
13469    can go into an ordinary executable, but not into a shared library.  */
13470
13471 static void
13472 s_cpload (int ignore ATTRIBUTE_UNUSED)
13473 {
13474   expressionS ex;
13475   int reg;
13476   int in_shared;
13477
13478   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13479      .cpload is ignored.  */
13480   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13481     {
13482       s_ignore (0);
13483       return;
13484     }
13485
13486   /* .cpload should be in a .set noreorder section.  */
13487   if (mips_opts.noreorder == 0)
13488     as_warn (_(".cpload not in noreorder section"));
13489
13490   reg = tc_get_register (0);
13491
13492   /* If we need to produce a 64-bit address, we are better off using
13493      the default instruction sequence.  */
13494   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
13495
13496   ex.X_op = O_symbol;
13497   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13498                                          "__gnu_local_gp");
13499   ex.X_op_symbol = NULL;
13500   ex.X_add_number = 0;
13501
13502   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13503   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13504
13505   macro_start ();
13506   macro_build_lui (&ex, mips_gp_register);
13507   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13508                mips_gp_register, BFD_RELOC_LO16);
13509   if (in_shared)
13510     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13511                  mips_gp_register, reg);
13512   macro_end ();
13513
13514   demand_empty_rest_of_line ();
13515 }
13516
13517 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
13518      .cpsetup $reg1, offset|$reg2, label
13519
13520    If offset is given, this results in:
13521      sd         $gp, offset($sp)
13522      lui        $gp, %hi(%neg(%gp_rel(label)))
13523      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13524      daddu      $gp, $gp, $reg1
13525
13526    If $reg2 is given, this results in:
13527      daddu      $reg2, $gp, $0
13528      lui        $gp, %hi(%neg(%gp_rel(label)))
13529      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13530      daddu      $gp, $gp, $reg1
13531    $reg1 is normally $25 == $t9.
13532
13533    The -mno-shared option replaces the last three instructions with
13534         lui     $gp,%hi(_gp)
13535         addiu   $gp,$gp,%lo(_gp)  */
13536
13537 static void
13538 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
13539 {
13540   expressionS ex_off;
13541   expressionS ex_sym;
13542   int reg1;
13543
13544   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
13545      We also need NewABI support.  */
13546   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13547     {
13548       s_ignore (0);
13549       return;
13550     }
13551
13552   reg1 = tc_get_register (0);
13553   SKIP_WHITESPACE ();
13554   if (*input_line_pointer != ',')
13555     {
13556       as_bad (_("missing argument separator ',' for .cpsetup"));
13557       return;
13558     }
13559   else
13560     ++input_line_pointer;
13561   SKIP_WHITESPACE ();
13562   if (*input_line_pointer == '$')
13563     {
13564       mips_cpreturn_register = tc_get_register (0);
13565       mips_cpreturn_offset = -1;
13566     }
13567   else
13568     {
13569       mips_cpreturn_offset = get_absolute_expression ();
13570       mips_cpreturn_register = -1;
13571     }
13572   SKIP_WHITESPACE ();
13573   if (*input_line_pointer != ',')
13574     {
13575       as_bad (_("missing argument separator ',' for .cpsetup"));
13576       return;
13577     }
13578   else
13579     ++input_line_pointer;
13580   SKIP_WHITESPACE ();
13581   expression (&ex_sym);
13582
13583   macro_start ();
13584   if (mips_cpreturn_register == -1)
13585     {
13586       ex_off.X_op = O_constant;
13587       ex_off.X_add_symbol = NULL;
13588       ex_off.X_op_symbol = NULL;
13589       ex_off.X_add_number = mips_cpreturn_offset;
13590
13591       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
13592                    BFD_RELOC_LO16, SP);
13593     }
13594   else
13595     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
13596                  mips_gp_register, 0);
13597
13598   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
13599     {
13600       macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13601                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13602                    BFD_RELOC_HI16_S);
13603
13604       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13605                    mips_gp_register, -1, BFD_RELOC_GPREL16,
13606                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13607
13608       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13609                    mips_gp_register, reg1);
13610     }
13611   else
13612     {
13613       expressionS ex;
13614
13615       ex.X_op = O_symbol;
13616       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
13617       ex.X_op_symbol = NULL;
13618       ex.X_add_number = 0;
13619
13620       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13621       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13622
13623       macro_build_lui (&ex, mips_gp_register);
13624       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13625                    mips_gp_register, BFD_RELOC_LO16);
13626     }
13627
13628   macro_end ();
13629
13630   demand_empty_rest_of_line ();
13631 }
13632
13633 static void
13634 s_cplocal (int ignore ATTRIBUTE_UNUSED)
13635 {
13636   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
13637      .cplocal is ignored.  */
13638   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13639     {
13640       s_ignore (0);
13641       return;
13642     }
13643
13644   mips_gp_register = tc_get_register (0);
13645   demand_empty_rest_of_line ();
13646 }
13647
13648 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
13649    offset from $sp.  The offset is remembered, and after making a PIC
13650    call $gp is restored from that location.  */
13651
13652 static void
13653 s_cprestore (int ignore ATTRIBUTE_UNUSED)
13654 {
13655   expressionS ex;
13656
13657   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13658      .cprestore is ignored.  */
13659   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13660     {
13661       s_ignore (0);
13662       return;
13663     }
13664
13665   mips_cprestore_offset = get_absolute_expression ();
13666   mips_cprestore_valid = 1;
13667
13668   ex.X_op = O_constant;
13669   ex.X_add_symbol = NULL;
13670   ex.X_op_symbol = NULL;
13671   ex.X_add_number = mips_cprestore_offset;
13672
13673   macro_start ();
13674   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13675                                 SP, HAVE_64BIT_ADDRESSES);
13676   macro_end ();
13677
13678   demand_empty_rest_of_line ();
13679 }
13680
13681 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
13682    was given in the preceding .cpsetup, it results in:
13683      ld         $gp, offset($sp)
13684
13685    If a register $reg2 was given there, it results in:
13686      daddu      $gp, $reg2, $0  */
13687
13688 static void
13689 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
13690 {
13691   expressionS ex;
13692
13693   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13694      We also need NewABI support.  */
13695   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13696     {
13697       s_ignore (0);
13698       return;
13699     }
13700
13701   macro_start ();
13702   if (mips_cpreturn_register == -1)
13703     {
13704       ex.X_op = O_constant;
13705       ex.X_add_symbol = NULL;
13706       ex.X_op_symbol = NULL;
13707       ex.X_add_number = mips_cpreturn_offset;
13708
13709       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
13710     }
13711   else
13712     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
13713                  mips_cpreturn_register, 0);
13714   macro_end ();
13715
13716   demand_empty_rest_of_line ();
13717 }
13718
13719 /* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
13720    a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13721    use in DWARF debug information.  */
13722
13723 static void
13724 s_dtprel_internal (size_t bytes)
13725 {
13726   expressionS ex;
13727   char *p;
13728
13729   expression (&ex);
13730
13731   if (ex.X_op != O_symbol)
13732     {
13733       as_bad (_("Unsupported use of %s"), (bytes == 8
13734                                            ? ".dtpreldword"
13735                                            : ".dtprelword"));
13736       ignore_rest_of_line ();
13737     }
13738
13739   p = frag_more (bytes);
13740   md_number_to_chars (p, 0, bytes);
13741   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13742                (bytes == 8
13743                 ? BFD_RELOC_MIPS_TLS_DTPREL64
13744                 : BFD_RELOC_MIPS_TLS_DTPREL32));
13745
13746   demand_empty_rest_of_line ();
13747 }
13748
13749 /* Handle .dtprelword.  */
13750
13751 static void
13752 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13753 {
13754   s_dtprel_internal (4);
13755 }
13756
13757 /* Handle .dtpreldword.  */
13758
13759 static void
13760 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13761 {
13762   s_dtprel_internal (8);
13763 }
13764
13765 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
13766    code.  It sets the offset to use in gp_rel relocations.  */
13767
13768 static void
13769 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
13770 {
13771   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13772      We also need NewABI support.  */
13773   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13774     {
13775       s_ignore (0);
13776       return;
13777     }
13778
13779   mips_gprel_offset = get_absolute_expression ();
13780
13781   demand_empty_rest_of_line ();
13782 }
13783
13784 /* Handle the .gpword pseudo-op.  This is used when generating PIC
13785    code.  It generates a 32 bit GP relative reloc.  */
13786
13787 static void
13788 s_gpword (int ignore ATTRIBUTE_UNUSED)
13789 {
13790   segment_info_type *si;
13791   struct insn_label_list *l;
13792   symbolS *label;
13793   expressionS ex;
13794   char *p;
13795
13796   /* When not generating PIC code, this is treated as .word.  */
13797   if (mips_pic != SVR4_PIC)
13798     {
13799       s_cons (2);
13800       return;
13801     }
13802
13803   si = seg_info (now_seg);
13804   l = si->label_list;
13805   label = l != NULL ? l->label : NULL;
13806   mips_emit_delays ();
13807   if (auto_align)
13808     mips_align (2, 0, label);
13809
13810   expression (&ex);
13811   mips_clear_insn_labels ();
13812
13813   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13814     {
13815       as_bad (_("Unsupported use of .gpword"));
13816       ignore_rest_of_line ();
13817     }
13818
13819   p = frag_more (4);
13820   md_number_to_chars (p, 0, 4);
13821   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13822                BFD_RELOC_GPREL32);
13823
13824   demand_empty_rest_of_line ();
13825 }
13826
13827 static void
13828 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13829 {
13830   segment_info_type *si;
13831   struct insn_label_list *l;
13832   symbolS *label;
13833   expressionS ex;
13834   char *p;
13835
13836   /* When not generating PIC code, this is treated as .dword.  */
13837   if (mips_pic != SVR4_PIC)
13838     {
13839       s_cons (3);
13840       return;
13841     }
13842
13843   si = seg_info (now_seg);
13844   l = si->label_list;
13845   label = l != NULL ? l->label : NULL;
13846   mips_emit_delays ();
13847   if (auto_align)
13848     mips_align (3, 0, label);
13849
13850   expression (&ex);
13851   mips_clear_insn_labels ();
13852
13853   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13854     {
13855       as_bad (_("Unsupported use of .gpdword"));
13856       ignore_rest_of_line ();
13857     }
13858
13859   p = frag_more (8);
13860   md_number_to_chars (p, 0, 8);
13861   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13862                BFD_RELOC_GPREL32)->fx_tcbit = 1;
13863
13864   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
13865   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13866            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13867
13868   demand_empty_rest_of_line ();
13869 }
13870
13871 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
13872    tables in SVR4 PIC code.  */
13873
13874 static void
13875 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13876 {
13877   int reg;
13878
13879   /* This is ignored when not generating SVR4 PIC code.  */
13880   if (mips_pic != SVR4_PIC)
13881     {
13882       s_ignore (0);
13883       return;
13884     }
13885
13886   /* Add $gp to the register named as an argument.  */
13887   macro_start ();
13888   reg = tc_get_register (0);
13889   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13890   macro_end ();
13891
13892   demand_empty_rest_of_line ();
13893 }
13894
13895 /* Handle the .insn pseudo-op.  This marks instruction labels in
13896    mips16 mode.  This permits the linker to handle them specially,
13897    such as generating jalx instructions when needed.  We also make
13898    them odd for the duration of the assembly, in order to generate the
13899    right sort of code.  We will make them even in the adjust_symtab
13900    routine, while leaving them marked.  This is convenient for the
13901    debugger and the disassembler.  The linker knows to make them odd
13902    again.  */
13903
13904 static void
13905 s_insn (int ignore ATTRIBUTE_UNUSED)
13906 {
13907   mips16_mark_labels ();
13908
13909   demand_empty_rest_of_line ();
13910 }
13911
13912 /* Handle a .stabn directive.  We need these in order to mark a label
13913    as being a mips16 text label correctly.  Sometimes the compiler
13914    will emit a label, followed by a .stabn, and then switch sections.
13915    If the label and .stabn are in mips16 mode, then the label is
13916    really a mips16 text label.  */
13917
13918 static void
13919 s_mips_stab (int type)
13920 {
13921   if (type == 'n')
13922     mips16_mark_labels ();
13923
13924   s_stab (type);
13925 }
13926
13927 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
13928
13929 static void
13930 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13931 {
13932   char *name;
13933   int c;
13934   symbolS *symbolP;
13935   expressionS exp;
13936
13937   name = input_line_pointer;
13938   c = get_symbol_end ();
13939   symbolP = symbol_find_or_make (name);
13940   S_SET_WEAK (symbolP);
13941   *input_line_pointer = c;
13942
13943   SKIP_WHITESPACE ();
13944
13945   if (! is_end_of_line[(unsigned char) *input_line_pointer])
13946     {
13947       if (S_IS_DEFINED (symbolP))
13948         {
13949           as_bad (_("ignoring attempt to redefine symbol %s"),
13950                   S_GET_NAME (symbolP));
13951           ignore_rest_of_line ();
13952           return;
13953         }
13954
13955       if (*input_line_pointer == ',')
13956         {
13957           ++input_line_pointer;
13958           SKIP_WHITESPACE ();
13959         }
13960
13961       expression (&exp);
13962       if (exp.X_op != O_symbol)
13963         {
13964           as_bad (_("bad .weakext directive"));
13965           ignore_rest_of_line ();
13966           return;
13967         }
13968       symbol_set_value_expression (symbolP, &exp);
13969     }
13970
13971   demand_empty_rest_of_line ();
13972 }
13973
13974 /* Parse a register string into a number.  Called from the ECOFF code
13975    to parse .frame.  The argument is non-zero if this is the frame
13976    register, so that we can record it in mips_frame_reg.  */
13977
13978 int
13979 tc_get_register (int frame)
13980 {
13981   unsigned int reg;
13982
13983   SKIP_WHITESPACE ();
13984   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13985     reg = 0;
13986   if (frame)
13987     {
13988       mips_frame_reg = reg != 0 ? reg : SP;
13989       mips_frame_reg_valid = 1;
13990       mips_cprestore_valid = 0;
13991     }
13992   return reg;
13993 }
13994
13995 valueT
13996 md_section_align (asection *seg, valueT addr)
13997 {
13998   int align = bfd_get_section_alignment (stdoutput, seg);
13999
14000   if (IS_ELF)
14001     {
14002       /* We don't need to align ELF sections to the full alignment.
14003          However, Irix 5 may prefer that we align them at least to a 16
14004          byte boundary.  We don't bother to align the sections if we
14005          are targeted for an embedded system.  */
14006       if (strncmp (TARGET_OS, "elf", 3) == 0)
14007         return addr;
14008       if (align > 4)
14009         align = 4;
14010     }
14011
14012   return ((addr + (1 << align) - 1) & (-1 << align));
14013 }
14014
14015 /* Utility routine, called from above as well.  If called while the
14016    input file is still being read, it's only an approximation.  (For
14017    example, a symbol may later become defined which appeared to be
14018    undefined earlier.)  */
14019
14020 static int
14021 nopic_need_relax (symbolS *sym, int before_relaxing)
14022 {
14023   if (sym == 0)
14024     return 0;
14025
14026   if (g_switch_value > 0)
14027     {
14028       const char *symname;
14029       int change;
14030
14031       /* Find out whether this symbol can be referenced off the $gp
14032          register.  It can be if it is smaller than the -G size or if
14033          it is in the .sdata or .sbss section.  Certain symbols can
14034          not be referenced off the $gp, although it appears as though
14035          they can.  */
14036       symname = S_GET_NAME (sym);
14037       if (symname != (const char *) NULL
14038           && (strcmp (symname, "eprol") == 0
14039               || strcmp (symname, "etext") == 0
14040               || strcmp (symname, "_gp") == 0
14041               || strcmp (symname, "edata") == 0
14042               || strcmp (symname, "_fbss") == 0
14043               || strcmp (symname, "_fdata") == 0
14044               || strcmp (symname, "_ftext") == 0
14045               || strcmp (symname, "end") == 0
14046               || strcmp (symname, "_gp_disp") == 0))
14047         change = 1;
14048       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
14049                && (0
14050 #ifndef NO_ECOFF_DEBUGGING
14051                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
14052                        && (symbol_get_obj (sym)->ecoff_extern_size
14053                            <= g_switch_value))
14054 #endif
14055                    /* We must defer this decision until after the whole
14056                       file has been read, since there might be a .extern
14057                       after the first use of this symbol.  */
14058                    || (before_relaxing
14059 #ifndef NO_ECOFF_DEBUGGING
14060                        && symbol_get_obj (sym)->ecoff_extern_size == 0
14061 #endif
14062                        && S_GET_VALUE (sym) == 0)
14063                    || (S_GET_VALUE (sym) != 0
14064                        && S_GET_VALUE (sym) <= g_switch_value)))
14065         change = 0;
14066       else
14067         {
14068           const char *segname;
14069
14070           segname = segment_name (S_GET_SEGMENT (sym));
14071           gas_assert (strcmp (segname, ".lit8") != 0
14072                   && strcmp (segname, ".lit4") != 0);
14073           change = (strcmp (segname, ".sdata") != 0
14074                     && strcmp (segname, ".sbss") != 0
14075                     && strncmp (segname, ".sdata.", 7) != 0
14076                     && strncmp (segname, ".sbss.", 6) != 0
14077                     && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
14078                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
14079         }
14080       return change;
14081     }
14082   else
14083     /* We are not optimizing for the $gp register.  */
14084     return 1;
14085 }
14086
14087
14088 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
14089
14090 static bfd_boolean
14091 pic_need_relax (symbolS *sym, asection *segtype)
14092 {
14093   asection *symsec;
14094
14095   /* Handle the case of a symbol equated to another symbol.  */
14096   while (symbol_equated_reloc_p (sym))
14097     {
14098       symbolS *n;
14099
14100       /* It's possible to get a loop here in a badly written program.  */
14101       n = symbol_get_value_expression (sym)->X_add_symbol;
14102       if (n == sym)
14103         break;
14104       sym = n;
14105     }
14106
14107   if (symbol_section_p (sym))
14108     return TRUE;
14109
14110   symsec = S_GET_SEGMENT (sym);
14111
14112   /* This must duplicate the test in adjust_reloc_syms.  */
14113   return (symsec != &bfd_und_section
14114           && symsec != &bfd_abs_section
14115           && !bfd_is_com_section (symsec)
14116           && !s_is_linkonce (sym, segtype)
14117 #ifdef OBJ_ELF
14118           /* A global or weak symbol is treated as external.  */
14119           && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
14120 #endif
14121           );
14122 }
14123
14124
14125 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
14126    extended opcode.  SEC is the section the frag is in.  */
14127
14128 static int
14129 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
14130 {
14131   int type;
14132   const struct mips16_immed_operand *op;
14133   offsetT val;
14134   int mintiny, maxtiny;
14135   segT symsec;
14136   fragS *sym_frag;
14137
14138   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
14139     return 0;
14140   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
14141     return 1;
14142
14143   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14144   op = mips16_immed_operands;
14145   while (op->type != type)
14146     {
14147       ++op;
14148       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
14149     }
14150
14151   if (op->unsp)
14152     {
14153       if (type == '<' || type == '>' || type == '[' || type == ']')
14154         {
14155           mintiny = 1;
14156           maxtiny = 1 << op->nbits;
14157         }
14158       else
14159         {
14160           mintiny = 0;
14161           maxtiny = (1 << op->nbits) - 1;
14162         }
14163     }
14164   else
14165     {
14166       mintiny = - (1 << (op->nbits - 1));
14167       maxtiny = (1 << (op->nbits - 1)) - 1;
14168     }
14169
14170   sym_frag = symbol_get_frag (fragp->fr_symbol);
14171   val = S_GET_VALUE (fragp->fr_symbol);
14172   symsec = S_GET_SEGMENT (fragp->fr_symbol);
14173
14174   if (op->pcrel)
14175     {
14176       addressT addr;
14177
14178       /* We won't have the section when we are called from
14179          mips_relax_frag.  However, we will always have been called
14180          from md_estimate_size_before_relax first.  If this is a
14181          branch to a different section, we mark it as such.  If SEC is
14182          NULL, and the frag is not marked, then it must be a branch to
14183          the same section.  */
14184       if (sec == NULL)
14185         {
14186           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
14187             return 1;
14188         }
14189       else
14190         {
14191           /* Must have been called from md_estimate_size_before_relax.  */
14192           if (symsec != sec)
14193             {
14194               fragp->fr_subtype =
14195                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14196
14197               /* FIXME: We should support this, and let the linker
14198                  catch branches and loads that are out of range.  */
14199               as_bad_where (fragp->fr_file, fragp->fr_line,
14200                             _("unsupported PC relative reference to different section"));
14201
14202               return 1;
14203             }
14204           if (fragp != sym_frag && sym_frag->fr_address == 0)
14205             /* Assume non-extended on the first relaxation pass.
14206                The address we have calculated will be bogus if this is
14207                a forward branch to another frag, as the forward frag
14208                will have fr_address == 0.  */
14209             return 0;
14210         }
14211
14212       /* In this case, we know for sure that the symbol fragment is in
14213          the same section.  If the relax_marker of the symbol fragment
14214          differs from the relax_marker of this fragment, we have not
14215          yet adjusted the symbol fragment fr_address.  We want to add
14216          in STRETCH in order to get a better estimate of the address.
14217          This particularly matters because of the shift bits.  */
14218       if (stretch != 0
14219           && sym_frag->relax_marker != fragp->relax_marker)
14220         {
14221           fragS *f;
14222
14223           /* Adjust stretch for any alignment frag.  Note that if have
14224              been expanding the earlier code, the symbol may be
14225              defined in what appears to be an earlier frag.  FIXME:
14226              This doesn't handle the fr_subtype field, which specifies
14227              a maximum number of bytes to skip when doing an
14228              alignment.  */
14229           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
14230             {
14231               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
14232                 {
14233                   if (stretch < 0)
14234                     stretch = - ((- stretch)
14235                                  & ~ ((1 << (int) f->fr_offset) - 1));
14236                   else
14237                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
14238                   if (stretch == 0)
14239                     break;
14240                 }
14241             }
14242           if (f != NULL)
14243             val += stretch;
14244         }
14245
14246       addr = fragp->fr_address + fragp->fr_fix;
14247
14248       /* The base address rules are complicated.  The base address of
14249          a branch is the following instruction.  The base address of a
14250          PC relative load or add is the instruction itself, but if it
14251          is in a delay slot (in which case it can not be extended) use
14252          the address of the instruction whose delay slot it is in.  */
14253       if (type == 'p' || type == 'q')
14254         {
14255           addr += 2;
14256
14257           /* If we are currently assuming that this frag should be
14258              extended, then, the current address is two bytes
14259              higher.  */
14260           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14261             addr += 2;
14262
14263           /* Ignore the low bit in the target, since it will be set
14264              for a text label.  */
14265           if ((val & 1) != 0)
14266             --val;
14267         }
14268       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14269         addr -= 4;
14270       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14271         addr -= 2;
14272
14273       val -= addr & ~ ((1 << op->shift) - 1);
14274
14275       /* Branch offsets have an implicit 0 in the lowest bit.  */
14276       if (type == 'p' || type == 'q')
14277         val /= 2;
14278
14279       /* If any of the shifted bits are set, we must use an extended
14280          opcode.  If the address depends on the size of this
14281          instruction, this can lead to a loop, so we arrange to always
14282          use an extended opcode.  We only check this when we are in
14283          the main relaxation loop, when SEC is NULL.  */
14284       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
14285         {
14286           fragp->fr_subtype =
14287             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14288           return 1;
14289         }
14290
14291       /* If we are about to mark a frag as extended because the value
14292          is precisely maxtiny + 1, then there is a chance of an
14293          infinite loop as in the following code:
14294              la $4,foo
14295              .skip      1020
14296              .align     2
14297            foo:
14298          In this case when the la is extended, foo is 0x3fc bytes
14299          away, so the la can be shrunk, but then foo is 0x400 away, so
14300          the la must be extended.  To avoid this loop, we mark the
14301          frag as extended if it was small, and is about to become
14302          extended with a value of maxtiny + 1.  */
14303       if (val == ((maxtiny + 1) << op->shift)
14304           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
14305           && sec == NULL)
14306         {
14307           fragp->fr_subtype =
14308             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14309           return 1;
14310         }
14311     }
14312   else if (symsec != absolute_section && sec != NULL)
14313     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
14314
14315   if ((val & ((1 << op->shift) - 1)) != 0
14316       || val < (mintiny << op->shift)
14317       || val > (maxtiny << op->shift))
14318     return 1;
14319   else
14320     return 0;
14321 }
14322
14323 /* Compute the length of a branch sequence, and adjust the
14324    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
14325    worst-case length is computed, with UPDATE being used to indicate
14326    whether an unconditional (-1), branch-likely (+1) or regular (0)
14327    branch is to be computed.  */
14328 static int
14329 relaxed_branch_length (fragS *fragp, asection *sec, int update)
14330 {
14331   bfd_boolean toofar;
14332   int length;
14333
14334   if (fragp
14335       && S_IS_DEFINED (fragp->fr_symbol)
14336       && sec == S_GET_SEGMENT (fragp->fr_symbol))
14337     {
14338       addressT addr;
14339       offsetT val;
14340
14341       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
14342
14343       addr = fragp->fr_address + fragp->fr_fix + 4;
14344
14345       val -= addr;
14346
14347       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
14348     }
14349   else if (fragp)
14350     /* If the symbol is not defined or it's in a different segment,
14351        assume the user knows what's going on and emit a short
14352        branch.  */
14353     toofar = FALSE;
14354   else
14355     toofar = TRUE;
14356
14357   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14358     fragp->fr_subtype
14359       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_AT (fragp->fr_subtype),
14360                              RELAX_BRANCH_UNCOND (fragp->fr_subtype),
14361                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
14362                              RELAX_BRANCH_LINK (fragp->fr_subtype),
14363                              toofar);
14364
14365   length = 4;
14366   if (toofar)
14367     {
14368       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
14369         length += 8;
14370
14371       if (mips_pic != NO_PIC)
14372         {
14373           /* Additional space for PIC loading of target address.  */
14374           length += 8;
14375           if (mips_opts.isa == ISA_MIPS1)
14376             /* Additional space for $at-stabilizing nop.  */
14377             length += 4;
14378         }
14379
14380       /* If branch is conditional.  */
14381       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
14382         length += 8;
14383     }
14384
14385   return length;
14386 }
14387
14388 /* Estimate the size of a frag before relaxing.  Unless this is the
14389    mips16, we are not really relaxing here, and the final size is
14390    encoded in the subtype information.  For the mips16, we have to
14391    decide whether we are using an extended opcode or not.  */
14392
14393 int
14394 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
14395 {
14396   int change;
14397
14398   if (RELAX_BRANCH_P (fragp->fr_subtype))
14399     {
14400
14401       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
14402
14403       return fragp->fr_var;
14404     }
14405
14406   if (RELAX_MIPS16_P (fragp->fr_subtype))
14407     /* We don't want to modify the EXTENDED bit here; it might get us
14408        into infinite loops.  We change it only in mips_relax_frag().  */
14409     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
14410
14411   if (mips_pic == NO_PIC)
14412     change = nopic_need_relax (fragp->fr_symbol, 0);
14413   else if (mips_pic == SVR4_PIC)
14414     change = pic_need_relax (fragp->fr_symbol, segtype);
14415   else if (mips_pic == VXWORKS_PIC)
14416     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
14417     change = 0;
14418   else
14419     abort ();
14420
14421   if (change)
14422     {
14423       fragp->fr_subtype |= RELAX_USE_SECOND;
14424       return -RELAX_FIRST (fragp->fr_subtype);
14425     }
14426   else
14427     return -RELAX_SECOND (fragp->fr_subtype);
14428 }
14429
14430 /* This is called to see whether a reloc against a defined symbol
14431    should be converted into a reloc against a section.  */
14432
14433 int
14434 mips_fix_adjustable (fixS *fixp)
14435 {
14436   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
14437       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14438     return 0;
14439
14440   if (fixp->fx_addsy == NULL)
14441     return 1;
14442
14443   /* If symbol SYM is in a mergeable section, relocations of the form
14444      SYM + 0 can usually be made section-relative.  The mergeable data
14445      is then identified by the section offset rather than by the symbol.
14446
14447      However, if we're generating REL LO16 relocations, the offset is split
14448      between the LO16 and parterning high part relocation.  The linker will
14449      need to recalculate the complete offset in order to correctly identify
14450      the merge data.
14451
14452      The linker has traditionally not looked for the parterning high part
14453      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
14454      placed anywhere.  Rather than break backwards compatibility by changing
14455      this, it seems better not to force the issue, and instead keep the
14456      original symbol.  This will work with either linker behavior.  */
14457   if ((lo16_reloc_p (fixp->fx_r_type)
14458        || reloc_needs_lo_p (fixp->fx_r_type))
14459       && HAVE_IN_PLACE_ADDENDS
14460       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
14461     return 0;
14462
14463   /* There is no place to store an in-place offset for JALR relocations.
14464      Likewise an in-range offset of PC-relative relocations may overflow
14465      the in-place relocatable field if recalculated against the start
14466      address of the symbol's containing section.  */
14467   if (HAVE_IN_PLACE_ADDENDS
14468       && (fixp->fx_pcrel || fixp->fx_r_type == BFD_RELOC_MIPS_JALR))
14469     return 0;
14470
14471 #ifdef OBJ_ELF
14472   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
14473      to a floating-point stub.  The same is true for non-R_MIPS16_26
14474      relocations against MIPS16 functions; in this case, the stub becomes
14475      the function's canonical address.
14476
14477      Floating-point stubs are stored in unique .mips16.call.* or
14478      .mips16.fn.* sections.  If a stub T for function F is in section S,
14479      the first relocation in section S must be against F; this is how the
14480      linker determines the target function.  All relocations that might
14481      resolve to T must also be against F.  We therefore have the following
14482      restrictions, which are given in an intentionally-redundant way:
14483
14484        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14485           symbols.
14486
14487        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14488           if that stub might be used.
14489
14490        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14491           symbols.
14492
14493        4. We cannot reduce a stub's relocations against MIPS16 symbols if
14494           that stub might be used.
14495
14496      There is a further restriction:
14497
14498        5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14499           on targets with in-place addends; the relocation field cannot
14500           encode the low bit.
14501
14502      For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14503      against a MIPS16 symbol.
14504
14505      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14506      relocation against some symbol R, no relocation against R may be
14507      reduced.  (Note that this deals with (2) as well as (1) because
14508      relocations against global symbols will never be reduced on ELF
14509      targets.)  This approach is a little simpler than trying to detect
14510      stub sections, and gives the "all or nothing" per-symbol consistency
14511      that we have for MIPS16 symbols.  */
14512   if (IS_ELF
14513       && fixp->fx_subsy == NULL
14514       && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
14515           || *symbol_get_tc (fixp->fx_addsy)))
14516     return 0;
14517 #endif
14518
14519   return 1;
14520 }
14521
14522 /* Translate internal representation of relocation info to BFD target
14523    format.  */
14524
14525 arelent **
14526 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
14527 {
14528   static arelent *retval[4];
14529   arelent *reloc;
14530   bfd_reloc_code_real_type code;
14531
14532   memset (retval, 0, sizeof(retval));
14533   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
14534   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14535   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
14536   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14537
14538   if (fixp->fx_pcrel)
14539     {
14540       gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
14541
14542       /* At this point, fx_addnumber is "symbol offset - pcrel address".
14543          Relocations want only the symbol offset.  */
14544       reloc->addend = fixp->fx_addnumber + reloc->address;
14545       if (!IS_ELF)
14546         {
14547           /* A gruesome hack which is a result of the gruesome gas
14548              reloc handling.  What's worse, for COFF (as opposed to
14549              ECOFF), we might need yet another copy of reloc->address.
14550              See bfd_install_relocation.  */
14551           reloc->addend += reloc->address;
14552         }
14553     }
14554   else
14555     reloc->addend = fixp->fx_addnumber;
14556
14557   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14558      entry to be used in the relocation's section offset.  */
14559   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14560     {
14561       reloc->address = reloc->addend;
14562       reloc->addend = 0;
14563     }
14564
14565   code = fixp->fx_r_type;
14566
14567   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
14568   if (reloc->howto == NULL)
14569     {
14570       as_bad_where (fixp->fx_file, fixp->fx_line,
14571                     _("Can not represent %s relocation in this object file format"),
14572                     bfd_get_reloc_code_name (code));
14573       retval[0] = NULL;
14574     }
14575
14576   return retval;
14577 }
14578
14579 /* Relax a machine dependent frag.  This returns the amount by which
14580    the current size of the frag should change.  */
14581
14582 int
14583 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
14584 {
14585   if (RELAX_BRANCH_P (fragp->fr_subtype))
14586     {
14587       offsetT old_var = fragp->fr_var;
14588
14589       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
14590
14591       return fragp->fr_var - old_var;
14592     }
14593
14594   if (! RELAX_MIPS16_P (fragp->fr_subtype))
14595     return 0;
14596
14597   if (mips16_extended_frag (fragp, NULL, stretch))
14598     {
14599       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14600         return 0;
14601       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14602       return 2;
14603     }
14604   else
14605     {
14606       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14607         return 0;
14608       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14609       return -2;
14610     }
14611
14612   return 0;
14613 }
14614
14615 /* Convert a machine dependent frag.  */
14616
14617 void
14618 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
14619 {
14620   if (RELAX_BRANCH_P (fragp->fr_subtype))
14621     {
14622       bfd_byte *buf;
14623       unsigned long insn;
14624       expressionS exp;
14625       fixS *fixp;
14626
14627       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14628
14629       if (target_big_endian)
14630         insn = bfd_getb32 (buf);
14631       else
14632         insn = bfd_getl32 (buf);
14633
14634       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14635         {
14636           /* We generate a fixup instead of applying it right now
14637              because, if there are linker relaxations, we're going to
14638              need the relocations.  */
14639           exp.X_op = O_symbol;
14640           exp.X_add_symbol = fragp->fr_symbol;
14641           exp.X_add_number = fragp->fr_offset;
14642
14643           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14644                               4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
14645           fixp->fx_file = fragp->fr_file;
14646           fixp->fx_line = fragp->fr_line;
14647
14648           md_number_to_chars ((char *) buf, insn, 4);
14649           buf += 4;
14650         }
14651       else
14652         {
14653           int i;
14654
14655           as_warn_where (fragp->fr_file, fragp->fr_line,
14656                          _("Relaxed out-of-range branch into a jump"));
14657
14658           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14659             goto uncond;
14660
14661           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14662             {
14663               /* Reverse the branch.  */
14664               switch ((insn >> 28) & 0xf)
14665                 {
14666                 case 4:
14667                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14668                      have the condition reversed by tweaking a single
14669                      bit, and their opcodes all have 0x4???????.  */
14670                   gas_assert ((insn & 0xf1000000) == 0x41000000);
14671                   insn ^= 0x00010000;
14672                   break;
14673
14674                 case 0:
14675                   /* bltz       0x04000000      bgez    0x04010000
14676                      bltzal     0x04100000      bgezal  0x04110000  */
14677                   gas_assert ((insn & 0xfc0e0000) == 0x04000000);
14678                   insn ^= 0x00010000;
14679                   break;
14680
14681                 case 1:
14682                   /* beq        0x10000000      bne     0x14000000
14683                      blez       0x18000000      bgtz    0x1c000000  */
14684                   insn ^= 0x04000000;
14685                   break;
14686
14687                 default:
14688                   abort ();
14689                 }
14690             }
14691
14692           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14693             {
14694               /* Clear the and-link bit.  */
14695               gas_assert ((insn & 0xfc1c0000) == 0x04100000);
14696
14697               /* bltzal         0x04100000      bgezal  0x04110000
14698                  bltzall        0x04120000      bgezall 0x04130000  */
14699               insn &= ~0x00100000;
14700             }
14701
14702           /* Branch over the branch (if the branch was likely) or the
14703              full jump (not likely case).  Compute the offset from the
14704              current instruction to branch to.  */
14705           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14706             i = 16;
14707           else
14708             {
14709               /* How many bytes in instructions we've already emitted?  */
14710               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14711               /* How many bytes in instructions from here to the end?  */
14712               i = fragp->fr_var - i;
14713             }
14714           /* Convert to instruction count.  */
14715           i >>= 2;
14716           /* Branch counts from the next instruction.  */
14717           i--;
14718           insn |= i;
14719           /* Branch over the jump.  */
14720           md_number_to_chars ((char *) buf, insn, 4);
14721           buf += 4;
14722
14723           /* nop */
14724           md_number_to_chars ((char *) buf, 0, 4);
14725           buf += 4;
14726
14727           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14728             {
14729               /* beql $0, $0, 2f */
14730               insn = 0x50000000;
14731               /* Compute the PC offset from the current instruction to
14732                  the end of the variable frag.  */
14733               /* How many bytes in instructions we've already emitted?  */
14734               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14735               /* How many bytes in instructions from here to the end?  */
14736               i = fragp->fr_var - i;
14737               /* Convert to instruction count.  */
14738               i >>= 2;
14739               /* Don't decrement i, because we want to branch over the
14740                  delay slot.  */
14741
14742               insn |= i;
14743               md_number_to_chars ((char *) buf, insn, 4);
14744               buf += 4;
14745
14746               md_number_to_chars ((char *) buf, 0, 4);
14747               buf += 4;
14748             }
14749
14750         uncond:
14751           if (mips_pic == NO_PIC)
14752             {
14753               /* j or jal.  */
14754               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14755                       ? 0x0c000000 : 0x08000000);
14756               exp.X_op = O_symbol;
14757               exp.X_add_symbol = fragp->fr_symbol;
14758               exp.X_add_number = fragp->fr_offset;
14759
14760               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14761                                   4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
14762               fixp->fx_file = fragp->fr_file;
14763               fixp->fx_line = fragp->fr_line;
14764
14765               md_number_to_chars ((char *) buf, insn, 4);
14766               buf += 4;
14767             }
14768           else
14769             {
14770               unsigned long at = RELAX_BRANCH_AT (fragp->fr_subtype);
14771
14772               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
14773               insn = HAVE_64BIT_ADDRESSES ? 0xdf800000 : 0x8f800000;
14774               insn |= at << OP_SH_RT;
14775               exp.X_op = O_symbol;
14776               exp.X_add_symbol = fragp->fr_symbol;
14777               exp.X_add_number = fragp->fr_offset;
14778
14779               if (fragp->fr_offset)
14780                 {
14781                   exp.X_add_symbol = make_expr_symbol (&exp);
14782                   exp.X_add_number = 0;
14783                 }
14784
14785               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14786                                   4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
14787               fixp->fx_file = fragp->fr_file;
14788               fixp->fx_line = fragp->fr_line;
14789
14790               md_number_to_chars ((char *) buf, insn, 4);
14791               buf += 4;
14792
14793               if (mips_opts.isa == ISA_MIPS1)
14794                 {
14795                   /* nop */
14796                   md_number_to_chars ((char *) buf, 0, 4);
14797                   buf += 4;
14798                 }
14799
14800               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
14801               insn = HAVE_64BIT_ADDRESSES ? 0x64000000 : 0x24000000;
14802               insn |= at << OP_SH_RS | at << OP_SH_RT;
14803
14804               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14805                                   4, &exp, FALSE, BFD_RELOC_LO16);
14806               fixp->fx_file = fragp->fr_file;
14807               fixp->fx_line = fragp->fr_line;
14808
14809               md_number_to_chars ((char *) buf, insn, 4);
14810               buf += 4;
14811
14812               /* j(al)r $at.  */
14813               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14814                 insn = 0x0000f809;
14815               else
14816                 insn = 0x00000008;
14817               insn |= at << OP_SH_RS;
14818
14819               md_number_to_chars ((char *) buf, insn, 4);
14820               buf += 4;
14821             }
14822         }
14823
14824       gas_assert (buf == (bfd_byte *)fragp->fr_literal
14825               + fragp->fr_fix + fragp->fr_var);
14826
14827       fragp->fr_fix += fragp->fr_var;
14828
14829       return;
14830     }
14831
14832   if (RELAX_MIPS16_P (fragp->fr_subtype))
14833     {
14834       int type;
14835       const struct mips16_immed_operand *op;
14836       bfd_boolean small, ext;
14837       offsetT val;
14838       bfd_byte *buf;
14839       unsigned long insn;
14840       bfd_boolean use_extend;
14841       unsigned short extend;
14842
14843       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14844       op = mips16_immed_operands;
14845       while (op->type != type)
14846         ++op;
14847
14848       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14849         {
14850           small = FALSE;
14851           ext = TRUE;
14852         }
14853       else
14854         {
14855           small = TRUE;
14856           ext = FALSE;
14857         }
14858
14859       val = resolve_symbol_value (fragp->fr_symbol);
14860       if (op->pcrel)
14861         {
14862           addressT addr;
14863
14864           addr = fragp->fr_address + fragp->fr_fix;
14865
14866           /* The rules for the base address of a PC relative reloc are
14867              complicated; see mips16_extended_frag.  */
14868           if (type == 'p' || type == 'q')
14869             {
14870               addr += 2;
14871               if (ext)
14872                 addr += 2;
14873               /* Ignore the low bit in the target, since it will be
14874                  set for a text label.  */
14875               if ((val & 1) != 0)
14876                 --val;
14877             }
14878           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14879             addr -= 4;
14880           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14881             addr -= 2;
14882
14883           addr &= ~ (addressT) ((1 << op->shift) - 1);
14884           val -= addr;
14885
14886           /* Make sure the section winds up with the alignment we have
14887              assumed.  */
14888           if (op->shift > 0)
14889             record_alignment (asec, op->shift);
14890         }
14891
14892       if (ext
14893           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14894               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14895         as_warn_where (fragp->fr_file, fragp->fr_line,
14896                        _("extended instruction in delay slot"));
14897
14898       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14899
14900       if (target_big_endian)
14901         insn = bfd_getb16 (buf);
14902       else
14903         insn = bfd_getl16 (buf);
14904
14905       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14906                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14907                     small, ext, &insn, &use_extend, &extend);
14908
14909       if (use_extend)
14910         {
14911           md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14912           fragp->fr_fix += 2;
14913           buf += 2;
14914         }
14915
14916       md_number_to_chars ((char *) buf, insn, 2);
14917       fragp->fr_fix += 2;
14918       buf += 2;
14919     }
14920   else
14921     {
14922       int first, second;
14923       fixS *fixp;
14924
14925       first = RELAX_FIRST (fragp->fr_subtype);
14926       second = RELAX_SECOND (fragp->fr_subtype);
14927       fixp = (fixS *) fragp->fr_opcode;
14928
14929       /* Possibly emit a warning if we've chosen the longer option.  */
14930       if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14931           == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14932         {
14933           const char *msg = macro_warning (fragp->fr_subtype);
14934           if (msg != 0)
14935             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
14936         }
14937
14938       /* Go through all the fixups for the first sequence.  Disable them
14939          (by marking them as done) if we're going to use the second
14940          sequence instead.  */
14941       while (fixp
14942              && fixp->fx_frag == fragp
14943              && fixp->fx_where < fragp->fr_fix - second)
14944         {
14945           if (fragp->fr_subtype & RELAX_USE_SECOND)
14946             fixp->fx_done = 1;
14947           fixp = fixp->fx_next;
14948         }
14949
14950       /* Go through the fixups for the second sequence.  Disable them if
14951          we're going to use the first sequence, otherwise adjust their
14952          addresses to account for the relaxation.  */
14953       while (fixp && fixp->fx_frag == fragp)
14954         {
14955           if (fragp->fr_subtype & RELAX_USE_SECOND)
14956             fixp->fx_where -= first;
14957           else
14958             fixp->fx_done = 1;
14959           fixp = fixp->fx_next;
14960         }
14961
14962       /* Now modify the frag contents.  */
14963       if (fragp->fr_subtype & RELAX_USE_SECOND)
14964         {
14965           char *start;
14966
14967           start = fragp->fr_literal + fragp->fr_fix - first - second;
14968           memmove (start, start + first, second);
14969           fragp->fr_fix -= first;
14970         }
14971       else
14972         fragp->fr_fix -= second;
14973     }
14974 }
14975
14976 #ifdef OBJ_ELF
14977
14978 /* This function is called after the relocs have been generated.
14979    We've been storing mips16 text labels as odd.  Here we convert them
14980    back to even for the convenience of the debugger.  */
14981
14982 void
14983 mips_frob_file_after_relocs (void)
14984 {
14985   asymbol **syms;
14986   unsigned int count, i;
14987
14988   if (!IS_ELF)
14989     return;
14990
14991   syms = bfd_get_outsymbols (stdoutput);
14992   count = bfd_get_symcount (stdoutput);
14993   for (i = 0; i < count; i++, syms++)
14994     {
14995       if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
14996           && ((*syms)->value & 1) != 0)
14997         {
14998           (*syms)->value &= ~1;
14999           /* If the symbol has an odd size, it was probably computed
15000              incorrectly, so adjust that as well.  */
15001           if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
15002             ++elf_symbol (*syms)->internal_elf_sym.st_size;
15003         }
15004     }
15005 }
15006
15007 #endif
15008
15009 /* This function is called whenever a label is defined, including fake
15010    labels instantiated off the dot special symbol.  It is used when
15011    handling branch delays; if a branch has a label, we assume we cannot
15012    move it.  This also bumps the value of the symbol by 1 in compressed
15013    code.  */
15014
15015 void
15016 mips_record_label (symbolS *sym)
15017 {
15018   segment_info_type *si = seg_info (now_seg);
15019   struct insn_label_list *l;
15020
15021   if (free_insn_labels == NULL)
15022     l = (struct insn_label_list *) xmalloc (sizeof *l);
15023   else
15024     {
15025       l = free_insn_labels;
15026       free_insn_labels = l->next;
15027     }
15028
15029   l->label = sym;
15030   l->next = si->label_list;
15031   si->label_list = l;
15032 }
15033
15034 /* This function is called as tc_frob_label() whenever a label is defined
15035    and adds a DWARF-2 record we only want for true labels.  */
15036
15037 void
15038 mips_define_label (symbolS *sym)
15039 {
15040   mips_record_label (sym);
15041 #ifdef OBJ_ELF
15042   dwarf2_emit_label (sym);
15043 #endif
15044 }
15045 \f
15046 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
15047
15048 /* Some special processing for a MIPS ELF file.  */
15049
15050 void
15051 mips_elf_final_processing (void)
15052 {
15053   /* Write out the register information.  */
15054   if (mips_abi != N64_ABI)
15055     {
15056       Elf32_RegInfo s;
15057
15058       s.ri_gprmask = mips_gprmask;
15059       s.ri_cprmask[0] = mips_cprmask[0];
15060       s.ri_cprmask[1] = mips_cprmask[1];
15061       s.ri_cprmask[2] = mips_cprmask[2];
15062       s.ri_cprmask[3] = mips_cprmask[3];
15063       /* The gp_value field is set by the MIPS ELF backend.  */
15064
15065       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
15066                                        ((Elf32_External_RegInfo *)
15067                                         mips_regmask_frag));
15068     }
15069   else
15070     {
15071       Elf64_Internal_RegInfo s;
15072
15073       s.ri_gprmask = mips_gprmask;
15074       s.ri_pad = 0;
15075       s.ri_cprmask[0] = mips_cprmask[0];
15076       s.ri_cprmask[1] = mips_cprmask[1];
15077       s.ri_cprmask[2] = mips_cprmask[2];
15078       s.ri_cprmask[3] = mips_cprmask[3];
15079       /* The gp_value field is set by the MIPS ELF backend.  */
15080
15081       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
15082                                        ((Elf64_External_RegInfo *)
15083                                         mips_regmask_frag));
15084     }
15085
15086   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
15087      sort of BFD interface for this.  */
15088   if (mips_any_noreorder)
15089     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
15090   if (mips_pic != NO_PIC)
15091     {
15092     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
15093       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
15094     }
15095   if (mips_abicalls)
15096     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
15097
15098   /* Set MIPS ELF flags for ASEs.  */
15099   /* We may need to define a new flag for DSP ASE, and set this flag when
15100      file_ase_dsp is true.  */
15101   /* Same for DSP R2.  */
15102   /* We may need to define a new flag for MT ASE, and set this flag when
15103      file_ase_mt is true.  */
15104   if (file_ase_mips16)
15105     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
15106 #if 0 /* XXX FIXME */
15107   if (file_ase_mips3d)
15108     elf_elfheader (stdoutput)->e_flags |= ???;
15109 #endif
15110   if (file_ase_mdmx)
15111     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
15112
15113   /* Set the MIPS ELF ABI flags.  */
15114   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
15115     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
15116   else if (mips_abi == O64_ABI)
15117     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
15118   else if (mips_abi == EABI_ABI)
15119     {
15120       if (!file_mips_gp32)
15121         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
15122       else
15123         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
15124     }
15125   else if (mips_abi == N32_ABI)
15126     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
15127
15128   /* Nothing to do for N64_ABI.  */
15129
15130   if (mips_32bitmode)
15131     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
15132
15133 #if 0 /* XXX FIXME */
15134   /* 32 bit code with 64 bit FP registers.  */
15135   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
15136     elf_elfheader (stdoutput)->e_flags |= ???;
15137 #endif
15138 }
15139
15140 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
15141 \f
15142 typedef struct proc {
15143   symbolS *func_sym;
15144   symbolS *func_end_sym;
15145   unsigned long reg_mask;
15146   unsigned long reg_offset;
15147   unsigned long fpreg_mask;
15148   unsigned long fpreg_offset;
15149   unsigned long frame_offset;
15150   unsigned long frame_reg;
15151   unsigned long pc_reg;
15152 } procS;
15153
15154 static procS cur_proc;
15155 static procS *cur_proc_ptr;
15156 static int numprocs;
15157
15158 /* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1" and a normal
15159    nop as "0".  */
15160
15161 char
15162 mips_nop_opcode (void)
15163 {
15164   return seg_info (now_seg)->tc_segment_info_data.mips16;
15165 }
15166
15167 /* Fill in an rs_align_code fragment.  This only needs to do something
15168    for MIPS16 code, where 0 is not a nop.  */
15169
15170 void
15171 mips_handle_align (fragS *fragp)
15172 {
15173   char *p;
15174   int bytes, size, excess;
15175   valueT opcode;
15176
15177   if (fragp->fr_type != rs_align_code)
15178     return;
15179
15180   p = fragp->fr_literal + fragp->fr_fix;
15181   if (*p)
15182     {
15183       opcode = mips16_nop_insn.insn_opcode;
15184       size = 2;
15185     }
15186   else
15187     {
15188       opcode = nop_insn.insn_opcode;
15189       size = 4;
15190     }
15191
15192   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
15193   excess = bytes % size;
15194   if (excess != 0)
15195     {
15196       /* If we're not inserting a whole number of instructions,
15197          pad the end of the fixed part of the frag with zeros.  */
15198       memset (p, 0, excess);
15199       p += excess;
15200       fragp->fr_fix += excess;
15201     }
15202
15203   md_number_to_chars (p, opcode, size);
15204   fragp->fr_var = size;
15205 }
15206
15207 static void
15208 md_obj_begin (void)
15209 {
15210 }
15211
15212 static void
15213 md_obj_end (void)
15214 {
15215   /* Check for premature end, nesting errors, etc.  */
15216   if (cur_proc_ptr)
15217     as_warn (_("missing .end at end of assembly"));
15218 }
15219
15220 static long
15221 get_number (void)
15222 {
15223   int negative = 0;
15224   long val = 0;
15225
15226   if (*input_line_pointer == '-')
15227     {
15228       ++input_line_pointer;
15229       negative = 1;
15230     }
15231   if (!ISDIGIT (*input_line_pointer))
15232     as_bad (_("expected simple number"));
15233   if (input_line_pointer[0] == '0')
15234     {
15235       if (input_line_pointer[1] == 'x')
15236         {
15237           input_line_pointer += 2;
15238           while (ISXDIGIT (*input_line_pointer))
15239             {
15240               val <<= 4;
15241               val |= hex_value (*input_line_pointer++);
15242             }
15243           return negative ? -val : val;
15244         }
15245       else
15246         {
15247           ++input_line_pointer;
15248           while (ISDIGIT (*input_line_pointer))
15249             {
15250               val <<= 3;
15251               val |= *input_line_pointer++ - '0';
15252             }
15253           return negative ? -val : val;
15254         }
15255     }
15256   if (!ISDIGIT (*input_line_pointer))
15257     {
15258       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
15259               *input_line_pointer, *input_line_pointer);
15260       as_warn (_("invalid number"));
15261       return -1;
15262     }
15263   while (ISDIGIT (*input_line_pointer))
15264     {
15265       val *= 10;
15266       val += *input_line_pointer++ - '0';
15267     }
15268   return negative ? -val : val;
15269 }
15270
15271 /* The .file directive; just like the usual .file directive, but there
15272    is an initial number which is the ECOFF file index.  In the non-ECOFF
15273    case .file implies DWARF-2.  */
15274
15275 static void
15276 s_mips_file (int x ATTRIBUTE_UNUSED)
15277 {
15278   static int first_file_directive = 0;
15279
15280   if (ECOFF_DEBUGGING)
15281     {
15282       get_number ();
15283       s_app_file (0);
15284     }
15285   else
15286     {
15287       char *filename;
15288
15289       filename = dwarf2_directive_file (0);
15290
15291       /* Versions of GCC up to 3.1 start files with a ".file"
15292          directive even for stabs output.  Make sure that this
15293          ".file" is handled.  Note that you need a version of GCC
15294          after 3.1 in order to support DWARF-2 on MIPS.  */
15295       if (filename != NULL && ! first_file_directive)
15296         {
15297           (void) new_logical_line (filename, -1);
15298           s_app_file_string (filename, 0);
15299         }
15300       first_file_directive = 1;
15301     }
15302 }
15303
15304 /* The .loc directive, implying DWARF-2.  */
15305
15306 static void
15307 s_mips_loc (int x ATTRIBUTE_UNUSED)
15308 {
15309   if (!ECOFF_DEBUGGING)
15310     dwarf2_directive_loc (0);
15311 }
15312
15313 /* The .end directive.  */
15314
15315 static void
15316 s_mips_end (int x ATTRIBUTE_UNUSED)
15317 {
15318   symbolS *p;
15319
15320   /* Following functions need their own .frame and .cprestore directives.  */
15321   mips_frame_reg_valid = 0;
15322   mips_cprestore_valid = 0;
15323
15324   if (!is_end_of_line[(unsigned char) *input_line_pointer])
15325     {
15326       p = get_symbol ();
15327       demand_empty_rest_of_line ();
15328     }
15329   else
15330     p = NULL;
15331
15332   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15333     as_warn (_(".end not in text section"));
15334
15335   if (!cur_proc_ptr)
15336     {
15337       as_warn (_(".end directive without a preceding .ent directive."));
15338       demand_empty_rest_of_line ();
15339       return;
15340     }
15341
15342   if (p != NULL)
15343     {
15344       gas_assert (S_GET_NAME (p));
15345       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
15346         as_warn (_(".end symbol does not match .ent symbol."));
15347
15348       if (debug_type == DEBUG_STABS)
15349         stabs_generate_asm_endfunc (S_GET_NAME (p),
15350                                     S_GET_NAME (p));
15351     }
15352   else
15353     as_warn (_(".end directive missing or unknown symbol"));
15354
15355 #ifdef OBJ_ELF
15356   /* Create an expression to calculate the size of the function.  */
15357   if (p && cur_proc_ptr)
15358     {
15359       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
15360       expressionS *exp = xmalloc (sizeof (expressionS));
15361
15362       obj->size = exp;
15363       exp->X_op = O_subtract;
15364       exp->X_add_symbol = symbol_temp_new_now ();
15365       exp->X_op_symbol = p;
15366       exp->X_add_number = 0;
15367
15368       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
15369     }
15370
15371   /* Generate a .pdr section.  */
15372   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
15373     {
15374       segT saved_seg = now_seg;
15375       subsegT saved_subseg = now_subseg;
15376       expressionS exp;
15377       char *fragp;
15378
15379 #ifdef md_flush_pending_output
15380       md_flush_pending_output ();
15381 #endif
15382
15383       gas_assert (pdr_seg);
15384       subseg_set (pdr_seg, 0);
15385
15386       /* Write the symbol.  */
15387       exp.X_op = O_symbol;
15388       exp.X_add_symbol = p;
15389       exp.X_add_number = 0;
15390       emit_expr (&exp, 4);
15391
15392       fragp = frag_more (7 * 4);
15393
15394       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
15395       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
15396       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
15397       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
15398       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
15399       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
15400       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
15401
15402       subseg_set (saved_seg, saved_subseg);
15403     }
15404 #endif /* OBJ_ELF */
15405
15406   cur_proc_ptr = NULL;
15407 }
15408
15409 /* The .aent and .ent directives.  */
15410
15411 static void
15412 s_mips_ent (int aent)
15413 {
15414   symbolS *symbolP;
15415
15416   symbolP = get_symbol ();
15417   if (*input_line_pointer == ',')
15418     ++input_line_pointer;
15419   SKIP_WHITESPACE ();
15420   if (ISDIGIT (*input_line_pointer)
15421       || *input_line_pointer == '-')
15422     get_number ();
15423
15424   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15425     as_warn (_(".ent or .aent not in text section."));
15426
15427   if (!aent && cur_proc_ptr)
15428     as_warn (_("missing .end"));
15429
15430   if (!aent)
15431     {
15432       /* This function needs its own .frame and .cprestore directives.  */
15433       mips_frame_reg_valid = 0;
15434       mips_cprestore_valid = 0;
15435
15436       cur_proc_ptr = &cur_proc;
15437       memset (cur_proc_ptr, '\0', sizeof (procS));
15438
15439       cur_proc_ptr->func_sym = symbolP;
15440
15441       ++numprocs;
15442
15443       if (debug_type == DEBUG_STABS)
15444         stabs_generate_asm_func (S_GET_NAME (symbolP),
15445                                  S_GET_NAME (symbolP));
15446     }
15447
15448   symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
15449
15450   demand_empty_rest_of_line ();
15451 }
15452
15453 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
15454    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
15455    s_mips_frame is used so that we can set the PDR information correctly.
15456    We can't use the ecoff routines because they make reference to the ecoff
15457    symbol table (in the mdebug section).  */
15458
15459 static void
15460 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
15461 {
15462 #ifdef OBJ_ELF
15463   if (IS_ELF && !ECOFF_DEBUGGING)
15464     {
15465       long val;
15466
15467       if (cur_proc_ptr == (procS *) NULL)
15468         {
15469           as_warn (_(".frame outside of .ent"));
15470           demand_empty_rest_of_line ();
15471           return;
15472         }
15473
15474       cur_proc_ptr->frame_reg = tc_get_register (1);
15475
15476       SKIP_WHITESPACE ();
15477       if (*input_line_pointer++ != ','
15478           || get_absolute_expression_and_terminator (&val) != ',')
15479         {
15480           as_warn (_("Bad .frame directive"));
15481           --input_line_pointer;
15482           demand_empty_rest_of_line ();
15483           return;
15484         }
15485
15486       cur_proc_ptr->frame_offset = val;
15487       cur_proc_ptr->pc_reg = tc_get_register (0);
15488
15489       demand_empty_rest_of_line ();
15490     }
15491   else
15492 #endif /* OBJ_ELF */
15493     s_ignore (ignore);
15494 }
15495
15496 /* The .fmask and .mask directives. If the mdebug section is present
15497    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
15498    embedded targets, s_mips_mask is used so that we can set the PDR
15499    information correctly. We can't use the ecoff routines because they
15500    make reference to the ecoff symbol table (in the mdebug section).  */
15501
15502 static void
15503 s_mips_mask (int reg_type)
15504 {
15505 #ifdef OBJ_ELF
15506   if (IS_ELF && !ECOFF_DEBUGGING)
15507     {
15508       long mask, off;
15509
15510       if (cur_proc_ptr == (procS *) NULL)
15511         {
15512           as_warn (_(".mask/.fmask outside of .ent"));
15513           demand_empty_rest_of_line ();
15514           return;
15515         }
15516
15517       if (get_absolute_expression_and_terminator (&mask) != ',')
15518         {
15519           as_warn (_("Bad .mask/.fmask directive"));
15520           --input_line_pointer;
15521           demand_empty_rest_of_line ();
15522           return;
15523         }
15524
15525       off = get_absolute_expression ();
15526
15527       if (reg_type == 'F')
15528         {
15529           cur_proc_ptr->fpreg_mask = mask;
15530           cur_proc_ptr->fpreg_offset = off;
15531         }
15532       else
15533         {
15534           cur_proc_ptr->reg_mask = mask;
15535           cur_proc_ptr->reg_offset = off;
15536         }
15537
15538       demand_empty_rest_of_line ();
15539     }
15540   else
15541 #endif /* OBJ_ELF */
15542     s_ignore (reg_type);
15543 }
15544
15545 /* A table describing all the processors gas knows about.  Names are
15546    matched in the order listed.
15547
15548    To ease comparison, please keep this table in the same order as
15549    gcc's mips_cpu_info_table[].  */
15550 static const struct mips_cpu_info mips_cpu_info_table[] =
15551 {
15552   /* Entries for generic ISAs */
15553   { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
15554   { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
15555   { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
15556   { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
15557   { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
15558   { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
15559   { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
15560   { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
15561   { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
15562
15563   /* MIPS I */
15564   { "r3000",          0,                        ISA_MIPS1,      CPU_R3000 },
15565   { "r2000",          0,                        ISA_MIPS1,      CPU_R3000 },
15566   { "r3900",          0,                        ISA_MIPS1,      CPU_R3900 },
15567
15568   /* MIPS II */
15569   { "r6000",          0,                        ISA_MIPS2,      CPU_R6000 },
15570
15571   /* MIPS III */
15572   { "r4000",          0,                        ISA_MIPS3,      CPU_R4000 },
15573   { "r4010",          0,                        ISA_MIPS2,      CPU_R4010 },
15574   { "vr4100",         0,                        ISA_MIPS3,      CPU_VR4100 },
15575   { "vr4111",         0,                        ISA_MIPS3,      CPU_R4111 },
15576   { "vr4120",         0,                        ISA_MIPS3,      CPU_VR4120 },
15577   { "vr4130",         0,                        ISA_MIPS3,      CPU_VR4120 },
15578   { "vr4181",         0,                        ISA_MIPS3,      CPU_R4111 },
15579   { "vr4300",         0,                        ISA_MIPS3,      CPU_R4300 },
15580   { "r4400",          0,                        ISA_MIPS3,      CPU_R4400 },
15581   { "r4600",          0,                        ISA_MIPS3,      CPU_R4600 },
15582   { "orion",          0,                        ISA_MIPS3,      CPU_R4600 },
15583   { "r4650",          0,                        ISA_MIPS3,      CPU_R4650 },
15584   /* ST Microelectronics Loongson 2E and 2F cores */
15585   { "loongson2e",     0,                        ISA_MIPS3,   CPU_LOONGSON_2E },
15586   { "loongson2f",     0,                        ISA_MIPS3,   CPU_LOONGSON_2F },
15587
15588   /* MIPS IV */
15589   { "r8000",          0,                        ISA_MIPS4,      CPU_R8000 },
15590   { "r10000",         0,                        ISA_MIPS4,      CPU_R10000 },
15591   { "r12000",         0,                        ISA_MIPS4,      CPU_R12000 },
15592   { "r14000",         0,                        ISA_MIPS4,      CPU_R14000 },
15593   { "r16000",         0,                        ISA_MIPS4,      CPU_R16000 },
15594   { "vr5000",         0,                        ISA_MIPS4,      CPU_R5000 },
15595   { "vr5400",         0,                        ISA_MIPS4,      CPU_VR5400 },
15596   { "vr5500",         0,                        ISA_MIPS4,      CPU_VR5500 },
15597   { "rm5200",         0,                        ISA_MIPS4,      CPU_R5000 },
15598   { "rm5230",         0,                        ISA_MIPS4,      CPU_R5000 },
15599   { "rm5231",         0,                        ISA_MIPS4,      CPU_R5000 },
15600   { "rm5261",         0,                        ISA_MIPS4,      CPU_R5000 },
15601   { "rm5721",         0,                        ISA_MIPS4,      CPU_R5000 },
15602   { "rm7000",         0,                        ISA_MIPS4,      CPU_RM7000 },
15603   { "rm9000",         0,                        ISA_MIPS4,      CPU_RM9000 },
15604
15605   /* MIPS 32 */
15606   { "4kc",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15607   { "4km",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15608   { "4kp",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15609   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
15610
15611   /* MIPS 32 Release 2 */
15612   { "4kec",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15613   { "4kem",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15614   { "4kep",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15615   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
15616   { "m4k",            0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15617   { "m4kp",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15618   { "24kc",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15619   { "24kf2_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15620   { "24kf",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15621   { "24kf1_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15622   /* Deprecated forms of the above.  */
15623   { "24kfx",          0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15624   { "24kx",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15625   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
15626   { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15627   { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15628   { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15629   { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15630   /* Deprecated forms of the above.  */
15631   { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15632   { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15633   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
15634   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15635                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15636   { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15637                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15638   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15639                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15640   { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15641                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15642   /* Deprecated forms of the above.  */
15643   { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15644                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15645   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15646                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15647   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
15648   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15649                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15650   { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15651                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15652   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15653                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15654   { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15655                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15656   { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15657                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15658   /* Deprecated forms of the above.  */
15659   { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15660                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15661   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15662                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15663   /* 1004K cores are multiprocessor versions of the 34K.  */
15664   { "1004kc",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15665                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15666   { "1004kf2_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15667                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15668   { "1004kf",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15669                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15670   { "1004kf1_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15671                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15672
15673   /* MIPS 64 */
15674   { "5kc",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15675   { "5kf",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15676   { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15677   { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15678
15679   /* Broadcom SB-1 CPU core */
15680   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15681                                                 ISA_MIPS64,     CPU_SB1 },
15682   /* Broadcom SB-1A CPU core */
15683   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15684                                                 ISA_MIPS64,     CPU_SB1 },
15685   
15686   { "loongson3a",     0,                        ISA_MIPS64,     CPU_LOONGSON_3A },
15687
15688   /* MIPS 64 Release 2 */
15689
15690   /* Cavium Networks Octeon CPU core */
15691   { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
15692
15693   /* RMI Xlr */
15694   { "xlr",            0,      ISA_MIPS64,     CPU_XLR },
15695
15696   /* End marker */
15697   { NULL, 0, 0, 0 }
15698 };
15699
15700
15701 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15702    with a final "000" replaced by "k".  Ignore case.
15703
15704    Note: this function is shared between GCC and GAS.  */
15705
15706 static bfd_boolean
15707 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15708 {
15709   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15710     given++, canonical++;
15711
15712   return ((*given == 0 && *canonical == 0)
15713           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15714 }
15715
15716
15717 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15718    CPU name.  We've traditionally allowed a lot of variation here.
15719
15720    Note: this function is shared between GCC and GAS.  */
15721
15722 static bfd_boolean
15723 mips_matching_cpu_name_p (const char *canonical, const char *given)
15724 {
15725   /* First see if the name matches exactly, or with a final "000"
15726      turned into "k".  */
15727   if (mips_strict_matching_cpu_name_p (canonical, given))
15728     return TRUE;
15729
15730   /* If not, try comparing based on numerical designation alone.
15731      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
15732   if (TOLOWER (*given) == 'r')
15733     given++;
15734   if (!ISDIGIT (*given))
15735     return FALSE;
15736
15737   /* Skip over some well-known prefixes in the canonical name,
15738      hoping to find a number there too.  */
15739   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15740     canonical += 2;
15741   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15742     canonical += 2;
15743   else if (TOLOWER (canonical[0]) == 'r')
15744     canonical += 1;
15745
15746   return mips_strict_matching_cpu_name_p (canonical, given);
15747 }
15748
15749
15750 /* Parse an option that takes the name of a processor as its argument.
15751    OPTION is the name of the option and CPU_STRING is the argument.
15752    Return the corresponding processor enumeration if the CPU_STRING is
15753    recognized, otherwise report an error and return null.
15754
15755    A similar function exists in GCC.  */
15756
15757 static const struct mips_cpu_info *
15758 mips_parse_cpu (const char *option, const char *cpu_string)
15759 {
15760   const struct mips_cpu_info *p;
15761
15762   /* 'from-abi' selects the most compatible architecture for the given
15763      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
15764      EABIs, we have to decide whether we're using the 32-bit or 64-bit
15765      version.  Look first at the -mgp options, if given, otherwise base
15766      the choice on MIPS_DEFAULT_64BIT.
15767
15768      Treat NO_ABI like the EABIs.  One reason to do this is that the
15769      plain 'mips' and 'mips64' configs have 'from-abi' as their default
15770      architecture.  This code picks MIPS I for 'mips' and MIPS III for
15771      'mips64', just as we did in the days before 'from-abi'.  */
15772   if (strcasecmp (cpu_string, "from-abi") == 0)
15773     {
15774       if (ABI_NEEDS_32BIT_REGS (mips_abi))
15775         return mips_cpu_info_from_isa (ISA_MIPS1);
15776
15777       if (ABI_NEEDS_64BIT_REGS (mips_abi))
15778         return mips_cpu_info_from_isa (ISA_MIPS3);
15779
15780       if (file_mips_gp32 >= 0)
15781         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15782
15783       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15784                                      ? ISA_MIPS3
15785                                      : ISA_MIPS1);
15786     }
15787
15788   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
15789   if (strcasecmp (cpu_string, "default") == 0)
15790     return 0;
15791
15792   for (p = mips_cpu_info_table; p->name != 0; p++)
15793     if (mips_matching_cpu_name_p (p->name, cpu_string))
15794       return p;
15795
15796   as_bad (_("Bad value (%s) for %s"), cpu_string, option);
15797   return 0;
15798 }
15799
15800 /* Return the canonical processor information for ISA (a member of the
15801    ISA_MIPS* enumeration).  */
15802
15803 static const struct mips_cpu_info *
15804 mips_cpu_info_from_isa (int isa)
15805 {
15806   int i;
15807
15808   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15809     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
15810         && isa == mips_cpu_info_table[i].isa)
15811       return (&mips_cpu_info_table[i]);
15812
15813   return NULL;
15814 }
15815
15816 static const struct mips_cpu_info *
15817 mips_cpu_info_from_arch (int arch)
15818 {
15819   int i;
15820
15821   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15822     if (arch == mips_cpu_info_table[i].cpu)
15823       return (&mips_cpu_info_table[i]);
15824
15825   return NULL;
15826 }
15827 \f
15828 static void
15829 show (FILE *stream, const char *string, int *col_p, int *first_p)
15830 {
15831   if (*first_p)
15832     {
15833       fprintf (stream, "%24s", "");
15834       *col_p = 24;
15835     }
15836   else
15837     {
15838       fprintf (stream, ", ");
15839       *col_p += 2;
15840     }
15841
15842   if (*col_p + strlen (string) > 72)
15843     {
15844       fprintf (stream, "\n%24s", "");
15845       *col_p = 24;
15846     }
15847
15848   fprintf (stream, "%s", string);
15849   *col_p += strlen (string);
15850
15851   *first_p = 0;
15852 }
15853
15854 void
15855 md_show_usage (FILE *stream)
15856 {
15857   int column, first;
15858   size_t i;
15859
15860   fprintf (stream, _("\
15861 MIPS options:\n\
15862 -EB                     generate big endian output\n\
15863 -EL                     generate little endian output\n\
15864 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
15865 -G NUM                  allow referencing objects up to NUM bytes\n\
15866                         implicitly with the gp register [default 8]\n"));
15867   fprintf (stream, _("\
15868 -mips1                  generate MIPS ISA I instructions\n\
15869 -mips2                  generate MIPS ISA II instructions\n\
15870 -mips3                  generate MIPS ISA III instructions\n\
15871 -mips4                  generate MIPS ISA IV instructions\n\
15872 -mips5                  generate MIPS ISA V instructions\n\
15873 -mips32                 generate MIPS32 ISA instructions\n\
15874 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
15875 -mips64                 generate MIPS64 ISA instructions\n\
15876 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
15877 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
15878
15879   first = 1;
15880
15881   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15882     show (stream, mips_cpu_info_table[i].name, &column, &first);
15883   show (stream, "from-abi", &column, &first);
15884   fputc ('\n', stream);
15885
15886   fprintf (stream, _("\
15887 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15888 -no-mCPU                don't generate code specific to CPU.\n\
15889                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
15890
15891   first = 1;
15892
15893   show (stream, "3900", &column, &first);
15894   show (stream, "4010", &column, &first);
15895   show (stream, "4100", &column, &first);
15896   show (stream, "4650", &column, &first);
15897   fputc ('\n', stream);
15898
15899   fprintf (stream, _("\
15900 -mips16                 generate mips16 instructions\n\
15901 -no-mips16              do not generate mips16 instructions\n"));
15902   fprintf (stream, _("\
15903 -msmartmips             generate smartmips instructions\n\
15904 -mno-smartmips          do not generate smartmips instructions\n"));  
15905   fprintf (stream, _("\
15906 -mdsp                   generate DSP instructions\n\
15907 -mno-dsp                do not generate DSP instructions\n"));
15908   fprintf (stream, _("\
15909 -mdspr2                 generate DSP R2 instructions\n\
15910 -mno-dspr2              do not generate DSP R2 instructions\n"));
15911   fprintf (stream, _("\
15912 -mmt                    generate MT instructions\n\
15913 -mno-mt                 do not generate MT instructions\n"));
15914   fprintf (stream, _("\
15915 -mfix-loongson2f-jump   work around Loongson2F JUMP instructions\n\
15916 -mfix-loongson2f-nop    work around Loongson2F NOP errata\n\
15917 -mfix-vr4120            work around certain VR4120 errata\n\
15918 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
15919 -mfix-24k               insert a nop after ERET and DERET instructions\n\
15920 -mfix-cn63xxp1          work around CN63XXP1 PREF errata\n\
15921 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
15922 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
15923 -msym32                 assume all symbols have 32-bit values\n\
15924 -O0                     remove unneeded NOPs, do not swap branches\n\
15925 -O                      remove unneeded NOPs and swap branches\n\
15926 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
15927 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
15928   fprintf (stream, _("\
15929 -mhard-float            allow floating-point instructions\n\
15930 -msoft-float            do not allow floating-point instructions\n\
15931 -msingle-float          only allow 32-bit floating-point operations\n\
15932 -mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
15933 --[no-]construct-floats [dis]allow floating point values to be constructed\n"
15934                      ));
15935 #ifdef OBJ_ELF
15936   fprintf (stream, _("\
15937 -KPIC, -call_shared     generate SVR4 position independent code\n\
15938 -call_nonpic            generate non-PIC code that can operate with DSOs\n\
15939 -mvxworks-pic           generate VxWorks position independent code\n\
15940 -non_shared             do not generate code that can operate with DSOs\n\
15941 -xgot                   assume a 32 bit GOT\n\
15942 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
15943 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
15944                         position dependent (non shared) code\n\
15945 -mabi=ABI               create ABI conformant object file for:\n"));
15946
15947   first = 1;
15948
15949   show (stream, "32", &column, &first);
15950   show (stream, "o64", &column, &first);
15951   show (stream, "n32", &column, &first);
15952   show (stream, "64", &column, &first);
15953   show (stream, "eabi", &column, &first);
15954
15955   fputc ('\n', stream);
15956
15957   fprintf (stream, _("\
15958 -32                     create o32 ABI object file (default)\n\
15959 -n32                    create n32 ABI object file\n\
15960 -64                     create 64 ABI object file\n"));
15961 #endif
15962 }
15963
15964 #ifdef TE_IRIX
15965 enum dwarf2_format
15966 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
15967 {
15968   if (HAVE_64BIT_SYMBOLS)
15969     return dwarf2_format_64bit_irix;
15970   else
15971     return dwarf2_format_32bit;
15972 }
15973 #endif
15974
15975 int
15976 mips_dwarf2_addr_size (void)
15977 {
15978   if (HAVE_64BIT_OBJECTS)
15979     return 8;
15980   else
15981     return 4;
15982 }
15983
15984 /* Standard calling conventions leave the CFA at SP on entry.  */
15985 void
15986 mips_cfi_frame_initial_instructions (void)
15987 {
15988   cfi_add_CFA_def_cfa_register (SP);
15989 }
15990
15991 int
15992 tc_mips_regname_to_dw2regnum (char *regname)
15993 {
15994   unsigned int regnum = -1;
15995   unsigned int reg;
15996
15997   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15998     regnum = reg;
15999
16000   return regnum;
16001 }