]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/binutils/gas/config/tc-mips.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / binutils / 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 Free Software Foundation, Inc.
4    Contributed by the OSF and Ralph Campbell.
5    Written by Keith Knowles and Ralph Campbell, working independently.
6    Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
7    Support.
8
9    This file is part of GAS.
10
11    GAS is free software; you can redistribute it and/or modify
12    it under the terms of the GNU General Public License as published by
13    the Free Software Foundation; either version 2, or (at your option)
14    any later version.
15
16    GAS is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19    GNU General Public License for more details.
20
21    You should have received a copy of the GNU General Public License
22    along with GAS; see the file COPYING.  If not, write to the Free
23    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
24    02110-1301, USA.  */
25
26 #include "as.h"
27 #include "config.h"
28 #include "subsegs.h"
29 #include "safe-ctype.h"
30
31 #include "opcode/mips.h"
32 #include "itbl-ops.h"
33 #include "dwarf2dbg.h"
34 #include "dw2gencfi.h"
35
36 #ifdef DEBUG
37 #define DBG(x) printf x
38 #else
39 #define DBG(x)
40 #endif
41
42 #ifdef OBJ_MAYBE_ELF
43 /* Clean up namespace so we can include obj-elf.h too.  */
44 static int mips_output_flavor (void);
45 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
46 #undef OBJ_PROCESS_STAB
47 #undef OUTPUT_FLAVOR
48 #undef S_GET_ALIGN
49 #undef S_GET_SIZE
50 #undef S_SET_ALIGN
51 #undef S_SET_SIZE
52 #undef obj_frob_file
53 #undef obj_frob_file_after_relocs
54 #undef obj_frob_symbol
55 #undef obj_pop_insert
56 #undef obj_sec_sym_ok_for_reloc
57 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
58
59 #include "obj-elf.h"
60 /* Fix any of them that we actually care about.  */
61 #undef OUTPUT_FLAVOR
62 #define OUTPUT_FLAVOR mips_output_flavor()
63 #endif
64
65 #if defined (OBJ_ELF)
66 #include "elf/mips.h"
67 #endif
68
69 #ifndef ECOFF_DEBUGGING
70 #define NO_ECOFF_DEBUGGING
71 #define ECOFF_DEBUGGING 0
72 #endif
73
74 int mips_flag_mdebug = -1;
75
76 /* Control generation of .pdr sections.  Off by default on IRIX: the native
77    linker doesn't know about and discards them, but relocations against them
78    remain, leading to rld crashes.  */
79 #ifdef TE_IRIX
80 int mips_flag_pdr = FALSE;
81 #else
82 int mips_flag_pdr = TRUE;
83 #endif
84
85 /* Control generation of error message for unsupported instructions in
86    Octeon. Octeon does not have floating point, and all the instructions
87    that use floating point registers are not allowed in Elf targets but 
88    are allowed in Linux targets by default.  */
89 #ifdef OCTEON_ERROR_ON_UNSUPPORTED
90 static int octeon_error_on_unsupported = 1;
91 #else
92 static int octeon_error_on_unsupported = 0;
93 #endif
94
95 /* Control generation of Octeon/MIPS unaligned load/store instructions.
96    For ELF target, default to Octeon load/store instructions.
97    For Linux target, default to MIPS load/store instructions.  */
98 #ifdef OCTEON_USE_UNALIGN
99 static int octeon_use_unalign = 1;
100 #else
101 static int octeon_use_unalign = 0;
102 #endif
103
104 #include "ecoff.h"
105
106 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
107 static char *mips_regmask_frag;
108 #endif
109
110 #define ZERO 0
111 #define AT  1
112 #define TREG 24
113 #define PIC_CALL_REG 25
114 #define KT0 26
115 #define KT1 27
116 #define GP  28
117 #define SP  29
118 #define FP  30
119 #define RA  31
120
121 #define ILLEGAL_REG (32)
122
123 /* Allow override of standard little-endian ECOFF format.  */
124
125 #ifndef ECOFF_LITTLE_FORMAT
126 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
127 #endif
128
129 extern int target_big_endian;
130
131 /* The name of the readonly data section.  */
132 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
133                             ? ".rdata" \
134                             : OUTPUT_FLAVOR == bfd_target_coff_flavour \
135                             ? ".rdata" \
136                             : OUTPUT_FLAVOR == bfd_target_elf_flavour \
137                             ? ".rodata" \
138                             : (abort (), ""))
139
140 /* Information about an instruction, including its format, operands
141    and fixups.  */
142 struct mips_cl_insn
143 {
144   /* The opcode's entry in mips_opcodes or mips16_opcodes.  */
145   const struct mips_opcode *insn_mo;
146
147   /* True if this is a mips16 instruction and if we want the extended
148      form of INSN_MO.  */
149   bfd_boolean use_extend;
150
151   /* The 16-bit extension instruction to use when USE_EXTEND is true.  */
152   unsigned short extend;
153
154   /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
155      a copy of INSN_MO->match with the operands filled in.  */
156   unsigned long insn_opcode;
157
158   /* The frag that contains the instruction.  */
159   struct frag *frag;
160
161   /* The offset into FRAG of the first instruction byte.  */
162   long where;
163
164   /* The relocs associated with the instruction, if any.  */
165   fixS *fixp[3];
166
167   /* True if this entry cannot be moved from its current position.  */
168   unsigned int fixed_p : 1;
169
170   /* True if this instruction occurred in a .set noreorder block.  */
171   unsigned int noreorder_p : 1;
172
173   /* True for mips16 instructions that jump to an absolute address.  */
174   unsigned int mips16_absolute_jump_p : 1;
175 };
176
177 /* The ABI to use.  */
178 enum mips_abi_level
179 {
180   NO_ABI = 0,
181   O32_ABI,
182   O64_ABI,
183   N32_ABI,
184   N64_ABI,
185   EABI_ABI
186 };
187
188 /* MIPS ABI we are using for this output file.  */
189 static enum mips_abi_level mips_abi = NO_ABI;
190
191 /* Whether or not we have code that can call pic code.  */
192 int mips_abicalls = FALSE;
193
194 /* Whether or not we have code which can be put into a shared
195    library.  */
196 static bfd_boolean mips_in_shared = TRUE;
197
198 /* This is the set of options which may be modified by the .set
199    pseudo-op.  We use a struct so that .set push and .set pop are more
200    reliable.  */
201
202 struct mips_set_options
203 {
204   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
205      if it has not been initialized.  Changed by `.set mipsN', and the
206      -mipsN command line option, and the default CPU.  */
207   int isa;
208   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
209      if they have not been initialized.  Changed by `.set <asename>', by
210      command line options, and based on the default architecture.  */
211   int ase_mips3d;
212   int ase_mdmx;
213   int ase_smartmips;
214   int ase_dsp;
215   int ase_dspr2;
216   int ase_mt;
217   /* Whether we are assembling for the mips16 processor.  0 if we are
218      not, 1 if we are, and -1 if the value has not been initialized.
219      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
220      -nomips16 command line options, and the default CPU.  */
221   int mips16;
222   /* Non-zero if we should not reorder instructions.  Changed by `.set
223      reorder' and `.set noreorder'.  */
224   int noreorder;
225   /* Non-zero if we should not permit the $at ($1) register to be used
226      in instructions.  Changed by `.set at' and `.set noat'.  */
227   int noat;
228   /* Non-zero if we should warn when a macro instruction expands into
229      more than one machine instruction.  Changed by `.set nomacro' and
230      `.set macro'.  */
231   int warn_about_macros;
232   /* Non-zero if we should not move instructions.  Changed by `.set
233      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
234   int nomove;
235   /* Non-zero if we should not optimize branches by moving the target
236      of the branch into the delay slot.  Actually, we don't perform
237      this optimization anyhow.  Changed by `.set bopt' and `.set
238      nobopt'.  */
239   int nobopt;
240   /* Non-zero if we should not autoextend mips16 instructions.
241      Changed by `.set autoextend' and `.set noautoextend'.  */
242   int noautoextend;
243   /* Restrict general purpose registers and floating point registers
244      to 32 bit.  This is initially determined when -mgp32 or -mfp32
245      is passed but can changed if the assembler code uses .set mipsN.  */
246   int gp32;
247   int fp32;
248   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
249      command line option, and the default CPU.  */
250   int arch;
251   /* True if ".set sym32" is in effect.  */
252   bfd_boolean sym32;
253 };
254
255 /* True if -mgp32 was passed.  */
256 static int file_mips_gp32 = -1;
257
258 /* True if -mfp32 was passed.  */
259 static int file_mips_fp32 = -1;
260
261 /* This is the struct we use to hold the current set of options.  Note
262    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
263    -1 to indicate that they have not been initialized.  */
264
265 static struct mips_set_options mips_opts =
266 {
267   ISA_UNKNOWN, -1, -1, 0, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, CPU_UNKNOWN, FALSE
268 };
269
270 /* These variables are filled in with the masks of registers used.
271    The object format code reads them and puts them in the appropriate
272    place.  */
273 unsigned long mips_gprmask;
274 unsigned long mips_cprmask[4];
275
276 /* MIPS ISA we are using for this output file.  */
277 static int file_mips_isa = ISA_UNKNOWN;
278
279 /* True if -mips16 was passed or implied by arguments passed on the
280    command line (e.g., by -march).  */
281 static int file_ase_mips16;
282
283 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
284                               || mips_opts.isa == ISA_MIPS32R2          \
285                               || mips_opts.isa == ISA_MIPS64            \
286                               || mips_opts.isa == ISA_MIPS64R2)
287
288 /* True if -mips3d was passed or implied by arguments passed on the
289    command line (e.g., by -march).  */
290 static int file_ase_mips3d;
291
292 /* True if -mdmx was passed or implied by arguments passed on the
293    command line (e.g., by -march).  */
294 static int file_ase_mdmx;
295
296 /* True if -msmartmips was passed or implied by arguments passed on the
297    command line (e.g., by -march).  */
298 static int file_ase_smartmips;
299
300 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32             \
301                                 || mips_opts.isa == ISA_MIPS32R2)
302
303 /* True if -mdsp was passed or implied by arguments passed on the
304    command line (e.g., by -march).  */
305 static int file_ase_dsp;
306
307 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2             \
308                               || mips_opts.isa == ISA_MIPS64R2)
309
310 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
311
312 /* True if -mdspr2 was passed or implied by arguments passed on the
313    command line (e.g., by -march).  */
314 static int file_ase_dspr2;
315
316 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
317                                 || mips_opts.isa == ISA_MIPS64R2)
318
319 /* True if -mmt was passed or implied by arguments passed on the
320    command line (e.g., by -march).  */
321 static int file_ase_mt;
322
323 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
324                              || mips_opts.isa == ISA_MIPS64R2)
325
326 /* The argument of the -march= flag.  The architecture we are assembling.  */
327 static int file_mips_arch = CPU_UNKNOWN;
328 static const char *mips_arch_string;
329
330 /* The argument of the -mtune= flag.  The architecture for which we
331    are optimizing.  */
332 static int mips_tune = CPU_UNKNOWN;
333 static const char *mips_tune_string;
334
335 /* True when generating 32-bit code for a 64-bit processor.  */
336 static int mips_32bitmode = 0;
337
338 /* True if the given ABI requires 32-bit registers.  */
339 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
340
341 /* Likewise 64-bit registers.  */
342 #define ABI_NEEDS_64BIT_REGS(ABI)       \
343   ((ABI) == N32_ABI                     \
344    || (ABI) == N64_ABI                  \
345    || (ABI) == O64_ABI)
346
347 /*  Return true if ISA supports 64 bit wide gp registers.  */
348 #define ISA_HAS_64BIT_REGS(ISA)         \
349   ((ISA) == ISA_MIPS3                   \
350    || (ISA) == ISA_MIPS4                \
351    || (ISA) == ISA_MIPS5                \
352    || (ISA) == ISA_MIPS64               \
353    || (ISA) == ISA_MIPS64R2)
354
355 /*  Return true if ISA supports 64 bit wide float registers.  */
356 #define ISA_HAS_64BIT_FPRS(ISA)         \
357   ((ISA) == ISA_MIPS3                   \
358    || (ISA) == ISA_MIPS4                \
359    || (ISA) == ISA_MIPS5                \
360    || (ISA) == ISA_MIPS32R2             \
361    || (ISA) == ISA_MIPS64               \
362    || (ISA) == ISA_MIPS64R2)
363
364 /* Return true if ISA supports 64-bit right rotate (dror et al.)
365    instructions.  */
366 #define ISA_HAS_DROR(ISA)               \
367   ((ISA) == ISA_MIPS64R2)
368
369 /* Return true if ISA supports 32-bit right rotate (ror et al.)
370    instructions.  */
371 #define ISA_HAS_ROR(ISA)                \
372   ((ISA) == ISA_MIPS32R2                \
373    || (ISA) == ISA_MIPS64R2             \
374    || mips_opts.ase_smartmips)
375
376 /* Return true if ISA supports ins instructions. */
377 #define ISA_HAS_INS(ISA)                \
378   ((ISA) == ISA_MIPS32R2                \
379   || (ISA) == ISA_MIPS64R2)
380
381 /* Return true if ISA supports single-precision floats in odd registers.  */
382 #define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
383   ((ISA) == ISA_MIPS32                  \
384    || (ISA) == ISA_MIPS32R2             \
385    || (ISA) == ISA_MIPS64               \
386    || (ISA) == ISA_MIPS64R2)
387
388 /* Return true if ISA supports move to/from high part of a 64-bit
389    floating-point register. */
390 #define ISA_HAS_MXHC1(ISA)              \
391   ((ISA) == ISA_MIPS32R2                \
392    || (ISA) == ISA_MIPS64R2)
393
394 #define HAVE_32BIT_GPRS                            \
395     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
396
397 #define HAVE_32BIT_FPRS                            \
398     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
399
400 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
401 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
402
403 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
404
405 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
406
407 /* True if relocations are stored in-place.  */
408 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
409
410 /* The ABI-derived address size.  */
411 #define HAVE_64BIT_ADDRESSES \
412   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
413 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
414
415 /* The size of symbolic constants (i.e., expressions of the form
416    "SYMBOL" or "SYMBOL + OFFSET").  */
417 #define HAVE_32BIT_SYMBOLS \
418   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
419 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
420
421 /* Addresses are loaded in different ways, depending on the address size
422    in use.  The n32 ABI Documentation also mandates the use of additions
423    with overflow checking, but existing implementations don't follow it.  */
424 #define ADDRESS_ADD_INSN                                                \
425    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
426
427 #define ADDRESS_ADDI_INSN                                               \
428    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
429
430 #define ADDRESS_LOAD_INSN                                               \
431    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
432
433 #define ADDRESS_STORE_INSN                                              \
434    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
435
436 /* Return true if the given CPU supports the MIPS16 ASE.  */
437 #define CPU_HAS_MIPS16(cpu)                                             \
438    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
439     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
440
441 /* True if CPU has a dror instruction.  */
442 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
443
444 /* True if CPU has a ror instruction.  */
445 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
446
447 /* True if mflo and mfhi can be immediately followed by instructions
448    which write to the HI and LO registers.
449
450    According to MIPS specifications, MIPS ISAs I, II, and III need
451    (at least) two instructions between the reads of HI/LO and
452    instructions which write them, and later ISAs do not.  Contradicting
453    the MIPS specifications, some MIPS IV processor user manuals (e.g.
454    the UM for the NEC Vr5000) document needing the instructions between
455    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
456    MIPS64 and later ISAs to have the interlocks, plus any specific
457    earlier-ISA CPUs for which CPU documentation declares that the
458    instructions are really interlocked.  */
459 #define hilo_interlocks \
460   (mips_opts.isa == ISA_MIPS32                        \
461    || mips_opts.isa == ISA_MIPS32R2                   \
462    || mips_opts.isa == ISA_MIPS64                     \
463    || mips_opts.isa == ISA_MIPS64R2                   \
464    || mips_opts.arch == CPU_R4010                     \
465    || mips_opts.arch == CPU_R10000                    \
466    || mips_opts.arch == CPU_R12000                    \
467    || mips_opts.arch == CPU_RM7000                    \
468    || mips_opts.arch == CPU_VR5500                    \
469    )
470
471 /* Whether the processor uses hardware interlocks to protect reads
472    from the GPRs after they are loaded from memory, and thus does not
473    require nops to be inserted.  This applies to instructions marked
474    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
475    level I.  */
476 #define gpr_interlocks \
477   (mips_opts.isa != ISA_MIPS1  \
478    || mips_opts.arch == CPU_R3900)
479
480 /* Whether the processor uses hardware interlocks to avoid delays
481    required by coprocessor instructions, and thus does not require
482    nops to be inserted.  This applies to instructions marked
483    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
484    between instructions marked INSN_WRITE_COND_CODE and ones marked
485    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
486    levels I, II, and III.  */
487 /* Itbl support may require additional care here.  */
488 #define cop_interlocks                                \
489   ((mips_opts.isa != ISA_MIPS1                        \
490     && mips_opts.isa != ISA_MIPS2                     \
491     && mips_opts.isa != ISA_MIPS3)                    \
492    || mips_opts.arch == CPU_R4300                     \
493    )
494
495 /* Whether the processor uses hardware interlocks to protect reads
496    from coprocessor registers after they are loaded from memory, and
497    thus does not require nops to be inserted.  This applies to
498    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
499    requires at MIPS ISA level I.  */
500 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
501
502 /* Is this a mfhi or mflo instruction?  */
503 #define MF_HILO_INSN(PINFO) \
504           ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
505
506 /* MIPS PIC level.  */
507
508 enum mips_pic_level mips_pic;
509
510 /* 1 if we should generate 32 bit offsets from the $gp register in
511    SVR4_PIC mode.  Currently has no meaning in other modes.  */
512 static int mips_big_got = 0;
513
514 /* 1 if trap instructions should used for overflow rather than break
515    instructions.  */
516 static int mips_trap = 0;
517
518 /* 1 if double width floating point constants should not be constructed
519    by assembling two single width halves into two single width floating
520    point registers which just happen to alias the double width destination
521    register.  On some architectures this aliasing can be disabled by a bit
522    in the status register, and the setting of this bit cannot be determined
523    automatically at assemble time.  */
524 static int mips_disable_float_construction;
525
526 /* Non-zero if any .set noreorder directives were used.  */
527
528 static int mips_any_noreorder;
529
530 /* Non-zero if nops should be inserted when the register referenced in
531    an mfhi/mflo instruction is read in the next two instructions.  */
532 static int mips_7000_hilo_fix;
533
534 /* The size of objects in the small data section.  */
535 static unsigned int g_switch_value = 8;
536 /* Whether the -G option was used.  */
537 static int g_switch_seen = 0;
538
539 #define N_RMASK 0xc4
540 #define N_VFP   0xd4
541
542 /* If we can determine in advance that GP optimization won't be
543    possible, we can skip the relaxation stuff that tries to produce
544    GP-relative references.  This makes delay slot optimization work
545    better.
546
547    This function can only provide a guess, but it seems to work for
548    gcc output.  It needs to guess right for gcc, otherwise gcc
549    will put what it thinks is a GP-relative instruction in a branch
550    delay slot.
551
552    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
553    fixed it for the non-PIC mode.  KR 95/04/07  */
554 static int nopic_need_relax (symbolS *, int);
555
556 /* handle of the OPCODE hash table */
557 static struct hash_control *op_hash = NULL;
558
559 /* The opcode hash table we use for the mips16.  */
560 static struct hash_control *mips16_op_hash = NULL;
561
562 /* This array holds the chars that always start a comment.  If the
563     pre-processor is disabled, these aren't very useful */
564 const char comment_chars[] = "#";
565
566 /* This array holds the chars that only start a comment at the beginning of
567    a line.  If the line seems to have the form '# 123 filename'
568    .line and .file directives will appear in the pre-processed output */
569 /* Note that input_file.c hand checks for '#' at the beginning of the
570    first line of the input file.  This is because the compiler outputs
571    #NO_APP at the beginning of its output.  */
572 /* Also note that C style comments are always supported.  */
573 const char line_comment_chars[] = "#";
574
575 /* This array holds machine specific line separator characters.  */
576 const char line_separator_chars[] = ";";
577
578 /* Chars that can be used to separate mant from exp in floating point nums */
579 const char EXP_CHARS[] = "eE";
580
581 /* Chars that mean this number is a floating point constant */
582 /* As in 0f12.456 */
583 /* or    0d1.2345e12 */
584 const char FLT_CHARS[] = "rRsSfFdDxXpP";
585
586 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
587    changed in read.c .  Ideally it shouldn't have to know about it at all,
588    but nothing is ideal around here.
589  */
590
591 static char *insn_error;
592
593 static int auto_align = 1;
594
595 /* When outputting SVR4 PIC code, the assembler needs to know the
596    offset in the stack frame from which to restore the $gp register.
597    This is set by the .cprestore pseudo-op, and saved in this
598    variable.  */
599 static offsetT mips_cprestore_offset = -1;
600
601 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
602    more optimizations, it can use a register value instead of a memory-saved
603    offset and even an other register than $gp as global pointer.  */
604 static offsetT mips_cpreturn_offset = -1;
605 static int mips_cpreturn_register = -1;
606 static int mips_gp_register = GP;
607 static int mips_gprel_offset = 0;
608
609 /* Whether mips_cprestore_offset has been set in the current function
610    (or whether it has already been warned about, if not).  */
611 static int mips_cprestore_valid = 0;
612
613 /* This is the register which holds the stack frame, as set by the
614    .frame pseudo-op.  This is needed to implement .cprestore.  */
615 static int mips_frame_reg = SP;
616
617 /* Whether mips_frame_reg has been set in the current function
618    (or whether it has already been warned about, if not).  */
619 static int mips_frame_reg_valid = 0;
620
621 /* To output NOP instructions correctly, we need to keep information
622    about the previous two instructions.  */
623
624 /* Whether we are optimizing.  The default value of 2 means to remove
625    unneeded NOPs and swap branch instructions when possible.  A value
626    of 1 means to not swap branches.  A value of 0 means to always
627    insert NOPs.  */
628 static int mips_optimize = 2;
629
630 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
631    equivalent to seeing no -g option at all.  */
632 static int mips_debug = 0;
633
634 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
635 #define MAX_VR4130_NOPS 4
636
637 /* The maximum number of NOPs needed to fill delay slots.  */
638 #define MAX_DELAY_NOPS 2
639
640 /* The maximum number of NOPs needed for any purpose.  */
641 #define MAX_NOPS 4
642
643 /* A list of previous instructions, with index 0 being the most recent.
644    We need to look back MAX_NOPS instructions when filling delay slots
645    or working around processor errata.  We need to look back one
646    instruction further if we're thinking about using history[0] to
647    fill a branch delay slot.  */
648 static struct mips_cl_insn history[1 + MAX_NOPS];
649
650 /* Nop instructions used by emit_nop.  */
651 static struct mips_cl_insn nop_insn, mips16_nop_insn;
652
653 /* The appropriate nop for the current mode.  */
654 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
655
656 /* If this is set, it points to a frag holding nop instructions which
657    were inserted before the start of a noreorder section.  If those
658    nops turn out to be unnecessary, the size of the frag can be
659    decreased.  */
660 static fragS *prev_nop_frag;
661
662 /* The number of nop instructions we created in prev_nop_frag.  */
663 static int prev_nop_frag_holds;
664
665 /* The number of nop instructions that we know we need in
666    prev_nop_frag.  */
667 static int prev_nop_frag_required;
668
669 /* The number of instructions we've seen since prev_nop_frag.  */
670 static int prev_nop_frag_since;
671
672 /* For ECOFF and ELF, relocations against symbols are done in two
673    parts, with a HI relocation and a LO relocation.  Each relocation
674    has only 16 bits of space to store an addend.  This means that in
675    order for the linker to handle carries correctly, it must be able
676    to locate both the HI and the LO relocation.  This means that the
677    relocations must appear in order in the relocation table.
678
679    In order to implement this, we keep track of each unmatched HI
680    relocation.  We then sort them so that they immediately precede the
681    corresponding LO relocation.  */
682
683 struct mips_hi_fixup
684 {
685   /* Next HI fixup.  */
686   struct mips_hi_fixup *next;
687   /* This fixup.  */
688   fixS *fixp;
689   /* The section this fixup is in.  */
690   segT seg;
691 };
692
693 /* The list of unmatched HI relocs.  */
694
695 static struct mips_hi_fixup *mips_hi_fixup_list;
696
697 /* The frag containing the last explicit relocation operator.
698    Null if explicit relocations have not been used.  */
699
700 static fragS *prev_reloc_op_frag;
701
702 /* Map normal MIPS register numbers to mips16 register numbers.  */
703
704 #define X ILLEGAL_REG
705 static const int mips32_to_16_reg_map[] =
706 {
707   X, X, 2, 3, 4, 5, 6, 7,
708   X, X, X, X, X, X, X, X,
709   0, 1, X, X, X, X, X, X,
710   X, X, X, X, X, X, X, X
711 };
712 #undef X
713
714 /* Map mips16 register numbers to normal MIPS register numbers.  */
715
716 static const unsigned int mips16_to_32_reg_map[] =
717 {
718   16, 17, 2, 3, 4, 5, 6, 7
719 };
720
721 /* Classifies the kind of instructions we're interested in when
722    implementing -mfix-vr4120.  */
723 enum fix_vr4120_class {
724   FIX_VR4120_MACC,
725   FIX_VR4120_DMACC,
726   FIX_VR4120_MULT,
727   FIX_VR4120_DMULT,
728   FIX_VR4120_DIV,
729   FIX_VR4120_MTHILO,
730   NUM_FIX_VR4120_CLASSES
731 };
732
733 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
734    there must be at least one other instruction between an instruction
735    of type X and an instruction of type Y.  */
736 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
737
738 /* True if -mfix-vr4120 is in force.  */
739 static int mips_fix_vr4120;
740
741 /* ...likewise -mfix-vr4130.  */
742 static int mips_fix_vr4130;
743
744 /* We don't relax branches by default, since this causes us to expand
745    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
746    fail to compute the offset before expanding the macro to the most
747    efficient expansion.  */
748
749 static int mips_relax_branch;
750 \f
751 /* The expansion of many macros depends on the type of symbol that
752    they refer to.  For example, when generating position-dependent code,
753    a macro that refers to a symbol may have two different expansions,
754    one which uses GP-relative addresses and one which uses absolute
755    addresses.  When generating SVR4-style PIC, a macro may have
756    different expansions for local and global symbols.
757
758    We handle these situations by generating both sequences and putting
759    them in variant frags.  In position-dependent code, the first sequence
760    will be the GP-relative one and the second sequence will be the
761    absolute one.  In SVR4 PIC, the first sequence will be for global
762    symbols and the second will be for local symbols.
763
764    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
765    SECOND are the lengths of the two sequences in bytes.  These fields
766    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
767    the subtype has the following flags:
768
769    RELAX_USE_SECOND
770         Set if it has been decided that we should use the second
771         sequence instead of the first.
772
773    RELAX_SECOND_LONGER
774         Set in the first variant frag if the macro's second implementation
775         is longer than its first.  This refers to the macro as a whole,
776         not an individual relaxation.
777
778    RELAX_NOMACRO
779         Set in the first variant frag if the macro appeared in a .set nomacro
780         block and if one alternative requires a warning but the other does not.
781
782    RELAX_DELAY_SLOT
783         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
784         delay slot.
785
786    The frag's "opcode" points to the first fixup for relaxable code.
787
788    Relaxable macros are generated using a sequence such as:
789
790       relax_start (SYMBOL);
791       ... generate first expansion ...
792       relax_switch ();
793       ... generate second expansion ...
794       relax_end ();
795
796    The code and fixups for the unwanted alternative are discarded
797    by md_convert_frag.  */
798 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
799
800 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
801 #define RELAX_SECOND(X) ((X) & 0xff)
802 #define RELAX_USE_SECOND 0x10000
803 #define RELAX_SECOND_LONGER 0x20000
804 #define RELAX_NOMACRO 0x40000
805 #define RELAX_DELAY_SLOT 0x80000
806
807 /* Branch without likely bit.  If label is out of range, we turn:
808
809         beq reg1, reg2, label
810         delay slot
811
812    into
813
814         bne reg1, reg2, 0f
815         nop
816         j label
817      0: delay slot
818
819    with the following opcode replacements:
820
821         beq <-> bne
822         blez <-> bgtz
823         bltz <-> bgez
824         bc1f <-> bc1t
825
826         bltzal <-> bgezal  (with jal label instead of j label)
827
828    Even though keeping the delay slot instruction in the delay slot of
829    the branch would be more efficient, it would be very tricky to do
830    correctly, because we'd have to introduce a variable frag *after*
831    the delay slot instruction, and expand that instead.  Let's do it
832    the easy way for now, even if the branch-not-taken case now costs
833    one additional instruction.  Out-of-range branches are not supposed
834    to be common, anyway.
835
836    Branch likely.  If label is out of range, we turn:
837
838         beql reg1, reg2, label
839         delay slot (annulled if branch not taken)
840
841    into
842
843         beql reg1, reg2, 1f
844         nop
845         beql $0, $0, 2f
846         nop
847      1: j[al] label
848         delay slot (executed only if branch taken)
849      2:
850
851    It would be possible to generate a shorter sequence by losing the
852    likely bit, generating something like:
853
854         bne reg1, reg2, 0f
855         nop
856         j[al] label
857         delay slot (executed only if branch taken)
858      0:
859
860         beql -> bne
861         bnel -> beq
862         blezl -> bgtz
863         bgtzl -> blez
864         bltzl -> bgez
865         bgezl -> bltz
866         bc1fl -> bc1t
867         bc1tl -> bc1f
868
869         bltzall -> bgezal  (with jal label instead of j label)
870         bgezall -> bltzal  (ditto)
871
872
873    but it's not clear that it would actually improve performance.  */
874 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
875   ((relax_substateT) \
876    (0xc0000000 \
877     | ((toofar) ? 1 : 0) \
878     | ((link) ? 2 : 0) \
879     | ((likely) ? 4 : 0) \
880     | ((uncond) ? 8 : 0)))
881 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
882 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
883 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
884 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
885 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
886
887 /* For mips16 code, we use an entirely different form of relaxation.
888    mips16 supports two versions of most instructions which take
889    immediate values: a small one which takes some small value, and a
890    larger one which takes a 16 bit value.  Since branches also follow
891    this pattern, relaxing these values is required.
892
893    We can assemble both mips16 and normal MIPS code in a single
894    object.  Therefore, we need to support this type of relaxation at
895    the same time that we support the relaxation described above.  We
896    use the high bit of the subtype field to distinguish these cases.
897
898    The information we store for this type of relaxation is the
899    argument code found in the opcode file for this relocation, whether
900    the user explicitly requested a small or extended form, and whether
901    the relocation is in a jump or jal delay slot.  That tells us the
902    size of the value, and how it should be stored.  We also store
903    whether the fragment is considered to be extended or not.  We also
904    store whether this is known to be a branch to a different section,
905    whether we have tried to relax this frag yet, and whether we have
906    ever extended a PC relative fragment because of a shift count.  */
907 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
908   (0x80000000                                                   \
909    | ((type) & 0xff)                                            \
910    | ((small) ? 0x100 : 0)                                      \
911    | ((ext) ? 0x200 : 0)                                        \
912    | ((dslot) ? 0x400 : 0)                                      \
913    | ((jal_dslot) ? 0x800 : 0))
914 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
915 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
916 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
917 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
918 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
919 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
920 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
921 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
922 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
923 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
924 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
925 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
926
927 /* Is the given value a sign-extended 32-bit value?  */
928 #define IS_SEXT_32BIT_NUM(x)                                            \
929   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
930    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
931
932 /* Is the given value a sign-extended 16-bit value?  */
933 #define IS_SEXT_16BIT_NUM(x)                                            \
934   (((x) &~ (offsetT) 0x7fff) == 0                                       \
935    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
936
937 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
938 #define IS_ZEXT_32BIT_NUM(x)                                            \
939   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
940    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
941
942 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
943    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
944 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
945   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
946               | (((VALUE) & (MASK)) << (SHIFT)))
947
948 /* Extract bits MASK << SHIFT from STRUCT and shift them right
949    SHIFT places.  */
950 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
951   (((STRUCT) >> (SHIFT)) & (MASK))
952
953 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
954    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
955
956    include/opcode/mips.h specifies operand fields using the macros
957    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
958    with "MIPS16OP" instead of "OP".  */
959 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
960   INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
961 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
962   INSERT_BITS ((INSN).insn_opcode, VALUE, \
963                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
964
965 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
966 #define EXTRACT_OPERAND(FIELD, INSN) \
967   EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
968 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
969   EXTRACT_BITS ((INSN).insn_opcode, \
970                 MIPS16OP_MASK_##FIELD, \
971                 MIPS16OP_SH_##FIELD)
972 \f
973 /* Global variables used when generating relaxable macros.  See the
974    comment above RELAX_ENCODE for more details about how relaxation
975    is used.  */
976 static struct {
977   /* 0 if we're not emitting a relaxable macro.
978      1 if we're emitting the first of the two relaxation alternatives.
979      2 if we're emitting the second alternative.  */
980   int sequence;
981
982   /* The first relaxable fixup in the current frag.  (In other words,
983      the first fixup that refers to relaxable code.)  */
984   fixS *first_fixup;
985
986   /* sizes[0] says how many bytes of the first alternative are stored in
987      the current frag.  Likewise sizes[1] for the second alternative.  */
988   unsigned int sizes[2];
989
990   /* The symbol on which the choice of sequence depends.  */
991   symbolS *symbol;
992 } mips_relax;
993 \f
994 /* Global variables used to decide whether a macro needs a warning.  */
995 static struct {
996   /* True if the macro is in a branch delay slot.  */
997   bfd_boolean delay_slot_p;
998
999   /* For relaxable macros, sizes[0] is the length of the first alternative
1000      in bytes and sizes[1] is the length of the second alternative.
1001      For non-relaxable macros, both elements give the length of the
1002      macro in bytes.  */
1003   unsigned int sizes[2];
1004
1005   /* The first variant frag for this macro.  */
1006   fragS *first_frag;
1007 } mips_macro_warning;
1008 \f
1009 /* Prototypes for static functions.  */
1010
1011 #define internalError()                                                 \
1012     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1013
1014 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1015
1016 static void append_insn
1017   (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
1018 static void mips_no_prev_insn (void);
1019 static void mips16_macro_build
1020   (expressionS *, const char *, const char *, va_list);
1021 static void load_register (int, expressionS *, int);
1022 static void macro_start (void);
1023 static void macro_end (void);
1024 static void macro (struct mips_cl_insn * ip);
1025 static void mips16_macro (struct mips_cl_insn * ip);
1026 #ifdef LOSING_COMPILER
1027 static void macro2 (struct mips_cl_insn * ip);
1028 #endif
1029 static void mips_ip (char *str, struct mips_cl_insn * ip);
1030 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1031 static void mips16_immed
1032   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1033    unsigned long *, bfd_boolean *, unsigned short *);
1034 static size_t my_getSmallExpression
1035   (expressionS *, bfd_reloc_code_real_type *, char *);
1036 static void my_getExpression (expressionS *, char *);
1037 static void s_align (int);
1038 static void s_change_sec (int);
1039 static void s_change_section (int);
1040 static void s_cons (int);
1041 static void s_float_cons (int);
1042 static void s_mips_globl (int);
1043 static void s_option (int);
1044 static void s_mipsset (int);
1045 static void s_abicalls (int);
1046 static void s_cpload (int);
1047 static void s_cpsetup (int);
1048 static void s_cplocal (int);
1049 static void s_cprestore (int);
1050 static void s_cpreturn (int);
1051 static void s_dtprelword (int);
1052 static void s_dtpreldword (int);
1053 static void s_gpvalue (int);
1054 static void s_gpword (int);
1055 static void s_gpdword (int);
1056 static void s_cpadd (int);
1057 static void s_insn (int);
1058 static void md_obj_begin (void);
1059 static void md_obj_end (void);
1060 static void s_mips_ent (int);
1061 static void s_mips_end (int);
1062 static void s_mips_frame (int);
1063 static void s_mips_mask (int reg_type);
1064 static void s_mips_stab (int);
1065 static void s_mips_weakext (int);
1066 static void s_mips_file (int);
1067 static void s_mips_loc (int);
1068 static bfd_boolean pic_need_relax (symbolS *, asection *);
1069 static int relaxed_branch_length (fragS *, asection *, int);
1070 static int validate_mips_insn (const struct mips_opcode *);
1071
1072 /* Table and functions used to map between CPU/ISA names, and
1073    ISA levels, and CPU numbers.  */
1074
1075 struct mips_cpu_info
1076 {
1077   const char *name;           /* CPU or ISA name.  */
1078   int flags;                  /* ASEs available, or ISA flag.  */
1079   int isa;                    /* ISA level.  */
1080   int cpu;                    /* CPU number (default CPU if ISA).  */
1081 };
1082
1083 #define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1084 #define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1085 #define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1086 #define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1087 #define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1088 #define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1089 #define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1090
1091 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1092 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1093 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1094 \f
1095 /* Pseudo-op table.
1096
1097    The following pseudo-ops from the Kane and Heinrich MIPS book
1098    should be defined here, but are currently unsupported: .alias,
1099    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1100
1101    The following pseudo-ops from the Kane and Heinrich MIPS book are
1102    specific to the type of debugging information being generated, and
1103    should be defined by the object format: .aent, .begin, .bend,
1104    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1105    .vreg.
1106
1107    The following pseudo-ops from the Kane and Heinrich MIPS book are
1108    not MIPS CPU specific, but are also not specific to the object file
1109    format.  This file is probably the best place to define them, but
1110    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1111
1112 static const pseudo_typeS mips_pseudo_table[] =
1113 {
1114   /* MIPS specific pseudo-ops.  */
1115   {"option", s_option, 0},
1116   {"set", s_mipsset, 0},
1117   {"rdata", s_change_sec, 'r'},
1118   {"sdata", s_change_sec, 's'},
1119   {"livereg", s_ignore, 0},
1120   {"abicalls", s_abicalls, 0},
1121   {"cpload", s_cpload, 0},
1122   {"cpsetup", s_cpsetup, 0},
1123   {"cplocal", s_cplocal, 0},
1124   {"cprestore", s_cprestore, 0},
1125   {"cpreturn", s_cpreturn, 0},
1126   {"dtprelword", s_dtprelword, 0},
1127   {"dtpreldword", s_dtpreldword, 0},
1128   {"gpvalue", s_gpvalue, 0},
1129   {"gpword", s_gpword, 0},
1130   {"gpdword", s_gpdword, 0},
1131   {"cpadd", s_cpadd, 0},
1132   {"insn", s_insn, 0},
1133
1134   /* Relatively generic pseudo-ops that happen to be used on MIPS
1135      chips.  */
1136   {"asciiz", stringer, 1},
1137   {"bss", s_change_sec, 'b'},
1138   {"err", s_err, 0},
1139   {"half", s_cons, 1},
1140   {"dword", s_cons, 3},
1141   {"weakext", s_mips_weakext, 0},
1142   {"origin", s_org, 0},
1143   {"repeat", s_rept, 0},
1144
1145   /* These pseudo-ops are defined in read.c, but must be overridden
1146      here for one reason or another.  */
1147   {"align", s_align, 0},
1148   {"byte", s_cons, 0},
1149   {"data", s_change_sec, 'd'},
1150   {"double", s_float_cons, 'd'},
1151   {"float", s_float_cons, 'f'},
1152   {"globl", s_mips_globl, 0},
1153   {"global", s_mips_globl, 0},
1154   {"hword", s_cons, 1},
1155   {"int", s_cons, 2},
1156   {"long", s_cons, 2},
1157   {"octa", s_cons, 4},
1158   {"quad", s_cons, 3},
1159   {"section", s_change_section, 0},
1160   {"short", s_cons, 1},
1161   {"single", s_float_cons, 'f'},
1162   {"stabn", s_mips_stab, 'n'},
1163   {"text", s_change_sec, 't'},
1164   {"word", s_cons, 2},
1165
1166   { "extern", ecoff_directive_extern, 0},
1167
1168   { NULL, NULL, 0 },
1169 };
1170
1171 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1172 {
1173   /* These pseudo-ops should be defined by the object file format.
1174      However, a.out doesn't support them, so we have versions here.  */
1175   {"aent", s_mips_ent, 1},
1176   {"bgnb", s_ignore, 0},
1177   {"end", s_mips_end, 0},
1178   {"endb", s_ignore, 0},
1179   {"ent", s_mips_ent, 0},
1180   {"file", s_mips_file, 0},
1181   {"fmask", s_mips_mask, 'F'},
1182   {"frame", s_mips_frame, 0},
1183   {"loc", s_mips_loc, 0},
1184   {"mask", s_mips_mask, 'R'},
1185   {"verstamp", s_ignore, 0},
1186   { NULL, NULL, 0 },
1187 };
1188
1189 extern void pop_insert (const pseudo_typeS *);
1190
1191 void
1192 mips_pop_insert (void)
1193 {
1194   pop_insert (mips_pseudo_table);
1195   if (! ECOFF_DEBUGGING)
1196     pop_insert (mips_nonecoff_pseudo_table);
1197 }
1198 \f
1199 /* Symbols labelling the current insn.  */
1200
1201 struct insn_label_list
1202 {
1203   struct insn_label_list *next;
1204   symbolS *label;
1205 };
1206
1207 static struct insn_label_list *free_insn_labels;
1208 #define label_list tc_segment_info_data
1209
1210 static void mips_clear_insn_labels (void);
1211
1212 static inline void
1213 mips_clear_insn_labels (void)
1214 {
1215   register struct insn_label_list **pl;
1216   segment_info_type *si;
1217
1218   if (now_seg)
1219     {
1220       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1221         ;
1222       
1223       si = seg_info (now_seg);
1224       *pl = si->label_list;
1225       si->label_list = NULL;
1226     }
1227 }
1228
1229 \f
1230 static char *expr_end;
1231
1232 /* Expressions which appear in instructions.  These are set by
1233    mips_ip.  */
1234
1235 static expressionS imm_expr;
1236 static expressionS imm2_expr;
1237 static expressionS offset_expr;
1238
1239 /* Relocs associated with imm_expr and offset_expr.  */
1240
1241 static bfd_reloc_code_real_type imm_reloc[3]
1242   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1243 static bfd_reloc_code_real_type offset_reloc[3]
1244   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1245
1246 /* These are set by mips16_ip if an explicit extension is used.  */
1247
1248 static bfd_boolean mips16_small, mips16_ext;
1249
1250 #ifdef OBJ_ELF
1251 /* The pdr segment for per procedure frame/regmask info.  Not used for
1252    ECOFF debugging.  */
1253
1254 static segT pdr_seg;
1255 #endif
1256
1257 /* The default target format to use.  */
1258
1259 const char *
1260 mips_target_format (void)
1261 {
1262   switch (OUTPUT_FLAVOR)
1263     {
1264     case bfd_target_ecoff_flavour:
1265       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1266     case bfd_target_coff_flavour:
1267       return "pe-mips";
1268     case bfd_target_elf_flavour:
1269 #ifdef TE_VXWORKS
1270       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1271         return (target_big_endian
1272                 ? "elf32-bigmips-vxworks"
1273                 : "elf32-littlemips-vxworks");
1274 #endif
1275 #ifdef TE_TMIPS
1276       /* This is traditional mips.  */
1277       return (target_big_endian
1278               ? (HAVE_64BIT_OBJECTS
1279                  ? "elf64-tradbigmips"
1280                  : (HAVE_NEWABI
1281                     ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1282               : (HAVE_64BIT_OBJECTS
1283                  ? "elf64-tradlittlemips"
1284                  : (HAVE_NEWABI
1285                     ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1286 #else
1287       return (target_big_endian
1288               ? (HAVE_64BIT_OBJECTS
1289                  ? "elf64-bigmips"
1290                  : (HAVE_NEWABI
1291                     ? "elf32-nbigmips" : "elf32-bigmips"))
1292               : (HAVE_64BIT_OBJECTS
1293                  ? "elf64-littlemips"
1294                  : (HAVE_NEWABI
1295                     ? "elf32-nlittlemips" : "elf32-littlemips")));
1296 #endif
1297     default:
1298       abort ();
1299       return NULL;
1300     }
1301 }
1302
1303 /* Return the length of instruction INSN.  */
1304
1305 static inline unsigned int
1306 insn_length (const struct mips_cl_insn *insn)
1307 {
1308   if (!mips_opts.mips16)
1309     return 4;
1310   return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1311 }
1312
1313 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1314
1315 static void
1316 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1317 {
1318   size_t i;
1319
1320   insn->insn_mo = mo;
1321   insn->use_extend = FALSE;
1322   insn->extend = 0;
1323   insn->insn_opcode = mo->match;
1324   insn->frag = NULL;
1325   insn->where = 0;
1326   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1327     insn->fixp[i] = NULL;
1328   insn->fixed_p = (mips_opts.noreorder > 0);
1329   insn->noreorder_p = (mips_opts.noreorder > 0);
1330   insn->mips16_absolute_jump_p = 0;
1331 }
1332
1333 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1334
1335 static void
1336 install_insn (const struct mips_cl_insn *insn)
1337 {
1338   char *f = insn->frag->fr_literal + insn->where;
1339   if (!mips_opts.mips16)
1340     md_number_to_chars (f, insn->insn_opcode, 4);
1341   else if (insn->mips16_absolute_jump_p)
1342     {
1343       md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1344       md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1345     }
1346   else
1347     {
1348       if (insn->use_extend)
1349         {
1350           md_number_to_chars (f, 0xf000 | insn->extend, 2);
1351           f += 2;
1352         }
1353       md_number_to_chars (f, insn->insn_opcode, 2);
1354     }
1355 }
1356
1357 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1358    and install the opcode in the new location.  */
1359
1360 static void
1361 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1362 {
1363   size_t i;
1364
1365   insn->frag = frag;
1366   insn->where = where;
1367   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1368     if (insn->fixp[i] != NULL)
1369       {
1370         insn->fixp[i]->fx_frag = frag;
1371         insn->fixp[i]->fx_where = where;
1372       }
1373   install_insn (insn);
1374 }
1375
1376 /* Add INSN to the end of the output.  */
1377
1378 static void
1379 add_fixed_insn (struct mips_cl_insn *insn)
1380 {
1381   char *f = frag_more (insn_length (insn));
1382   move_insn (insn, frag_now, f - frag_now->fr_literal);
1383 }
1384
1385 /* Start a variant frag and move INSN to the start of the variant part,
1386    marking it as fixed.  The other arguments are as for frag_var.  */
1387
1388 static void
1389 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1390                   relax_substateT subtype, symbolS *symbol, offsetT offset)
1391 {
1392   frag_grow (max_chars);
1393   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1394   insn->fixed_p = 1;
1395   frag_var (rs_machine_dependent, max_chars, var,
1396             subtype, symbol, offset, NULL);
1397 }
1398
1399 /* Insert N copies of INSN into the history buffer, starting at
1400    position FIRST.  Neither FIRST nor N need to be clipped.  */
1401
1402 static void
1403 insert_into_history (unsigned int first, unsigned int n,
1404                      const struct mips_cl_insn *insn)
1405 {
1406   if (mips_relax.sequence != 2)
1407     {
1408       unsigned int i;
1409
1410       for (i = ARRAY_SIZE (history); i-- > first;)
1411         if (i >= first + n)
1412           history[i] = history[i - n];
1413         else
1414           history[i] = *insn;
1415     }
1416 }
1417
1418 /* Emit a nop instruction, recording it in the history buffer.  */
1419
1420 static void
1421 emit_nop (void)
1422 {
1423   add_fixed_insn (NOP_INSN);
1424   insert_into_history (0, 1, NOP_INSN);
1425 }
1426
1427 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1428    the idea is to make it obvious at a glance that each errata is
1429    included.  */
1430
1431 static void
1432 init_vr4120_conflicts (void)
1433 {
1434 #define CONFLICT(FIRST, SECOND) \
1435     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1436
1437   /* Errata 21 - [D]DIV[U] after [D]MACC */
1438   CONFLICT (MACC, DIV);
1439   CONFLICT (DMACC, DIV);
1440
1441   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1442   CONFLICT (DMULT, DMULT);
1443   CONFLICT (DMULT, DMACC);
1444   CONFLICT (DMACC, DMULT);
1445   CONFLICT (DMACC, DMACC);
1446
1447   /* Errata 24 - MT{LO,HI} after [D]MACC */
1448   CONFLICT (MACC, MTHILO);
1449   CONFLICT (DMACC, MTHILO);
1450
1451   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1452      instruction is executed immediately after a MACC or DMACC
1453      instruction, the result of [either instruction] is incorrect."  */
1454   CONFLICT (MACC, MULT);
1455   CONFLICT (MACC, DMULT);
1456   CONFLICT (DMACC, MULT);
1457   CONFLICT (DMACC, DMULT);
1458
1459   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1460      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1461      DDIV or DDIVU instruction, the result of the MACC or
1462      DMACC instruction is incorrect.".  */
1463   CONFLICT (DMULT, MACC);
1464   CONFLICT (DMULT, DMACC);
1465   CONFLICT (DIV, MACC);
1466   CONFLICT (DIV, DMACC);
1467
1468 #undef CONFLICT
1469 }
1470
1471 struct regname {
1472   const char *name;
1473   unsigned int num;
1474 };
1475
1476 #define RTYPE_MASK      0x1ff00
1477 #define RTYPE_NUM       0x00100
1478 #define RTYPE_FPU       0x00200
1479 #define RTYPE_FCC       0x00400
1480 #define RTYPE_VEC       0x00800
1481 #define RTYPE_GP        0x01000
1482 #define RTYPE_CP0       0x02000
1483 #define RTYPE_PC        0x04000
1484 #define RTYPE_ACC       0x08000
1485 #define RTYPE_CCC       0x10000
1486 #define RNUM_MASK       0x000ff
1487 #define RWARN           0x80000
1488
1489 #define GENERIC_REGISTER_NUMBERS \
1490     {"$0",      RTYPE_NUM | 0},  \
1491     {"$1",      RTYPE_NUM | 1},  \
1492     {"$2",      RTYPE_NUM | 2},  \
1493     {"$3",      RTYPE_NUM | 3},  \
1494     {"$4",      RTYPE_NUM | 4},  \
1495     {"$5",      RTYPE_NUM | 5},  \
1496     {"$6",      RTYPE_NUM | 6},  \
1497     {"$7",      RTYPE_NUM | 7},  \
1498     {"$8",      RTYPE_NUM | 8},  \
1499     {"$9",      RTYPE_NUM | 9},  \
1500     {"$10",     RTYPE_NUM | 10}, \
1501     {"$11",     RTYPE_NUM | 11}, \
1502     {"$12",     RTYPE_NUM | 12}, \
1503     {"$13",     RTYPE_NUM | 13}, \
1504     {"$14",     RTYPE_NUM | 14}, \
1505     {"$15",     RTYPE_NUM | 15}, \
1506     {"$16",     RTYPE_NUM | 16}, \
1507     {"$17",     RTYPE_NUM | 17}, \
1508     {"$18",     RTYPE_NUM | 18}, \
1509     {"$19",     RTYPE_NUM | 19}, \
1510     {"$20",     RTYPE_NUM | 20}, \
1511     {"$21",     RTYPE_NUM | 21}, \
1512     {"$22",     RTYPE_NUM | 22}, \
1513     {"$23",     RTYPE_NUM | 23}, \
1514     {"$24",     RTYPE_NUM | 24}, \
1515     {"$25",     RTYPE_NUM | 25}, \
1516     {"$26",     RTYPE_NUM | 26}, \
1517     {"$27",     RTYPE_NUM | 27}, \
1518     {"$28",     RTYPE_NUM | 28}, \
1519     {"$29",     RTYPE_NUM | 29}, \
1520     {"$30",     RTYPE_NUM | 30}, \
1521     {"$31",     RTYPE_NUM | 31} 
1522
1523 #define FPU_REGISTER_NAMES       \
1524     {"$f0",     RTYPE_FPU | 0},  \
1525     {"$f1",     RTYPE_FPU | 1},  \
1526     {"$f2",     RTYPE_FPU | 2},  \
1527     {"$f3",     RTYPE_FPU | 3},  \
1528     {"$f4",     RTYPE_FPU | 4},  \
1529     {"$f5",     RTYPE_FPU | 5},  \
1530     {"$f6",     RTYPE_FPU | 6},  \
1531     {"$f7",     RTYPE_FPU | 7},  \
1532     {"$f8",     RTYPE_FPU | 8},  \
1533     {"$f9",     RTYPE_FPU | 9},  \
1534     {"$f10",    RTYPE_FPU | 10}, \
1535     {"$f11",    RTYPE_FPU | 11}, \
1536     {"$f12",    RTYPE_FPU | 12}, \
1537     {"$f13",    RTYPE_FPU | 13}, \
1538     {"$f14",    RTYPE_FPU | 14}, \
1539     {"$f15",    RTYPE_FPU | 15}, \
1540     {"$f16",    RTYPE_FPU | 16}, \
1541     {"$f17",    RTYPE_FPU | 17}, \
1542     {"$f18",    RTYPE_FPU | 18}, \
1543     {"$f19",    RTYPE_FPU | 19}, \
1544     {"$f20",    RTYPE_FPU | 20}, \
1545     {"$f21",    RTYPE_FPU | 21}, \
1546     {"$f22",    RTYPE_FPU | 22}, \
1547     {"$f23",    RTYPE_FPU | 23}, \
1548     {"$f24",    RTYPE_FPU | 24}, \
1549     {"$f25",    RTYPE_FPU | 25}, \
1550     {"$f26",    RTYPE_FPU | 26}, \
1551     {"$f27",    RTYPE_FPU | 27}, \
1552     {"$f28",    RTYPE_FPU | 28}, \
1553     {"$f29",    RTYPE_FPU | 29}, \
1554     {"$f30",    RTYPE_FPU | 30}, \
1555     {"$f31",    RTYPE_FPU | 31}
1556
1557 #define FPU_CONDITION_CODE_NAMES \
1558     {"$fcc0",   RTYPE_FCC | 0},  \
1559     {"$fcc1",   RTYPE_FCC | 1},  \
1560     {"$fcc2",   RTYPE_FCC | 2},  \
1561     {"$fcc3",   RTYPE_FCC | 3},  \
1562     {"$fcc4",   RTYPE_FCC | 4},  \
1563     {"$fcc5",   RTYPE_FCC | 5},  \
1564     {"$fcc6",   RTYPE_FCC | 6},  \
1565     {"$fcc7",   RTYPE_FCC | 7}
1566
1567 #define COPROC_CONDITION_CODE_NAMES         \
1568     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1569     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1570     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1571     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1572     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1573     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1574     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1575     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1576
1577 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1578     {"$a4",     RTYPE_GP | 8},  \
1579     {"$a5",     RTYPE_GP | 9},  \
1580     {"$a6",     RTYPE_GP | 10}, \
1581     {"$a7",     RTYPE_GP | 11}, \
1582     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1583     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1584     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1585     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1586     {"$t0",     RTYPE_GP | 12}, \
1587     {"$t1",     RTYPE_GP | 13}, \
1588     {"$t2",     RTYPE_GP | 14}, \
1589     {"$t3",     RTYPE_GP | 15}
1590
1591 #define O32_SYMBOLIC_REGISTER_NAMES \
1592     {"$t0",     RTYPE_GP | 8},  \
1593     {"$t1",     RTYPE_GP | 9},  \
1594     {"$t2",     RTYPE_GP | 10}, \
1595     {"$t3",     RTYPE_GP | 11}, \
1596     {"$t4",     RTYPE_GP | 12}, \
1597     {"$t5",     RTYPE_GP | 13}, \
1598     {"$t6",     RTYPE_GP | 14}, \
1599     {"$t7",     RTYPE_GP | 15}, \
1600     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
1601     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
1602     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
1603     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */ 
1604
1605 /* Remaining symbolic register names */
1606 #define SYMBOLIC_REGISTER_NAMES \
1607     {"$zero",   RTYPE_GP | 0},  \
1608     {"$at",     RTYPE_GP | 1},  \
1609     {"$AT",     RTYPE_GP | 1},  \
1610     {"$v0",     RTYPE_GP | 2},  \
1611     {"$v1",     RTYPE_GP | 3},  \
1612     {"$a0",     RTYPE_GP | 4},  \
1613     {"$a1",     RTYPE_GP | 5},  \
1614     {"$a2",     RTYPE_GP | 6},  \
1615     {"$a3",     RTYPE_GP | 7},  \
1616     {"$s0",     RTYPE_GP | 16}, \
1617     {"$s1",     RTYPE_GP | 17}, \
1618     {"$s2",     RTYPE_GP | 18}, \
1619     {"$s3",     RTYPE_GP | 19}, \
1620     {"$s4",     RTYPE_GP | 20}, \
1621     {"$s5",     RTYPE_GP | 21}, \
1622     {"$s6",     RTYPE_GP | 22}, \
1623     {"$s7",     RTYPE_GP | 23}, \
1624     {"$t8",     RTYPE_GP | 24}, \
1625     {"$t9",     RTYPE_GP | 25}, \
1626     {"$k0",     RTYPE_GP | 26}, \
1627     {"$kt0",    RTYPE_GP | 26}, \
1628     {"$k1",     RTYPE_GP | 27}, \
1629     {"$kt1",    RTYPE_GP | 27}, \
1630     {"$gp",     RTYPE_GP | 28}, \
1631     {"$sp",     RTYPE_GP | 29}, \
1632     {"$s8",     RTYPE_GP | 30}, \
1633     {"$fp",     RTYPE_GP | 30}, \
1634     {"$ra",     RTYPE_GP | 31}
1635
1636 #define MIPS16_SPECIAL_REGISTER_NAMES \
1637     {"$pc",     RTYPE_PC | 0}
1638
1639 #define MDMX_VECTOR_REGISTER_NAMES \
1640     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
1641     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
1642     {"$v2",     RTYPE_VEC | 2},  \
1643     {"$v3",     RTYPE_VEC | 3},  \
1644     {"$v4",     RTYPE_VEC | 4},  \
1645     {"$v5",     RTYPE_VEC | 5},  \
1646     {"$v6",     RTYPE_VEC | 6},  \
1647     {"$v7",     RTYPE_VEC | 7},  \
1648     {"$v8",     RTYPE_VEC | 8},  \
1649     {"$v9",     RTYPE_VEC | 9},  \
1650     {"$v10",    RTYPE_VEC | 10}, \
1651     {"$v11",    RTYPE_VEC | 11}, \
1652     {"$v12",    RTYPE_VEC | 12}, \
1653     {"$v13",    RTYPE_VEC | 13}, \
1654     {"$v14",    RTYPE_VEC | 14}, \
1655     {"$v15",    RTYPE_VEC | 15}, \
1656     {"$v16",    RTYPE_VEC | 16}, \
1657     {"$v17",    RTYPE_VEC | 17}, \
1658     {"$v18",    RTYPE_VEC | 18}, \
1659     {"$v19",    RTYPE_VEC | 19}, \
1660     {"$v20",    RTYPE_VEC | 20}, \
1661     {"$v21",    RTYPE_VEC | 21}, \
1662     {"$v22",    RTYPE_VEC | 22}, \
1663     {"$v23",    RTYPE_VEC | 23}, \
1664     {"$v24",    RTYPE_VEC | 24}, \
1665     {"$v25",    RTYPE_VEC | 25}, \
1666     {"$v26",    RTYPE_VEC | 26}, \
1667     {"$v27",    RTYPE_VEC | 27}, \
1668     {"$v28",    RTYPE_VEC | 28}, \
1669     {"$v29",    RTYPE_VEC | 29}, \
1670     {"$v30",    RTYPE_VEC | 30}, \
1671     {"$v31",    RTYPE_VEC | 31}
1672
1673 #define MIPS_DSP_ACCUMULATOR_NAMES \
1674     {"$ac0",    RTYPE_ACC | 0}, \
1675     {"$ac1",    RTYPE_ACC | 1}, \
1676     {"$ac2",    RTYPE_ACC | 2}, \
1677     {"$ac3",    RTYPE_ACC | 3}
1678
1679 static const struct regname reg_names[] = {
1680   GENERIC_REGISTER_NUMBERS,
1681   FPU_REGISTER_NAMES,
1682   FPU_CONDITION_CODE_NAMES,
1683   COPROC_CONDITION_CODE_NAMES,
1684
1685   /* The $txx registers depends on the abi,
1686      these will be added later into the symbol table from
1687      one of the tables below once mips_abi is set after 
1688      parsing of arguments from the command line. */
1689   SYMBOLIC_REGISTER_NAMES,
1690
1691   MIPS16_SPECIAL_REGISTER_NAMES,
1692   MDMX_VECTOR_REGISTER_NAMES,
1693   MIPS_DSP_ACCUMULATOR_NAMES,
1694   {0, 0}
1695 };
1696
1697 static const struct regname reg_names_o32[] = {
1698   O32_SYMBOLIC_REGISTER_NAMES,
1699   {0, 0}
1700 };
1701
1702 static const struct regname reg_names_n32n64[] = {
1703   N32N64_SYMBOLIC_REGISTER_NAMES,
1704   {0, 0}
1705 };
1706
1707 static int
1708 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1709 {
1710   symbolS *symbolP;
1711   char *e;
1712   char save_c;
1713   int reg = -1;
1714
1715   /* Find end of name.  */
1716   e = *s;
1717   if (is_name_beginner (*e))
1718     ++e;
1719   while (is_part_of_name (*e))
1720     ++e;
1721
1722   /* Terminate name.  */
1723   save_c = *e;
1724   *e = '\0';
1725
1726   /* Look for a register symbol.  */
1727   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1728     {
1729       int r = S_GET_VALUE (symbolP);
1730       if (r & types)
1731         reg = r & RNUM_MASK;
1732       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1733         /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
1734         reg = (r & RNUM_MASK) - 2;
1735     }
1736   /* Else see if this is a register defined in an itbl entry.  */
1737   else if ((types & RTYPE_GP) && itbl_have_entries)
1738     {
1739       char *n = *s;
1740       unsigned long r;
1741
1742       if (*n == '$')
1743         ++n;
1744       if (itbl_get_reg_val (n, &r))
1745         reg = r & RNUM_MASK;
1746     }
1747
1748   /* Advance to next token if a register was recognised.  */
1749   if (reg >= 0)
1750     *s = e;
1751   else if (types & RWARN)
1752     as_warn ("Unrecognized register name `%s'", *s);
1753
1754   *e = save_c;
1755   if (regnop)
1756     *regnop = reg;
1757   return reg >= 0;
1758 }
1759
1760 /* This function is called once, at assembler startup time.  It should set up
1761    all the tables, etc. that the MD part of the assembler will need.  */
1762
1763 void
1764 md_begin (void)
1765 {
1766   const char *retval = NULL;
1767   int i = 0;
1768   int broken = 0;
1769
1770   if (mips_pic != NO_PIC)
1771     {
1772       if (g_switch_seen && g_switch_value != 0)
1773         as_bad (_("-G may not be used in position-independent code"));
1774       g_switch_value = 0;
1775     }
1776
1777   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1778     as_warn (_("Could not set architecture and machine"));
1779
1780   op_hash = hash_new ();
1781
1782   for (i = 0; i < NUMOPCODES;)
1783     {
1784       const char *name = mips_opcodes[i].name;
1785
1786       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1787       if (retval != NULL)
1788         {
1789           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1790                    mips_opcodes[i].name, retval);
1791           /* Probably a memory allocation problem?  Give up now.  */
1792           as_fatal (_("Broken assembler.  No assembly attempted."));
1793         }
1794       do
1795         {
1796           if (mips_opcodes[i].pinfo != INSN_MACRO)
1797             {
1798               if (!validate_mips_insn (&mips_opcodes[i]))
1799                 broken = 1;
1800               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1801                 {
1802                   create_insn (&nop_insn, mips_opcodes + i);
1803                   nop_insn.fixed_p = 1;
1804                 }
1805             }
1806           ++i;
1807         }
1808       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1809     }
1810
1811   mips16_op_hash = hash_new ();
1812
1813   i = 0;
1814   while (i < bfd_mips16_num_opcodes)
1815     {
1816       const char *name = mips16_opcodes[i].name;
1817
1818       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1819       if (retval != NULL)
1820         as_fatal (_("internal: can't hash `%s': %s"),
1821                   mips16_opcodes[i].name, retval);
1822       do
1823         {
1824           if (mips16_opcodes[i].pinfo != INSN_MACRO
1825               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1826                   != mips16_opcodes[i].match))
1827             {
1828               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1829                        mips16_opcodes[i].name, mips16_opcodes[i].args);
1830               broken = 1;
1831             }
1832           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1833             {
1834               create_insn (&mips16_nop_insn, mips16_opcodes + i);
1835               mips16_nop_insn.fixed_p = 1;
1836             }
1837           ++i;
1838         }
1839       while (i < bfd_mips16_num_opcodes
1840              && strcmp (mips16_opcodes[i].name, name) == 0);
1841     }
1842
1843   if (broken)
1844     as_fatal (_("Broken assembler.  No assembly attempted."));
1845
1846   /* We add all the general register names to the symbol table.  This
1847      helps us detect invalid uses of them.  */
1848   for (i = 0; reg_names[i].name; i++) 
1849     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1850                                      reg_names[i].num, // & RNUM_MASK,
1851                                      &zero_address_frag));
1852   if (HAVE_NEWABI)
1853     for (i = 0; reg_names_n32n64[i].name; i++) 
1854       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1855                                        reg_names_n32n64[i].num, // & RNUM_MASK,
1856                                        &zero_address_frag));
1857   else
1858     for (i = 0; reg_names_o32[i].name; i++) 
1859       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
1860                                        reg_names_o32[i].num, // & RNUM_MASK,
1861                                        &zero_address_frag));
1862
1863   mips_no_prev_insn ();
1864
1865   mips_gprmask = 0;
1866   mips_cprmask[0] = 0;
1867   mips_cprmask[1] = 0;
1868   mips_cprmask[2] = 0;
1869   mips_cprmask[3] = 0;
1870
1871   /* set the default alignment for the text section (2**2) */
1872   record_alignment (text_section, 2);
1873
1874   bfd_set_gp_size (stdoutput, g_switch_value);
1875
1876 #ifdef OBJ_ELF
1877   if (IS_ELF)
1878     {
1879       /* On a native system other than VxWorks, sections must be aligned
1880          to 16 byte boundaries.  When configured for an embedded ELF
1881          target, we don't bother.  */
1882       if (strcmp (TARGET_OS, "elf") != 0
1883           && strcmp (TARGET_OS, "vxworks") != 0)
1884         {
1885           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1886           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1887           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1888         }
1889
1890       /* Create a .reginfo section for register masks and a .mdebug
1891          section for debugging information.  */
1892       {
1893         segT seg;
1894         subsegT subseg;
1895         flagword flags;
1896         segT sec;
1897
1898         seg = now_seg;
1899         subseg = now_subseg;
1900
1901         /* The ABI says this section should be loaded so that the
1902            running program can access it.  However, we don't load it
1903            if we are configured for an embedded target */
1904         flags = SEC_READONLY | SEC_DATA;
1905         if (strcmp (TARGET_OS, "elf") != 0)
1906           flags |= SEC_ALLOC | SEC_LOAD;
1907
1908         if (mips_abi != N64_ABI)
1909           {
1910             sec = subseg_new (".reginfo", (subsegT) 0);
1911
1912             bfd_set_section_flags (stdoutput, sec, flags);
1913             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
1914
1915             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1916           }
1917         else
1918           {
1919             /* The 64-bit ABI uses a .MIPS.options section rather than
1920                .reginfo section.  */
1921             sec = subseg_new (".MIPS.options", (subsegT) 0);
1922             bfd_set_section_flags (stdoutput, sec, flags);
1923             bfd_set_section_alignment (stdoutput, sec, 3);
1924
1925             /* Set up the option header.  */
1926             {
1927               Elf_Internal_Options opthdr;
1928               char *f;
1929
1930               opthdr.kind = ODK_REGINFO;
1931               opthdr.size = (sizeof (Elf_External_Options)
1932                              + sizeof (Elf64_External_RegInfo));
1933               opthdr.section = 0;
1934               opthdr.info = 0;
1935               f = frag_more (sizeof (Elf_External_Options));
1936               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1937                                              (Elf_External_Options *) f);
1938
1939               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1940             }
1941           }
1942
1943         if (ECOFF_DEBUGGING)
1944           {
1945             sec = subseg_new (".mdebug", (subsegT) 0);
1946             (void) bfd_set_section_flags (stdoutput, sec,
1947                                           SEC_HAS_CONTENTS | SEC_READONLY);
1948             (void) bfd_set_section_alignment (stdoutput, sec, 2);
1949           }
1950         else if (mips_flag_pdr)
1951           {
1952             pdr_seg = subseg_new (".pdr", (subsegT) 0);
1953             (void) bfd_set_section_flags (stdoutput, pdr_seg,
1954                                           SEC_READONLY | SEC_RELOC
1955                                           | SEC_DEBUGGING);
1956             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1957           }
1958
1959         subseg_set (seg, subseg);
1960       }
1961     }
1962 #endif /* OBJ_ELF */
1963
1964   if (! ECOFF_DEBUGGING)
1965     md_obj_begin ();
1966
1967   if (mips_fix_vr4120)
1968     init_vr4120_conflicts ();
1969 }
1970
1971 void
1972 md_mips_end (void)
1973 {
1974   if (! ECOFF_DEBUGGING)
1975     md_obj_end ();
1976 }
1977
1978 void
1979 md_assemble (char *str)
1980 {
1981   struct mips_cl_insn insn;
1982   bfd_reloc_code_real_type unused_reloc[3]
1983     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1984
1985   imm_expr.X_op = O_absent;
1986   imm2_expr.X_op = O_absent;
1987   offset_expr.X_op = O_absent;
1988   imm_reloc[0] = BFD_RELOC_UNUSED;
1989   imm_reloc[1] = BFD_RELOC_UNUSED;
1990   imm_reloc[2] = BFD_RELOC_UNUSED;
1991   offset_reloc[0] = BFD_RELOC_UNUSED;
1992   offset_reloc[1] = BFD_RELOC_UNUSED;
1993   offset_reloc[2] = BFD_RELOC_UNUSED;
1994
1995   if (mips_opts.mips16)
1996     mips16_ip (str, &insn);
1997   else
1998     {
1999       mips_ip (str, &insn);
2000       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2001             str, insn.insn_opcode));
2002     }
2003
2004   if (insn_error)
2005     {
2006       as_bad ("%s `%s'", insn_error, str);
2007       return;
2008     }
2009
2010   if (insn.insn_mo->pinfo == INSN_MACRO)
2011     {
2012       macro_start ();
2013       if (mips_opts.mips16)
2014         mips16_macro (&insn);
2015       else
2016         macro (&insn);
2017       macro_end ();
2018     }
2019   else
2020     {
2021       if (imm_expr.X_op != O_absent)
2022         append_insn (&insn, &imm_expr, imm_reloc);
2023       else if (offset_expr.X_op != O_absent)
2024         append_insn (&insn, &offset_expr, offset_reloc);
2025       else
2026         append_insn (&insn, NULL, unused_reloc);
2027     }
2028 }
2029
2030 /* Return true if the given relocation might need a matching %lo().
2031    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2032    need a matching %lo() when applied to local symbols.  */
2033
2034 static inline bfd_boolean
2035 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2036 {
2037   return (HAVE_IN_PLACE_ADDENDS
2038           && (reloc == BFD_RELOC_HI16_S
2039               || reloc == BFD_RELOC_MIPS16_HI16_S
2040               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2041                  all GOT16 relocations evaluate to "G".  */
2042               || (reloc == BFD_RELOC_MIPS_GOT16 && mips_pic != VXWORKS_PIC)));
2043 }
2044
2045 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2046    relocation.  */
2047
2048 static inline bfd_boolean
2049 fixup_has_matching_lo_p (fixS *fixp)
2050 {
2051   return (fixp->fx_next != NULL
2052           && (fixp->fx_next->fx_r_type == BFD_RELOC_LO16
2053              || fixp->fx_next->fx_r_type == BFD_RELOC_MIPS16_LO16)
2054           && fixp->fx_addsy == fixp->fx_next->fx_addsy
2055           && fixp->fx_offset == fixp->fx_next->fx_offset);
2056 }
2057
2058 /* See whether instruction IP reads register REG.  CLASS is the type
2059    of register.  */
2060
2061 static int
2062 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2063                enum mips_regclass class)
2064 {
2065   if (class == MIPS16_REG)
2066     {
2067       assert (mips_opts.mips16);
2068       reg = mips16_to_32_reg_map[reg];
2069       class = MIPS_GR_REG;
2070     }
2071
2072   /* Don't report on general register ZERO, since it never changes.  */
2073   if (class == MIPS_GR_REG && reg == ZERO)
2074     return 0;
2075
2076   if (class == MIPS_FP_REG)
2077     {
2078       assert (! mips_opts.mips16);
2079       /* If we are called with either $f0 or $f1, we must check $f0.
2080          This is not optimal, because it will introduce an unnecessary
2081          NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
2082          need to distinguish reading both $f0 and $f1 or just one of
2083          them.  Note that we don't have to check the other way,
2084          because there is no instruction that sets both $f0 and $f1
2085          and requires a delay.  */
2086       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2087           && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2088               == (reg &~ (unsigned) 1)))
2089         return 1;
2090       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2091           && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2092               == (reg &~ (unsigned) 1)))
2093         return 1;
2094     }
2095   else if (! mips_opts.mips16)
2096     {
2097       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2098           && EXTRACT_OPERAND (RS, *ip) == reg)
2099         return 1;
2100       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2101           && EXTRACT_OPERAND (RT, *ip) == reg)
2102         return 1;
2103     }
2104   else
2105     {
2106       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2107           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2108         return 1;
2109       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2110           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2111         return 1;
2112       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2113           && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2114               == reg))
2115         return 1;
2116       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2117         return 1;
2118       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2119         return 1;
2120       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2121         return 1;
2122       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2123           && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2124         return 1;
2125     }
2126
2127   return 0;
2128 }
2129
2130 /* This function returns true if modifying a register requires a
2131    delay.  */
2132
2133 static int
2134 reg_needs_delay (unsigned int reg)
2135 {
2136   unsigned long prev_pinfo;
2137
2138   prev_pinfo = history[0].insn_mo->pinfo;
2139   if (! mips_opts.noreorder
2140       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2141            && ! gpr_interlocks)
2142           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2143               && ! cop_interlocks)))
2144     {
2145       /* A load from a coprocessor or from memory.  All load delays
2146          delay the use of general register rt for one instruction.  */
2147       /* Itbl support may require additional care here.  */
2148       know (prev_pinfo & INSN_WRITE_GPR_T);
2149       if (reg == EXTRACT_OPERAND (RT, history[0]))
2150         return 1;
2151     }
2152
2153   return 0;
2154 }
2155
2156 /* Move all labels in insn_labels to the current insertion point.  */
2157
2158 static void
2159 mips_move_labels (void)
2160 {
2161   segment_info_type *si = seg_info (now_seg);
2162   struct insn_label_list *l;
2163   valueT val;
2164
2165   for (l = si->label_list; l != NULL; l = l->next)
2166     {
2167       assert (S_GET_SEGMENT (l->label) == now_seg);
2168       symbol_set_frag (l->label, frag_now);
2169       val = (valueT) frag_now_fix ();
2170       /* mips16 text labels are stored as odd.  */
2171       if (mips_opts.mips16)
2172         ++val;
2173       S_SET_VALUE (l->label, val);
2174     }
2175 }
2176
2177 static bfd_boolean
2178 s_is_linkonce (symbolS *sym, segT from_seg)
2179 {
2180   bfd_boolean linkonce = FALSE;
2181   segT symseg = S_GET_SEGMENT (sym);
2182
2183   if (symseg != from_seg && !S_IS_LOCAL (sym))
2184     {
2185       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2186         linkonce = TRUE;
2187 #ifdef OBJ_ELF
2188       /* The GNU toolchain uses an extension for ELF: a section
2189          beginning with the magic string .gnu.linkonce is a
2190          linkonce section.  */
2191       if (strncmp (segment_name (symseg), ".gnu.linkonce",
2192                    sizeof ".gnu.linkonce" - 1) == 0)
2193         linkonce = TRUE;
2194 #endif
2195     }
2196   return linkonce;
2197 }
2198
2199 /* Mark instruction labels in mips16 mode.  This permits the linker to
2200    handle them specially, such as generating jalx instructions when
2201    needed.  We also make them odd for the duration of the assembly, in
2202    order to generate the right sort of code.  We will make them even
2203    in the adjust_symtab routine, while leaving them marked.  This is
2204    convenient for the debugger and the disassembler.  The linker knows
2205    to make them odd again.  */
2206
2207 static void
2208 mips16_mark_labels (void)
2209 {
2210   segment_info_type *si = seg_info (now_seg);
2211   struct insn_label_list *l;
2212
2213   if (!mips_opts.mips16)
2214     return;
2215
2216   for (l = si->label_list; l != NULL; l = l->next)
2217    {
2218       symbolS *label = l->label;
2219
2220 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2221       if (IS_ELF)
2222         S_SET_OTHER (label, STO_MIPS16);
2223 #endif
2224       if ((S_GET_VALUE (label) & 1) == 0
2225         /* Don't adjust the address if the label is global or weak, or
2226            in a link-once section, since we'll be emitting symbol reloc
2227            references to it which will be patched up by the linker, and
2228            the final value of the symbol may or may not be MIPS16.  */
2229           && ! S_IS_WEAK (label)
2230           && ! S_IS_EXTERNAL (label)
2231           && ! s_is_linkonce (label, now_seg))
2232         S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2233     }
2234 }
2235
2236 /* End the current frag.  Make it a variant frag and record the
2237    relaxation info.  */
2238
2239 static void
2240 relax_close_frag (void)
2241 {
2242   mips_macro_warning.first_frag = frag_now;
2243   frag_var (rs_machine_dependent, 0, 0,
2244             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2245             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2246
2247   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2248   mips_relax.first_fixup = 0;
2249 }
2250
2251 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2252    See the comment above RELAX_ENCODE for more details.  */
2253
2254 static void
2255 relax_start (symbolS *symbol)
2256 {
2257   assert (mips_relax.sequence == 0);
2258   mips_relax.sequence = 1;
2259   mips_relax.symbol = symbol;
2260 }
2261
2262 /* Start generating the second version of a relaxable sequence.
2263    See the comment above RELAX_ENCODE for more details.  */
2264
2265 static void
2266 relax_switch (void)
2267 {
2268   assert (mips_relax.sequence == 1);
2269   mips_relax.sequence = 2;
2270 }
2271
2272 /* End the current relaxable sequence.  */
2273
2274 static void
2275 relax_end (void)
2276 {
2277   assert (mips_relax.sequence == 2);
2278   relax_close_frag ();
2279   mips_relax.sequence = 0;
2280 }
2281
2282 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2283    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2284    by VR4120 errata.  */
2285
2286 static unsigned int
2287 classify_vr4120_insn (const char *name)
2288 {
2289   if (strncmp (name, "macc", 4) == 0)
2290     return FIX_VR4120_MACC;
2291   if (strncmp (name, "dmacc", 5) == 0)
2292     return FIX_VR4120_DMACC;
2293   if (strncmp (name, "mult", 4) == 0)
2294     return FIX_VR4120_MULT;
2295   if (strncmp (name, "dmult", 5) == 0)
2296     return FIX_VR4120_DMULT;
2297   if (strstr (name, "div"))
2298     return FIX_VR4120_DIV;
2299   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2300     return FIX_VR4120_MTHILO;
2301   return NUM_FIX_VR4120_CLASSES;
2302 }
2303
2304 /* Return the number of instructions that must separate INSN1 and INSN2,
2305    where INSN1 is the earlier instruction.  Return the worst-case value
2306    for any INSN2 if INSN2 is null.  */
2307
2308 static unsigned int
2309 insns_between (const struct mips_cl_insn *insn1,
2310                const struct mips_cl_insn *insn2)
2311 {
2312   unsigned long pinfo1, pinfo2;
2313
2314   /* This function needs to know which pinfo flags are set for INSN2
2315      and which registers INSN2 uses.  The former is stored in PINFO2 and
2316      the latter is tested via INSN2_USES_REG.  If INSN2 is null, PINFO2
2317      will have every flag set and INSN2_USES_REG will always return true.  */
2318   pinfo1 = insn1->insn_mo->pinfo;
2319   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2320
2321 #define INSN2_USES_REG(REG, CLASS) \
2322    (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2323
2324   /* For most targets, write-after-read dependencies on the HI and LO
2325      registers must be separated by at least two instructions.  */
2326   if (!hilo_interlocks)
2327     {
2328       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2329         return 2;
2330       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2331         return 2;
2332     }
2333
2334   /* If we're working around r7000 errata, there must be two instructions
2335      between an mfhi or mflo and any instruction that uses the result.  */
2336   if (mips_7000_hilo_fix
2337       && MF_HILO_INSN (pinfo1)
2338       && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2339     return 2;
2340
2341   /* If working around VR4120 errata, check for combinations that need
2342      a single intervening instruction.  */
2343   if (mips_fix_vr4120)
2344     {
2345       unsigned int class1, class2;
2346
2347       class1 = classify_vr4120_insn (insn1->insn_mo->name);
2348       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2349         {
2350           if (insn2 == NULL)
2351             return 1;
2352           class2 = classify_vr4120_insn (insn2->insn_mo->name);
2353           if (vr4120_conflicts[class1] & (1 << class2))
2354             return 1;
2355         }
2356     }
2357
2358   if (!mips_opts.mips16)
2359     {
2360       /* Check for GPR or coprocessor load delays.  All such delays
2361          are on the RT register.  */
2362       /* Itbl support may require additional care here.  */
2363       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2364           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2365         {
2366           know (pinfo1 & INSN_WRITE_GPR_T);
2367           if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2368             return 1;
2369         }
2370
2371       /* Check for generic coprocessor hazards.
2372
2373          This case is not handled very well.  There is no special
2374          knowledge of CP0 handling, and the coprocessors other than
2375          the floating point unit are not distinguished at all.  */
2376       /* Itbl support may require additional care here. FIXME!
2377          Need to modify this to include knowledge about
2378          user specified delays!  */
2379       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2380                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2381         {
2382           /* Handle cases where INSN1 writes to a known general coprocessor
2383              register.  There must be a one instruction delay before INSN2
2384              if INSN2 reads that register, otherwise no delay is needed.  */
2385           if (pinfo1 & INSN_WRITE_FPR_T)
2386             {
2387               if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2388                 return 1;
2389             }
2390           else if (pinfo1 & INSN_WRITE_FPR_S)
2391             {
2392               if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2393                 return 1;
2394             }
2395           else
2396             {
2397               /* Read-after-write dependencies on the control registers
2398                  require a two-instruction gap.  */
2399               if ((pinfo1 & INSN_WRITE_COND_CODE)
2400                   && (pinfo2 & INSN_READ_COND_CODE))
2401                 return 2;
2402
2403               /* We don't know exactly what INSN1 does.  If INSN2 is
2404                  also a coprocessor instruction, assume there must be
2405                  a one instruction gap.  */
2406               if (pinfo2 & INSN_COP)
2407                 return 1;
2408             }
2409         }
2410
2411       /* Check for read-after-write dependencies on the coprocessor
2412          control registers in cases where INSN1 does not need a general
2413          coprocessor delay.  This means that INSN1 is a floating point
2414          comparison instruction.  */
2415       /* Itbl support may require additional care here.  */
2416       else if (!cop_interlocks
2417                && (pinfo1 & INSN_WRITE_COND_CODE)
2418                && (pinfo2 & INSN_READ_COND_CODE))
2419         return 1;
2420     }
2421
2422 #undef INSN2_USES_REG
2423
2424   return 0;
2425 }
2426
2427 /* Return the number of nops that would be needed to work around the
2428    VR4130 mflo/mfhi errata if instruction INSN immediately followed
2429    the MAX_VR4130_NOPS instructions described by HISTORY.  */
2430
2431 static int
2432 nops_for_vr4130 (const struct mips_cl_insn *history,
2433                  const struct mips_cl_insn *insn)
2434 {
2435   int i, j, reg;
2436
2437   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
2438      are not affected by the errata.  */
2439   if (insn != 0
2440       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2441           || strcmp (insn->insn_mo->name, "mtlo") == 0
2442           || strcmp (insn->insn_mo->name, "mthi") == 0))
2443     return 0;
2444
2445   /* Search for the first MFLO or MFHI.  */
2446   for (i = 0; i < MAX_VR4130_NOPS; i++)
2447     if (!history[i].noreorder_p && MF_HILO_INSN (history[i].insn_mo->pinfo))
2448       {
2449         /* Extract the destination register.  */
2450         if (mips_opts.mips16)
2451           reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, history[i])];
2452         else
2453           reg = EXTRACT_OPERAND (RD, history[i]);
2454
2455         /* No nops are needed if INSN reads that register.  */
2456         if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2457           return 0;
2458
2459         /* ...or if any of the intervening instructions do.  */
2460         for (j = 0; j < i; j++)
2461           if (insn_uses_reg (&history[j], reg, MIPS_GR_REG))
2462             return 0;
2463
2464         return MAX_VR4130_NOPS - i;
2465       }
2466   return 0;
2467 }
2468
2469 /* Return the number of nops that would be needed if instruction INSN
2470    immediately followed the MAX_NOPS instructions given by HISTORY,
2471    where HISTORY[0] is the most recent instruction.  If INSN is null,
2472    return the worse-case number of nops for any instruction.  */
2473
2474 static int
2475 nops_for_insn (const struct mips_cl_insn *history,
2476                const struct mips_cl_insn *insn)
2477 {
2478   int i, nops, tmp_nops;
2479
2480   nops = 0;
2481   for (i = 0; i < MAX_DELAY_NOPS; i++)
2482     if (!history[i].noreorder_p)
2483       {
2484         tmp_nops = insns_between (history + i, insn) - i;
2485         if (tmp_nops > nops)
2486           nops = tmp_nops;
2487       }
2488
2489   if (mips_fix_vr4130)
2490     {
2491       tmp_nops = nops_for_vr4130 (history, insn);
2492       if (tmp_nops > nops)
2493         nops = tmp_nops;
2494     }
2495
2496   return nops;
2497 }
2498
2499 /* The variable arguments provide NUM_INSNS extra instructions that
2500    might be added to HISTORY.  Return the largest number of nops that
2501    would be needed after the extended sequence.  */
2502
2503 static int
2504 nops_for_sequence (int num_insns, const struct mips_cl_insn *history, ...)
2505 {
2506   va_list args;
2507   struct mips_cl_insn buffer[MAX_NOPS];
2508   struct mips_cl_insn *cursor;
2509   int nops;
2510
2511   va_start (args, history);
2512   cursor = buffer + num_insns;
2513   memcpy (cursor, history, (MAX_NOPS - num_insns) * sizeof (*cursor));
2514   while (cursor > buffer)
2515     *--cursor = *va_arg (args, const struct mips_cl_insn *);
2516
2517   nops = nops_for_insn (buffer, NULL);
2518   va_end (args);
2519   return nops;
2520 }
2521
2522 /* Like nops_for_insn, but if INSN is a branch, take into account the
2523    worst-case delay for the branch target.  */
2524
2525 static int
2526 nops_for_insn_or_target (const struct mips_cl_insn *history,
2527                          const struct mips_cl_insn *insn)
2528 {
2529   int nops, tmp_nops;
2530
2531   nops = nops_for_insn (history, insn);
2532   if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2533                               | INSN_COND_BRANCH_DELAY
2534                               | INSN_COND_BRANCH_LIKELY))
2535     {
2536       tmp_nops = nops_for_sequence (2, history, insn, NOP_INSN);
2537       if (tmp_nops > nops)
2538         nops = tmp_nops;
2539     }
2540   else if (mips_opts.mips16 && (insn->insn_mo->pinfo & MIPS16_INSN_BRANCH))
2541     {
2542       tmp_nops = nops_for_sequence (1, history, insn);
2543       if (tmp_nops > nops)
2544         nops = tmp_nops;
2545     }
2546   return nops;
2547 }
2548
2549 /* Output an instruction.  IP is the instruction information.
2550    ADDRESS_EXPR is an operand of the instruction to be used with
2551    RELOC_TYPE.  */
2552
2553 static void
2554 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2555              bfd_reloc_code_real_type *reloc_type)
2556 {
2557   unsigned long prev_pinfo, pinfo;
2558   relax_stateT prev_insn_frag_type = 0;
2559   bfd_boolean relaxed_branch = FALSE;
2560   segment_info_type *si = seg_info (now_seg);
2561
2562   /* Mark instruction labels in mips16 mode.  */
2563   mips16_mark_labels ();
2564
2565   prev_pinfo = history[0].insn_mo->pinfo;
2566   pinfo = ip->insn_mo->pinfo;
2567
2568   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2569     {
2570       /* There are a lot of optimizations we could do that we don't.
2571          In particular, we do not, in general, reorder instructions.
2572          If you use gcc with optimization, it will reorder
2573          instructions and generally do much more optimization then we
2574          do here; repeating all that work in the assembler would only
2575          benefit hand written assembly code, and does not seem worth
2576          it.  */
2577       int nops = (mips_optimize == 0
2578                   ? nops_for_insn (history, NULL)
2579                   : nops_for_insn_or_target (history, ip));
2580       if (nops > 0)
2581         {
2582           fragS *old_frag;
2583           unsigned long old_frag_offset;
2584           int i;
2585
2586           old_frag = frag_now;
2587           old_frag_offset = frag_now_fix ();
2588
2589           for (i = 0; i < nops; i++)
2590             emit_nop ();
2591
2592           if (listing)
2593             {
2594               listing_prev_line ();
2595               /* We may be at the start of a variant frag.  In case we
2596                  are, make sure there is enough space for the frag
2597                  after the frags created by listing_prev_line.  The
2598                  argument to frag_grow here must be at least as large
2599                  as the argument to all other calls to frag_grow in
2600                  this file.  We don't have to worry about being in the
2601                  middle of a variant frag, because the variants insert
2602                  all needed nop instructions themselves.  */
2603               frag_grow (40);
2604             }
2605
2606           mips_move_labels ();
2607
2608 #ifndef NO_ECOFF_DEBUGGING
2609           if (ECOFF_DEBUGGING)
2610             ecoff_fix_loc (old_frag, old_frag_offset);
2611 #endif
2612         }
2613     }
2614   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2615     {
2616       /* Work out how many nops in prev_nop_frag are needed by IP.  */
2617       int nops = nops_for_insn_or_target (history, ip);
2618       assert (nops <= prev_nop_frag_holds);
2619
2620       /* Enforce NOPS as a minimum.  */
2621       if (nops > prev_nop_frag_required)
2622         prev_nop_frag_required = nops;
2623
2624       if (prev_nop_frag_holds == prev_nop_frag_required)
2625         {
2626           /* Settle for the current number of nops.  Update the history
2627              accordingly (for the benefit of any future .set reorder code).  */
2628           prev_nop_frag = NULL;
2629           insert_into_history (prev_nop_frag_since,
2630                                prev_nop_frag_holds, NOP_INSN);
2631         }
2632       else
2633         {
2634           /* Allow this instruction to replace one of the nops that was
2635              tentatively added to prev_nop_frag.  */
2636           prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2637           prev_nop_frag_holds--;
2638           prev_nop_frag_since++;
2639         }
2640     }
2641
2642 #ifdef OBJ_ELF
2643   /* The value passed to dwarf2_emit_insn is the distance between
2644      the beginning of the current instruction and the address that
2645      should be recorded in the debug tables.  For MIPS16 debug info
2646      we want to use ISA-encoded addresses, so we pass -1 for an
2647      address higher by one than the current.  */
2648   dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2649 #endif
2650
2651   /* Record the frag type before frag_var.  */
2652   if (history[0].frag)
2653     prev_insn_frag_type = history[0].frag->fr_type;
2654
2655   if (address_expr
2656       && *reloc_type == BFD_RELOC_16_PCREL_S2
2657       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2658           || pinfo & INSN_COND_BRANCH_LIKELY)
2659       && mips_relax_branch
2660       /* Don't try branch relaxation within .set nomacro, or within
2661          .set noat if we use $at for PIC computations.  If it turns
2662          out that the branch was out-of-range, we'll get an error.  */
2663       && !mips_opts.warn_about_macros
2664       && !(mips_opts.noat && mips_pic != NO_PIC)
2665       && !mips_opts.mips16)
2666     {
2667       relaxed_branch = TRUE;
2668       add_relaxed_insn (ip, (relaxed_branch_length
2669                              (NULL, NULL,
2670                               (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2671                               : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2672                               : 0)), 4,
2673                         RELAX_BRANCH_ENCODE
2674                         (pinfo & INSN_UNCOND_BRANCH_DELAY,
2675                          pinfo & INSN_COND_BRANCH_LIKELY,
2676                          pinfo & INSN_WRITE_GPR_31,
2677                          0),
2678                         address_expr->X_add_symbol,
2679                         address_expr->X_add_number);
2680       *reloc_type = BFD_RELOC_UNUSED;
2681     }
2682   else if (*reloc_type > BFD_RELOC_UNUSED)
2683     {
2684       /* We need to set up a variant frag.  */
2685       assert (mips_opts.mips16 && address_expr != NULL);
2686       add_relaxed_insn (ip, 4, 0,
2687                         RELAX_MIPS16_ENCODE
2688                         (*reloc_type - BFD_RELOC_UNUSED,
2689                          mips16_small, mips16_ext,
2690                          prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2691                          history[0].mips16_absolute_jump_p),
2692                         make_expr_symbol (address_expr), 0);
2693     }
2694   else if (mips_opts.mips16
2695            && ! ip->use_extend
2696            && *reloc_type != BFD_RELOC_MIPS16_JMP)
2697     {
2698       if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2699         /* Make sure there is enough room to swap this instruction with
2700            a following jump instruction.  */
2701         frag_grow (6);
2702       add_fixed_insn (ip);
2703     }
2704   else
2705     {
2706       if (mips_opts.mips16
2707           && mips_opts.noreorder
2708           && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2709         as_warn (_("extended instruction in delay slot"));
2710
2711       if (mips_relax.sequence)
2712         {
2713           /* If we've reached the end of this frag, turn it into a variant
2714              frag and record the information for the instructions we've
2715              written so far.  */
2716           if (frag_room () < 4)
2717             relax_close_frag ();
2718           mips_relax.sizes[mips_relax.sequence - 1] += 4;
2719         }
2720
2721       if (mips_relax.sequence != 2)
2722         mips_macro_warning.sizes[0] += 4;
2723       if (mips_relax.sequence != 1)
2724         mips_macro_warning.sizes[1] += 4;
2725
2726       if (mips_opts.mips16)
2727         {
2728           ip->fixed_p = 1;
2729           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2730         }
2731       add_fixed_insn (ip);
2732     }
2733
2734   if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2735     {
2736       if (address_expr->X_op == O_constant)
2737         {
2738           unsigned int tmp;
2739
2740           switch (*reloc_type)
2741             {
2742             case BFD_RELOC_32:
2743               ip->insn_opcode |= address_expr->X_add_number;
2744               break;
2745
2746             case BFD_RELOC_MIPS_HIGHEST:
2747               tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
2748               ip->insn_opcode |= tmp & 0xffff;
2749               break;
2750
2751             case BFD_RELOC_MIPS_HIGHER:
2752               tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
2753               ip->insn_opcode |= tmp & 0xffff;
2754               break;
2755
2756             case BFD_RELOC_HI16_S:
2757               tmp = (address_expr->X_add_number + 0x8000) >> 16;
2758               ip->insn_opcode |= tmp & 0xffff;
2759               break;
2760
2761             case BFD_RELOC_HI16:
2762               ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2763               break;
2764
2765             case BFD_RELOC_UNUSED:
2766             case BFD_RELOC_LO16:
2767             case BFD_RELOC_MIPS_GOT_DISP:
2768               ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2769               break;
2770
2771             case BFD_RELOC_MIPS_JMP:
2772               if ((address_expr->X_add_number & 3) != 0)
2773                 as_bad (_("jump to misaligned address (0x%lx)"),
2774                         (unsigned long) address_expr->X_add_number);
2775               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2776               break;
2777
2778             case BFD_RELOC_MIPS16_JMP:
2779               if ((address_expr->X_add_number & 3) != 0)
2780                 as_bad (_("jump to misaligned address (0x%lx)"),
2781                         (unsigned long) address_expr->X_add_number);
2782               ip->insn_opcode |=
2783                 (((address_expr->X_add_number & 0x7c0000) << 3)
2784                  | ((address_expr->X_add_number & 0xf800000) >> 7)
2785                  | ((address_expr->X_add_number & 0x3fffc) >> 2));
2786               break;
2787
2788             case BFD_RELOC_16_PCREL_S2:
2789               if ((address_expr->X_add_number & 3) != 0)
2790                 as_bad (_("branch to misaligned address (0x%lx)"),
2791                         (unsigned long) address_expr->X_add_number);
2792               if (mips_relax_branch)
2793                 goto need_reloc;
2794               if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
2795                 as_bad (_("branch address range overflow (0x%lx)"),
2796                         (unsigned long) address_expr->X_add_number);
2797               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
2798               break;
2799
2800             default:
2801               internalError ();
2802             }
2803         }
2804       else if (*reloc_type < BFD_RELOC_UNUSED)
2805         need_reloc:
2806         {
2807           reloc_howto_type *howto;
2808           int i;
2809
2810           /* In a compound relocation, it is the final (outermost)
2811              operator that determines the relocated field.  */
2812           for (i = 1; i < 3; i++)
2813             if (reloc_type[i] == BFD_RELOC_UNUSED)
2814               break;
2815
2816           howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
2817           ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
2818                                      bfd_get_reloc_size (howto),
2819                                      address_expr,
2820                                      reloc_type[0] == BFD_RELOC_16_PCREL_S2,
2821                                      reloc_type[0]);
2822
2823           /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
2824           if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
2825               && ip->fixp[0]->fx_addsy)
2826             *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
2827
2828           /* These relocations can have an addend that won't fit in
2829              4 octets for 64bit assembly.  */
2830           if (HAVE_64BIT_GPRS
2831               && ! howto->partial_inplace
2832               && (reloc_type[0] == BFD_RELOC_16
2833                   || reloc_type[0] == BFD_RELOC_32
2834                   || reloc_type[0] == BFD_RELOC_MIPS_JMP
2835                   || reloc_type[0] == BFD_RELOC_HI16_S
2836                   || reloc_type[0] == BFD_RELOC_LO16
2837                   || reloc_type[0] == BFD_RELOC_GPREL16
2838                   || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
2839                   || reloc_type[0] == BFD_RELOC_GPREL32
2840                   || reloc_type[0] == BFD_RELOC_64
2841                   || reloc_type[0] == BFD_RELOC_CTOR
2842                   || reloc_type[0] == BFD_RELOC_MIPS_SUB
2843                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
2844                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
2845                   || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
2846                   || reloc_type[0] == BFD_RELOC_MIPS_REL16
2847                   || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
2848                   || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
2849                   || reloc_type[0] == BFD_RELOC_MIPS16_HI16_S
2850                   || reloc_type[0] == BFD_RELOC_MIPS16_LO16))
2851             ip->fixp[0]->fx_no_overflow = 1;
2852
2853           if (mips_relax.sequence)
2854             {
2855               if (mips_relax.first_fixup == 0)
2856                 mips_relax.first_fixup = ip->fixp[0];
2857             }
2858           else if (reloc_needs_lo_p (*reloc_type))
2859             {
2860               struct mips_hi_fixup *hi_fixup;
2861
2862               /* Reuse the last entry if it already has a matching %lo.  */
2863               hi_fixup = mips_hi_fixup_list;
2864               if (hi_fixup == 0
2865                   || !fixup_has_matching_lo_p (hi_fixup->fixp))
2866                 {
2867                   hi_fixup = ((struct mips_hi_fixup *)
2868                               xmalloc (sizeof (struct mips_hi_fixup)));
2869                   hi_fixup->next = mips_hi_fixup_list;
2870                   mips_hi_fixup_list = hi_fixup;
2871                 }
2872               hi_fixup->fixp = ip->fixp[0];
2873               hi_fixup->seg = now_seg;
2874             }
2875
2876           /* Add fixups for the second and third relocations, if given.
2877              Note that the ABI allows the second relocation to be
2878              against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
2879              moment we only use RSS_UNDEF, but we could add support
2880              for the others if it ever becomes necessary.  */
2881           for (i = 1; i < 3; i++)
2882             if (reloc_type[i] != BFD_RELOC_UNUSED)
2883               {
2884                 ip->fixp[i] = fix_new (ip->frag, ip->where,
2885                                        ip->fixp[0]->fx_size, NULL, 0,
2886                                        FALSE, reloc_type[i]);
2887
2888                 /* Use fx_tcbit to mark compound relocs.  */
2889                 ip->fixp[0]->fx_tcbit = 1;
2890                 ip->fixp[i]->fx_tcbit = 1;
2891               }
2892         }
2893     }
2894   install_insn (ip);
2895
2896   /* Update the register mask information.  */
2897   if (! mips_opts.mips16)
2898     {
2899       if (pinfo & INSN_WRITE_GPR_D)
2900         mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
2901       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
2902         mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
2903       if (pinfo & INSN_READ_GPR_S)
2904         mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
2905       if (pinfo & INSN_WRITE_GPR_31)
2906         mips_gprmask |= 1 << RA;
2907       if (pinfo & INSN_WRITE_FPR_D)
2908         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
2909       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
2910         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
2911       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
2912         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
2913       if ((pinfo & INSN_READ_FPR_R) != 0)
2914         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
2915       if (pinfo & INSN_COP)
2916         {
2917           /* We don't keep enough information to sort these cases out.
2918              The itbl support does keep this information however, although
2919              we currently don't support itbl fprmats as part of the cop
2920              instruction.  May want to add this support in the future.  */
2921         }
2922       /* Never set the bit for $0, which is always zero.  */
2923       mips_gprmask &= ~1 << 0;
2924     }
2925   else
2926     {
2927       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
2928         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
2929       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
2930         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
2931       if (pinfo & MIPS16_INSN_WRITE_Z)
2932         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
2933       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
2934         mips_gprmask |= 1 << TREG;
2935       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
2936         mips_gprmask |= 1 << SP;
2937       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
2938         mips_gprmask |= 1 << RA;
2939       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2940         mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2941       if (pinfo & MIPS16_INSN_READ_Z)
2942         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
2943       if (pinfo & MIPS16_INSN_READ_GPR_X)
2944         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
2945     }
2946
2947   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2948     {
2949       /* Filling the branch delay slot is more complex.  We try to
2950          switch the branch with the previous instruction, which we can
2951          do if the previous instruction does not set up a condition
2952          that the branch tests and if the branch is not itself the
2953          target of any branch.  */
2954       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2955           || (pinfo & INSN_COND_BRANCH_DELAY))
2956         {
2957           if (mips_optimize < 2
2958               /* If we have seen .set volatile or .set nomove, don't
2959                  optimize.  */
2960               || mips_opts.nomove != 0
2961               /* We can't swap if the previous instruction's position
2962                  is fixed.  */
2963               || history[0].fixed_p
2964               /* If the previous previous insn was in a .set
2965                  noreorder, we can't swap.  Actually, the MIPS
2966                  assembler will swap in this situation.  However, gcc
2967                  configured -with-gnu-as will generate code like
2968                    .set noreorder
2969                    lw   $4,XXX
2970                    .set reorder
2971                    INSN
2972                    bne  $4,$0,foo
2973                  in which we can not swap the bne and INSN.  If gcc is
2974                  not configured -with-gnu-as, it does not output the
2975                  .set pseudo-ops.  */
2976               || history[1].noreorder_p
2977               /* If the branch is itself the target of a branch, we
2978                  can not swap.  We cheat on this; all we check for is
2979                  whether there is a label on this instruction.  If
2980                  there are any branches to anything other than a
2981                  label, users must use .set noreorder.  */
2982               || si->label_list != NULL
2983               /* If the previous instruction is in a variant frag
2984                  other than this branch's one, we cannot do the swap.
2985                  This does not apply to the mips16, which uses variant
2986                  frags for different purposes.  */
2987               || (! mips_opts.mips16
2988                   && prev_insn_frag_type == rs_machine_dependent)
2989               /* Check for conflicts between the branch and the instructions
2990                  before the candidate delay slot.  */
2991               || nops_for_insn (history + 1, ip) > 0
2992               /* Check for conflicts between the swapped sequence and the
2993                  target of the branch.  */
2994               || nops_for_sequence (2, history + 1, ip, history) > 0
2995               /* We do not swap with a trap instruction, since it
2996                  complicates trap handlers to have the trap
2997                  instruction be in a delay slot.  */
2998               || (prev_pinfo & INSN_TRAP)
2999               /* If the branch reads a register that the previous
3000                  instruction sets, we can not swap.  */
3001               || (! mips_opts.mips16
3002                   && (prev_pinfo & INSN_WRITE_GPR_T)
3003                   && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
3004                                     MIPS_GR_REG))
3005               || (! mips_opts.mips16
3006                   && (prev_pinfo & INSN_WRITE_GPR_D)
3007                   && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
3008                                     MIPS_GR_REG))
3009               || (mips_opts.mips16
3010                   && (((prev_pinfo & MIPS16_INSN_WRITE_X)
3011                        && (insn_uses_reg
3012                            (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3013                             MIPS16_REG)))
3014                       || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
3015                           && (insn_uses_reg
3016                               (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3017                                MIPS16_REG)))
3018                       || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
3019                           && (insn_uses_reg
3020                               (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3021                                MIPS16_REG)))
3022                       || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3023                           && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3024                       || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3025                           && insn_uses_reg (ip, RA, MIPS_GR_REG))
3026                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3027                           && insn_uses_reg (ip,
3028                                             MIPS16OP_EXTRACT_REG32R
3029                                               (history[0].insn_opcode),
3030                                             MIPS_GR_REG))))
3031               /* If the branch writes a register that the previous
3032                  instruction sets, we can not swap (we know that
3033                  branches write only to RD or to $31).  */
3034               || (! mips_opts.mips16
3035                   && (prev_pinfo & INSN_WRITE_GPR_T)
3036                   && (((pinfo & INSN_WRITE_GPR_D)
3037                        && (EXTRACT_OPERAND (RT, history[0])
3038                            == EXTRACT_OPERAND (RD, *ip)))
3039                       || ((pinfo & INSN_WRITE_GPR_31)
3040                           && EXTRACT_OPERAND (RT, history[0]) == RA)))
3041               || (! mips_opts.mips16
3042                   && (prev_pinfo & INSN_WRITE_GPR_D)
3043                   && (((pinfo & INSN_WRITE_GPR_D)
3044                        && (EXTRACT_OPERAND (RD, history[0])
3045                            == EXTRACT_OPERAND (RD, *ip)))
3046                       || ((pinfo & INSN_WRITE_GPR_31)
3047                           && EXTRACT_OPERAND (RD, history[0]) == RA)))
3048               || (mips_opts.mips16
3049                   && (pinfo & MIPS16_INSN_WRITE_31)
3050                   && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3051                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3052                           && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3053                               == RA))))
3054               /* If the branch writes a register that the previous
3055                  instruction reads, we can not swap (we know that
3056                  branches only write to RD or to $31).  */
3057               || (! mips_opts.mips16
3058                   && (pinfo & INSN_WRITE_GPR_D)
3059                   && insn_uses_reg (&history[0],
3060                                     EXTRACT_OPERAND (RD, *ip),
3061                                     MIPS_GR_REG))
3062               || (! mips_opts.mips16
3063                   && (pinfo & INSN_WRITE_GPR_31)
3064                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3065               || (mips_opts.mips16
3066                   && (pinfo & MIPS16_INSN_WRITE_31)
3067                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3068               /* If one instruction sets a condition code and the
3069                  other one uses a condition code, we can not swap.  */
3070               || ((pinfo & INSN_READ_COND_CODE)
3071                   && (prev_pinfo & INSN_WRITE_COND_CODE))
3072               || ((pinfo & INSN_WRITE_COND_CODE)
3073                   && (prev_pinfo & INSN_READ_COND_CODE))
3074               /* If the previous instruction uses the PC, we can not
3075                  swap.  */
3076               || (mips_opts.mips16
3077                   && (prev_pinfo & MIPS16_INSN_READ_PC))
3078               /* If the previous instruction had a fixup in mips16
3079                  mode, we can not swap.  This normally means that the
3080                  previous instruction was a 4 byte branch anyhow.  */
3081               || (mips_opts.mips16 && history[0].fixp[0])
3082               /* If the previous instruction is a sync, sync.l, or
3083                  sync.p, we can not swap.  */
3084               || (prev_pinfo & INSN_SYNC))
3085             {
3086               if (mips_opts.mips16
3087                   && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3088                   && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3089                   && ISA_SUPPORTS_MIPS16E)
3090                 {
3091                   /* Convert MIPS16 jr/jalr into a "compact" jump.  */
3092                   ip->insn_opcode |= 0x0080;
3093                   install_insn (ip);
3094                   insert_into_history (0, 1, ip);
3095                 } 
3096               else
3097                 {
3098                   /* We could do even better for unconditional branches to
3099                      portions of this object file; we could pick up the
3100                      instruction at the destination, put it in the delay
3101                      slot, and bump the destination address.  */
3102                   insert_into_history (0, 1, ip);
3103                   emit_nop ();
3104                 }
3105                 
3106               if (mips_relax.sequence)
3107                 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3108             }
3109           else
3110             {
3111               /* It looks like we can actually do the swap.  */
3112               struct mips_cl_insn delay = history[0];
3113               if (mips_opts.mips16)
3114                 {
3115                   know (delay.frag == ip->frag);
3116                   move_insn (ip, delay.frag, delay.where);
3117                   move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3118                 }
3119               else if (relaxed_branch)
3120                 {
3121                   /* Add the delay slot instruction to the end of the
3122                      current frag and shrink the fixed part of the
3123                      original frag.  If the branch occupies the tail of
3124                      the latter, move it backwards to cover the gap.  */
3125                   delay.frag->fr_fix -= 4;
3126                   if (delay.frag == ip->frag)
3127                     move_insn (ip, ip->frag, ip->where - 4);
3128                   add_fixed_insn (&delay);
3129                 }
3130               else
3131                 {
3132                   move_insn (&delay, ip->frag, ip->where);
3133                   move_insn (ip, history[0].frag, history[0].where);
3134                 }
3135               history[0] = *ip;
3136               delay.fixed_p = 1;
3137               insert_into_history (0, 1, &delay);
3138             }
3139
3140           /* If that was an unconditional branch, forget the previous
3141              insn information.  */
3142           if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3143             mips_no_prev_insn ();
3144         }
3145       else if (pinfo & INSN_COND_BRANCH_LIKELY)
3146         {
3147           /* We don't yet optimize a branch likely.  What we should do
3148              is look at the target, copy the instruction found there
3149              into the delay slot, and increment the branch to jump to
3150              the next instruction.  */
3151           insert_into_history (0, 1, ip);
3152           emit_nop ();
3153         }
3154       else
3155         insert_into_history (0, 1, ip);
3156     }
3157   else
3158     insert_into_history (0, 1, ip);
3159
3160   /* We just output an insn, so the next one doesn't have a label.  */
3161   mips_clear_insn_labels ();
3162 }
3163
3164 /* Forget that there was any previous instruction or label.  */
3165
3166 static void
3167 mips_no_prev_insn (void)
3168 {
3169   prev_nop_frag = NULL;
3170   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3171   mips_clear_insn_labels ();
3172 }
3173
3174 /* This function must be called before we emit something other than
3175    instructions.  It is like mips_no_prev_insn except that it inserts
3176    any NOPS that might be needed by previous instructions.  */
3177
3178 void
3179 mips_emit_delays (void)
3180 {
3181   if (! mips_opts.noreorder)
3182     {
3183       int nops = nops_for_insn (history, NULL);
3184       if (nops > 0)
3185         {
3186           while (nops-- > 0)
3187             add_fixed_insn (NOP_INSN);
3188           mips_move_labels ();
3189         }
3190     }
3191   mips_no_prev_insn ();
3192 }
3193
3194 /* Start a (possibly nested) noreorder block.  */
3195
3196 static void
3197 start_noreorder (void)
3198 {
3199   if (mips_opts.noreorder == 0)
3200     {
3201       unsigned int i;
3202       int nops;
3203
3204       /* None of the instructions before the .set noreorder can be moved.  */
3205       for (i = 0; i < ARRAY_SIZE (history); i++)
3206         history[i].fixed_p = 1;
3207
3208       /* Insert any nops that might be needed between the .set noreorder
3209          block and the previous instructions.  We will later remove any
3210          nops that turn out not to be needed.  */
3211       nops = nops_for_insn (history, NULL);
3212       if (nops > 0)
3213         {
3214           if (mips_optimize != 0)
3215             {
3216               /* Record the frag which holds the nop instructions, so
3217                  that we can remove them if we don't need them.  */
3218               frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3219               prev_nop_frag = frag_now;
3220               prev_nop_frag_holds = nops;
3221               prev_nop_frag_required = 0;
3222               prev_nop_frag_since = 0;
3223             }
3224
3225           for (; nops > 0; --nops)
3226             add_fixed_insn (NOP_INSN);
3227
3228           /* Move on to a new frag, so that it is safe to simply
3229              decrease the size of prev_nop_frag.  */
3230           frag_wane (frag_now);
3231           frag_new (0);
3232           mips_move_labels ();
3233         }
3234       mips16_mark_labels ();
3235       mips_clear_insn_labels ();
3236     }
3237   mips_opts.noreorder++;
3238   mips_any_noreorder = 1;
3239 }
3240
3241 /* End a nested noreorder block.  */
3242
3243 static void
3244 end_noreorder (void)
3245 {
3246   mips_opts.noreorder--;
3247   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3248     {
3249       /* Commit to inserting prev_nop_frag_required nops and go back to
3250          handling nop insertion the .set reorder way.  */
3251       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3252                                 * (mips_opts.mips16 ? 2 : 4));
3253       insert_into_history (prev_nop_frag_since,
3254                            prev_nop_frag_required, NOP_INSN);
3255       prev_nop_frag = NULL;
3256     }
3257 }
3258
3259 /* Set up global variables for the start of a new macro.  */
3260
3261 static void
3262 macro_start (void)
3263 {
3264   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3265   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3266                                      && (history[0].insn_mo->pinfo
3267                                          & (INSN_UNCOND_BRANCH_DELAY
3268                                             | INSN_COND_BRANCH_DELAY
3269                                             | INSN_COND_BRANCH_LIKELY)) != 0);
3270 }
3271
3272 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3273    for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
3274    RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
3275
3276 static const char *
3277 macro_warning (relax_substateT subtype)
3278 {
3279   if (subtype & RELAX_DELAY_SLOT)
3280     return _("Macro instruction expanded into multiple instructions"
3281              " in a branch delay slot");
3282   else if (subtype & RELAX_NOMACRO)
3283     return _("Macro instruction expanded into multiple instructions");
3284   else
3285     return 0;
3286 }
3287
3288 /* Finish up a macro.  Emit warnings as appropriate.  */
3289
3290 static void
3291 macro_end (void)
3292 {
3293   if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3294     {
3295       relax_substateT subtype;
3296
3297       /* Set up the relaxation warning flags.  */
3298       subtype = 0;
3299       if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3300         subtype |= RELAX_SECOND_LONGER;
3301       if (mips_opts.warn_about_macros)
3302         subtype |= RELAX_NOMACRO;
3303       if (mips_macro_warning.delay_slot_p)
3304         subtype |= RELAX_DELAY_SLOT;
3305
3306       if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3307         {
3308           /* Either the macro has a single implementation or both
3309              implementations are longer than 4 bytes.  Emit the
3310              warning now.  */
3311           const char *msg = macro_warning (subtype);
3312           if (msg != 0)
3313             as_warn (msg);
3314         }
3315       else
3316         {
3317           /* One implementation might need a warning but the other
3318              definitely doesn't.  */
3319           mips_macro_warning.first_frag->fr_subtype |= subtype;
3320         }
3321     }
3322 }
3323
3324 /* Read a macro's relocation codes from *ARGS and store them in *R.
3325    The first argument in *ARGS will be either the code for a single
3326    relocation or -1 followed by the three codes that make up a
3327    composite relocation.  */
3328
3329 static void
3330 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3331 {
3332   int i, next;
3333
3334   next = va_arg (*args, int);
3335   if (next >= 0)
3336     r[0] = (bfd_reloc_code_real_type) next;
3337   else
3338     for (i = 0; i < 3; i++)
3339       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3340 }
3341
3342 /* Build an instruction created by a macro expansion.  This is passed
3343    a pointer to the count of instructions created so far, an
3344    expression, the name of the instruction to build, an operand format
3345    string, and corresponding arguments.  */
3346
3347 static void
3348 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3349 {
3350   const struct mips_opcode *mo;
3351   struct mips_cl_insn insn;
3352   bfd_reloc_code_real_type r[3];
3353   va_list args;
3354
3355   va_start (args, fmt);
3356
3357   if (mips_opts.mips16)
3358     {
3359       mips16_macro_build (ep, name, fmt, args);
3360       va_end (args);
3361       return;
3362     }
3363
3364   r[0] = BFD_RELOC_UNUSED;
3365   r[1] = BFD_RELOC_UNUSED;
3366   r[2] = BFD_RELOC_UNUSED;
3367   mo = (struct mips_opcode *) hash_find (op_hash, name);
3368   assert (mo);
3369   assert (strcmp (name, mo->name) == 0);
3370
3371   while (1)
3372     {
3373       /* Search until we get a match for NAME.  It is assumed here that
3374          macros will never generate MDMX, MIPS-3D, or MT instructions.  */
3375       if (strcmp (fmt, mo->args) == 0
3376           && mo->pinfo != INSN_MACRO
3377           && OPCODE_IS_MEMBER (mo,
3378                                (mips_opts.isa
3379                                 | (mips_opts.mips16 ? INSN_MIPS16 : 0)
3380                                 | (mips_opts.ase_dsp ? INSN_DSP : 0)
3381                                 | ((mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
3382                                    ? INSN_DSP64 : 0)
3383                                 | (mips_opts.ase_dspr2 ? INSN_DSPR2 : 0)
3384                                 | (mips_opts.ase_smartmips ? INSN_SMARTMIPS : 0)),
3385                                mips_opts.arch)
3386           && (mips_opts.arch != CPU_R4650 || (mo->pinfo & FP_D) == 0))
3387         break;
3388
3389       ++mo;
3390       assert (mo->name);
3391       assert (strcmp (name, mo->name) == 0);
3392     }
3393
3394   create_insn (&insn, mo);
3395   for (;;)
3396     {
3397       switch (*fmt++)
3398         {
3399         case '\0':
3400           break;
3401
3402         case ',':
3403         case '(':
3404         case ')':
3405           continue;
3406
3407         case '+':
3408           switch (*fmt++)
3409             {
3410             case 'A':
3411             case 'E':
3412               INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3413               continue;
3414
3415             case 'B':
3416             case 'F':
3417               /* Note that in the macro case, these arguments are already
3418                  in MSB form.  (When handling the instruction in the
3419                  non-macro case, these arguments are sizes from which
3420                  MSB values must be calculated.)  */
3421               INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3422               continue;
3423
3424             case 'C':
3425             case 'G':
3426             case 'H':
3427               /* Note that in the macro case, these arguments are already
3428                  in MSBD form.  (When handling the instruction in the
3429                  non-macro case, these arguments are sizes from which
3430                  MSBD values must be calculated.)  */
3431               INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3432               continue;
3433
3434             default:
3435               internalError ();
3436             }
3437           continue;
3438
3439         case '2':
3440           INSERT_OPERAND (BP, insn, va_arg (args, int));
3441           continue;
3442
3443         case 't':
3444         case 'w':
3445         case 'E':
3446           INSERT_OPERAND (RT, insn, va_arg (args, int));
3447           continue;
3448
3449         case 'c':
3450           INSERT_OPERAND (CODE, insn, va_arg (args, int));
3451           continue;
3452
3453         case 'T':
3454         case 'W':
3455           INSERT_OPERAND (FT, insn, va_arg (args, int));
3456           continue;
3457
3458         case 'd':
3459         case 'G':
3460         case 'K':
3461           INSERT_OPERAND (RD, insn, va_arg (args, int));
3462           continue;
3463
3464         case 'U':
3465           {
3466             int tmp = va_arg (args, int);
3467
3468             INSERT_OPERAND (RT, insn, tmp);
3469             INSERT_OPERAND (RD, insn, tmp);
3470             continue;
3471           }
3472
3473         case 'V':
3474         case 'S':
3475           INSERT_OPERAND (FS, insn, va_arg (args, int));
3476           continue;
3477
3478         case 'z':
3479           continue;
3480
3481         case '<':
3482           INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3483           continue;
3484
3485         case 'D':
3486           INSERT_OPERAND (FD, insn, va_arg (args, int));
3487           continue;
3488
3489         case 'B':
3490           INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3491           continue;
3492
3493         case 'J':
3494           INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3495           continue;
3496
3497         case 'q':
3498           INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3499           continue;
3500
3501         case 'b':
3502         case 's':
3503         case 'r':
3504         case 'v':
3505           INSERT_OPERAND (RS, insn, va_arg (args, int));
3506           continue;
3507
3508         case 'i':
3509         case 'j':
3510         case 'o':
3511           macro_read_relocs (&args, r);
3512           assert (*r == BFD_RELOC_GPREL16
3513                   || *r == BFD_RELOC_MIPS_LITERAL
3514                   || *r == BFD_RELOC_MIPS_HIGHER
3515                   || *r == BFD_RELOC_HI16_S
3516                   || *r == BFD_RELOC_LO16
3517                   || *r == BFD_RELOC_MIPS_GOT16
3518                   || *r == BFD_RELOC_MIPS_CALL16
3519                   || *r == BFD_RELOC_MIPS_GOT_DISP
3520                   || *r == BFD_RELOC_MIPS_GOT_PAGE
3521                   || *r == BFD_RELOC_MIPS_GOT_OFST
3522                   || *r == BFD_RELOC_MIPS_GOT_LO16
3523                   || *r == BFD_RELOC_MIPS_CALL_LO16);
3524           continue;
3525
3526         case 'u':
3527           macro_read_relocs (&args, r);
3528           assert (ep != NULL
3529                   && (ep->X_op == O_constant
3530                       || (ep->X_op == O_symbol
3531                           && (*r == BFD_RELOC_MIPS_HIGHEST
3532                               || *r == BFD_RELOC_HI16_S
3533                               || *r == BFD_RELOC_HI16
3534                               || *r == BFD_RELOC_GPREL16
3535                               || *r == BFD_RELOC_MIPS_GOT_HI16
3536                               || *r == BFD_RELOC_MIPS_CALL_HI16))));
3537           continue;
3538
3539         case 'p':
3540           assert (ep != NULL);
3541
3542           /*
3543            * This allows macro() to pass an immediate expression for
3544            * creating short branches without creating a symbol.
3545            *
3546            * We don't allow branch relaxation for these branches, as
3547            * they should only appear in ".set nomacro" anyway.
3548            */
3549           if (ep->X_op == O_constant)
3550             {
3551               if ((ep->X_add_number & 3) != 0)
3552                 as_bad (_("branch to misaligned address (0x%lx)"),
3553                         (unsigned long) ep->X_add_number);
3554               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3555                 as_bad (_("branch address range overflow (0x%lx)"),
3556                         (unsigned long) ep->X_add_number);
3557               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3558               ep = NULL;
3559             }
3560           else
3561             *r = BFD_RELOC_16_PCREL_S2;
3562           continue;
3563
3564         case 'a':
3565           assert (ep != NULL);
3566           *r = BFD_RELOC_MIPS_JMP;
3567           continue;
3568
3569         case 'C':
3570           INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
3571           continue;
3572
3573         case 'k':
3574           INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
3575           continue;
3576
3577         default:
3578           internalError ();
3579         }
3580       break;
3581     }
3582   va_end (args);
3583   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3584
3585   append_insn (&insn, ep, r);
3586 }
3587
3588 static void
3589 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3590                     va_list args)
3591 {
3592   struct mips_opcode *mo;
3593   struct mips_cl_insn insn;
3594   bfd_reloc_code_real_type r[3]
3595     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3596
3597   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3598   assert (mo);
3599   assert (strcmp (name, mo->name) == 0);
3600
3601   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3602     {
3603       ++mo;
3604       assert (mo->name);
3605       assert (strcmp (name, mo->name) == 0);
3606     }
3607
3608   create_insn (&insn, mo);
3609   for (;;)
3610     {
3611       int c;
3612
3613       c = *fmt++;
3614       switch (c)
3615         {
3616         case '\0':
3617           break;
3618
3619         case ',':
3620         case '(':
3621         case ')':
3622           continue;
3623
3624         case 'y':
3625         case 'w':
3626           MIPS16_INSERT_OPERAND (RY, insn, va_arg (args, int));
3627           continue;
3628
3629         case 'x':
3630         case 'v':
3631           MIPS16_INSERT_OPERAND (RX, insn, va_arg (args, int));
3632           continue;
3633
3634         case 'z':
3635           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (args, int));
3636           continue;
3637
3638         case 'Z':
3639           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (args, int));
3640           continue;
3641
3642         case '0':
3643         case 'S':
3644         case 'P':
3645         case 'R':
3646           continue;
3647
3648         case 'X':
3649           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (args, int));
3650           continue;
3651
3652         case 'Y':
3653           {
3654             int regno;
3655
3656             regno = va_arg (args, int);
3657             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3658             MIPS16_INSERT_OPERAND (REG32R, insn, regno);
3659           }
3660           continue;
3661
3662         case '<':
3663         case '>':
3664         case '4':
3665         case '5':
3666         case 'H':
3667         case 'W':
3668         case 'D':
3669         case 'j':
3670         case '8':
3671         case 'V':
3672         case 'C':
3673         case 'U':
3674         case 'k':
3675         case 'K':
3676         case 'p':
3677         case 'q':
3678           {
3679             assert (ep != NULL);
3680
3681             if (ep->X_op != O_constant)
3682               *r = (int) BFD_RELOC_UNUSED + c;
3683             else
3684               {
3685                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3686                               FALSE, &insn.insn_opcode, &insn.use_extend,
3687                               &insn.extend);
3688                 ep = NULL;
3689                 *r = BFD_RELOC_UNUSED;
3690               }
3691           }
3692           continue;
3693
3694         case '6':
3695           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (args, int));
3696           continue;
3697         }
3698
3699       break;
3700     }
3701
3702   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3703
3704   append_insn (&insn, ep, r);
3705 }
3706
3707 /*
3708  * Sign-extend 32-bit mode constants that have bit 31 set and all
3709  * higher bits unset.
3710  */
3711 static void
3712 normalize_constant_expr (expressionS *ex)
3713 {
3714   if (ex->X_op == O_constant
3715       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3716     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3717                         - 0x80000000);
3718 }
3719
3720 /*
3721  * Sign-extend 32-bit mode address offsets that have bit 31 set and
3722  * all higher bits unset.
3723  */
3724 static void
3725 normalize_address_expr (expressionS *ex)
3726 {
3727   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3728         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3729       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3730     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3731                         - 0x80000000);
3732 }
3733
3734 /*
3735  * Generate a "jalr" instruction with a relocation hint to the called
3736  * function.  This occurs in NewABI PIC code.
3737  */
3738 static void
3739 macro_build_jalr (expressionS *ep)
3740 {
3741   char *f = NULL;
3742
3743   if (HAVE_NEWABI)
3744     {
3745       frag_grow (8);
3746       f = frag_more (0);
3747     }
3748   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
3749   if (HAVE_NEWABI)
3750     fix_new_exp (frag_now, f - frag_now->fr_literal,
3751                  4, ep, FALSE, BFD_RELOC_MIPS_JALR);
3752 }
3753
3754 /*
3755  * Generate a "lui" instruction.
3756  */
3757 static void
3758 macro_build_lui (expressionS *ep, int regnum)
3759 {
3760   expressionS high_expr;
3761   const struct mips_opcode *mo;
3762   struct mips_cl_insn insn;
3763   bfd_reloc_code_real_type r[3]
3764     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3765   const char *name = "lui";
3766   const char *fmt = "t,u";
3767
3768   assert (! mips_opts.mips16);
3769
3770   high_expr = *ep;
3771
3772   if (high_expr.X_op == O_constant)
3773     {
3774       /* We can compute the instruction now without a relocation entry.  */
3775       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3776                                 >> 16) & 0xffff;
3777       *r = BFD_RELOC_UNUSED;
3778     }
3779   else
3780     {
3781       assert (ep->X_op == O_symbol);
3782       /* _gp_disp is a special case, used from s_cpload.
3783          __gnu_local_gp is used if mips_no_shared.  */
3784       assert (mips_pic == NO_PIC
3785               || (! HAVE_NEWABI
3786                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
3787               || (! mips_in_shared
3788                   && strcmp (S_GET_NAME (ep->X_add_symbol),
3789                              "__gnu_local_gp") == 0));
3790       *r = BFD_RELOC_HI16_S;
3791     }
3792
3793   mo = hash_find (op_hash, name);
3794   assert (strcmp (name, mo->name) == 0);
3795   assert (strcmp (fmt, mo->args) == 0);
3796   create_insn (&insn, mo);
3797
3798   insn.insn_opcode = insn.insn_mo->match;
3799   INSERT_OPERAND (RT, insn, regnum);
3800   if (*r == BFD_RELOC_UNUSED)
3801     {
3802       insn.insn_opcode |= high_expr.X_add_number;
3803       append_insn (&insn, NULL, r);
3804     }
3805   else
3806     append_insn (&insn, &high_expr, r);
3807 }
3808
3809 /* Generate a sequence of instructions to do a load or store from a constant
3810    offset off of a base register (breg) into/from a target register (treg),
3811    using AT if necessary.  */
3812 static void
3813 macro_build_ldst_constoffset (expressionS *ep, const char *op,
3814                               int treg, int breg, int dbl)
3815 {
3816   assert (ep->X_op == O_constant);
3817
3818   /* Sign-extending 32-bit constants makes their handling easier.  */
3819   if (!dbl)
3820     normalize_constant_expr (ep);
3821
3822   /* Right now, this routine can only handle signed 32-bit constants.  */
3823   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
3824     as_warn (_("operand overflow"));
3825
3826   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3827     {
3828       /* Signed 16-bit offset will fit in the op.  Easy!  */
3829       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
3830     }
3831   else
3832     {
3833       /* 32-bit offset, need multiple instructions and AT, like:
3834            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
3835            addu     $tempreg,$tempreg,$breg
3836            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
3837          to handle the complete offset.  */
3838       macro_build_lui (ep, AT);
3839       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
3840       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
3841
3842       if (mips_opts.noat)
3843         as_bad (_("Macro used $at after \".set noat\""));
3844     }
3845 }
3846
3847 /*                      set_at()
3848  * Generates code to set the $at register to true (one)
3849  * if reg is less than the immediate expression.
3850  */
3851 static void
3852 set_at (int reg, int unsignedp)
3853 {
3854   if (imm_expr.X_op == O_constant
3855       && imm_expr.X_add_number >= -0x8000
3856       && imm_expr.X_add_number < 0x8000)
3857     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
3858                  AT, reg, BFD_RELOC_LO16);
3859   else
3860     {
3861       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
3862       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
3863     }
3864 }
3865
3866 /* Warn if an expression is not a constant.  */
3867
3868 static void
3869 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
3870 {
3871   if (ex->X_op == O_big)
3872     as_bad (_("unsupported large constant"));
3873   else if (ex->X_op != O_constant)
3874     as_bad (_("Instruction %s requires absolute expression"),
3875             ip->insn_mo->name);
3876
3877   if (HAVE_32BIT_GPRS)
3878     normalize_constant_expr (ex);
3879 }
3880
3881 /* Count the leading zeroes by performing a binary chop. This is a
3882    bulky bit of source, but performance is a LOT better for the
3883    majority of values than a simple loop to count the bits:
3884        for (lcnt = 0; (lcnt < 32); lcnt++)
3885          if ((v) & (1 << (31 - lcnt)))
3886            break;
3887   However it is not code size friendly, and the gain will drop a bit
3888   on certain cached systems.
3889 */
3890 #define COUNT_TOP_ZEROES(v)             \
3891   (((v) & ~0xffff) == 0                 \
3892    ? ((v) & ~0xff) == 0                 \
3893      ? ((v) & ~0xf) == 0                \
3894        ? ((v) & ~0x3) == 0              \
3895          ? ((v) & ~0x1) == 0            \
3896            ? !(v)                       \
3897              ? 32                       \
3898              : 31                       \
3899            : 30                         \
3900          : ((v) & ~0x7) == 0            \
3901            ? 29                         \
3902            : 28                         \
3903        : ((v) & ~0x3f) == 0             \
3904          ? ((v) & ~0x1f) == 0           \
3905            ? 27                         \
3906            : 26                         \
3907          : ((v) & ~0x7f) == 0           \
3908            ? 25                         \
3909            : 24                         \
3910      : ((v) & ~0xfff) == 0              \
3911        ? ((v) & ~0x3ff) == 0            \
3912          ? ((v) & ~0x1ff) == 0          \
3913            ? 23                         \
3914            : 22                         \
3915          : ((v) & ~0x7ff) == 0          \
3916            ? 21                         \
3917            : 20                         \
3918        : ((v) & ~0x3fff) == 0           \
3919          ? ((v) & ~0x1fff) == 0         \
3920            ? 19                         \
3921            : 18                         \
3922          : ((v) & ~0x7fff) == 0         \
3923            ? 17                         \
3924            : 16                         \
3925    : ((v) & ~0xffffff) == 0             \
3926      ? ((v) & ~0xfffff) == 0            \
3927        ? ((v) & ~0x3ffff) == 0          \
3928          ? ((v) & ~0x1ffff) == 0        \
3929            ? 15                         \
3930            : 14                         \
3931          : ((v) & ~0x7ffff) == 0        \
3932            ? 13                         \
3933            : 12                         \
3934        : ((v) & ~0x3fffff) == 0         \
3935          ? ((v) & ~0x1fffff) == 0       \
3936            ? 11                         \
3937            : 10                         \
3938          : ((v) & ~0x7fffff) == 0       \
3939            ? 9                          \
3940            : 8                          \
3941      : ((v) & ~0xfffffff) == 0          \
3942        ? ((v) & ~0x3ffffff) == 0        \
3943          ? ((v) & ~0x1ffffff) == 0      \
3944            ? 7                          \
3945            : 6                          \
3946          : ((v) & ~0x7ffffff) == 0      \
3947            ? 5                          \
3948            : 4                          \
3949        : ((v) & ~0x3fffffff) == 0       \
3950          ? ((v) & ~0x1fffffff) == 0     \
3951            ? 3                          \
3952            : 2                          \
3953          : ((v) & ~0x7fffffff) == 0     \
3954            ? 1                          \
3955            : 0)
3956
3957 /*                      load_register()
3958  *  This routine generates the least number of instructions necessary to load
3959  *  an absolute expression value into a register.
3960  */
3961 static void
3962 load_register (int reg, expressionS *ep, int dbl)
3963 {
3964   int freg;
3965   expressionS hi32, lo32;
3966
3967   if (ep->X_op != O_big)
3968     {
3969       assert (ep->X_op == O_constant);
3970
3971       /* Sign-extending 32-bit constants makes their handling easier.  */
3972       if (!dbl)
3973         normalize_constant_expr (ep);
3974
3975       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
3976         {
3977           /* We can handle 16 bit signed values with an addiu to
3978              $zero.  No need to ever use daddiu here, since $zero and
3979              the result are always correct in 32 bit mode.  */
3980           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3981           return;
3982         }
3983       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3984         {
3985           /* We can handle 16 bit unsigned values with an ori to
3986              $zero.  */
3987           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3988           return;
3989         }
3990       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
3991         {
3992           /* 32 bit values require an lui.  */
3993           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
3994           if ((ep->X_add_number & 0xffff) != 0)
3995             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3996           return;
3997         }
3998     }
3999
4000   /* The value is larger than 32 bits.  */
4001
4002   if (!dbl || HAVE_32BIT_GPRS)
4003     {
4004       char value[32];
4005
4006       sprintf_vma (value, ep->X_add_number);
4007       as_bad (_("Number (0x%s) larger than 32 bits"), value);
4008       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4009       return;
4010     }
4011
4012   if (ep->X_op != O_big)
4013     {
4014       hi32 = *ep;
4015       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4016       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4017       hi32.X_add_number &= 0xffffffff;
4018       lo32 = *ep;
4019       lo32.X_add_number &= 0xffffffff;
4020     }
4021   else
4022     {
4023       assert (ep->X_add_number > 2);
4024       if (ep->X_add_number == 3)
4025         generic_bignum[3] = 0;
4026       else if (ep->X_add_number > 4)
4027         as_bad (_("Number larger than 64 bits"));
4028       lo32.X_op = O_constant;
4029       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4030       hi32.X_op = O_constant;
4031       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4032     }
4033
4034   if (hi32.X_add_number == 0)
4035     freg = 0;
4036   else
4037     {
4038       int shift, bit;
4039       unsigned long hi, lo;
4040
4041       if (hi32.X_add_number == (offsetT) 0xffffffff)
4042         {
4043           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4044             {
4045               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4046               return;
4047             }
4048           if (lo32.X_add_number & 0x80000000)
4049             {
4050               macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4051               if (lo32.X_add_number & 0xffff)
4052                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4053               return;
4054             }
4055         }
4056
4057       /* Check for 16bit shifted constant.  We know that hi32 is
4058          non-zero, so start the mask on the first bit of the hi32
4059          value.  */
4060       shift = 17;
4061       do
4062         {
4063           unsigned long himask, lomask;
4064
4065           if (shift < 32)
4066             {
4067               himask = 0xffff >> (32 - shift);
4068               lomask = (0xffff << shift) & 0xffffffff;
4069             }
4070           else
4071             {
4072               himask = 0xffff << (shift - 32);
4073               lomask = 0;
4074             }
4075           if ((hi32.X_add_number & ~(offsetT) himask) == 0
4076               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4077             {
4078               expressionS tmp;
4079
4080               tmp.X_op = O_constant;
4081               if (shift < 32)
4082                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4083                                     | (lo32.X_add_number >> shift));
4084               else
4085                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4086               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4087               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4088                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4089               return;
4090             }
4091           ++shift;
4092         }
4093       while (shift <= (64 - 16));
4094
4095       /* Find the bit number of the lowest one bit, and store the
4096          shifted value in hi/lo.  */
4097       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4098       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4099       if (lo != 0)
4100         {
4101           bit = 0;
4102           while ((lo & 1) == 0)
4103             {
4104               lo >>= 1;
4105               ++bit;
4106             }
4107           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4108           hi >>= bit;
4109         }
4110       else
4111         {
4112           bit = 32;
4113           while ((hi & 1) == 0)
4114             {
4115               hi >>= 1;
4116               ++bit;
4117             }
4118           lo = hi;
4119           hi = 0;
4120         }
4121
4122       /* Optimize if the shifted value is a (power of 2) - 1.  */
4123       if ((hi == 0 && ((lo + 1) & lo) == 0)
4124           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4125         {
4126           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4127           if (shift != 0)
4128             {
4129               expressionS tmp;
4130
4131               /* This instruction will set the register to be all
4132                  ones.  */
4133               tmp.X_op = O_constant;
4134               tmp.X_add_number = (offsetT) -1;
4135               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4136               if (bit != 0)
4137                 {
4138                   bit += shift;
4139                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4140                                reg, reg, (bit >= 32) ? bit - 32 : bit);
4141                 }
4142               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4143                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4144               return;
4145             }
4146         }
4147
4148       /* Sign extend hi32 before calling load_register, because we can
4149          generally get better code when we load a sign extended value.  */
4150       if ((hi32.X_add_number & 0x80000000) != 0)
4151         hi32.X_add_number |= ~(offsetT) 0xffffffff;
4152       load_register (reg, &hi32, 0);
4153       freg = reg;
4154     }
4155   if ((lo32.X_add_number & 0xffff0000) == 0)
4156     {
4157       if (freg != 0)
4158         {
4159           macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4160           freg = reg;
4161         }
4162     }
4163   else
4164     {
4165       expressionS mid16;
4166
4167       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4168         {
4169           macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4170           macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4171           return;
4172         }
4173
4174       if (freg != 0)
4175         {
4176           macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4177           freg = reg;
4178         }
4179       mid16 = lo32;
4180       mid16.X_add_number >>= 16;
4181       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4182       macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4183       freg = reg;
4184     }
4185   if ((lo32.X_add_number & 0xffff) != 0)
4186     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4187 }
4188
4189 static inline void
4190 load_delay_nop (void)
4191 {
4192   if (!gpr_interlocks)
4193     macro_build (NULL, "nop", "");
4194 }
4195
4196 /* Load an address into a register.  */
4197
4198 static void
4199 load_address (int reg, expressionS *ep, int *used_at)
4200 {
4201   if (ep->X_op != O_constant
4202       && ep->X_op != O_symbol)
4203     {
4204       as_bad (_("expression too complex"));
4205       ep->X_op = O_constant;
4206     }
4207
4208   if (ep->X_op == O_constant)
4209     {
4210       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4211       return;
4212     }
4213
4214   if (mips_pic == NO_PIC)
4215     {
4216       /* If this is a reference to a GP relative symbol, we want
4217            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
4218          Otherwise we want
4219            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
4220            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4221          If we have an addend, we always use the latter form.
4222
4223          With 64bit address space and a usable $at we want
4224            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4225            lui          $at,<sym>               (BFD_RELOC_HI16_S)
4226            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4227            daddiu       $at,<sym>               (BFD_RELOC_LO16)
4228            dsll32       $reg,0
4229            daddu        $reg,$reg,$at
4230
4231          If $at is already in use, we use a path which is suboptimal
4232          on superscalar processors.
4233            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4234            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4235            dsll         $reg,16
4236            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
4237            dsll         $reg,16
4238            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
4239
4240          For GP relative symbols in 64bit address space we can use
4241          the same sequence as in 32bit address space.  */
4242       if (HAVE_64BIT_SYMBOLS)
4243         {
4244           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4245               && !nopic_need_relax (ep->X_add_symbol, 1))
4246             {
4247               relax_start (ep->X_add_symbol);
4248               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4249                            mips_gp_register, BFD_RELOC_GPREL16);
4250               relax_switch ();
4251             }
4252
4253           if (*used_at == 0 && !mips_opts.noat)
4254             {
4255               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4256               macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4257               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4258                            BFD_RELOC_MIPS_HIGHER);
4259               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4260               macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4261               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4262               *used_at = 1;
4263             }
4264           else
4265             {
4266               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4267               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4268                            BFD_RELOC_MIPS_HIGHER);
4269               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4270               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4271               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4272               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4273             }
4274
4275           if (mips_relax.sequence)
4276             relax_end ();
4277         }
4278       else
4279         {
4280           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4281               && !nopic_need_relax (ep->X_add_symbol, 1))
4282             {
4283               relax_start (ep->X_add_symbol);
4284               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4285                            mips_gp_register, BFD_RELOC_GPREL16);
4286               relax_switch ();
4287             }
4288           macro_build_lui (ep, reg);
4289           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4290                        reg, reg, BFD_RELOC_LO16);
4291           if (mips_relax.sequence)
4292             relax_end ();
4293         }
4294     }
4295   else if (!mips_big_got)
4296     {
4297       expressionS ex;
4298
4299       /* If this is a reference to an external symbol, we want
4300            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4301          Otherwise we want
4302            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4303            nop
4304            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4305          If there is a constant, it must be added in after.
4306
4307          If we have NewABI, we want
4308            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
4309          unless we're referencing a global symbol with a non-zero
4310          offset, in which case cst must be added separately.  */
4311       if (HAVE_NEWABI)
4312         {
4313           if (ep->X_add_number)
4314             {
4315               ex.X_add_number = ep->X_add_number;
4316               ep->X_add_number = 0;
4317               relax_start (ep->X_add_symbol);
4318               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4319                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4320               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4321                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4322               ex.X_op = O_constant;
4323               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4324                            reg, reg, BFD_RELOC_LO16);
4325               ep->X_add_number = ex.X_add_number;
4326               relax_switch ();
4327             }
4328           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4329                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4330           if (mips_relax.sequence)
4331             relax_end ();
4332         }
4333       else
4334         {
4335           ex.X_add_number = ep->X_add_number;
4336           ep->X_add_number = 0;
4337           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4338                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4339           load_delay_nop ();
4340           relax_start (ep->X_add_symbol);
4341           relax_switch ();
4342           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4343                        BFD_RELOC_LO16);
4344           relax_end ();
4345
4346           if (ex.X_add_number != 0)
4347             {
4348               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4349                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4350               ex.X_op = O_constant;
4351               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4352                            reg, reg, BFD_RELOC_LO16);
4353             }
4354         }
4355     }
4356   else if (mips_big_got)
4357     {
4358       expressionS ex;
4359
4360       /* This is the large GOT case.  If this is a reference to an
4361          external symbol, we want
4362            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
4363            addu         $reg,$reg,$gp
4364            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
4365
4366          Otherwise, for a reference to a local symbol in old ABI, we want
4367            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4368            nop
4369            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4370          If there is a constant, it must be added in after.
4371
4372          In the NewABI, for local symbols, with or without offsets, we want:
4373            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
4374            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
4375       */
4376       if (HAVE_NEWABI)
4377         {
4378           ex.X_add_number = ep->X_add_number;
4379           ep->X_add_number = 0;
4380           relax_start (ep->X_add_symbol);
4381           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4382           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4383                        reg, reg, mips_gp_register);
4384           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4385                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4386           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4387             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4388           else if (ex.X_add_number)
4389             {
4390               ex.X_op = O_constant;
4391               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4392                            BFD_RELOC_LO16);
4393             }
4394
4395           ep->X_add_number = ex.X_add_number;
4396           relax_switch ();
4397           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4398                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4399           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4400                        BFD_RELOC_MIPS_GOT_OFST);
4401           relax_end ();
4402         }
4403       else
4404         {
4405           ex.X_add_number = ep->X_add_number;
4406           ep->X_add_number = 0;
4407           relax_start (ep->X_add_symbol);
4408           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4409           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4410                        reg, reg, mips_gp_register);
4411           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4412                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4413           relax_switch ();
4414           if (reg_needs_delay (mips_gp_register))
4415             {
4416               /* We need a nop before loading from $gp.  This special
4417                  check is required because the lui which starts the main
4418                  instruction stream does not refer to $gp, and so will not
4419                  insert the nop which may be required.  */
4420               macro_build (NULL, "nop", "");
4421             }
4422           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4423                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4424           load_delay_nop ();
4425           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4426                        BFD_RELOC_LO16);
4427           relax_end ();
4428
4429           if (ex.X_add_number != 0)
4430             {
4431               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4432                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4433               ex.X_op = O_constant;
4434               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4435                            BFD_RELOC_LO16);
4436             }
4437         }
4438     }
4439   else
4440     abort ();
4441
4442   if (mips_opts.noat && *used_at == 1)
4443     as_bad (_("Macro used $at after \".set noat\""));
4444 }
4445
4446 /* Move the contents of register SOURCE into register DEST.  */
4447
4448 static void
4449 move_register (int dest, int source)
4450 {
4451   macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4452                dest, source, 0);
4453 }
4454
4455 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4456    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4457    The two alternatives are:
4458
4459    Global symbol                Local sybmol
4460    -------------                ------------
4461    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
4462    ...                          ...
4463    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4464
4465    load_got_offset emits the first instruction and add_got_offset
4466    emits the second for a 16-bit offset or add_got_offset_hilo emits
4467    a sequence to add a 32-bit offset using a scratch register.  */
4468
4469 static void
4470 load_got_offset (int dest, expressionS *local)
4471 {
4472   expressionS global;
4473
4474   global = *local;
4475   global.X_add_number = 0;
4476
4477   relax_start (local->X_add_symbol);
4478   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4479                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4480   relax_switch ();
4481   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4482                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4483   relax_end ();
4484 }
4485
4486 static void
4487 add_got_offset (int dest, expressionS *local)
4488 {
4489   expressionS global;
4490
4491   global.X_op = O_constant;
4492   global.X_op_symbol = NULL;
4493   global.X_add_symbol = NULL;
4494   global.X_add_number = local->X_add_number;
4495
4496   relax_start (local->X_add_symbol);
4497   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4498                dest, dest, BFD_RELOC_LO16);
4499   relax_switch ();
4500   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4501   relax_end ();
4502 }
4503
4504 static void
4505 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4506 {
4507   expressionS global;
4508   int hold_mips_optimize;
4509
4510   global.X_op = O_constant;
4511   global.X_op_symbol = NULL;
4512   global.X_add_symbol = NULL;
4513   global.X_add_number = local->X_add_number;
4514
4515   relax_start (local->X_add_symbol);
4516   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4517   relax_switch ();
4518   /* Set mips_optimize around the lui instruction to avoid
4519      inserting an unnecessary nop after the lw.  */
4520   hold_mips_optimize = mips_optimize;
4521   mips_optimize = 2;
4522   macro_build_lui (&global, tmp);
4523   mips_optimize = hold_mips_optimize;
4524   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4525   relax_end ();
4526
4527   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4528 }
4529
4530 /*
4531  *                      Build macros
4532  *   This routine implements the seemingly endless macro or synthesized
4533  * instructions and addressing modes in the mips assembly language. Many
4534  * of these macros are simple and are similar to each other. These could
4535  * probably be handled by some kind of table or grammar approach instead of
4536  * this verbose method. Others are not simple macros but are more like
4537  * optimizing code generation.
4538  *   One interesting optimization is when several store macros appear
4539  * consecutively that would load AT with the upper half of the same address.
4540  * The ensuing load upper instructions are ommited. This implies some kind
4541  * of global optimization. We currently only optimize within a single macro.
4542  *   For many of the load and store macros if the address is specified as a
4543  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4544  * first load register 'at' with zero and use it as the base register. The
4545  * mips assembler simply uses register $zero. Just one tiny optimization
4546  * we're missing.
4547  */
4548 static void
4549 macro (struct mips_cl_insn *ip)
4550 {
4551   int treg, sreg, dreg, breg;
4552   int tempreg;
4553   int mask;
4554   int used_at = 0;
4555   expressionS expr1;
4556   const char *s;
4557   const char *s2;
4558   const char *fmt;
4559   int likely = 0;
4560   int dbl = 0;
4561   int coproc = 0;
4562   int lr = 0;
4563   int imm = 0;
4564   int call = 0;
4565   int off;
4566   offsetT maxnum;
4567   bfd_reloc_code_real_type r;
4568   int hold_mips_optimize;
4569
4570   assert (! mips_opts.mips16);
4571
4572   treg = (ip->insn_opcode >> 16) & 0x1f;
4573   dreg = (ip->insn_opcode >> 11) & 0x1f;
4574   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4575   mask = ip->insn_mo->mask;
4576
4577   expr1.X_op = O_constant;
4578   expr1.X_op_symbol = NULL;
4579   expr1.X_add_symbol = NULL;
4580   expr1.X_add_number = 1;
4581
4582   switch (mask)
4583     {
4584     case M_DABS:
4585       dbl = 1;
4586     case M_ABS:
4587       /* bgez $a0,.+12
4588          move v0,$a0
4589          sub v0,$zero,$a0
4590          */
4591
4592       start_noreorder ();
4593
4594       expr1.X_add_number = 8;
4595       macro_build (&expr1, "bgez", "s,p", sreg);
4596       if (dreg == sreg)
4597         macro_build (NULL, "nop", "", 0);
4598       else
4599         move_register (dreg, sreg);
4600       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4601
4602       end_noreorder ();
4603       break;
4604
4605     case M_ADD_I:
4606       s = "addi";
4607       s2 = "add";
4608       goto do_addi;
4609     case M_ADDU_I:
4610       s = "addiu";
4611       s2 = "addu";
4612       goto do_addi;
4613     case M_DADD_I:
4614       dbl = 1;
4615       s = "daddi";
4616       s2 = "dadd";
4617       goto do_addi;
4618     case M_DADDU_I:
4619       dbl = 1;
4620       s = "daddiu";
4621       s2 = "daddu";
4622     do_addi:
4623       if (imm_expr.X_op == O_constant
4624           && imm_expr.X_add_number >= -0x8000
4625           && imm_expr.X_add_number < 0x8000)
4626         {
4627           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4628           break;
4629         }
4630       used_at = 1;
4631       load_register (AT, &imm_expr, dbl);
4632       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4633       break;
4634
4635     case M_AND_I:
4636       s = "andi";
4637       s2 = "and";
4638       goto do_bit;
4639     case M_OR_I:
4640       s = "ori";
4641       s2 = "or";
4642       goto do_bit;
4643     case M_NOR_I:
4644       s = "";
4645       s2 = "nor";
4646       goto do_bit;
4647     case M_XOR_I:
4648       s = "xori";
4649       s2 = "xor";
4650     do_bit:
4651       if (imm_expr.X_op == O_constant
4652           && imm_expr.X_add_number >= 0
4653           && imm_expr.X_add_number < 0x10000)
4654         {
4655           if (mask != M_NOR_I)
4656             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4657           else
4658             {
4659               macro_build (&imm_expr, "ori", "t,r,i",
4660                            treg, sreg, BFD_RELOC_LO16);
4661               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4662             }
4663           break;
4664         }
4665
4666       used_at = 1;
4667       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4668       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4669       break;
4670
4671     case M_BALIGN:
4672       switch (imm_expr.X_add_number)
4673         {
4674         case 0:
4675           macro_build (NULL, "nop", "");
4676           break;
4677         case 2:
4678           macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4679           break;
4680         default:
4681           macro_build (NULL, "balign", "t,s,2", treg, sreg,
4682                        (int)imm_expr.X_add_number);
4683           break;
4684         }
4685       break;
4686
4687     case M_BEQ_I:
4688       s = "beq";
4689       goto beq_i;
4690     case M_BEQL_I:
4691       s = "beql";
4692       likely = 1;
4693       goto beq_i;
4694     case M_BNE_I:
4695       s = "bne";
4696       goto beq_i;
4697     case M_BNEL_I:
4698       s = "bnel";
4699       likely = 1;
4700     beq_i:
4701       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4702         {
4703           macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4704           break;
4705         }
4706       used_at = 1;
4707       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4708       macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4709       break;
4710
4711     case M_BGEL:
4712       likely = 1;
4713     case M_BGE:
4714       if (treg == 0)
4715         {
4716           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4717           break;
4718         }
4719       if (sreg == 0)
4720         {
4721           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4722           break;
4723         }
4724       used_at = 1;
4725       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4726       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4727       break;
4728
4729     case M_BGTL_I:
4730       likely = 1;
4731     case M_BGT_I:
4732       /* check for > max integer */
4733       maxnum = 0x7fffffff;
4734       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4735         {
4736           maxnum <<= 16;
4737           maxnum |= 0xffff;
4738           maxnum <<= 16;
4739           maxnum |= 0xffff;
4740         }
4741       if (imm_expr.X_op == O_constant
4742           && imm_expr.X_add_number >= maxnum
4743           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4744         {
4745         do_false:
4746           /* result is always false */
4747           if (! likely)
4748             macro_build (NULL, "nop", "", 0);
4749           else
4750             macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
4751           break;
4752         }
4753       if (imm_expr.X_op != O_constant)
4754         as_bad (_("Unsupported large constant"));
4755       ++imm_expr.X_add_number;
4756       /* FALLTHROUGH */
4757     case M_BGE_I:
4758     case M_BGEL_I:
4759       if (mask == M_BGEL_I)
4760         likely = 1;
4761       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4762         {
4763           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4764           break;
4765         }
4766       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4767         {
4768           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4769           break;
4770         }
4771       maxnum = 0x7fffffff;
4772       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4773         {
4774           maxnum <<= 16;
4775           maxnum |= 0xffff;
4776           maxnum <<= 16;
4777           maxnum |= 0xffff;
4778         }
4779       maxnum = - maxnum - 1;
4780       if (imm_expr.X_op == O_constant
4781           && imm_expr.X_add_number <= maxnum
4782           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4783         {
4784         do_true:
4785           /* result is always true */
4786           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4787           macro_build (&offset_expr, "b", "p");
4788           break;
4789         }
4790       used_at = 1;
4791       set_at (sreg, 0);
4792       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4793       break;
4794
4795     case M_BGEUL:
4796       likely = 1;
4797     case M_BGEU:
4798       if (treg == 0)
4799         goto do_true;
4800       if (sreg == 0)
4801         {
4802           macro_build (&offset_expr, likely ? "beql" : "beq",
4803                        "s,t,p", 0, treg);
4804           break;
4805         }
4806       used_at = 1;
4807       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4808       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4809       break;
4810
4811     case M_BGTUL_I:
4812       likely = 1;
4813     case M_BGTU_I:
4814       if (sreg == 0
4815           || (HAVE_32BIT_GPRS
4816               && imm_expr.X_op == O_constant
4817               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4818         goto do_false;
4819       if (imm_expr.X_op != O_constant)
4820         as_bad (_("Unsupported large constant"));
4821       ++imm_expr.X_add_number;
4822       /* FALLTHROUGH */
4823     case M_BGEU_I:
4824     case M_BGEUL_I:
4825       if (mask == M_BGEUL_I)
4826         likely = 1;
4827       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4828         goto do_true;
4829       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4830         {
4831           macro_build (&offset_expr, likely ? "bnel" : "bne",
4832                        "s,t,p", sreg, 0);
4833           break;
4834         }
4835       used_at = 1;
4836       set_at (sreg, 1);
4837       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4838       break;
4839
4840     case M_BGTL:
4841       likely = 1;
4842     case M_BGT:
4843       if (treg == 0)
4844         {
4845           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4846           break;
4847         }
4848       if (sreg == 0)
4849         {
4850           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
4851           break;
4852         }
4853       used_at = 1;
4854       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4855       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4856       break;
4857
4858     case M_BGTUL:
4859       likely = 1;
4860     case M_BGTU:
4861       if (treg == 0)
4862         {
4863           macro_build (&offset_expr, likely ? "bnel" : "bne",
4864                        "s,t,p", sreg, 0);
4865           break;
4866         }
4867       if (sreg == 0)
4868         goto do_false;
4869       used_at = 1;
4870       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4871       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4872       break;
4873
4874     case M_BLEL:
4875       likely = 1;
4876     case M_BLE:
4877       if (treg == 0)
4878         {
4879           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4880           break;
4881         }
4882       if (sreg == 0)
4883         {
4884           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
4885           break;
4886         }
4887       used_at = 1;
4888       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4889       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4890       break;
4891
4892     case M_BLEL_I:
4893       likely = 1;
4894     case M_BLE_I:
4895       maxnum = 0x7fffffff;
4896       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4897         {
4898           maxnum <<= 16;
4899           maxnum |= 0xffff;
4900           maxnum <<= 16;
4901           maxnum |= 0xffff;
4902         }
4903       if (imm_expr.X_op == O_constant
4904           && imm_expr.X_add_number >= maxnum
4905           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4906         goto do_true;
4907       if (imm_expr.X_op != O_constant)
4908         as_bad (_("Unsupported large constant"));
4909       ++imm_expr.X_add_number;
4910       /* FALLTHROUGH */
4911     case M_BLT_I:
4912     case M_BLTL_I:
4913       if (mask == M_BLTL_I)
4914         likely = 1;
4915       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4916         {
4917           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4918           break;
4919         }
4920       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4921         {
4922           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4923           break;
4924         }
4925       used_at = 1;
4926       set_at (sreg, 0);
4927       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4928       break;
4929
4930     case M_BLEUL:
4931       likely = 1;
4932     case M_BLEU:
4933       if (treg == 0)
4934         {
4935           macro_build (&offset_expr, likely ? "beql" : "beq",
4936                        "s,t,p", sreg, 0);
4937           break;
4938         }
4939       if (sreg == 0)
4940         goto do_true;
4941       used_at = 1;
4942       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4943       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4944       break;
4945
4946     case M_BLEUL_I:
4947       likely = 1;
4948     case M_BLEU_I:
4949       if (sreg == 0
4950           || (HAVE_32BIT_GPRS
4951               && imm_expr.X_op == O_constant
4952               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4953         goto do_true;
4954       if (imm_expr.X_op != O_constant)
4955         as_bad (_("Unsupported large constant"));
4956       ++imm_expr.X_add_number;
4957       /* FALLTHROUGH */
4958     case M_BLTU_I:
4959     case M_BLTUL_I:
4960       if (mask == M_BLTUL_I)
4961         likely = 1;
4962       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4963         goto do_false;
4964       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4965         {
4966           macro_build (&offset_expr, likely ? "beql" : "beq",
4967                        "s,t,p", sreg, 0);
4968           break;
4969         }
4970       used_at = 1;
4971       set_at (sreg, 1);
4972       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4973       break;
4974
4975     case M_BLTL:
4976       likely = 1;
4977     case M_BLT:
4978       if (treg == 0)
4979         {
4980           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4981           break;
4982         }
4983       if (sreg == 0)
4984         {
4985           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
4986           break;
4987         }
4988       used_at = 1;
4989       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4990       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4991       break;
4992
4993     case M_BLTUL:
4994       likely = 1;
4995     case M_BLTU:
4996       if (treg == 0)
4997         goto do_false;
4998       if (sreg == 0)
4999         {
5000           macro_build (&offset_expr, likely ? "bnel" : "bne",
5001                        "s,t,p", 0, treg);
5002           break;
5003         }
5004       used_at = 1;
5005       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5006       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5007       break;
5008
5009     case M_DEXT:
5010       {
5011         unsigned long pos;
5012         unsigned long size;
5013
5014         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5015           {
5016             as_bad (_("Unsupported large constant"));
5017             pos = size = 1;
5018           }
5019         else
5020           {
5021             pos = (unsigned long) imm_expr.X_add_number;
5022             size = (unsigned long) imm2_expr.X_add_number;
5023           }
5024
5025         if (pos > 63)
5026           {
5027             as_bad (_("Improper position (%lu)"), pos);
5028             pos = 1;
5029           }
5030         if (size == 0 || size > 64
5031             || (pos + size - 1) > 63)
5032           {
5033             as_bad (_("Improper extract size (%lu, position %lu)"),
5034                     size, pos);
5035             size = 1;
5036           }
5037
5038         if (size <= 32 && pos < 32)
5039           {
5040             s = "dext";
5041             fmt = "t,r,+A,+C";
5042           }
5043         else if (size <= 32)
5044           {
5045             s = "dextu";
5046             fmt = "t,r,+E,+H";
5047           }
5048         else
5049           {
5050             s = "dextm";
5051             fmt = "t,r,+A,+G";
5052           }
5053         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
5054       }
5055       break;
5056
5057     case M_DINS:
5058       {
5059         unsigned long pos;
5060         unsigned long size;
5061
5062         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5063           {
5064             as_bad (_("Unsupported large constant"));
5065             pos = size = 1;
5066           }
5067         else
5068           {
5069             pos = (unsigned long) imm_expr.X_add_number;
5070             size = (unsigned long) imm2_expr.X_add_number;
5071           }
5072
5073         if (pos > 63)
5074           {
5075             as_bad (_("Improper position (%lu)"), pos);
5076             pos = 1;
5077           }
5078         if (size == 0 || size > 64
5079             || (pos + size - 1) > 63)
5080           {
5081             as_bad (_("Improper insert size (%lu, position %lu)"),
5082                     size, pos);
5083             size = 1;
5084           }
5085
5086         if (pos < 32 && (pos + size - 1) < 32)
5087           {
5088             s = "dins";
5089             fmt = "t,r,+A,+B";
5090           }
5091         else if (pos >= 32)
5092           {
5093             s = "dinsu";
5094             fmt = "t,r,+E,+F";
5095           }
5096         else
5097           {
5098             s = "dinsm";
5099             fmt = "t,r,+A,+F";
5100           }
5101         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos,
5102                      pos + size - 1);
5103       }
5104       break;
5105
5106     case M_DDIV_3:
5107       dbl = 1;
5108     case M_DIV_3:
5109       s = "mflo";
5110       goto do_div3;
5111     case M_DREM_3:
5112       dbl = 1;
5113     case M_REM_3:
5114       s = "mfhi";
5115     do_div3:
5116       if (treg == 0)
5117         {
5118           as_warn (_("Divide by zero."));
5119           if (mips_trap)
5120             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5121           else
5122             macro_build (NULL, "break", "c", 7);
5123           break;
5124         }
5125
5126       start_noreorder ();
5127       if (mips_trap)
5128         {
5129           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5130           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5131         }
5132       else
5133         {
5134           expr1.X_add_number = 8;
5135           macro_build (&expr1, "bne", "s,t,p", treg, 0);
5136           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5137           macro_build (NULL, "break", "c", 7);
5138         }
5139       expr1.X_add_number = -1;
5140       used_at = 1;
5141       load_register (AT, &expr1, dbl);
5142       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5143       macro_build (&expr1, "bne", "s,t,p", treg, AT);
5144       if (dbl)
5145         {
5146           expr1.X_add_number = 1;
5147           load_register (AT, &expr1, dbl);
5148           macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5149         }
5150       else
5151         {
5152           expr1.X_add_number = 0x80000000;
5153           macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5154         }
5155       if (mips_trap)
5156         {
5157           macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5158           /* We want to close the noreorder block as soon as possible, so
5159              that later insns are available for delay slot filling.  */
5160           end_noreorder ();
5161         }
5162       else
5163         {
5164           expr1.X_add_number = 8;
5165           macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5166           macro_build (NULL, "nop", "", 0);
5167
5168           /* We want to close the noreorder block as soon as possible, so
5169              that later insns are available for delay slot filling.  */
5170           end_noreorder ();
5171
5172           macro_build (NULL, "break", "c", 6);
5173         }
5174       macro_build (NULL, s, "d", dreg);
5175       break;
5176
5177     case M_DIV_3I:
5178       s = "div";
5179       s2 = "mflo";
5180       goto do_divi;
5181     case M_DIVU_3I:
5182       s = "divu";
5183       s2 = "mflo";
5184       goto do_divi;
5185     case M_REM_3I:
5186       s = "div";
5187       s2 = "mfhi";
5188       goto do_divi;
5189     case M_REMU_3I:
5190       s = "divu";
5191       s2 = "mfhi";
5192       goto do_divi;
5193     case M_DDIV_3I:
5194       dbl = 1;
5195       s = "ddiv";
5196       s2 = "mflo";
5197       goto do_divi;
5198     case M_DDIVU_3I:
5199       dbl = 1;
5200       s = "ddivu";
5201       s2 = "mflo";
5202       goto do_divi;
5203     case M_DREM_3I:
5204       dbl = 1;
5205       s = "ddiv";
5206       s2 = "mfhi";
5207       goto do_divi;
5208     case M_DREMU_3I:
5209       dbl = 1;
5210       s = "ddivu";
5211       s2 = "mfhi";
5212     do_divi:
5213       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5214         {
5215           as_warn (_("Divide by zero."));
5216           if (mips_trap)
5217             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5218           else
5219             macro_build (NULL, "break", "c", 7);
5220           break;
5221         }
5222       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5223         {
5224           if (strcmp (s2, "mflo") == 0)
5225             move_register (dreg, sreg);
5226           else
5227             move_register (dreg, 0);
5228           break;
5229         }
5230       if (imm_expr.X_op == O_constant
5231           && imm_expr.X_add_number == -1
5232           && s[strlen (s) - 1] != 'u')
5233         {
5234           if (strcmp (s2, "mflo") == 0)
5235             {
5236               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5237             }
5238           else
5239             move_register (dreg, 0);
5240           break;
5241         }
5242
5243       used_at = 1;
5244       load_register (AT, &imm_expr, dbl);
5245       macro_build (NULL, s, "z,s,t", sreg, AT);
5246       macro_build (NULL, s2, "d", dreg);
5247       break;
5248
5249     case M_DIVU_3:
5250       s = "divu";
5251       s2 = "mflo";
5252       goto do_divu3;
5253     case M_REMU_3:
5254       s = "divu";
5255       s2 = "mfhi";
5256       goto do_divu3;
5257     case M_DDIVU_3:
5258       s = "ddivu";
5259       s2 = "mflo";
5260       goto do_divu3;
5261     case M_DREMU_3:
5262       s = "ddivu";
5263       s2 = "mfhi";
5264     do_divu3:
5265       start_noreorder ();
5266       if (mips_trap)
5267         {
5268           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5269           macro_build (NULL, s, "z,s,t", sreg, treg);
5270           /* We want to close the noreorder block as soon as possible, so
5271              that later insns are available for delay slot filling.  */
5272           end_noreorder ();
5273         }
5274       else
5275         {
5276           expr1.X_add_number = 8;
5277           macro_build (&expr1, "bne", "s,t,p", treg, 0);
5278           macro_build (NULL, s, "z,s,t", sreg, treg);
5279
5280           /* We want to close the noreorder block as soon as possible, so
5281              that later insns are available for delay slot filling.  */
5282           end_noreorder ();
5283           macro_build (NULL, "break", "c", 7);
5284         }
5285       macro_build (NULL, s2, "d", dreg);
5286       break;
5287
5288     case M_DLCA_AB:
5289       dbl = 1;
5290     case M_LCA_AB:
5291       call = 1;
5292       goto do_la;
5293     case M_DLA_AB:
5294       dbl = 1;
5295     case M_LA_AB:
5296     do_la:
5297       /* Load the address of a symbol into a register.  If breg is not
5298          zero, we then add a base register to it.  */
5299
5300       if (dbl && HAVE_32BIT_GPRS)
5301         as_warn (_("dla used to load 32-bit register"));
5302
5303       if (! dbl && HAVE_64BIT_OBJECTS)
5304         as_warn (_("la used to load 64-bit address"));
5305
5306       if (offset_expr.X_op == O_constant
5307           && offset_expr.X_add_number >= -0x8000
5308           && offset_expr.X_add_number < 0x8000)
5309         {
5310           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5311                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
5312           break;
5313         }
5314
5315       if (!mips_opts.noat && (treg == breg))
5316         {
5317           tempreg = AT;
5318           used_at = 1;
5319         }
5320       else
5321         {
5322           tempreg = treg;
5323         }
5324
5325       if (offset_expr.X_op != O_symbol
5326           && offset_expr.X_op != O_constant)
5327         {
5328           as_bad (_("expression too complex"));
5329           offset_expr.X_op = O_constant;
5330         }
5331
5332       if (offset_expr.X_op == O_constant)
5333         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5334       else if (mips_pic == NO_PIC)
5335         {
5336           /* If this is a reference to a GP relative symbol, we want
5337                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
5338              Otherwise we want
5339                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5340                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5341              If we have a constant, we need two instructions anyhow,
5342              so we may as well always use the latter form.
5343
5344              With 64bit address space and a usable $at we want
5345                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5346                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5347                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5348                daddiu   $at,<sym>               (BFD_RELOC_LO16)
5349                dsll32   $tempreg,0
5350                daddu    $tempreg,$tempreg,$at
5351
5352              If $at is already in use, we use a path which is suboptimal
5353              on superscalar processors.
5354                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5355                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5356                dsll     $tempreg,16
5357                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5358                dsll     $tempreg,16
5359                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
5360
5361              For GP relative symbols in 64bit address space we can use
5362              the same sequence as in 32bit address space.  */
5363           if (HAVE_64BIT_SYMBOLS)
5364             {
5365               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5366                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5367                 {
5368                   relax_start (offset_expr.X_add_symbol);
5369                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5370                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5371                   relax_switch ();
5372                 }
5373
5374               if (used_at == 0 && !mips_opts.noat)
5375                 {
5376                   macro_build (&offset_expr, "lui", "t,u",
5377                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5378                   macro_build (&offset_expr, "lui", "t,u",
5379                                AT, BFD_RELOC_HI16_S);
5380                   macro_build (&offset_expr, "daddiu", "t,r,j",
5381                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5382                   macro_build (&offset_expr, "daddiu", "t,r,j",
5383                                AT, AT, BFD_RELOC_LO16);
5384                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5385                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5386                   used_at = 1;
5387                 }
5388               else
5389                 {
5390                   macro_build (&offset_expr, "lui", "t,u",
5391                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5392                   macro_build (&offset_expr, "daddiu", "t,r,j",
5393                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5394                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5395                   macro_build (&offset_expr, "daddiu", "t,r,j",
5396                                tempreg, tempreg, BFD_RELOC_HI16_S);
5397                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5398                   macro_build (&offset_expr, "daddiu", "t,r,j",
5399                                tempreg, tempreg, BFD_RELOC_LO16);
5400                 }
5401
5402               if (mips_relax.sequence)
5403                 relax_end ();
5404             }
5405           else
5406             {
5407               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5408                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5409                 {
5410                   relax_start (offset_expr.X_add_symbol);
5411                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5412                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5413                   relax_switch ();
5414                 }
5415               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5416                 as_bad (_("offset too large"));
5417               macro_build_lui (&offset_expr, tempreg);
5418               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5419                            tempreg, tempreg, BFD_RELOC_LO16);
5420               if (mips_relax.sequence)
5421                 relax_end ();
5422             }
5423         }
5424       else if (!mips_big_got && !HAVE_NEWABI)
5425         {
5426           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5427
5428           /* If this is a reference to an external symbol, and there
5429              is no constant, we want
5430                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5431              or for lca or if tempreg is PIC_CALL_REG
5432                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5433              For a local symbol, we want
5434                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5435                nop
5436                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5437
5438              If we have a small constant, and this is a reference to
5439              an external symbol, we want
5440                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5441                nop
5442                addiu    $tempreg,$tempreg,<constant>
5443              For a local symbol, we want the same instruction
5444              sequence, but we output a BFD_RELOC_LO16 reloc on the
5445              addiu instruction.
5446
5447              If we have a large constant, and this is a reference to
5448              an external symbol, we want
5449                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5450                lui      $at,<hiconstant>
5451                addiu    $at,$at,<loconstant>
5452                addu     $tempreg,$tempreg,$at
5453              For a local symbol, we want the same instruction
5454              sequence, but we output a BFD_RELOC_LO16 reloc on the
5455              addiu instruction.
5456            */
5457
5458           if (offset_expr.X_add_number == 0)
5459             {
5460               if (mips_pic == SVR4_PIC
5461                   && breg == 0
5462                   && (call || tempreg == PIC_CALL_REG))
5463                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5464
5465               relax_start (offset_expr.X_add_symbol);
5466               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5467                            lw_reloc_type, mips_gp_register);
5468               if (breg != 0)
5469                 {
5470                   /* We're going to put in an addu instruction using
5471                      tempreg, so we may as well insert the nop right
5472                      now.  */
5473                   load_delay_nop ();
5474                 }
5475               relax_switch ();
5476               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5477                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5478               load_delay_nop ();
5479               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5480                            tempreg, tempreg, BFD_RELOC_LO16);
5481               relax_end ();
5482               /* FIXME: If breg == 0, and the next instruction uses
5483                  $tempreg, then if this variant case is used an extra
5484                  nop will be generated.  */
5485             }
5486           else if (offset_expr.X_add_number >= -0x8000
5487                    && offset_expr.X_add_number < 0x8000)
5488             {
5489               load_got_offset (tempreg, &offset_expr);
5490               load_delay_nop ();
5491               add_got_offset (tempreg, &offset_expr);
5492             }
5493           else
5494             {
5495               expr1.X_add_number = offset_expr.X_add_number;
5496               offset_expr.X_add_number =
5497                 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5498               load_got_offset (tempreg, &offset_expr);
5499               offset_expr.X_add_number = expr1.X_add_number;
5500               /* If we are going to add in a base register, and the
5501                  target register and the base register are the same,
5502                  then we are using AT as a temporary register.  Since
5503                  we want to load the constant into AT, we add our
5504                  current AT (from the global offset table) and the
5505                  register into the register now, and pretend we were
5506                  not using a base register.  */
5507               if (breg == treg)
5508                 {
5509                   load_delay_nop ();
5510                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5511                                treg, AT, breg);
5512                   breg = 0;
5513                   tempreg = treg;
5514                 }
5515               add_got_offset_hilo (tempreg, &offset_expr, AT);
5516               used_at = 1;
5517             }
5518         }
5519       else if (!mips_big_got && HAVE_NEWABI)
5520         {
5521           int add_breg_early = 0;
5522
5523           /* If this is a reference to an external, and there is no
5524              constant, or local symbol (*), with or without a
5525              constant, we want
5526                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5527              or for lca or if tempreg is PIC_CALL_REG
5528                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5529
5530              If we have a small constant, and this is a reference to
5531              an external symbol, we want
5532                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5533                addiu    $tempreg,$tempreg,<constant>
5534
5535              If we have a large constant, and this is a reference to
5536              an external symbol, we want
5537                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5538                lui      $at,<hiconstant>
5539                addiu    $at,$at,<loconstant>
5540                addu     $tempreg,$tempreg,$at
5541
5542              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5543              local symbols, even though it introduces an additional
5544              instruction.  */
5545
5546           if (offset_expr.X_add_number)
5547             {
5548               expr1.X_add_number = offset_expr.X_add_number;
5549               offset_expr.X_add_number = 0;
5550
5551               relax_start (offset_expr.X_add_symbol);
5552               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5553                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5554
5555               if (expr1.X_add_number >= -0x8000
5556                   && expr1.X_add_number < 0x8000)
5557                 {
5558                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5559                                tempreg, tempreg, BFD_RELOC_LO16);
5560                 }
5561               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5562                 {
5563                   int dreg;
5564
5565                   /* If we are going to add in a base register, and the
5566                      target register and the base register are the same,
5567                      then we are using AT as a temporary register.  Since
5568                      we want to load the constant into AT, we add our
5569                      current AT (from the global offset table) and the
5570                      register into the register now, and pretend we were
5571                      not using a base register.  */
5572                   if (breg != treg)
5573                     dreg = tempreg;
5574                   else
5575                     {
5576                       assert (tempreg == AT);
5577                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5578                                    treg, AT, breg);
5579                       dreg = treg;
5580                       add_breg_early = 1;
5581                     }
5582
5583                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5584                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5585                                dreg, dreg, AT);
5586
5587                   used_at = 1;
5588                 }
5589               else
5590                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5591
5592               relax_switch ();
5593               offset_expr.X_add_number = expr1.X_add_number;
5594
5595               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5596                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5597               if (add_breg_early)
5598                 {
5599                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5600                                treg, tempreg, breg);
5601                   breg = 0;
5602                   tempreg = treg;
5603                 }
5604               relax_end ();
5605             }
5606           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5607             {
5608               relax_start (offset_expr.X_add_symbol);
5609               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5610                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
5611               relax_switch ();
5612               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5613                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5614               relax_end ();
5615             }
5616           else
5617             {
5618               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5619                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5620             }
5621         }
5622       else if (mips_big_got && !HAVE_NEWABI)
5623         {
5624           int gpdelay;
5625           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5626           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5627           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5628
5629           /* This is the large GOT case.  If this is a reference to an
5630              external symbol, and there is no constant, we want
5631                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5632                addu     $tempreg,$tempreg,$gp
5633                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5634              or for lca or if tempreg is PIC_CALL_REG
5635                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5636                addu     $tempreg,$tempreg,$gp
5637                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5638              For a local symbol, we want
5639                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5640                nop
5641                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5642
5643              If we have a small constant, and this is a reference to
5644              an external symbol, we want
5645                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5646                addu     $tempreg,$tempreg,$gp
5647                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5648                nop
5649                addiu    $tempreg,$tempreg,<constant>
5650              For a local symbol, we want
5651                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5652                nop
5653                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5654
5655              If we have a large constant, and this is a reference to
5656              an external symbol, we want
5657                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5658                addu     $tempreg,$tempreg,$gp
5659                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5660                lui      $at,<hiconstant>
5661                addiu    $at,$at,<loconstant>
5662                addu     $tempreg,$tempreg,$at
5663              For a local symbol, we want
5664                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5665                lui      $at,<hiconstant>
5666                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
5667                addu     $tempreg,$tempreg,$at
5668           */
5669
5670           expr1.X_add_number = offset_expr.X_add_number;
5671           offset_expr.X_add_number = 0;
5672           relax_start (offset_expr.X_add_symbol);
5673           gpdelay = reg_needs_delay (mips_gp_register);
5674           if (expr1.X_add_number == 0 && breg == 0
5675               && (call || tempreg == PIC_CALL_REG))
5676             {
5677               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5678               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5679             }
5680           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5681           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5682                        tempreg, tempreg, mips_gp_register);
5683           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5684                        tempreg, lw_reloc_type, tempreg);
5685           if (expr1.X_add_number == 0)
5686             {
5687               if (breg != 0)
5688                 {
5689                   /* We're going to put in an addu instruction using
5690                      tempreg, so we may as well insert the nop right
5691                      now.  */
5692                   load_delay_nop ();
5693                 }
5694             }
5695           else if (expr1.X_add_number >= -0x8000
5696                    && expr1.X_add_number < 0x8000)
5697             {
5698               load_delay_nop ();
5699               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5700                            tempreg, tempreg, BFD_RELOC_LO16);
5701             }
5702           else
5703             {
5704               int dreg;
5705
5706               /* If we are going to add in a base register, and the
5707                  target register and the base register are the same,
5708                  then we are using AT as a temporary register.  Since
5709                  we want to load the constant into AT, we add our
5710                  current AT (from the global offset table) and the
5711                  register into the register now, and pretend we were
5712                  not using a base register.  */
5713               if (breg != treg)
5714                 dreg = tempreg;
5715               else
5716                 {
5717                   assert (tempreg == AT);
5718                   load_delay_nop ();
5719                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5720                                treg, AT, breg);
5721                   dreg = treg;
5722                 }
5723
5724               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5725               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5726
5727               used_at = 1;
5728             }
5729           offset_expr.X_add_number =
5730             ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5731           relax_switch ();
5732
5733           if (gpdelay)
5734             {
5735               /* This is needed because this instruction uses $gp, but
5736                  the first instruction on the main stream does not.  */
5737               macro_build (NULL, "nop", "");
5738             }
5739
5740           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5741                        local_reloc_type, mips_gp_register);
5742           if (expr1.X_add_number >= -0x8000
5743               && expr1.X_add_number < 0x8000)
5744             {
5745               load_delay_nop ();
5746               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5747                            tempreg, tempreg, BFD_RELOC_LO16);
5748               /* FIXME: If add_number is 0, and there was no base
5749                  register, the external symbol case ended with a load,
5750                  so if the symbol turns out to not be external, and
5751                  the next instruction uses tempreg, an unnecessary nop
5752                  will be inserted.  */
5753             }
5754           else
5755             {
5756               if (breg == treg)
5757                 {
5758                   /* We must add in the base register now, as in the
5759                      external symbol case.  */
5760                   assert (tempreg == AT);
5761                   load_delay_nop ();
5762                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5763                                treg, AT, breg);
5764                   tempreg = treg;
5765                   /* We set breg to 0 because we have arranged to add
5766                      it in in both cases.  */
5767                   breg = 0;
5768                 }
5769
5770               macro_build_lui (&expr1, AT);
5771               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5772                            AT, AT, BFD_RELOC_LO16);
5773               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5774                            tempreg, tempreg, AT);
5775               used_at = 1;
5776             }
5777           relax_end ();
5778         }
5779       else if (mips_big_got && HAVE_NEWABI)
5780         {
5781           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5782           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5783           int add_breg_early = 0;
5784
5785           /* This is the large GOT case.  If this is a reference to an
5786              external symbol, and there is no constant, we want
5787                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5788                add      $tempreg,$tempreg,$gp
5789                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5790              or for lca or if tempreg is PIC_CALL_REG
5791                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5792                add      $tempreg,$tempreg,$gp
5793                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5794
5795              If we have a small constant, and this is a reference to
5796              an external symbol, we want
5797                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5798                add      $tempreg,$tempreg,$gp
5799                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5800                addi     $tempreg,$tempreg,<constant>
5801
5802              If we have a large constant, and this is a reference to
5803              an external symbol, we want
5804                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5805                addu     $tempreg,$tempreg,$gp
5806                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5807                lui      $at,<hiconstant>
5808                addi     $at,$at,<loconstant>
5809                add      $tempreg,$tempreg,$at
5810
5811              If we have NewABI, and we know it's a local symbol, we want
5812                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
5813                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
5814              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
5815
5816           relax_start (offset_expr.X_add_symbol);
5817
5818           expr1.X_add_number = offset_expr.X_add_number;
5819           offset_expr.X_add_number = 0;
5820
5821           if (expr1.X_add_number == 0 && breg == 0
5822               && (call || tempreg == PIC_CALL_REG))
5823             {
5824               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5825               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5826             }
5827           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5828           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5829                        tempreg, tempreg, mips_gp_register);
5830           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5831                        tempreg, lw_reloc_type, tempreg);
5832
5833           if (expr1.X_add_number == 0)
5834             ;
5835           else if (expr1.X_add_number >= -0x8000
5836                    && expr1.X_add_number < 0x8000)
5837             {
5838               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5839                            tempreg, tempreg, BFD_RELOC_LO16);
5840             }
5841           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5842             {
5843               int dreg;
5844
5845               /* If we are going to add in a base register, and the
5846                  target register and the base register are the same,
5847                  then we are using AT as a temporary register.  Since
5848                  we want to load the constant into AT, we add our
5849                  current AT (from the global offset table) and the
5850                  register into the register now, and pretend we were
5851                  not using a base register.  */
5852               if (breg != treg)
5853                 dreg = tempreg;
5854               else
5855                 {
5856                   assert (tempreg == AT);
5857                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5858                                treg, AT, breg);
5859                   dreg = treg;
5860                   add_breg_early = 1;
5861                 }
5862
5863               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5864               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5865
5866               used_at = 1;
5867             }
5868           else
5869             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5870
5871           relax_switch ();
5872           offset_expr.X_add_number = expr1.X_add_number;
5873           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5874                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5875           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
5876                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
5877           if (add_breg_early)
5878             {
5879               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5880                            treg, tempreg, breg);
5881               breg = 0;
5882               tempreg = treg;
5883             }
5884           relax_end ();
5885         }
5886       else
5887         abort ();
5888
5889       if (breg != 0)
5890         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
5891       break;
5892
5893     case M_J_A:
5894       /* The j instruction may not be used in PIC code, since it
5895          requires an absolute address.  We convert it to a b
5896          instruction.  */
5897       if (mips_pic == NO_PIC)
5898         macro_build (&offset_expr, "j", "a");
5899       else
5900         macro_build (&offset_expr, "b", "p");
5901       break;
5902
5903       /* The jal instructions must be handled as macros because when
5904          generating PIC code they expand to multi-instruction
5905          sequences.  Normally they are simple instructions.  */
5906     case M_JAL_1:
5907       dreg = RA;
5908       /* Fall through.  */
5909     case M_JAL_2:
5910       if (mips_pic == NO_PIC)
5911         macro_build (NULL, "jalr", "d,s", dreg, sreg);
5912       else
5913         {
5914           if (sreg != PIC_CALL_REG)
5915             as_warn (_("MIPS PIC call to register other than $25"));
5916
5917           macro_build (NULL, "jalr", "d,s", dreg, sreg);
5918           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
5919             {
5920               if (mips_cprestore_offset < 0)
5921                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5922               else
5923                 {
5924                   if (! mips_frame_reg_valid)
5925                     {
5926                       as_warn (_("No .frame pseudo-op used in PIC code"));
5927                       /* Quiet this warning.  */
5928                       mips_frame_reg_valid = 1;
5929                     }
5930                   if (! mips_cprestore_valid)
5931                     {
5932                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
5933                       /* Quiet this warning.  */
5934                       mips_cprestore_valid = 1;
5935                     }
5936                   expr1.X_add_number = mips_cprestore_offset;
5937                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5938                                                 mips_gp_register,
5939                                                 mips_frame_reg,
5940                                                 HAVE_64BIT_ADDRESSES);
5941                 }
5942             }
5943         }
5944
5945       break;
5946
5947     case M_JAL_A:
5948       if (mips_pic == NO_PIC)
5949         macro_build (&offset_expr, "jal", "a");
5950       else if (mips_pic == SVR4_PIC)
5951         {
5952           /* If this is a reference to an external symbol, and we are
5953              using a small GOT, we want
5954                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
5955                nop
5956                jalr     $ra,$25
5957                nop
5958                lw       $gp,cprestore($sp)
5959              The cprestore value is set using the .cprestore
5960              pseudo-op.  If we are using a big GOT, we want
5961                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
5962                addu     $25,$25,$gp
5963                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
5964                nop
5965                jalr     $ra,$25
5966                nop
5967                lw       $gp,cprestore($sp)
5968              If the symbol is not external, we want
5969                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
5970                nop
5971                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
5972                jalr     $ra,$25
5973                nop
5974                lw $gp,cprestore($sp)
5975
5976              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
5977              sequences above, minus nops, unless the symbol is local,
5978              which enables us to use GOT_PAGE/GOT_OFST (big got) or
5979              GOT_DISP.  */
5980           if (HAVE_NEWABI)
5981             {
5982               if (! mips_big_got)
5983                 {
5984                   relax_start (offset_expr.X_add_symbol);
5985                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5986                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5987                                mips_gp_register);
5988                   relax_switch ();
5989                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5990                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
5991                                mips_gp_register);
5992                   relax_end ();
5993                 }
5994               else
5995                 {
5996                   relax_start (offset_expr.X_add_symbol);
5997                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5998                                BFD_RELOC_MIPS_CALL_HI16);
5999                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6000                                PIC_CALL_REG, mips_gp_register);
6001                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6002                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6003                                PIC_CALL_REG);
6004                   relax_switch ();
6005                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6006                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6007                                mips_gp_register);
6008                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6009                                PIC_CALL_REG, PIC_CALL_REG,
6010                                BFD_RELOC_MIPS_GOT_OFST);
6011                   relax_end ();
6012                 }
6013
6014               macro_build_jalr (&offset_expr);
6015             }
6016           else
6017             {
6018               relax_start (offset_expr.X_add_symbol);
6019               if (! mips_big_got)
6020                 {
6021                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6022                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6023                                mips_gp_register);
6024                   load_delay_nop ();
6025                   relax_switch ();
6026                 }
6027               else
6028                 {
6029                   int gpdelay;
6030
6031                   gpdelay = reg_needs_delay (mips_gp_register);
6032                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6033                                BFD_RELOC_MIPS_CALL_HI16);
6034                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6035                                PIC_CALL_REG, mips_gp_register);
6036                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6037                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6038                                PIC_CALL_REG);
6039                   load_delay_nop ();
6040                   relax_switch ();
6041                   if (gpdelay)
6042                     macro_build (NULL, "nop", "");
6043                 }
6044               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6045                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6046                            mips_gp_register);
6047               load_delay_nop ();
6048               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6049                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6050               relax_end ();
6051               macro_build_jalr (&offset_expr);
6052
6053               if (mips_cprestore_offset < 0)
6054                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6055               else
6056                 {
6057                   if (! mips_frame_reg_valid)
6058                     {
6059                       as_warn (_("No .frame pseudo-op used in PIC code"));
6060                       /* Quiet this warning.  */
6061                       mips_frame_reg_valid = 1;
6062                     }
6063                   if (! mips_cprestore_valid)
6064                     {
6065                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6066                       /* Quiet this warning.  */
6067                       mips_cprestore_valid = 1;
6068                     }
6069                   if (mips_opts.noreorder)
6070                     macro_build (NULL, "nop", "");
6071                   expr1.X_add_number = mips_cprestore_offset;
6072                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6073                                                 mips_gp_register,
6074                                                 mips_frame_reg,
6075                                                 HAVE_64BIT_ADDRESSES);
6076                 }
6077             }
6078         }
6079       else if (mips_pic == VXWORKS_PIC)
6080         as_bad (_("Non-PIC jump used in PIC library"));
6081       else
6082         abort ();
6083
6084       break;
6085
6086     case M_LB_AB:
6087       s = "lb";
6088       goto ld;
6089     case M_LBU_AB:
6090       s = "lbu";
6091       goto ld;
6092     case M_LH_AB:
6093       s = "lh";
6094       goto ld;
6095     case M_LHU_AB:
6096       s = "lhu";
6097       goto ld;
6098     case M_LW_AB:
6099       s = "lw";
6100       goto ld;
6101     case M_LWC0_AB:
6102       s = "lwc0";
6103       /* Itbl support may require additional care here.  */
6104       coproc = 1;
6105       goto ld;
6106     case M_LWC1_AB:
6107       s = "lwc1";
6108       /* Itbl support may require additional care here.  */
6109       coproc = 1;
6110       goto ld;
6111     case M_LWC2_AB:
6112       s = "lwc2";
6113       /* Itbl support may require additional care here.  */
6114       coproc = 1;
6115       goto ld;
6116     case M_LWC3_AB:
6117       s = "lwc3";
6118       /* Itbl support may require additional care here.  */
6119       coproc = 1;
6120       goto ld;
6121     case M_LWL_AB:
6122       s = "lwl";
6123       lr = 1;
6124       goto ld;
6125     case M_LWR_AB:
6126       s = "lwr";
6127       lr = 1;
6128       goto ld;
6129     case M_LDC1_AB:
6130       if (mips_opts.arch == CPU_R4650)
6131         {
6132           as_bad (_("opcode not supported on this processor"));
6133           break;
6134         }
6135       s = "ldc1";
6136       /* Itbl support may require additional care here.  */
6137       coproc = 1;
6138       goto ld;
6139     case M_LDC2_AB:
6140       s = "ldc2";
6141       /* Itbl support may require additional care here.  */
6142       coproc = 1;
6143       goto ld;
6144     case M_LDC3_AB:
6145       s = "ldc3";
6146       /* Itbl support may require additional care here.  */
6147       coproc = 1;
6148       goto ld;
6149     case M_LDL_AB:
6150       s = "ldl";
6151       lr = 1;
6152       goto ld;
6153     case M_LDR_AB:
6154       s = "ldr";
6155       lr = 1;
6156       goto ld;
6157     case M_LL_AB:
6158       s = "ll";
6159       goto ld;
6160     case M_LLD_AB:
6161       s = "lld";
6162       goto ld;
6163     case M_LWU_AB:
6164       s = "lwu";
6165     ld:
6166       if (mips_opts.arch == CPU_OCTEON
6167            && octeon_error_on_unsupported
6168            && (mask == M_LDC1_AB || mask == M_LDC2_AB || mask == M_LDC3_AB
6169                || mask == M_L_DOB || mask == M_L_DAB
6170                || mask == M_LI_D || mask == M_LI_DD
6171                || mask == M_LI_S || mask == M_LI_SS))
6172         {
6173           as_bad (_("opcode not implemented in Octeon `%s'"), ip->insn_mo->name);
6174           return;
6175         }
6176       if (breg == treg || coproc || lr)
6177         {
6178           tempreg = AT;
6179           used_at = 1;
6180         }
6181       else
6182         {
6183           tempreg = treg;
6184         }
6185       goto ld_st;
6186     case M_SB_AB:
6187       s = "sb";
6188       goto st;
6189     case M_SH_AB:
6190       s = "sh";
6191       goto st;
6192     case M_SW_AB:
6193       s = "sw";
6194       goto st;
6195     case M_SWC0_AB:
6196       s = "swc0";
6197       /* Itbl support may require additional care here.  */
6198       coproc = 1;
6199       goto st;
6200     case M_SWC1_AB:
6201       s = "swc1";
6202       /* Itbl support may require additional care here.  */
6203       coproc = 1;
6204       goto st;
6205     case M_SWC2_AB:
6206       s = "swc2";
6207       /* Itbl support may require additional care here.  */
6208       coproc = 1;
6209       goto st;
6210     case M_SWC3_AB:
6211       s = "swc3";
6212       /* Itbl support may require additional care here.  */
6213       coproc = 1;
6214       goto st;
6215     case M_SWL_AB:
6216       s = "swl";
6217       goto st;
6218     case M_SWR_AB:
6219       s = "swr";
6220       goto st;
6221     case M_SC_AB:
6222       s = "sc";
6223       goto st;
6224     case M_SCD_AB:
6225       s = "scd";
6226       goto st;
6227     case M_CACHE_AB:
6228       s = "cache";
6229       goto st;
6230     case M_SDC1_AB:
6231       if (mips_opts.arch == CPU_R4650)
6232         {
6233           as_bad (_("opcode not supported on this processor"));
6234           break;
6235         }
6236       s = "sdc1";
6237       coproc = 1;
6238       /* Itbl support may require additional care here.  */
6239       goto st;
6240     case M_SDC2_AB:
6241       s = "sdc2";
6242       /* Itbl support may require additional care here.  */
6243       coproc = 1;
6244       goto st;
6245     case M_SDC3_AB:
6246       s = "sdc3";
6247       /* Itbl support may require additional care here.  */
6248       coproc = 1;
6249       goto st;
6250     case M_SDL_AB:
6251       s = "sdl";
6252       goto st;
6253     case M_SDR_AB:
6254       s = "sdr";
6255     st:
6256       if (mips_opts.arch == CPU_OCTEON
6257           && octeon_error_on_unsupported
6258           && (mask == M_SWC0_AB || mask == M_SWC1_AB || mask == M_SWC2_AB
6259               || mask == M_SDC1_AB || mask == M_SDC2_AB || mask == M_SDC3_AB
6260               || mask == M_S_DAB || mask == M_S_DOB))
6261         {
6262           as_bad (_("opcode not implemented in Octeon `%s'"), ip->insn_mo->name);
6263           return;
6264         }
6265       tempreg = AT;
6266       used_at = 1;
6267     ld_st:
6268       /* Itbl support may require additional care here.  */
6269       if (mask == M_LWC1_AB
6270           || mask == M_SWC1_AB
6271           || mask == M_LDC1_AB
6272           || mask == M_SDC1_AB
6273           || mask == M_L_DAB
6274           || mask == M_S_DAB)
6275         fmt = "T,o(b)";
6276       else if (mask == M_CACHE_AB)
6277         fmt = "k,o(b)";
6278       else if (coproc)
6279         fmt = "E,o(b)";
6280       else
6281         fmt = "t,o(b)";
6282
6283       if (offset_expr.X_op != O_constant
6284           && offset_expr.X_op != O_symbol)
6285         {
6286           as_bad (_("expression too complex"));
6287           offset_expr.X_op = O_constant;
6288         }
6289
6290       if (HAVE_32BIT_ADDRESSES
6291           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6292         {
6293           char value [32];
6294
6295           sprintf_vma (value, offset_expr.X_add_number);
6296           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6297         }
6298
6299       /* A constant expression in PIC code can be handled just as it
6300          is in non PIC code.  */
6301       if (offset_expr.X_op == O_constant)
6302         {
6303           expr1.X_add_number = ((offset_expr.X_add_number + 0x8000)
6304                                 & ~(bfd_vma) 0xffff);
6305           normalize_address_expr (&expr1);
6306           load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6307           if (breg != 0)
6308             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6309                          tempreg, tempreg, breg);
6310           macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6311         }
6312       else if (mips_pic == NO_PIC)
6313         {
6314           /* If this is a reference to a GP relative symbol, and there
6315              is no base register, we want
6316                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6317              Otherwise, if there is no base register, we want
6318                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6319                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6320              If we have a constant, we need two instructions anyhow,
6321              so we always use the latter form.
6322
6323              If we have a base register, and this is a reference to a
6324              GP relative symbol, we want
6325                addu     $tempreg,$breg,$gp
6326                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
6327              Otherwise we want
6328                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6329                addu     $tempreg,$tempreg,$breg
6330                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6331              With a constant we always use the latter case.
6332
6333              With 64bit address space and no base register and $at usable,
6334              we want
6335                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6336                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6337                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6338                dsll32   $tempreg,0
6339                daddu    $tempreg,$at
6340                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6341              If we have a base register, we want
6342                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6343                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6344                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6345                daddu    $at,$breg
6346                dsll32   $tempreg,0
6347                daddu    $tempreg,$at
6348                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6349
6350              Without $at we can't generate the optimal path for superscalar
6351              processors here since this would require two temporary registers.
6352                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6353                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6354                dsll     $tempreg,16
6355                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6356                dsll     $tempreg,16
6357                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6358              If we have a base register, we want
6359                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6360                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6361                dsll     $tempreg,16
6362                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6363                dsll     $tempreg,16
6364                daddu    $tempreg,$tempreg,$breg
6365                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6366
6367              For GP relative symbols in 64bit address space we can use
6368              the same sequence as in 32bit address space.  */
6369           if (HAVE_64BIT_SYMBOLS)
6370             {
6371               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6372                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6373                 {
6374                   relax_start (offset_expr.X_add_symbol);
6375                   if (breg == 0)
6376                     {
6377                       macro_build (&offset_expr, s, fmt, treg,
6378                                    BFD_RELOC_GPREL16, mips_gp_register);
6379                     }
6380                   else
6381                     {
6382                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6383                                    tempreg, breg, mips_gp_register);
6384                       macro_build (&offset_expr, s, fmt, treg,
6385                                    BFD_RELOC_GPREL16, tempreg);
6386                     }
6387                   relax_switch ();
6388                 }
6389
6390               if (used_at == 0 && !mips_opts.noat)
6391                 {
6392                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6393                                BFD_RELOC_MIPS_HIGHEST);
6394                   macro_build (&offset_expr, "lui", "t,u", AT,
6395                                BFD_RELOC_HI16_S);
6396                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6397                                tempreg, BFD_RELOC_MIPS_HIGHER);
6398                   if (breg != 0)
6399                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6400                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6401                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6402                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6403                                tempreg);
6404                   used_at = 1;
6405                 }
6406               else
6407                 {
6408                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6409                                BFD_RELOC_MIPS_HIGHEST);
6410                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6411                                tempreg, BFD_RELOC_MIPS_HIGHER);
6412                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6413                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6414                                tempreg, BFD_RELOC_HI16_S);
6415                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6416                   if (breg != 0)
6417                     macro_build (NULL, "daddu", "d,v,t",
6418                                  tempreg, tempreg, breg);
6419                   macro_build (&offset_expr, s, fmt, treg,
6420                                BFD_RELOC_LO16, tempreg);
6421                 }
6422
6423               if (mips_relax.sequence)
6424                 relax_end ();
6425               break;
6426             }
6427
6428           if (breg == 0)
6429             {
6430               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6431                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6432                 {
6433                   relax_start (offset_expr.X_add_symbol);
6434                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6435                                mips_gp_register);
6436                   relax_switch ();
6437                 }
6438               macro_build_lui (&offset_expr, tempreg);
6439               macro_build (&offset_expr, s, fmt, treg,
6440                            BFD_RELOC_LO16, tempreg);
6441               if (mips_relax.sequence)
6442                 relax_end ();
6443             }
6444           else
6445             {
6446               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6447                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6448                 {
6449                   relax_start (offset_expr.X_add_symbol);
6450                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6451                                tempreg, breg, mips_gp_register);
6452                   macro_build (&offset_expr, s, fmt, treg,
6453                                BFD_RELOC_GPREL16, tempreg);
6454                   relax_switch ();
6455                 }
6456               macro_build_lui (&offset_expr, tempreg);
6457               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6458                            tempreg, tempreg, breg);
6459               macro_build (&offset_expr, s, fmt, treg,
6460                            BFD_RELOC_LO16, tempreg);
6461               if (mips_relax.sequence)
6462                 relax_end ();
6463             }
6464         }
6465       else if (!mips_big_got)
6466         {
6467           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6468
6469           /* If this is a reference to an external symbol, we want
6470                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6471                nop
6472                <op>     $treg,0($tempreg)
6473              Otherwise we want
6474                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6475                nop
6476                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6477                <op>     $treg,0($tempreg)
6478
6479              For NewABI, we want
6480                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6481                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6482
6483              If there is a base register, we add it to $tempreg before
6484              the <op>.  If there is a constant, we stick it in the
6485              <op> instruction.  We don't handle constants larger than
6486              16 bits, because we have no way to load the upper 16 bits
6487              (actually, we could handle them for the subset of cases
6488              in which we are not using $at).  */
6489           assert (offset_expr.X_op == O_symbol);
6490           if (HAVE_NEWABI)
6491             {
6492               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6493                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6494               if (breg != 0)
6495                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6496                              tempreg, tempreg, breg);
6497               macro_build (&offset_expr, s, fmt, treg,
6498                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
6499               break;
6500             }
6501           expr1.X_add_number = offset_expr.X_add_number;
6502           offset_expr.X_add_number = 0;
6503           if (expr1.X_add_number < -0x8000
6504               || expr1.X_add_number >= 0x8000)
6505             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6506           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6507                        lw_reloc_type, mips_gp_register);
6508           load_delay_nop ();
6509           relax_start (offset_expr.X_add_symbol);
6510           relax_switch ();
6511           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6512                        tempreg, BFD_RELOC_LO16);
6513           relax_end ();
6514           if (breg != 0)
6515             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6516                          tempreg, tempreg, breg);
6517           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6518         }
6519       else if (mips_big_got && !HAVE_NEWABI)
6520         {
6521           int gpdelay;
6522
6523           /* If this is a reference to an external symbol, we want
6524                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6525                addu     $tempreg,$tempreg,$gp
6526                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6527                <op>     $treg,0($tempreg)
6528              Otherwise we want
6529                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6530                nop
6531                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6532                <op>     $treg,0($tempreg)
6533              If there is a base register, we add it to $tempreg before
6534              the <op>.  If there is a constant, we stick it in the
6535              <op> instruction.  We don't handle constants larger than
6536              16 bits, because we have no way to load the upper 16 bits
6537              (actually, we could handle them for the subset of cases
6538              in which we are not using $at).  */
6539           assert (offset_expr.X_op == O_symbol);
6540           expr1.X_add_number = offset_expr.X_add_number;
6541           offset_expr.X_add_number = 0;
6542           if (expr1.X_add_number < -0x8000
6543               || expr1.X_add_number >= 0x8000)
6544             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6545           gpdelay = reg_needs_delay (mips_gp_register);
6546           relax_start (offset_expr.X_add_symbol);
6547           macro_build (&offset_expr, "lui", "t,u", tempreg,
6548                        BFD_RELOC_MIPS_GOT_HI16);
6549           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6550                        mips_gp_register);
6551           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6552                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6553           relax_switch ();
6554           if (gpdelay)
6555             macro_build (NULL, "nop", "");
6556           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6557                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6558           load_delay_nop ();
6559           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6560                        tempreg, BFD_RELOC_LO16);
6561           relax_end ();
6562
6563           if (breg != 0)
6564             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6565                          tempreg, tempreg, breg);
6566           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6567         }
6568       else if (mips_big_got && HAVE_NEWABI)
6569         {
6570           /* If this is a reference to an external symbol, we want
6571                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6572                add      $tempreg,$tempreg,$gp
6573                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6574                <op>     $treg,<ofst>($tempreg)
6575              Otherwise, for local symbols, we want:
6576                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6577                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
6578           assert (offset_expr.X_op == O_symbol);
6579           expr1.X_add_number = offset_expr.X_add_number;
6580           offset_expr.X_add_number = 0;
6581           if (expr1.X_add_number < -0x8000
6582               || expr1.X_add_number >= 0x8000)
6583             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6584           relax_start (offset_expr.X_add_symbol);
6585           macro_build (&offset_expr, "lui", "t,u", tempreg,
6586                        BFD_RELOC_MIPS_GOT_HI16);
6587           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6588                        mips_gp_register);
6589           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6590                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6591           if (breg != 0)
6592             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6593                          tempreg, tempreg, breg);
6594           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6595
6596           relax_switch ();
6597           offset_expr.X_add_number = expr1.X_add_number;
6598           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6599                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6600           if (breg != 0)
6601             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6602                          tempreg, tempreg, breg);
6603           macro_build (&offset_expr, s, fmt, treg,
6604                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
6605           relax_end ();
6606         }
6607       else
6608         abort ();
6609
6610       break;
6611
6612     case M_LI:
6613     case M_LI_S:
6614       load_register (treg, &imm_expr, 0);
6615       break;
6616
6617     case M_DLI:
6618       load_register (treg, &imm_expr, 1);
6619       break;
6620
6621     case M_LI_SS:
6622       if (imm_expr.X_op == O_constant)
6623         {
6624           used_at = 1;
6625           load_register (AT, &imm_expr, 0);
6626           macro_build (NULL, "mtc1", "t,G", AT, treg);
6627           break;
6628         }
6629       else
6630         {
6631           assert (offset_expr.X_op == O_symbol
6632                   && strcmp (segment_name (S_GET_SEGMENT
6633                                            (offset_expr.X_add_symbol)),
6634                              ".lit4") == 0
6635                   && offset_expr.X_add_number == 0);
6636           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6637                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6638           break;
6639         }
6640
6641     case M_LI_D:
6642       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6643          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6644          order 32 bits of the value and the low order 32 bits are either
6645          zero or in OFFSET_EXPR.  */
6646       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6647         {
6648           if (HAVE_64BIT_GPRS)
6649             load_register (treg, &imm_expr, 1);
6650           else
6651             {
6652               int hreg, lreg;
6653
6654               if (target_big_endian)
6655                 {
6656                   hreg = treg;
6657                   lreg = treg + 1;
6658                 }
6659               else
6660                 {
6661                   hreg = treg + 1;
6662                   lreg = treg;
6663                 }
6664
6665               if (hreg <= 31)
6666                 load_register (hreg, &imm_expr, 0);
6667               if (lreg <= 31)
6668                 {
6669                   if (offset_expr.X_op == O_absent)
6670                     move_register (lreg, 0);
6671                   else
6672                     {
6673                       assert (offset_expr.X_op == O_constant);
6674                       load_register (lreg, &offset_expr, 0);
6675                     }
6676                 }
6677             }
6678           break;
6679         }
6680
6681       /* We know that sym is in the .rdata section.  First we get the
6682          upper 16 bits of the address.  */
6683       if (mips_pic == NO_PIC)
6684         {
6685           macro_build_lui (&offset_expr, AT);
6686           used_at = 1;
6687         }
6688       else
6689         {
6690           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6691                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6692           used_at = 1;
6693         }
6694
6695       /* Now we load the register(s).  */
6696       if (HAVE_64BIT_GPRS)
6697         {
6698           used_at = 1;
6699           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6700         }
6701       else
6702         {
6703           used_at = 1;
6704           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6705           if (treg != RA)
6706             {
6707               /* FIXME: How in the world do we deal with the possible
6708                  overflow here?  */
6709               offset_expr.X_add_number += 4;
6710               macro_build (&offset_expr, "lw", "t,o(b)",
6711                            treg + 1, BFD_RELOC_LO16, AT);
6712             }
6713         }
6714       break;
6715
6716     case M_LI_DD:
6717       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
6718          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6719          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
6720          the value and the low order 32 bits are either zero or in
6721          OFFSET_EXPR.  */
6722       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6723         {
6724           used_at = 1;
6725           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
6726           if (HAVE_64BIT_FPRS)
6727             {
6728               assert (HAVE_64BIT_GPRS);
6729               macro_build (NULL, "dmtc1", "t,S", AT, treg);
6730             }
6731           else
6732             {
6733               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
6734               if (offset_expr.X_op == O_absent)
6735                 macro_build (NULL, "mtc1", "t,G", 0, treg);
6736               else
6737                 {
6738                   assert (offset_expr.X_op == O_constant);
6739                   load_register (AT, &offset_expr, 0);
6740                   macro_build (NULL, "mtc1", "t,G", AT, treg);
6741                 }
6742             }
6743           break;
6744         }
6745
6746       assert (offset_expr.X_op == O_symbol
6747               && offset_expr.X_add_number == 0);
6748       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6749       if (strcmp (s, ".lit8") == 0)
6750         {
6751           if (mips_opts.isa != ISA_MIPS1)
6752             {
6753               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
6754                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6755               break;
6756             }
6757           breg = mips_gp_register;
6758           r = BFD_RELOC_MIPS_LITERAL;
6759           goto dob;
6760         }
6761       else
6762         {
6763           assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6764           used_at = 1;
6765           if (mips_pic != NO_PIC)
6766             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6767                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
6768           else
6769             {
6770               /* FIXME: This won't work for a 64 bit address.  */
6771               macro_build_lui (&offset_expr, AT);
6772             }
6773
6774           if (mips_opts.isa != ISA_MIPS1)
6775             {
6776               macro_build (&offset_expr, "ldc1", "T,o(b)",
6777                            treg, BFD_RELOC_LO16, AT);
6778               break;
6779             }
6780           breg = AT;
6781           r = BFD_RELOC_LO16;
6782           goto dob;
6783         }
6784
6785     case M_L_DOB:
6786       if (mips_opts.arch == CPU_R4650)
6787         {
6788           as_bad (_("opcode not supported on this processor"));
6789           break;
6790         }
6791       /* Even on a big endian machine $fn comes before $fn+1.  We have
6792          to adjust when loading from memory.  */
6793       r = BFD_RELOC_LO16;
6794     dob:
6795       assert (mips_opts.isa == ISA_MIPS1);
6796       macro_build (&offset_expr, "lwc1", "T,o(b)",
6797                    target_big_endian ? treg + 1 : treg, r, breg);
6798       /* FIXME: A possible overflow which I don't know how to deal
6799          with.  */
6800       offset_expr.X_add_number += 4;
6801       macro_build (&offset_expr, "lwc1", "T,o(b)",
6802                    target_big_endian ? treg : treg + 1, r, breg);
6803       break;
6804
6805     case M_L_DAB:
6806       /*
6807        * The MIPS assembler seems to check for X_add_number not
6808        * being double aligned and generating:
6809        *        lui     at,%hi(foo+1)
6810        *        addu    at,at,v1
6811        *        addiu   at,at,%lo(foo+1)
6812        *        lwc1    f2,0(at)
6813        *        lwc1    f3,4(at)
6814        * But, the resulting address is the same after relocation so why
6815        * generate the extra instruction?
6816        */
6817       if (mips_opts.arch == CPU_R4650)
6818         {
6819           as_bad (_("opcode not supported on this processor"));
6820           break;
6821         }
6822       /* Itbl support may require additional care here.  */
6823       coproc = 1;
6824       if (mips_opts.isa != ISA_MIPS1)
6825         {
6826           s = "ldc1";
6827           goto ld;
6828         }
6829
6830       s = "lwc1";
6831       fmt = "T,o(b)";
6832       goto ldd_std;
6833
6834     case M_S_DAB:
6835       if (mips_opts.arch == CPU_R4650)
6836         {
6837           as_bad (_("opcode not supported on this processor"));
6838           break;
6839         }
6840
6841       if (mips_opts.isa != ISA_MIPS1)
6842         {
6843           s = "sdc1";
6844           goto st;
6845         }
6846
6847       s = "swc1";
6848       fmt = "T,o(b)";
6849       /* Itbl support may require additional care here.  */
6850       coproc = 1;
6851       goto ldd_std;
6852
6853     case M_LD_AB:
6854       if (HAVE_64BIT_GPRS)
6855         {
6856           s = "ld";
6857           goto ld;
6858         }
6859
6860       s = "lw";
6861       fmt = "t,o(b)";
6862       goto ldd_std;
6863
6864     case M_SD_AB:
6865       if (HAVE_64BIT_GPRS)
6866         {
6867           s = "sd";
6868           goto st;
6869         }
6870
6871       s = "sw";
6872       fmt = "t,o(b)";
6873
6874     ldd_std:
6875       if (offset_expr.X_op != O_symbol
6876           && offset_expr.X_op != O_constant)
6877         {
6878           as_bad (_("expression too complex"));
6879           offset_expr.X_op = O_constant;
6880         }
6881
6882       if (HAVE_32BIT_ADDRESSES
6883           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6884         {
6885           char value [32];
6886
6887           sprintf_vma (value, offset_expr.X_add_number);
6888           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6889         }
6890
6891       /* Even on a big endian machine $fn comes before $fn+1.  We have
6892          to adjust when loading from memory.  We set coproc if we must
6893          load $fn+1 first.  */
6894       /* Itbl support may require additional care here.  */
6895       if (! target_big_endian)
6896         coproc = 0;
6897
6898       if (mips_pic == NO_PIC
6899           || offset_expr.X_op == O_constant)
6900         {
6901           /* If this is a reference to a GP relative symbol, we want
6902                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6903                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
6904              If we have a base register, we use this
6905                addu     $at,$breg,$gp
6906                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
6907                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
6908              If this is not a GP relative symbol, we want
6909                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6910                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6911                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6912              If there is a base register, we add it to $at after the
6913              lui instruction.  If there is a constant, we always use
6914              the last case.  */
6915           if (offset_expr.X_op == O_symbol
6916               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6917               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6918             {
6919               relax_start (offset_expr.X_add_symbol);
6920               if (breg == 0)
6921                 {
6922                   tempreg = mips_gp_register;
6923                 }
6924               else
6925                 {
6926                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6927                                AT, breg, mips_gp_register);
6928                   tempreg = AT;
6929                   used_at = 1;
6930                 }
6931
6932               /* Itbl support may require additional care here.  */
6933               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6934                            BFD_RELOC_GPREL16, tempreg);
6935               offset_expr.X_add_number += 4;
6936
6937               /* Set mips_optimize to 2 to avoid inserting an
6938                  undesired nop.  */
6939               hold_mips_optimize = mips_optimize;
6940               mips_optimize = 2;
6941               /* Itbl support may require additional care here.  */
6942               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6943                            BFD_RELOC_GPREL16, tempreg);
6944               mips_optimize = hold_mips_optimize;
6945
6946               relax_switch ();
6947
6948               /* We just generated two relocs.  When tc_gen_reloc
6949                  handles this case, it will skip the first reloc and
6950                  handle the second.  The second reloc already has an
6951                  extra addend of 4, which we added above.  We must
6952                  subtract it out, and then subtract another 4 to make
6953                  the first reloc come out right.  The second reloc
6954                  will come out right because we are going to add 4 to
6955                  offset_expr when we build its instruction below.
6956
6957                  If we have a symbol, then we don't want to include
6958                  the offset, because it will wind up being included
6959                  when we generate the reloc.  */
6960
6961               if (offset_expr.X_op == O_constant)
6962                 offset_expr.X_add_number -= 8;
6963               else
6964                 {
6965                   offset_expr.X_add_number = -4;
6966                   offset_expr.X_op = O_constant;
6967                 }
6968             }
6969           used_at = 1;
6970           macro_build_lui (&offset_expr, AT);
6971           if (breg != 0)
6972             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6973           /* Itbl support may require additional care here.  */
6974           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6975                        BFD_RELOC_LO16, AT);
6976           /* FIXME: How do we handle overflow here?  */
6977           offset_expr.X_add_number += 4;
6978           /* Itbl support may require additional care here.  */
6979           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6980                        BFD_RELOC_LO16, AT);
6981           if (mips_relax.sequence)
6982             relax_end ();
6983         }
6984       else if (!mips_big_got)
6985         {
6986           /* If this is a reference to an external symbol, we want
6987                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6988                nop
6989                <op>     $treg,0($at)
6990                <op>     $treg+1,4($at)
6991              Otherwise we want
6992                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6993                nop
6994                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6995                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6996              If there is a base register we add it to $at before the
6997              lwc1 instructions.  If there is a constant we include it
6998              in the lwc1 instructions.  */
6999           used_at = 1;
7000           expr1.X_add_number = offset_expr.X_add_number;
7001           if (expr1.X_add_number < -0x8000
7002               || expr1.X_add_number >= 0x8000 - 4)
7003             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7004           load_got_offset (AT, &offset_expr);
7005           load_delay_nop ();
7006           if (breg != 0)
7007             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7008
7009           /* Set mips_optimize to 2 to avoid inserting an undesired
7010              nop.  */
7011           hold_mips_optimize = mips_optimize;
7012           mips_optimize = 2;
7013
7014           /* Itbl support may require additional care here.  */
7015           relax_start (offset_expr.X_add_symbol);
7016           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7017                        BFD_RELOC_LO16, AT);
7018           expr1.X_add_number += 4;
7019           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7020                        BFD_RELOC_LO16, AT);
7021           relax_switch ();
7022           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7023                        BFD_RELOC_LO16, AT);
7024           offset_expr.X_add_number += 4;
7025           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7026                        BFD_RELOC_LO16, AT);
7027           relax_end ();
7028
7029           mips_optimize = hold_mips_optimize;
7030         }
7031       else if (mips_big_got)
7032         {
7033           int gpdelay;
7034
7035           /* If this is a reference to an external symbol, we want
7036                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
7037                addu     $at,$at,$gp
7038                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
7039                nop
7040                <op>     $treg,0($at)
7041                <op>     $treg+1,4($at)
7042              Otherwise we want
7043                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7044                nop
7045                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7046                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7047              If there is a base register we add it to $at before the
7048              lwc1 instructions.  If there is a constant we include it
7049              in the lwc1 instructions.  */
7050           used_at = 1;
7051           expr1.X_add_number = offset_expr.X_add_number;
7052           offset_expr.X_add_number = 0;
7053           if (expr1.X_add_number < -0x8000
7054               || expr1.X_add_number >= 0x8000 - 4)
7055             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7056           gpdelay = reg_needs_delay (mips_gp_register);
7057           relax_start (offset_expr.X_add_symbol);
7058           macro_build (&offset_expr, "lui", "t,u",
7059                        AT, BFD_RELOC_MIPS_GOT_HI16);
7060           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7061                        AT, AT, mips_gp_register);
7062           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7063                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7064           load_delay_nop ();
7065           if (breg != 0)
7066             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7067           /* Itbl support may require additional care here.  */
7068           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7069                        BFD_RELOC_LO16, AT);
7070           expr1.X_add_number += 4;
7071
7072           /* Set mips_optimize to 2 to avoid inserting an undesired
7073              nop.  */
7074           hold_mips_optimize = mips_optimize;
7075           mips_optimize = 2;
7076           /* Itbl support may require additional care here.  */
7077           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7078                        BFD_RELOC_LO16, AT);
7079           mips_optimize = hold_mips_optimize;
7080           expr1.X_add_number -= 4;
7081
7082           relax_switch ();
7083           offset_expr.X_add_number = expr1.X_add_number;
7084           if (gpdelay)
7085             macro_build (NULL, "nop", "");
7086           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7087                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
7088           load_delay_nop ();
7089           if (breg != 0)
7090             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7091           /* Itbl support may require additional care here.  */
7092           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7093                        BFD_RELOC_LO16, AT);
7094           offset_expr.X_add_number += 4;
7095
7096           /* Set mips_optimize to 2 to avoid inserting an undesired
7097              nop.  */
7098           hold_mips_optimize = mips_optimize;
7099           mips_optimize = 2;
7100           /* Itbl support may require additional care here.  */
7101           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7102                        BFD_RELOC_LO16, AT);
7103           mips_optimize = hold_mips_optimize;
7104           relax_end ();
7105         }
7106       else
7107         abort ();
7108
7109       break;
7110
7111     case M_LD_OB:
7112       s = "lw";
7113       goto sd_ob;
7114     case M_SD_OB:
7115       s = "sw";
7116     sd_ob:
7117       assert (HAVE_32BIT_ADDRESSES);
7118       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7119       offset_expr.X_add_number += 4;
7120       macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
7121       break;
7122
7123     case M_SAA_AB:
7124       s = "saa";
7125       goto saa_saad;
7126
7127     case M_SAAD_AB:
7128       s = "saad";
7129
7130       saa_saad:
7131       /* The "saa/saad" instructions are new in CN58XX. These instructions
7132          do not specify offset. When invoked with address or symbol, then
7133          load the address or value of symbol in a register using the dla macro
7134          into AT, and pass the register for emitting "saa/saad" instruction. 
7135          This will get expanded to
7136
7137             dla AT, constant/label
7138             saa/saad $treg,(AT)  */
7139       {
7140         char *name = "dla";
7141         char *fmt = "t,A(b)";
7142         const struct mips_opcode *mo;
7143         struct mips_cl_insn insn;
7144
7145         mo = hash_find (op_hash, name);
7146         assert (strcmp (name, mo->name) == 0);
7147         assert (strcmp (fmt, mo->args) == 0);
7148         create_insn (&insn, mo);
7149   
7150         insn.insn_opcode = insn.insn_mo->match;
7151
7152         used_at = 1;
7153         INSERT_OPERAND (RT, insn, AT);
7154         if (breg)
7155           INSERT_OPERAND (RS, insn, breg);
7156
7157         /* The address part is forwarded through the global offset_expr. */
7158         macro (&insn);
7159
7160         macro_build (NULL, s, "t,(b)", treg, AT);
7161         break;
7162      }
7163  
7164    /* New code added to support COPZ instructions.
7165       This code builds table entries out of the macros in mip_opcodes.
7166       R4000 uses interlocks to handle coproc delays.
7167       Other chips (like the R3000) require nops to be inserted for delays.
7168
7169       FIXME: Currently, we require that the user handle delays.
7170       In order to fill delay slots for non-interlocked chips,
7171       we must have a way to specify delays based on the coprocessor.
7172       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7173       What are the side-effects of the cop instruction?
7174       What cache support might we have and what are its effects?
7175       Both coprocessor & memory require delays. how long???
7176       What registers are read/set/modified?
7177
7178       If an itbl is provided to interpret cop instructions,
7179       this knowledge can be encoded in the itbl spec.  */
7180
7181     case M_COP0:
7182       s = "c0";
7183       goto copz;
7184     case M_COP1:
7185       s = "c1";
7186       goto copz;
7187     case M_COP2:
7188       s = "c2";
7189       goto copz;
7190     case M_COP3:
7191       s = "c3";
7192     copz:
7193       if (!strcmp (s,"c2") && mips_opts.arch == CPU_OCTEON
7194           && octeon_error_on_unsupported)
7195         {
7196           as_bad (_("opcode not implemented in Octeon `%s'"), ip->insn_mo->name);
7197           return;
7198         }
7199       /* For now we just do C (same as Cz).  The parameter will be
7200          stored in insn_opcode by mips_ip.  */
7201       macro_build (NULL, s, "C", ip->insn_opcode);
7202       break;
7203
7204     case M_MOVE:
7205       move_register (dreg, sreg);
7206       break;
7207
7208 #ifdef LOSING_COMPILER
7209     default:
7210       /* Try and see if this is a new itbl instruction.
7211          This code builds table entries out of the macros in mip_opcodes.
7212          FIXME: For now we just assemble the expression and pass it's
7213          value along as a 32-bit immediate.
7214          We may want to have the assembler assemble this value,
7215          so that we gain the assembler's knowledge of delay slots,
7216          symbols, etc.
7217          Would it be more efficient to use mask (id) here? */
7218       if (itbl_have_entries
7219           && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
7220         {
7221           s = ip->insn_mo->name;
7222           s2 = "cop3";
7223           coproc = ITBL_DECODE_PNUM (immed_expr);;
7224           macro_build (&immed_expr, s, "C");
7225           break;
7226         }
7227       macro2 (ip);
7228       break;
7229     }
7230   if (mips_opts.noat && used_at)
7231     as_bad (_("Macro used $at after \".set noat\""));
7232 }
7233
7234 static void
7235 macro2 (struct mips_cl_insn *ip)
7236 {
7237   int treg, sreg, dreg, breg;
7238   int tempreg;
7239   int mask;
7240   int used_at;
7241   expressionS expr1;
7242   const char *s;
7243   const char *s2;
7244   const char *fmt;
7245   int likely = 0;
7246   int dbl = 0;
7247   int coproc = 0;
7248   int lr = 0;
7249   int imm = 0;
7250   int off;
7251   offsetT maxnum;
7252   bfd_reloc_code_real_type r;
7253
7254   treg = (ip->insn_opcode >> 16) & 0x1f;
7255   dreg = (ip->insn_opcode >> 11) & 0x1f;
7256   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7257   mask = ip->insn_mo->mask;
7258
7259   expr1.X_op = O_constant;
7260   expr1.X_op_symbol = NULL;
7261   expr1.X_add_symbol = NULL;
7262   expr1.X_add_number = 1;
7263
7264   switch (mask)
7265     {
7266 #endif /* LOSING_COMPILER */
7267
7268     case M_DMUL:
7269       dbl = 1;
7270     case M_MUL:
7271       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7272       macro_build (NULL, "mflo", "d", dreg);
7273       break;
7274
7275     case M_DMUL_I:
7276       dbl = 1;
7277     case M_MUL_I:
7278       /* The MIPS assembler some times generates shifts and adds.  I'm
7279          not trying to be that fancy. GCC should do this for us
7280          anyway.  */
7281       used_at = 1;
7282       load_register (AT, &imm_expr, dbl);
7283       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7284       macro_build (NULL, "mflo", "d", dreg);
7285       break;
7286
7287     case M_DMULO_I:
7288       dbl = 1;
7289     case M_MULO_I:
7290       imm = 1;
7291       goto do_mulo;
7292
7293     case M_DMULO:
7294       dbl = 1;
7295     case M_MULO:
7296     do_mulo:
7297       start_noreorder ();
7298       used_at = 1;
7299       if (imm)
7300         load_register (AT, &imm_expr, dbl);
7301       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7302       macro_build (NULL, "mflo", "d", dreg);
7303       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7304       macro_build (NULL, "mfhi", "d", AT);
7305       if (mips_trap)
7306         macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7307       else
7308         {
7309           expr1.X_add_number = 8;
7310           macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7311           macro_build (NULL, "nop", "", 0);
7312           macro_build (NULL, "break", "c", 6);
7313         }
7314       end_noreorder ();
7315       macro_build (NULL, "mflo", "d", dreg);
7316       break;
7317
7318     case M_DMULOU_I:
7319       dbl = 1;
7320     case M_MULOU_I:
7321       imm = 1;
7322       goto do_mulou;
7323
7324     case M_DMULOU:
7325       dbl = 1;
7326     case M_MULOU:
7327     do_mulou:
7328       start_noreorder ();
7329       used_at = 1;
7330       if (imm)
7331         load_register (AT, &imm_expr, dbl);
7332       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7333                    sreg, imm ? AT : treg);
7334       macro_build (NULL, "mfhi", "d", AT);
7335       macro_build (NULL, "mflo", "d", dreg);
7336       if (mips_trap)
7337         macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7338       else
7339         {
7340           expr1.X_add_number = 8;
7341           macro_build (&expr1, "beq", "s,t,p", AT, 0);
7342           macro_build (NULL, "nop", "", 0);
7343           macro_build (NULL, "break", "c", 6);
7344         }
7345       end_noreorder ();
7346       break;
7347
7348     case M_DROL:
7349       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7350         {
7351           if (dreg == sreg)
7352             {
7353               tempreg = AT;
7354               used_at = 1;
7355             }
7356           else
7357             {
7358               tempreg = dreg;
7359             }
7360           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7361           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7362           break;
7363         }
7364       used_at = 1;
7365       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7366       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7367       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7368       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7369       break;
7370
7371     case M_ROL:
7372       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7373         {
7374           if (dreg == sreg)
7375             {
7376               tempreg = AT;
7377               used_at = 1;
7378             }
7379           else
7380             {
7381               tempreg = dreg;
7382             }
7383           macro_build (NULL, "negu", "d,w", tempreg, treg);
7384           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7385           break;
7386         }
7387       used_at = 1;
7388       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7389       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7390       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7391       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7392       break;
7393
7394     case M_DROL_I:
7395       {
7396         unsigned int rot;
7397         char *l, *r;
7398
7399         if (imm_expr.X_op != O_constant)
7400           as_bad (_("Improper rotate count"));
7401         rot = imm_expr.X_add_number & 0x3f;
7402         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7403           {
7404             rot = (64 - rot) & 0x3f;
7405             if (rot >= 32)
7406               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7407             else
7408               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7409             break;
7410           }
7411         if (rot == 0)
7412           {
7413             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7414             break;
7415           }
7416         l = (rot < 0x20) ? "dsll" : "dsll32";
7417         r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7418         rot &= 0x1f;
7419         used_at = 1;
7420         macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7421         macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7422         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7423       }
7424       break;
7425
7426     case M_ROL_I:
7427       {
7428         unsigned int rot;
7429
7430         if (imm_expr.X_op != O_constant)
7431           as_bad (_("Improper rotate count"));
7432         rot = imm_expr.X_add_number & 0x1f;
7433         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7434           {
7435             macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7436             break;
7437           }
7438         if (rot == 0)
7439           {
7440             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7441             break;
7442           }
7443         used_at = 1;
7444         macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7445         macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7446         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7447       }
7448       break;
7449
7450     case M_DROR:
7451       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7452         {
7453           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7454           break;
7455         }
7456       used_at = 1;
7457       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7458       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7459       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7460       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7461       break;
7462
7463     case M_ROR:
7464       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7465         {
7466           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7467           break;
7468         }
7469       used_at = 1;
7470       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7471       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7472       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7473       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7474       break;
7475
7476     case M_DROR_I:
7477       {
7478         unsigned int rot;
7479         char *l, *r;
7480
7481         if (imm_expr.X_op != O_constant)
7482           as_bad (_("Improper rotate count"));
7483         rot = imm_expr.X_add_number & 0x3f;
7484         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7485           {
7486             if (rot >= 32)
7487               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7488             else
7489               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7490             break;
7491           }
7492         if (rot == 0)
7493           {
7494             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7495             break;
7496           }
7497         r = (rot < 0x20) ? "dsrl" : "dsrl32";
7498         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7499         rot &= 0x1f;
7500         used_at = 1;
7501         macro_build (NULL, r, "d,w,<", AT, sreg, rot);
7502         macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7503         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7504       }
7505       break;
7506
7507     case M_ROR_I:
7508       {
7509         unsigned int rot;
7510
7511         if (imm_expr.X_op != O_constant)
7512           as_bad (_("Improper rotate count"));
7513         rot = imm_expr.X_add_number & 0x1f;
7514         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7515           {
7516             macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7517             break;
7518           }
7519         if (rot == 0)
7520           {
7521             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7522             break;
7523           }
7524         used_at = 1;
7525         macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7526         macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7527         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7528       }
7529       break;
7530
7531     case M_S_DOB:
7532       if (mips_opts.arch == CPU_R4650)
7533         {
7534           as_bad (_("opcode not supported on this processor"));
7535           break;
7536         }
7537       assert (mips_opts.isa == ISA_MIPS1);
7538       /* Even on a big endian machine $fn comes before $fn+1.  We have
7539          to adjust when storing to memory.  */
7540       macro_build (&offset_expr, "swc1", "T,o(b)",
7541                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7542       offset_expr.X_add_number += 4;
7543       macro_build (&offset_expr, "swc1", "T,o(b)",
7544                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7545       break;
7546
7547     case M_SEQ:
7548       if (sreg == 0)
7549         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7550       else if (treg == 0)
7551         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7552       else
7553         {
7554           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7555           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7556         }
7557       break;
7558
7559     case M_SEQ_I:
7560       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7561         {
7562           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7563           break;
7564         }
7565       if (sreg == 0)
7566         {
7567           as_warn (_("Instruction %s: result is always false"),
7568                    ip->insn_mo->name);
7569           move_register (dreg, 0);
7570           break;
7571         }
7572       if (imm_expr.X_op == O_constant
7573           && imm_expr.X_add_number >= 0
7574           && imm_expr.X_add_number < 0x10000)
7575         {
7576           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7577         }
7578       else if (imm_expr.X_op == O_constant
7579                && imm_expr.X_add_number > -0x8000
7580                && imm_expr.X_add_number < 0)
7581         {
7582           imm_expr.X_add_number = -imm_expr.X_add_number;
7583           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7584                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7585         }
7586       else
7587         {
7588           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7589           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7590           used_at = 1;
7591         }
7592       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7593       break;
7594
7595     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7596       s = "slt";
7597       goto sge;
7598     case M_SGEU:
7599       s = "sltu";
7600     sge:
7601       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7602       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7603       break;
7604
7605     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7606     case M_SGEU_I:
7607       if (imm_expr.X_op == O_constant
7608           && imm_expr.X_add_number >= -0x8000
7609           && imm_expr.X_add_number < 0x8000)
7610         {
7611           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7612                        dreg, sreg, BFD_RELOC_LO16);
7613         }
7614       else
7615         {
7616           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7617           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7618                        dreg, sreg, AT);
7619           used_at = 1;
7620         }
7621       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7622       break;
7623
7624     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
7625       s = "slt";
7626       goto sgt;
7627     case M_SGTU:
7628       s = "sltu";
7629     sgt:
7630       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7631       break;
7632
7633     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
7634       s = "slt";
7635       goto sgti;
7636     case M_SGTU_I:
7637       s = "sltu";
7638     sgti:
7639       used_at = 1;
7640       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7641       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7642       break;
7643
7644     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7645       s = "slt";
7646       goto sle;
7647     case M_SLEU:
7648       s = "sltu";
7649     sle:
7650       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7651       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7652       break;
7653
7654     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7655       s = "slt";
7656       goto slei;
7657     case M_SLEU_I:
7658       s = "sltu";
7659     slei:
7660       used_at = 1;
7661       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7662       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7663       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7664       break;
7665
7666     case M_SLT_I:
7667       if (imm_expr.X_op == O_constant
7668           && imm_expr.X_add_number >= -0x8000
7669           && imm_expr.X_add_number < 0x8000)
7670         {
7671           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7672           break;
7673         }
7674       used_at = 1;
7675       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7676       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7677       break;
7678
7679     case M_SLTU_I:
7680       if (imm_expr.X_op == O_constant
7681           && imm_expr.X_add_number >= -0x8000
7682           && imm_expr.X_add_number < 0x8000)
7683         {
7684           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7685                        BFD_RELOC_LO16);
7686           break;
7687         }
7688       used_at = 1;
7689       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7690       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7691       break;
7692
7693     case M_SNE:
7694       if (sreg == 0)
7695         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7696       else if (treg == 0)
7697         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7698       else
7699         {
7700           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7701           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7702         }
7703       break;
7704
7705     case M_SNE_I:
7706       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7707         {
7708           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7709           break;
7710         }
7711       if (sreg == 0)
7712         {
7713           as_warn (_("Instruction %s: result is always true"),
7714                    ip->insn_mo->name);
7715           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7716                        dreg, 0, BFD_RELOC_LO16);
7717           break;
7718         }
7719       if (imm_expr.X_op == O_constant
7720           && imm_expr.X_add_number >= 0
7721           && imm_expr.X_add_number < 0x10000)
7722         {
7723           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7724         }
7725       else if (imm_expr.X_op == O_constant
7726                && imm_expr.X_add_number > -0x8000
7727                && imm_expr.X_add_number < 0)
7728         {
7729           imm_expr.X_add_number = -imm_expr.X_add_number;
7730           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7731                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7732         }
7733       else
7734         {
7735           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7736           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7737           used_at = 1;
7738         }
7739       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7740       break;
7741
7742     case M_DSUB_I:
7743       dbl = 1;
7744     case M_SUB_I:
7745       if (imm_expr.X_op == O_constant
7746           && imm_expr.X_add_number > -0x8000
7747           && imm_expr.X_add_number <= 0x8000)
7748         {
7749           imm_expr.X_add_number = -imm_expr.X_add_number;
7750           macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7751                        dreg, sreg, BFD_RELOC_LO16);
7752           break;
7753         }
7754       used_at = 1;
7755       load_register (AT, &imm_expr, dbl);
7756       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7757       break;
7758
7759     case M_DSUBU_I:
7760       dbl = 1;
7761     case M_SUBU_I:
7762       if (imm_expr.X_op == O_constant
7763           && imm_expr.X_add_number > -0x8000
7764           && imm_expr.X_add_number <= 0x8000)
7765         {
7766           imm_expr.X_add_number = -imm_expr.X_add_number;
7767           macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7768                        dreg, sreg, BFD_RELOC_LO16);
7769           break;
7770         }
7771       used_at = 1;
7772       load_register (AT, &imm_expr, dbl);
7773       macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7774       break;
7775
7776     case M_TEQ_I:
7777       s = "teq";
7778       goto trap;
7779     case M_TGE_I:
7780       s = "tge";
7781       goto trap;
7782     case M_TGEU_I:
7783       s = "tgeu";
7784       goto trap;
7785     case M_TLT_I:
7786       s = "tlt";
7787       goto trap;
7788     case M_TLTU_I:
7789       s = "tltu";
7790       goto trap;
7791     case M_TNE_I:
7792       s = "tne";
7793     trap:
7794       used_at = 1;
7795       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7796       macro_build (NULL, s, "s,t", sreg, AT);
7797       break;
7798
7799     case M_TRUNCWS:
7800     case M_TRUNCWD:
7801       if (mips_opts.arch == CPU_OCTEON && octeon_error_on_unsupported)
7802         {
7803           as_bad (_("opcode not implemented in Octeon `%s'"), ip->insn_mo->name);
7804           return;
7805         }
7806       assert (mips_opts.isa == ISA_MIPS1);
7807       used_at = 1;
7808       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
7809       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
7810
7811       /*
7812        * Is the double cfc1 instruction a bug in the mips assembler;
7813        * or is there a reason for it?
7814        */
7815       start_noreorder ();
7816       macro_build (NULL, "cfc1", "t,G", treg, RA);
7817       macro_build (NULL, "cfc1", "t,G", treg, RA);
7818       macro_build (NULL, "nop", "");
7819       expr1.X_add_number = 3;
7820       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7821       expr1.X_add_number = 2;
7822       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7823       macro_build (NULL, "ctc1", "t,G", AT, RA);
7824       macro_build (NULL, "nop", "");
7825       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7826                    dreg, sreg);
7827       macro_build (NULL, "ctc1", "t,G", treg, RA);
7828       macro_build (NULL, "nop", "");
7829       end_noreorder ();
7830       break;
7831
7832     case M_ULH:
7833       s = "lb";
7834       goto ulh;
7835     case M_ULHU:
7836       s = "lbu";
7837     ulh:
7838       used_at = 1;
7839       if (offset_expr.X_add_number >= 0x7fff)
7840         as_bad (_("operand overflow"));
7841       /* Expand the ulh to "lb, lbu, ins" instead of "lb, lbu, sll, ori". */
7842       if (! target_big_endian)
7843         ++offset_expr.X_add_number;
7844       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
7845       if (! target_big_endian)
7846         --offset_expr.X_add_number;
7847       else
7848         ++offset_expr.X_add_number;
7849       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7850       if (ISA_HAS_INS (mips_opts.isa))
7851         macro_build (NULL, "ins", "t,r,+A,+B", treg, AT, 8, 31);
7852       else
7853         {
7854           macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
7855           macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7856         }
7857       break;
7858
7859     case M_ULD:
7860       s = "ldl";
7861       s2 = "ldr";
7862       off = 7;
7863       goto ulw;
7864     case M_ULW:
7865       s = "lwl";
7866       s2 = "lwr";
7867       off = 3;
7868     ulw:
7869       if (offset_expr.X_add_number >= 0x8000 - off)
7870         as_bad (_("operand overflow"));
7871       if (treg != breg)
7872         tempreg = treg;
7873       else
7874         {
7875           used_at = 1;
7876           tempreg = AT;
7877         }
7878
7879       /* For small variables the compiler uses gp_rel to load the value of
7880          the variables. While parsing instructions "uld $2,%gp_rel(var)($28)"
7881          the offset_reloc[0] is set to BFD_RELOC_GPREL16. Use this relocation
7882          type while emitting instructions otherwise use BFD_RELOC_LO16.  */
7883       if (offset_reloc[0] == BFD_RELOC_UNUSED)
7884         offset_reloc[0] = BFD_RELOC_LO16;
7885
7886       if (octeon_use_unalign && mips_opts.arch == CPU_OCTEON)
7887         {
7888           /* Reset used_at as tempreg is not used while generating Octeon 
7889              unaligned load/store.  */
7890           used_at = 0;
7891           macro_build (&offset_expr, (mask == M_ULW ? "ulw" : "uld"), "t,o(b)",
7892                        treg, offset_reloc[0], breg);
7893           break;
7894         }
7895           
7896       if (! target_big_endian)
7897         offset_expr.X_add_number += off;
7898       macro_build (&offset_expr, s, "t,o(b)", tempreg, offset_reloc[0], breg);
7899       if (! target_big_endian)
7900         offset_expr.X_add_number -= off;
7901       else
7902         offset_expr.X_add_number += off;
7903       macro_build (&offset_expr, s2, "t,o(b)", tempreg, offset_reloc[0], breg);
7904
7905       /* If necessary, move the result in tempreg the final destination.  */
7906       if (treg == tempreg)
7907         break;
7908       /* Protect second load's delay slot.  */
7909       load_delay_nop ();
7910       move_register (treg, tempreg);
7911       break;
7912
7913     case M_ULD_A:
7914       s = "ldl";
7915       s2 = "ldr";
7916       off = 7;
7917       goto ulwa;
7918     case M_ULW_A:
7919       s = "lwl";
7920       s2 = "lwr";
7921       off = 3;
7922     ulwa:
7923       used_at = 1;
7924       load_address (AT, &offset_expr, &used_at);
7925       if (breg != 0)
7926         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7927
7928       /* For small variables the compiler uses gp_rel to load the value of
7929          the variables. While parsing instructions "uld $2,%gp_rel(var)($28)"
7930          the offset_reloc[0] is set to BFD_RELOC_GPREL16. Use this relocation
7931          type while emitting instructions otherwise use BFD_RELOC_LO16.  */
7932       if (offset_reloc[0] == BFD_RELOC_UNUSED)
7933         offset_reloc[0] = BFD_RELOC_LO16;
7934
7935       if (octeon_use_unalign && mips_opts.arch == CPU_OCTEON)
7936         {
7937           macro_build (&offset_expr, (mask == M_ULW_A ? "ulw" : "uld"), 
7938                        "t,o(b)", treg, offset_reloc[0], AT);
7939           break;
7940         }
7941
7942       if (! target_big_endian)
7943         expr1.X_add_number = off;
7944       else
7945         expr1.X_add_number = 0;
7946       macro_build (&expr1, s, "t,o(b)", treg, offset_reloc[0], AT);
7947       if (! target_big_endian)
7948         expr1.X_add_number = 0;
7949       else
7950         expr1.X_add_number = off;
7951       macro_build (&expr1, s2, "t,o(b)", treg, offset_reloc[0], AT);
7952       break;
7953
7954     case M_ULH_A:
7955     case M_ULHU_A:
7956       used_at = 1;
7957       load_address (AT, &offset_expr, &used_at);
7958       if (breg != 0)
7959         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7960
7961       if (ISA_HAS_INS (mips_opts.isa))
7962         {
7963           if (target_big_endian)
7964             expr1.X_add_number = 1;
7965           else
7966             expr1.X_add_number = 0;
7967           macro_build (&expr1, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7968           if (target_big_endian)
7969             expr1.X_add_number = 0;
7970           else
7971             expr1.X_add_number = 1;
7972           macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
7973                        AT, BFD_RELOC_LO16, AT);
7974           macro_build (NULL, "ins", "t,r,+A,+B", treg, AT, 8, 31);
7975           break;
7976         }
7977       if (target_big_endian)
7978         expr1.X_add_number = 0;
7979       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
7980                    treg, BFD_RELOC_LO16, AT);
7981       if (target_big_endian)
7982         expr1.X_add_number = 1;
7983       else
7984         expr1.X_add_number = 0;
7985       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7986       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7987       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7988       break;
7989
7990     case M_USH:
7991       used_at = 1;
7992       if (offset_expr.X_add_number >= 0x7fff)
7993         as_bad (_("operand overflow"));
7994       if (target_big_endian)
7995         ++offset_expr.X_add_number;
7996       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7997       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
7998       if (target_big_endian)
7999         --offset_expr.X_add_number;
8000       else
8001         ++offset_expr.X_add_number;
8002       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
8003       break;
8004
8005     case M_USD:
8006       s = "sdl";
8007       s2 = "sdr";
8008       off = 7;
8009       goto usw;
8010     case M_USW:
8011       s = "swl";
8012       s2 = "swr";
8013       off = 3;
8014     usw:
8015       if (offset_expr.X_add_number >= 0x8000 - off)
8016         as_bad (_("operand overflow"));
8017
8018       /* For small variables the compiler uses gp_rel to load the value of
8019          the variables. While parsing instructions "uld $2,%gp_rel(var)($28)"
8020          the offset_reloc[0] is set to BFD_RELOC_GPREL16. Use this relocation
8021          type while emitting instructions otherwise use BFD_RELOC_LO16.  */
8022       if (offset_reloc[0] == BFD_RELOC_UNUSED)
8023         offset_reloc[0] = BFD_RELOC_LO16;
8024
8025       if (octeon_use_unalign && mips_opts.arch == CPU_OCTEON)
8026         {
8027           macro_build (&offset_expr, (mask == M_USD ? "usd" : "usw"), 
8028                        "t,o(b)", treg, offset_reloc[0], breg);
8029           break;
8030         }
8031       if (! target_big_endian)
8032         offset_expr.X_add_number += off;
8033       macro_build (&offset_expr, s, "t,o(b)", treg, offset_reloc[0], breg);
8034       if (! target_big_endian)
8035         offset_expr.X_add_number -= off;
8036       else
8037         offset_expr.X_add_number += off;
8038       macro_build (&offset_expr, s2, "t,o(b)", treg, offset_reloc[0], breg);
8039       break;
8040
8041     case M_USD_A:
8042       s = "sdl";
8043       s2 = "sdr";
8044       off = 7;
8045       goto uswa;
8046     case M_USW_A:
8047       s = "swl";
8048       s2 = "swr";
8049       off = 3;
8050     uswa:
8051       used_at = 1;
8052       load_address (AT, &offset_expr, &used_at);
8053       if (breg != 0)
8054         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8055
8056       /* For small variables the compiler uses gp_rel to load the value of
8057          the variables. While parsing instructions "uld $2,%gp_rel(var)($28)"
8058          the offset_reloc[0] is set to BFD_RELOC_GPREL16. Use this relocation
8059          type while emitting instructions otherwise use BFD_RELOC_LO16.  */
8060       if (offset_reloc[0] == BFD_RELOC_UNUSED)
8061         offset_reloc[0] = BFD_RELOC_LO16;
8062
8063       if (octeon_use_unalign && mips_opts.arch == CPU_OCTEON)
8064         {
8065           macro_build (&offset_expr, (mask == M_USW_A ? "usw" : "usd"), 
8066                        "t,o(b)", treg, offset_reloc[0], AT);
8067           break;
8068         }
8069       if (! target_big_endian)
8070         expr1.X_add_number = off;
8071       else
8072         expr1.X_add_number = 0;
8073       macro_build (&expr1, s, "t,o(b)", treg, offset_reloc[0], AT);
8074       if (! target_big_endian)
8075         expr1.X_add_number = 0;
8076       else
8077         expr1.X_add_number = off;
8078       macro_build (&expr1, s2, "t,o(b)", treg, offset_reloc[0], AT);
8079       break;
8080
8081     case M_USH_A:
8082       used_at = 1;
8083       load_address (AT, &offset_expr, &used_at);
8084       if (breg != 0)
8085         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8086       if (! target_big_endian)
8087         expr1.X_add_number = 0;
8088       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8089       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
8090       if (! target_big_endian)
8091         expr1.X_add_number = 1;
8092       else
8093         expr1.X_add_number = 0;
8094       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8095       if (! target_big_endian)
8096         expr1.X_add_number = 0;
8097       else
8098         expr1.X_add_number = 1;
8099       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8100       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8101       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8102       break;
8103
8104     default:
8105       /* FIXME: Check if this is one of the itbl macros, since they
8106          are added dynamically.  */
8107       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8108       break;
8109     }
8110   if (mips_opts.noat && used_at)
8111     as_bad (_("Macro used $at after \".set noat\""));
8112 }
8113
8114 /* Implement macros in mips16 mode.  */
8115
8116 static void
8117 mips16_macro (struct mips_cl_insn *ip)
8118 {
8119   int mask;
8120   int xreg, yreg, zreg, tmp;
8121   expressionS expr1;
8122   int dbl;
8123   const char *s, *s2, *s3;
8124
8125   mask = ip->insn_mo->mask;
8126
8127   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8128   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8129   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
8130
8131   expr1.X_op = O_constant;
8132   expr1.X_op_symbol = NULL;
8133   expr1.X_add_symbol = NULL;
8134   expr1.X_add_number = 1;
8135
8136   dbl = 0;
8137
8138   switch (mask)
8139     {
8140     default:
8141       internalError ();
8142
8143     case M_DDIV_3:
8144       dbl = 1;
8145     case M_DIV_3:
8146       s = "mflo";
8147       goto do_div3;
8148     case M_DREM_3:
8149       dbl = 1;
8150     case M_REM_3:
8151       s = "mfhi";
8152     do_div3:
8153       start_noreorder ();
8154       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
8155       expr1.X_add_number = 2;
8156       macro_build (&expr1, "bnez", "x,p", yreg);
8157       macro_build (NULL, "break", "6", 7);
8158
8159       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8160          since that causes an overflow.  We should do that as well,
8161          but I don't see how to do the comparisons without a temporary
8162          register.  */
8163       end_noreorder ();
8164       macro_build (NULL, s, "x", zreg);
8165       break;
8166
8167     case M_DIVU_3:
8168       s = "divu";
8169       s2 = "mflo";
8170       goto do_divu3;
8171     case M_REMU_3:
8172       s = "divu";
8173       s2 = "mfhi";
8174       goto do_divu3;
8175     case M_DDIVU_3:
8176       s = "ddivu";
8177       s2 = "mflo";
8178       goto do_divu3;
8179     case M_DREMU_3:
8180       s = "ddivu";
8181       s2 = "mfhi";
8182     do_divu3:
8183       start_noreorder ();
8184       macro_build (NULL, s, "0,x,y", xreg, yreg);
8185       expr1.X_add_number = 2;
8186       macro_build (&expr1, "bnez", "x,p", yreg);
8187       macro_build (NULL, "break", "6", 7);
8188       end_noreorder ();
8189       macro_build (NULL, s2, "x", zreg);
8190       break;
8191
8192     case M_DMUL:
8193       dbl = 1;
8194     case M_MUL:
8195       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8196       macro_build (NULL, "mflo", "x", zreg);
8197       break;
8198
8199     case M_DSUBU_I:
8200       dbl = 1;
8201       goto do_subu;
8202     case M_SUBU_I:
8203     do_subu:
8204       if (imm_expr.X_op != O_constant)
8205         as_bad (_("Unsupported large constant"));
8206       imm_expr.X_add_number = -imm_expr.X_add_number;
8207       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8208       break;
8209
8210     case M_SUBU_I_2:
8211       if (imm_expr.X_op != O_constant)
8212         as_bad (_("Unsupported large constant"));
8213       imm_expr.X_add_number = -imm_expr.X_add_number;
8214       macro_build (&imm_expr, "addiu", "x,k", xreg);
8215       break;
8216
8217     case M_DSUBU_I_2:
8218       if (imm_expr.X_op != O_constant)
8219         as_bad (_("Unsupported large constant"));
8220       imm_expr.X_add_number = -imm_expr.X_add_number;
8221       macro_build (&imm_expr, "daddiu", "y,j", yreg);
8222       break;
8223
8224     case M_BEQ:
8225       s = "cmp";
8226       s2 = "bteqz";
8227       goto do_branch;
8228     case M_BNE:
8229       s = "cmp";
8230       s2 = "btnez";
8231       goto do_branch;
8232     case M_BLT:
8233       s = "slt";
8234       s2 = "btnez";
8235       goto do_branch;
8236     case M_BLTU:
8237       s = "sltu";
8238       s2 = "btnez";
8239       goto do_branch;
8240     case M_BLE:
8241       s = "slt";
8242       s2 = "bteqz";
8243       goto do_reverse_branch;
8244     case M_BLEU:
8245       s = "sltu";
8246       s2 = "bteqz";
8247       goto do_reverse_branch;
8248     case M_BGE:
8249       s = "slt";
8250       s2 = "bteqz";
8251       goto do_branch;
8252     case M_BGEU:
8253       s = "sltu";
8254       s2 = "bteqz";
8255       goto do_branch;
8256     case M_BGT:
8257       s = "slt";
8258       s2 = "btnez";
8259       goto do_reverse_branch;
8260     case M_BGTU:
8261       s = "sltu";
8262       s2 = "btnez";
8263
8264     do_reverse_branch:
8265       tmp = xreg;
8266       xreg = yreg;
8267       yreg = tmp;
8268
8269     do_branch:
8270       macro_build (NULL, s, "x,y", xreg, yreg);
8271       macro_build (&offset_expr, s2, "p");
8272       break;
8273
8274     case M_BEQ_I:
8275       s = "cmpi";
8276       s2 = "bteqz";
8277       s3 = "x,U";
8278       goto do_branch_i;
8279     case M_BNE_I:
8280       s = "cmpi";
8281       s2 = "btnez";
8282       s3 = "x,U";
8283       goto do_branch_i;
8284     case M_BLT_I:
8285       s = "slti";
8286       s2 = "btnez";
8287       s3 = "x,8";
8288       goto do_branch_i;
8289     case M_BLTU_I:
8290       s = "sltiu";
8291       s2 = "btnez";
8292       s3 = "x,8";
8293       goto do_branch_i;
8294     case M_BLE_I:
8295       s = "slti";
8296       s2 = "btnez";
8297       s3 = "x,8";
8298       goto do_addone_branch_i;
8299     case M_BLEU_I:
8300       s = "sltiu";
8301       s2 = "btnez";
8302       s3 = "x,8";
8303       goto do_addone_branch_i;
8304     case M_BGE_I:
8305       s = "slti";
8306       s2 = "bteqz";
8307       s3 = "x,8";
8308       goto do_branch_i;
8309     case M_BGEU_I:
8310       s = "sltiu";
8311       s2 = "bteqz";
8312       s3 = "x,8";
8313       goto do_branch_i;
8314     case M_BGT_I:
8315       s = "slti";
8316       s2 = "bteqz";
8317       s3 = "x,8";
8318       goto do_addone_branch_i;
8319     case M_BGTU_I:
8320       s = "sltiu";
8321       s2 = "bteqz";
8322       s3 = "x,8";
8323
8324     do_addone_branch_i:
8325       if (imm_expr.X_op != O_constant)
8326         as_bad (_("Unsupported large constant"));
8327       ++imm_expr.X_add_number;
8328
8329     do_branch_i:
8330       macro_build (&imm_expr, s, s3, xreg);
8331       macro_build (&offset_expr, s2, "p");
8332       break;
8333
8334     case M_ABS:
8335       expr1.X_add_number = 0;
8336       macro_build (&expr1, "slti", "x,8", yreg);
8337       if (xreg != yreg)
8338         move_register (xreg, yreg);
8339       expr1.X_add_number = 2;
8340       macro_build (&expr1, "bteqz", "p");
8341       macro_build (NULL, "neg", "x,w", xreg, xreg);
8342     }
8343 }
8344
8345 /* For consistency checking, verify that all bits are specified either
8346    by the match/mask part of the instruction definition, or by the
8347    operand list.  */
8348 static int
8349 validate_mips_insn (const struct mips_opcode *opc)
8350 {
8351   const char *p = opc->args;
8352   char c;
8353   unsigned long used_bits = opc->mask;
8354
8355   if ((used_bits & opc->match) != opc->match)
8356     {
8357       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8358               opc->name, opc->args);
8359       return 0;
8360     }
8361 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
8362   while (*p)
8363     switch (c = *p++)
8364       {
8365       case ',': break;
8366       case '(': break;
8367       case ')': break;
8368       case '^': USE_BITS (OP_MASK_BITIND,       OP_SH_BITIND);   break;
8369       case '~': USE_BITS (OP_MASK_BITIND,       OP_SH_BITIND);   break;
8370       case '+':
8371         switch (c = *p++)
8372           {
8373           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
8374           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
8375           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
8376           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
8377           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8378           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8379           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8380           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
8381                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8382           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8383           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8384           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8385           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8386           case 'I': break;
8387           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
8388           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
8389                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8390           default:
8391             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8392                     c, opc->name, opc->args);
8393             return 0;
8394           }
8395         break;
8396       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8397       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8398       case 'A': break;
8399       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8400       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
8401       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8402       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8403       case 'F': break;
8404       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8405       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
8406       case 'I': break;
8407       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8408       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8409       case 'L': break;
8410       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
8411       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
8412       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
8413       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
8414                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8415       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
8416       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8417       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8418       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8419       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8420       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8421       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8422       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8423       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
8424       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8425       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
8426       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8427       case 'f': break;
8428       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
8429       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8430       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8431       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
8432       case 'l': break;
8433       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8434       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8435       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8436       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8437       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8438       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8439       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8440       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8441       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8442       case 'x': break;
8443       case 'y': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8444       case 'z': break;
8445       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
8446       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8447                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8448       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
8449       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
8450       case '[': break;
8451       case ']': break;
8452       case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
8453       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
8454       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
8455       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
8456       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8457       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
8458       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
8459       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
8460       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
8461       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
8462       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
8463       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
8464       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
8465       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
8466       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
8467       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
8468       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8469       default:
8470         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8471                 c, opc->name, opc->args);
8472         return 0;
8473       }
8474 #undef USE_BITS
8475   if (used_bits != 0xffffffff)
8476     {
8477       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8478               ~used_bits & 0xffffffff, opc->name, opc->args);
8479       return 0;
8480     }
8481   return 1;
8482 }
8483
8484 /* UDI immediates.  */
8485 struct mips_immed {
8486   char          type;
8487   unsigned int  shift;
8488   unsigned long mask;
8489   const char *  desc;
8490 };
8491
8492 static const struct mips_immed mips_immed[] = {
8493   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
8494   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
8495   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
8496   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
8497   { 0,0,0,0 }
8498 };
8499
8500 /* Check whether an odd floating-point register is allowed.  */
8501 static int
8502 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8503 {
8504   const char *s = insn->name;
8505
8506   if (insn->pinfo == INSN_MACRO)
8507     /* Let a macro pass, we'll catch it later when it is expanded.  */
8508     return 1;
8509
8510   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8511     {
8512       /* Allow odd registers for single-precision ops.  */
8513       switch (insn->pinfo & (FP_S | FP_D))
8514         {
8515         case FP_S:
8516         case 0:
8517           return 1;     /* both single precision - ok */
8518         case FP_D:
8519           return 0;     /* both double precision - fail */
8520         default:
8521           break;
8522         }
8523
8524       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
8525       s = strchr (insn->name, '.');
8526       if (argnum == 2)
8527         s = s != NULL ? strchr (s + 1, '.') : NULL;
8528       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8529     } 
8530
8531   /* Single-precision coprocessor loads and moves are OK too.  */
8532   if ((insn->pinfo & FP_S)
8533       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8534                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8535     return 1;
8536
8537   return 0;
8538 }
8539
8540 /* This routine assembles an instruction into its binary format.  As a
8541    side effect, it sets one of the global variables imm_reloc or
8542    offset_reloc to the type of relocation to do if one of the operands
8543    is an address expression.  */
8544
8545 static void
8546 mips_ip (char *str, struct mips_cl_insn *ip)
8547 {
8548   char *s;
8549   const char *args;
8550   char c = 0;
8551   struct mips_opcode *insn;
8552   char *argsStart;
8553   unsigned int regno;
8554   unsigned int lastregno = 0;
8555   unsigned int lastpos = 0;
8556   unsigned int limlo, limhi;
8557   char *s_reset;
8558   char save_c = 0;
8559   offsetT min_range, max_range;
8560   int argnum;
8561   unsigned int rtype;
8562
8563   insn_error = NULL;
8564
8565   /* If the instruction contains a '.', we first try to match an instruction
8566      including the '.'.  Then we try again without the '.'.  */
8567   insn = NULL;
8568   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8569     continue;
8570
8571   /* If we stopped on whitespace, then replace the whitespace with null for
8572      the call to hash_find.  Save the character we replaced just in case we
8573      have to re-parse the instruction.  */
8574   if (ISSPACE (*s))
8575     {
8576       save_c = *s;
8577       *s++ = '\0';
8578     }
8579
8580   insn = (struct mips_opcode *) hash_find (op_hash, str);
8581
8582   /* If we didn't find the instruction in the opcode table, try again, but
8583      this time with just the instruction up to, but not including the
8584      first '.'.  */
8585   if (insn == NULL)
8586     {
8587       /* Restore the character we overwrite above (if any).  */
8588       if (save_c)
8589         *(--s) = save_c;
8590
8591       /* Scan up to the first '.' or whitespace.  */
8592       for (s = str;
8593            *s != '\0' && *s != '.' && !ISSPACE (*s);
8594            ++s)
8595         continue;
8596
8597       /* If we did not find a '.', then we can quit now.  */
8598       if (*s != '.')
8599         {
8600           insn_error = "unrecognized opcode";
8601           return;
8602         }
8603
8604       /* Lookup the instruction in the hash table.  */
8605       *s++ = '\0';
8606       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8607         {
8608           insn_error = "unrecognized opcode";
8609           return;
8610         }
8611     }
8612
8613   argsStart = s;
8614   for (;;)
8615     {
8616       bfd_boolean ok;
8617
8618       assert (strcmp (insn->name, str) == 0);
8619
8620       if (OPCODE_IS_MEMBER (insn,
8621                             (mips_opts.isa
8622                              /* We don't check for mips_opts.mips16 here since
8623                                 we want to allow jalx if -mips16 was specified
8624                                 on the command line.  */
8625                              | (file_ase_mips16 ? INSN_MIPS16 : 0)
8626                              | (mips_opts.ase_mdmx ? INSN_MDMX : 0)
8627                              | (mips_opts.ase_dsp ? INSN_DSP : 0)
8628                              | ((mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
8629                                 ? INSN_DSP64 : 0)
8630                              | (mips_opts.ase_dspr2 ? INSN_DSPR2 : 0)
8631                              | (mips_opts.ase_mt ? INSN_MT : 0)
8632                              | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)
8633                              | (mips_opts.ase_smartmips ? INSN_SMARTMIPS : 0)),
8634                             mips_opts.arch))
8635         ok = TRUE;
8636       else
8637         ok = FALSE;
8638
8639       if (insn->pinfo != INSN_MACRO)
8640         {
8641           if (mips_opts.arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
8642             ok = FALSE;
8643
8644           if (mips_opts.arch == CPU_OCTEON
8645               && octeon_error_on_unsupported
8646               && ((insn->pinfo & FP_D) != 0
8647                   || (insn->pinfo & FP_S) !=0
8648                   || strcmp (insn->name, "prefx") == 0))
8649             {
8650               insn_error = "opcode not implemented in Octeon";
8651               return;
8652             }
8653
8654           if (mips_opts.arch == CPU_OCTEON
8655               && octeon_error_on_unsupported
8656               && (strcmp (insn->name, "swc2") == 0
8657                   || strcmp (insn->name, "lwc2") == 0
8658                   || strcmp (insn->name, "sdc2") == 0
8659                   || strcmp (insn->name, "ldc2") == 0
8660                   || strcmp (insn->name, "bc2f") == 0
8661                   || strcmp (insn->name, "bc2t") == 0
8662                   || strcmp (insn->name, "mfc2") == 0
8663                   || strcmp (insn->name, "mtc2") == 0
8664                   || strcmp (insn->name, "ctc2") == 0
8665                   || strcmp (insn->name, "cfc2") == 0
8666                   || strcmp (insn->name, "mfhc2") == 0
8667                   || strcmp (insn->name, "mthc2") == 0))
8668             {
8669               insn_error = "opcode not implemented in Octeon";
8670               return;
8671             }
8672
8673           /* Issue a warning message for Octeon unaligned load/store 
8674              instructions used when octeon_use_unalign is not set.  */
8675           if (mips_opts.arch == CPU_OCTEON && ! octeon_use_unalign
8676               && (strcmp (insn->name, "ulw") == 0
8677                   || strcmp (insn->name, "uld") == 0
8678                   || strcmp (insn->name, "usw") == 0
8679                   || strcmp (insn->name, "usd") == 0))
8680             {
8681               static char buf[120];
8682               sprintf (buf, _("Octeon specific unaligned load/store instructions are not allowed with -mno-octeon-useun"));
8683               insn_error = buf;
8684               return;
8685             }
8686
8687           /* Issue a warning message for MIPS unaligned load/store 
8688              instructions used when octeon_use_unalign is set.  */
8689           if (mips_opts.arch == CPU_OCTEON && octeon_use_unalign
8690               && (strcmp (insn->name, "lwl") == 0
8691                   || strcmp (insn->name, "lwr") == 0
8692                   || strcmp (insn->name, "ldl") == 0
8693                   || strcmp (insn->name, "ldr") == 0
8694                   || strcmp (insn->name, "sdl") == 0
8695                   || strcmp (insn->name, "sdr") == 0
8696                   || strcmp (insn->name, "swr") == 0
8697                   || strcmp (insn->name, "swl") == 0))
8698             {
8699               static char buf[100];
8700               sprintf (buf, _("Unaligned load/store instructions are not allowed with -mocteon-useun"));
8701               insn_error = buf;
8702               return;
8703             }
8704         }
8705
8706       /* Octeon has its own version of dmtc2/dmfc2 instructions, error on 
8707          other formats.  */
8708       if (mips_opts.arch == CPU_OCTEON 
8709           && (strcmp (insn->name, "dmtc2") == 0
8710               || strcmp (insn->name, "dmfc2") == 0)
8711           && (insn->membership & INSN_OCTEON) != INSN_OCTEON)
8712         {
8713           static char buf[100];
8714           sprintf (buf,
8715                    _("opcode not supported in %s"),
8716                      mips_cpu_info_from_arch (mips_opts.arch)->name);
8717           insn_error = buf;
8718           ok = FALSE;
8719         }
8720
8721       if (! ok)
8722         {
8723           if (insn + 1 < &mips_opcodes[NUMOPCODES]
8724               && strcmp (insn->name, insn[1].name) == 0)
8725             {
8726               ++insn;
8727               continue;
8728             }
8729           else
8730             {
8731               if (!insn_error)
8732                 {
8733                   static char buf[100];
8734                   sprintf (buf,
8735                            _("opcode not supported on this processor: %s (%s)"),
8736                            mips_cpu_info_from_arch (mips_opts.arch)->name,
8737                            mips_cpu_info_from_isa (mips_opts.isa)->name);
8738                   insn_error = buf;
8739                 }
8740               if (save_c)
8741                 *(--s) = save_c;
8742               return;
8743             }
8744         }
8745
8746       create_insn (ip, insn);
8747       insn_error = NULL;
8748       argnum = 1;
8749       for (args = insn->args;; ++args)
8750         {
8751           int is_mdmx;
8752
8753           s += strspn (s, " \t");
8754           is_mdmx = 0;
8755           switch (*args)
8756             {
8757             case '\0':          /* end of args */
8758               if (*s == '\0')
8759                 return;
8760               break;
8761
8762             case '2': /* dsp 2-bit unsigned immediate in bit 11 */
8763               my_getExpression (&imm_expr, s);
8764               check_absolute_expr (ip, &imm_expr);
8765               if ((unsigned long) imm_expr.X_add_number != 1
8766                   && (unsigned long) imm_expr.X_add_number != 3)
8767                 {
8768                   as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8769                           (unsigned long) imm_expr.X_add_number);
8770                 }
8771               INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8772               imm_expr.X_op = O_absent;
8773               s = expr_end;
8774               continue;
8775
8776             case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8777               my_getExpression (&imm_expr, s);
8778               check_absolute_expr (ip, &imm_expr);
8779               if (imm_expr.X_add_number & ~OP_MASK_SA3)
8780                 {
8781                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8782                           OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8783                 }
8784               INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
8785               imm_expr.X_op = O_absent;
8786               s = expr_end;
8787               continue;
8788
8789             case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8790               my_getExpression (&imm_expr, s);
8791               check_absolute_expr (ip, &imm_expr);
8792               if (imm_expr.X_add_number & ~OP_MASK_SA4)
8793                 {
8794                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8795                           OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8796                 }
8797               INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
8798               imm_expr.X_op = O_absent;
8799               s = expr_end;
8800               continue;
8801
8802             case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8803               my_getExpression (&imm_expr, s);
8804               check_absolute_expr (ip, &imm_expr);
8805               if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8806                 {
8807                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8808                           OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8809                 }
8810               INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
8811               imm_expr.X_op = O_absent;
8812               s = expr_end;
8813               continue;
8814
8815             case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8816               my_getExpression (&imm_expr, s);
8817               check_absolute_expr (ip, &imm_expr);
8818               if (imm_expr.X_add_number & ~OP_MASK_RS)
8819                 {
8820                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8821                           OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8822                 }
8823               INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
8824               imm_expr.X_op = O_absent;
8825               s = expr_end;
8826               continue;
8827
8828             case '7': /* four dsp accumulators in bits 11,12 */ 
8829               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8830                   s[3] >= '0' && s[3] <= '3')
8831                 {
8832                   regno = s[3] - '0';
8833                   s += 4;
8834                   INSERT_OPERAND (DSPACC, *ip, regno);
8835                   continue;
8836                 }
8837               else
8838                 as_bad (_("Invalid dsp acc register"));
8839               break;
8840
8841             case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8842               my_getExpression (&imm_expr, s);
8843               check_absolute_expr (ip, &imm_expr);
8844               if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8845                 {
8846                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8847                           OP_MASK_WRDSP,
8848                           (unsigned long) imm_expr.X_add_number);
8849                 }
8850               INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
8851               imm_expr.X_op = O_absent;
8852               s = expr_end;
8853               continue;
8854
8855             case '9': /* four dsp accumulators in bits 21,22 */
8856               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8857                   s[3] >= '0' && s[3] <= '3')
8858                 {
8859                   regno = s[3] - '0';
8860                   s += 4;
8861                   INSERT_OPERAND (DSPACC_S, *ip, regno);
8862                   continue;
8863                 }
8864               else
8865                 as_bad (_("Invalid dsp acc register"));
8866               break;
8867
8868             case '0': /* dsp 6-bit signed immediate in bit 20 */
8869               my_getExpression (&imm_expr, s);
8870               check_absolute_expr (ip, &imm_expr);
8871               min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8872               max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8873               if (imm_expr.X_add_number < min_range ||
8874                   imm_expr.X_add_number > max_range)
8875                 {
8876                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8877                           (long) min_range, (long) max_range,
8878                           (long) imm_expr.X_add_number);
8879                 }
8880               INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
8881               imm_expr.X_op = O_absent;
8882               s = expr_end;
8883               continue;
8884
8885             case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8886               my_getExpression (&imm_expr, s);
8887               check_absolute_expr (ip, &imm_expr);
8888               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8889                 {
8890                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8891                           OP_MASK_RDDSP,
8892                           (unsigned long) imm_expr.X_add_number);
8893                 }
8894               INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
8895               imm_expr.X_op = O_absent;
8896               s = expr_end;
8897               continue;
8898
8899             case ':': /* dsp 7-bit signed immediate in bit 19 */
8900               my_getExpression (&imm_expr, s);
8901               check_absolute_expr (ip, &imm_expr);
8902               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8903               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8904               if (imm_expr.X_add_number < min_range ||
8905                   imm_expr.X_add_number > max_range)
8906                 {
8907                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8908                           (long) min_range, (long) max_range,
8909                           (long) imm_expr.X_add_number);
8910                 }
8911               INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
8912               imm_expr.X_op = O_absent;
8913               s = expr_end;
8914               continue;
8915
8916             case '@': /* dsp 10-bit signed immediate in bit 16 */
8917               my_getExpression (&imm_expr, s);
8918               check_absolute_expr (ip, &imm_expr);
8919               min_range = -((OP_MASK_IMM10 + 1) >> 1);
8920               max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8921               if (imm_expr.X_add_number < min_range ||
8922                   imm_expr.X_add_number > max_range)
8923                 {
8924                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8925                           (long) min_range, (long) max_range,
8926                           (long) imm_expr.X_add_number);
8927                 }
8928               INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
8929               imm_expr.X_op = O_absent;
8930               s = expr_end;
8931               continue;
8932
8933             case '!': /* MT usermode flag bit.  */
8934               my_getExpression (&imm_expr, s);
8935               check_absolute_expr (ip, &imm_expr);
8936               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
8937                 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
8938                         (unsigned long) imm_expr.X_add_number);
8939               INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
8940               imm_expr.X_op = O_absent;
8941               s = expr_end;
8942               continue;
8943
8944             case '$': /* MT load high flag bit.  */
8945               my_getExpression (&imm_expr, s);
8946               check_absolute_expr (ip, &imm_expr);
8947               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
8948                 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
8949                         (unsigned long) imm_expr.X_add_number);
8950               INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
8951               imm_expr.X_op = O_absent;
8952               s = expr_end;
8953               continue;
8954
8955             case '*': /* four dsp accumulators in bits 18,19 */ 
8956               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8957                   s[3] >= '0' && s[3] <= '3')
8958                 {
8959                   regno = s[3] - '0';
8960                   s += 4;
8961                   INSERT_OPERAND (MTACC_T, *ip, regno);
8962                   continue;
8963                 }
8964               else
8965                 as_bad (_("Invalid dsp/smartmips acc register"));
8966               break;
8967
8968             case '&': /* four dsp accumulators in bits 13,14 */ 
8969               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8970                   s[3] >= '0' && s[3] <= '3')
8971                 {
8972                   regno = s[3] - '0';
8973                   s += 4;
8974                   INSERT_OPERAND (MTACC_D, *ip, regno);
8975                   continue;
8976                 }
8977               else
8978                 as_bad (_("Invalid dsp/smartmips acc register"));
8979               break;
8980
8981             case ',':
8982               ++argnum;
8983               if (*s++ == *args)
8984                 continue;
8985               s--;
8986               switch (*++args)
8987                 {
8988                 case 'r':
8989                 case 'v':
8990                   INSERT_OPERAND (RS, *ip, lastregno);
8991                   continue;
8992
8993                 case 'w':
8994                   INSERT_OPERAND (RT, *ip, lastregno);
8995                   continue;
8996
8997                 case 'W':
8998                   INSERT_OPERAND (FT, *ip, lastregno);
8999                   continue;
9000
9001                 case 'V':
9002                   INSERT_OPERAND (FS, *ip, lastregno);
9003                   continue;
9004                 }
9005               break;
9006
9007             case '(':
9008               /* Handle optional base register.
9009                  Either the base register is omitted or
9010                  we must have a left paren.  */
9011               /* This is dependent on the next operand specifier
9012                  is a base register specification.  */
9013               assert (args[1] == 'b' || args[1] == '5'
9014                       || args[1] == '-' || args[1] == '4');
9015               if (*s == '\0')
9016                 return;
9017
9018             case ')':           /* these must match exactly */
9019             case '[':
9020             case ']':
9021               if (*s++ == *args)
9022                 continue;
9023               break;
9024
9025             case '+':           /* Opcode extension character.  */
9026               switch (*++args)
9027                 {
9028                 case '1':       /* UDI immediates.  */
9029                 case '2':
9030                 case '3':
9031                 case '4':
9032                   {
9033                     const struct mips_immed *imm = mips_immed;
9034
9035                     while (imm->type && imm->type != *args)
9036                       ++imm;
9037                     if (! imm->type)
9038                       internalError ();
9039                     my_getExpression (&imm_expr, s);
9040                     check_absolute_expr (ip, &imm_expr);
9041                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
9042                       {
9043                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
9044                                  imm->desc ? imm->desc : ip->insn_mo->name,
9045                                  (unsigned long) imm_expr.X_add_number,
9046                                  (unsigned long) imm_expr.X_add_number);
9047                               imm_expr.X_add_number &= imm->mask;
9048                       }
9049                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
9050                                         << imm->shift);
9051                     imm_expr.X_op = O_absent;
9052                     s = expr_end;
9053                   }
9054                   continue;
9055                   
9056                 case 'A':               /* ins/ext position, becomes LSB.  */
9057                   limlo = 0;
9058                   limhi = 31;
9059                   goto do_lsb;
9060                 case 'E':
9061                   limlo = 32;
9062                   limhi = 63;
9063                   goto do_lsb;
9064 do_lsb:
9065                   my_getExpression (&imm_expr, s);
9066                   check_absolute_expr (ip, &imm_expr);
9067                   if ((unsigned long) imm_expr.X_add_number < limlo
9068                       || (unsigned long) imm_expr.X_add_number > limhi)
9069                     {
9070                       as_bad (_("Improper position (%lu)"),
9071                               (unsigned long) imm_expr.X_add_number);
9072                       imm_expr.X_add_number = limlo;
9073                     }
9074                   lastpos = imm_expr.X_add_number;
9075                   INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9076                   imm_expr.X_op = O_absent;
9077                   s = expr_end;
9078                   continue;
9079
9080                 case 'B':               /* ins size, becomes MSB.  */
9081                   limlo = 1;
9082                   limhi = 32;
9083                   goto do_msb;
9084                 case 'F':
9085                   limlo = 33;
9086                   limhi = 64;
9087                   goto do_msb;
9088 do_msb:
9089                   my_getExpression (&imm_expr, s);
9090                   check_absolute_expr (ip, &imm_expr);
9091                   /* Check for negative input so that small negative numbers
9092                      will not succeed incorrectly.  The checks against
9093                      (pos+size) transitively check "size" itself,
9094                      assuming that "pos" is reasonable.  */
9095                   if ((long) imm_expr.X_add_number < 0
9096                       || ((unsigned long) imm_expr.X_add_number
9097                           + lastpos) < limlo
9098                       || ((unsigned long) imm_expr.X_add_number
9099                           + lastpos) > limhi)
9100                     {
9101                       as_bad (_("Improper insert size (%lu, position %lu)"),
9102                               (unsigned long) imm_expr.X_add_number,
9103                               (unsigned long) lastpos);
9104                       imm_expr.X_add_number = limlo - lastpos;
9105                     }
9106                   INSERT_OPERAND (INSMSB, *ip,
9107                                  lastpos + imm_expr.X_add_number - 1);
9108                   imm_expr.X_op = O_absent;
9109                   s = expr_end;
9110                   continue;
9111
9112                 case 'C':               /* ext size, becomes MSBD.  */
9113                   limlo = 1;
9114                   limhi = 32;
9115                   goto do_msbd;
9116                 case 'G':
9117                   limlo = 33;
9118                   limhi = 64;
9119                   goto do_msbd;
9120                 case 'H':
9121                   limlo = 33;
9122                   limhi = 64;
9123                   goto do_msbd;
9124 do_msbd:
9125                   my_getExpression (&imm_expr, s);
9126                   check_absolute_expr (ip, &imm_expr);
9127                   /* Check for negative input so that small negative numbers
9128                      will not succeed incorrectly.  The checks against
9129                      (pos+size) transitively check "size" itself,
9130                      assuming that "pos" is reasonable.  */
9131                   if ((long) imm_expr.X_add_number < 0
9132                       || ((unsigned long) imm_expr.X_add_number
9133                           + lastpos) < limlo
9134                       || ((unsigned long) imm_expr.X_add_number
9135                           + lastpos) > limhi)
9136                     {
9137                       as_bad (_("Improper extract size (%lu, position %lu)"),
9138                               (unsigned long) imm_expr.X_add_number,
9139                               (unsigned long) lastpos);
9140                       imm_expr.X_add_number = limlo - lastpos;
9141                     }
9142                   INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
9143                   imm_expr.X_op = O_absent;
9144                   s = expr_end;
9145                   continue;
9146
9147                 case 'D':
9148                   /* +D is for disassembly only; never match.  */
9149                   break;
9150
9151                 case 'I':
9152                   /* "+I" is like "I", except that imm2_expr is used.  */
9153                   my_getExpression (&imm2_expr, s);
9154                   if (imm2_expr.X_op != O_big
9155                       && imm2_expr.X_op != O_constant)
9156                   insn_error = _("absolute expression required");
9157                   if (HAVE_32BIT_GPRS)
9158                     normalize_constant_expr (&imm2_expr);
9159                   s = expr_end;
9160                   continue;
9161
9162                 case 'T': /* Coprocessor register.  */
9163                   /* +T is for disassembly only; never match.  */
9164                   break;
9165
9166                 case 't': /* Coprocessor register number.  */
9167                   if (s[0] == '$' && ISDIGIT (s[1]))
9168                     {
9169                       ++s;
9170                       regno = 0;
9171                       do
9172                         {
9173                           regno *= 10;
9174                           regno += *s - '0';
9175                           ++s;
9176                         }
9177                       while (ISDIGIT (*s));
9178                       if (regno > 31)
9179                         as_bad (_("Invalid register number (%d)"), regno);
9180                       else
9181                         {
9182                           INSERT_OPERAND (RT, *ip, regno);
9183                           continue;
9184                         }
9185                     }
9186                   else
9187                     as_bad (_("Invalid coprocessor 0 register number"));
9188                   break;
9189
9190                 default:
9191                   as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
9192                     *args, insn->name, insn->args);
9193                   /* Further processing is fruitless.  */
9194                   return;
9195                 }
9196               break;
9197
9198             case '<':           /* must be at least one digit */
9199               /*
9200                * According to the manual, if the shift amount is greater
9201                * than 31 or less than 0, then the shift amount should be
9202                * mod 32.  In reality the mips assembler issues an error.
9203                * We issue a warning and mask out all but the low 5 bits.
9204                */
9205               my_getExpression (&imm_expr, s);
9206               check_absolute_expr (ip, &imm_expr);
9207               if ((unsigned long) imm_expr.X_add_number > 31)
9208                 as_warn (_("Improper shift amount (%lu)"),
9209                          (unsigned long) imm_expr.X_add_number);
9210               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9211               imm_expr.X_op = O_absent;
9212               s = expr_end;
9213               continue;
9214
9215             case '>':           /* shift amount minus 32 */
9216               my_getExpression (&imm_expr, s);
9217               check_absolute_expr (ip, &imm_expr);
9218               if ((unsigned long) imm_expr.X_add_number < 32
9219                   || (unsigned long) imm_expr.X_add_number > 63)
9220                 break;
9221               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
9222               imm_expr.X_op = O_absent;
9223               s = expr_end;
9224               continue;
9225
9226              case '^':           /* must be at least one digit */
9227               /* Decode 5-bits of bbit0/1's bit index amount. If the value is 
9228                  greater than 31, issue a warning and mask out all but the low 
9229                  5 bits.  */
9230               my_getExpression (&imm_expr, s);
9231               check_absolute_expr (ip, &imm_expr);
9232               if ((unsigned long) imm_expr.X_add_number > 31)
9233                 {
9234                   as_warn (_("Improper bit index amount (%lu)"),
9235                            (unsigned long) imm_expr.X_add_number);
9236                   imm_expr.X_add_number &= OP_MASK_BITIND;
9237                 }
9238               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_BITIND;
9239               imm_expr.X_op = O_absent;
9240               s = expr_end;
9241               continue;
9242  
9243             case '~':           /* bit index minus 32 */
9244               my_getExpression (&imm_expr, s);
9245               check_absolute_expr (ip, &imm_expr);
9246               if ((unsigned long) imm_expr.X_add_number < 32
9247                   || (unsigned long) imm_expr.X_add_number > 63)
9248                 break;
9249               ip->insn_opcode |= (imm_expr.X_add_number - 32) << OP_SH_BITIND;
9250               imm_expr.X_op = O_absent;
9251               s = expr_end;
9252               continue;
9253
9254             case 'k':           /* cache code */
9255             case 'h':           /* prefx code */
9256               my_getExpression (&imm_expr, s);
9257               check_absolute_expr (ip, &imm_expr);
9258               if ((unsigned long) imm_expr.X_add_number > 31)
9259                 as_warn (_("Invalid value for `%s' (%lu)"),
9260                          ip->insn_mo->name,
9261                          (unsigned long) imm_expr.X_add_number);
9262               if (*args == 'k')
9263                 INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9264               else
9265                 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
9266               imm_expr.X_op = O_absent;
9267               s = expr_end;
9268               continue;
9269
9270             case 'c':           /* break code */
9271               my_getExpression (&imm_expr, s);
9272               check_absolute_expr (ip, &imm_expr);
9273               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9274                 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9275                          ip->insn_mo->name,
9276                          (unsigned long) imm_expr.X_add_number);
9277               INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9278               imm_expr.X_op = O_absent;
9279               s = expr_end;
9280               continue;
9281
9282             case 'q':           /* lower break code */
9283               my_getExpression (&imm_expr, s);
9284               check_absolute_expr (ip, &imm_expr);
9285               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9286                 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9287                          ip->insn_mo->name,
9288                          (unsigned long) imm_expr.X_add_number);
9289               INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9290               imm_expr.X_op = O_absent;
9291               s = expr_end;
9292               continue;
9293
9294             case 'y':
9295               /* Decode 10-bits of seqi/snei's signed constant offset. Issue 
9296                  a warning message if the value is not within the range.  */
9297               my_getExpression (&imm_expr, s);
9298               check_absolute_expr (ip, &imm_expr);
9299               if (((unsigned long) imm_expr.X_add_number + 0x200) > 1023)
9300                 {
9301                   as_warn (_("Illegal 10-bit signed constant (%lu)"),
9302                            (unsigned long) imm_expr.X_add_number);
9303                            imm_expr.X_add_number &= OP_MASK_CODE2;
9304                 }
9305               ip->insn_opcode |= (imm_expr.X_add_number & OP_MASK_CODE2)
9306                                   << OP_SH_CODE2;
9307               imm_expr.X_op = O_absent;
9308               s = expr_end;
9309               continue;
9310
9311             case 'B':           /* 20-bit syscall/break code.  */
9312               my_getExpression (&imm_expr, s);
9313               check_absolute_expr (ip, &imm_expr);
9314               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9315                 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9316                          ip->insn_mo->name,
9317                          (unsigned long) imm_expr.X_add_number);
9318               INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9319               imm_expr.X_op = O_absent;
9320               s = expr_end;
9321               continue;
9322
9323             case 'C':           /* Coprocessor code */
9324               my_getExpression (&imm_expr, s);
9325               check_absolute_expr (ip, &imm_expr);
9326               if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9327                 {
9328                   as_warn (_("Coproccesor code > 25 bits (%lu)"),
9329                            (unsigned long) imm_expr.X_add_number);
9330                   imm_expr.X_add_number &= OP_MASK_COPZ;
9331                 }
9332               INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9333               imm_expr.X_op = O_absent;
9334               s = expr_end;
9335               continue;
9336
9337             case 'J':           /* 19-bit wait code.  */
9338               my_getExpression (&imm_expr, s);
9339               check_absolute_expr (ip, &imm_expr);
9340               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9341                 {
9342                   as_warn (_("Illegal 19-bit code (%lu)"),
9343                            (unsigned long) imm_expr.X_add_number);
9344                   imm_expr.X_add_number &= OP_MASK_CODE19;
9345                 }
9346               INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9347               imm_expr.X_op = O_absent;
9348               s = expr_end;
9349               continue;
9350
9351             case 'P':           /* Performance register.  */
9352               my_getExpression (&imm_expr, s);
9353               check_absolute_expr (ip, &imm_expr);
9354               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9355                 as_warn (_("Invalid performance register (%lu)"),
9356                          (unsigned long) imm_expr.X_add_number);
9357               INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9358               imm_expr.X_op = O_absent;
9359               s = expr_end;
9360               continue;
9361
9362             case 'G':           /* Coprocessor destination register.  */
9363               if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9364                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9365               else
9366                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9367               INSERT_OPERAND (RD, *ip, regno);
9368               if (ok) 
9369                 {
9370                   lastregno = regno;
9371                   continue;
9372                 }
9373               else
9374                 break;
9375
9376             case 'b':           /* base register */
9377             case 'd':           /* destination register */
9378             case 's':           /* source register */
9379             case 't':           /* target register */
9380             case 'r':           /* both target and source */
9381             case 'v':           /* both dest and source */
9382             case 'w':           /* both dest and target */
9383             case 'E':           /* coprocessor target register */
9384             case 'K':           /* 'rdhwr' destination register */
9385             case 'x':           /* ignore register name */
9386             case 'z':           /* must be zero register */
9387             case 'U':           /* destination register (clo/clz).  */
9388             case 'g':           /* coprocessor destination register */
9389               s_reset = s;            
9390               if (*args == 'E' || *args == 'K')
9391                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9392               else
9393                 {
9394                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9395                   if (regno == AT && ! mips_opts.noat)
9396                     as_warn ("Used $at without \".set noat\"");
9397                 }
9398               if (ok)
9399                 {
9400                   c = *args;
9401                   if (*s == ' ')
9402                     ++s;
9403                   if (args[1] != *s)
9404                     {
9405                       if (c == 'r' || c == 'v' || c == 'w')
9406                         {
9407                           regno = lastregno;
9408                           s = s_reset;
9409                           ++args;
9410                         }
9411                     }
9412                   /* 'z' only matches $0.  */
9413                   if (c == 'z' && regno != 0)
9414                     break;
9415
9416         /* Now that we have assembled one operand, we use the args string
9417          * to figure out where it goes in the instruction.  */
9418                   switch (c)
9419                     {
9420                     case 'r':
9421                     case 's':
9422                     case 'v':
9423                     case 'b':
9424                       INSERT_OPERAND (RS, *ip, regno);
9425                       break;
9426                     case 'd':
9427                     case 'G':
9428                     case 'K':
9429                     case 'g':
9430                       INSERT_OPERAND (RD, *ip, regno);
9431                       break;
9432                     case 'U':
9433                       INSERT_OPERAND (RD, *ip, regno);
9434                       INSERT_OPERAND (RT, *ip, regno);
9435                       break;
9436                     case 'w':
9437                     case 't':
9438                     case 'E':
9439                       INSERT_OPERAND (RT, *ip, regno);
9440                       break;
9441                     case 'x':
9442                       /* This case exists because on the r3000 trunc
9443                          expands into a macro which requires a gp
9444                          register.  On the r6000 or r4000 it is
9445                          assembled into a single instruction which
9446                          ignores the register.  Thus the insn version
9447                          is MIPS_ISA2 and uses 'x', and the macro
9448                          version is MIPS_ISA1 and uses 't'.  */
9449                       break;
9450                     case 'z':
9451                       /* This case is for the div instruction, which
9452                          acts differently if the destination argument
9453                          is $0.  This only matches $0, and is checked
9454                          outside the switch.  */
9455                       break;
9456                     case 'D':
9457                       /* Itbl operand; not yet implemented. FIXME ?? */
9458                       break;
9459                       /* What about all other operands like 'i', which
9460                          can be specified in the opcode table? */
9461                     }
9462                   lastregno = regno;
9463                   continue;
9464                 }
9465               switch (*args++)
9466                 {
9467                 case 'r':
9468                 case 'v':
9469                   INSERT_OPERAND (RS, *ip, lastregno);
9470                   continue;
9471                 case 'w':
9472                   INSERT_OPERAND (RT, *ip, lastregno);
9473                   continue;
9474                 }
9475               break;
9476
9477             case 'O':           /* MDMX alignment immediate constant.  */
9478               my_getExpression (&imm_expr, s);
9479               check_absolute_expr (ip, &imm_expr);
9480               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9481                 as_warn ("Improper align amount (%ld), using low bits",
9482                          (long) imm_expr.X_add_number);
9483               INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9484               imm_expr.X_op = O_absent;
9485               s = expr_end;
9486               continue;
9487
9488             case 'Q':           /* MDMX vector, element sel, or const.  */
9489               if (s[0] != '$')
9490                 {
9491                   /* MDMX Immediate.  */
9492                   my_getExpression (&imm_expr, s);
9493                   check_absolute_expr (ip, &imm_expr);
9494                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9495                     as_warn (_("Invalid MDMX Immediate (%ld)"),
9496                              (long) imm_expr.X_add_number);
9497                   INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9498                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9499                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9500                   else
9501                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9502                   imm_expr.X_op = O_absent;
9503                   s = expr_end;
9504                   continue;
9505                 }
9506               /* Not MDMX Immediate.  Fall through.  */
9507             case 'X':           /* MDMX destination register.  */
9508             case 'Y':           /* MDMX source register.  */
9509             case 'Z':           /* MDMX target register.  */
9510               is_mdmx = 1;
9511             case 'D':           /* floating point destination register */
9512             case 'S':           /* floating point source register */
9513             case 'T':           /* floating point target register */
9514             case 'R':           /* floating point source register */
9515             case 'V':
9516             case 'W':
9517               rtype = RTYPE_FPU;
9518               if (is_mdmx
9519                   || (mips_opts.ase_mdmx
9520                       && (ip->insn_mo->pinfo & FP_D)
9521                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9522                                                 | INSN_COPROC_MEMORY_DELAY
9523                                                 | INSN_LOAD_COPROC_DELAY
9524                                                 | INSN_LOAD_MEMORY_DELAY
9525                                                 | INSN_STORE_MEMORY))))
9526                 rtype |= RTYPE_VEC;
9527               s_reset = s;
9528               if (mips_opts.arch == CPU_OCTEON && octeon_error_on_unsupported)
9529                 {
9530                   insn_error = "opcode not implemented in Octeon";
9531                   return;
9532                 }
9533               if (reg_lookup (&s, rtype, &regno))
9534                 {
9535                   if ((regno & 1) != 0
9536                       && HAVE_32BIT_FPRS
9537                       && ! mips_oddfpreg_ok (ip->insn_mo, argnum))
9538                     as_warn (_("Float register should be even, was %d"),
9539                              regno);
9540
9541                   c = *args;
9542                   if (*s == ' ')
9543                     ++s;
9544                   if (args[1] != *s)
9545                     {
9546                       if (c == 'V' || c == 'W')
9547                         {
9548                           regno = lastregno;
9549                           s = s_reset;
9550                           ++args;
9551                         }
9552                     }
9553                   switch (c)
9554                     {
9555                     case 'D':
9556                     case 'X':
9557                       INSERT_OPERAND (FD, *ip, regno);
9558                       break;
9559                     case 'V':
9560                     case 'S':
9561                     case 'Y':
9562                       INSERT_OPERAND (FS, *ip, regno);
9563                       break;
9564                     case 'Q':
9565                       /* This is like 'Z', but also needs to fix the MDMX
9566                          vector/scalar select bits.  Note that the
9567                          scalar immediate case is handled above.  */
9568                       if (*s == '[')
9569                         {
9570                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9571                           int max_el = (is_qh ? 3 : 7);
9572                           s++;
9573                           my_getExpression(&imm_expr, s);
9574                           check_absolute_expr (ip, &imm_expr);
9575                           s = expr_end;
9576                           if (imm_expr.X_add_number > max_el)
9577                             as_bad(_("Bad element selector %ld"),
9578                                    (long) imm_expr.X_add_number);
9579                           imm_expr.X_add_number &= max_el;
9580                           ip->insn_opcode |= (imm_expr.X_add_number
9581                                               << (OP_SH_VSEL +
9582                                                   (is_qh ? 2 : 1)));
9583                           imm_expr.X_op = O_absent;
9584                           if (*s != ']')
9585                             as_warn(_("Expecting ']' found '%s'"), s);
9586                           else
9587                             s++;
9588                         }
9589                       else
9590                         {
9591                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9592                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9593                                                 << OP_SH_VSEL);
9594                           else
9595                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9596                                                 OP_SH_VSEL);
9597                         }
9598                       /* Fall through */
9599                     case 'W':
9600                     case 'T':
9601                     case 'Z':
9602                       INSERT_OPERAND (FT, *ip, regno);
9603                       break;
9604                     case 'R':
9605                       INSERT_OPERAND (FR, *ip, regno);
9606                       break;
9607                     }
9608                   lastregno = regno;
9609                   continue;
9610                 }
9611
9612               switch (*args++)
9613                 {
9614                 case 'V':
9615                   INSERT_OPERAND (FS, *ip, lastregno);
9616                   continue;
9617                 case 'W':
9618                   INSERT_OPERAND (FT, *ip, lastregno);
9619                   continue;
9620                 }
9621               break;
9622
9623             case 'I':
9624               my_getExpression (&imm_expr, s);
9625               if (imm_expr.X_op != O_big
9626                   && imm_expr.X_op != O_constant)
9627                 insn_error = _("absolute expression required");
9628               if (HAVE_32BIT_GPRS)
9629                 normalize_constant_expr (&imm_expr);
9630               s = expr_end;
9631               continue;
9632
9633             case 'A':
9634               my_getExpression (&offset_expr, s);
9635               normalize_address_expr (&offset_expr);
9636               *imm_reloc = BFD_RELOC_32;
9637               s = expr_end;
9638               continue;
9639
9640             case 'F':
9641             case 'L':
9642             case 'f':
9643             case 'l':
9644               {
9645                 int f64;
9646                 int using_gprs;
9647                 char *save_in;
9648                 char *err;
9649                 unsigned char temp[8];
9650                 int len;
9651                 unsigned int length;
9652                 segT seg;
9653                 subsegT subseg;
9654                 char *p;
9655
9656                 /* These only appear as the last operand in an
9657                    instruction, and every instruction that accepts
9658                    them in any variant accepts them in all variants.
9659                    This means we don't have to worry about backing out
9660                    any changes if the instruction does not match.
9661
9662                    The difference between them is the size of the
9663                    floating point constant and where it goes.  For 'F'
9664                    and 'L' the constant is 64 bits; for 'f' and 'l' it
9665                    is 32 bits.  Where the constant is placed is based
9666                    on how the MIPS assembler does things:
9667                     F -- .rdata
9668                     L -- .lit8
9669                     f -- immediate value
9670                     l -- .lit4
9671
9672                     The .lit4 and .lit8 sections are only used if
9673                     permitted by the -G argument.
9674
9675                     The code below needs to know whether the target register
9676                     is 32 or 64 bits wide.  It relies on the fact 'f' and
9677                     'F' are used with GPR-based instructions and 'l' and
9678                     'L' are used with FPR-based instructions.  */
9679
9680                 f64 = *args == 'F' || *args == 'L';
9681                 using_gprs = *args == 'F' || *args == 'f';
9682
9683                 save_in = input_line_pointer;
9684                 input_line_pointer = s;
9685                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9686                 length = len;
9687                 s = input_line_pointer;
9688                 input_line_pointer = save_in;
9689                 if (err != NULL && *err != '\0')
9690                   {
9691                     as_bad (_("Bad floating point constant: %s"), err);
9692                     memset (temp, '\0', sizeof temp);
9693                     length = f64 ? 8 : 4;
9694                   }
9695
9696                 assert (length == (unsigned) (f64 ? 8 : 4));
9697
9698                 if (*args == 'f'
9699                     || (*args == 'l'
9700                         && (g_switch_value < 4
9701                             || (temp[0] == 0 && temp[1] == 0)
9702                             || (temp[2] == 0 && temp[3] == 0))))
9703                   {
9704                     imm_expr.X_op = O_constant;
9705                     if (! target_big_endian)
9706                       imm_expr.X_add_number = bfd_getl32 (temp);
9707                     else
9708                       imm_expr.X_add_number = bfd_getb32 (temp);
9709                   }
9710                 else if (length > 4
9711                          && ! mips_disable_float_construction
9712                          /* Constants can only be constructed in GPRs and
9713                             copied to FPRs if the GPRs are at least as wide
9714                             as the FPRs.  Force the constant into memory if
9715                             we are using 64-bit FPRs but the GPRs are only
9716                             32 bits wide.  */
9717                          && (using_gprs
9718                              || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9719                          && ((temp[0] == 0 && temp[1] == 0)
9720                              || (temp[2] == 0 && temp[3] == 0))
9721                          && ((temp[4] == 0 && temp[5] == 0)
9722                              || (temp[6] == 0 && temp[7] == 0)))
9723                   {
9724                     /* The value is simple enough to load with a couple of
9725                        instructions.  If using 32-bit registers, set
9726                        imm_expr to the high order 32 bits and offset_expr to
9727                        the low order 32 bits.  Otherwise, set imm_expr to
9728                        the entire 64 bit constant.  */
9729                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9730                       {
9731                         imm_expr.X_op = O_constant;
9732                         offset_expr.X_op = O_constant;
9733                         if (! target_big_endian)
9734                           {
9735                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
9736                             offset_expr.X_add_number = bfd_getl32 (temp);
9737                           }
9738                         else
9739                           {
9740                             imm_expr.X_add_number = bfd_getb32 (temp);
9741                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
9742                           }
9743                         if (offset_expr.X_add_number == 0)
9744                           offset_expr.X_op = O_absent;
9745                       }
9746                     else if (sizeof (imm_expr.X_add_number) > 4)
9747                       {
9748                         imm_expr.X_op = O_constant;
9749                         if (! target_big_endian)
9750                           imm_expr.X_add_number = bfd_getl64 (temp);
9751                         else
9752                           imm_expr.X_add_number = bfd_getb64 (temp);
9753                       }
9754                     else
9755                       {
9756                         imm_expr.X_op = O_big;
9757                         imm_expr.X_add_number = 4;
9758                         if (! target_big_endian)
9759                           {
9760                             generic_bignum[0] = bfd_getl16 (temp);
9761                             generic_bignum[1] = bfd_getl16 (temp + 2);
9762                             generic_bignum[2] = bfd_getl16 (temp + 4);
9763                             generic_bignum[3] = bfd_getl16 (temp + 6);
9764                           }
9765                         else
9766                           {
9767                             generic_bignum[0] = bfd_getb16 (temp + 6);
9768                             generic_bignum[1] = bfd_getb16 (temp + 4);
9769                             generic_bignum[2] = bfd_getb16 (temp + 2);
9770                             generic_bignum[3] = bfd_getb16 (temp);
9771                           }
9772                       }
9773                   }
9774                 else
9775                   {
9776                     const char *newname;
9777                     segT new_seg;
9778
9779                     /* Switch to the right section.  */
9780                     seg = now_seg;
9781                     subseg = now_subseg;
9782                     switch (*args)
9783                       {
9784                       default: /* unused default case avoids warnings.  */
9785                       case 'L':
9786                         newname = RDATA_SECTION_NAME;
9787                         if (g_switch_value >= 8)
9788                           newname = ".lit8";
9789                         break;
9790                       case 'F':
9791                         newname = RDATA_SECTION_NAME;
9792                         break;
9793                       case 'l':
9794                         assert (g_switch_value >= 4);
9795                         newname = ".lit4";
9796                         break;
9797                       }
9798                     new_seg = subseg_new (newname, (subsegT) 0);
9799                     if (IS_ELF)
9800                       bfd_set_section_flags (stdoutput, new_seg,
9801                                              (SEC_ALLOC
9802                                               | SEC_LOAD
9803                                               | SEC_READONLY
9804                                               | SEC_DATA));
9805                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
9806                     if (IS_ELF && strcmp (TARGET_OS, "elf") != 0)
9807                       record_alignment (new_seg, 4);
9808                     else
9809                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
9810                     if (seg == now_seg)
9811                       as_bad (_("Can't use floating point insn in this section"));
9812
9813                     /* Set the argument to the current address in the
9814                        section.  */
9815                     offset_expr.X_op = O_symbol;
9816                     offset_expr.X_add_symbol =
9817                       symbol_new ("L0\001", now_seg,
9818                                   (valueT) frag_now_fix (), frag_now);
9819                     offset_expr.X_add_number = 0;
9820
9821                     /* Put the floating point number into the section.  */
9822                     p = frag_more ((int) length);
9823                     memcpy (p, temp, length);
9824
9825                     /* Switch back to the original section.  */
9826                     subseg_set (seg, subseg);
9827                   }
9828               }
9829               continue;
9830
9831             case 'i':           /* 16 bit unsigned immediate */
9832             case 'j':           /* 16 bit signed immediate */
9833               *imm_reloc = BFD_RELOC_LO16;
9834               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9835                 {
9836                   int more;
9837                   offsetT minval, maxval;
9838
9839                   more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9840                           && strcmp (insn->name, insn[1].name) == 0);
9841
9842                   /* If the expression was written as an unsigned number,
9843                      only treat it as signed if there are no more
9844                      alternatives.  */
9845                   if (more
9846                       && *args == 'j'
9847                       && sizeof (imm_expr.X_add_number) <= 4
9848                       && imm_expr.X_op == O_constant
9849                       && imm_expr.X_add_number < 0
9850                       && imm_expr.X_unsigned
9851                       && HAVE_64BIT_GPRS)
9852                     break;
9853
9854                   /* For compatibility with older assemblers, we accept
9855                      0x8000-0xffff as signed 16-bit numbers when only
9856                      signed numbers are allowed.  */
9857                   if (*args == 'i')
9858                     minval = 0, maxval = 0xffff;
9859                   else if (more)
9860                     minval = -0x8000, maxval = 0x7fff;
9861                   else
9862                     minval = -0x8000, maxval = 0xffff;
9863
9864                   if (imm_expr.X_op != O_constant
9865                       || imm_expr.X_add_number < minval
9866                       || imm_expr.X_add_number > maxval)
9867                     {
9868                       if (more)
9869                         break;
9870                       if (imm_expr.X_op == O_constant
9871                           || imm_expr.X_op == O_big)
9872                         as_bad (_("expression out of range"));
9873                     }
9874                 }
9875               s = expr_end;
9876               continue;
9877
9878             case 'o':           /* 16 bit offset */
9879               /* Check whether there is only a single bracketed expression
9880                  left.  If so, it must be the base register and the
9881                  constant must be zero.  */
9882               if (*s == '(' && strchr (s + 1, '(') == 0)
9883                 {
9884                   offset_expr.X_op = O_constant;
9885                   offset_expr.X_add_number = 0;
9886                   continue;
9887                 }
9888
9889               /* If this value won't fit into a 16 bit offset, then go
9890                  find a macro that will generate the 32 bit offset
9891                  code pattern.  */
9892               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9893                   && (offset_expr.X_op != O_constant
9894                       || offset_expr.X_add_number >= 0x8000
9895                       || offset_expr.X_add_number < -0x8000))
9896                 break;
9897
9898               s = expr_end;
9899               continue;
9900
9901             case 'p':           /* pc relative offset */
9902               *offset_reloc = BFD_RELOC_16_PCREL_S2;
9903               my_getExpression (&offset_expr, s);
9904               s = expr_end;
9905               continue;
9906
9907             case 'u':           /* upper 16 bits */
9908               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9909                   && imm_expr.X_op == O_constant
9910                   && (imm_expr.X_add_number < 0
9911                       || imm_expr.X_add_number >= 0x10000))
9912                 as_bad (_("lui expression not in range 0..65535"));
9913               s = expr_end;
9914               continue;
9915
9916             case 'a':           /* 26 bit address */
9917               my_getExpression (&offset_expr, s);
9918               s = expr_end;
9919               *offset_reloc = BFD_RELOC_MIPS_JMP;
9920               continue;
9921
9922             case 'N':           /* 3 bit branch condition code */
9923             case 'M':           /* 3 bit compare condition code */
9924               rtype = RTYPE_CCC;
9925               if (ip->insn_mo->pinfo & (FP_D| FP_S))
9926                 rtype |= RTYPE_FCC;
9927               if (!reg_lookup (&s, rtype, &regno))
9928                 break;
9929               if ((strcmp(str + strlen(str) - 3, ".ps") == 0
9930                    || strcmp(str + strlen(str) - 5, "any2f") == 0
9931                    || strcmp(str + strlen(str) - 5, "any2t") == 0)
9932                   && (regno & 1) != 0)
9933                 as_warn(_("Condition code register should be even for %s, was %d"),
9934                         str, regno);
9935               if ((strcmp(str + strlen(str) - 5, "any4f") == 0
9936                    || strcmp(str + strlen(str) - 5, "any4t") == 0)
9937                   && (regno & 3) != 0)
9938                 as_warn(_("Condition code register should be 0 or 4 for %s, was %d"),
9939                         str, regno);
9940               if (*args == 'N')
9941                 INSERT_OPERAND (BCC, *ip, regno);
9942               else
9943                 INSERT_OPERAND (CCC, *ip, regno);
9944               continue;
9945
9946             case 'H':
9947               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9948                 s += 2;
9949               if (ISDIGIT (*s))
9950                 {
9951                   c = 0;
9952                   do
9953                     {
9954                       c *= 10;
9955                       c += *s - '0';
9956                       ++s;
9957                     }
9958                   while (ISDIGIT (*s));
9959                 }
9960               else
9961                 c = 8; /* Invalid sel value.  */
9962
9963               if (c > 7)
9964                 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9965               ip->insn_opcode |= c;
9966               continue;
9967
9968             case 'e':
9969               /* Must be at least one digit.  */
9970               my_getExpression (&imm_expr, s);
9971               check_absolute_expr (ip, &imm_expr);
9972
9973               if ((unsigned long) imm_expr.X_add_number
9974                   > (unsigned long) OP_MASK_VECBYTE)
9975                 {
9976                   as_bad (_("bad byte vector index (%ld)"),
9977                            (long) imm_expr.X_add_number);
9978                   imm_expr.X_add_number = 0;
9979                 }
9980
9981               INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
9982               imm_expr.X_op = O_absent;
9983               s = expr_end;
9984               continue;
9985
9986             case '%':
9987               my_getExpression (&imm_expr, s);
9988               check_absolute_expr (ip, &imm_expr);
9989
9990               if ((unsigned long) imm_expr.X_add_number
9991                   > (unsigned long) OP_MASK_VECALIGN)
9992                 {
9993                   as_bad (_("bad byte vector index (%ld)"),
9994                            (long) imm_expr.X_add_number);
9995                   imm_expr.X_add_number = 0;
9996                 }
9997
9998               INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
9999               imm_expr.X_op = O_absent;
10000               s = expr_end;
10001               continue;
10002
10003             default:
10004               as_bad (_("bad char = '%c'\n"), *args);
10005               internalError ();
10006             }
10007           break;
10008         }
10009       /* Args don't match.  */
10010       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
10011           !strcmp (insn->name, insn[1].name))
10012         {
10013           ++insn;
10014           s = argsStart;
10015           insn_error = _("illegal operands");
10016           continue;
10017         }
10018       if (save_c)
10019         *(--s) = save_c;
10020       insn_error = _("illegal operands");
10021       return;
10022     }
10023 }
10024
10025 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10026
10027 /* This routine assembles an instruction into its binary format when
10028    assembling for the mips16.  As a side effect, it sets one of the
10029    global variables imm_reloc or offset_reloc to the type of
10030    relocation to do if one of the operands is an address expression.
10031    It also sets mips16_small and mips16_ext if the user explicitly
10032    requested a small or extended instruction.  */
10033
10034 static void
10035 mips16_ip (char *str, struct mips_cl_insn *ip)
10036 {
10037   char *s;
10038   const char *args;
10039   struct mips_opcode *insn;
10040   char *argsstart;
10041   unsigned int regno;
10042   unsigned int lastregno = 0;
10043   char *s_reset;
10044   size_t i;
10045
10046   insn_error = NULL;
10047
10048   mips16_small = FALSE;
10049   mips16_ext = FALSE;
10050
10051   for (s = str; ISLOWER (*s); ++s)
10052     ;
10053   switch (*s)
10054     {
10055     case '\0':
10056       break;
10057
10058     case ' ':
10059       *s++ = '\0';
10060       break;
10061
10062     case '.':
10063       if (s[1] == 't' && s[2] == ' ')
10064         {
10065           *s = '\0';
10066           mips16_small = TRUE;
10067           s += 3;
10068           break;
10069         }
10070       else if (s[1] == 'e' && s[2] == ' ')
10071         {
10072           *s = '\0';
10073           mips16_ext = TRUE;
10074           s += 3;
10075           break;
10076         }
10077       /* Fall through.  */
10078     default:
10079       insn_error = _("unknown opcode");
10080       return;
10081     }
10082
10083   if (mips_opts.noautoextend && ! mips16_ext)
10084     mips16_small = TRUE;
10085
10086   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10087     {
10088       insn_error = _("unrecognized opcode");
10089       return;
10090     }
10091
10092   argsstart = s;
10093   for (;;)
10094     {
10095       bfd_boolean ok;
10096
10097       assert (strcmp (insn->name, str) == 0);
10098
10099       if (OPCODE_IS_MEMBER (insn, mips_opts.isa, mips_opts.arch))
10100         ok = TRUE;
10101       else
10102         ok = FALSE;
10103
10104       if (! ok)
10105         {
10106           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10107               && strcmp (insn->name, insn[1].name) == 0)
10108             {
10109               ++insn;
10110               continue;
10111             }
10112           else
10113             {
10114               if (!insn_error)
10115                 {
10116                   static char buf[100];
10117                   sprintf (buf,
10118                            _("opcode not supported on this processor: %s (%s)"),
10119                            mips_cpu_info_from_arch (mips_opts.arch)->name,
10120                            mips_cpu_info_from_isa (mips_opts.isa)->name);
10121                   insn_error = buf;
10122                 }
10123               return;
10124             }
10125         }
10126
10127       create_insn (ip, insn);
10128       imm_expr.X_op = O_absent;
10129       imm_reloc[0] = BFD_RELOC_UNUSED;
10130       imm_reloc[1] = BFD_RELOC_UNUSED;
10131       imm_reloc[2] = BFD_RELOC_UNUSED;
10132       imm2_expr.X_op = O_absent;
10133       offset_expr.X_op = O_absent;
10134       offset_reloc[0] = BFD_RELOC_UNUSED;
10135       offset_reloc[1] = BFD_RELOC_UNUSED;
10136       offset_reloc[2] = BFD_RELOC_UNUSED;
10137       for (args = insn->args; 1; ++args)
10138         {
10139           int c;
10140
10141           if (*s == ' ')
10142             ++s;
10143
10144           /* In this switch statement we call break if we did not find
10145              a match, continue if we did find a match, or return if we
10146              are done.  */
10147
10148           c = *args;
10149           switch (c)
10150             {
10151             case '\0':
10152               if (*s == '\0')
10153                 {
10154                   /* Stuff the immediate value in now, if we can.  */
10155                   if (imm_expr.X_op == O_constant
10156                       && *imm_reloc > BFD_RELOC_UNUSED
10157                       && insn->pinfo != INSN_MACRO)
10158                     {
10159                       valueT tmp;
10160
10161                       switch (*offset_reloc)
10162                         {
10163                           case BFD_RELOC_MIPS16_HI16_S:
10164                             tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10165                             break;
10166
10167                           case BFD_RELOC_MIPS16_HI16:
10168                             tmp = imm_expr.X_add_number >> 16;
10169                             break;
10170
10171                           case BFD_RELOC_MIPS16_LO16:
10172                             tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10173                                   - 0x8000;
10174                             break;
10175
10176                           case BFD_RELOC_UNUSED:
10177                             tmp = imm_expr.X_add_number;
10178                             break;
10179
10180                           default:
10181                             internalError ();
10182                         }
10183                       *offset_reloc = BFD_RELOC_UNUSED;
10184
10185                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
10186                                     tmp, TRUE, mips16_small,
10187                                     mips16_ext, &ip->insn_opcode,
10188                                     &ip->use_extend, &ip->extend);
10189                       imm_expr.X_op = O_absent;
10190                       *imm_reloc = BFD_RELOC_UNUSED;
10191                     }
10192
10193                   return;
10194                 }
10195               break;
10196
10197             case ',':
10198               if (*s++ == c)
10199                 continue;
10200               s--;
10201               switch (*++args)
10202                 {
10203                 case 'v':
10204                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10205                   continue;
10206                 case 'w':
10207                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10208                   continue;
10209                 }
10210               break;
10211
10212             case '(':
10213             case ')':
10214               if (*s++ == c)
10215                 continue;
10216               break;
10217
10218             case 'v':
10219             case 'w':
10220               if (s[0] != '$')
10221                 {
10222                   if (c == 'v')
10223                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10224                   else
10225                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10226                   ++args;
10227                   continue;
10228                 }
10229               /* Fall through.  */
10230             case 'x':
10231             case 'y':
10232             case 'z':
10233             case 'Z':
10234             case '0':
10235             case 'S':
10236             case 'R':
10237             case 'X':
10238             case 'Y':
10239               s_reset = s;
10240               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
10241                 {
10242                   if (c == 'v' || c == 'w')
10243                     {
10244                       if (c == 'v')
10245                         MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10246                       else
10247                         MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10248                       ++args;
10249                       continue;
10250                     }
10251                   break;
10252                 }
10253
10254               if (*s == ' ')
10255                 ++s;
10256               if (args[1] != *s)
10257                 {
10258                   if (c == 'v' || c == 'w')
10259                     {
10260                       regno = mips16_to_32_reg_map[lastregno];
10261                       s = s_reset;
10262                       ++args;
10263                     }
10264                 }
10265
10266               switch (c)
10267                 {
10268                 case 'x':
10269                 case 'y':
10270                 case 'z':
10271                 case 'v':
10272                 case 'w':
10273                 case 'Z':
10274                   regno = mips32_to_16_reg_map[regno];
10275                   break;
10276
10277                 case '0':
10278                   if (regno != 0)
10279                     regno = ILLEGAL_REG;
10280                   break;
10281
10282                 case 'S':
10283                   if (regno != SP)
10284                     regno = ILLEGAL_REG;
10285                   break;
10286
10287                 case 'R':
10288                   if (regno != RA)
10289                     regno = ILLEGAL_REG;
10290                   break;
10291
10292                 case 'X':
10293                 case 'Y':
10294                   if (regno == AT && ! mips_opts.noat)
10295                     as_warn (_("used $at without \".set noat\""));
10296                   break;
10297
10298                 default:
10299                   internalError ();
10300                 }
10301
10302               if (regno == ILLEGAL_REG)
10303                 break;
10304
10305               switch (c)
10306                 {
10307                 case 'x':
10308                 case 'v':
10309                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
10310                   break;
10311                 case 'y':
10312                 case 'w':
10313                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
10314                   break;
10315                 case 'z':
10316                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10317                   break;
10318                 case 'Z':
10319                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10320                 case '0':
10321                 case 'S':
10322                 case 'R':
10323                   break;
10324                 case 'X':
10325                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10326                   break;
10327                 case 'Y':
10328                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10329                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10330                   break;
10331                 default:
10332                   internalError ();
10333                 }
10334
10335               lastregno = regno;
10336               continue;
10337
10338             case 'P':
10339               if (strncmp (s, "$pc", 3) == 0)
10340                 {
10341                   s += 3;
10342                   continue;
10343                 }
10344               break;
10345
10346             case '5':
10347             case 'H':
10348             case 'W':
10349             case 'D':
10350             case 'j':
10351             case 'V':
10352             case 'C':
10353             case 'U':
10354             case 'k':
10355             case 'K':
10356               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10357               if (i > 0)
10358                 {
10359                   if (imm_expr.X_op != O_constant)
10360                     {
10361                       mips16_ext = TRUE;
10362                       ip->use_extend = TRUE;
10363                       ip->extend = 0;
10364                     }
10365                   else
10366                     {
10367                       /* We need to relax this instruction.  */
10368                       *offset_reloc = *imm_reloc;
10369                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10370                     }
10371                   s = expr_end;
10372                   continue;
10373                 }
10374               *imm_reloc = BFD_RELOC_UNUSED;
10375               /* Fall through.  */
10376             case '<':
10377             case '>':
10378             case '[':
10379             case ']':
10380             case '4':
10381             case '8':
10382               my_getExpression (&imm_expr, s);
10383               if (imm_expr.X_op == O_register)
10384                 {
10385                   /* What we thought was an expression turned out to
10386                      be a register.  */
10387
10388                   if (s[0] == '(' && args[1] == '(')
10389                     {
10390                       /* It looks like the expression was omitted
10391                          before a register indirection, which means
10392                          that the expression is implicitly zero.  We
10393                          still set up imm_expr, so that we handle
10394                          explicit extensions correctly.  */
10395                       imm_expr.X_op = O_constant;
10396                       imm_expr.X_add_number = 0;
10397                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10398                       continue;
10399                     }
10400
10401                   break;
10402                 }
10403
10404               /* We need to relax this instruction.  */
10405               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10406               s = expr_end;
10407               continue;
10408
10409             case 'p':
10410             case 'q':
10411             case 'A':
10412             case 'B':
10413             case 'E':
10414               /* We use offset_reloc rather than imm_reloc for the PC
10415                  relative operands.  This lets macros with both
10416                  immediate and address operands work correctly.  */
10417               my_getExpression (&offset_expr, s);
10418
10419               if (offset_expr.X_op == O_register)
10420                 break;
10421
10422               /* We need to relax this instruction.  */
10423               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10424               s = expr_end;
10425               continue;
10426
10427             case '6':           /* break code */
10428               my_getExpression (&imm_expr, s);
10429               check_absolute_expr (ip, &imm_expr);
10430               if ((unsigned long) imm_expr.X_add_number > 63)
10431                 as_warn (_("Invalid value for `%s' (%lu)"),
10432                          ip->insn_mo->name,
10433                          (unsigned long) imm_expr.X_add_number);
10434               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10435               imm_expr.X_op = O_absent;
10436               s = expr_end;
10437               continue;
10438
10439             case 'a':           /* 26 bit address */
10440               my_getExpression (&offset_expr, s);
10441               s = expr_end;
10442               *offset_reloc = BFD_RELOC_MIPS16_JMP;
10443               ip->insn_opcode <<= 16;
10444               continue;
10445
10446             case 'l':           /* register list for entry macro */
10447             case 'L':           /* register list for exit macro */
10448               {
10449                 int mask;
10450
10451                 if (c == 'l')
10452                   mask = 0;
10453                 else
10454                   mask = 7 << 3;
10455                 while (*s != '\0')
10456                   {
10457                     unsigned int freg, reg1, reg2;
10458
10459                     while (*s == ' ' || *s == ',')
10460                       ++s;
10461                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10462                       freg = 0;
10463                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10464                       freg = 1;
10465                     else
10466                       {
10467                         as_bad (_("can't parse register list"));
10468                         break;
10469                       }
10470                     if (*s == ' ')
10471                       ++s;
10472                     if (*s != '-')
10473                       reg2 = reg1;
10474                     else
10475                       {
10476                         ++s;
10477                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
10478                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
10479                           {
10480                             as_bad (_("invalid register list"));
10481                             break;
10482                           }
10483                       }
10484                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10485                       {
10486                         mask &= ~ (7 << 3);
10487                         mask |= 5 << 3;
10488                       }
10489                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10490                       {
10491                         mask &= ~ (7 << 3);
10492                         mask |= 6 << 3;
10493                       }
10494                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10495                       mask |= (reg2 - 3) << 3;
10496                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10497                       mask |= (reg2 - 15) << 1;
10498                     else if (reg1 == RA && reg2 == RA)
10499                       mask |= 1;
10500                     else
10501                       {
10502                         as_bad (_("invalid register list"));
10503                         break;
10504                       }
10505                   }
10506                 /* The mask is filled in in the opcode table for the
10507                    benefit of the disassembler.  We remove it before
10508                    applying the actual mask.  */
10509                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10510                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10511               }
10512             continue;
10513
10514             case 'm':           /* Register list for save insn.  */
10515             case 'M':           /* Register list for restore insn.  */
10516               {
10517                 int opcode = 0;
10518                 int framesz = 0, seen_framesz = 0;
10519                 int args = 0, statics = 0, sregs = 0;
10520
10521                 while (*s != '\0')
10522                   {
10523                     unsigned int reg1, reg2;
10524
10525                     SKIP_SPACE_TABS (s);
10526                     while (*s == ',')
10527                       ++s;
10528                     SKIP_SPACE_TABS (s);
10529
10530                     my_getExpression (&imm_expr, s);
10531                     if (imm_expr.X_op == O_constant)
10532                       {
10533                         /* Handle the frame size.  */
10534                         if (seen_framesz)
10535                           {
10536                             as_bad (_("more than one frame size in list"));
10537                             break;
10538                           }
10539                         seen_framesz = 1;
10540                         framesz = imm_expr.X_add_number;
10541                         imm_expr.X_op = O_absent;
10542                         s = expr_end;
10543                         continue;
10544                       }
10545
10546                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10547                       {
10548                         as_bad (_("can't parse register list"));
10549                         break;
10550                       }
10551
10552                     while (*s == ' ')
10553                       ++s;
10554
10555                     if (*s != '-')
10556                       reg2 = reg1;
10557                     else
10558                       {
10559                         ++s;
10560                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10561                             || reg2 < reg1)
10562                           {
10563                             as_bad (_("can't parse register list"));
10564                             break;
10565                           }
10566                       }
10567
10568                     while (reg1 <= reg2)
10569                       {
10570                         if (reg1 >= 4 && reg1 <= 7)
10571                           {
10572                             if (!seen_framesz)
10573                                 /* args $a0-$a3 */
10574                                 args |= 1 << (reg1 - 4);
10575                             else
10576                                 /* statics $a0-$a3 */
10577                                 statics |= 1 << (reg1 - 4);
10578                           }
10579                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10580                           {
10581                             /* $s0-$s8 */
10582                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10583                           }
10584                         else if (reg1 == 31)
10585                           {
10586                             /* Add $ra to insn.  */
10587                             opcode |= 0x40;
10588                           }
10589                         else
10590                           {
10591                             as_bad (_("unexpected register in list"));
10592                             break;
10593                           }
10594                         if (++reg1 == 24)
10595                           reg1 = 30;
10596                       }
10597                   }
10598
10599                 /* Encode args/statics combination.  */
10600                 if (args & statics)
10601                   as_bad (_("arg/static registers overlap"));
10602                 else if (args == 0xf)
10603                   /* All $a0-$a3 are args.  */
10604                   opcode |= MIPS16_ALL_ARGS << 16;
10605                 else if (statics == 0xf)
10606                   /* All $a0-$a3 are statics.  */
10607                   opcode |= MIPS16_ALL_STATICS << 16;
10608                 else 
10609                   {
10610                     int narg = 0, nstat = 0;
10611
10612                     /* Count arg registers.  */
10613                     while (args & 0x1)
10614                       {
10615                         args >>= 1;
10616                         narg++;
10617                       }
10618                     if (args != 0)
10619                       as_bad (_("invalid arg register list"));
10620
10621                     /* Count static registers.  */
10622                     while (statics & 0x8)
10623                       {
10624                         statics = (statics << 1) & 0xf;
10625                         nstat++;
10626                       }
10627                     if (statics != 0) 
10628                       as_bad (_("invalid static register list"));
10629
10630                     /* Encode args/statics.  */
10631                     opcode |= ((narg << 2) | nstat) << 16;
10632                   }
10633
10634                 /* Encode $s0/$s1.  */
10635                 if (sregs & (1 << 0))           /* $s0 */
10636                   opcode |= 0x20;
10637                 if (sregs & (1 << 1))           /* $s1 */
10638                   opcode |= 0x10;
10639                 sregs >>= 2;
10640
10641                 if (sregs != 0)
10642                   {
10643                     /* Count regs $s2-$s8.  */
10644                     int nsreg = 0;
10645                     while (sregs & 1)
10646                       {
10647                         sregs >>= 1;
10648                         nsreg++;
10649                       }
10650                     if (sregs != 0)
10651                       as_bad (_("invalid static register list"));
10652                     /* Encode $s2-$s8. */
10653                     opcode |= nsreg << 24;
10654                   }
10655
10656                 /* Encode frame size.  */
10657                 if (!seen_framesz)
10658                   as_bad (_("missing frame size"));
10659                 else if ((framesz & 7) != 0 || framesz < 0
10660                          || framesz > 0xff * 8)
10661                   as_bad (_("invalid frame size"));
10662                 else if (framesz != 128 || (opcode >> 16) != 0)
10663                   {
10664                     framesz /= 8;
10665                     opcode |= (((framesz & 0xf0) << 16)
10666                              | (framesz & 0x0f));
10667                   }
10668
10669                 /* Finally build the instruction.  */
10670                 if ((opcode >> 16) != 0 || framesz == 0)
10671                   {
10672                     ip->use_extend = TRUE;
10673                     ip->extend = opcode >> 16;
10674                   }
10675                 ip->insn_opcode |= opcode & 0x7f;
10676               }
10677             continue;
10678
10679             case 'e':           /* extend code */
10680               my_getExpression (&imm_expr, s);
10681               check_absolute_expr (ip, &imm_expr);
10682               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10683                 {
10684                   as_warn (_("Invalid value for `%s' (%lu)"),
10685                            ip->insn_mo->name,
10686                            (unsigned long) imm_expr.X_add_number);
10687                   imm_expr.X_add_number &= 0x7ff;
10688                 }
10689               ip->insn_opcode |= imm_expr.X_add_number;
10690               imm_expr.X_op = O_absent;
10691               s = expr_end;
10692               continue;
10693
10694             default:
10695               internalError ();
10696             }
10697           break;
10698         }
10699
10700       /* Args don't match.  */
10701       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10702           strcmp (insn->name, insn[1].name) == 0)
10703         {
10704           ++insn;
10705           s = argsstart;
10706           continue;
10707         }
10708
10709       insn_error = _("illegal operands");
10710
10711       return;
10712     }
10713 }
10714
10715 /* This structure holds information we know about a mips16 immediate
10716    argument type.  */
10717
10718 struct mips16_immed_operand
10719 {
10720   /* The type code used in the argument string in the opcode table.  */
10721   int type;
10722   /* The number of bits in the short form of the opcode.  */
10723   int nbits;
10724   /* The number of bits in the extended form of the opcode.  */
10725   int extbits;
10726   /* The amount by which the short form is shifted when it is used;
10727      for example, the sw instruction has a shift count of 2.  */
10728   int shift;
10729   /* The amount by which the short form is shifted when it is stored
10730      into the instruction code.  */
10731   int op_shift;
10732   /* Non-zero if the short form is unsigned.  */
10733   int unsp;
10734   /* Non-zero if the extended form is unsigned.  */
10735   int extu;
10736   /* Non-zero if the value is PC relative.  */
10737   int pcrel;
10738 };
10739
10740 /* The mips16 immediate operand types.  */
10741
10742 static const struct mips16_immed_operand mips16_immed_operands[] =
10743 {
10744   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10745   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10746   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10747   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10748   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10749   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10750   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10751   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10752   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10753   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10754   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10755   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10756   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10757   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10758   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10759   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10760   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10761   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10762   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10763   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10764   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10765 };
10766
10767 #define MIPS16_NUM_IMMED \
10768   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10769
10770 /* Handle a mips16 instruction with an immediate value.  This or's the
10771    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
10772    whether an extended value is needed; if one is needed, it sets
10773    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
10774    If SMALL is true, an unextended opcode was explicitly requested.
10775    If EXT is true, an extended opcode was explicitly requested.  If
10776    WARN is true, warn if EXT does not match reality.  */
10777
10778 static void
10779 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10780               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10781               unsigned long *insn, bfd_boolean *use_extend,
10782               unsigned short *extend)
10783 {
10784   const struct mips16_immed_operand *op;
10785   int mintiny, maxtiny;
10786   bfd_boolean needext;
10787
10788   op = mips16_immed_operands;
10789   while (op->type != type)
10790     {
10791       ++op;
10792       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10793     }
10794
10795   if (op->unsp)
10796     {
10797       if (type == '<' || type == '>' || type == '[' || type == ']')
10798         {
10799           mintiny = 1;
10800           maxtiny = 1 << op->nbits;
10801         }
10802       else
10803         {
10804           mintiny = 0;
10805           maxtiny = (1 << op->nbits) - 1;
10806         }
10807     }
10808   else
10809     {
10810       mintiny = - (1 << (op->nbits - 1));
10811       maxtiny = (1 << (op->nbits - 1)) - 1;
10812     }
10813
10814   /* Branch offsets have an implicit 0 in the lowest bit.  */
10815   if (type == 'p' || type == 'q')
10816     val /= 2;
10817
10818   if ((val & ((1 << op->shift) - 1)) != 0
10819       || val < (mintiny << op->shift)
10820       || val > (maxtiny << op->shift))
10821     needext = TRUE;
10822   else
10823     needext = FALSE;
10824
10825   if (warn && ext && ! needext)
10826     as_warn_where (file, line,
10827                    _("extended operand requested but not required"));
10828   if (small && needext)
10829     as_bad_where (file, line, _("invalid unextended operand value"));
10830
10831   if (small || (! ext && ! needext))
10832     {
10833       int insnval;
10834
10835       *use_extend = FALSE;
10836       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10837       insnval <<= op->op_shift;
10838       *insn |= insnval;
10839     }
10840   else
10841     {
10842       long minext, maxext;
10843       int extval;
10844
10845       if (op->extu)
10846         {
10847           minext = 0;
10848           maxext = (1 << op->extbits) - 1;
10849         }
10850       else
10851         {
10852           minext = - (1 << (op->extbits - 1));
10853           maxext = (1 << (op->extbits - 1)) - 1;
10854         }
10855       if (val < minext || val > maxext)
10856         as_bad_where (file, line,
10857                       _("operand value out of range for instruction"));
10858
10859       *use_extend = TRUE;
10860       if (op->extbits == 16)
10861         {
10862           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10863           val &= 0x1f;
10864         }
10865       else if (op->extbits == 15)
10866         {
10867           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10868           val &= 0xf;
10869         }
10870       else
10871         {
10872           extval = ((val & 0x1f) << 6) | (val & 0x20);
10873           val = 0;
10874         }
10875
10876       *extend = (unsigned short) extval;
10877       *insn |= val;
10878     }
10879 }
10880 \f
10881 struct percent_op_match
10882 {
10883   const char *str;
10884   bfd_reloc_code_real_type reloc;
10885 };
10886
10887 static const struct percent_op_match mips_percent_op[] =
10888 {
10889   {"%lo", BFD_RELOC_LO16},
10890 #ifdef OBJ_ELF
10891   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10892   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10893   {"%call16", BFD_RELOC_MIPS_CALL16},
10894   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10895   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10896   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10897   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10898   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10899   {"%got", BFD_RELOC_MIPS_GOT16},
10900   {"%gp_rel", BFD_RELOC_GPREL16},
10901   {"%half", BFD_RELOC_16},
10902   {"%highest", BFD_RELOC_MIPS_HIGHEST},
10903   {"%higher", BFD_RELOC_MIPS_HIGHER},
10904   {"%neg", BFD_RELOC_MIPS_SUB},
10905   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
10906   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
10907   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
10908   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
10909   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
10910   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
10911   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
10912 #endif
10913   {"%hi", BFD_RELOC_HI16_S}
10914 };
10915
10916 static const struct percent_op_match mips16_percent_op[] =
10917 {
10918   {"%lo", BFD_RELOC_MIPS16_LO16},
10919   {"%gprel", BFD_RELOC_MIPS16_GPREL},
10920   {"%hi", BFD_RELOC_MIPS16_HI16_S}
10921 };
10922
10923
10924 /* Return true if *STR points to a relocation operator.  When returning true,
10925    move *STR over the operator and store its relocation code in *RELOC.
10926    Leave both *STR and *RELOC alone when returning false.  */
10927
10928 static bfd_boolean
10929 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
10930 {
10931   const struct percent_op_match *percent_op;
10932   size_t limit, i;
10933
10934   if (mips_opts.mips16)
10935     {
10936       percent_op = mips16_percent_op;
10937       limit = ARRAY_SIZE (mips16_percent_op);
10938     }
10939   else
10940     {
10941       percent_op = mips_percent_op;
10942       limit = ARRAY_SIZE (mips_percent_op);
10943     }
10944
10945   for (i = 0; i < limit; i++)
10946     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
10947       {
10948         int len = strlen (percent_op[i].str);
10949
10950         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
10951           continue;
10952
10953         *str += strlen (percent_op[i].str);
10954         *reloc = percent_op[i].reloc;
10955
10956         /* Check whether the output BFD supports this relocation.
10957            If not, issue an error and fall back on something safe.  */
10958         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
10959           {
10960             as_bad ("relocation %s isn't supported by the current ABI",
10961                     percent_op[i].str);
10962             *reloc = BFD_RELOC_UNUSED;
10963           }
10964         return TRUE;
10965       }
10966   return FALSE;
10967 }
10968
10969
10970 /* Parse string STR as a 16-bit relocatable operand.  Store the
10971    expression in *EP and the relocations in the array starting
10972    at RELOC.  Return the number of relocation operators used.
10973
10974    On exit, EXPR_END points to the first character after the expression.  */
10975
10976 static size_t
10977 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
10978                        char *str)
10979 {
10980   bfd_reloc_code_real_type reversed_reloc[3];
10981   size_t reloc_index, i;
10982   int crux_depth, str_depth;
10983   char *crux;
10984
10985   /* Search for the start of the main expression, recoding relocations
10986      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
10987      of the main expression and with CRUX_DEPTH containing the number
10988      of open brackets at that point.  */
10989   reloc_index = -1;
10990   str_depth = 0;
10991   do
10992     {
10993       reloc_index++;
10994       crux = str;
10995       crux_depth = str_depth;
10996
10997       /* Skip over whitespace and brackets, keeping count of the number
10998          of brackets.  */
10999       while (*str == ' ' || *str == '\t' || *str == '(')
11000         if (*str++ == '(')
11001           str_depth++;
11002     }
11003   while (*str == '%'
11004          && reloc_index < (HAVE_NEWABI ? 3 : 1)
11005          && parse_relocation (&str, &reversed_reloc[reloc_index]));
11006
11007   my_getExpression (ep, crux);
11008   str = expr_end;
11009
11010   /* Match every open bracket.  */
11011   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
11012     if (*str++ == ')')
11013       crux_depth--;
11014
11015   if (crux_depth > 0)
11016     as_bad ("unclosed '('");
11017
11018   expr_end = str;
11019
11020   if (reloc_index != 0)
11021     {
11022       prev_reloc_op_frag = frag_now;
11023       for (i = 0; i < reloc_index; i++)
11024         reloc[i] = reversed_reloc[reloc_index - 1 - i];
11025     }
11026
11027   return reloc_index;
11028 }
11029
11030 static void
11031 my_getExpression (expressionS *ep, char *str)
11032 {
11033   char *save_in;
11034   valueT val;
11035
11036   save_in = input_line_pointer;
11037   input_line_pointer = str;
11038   expression (ep);
11039   expr_end = input_line_pointer;
11040   input_line_pointer = save_in;
11041
11042   /* If we are in mips16 mode, and this is an expression based on `.',
11043      then we bump the value of the symbol by 1 since that is how other
11044      text symbols are handled.  We don't bother to handle complex
11045      expressions, just `.' plus or minus a constant.  */
11046   if (mips_opts.mips16
11047       && ep->X_op == O_symbol
11048       && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
11049       && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
11050       && symbol_get_frag (ep->X_add_symbol) == frag_now
11051       && symbol_constant_p (ep->X_add_symbol)
11052       && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
11053     S_SET_VALUE (ep->X_add_symbol, val + 1);
11054 }
11055
11056 /* Turn a string in input_line_pointer into a floating point constant
11057    of type TYPE, and store the appropriate bytes in *LITP.  The number
11058    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
11059    returned, or NULL on OK.  */
11060
11061 char *
11062 md_atof (int type, char *litP, int *sizeP)
11063 {
11064   int prec;
11065   LITTLENUM_TYPE words[4];
11066   char *t;
11067   int i;
11068
11069   switch (type)
11070     {
11071     case 'f':
11072       prec = 2;
11073       break;
11074
11075     case 'd':
11076       prec = 4;
11077       break;
11078
11079     default:
11080       *sizeP = 0;
11081       return _("bad call to md_atof");
11082     }
11083
11084   t = atof_ieee (input_line_pointer, type, words);
11085   if (t)
11086     input_line_pointer = t;
11087
11088   *sizeP = prec * 2;
11089
11090   if (! target_big_endian)
11091     {
11092       for (i = prec - 1; i >= 0; i--)
11093         {
11094           md_number_to_chars (litP, words[i], 2);
11095           litP += 2;
11096         }
11097     }
11098   else
11099     {
11100       for (i = 0; i < prec; i++)
11101         {
11102           md_number_to_chars (litP, words[i], 2);
11103           litP += 2;
11104         }
11105     }
11106
11107   return NULL;
11108 }
11109
11110 void
11111 md_number_to_chars (char *buf, valueT val, int n)
11112 {
11113   if (target_big_endian)
11114     number_to_chars_bigendian (buf, val, n);
11115   else
11116     number_to_chars_littleendian (buf, val, n);
11117 }
11118 \f
11119 #ifdef OBJ_ELF
11120 static int support_64bit_objects(void)
11121 {
11122   const char **list, **l;
11123   int yes;
11124
11125   list = bfd_target_list ();
11126   for (l = list; *l != NULL; l++)
11127 #ifdef TE_TMIPS
11128     /* This is traditional mips */
11129     if (strcmp (*l, "elf64-tradbigmips") == 0
11130         || strcmp (*l, "elf64-tradlittlemips") == 0)
11131 #else
11132     if (strcmp (*l, "elf64-bigmips") == 0
11133         || strcmp (*l, "elf64-littlemips") == 0)
11134 #endif
11135       break;
11136   yes = (*l != NULL);
11137   free (list);
11138   return yes;
11139 }
11140 #endif /* OBJ_ELF */
11141
11142 const char *md_shortopts = "O::g::G:";
11143
11144 struct option md_longopts[] =
11145 {
11146   /* Options which specify architecture.  */
11147 #define OPTION_ARCH_BASE    (OPTION_MD_BASE)
11148 #define OPTION_MARCH (OPTION_ARCH_BASE + 0)
11149   {"march", required_argument, NULL, OPTION_MARCH},
11150 #define OPTION_MTUNE (OPTION_ARCH_BASE + 1)
11151   {"mtune", required_argument, NULL, OPTION_MTUNE},
11152 #define OPTION_MIPS1 (OPTION_ARCH_BASE + 2)
11153   {"mips0", no_argument, NULL, OPTION_MIPS1},
11154   {"mips1", no_argument, NULL, OPTION_MIPS1},
11155 #define OPTION_MIPS2 (OPTION_ARCH_BASE + 3)
11156   {"mips2", no_argument, NULL, OPTION_MIPS2},
11157 #define OPTION_MIPS3 (OPTION_ARCH_BASE + 4)
11158   {"mips3", no_argument, NULL, OPTION_MIPS3},
11159 #define OPTION_MIPS4 (OPTION_ARCH_BASE + 5)
11160   {"mips4", no_argument, NULL, OPTION_MIPS4},
11161 #define OPTION_MIPS5 (OPTION_ARCH_BASE + 6)
11162   {"mips5", no_argument, NULL, OPTION_MIPS5},
11163 #define OPTION_MIPS32 (OPTION_ARCH_BASE + 7)
11164   {"mips32", no_argument, NULL, OPTION_MIPS32},
11165 #define OPTION_MIPS64 (OPTION_ARCH_BASE + 8)
11166   {"mips64", no_argument, NULL, OPTION_MIPS64},
11167 #define OPTION_MIPS32R2 (OPTION_ARCH_BASE + 9)
11168   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
11169 #define OPTION_MIPS64R2 (OPTION_ARCH_BASE + 10)
11170   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
11171
11172   /* Options which specify Application Specific Extensions (ASEs).  */
11173 #define OPTION_ASE_BASE (OPTION_ARCH_BASE + 11)
11174 #define OPTION_MIPS16 (OPTION_ASE_BASE + 0)
11175   {"mips16", no_argument, NULL, OPTION_MIPS16},
11176 #define OPTION_NO_MIPS16 (OPTION_ASE_BASE + 1)
11177   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
11178 #define OPTION_MIPS3D (OPTION_ASE_BASE + 2)
11179   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
11180 #define OPTION_NO_MIPS3D (OPTION_ASE_BASE + 3)
11181   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
11182 #define OPTION_MDMX (OPTION_ASE_BASE + 4)
11183   {"mdmx", no_argument, NULL, OPTION_MDMX},
11184 #define OPTION_NO_MDMX (OPTION_ASE_BASE + 5)
11185   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
11186 #define OPTION_DSP (OPTION_ASE_BASE + 6)
11187   {"mdsp", no_argument, NULL, OPTION_DSP},
11188 #define OPTION_NO_DSP (OPTION_ASE_BASE + 7)
11189   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
11190 #define OPTION_MT (OPTION_ASE_BASE + 8)
11191   {"mmt", no_argument, NULL, OPTION_MT},
11192 #define OPTION_NO_MT (OPTION_ASE_BASE + 9)
11193   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
11194 #define OPTION_SMARTMIPS (OPTION_ASE_BASE + 10)
11195   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
11196 #define OPTION_NO_SMARTMIPS (OPTION_ASE_BASE + 11)
11197   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
11198 #define OPTION_DSPR2 (OPTION_ASE_BASE + 12)
11199   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
11200 #define OPTION_NO_DSPR2 (OPTION_ASE_BASE + 13)
11201   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
11202
11203   /* Old-style architecture options.  Don't add more of these.  */
11204 #define OPTION_COMPAT_ARCH_BASE (OPTION_ASE_BASE + 14)
11205 #define OPTION_M4650 (OPTION_COMPAT_ARCH_BASE + 0)
11206   {"m4650", no_argument, NULL, OPTION_M4650},
11207 #define OPTION_NO_M4650 (OPTION_COMPAT_ARCH_BASE + 1)
11208   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
11209 #define OPTION_M4010 (OPTION_COMPAT_ARCH_BASE + 2)
11210   {"m4010", no_argument, NULL, OPTION_M4010},
11211 #define OPTION_NO_M4010 (OPTION_COMPAT_ARCH_BASE + 3)
11212   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
11213 #define OPTION_M4100 (OPTION_COMPAT_ARCH_BASE + 4)
11214   {"m4100", no_argument, NULL, OPTION_M4100},
11215 #define OPTION_NO_M4100 (OPTION_COMPAT_ARCH_BASE + 5)
11216   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
11217 #define OPTION_M3900 (OPTION_COMPAT_ARCH_BASE + 6)
11218   {"m3900", no_argument, NULL, OPTION_M3900},
11219 #define OPTION_NO_M3900 (OPTION_COMPAT_ARCH_BASE + 7)
11220   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11221
11222   /* Options which enable bug fixes.  */
11223 #define OPTION_FIX_BASE    (OPTION_COMPAT_ARCH_BASE + 8)
11224 #define OPTION_M7000_HILO_FIX (OPTION_FIX_BASE + 0)
11225   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
11226 #define OPTION_MNO_7000_HILO_FIX (OPTION_FIX_BASE + 1)
11227   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11228   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11229 #define OPTION_FIX_VR4120 (OPTION_FIX_BASE + 2)
11230 #define OPTION_NO_FIX_VR4120 (OPTION_FIX_BASE + 3)
11231   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
11232   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
11233 #define OPTION_FIX_VR4130 (OPTION_FIX_BASE + 4)
11234 #define OPTION_NO_FIX_VR4130 (OPTION_FIX_BASE + 5)
11235   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
11236   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
11237
11238   /* Miscellaneous options.  */
11239 #define OPTION_MISC_BASE (OPTION_FIX_BASE + 6)
11240 #define OPTION_TRAP (OPTION_MISC_BASE + 0)
11241   {"trap", no_argument, NULL, OPTION_TRAP},
11242   {"no-break", no_argument, NULL, OPTION_TRAP},
11243 #define OPTION_BREAK (OPTION_MISC_BASE + 1)
11244   {"break", no_argument, NULL, OPTION_BREAK},
11245   {"no-trap", no_argument, NULL, OPTION_BREAK},
11246 #define OPTION_EB (OPTION_MISC_BASE + 2)
11247   {"EB", no_argument, NULL, OPTION_EB},
11248 #define OPTION_EL (OPTION_MISC_BASE + 3)
11249   {"EL", no_argument, NULL, OPTION_EL},
11250 #define OPTION_FP32 (OPTION_MISC_BASE + 4)
11251   {"mfp32", no_argument, NULL, OPTION_FP32},
11252 #define OPTION_GP32 (OPTION_MISC_BASE + 5)
11253   {"mgp32", no_argument, NULL, OPTION_GP32},
11254 #define OPTION_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 6)
11255   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
11256 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 7)
11257   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
11258 #define OPTION_FP64 (OPTION_MISC_BASE + 8)
11259   {"mfp64", no_argument, NULL, OPTION_FP64},
11260 #define OPTION_GP64 (OPTION_MISC_BASE + 9)
11261   {"mgp64", no_argument, NULL, OPTION_GP64},
11262 #define OPTION_RELAX_BRANCH (OPTION_MISC_BASE + 10)
11263 #define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 11)
11264   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11265   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
11266 #define OPTION_MSHARED (OPTION_MISC_BASE + 12)
11267 #define OPTION_MNO_SHARED (OPTION_MISC_BASE + 13)
11268   {"mshared", no_argument, NULL, OPTION_MSHARED},
11269   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
11270 #define OPTION_MSYM32 (OPTION_MISC_BASE + 14)
11271 #define OPTION_MNO_SYM32 (OPTION_MISC_BASE + 15)
11272   {"msym32", no_argument, NULL, OPTION_MSYM32},
11273   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
11274
11275   /* ELF-specific options.  */
11276 #ifdef OBJ_ELF
11277 #define OPTION_ELF_BASE    (OPTION_MISC_BASE + 16)
11278 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
11279   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
11280   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
11281 #define OPTION_NON_SHARED  (OPTION_ELF_BASE + 1)
11282   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
11283 #define OPTION_XGOT        (OPTION_ELF_BASE + 2)
11284   {"xgot",        no_argument, NULL, OPTION_XGOT},
11285 #define OPTION_MABI        (OPTION_ELF_BASE + 3)
11286   {"mabi", required_argument, NULL, OPTION_MABI},
11287 #define OPTION_32          (OPTION_ELF_BASE + 4)
11288   {"32",          no_argument, NULL, OPTION_32},
11289 #define OPTION_N32         (OPTION_ELF_BASE + 5)
11290   {"n32",         no_argument, NULL, OPTION_N32},
11291 #define OPTION_64          (OPTION_ELF_BASE + 6)
11292   {"64",          no_argument, NULL, OPTION_64},
11293 #define OPTION_MDEBUG      (OPTION_ELF_BASE + 7)
11294   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
11295 #define OPTION_NO_MDEBUG   (OPTION_ELF_BASE + 8)
11296   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
11297 #define OPTION_PDR         (OPTION_ELF_BASE + 9)
11298   {"mpdr", no_argument, NULL, OPTION_PDR},
11299 #define OPTION_NO_PDR      (OPTION_ELF_BASE + 10)
11300   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
11301 #define OPTION_MVXWORKS_PIC (OPTION_ELF_BASE + 11)
11302   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
11303 #endif /* OBJ_ELF */
11304
11305 #define OPTION_MOCTEON_UNSUPPORTED (OPTION_MISC_BASE + 28)
11306 #define OPTION_NO_MOCTEON_UNSUPPORTED (OPTION_MISC_BASE + 29)
11307   {"mocteon-unsupported", no_argument, NULL, OPTION_MOCTEON_UNSUPPORTED},
11308   {"mno-octeon-unsupported", no_argument, NULL, OPTION_NO_MOCTEON_UNSUPPORTED},
11309
11310 #define OPTION_MOCTEON_USEUN (OPTION_MISC_BASE + 30)
11311 #define OPTION_NO_MOCTEON_USEUN (OPTION_MISC_BASE + 31)
11312   {"mocteon-useun", no_argument, NULL, OPTION_MOCTEON_USEUN},
11313   {"mno-octeon-useun", no_argument, NULL, OPTION_NO_MOCTEON_USEUN},
11314
11315   {NULL, no_argument, NULL, 0}
11316 };
11317 size_t md_longopts_size = sizeof (md_longopts);
11318
11319 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11320    NEW_VALUE.  Warn if another value was already specified.  Note:
11321    we have to defer parsing the -march and -mtune arguments in order
11322    to handle 'from-abi' correctly, since the ABI might be specified
11323    in a later argument.  */
11324
11325 static void
11326 mips_set_option_string (const char **string_ptr, const char *new_value)
11327 {
11328   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11329     as_warn (_("A different %s was already specified, is now %s"),
11330              string_ptr == &mips_arch_string ? "-march" : "-mtune",
11331              new_value);
11332
11333   *string_ptr = new_value;
11334 }
11335
11336 int
11337 md_parse_option (int c, char *arg)
11338 {
11339   switch (c)
11340     {
11341     case OPTION_CONSTRUCT_FLOATS:
11342       mips_disable_float_construction = 0;
11343       break;
11344
11345     case OPTION_NO_CONSTRUCT_FLOATS:
11346       mips_disable_float_construction = 1;
11347       break;
11348
11349     case OPTION_TRAP:
11350       mips_trap = 1;
11351       break;
11352
11353     case OPTION_BREAK:
11354       mips_trap = 0;
11355       break;
11356
11357     case OPTION_EB:
11358       target_big_endian = 1;
11359       break;
11360
11361     case OPTION_EL:
11362       target_big_endian = 0;
11363       break;
11364
11365     case OPTION_MOCTEON_UNSUPPORTED:
11366       octeon_error_on_unsupported = 1;
11367       break;
11368
11369     case OPTION_NO_MOCTEON_UNSUPPORTED:
11370       octeon_error_on_unsupported = 0;
11371       break;
11372
11373     case OPTION_MOCTEON_USEUN:
11374       octeon_use_unalign = 1;
11375       break;
11376
11377     case OPTION_NO_MOCTEON_USEUN:
11378       octeon_use_unalign = 0;
11379       break;
11380
11381     case 'O':
11382       if (arg && arg[0] == '0')
11383         mips_optimize = 1;
11384       else
11385         mips_optimize = 2;
11386       break;
11387
11388     case 'g':
11389       if (arg == NULL)
11390         mips_debug = 2;
11391       else
11392         mips_debug = atoi (arg);
11393       break;
11394
11395     case OPTION_MIPS1:
11396       file_mips_isa = ISA_MIPS1;
11397       break;
11398
11399     case OPTION_MIPS2:
11400       file_mips_isa = ISA_MIPS2;
11401       break;
11402
11403     case OPTION_MIPS3:
11404       file_mips_isa = ISA_MIPS3;
11405       break;
11406
11407     case OPTION_MIPS4:
11408       file_mips_isa = ISA_MIPS4;
11409       break;
11410
11411     case OPTION_MIPS5:
11412       file_mips_isa = ISA_MIPS5;
11413       break;
11414
11415     case OPTION_MIPS32:
11416       file_mips_isa = ISA_MIPS32;
11417       break;
11418
11419     case OPTION_MIPS32R2:
11420       file_mips_isa = ISA_MIPS32R2;
11421       break;
11422
11423     case OPTION_MIPS64R2:
11424       file_mips_isa = ISA_MIPS64R2;
11425       break;
11426
11427     case OPTION_MIPS64:
11428       file_mips_isa = ISA_MIPS64;
11429       break;
11430
11431     case OPTION_MTUNE:
11432       mips_set_option_string (&mips_tune_string, arg);
11433       break;
11434
11435     case OPTION_MARCH:
11436       mips_set_option_string (&mips_arch_string, arg);
11437       break;
11438
11439     case OPTION_M4650:
11440       mips_set_option_string (&mips_arch_string, "4650");
11441       mips_set_option_string (&mips_tune_string, "4650");
11442       break;
11443
11444     case OPTION_NO_M4650:
11445       break;
11446
11447     case OPTION_M4010:
11448       mips_set_option_string (&mips_arch_string, "4010");
11449       mips_set_option_string (&mips_tune_string, "4010");
11450       break;
11451
11452     case OPTION_NO_M4010:
11453       break;
11454
11455     case OPTION_M4100:
11456       mips_set_option_string (&mips_arch_string, "4100");
11457       mips_set_option_string (&mips_tune_string, "4100");
11458       break;
11459
11460     case OPTION_NO_M4100:
11461       break;
11462
11463     case OPTION_M3900:
11464       mips_set_option_string (&mips_arch_string, "3900");
11465       mips_set_option_string (&mips_tune_string, "3900");
11466       break;
11467
11468     case OPTION_NO_M3900:
11469       break;
11470
11471     case OPTION_MDMX:
11472       mips_opts.ase_mdmx = 1;
11473       break;
11474
11475     case OPTION_NO_MDMX:
11476       mips_opts.ase_mdmx = 0;
11477       break;
11478
11479     case OPTION_DSP:
11480       mips_opts.ase_dsp = 1;
11481       mips_opts.ase_dspr2 = 0;
11482       break;
11483
11484     case OPTION_NO_DSP:
11485       mips_opts.ase_dsp = 0;
11486       mips_opts.ase_dspr2 = 0;
11487       break;
11488
11489     case OPTION_DSPR2:
11490       mips_opts.ase_dspr2 = 1;
11491       mips_opts.ase_dsp = 1;
11492       break;
11493
11494     case OPTION_NO_DSPR2:
11495       mips_opts.ase_dspr2 = 0;
11496       mips_opts.ase_dsp = 0;
11497       break;
11498
11499     case OPTION_MT:
11500       mips_opts.ase_mt = 1;
11501       break;
11502
11503     case OPTION_NO_MT:
11504       mips_opts.ase_mt = 0;
11505       break;
11506
11507     case OPTION_MIPS16:
11508       mips_opts.mips16 = 1;
11509       mips_no_prev_insn ();
11510       break;
11511
11512     case OPTION_NO_MIPS16:
11513       mips_opts.mips16 = 0;
11514       mips_no_prev_insn ();
11515       break;
11516
11517     case OPTION_MIPS3D:
11518       mips_opts.ase_mips3d = 1;
11519       break;
11520
11521     case OPTION_NO_MIPS3D:
11522       mips_opts.ase_mips3d = 0;
11523       break;
11524
11525     case OPTION_SMARTMIPS:
11526       mips_opts.ase_smartmips = 1;
11527       break;
11528
11529     case OPTION_NO_SMARTMIPS:
11530       mips_opts.ase_smartmips = 0;
11531       break;
11532
11533     case OPTION_FIX_VR4120:
11534       mips_fix_vr4120 = 1;
11535       break;
11536
11537     case OPTION_NO_FIX_VR4120:
11538       mips_fix_vr4120 = 0;
11539       break;
11540
11541     case OPTION_FIX_VR4130:
11542       mips_fix_vr4130 = 1;
11543       break;
11544
11545     case OPTION_NO_FIX_VR4130:
11546       mips_fix_vr4130 = 0;
11547       break;
11548
11549     case OPTION_RELAX_BRANCH:
11550       mips_relax_branch = 1;
11551       break;
11552
11553     case OPTION_NO_RELAX_BRANCH:
11554       mips_relax_branch = 0;
11555       break;
11556
11557     case OPTION_MSHARED:
11558       mips_in_shared = TRUE;
11559       break;
11560
11561     case OPTION_MNO_SHARED:
11562       mips_in_shared = FALSE;
11563       break;
11564
11565     case OPTION_MSYM32:
11566       mips_opts.sym32 = TRUE;
11567       break;
11568
11569     case OPTION_MNO_SYM32:
11570       mips_opts.sym32 = FALSE;
11571       break;
11572
11573 #ifdef OBJ_ELF
11574       /* When generating ELF code, we permit -KPIC and -call_shared to
11575          select SVR4_PIC, and -non_shared to select no PIC.  This is
11576          intended to be compatible with Irix 5.  */
11577     case OPTION_CALL_SHARED:
11578       if (!IS_ELF)
11579         {
11580           as_bad (_("-call_shared is supported only for ELF format"));
11581           return 0;
11582         }
11583       mips_pic = SVR4_PIC;
11584       mips_abicalls = TRUE;
11585       break;
11586
11587     case OPTION_NON_SHARED:
11588       if (!IS_ELF)
11589         {
11590           as_bad (_("-non_shared is supported only for ELF format"));
11591           return 0;
11592         }
11593       mips_pic = NO_PIC;
11594       mips_abicalls = FALSE;
11595       break;
11596
11597       /* The -xgot option tells the assembler to use 32 bit offsets
11598          when accessing the got in SVR4_PIC mode.  It is for Irix
11599          compatibility.  */
11600     case OPTION_XGOT:
11601       mips_big_got = 1;
11602       break;
11603 #endif /* OBJ_ELF */
11604
11605     case 'G':
11606       g_switch_value = atoi (arg);
11607       g_switch_seen = 1;
11608       break;
11609
11610 #ifdef OBJ_ELF
11611       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11612          and -mabi=64.  */
11613     case OPTION_32:
11614       if (!IS_ELF)
11615         {
11616           as_bad (_("-32 is supported for ELF format only"));
11617           return 0;
11618         }
11619       mips_abi = O32_ABI;
11620       break;
11621
11622     case OPTION_N32:
11623       if (!IS_ELF)
11624         {
11625           as_bad (_("-n32 is supported for ELF format only"));
11626           return 0;
11627         }
11628       mips_abi = N32_ABI;
11629       break;
11630
11631     case OPTION_64:
11632       if (!IS_ELF)
11633         {
11634           as_bad (_("-64 is supported for ELF format only"));
11635           return 0;
11636         }
11637       mips_abi = N64_ABI;
11638       if (!support_64bit_objects())
11639         as_fatal (_("No compiled in support for 64 bit object file format"));
11640       break;
11641 #endif /* OBJ_ELF */
11642
11643     case OPTION_GP32:
11644       file_mips_gp32 = 1;
11645       break;
11646
11647     case OPTION_GP64:
11648       file_mips_gp32 = 0;
11649       break;
11650
11651     case OPTION_FP32:
11652       file_mips_fp32 = 1;
11653       break;
11654
11655     case OPTION_FP64:
11656       file_mips_fp32 = 0;
11657       break;
11658
11659 #ifdef OBJ_ELF
11660     case OPTION_MABI:
11661       if (!IS_ELF)
11662         {
11663           as_bad (_("-mabi is supported for ELF format only"));
11664           return 0;
11665         }
11666       if (strcmp (arg, "32") == 0)
11667         mips_abi = O32_ABI;
11668       else if (strcmp (arg, "o64") == 0)
11669         mips_abi = O64_ABI;
11670       else if (strcmp (arg, "n32") == 0)
11671         mips_abi = N32_ABI;
11672       else if (strcmp (arg, "64") == 0)
11673         {
11674           mips_abi = N64_ABI;
11675           if (! support_64bit_objects())
11676             as_fatal (_("No compiled in support for 64 bit object file "
11677                         "format"));
11678         }
11679       else if (strcmp (arg, "eabi") == 0)
11680         mips_abi = EABI_ABI;
11681       else
11682         {
11683           as_fatal (_("invalid abi -mabi=%s"), arg);
11684           return 0;
11685         }
11686       break;
11687 #endif /* OBJ_ELF */
11688
11689     case OPTION_M7000_HILO_FIX:
11690       mips_7000_hilo_fix = TRUE;
11691       break;
11692
11693     case OPTION_MNO_7000_HILO_FIX:
11694       mips_7000_hilo_fix = FALSE;
11695       break;
11696
11697 #ifdef OBJ_ELF
11698     case OPTION_MDEBUG:
11699       mips_flag_mdebug = TRUE;
11700       break;
11701
11702     case OPTION_NO_MDEBUG:
11703       mips_flag_mdebug = FALSE;
11704       break;
11705
11706     case OPTION_PDR:
11707       mips_flag_pdr = TRUE;
11708       break;
11709
11710     case OPTION_NO_PDR:
11711       mips_flag_pdr = FALSE;
11712       break;
11713
11714     case OPTION_MVXWORKS_PIC:
11715       mips_pic = VXWORKS_PIC;
11716       break;
11717 #endif /* OBJ_ELF */
11718
11719     default:
11720       return 0;
11721     }
11722
11723   return 1;
11724 }
11725 \f
11726 /* Set up globals to generate code for the ISA or processor
11727    described by INFO.  */
11728
11729 static void
11730 mips_set_architecture (const struct mips_cpu_info *info)
11731 {
11732   if (info != 0)
11733     {
11734       file_mips_arch = info->cpu;
11735       mips_opts.arch = info->cpu;
11736       mips_opts.isa = info->isa;
11737     }
11738 }
11739
11740
11741 /* Likewise for tuning.  */
11742
11743 static void
11744 mips_set_tune (const struct mips_cpu_info *info)
11745 {
11746   if (info != 0)
11747     mips_tune = info->cpu;
11748 }
11749
11750
11751 void
11752 mips_after_parse_args (void)
11753 {
11754   const struct mips_cpu_info *arch_info = 0;
11755   const struct mips_cpu_info *tune_info = 0;
11756
11757   /* GP relative stuff not working for PE */
11758   if (strncmp (TARGET_OS, "pe", 2) == 0)
11759     {
11760       if (g_switch_seen && g_switch_value != 0)
11761         as_bad (_("-G not supported in this configuration."));
11762       g_switch_value = 0;
11763     }
11764
11765   if (mips_abi == NO_ABI)
11766     mips_abi = MIPS_DEFAULT_ABI;
11767
11768   /* The following code determines the architecture and register size.
11769      Similar code was added to GCC 3.3 (see override_options() in
11770      config/mips/mips.c).  The GAS and GCC code should be kept in sync
11771      as much as possible.  */
11772
11773   if (mips_arch_string != 0)
11774     arch_info = mips_parse_cpu ("-march", mips_arch_string);
11775
11776   if (file_mips_isa != ISA_UNKNOWN)
11777     {
11778       /* Handle -mipsN.  At this point, file_mips_isa contains the
11779          ISA level specified by -mipsN, while arch_info->isa contains
11780          the -march selection (if any).  */
11781       if (arch_info != 0)
11782         {
11783           /* -march takes precedence over -mipsN, since it is more descriptive.
11784              There's no harm in specifying both as long as the ISA levels
11785              are the same.  */
11786           if (file_mips_isa != arch_info->isa)
11787             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11788                     mips_cpu_info_from_isa (file_mips_isa)->name,
11789                     mips_cpu_info_from_isa (arch_info->isa)->name);
11790         }
11791       else
11792         arch_info = mips_cpu_info_from_isa (file_mips_isa);
11793     }
11794
11795   if (arch_info == 0)
11796     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11797
11798   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11799     as_bad ("-march=%s is not compatible with the selected ABI",
11800             arch_info->name);
11801
11802   mips_set_architecture (arch_info);
11803
11804   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
11805   if (mips_tune_string != 0)
11806     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11807
11808   if (tune_info == 0)
11809     mips_set_tune (arch_info);
11810   else
11811     mips_set_tune (tune_info);
11812
11813   if (file_mips_gp32 >= 0)
11814     {
11815       /* The user specified the size of the integer registers.  Make sure
11816          it agrees with the ABI and ISA.  */
11817       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11818         as_bad (_("-mgp64 used with a 32-bit processor"));
11819       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11820         as_bad (_("-mgp32 used with a 64-bit ABI"));
11821       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11822         as_bad (_("-mgp64 used with a 32-bit ABI"));
11823     }
11824   else
11825     {
11826       /* Infer the integer register size from the ABI and processor.
11827          Restrict ourselves to 32-bit registers if that's all the
11828          processor has, or if the ABI cannot handle 64-bit registers.  */
11829       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11830                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
11831     }
11832
11833   switch (file_mips_fp32)
11834     {
11835     default:
11836     case -1:
11837       /* No user specified float register size.
11838          ??? GAS treats single-float processors as though they had 64-bit
11839          float registers (although it complains when double-precision
11840          instructions are used).  As things stand, saying they have 32-bit
11841          registers would lead to spurious "register must be even" messages.
11842          So here we assume float registers are never smaller than the
11843          integer ones.  */
11844       if (file_mips_gp32 == 0)
11845         /* 64-bit integer registers implies 64-bit float registers.  */
11846         file_mips_fp32 = 0;
11847       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
11848                && ISA_HAS_64BIT_FPRS (mips_opts.isa))
11849         /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
11850         file_mips_fp32 = 0;
11851       else
11852         /* 32-bit float registers.  */
11853         file_mips_fp32 = 1;
11854       break;
11855
11856     /* The user specified the size of the float registers.  Check if it
11857        agrees with the ABI and ISA.  */
11858     case 0:
11859       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
11860         as_bad (_("-mfp64 used with a 32-bit fpu"));
11861       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
11862                && !ISA_HAS_MXHC1 (mips_opts.isa))
11863         as_warn (_("-mfp64 used with a 32-bit ABI"));
11864       break;
11865     case 1:
11866       if (ABI_NEEDS_64BIT_REGS (mips_abi))
11867         as_warn (_("-mfp32 used with a 64-bit ABI"));
11868       break;
11869     }
11870
11871   /* End of GCC-shared inference code.  */
11872
11873   /* This flag is set when we have a 64-bit capable CPU but use only
11874      32-bit wide registers.  Note that EABI does not use it.  */
11875   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
11876       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
11877           || mips_abi == O32_ABI))
11878     mips_32bitmode = 1;
11879
11880   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11881     as_bad (_("trap exception not supported at ISA 1"));
11882
11883   /* If the selected architecture includes support for ASEs, enable
11884      generation of code for them.  */
11885   if (mips_opts.mips16 == -1)
11886     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
11887   if (mips_opts.ase_mips3d == -1)
11888     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
11889                             && file_mips_fp32 == 0) ? 1 : 0;
11890   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
11891     as_bad (_("-mfp32 used with -mips3d"));
11892
11893   if (mips_opts.ase_mdmx == -1)
11894     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
11895                           && file_mips_fp32 == 0) ? 1 : 0;
11896   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
11897     as_bad (_("-mfp32 used with -mdmx"));
11898
11899   if (mips_opts.ase_smartmips == -1)
11900     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
11901   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
11902       as_warn ("%s ISA does not support SmartMIPS", 
11903                mips_cpu_info_from_isa (mips_opts.isa)->name);
11904
11905   if (mips_opts.ase_dsp == -1)
11906     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11907   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
11908       as_warn ("%s ISA does not support DSP ASE", 
11909                mips_cpu_info_from_isa (mips_opts.isa)->name);
11910
11911   if (mips_opts.ase_dspr2 == -1)
11912     {
11913       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
11914       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11915     }
11916   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
11917       as_warn ("%s ISA does not support DSP R2 ASE",
11918                mips_cpu_info_from_isa (mips_opts.isa)->name);
11919
11920   if (mips_opts.ase_mt == -1)
11921     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
11922   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
11923       as_warn ("%s ISA does not support MT ASE",
11924                mips_cpu_info_from_isa (mips_opts.isa)->name);
11925
11926   file_mips_isa = mips_opts.isa;
11927   file_ase_mips16 = mips_opts.mips16;
11928   file_ase_mips3d = mips_opts.ase_mips3d;
11929   file_ase_mdmx = mips_opts.ase_mdmx;
11930   file_ase_smartmips = mips_opts.ase_smartmips;
11931   file_ase_dsp = mips_opts.ase_dsp;
11932   file_ase_dspr2 = mips_opts.ase_dspr2;
11933   file_ase_mt = mips_opts.ase_mt;
11934   mips_opts.gp32 = file_mips_gp32;
11935   mips_opts.fp32 = file_mips_fp32;
11936
11937   if (mips_flag_mdebug < 0)
11938     {
11939 #ifdef OBJ_MAYBE_ECOFF
11940       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
11941         mips_flag_mdebug = 1;
11942       else
11943 #endif /* OBJ_MAYBE_ECOFF */
11944         mips_flag_mdebug = 0;
11945     }
11946 }
11947 \f
11948 void
11949 mips_init_after_args (void)
11950 {
11951   /* initialize opcodes */
11952   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
11953   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
11954 }
11955
11956 long
11957 md_pcrel_from (fixS *fixP)
11958 {
11959   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
11960   switch (fixP->fx_r_type)
11961     {
11962     case BFD_RELOC_16_PCREL_S2:
11963     case BFD_RELOC_MIPS_JMP:
11964       /* Return the address of the delay slot.  */
11965       return addr + 4;
11966     default:
11967       /* We have no relocation type for PC relative MIPS16 instructions.  */
11968       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
11969         as_bad_where (fixP->fx_file, fixP->fx_line,
11970                       _("PC relative MIPS16 instruction references a different section"));
11971       return addr;
11972     }
11973 }
11974
11975 /* This is called before the symbol table is processed.  In order to
11976    work with gcc when using mips-tfile, we must keep all local labels.
11977    However, in other cases, we want to discard them.  If we were
11978    called with -g, but we didn't see any debugging information, it may
11979    mean that gcc is smuggling debugging information through to
11980    mips-tfile, in which case we must generate all local labels.  */
11981
11982 void
11983 mips_frob_file_before_adjust (void)
11984 {
11985 #ifndef NO_ECOFF_DEBUGGING
11986   if (ECOFF_DEBUGGING
11987       && mips_debug != 0
11988       && ! ecoff_debugging_seen)
11989     flag_keep_locals = 1;
11990 #endif
11991 }
11992
11993 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
11994    the corresponding LO16 reloc.  This is called before md_apply_fix and
11995    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
11996    relocation operators.
11997
11998    For our purposes, a %lo() expression matches a %got() or %hi()
11999    expression if:
12000
12001       (a) it refers to the same symbol; and
12002       (b) the offset applied in the %lo() expression is no lower than
12003           the offset applied in the %got() or %hi().
12004
12005    (b) allows us to cope with code like:
12006
12007         lui     $4,%hi(foo)
12008         lh      $4,%lo(foo+2)($4)
12009
12010    ...which is legal on RELA targets, and has a well-defined behaviour
12011    if the user knows that adding 2 to "foo" will not induce a carry to
12012    the high 16 bits.
12013
12014    When several %lo()s match a particular %got() or %hi(), we use the
12015    following rules to distinguish them:
12016
12017      (1) %lo()s with smaller offsets are a better match than %lo()s with
12018          higher offsets.
12019
12020      (2) %lo()s with no matching %got() or %hi() are better than those
12021          that already have a matching %got() or %hi().
12022
12023      (3) later %lo()s are better than earlier %lo()s.
12024
12025    These rules are applied in order.
12026
12027    (1) means, among other things, that %lo()s with identical offsets are
12028    chosen if they exist.
12029
12030    (2) means that we won't associate several high-part relocations with
12031    the same low-part relocation unless there's no alternative.  Having
12032    several high parts for the same low part is a GNU extension; this rule
12033    allows careful users to avoid it.
12034
12035    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
12036    with the last high-part relocation being at the front of the list.
12037    It therefore makes sense to choose the last matching low-part
12038    relocation, all other things being equal.  It's also easier
12039    to code that way.  */
12040
12041 void
12042 mips_frob_file (void)
12043 {
12044   struct mips_hi_fixup *l;
12045
12046   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12047     {
12048       segment_info_type *seginfo;
12049       bfd_boolean matched_lo_p;
12050       fixS **hi_pos, **lo_pos, **pos;
12051
12052       assert (reloc_needs_lo_p (l->fixp->fx_r_type));
12053
12054       /* If a GOT16 relocation turns out to be against a global symbol,
12055          there isn't supposed to be a matching LO.  */
12056       if (l->fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
12057           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12058         continue;
12059
12060       /* Check quickly whether the next fixup happens to be a matching %lo.  */
12061       if (fixup_has_matching_lo_p (l->fixp))
12062         continue;
12063
12064       seginfo = seg_info (l->seg);
12065
12066       /* Set HI_POS to the position of this relocation in the chain.
12067          Set LO_POS to the position of the chosen low-part relocation.
12068          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12069          relocation that matches an immediately-preceding high-part
12070          relocation.  */
12071       hi_pos = NULL;
12072       lo_pos = NULL;
12073       matched_lo_p = FALSE;
12074       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12075         {
12076           if (*pos == l->fixp)
12077             hi_pos = pos;
12078
12079           if (((*pos)->fx_r_type == BFD_RELOC_LO16
12080                || (*pos)->fx_r_type == BFD_RELOC_MIPS16_LO16)
12081               && (*pos)->fx_addsy == l->fixp->fx_addsy
12082               && (*pos)->fx_offset >= l->fixp->fx_offset
12083               && (lo_pos == NULL
12084                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
12085                   || (!matched_lo_p
12086                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12087             lo_pos = pos;
12088
12089           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12090                           && fixup_has_matching_lo_p (*pos));
12091         }
12092
12093       /* If we found a match, remove the high-part relocation from its
12094          current position and insert it before the low-part relocation.
12095          Make the offsets match so that fixup_has_matching_lo_p()
12096          will return true.
12097
12098          We don't warn about unmatched high-part relocations since some
12099          versions of gcc have been known to emit dead "lui ...%hi(...)"
12100          instructions.  */
12101       if (lo_pos != NULL)
12102         {
12103           l->fixp->fx_offset = (*lo_pos)->fx_offset;
12104           if (l->fixp->fx_next != *lo_pos)
12105             {
12106               *hi_pos = l->fixp->fx_next;
12107               l->fixp->fx_next = *lo_pos;
12108               *lo_pos = l->fixp;
12109             }
12110         }
12111     }
12112 }
12113
12114 /* We may have combined relocations without symbols in the N32/N64 ABI.
12115    We have to prevent gas from dropping them.  */
12116
12117 int
12118 mips_force_relocation (fixS *fixp)
12119 {
12120   if (generic_force_reloc (fixp))
12121     return 1;
12122
12123   if (HAVE_NEWABI
12124       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12125       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
12126           || fixp->fx_r_type == BFD_RELOC_HI16_S
12127           || fixp->fx_r_type == BFD_RELOC_LO16))
12128     return 1;
12129
12130   return 0;
12131 }
12132
12133 /* Apply a fixup to the object file.  */
12134
12135 void
12136 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
12137 {
12138   bfd_byte *buf;
12139   long insn;
12140   reloc_howto_type *howto;
12141
12142   /* We ignore generic BFD relocations we don't know about.  */
12143   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12144   if (! howto)
12145     return;
12146
12147   assert (fixP->fx_size == 4
12148           || fixP->fx_r_type == BFD_RELOC_16
12149           || fixP->fx_r_type == BFD_RELOC_64
12150           || fixP->fx_r_type == BFD_RELOC_CTOR
12151           || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12152           || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12153           || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12154           || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
12155
12156   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
12157
12158   assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
12159
12160   /* Don't treat parts of a composite relocation as done.  There are two
12161      reasons for this:
12162
12163      (1) The second and third parts will be against 0 (RSS_UNDEF) but
12164          should nevertheless be emitted if the first part is.
12165
12166      (2) In normal usage, composite relocations are never assembly-time
12167          constants.  The easiest way of dealing with the pathological
12168          exceptions is to generate a relocation against STN_UNDEF and
12169          leave everything up to the linker.  */
12170   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
12171     fixP->fx_done = 1;
12172
12173   switch (fixP->fx_r_type)
12174     {
12175     case BFD_RELOC_MIPS_TLS_GD:
12176     case BFD_RELOC_MIPS_TLS_LDM:
12177     case BFD_RELOC_MIPS_TLS_DTPREL32:
12178     case BFD_RELOC_MIPS_TLS_DTPREL64:
12179     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12180     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12181     case BFD_RELOC_MIPS_TLS_GOTTPREL:
12182     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12183     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12184       S_SET_THREAD_LOCAL (fixP->fx_addsy);
12185       /* fall through */
12186
12187     case BFD_RELOC_MIPS_JMP:
12188     case BFD_RELOC_MIPS_SHIFT5:
12189     case BFD_RELOC_MIPS_SHIFT6:
12190     case BFD_RELOC_MIPS_GOT_DISP:
12191     case BFD_RELOC_MIPS_GOT_PAGE:
12192     case BFD_RELOC_MIPS_GOT_OFST:
12193     case BFD_RELOC_MIPS_SUB:
12194     case BFD_RELOC_MIPS_INSERT_A:
12195     case BFD_RELOC_MIPS_INSERT_B:
12196     case BFD_RELOC_MIPS_DELETE:
12197     case BFD_RELOC_MIPS_HIGHEST:
12198     case BFD_RELOC_MIPS_HIGHER:
12199     case BFD_RELOC_MIPS_SCN_DISP:
12200     case BFD_RELOC_MIPS_REL16:
12201     case BFD_RELOC_MIPS_RELGOT:
12202     case BFD_RELOC_MIPS_JALR:
12203     case BFD_RELOC_HI16:
12204     case BFD_RELOC_HI16_S:
12205     case BFD_RELOC_GPREL16:
12206     case BFD_RELOC_MIPS_LITERAL:
12207     case BFD_RELOC_MIPS_CALL16:
12208     case BFD_RELOC_MIPS_GOT16:
12209     case BFD_RELOC_GPREL32:
12210     case BFD_RELOC_MIPS_GOT_HI16:
12211     case BFD_RELOC_MIPS_GOT_LO16:
12212     case BFD_RELOC_MIPS_CALL_HI16:
12213     case BFD_RELOC_MIPS_CALL_LO16:
12214     case BFD_RELOC_MIPS16_GPREL:
12215     case BFD_RELOC_MIPS16_HI16:
12216     case BFD_RELOC_MIPS16_HI16_S:
12217     case BFD_RELOC_MIPS16_JMP:
12218       /* Nothing needed to do.  The value comes from the reloc entry.  */
12219       break;
12220
12221     case BFD_RELOC_64:
12222       /* This is handled like BFD_RELOC_32, but we output a sign
12223          extended value if we are only 32 bits.  */
12224       if (fixP->fx_done)
12225         {
12226           if (8 <= sizeof (valueT))
12227             md_number_to_chars ((char *) buf, *valP, 8);
12228           else
12229             {
12230               valueT hiv;
12231
12232               if ((*valP & 0x80000000) != 0)
12233                 hiv = 0xffffffff;
12234               else
12235                 hiv = 0;
12236               md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
12237                                   *valP, 4);
12238               md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
12239                                   hiv, 4);
12240             }
12241         }
12242       break;
12243
12244     case BFD_RELOC_RVA:
12245     case BFD_RELOC_32:
12246     case BFD_RELOC_16:
12247       /* If we are deleting this reloc entry, we must fill in the
12248          value now.  This can happen if we have a .word which is not
12249          resolved when it appears but is later defined.  */
12250       if (fixP->fx_done)
12251         md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
12252       break;
12253
12254     case BFD_RELOC_LO16:
12255     case BFD_RELOC_MIPS16_LO16:
12256       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12257          may be safe to remove, but if so it's not obvious.  */
12258       /* When handling an embedded PIC switch statement, we can wind
12259          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
12260       if (fixP->fx_done)
12261         {
12262           if (*valP + 0x8000 > 0xffff)
12263             as_bad_where (fixP->fx_file, fixP->fx_line,
12264                           _("relocation overflow"));
12265           if (target_big_endian)
12266             buf += 2;
12267           md_number_to_chars ((char *) buf, *valP, 2);
12268         }
12269       break;
12270
12271     case BFD_RELOC_16_PCREL_S2:
12272       if ((*valP & 0x3) != 0)
12273         as_bad_where (fixP->fx_file, fixP->fx_line,
12274                       _("Branch to misaligned address (%lx)"), (long) *valP);
12275
12276       /* We need to save the bits in the instruction since fixup_segment()
12277          might be deleting the relocation entry (i.e., a branch within
12278          the current segment).  */
12279       if (! fixP->fx_done)
12280         break;
12281
12282       /* Update old instruction data.  */
12283       if (target_big_endian)
12284         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12285       else
12286         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12287
12288       if (*valP + 0x20000 <= 0x3ffff)
12289         {
12290           insn |= (*valP >> 2) & 0xffff;
12291           md_number_to_chars ((char *) buf, insn, 4);
12292         }
12293       else if (mips_pic == NO_PIC
12294                && fixP->fx_done
12295                && fixP->fx_frag->fr_address >= text_section->vma
12296                && (fixP->fx_frag->fr_address
12297                    < text_section->vma + bfd_get_section_size (text_section))
12298                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
12299                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
12300                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
12301         {
12302           /* The branch offset is too large.  If this is an
12303              unconditional branch, and we are not generating PIC code,
12304              we can convert it to an absolute jump instruction.  */
12305           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
12306             insn = 0x0c000000;  /* jal */
12307           else
12308             insn = 0x08000000;  /* j */
12309           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12310           fixP->fx_done = 0;
12311           fixP->fx_addsy = section_symbol (text_section);
12312           *valP += md_pcrel_from (fixP);
12313           md_number_to_chars ((char *) buf, insn, 4);
12314         }
12315       else
12316         {
12317           /* If we got here, we have branch-relaxation disabled,
12318              and there's nothing we can do to fix this instruction
12319              without turning it into a longer sequence.  */
12320           as_bad_where (fixP->fx_file, fixP->fx_line,
12321                         _("Branch out of range"));
12322         }
12323       break;
12324
12325     case BFD_RELOC_VTABLE_INHERIT:
12326       fixP->fx_done = 0;
12327       if (fixP->fx_addsy
12328           && !S_IS_DEFINED (fixP->fx_addsy)
12329           && !S_IS_WEAK (fixP->fx_addsy))
12330         S_SET_WEAK (fixP->fx_addsy);
12331       break;
12332
12333     case BFD_RELOC_VTABLE_ENTRY:
12334       fixP->fx_done = 0;
12335       break;
12336
12337     default:
12338       internalError ();
12339     }
12340
12341   /* Remember value for tc_gen_reloc.  */
12342   fixP->fx_addnumber = *valP;
12343 }
12344
12345 static symbolS *
12346 get_symbol (void)
12347 {
12348   int c;
12349   char *name;
12350   symbolS *p;
12351
12352   name = input_line_pointer;
12353   c = get_symbol_end ();
12354   p = (symbolS *) symbol_find_or_make (name);
12355   *input_line_pointer = c;
12356   return p;
12357 }
12358
12359 /* Align the current frag to a given power of two.  The MIPS assembler
12360    also automatically adjusts any preceding label.  */
12361
12362 static void
12363 mips_align (int to, int fill, symbolS *label)
12364 {
12365   mips_emit_delays ();
12366   frag_align (to, fill, 0);
12367   record_alignment (now_seg, to);
12368   if (label != NULL)
12369     {
12370       assert (S_GET_SEGMENT (label) == now_seg);
12371       symbol_set_frag (label, frag_now);
12372       S_SET_VALUE (label, (valueT) frag_now_fix ());
12373     }
12374 }
12375
12376 /* Align to a given power of two.  .align 0 turns off the automatic
12377    alignment used by the data creating pseudo-ops.  */
12378
12379 static void
12380 s_align (int x ATTRIBUTE_UNUSED)
12381 {
12382   int temp;
12383   long temp_fill;
12384   long max_alignment = 15;
12385
12386   /* o Note that the assembler pulls down any immediately preceding label
12387        to the aligned address.
12388      o It's not documented but auto alignment is reinstated by
12389        a .align pseudo instruction.
12390      o Note also that after auto alignment is turned off the mips assembler
12391        issues an error on attempt to assemble an improperly aligned data item.
12392        We don't.  */
12393
12394   temp = get_absolute_expression ();
12395   if (temp > max_alignment)
12396     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12397   else if (temp < 0)
12398     {
12399       as_warn (_("Alignment negative: 0 assumed."));
12400       temp = 0;
12401     }
12402   if (*input_line_pointer == ',')
12403     {
12404       ++input_line_pointer;
12405       temp_fill = get_absolute_expression ();
12406     }
12407   else
12408     temp_fill = 0;
12409   if (temp)
12410     {
12411       segment_info_type *si = seg_info (now_seg);
12412       struct insn_label_list *l = si->label_list;
12413       /* Auto alignment should be switched on by next section change.  */
12414       auto_align = 1;
12415       mips_align (temp, (int) temp_fill, l != NULL ? l->label : NULL);
12416     }
12417   else
12418     {
12419       auto_align = 0;
12420     }
12421
12422   demand_empty_rest_of_line ();
12423 }
12424
12425 static void
12426 s_change_sec (int sec)
12427 {
12428   segT seg;
12429
12430 #ifdef OBJ_ELF
12431   /* The ELF backend needs to know that we are changing sections, so
12432      that .previous works correctly.  We could do something like check
12433      for an obj_section_change_hook macro, but that might be confusing
12434      as it would not be appropriate to use it in the section changing
12435      functions in read.c, since obj-elf.c intercepts those.  FIXME:
12436      This should be cleaner, somehow.  */
12437   if (IS_ELF)
12438     obj_elf_section_change_hook ();
12439 #endif
12440
12441   mips_emit_delays ();
12442   switch (sec)
12443     {
12444     case 't':
12445       s_text (0);
12446       break;
12447     case 'd':
12448       s_data (0);
12449       break;
12450     case 'b':
12451       subseg_set (bss_section, (subsegT) get_absolute_expression ());
12452       demand_empty_rest_of_line ();
12453       break;
12454
12455     case 'r':
12456       seg = subseg_new (RDATA_SECTION_NAME,
12457                         (subsegT) get_absolute_expression ());
12458       if (IS_ELF)
12459         {
12460           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12461                                                   | SEC_READONLY | SEC_RELOC
12462                                                   | SEC_DATA));
12463           if (strcmp (TARGET_OS, "elf") != 0)
12464             record_alignment (seg, 4);
12465         }
12466       demand_empty_rest_of_line ();
12467       break;
12468
12469     case 's':
12470       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12471       if (IS_ELF)
12472         {
12473           bfd_set_section_flags (stdoutput, seg,
12474                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12475           if (strcmp (TARGET_OS, "elf") != 0)
12476             record_alignment (seg, 4);
12477         }
12478       demand_empty_rest_of_line ();
12479       break;
12480     }
12481
12482   auto_align = 1;
12483 }
12484
12485 void
12486 s_change_section (int ignore ATTRIBUTE_UNUSED)
12487 {
12488 #ifdef OBJ_ELF
12489   char *section_name;
12490   char c;
12491   char next_c = 0;
12492   int section_type;
12493   int section_flag;
12494   int section_entry_size;
12495   int section_alignment;
12496
12497   if (!IS_ELF)
12498     return;
12499
12500   section_name = input_line_pointer;
12501   c = get_symbol_end ();
12502   if (c)
12503     next_c = *(input_line_pointer + 1);
12504
12505   /* Do we have .section Name<,"flags">?  */
12506   if (c != ',' || (c == ',' && next_c == '"'))
12507     {
12508       /* just after name is now '\0'.  */
12509       *input_line_pointer = c;
12510       input_line_pointer = section_name;
12511       obj_elf_section (ignore);
12512       return;
12513     }
12514   input_line_pointer++;
12515
12516   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
12517   if (c == ',')
12518     section_type = get_absolute_expression ();
12519   else
12520     section_type = 0;
12521   if (*input_line_pointer++ == ',')
12522     section_flag = get_absolute_expression ();
12523   else
12524     section_flag = 0;
12525   if (*input_line_pointer++ == ',')
12526     section_entry_size = get_absolute_expression ();
12527   else
12528     section_entry_size = 0;
12529   if (*input_line_pointer++ == ',')
12530     section_alignment = get_absolute_expression ();
12531   else
12532     section_alignment = 0;
12533
12534   section_name = xstrdup (section_name);
12535
12536   /* When using the generic form of .section (as implemented by obj-elf.c),
12537      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
12538      traditionally had to fall back on the more common @progbits instead.
12539
12540      There's nothing really harmful in this, since bfd will correct
12541      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
12542      means that, for backwards compatibility, the special_section entries
12543      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12544
12545      Even so, we shouldn't force users of the MIPS .section syntax to
12546      incorrectly label the sections as SHT_PROGBITS.  The best compromise
12547      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12548      generic type-checking code.  */
12549   if (section_type == SHT_MIPS_DWARF)
12550     section_type = SHT_PROGBITS;
12551
12552   obj_elf_change_section (section_name, section_type, section_flag,
12553                           section_entry_size, 0, 0, 0);
12554
12555   if (now_seg->name != section_name)
12556     free (section_name);
12557 #endif /* OBJ_ELF */
12558 }
12559
12560 void
12561 mips_enable_auto_align (void)
12562 {
12563   auto_align = 1;
12564 }
12565
12566 static void
12567 s_cons (int log_size)
12568 {
12569   segment_info_type *si = seg_info (now_seg);
12570   struct insn_label_list *l = si->label_list;
12571   symbolS *label;
12572
12573   label = l != NULL ? l->label : NULL;
12574   mips_emit_delays ();
12575   if (log_size > 0 && auto_align)
12576     mips_align (log_size, 0, label);
12577   mips_clear_insn_labels ();
12578   cons (1 << log_size);
12579 }
12580
12581 static void
12582 s_float_cons (int type)
12583 {
12584   segment_info_type *si = seg_info (now_seg);
12585   struct insn_label_list *l = si->label_list;
12586   symbolS *label;
12587
12588   label = l != NULL ? l->label : NULL;
12589
12590   mips_emit_delays ();
12591
12592   if (auto_align)
12593     {
12594       if (type == 'd')
12595         mips_align (3, 0, label);
12596       else
12597         mips_align (2, 0, label);
12598     }
12599
12600   mips_clear_insn_labels ();
12601
12602   float_cons (type);
12603 }
12604
12605 /* Handle .globl.  We need to override it because on Irix 5 you are
12606    permitted to say
12607        .globl foo .text
12608    where foo is an undefined symbol, to mean that foo should be
12609    considered to be the address of a function.  */
12610
12611 static void
12612 s_mips_globl (int x ATTRIBUTE_UNUSED)
12613 {
12614   char *name;
12615   int c;
12616   symbolS *symbolP;
12617   flagword flag;
12618
12619   do
12620     {
12621       name = input_line_pointer;
12622       c = get_symbol_end ();
12623       symbolP = symbol_find_or_make (name);
12624       S_SET_EXTERNAL (symbolP);
12625
12626       *input_line_pointer = c;
12627       SKIP_WHITESPACE ();
12628
12629       /* On Irix 5, every global symbol that is not explicitly labelled as
12630          being a function is apparently labelled as being an object.  */
12631       flag = BSF_OBJECT;
12632
12633       if (!is_end_of_line[(unsigned char) *input_line_pointer]
12634           && (*input_line_pointer != ','))
12635         {
12636           char *secname;
12637           asection *sec;
12638
12639           secname = input_line_pointer;
12640           c = get_symbol_end ();
12641           sec = bfd_get_section_by_name (stdoutput, secname);
12642           if (sec == NULL)
12643             as_bad (_("%s: no such section"), secname);
12644           *input_line_pointer = c;
12645
12646           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12647             flag = BSF_FUNCTION;
12648         }
12649
12650       symbol_get_bfdsym (symbolP)->flags |= flag;
12651
12652       c = *input_line_pointer;
12653       if (c == ',')
12654         {
12655           input_line_pointer++;
12656           SKIP_WHITESPACE ();
12657           if (is_end_of_line[(unsigned char) *input_line_pointer])
12658             c = '\n';
12659         }
12660     }
12661   while (c == ',');
12662
12663   demand_empty_rest_of_line ();
12664 }
12665
12666 static void
12667 s_option (int x ATTRIBUTE_UNUSED)
12668 {
12669   char *opt;
12670   char c;
12671
12672   opt = input_line_pointer;
12673   c = get_symbol_end ();
12674
12675   if (*opt == 'O')
12676     {
12677       /* FIXME: What does this mean?  */
12678     }
12679   else if (strncmp (opt, "pic", 3) == 0)
12680     {
12681       int i;
12682
12683       i = atoi (opt + 3);
12684       if (i == 0)
12685         mips_pic = NO_PIC;
12686       else if (i == 2)
12687         {
12688         mips_pic = SVR4_PIC;
12689           mips_abicalls = TRUE;
12690         }
12691       else
12692         as_bad (_(".option pic%d not supported"), i);
12693
12694       if (mips_pic == SVR4_PIC)
12695         {
12696           if (g_switch_seen && g_switch_value != 0)
12697             as_warn (_("-G may not be used with SVR4 PIC code"));
12698           g_switch_value = 0;
12699           bfd_set_gp_size (stdoutput, 0);
12700         }
12701     }
12702   else
12703     as_warn (_("Unrecognized option \"%s\""), opt);
12704
12705   *input_line_pointer = c;
12706   demand_empty_rest_of_line ();
12707 }
12708
12709 /* This structure is used to hold a stack of .set values.  */
12710
12711 struct mips_option_stack
12712 {
12713   struct mips_option_stack *next;
12714   struct mips_set_options options;
12715 };
12716
12717 static struct mips_option_stack *mips_opts_stack;
12718
12719 /* Handle the .set pseudo-op.  */
12720
12721 static void
12722 s_mipsset (int x ATTRIBUTE_UNUSED)
12723 {
12724   char *name = input_line_pointer, ch;
12725
12726   while (!is_end_of_line[(unsigned char) *input_line_pointer])
12727     ++input_line_pointer;
12728   ch = *input_line_pointer;
12729   *input_line_pointer = '\0';
12730
12731   if (strcmp (name, "reorder") == 0)
12732     {
12733       if (mips_opts.noreorder)
12734         end_noreorder ();
12735     }
12736   else if (strcmp (name, "noreorder") == 0)
12737     {
12738       if (!mips_opts.noreorder)
12739         start_noreorder ();
12740     }
12741   else if (strcmp (name, "at") == 0)
12742     {
12743       mips_opts.noat = 0;
12744     }
12745   else if (strcmp (name, "noat") == 0)
12746     {
12747       mips_opts.noat = 1;
12748     }
12749   else if (strcmp (name, "macro") == 0)
12750     {
12751       mips_opts.warn_about_macros = 0;
12752     }
12753   else if (strcmp (name, "nomacro") == 0)
12754     {
12755       if (mips_opts.noreorder == 0)
12756         as_bad (_("`noreorder' must be set before `nomacro'"));
12757       mips_opts.warn_about_macros = 1;
12758     }
12759   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12760     {
12761       mips_opts.nomove = 0;
12762     }
12763   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12764     {
12765       mips_opts.nomove = 1;
12766     }
12767   else if (strcmp (name, "bopt") == 0)
12768     {
12769       mips_opts.nobopt = 0;
12770     }
12771   else if (strcmp (name, "nobopt") == 0)
12772     {
12773       mips_opts.nobopt = 1;
12774     }
12775   else if (strcmp (name, "gp=default") == 0)
12776     mips_opts.gp32 = file_mips_gp32;
12777   else if (strcmp (name, "gp=32") == 0)
12778     mips_opts.gp32 = 1;
12779   else if (strcmp (name, "gp=64") == 0)
12780     {
12781       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
12782         as_warn ("%s isa does not support 64-bit registers",
12783                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12784       mips_opts.gp32 = 0;
12785     }
12786   else if (strcmp (name, "fp=default") == 0)
12787     mips_opts.fp32 = file_mips_fp32;
12788   else if (strcmp (name, "fp=32") == 0)
12789     mips_opts.fp32 = 1;
12790   else if (strcmp (name, "fp=64") == 0)
12791     {
12792       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12793         as_warn ("%s isa does not support 64-bit floating point registers",
12794                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12795       mips_opts.fp32 = 0;
12796     }
12797   else if (strcmp (name, "mips16") == 0
12798            || strcmp (name, "MIPS-16") == 0)
12799     mips_opts.mips16 = 1;
12800   else if (strcmp (name, "nomips16") == 0
12801            || strcmp (name, "noMIPS-16") == 0)
12802     mips_opts.mips16 = 0;
12803   else if (strcmp (name, "smartmips") == 0)
12804     {
12805       if (!ISA_SUPPORTS_SMARTMIPS)
12806         as_warn ("%s ISA does not support SmartMIPS ASE", 
12807                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12808       mips_opts.ase_smartmips = 1;
12809     }
12810   else if (strcmp (name, "nosmartmips") == 0)
12811     mips_opts.ase_smartmips = 0;
12812   else if (strcmp (name, "mips3d") == 0)
12813     mips_opts.ase_mips3d = 1;
12814   else if (strcmp (name, "nomips3d") == 0)
12815     mips_opts.ase_mips3d = 0;
12816   else if (strcmp (name, "mdmx") == 0)
12817     mips_opts.ase_mdmx = 1;
12818   else if (strcmp (name, "nomdmx") == 0)
12819     mips_opts.ase_mdmx = 0;
12820   else if (strcmp (name, "dsp") == 0)
12821     {
12822       if (!ISA_SUPPORTS_DSP_ASE)
12823         as_warn ("%s ISA does not support DSP ASE", 
12824                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12825       mips_opts.ase_dsp = 1;
12826       mips_opts.ase_dspr2 = 0;
12827     }
12828   else if (strcmp (name, "nodsp") == 0)
12829     {
12830       mips_opts.ase_dsp = 0;
12831       mips_opts.ase_dspr2 = 0;
12832     }
12833   else if (strcmp (name, "dspr2") == 0)
12834     {
12835       if (!ISA_SUPPORTS_DSPR2_ASE)
12836         as_warn ("%s ISA does not support DSP R2 ASE",
12837                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12838       mips_opts.ase_dspr2 = 1;
12839       mips_opts.ase_dsp = 1;
12840     }
12841   else if (strcmp (name, "nodspr2") == 0)
12842     {
12843       mips_opts.ase_dspr2 = 0;
12844       mips_opts.ase_dsp = 0;
12845     }
12846   else if (strcmp (name, "mt") == 0)
12847     {
12848       if (!ISA_SUPPORTS_MT_ASE)
12849         as_warn ("%s ISA does not support MT ASE", 
12850                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12851       mips_opts.ase_mt = 1;
12852     }
12853   else if (strcmp (name, "nomt") == 0)
12854     mips_opts.ase_mt = 0;
12855   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
12856     {
12857       int reset = 0;
12858
12859       /* Permit the user to change the ISA and architecture on the fly.
12860          Needless to say, misuse can cause serious problems.  */
12861       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
12862         {
12863           reset = 1;
12864           mips_opts.isa = file_mips_isa;
12865           mips_opts.arch = file_mips_arch;
12866         }
12867       else if (strncmp (name, "arch=", 5) == 0)
12868         {
12869           const struct mips_cpu_info *p;
12870
12871           p = mips_parse_cpu("internal use", name + 5);
12872           if (!p)
12873             as_bad (_("unknown architecture %s"), name + 5);
12874           else
12875             {
12876               mips_opts.arch = p->cpu;
12877               mips_opts.isa = p->isa;
12878             }
12879         }
12880       else if (strncmp (name, "mips", 4) == 0)
12881         {
12882           const struct mips_cpu_info *p;
12883
12884           p = mips_parse_cpu("internal use", name);
12885           if (!p)
12886             as_bad (_("unknown ISA level %s"), name + 4);
12887           else
12888             {
12889               mips_opts.arch = p->cpu;
12890               mips_opts.isa = p->isa;
12891             }
12892         }
12893       else
12894         as_bad (_("unknown ISA or architecture %s"), name);
12895
12896       switch (mips_opts.isa)
12897         {
12898         case  0:
12899           break;
12900         case ISA_MIPS1:
12901         case ISA_MIPS2:
12902         case ISA_MIPS32:
12903         case ISA_MIPS32R2:
12904           mips_opts.gp32 = 1;
12905           mips_opts.fp32 = 1;
12906           break;
12907         case ISA_MIPS3:
12908         case ISA_MIPS4:
12909         case ISA_MIPS5:
12910         case ISA_MIPS64:
12911         case ISA_MIPS64R2:
12912           mips_opts.gp32 = 0;
12913           mips_opts.fp32 = 0;
12914           break;
12915         default:
12916           as_bad (_("unknown ISA level %s"), name + 4);
12917           break;
12918         }
12919       if (reset)
12920         {
12921           mips_opts.gp32 = file_mips_gp32;
12922           mips_opts.fp32 = file_mips_fp32;
12923         }
12924     }
12925   else if (strcmp (name, "autoextend") == 0)
12926     mips_opts.noautoextend = 0;
12927   else if (strcmp (name, "noautoextend") == 0)
12928     mips_opts.noautoextend = 1;
12929   else if (strcmp (name, "push") == 0)
12930     {
12931       struct mips_option_stack *s;
12932
12933       s = (struct mips_option_stack *) xmalloc (sizeof *s);
12934       s->next = mips_opts_stack;
12935       s->options = mips_opts;
12936       mips_opts_stack = s;
12937     }
12938   else if (strcmp (name, "pop") == 0)
12939     {
12940       struct mips_option_stack *s;
12941
12942       s = mips_opts_stack;
12943       if (s == NULL)
12944         as_bad (_(".set pop with no .set push"));
12945       else
12946         {
12947           /* If we're changing the reorder mode we need to handle
12948              delay slots correctly.  */
12949           if (s->options.noreorder && ! mips_opts.noreorder)
12950             start_noreorder ();
12951           else if (! s->options.noreorder && mips_opts.noreorder)
12952             end_noreorder ();
12953
12954           mips_opts = s->options;
12955           mips_opts_stack = s->next;
12956           free (s);
12957         }
12958     }
12959   else if (strcmp (name, "sym32") == 0)
12960     mips_opts.sym32 = TRUE;
12961   else if (strcmp (name, "nosym32") == 0)
12962     mips_opts.sym32 = FALSE;
12963   else if (strchr (name, ','))
12964     {
12965       /* Generic ".set" directive; use the generic handler.  */
12966       *input_line_pointer = ch;
12967       input_line_pointer = name;
12968       s_set (0);
12969       return;
12970     }
12971   else
12972     {
12973       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
12974     }
12975   *input_line_pointer = ch;
12976   demand_empty_rest_of_line ();
12977 }
12978
12979 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
12980    .option pic2.  It means to generate SVR4 PIC calls.  */
12981
12982 static void
12983 s_abicalls (int ignore ATTRIBUTE_UNUSED)
12984 {
12985   mips_pic = SVR4_PIC;
12986   mips_abicalls = TRUE;
12987
12988   if (g_switch_seen && g_switch_value != 0)
12989     as_warn (_("-G may not be used with SVR4 PIC code"));
12990   g_switch_value = 0;
12991
12992   bfd_set_gp_size (stdoutput, 0);
12993   demand_empty_rest_of_line ();
12994 }
12995
12996 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
12997    PIC code.  It sets the $gp register for the function based on the
12998    function address, which is in the register named in the argument.
12999    This uses a relocation against _gp_disp, which is handled specially
13000    by the linker.  The result is:
13001         lui     $gp,%hi(_gp_disp)
13002         addiu   $gp,$gp,%lo(_gp_disp)
13003         addu    $gp,$gp,.cpload argument
13004    The .cpload argument is normally $25 == $t9.
13005
13006    The -mno-shared option changes this to:
13007         lui     $gp,%hi(__gnu_local_gp)
13008         addiu   $gp,$gp,%lo(__gnu_local_gp)
13009    and the argument is ignored.  This saves an instruction, but the
13010    resulting code is not position independent; it uses an absolute
13011    address for __gnu_local_gp.  Thus code assembled with -mno-shared
13012    can go into an ordinary executable, but not into a shared library.  */
13013
13014 static void
13015 s_cpload (int ignore ATTRIBUTE_UNUSED)
13016 {
13017   expressionS ex;
13018   int reg;
13019   int in_shared;
13020
13021   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13022      .cpload is ignored.  */
13023   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13024     {
13025       s_ignore (0);
13026       return;
13027     }
13028
13029   /* .cpload should be in a .set noreorder section.  */
13030   if (mips_opts.noreorder == 0)
13031     as_warn (_(".cpload not in noreorder section"));
13032
13033   reg = tc_get_register (0);
13034
13035   /* If we need to produce a 64-bit address, we are better off using
13036      the default instruction sequence.  */
13037   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
13038
13039   ex.X_op = O_symbol;
13040   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13041                                          "__gnu_local_gp");
13042   ex.X_op_symbol = NULL;
13043   ex.X_add_number = 0;
13044
13045   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13046   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13047
13048   macro_start ();
13049   macro_build_lui (&ex, mips_gp_register);
13050   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13051                mips_gp_register, BFD_RELOC_LO16);
13052   if (in_shared)
13053     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13054                  mips_gp_register, reg);
13055   macro_end ();
13056
13057   demand_empty_rest_of_line ();
13058 }
13059
13060 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
13061      .cpsetup $reg1, offset|$reg2, label
13062
13063    If offset is given, this results in:
13064      sd         $gp, offset($sp)
13065      lui        $gp, %hi(%neg(%gp_rel(label)))
13066      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13067      daddu      $gp, $gp, $reg1
13068
13069    If $reg2 is given, this results in:
13070      daddu      $reg2, $gp, $0
13071      lui        $gp, %hi(%neg(%gp_rel(label)))
13072      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13073      daddu      $gp, $gp, $reg1
13074    $reg1 is normally $25 == $t9.
13075
13076    The -mno-shared option replaces the last three instructions with
13077         lui     $gp,%hi(_gp)
13078         addiu   $gp,$gp,%lo(_gp)  */
13079
13080 static void
13081 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
13082 {
13083   expressionS ex_off;
13084   expressionS ex_sym;
13085   int reg1;
13086
13087   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
13088      We also need NewABI support.  */
13089   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13090     {
13091       s_ignore (0);
13092       return;
13093     }
13094
13095   reg1 = tc_get_register (0);
13096   SKIP_WHITESPACE ();
13097   if (*input_line_pointer != ',')
13098     {
13099       as_bad (_("missing argument separator ',' for .cpsetup"));
13100       return;
13101     }
13102   else
13103     ++input_line_pointer;
13104   SKIP_WHITESPACE ();
13105   if (*input_line_pointer == '$')
13106     {
13107       mips_cpreturn_register = tc_get_register (0);
13108       mips_cpreturn_offset = -1;
13109     }
13110   else
13111     {
13112       mips_cpreturn_offset = get_absolute_expression ();
13113       mips_cpreturn_register = -1;
13114     }
13115   SKIP_WHITESPACE ();
13116   if (*input_line_pointer != ',')
13117     {
13118       as_bad (_("missing argument separator ',' for .cpsetup"));
13119       return;
13120     }
13121   else
13122     ++input_line_pointer;
13123   SKIP_WHITESPACE ();
13124   expression (&ex_sym);
13125
13126   macro_start ();
13127   if (mips_cpreturn_register == -1)
13128     {
13129       ex_off.X_op = O_constant;
13130       ex_off.X_add_symbol = NULL;
13131       ex_off.X_op_symbol = NULL;
13132       ex_off.X_add_number = mips_cpreturn_offset;
13133
13134       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
13135                    BFD_RELOC_LO16, SP);
13136     }
13137   else
13138     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
13139                  mips_gp_register, 0);
13140
13141   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
13142     {
13143       macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13144                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13145                    BFD_RELOC_HI16_S);
13146
13147       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13148                    mips_gp_register, -1, BFD_RELOC_GPREL16,
13149                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13150
13151       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13152                    mips_gp_register, reg1);
13153     }
13154   else
13155     {
13156       expressionS ex;
13157
13158       ex.X_op = O_symbol;
13159       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
13160       ex.X_op_symbol = NULL;
13161       ex.X_add_number = 0;
13162
13163       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13164       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13165
13166       macro_build_lui (&ex, mips_gp_register);
13167       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13168                    mips_gp_register, BFD_RELOC_LO16);
13169     }
13170
13171   macro_end ();
13172
13173   demand_empty_rest_of_line ();
13174 }
13175
13176 static void
13177 s_cplocal (int ignore ATTRIBUTE_UNUSED)
13178 {
13179   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
13180      .cplocal is ignored.  */
13181   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13182     {
13183       s_ignore (0);
13184       return;
13185     }
13186
13187   mips_gp_register = tc_get_register (0);
13188   demand_empty_rest_of_line ();
13189 }
13190
13191 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
13192    offset from $sp.  The offset is remembered, and after making a PIC
13193    call $gp is restored from that location.  */
13194
13195 static void
13196 s_cprestore (int ignore ATTRIBUTE_UNUSED)
13197 {
13198   expressionS ex;
13199
13200   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13201      .cprestore is ignored.  */
13202   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13203     {
13204       s_ignore (0);
13205       return;
13206     }
13207
13208   mips_cprestore_offset = get_absolute_expression ();
13209   mips_cprestore_valid = 1;
13210
13211   ex.X_op = O_constant;
13212   ex.X_add_symbol = NULL;
13213   ex.X_op_symbol = NULL;
13214   ex.X_add_number = mips_cprestore_offset;
13215
13216   macro_start ();
13217   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13218                                 SP, HAVE_64BIT_ADDRESSES);
13219   macro_end ();
13220
13221   demand_empty_rest_of_line ();
13222 }
13223
13224 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
13225    was given in the preceding .cpsetup, it results in:
13226      ld         $gp, offset($sp)
13227
13228    If a register $reg2 was given there, it results in:
13229      daddu      $gp, $reg2, $0  */
13230
13231 static void
13232 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
13233 {
13234   expressionS ex;
13235
13236   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13237      We also need NewABI support.  */
13238   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13239     {
13240       s_ignore (0);
13241       return;
13242     }
13243
13244   macro_start ();
13245   if (mips_cpreturn_register == -1)
13246     {
13247       ex.X_op = O_constant;
13248       ex.X_add_symbol = NULL;
13249       ex.X_op_symbol = NULL;
13250       ex.X_add_number = mips_cpreturn_offset;
13251
13252       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
13253     }
13254   else
13255     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
13256                  mips_cpreturn_register, 0);
13257   macro_end ();
13258
13259   demand_empty_rest_of_line ();
13260 }
13261
13262 /* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
13263    a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13264    use in DWARF debug information.  */
13265
13266 static void
13267 s_dtprel_internal (size_t bytes)
13268 {
13269   expressionS ex;
13270   char *p;
13271
13272   expression (&ex);
13273
13274   if (ex.X_op != O_symbol)
13275     {
13276       as_bad (_("Unsupported use of %s"), (bytes == 8
13277                                            ? ".dtpreldword"
13278                                            : ".dtprelword"));
13279       ignore_rest_of_line ();
13280     }
13281
13282   p = frag_more (bytes);
13283   md_number_to_chars (p, 0, bytes);
13284   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13285                (bytes == 8
13286                 ? BFD_RELOC_MIPS_TLS_DTPREL64
13287                 : BFD_RELOC_MIPS_TLS_DTPREL32));
13288
13289   demand_empty_rest_of_line ();
13290 }
13291
13292 /* Handle .dtprelword.  */
13293
13294 static void
13295 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13296 {
13297   s_dtprel_internal (4);
13298 }
13299
13300 /* Handle .dtpreldword.  */
13301
13302 static void
13303 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13304 {
13305   s_dtprel_internal (8);
13306 }
13307
13308 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
13309    code.  It sets the offset to use in gp_rel relocations.  */
13310
13311 static void
13312 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
13313 {
13314   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13315      We also need NewABI support.  */
13316   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13317     {
13318       s_ignore (0);
13319       return;
13320     }
13321
13322   mips_gprel_offset = get_absolute_expression ();
13323
13324   demand_empty_rest_of_line ();
13325 }
13326
13327 /* Handle the .gpword pseudo-op.  This is used when generating PIC
13328    code.  It generates a 32 bit GP relative reloc.  */
13329
13330 static void
13331 s_gpword (int ignore ATTRIBUTE_UNUSED)
13332 {
13333   segment_info_type *si;
13334   struct insn_label_list *l;
13335   symbolS *label;
13336   expressionS ex;
13337   char *p;
13338
13339   /* When not generating PIC code, this is treated as .word.  */
13340   if (mips_pic != SVR4_PIC)
13341     {
13342       s_cons (2);
13343       return;
13344     }
13345
13346   si = seg_info (now_seg);
13347   l = si->label_list;
13348   label = l != NULL ? l->label : NULL;
13349   mips_emit_delays ();
13350   if (auto_align)
13351     mips_align (2, 0, label);
13352   mips_clear_insn_labels ();
13353
13354   expression (&ex);
13355
13356   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13357     {
13358       as_bad (_("Unsupported use of .gpword"));
13359       ignore_rest_of_line ();
13360     }
13361
13362   p = frag_more (4);
13363   md_number_to_chars (p, 0, 4);
13364   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13365                BFD_RELOC_GPREL32);
13366
13367   demand_empty_rest_of_line ();
13368 }
13369
13370 static void
13371 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13372 {
13373   segment_info_type *si;
13374   struct insn_label_list *l;
13375   symbolS *label;
13376   expressionS ex;
13377   char *p;
13378
13379   /* When not generating PIC code, this is treated as .dword.  */
13380   if (mips_pic != SVR4_PIC)
13381     {
13382       s_cons (3);
13383       return;
13384     }
13385
13386   si = seg_info (now_seg);
13387   l = si->label_list;
13388   label = l != NULL ? l->label : NULL;
13389   mips_emit_delays ();
13390   if (auto_align)
13391     mips_align (3, 0, label);
13392   mips_clear_insn_labels ();
13393
13394   expression (&ex);
13395
13396   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13397     {
13398       as_bad (_("Unsupported use of .gpdword"));
13399       ignore_rest_of_line ();
13400     }
13401
13402   p = frag_more (8);
13403   md_number_to_chars (p, 0, 8);
13404   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13405                BFD_RELOC_GPREL32)->fx_tcbit = 1;
13406
13407   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
13408   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13409            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13410
13411   demand_empty_rest_of_line ();
13412 }
13413
13414 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
13415    tables in SVR4 PIC code.  */
13416
13417 static void
13418 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13419 {
13420   int reg;
13421
13422   /* This is ignored when not generating SVR4 PIC code.  */
13423   if (mips_pic != SVR4_PIC)
13424     {
13425       s_ignore (0);
13426       return;
13427     }
13428
13429   /* Add $gp to the register named as an argument.  */
13430   macro_start ();
13431   reg = tc_get_register (0);
13432   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13433   macro_end ();
13434
13435   demand_empty_rest_of_line ();
13436 }
13437
13438 /* Handle the .insn pseudo-op.  This marks instruction labels in
13439    mips16 mode.  This permits the linker to handle them specially,
13440    such as generating jalx instructions when needed.  We also make
13441    them odd for the duration of the assembly, in order to generate the
13442    right sort of code.  We will make them even in the adjust_symtab
13443    routine, while leaving them marked.  This is convenient for the
13444    debugger and the disassembler.  The linker knows to make them odd
13445    again.  */
13446
13447 static void
13448 s_insn (int ignore ATTRIBUTE_UNUSED)
13449 {
13450   mips16_mark_labels ();
13451
13452   demand_empty_rest_of_line ();
13453 }
13454
13455 /* Handle a .stabn directive.  We need these in order to mark a label
13456    as being a mips16 text label correctly.  Sometimes the compiler
13457    will emit a label, followed by a .stabn, and then switch sections.
13458    If the label and .stabn are in mips16 mode, then the label is
13459    really a mips16 text label.  */
13460
13461 static void
13462 s_mips_stab (int type)
13463 {
13464   if (type == 'n')
13465     mips16_mark_labels ();
13466
13467   s_stab (type);
13468 }
13469
13470 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
13471
13472 static void
13473 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13474 {
13475   char *name;
13476   int c;
13477   symbolS *symbolP;
13478   expressionS exp;
13479
13480   name = input_line_pointer;
13481   c = get_symbol_end ();
13482   symbolP = symbol_find_or_make (name);
13483   S_SET_WEAK (symbolP);
13484   *input_line_pointer = c;
13485
13486   SKIP_WHITESPACE ();
13487
13488   if (! is_end_of_line[(unsigned char) *input_line_pointer])
13489     {
13490       if (S_IS_DEFINED (symbolP))
13491         {
13492           as_bad ("ignoring attempt to redefine symbol %s",
13493                   S_GET_NAME (symbolP));
13494           ignore_rest_of_line ();
13495           return;
13496         }
13497
13498       if (*input_line_pointer == ',')
13499         {
13500           ++input_line_pointer;
13501           SKIP_WHITESPACE ();
13502         }
13503
13504       expression (&exp);
13505       if (exp.X_op != O_symbol)
13506         {
13507           as_bad ("bad .weakext directive");
13508           ignore_rest_of_line ();
13509           return;
13510         }
13511       symbol_set_value_expression (symbolP, &exp);
13512     }
13513
13514   demand_empty_rest_of_line ();
13515 }
13516
13517 /* Parse a register string into a number.  Called from the ECOFF code
13518    to parse .frame.  The argument is non-zero if this is the frame
13519    register, so that we can record it in mips_frame_reg.  */
13520
13521 int
13522 tc_get_register (int frame)
13523 {
13524   unsigned int reg;
13525
13526   SKIP_WHITESPACE ();
13527   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13528     reg = 0;
13529   if (frame)
13530     {
13531       mips_frame_reg = reg != 0 ? reg : SP;
13532       mips_frame_reg_valid = 1;
13533       mips_cprestore_valid = 0;
13534     }
13535   return reg;
13536 }
13537
13538 valueT
13539 md_section_align (asection *seg, valueT addr)
13540 {
13541   int align = bfd_get_section_alignment (stdoutput, seg);
13542
13543   if (IS_ELF)
13544     {
13545       /* We don't need to align ELF sections to the full alignment.
13546          However, Irix 5 may prefer that we align them at least to a 16
13547          byte boundary.  We don't bother to align the sections if we
13548          are targeted for an embedded system.  */
13549       if (strcmp (TARGET_OS, "elf") == 0)
13550         return addr;
13551       if (align > 4)
13552         align = 4;
13553     }
13554
13555   return ((addr + (1 << align) - 1) & (-1 << align));
13556 }
13557
13558 /* Utility routine, called from above as well.  If called while the
13559    input file is still being read, it's only an approximation.  (For
13560    example, a symbol may later become defined which appeared to be
13561    undefined earlier.)  */
13562
13563 static int
13564 nopic_need_relax (symbolS *sym, int before_relaxing)
13565 {
13566   if (sym == 0)
13567     return 0;
13568
13569   if (g_switch_value > 0)
13570     {
13571       const char *symname;
13572       int change;
13573
13574       /* Find out whether this symbol can be referenced off the $gp
13575          register.  It can be if it is smaller than the -G size or if
13576          it is in the .sdata or .sbss section.  Certain symbols can
13577          not be referenced off the $gp, although it appears as though
13578          they can.  */
13579       symname = S_GET_NAME (sym);
13580       if (symname != (const char *) NULL
13581           && (strcmp (symname, "eprol") == 0
13582               || strcmp (symname, "etext") == 0
13583               || strcmp (symname, "_gp") == 0
13584               || strcmp (symname, "edata") == 0
13585               || strcmp (symname, "_fbss") == 0
13586               || strcmp (symname, "_fdata") == 0
13587               || strcmp (symname, "_ftext") == 0
13588               || strcmp (symname, "end") == 0
13589               || strcmp (symname, "_gp_disp") == 0))
13590         change = 1;
13591       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13592                && (0
13593 #ifndef NO_ECOFF_DEBUGGING
13594                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
13595                        && (symbol_get_obj (sym)->ecoff_extern_size
13596                            <= g_switch_value))
13597 #endif
13598                    /* We must defer this decision until after the whole
13599                       file has been read, since there might be a .extern
13600                       after the first use of this symbol.  */
13601                    || (before_relaxing
13602 #ifndef NO_ECOFF_DEBUGGING
13603                        && symbol_get_obj (sym)->ecoff_extern_size == 0
13604 #endif
13605                        && S_GET_VALUE (sym) == 0)
13606                    || (S_GET_VALUE (sym) != 0
13607                        && S_GET_VALUE (sym) <= g_switch_value)))
13608         change = 0;
13609       else
13610         {
13611           const char *segname;
13612
13613           segname = segment_name (S_GET_SEGMENT (sym));
13614           assert (strcmp (segname, ".lit8") != 0
13615                   && strcmp (segname, ".lit4") != 0);
13616           change = (strcmp (segname, ".sdata") != 0
13617                     && strcmp (segname, ".sbss") != 0
13618                     && strncmp (segname, ".sdata.", 7) != 0
13619                     && strncmp (segname, ".sbss.", 6) != 0
13620                     && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
13621                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13622         }
13623       return change;
13624     }
13625   else
13626     /* We are not optimizing for the $gp register.  */
13627     return 1;
13628 }
13629
13630
13631 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
13632
13633 static bfd_boolean
13634 pic_need_relax (symbolS *sym, asection *segtype)
13635 {
13636   asection *symsec;
13637
13638   /* Handle the case of a symbol equated to another symbol.  */
13639   while (symbol_equated_reloc_p (sym))
13640     {
13641       symbolS *n;
13642
13643       /* It's possible to get a loop here in a badly written program.  */
13644       n = symbol_get_value_expression (sym)->X_add_symbol;
13645       if (n == sym)
13646         break;
13647       sym = n;
13648     }
13649
13650   if (symbol_section_p (sym))
13651     return TRUE;
13652
13653   symsec = S_GET_SEGMENT (sym);
13654
13655   /* This must duplicate the test in adjust_reloc_syms.  */
13656   return (symsec != &bfd_und_section
13657           && symsec != &bfd_abs_section
13658           && !bfd_is_com_section (symsec)
13659           && !s_is_linkonce (sym, segtype)
13660 #ifdef OBJ_ELF
13661           /* A global or weak symbol is treated as external.  */
13662           && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13663 #endif
13664           );
13665 }
13666
13667
13668 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13669    extended opcode.  SEC is the section the frag is in.  */
13670
13671 static int
13672 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13673 {
13674   int type;
13675   const struct mips16_immed_operand *op;
13676   offsetT val;
13677   int mintiny, maxtiny;
13678   segT symsec;
13679   fragS *sym_frag;
13680
13681   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13682     return 0;
13683   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13684     return 1;
13685
13686   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13687   op = mips16_immed_operands;
13688   while (op->type != type)
13689     {
13690       ++op;
13691       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13692     }
13693
13694   if (op->unsp)
13695     {
13696       if (type == '<' || type == '>' || type == '[' || type == ']')
13697         {
13698           mintiny = 1;
13699           maxtiny = 1 << op->nbits;
13700         }
13701       else
13702         {
13703           mintiny = 0;
13704           maxtiny = (1 << op->nbits) - 1;
13705         }
13706     }
13707   else
13708     {
13709       mintiny = - (1 << (op->nbits - 1));
13710       maxtiny = (1 << (op->nbits - 1)) - 1;
13711     }
13712
13713   sym_frag = symbol_get_frag (fragp->fr_symbol);
13714   val = S_GET_VALUE (fragp->fr_symbol);
13715   symsec = S_GET_SEGMENT (fragp->fr_symbol);
13716
13717   if (op->pcrel)
13718     {
13719       addressT addr;
13720
13721       /* We won't have the section when we are called from
13722          mips_relax_frag.  However, we will always have been called
13723          from md_estimate_size_before_relax first.  If this is a
13724          branch to a different section, we mark it as such.  If SEC is
13725          NULL, and the frag is not marked, then it must be a branch to
13726          the same section.  */
13727       if (sec == NULL)
13728         {
13729           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13730             return 1;
13731         }
13732       else
13733         {
13734           /* Must have been called from md_estimate_size_before_relax.  */
13735           if (symsec != sec)
13736             {
13737               fragp->fr_subtype =
13738                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13739
13740               /* FIXME: We should support this, and let the linker
13741                  catch branches and loads that are out of range.  */
13742               as_bad_where (fragp->fr_file, fragp->fr_line,
13743                             _("unsupported PC relative reference to different section"));
13744
13745               return 1;
13746             }
13747           if (fragp != sym_frag && sym_frag->fr_address == 0)
13748             /* Assume non-extended on the first relaxation pass.
13749                The address we have calculated will be bogus if this is
13750                a forward branch to another frag, as the forward frag
13751                will have fr_address == 0.  */
13752             return 0;
13753         }
13754
13755       /* In this case, we know for sure that the symbol fragment is in
13756          the same section.  If the relax_marker of the symbol fragment
13757          differs from the relax_marker of this fragment, we have not
13758          yet adjusted the symbol fragment fr_address.  We want to add
13759          in STRETCH in order to get a better estimate of the address.
13760          This particularly matters because of the shift bits.  */
13761       if (stretch != 0
13762           && sym_frag->relax_marker != fragp->relax_marker)
13763         {
13764           fragS *f;
13765
13766           /* Adjust stretch for any alignment frag.  Note that if have
13767              been expanding the earlier code, the symbol may be
13768              defined in what appears to be an earlier frag.  FIXME:
13769              This doesn't handle the fr_subtype field, which specifies
13770              a maximum number of bytes to skip when doing an
13771              alignment.  */
13772           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
13773             {
13774               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13775                 {
13776                   if (stretch < 0)
13777                     stretch = - ((- stretch)
13778                                  & ~ ((1 << (int) f->fr_offset) - 1));
13779                   else
13780                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13781                   if (stretch == 0)
13782                     break;
13783                 }
13784             }
13785           if (f != NULL)
13786             val += stretch;
13787         }
13788
13789       addr = fragp->fr_address + fragp->fr_fix;
13790
13791       /* The base address rules are complicated.  The base address of
13792          a branch is the following instruction.  The base address of a
13793          PC relative load or add is the instruction itself, but if it
13794          is in a delay slot (in which case it can not be extended) use
13795          the address of the instruction whose delay slot it is in.  */
13796       if (type == 'p' || type == 'q')
13797         {
13798           addr += 2;
13799
13800           /* If we are currently assuming that this frag should be
13801              extended, then, the current address is two bytes
13802              higher.  */
13803           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13804             addr += 2;
13805
13806           /* Ignore the low bit in the target, since it will be set
13807              for a text label.  */
13808           if ((val & 1) != 0)
13809             --val;
13810         }
13811       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13812         addr -= 4;
13813       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13814         addr -= 2;
13815
13816       val -= addr & ~ ((1 << op->shift) - 1);
13817
13818       /* Branch offsets have an implicit 0 in the lowest bit.  */
13819       if (type == 'p' || type == 'q')
13820         val /= 2;
13821
13822       /* If any of the shifted bits are set, we must use an extended
13823          opcode.  If the address depends on the size of this
13824          instruction, this can lead to a loop, so we arrange to always
13825          use an extended opcode.  We only check this when we are in
13826          the main relaxation loop, when SEC is NULL.  */
13827       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13828         {
13829           fragp->fr_subtype =
13830             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13831           return 1;
13832         }
13833
13834       /* If we are about to mark a frag as extended because the value
13835          is precisely maxtiny + 1, then there is a chance of an
13836          infinite loop as in the following code:
13837              la $4,foo
13838              .skip      1020
13839              .align     2
13840            foo:
13841          In this case when the la is extended, foo is 0x3fc bytes
13842          away, so the la can be shrunk, but then foo is 0x400 away, so
13843          the la must be extended.  To avoid this loop, we mark the
13844          frag as extended if it was small, and is about to become
13845          extended with a value of maxtiny + 1.  */
13846       if (val == ((maxtiny + 1) << op->shift)
13847           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
13848           && sec == NULL)
13849         {
13850           fragp->fr_subtype =
13851             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13852           return 1;
13853         }
13854     }
13855   else if (symsec != absolute_section && sec != NULL)
13856     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
13857
13858   if ((val & ((1 << op->shift) - 1)) != 0
13859       || val < (mintiny << op->shift)
13860       || val > (maxtiny << op->shift))
13861     return 1;
13862   else
13863     return 0;
13864 }
13865
13866 /* Compute the length of a branch sequence, and adjust the
13867    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
13868    worst-case length is computed, with UPDATE being used to indicate
13869    whether an unconditional (-1), branch-likely (+1) or regular (0)
13870    branch is to be computed.  */
13871 static int
13872 relaxed_branch_length (fragS *fragp, asection *sec, int update)
13873 {
13874   bfd_boolean toofar;
13875   int length;
13876
13877   if (fragp
13878       && S_IS_DEFINED (fragp->fr_symbol)
13879       && sec == S_GET_SEGMENT (fragp->fr_symbol))
13880     {
13881       addressT addr;
13882       offsetT val;
13883
13884       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13885
13886       addr = fragp->fr_address + fragp->fr_fix + 4;
13887
13888       val -= addr;
13889
13890       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13891     }
13892   else if (fragp)
13893     /* If the symbol is not defined or it's in a different segment,
13894        assume the user knows what's going on and emit a short
13895        branch.  */
13896     toofar = FALSE;
13897   else
13898     toofar = TRUE;
13899
13900   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13901     fragp->fr_subtype
13902       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
13903                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
13904                              RELAX_BRANCH_LINK (fragp->fr_subtype),
13905                              toofar);
13906
13907   length = 4;
13908   if (toofar)
13909     {
13910       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
13911         length += 8;
13912
13913       if (mips_pic != NO_PIC)
13914         {
13915           /* Additional space for PIC loading of target address.  */
13916           length += 8;
13917           if (mips_opts.isa == ISA_MIPS1)
13918             /* Additional space for $at-stabilizing nop.  */
13919             length += 4;
13920         }
13921
13922       /* If branch is conditional.  */
13923       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
13924         length += 8;
13925     }
13926
13927   return length;
13928 }
13929
13930 /* Estimate the size of a frag before relaxing.  Unless this is the
13931    mips16, we are not really relaxing here, and the final size is
13932    encoded in the subtype information.  For the mips16, we have to
13933    decide whether we are using an extended opcode or not.  */
13934
13935 int
13936 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
13937 {
13938   int change;
13939
13940   if (RELAX_BRANCH_P (fragp->fr_subtype))
13941     {
13942
13943       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
13944
13945       return fragp->fr_var;
13946     }
13947
13948   if (RELAX_MIPS16_P (fragp->fr_subtype))
13949     /* We don't want to modify the EXTENDED bit here; it might get us
13950        into infinite loops.  We change it only in mips_relax_frag().  */
13951     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
13952
13953   if (mips_pic == NO_PIC)
13954     change = nopic_need_relax (fragp->fr_symbol, 0);
13955   else if (mips_pic == SVR4_PIC)
13956     change = pic_need_relax (fragp->fr_symbol, segtype);
13957   else if (mips_pic == VXWORKS_PIC)
13958     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
13959     change = 0;
13960   else
13961     abort ();
13962
13963   if (change)
13964     {
13965       fragp->fr_subtype |= RELAX_USE_SECOND;
13966       return -RELAX_FIRST (fragp->fr_subtype);
13967     }
13968   else
13969     return -RELAX_SECOND (fragp->fr_subtype);
13970 }
13971
13972 /* This is called to see whether a reloc against a defined symbol
13973    should be converted into a reloc against a section.  */
13974
13975 int
13976 mips_fix_adjustable (fixS *fixp)
13977 {
13978   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
13979       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13980     return 0;
13981
13982   if (fixp->fx_addsy == NULL)
13983     return 1;
13984
13985   /* If symbol SYM is in a mergeable section, relocations of the form
13986      SYM + 0 can usually be made section-relative.  The mergeable data
13987      is then identified by the section offset rather than by the symbol.
13988
13989      However, if we're generating REL LO16 relocations, the offset is split
13990      between the LO16 and parterning high part relocation.  The linker will
13991      need to recalculate the complete offset in order to correctly identify
13992      the merge data.
13993
13994      The linker has traditionally not looked for the parterning high part
13995      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
13996      placed anywhere.  Rather than break backwards compatibility by changing
13997      this, it seems better not to force the issue, and instead keep the
13998      original symbol.  This will work with either linker behavior.  */
13999   if ((fixp->fx_r_type == BFD_RELOC_LO16
14000        || fixp->fx_r_type == BFD_RELOC_MIPS16_LO16
14001        || reloc_needs_lo_p (fixp->fx_r_type))
14002       && HAVE_IN_PLACE_ADDENDS
14003       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
14004     return 0;
14005
14006 #ifdef OBJ_ELF
14007   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
14008      to a floating-point stub.  The same is true for non-R_MIPS16_26
14009      relocations against MIPS16 functions; in this case, the stub becomes
14010      the function's canonical address.
14011
14012      Floating-point stubs are stored in unique .mips16.call.* or
14013      .mips16.fn.* sections.  If a stub T for function F is in section S,
14014      the first relocation in section S must be against F; this is how the
14015      linker determines the target function.  All relocations that might
14016      resolve to T must also be against F.  We therefore have the following
14017      restrictions, which are given in an intentionally-redundant way:
14018
14019        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14020           symbols.
14021
14022        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14023           if that stub might be used.
14024
14025        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14026           symbols.
14027
14028        4. We cannot reduce a stub's relocations against MIPS16 symbols if
14029           that stub might be used.
14030
14031      There is a further restriction:
14032
14033        5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14034           on targets with in-place addends; the relocation field cannot
14035           encode the low bit.
14036
14037      For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14038      against a MIPS16 symbol.
14039
14040      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14041      relocation against some symbol R, no relocation against R may be
14042      reduced.  (Note that this deals with (2) as well as (1) because
14043      relocations against global symbols will never be reduced on ELF
14044      targets.)  This approach is a little simpler than trying to detect
14045      stub sections, and gives the "all or nothing" per-symbol consistency
14046      that we have for MIPS16 symbols.  */
14047   if (IS_ELF
14048       && fixp->fx_subsy == NULL
14049       && (S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
14050           || *symbol_get_tc (fixp->fx_addsy)))
14051     return 0;
14052 #endif
14053
14054   return 1;
14055 }
14056
14057 /* Translate internal representation of relocation info to BFD target
14058    format.  */
14059
14060 arelent **
14061 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
14062 {
14063   static arelent *retval[4];
14064   arelent *reloc;
14065   bfd_reloc_code_real_type code;
14066
14067   memset (retval, 0, sizeof(retval));
14068   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
14069   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14070   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
14071   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14072
14073   if (fixp->fx_pcrel)
14074     {
14075       assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
14076
14077       /* At this point, fx_addnumber is "symbol offset - pcrel address".
14078          Relocations want only the symbol offset.  */
14079       reloc->addend = fixp->fx_addnumber + reloc->address;
14080       if (!IS_ELF)
14081         {
14082           /* A gruesome hack which is a result of the gruesome gas
14083              reloc handling.  What's worse, for COFF (as opposed to
14084              ECOFF), we might need yet another copy of reloc->address.
14085              See bfd_install_relocation.  */
14086           reloc->addend += reloc->address;
14087         }
14088     }
14089   else
14090     reloc->addend = fixp->fx_addnumber;
14091
14092   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14093      entry to be used in the relocation's section offset.  */
14094   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14095     {
14096       reloc->address = reloc->addend;
14097       reloc->addend = 0;
14098     }
14099
14100   code = fixp->fx_r_type;
14101
14102   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
14103   if (reloc->howto == NULL)
14104     {
14105       as_bad_where (fixp->fx_file, fixp->fx_line,
14106                     _("Can not represent %s relocation in this object file format"),
14107                     bfd_get_reloc_code_name (code));
14108       retval[0] = NULL;
14109     }
14110
14111   return retval;
14112 }
14113
14114 /* Relax a machine dependent frag.  This returns the amount by which
14115    the current size of the frag should change.  */
14116
14117 int
14118 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
14119 {
14120   if (RELAX_BRANCH_P (fragp->fr_subtype))
14121     {
14122       offsetT old_var = fragp->fr_var;
14123
14124       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
14125
14126       return fragp->fr_var - old_var;
14127     }
14128
14129   if (! RELAX_MIPS16_P (fragp->fr_subtype))
14130     return 0;
14131
14132   if (mips16_extended_frag (fragp, NULL, stretch))
14133     {
14134       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14135         return 0;
14136       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14137       return 2;
14138     }
14139   else
14140     {
14141       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14142         return 0;
14143       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14144       return -2;
14145     }
14146
14147   return 0;
14148 }
14149
14150 /* Convert a machine dependent frag.  */
14151
14152 void
14153 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
14154 {
14155   if (RELAX_BRANCH_P (fragp->fr_subtype))
14156     {
14157       bfd_byte *buf;
14158       unsigned long insn;
14159       expressionS exp;
14160       fixS *fixp;
14161
14162       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14163
14164       if (target_big_endian)
14165         insn = bfd_getb32 (buf);
14166       else
14167         insn = bfd_getl32 (buf);
14168
14169       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14170         {
14171           /* We generate a fixup instead of applying it right now
14172              because, if there are linker relaxations, we're going to
14173              need the relocations.  */
14174           exp.X_op = O_symbol;
14175           exp.X_add_symbol = fragp->fr_symbol;
14176           exp.X_add_number = fragp->fr_offset;
14177
14178           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14179                               4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
14180           fixp->fx_file = fragp->fr_file;
14181           fixp->fx_line = fragp->fr_line;
14182
14183           md_number_to_chars ((char *) buf, insn, 4);
14184           buf += 4;
14185         }
14186       else
14187         {
14188           int i;
14189
14190           as_warn_where (fragp->fr_file, fragp->fr_line,
14191                          _("relaxed out-of-range branch into a jump"));
14192
14193           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14194             goto uncond;
14195
14196           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14197             {
14198               /* Reverse the branch.  */
14199               switch ((insn >> 28) & 0xf)
14200                 {
14201                 case 4:
14202                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14203                      have the condition reversed by tweaking a single
14204                      bit, and their opcodes all have 0x4???????.  */
14205                   assert ((insn & 0xf1000000) == 0x41000000);
14206                   insn ^= 0x00010000;
14207                   break;
14208
14209                 case 0:
14210                   /* bltz       0x04000000      bgez    0x04010000
14211                      bltzal     0x04100000      bgezal  0x04110000  */
14212                   assert ((insn & 0xfc0e0000) == 0x04000000);
14213                   insn ^= 0x00010000;
14214                   break;
14215
14216                 case 1:
14217                   /* beq        0x10000000      bne     0x14000000
14218                      blez       0x18000000      bgtz    0x1c000000  */
14219                   insn ^= 0x04000000;
14220                   break;
14221
14222                 default:
14223                   abort ();
14224                 }
14225             }
14226
14227           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14228             {
14229               /* Clear the and-link bit.  */
14230               assert ((insn & 0xfc1c0000) == 0x04100000);
14231
14232               /* bltzal         0x04100000      bgezal  0x04110000
14233                  bltzall        0x04120000      bgezall 0x04130000  */
14234               insn &= ~0x00100000;
14235             }
14236
14237           /* Branch over the branch (if the branch was likely) or the
14238              full jump (not likely case).  Compute the offset from the
14239              current instruction to branch to.  */
14240           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14241             i = 16;
14242           else
14243             {
14244               /* How many bytes in instructions we've already emitted?  */
14245               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14246               /* How many bytes in instructions from here to the end?  */
14247               i = fragp->fr_var - i;
14248             }
14249           /* Convert to instruction count.  */
14250           i >>= 2;
14251           /* Branch counts from the next instruction.  */
14252           i--;
14253           insn |= i;
14254           /* Branch over the jump.  */
14255           md_number_to_chars ((char *) buf, insn, 4);
14256           buf += 4;
14257
14258           /* nop */
14259           md_number_to_chars ((char *) buf, 0, 4);
14260           buf += 4;
14261
14262           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14263             {
14264               /* beql $0, $0, 2f */
14265               insn = 0x50000000;
14266               /* Compute the PC offset from the current instruction to
14267                  the end of the variable frag.  */
14268               /* How many bytes in instructions we've already emitted?  */
14269               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14270               /* How many bytes in instructions from here to the end?  */
14271               i = fragp->fr_var - i;
14272               /* Convert to instruction count.  */
14273               i >>= 2;
14274               /* Don't decrement i, because we want to branch over the
14275                  delay slot.  */
14276
14277               insn |= i;
14278               md_number_to_chars ((char *) buf, insn, 4);
14279               buf += 4;
14280
14281               md_number_to_chars ((char *) buf, 0, 4);
14282               buf += 4;
14283             }
14284
14285         uncond:
14286           if (mips_pic == NO_PIC)
14287             {
14288               /* j or jal.  */
14289               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14290                       ? 0x0c000000 : 0x08000000);
14291               exp.X_op = O_symbol;
14292               exp.X_add_symbol = fragp->fr_symbol;
14293               exp.X_add_number = fragp->fr_offset;
14294
14295               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14296                                   4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
14297               fixp->fx_file = fragp->fr_file;
14298               fixp->fx_line = fragp->fr_line;
14299
14300               md_number_to_chars ((char *) buf, insn, 4);
14301               buf += 4;
14302             }
14303           else
14304             {
14305               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
14306               insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
14307               exp.X_op = O_symbol;
14308               exp.X_add_symbol = fragp->fr_symbol;
14309               exp.X_add_number = fragp->fr_offset;
14310
14311               if (fragp->fr_offset)
14312                 {
14313                   exp.X_add_symbol = make_expr_symbol (&exp);
14314                   exp.X_add_number = 0;
14315                 }
14316
14317               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14318                                   4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
14319               fixp->fx_file = fragp->fr_file;
14320               fixp->fx_line = fragp->fr_line;
14321
14322               md_number_to_chars ((char *) buf, insn, 4);
14323               buf += 4;
14324
14325               if (mips_opts.isa == ISA_MIPS1)
14326                 {
14327                   /* nop */
14328                   md_number_to_chars ((char *) buf, 0, 4);
14329                   buf += 4;
14330                 }
14331
14332               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
14333               insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14334
14335               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14336                                   4, &exp, FALSE, BFD_RELOC_LO16);
14337               fixp->fx_file = fragp->fr_file;
14338               fixp->fx_line = fragp->fr_line;
14339
14340               md_number_to_chars ((char *) buf, insn, 4);
14341               buf += 4;
14342
14343               /* j(al)r $at.  */
14344               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14345                 insn = 0x0020f809;
14346               else
14347                 insn = 0x00200008;
14348
14349               md_number_to_chars ((char *) buf, insn, 4);
14350               buf += 4;
14351             }
14352         }
14353
14354       assert (buf == (bfd_byte *)fragp->fr_literal
14355               + fragp->fr_fix + fragp->fr_var);
14356
14357       fragp->fr_fix += fragp->fr_var;
14358
14359       return;
14360     }
14361
14362   if (RELAX_MIPS16_P (fragp->fr_subtype))
14363     {
14364       int type;
14365       const struct mips16_immed_operand *op;
14366       bfd_boolean small, ext;
14367       offsetT val;
14368       bfd_byte *buf;
14369       unsigned long insn;
14370       bfd_boolean use_extend;
14371       unsigned short extend;
14372
14373       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14374       op = mips16_immed_operands;
14375       while (op->type != type)
14376         ++op;
14377
14378       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14379         {
14380           small = FALSE;
14381           ext = TRUE;
14382         }
14383       else
14384         {
14385           small = TRUE;
14386           ext = FALSE;
14387         }
14388
14389       resolve_symbol_value (fragp->fr_symbol);
14390       val = S_GET_VALUE (fragp->fr_symbol);
14391       if (op->pcrel)
14392         {
14393           addressT addr;
14394
14395           addr = fragp->fr_address + fragp->fr_fix;
14396
14397           /* The rules for the base address of a PC relative reloc are
14398              complicated; see mips16_extended_frag.  */
14399           if (type == 'p' || type == 'q')
14400             {
14401               addr += 2;
14402               if (ext)
14403                 addr += 2;
14404               /* Ignore the low bit in the target, since it will be
14405                  set for a text label.  */
14406               if ((val & 1) != 0)
14407                 --val;
14408             }
14409           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14410             addr -= 4;
14411           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14412             addr -= 2;
14413
14414           addr &= ~ (addressT) ((1 << op->shift) - 1);
14415           val -= addr;
14416
14417           /* Make sure the section winds up with the alignment we have
14418              assumed.  */
14419           if (op->shift > 0)
14420             record_alignment (asec, op->shift);
14421         }
14422
14423       if (ext
14424           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14425               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14426         as_warn_where (fragp->fr_file, fragp->fr_line,
14427                        _("extended instruction in delay slot"));
14428
14429       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14430
14431       if (target_big_endian)
14432         insn = bfd_getb16 (buf);
14433       else
14434         insn = bfd_getl16 (buf);
14435
14436       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14437                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14438                     small, ext, &insn, &use_extend, &extend);
14439
14440       if (use_extend)
14441         {
14442           md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14443           fragp->fr_fix += 2;
14444           buf += 2;
14445         }
14446
14447       md_number_to_chars ((char *) buf, insn, 2);
14448       fragp->fr_fix += 2;
14449       buf += 2;
14450     }
14451   else
14452     {
14453       int first, second;
14454       fixS *fixp;
14455
14456       first = RELAX_FIRST (fragp->fr_subtype);
14457       second = RELAX_SECOND (fragp->fr_subtype);
14458       fixp = (fixS *) fragp->fr_opcode;
14459
14460       /* Possibly emit a warning if we've chosen the longer option.  */
14461       if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14462           == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14463         {
14464           const char *msg = macro_warning (fragp->fr_subtype);
14465           if (msg != 0)
14466             as_warn_where (fragp->fr_file, fragp->fr_line, msg);
14467         }
14468
14469       /* Go through all the fixups for the first sequence.  Disable them
14470          (by marking them as done) if we're going to use the second
14471          sequence instead.  */
14472       while (fixp
14473              && fixp->fx_frag == fragp
14474              && fixp->fx_where < fragp->fr_fix - second)
14475         {
14476           if (fragp->fr_subtype & RELAX_USE_SECOND)
14477             fixp->fx_done = 1;
14478           fixp = fixp->fx_next;
14479         }
14480
14481       /* Go through the fixups for the second sequence.  Disable them if
14482          we're going to use the first sequence, otherwise adjust their
14483          addresses to account for the relaxation.  */
14484       while (fixp && fixp->fx_frag == fragp)
14485         {
14486           if (fragp->fr_subtype & RELAX_USE_SECOND)
14487             fixp->fx_where -= first;
14488           else
14489             fixp->fx_done = 1;
14490           fixp = fixp->fx_next;
14491         }
14492
14493       /* Now modify the frag contents.  */
14494       if (fragp->fr_subtype & RELAX_USE_SECOND)
14495         {
14496           char *start;
14497
14498           start = fragp->fr_literal + fragp->fr_fix - first - second;
14499           memmove (start, start + first, second);
14500           fragp->fr_fix -= first;
14501         }
14502       else
14503         fragp->fr_fix -= second;
14504     }
14505 }
14506
14507 #ifdef OBJ_ELF
14508
14509 /* This function is called after the relocs have been generated.
14510    We've been storing mips16 text labels as odd.  Here we convert them
14511    back to even for the convenience of the debugger.  */
14512
14513 void
14514 mips_frob_file_after_relocs (void)
14515 {
14516   asymbol **syms;
14517   unsigned int count, i;
14518
14519   if (!IS_ELF)
14520     return;
14521
14522   syms = bfd_get_outsymbols (stdoutput);
14523   count = bfd_get_symcount (stdoutput);
14524   for (i = 0; i < count; i++, syms++)
14525     {
14526       if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
14527           && ((*syms)->value & 1) != 0)
14528         {
14529           (*syms)->value &= ~1;
14530           /* If the symbol has an odd size, it was probably computed
14531              incorrectly, so adjust that as well.  */
14532           if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14533             ++elf_symbol (*syms)->internal_elf_sym.st_size;
14534         }
14535     }
14536 }
14537
14538 #endif
14539
14540 /* This function is called whenever a label is defined.  It is used
14541    when handling branch delays; if a branch has a label, we assume we
14542    can not move it.  */
14543
14544 void
14545 mips_define_label (symbolS *sym)
14546 {
14547   segment_info_type *si = seg_info (now_seg);
14548   struct insn_label_list *l;
14549
14550   if (free_insn_labels == NULL)
14551     l = (struct insn_label_list *) xmalloc (sizeof *l);
14552   else
14553     {
14554       l = free_insn_labels;
14555       free_insn_labels = l->next;
14556     }
14557
14558   l->label = sym;
14559   l->next = si->label_list;
14560   si->label_list = l;
14561
14562 #ifdef OBJ_ELF
14563   dwarf2_emit_label (sym);
14564 #endif
14565 }
14566 \f
14567 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14568
14569 /* Some special processing for a MIPS ELF file.  */
14570
14571 void
14572 mips_elf_final_processing (void)
14573 {
14574   /* Write out the register information.  */
14575   if (mips_abi != N64_ABI)
14576     {
14577       Elf32_RegInfo s;
14578
14579       s.ri_gprmask = mips_gprmask;
14580       s.ri_cprmask[0] = mips_cprmask[0];
14581       s.ri_cprmask[1] = mips_cprmask[1];
14582       s.ri_cprmask[2] = mips_cprmask[2];
14583       s.ri_cprmask[3] = mips_cprmask[3];
14584       /* The gp_value field is set by the MIPS ELF backend.  */
14585
14586       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14587                                        ((Elf32_External_RegInfo *)
14588                                         mips_regmask_frag));
14589     }
14590   else
14591     {
14592       Elf64_Internal_RegInfo s;
14593
14594       s.ri_gprmask = mips_gprmask;
14595       s.ri_pad = 0;
14596       s.ri_cprmask[0] = mips_cprmask[0];
14597       s.ri_cprmask[1] = mips_cprmask[1];
14598       s.ri_cprmask[2] = mips_cprmask[2];
14599       s.ri_cprmask[3] = mips_cprmask[3];
14600       /* The gp_value field is set by the MIPS ELF backend.  */
14601
14602       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14603                                        ((Elf64_External_RegInfo *)
14604                                         mips_regmask_frag));
14605     }
14606
14607   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
14608      sort of BFD interface for this.  */
14609   if (mips_any_noreorder)
14610     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14611   if (mips_pic != NO_PIC)
14612     {
14613     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
14614       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14615     }
14616   if (mips_abicalls)
14617     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14618
14619   /* Set MIPS ELF flags for ASEs.  */
14620   /* We may need to define a new flag for DSP ASE, and set this flag when
14621      file_ase_dsp is true.  */
14622   /* Same for DSP R2.  */
14623   /* We may need to define a new flag for MT ASE, and set this flag when
14624      file_ase_mt is true.  */
14625   if (file_ase_mips16)
14626     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
14627 #if 0 /* XXX FIXME */
14628   if (file_ase_mips3d)
14629     elf_elfheader (stdoutput)->e_flags |= ???;
14630 #endif
14631   if (file_ase_mdmx)
14632     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
14633
14634   /* Set the MIPS ELF ABI flags.  */
14635   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
14636     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
14637   else if (mips_abi == O64_ABI)
14638     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14639   else if (mips_abi == EABI_ABI)
14640     {
14641       if (!file_mips_gp32)
14642         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14643       else
14644         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14645     }
14646   else if (mips_abi == N32_ABI)
14647     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14648
14649   /* Nothing to do for N64_ABI.  */
14650
14651   if (mips_32bitmode)
14652     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14653
14654 #if 0 /* XXX FIXME */
14655   /* 32 bit code with 64 bit FP registers.  */
14656   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
14657     elf_elfheader (stdoutput)->e_flags |= ???;
14658 #endif
14659 }
14660
14661 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14662 \f
14663 typedef struct proc {
14664   symbolS *func_sym;
14665   symbolS *func_end_sym;
14666   unsigned long reg_mask;
14667   unsigned long reg_offset;
14668   unsigned long fpreg_mask;
14669   unsigned long fpreg_offset;
14670   unsigned long frame_offset;
14671   unsigned long frame_reg;
14672   unsigned long pc_reg;
14673 } procS;
14674
14675 static procS cur_proc;
14676 static procS *cur_proc_ptr;
14677 static int numprocs;
14678
14679 /* Fill in an rs_align_code fragment.  */
14680
14681 void
14682 mips_handle_align (fragS *fragp)
14683 {
14684   if (fragp->fr_type != rs_align_code)
14685     return;
14686
14687   if (mips_opts.mips16)
14688     {
14689       static const unsigned char be_nop[] = { 0x65, 0x00 };
14690       static const unsigned char le_nop[] = { 0x00, 0x65 };
14691
14692       int bytes;
14693       char *p;
14694
14695       bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14696       p = fragp->fr_literal + fragp->fr_fix;
14697
14698       if (bytes & 1)
14699         {
14700           *p++ = 0;
14701           fragp->fr_fix++;
14702         }
14703
14704       memcpy (p, (target_big_endian ? be_nop : le_nop), 2);
14705       fragp->fr_var = 2;
14706     }
14707
14708   /* For mips32, a nop is a zero, which we trivially get by doing nothing.  */
14709 }
14710
14711 static void
14712 md_obj_begin (void)
14713 {
14714 }
14715
14716 static void
14717 md_obj_end (void)
14718 {
14719   /* Check for premature end, nesting errors, etc.  */
14720   if (cur_proc_ptr)
14721     as_warn (_("missing .end at end of assembly"));
14722 }
14723
14724 static long
14725 get_number (void)
14726 {
14727   int negative = 0;
14728   long val = 0;
14729
14730   if (*input_line_pointer == '-')
14731     {
14732       ++input_line_pointer;
14733       negative = 1;
14734     }
14735   if (!ISDIGIT (*input_line_pointer))
14736     as_bad (_("expected simple number"));
14737   if (input_line_pointer[0] == '0')
14738     {
14739       if (input_line_pointer[1] == 'x')
14740         {
14741           input_line_pointer += 2;
14742           while (ISXDIGIT (*input_line_pointer))
14743             {
14744               val <<= 4;
14745               val |= hex_value (*input_line_pointer++);
14746             }
14747           return negative ? -val : val;
14748         }
14749       else
14750         {
14751           ++input_line_pointer;
14752           while (ISDIGIT (*input_line_pointer))
14753             {
14754               val <<= 3;
14755               val |= *input_line_pointer++ - '0';
14756             }
14757           return negative ? -val : val;
14758         }
14759     }
14760   if (!ISDIGIT (*input_line_pointer))
14761     {
14762       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14763               *input_line_pointer, *input_line_pointer);
14764       as_warn (_("invalid number"));
14765       return -1;
14766     }
14767   while (ISDIGIT (*input_line_pointer))
14768     {
14769       val *= 10;
14770       val += *input_line_pointer++ - '0';
14771     }
14772   return negative ? -val : val;
14773 }
14774
14775 /* The .file directive; just like the usual .file directive, but there
14776    is an initial number which is the ECOFF file index.  In the non-ECOFF
14777    case .file implies DWARF-2.  */
14778
14779 static void
14780 s_mips_file (int x ATTRIBUTE_UNUSED)
14781 {
14782   static int first_file_directive = 0;
14783
14784   if (ECOFF_DEBUGGING)
14785     {
14786       get_number ();
14787       s_app_file (0);
14788     }
14789   else
14790     {
14791       char *filename;
14792
14793       filename = dwarf2_directive_file (0);
14794
14795       /* Versions of GCC up to 3.1 start files with a ".file"
14796          directive even for stabs output.  Make sure that this
14797          ".file" is handled.  Note that you need a version of GCC
14798          after 3.1 in order to support DWARF-2 on MIPS.  */
14799       if (filename != NULL && ! first_file_directive)
14800         {
14801           (void) new_logical_line (filename, -1);
14802           s_app_file_string (filename, 0);
14803         }
14804       first_file_directive = 1;
14805     }
14806 }
14807
14808 /* The .loc directive, implying DWARF-2.  */
14809
14810 static void
14811 s_mips_loc (int x ATTRIBUTE_UNUSED)
14812 {
14813   if (!ECOFF_DEBUGGING)
14814     dwarf2_directive_loc (0);
14815 }
14816
14817 /* The .end directive.  */
14818
14819 static void
14820 s_mips_end (int x ATTRIBUTE_UNUSED)
14821 {
14822   symbolS *p;
14823
14824   /* Following functions need their own .frame and .cprestore directives.  */
14825   mips_frame_reg_valid = 0;
14826   mips_cprestore_valid = 0;
14827
14828   if (!is_end_of_line[(unsigned char) *input_line_pointer])
14829     {
14830       p = get_symbol ();
14831       demand_empty_rest_of_line ();
14832     }
14833   else
14834     p = NULL;
14835
14836   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14837     as_warn (_(".end not in text section"));
14838
14839   if (!cur_proc_ptr)
14840     {
14841       as_warn (_(".end directive without a preceding .ent directive."));
14842       demand_empty_rest_of_line ();
14843       return;
14844     }
14845
14846   if (p != NULL)
14847     {
14848       assert (S_GET_NAME (p));
14849       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
14850         as_warn (_(".end symbol does not match .ent symbol."));
14851
14852       if (debug_type == DEBUG_STABS)
14853         stabs_generate_asm_endfunc (S_GET_NAME (p),
14854                                     S_GET_NAME (p));
14855     }
14856   else
14857     as_warn (_(".end directive missing or unknown symbol"));
14858
14859 #ifdef OBJ_ELF
14860   /* Create an expression to calculate the size of the function.  */
14861   if (p && cur_proc_ptr)
14862     {
14863       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
14864       expressionS *exp = xmalloc (sizeof (expressionS));
14865
14866       obj->size = exp;
14867       exp->X_op = O_subtract;
14868       exp->X_add_symbol = symbol_temp_new_now ();
14869       exp->X_op_symbol = p;
14870       exp->X_add_number = 0;
14871
14872       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
14873     }
14874
14875   /* Generate a .pdr section.  */
14876   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
14877     {
14878       segT saved_seg = now_seg;
14879       subsegT saved_subseg = now_subseg;
14880       valueT dot;
14881       expressionS exp;
14882       char *fragp;
14883
14884       dot = frag_now_fix ();
14885
14886 #ifdef md_flush_pending_output
14887       md_flush_pending_output ();
14888 #endif
14889
14890       assert (pdr_seg);
14891       subseg_set (pdr_seg, 0);
14892
14893       /* Write the symbol.  */
14894       exp.X_op = O_symbol;
14895       exp.X_add_symbol = p;
14896       exp.X_add_number = 0;
14897       emit_expr (&exp, 4);
14898
14899       fragp = frag_more (7 * 4);
14900
14901       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
14902       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
14903       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
14904       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
14905       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
14906       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
14907       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
14908
14909       subseg_set (saved_seg, saved_subseg);
14910     }
14911 #endif /* OBJ_ELF */
14912
14913   cur_proc_ptr = NULL;
14914 }
14915
14916 /* The .aent and .ent directives.  */
14917
14918 static void
14919 s_mips_ent (int aent)
14920 {
14921   symbolS *symbolP;
14922
14923   symbolP = get_symbol ();
14924   if (*input_line_pointer == ',')
14925     ++input_line_pointer;
14926   SKIP_WHITESPACE ();
14927   if (ISDIGIT (*input_line_pointer)
14928       || *input_line_pointer == '-')
14929     get_number ();
14930
14931   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14932     as_warn (_(".ent or .aent not in text section."));
14933
14934   if (!aent && cur_proc_ptr)
14935     as_warn (_("missing .end"));
14936
14937   if (!aent)
14938     {
14939       /* This function needs its own .frame and .cprestore directives.  */
14940       mips_frame_reg_valid = 0;
14941       mips_cprestore_valid = 0;
14942
14943       cur_proc_ptr = &cur_proc;
14944       memset (cur_proc_ptr, '\0', sizeof (procS));
14945
14946       cur_proc_ptr->func_sym = symbolP;
14947
14948       symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
14949
14950       ++numprocs;
14951
14952       if (debug_type == DEBUG_STABS)
14953         stabs_generate_asm_func (S_GET_NAME (symbolP),
14954                                  S_GET_NAME (symbolP));
14955     }
14956
14957   demand_empty_rest_of_line ();
14958 }
14959
14960 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
14961    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
14962    s_mips_frame is used so that we can set the PDR information correctly.
14963    We can't use the ecoff routines because they make reference to the ecoff
14964    symbol table (in the mdebug section).  */
14965
14966 static void
14967 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
14968 {
14969 #ifdef OBJ_ELF
14970   if (IS_ELF && !ECOFF_DEBUGGING)
14971     {
14972       long val;
14973
14974       if (cur_proc_ptr == (procS *) NULL)
14975         {
14976           as_warn (_(".frame outside of .ent"));
14977           demand_empty_rest_of_line ();
14978           return;
14979         }
14980
14981       cur_proc_ptr->frame_reg = tc_get_register (1);
14982
14983       SKIP_WHITESPACE ();
14984       if (*input_line_pointer++ != ','
14985           || get_absolute_expression_and_terminator (&val) != ',')
14986         {
14987           as_warn (_("Bad .frame directive"));
14988           --input_line_pointer;
14989           demand_empty_rest_of_line ();
14990           return;
14991         }
14992
14993       cur_proc_ptr->frame_offset = val;
14994       cur_proc_ptr->pc_reg = tc_get_register (0);
14995
14996       demand_empty_rest_of_line ();
14997     }
14998   else
14999 #endif /* OBJ_ELF */
15000     s_ignore (ignore);
15001 }
15002
15003 /* The .fmask and .mask directives. If the mdebug section is present
15004    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
15005    embedded targets, s_mips_mask is used so that we can set the PDR
15006    information correctly. We can't use the ecoff routines because they
15007    make reference to the ecoff symbol table (in the mdebug section).  */
15008
15009 static void
15010 s_mips_mask (int reg_type)
15011 {
15012 #ifdef OBJ_ELF
15013   if (IS_ELF && !ECOFF_DEBUGGING)
15014     {
15015       long mask, off;
15016
15017       if (cur_proc_ptr == (procS *) NULL)
15018         {
15019           as_warn (_(".mask/.fmask outside of .ent"));
15020           demand_empty_rest_of_line ();
15021           return;
15022         }
15023
15024       if (get_absolute_expression_and_terminator (&mask) != ',')
15025         {
15026           as_warn (_("Bad .mask/.fmask directive"));
15027           --input_line_pointer;
15028           demand_empty_rest_of_line ();
15029           return;
15030         }
15031
15032       off = get_absolute_expression ();
15033
15034       if (reg_type == 'F')
15035         {
15036           cur_proc_ptr->fpreg_mask = mask;
15037           cur_proc_ptr->fpreg_offset = off;
15038         }
15039       else
15040         {
15041           cur_proc_ptr->reg_mask = mask;
15042           cur_proc_ptr->reg_offset = off;
15043         }
15044
15045       demand_empty_rest_of_line ();
15046     }
15047   else
15048 #endif /* OBJ_ELF */
15049     s_ignore (reg_type);
15050 }
15051
15052 /* A table describing all the processors gas knows about.  Names are
15053    matched in the order listed.
15054
15055    To ease comparison, please keep this table in the same order as
15056    gcc's mips_cpu_info_table[].  */
15057 static const struct mips_cpu_info mips_cpu_info_table[] =
15058 {
15059   /* Entries for generic ISAs */
15060   { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
15061   { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
15062   { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
15063   { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
15064   { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
15065   { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
15066   { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
15067   { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
15068   { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
15069
15070   /* MIPS I */
15071   { "r3000",          0,                        ISA_MIPS1,      CPU_R3000 },
15072   { "r2000",          0,                        ISA_MIPS1,      CPU_R3000 },
15073   { "r3900",          0,                        ISA_MIPS1,      CPU_R3900 },
15074
15075   /* MIPS II */
15076   { "r6000",          0,                        ISA_MIPS2,      CPU_R6000 },
15077
15078   /* MIPS III */
15079   { "r4000",          0,                        ISA_MIPS3,      CPU_R4000 },
15080   { "r4010",          0,                        ISA_MIPS2,      CPU_R4010 },
15081   { "vr4100",         0,                        ISA_MIPS3,      CPU_VR4100 },
15082   { "vr4111",         0,                        ISA_MIPS3,      CPU_R4111 },
15083   { "vr4120",         0,                        ISA_MIPS3,      CPU_VR4120 },
15084   { "vr4130",         0,                        ISA_MIPS3,      CPU_VR4120 },
15085   { "vr4181",         0,                        ISA_MIPS3,      CPU_R4111 },
15086   { "vr4300",         0,                        ISA_MIPS3,      CPU_R4300 },
15087   { "r4400",          0,                        ISA_MIPS3,      CPU_R4400 },
15088   { "r4600",          0,                        ISA_MIPS3,      CPU_R4600 },
15089   { "orion",          0,                        ISA_MIPS3,      CPU_R4600 },
15090   { "r4650",          0,                        ISA_MIPS3,      CPU_R4650 },
15091
15092   /* MIPS IV */
15093   { "r8000",          0,                        ISA_MIPS4,      CPU_R8000 },
15094   { "r10000",         0,                        ISA_MIPS4,      CPU_R10000 },
15095   { "r12000",         0,                        ISA_MIPS4,      CPU_R12000 },
15096   { "vr5000",         0,                        ISA_MIPS4,      CPU_R5000 },
15097   { "vr5400",         0,                        ISA_MIPS4,      CPU_VR5400 },
15098   { "vr5500",         0,                        ISA_MIPS4,      CPU_VR5500 },
15099   { "rm5200",         0,                        ISA_MIPS4,      CPU_R5000 },
15100   { "rm5230",         0,                        ISA_MIPS4,      CPU_R5000 },
15101   { "rm5231",         0,                        ISA_MIPS4,      CPU_R5000 },
15102   { "rm5261",         0,                        ISA_MIPS4,      CPU_R5000 },
15103   { "rm5721",         0,                        ISA_MIPS4,      CPU_R5000 },
15104   { "rm7000",         0,                        ISA_MIPS4,      CPU_RM7000 },
15105   { "rm9000",         0,                        ISA_MIPS4,      CPU_RM9000 },
15106
15107   /* MIPS 32 */
15108   { "4kc",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15109   { "4km",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15110   { "4kp",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15111   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
15112
15113   /* MIPS 32 Release 2 */
15114   { "4kec",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15115   { "4kem",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15116   { "4kep",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15117   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
15118   { "m4k",            0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15119   { "m4kp",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15120   { "24kc",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15121   { "24kf",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15122   { "24kx",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15123   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
15124   { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15125   { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15126   { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15127   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
15128   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15129                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15130   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15131                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15132   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15133                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15134   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
15135   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15136                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15137   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15138                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15139   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15140                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15141
15142   /* MIPS 64 */
15143   { "5kc",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15144   { "5kf",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15145   { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15146   { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15147
15148   /* MIPS 64 Release 2 */
15149
15150   /* Broadcom SB-1 CPU core */
15151   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15152                                                 ISA_MIPS64,     CPU_SB1 },
15153   /* Broadcom SB-1A CPU core */
15154   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15155                                                 ISA_MIPS64,     CPU_SB1 },
15156
15157   /* Cavium Networks Octeon CPU core */
15158   { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
15159
15160   /* End marker */
15161   { NULL, 0, 0, 0 }
15162 };
15163
15164
15165 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15166    with a final "000" replaced by "k".  Ignore case.
15167
15168    Note: this function is shared between GCC and GAS.  */
15169
15170 static bfd_boolean
15171 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15172 {
15173   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15174     given++, canonical++;
15175
15176   return ((*given == 0 && *canonical == 0)
15177           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15178 }
15179
15180
15181 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15182    CPU name.  We've traditionally allowed a lot of variation here.
15183
15184    Note: this function is shared between GCC and GAS.  */
15185
15186 static bfd_boolean
15187 mips_matching_cpu_name_p (const char *canonical, const char *given)
15188 {
15189   /* First see if the name matches exactly, or with a final "000"
15190      turned into "k".  */
15191   if (mips_strict_matching_cpu_name_p (canonical, given))
15192     return TRUE;
15193
15194   /* If not, try comparing based on numerical designation alone.
15195      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
15196   if (TOLOWER (*given) == 'r')
15197     given++;
15198   if (!ISDIGIT (*given))
15199     return FALSE;
15200
15201   /* Skip over some well-known prefixes in the canonical name,
15202      hoping to find a number there too.  */
15203   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15204     canonical += 2;
15205   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15206     canonical += 2;
15207   else if (TOLOWER (canonical[0]) == 'r')
15208     canonical += 1;
15209
15210   return mips_strict_matching_cpu_name_p (canonical, given);
15211 }
15212
15213
15214 /* Parse an option that takes the name of a processor as its argument.
15215    OPTION is the name of the option and CPU_STRING is the argument.
15216    Return the corresponding processor enumeration if the CPU_STRING is
15217    recognized, otherwise report an error and return null.
15218
15219    A similar function exists in GCC.  */
15220
15221 static const struct mips_cpu_info *
15222 mips_parse_cpu (const char *option, const char *cpu_string)
15223 {
15224   const struct mips_cpu_info *p;
15225
15226   /* 'from-abi' selects the most compatible architecture for the given
15227      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
15228      EABIs, we have to decide whether we're using the 32-bit or 64-bit
15229      version.  Look first at the -mgp options, if given, otherwise base
15230      the choice on MIPS_DEFAULT_64BIT.
15231
15232      Treat NO_ABI like the EABIs.  One reason to do this is that the
15233      plain 'mips' and 'mips64' configs have 'from-abi' as their default
15234      architecture.  This code picks MIPS I for 'mips' and MIPS III for
15235      'mips64', just as we did in the days before 'from-abi'.  */
15236   if (strcasecmp (cpu_string, "from-abi") == 0)
15237     {
15238       if (ABI_NEEDS_32BIT_REGS (mips_abi))
15239         return mips_cpu_info_from_isa (ISA_MIPS1);
15240
15241       if (ABI_NEEDS_64BIT_REGS (mips_abi))
15242         return mips_cpu_info_from_isa (ISA_MIPS3);
15243
15244       if (file_mips_gp32 >= 0)
15245         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15246
15247       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15248                                      ? ISA_MIPS3
15249                                      : ISA_MIPS1);
15250     }
15251
15252   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
15253   if (strcasecmp (cpu_string, "default") == 0)
15254     return 0;
15255
15256   for (p = mips_cpu_info_table; p->name != 0; p++)
15257     if (mips_matching_cpu_name_p (p->name, cpu_string))
15258       return p;
15259
15260   as_bad ("Bad value (%s) for %s", cpu_string, option);
15261   return 0;
15262 }
15263
15264 /* Return the canonical processor information for ISA (a member of the
15265    ISA_MIPS* enumeration).  */
15266
15267 static const struct mips_cpu_info *
15268 mips_cpu_info_from_isa (int isa)
15269 {
15270   int i;
15271
15272   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15273     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
15274         && isa == mips_cpu_info_table[i].isa)
15275       return (&mips_cpu_info_table[i]);
15276
15277   return NULL;
15278 }
15279
15280 static const struct mips_cpu_info *
15281 mips_cpu_info_from_arch (int arch)
15282 {
15283   int i;
15284
15285   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15286     if (arch == mips_cpu_info_table[i].cpu)
15287       return (&mips_cpu_info_table[i]);
15288
15289   return NULL;
15290 }
15291 \f
15292 static void
15293 show (FILE *stream, const char *string, int *col_p, int *first_p)
15294 {
15295   if (*first_p)
15296     {
15297       fprintf (stream, "%24s", "");
15298       *col_p = 24;
15299     }
15300   else
15301     {
15302       fprintf (stream, ", ");
15303       *col_p += 2;
15304     }
15305
15306   if (*col_p + strlen (string) > 72)
15307     {
15308       fprintf (stream, "\n%24s", "");
15309       *col_p = 24;
15310     }
15311
15312   fprintf (stream, "%s", string);
15313   *col_p += strlen (string);
15314
15315   *first_p = 0;
15316 }
15317
15318 void
15319 md_show_usage (FILE *stream)
15320 {
15321   int column, first;
15322   size_t i;
15323
15324   fprintf (stream, _("\
15325 MIPS options:\n\
15326 -EB                     generate big endian output\n\
15327 -EL                     generate little endian output\n\
15328 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
15329 -G NUM                  allow referencing objects up to NUM bytes\n\
15330                         implicitly with the gp register [default 8]\n"));
15331   fprintf (stream, _("\
15332 -mips1                  generate MIPS ISA I instructions\n\
15333 -mips2                  generate MIPS ISA II instructions\n\
15334 -mips3                  generate MIPS ISA III instructions\n\
15335 -mips4                  generate MIPS ISA IV instructions\n\
15336 -mips5                  generate MIPS ISA V instructions\n\
15337 -mips32                 generate MIPS32 ISA instructions\n\
15338 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
15339 -mips64                 generate MIPS64 ISA instructions\n\
15340 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
15341 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
15342
15343   first = 1;
15344
15345   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15346     show (stream, mips_cpu_info_table[i].name, &column, &first);
15347   show (stream, "from-abi", &column, &first);
15348   fputc ('\n', stream);
15349
15350   fprintf (stream, _("\
15351 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15352 -no-mCPU                don't generate code specific to CPU.\n\
15353                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
15354
15355   first = 1;
15356
15357   show (stream, "3900", &column, &first);
15358   show (stream, "4010", &column, &first);
15359   show (stream, "4100", &column, &first);
15360   show (stream, "4650", &column, &first);
15361   fputc ('\n', stream);
15362
15363   fprintf (stream, _("\
15364 -mips16                 generate mips16 instructions\n\
15365 -no-mips16              do not generate mips16 instructions\n"));
15366   fprintf (stream, _("\
15367 -msmartmips             generate smartmips instructions\n\
15368 -mno-smartmips          do not generate smartmips instructions\n"));  
15369   fprintf (stream, _("\
15370 -mdsp                   generate DSP instructions\n\
15371 -mno-dsp                do not generate DSP instructions\n"));
15372   fprintf (stream, _("\
15373 -mdspr2                 generate DSP R2 instructions\n\
15374 -mno-dspr2              do not generate DSP R2 instructions\n"));
15375   fprintf (stream, _("\
15376 -mmt                    generate MT instructions\n\
15377 -mno-mt                 do not generate MT instructions\n"));
15378   fprintf (stream, _("\
15379 -mfix-vr4120            work around certain VR4120 errata\n\
15380 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
15381 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
15382 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
15383 -msym32                 assume all symbols have 32-bit values\n\
15384 -O0                     remove unneeded NOPs, do not swap branches\n\
15385 -O                      remove unneeded NOPs and swap branches\n\
15386 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
15387 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
15388 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
15389 #ifdef OBJ_ELF
15390   fprintf (stream, _("\
15391 -KPIC, -call_shared     generate SVR4 position independent code\n\
15392 -mvxworks-pic           generate VxWorks position independent code\n\
15393 -non_shared             do not generate position independent code\n\
15394 -xgot                   assume a 32 bit GOT\n\
15395 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
15396 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
15397                         position dependent (non shared) code\n\
15398 -mabi=ABI               create ABI conformant object file for:\n"));
15399
15400   first = 1;
15401
15402   show (stream, "32", &column, &first);
15403   show (stream, "o64", &column, &first);
15404   show (stream, "n32", &column, &first);
15405   show (stream, "64", &column, &first);
15406   show (stream, "eabi", &column, &first);
15407
15408   fputc ('\n', stream);
15409
15410   fprintf (stream, _("\
15411 -32                     create o32 ABI object file (default)\n\
15412 -n32                    create n32 ABI object file\n\
15413 -64                     create 64 ABI object file\n"));
15414 #endif
15415   fprintf (stream, _("\
15416 -mocteon-unsupported    error on unsupported Octeon instructions\n\
15417 -mno-octeon-unsupported do not error on unsupported Octeon instructions\n"));
15418   fprintf (stream, _("\
15419 -mocteon-useun    generate Octeon unaligned load/store instructions\n\
15420 -mno-octeon-useun generate MIPS unaligned load/store instructions\n"));
15421 }
15422
15423 enum dwarf2_format
15424 mips_dwarf2_format (void)
15425 {
15426   if (HAVE_64BIT_SYMBOLS)
15427     {
15428 #ifdef TE_IRIX
15429       return dwarf2_format_64bit_irix;
15430 #else
15431       return dwarf2_format_64bit;
15432 #endif
15433     }
15434   else
15435     return dwarf2_format_32bit;
15436 }
15437
15438 int
15439 mips_dwarf2_addr_size (void)
15440 {
15441   if (HAVE_64BIT_SYMBOLS)
15442     return 8;
15443   else
15444     return 4;
15445 }
15446
15447 /* Standard calling conventions leave the CFA at SP on entry.  */
15448 void
15449 mips_cfi_frame_initial_instructions (void)
15450 {
15451   cfi_add_CFA_def_cfa_register (SP);
15452 }
15453
15454 int
15455 tc_mips_regname_to_dw2regnum (char *regname)
15456 {
15457   unsigned int regnum = -1;
15458   unsigned int reg;
15459
15460   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15461     regnum = reg;
15462
15463   return regnum;
15464 }