OSDN Git Service

* config/obj-coff.c, config/tc-arm.c, config/tc-bfin.c,
[pf3gnuchains/pf3gnuchains3x.git] / gas / config / tc-mips.c
1 /* tc-mips.c -- assemble code for a MIPS chip.
2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3    2003, 2004, 2005 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 <stdarg.h>
32
33 #include "opcode/mips.h"
34 #include "itbl-ops.h"
35 #include "dwarf2dbg.h"
36 #include "dw2gencfi.h"
37
38 #ifdef DEBUG
39 #define DBG(x) printf x
40 #else
41 #define DBG(x)
42 #endif
43
44 #ifdef OBJ_MAYBE_ELF
45 /* Clean up namespace so we can include obj-elf.h too.  */
46 static int mips_output_flavor (void);
47 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
48 #undef OBJ_PROCESS_STAB
49 #undef OUTPUT_FLAVOR
50 #undef S_GET_ALIGN
51 #undef S_GET_SIZE
52 #undef S_SET_ALIGN
53 #undef S_SET_SIZE
54 #undef obj_frob_file
55 #undef obj_frob_file_after_relocs
56 #undef obj_frob_symbol
57 #undef obj_pop_insert
58 #undef obj_sec_sym_ok_for_reloc
59 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
60
61 #include "obj-elf.h"
62 /* Fix any of them that we actually care about.  */
63 #undef OUTPUT_FLAVOR
64 #define OUTPUT_FLAVOR mips_output_flavor()
65 #endif
66
67 #if defined (OBJ_ELF)
68 #include "elf/mips.h"
69 #endif
70
71 #ifndef ECOFF_DEBUGGING
72 #define NO_ECOFF_DEBUGGING
73 #define ECOFF_DEBUGGING 0
74 #endif
75
76 int mips_flag_mdebug = -1;
77
78 /* Control generation of .pdr sections.  Off by default on IRIX: the native
79    linker doesn't know about and discards them, but relocations against them
80    remain, leading to rld crashes.  */
81 #ifdef TE_IRIX
82 int mips_flag_pdr = FALSE;
83 #else
84 int mips_flag_pdr = TRUE;
85 #endif
86
87 #include "ecoff.h"
88
89 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
90 static char *mips_regmask_frag;
91 #endif
92
93 #define ZERO 0
94 #define AT  1
95 #define TREG 24
96 #define PIC_CALL_REG 25
97 #define KT0 26
98 #define KT1 27
99 #define GP  28
100 #define SP  29
101 #define FP  30
102 #define RA  31
103
104 #define ILLEGAL_REG (32)
105
106 /* Allow override of standard little-endian ECOFF format.  */
107
108 #ifndef ECOFF_LITTLE_FORMAT
109 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
110 #endif
111
112 extern int target_big_endian;
113
114 /* The name of the readonly data section.  */
115 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
116                             ? ".rdata" \
117                             : OUTPUT_FLAVOR == bfd_target_coff_flavour \
118                             ? ".rdata" \
119                             : OUTPUT_FLAVOR == bfd_target_elf_flavour \
120                             ? ".rodata" \
121                             : (abort (), ""))
122
123 /* Information about an instruction, including its format, operands
124    and fixups.  */
125 struct mips_cl_insn
126 {
127   /* The opcode's entry in mips_opcodes or mips16_opcodes.  */
128   const struct mips_opcode *insn_mo;
129
130   /* True if this is a mips16 instruction and if we want the extended
131      form of INSN_MO.  */
132   bfd_boolean use_extend;
133
134   /* The 16-bit extension instruction to use when USE_EXTEND is true.  */
135   unsigned short extend;
136
137   /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
138      a copy of INSN_MO->match with the operands filled in.  */
139   unsigned long insn_opcode;
140
141   /* The frag that contains the instruction.  */
142   struct frag *frag;
143
144   /* The offset into FRAG of the first instruction byte.  */
145   long where;
146
147   /* The relocs associated with the instruction, if any.  */
148   fixS *fixp[3];
149
150   /* True if this entry cannot be moved from its current position.  */
151   unsigned int fixed_p : 1;
152
153   /* True if this instruction occurred in a .set noreorder block.  */
154   unsigned int noreorder_p : 1;
155
156   /* True for mips16 instructions that jump to an absolute address.  */
157   unsigned int mips16_absolute_jump_p : 1;
158 };
159
160 /* The ABI to use.  */
161 enum mips_abi_level
162 {
163   NO_ABI = 0,
164   O32_ABI,
165   O64_ABI,
166   N32_ABI,
167   N64_ABI,
168   EABI_ABI
169 };
170
171 /* MIPS ABI we are using for this output file.  */
172 static enum mips_abi_level mips_abi = NO_ABI;
173
174 /* Whether or not we have code that can call pic code.  */
175 int mips_abicalls = FALSE;
176
177 /* Whether or not we have code which can be put into a shared
178    library.  */
179 static bfd_boolean mips_in_shared = TRUE;
180
181 /* This is the set of options which may be modified by the .set
182    pseudo-op.  We use a struct so that .set push and .set pop are more
183    reliable.  */
184
185 struct mips_set_options
186 {
187   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
188      if it has not been initialized.  Changed by `.set mipsN', and the
189      -mipsN command line option, and the default CPU.  */
190   int isa;
191   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
192      if they have not been initialized.  Changed by `.set <asename>', by
193      command line options, and based on the default architecture.  */
194   int ase_mips3d;
195   int ase_mdmx;
196   int ase_dsp;
197   int ase_mt;
198   /* Whether we are assembling for the mips16 processor.  0 if we are
199      not, 1 if we are, and -1 if the value has not been initialized.
200      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
201      -nomips16 command line options, and the default CPU.  */
202   int mips16;
203   /* Non-zero if we should not reorder instructions.  Changed by `.set
204      reorder' and `.set noreorder'.  */
205   int noreorder;
206   /* Non-zero if we should not permit the $at ($1) register to be used
207      in instructions.  Changed by `.set at' and `.set noat'.  */
208   int noat;
209   /* Non-zero if we should warn when a macro instruction expands into
210      more than one machine instruction.  Changed by `.set nomacro' and
211      `.set macro'.  */
212   int warn_about_macros;
213   /* Non-zero if we should not move instructions.  Changed by `.set
214      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
215   int nomove;
216   /* Non-zero if we should not optimize branches by moving the target
217      of the branch into the delay slot.  Actually, we don't perform
218      this optimization anyhow.  Changed by `.set bopt' and `.set
219      nobopt'.  */
220   int nobopt;
221   /* Non-zero if we should not autoextend mips16 instructions.
222      Changed by `.set autoextend' and `.set noautoextend'.  */
223   int noautoextend;
224   /* Restrict general purpose registers and floating point registers
225      to 32 bit.  This is initially determined when -mgp32 or -mfp32
226      is passed but can changed if the assembler code uses .set mipsN.  */
227   int gp32;
228   int fp32;
229   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
230      command line option, and the default CPU.  */
231   int arch;
232   /* True if ".set sym32" is in effect.  */
233   bfd_boolean sym32;
234 };
235
236 /* True if -mgp32 was passed.  */
237 static int file_mips_gp32 = -1;
238
239 /* True if -mfp32 was passed.  */
240 static int file_mips_fp32 = -1;
241
242 /* This is the struct we use to hold the current set of options.  Note
243    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
244    -1 to indicate that they have not been initialized.  */
245
246 static struct mips_set_options mips_opts =
247 {
248   ISA_UNKNOWN, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, CPU_UNKNOWN, FALSE
249 };
250
251 /* These variables are filled in with the masks of registers used.
252    The object format code reads them and puts them in the appropriate
253    place.  */
254 unsigned long mips_gprmask;
255 unsigned long mips_cprmask[4];
256
257 /* MIPS ISA we are using for this output file.  */
258 static int file_mips_isa = ISA_UNKNOWN;
259
260 /* True if -mips16 was passed or implied by arguments passed on the
261    command line (e.g., by -march).  */
262 static int file_ase_mips16;
263
264 /* True if -mips3d was passed or implied by arguments passed on the
265    command line (e.g., by -march).  */
266 static int file_ase_mips3d;
267
268 /* True if -mdmx was passed or implied by arguments passed on the
269    command line (e.g., by -march).  */
270 static int file_ase_mdmx;
271
272 /* True if -mdsp was passed or implied by arguments passed on the
273    command line (e.g., by -march).  */
274 static int file_ase_dsp;
275
276 /* True if -mmt was passed or implied by arguments passed on the
277    command line (e.g., by -march).  */
278 static int file_ase_mt;
279
280 /* The argument of the -march= flag.  The architecture we are assembling.  */
281 static int file_mips_arch = CPU_UNKNOWN;
282 static const char *mips_arch_string;
283
284 /* The argument of the -mtune= flag.  The architecture for which we
285    are optimizing.  */
286 static int mips_tune = CPU_UNKNOWN;
287 static const char *mips_tune_string;
288
289 /* True when generating 32-bit code for a 64-bit processor.  */
290 static int mips_32bitmode = 0;
291
292 /* True if the given ABI requires 32-bit registers.  */
293 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
294
295 /* Likewise 64-bit registers.  */
296 #define ABI_NEEDS_64BIT_REGS(ABI) \
297   ((ABI) == N32_ABI               \
298    || (ABI) == N64_ABI            \
299    || (ABI) == O64_ABI)
300
301 /*  Return true if ISA supports 64 bit gp register instructions.  */
302 #define ISA_HAS_64BIT_REGS(ISA) (    \
303    (ISA) == ISA_MIPS3                \
304    || (ISA) == ISA_MIPS4             \
305    || (ISA) == ISA_MIPS5             \
306    || (ISA) == ISA_MIPS64            \
307    || (ISA) == ISA_MIPS64R2          \
308    )
309
310 /* Return true if ISA supports 64-bit right rotate (dror et al.)
311    instructions.  */
312 #define ISA_HAS_DROR(ISA) (     \
313    (ISA) == ISA_MIPS64R2        \
314    )
315
316 /* Return true if ISA supports 32-bit right rotate (ror et al.)
317    instructions.  */
318 #define ISA_HAS_ROR(ISA) (      \
319    (ISA) == ISA_MIPS32R2        \
320    || (ISA) == ISA_MIPS64R2     \
321    )
322
323 #define HAVE_32BIT_GPRS                            \
324     (mips_opts.gp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
325
326 #define HAVE_32BIT_FPRS                            \
327     (mips_opts.fp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
328
329 #define HAVE_64BIT_GPRS (! HAVE_32BIT_GPRS)
330 #define HAVE_64BIT_FPRS (! HAVE_32BIT_FPRS)
331
332 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
333
334 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
335
336 /* True if relocations are stored in-place.  */
337 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
338
339 /* The ABI-derived address size.  */
340 #define HAVE_64BIT_ADDRESSES \
341   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
342 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
343
344 /* The size of symbolic constants (i.e., expressions of the form
345    "SYMBOL" or "SYMBOL + OFFSET").  */
346 #define HAVE_32BIT_SYMBOLS \
347   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
348 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
349
350 /* Addresses are loaded in different ways, depending on the address size
351    in use.  The n32 ABI Documentation also mandates the use of additions
352    with overflow checking, but existing implementations don't follow it.  */
353 #define ADDRESS_ADD_INSN                                                \
354    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
355
356 #define ADDRESS_ADDI_INSN                                               \
357    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
358
359 #define ADDRESS_LOAD_INSN                                               \
360    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
361
362 #define ADDRESS_STORE_INSN                                              \
363    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
364
365 /* Return true if the given CPU supports the MIPS16 ASE.  */
366 #define CPU_HAS_MIPS16(cpu)                                             \
367    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
368     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
369
370 /* Return true if the given CPU supports the MIPS3D ASE.  */
371 #define CPU_HAS_MIPS3D(cpu)     ((cpu) == CPU_SB1      \
372                                  )
373
374 /* Return true if the given CPU supports the MDMX ASE.  */
375 #define CPU_HAS_MDMX(cpu)       (FALSE                 \
376                                  )
377
378 /* Return true if the given CPU supports the DSP ASE.  */
379 #define CPU_HAS_DSP(cpu)        (FALSE                 \
380                                  )
381
382 /* Return true if the given CPU supports the MT ASE.  */
383 #define CPU_HAS_MT(cpu)         (FALSE                 \
384                                  )
385
386 /* True if CPU has a dror instruction.  */
387 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
388
389 /* True if CPU has a ror instruction.  */
390 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
391
392 /* True if mflo and mfhi can be immediately followed by instructions
393    which write to the HI and LO registers.
394
395    According to MIPS specifications, MIPS ISAs I, II, and III need
396    (at least) two instructions between the reads of HI/LO and
397    instructions which write them, and later ISAs do not.  Contradicting
398    the MIPS specifications, some MIPS IV processor user manuals (e.g.
399    the UM for the NEC Vr5000) document needing the instructions between
400    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
401    MIPS64 and later ISAs to have the interlocks, plus any specific
402    earlier-ISA CPUs for which CPU documentation declares that the
403    instructions are really interlocked.  */
404 #define hilo_interlocks \
405   (mips_opts.isa == ISA_MIPS32                        \
406    || mips_opts.isa == ISA_MIPS32R2                   \
407    || mips_opts.isa == ISA_MIPS64                     \
408    || mips_opts.isa == ISA_MIPS64R2                   \
409    || mips_opts.arch == CPU_R4010                     \
410    || mips_opts.arch == CPU_R10000                    \
411    || mips_opts.arch == CPU_R12000                    \
412    || mips_opts.arch == CPU_RM7000                    \
413    || mips_opts.arch == CPU_VR5500                    \
414    )
415
416 /* Whether the processor uses hardware interlocks to protect reads
417    from the GPRs after they are loaded from memory, and thus does not
418    require nops to be inserted.  This applies to instructions marked
419    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
420    level I.  */
421 #define gpr_interlocks \
422   (mips_opts.isa != ISA_MIPS1  \
423    || mips_opts.arch == CPU_R3900)
424
425 /* Whether the processor uses hardware interlocks to avoid delays
426    required by coprocessor instructions, and thus does not require
427    nops to be inserted.  This applies to instructions marked
428    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
429    between instructions marked INSN_WRITE_COND_CODE and ones marked
430    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
431    levels I, II, and III.  */
432 /* Itbl support may require additional care here.  */
433 #define cop_interlocks                                \
434   ((mips_opts.isa != ISA_MIPS1                        \
435     && mips_opts.isa != ISA_MIPS2                     \
436     && mips_opts.isa != ISA_MIPS3)                    \
437    || mips_opts.arch == CPU_R4300                     \
438    )
439
440 /* Whether the processor uses hardware interlocks to protect reads
441    from coprocessor registers after they are loaded from memory, and
442    thus does not require nops to be inserted.  This applies to
443    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
444    requires at MIPS ISA level I.  */
445 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
446
447 /* Is this a mfhi or mflo instruction?  */
448 #define MF_HILO_INSN(PINFO) \
449           ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
450
451 /* MIPS PIC level.  */
452
453 enum mips_pic_level mips_pic;
454
455 /* 1 if we should generate 32 bit offsets from the $gp register in
456    SVR4_PIC mode.  Currently has no meaning in other modes.  */
457 static int mips_big_got = 0;
458
459 /* 1 if trap instructions should used for overflow rather than break
460    instructions.  */
461 static int mips_trap = 0;
462
463 /* 1 if double width floating point constants should not be constructed
464    by assembling two single width halves into two single width floating
465    point registers which just happen to alias the double width destination
466    register.  On some architectures this aliasing can be disabled by a bit
467    in the status register, and the setting of this bit cannot be determined
468    automatically at assemble time.  */
469 static int mips_disable_float_construction;
470
471 /* Non-zero if any .set noreorder directives were used.  */
472
473 static int mips_any_noreorder;
474
475 /* Non-zero if nops should be inserted when the register referenced in
476    an mfhi/mflo instruction is read in the next two instructions.  */
477 static int mips_7000_hilo_fix;
478
479 /* The size of the small data section.  */
480 static unsigned int g_switch_value = 8;
481 /* Whether the -G option was used.  */
482 static int g_switch_seen = 0;
483
484 #define N_RMASK 0xc4
485 #define N_VFP   0xd4
486
487 /* If we can determine in advance that GP optimization won't be
488    possible, we can skip the relaxation stuff that tries to produce
489    GP-relative references.  This makes delay slot optimization work
490    better.
491
492    This function can only provide a guess, but it seems to work for
493    gcc output.  It needs to guess right for gcc, otherwise gcc
494    will put what it thinks is a GP-relative instruction in a branch
495    delay slot.
496
497    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
498    fixed it for the non-PIC mode.  KR 95/04/07  */
499 static int nopic_need_relax (symbolS *, int);
500
501 /* handle of the OPCODE hash table */
502 static struct hash_control *op_hash = NULL;
503
504 /* The opcode hash table we use for the mips16.  */
505 static struct hash_control *mips16_op_hash = NULL;
506
507 /* This array holds the chars that always start a comment.  If the
508     pre-processor is disabled, these aren't very useful */
509 const char comment_chars[] = "#";
510
511 /* This array holds the chars that only start a comment at the beginning of
512    a line.  If the line seems to have the form '# 123 filename'
513    .line and .file directives will appear in the pre-processed output */
514 /* Note that input_file.c hand checks for '#' at the beginning of the
515    first line of the input file.  This is because the compiler outputs
516    #NO_APP at the beginning of its output.  */
517 /* Also note that C style comments are always supported.  */
518 const char line_comment_chars[] = "#";
519
520 /* This array holds machine specific line separator characters.  */
521 const char line_separator_chars[] = ";";
522
523 /* Chars that can be used to separate mant from exp in floating point nums */
524 const char EXP_CHARS[] = "eE";
525
526 /* Chars that mean this number is a floating point constant */
527 /* As in 0f12.456 */
528 /* or    0d1.2345e12 */
529 const char FLT_CHARS[] = "rRsSfFdDxXpP";
530
531 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
532    changed in read.c .  Ideally it shouldn't have to know about it at all,
533    but nothing is ideal around here.
534  */
535
536 static char *insn_error;
537
538 static int auto_align = 1;
539
540 /* When outputting SVR4 PIC code, the assembler needs to know the
541    offset in the stack frame from which to restore the $gp register.
542    This is set by the .cprestore pseudo-op, and saved in this
543    variable.  */
544 static offsetT mips_cprestore_offset = -1;
545
546 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
547    more optimizations, it can use a register value instead of a memory-saved
548    offset and even an other register than $gp as global pointer.  */
549 static offsetT mips_cpreturn_offset = -1;
550 static int mips_cpreturn_register = -1;
551 static int mips_gp_register = GP;
552 static int mips_gprel_offset = 0;
553
554 /* Whether mips_cprestore_offset has been set in the current function
555    (or whether it has already been warned about, if not).  */
556 static int mips_cprestore_valid = 0;
557
558 /* This is the register which holds the stack frame, as set by the
559    .frame pseudo-op.  This is needed to implement .cprestore.  */
560 static int mips_frame_reg = SP;
561
562 /* Whether mips_frame_reg has been set in the current function
563    (or whether it has already been warned about, if not).  */
564 static int mips_frame_reg_valid = 0;
565
566 /* To output NOP instructions correctly, we need to keep information
567    about the previous two instructions.  */
568
569 /* Whether we are optimizing.  The default value of 2 means to remove
570    unneeded NOPs and swap branch instructions when possible.  A value
571    of 1 means to not swap branches.  A value of 0 means to always
572    insert NOPs.  */
573 static int mips_optimize = 2;
574
575 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
576    equivalent to seeing no -g option at all.  */
577 static int mips_debug = 0;
578
579 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
580 #define MAX_VR4130_NOPS 4
581
582 /* The maximum number of NOPs needed to fill delay slots.  */
583 #define MAX_DELAY_NOPS 2
584
585 /* The maximum number of NOPs needed for any purpose.  */
586 #define MAX_NOPS 4
587
588 /* A list of previous instructions, with index 0 being the most recent.
589    We need to look back MAX_NOPS instructions when filling delay slots
590    or working around processor errata.  We need to look back one
591    instruction further if we're thinking about using history[0] to
592    fill a branch delay slot.  */
593 static struct mips_cl_insn history[1 + MAX_NOPS];
594
595 /* Nop instructions used by emit_nop.  */
596 static struct mips_cl_insn nop_insn, mips16_nop_insn;
597
598 /* The appropriate nop for the current mode.  */
599 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
600
601 /* If this is set, it points to a frag holding nop instructions which
602    were inserted before the start of a noreorder section.  If those
603    nops turn out to be unnecessary, the size of the frag can be
604    decreased.  */
605 static fragS *prev_nop_frag;
606
607 /* The number of nop instructions we created in prev_nop_frag.  */
608 static int prev_nop_frag_holds;
609
610 /* The number of nop instructions that we know we need in
611    prev_nop_frag.  */
612 static int prev_nop_frag_required;
613
614 /* The number of instructions we've seen since prev_nop_frag.  */
615 static int prev_nop_frag_since;
616
617 /* For ECOFF and ELF, relocations against symbols are done in two
618    parts, with a HI relocation and a LO relocation.  Each relocation
619    has only 16 bits of space to store an addend.  This means that in
620    order for the linker to handle carries correctly, it must be able
621    to locate both the HI and the LO relocation.  This means that the
622    relocations must appear in order in the relocation table.
623
624    In order to implement this, we keep track of each unmatched HI
625    relocation.  We then sort them so that they immediately precede the
626    corresponding LO relocation.  */
627
628 struct mips_hi_fixup
629 {
630   /* Next HI fixup.  */
631   struct mips_hi_fixup *next;
632   /* This fixup.  */
633   fixS *fixp;
634   /* The section this fixup is in.  */
635   segT seg;
636 };
637
638 /* The list of unmatched HI relocs.  */
639
640 static struct mips_hi_fixup *mips_hi_fixup_list;
641
642 /* The frag containing the last explicit relocation operator.
643    Null if explicit relocations have not been used.  */
644
645 static fragS *prev_reloc_op_frag;
646
647 /* Map normal MIPS register numbers to mips16 register numbers.  */
648
649 #define X ILLEGAL_REG
650 static const int mips32_to_16_reg_map[] =
651 {
652   X, X, 2, 3, 4, 5, 6, 7,
653   X, X, X, X, X, X, X, X,
654   0, 1, X, X, X, X, X, X,
655   X, X, X, X, X, X, X, X
656 };
657 #undef X
658
659 /* Map mips16 register numbers to normal MIPS register numbers.  */
660
661 static const unsigned int mips16_to_32_reg_map[] =
662 {
663   16, 17, 2, 3, 4, 5, 6, 7
664 };
665
666 /* Classifies the kind of instructions we're interested in when
667    implementing -mfix-vr4120.  */
668 enum fix_vr4120_class {
669   FIX_VR4120_MACC,
670   FIX_VR4120_DMACC,
671   FIX_VR4120_MULT,
672   FIX_VR4120_DMULT,
673   FIX_VR4120_DIV,
674   FIX_VR4120_MTHILO,
675   NUM_FIX_VR4120_CLASSES
676 };
677
678 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
679    there must be at least one other instruction between an instruction
680    of type X and an instruction of type Y.  */
681 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
682
683 /* True if -mfix-vr4120 is in force.  */
684 static int mips_fix_vr4120;
685
686 /* ...likewise -mfix-vr4130.  */
687 static int mips_fix_vr4130;
688
689 /* We don't relax branches by default, since this causes us to expand
690    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
691    fail to compute the offset before expanding the macro to the most
692    efficient expansion.  */
693
694 static int mips_relax_branch;
695 \f
696 /* The expansion of many macros depends on the type of symbol that
697    they refer to.  For example, when generating position-dependent code,
698    a macro that refers to a symbol may have two different expansions,
699    one which uses GP-relative addresses and one which uses absolute
700    addresses.  When generating SVR4-style PIC, a macro may have
701    different expansions for local and global symbols.
702
703    We handle these situations by generating both sequences and putting
704    them in variant frags.  In position-dependent code, the first sequence
705    will be the GP-relative one and the second sequence will be the
706    absolute one.  In SVR4 PIC, the first sequence will be for global
707    symbols and the second will be for local symbols.
708
709    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
710    SECOND are the lengths of the two sequences in bytes.  These fields
711    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
712    the subtype has the following flags:
713
714    RELAX_USE_SECOND
715         Set if it has been decided that we should use the second
716         sequence instead of the first.
717
718    RELAX_SECOND_LONGER
719         Set in the first variant frag if the macro's second implementation
720         is longer than its first.  This refers to the macro as a whole,
721         not an individual relaxation.
722
723    RELAX_NOMACRO
724         Set in the first variant frag if the macro appeared in a .set nomacro
725         block and if one alternative requires a warning but the other does not.
726
727    RELAX_DELAY_SLOT
728         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
729         delay slot.
730
731    The frag's "opcode" points to the first fixup for relaxable code.
732
733    Relaxable macros are generated using a sequence such as:
734
735       relax_start (SYMBOL);
736       ... generate first expansion ...
737       relax_switch ();
738       ... generate second expansion ...
739       relax_end ();
740
741    The code and fixups for the unwanted alternative are discarded
742    by md_convert_frag.  */
743 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
744
745 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
746 #define RELAX_SECOND(X) ((X) & 0xff)
747 #define RELAX_USE_SECOND 0x10000
748 #define RELAX_SECOND_LONGER 0x20000
749 #define RELAX_NOMACRO 0x40000
750 #define RELAX_DELAY_SLOT 0x80000
751
752 /* Branch without likely bit.  If label is out of range, we turn:
753
754         beq reg1, reg2, label
755         delay slot
756
757    into
758
759         bne reg1, reg2, 0f
760         nop
761         j label
762      0: delay slot
763
764    with the following opcode replacements:
765
766         beq <-> bne
767         blez <-> bgtz
768         bltz <-> bgez
769         bc1f <-> bc1t
770
771         bltzal <-> bgezal  (with jal label instead of j label)
772
773    Even though keeping the delay slot instruction in the delay slot of
774    the branch would be more efficient, it would be very tricky to do
775    correctly, because we'd have to introduce a variable frag *after*
776    the delay slot instruction, and expand that instead.  Let's do it
777    the easy way for now, even if the branch-not-taken case now costs
778    one additional instruction.  Out-of-range branches are not supposed
779    to be common, anyway.
780
781    Branch likely.  If label is out of range, we turn:
782
783         beql reg1, reg2, label
784         delay slot (annulled if branch not taken)
785
786    into
787
788         beql reg1, reg2, 1f
789         nop
790         beql $0, $0, 2f
791         nop
792      1: j[al] label
793         delay slot (executed only if branch taken)
794      2:
795
796    It would be possible to generate a shorter sequence by losing the
797    likely bit, generating something like:
798
799         bne reg1, reg2, 0f
800         nop
801         j[al] label
802         delay slot (executed only if branch taken)
803      0:
804
805         beql -> bne
806         bnel -> beq
807         blezl -> bgtz
808         bgtzl -> blez
809         bltzl -> bgez
810         bgezl -> bltz
811         bc1fl -> bc1t
812         bc1tl -> bc1f
813
814         bltzall -> bgezal  (with jal label instead of j label)
815         bgezall -> bltzal  (ditto)
816
817
818    but it's not clear that it would actually improve performance.  */
819 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
820   ((relax_substateT) \
821    (0xc0000000 \
822     | ((toofar) ? 1 : 0) \
823     | ((link) ? 2 : 0) \
824     | ((likely) ? 4 : 0) \
825     | ((uncond) ? 8 : 0)))
826 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
827 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
828 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
829 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
830 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
831
832 /* For mips16 code, we use an entirely different form of relaxation.
833    mips16 supports two versions of most instructions which take
834    immediate values: a small one which takes some small value, and a
835    larger one which takes a 16 bit value.  Since branches also follow
836    this pattern, relaxing these values is required.
837
838    We can assemble both mips16 and normal MIPS code in a single
839    object.  Therefore, we need to support this type of relaxation at
840    the same time that we support the relaxation described above.  We
841    use the high bit of the subtype field to distinguish these cases.
842
843    The information we store for this type of relaxation is the
844    argument code found in the opcode file for this relocation, whether
845    the user explicitly requested a small or extended form, and whether
846    the relocation is in a jump or jal delay slot.  That tells us the
847    size of the value, and how it should be stored.  We also store
848    whether the fragment is considered to be extended or not.  We also
849    store whether this is known to be a branch to a different section,
850    whether we have tried to relax this frag yet, and whether we have
851    ever extended a PC relative fragment because of a shift count.  */
852 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
853   (0x80000000                                                   \
854    | ((type) & 0xff)                                            \
855    | ((small) ? 0x100 : 0)                                      \
856    | ((ext) ? 0x200 : 0)                                        \
857    | ((dslot) ? 0x400 : 0)                                      \
858    | ((jal_dslot) ? 0x800 : 0))
859 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
860 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
861 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
862 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
863 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
864 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
865 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
866 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
867 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
868 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
869 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
870 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
871
872 /* Is the given value a sign-extended 32-bit value?  */
873 #define IS_SEXT_32BIT_NUM(x)                                            \
874   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
875    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
876
877 /* Is the given value a sign-extended 16-bit value?  */
878 #define IS_SEXT_16BIT_NUM(x)                                            \
879   (((x) &~ (offsetT) 0x7fff) == 0                                       \
880    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
881
882 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
883 #define IS_ZEXT_32BIT_NUM(x)                                            \
884   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
885    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
886
887 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
888    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
889 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
890   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
891               | (((VALUE) & (MASK)) << (SHIFT)))
892
893 /* Extract bits MASK << SHIFT from STRUCT and shift them right
894    SHIFT places.  */
895 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
896   (((STRUCT) >> (SHIFT)) & (MASK))
897
898 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
899    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
900
901    include/opcode/mips.h specifies operand fields using the macros
902    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
903    with "MIPS16OP" instead of "OP".  */
904 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
905   INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
906 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
907   INSERT_BITS ((INSN).insn_opcode, VALUE, \
908                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
909
910 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
911 #define EXTRACT_OPERAND(FIELD, INSN) \
912   EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
913 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
914   EXTRACT_BITS ((INSN).insn_opcode, \
915                 MIPS16OP_MASK_##FIELD, \
916                 MIPS16OP_SH_##FIELD)
917 \f
918 /* Global variables used when generating relaxable macros.  See the
919    comment above RELAX_ENCODE for more details about how relaxation
920    is used.  */
921 static struct {
922   /* 0 if we're not emitting a relaxable macro.
923      1 if we're emitting the first of the two relaxation alternatives.
924      2 if we're emitting the second alternative.  */
925   int sequence;
926
927   /* The first relaxable fixup in the current frag.  (In other words,
928      the first fixup that refers to relaxable code.)  */
929   fixS *first_fixup;
930
931   /* sizes[0] says how many bytes of the first alternative are stored in
932      the current frag.  Likewise sizes[1] for the second alternative.  */
933   unsigned int sizes[2];
934
935   /* The symbol on which the choice of sequence depends.  */
936   symbolS *symbol;
937 } mips_relax;
938 \f
939 /* Global variables used to decide whether a macro needs a warning.  */
940 static struct {
941   /* True if the macro is in a branch delay slot.  */
942   bfd_boolean delay_slot_p;
943
944   /* For relaxable macros, sizes[0] is the length of the first alternative
945      in bytes and sizes[1] is the length of the second alternative.
946      For non-relaxable macros, both elements give the length of the
947      macro in bytes.  */
948   unsigned int sizes[2];
949
950   /* The first variant frag for this macro.  */
951   fragS *first_frag;
952 } mips_macro_warning;
953 \f
954 /* Prototypes for static functions.  */
955
956 #define internalError()                                                 \
957     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
958
959 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
960
961 static void append_insn
962   (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
963 static void mips_no_prev_insn (void);
964 static void mips16_macro_build
965   (expressionS *, const char *, const char *, va_list);
966 static void load_register (int, expressionS *, int);
967 static void macro_start (void);
968 static void macro_end (void);
969 static void macro (struct mips_cl_insn * ip);
970 static void mips16_macro (struct mips_cl_insn * ip);
971 #ifdef LOSING_COMPILER
972 static void macro2 (struct mips_cl_insn * ip);
973 #endif
974 static void mips_ip (char *str, struct mips_cl_insn * ip);
975 static void mips16_ip (char *str, struct mips_cl_insn * ip);
976 static void mips16_immed
977   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
978    unsigned long *, bfd_boolean *, unsigned short *);
979 static size_t my_getSmallExpression
980   (expressionS *, bfd_reloc_code_real_type *, char *);
981 static void my_getExpression (expressionS *, char *);
982 static void s_align (int);
983 static void s_change_sec (int);
984 static void s_change_section (int);
985 static void s_cons (int);
986 static void s_float_cons (int);
987 static void s_mips_globl (int);
988 static void s_option (int);
989 static void s_mipsset (int);
990 static void s_abicalls (int);
991 static void s_cpload (int);
992 static void s_cpsetup (int);
993 static void s_cplocal (int);
994 static void s_cprestore (int);
995 static void s_cpreturn (int);
996 static void s_gpvalue (int);
997 static void s_gpword (int);
998 static void s_gpdword (int);
999 static void s_cpadd (int);
1000 static void s_insn (int);
1001 static void md_obj_begin (void);
1002 static void md_obj_end (void);
1003 static void s_mips_ent (int);
1004 static void s_mips_end (int);
1005 static void s_mips_frame (int);
1006 static void s_mips_mask (int reg_type);
1007 static void s_mips_stab (int);
1008 static void s_mips_weakext (int);
1009 static void s_mips_file (int);
1010 static void s_mips_loc (int);
1011 static bfd_boolean pic_need_relax (symbolS *, asection *);
1012 static int relaxed_branch_length (fragS *, asection *, int);
1013 static int validate_mips_insn (const struct mips_opcode *);
1014
1015 /* Table and functions used to map between CPU/ISA names, and
1016    ISA levels, and CPU numbers.  */
1017
1018 struct mips_cpu_info
1019 {
1020   const char *name;           /* CPU or ISA name.  */
1021   int is_isa;                 /* Is this an ISA?  (If 0, a CPU.) */
1022   int isa;                    /* ISA level.  */
1023   int cpu;                    /* CPU number (default CPU if ISA).  */
1024 };
1025
1026 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1027 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1028 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1029 \f
1030 /* Pseudo-op table.
1031
1032    The following pseudo-ops from the Kane and Heinrich MIPS book
1033    should be defined here, but are currently unsupported: .alias,
1034    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1035
1036    The following pseudo-ops from the Kane and Heinrich MIPS book are
1037    specific to the type of debugging information being generated, and
1038    should be defined by the object format: .aent, .begin, .bend,
1039    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1040    .vreg.
1041
1042    The following pseudo-ops from the Kane and Heinrich MIPS book are
1043    not MIPS CPU specific, but are also not specific to the object file
1044    format.  This file is probably the best place to define them, but
1045    they are not currently supported: .asm0, .endr, .lab, .repeat,
1046    .struct.  */
1047
1048 static const pseudo_typeS mips_pseudo_table[] =
1049 {
1050   /* MIPS specific pseudo-ops.  */
1051   {"option", s_option, 0},
1052   {"set", s_mipsset, 0},
1053   {"rdata", s_change_sec, 'r'},
1054   {"sdata", s_change_sec, 's'},
1055   {"livereg", s_ignore, 0},
1056   {"abicalls", s_abicalls, 0},
1057   {"cpload", s_cpload, 0},
1058   {"cpsetup", s_cpsetup, 0},
1059   {"cplocal", s_cplocal, 0},
1060   {"cprestore", s_cprestore, 0},
1061   {"cpreturn", s_cpreturn, 0},
1062   {"gpvalue", s_gpvalue, 0},
1063   {"gpword", s_gpword, 0},
1064   {"gpdword", s_gpdword, 0},
1065   {"cpadd", s_cpadd, 0},
1066   {"insn", s_insn, 0},
1067
1068   /* Relatively generic pseudo-ops that happen to be used on MIPS
1069      chips.  */
1070   {"asciiz", stringer, 1},
1071   {"bss", s_change_sec, 'b'},
1072   {"err", s_err, 0},
1073   {"half", s_cons, 1},
1074   {"dword", s_cons, 3},
1075   {"weakext", s_mips_weakext, 0},
1076
1077   /* These pseudo-ops are defined in read.c, but must be overridden
1078      here for one reason or another.  */
1079   {"align", s_align, 0},
1080   {"byte", s_cons, 0},
1081   {"data", s_change_sec, 'd'},
1082   {"double", s_float_cons, 'd'},
1083   {"float", s_float_cons, 'f'},
1084   {"globl", s_mips_globl, 0},
1085   {"global", s_mips_globl, 0},
1086   {"hword", s_cons, 1},
1087   {"int", s_cons, 2},
1088   {"long", s_cons, 2},
1089   {"octa", s_cons, 4},
1090   {"quad", s_cons, 3},
1091   {"section", s_change_section, 0},
1092   {"short", s_cons, 1},
1093   {"single", s_float_cons, 'f'},
1094   {"stabn", s_mips_stab, 'n'},
1095   {"text", s_change_sec, 't'},
1096   {"word", s_cons, 2},
1097
1098   { "extern", ecoff_directive_extern, 0},
1099
1100   { NULL, NULL, 0 },
1101 };
1102
1103 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1104 {
1105   /* These pseudo-ops should be defined by the object file format.
1106      However, a.out doesn't support them, so we have versions here.  */
1107   {"aent", s_mips_ent, 1},
1108   {"bgnb", s_ignore, 0},
1109   {"end", s_mips_end, 0},
1110   {"endb", s_ignore, 0},
1111   {"ent", s_mips_ent, 0},
1112   {"file", s_mips_file, 0},
1113   {"fmask", s_mips_mask, 'F'},
1114   {"frame", s_mips_frame, 0},
1115   {"loc", s_mips_loc, 0},
1116   {"mask", s_mips_mask, 'R'},
1117   {"verstamp", s_ignore, 0},
1118   { NULL, NULL, 0 },
1119 };
1120
1121 extern void pop_insert (const pseudo_typeS *);
1122
1123 void
1124 mips_pop_insert (void)
1125 {
1126   pop_insert (mips_pseudo_table);
1127   if (! ECOFF_DEBUGGING)
1128     pop_insert (mips_nonecoff_pseudo_table);
1129 }
1130 \f
1131 /* Symbols labelling the current insn.  */
1132
1133 struct insn_label_list
1134 {
1135   struct insn_label_list *next;
1136   symbolS *label;
1137 };
1138
1139 static struct insn_label_list *insn_labels;
1140 static struct insn_label_list *free_insn_labels;
1141
1142 static void mips_clear_insn_labels (void);
1143
1144 static inline void
1145 mips_clear_insn_labels (void)
1146 {
1147   register struct insn_label_list **pl;
1148
1149   for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1150     ;
1151   *pl = insn_labels;
1152   insn_labels = NULL;
1153 }
1154 \f
1155 static char *expr_end;
1156
1157 /* Expressions which appear in instructions.  These are set by
1158    mips_ip.  */
1159
1160 static expressionS imm_expr;
1161 static expressionS imm2_expr;
1162 static expressionS offset_expr;
1163
1164 /* Relocs associated with imm_expr and offset_expr.  */
1165
1166 static bfd_reloc_code_real_type imm_reloc[3]
1167   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1168 static bfd_reloc_code_real_type offset_reloc[3]
1169   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1170
1171 /* These are set by mips16_ip if an explicit extension is used.  */
1172
1173 static bfd_boolean mips16_small, mips16_ext;
1174
1175 #ifdef OBJ_ELF
1176 /* The pdr segment for per procedure frame/regmask info.  Not used for
1177    ECOFF debugging.  */
1178
1179 static segT pdr_seg;
1180 #endif
1181
1182 /* The default target format to use.  */
1183
1184 const char *
1185 mips_target_format (void)
1186 {
1187   switch (OUTPUT_FLAVOR)
1188     {
1189     case bfd_target_ecoff_flavour:
1190       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1191     case bfd_target_coff_flavour:
1192       return "pe-mips";
1193     case bfd_target_elf_flavour:
1194 #ifdef TE_VXWORKS
1195       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1196         return (target_big_endian
1197                 ? "elf32-bigmips-vxworks"
1198                 : "elf32-littlemips-vxworks");
1199 #endif
1200 #ifdef TE_TMIPS
1201       /* This is traditional mips.  */
1202       return (target_big_endian
1203               ? (HAVE_64BIT_OBJECTS
1204                  ? "elf64-tradbigmips"
1205                  : (HAVE_NEWABI
1206                     ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1207               : (HAVE_64BIT_OBJECTS
1208                  ? "elf64-tradlittlemips"
1209                  : (HAVE_NEWABI
1210                     ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1211 #else
1212       return (target_big_endian
1213               ? (HAVE_64BIT_OBJECTS
1214                  ? "elf64-bigmips"
1215                  : (HAVE_NEWABI
1216                     ? "elf32-nbigmips" : "elf32-bigmips"))
1217               : (HAVE_64BIT_OBJECTS
1218                  ? "elf64-littlemips"
1219                  : (HAVE_NEWABI
1220                     ? "elf32-nlittlemips" : "elf32-littlemips")));
1221 #endif
1222     default:
1223       abort ();
1224       return NULL;
1225     }
1226 }
1227
1228 /* Return the length of instruction INSN.  */
1229
1230 static inline unsigned int
1231 insn_length (const struct mips_cl_insn *insn)
1232 {
1233   if (!mips_opts.mips16)
1234     return 4;
1235   return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1236 }
1237
1238 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1239
1240 static void
1241 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1242 {
1243   size_t i;
1244
1245   insn->insn_mo = mo;
1246   insn->use_extend = FALSE;
1247   insn->extend = 0;
1248   insn->insn_opcode = mo->match;
1249   insn->frag = NULL;
1250   insn->where = 0;
1251   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1252     insn->fixp[i] = NULL;
1253   insn->fixed_p = (mips_opts.noreorder > 0);
1254   insn->noreorder_p = (mips_opts.noreorder > 0);
1255   insn->mips16_absolute_jump_p = 0;
1256 }
1257
1258 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1259
1260 static void
1261 install_insn (const struct mips_cl_insn *insn)
1262 {
1263   char *f = insn->frag->fr_literal + insn->where;
1264   if (!mips_opts.mips16)
1265     md_number_to_chars (f, insn->insn_opcode, 4);
1266   else if (insn->mips16_absolute_jump_p)
1267     {
1268       md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1269       md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1270     }
1271   else
1272     {
1273       if (insn->use_extend)
1274         {
1275           md_number_to_chars (f, 0xf000 | insn->extend, 2);
1276           f += 2;
1277         }
1278       md_number_to_chars (f, insn->insn_opcode, 2);
1279     }
1280 }
1281
1282 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1283    and install the opcode in the new location.  */
1284
1285 static void
1286 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1287 {
1288   size_t i;
1289
1290   insn->frag = frag;
1291   insn->where = where;
1292   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1293     if (insn->fixp[i] != NULL)
1294       {
1295         insn->fixp[i]->fx_frag = frag;
1296         insn->fixp[i]->fx_where = where;
1297       }
1298   install_insn (insn);
1299 }
1300
1301 /* Add INSN to the end of the output.  */
1302
1303 static void
1304 add_fixed_insn (struct mips_cl_insn *insn)
1305 {
1306   char *f = frag_more (insn_length (insn));
1307   move_insn (insn, frag_now, f - frag_now->fr_literal);
1308 }
1309
1310 /* Start a variant frag and move INSN to the start of the variant part,
1311    marking it as fixed.  The other arguments are as for frag_var.  */
1312
1313 static void
1314 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1315                   relax_substateT subtype, symbolS *symbol, offsetT offset)
1316 {
1317   frag_grow (max_chars);
1318   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1319   insn->fixed_p = 1;
1320   frag_var (rs_machine_dependent, max_chars, var,
1321             subtype, symbol, offset, NULL);
1322 }
1323
1324 /* Insert N copies of INSN into the history buffer, starting at
1325    position FIRST.  Neither FIRST nor N need to be clipped.  */
1326
1327 static void
1328 insert_into_history (unsigned int first, unsigned int n,
1329                      const struct mips_cl_insn *insn)
1330 {
1331   if (mips_relax.sequence != 2)
1332     {
1333       unsigned int i;
1334
1335       for (i = ARRAY_SIZE (history); i-- > first;)
1336         if (i >= first + n)
1337           history[i] = history[i - n];
1338         else
1339           history[i] = *insn;
1340     }
1341 }
1342
1343 /* Emit a nop instruction, recording it in the history buffer.  */
1344
1345 static void
1346 emit_nop (void)
1347 {
1348   add_fixed_insn (NOP_INSN);
1349   insert_into_history (0, 1, NOP_INSN);
1350 }
1351
1352 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1353    the idea is to make it obvious at a glance that each errata is
1354    included.  */
1355
1356 static void
1357 init_vr4120_conflicts (void)
1358 {
1359 #define CONFLICT(FIRST, SECOND) \
1360     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1361
1362   /* Errata 21 - [D]DIV[U] after [D]MACC */
1363   CONFLICT (MACC, DIV);
1364   CONFLICT (DMACC, DIV);
1365
1366   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1367   CONFLICT (DMULT, DMULT);
1368   CONFLICT (DMULT, DMACC);
1369   CONFLICT (DMACC, DMULT);
1370   CONFLICT (DMACC, DMACC);
1371
1372   /* Errata 24 - MT{LO,HI} after [D]MACC */
1373   CONFLICT (MACC, MTHILO);
1374   CONFLICT (DMACC, MTHILO);
1375
1376   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1377      instruction is executed immediately after a MACC or DMACC
1378      instruction, the result of [either instruction] is incorrect."  */
1379   CONFLICT (MACC, MULT);
1380   CONFLICT (MACC, DMULT);
1381   CONFLICT (DMACC, MULT);
1382   CONFLICT (DMACC, DMULT);
1383
1384   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1385      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1386      DDIV or DDIVU instruction, the result of the MACC or
1387      DMACC instruction is incorrect.".  */
1388   CONFLICT (DMULT, MACC);
1389   CONFLICT (DMULT, DMACC);
1390   CONFLICT (DIV, MACC);
1391   CONFLICT (DIV, DMACC);
1392
1393 #undef CONFLICT
1394 }
1395
1396 /* This function is called once, at assembler startup time.  It should
1397    set up all the tables, etc. that the MD part of the assembler will need.  */
1398
1399 void
1400 md_begin (void)
1401 {
1402   register const char *retval = NULL;
1403   int i = 0;
1404   int broken = 0;
1405
1406   if (mips_pic != NO_PIC)
1407     {
1408       if (g_switch_seen && g_switch_value != 0)
1409         as_bad (_("-G may not be used in position-independent code"));
1410       g_switch_value = 0;
1411     }
1412
1413   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1414     as_warn (_("Could not set architecture and machine"));
1415
1416   op_hash = hash_new ();
1417
1418   for (i = 0; i < NUMOPCODES;)
1419     {
1420       const char *name = mips_opcodes[i].name;
1421
1422       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1423       if (retval != NULL)
1424         {
1425           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1426                    mips_opcodes[i].name, retval);
1427           /* Probably a memory allocation problem?  Give up now.  */
1428           as_fatal (_("Broken assembler.  No assembly attempted."));
1429         }
1430       do
1431         {
1432           if (mips_opcodes[i].pinfo != INSN_MACRO)
1433             {
1434               if (!validate_mips_insn (&mips_opcodes[i]))
1435                 broken = 1;
1436               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1437                 {
1438                   create_insn (&nop_insn, mips_opcodes + i);
1439                   nop_insn.fixed_p = 1;
1440                 }
1441             }
1442           ++i;
1443         }
1444       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1445     }
1446
1447   mips16_op_hash = hash_new ();
1448
1449   i = 0;
1450   while (i < bfd_mips16_num_opcodes)
1451     {
1452       const char *name = mips16_opcodes[i].name;
1453
1454       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1455       if (retval != NULL)
1456         as_fatal (_("internal: can't hash `%s': %s"),
1457                   mips16_opcodes[i].name, retval);
1458       do
1459         {
1460           if (mips16_opcodes[i].pinfo != INSN_MACRO
1461               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1462                   != mips16_opcodes[i].match))
1463             {
1464               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1465                        mips16_opcodes[i].name, mips16_opcodes[i].args);
1466               broken = 1;
1467             }
1468           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1469             {
1470               create_insn (&mips16_nop_insn, mips16_opcodes + i);
1471               mips16_nop_insn.fixed_p = 1;
1472             }
1473           ++i;
1474         }
1475       while (i < bfd_mips16_num_opcodes
1476              && strcmp (mips16_opcodes[i].name, name) == 0);
1477     }
1478
1479   if (broken)
1480     as_fatal (_("Broken assembler.  No assembly attempted."));
1481
1482   /* We add all the general register names to the symbol table.  This
1483      helps us detect invalid uses of them.  */
1484   for (i = 0; i < 32; i++)
1485     {
1486       char buf[5];
1487
1488       sprintf (buf, "$%d", i);
1489       symbol_table_insert (symbol_new (buf, reg_section, i,
1490                                        &zero_address_frag));
1491     }
1492   symbol_table_insert (symbol_new ("$ra", reg_section, RA,
1493                                    &zero_address_frag));
1494   symbol_table_insert (symbol_new ("$fp", reg_section, FP,
1495                                    &zero_address_frag));
1496   symbol_table_insert (symbol_new ("$sp", reg_section, SP,
1497                                    &zero_address_frag));
1498   symbol_table_insert (symbol_new ("$gp", reg_section, GP,
1499                                    &zero_address_frag));
1500   symbol_table_insert (symbol_new ("$at", reg_section, AT,
1501                                    &zero_address_frag));
1502   symbol_table_insert (symbol_new ("$kt0", reg_section, KT0,
1503                                    &zero_address_frag));
1504   symbol_table_insert (symbol_new ("$kt1", reg_section, KT1,
1505                                    &zero_address_frag));
1506   symbol_table_insert (symbol_new ("$zero", reg_section, ZERO,
1507                                    &zero_address_frag));
1508   symbol_table_insert (symbol_new ("$pc", reg_section, -1,
1509                                    &zero_address_frag));
1510
1511   /* If we don't add these register names to the symbol table, they
1512      may end up being added as regular symbols by operand(), and then
1513      make it to the object file as undefined in case they're not
1514      regarded as local symbols.  They're local in o32, since `$' is a
1515      local symbol prefix, but not in n32 or n64.  */
1516   for (i = 0; i < 8; i++)
1517     {
1518       char buf[6];
1519
1520       sprintf (buf, "$fcc%i", i);
1521       symbol_table_insert (symbol_new (buf, reg_section, -1,
1522                                        &zero_address_frag));
1523     }
1524
1525   mips_no_prev_insn ();
1526
1527   mips_gprmask = 0;
1528   mips_cprmask[0] = 0;
1529   mips_cprmask[1] = 0;
1530   mips_cprmask[2] = 0;
1531   mips_cprmask[3] = 0;
1532
1533   /* set the default alignment for the text section (2**2) */
1534   record_alignment (text_section, 2);
1535
1536   bfd_set_gp_size (stdoutput, g_switch_value);
1537
1538   if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1539     {
1540       /* On a native system other than VxWorks, sections must be aligned
1541          to 16 byte boundaries.  When configured for an embedded ELF
1542          target, we don't bother.  */
1543       if (strcmp (TARGET_OS, "elf") != 0
1544           && strcmp (TARGET_OS, "vxworks") != 0)
1545         {
1546           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1547           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1548           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1549         }
1550
1551       /* Create a .reginfo section for register masks and a .mdebug
1552          section for debugging information.  */
1553       {
1554         segT seg;
1555         subsegT subseg;
1556         flagword flags;
1557         segT sec;
1558
1559         seg = now_seg;
1560         subseg = now_subseg;
1561
1562         /* The ABI says this section should be loaded so that the
1563            running program can access it.  However, we don't load it
1564            if we are configured for an embedded target */
1565         flags = SEC_READONLY | SEC_DATA;
1566         if (strcmp (TARGET_OS, "elf") != 0)
1567           flags |= SEC_ALLOC | SEC_LOAD;
1568
1569         if (mips_abi != N64_ABI)
1570           {
1571             sec = subseg_new (".reginfo", (subsegT) 0);
1572
1573             bfd_set_section_flags (stdoutput, sec, flags);
1574             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
1575
1576 #ifdef OBJ_ELF
1577             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1578 #endif
1579           }
1580         else
1581           {
1582             /* The 64-bit ABI uses a .MIPS.options section rather than
1583                .reginfo section.  */
1584             sec = subseg_new (".MIPS.options", (subsegT) 0);
1585             bfd_set_section_flags (stdoutput, sec, flags);
1586             bfd_set_section_alignment (stdoutput, sec, 3);
1587
1588 #ifdef OBJ_ELF
1589             /* Set up the option header.  */
1590             {
1591               Elf_Internal_Options opthdr;
1592               char *f;
1593
1594               opthdr.kind = ODK_REGINFO;
1595               opthdr.size = (sizeof (Elf_External_Options)
1596                              + sizeof (Elf64_External_RegInfo));
1597               opthdr.section = 0;
1598               opthdr.info = 0;
1599               f = frag_more (sizeof (Elf_External_Options));
1600               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1601                                              (Elf_External_Options *) f);
1602
1603               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1604             }
1605 #endif
1606           }
1607
1608         if (ECOFF_DEBUGGING)
1609           {
1610             sec = subseg_new (".mdebug", (subsegT) 0);
1611             (void) bfd_set_section_flags (stdoutput, sec,
1612                                           SEC_HAS_CONTENTS | SEC_READONLY);
1613             (void) bfd_set_section_alignment (stdoutput, sec, 2);
1614           }
1615 #ifdef OBJ_ELF
1616         else if (OUTPUT_FLAVOR == bfd_target_elf_flavour && mips_flag_pdr)
1617           {
1618             pdr_seg = subseg_new (".pdr", (subsegT) 0);
1619             (void) bfd_set_section_flags (stdoutput, pdr_seg,
1620                                           SEC_READONLY | SEC_RELOC
1621                                           | SEC_DEBUGGING);
1622             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1623           }
1624 #endif
1625
1626         subseg_set (seg, subseg);
1627       }
1628     }
1629
1630   if (! ECOFF_DEBUGGING)
1631     md_obj_begin ();
1632
1633   if (mips_fix_vr4120)
1634     init_vr4120_conflicts ();
1635 }
1636
1637 void
1638 md_mips_end (void)
1639 {
1640   if (! ECOFF_DEBUGGING)
1641     md_obj_end ();
1642 }
1643
1644 void
1645 md_assemble (char *str)
1646 {
1647   struct mips_cl_insn insn;
1648   bfd_reloc_code_real_type unused_reloc[3]
1649     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1650
1651   imm_expr.X_op = O_absent;
1652   imm2_expr.X_op = O_absent;
1653   offset_expr.X_op = O_absent;
1654   imm_reloc[0] = BFD_RELOC_UNUSED;
1655   imm_reloc[1] = BFD_RELOC_UNUSED;
1656   imm_reloc[2] = BFD_RELOC_UNUSED;
1657   offset_reloc[0] = BFD_RELOC_UNUSED;
1658   offset_reloc[1] = BFD_RELOC_UNUSED;
1659   offset_reloc[2] = BFD_RELOC_UNUSED;
1660
1661   if (mips_opts.mips16)
1662     mips16_ip (str, &insn);
1663   else
1664     {
1665       mips_ip (str, &insn);
1666       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1667             str, insn.insn_opcode));
1668     }
1669
1670   if (insn_error)
1671     {
1672       as_bad ("%s `%s'", insn_error, str);
1673       return;
1674     }
1675
1676   if (insn.insn_mo->pinfo == INSN_MACRO)
1677     {
1678       macro_start ();
1679       if (mips_opts.mips16)
1680         mips16_macro (&insn);
1681       else
1682         macro (&insn);
1683       macro_end ();
1684     }
1685   else
1686     {
1687       if (imm_expr.X_op != O_absent)
1688         append_insn (&insn, &imm_expr, imm_reloc);
1689       else if (offset_expr.X_op != O_absent)
1690         append_insn (&insn, &offset_expr, offset_reloc);
1691       else
1692         append_insn (&insn, NULL, unused_reloc);
1693     }
1694 }
1695
1696 /* Return true if the given relocation might need a matching %lo().
1697    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
1698    need a matching %lo() when applied to local symbols.  */
1699
1700 static inline bfd_boolean
1701 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
1702 {
1703   return (HAVE_IN_PLACE_ADDENDS
1704           && (reloc == BFD_RELOC_HI16_S
1705               || reloc == BFD_RELOC_MIPS16_HI16_S
1706               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
1707                  all GOT16 relocations evaluate to "G".  */
1708               || (reloc == BFD_RELOC_MIPS_GOT16 && mips_pic != VXWORKS_PIC)));
1709 }
1710
1711 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
1712    relocation.  */
1713
1714 static inline bfd_boolean
1715 fixup_has_matching_lo_p (fixS *fixp)
1716 {
1717   return (fixp->fx_next != NULL
1718           && (fixp->fx_next->fx_r_type == BFD_RELOC_LO16
1719              || fixp->fx_next->fx_r_type == BFD_RELOC_MIPS16_LO16)
1720           && fixp->fx_addsy == fixp->fx_next->fx_addsy
1721           && fixp->fx_offset == fixp->fx_next->fx_offset);
1722 }
1723
1724 /* See whether instruction IP reads register REG.  CLASS is the type
1725    of register.  */
1726
1727 static int
1728 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
1729                enum mips_regclass class)
1730 {
1731   if (class == MIPS16_REG)
1732     {
1733       assert (mips_opts.mips16);
1734       reg = mips16_to_32_reg_map[reg];
1735       class = MIPS_GR_REG;
1736     }
1737
1738   /* Don't report on general register ZERO, since it never changes.  */
1739   if (class == MIPS_GR_REG && reg == ZERO)
1740     return 0;
1741
1742   if (class == MIPS_FP_REG)
1743     {
1744       assert (! mips_opts.mips16);
1745       /* If we are called with either $f0 or $f1, we must check $f0.
1746          This is not optimal, because it will introduce an unnecessary
1747          NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
1748          need to distinguish reading both $f0 and $f1 or just one of
1749          them.  Note that we don't have to check the other way,
1750          because there is no instruction that sets both $f0 and $f1
1751          and requires a delay.  */
1752       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
1753           && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
1754               == (reg &~ (unsigned) 1)))
1755         return 1;
1756       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
1757           && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
1758               == (reg &~ (unsigned) 1)))
1759         return 1;
1760     }
1761   else if (! mips_opts.mips16)
1762     {
1763       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
1764           && EXTRACT_OPERAND (RS, *ip) == reg)
1765         return 1;
1766       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
1767           && EXTRACT_OPERAND (RT, *ip) == reg)
1768         return 1;
1769     }
1770   else
1771     {
1772       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
1773           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
1774         return 1;
1775       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
1776           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
1777         return 1;
1778       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
1779           && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
1780               == reg))
1781         return 1;
1782       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
1783         return 1;
1784       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
1785         return 1;
1786       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
1787         return 1;
1788       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
1789           && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
1790         return 1;
1791     }
1792
1793   return 0;
1794 }
1795
1796 /* This function returns true if modifying a register requires a
1797    delay.  */
1798
1799 static int
1800 reg_needs_delay (unsigned int reg)
1801 {
1802   unsigned long prev_pinfo;
1803
1804   prev_pinfo = history[0].insn_mo->pinfo;
1805   if (! mips_opts.noreorder
1806       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
1807            && ! gpr_interlocks)
1808           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1809               && ! cop_interlocks)))
1810     {
1811       /* A load from a coprocessor or from memory.  All load delays
1812          delay the use of general register rt for one instruction.  */
1813       /* Itbl support may require additional care here.  */
1814       know (prev_pinfo & INSN_WRITE_GPR_T);
1815       if (reg == EXTRACT_OPERAND (RT, history[0]))
1816         return 1;
1817     }
1818
1819   return 0;
1820 }
1821
1822 /* Move all labels in insn_labels to the current insertion point.  */
1823
1824 static void
1825 mips_move_labels (void)
1826 {
1827   struct insn_label_list *l;
1828   valueT val;
1829
1830   for (l = insn_labels; l != NULL; l = l->next)
1831     {
1832       assert (S_GET_SEGMENT (l->label) == now_seg);
1833       symbol_set_frag (l->label, frag_now);
1834       val = (valueT) frag_now_fix ();
1835       /* mips16 text labels are stored as odd.  */
1836       if (mips_opts.mips16)
1837         ++val;
1838       S_SET_VALUE (l->label, val);
1839     }
1840 }
1841
1842 /* Mark instruction labels in mips16 mode.  This permits the linker to
1843    handle them specially, such as generating jalx instructions when
1844    needed.  We also make them odd for the duration of the assembly, in
1845    order to generate the right sort of code.  We will make them even
1846    in the adjust_symtab routine, while leaving them marked.  This is
1847    convenient for the debugger and the disassembler.  The linker knows
1848    to make them odd again.  */
1849
1850 static void
1851 mips16_mark_labels (void)
1852 {
1853   if (mips_opts.mips16)
1854     {
1855       struct insn_label_list *l;
1856       valueT val;
1857
1858       for (l = insn_labels; l != NULL; l = l->next)
1859         {
1860 #ifdef OBJ_ELF
1861           if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1862             S_SET_OTHER (l->label, STO_MIPS16);
1863 #endif
1864           val = S_GET_VALUE (l->label);
1865           if ((val & 1) == 0)
1866             S_SET_VALUE (l->label, val + 1);
1867         }
1868     }
1869 }
1870
1871 /* End the current frag.  Make it a variant frag and record the
1872    relaxation info.  */
1873
1874 static void
1875 relax_close_frag (void)
1876 {
1877   mips_macro_warning.first_frag = frag_now;
1878   frag_var (rs_machine_dependent, 0, 0,
1879             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
1880             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
1881
1882   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
1883   mips_relax.first_fixup = 0;
1884 }
1885
1886 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
1887    See the comment above RELAX_ENCODE for more details.  */
1888
1889 static void
1890 relax_start (symbolS *symbol)
1891 {
1892   assert (mips_relax.sequence == 0);
1893   mips_relax.sequence = 1;
1894   mips_relax.symbol = symbol;
1895 }
1896
1897 /* Start generating the second version of a relaxable sequence.
1898    See the comment above RELAX_ENCODE for more details.  */
1899
1900 static void
1901 relax_switch (void)
1902 {
1903   assert (mips_relax.sequence == 1);
1904   mips_relax.sequence = 2;
1905 }
1906
1907 /* End the current relaxable sequence.  */
1908
1909 static void
1910 relax_end (void)
1911 {
1912   assert (mips_relax.sequence == 2);
1913   relax_close_frag ();
1914   mips_relax.sequence = 0;
1915 }
1916
1917 /* Classify an instruction according to the FIX_VR4120_* enumeration.
1918    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
1919    by VR4120 errata.  */
1920
1921 static unsigned int
1922 classify_vr4120_insn (const char *name)
1923 {
1924   if (strncmp (name, "macc", 4) == 0)
1925     return FIX_VR4120_MACC;
1926   if (strncmp (name, "dmacc", 5) == 0)
1927     return FIX_VR4120_DMACC;
1928   if (strncmp (name, "mult", 4) == 0)
1929     return FIX_VR4120_MULT;
1930   if (strncmp (name, "dmult", 5) == 0)
1931     return FIX_VR4120_DMULT;
1932   if (strstr (name, "div"))
1933     return FIX_VR4120_DIV;
1934   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
1935     return FIX_VR4120_MTHILO;
1936   return NUM_FIX_VR4120_CLASSES;
1937 }
1938
1939 /* Return the number of instructions that must separate INSN1 and INSN2,
1940    where INSN1 is the earlier instruction.  Return the worst-case value
1941    for any INSN2 if INSN2 is null.  */
1942
1943 static unsigned int
1944 insns_between (const struct mips_cl_insn *insn1,
1945                const struct mips_cl_insn *insn2)
1946 {
1947   unsigned long pinfo1, pinfo2;
1948
1949   /* This function needs to know which pinfo flags are set for INSN2
1950      and which registers INSN2 uses.  The former is stored in PINFO2 and
1951      the latter is tested via INSN2_USES_REG.  If INSN2 is null, PINFO2
1952      will have every flag set and INSN2_USES_REG will always return true.  */
1953   pinfo1 = insn1->insn_mo->pinfo;
1954   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
1955
1956 #define INSN2_USES_REG(REG, CLASS) \
1957    (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
1958
1959   /* For most targets, write-after-read dependencies on the HI and LO
1960      registers must be separated by at least two instructions.  */
1961   if (!hilo_interlocks)
1962     {
1963       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
1964         return 2;
1965       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
1966         return 2;
1967     }
1968
1969   /* If we're working around r7000 errata, there must be two instructions
1970      between an mfhi or mflo and any instruction that uses the result.  */
1971   if (mips_7000_hilo_fix
1972       && MF_HILO_INSN (pinfo1)
1973       && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
1974     return 2;
1975
1976   /* If working around VR4120 errata, check for combinations that need
1977      a single intervening instruction.  */
1978   if (mips_fix_vr4120)
1979     {
1980       unsigned int class1, class2;
1981
1982       class1 = classify_vr4120_insn (insn1->insn_mo->name);
1983       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
1984         {
1985           if (insn2 == NULL)
1986             return 1;
1987           class2 = classify_vr4120_insn (insn2->insn_mo->name);
1988           if (vr4120_conflicts[class1] & (1 << class2))
1989             return 1;
1990         }
1991     }
1992
1993   if (!mips_opts.mips16)
1994     {
1995       /* Check for GPR or coprocessor load delays.  All such delays
1996          are on the RT register.  */
1997       /* Itbl support may require additional care here.  */
1998       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
1999           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2000         {
2001           know (pinfo1 & INSN_WRITE_GPR_T);
2002           if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2003             return 1;
2004         }
2005
2006       /* Check for generic coprocessor hazards.
2007
2008          This case is not handled very well.  There is no special
2009          knowledge of CP0 handling, and the coprocessors other than
2010          the floating point unit are not distinguished at all.  */
2011       /* Itbl support may require additional care here. FIXME!
2012          Need to modify this to include knowledge about
2013          user specified delays!  */
2014       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2015                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2016         {
2017           /* Handle cases where INSN1 writes to a known general coprocessor
2018              register.  There must be a one instruction delay before INSN2
2019              if INSN2 reads that register, otherwise no delay is needed.  */
2020           if (pinfo1 & INSN_WRITE_FPR_T)
2021             {
2022               if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2023                 return 1;
2024             }
2025           else if (pinfo1 & INSN_WRITE_FPR_S)
2026             {
2027               if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2028                 return 1;
2029             }
2030           else
2031             {
2032               /* Read-after-write dependencies on the control registers
2033                  require a two-instruction gap.  */
2034               if ((pinfo1 & INSN_WRITE_COND_CODE)
2035                   && (pinfo2 & INSN_READ_COND_CODE))
2036                 return 2;
2037
2038               /* We don't know exactly what INSN1 does.  If INSN2 is
2039                  also a coprocessor instruction, assume there must be
2040                  a one instruction gap.  */
2041               if (pinfo2 & INSN_COP)
2042                 return 1;
2043             }
2044         }
2045
2046       /* Check for read-after-write dependencies on the coprocessor
2047          control registers in cases where INSN1 does not need a general
2048          coprocessor delay.  This means that INSN1 is a floating point
2049          comparison instruction.  */
2050       /* Itbl support may require additional care here.  */
2051       else if (!cop_interlocks
2052                && (pinfo1 & INSN_WRITE_COND_CODE)
2053                && (pinfo2 & INSN_READ_COND_CODE))
2054         return 1;
2055     }
2056
2057 #undef INSN2_USES_REG
2058
2059   return 0;
2060 }
2061
2062 /* Return the number of nops that would be needed to work around the
2063    VR4130 mflo/mfhi errata if instruction INSN immediately followed
2064    the MAX_VR4130_NOPS instructions described by HISTORY.  */
2065
2066 static int
2067 nops_for_vr4130 (const struct mips_cl_insn *history,
2068                  const struct mips_cl_insn *insn)
2069 {
2070   int i, j, reg;
2071
2072   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
2073      are not affected by the errata.  */
2074   if (insn != 0
2075       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2076           || strcmp (insn->insn_mo->name, "mtlo") == 0
2077           || strcmp (insn->insn_mo->name, "mthi") == 0))
2078     return 0;
2079
2080   /* Search for the first MFLO or MFHI.  */
2081   for (i = 0; i < MAX_VR4130_NOPS; i++)
2082     if (!history[i].noreorder_p && MF_HILO_INSN (history[i].insn_mo->pinfo))
2083       {
2084         /* Extract the destination register.  */
2085         if (mips_opts.mips16)
2086           reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, history[i])];
2087         else
2088           reg = EXTRACT_OPERAND (RD, history[i]);
2089
2090         /* No nops are needed if INSN reads that register.  */
2091         if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2092           return 0;
2093
2094         /* ...or if any of the intervening instructions do.  */
2095         for (j = 0; j < i; j++)
2096           if (insn_uses_reg (&history[j], reg, MIPS_GR_REG))
2097             return 0;
2098
2099         return MAX_VR4130_NOPS - i;
2100       }
2101   return 0;
2102 }
2103
2104 /* Return the number of nops that would be needed if instruction INSN
2105    immediately followed the MAX_NOPS instructions given by HISTORY,
2106    where HISTORY[0] is the most recent instruction.  If INSN is null,
2107    return the worse-case number of nops for any instruction.  */
2108
2109 static int
2110 nops_for_insn (const struct mips_cl_insn *history,
2111                const struct mips_cl_insn *insn)
2112 {
2113   int i, nops, tmp_nops;
2114
2115   nops = 0;
2116   for (i = 0; i < MAX_DELAY_NOPS; i++)
2117     if (!history[i].noreorder_p)
2118       {
2119         tmp_nops = insns_between (history + i, insn) - i;
2120         if (tmp_nops > nops)
2121           nops = tmp_nops;
2122       }
2123
2124   if (mips_fix_vr4130)
2125     {
2126       tmp_nops = nops_for_vr4130 (history, insn);
2127       if (tmp_nops > nops)
2128         nops = tmp_nops;
2129     }
2130
2131   return nops;
2132 }
2133
2134 /* The variable arguments provide NUM_INSNS extra instructions that
2135    might be added to HISTORY.  Return the largest number of nops that
2136    would be needed after the extended sequence.  */
2137
2138 static int
2139 nops_for_sequence (int num_insns, const struct mips_cl_insn *history, ...)
2140 {
2141   va_list args;
2142   struct mips_cl_insn buffer[MAX_NOPS];
2143   struct mips_cl_insn *cursor;
2144   int nops;
2145
2146   va_start (args, history);
2147   cursor = buffer + num_insns;
2148   memcpy (cursor, history, (MAX_NOPS - num_insns) * sizeof (*cursor));
2149   while (cursor > buffer)
2150     *--cursor = *va_arg (args, const struct mips_cl_insn *);
2151
2152   nops = nops_for_insn (buffer, NULL);
2153   va_end (args);
2154   return nops;
2155 }
2156
2157 /* Like nops_for_insn, but if INSN is a branch, take into account the
2158    worst-case delay for the branch target.  */
2159
2160 static int
2161 nops_for_insn_or_target (const struct mips_cl_insn *history,
2162                          const struct mips_cl_insn *insn)
2163 {
2164   int nops, tmp_nops;
2165
2166   nops = nops_for_insn (history, insn);
2167   if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2168                               | INSN_COND_BRANCH_DELAY
2169                               | INSN_COND_BRANCH_LIKELY))
2170     {
2171       tmp_nops = nops_for_sequence (2, history, insn, NOP_INSN);
2172       if (tmp_nops > nops)
2173         nops = tmp_nops;
2174     }
2175   else if (mips_opts.mips16 && (insn->insn_mo->pinfo & MIPS16_INSN_BRANCH))
2176     {
2177       tmp_nops = nops_for_sequence (1, history, insn);
2178       if (tmp_nops > nops)
2179         nops = tmp_nops;
2180     }
2181   return nops;
2182 }
2183
2184 /* Output an instruction.  IP is the instruction information.
2185    ADDRESS_EXPR is an operand of the instruction to be used with
2186    RELOC_TYPE.  */
2187
2188 static void
2189 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2190              bfd_reloc_code_real_type *reloc_type)
2191 {
2192   register unsigned long prev_pinfo, pinfo;
2193   relax_stateT prev_insn_frag_type = 0;
2194   bfd_boolean relaxed_branch = FALSE;
2195
2196   /* Mark instruction labels in mips16 mode.  */
2197   mips16_mark_labels ();
2198
2199   prev_pinfo = history[0].insn_mo->pinfo;
2200   pinfo = ip->insn_mo->pinfo;
2201
2202   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2203     {
2204       /* There are a lot of optimizations we could do that we don't.
2205          In particular, we do not, in general, reorder instructions.
2206          If you use gcc with optimization, it will reorder
2207          instructions and generally do much more optimization then we
2208          do here; repeating all that work in the assembler would only
2209          benefit hand written assembly code, and does not seem worth
2210          it.  */
2211       int nops = (mips_optimize == 0
2212                   ? nops_for_insn (history, NULL)
2213                   : nops_for_insn_or_target (history, ip));
2214       if (nops > 0)
2215         {
2216           fragS *old_frag;
2217           unsigned long old_frag_offset;
2218           int i;
2219
2220           old_frag = frag_now;
2221           old_frag_offset = frag_now_fix ();
2222
2223           for (i = 0; i < nops; i++)
2224             emit_nop ();
2225
2226           if (listing)
2227             {
2228               listing_prev_line ();
2229               /* We may be at the start of a variant frag.  In case we
2230                  are, make sure there is enough space for the frag
2231                  after the frags created by listing_prev_line.  The
2232                  argument to frag_grow here must be at least as large
2233                  as the argument to all other calls to frag_grow in
2234                  this file.  We don't have to worry about being in the
2235                  middle of a variant frag, because the variants insert
2236                  all needed nop instructions themselves.  */
2237               frag_grow (40);
2238             }
2239
2240           mips_move_labels ();
2241
2242 #ifndef NO_ECOFF_DEBUGGING
2243           if (ECOFF_DEBUGGING)
2244             ecoff_fix_loc (old_frag, old_frag_offset);
2245 #endif
2246         }
2247     }
2248   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2249     {
2250       /* Work out how many nops in prev_nop_frag are needed by IP.  */
2251       int nops = nops_for_insn_or_target (history, ip);
2252       assert (nops <= prev_nop_frag_holds);
2253
2254       /* Enforce NOPS as a minimum.  */
2255       if (nops > prev_nop_frag_required)
2256         prev_nop_frag_required = nops;
2257
2258       if (prev_nop_frag_holds == prev_nop_frag_required)
2259         {
2260           /* Settle for the current number of nops.  Update the history
2261              accordingly (for the benefit of any future .set reorder code).  */
2262           prev_nop_frag = NULL;
2263           insert_into_history (prev_nop_frag_since,
2264                                prev_nop_frag_holds, NOP_INSN);
2265         }
2266       else
2267         {
2268           /* Allow this instruction to replace one of the nops that was
2269              tentatively added to prev_nop_frag.  */
2270           prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2271           prev_nop_frag_holds--;
2272           prev_nop_frag_since++;
2273         }
2274     }
2275
2276 #ifdef OBJ_ELF
2277   /* The value passed to dwarf2_emit_insn is the distance between
2278      the beginning of the current instruction and the address that
2279      should be recorded in the debug tables.  For MIPS16 debug info
2280      we want to use ISA-encoded addresses, so we pass -1 for an
2281      address higher by one than the current.  */
2282   dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2283 #endif
2284
2285   /* Record the frag type before frag_var.  */
2286   if (history[0].frag)
2287     prev_insn_frag_type = history[0].frag->fr_type;
2288
2289   if (address_expr
2290       && *reloc_type == BFD_RELOC_16_PCREL_S2
2291       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2292           || pinfo & INSN_COND_BRANCH_LIKELY)
2293       && mips_relax_branch
2294       /* Don't try branch relaxation within .set nomacro, or within
2295          .set noat if we use $at for PIC computations.  If it turns
2296          out that the branch was out-of-range, we'll get an error.  */
2297       && !mips_opts.warn_about_macros
2298       && !(mips_opts.noat && mips_pic != NO_PIC)
2299       && !mips_opts.mips16)
2300     {
2301       relaxed_branch = TRUE;
2302       add_relaxed_insn (ip, (relaxed_branch_length
2303                              (NULL, NULL,
2304                               (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2305                               : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2306                               : 0)), 4,
2307                         RELAX_BRANCH_ENCODE
2308                         (pinfo & INSN_UNCOND_BRANCH_DELAY,
2309                          pinfo & INSN_COND_BRANCH_LIKELY,
2310                          pinfo & INSN_WRITE_GPR_31,
2311                          0),
2312                         address_expr->X_add_symbol,
2313                         address_expr->X_add_number);
2314       *reloc_type = BFD_RELOC_UNUSED;
2315     }
2316   else if (*reloc_type > BFD_RELOC_UNUSED)
2317     {
2318       /* We need to set up a variant frag.  */
2319       assert (mips_opts.mips16 && address_expr != NULL);
2320       add_relaxed_insn (ip, 4, 0,
2321                         RELAX_MIPS16_ENCODE
2322                         (*reloc_type - BFD_RELOC_UNUSED,
2323                          mips16_small, mips16_ext,
2324                          prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2325                          history[0].mips16_absolute_jump_p),
2326                         make_expr_symbol (address_expr), 0);
2327     }
2328   else if (mips_opts.mips16
2329            && ! ip->use_extend
2330            && *reloc_type != BFD_RELOC_MIPS16_JMP)
2331     {
2332       if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2333         /* Make sure there is enough room to swap this instruction with
2334            a following jump instruction.  */
2335         frag_grow (6);
2336       add_fixed_insn (ip);
2337     }
2338   else
2339     {
2340       if (mips_opts.mips16
2341           && mips_opts.noreorder
2342           && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2343         as_warn (_("extended instruction in delay slot"));
2344
2345       if (mips_relax.sequence)
2346         {
2347           /* If we've reached the end of this frag, turn it into a variant
2348              frag and record the information for the instructions we've
2349              written so far.  */
2350           if (frag_room () < 4)
2351             relax_close_frag ();
2352           mips_relax.sizes[mips_relax.sequence - 1] += 4;
2353         }
2354
2355       if (mips_relax.sequence != 2)
2356         mips_macro_warning.sizes[0] += 4;
2357       if (mips_relax.sequence != 1)
2358         mips_macro_warning.sizes[1] += 4;
2359
2360       if (mips_opts.mips16)
2361         {
2362           ip->fixed_p = 1;
2363           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2364         }
2365       add_fixed_insn (ip);
2366     }
2367
2368   if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2369     {
2370       if (address_expr->X_op == O_constant)
2371         {
2372           unsigned int tmp;
2373
2374           switch (*reloc_type)
2375             {
2376             case BFD_RELOC_32:
2377               ip->insn_opcode |= address_expr->X_add_number;
2378               break;
2379
2380             case BFD_RELOC_MIPS_HIGHEST:
2381               tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
2382               ip->insn_opcode |= tmp & 0xffff;
2383               break;
2384
2385             case BFD_RELOC_MIPS_HIGHER:
2386               tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
2387               ip->insn_opcode |= tmp & 0xffff;
2388               break;
2389
2390             case BFD_RELOC_HI16_S:
2391               tmp = (address_expr->X_add_number + 0x8000) >> 16;
2392               ip->insn_opcode |= tmp & 0xffff;
2393               break;
2394
2395             case BFD_RELOC_HI16:
2396               ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2397               break;
2398
2399             case BFD_RELOC_UNUSED:
2400             case BFD_RELOC_LO16:
2401             case BFD_RELOC_MIPS_GOT_DISP:
2402               ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2403               break;
2404
2405             case BFD_RELOC_MIPS_JMP:
2406               if ((address_expr->X_add_number & 3) != 0)
2407                 as_bad (_("jump to misaligned address (0x%lx)"),
2408                         (unsigned long) address_expr->X_add_number);
2409               if (address_expr->X_add_number & ~0xfffffff)
2410                 as_bad (_("jump address range overflow (0x%lx)"),
2411                         (unsigned long) address_expr->X_add_number);
2412               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2413               break;
2414
2415             case BFD_RELOC_MIPS16_JMP:
2416               if ((address_expr->X_add_number & 3) != 0)
2417                 as_bad (_("jump to misaligned address (0x%lx)"),
2418                         (unsigned long) address_expr->X_add_number);
2419               if (address_expr->X_add_number & ~0xfffffff)
2420                 as_bad (_("jump address range overflow (0x%lx)"),
2421                         (unsigned long) address_expr->X_add_number);
2422               ip->insn_opcode |=
2423                 (((address_expr->X_add_number & 0x7c0000) << 3)
2424                  | ((address_expr->X_add_number & 0xf800000) >> 7)
2425                  | ((address_expr->X_add_number & 0x3fffc) >> 2));
2426               break;
2427
2428             case BFD_RELOC_16_PCREL_S2:
2429               if ((address_expr->X_add_number & 3) != 0)
2430                 as_bad (_("branch to misaligned address (0x%lx)"),
2431                         (unsigned long) address_expr->X_add_number);
2432               if (mips_relax_branch)
2433                 goto need_reloc;
2434               if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
2435                 as_bad (_("branch address range overflow (0x%lx)"),
2436                         (unsigned long) address_expr->X_add_number);
2437               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
2438               break;
2439
2440             default:
2441               internalError ();
2442             }
2443         }
2444       else if (*reloc_type < BFD_RELOC_UNUSED)
2445         need_reloc:
2446         {
2447           reloc_howto_type *howto;
2448           int i;
2449
2450           /* In a compound relocation, it is the final (outermost)
2451              operator that determines the relocated field.  */
2452           for (i = 1; i < 3; i++)
2453             if (reloc_type[i] == BFD_RELOC_UNUSED)
2454               break;
2455
2456           howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
2457           ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
2458                                      bfd_get_reloc_size (howto),
2459                                      address_expr,
2460                                      reloc_type[0] == BFD_RELOC_16_PCREL_S2,
2461                                      reloc_type[0]);
2462
2463           /* These relocations can have an addend that won't fit in
2464              4 octets for 64bit assembly.  */
2465           if (HAVE_64BIT_GPRS
2466               && ! howto->partial_inplace
2467               && (reloc_type[0] == BFD_RELOC_16
2468                   || reloc_type[0] == BFD_RELOC_32
2469                   || reloc_type[0] == BFD_RELOC_MIPS_JMP
2470                   || reloc_type[0] == BFD_RELOC_HI16_S
2471                   || reloc_type[0] == BFD_RELOC_LO16
2472                   || reloc_type[0] == BFD_RELOC_GPREL16
2473                   || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
2474                   || reloc_type[0] == BFD_RELOC_GPREL32
2475                   || reloc_type[0] == BFD_RELOC_64
2476                   || reloc_type[0] == BFD_RELOC_CTOR
2477                   || reloc_type[0] == BFD_RELOC_MIPS_SUB
2478                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
2479                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
2480                   || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
2481                   || reloc_type[0] == BFD_RELOC_MIPS_REL16
2482                   || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
2483                   || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
2484                   || reloc_type[0] == BFD_RELOC_MIPS16_HI16_S
2485                   || reloc_type[0] == BFD_RELOC_MIPS16_LO16))
2486             ip->fixp[0]->fx_no_overflow = 1;
2487
2488           if (mips_relax.sequence)
2489             {
2490               if (mips_relax.first_fixup == 0)
2491                 mips_relax.first_fixup = ip->fixp[0];
2492             }
2493           else if (reloc_needs_lo_p (*reloc_type))
2494             {
2495               struct mips_hi_fixup *hi_fixup;
2496
2497               /* Reuse the last entry if it already has a matching %lo.  */
2498               hi_fixup = mips_hi_fixup_list;
2499               if (hi_fixup == 0
2500                   || !fixup_has_matching_lo_p (hi_fixup->fixp))
2501                 {
2502                   hi_fixup = ((struct mips_hi_fixup *)
2503                               xmalloc (sizeof (struct mips_hi_fixup)));
2504                   hi_fixup->next = mips_hi_fixup_list;
2505                   mips_hi_fixup_list = hi_fixup;
2506                 }
2507               hi_fixup->fixp = ip->fixp[0];
2508               hi_fixup->seg = now_seg;
2509             }
2510
2511           /* Add fixups for the second and third relocations, if given.
2512              Note that the ABI allows the second relocation to be
2513              against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
2514              moment we only use RSS_UNDEF, but we could add support
2515              for the others if it ever becomes necessary.  */
2516           for (i = 1; i < 3; i++)
2517             if (reloc_type[i] != BFD_RELOC_UNUSED)
2518               {
2519                 ip->fixp[i] = fix_new (ip->frag, ip->where,
2520                                        ip->fixp[0]->fx_size, NULL, 0,
2521                                        FALSE, reloc_type[i]);
2522
2523                 /* Use fx_tcbit to mark compound relocs.  */
2524                 ip->fixp[0]->fx_tcbit = 1;
2525                 ip->fixp[i]->fx_tcbit = 1;
2526               }
2527         }
2528     }
2529   install_insn (ip);
2530
2531   /* Update the register mask information.  */
2532   if (! mips_opts.mips16)
2533     {
2534       if (pinfo & INSN_WRITE_GPR_D)
2535         mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
2536       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
2537         mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
2538       if (pinfo & INSN_READ_GPR_S)
2539         mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
2540       if (pinfo & INSN_WRITE_GPR_31)
2541         mips_gprmask |= 1 << RA;
2542       if (pinfo & INSN_WRITE_FPR_D)
2543         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
2544       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
2545         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
2546       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
2547         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
2548       if ((pinfo & INSN_READ_FPR_R) != 0)
2549         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
2550       if (pinfo & INSN_COP)
2551         {
2552           /* We don't keep enough information to sort these cases out.
2553              The itbl support does keep this information however, although
2554              we currently don't support itbl fprmats as part of the cop
2555              instruction.  May want to add this support in the future.  */
2556         }
2557       /* Never set the bit for $0, which is always zero.  */
2558       mips_gprmask &= ~1 << 0;
2559     }
2560   else
2561     {
2562       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
2563         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
2564       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
2565         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
2566       if (pinfo & MIPS16_INSN_WRITE_Z)
2567         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
2568       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
2569         mips_gprmask |= 1 << TREG;
2570       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
2571         mips_gprmask |= 1 << SP;
2572       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
2573         mips_gprmask |= 1 << RA;
2574       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2575         mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2576       if (pinfo & MIPS16_INSN_READ_Z)
2577         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
2578       if (pinfo & MIPS16_INSN_READ_GPR_X)
2579         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
2580     }
2581
2582   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2583     {
2584       /* Filling the branch delay slot is more complex.  We try to
2585          switch the branch with the previous instruction, which we can
2586          do if the previous instruction does not set up a condition
2587          that the branch tests and if the branch is not itself the
2588          target of any branch.  */
2589       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2590           || (pinfo & INSN_COND_BRANCH_DELAY))
2591         {
2592           if (mips_optimize < 2
2593               /* If we have seen .set volatile or .set nomove, don't
2594                  optimize.  */
2595               || mips_opts.nomove != 0
2596               /* We can't swap if the previous instruction's position
2597                  is fixed.  */
2598               || history[0].fixed_p
2599               /* If the previous previous insn was in a .set
2600                  noreorder, we can't swap.  Actually, the MIPS
2601                  assembler will swap in this situation.  However, gcc
2602                  configured -with-gnu-as will generate code like
2603                    .set noreorder
2604                    lw   $4,XXX
2605                    .set reorder
2606                    INSN
2607                    bne  $4,$0,foo
2608                  in which we can not swap the bne and INSN.  If gcc is
2609                  not configured -with-gnu-as, it does not output the
2610                  .set pseudo-ops.  */
2611               || history[1].noreorder_p
2612               /* If the branch is itself the target of a branch, we
2613                  can not swap.  We cheat on this; all we check for is
2614                  whether there is a label on this instruction.  If
2615                  there are any branches to anything other than a
2616                  label, users must use .set noreorder.  */
2617               || insn_labels != NULL
2618               /* If the previous instruction is in a variant frag
2619                  other than this branch's one, we cannot do the swap.
2620                  This does not apply to the mips16, which uses variant
2621                  frags for different purposes.  */
2622               || (! mips_opts.mips16
2623                   && prev_insn_frag_type == rs_machine_dependent)
2624               /* Check for conflicts between the branch and the instructions
2625                  before the candidate delay slot.  */
2626               || nops_for_insn (history + 1, ip) > 0
2627               /* Check for conflicts between the swapped sequence and the
2628                  target of the branch.  */
2629               || nops_for_sequence (2, history + 1, ip, history) > 0
2630               /* We do not swap with a trap instruction, since it
2631                  complicates trap handlers to have the trap
2632                  instruction be in a delay slot.  */
2633               || (prev_pinfo & INSN_TRAP)
2634               /* If the branch reads a register that the previous
2635                  instruction sets, we can not swap.  */
2636               || (! mips_opts.mips16
2637                   && (prev_pinfo & INSN_WRITE_GPR_T)
2638                   && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
2639                                     MIPS_GR_REG))
2640               || (! mips_opts.mips16
2641                   && (prev_pinfo & INSN_WRITE_GPR_D)
2642                   && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
2643                                     MIPS_GR_REG))
2644               || (mips_opts.mips16
2645                   && (((prev_pinfo & MIPS16_INSN_WRITE_X)
2646                        && (insn_uses_reg
2647                            (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
2648                             MIPS16_REG)))
2649                       || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
2650                           && (insn_uses_reg
2651                               (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
2652                                MIPS16_REG)))
2653                       || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
2654                           && (insn_uses_reg
2655                               (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
2656                                MIPS16_REG)))
2657                       || ((prev_pinfo & MIPS16_INSN_WRITE_T)
2658                           && insn_uses_reg (ip, TREG, MIPS_GR_REG))
2659                       || ((prev_pinfo & MIPS16_INSN_WRITE_31)
2660                           && insn_uses_reg (ip, RA, MIPS_GR_REG))
2661                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2662                           && insn_uses_reg (ip,
2663                                             MIPS16OP_EXTRACT_REG32R
2664                                               (history[0].insn_opcode),
2665                                             MIPS_GR_REG))))
2666               /* If the branch writes a register that the previous
2667                  instruction sets, we can not swap (we know that
2668                  branches write only to RD or to $31).  */
2669               || (! mips_opts.mips16
2670                   && (prev_pinfo & INSN_WRITE_GPR_T)
2671                   && (((pinfo & INSN_WRITE_GPR_D)
2672                        && (EXTRACT_OPERAND (RT, history[0])
2673                            == EXTRACT_OPERAND (RD, *ip)))
2674                       || ((pinfo & INSN_WRITE_GPR_31)
2675                           && EXTRACT_OPERAND (RT, history[0]) == RA)))
2676               || (! mips_opts.mips16
2677                   && (prev_pinfo & INSN_WRITE_GPR_D)
2678                   && (((pinfo & INSN_WRITE_GPR_D)
2679                        && (EXTRACT_OPERAND (RD, history[0])
2680                            == EXTRACT_OPERAND (RD, *ip)))
2681                       || ((pinfo & INSN_WRITE_GPR_31)
2682                           && EXTRACT_OPERAND (RD, history[0]) == RA)))
2683               || (mips_opts.mips16
2684                   && (pinfo & MIPS16_INSN_WRITE_31)
2685                   && ((prev_pinfo & MIPS16_INSN_WRITE_31)
2686                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2687                           && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
2688                               == RA))))
2689               /* If the branch writes a register that the previous
2690                  instruction reads, we can not swap (we know that
2691                  branches only write to RD or to $31).  */
2692               || (! mips_opts.mips16
2693                   && (pinfo & INSN_WRITE_GPR_D)
2694                   && insn_uses_reg (&history[0],
2695                                     EXTRACT_OPERAND (RD, *ip),
2696                                     MIPS_GR_REG))
2697               || (! mips_opts.mips16
2698                   && (pinfo & INSN_WRITE_GPR_31)
2699                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
2700               || (mips_opts.mips16
2701                   && (pinfo & MIPS16_INSN_WRITE_31)
2702                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
2703               /* If one instruction sets a condition code and the
2704                  other one uses a condition code, we can not swap.  */
2705               || ((pinfo & INSN_READ_COND_CODE)
2706                   && (prev_pinfo & INSN_WRITE_COND_CODE))
2707               || ((pinfo & INSN_WRITE_COND_CODE)
2708                   && (prev_pinfo & INSN_READ_COND_CODE))
2709               /* If the previous instruction uses the PC, we can not
2710                  swap.  */
2711               || (mips_opts.mips16
2712                   && (prev_pinfo & MIPS16_INSN_READ_PC))
2713               /* If the previous instruction had a fixup in mips16
2714                  mode, we can not swap.  This normally means that the
2715                  previous instruction was a 4 byte branch anyhow.  */
2716               || (mips_opts.mips16 && history[0].fixp[0])
2717               /* If the previous instruction is a sync, sync.l, or
2718                  sync.p, we can not swap.  */
2719               || (prev_pinfo & INSN_SYNC))
2720             {
2721               if (mips_opts.mips16
2722                   && (pinfo & INSN_UNCOND_BRANCH_DELAY)
2723                   && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
2724                   && (mips_opts.isa == ISA_MIPS32
2725                       || mips_opts.isa == ISA_MIPS32R2
2726                       || mips_opts.isa == ISA_MIPS64
2727                       || mips_opts.isa == ISA_MIPS64R2))
2728                 {
2729                   /* Convert MIPS16 jr/jalr into a "compact" jump.  */
2730                   ip->insn_opcode |= 0x0080;
2731                   install_insn (ip);
2732                   insert_into_history (0, 1, ip);
2733                 } 
2734               else
2735                 {
2736                   /* We could do even better for unconditional branches to
2737                      portions of this object file; we could pick up the
2738                      instruction at the destination, put it in the delay
2739                      slot, and bump the destination address.  */
2740                   insert_into_history (0, 1, ip);
2741                   emit_nop ();
2742                 }
2743                 
2744               if (mips_relax.sequence)
2745                 mips_relax.sizes[mips_relax.sequence - 1] += 4;
2746             }
2747           else
2748             {
2749               /* It looks like we can actually do the swap.  */
2750               struct mips_cl_insn delay = history[0];
2751               if (mips_opts.mips16)
2752                 {
2753                   know (delay.frag == ip->frag);
2754                   move_insn (ip, delay.frag, delay.where);
2755                   move_insn (&delay, ip->frag, ip->where + insn_length (ip));
2756                 }
2757               else if (relaxed_branch)
2758                 {
2759                   /* Add the delay slot instruction to the end of the
2760                      current frag and shrink the fixed part of the
2761                      original frag.  If the branch occupies the tail of
2762                      the latter, move it backwards to cover the gap.  */
2763                   delay.frag->fr_fix -= 4;
2764                   if (delay.frag == ip->frag)
2765                     move_insn (ip, ip->frag, ip->where - 4);
2766                   add_fixed_insn (&delay);
2767                 }
2768               else
2769                 {
2770                   move_insn (&delay, ip->frag, ip->where);
2771                   move_insn (ip, history[0].frag, history[0].where);
2772                 }
2773               history[0] = *ip;
2774               delay.fixed_p = 1;
2775               insert_into_history (0, 1, &delay);
2776             }
2777
2778           /* If that was an unconditional branch, forget the previous
2779              insn information.  */
2780           if (pinfo & INSN_UNCOND_BRANCH_DELAY)
2781             mips_no_prev_insn ();
2782         }
2783       else if (pinfo & INSN_COND_BRANCH_LIKELY)
2784         {
2785           /* We don't yet optimize a branch likely.  What we should do
2786              is look at the target, copy the instruction found there
2787              into the delay slot, and increment the branch to jump to
2788              the next instruction.  */
2789           insert_into_history (0, 1, ip);
2790           emit_nop ();
2791         }
2792       else
2793         insert_into_history (0, 1, ip);
2794     }
2795   else
2796     insert_into_history (0, 1, ip);
2797
2798   /* We just output an insn, so the next one doesn't have a label.  */
2799   mips_clear_insn_labels ();
2800 }
2801
2802 /* Forget that there was any previous instruction or label.  */
2803
2804 static void
2805 mips_no_prev_insn (void)
2806 {
2807   prev_nop_frag = NULL;
2808   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
2809   mips_clear_insn_labels ();
2810 }
2811
2812 /* This function must be called before we emit something other than
2813    instructions.  It is like mips_no_prev_insn except that it inserts
2814    any NOPS that might be needed by previous instructions.  */
2815
2816 void
2817 mips_emit_delays (void)
2818 {
2819   if (! mips_opts.noreorder)
2820     {
2821       int nops = nops_for_insn (history, NULL);
2822       if (nops > 0)
2823         {
2824           while (nops-- > 0)
2825             add_fixed_insn (NOP_INSN);
2826           mips_move_labels ();
2827         }
2828     }
2829   mips_no_prev_insn ();
2830 }
2831
2832 /* Start a (possibly nested) noreorder block.  */
2833
2834 static void
2835 start_noreorder (void)
2836 {
2837   if (mips_opts.noreorder == 0)
2838     {
2839       unsigned int i;
2840       int nops;
2841
2842       /* None of the instructions before the .set noreorder can be moved.  */
2843       for (i = 0; i < ARRAY_SIZE (history); i++)
2844         history[i].fixed_p = 1;
2845
2846       /* Insert any nops that might be needed between the .set noreorder
2847          block and the previous instructions.  We will later remove any
2848          nops that turn out not to be needed.  */
2849       nops = nops_for_insn (history, NULL);
2850       if (nops > 0)
2851         {
2852           if (mips_optimize != 0)
2853             {
2854               /* Record the frag which holds the nop instructions, so
2855                  that we can remove them if we don't need them.  */
2856               frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
2857               prev_nop_frag = frag_now;
2858               prev_nop_frag_holds = nops;
2859               prev_nop_frag_required = 0;
2860               prev_nop_frag_since = 0;
2861             }
2862
2863           for (; nops > 0; --nops)
2864             add_fixed_insn (NOP_INSN);
2865
2866           /* Move on to a new frag, so that it is safe to simply
2867              decrease the size of prev_nop_frag.  */
2868           frag_wane (frag_now);
2869           frag_new (0);
2870           mips_move_labels ();
2871         }
2872       mips16_mark_labels ();
2873       mips_clear_insn_labels ();
2874     }
2875   mips_opts.noreorder++;
2876   mips_any_noreorder = 1;
2877 }
2878
2879 /* End a nested noreorder block.  */
2880
2881 static void
2882 end_noreorder (void)
2883 {
2884   mips_opts.noreorder--;
2885   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
2886     {
2887       /* Commit to inserting prev_nop_frag_required nops and go back to
2888          handling nop insertion the .set reorder way.  */
2889       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
2890                                 * (mips_opts.mips16 ? 2 : 4));
2891       insert_into_history (prev_nop_frag_since,
2892                            prev_nop_frag_required, NOP_INSN);
2893       prev_nop_frag = NULL;
2894     }
2895 }
2896
2897 /* Set up global variables for the start of a new macro.  */
2898
2899 static void
2900 macro_start (void)
2901 {
2902   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
2903   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
2904                                      && (history[0].insn_mo->pinfo
2905                                          & (INSN_UNCOND_BRANCH_DELAY
2906                                             | INSN_COND_BRANCH_DELAY
2907                                             | INSN_COND_BRANCH_LIKELY)) != 0);
2908 }
2909
2910 /* Given that a macro is longer than 4 bytes, return the appropriate warning
2911    for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
2912    RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
2913
2914 static const char *
2915 macro_warning (relax_substateT subtype)
2916 {
2917   if (subtype & RELAX_DELAY_SLOT)
2918     return _("Macro instruction expanded into multiple instructions"
2919              " in a branch delay slot");
2920   else if (subtype & RELAX_NOMACRO)
2921     return _("Macro instruction expanded into multiple instructions");
2922   else
2923     return 0;
2924 }
2925
2926 /* Finish up a macro.  Emit warnings as appropriate.  */
2927
2928 static void
2929 macro_end (void)
2930 {
2931   if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
2932     {
2933       relax_substateT subtype;
2934
2935       /* Set up the relaxation warning flags.  */
2936       subtype = 0;
2937       if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
2938         subtype |= RELAX_SECOND_LONGER;
2939       if (mips_opts.warn_about_macros)
2940         subtype |= RELAX_NOMACRO;
2941       if (mips_macro_warning.delay_slot_p)
2942         subtype |= RELAX_DELAY_SLOT;
2943
2944       if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
2945         {
2946           /* Either the macro has a single implementation or both
2947              implementations are longer than 4 bytes.  Emit the
2948              warning now.  */
2949           const char *msg = macro_warning (subtype);
2950           if (msg != 0)
2951             as_warn (msg);
2952         }
2953       else
2954         {
2955           /* One implementation might need a warning but the other
2956              definitely doesn't.  */
2957           mips_macro_warning.first_frag->fr_subtype |= subtype;
2958         }
2959     }
2960 }
2961
2962 /* Read a macro's relocation codes from *ARGS and store them in *R.
2963    The first argument in *ARGS will be either the code for a single
2964    relocation or -1 followed by the three codes that make up a
2965    composite relocation.  */
2966
2967 static void
2968 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
2969 {
2970   int i, next;
2971
2972   next = va_arg (*args, int);
2973   if (next >= 0)
2974     r[0] = (bfd_reloc_code_real_type) next;
2975   else
2976     for (i = 0; i < 3; i++)
2977       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
2978 }
2979
2980 /* Build an instruction created by a macro expansion.  This is passed
2981    a pointer to the count of instructions created so far, an
2982    expression, the name of the instruction to build, an operand format
2983    string, and corresponding arguments.  */
2984
2985 static void
2986 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
2987 {
2988   const struct mips_opcode *mo;
2989   struct mips_cl_insn insn;
2990   bfd_reloc_code_real_type r[3];
2991   va_list args;
2992
2993   va_start (args, fmt);
2994
2995   if (mips_opts.mips16)
2996     {
2997       mips16_macro_build (ep, name, fmt, args);
2998       va_end (args);
2999       return;
3000     }
3001
3002   r[0] = BFD_RELOC_UNUSED;
3003   r[1] = BFD_RELOC_UNUSED;
3004   r[2] = BFD_RELOC_UNUSED;
3005   mo = (struct mips_opcode *) hash_find (op_hash, name);
3006   assert (mo);
3007   assert (strcmp (name, mo->name) == 0);
3008
3009   /* Search until we get a match for NAME.  It is assumed here that
3010      macros will never generate MDMX or MIPS-3D instructions.  */
3011   while (strcmp (fmt, mo->args) != 0
3012          || mo->pinfo == INSN_MACRO
3013          || !OPCODE_IS_MEMBER (mo,
3014                                (mips_opts.isa
3015                                 | (file_ase_mips16 ? INSN_MIPS16 : 0)),
3016                                mips_opts.arch)
3017          || (mips_opts.arch == CPU_R4650 && (mo->pinfo & FP_D) != 0))
3018     {
3019       ++mo;
3020       assert (mo->name);
3021       assert (strcmp (name, mo->name) == 0);
3022     }
3023
3024   create_insn (&insn, mo);
3025   for (;;)
3026     {
3027       switch (*fmt++)
3028         {
3029         case '\0':
3030           break;
3031
3032         case ',':
3033         case '(':
3034         case ')':
3035           continue;
3036
3037         case '+':
3038           switch (*fmt++)
3039             {
3040             case 'A':
3041             case 'E':
3042               INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3043               continue;
3044
3045             case 'B':
3046             case 'F':
3047               /* Note that in the macro case, these arguments are already
3048                  in MSB form.  (When handling the instruction in the
3049                  non-macro case, these arguments are sizes from which
3050                  MSB values must be calculated.)  */
3051               INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3052               continue;
3053
3054             case 'C':
3055             case 'G':
3056             case 'H':
3057               /* Note that in the macro case, these arguments are already
3058                  in MSBD form.  (When handling the instruction in the
3059                  non-macro case, these arguments are sizes from which
3060                  MSBD values must be calculated.)  */
3061               INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3062               continue;
3063
3064             default:
3065               internalError ();
3066             }
3067           continue;
3068
3069         case 't':
3070         case 'w':
3071         case 'E':
3072           INSERT_OPERAND (RT, insn, va_arg (args, int));
3073           continue;
3074
3075         case 'c':
3076           INSERT_OPERAND (CODE, insn, va_arg (args, int));
3077           continue;
3078
3079         case 'T':
3080         case 'W':
3081           INSERT_OPERAND (FT, insn, va_arg (args, int));
3082           continue;
3083
3084         case 'd':
3085         case 'G':
3086         case 'K':
3087           INSERT_OPERAND (RD, insn, va_arg (args, int));
3088           continue;
3089
3090         case 'U':
3091           {
3092             int tmp = va_arg (args, int);
3093
3094             INSERT_OPERAND (RT, insn, tmp);
3095             INSERT_OPERAND (RD, insn, tmp);
3096             continue;
3097           }
3098
3099         case 'V':
3100         case 'S':
3101           INSERT_OPERAND (FS, insn, va_arg (args, int));
3102           continue;
3103
3104         case 'z':
3105           continue;
3106
3107         case '<':
3108           INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3109           continue;
3110
3111         case 'D':
3112           INSERT_OPERAND (FD, insn, va_arg (args, int));
3113           continue;
3114
3115         case 'B':
3116           INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3117           continue;
3118
3119         case 'J':
3120           INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3121           continue;
3122
3123         case 'q':
3124           INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3125           continue;
3126
3127         case 'b':
3128         case 's':
3129         case 'r':
3130         case 'v':
3131           INSERT_OPERAND (RS, insn, va_arg (args, int));
3132           continue;
3133
3134         case 'i':
3135         case 'j':
3136         case 'o':
3137           macro_read_relocs (&args, r);
3138           assert (*r == BFD_RELOC_GPREL16
3139                   || *r == BFD_RELOC_MIPS_LITERAL
3140                   || *r == BFD_RELOC_MIPS_HIGHER
3141                   || *r == BFD_RELOC_HI16_S
3142                   || *r == BFD_RELOC_LO16
3143                   || *r == BFD_RELOC_MIPS_GOT16
3144                   || *r == BFD_RELOC_MIPS_CALL16
3145                   || *r == BFD_RELOC_MIPS_GOT_DISP
3146                   || *r == BFD_RELOC_MIPS_GOT_PAGE
3147                   || *r == BFD_RELOC_MIPS_GOT_OFST
3148                   || *r == BFD_RELOC_MIPS_GOT_LO16
3149                   || *r == BFD_RELOC_MIPS_CALL_LO16);
3150           continue;
3151
3152         case 'u':
3153           macro_read_relocs (&args, r);
3154           assert (ep != NULL
3155                   && (ep->X_op == O_constant
3156                       || (ep->X_op == O_symbol
3157                           && (*r == BFD_RELOC_MIPS_HIGHEST
3158                               || *r == BFD_RELOC_HI16_S
3159                               || *r == BFD_RELOC_HI16
3160                               || *r == BFD_RELOC_GPREL16
3161                               || *r == BFD_RELOC_MIPS_GOT_HI16
3162                               || *r == BFD_RELOC_MIPS_CALL_HI16))));
3163           continue;
3164
3165         case 'p':
3166           assert (ep != NULL);
3167
3168           /*
3169            * This allows macro() to pass an immediate expression for
3170            * creating short branches without creating a symbol.
3171            *
3172            * We don't allow branch relaxation for these branches, as
3173            * they should only appear in ".set nomacro" anyway.
3174            */
3175           if (ep->X_op == O_constant)
3176             {
3177               if ((ep->X_add_number & 3) != 0)
3178                 as_bad (_("branch to misaligned address (0x%lx)"),
3179                         (unsigned long) ep->X_add_number);
3180               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3181                 as_bad (_("branch address range overflow (0x%lx)"),
3182                         (unsigned long) ep->X_add_number);
3183               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3184               ep = NULL;
3185             }
3186           else
3187             *r = BFD_RELOC_16_PCREL_S2;
3188           continue;
3189
3190         case 'a':
3191           assert (ep != NULL);
3192           *r = BFD_RELOC_MIPS_JMP;
3193           continue;
3194
3195         case 'C':
3196           insn.insn_opcode |= va_arg (args, unsigned long);
3197           continue;
3198
3199         default:
3200           internalError ();
3201         }
3202       break;
3203     }
3204   va_end (args);
3205   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3206
3207   append_insn (&insn, ep, r);
3208 }
3209
3210 static void
3211 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3212                     va_list args)
3213 {
3214   struct mips_opcode *mo;
3215   struct mips_cl_insn insn;
3216   bfd_reloc_code_real_type r[3]
3217     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3218
3219   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3220   assert (mo);
3221   assert (strcmp (name, mo->name) == 0);
3222
3223   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3224     {
3225       ++mo;
3226       assert (mo->name);
3227       assert (strcmp (name, mo->name) == 0);
3228     }
3229
3230   create_insn (&insn, mo);
3231   for (;;)
3232     {
3233       int c;
3234
3235       c = *fmt++;
3236       switch (c)
3237         {
3238         case '\0':
3239           break;
3240
3241         case ',':
3242         case '(':
3243         case ')':
3244           continue;
3245
3246         case 'y':
3247         case 'w':
3248           MIPS16_INSERT_OPERAND (RY, insn, va_arg (args, int));
3249           continue;
3250
3251         case 'x':
3252         case 'v':
3253           MIPS16_INSERT_OPERAND (RX, insn, va_arg (args, int));
3254           continue;
3255
3256         case 'z':
3257           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (args, int));
3258           continue;
3259
3260         case 'Z':
3261           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (args, int));
3262           continue;
3263
3264         case '0':
3265         case 'S':
3266         case 'P':
3267         case 'R':
3268           continue;
3269
3270         case 'X':
3271           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (args, int));
3272           continue;
3273
3274         case 'Y':
3275           {
3276             int regno;
3277
3278             regno = va_arg (args, int);
3279             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3280             insn.insn_opcode |= regno << MIPS16OP_SH_REG32R;
3281           }
3282           continue;
3283
3284         case '<':
3285         case '>':
3286         case '4':
3287         case '5':
3288         case 'H':
3289         case 'W':
3290         case 'D':
3291         case 'j':
3292         case '8':
3293         case 'V':
3294         case 'C':
3295         case 'U':
3296         case 'k':
3297         case 'K':
3298         case 'p':
3299         case 'q':
3300           {
3301             assert (ep != NULL);
3302
3303             if (ep->X_op != O_constant)
3304               *r = (int) BFD_RELOC_UNUSED + c;
3305             else
3306               {
3307                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3308                               FALSE, &insn.insn_opcode, &insn.use_extend,
3309                               &insn.extend);
3310                 ep = NULL;
3311                 *r = BFD_RELOC_UNUSED;
3312               }
3313           }
3314           continue;
3315
3316         case '6':
3317           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (args, int));
3318           continue;
3319         }
3320
3321       break;
3322     }
3323
3324   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3325
3326   append_insn (&insn, ep, r);
3327 }
3328
3329 /*
3330  * Sign-extend 32-bit mode constants that have bit 31 set and all
3331  * higher bits unset.
3332  */
3333 static void
3334 normalize_constant_expr (expressionS *ex)
3335 {
3336   if (ex->X_op == O_constant
3337       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3338     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3339                         - 0x80000000);
3340 }
3341
3342 /*
3343  * Sign-extend 32-bit mode address offsets that have bit 31 set and
3344  * all higher bits unset.
3345  */
3346 static void
3347 normalize_address_expr (expressionS *ex)
3348 {
3349   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3350         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3351       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3352     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3353                         - 0x80000000);
3354 }
3355
3356 /*
3357  * Generate a "jalr" instruction with a relocation hint to the called
3358  * function.  This occurs in NewABI PIC code.
3359  */
3360 static void
3361 macro_build_jalr (expressionS *ep)
3362 {
3363   char *f = NULL;
3364
3365   if (HAVE_NEWABI)
3366     {
3367       frag_grow (8);
3368       f = frag_more (0);
3369     }
3370   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
3371   if (HAVE_NEWABI)
3372     fix_new_exp (frag_now, f - frag_now->fr_literal,
3373                  4, ep, FALSE, BFD_RELOC_MIPS_JALR);
3374 }
3375
3376 /*
3377  * Generate a "lui" instruction.
3378  */
3379 static void
3380 macro_build_lui (expressionS *ep, int regnum)
3381 {
3382   expressionS high_expr;
3383   const struct mips_opcode *mo;
3384   struct mips_cl_insn insn;
3385   bfd_reloc_code_real_type r[3]
3386     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3387   const char *name = "lui";
3388   const char *fmt = "t,u";
3389
3390   assert (! mips_opts.mips16);
3391
3392   high_expr = *ep;
3393
3394   if (high_expr.X_op == O_constant)
3395     {
3396       /* we can compute the instruction now without a relocation entry */
3397       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3398                                 >> 16) & 0xffff;
3399       *r = BFD_RELOC_UNUSED;
3400     }
3401   else
3402     {
3403       assert (ep->X_op == O_symbol);
3404       /* _gp_disp is a special case, used from s_cpload.
3405          __gnu_local_gp is used if mips_no_shared.  */
3406       assert (mips_pic == NO_PIC
3407               || (! HAVE_NEWABI
3408                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
3409               || (! mips_in_shared
3410                   && strcmp (S_GET_NAME (ep->X_add_symbol),
3411                              "__gnu_local_gp") == 0));
3412       *r = BFD_RELOC_HI16_S;
3413     }
3414
3415   mo = hash_find (op_hash, name);
3416   assert (strcmp (name, mo->name) == 0);
3417   assert (strcmp (fmt, mo->args) == 0);
3418   create_insn (&insn, mo);
3419
3420   insn.insn_opcode = insn.insn_mo->match;
3421   INSERT_OPERAND (RT, insn, regnum);
3422   if (*r == BFD_RELOC_UNUSED)
3423     {
3424       insn.insn_opcode |= high_expr.X_add_number;
3425       append_insn (&insn, NULL, r);
3426     }
3427   else
3428     append_insn (&insn, &high_expr, r);
3429 }
3430
3431 /* Generate a sequence of instructions to do a load or store from a constant
3432    offset off of a base register (breg) into/from a target register (treg),
3433    using AT if necessary.  */
3434 static void
3435 macro_build_ldst_constoffset (expressionS *ep, const char *op,
3436                               int treg, int breg, int dbl)
3437 {
3438   assert (ep->X_op == O_constant);
3439
3440   /* Sign-extending 32-bit constants makes their handling easier.  */
3441   if (!dbl)
3442     normalize_constant_expr (ep);
3443
3444   /* Right now, this routine can only handle signed 32-bit constants.  */
3445   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
3446     as_warn (_("operand overflow"));
3447
3448   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3449     {
3450       /* Signed 16-bit offset will fit in the op.  Easy!  */
3451       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
3452     }
3453   else
3454     {
3455       /* 32-bit offset, need multiple instructions and AT, like:
3456            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
3457            addu     $tempreg,$tempreg,$breg
3458            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
3459          to handle the complete offset.  */
3460       macro_build_lui (ep, AT);
3461       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
3462       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
3463
3464       if (mips_opts.noat)
3465         as_bad (_("Macro used $at after \".set noat\""));
3466     }
3467 }
3468
3469 /*                      set_at()
3470  * Generates code to set the $at register to true (one)
3471  * if reg is less than the immediate expression.
3472  */
3473 static void
3474 set_at (int reg, int unsignedp)
3475 {
3476   if (imm_expr.X_op == O_constant
3477       && imm_expr.X_add_number >= -0x8000
3478       && imm_expr.X_add_number < 0x8000)
3479     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
3480                  AT, reg, BFD_RELOC_LO16);
3481   else
3482     {
3483       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
3484       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
3485     }
3486 }
3487
3488 /* Warn if an expression is not a constant.  */
3489
3490 static void
3491 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
3492 {
3493   if (ex->X_op == O_big)
3494     as_bad (_("unsupported large constant"));
3495   else if (ex->X_op != O_constant)
3496     as_bad (_("Instruction %s requires absolute expression"),
3497             ip->insn_mo->name);
3498
3499   if (HAVE_32BIT_GPRS)
3500     normalize_constant_expr (ex);
3501 }
3502
3503 /* Count the leading zeroes by performing a binary chop. This is a
3504    bulky bit of source, but performance is a LOT better for the
3505    majority of values than a simple loop to count the bits:
3506        for (lcnt = 0; (lcnt < 32); lcnt++)
3507          if ((v) & (1 << (31 - lcnt)))
3508            break;
3509   However it is not code size friendly, and the gain will drop a bit
3510   on certain cached systems.
3511 */
3512 #define COUNT_TOP_ZEROES(v)             \
3513   (((v) & ~0xffff) == 0                 \
3514    ? ((v) & ~0xff) == 0                 \
3515      ? ((v) & ~0xf) == 0                \
3516        ? ((v) & ~0x3) == 0              \
3517          ? ((v) & ~0x1) == 0            \
3518            ? !(v)                       \
3519              ? 32                       \
3520              : 31                       \
3521            : 30                         \
3522          : ((v) & ~0x7) == 0            \
3523            ? 29                         \
3524            : 28                         \
3525        : ((v) & ~0x3f) == 0             \
3526          ? ((v) & ~0x1f) == 0           \
3527            ? 27                         \
3528            : 26                         \
3529          : ((v) & ~0x7f) == 0           \
3530            ? 25                         \
3531            : 24                         \
3532      : ((v) & ~0xfff) == 0              \
3533        ? ((v) & ~0x3ff) == 0            \
3534          ? ((v) & ~0x1ff) == 0          \
3535            ? 23                         \
3536            : 22                         \
3537          : ((v) & ~0x7ff) == 0          \
3538            ? 21                         \
3539            : 20                         \
3540        : ((v) & ~0x3fff) == 0           \
3541          ? ((v) & ~0x1fff) == 0         \
3542            ? 19                         \
3543            : 18                         \
3544          : ((v) & ~0x7fff) == 0         \
3545            ? 17                         \
3546            : 16                         \
3547    : ((v) & ~0xffffff) == 0             \
3548      ? ((v) & ~0xfffff) == 0            \
3549        ? ((v) & ~0x3ffff) == 0          \
3550          ? ((v) & ~0x1ffff) == 0        \
3551            ? 15                         \
3552            : 14                         \
3553          : ((v) & ~0x7ffff) == 0        \
3554            ? 13                         \
3555            : 12                         \
3556        : ((v) & ~0x3fffff) == 0         \
3557          ? ((v) & ~0x1fffff) == 0       \
3558            ? 11                         \
3559            : 10                         \
3560          : ((v) & ~0x7fffff) == 0       \
3561            ? 9                          \
3562            : 8                          \
3563      : ((v) & ~0xfffffff) == 0          \
3564        ? ((v) & ~0x3ffffff) == 0        \
3565          ? ((v) & ~0x1ffffff) == 0      \
3566            ? 7                          \
3567            : 6                          \
3568          : ((v) & ~0x7ffffff) == 0      \
3569            ? 5                          \
3570            : 4                          \
3571        : ((v) & ~0x3fffffff) == 0       \
3572          ? ((v) & ~0x1fffffff) == 0     \
3573            ? 3                          \
3574            : 2                          \
3575          : ((v) & ~0x7fffffff) == 0     \
3576            ? 1                          \
3577            : 0)
3578
3579 /*                      load_register()
3580  *  This routine generates the least number of instructions necessary to load
3581  *  an absolute expression value into a register.
3582  */
3583 static void
3584 load_register (int reg, expressionS *ep, int dbl)
3585 {
3586   int freg;
3587   expressionS hi32, lo32;
3588
3589   if (ep->X_op != O_big)
3590     {
3591       assert (ep->X_op == O_constant);
3592
3593       /* Sign-extending 32-bit constants makes their handling easier.  */
3594       if (!dbl)
3595         normalize_constant_expr (ep);
3596
3597       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
3598         {
3599           /* We can handle 16 bit signed values with an addiu to
3600              $zero.  No need to ever use daddiu here, since $zero and
3601              the result are always correct in 32 bit mode.  */
3602           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3603           return;
3604         }
3605       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3606         {
3607           /* We can handle 16 bit unsigned values with an ori to
3608              $zero.  */
3609           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3610           return;
3611         }
3612       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
3613         {
3614           /* 32 bit values require an lui.  */
3615           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
3616           if ((ep->X_add_number & 0xffff) != 0)
3617             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3618           return;
3619         }
3620     }
3621
3622   /* The value is larger than 32 bits.  */
3623
3624   if (!dbl || HAVE_32BIT_GPRS)
3625     {
3626       char value[32];
3627
3628       sprintf_vma (value, ep->X_add_number);
3629       as_bad (_("Number (0x%s) larger than 32 bits"), value);
3630       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3631       return;
3632     }
3633
3634   if (ep->X_op != O_big)
3635     {
3636       hi32 = *ep;
3637       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3638       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3639       hi32.X_add_number &= 0xffffffff;
3640       lo32 = *ep;
3641       lo32.X_add_number &= 0xffffffff;
3642     }
3643   else
3644     {
3645       assert (ep->X_add_number > 2);
3646       if (ep->X_add_number == 3)
3647         generic_bignum[3] = 0;
3648       else if (ep->X_add_number > 4)
3649         as_bad (_("Number larger than 64 bits"));
3650       lo32.X_op = O_constant;
3651       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
3652       hi32.X_op = O_constant;
3653       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
3654     }
3655
3656   if (hi32.X_add_number == 0)
3657     freg = 0;
3658   else
3659     {
3660       int shift, bit;
3661       unsigned long hi, lo;
3662
3663       if (hi32.X_add_number == (offsetT) 0xffffffff)
3664         {
3665           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
3666             {
3667               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3668               return;
3669             }
3670           if (lo32.X_add_number & 0x80000000)
3671             {
3672               macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
3673               if (lo32.X_add_number & 0xffff)
3674                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3675               return;
3676             }
3677         }
3678
3679       /* Check for 16bit shifted constant.  We know that hi32 is
3680          non-zero, so start the mask on the first bit of the hi32
3681          value.  */
3682       shift = 17;
3683       do
3684         {
3685           unsigned long himask, lomask;
3686
3687           if (shift < 32)
3688             {
3689               himask = 0xffff >> (32 - shift);
3690               lomask = (0xffff << shift) & 0xffffffff;
3691             }
3692           else
3693             {
3694               himask = 0xffff << (shift - 32);
3695               lomask = 0;
3696             }
3697           if ((hi32.X_add_number & ~(offsetT) himask) == 0
3698               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
3699             {
3700               expressionS tmp;
3701
3702               tmp.X_op = O_constant;
3703               if (shift < 32)
3704                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
3705                                     | (lo32.X_add_number >> shift));
3706               else
3707                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
3708               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3709               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
3710                            reg, reg, (shift >= 32) ? shift - 32 : shift);
3711               return;
3712             }
3713           ++shift;
3714         }
3715       while (shift <= (64 - 16));
3716
3717       /* Find the bit number of the lowest one bit, and store the
3718          shifted value in hi/lo.  */
3719       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
3720       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
3721       if (lo != 0)
3722         {
3723           bit = 0;
3724           while ((lo & 1) == 0)
3725             {
3726               lo >>= 1;
3727               ++bit;
3728             }
3729           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
3730           hi >>= bit;
3731         }
3732       else
3733         {
3734           bit = 32;
3735           while ((hi & 1) == 0)
3736             {
3737               hi >>= 1;
3738               ++bit;
3739             }
3740           lo = hi;
3741           hi = 0;
3742         }
3743
3744       /* Optimize if the shifted value is a (power of 2) - 1.  */
3745       if ((hi == 0 && ((lo + 1) & lo) == 0)
3746           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
3747         {
3748           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
3749           if (shift != 0)
3750             {
3751               expressionS tmp;
3752
3753               /* This instruction will set the register to be all
3754                  ones.  */
3755               tmp.X_op = O_constant;
3756               tmp.X_add_number = (offsetT) -1;
3757               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3758               if (bit != 0)
3759                 {
3760                   bit += shift;
3761                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
3762                                reg, reg, (bit >= 32) ? bit - 32 : bit);
3763                 }
3764               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
3765                            reg, reg, (shift >= 32) ? shift - 32 : shift);
3766               return;
3767             }
3768         }
3769
3770       /* Sign extend hi32 before calling load_register, because we can
3771          generally get better code when we load a sign extended value.  */
3772       if ((hi32.X_add_number & 0x80000000) != 0)
3773         hi32.X_add_number |= ~(offsetT) 0xffffffff;
3774       load_register (reg, &hi32, 0);
3775       freg = reg;
3776     }
3777   if ((lo32.X_add_number & 0xffff0000) == 0)
3778     {
3779       if (freg != 0)
3780         {
3781           macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
3782           freg = reg;
3783         }
3784     }
3785   else
3786     {
3787       expressionS mid16;
3788
3789       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
3790         {
3791           macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
3792           macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
3793           return;
3794         }
3795
3796       if (freg != 0)
3797         {
3798           macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
3799           freg = reg;
3800         }
3801       mid16 = lo32;
3802       mid16.X_add_number >>= 16;
3803       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
3804       macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
3805       freg = reg;
3806     }
3807   if ((lo32.X_add_number & 0xffff) != 0)
3808     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
3809 }
3810
3811 static inline void
3812 load_delay_nop (void)
3813 {
3814   if (!gpr_interlocks)
3815     macro_build (NULL, "nop", "");
3816 }
3817
3818 /* Load an address into a register.  */
3819
3820 static void
3821 load_address (int reg, expressionS *ep, int *used_at)
3822 {
3823   if (ep->X_op != O_constant
3824       && ep->X_op != O_symbol)
3825     {
3826       as_bad (_("expression too complex"));
3827       ep->X_op = O_constant;
3828     }
3829
3830   if (ep->X_op == O_constant)
3831     {
3832       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
3833       return;
3834     }
3835
3836   if (mips_pic == NO_PIC)
3837     {
3838       /* If this is a reference to a GP relative symbol, we want
3839            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
3840          Otherwise we want
3841            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
3842            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
3843          If we have an addend, we always use the latter form.
3844
3845          With 64bit address space and a usable $at we want
3846            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
3847            lui          $at,<sym>               (BFD_RELOC_HI16_S)
3848            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
3849            daddiu       $at,<sym>               (BFD_RELOC_LO16)
3850            dsll32       $reg,0
3851            daddu        $reg,$reg,$at
3852
3853          If $at is already in use, we use a path which is suboptimal
3854          on superscalar processors.
3855            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
3856            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
3857            dsll         $reg,16
3858            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
3859            dsll         $reg,16
3860            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
3861
3862          For GP relative symbols in 64bit address space we can use
3863          the same sequence as in 32bit address space.  */
3864       if (HAVE_64BIT_SYMBOLS)
3865         {
3866           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
3867               && !nopic_need_relax (ep->X_add_symbol, 1))
3868             {
3869               relax_start (ep->X_add_symbol);
3870               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
3871                            mips_gp_register, BFD_RELOC_GPREL16);
3872               relax_switch ();
3873             }
3874
3875           if (*used_at == 0 && !mips_opts.noat)
3876             {
3877               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
3878               macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
3879               macro_build (ep, "daddiu", "t,r,j", reg, reg,
3880                            BFD_RELOC_MIPS_HIGHER);
3881               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
3882               macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
3883               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
3884               *used_at = 1;
3885             }
3886           else
3887             {
3888               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
3889               macro_build (ep, "daddiu", "t,r,j", reg, reg,
3890                            BFD_RELOC_MIPS_HIGHER);
3891               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
3892               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
3893               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
3894               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
3895             }
3896
3897           if (mips_relax.sequence)
3898             relax_end ();
3899         }
3900       else
3901         {
3902           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
3903               && !nopic_need_relax (ep->X_add_symbol, 1))
3904             {
3905               relax_start (ep->X_add_symbol);
3906               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
3907                            mips_gp_register, BFD_RELOC_GPREL16);
3908               relax_switch ();
3909             }
3910           macro_build_lui (ep, reg);
3911           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
3912                        reg, reg, BFD_RELOC_LO16);
3913           if (mips_relax.sequence)
3914             relax_end ();
3915         }
3916     }
3917   else if (!mips_big_got)
3918     {
3919       expressionS ex;
3920
3921       /* If this is a reference to an external symbol, we want
3922            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
3923          Otherwise we want
3924            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
3925            nop
3926            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
3927          If there is a constant, it must be added in after.
3928
3929          If we have NewABI, we want
3930            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
3931          unless we're referencing a global symbol with a non-zero
3932          offset, in which case cst must be added separately.  */
3933       if (HAVE_NEWABI)
3934         {
3935           if (ep->X_add_number)
3936             {
3937               ex.X_add_number = ep->X_add_number;
3938               ep->X_add_number = 0;
3939               relax_start (ep->X_add_symbol);
3940               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
3941                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
3942               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3943                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3944               ex.X_op = O_constant;
3945               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
3946                            reg, reg, BFD_RELOC_LO16);
3947               ep->X_add_number = ex.X_add_number;
3948               relax_switch ();
3949             }
3950           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
3951                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
3952           if (mips_relax.sequence)
3953             relax_end ();
3954         }
3955       else
3956         {
3957           ex.X_add_number = ep->X_add_number;
3958           ep->X_add_number = 0;
3959           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
3960                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
3961           load_delay_nop ();
3962           relax_start (ep->X_add_symbol);
3963           relax_switch ();
3964           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
3965                        BFD_RELOC_LO16);
3966           relax_end ();
3967
3968           if (ex.X_add_number != 0)
3969             {
3970               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3971                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3972               ex.X_op = O_constant;
3973               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
3974                            reg, reg, BFD_RELOC_LO16);
3975             }
3976         }
3977     }
3978   else if (mips_big_got)
3979     {
3980       expressionS ex;
3981
3982       /* This is the large GOT case.  If this is a reference to an
3983          external symbol, we want
3984            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
3985            addu         $reg,$reg,$gp
3986            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
3987
3988          Otherwise, for a reference to a local symbol in old ABI, we want
3989            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
3990            nop
3991            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
3992          If there is a constant, it must be added in after.
3993
3994          In the NewABI, for local symbols, with or without offsets, we want:
3995            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
3996            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
3997       */
3998       if (HAVE_NEWABI)
3999         {
4000           ex.X_add_number = ep->X_add_number;
4001           ep->X_add_number = 0;
4002           relax_start (ep->X_add_symbol);
4003           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4004           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4005                        reg, reg, mips_gp_register);
4006           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4007                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4008           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4009             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4010           else if (ex.X_add_number)
4011             {
4012               ex.X_op = O_constant;
4013               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4014                            BFD_RELOC_LO16);
4015             }
4016
4017           ep->X_add_number = ex.X_add_number;
4018           relax_switch ();
4019           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4020                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4021           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4022                        BFD_RELOC_MIPS_GOT_OFST);
4023           relax_end ();
4024         }
4025       else
4026         {
4027           ex.X_add_number = ep->X_add_number;
4028           ep->X_add_number = 0;
4029           relax_start (ep->X_add_symbol);
4030           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4031           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4032                        reg, reg, mips_gp_register);
4033           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4034                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4035           relax_switch ();
4036           if (reg_needs_delay (mips_gp_register))
4037             {
4038               /* We need a nop before loading from $gp.  This special
4039                  check is required because the lui which starts the main
4040                  instruction stream does not refer to $gp, and so will not
4041                  insert the nop which may be required.  */
4042               macro_build (NULL, "nop", "");
4043             }
4044           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4045                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4046           load_delay_nop ();
4047           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4048                        BFD_RELOC_LO16);
4049           relax_end ();
4050
4051           if (ex.X_add_number != 0)
4052             {
4053               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4054                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4055               ex.X_op = O_constant;
4056               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4057                            BFD_RELOC_LO16);
4058             }
4059         }
4060     }
4061   else
4062     abort ();
4063
4064   if (mips_opts.noat && *used_at == 1)
4065     as_bad (_("Macro used $at after \".set noat\""));
4066 }
4067
4068 /* Move the contents of register SOURCE into register DEST.  */
4069
4070 static void
4071 move_register (int dest, int source)
4072 {
4073   macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4074                dest, source, 0);
4075 }
4076
4077 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4078    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4079    The two alternatives are:
4080
4081    Global symbol                Local sybmol
4082    -------------                ------------
4083    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
4084    ...                          ...
4085    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4086
4087    load_got_offset emits the first instruction and add_got_offset
4088    emits the second for a 16-bit offset or add_got_offset_hilo emits
4089    a sequence to add a 32-bit offset using a scratch register.  */
4090
4091 static void
4092 load_got_offset (int dest, expressionS *local)
4093 {
4094   expressionS global;
4095
4096   global = *local;
4097   global.X_add_number = 0;
4098
4099   relax_start (local->X_add_symbol);
4100   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4101                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4102   relax_switch ();
4103   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4104                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4105   relax_end ();
4106 }
4107
4108 static void
4109 add_got_offset (int dest, expressionS *local)
4110 {
4111   expressionS global;
4112
4113   global.X_op = O_constant;
4114   global.X_op_symbol = NULL;
4115   global.X_add_symbol = NULL;
4116   global.X_add_number = local->X_add_number;
4117
4118   relax_start (local->X_add_symbol);
4119   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4120                dest, dest, BFD_RELOC_LO16);
4121   relax_switch ();
4122   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4123   relax_end ();
4124 }
4125
4126 static void
4127 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4128 {
4129   expressionS global;
4130   int hold_mips_optimize;
4131
4132   global.X_op = O_constant;
4133   global.X_op_symbol = NULL;
4134   global.X_add_symbol = NULL;
4135   global.X_add_number = local->X_add_number;
4136
4137   relax_start (local->X_add_symbol);
4138   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4139   relax_switch ();
4140   /* Set mips_optimize around the lui instruction to avoid
4141      inserting an unnecessary nop after the lw.  */
4142   hold_mips_optimize = mips_optimize;
4143   mips_optimize = 2;
4144   macro_build_lui (&global, tmp);
4145   mips_optimize = hold_mips_optimize;
4146   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4147   relax_end ();
4148
4149   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4150 }
4151
4152 /*
4153  *                      Build macros
4154  *   This routine implements the seemingly endless macro or synthesized
4155  * instructions and addressing modes in the mips assembly language. Many
4156  * of these macros are simple and are similar to each other. These could
4157  * probably be handled by some kind of table or grammar approach instead of
4158  * this verbose method. Others are not simple macros but are more like
4159  * optimizing code generation.
4160  *   One interesting optimization is when several store macros appear
4161  * consecutively that would load AT with the upper half of the same address.
4162  * The ensuing load upper instructions are ommited. This implies some kind
4163  * of global optimization. We currently only optimize within a single macro.
4164  *   For many of the load and store macros if the address is specified as a
4165  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4166  * first load register 'at' with zero and use it as the base register. The
4167  * mips assembler simply uses register $zero. Just one tiny optimization
4168  * we're missing.
4169  */
4170 static void
4171 macro (struct mips_cl_insn *ip)
4172 {
4173   register int treg, sreg, dreg, breg;
4174   int tempreg;
4175   int mask;
4176   int used_at = 0;
4177   expressionS expr1;
4178   const char *s;
4179   const char *s2;
4180   const char *fmt;
4181   int likely = 0;
4182   int dbl = 0;
4183   int coproc = 0;
4184   int lr = 0;
4185   int imm = 0;
4186   int call = 0;
4187   int off;
4188   offsetT maxnum;
4189   bfd_reloc_code_real_type r;
4190   int hold_mips_optimize;
4191
4192   assert (! mips_opts.mips16);
4193
4194   treg = (ip->insn_opcode >> 16) & 0x1f;
4195   dreg = (ip->insn_opcode >> 11) & 0x1f;
4196   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4197   mask = ip->insn_mo->mask;
4198
4199   expr1.X_op = O_constant;
4200   expr1.X_op_symbol = NULL;
4201   expr1.X_add_symbol = NULL;
4202   expr1.X_add_number = 1;
4203
4204   switch (mask)
4205     {
4206     case M_DABS:
4207       dbl = 1;
4208     case M_ABS:
4209       /* bgez $a0,.+12
4210          move v0,$a0
4211          sub v0,$zero,$a0
4212          */
4213
4214       start_noreorder ();
4215
4216       expr1.X_add_number = 8;
4217       macro_build (&expr1, "bgez", "s,p", sreg);
4218       if (dreg == sreg)
4219         macro_build (NULL, "nop", "", 0);
4220       else
4221         move_register (dreg, sreg);
4222       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4223
4224       end_noreorder ();
4225       break;
4226
4227     case M_ADD_I:
4228       s = "addi";
4229       s2 = "add";
4230       goto do_addi;
4231     case M_ADDU_I:
4232       s = "addiu";
4233       s2 = "addu";
4234       goto do_addi;
4235     case M_DADD_I:
4236       dbl = 1;
4237       s = "daddi";
4238       s2 = "dadd";
4239       goto do_addi;
4240     case M_DADDU_I:
4241       dbl = 1;
4242       s = "daddiu";
4243       s2 = "daddu";
4244     do_addi:
4245       if (imm_expr.X_op == O_constant
4246           && imm_expr.X_add_number >= -0x8000
4247           && imm_expr.X_add_number < 0x8000)
4248         {
4249           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4250           break;
4251         }
4252       used_at = 1;
4253       load_register (AT, &imm_expr, dbl);
4254       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4255       break;
4256
4257     case M_AND_I:
4258       s = "andi";
4259       s2 = "and";
4260       goto do_bit;
4261     case M_OR_I:
4262       s = "ori";
4263       s2 = "or";
4264       goto do_bit;
4265     case M_NOR_I:
4266       s = "";
4267       s2 = "nor";
4268       goto do_bit;
4269     case M_XOR_I:
4270       s = "xori";
4271       s2 = "xor";
4272     do_bit:
4273       if (imm_expr.X_op == O_constant
4274           && imm_expr.X_add_number >= 0
4275           && imm_expr.X_add_number < 0x10000)
4276         {
4277           if (mask != M_NOR_I)
4278             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4279           else
4280             {
4281               macro_build (&imm_expr, "ori", "t,r,i",
4282                            treg, sreg, BFD_RELOC_LO16);
4283               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4284             }
4285           break;
4286         }
4287
4288       used_at = 1;
4289       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4290       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4291       break;
4292
4293     case M_BEQ_I:
4294       s = "beq";
4295       goto beq_i;
4296     case M_BEQL_I:
4297       s = "beql";
4298       likely = 1;
4299       goto beq_i;
4300     case M_BNE_I:
4301       s = "bne";
4302       goto beq_i;
4303     case M_BNEL_I:
4304       s = "bnel";
4305       likely = 1;
4306     beq_i:
4307       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4308         {
4309           macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4310           break;
4311         }
4312       used_at = 1;
4313       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4314       macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4315       break;
4316
4317     case M_BGEL:
4318       likely = 1;
4319     case M_BGE:
4320       if (treg == 0)
4321         {
4322           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4323           break;
4324         }
4325       if (sreg == 0)
4326         {
4327           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4328           break;
4329         }
4330       used_at = 1;
4331       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4332       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4333       break;
4334
4335     case M_BGTL_I:
4336       likely = 1;
4337     case M_BGT_I:
4338       /* check for > max integer */
4339       maxnum = 0x7fffffff;
4340       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4341         {
4342           maxnum <<= 16;
4343           maxnum |= 0xffff;
4344           maxnum <<= 16;
4345           maxnum |= 0xffff;
4346         }
4347       if (imm_expr.X_op == O_constant
4348           && imm_expr.X_add_number >= maxnum
4349           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4350         {
4351         do_false:
4352           /* result is always false */
4353           if (! likely)
4354             macro_build (NULL, "nop", "", 0);
4355           else
4356             macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
4357           break;
4358         }
4359       if (imm_expr.X_op != O_constant)
4360         as_bad (_("Unsupported large constant"));
4361       ++imm_expr.X_add_number;
4362       /* FALLTHROUGH */
4363     case M_BGE_I:
4364     case M_BGEL_I:
4365       if (mask == M_BGEL_I)
4366         likely = 1;
4367       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4368         {
4369           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4370           break;
4371         }
4372       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4373         {
4374           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4375           break;
4376         }
4377       maxnum = 0x7fffffff;
4378       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4379         {
4380           maxnum <<= 16;
4381           maxnum |= 0xffff;
4382           maxnum <<= 16;
4383           maxnum |= 0xffff;
4384         }
4385       maxnum = - maxnum - 1;
4386       if (imm_expr.X_op == O_constant
4387           && imm_expr.X_add_number <= maxnum
4388           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4389         {
4390         do_true:
4391           /* result is always true */
4392           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4393           macro_build (&offset_expr, "b", "p");
4394           break;
4395         }
4396       used_at = 1;
4397       set_at (sreg, 0);
4398       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4399       break;
4400
4401     case M_BGEUL:
4402       likely = 1;
4403     case M_BGEU:
4404       if (treg == 0)
4405         goto do_true;
4406       if (sreg == 0)
4407         {
4408           macro_build (&offset_expr, likely ? "beql" : "beq",
4409                        "s,t,p", 0, treg);
4410           break;
4411         }
4412       used_at = 1;
4413       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4414       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4415       break;
4416
4417     case M_BGTUL_I:
4418       likely = 1;
4419     case M_BGTU_I:
4420       if (sreg == 0
4421           || (HAVE_32BIT_GPRS
4422               && imm_expr.X_op == O_constant
4423               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4424         goto do_false;
4425       if (imm_expr.X_op != O_constant)
4426         as_bad (_("Unsupported large constant"));
4427       ++imm_expr.X_add_number;
4428       /* FALLTHROUGH */
4429     case M_BGEU_I:
4430     case M_BGEUL_I:
4431       if (mask == M_BGEUL_I)
4432         likely = 1;
4433       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4434         goto do_true;
4435       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4436         {
4437           macro_build (&offset_expr, likely ? "bnel" : "bne",
4438                        "s,t,p", sreg, 0);
4439           break;
4440         }
4441       used_at = 1;
4442       set_at (sreg, 1);
4443       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4444       break;
4445
4446     case M_BGTL:
4447       likely = 1;
4448     case M_BGT:
4449       if (treg == 0)
4450         {
4451           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4452           break;
4453         }
4454       if (sreg == 0)
4455         {
4456           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
4457           break;
4458         }
4459       used_at = 1;
4460       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4461       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4462       break;
4463
4464     case M_BGTUL:
4465       likely = 1;
4466     case M_BGTU:
4467       if (treg == 0)
4468         {
4469           macro_build (&offset_expr, likely ? "bnel" : "bne",
4470                        "s,t,p", sreg, 0);
4471           break;
4472         }
4473       if (sreg == 0)
4474         goto do_false;
4475       used_at = 1;
4476       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4477       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4478       break;
4479
4480     case M_BLEL:
4481       likely = 1;
4482     case M_BLE:
4483       if (treg == 0)
4484         {
4485           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4486           break;
4487         }
4488       if (sreg == 0)
4489         {
4490           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
4491           break;
4492         }
4493       used_at = 1;
4494       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4495       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4496       break;
4497
4498     case M_BLEL_I:
4499       likely = 1;
4500     case M_BLE_I:
4501       maxnum = 0x7fffffff;
4502       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4503         {
4504           maxnum <<= 16;
4505           maxnum |= 0xffff;
4506           maxnum <<= 16;
4507           maxnum |= 0xffff;
4508         }
4509       if (imm_expr.X_op == O_constant
4510           && imm_expr.X_add_number >= maxnum
4511           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4512         goto do_true;
4513       if (imm_expr.X_op != O_constant)
4514         as_bad (_("Unsupported large constant"));
4515       ++imm_expr.X_add_number;
4516       /* FALLTHROUGH */
4517     case M_BLT_I:
4518     case M_BLTL_I:
4519       if (mask == M_BLTL_I)
4520         likely = 1;
4521       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4522         {
4523           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4524           break;
4525         }
4526       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4527         {
4528           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4529           break;
4530         }
4531       used_at = 1;
4532       set_at (sreg, 0);
4533       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4534       break;
4535
4536     case M_BLEUL:
4537       likely = 1;
4538     case M_BLEU:
4539       if (treg == 0)
4540         {
4541           macro_build (&offset_expr, likely ? "beql" : "beq",
4542                        "s,t,p", sreg, 0);
4543           break;
4544         }
4545       if (sreg == 0)
4546         goto do_true;
4547       used_at = 1;
4548       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4549       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4550       break;
4551
4552     case M_BLEUL_I:
4553       likely = 1;
4554     case M_BLEU_I:
4555       if (sreg == 0
4556           || (HAVE_32BIT_GPRS
4557               && imm_expr.X_op == O_constant
4558               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4559         goto do_true;
4560       if (imm_expr.X_op != O_constant)
4561         as_bad (_("Unsupported large constant"));
4562       ++imm_expr.X_add_number;
4563       /* FALLTHROUGH */
4564     case M_BLTU_I:
4565     case M_BLTUL_I:
4566       if (mask == M_BLTUL_I)
4567         likely = 1;
4568       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4569         goto do_false;
4570       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4571         {
4572           macro_build (&offset_expr, likely ? "beql" : "beq",
4573                        "s,t,p", sreg, 0);
4574           break;
4575         }
4576       used_at = 1;
4577       set_at (sreg, 1);
4578       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4579       break;
4580
4581     case M_BLTL:
4582       likely = 1;
4583     case M_BLT:
4584       if (treg == 0)
4585         {
4586           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4587           break;
4588         }
4589       if (sreg == 0)
4590         {
4591           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
4592           break;
4593         }
4594       used_at = 1;
4595       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4596       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4597       break;
4598
4599     case M_BLTUL:
4600       likely = 1;
4601     case M_BLTU:
4602       if (treg == 0)
4603         goto do_false;
4604       if (sreg == 0)
4605         {
4606           macro_build (&offset_expr, likely ? "bnel" : "bne",
4607                        "s,t,p", 0, treg);
4608           break;
4609         }
4610       used_at = 1;
4611       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4612       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4613       break;
4614
4615     case M_DEXT:
4616       {
4617         unsigned long pos;
4618         unsigned long size;
4619
4620         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
4621           {
4622             as_bad (_("Unsupported large constant"));
4623             pos = size = 1;
4624           }
4625         else
4626           {
4627             pos = (unsigned long) imm_expr.X_add_number;
4628             size = (unsigned long) imm2_expr.X_add_number;
4629           }
4630
4631         if (pos > 63)
4632           {
4633             as_bad (_("Improper position (%lu)"), pos);
4634             pos = 1;
4635           }
4636         if (size == 0 || size > 64
4637             || (pos + size - 1) > 63)
4638           {
4639             as_bad (_("Improper extract size (%lu, position %lu)"),
4640                     size, pos);
4641             size = 1;
4642           }
4643
4644         if (size <= 32 && pos < 32)
4645           {
4646             s = "dext";
4647             fmt = "t,r,+A,+C";
4648           }
4649         else if (size <= 32)
4650           {
4651             s = "dextu";
4652             fmt = "t,r,+E,+H";
4653           }
4654         else
4655           {
4656             s = "dextm";
4657             fmt = "t,r,+A,+G";
4658           }
4659         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
4660       }
4661       break;
4662
4663     case M_DINS:
4664       {
4665         unsigned long pos;
4666         unsigned long size;
4667
4668         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
4669           {
4670             as_bad (_("Unsupported large constant"));
4671             pos = size = 1;
4672           }
4673         else
4674           {
4675             pos = (unsigned long) imm_expr.X_add_number;
4676             size = (unsigned long) imm2_expr.X_add_number;
4677           }
4678
4679         if (pos > 63)
4680           {
4681             as_bad (_("Improper position (%lu)"), pos);
4682             pos = 1;
4683           }
4684         if (size == 0 || size > 64
4685             || (pos + size - 1) > 63)
4686           {
4687             as_bad (_("Improper insert size (%lu, position %lu)"),
4688                     size, pos);
4689             size = 1;
4690           }
4691
4692         if (pos < 32 && (pos + size - 1) < 32)
4693           {
4694             s = "dins";
4695             fmt = "t,r,+A,+B";
4696           }
4697         else if (pos >= 32)
4698           {
4699             s = "dinsu";
4700             fmt = "t,r,+E,+F";
4701           }
4702         else
4703           {
4704             s = "dinsm";
4705             fmt = "t,r,+A,+F";
4706           }
4707         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos,
4708                      pos + size - 1);
4709       }
4710       break;
4711
4712     case M_DDIV_3:
4713       dbl = 1;
4714     case M_DIV_3:
4715       s = "mflo";
4716       goto do_div3;
4717     case M_DREM_3:
4718       dbl = 1;
4719     case M_REM_3:
4720       s = "mfhi";
4721     do_div3:
4722       if (treg == 0)
4723         {
4724           as_warn (_("Divide by zero."));
4725           if (mips_trap)
4726             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
4727           else
4728             macro_build (NULL, "break", "c", 7);
4729           break;
4730         }
4731
4732       start_noreorder ();
4733       if (mips_trap)
4734         {
4735           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
4736           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
4737         }
4738       else
4739         {
4740           expr1.X_add_number = 8;
4741           macro_build (&expr1, "bne", "s,t,p", treg, 0);
4742           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
4743           macro_build (NULL, "break", "c", 7);
4744         }
4745       expr1.X_add_number = -1;
4746       used_at = 1;
4747       load_register (AT, &expr1, dbl);
4748       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
4749       macro_build (&expr1, "bne", "s,t,p", treg, AT);
4750       if (dbl)
4751         {
4752           expr1.X_add_number = 1;
4753           load_register (AT, &expr1, dbl);
4754           macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
4755         }
4756       else
4757         {
4758           expr1.X_add_number = 0x80000000;
4759           macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
4760         }
4761       if (mips_trap)
4762         {
4763           macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
4764           /* We want to close the noreorder block as soon as possible, so
4765              that later insns are available for delay slot filling.  */
4766           end_noreorder ();
4767         }
4768       else
4769         {
4770           expr1.X_add_number = 8;
4771           macro_build (&expr1, "bne", "s,t,p", sreg, AT);
4772           macro_build (NULL, "nop", "", 0);
4773
4774           /* We want to close the noreorder block as soon as possible, so
4775              that later insns are available for delay slot filling.  */
4776           end_noreorder ();
4777
4778           macro_build (NULL, "break", "c", 6);
4779         }
4780       macro_build (NULL, s, "d", dreg);
4781       break;
4782
4783     case M_DIV_3I:
4784       s = "div";
4785       s2 = "mflo";
4786       goto do_divi;
4787     case M_DIVU_3I:
4788       s = "divu";
4789       s2 = "mflo";
4790       goto do_divi;
4791     case M_REM_3I:
4792       s = "div";
4793       s2 = "mfhi";
4794       goto do_divi;
4795     case M_REMU_3I:
4796       s = "divu";
4797       s2 = "mfhi";
4798       goto do_divi;
4799     case M_DDIV_3I:
4800       dbl = 1;
4801       s = "ddiv";
4802       s2 = "mflo";
4803       goto do_divi;
4804     case M_DDIVU_3I:
4805       dbl = 1;
4806       s = "ddivu";
4807       s2 = "mflo";
4808       goto do_divi;
4809     case M_DREM_3I:
4810       dbl = 1;
4811       s = "ddiv";
4812       s2 = "mfhi";
4813       goto do_divi;
4814     case M_DREMU_3I:
4815       dbl = 1;
4816       s = "ddivu";
4817       s2 = "mfhi";
4818     do_divi:
4819       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4820         {
4821           as_warn (_("Divide by zero."));
4822           if (mips_trap)
4823             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
4824           else
4825             macro_build (NULL, "break", "c", 7);
4826           break;
4827         }
4828       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4829         {
4830           if (strcmp (s2, "mflo") == 0)
4831             move_register (dreg, sreg);
4832           else
4833             move_register (dreg, 0);
4834           break;
4835         }
4836       if (imm_expr.X_op == O_constant
4837           && imm_expr.X_add_number == -1
4838           && s[strlen (s) - 1] != 'u')
4839         {
4840           if (strcmp (s2, "mflo") == 0)
4841             {
4842               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
4843             }
4844           else
4845             move_register (dreg, 0);
4846           break;
4847         }
4848
4849       used_at = 1;
4850       load_register (AT, &imm_expr, dbl);
4851       macro_build (NULL, s, "z,s,t", sreg, AT);
4852       macro_build (NULL, s2, "d", dreg);
4853       break;
4854
4855     case M_DIVU_3:
4856       s = "divu";
4857       s2 = "mflo";
4858       goto do_divu3;
4859     case M_REMU_3:
4860       s = "divu";
4861       s2 = "mfhi";
4862       goto do_divu3;
4863     case M_DDIVU_3:
4864       s = "ddivu";
4865       s2 = "mflo";
4866       goto do_divu3;
4867     case M_DREMU_3:
4868       s = "ddivu";
4869       s2 = "mfhi";
4870     do_divu3:
4871       start_noreorder ();
4872       if (mips_trap)
4873         {
4874           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
4875           macro_build (NULL, s, "z,s,t", sreg, treg);
4876           /* We want to close the noreorder block as soon as possible, so
4877              that later insns are available for delay slot filling.  */
4878           end_noreorder ();
4879         }
4880       else
4881         {
4882           expr1.X_add_number = 8;
4883           macro_build (&expr1, "bne", "s,t,p", treg, 0);
4884           macro_build (NULL, s, "z,s,t", sreg, treg);
4885
4886           /* We want to close the noreorder block as soon as possible, so
4887              that later insns are available for delay slot filling.  */
4888           end_noreorder ();
4889           macro_build (NULL, "break", "c", 7);
4890         }
4891       macro_build (NULL, s2, "d", dreg);
4892       break;
4893
4894     case M_DLCA_AB:
4895       dbl = 1;
4896     case M_LCA_AB:
4897       call = 1;
4898       goto do_la;
4899     case M_DLA_AB:
4900       dbl = 1;
4901     case M_LA_AB:
4902     do_la:
4903       /* Load the address of a symbol into a register.  If breg is not
4904          zero, we then add a base register to it.  */
4905
4906       if (dbl && HAVE_32BIT_GPRS)
4907         as_warn (_("dla used to load 32-bit register"));
4908
4909       if (! dbl && HAVE_64BIT_OBJECTS)
4910         as_warn (_("la used to load 64-bit address"));
4911
4912       if (offset_expr.X_op == O_constant
4913           && offset_expr.X_add_number >= -0x8000
4914           && offset_expr.X_add_number < 0x8000)
4915         {
4916           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
4917                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
4918           break;
4919         }
4920
4921       if (!mips_opts.noat && (treg == breg))
4922         {
4923           tempreg = AT;
4924           used_at = 1;
4925         }
4926       else
4927         {
4928           tempreg = treg;
4929         }
4930
4931       if (offset_expr.X_op != O_symbol
4932           && offset_expr.X_op != O_constant)
4933         {
4934           as_bad (_("expression too complex"));
4935           offset_expr.X_op = O_constant;
4936         }
4937
4938       if (offset_expr.X_op == O_constant)
4939         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
4940       else if (mips_pic == NO_PIC)
4941         {
4942           /* If this is a reference to a GP relative symbol, we want
4943                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
4944              Otherwise we want
4945                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
4946                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
4947              If we have a constant, we need two instructions anyhow,
4948              so we may as well always use the latter form.
4949
4950              With 64bit address space and a usable $at we want
4951                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
4952                lui      $at,<sym>               (BFD_RELOC_HI16_S)
4953                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
4954                daddiu   $at,<sym>               (BFD_RELOC_LO16)
4955                dsll32   $tempreg,0
4956                daddu    $tempreg,$tempreg,$at
4957
4958              If $at is already in use, we use a path which is suboptimal
4959              on superscalar processors.
4960                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
4961                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
4962                dsll     $tempreg,16
4963                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
4964                dsll     $tempreg,16
4965                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
4966
4967              For GP relative symbols in 64bit address space we can use
4968              the same sequence as in 32bit address space.  */
4969           if (HAVE_64BIT_SYMBOLS)
4970             {
4971               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
4972                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
4973                 {
4974                   relax_start (offset_expr.X_add_symbol);
4975                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
4976                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
4977                   relax_switch ();
4978                 }
4979
4980               if (used_at == 0 && !mips_opts.noat)
4981                 {
4982                   macro_build (&offset_expr, "lui", "t,u",
4983                                tempreg, BFD_RELOC_MIPS_HIGHEST);
4984                   macro_build (&offset_expr, "lui", "t,u",
4985                                AT, BFD_RELOC_HI16_S);
4986                   macro_build (&offset_expr, "daddiu", "t,r,j",
4987                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
4988                   macro_build (&offset_expr, "daddiu", "t,r,j",
4989                                AT, AT, BFD_RELOC_LO16);
4990                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
4991                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
4992                   used_at = 1;
4993                 }
4994               else
4995                 {
4996                   macro_build (&offset_expr, "lui", "t,u",
4997                                tempreg, BFD_RELOC_MIPS_HIGHEST);
4998                   macro_build (&offset_expr, "daddiu", "t,r,j",
4999                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5000                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5001                   macro_build (&offset_expr, "daddiu", "t,r,j",
5002                                tempreg, tempreg, BFD_RELOC_HI16_S);
5003                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5004                   macro_build (&offset_expr, "daddiu", "t,r,j",
5005                                tempreg, tempreg, BFD_RELOC_LO16);
5006                 }
5007
5008               if (mips_relax.sequence)
5009                 relax_end ();
5010             }
5011           else
5012             {
5013               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5014                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5015                 {
5016                   relax_start (offset_expr.X_add_symbol);
5017                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5018                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5019                   relax_switch ();
5020                 }
5021               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5022                 as_bad (_("offset too large"));
5023               macro_build_lui (&offset_expr, tempreg);
5024               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5025                            tempreg, tempreg, BFD_RELOC_LO16);
5026               if (mips_relax.sequence)
5027                 relax_end ();
5028             }
5029         }
5030       else if (!mips_big_got && !HAVE_NEWABI)
5031         {
5032           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5033
5034           /* If this is a reference to an external symbol, and there
5035              is no constant, we want
5036                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5037              or for lca or if tempreg is PIC_CALL_REG
5038                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5039              For a local symbol, we want
5040                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5041                nop
5042                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5043
5044              If we have a small constant, and this is a reference to
5045              an external symbol, we want
5046                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5047                nop
5048                addiu    $tempreg,$tempreg,<constant>
5049              For a local symbol, we want the same instruction
5050              sequence, but we output a BFD_RELOC_LO16 reloc on the
5051              addiu instruction.
5052
5053              If we have a large constant, and this is a reference to
5054              an external symbol, we want
5055                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5056                lui      $at,<hiconstant>
5057                addiu    $at,$at,<loconstant>
5058                addu     $tempreg,$tempreg,$at
5059              For a local symbol, we want the same instruction
5060              sequence, but we output a BFD_RELOC_LO16 reloc on the
5061              addiu instruction.
5062            */
5063
5064           if (offset_expr.X_add_number == 0)
5065             {
5066               if (mips_pic == SVR4_PIC
5067                   && breg == 0
5068                   && (call || tempreg == PIC_CALL_REG))
5069                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5070
5071               relax_start (offset_expr.X_add_symbol);
5072               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5073                            lw_reloc_type, mips_gp_register);
5074               if (breg != 0)
5075                 {
5076                   /* We're going to put in an addu instruction using
5077                      tempreg, so we may as well insert the nop right
5078                      now.  */
5079                   load_delay_nop ();
5080                 }
5081               relax_switch ();
5082               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5083                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5084               load_delay_nop ();
5085               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5086                            tempreg, tempreg, BFD_RELOC_LO16);
5087               relax_end ();
5088               /* FIXME: If breg == 0, and the next instruction uses
5089                  $tempreg, then if this variant case is used an extra
5090                  nop will be generated.  */
5091             }
5092           else if (offset_expr.X_add_number >= -0x8000
5093                    && offset_expr.X_add_number < 0x8000)
5094             {
5095               load_got_offset (tempreg, &offset_expr);
5096               load_delay_nop ();
5097               add_got_offset (tempreg, &offset_expr);
5098             }
5099           else
5100             {
5101               expr1.X_add_number = offset_expr.X_add_number;
5102               offset_expr.X_add_number =
5103                 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5104               load_got_offset (tempreg, &offset_expr);
5105               offset_expr.X_add_number = expr1.X_add_number;
5106               /* If we are going to add in a base register, and the
5107                  target register and the base register are the same,
5108                  then we are using AT as a temporary register.  Since
5109                  we want to load the constant into AT, we add our
5110                  current AT (from the global offset table) and the
5111                  register into the register now, and pretend we were
5112                  not using a base register.  */
5113               if (breg == treg)
5114                 {
5115                   load_delay_nop ();
5116                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5117                                treg, AT, breg);
5118                   breg = 0;
5119                   tempreg = treg;
5120                 }
5121               add_got_offset_hilo (tempreg, &offset_expr, AT);
5122               used_at = 1;
5123             }
5124         }
5125       else if (!mips_big_got && HAVE_NEWABI)
5126         {
5127           int add_breg_early = 0;
5128
5129           /* If this is a reference to an external, and there is no
5130              constant, or local symbol (*), with or without a
5131              constant, we want
5132                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5133              or for lca or if tempreg is PIC_CALL_REG
5134                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5135
5136              If we have a small constant, and this is a reference to
5137              an external symbol, we want
5138                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5139                addiu    $tempreg,$tempreg,<constant>
5140
5141              If we have a large constant, and this is a reference to
5142              an external symbol, we want
5143                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5144                lui      $at,<hiconstant>
5145                addiu    $at,$at,<loconstant>
5146                addu     $tempreg,$tempreg,$at
5147
5148              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5149              local symbols, even though it introduces an additional
5150              instruction.  */
5151
5152           if (offset_expr.X_add_number)
5153             {
5154               expr1.X_add_number = offset_expr.X_add_number;
5155               offset_expr.X_add_number = 0;
5156
5157               relax_start (offset_expr.X_add_symbol);
5158               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5159                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5160
5161               if (expr1.X_add_number >= -0x8000
5162                   && expr1.X_add_number < 0x8000)
5163                 {
5164                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5165                                tempreg, tempreg, BFD_RELOC_LO16);
5166                 }
5167               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5168                 {
5169                   int dreg;
5170
5171                   /* If we are going to add in a base register, and the
5172                      target register and the base register are the same,
5173                      then we are using AT as a temporary register.  Since
5174                      we want to load the constant into AT, we add our
5175                      current AT (from the global offset table) and the
5176                      register into the register now, and pretend we were
5177                      not using a base register.  */
5178                   if (breg != treg)
5179                     dreg = tempreg;
5180                   else
5181                     {
5182                       assert (tempreg == AT);
5183                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5184                                    treg, AT, breg);
5185                       dreg = treg;
5186                       add_breg_early = 1;
5187                     }
5188
5189                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5190                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5191                                dreg, dreg, AT);
5192
5193                   used_at = 1;
5194                 }
5195               else
5196                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5197
5198               relax_switch ();
5199               offset_expr.X_add_number = expr1.X_add_number;
5200
5201               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5202                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5203               if (add_breg_early)
5204                 {
5205                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5206                                treg, tempreg, breg);
5207                   breg = 0;
5208                   tempreg = treg;
5209                 }
5210               relax_end ();
5211             }
5212           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5213             {
5214               relax_start (offset_expr.X_add_symbol);
5215               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5216                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
5217               relax_switch ();
5218               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5219                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5220               relax_end ();
5221             }
5222           else
5223             {
5224               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5225                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5226             }
5227         }
5228       else if (mips_big_got && !HAVE_NEWABI)
5229         {
5230           int gpdelay;
5231           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5232           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5233           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5234
5235           /* This is the large GOT case.  If this is a reference to an
5236              external symbol, and there is no constant, we want
5237                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5238                addu     $tempreg,$tempreg,$gp
5239                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5240              or for lca or if tempreg is PIC_CALL_REG
5241                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5242                addu     $tempreg,$tempreg,$gp
5243                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5244              For a local symbol, we want
5245                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5246                nop
5247                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5248
5249              If we have a small constant, and this is a reference to
5250              an external symbol, we want
5251                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5252                addu     $tempreg,$tempreg,$gp
5253                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5254                nop
5255                addiu    $tempreg,$tempreg,<constant>
5256              For a local symbol, we want
5257                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5258                nop
5259                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5260
5261              If we have a large constant, and this is a reference to
5262              an external symbol, we want
5263                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5264                addu     $tempreg,$tempreg,$gp
5265                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5266                lui      $at,<hiconstant>
5267                addiu    $at,$at,<loconstant>
5268                addu     $tempreg,$tempreg,$at
5269              For a local symbol, we want
5270                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5271                lui      $at,<hiconstant>
5272                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
5273                addu     $tempreg,$tempreg,$at
5274           */
5275
5276           expr1.X_add_number = offset_expr.X_add_number;
5277           offset_expr.X_add_number = 0;
5278           relax_start (offset_expr.X_add_symbol);
5279           gpdelay = reg_needs_delay (mips_gp_register);
5280           if (expr1.X_add_number == 0 && breg == 0
5281               && (call || tempreg == PIC_CALL_REG))
5282             {
5283               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5284               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5285             }
5286           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5287           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5288                        tempreg, tempreg, mips_gp_register);
5289           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5290                        tempreg, lw_reloc_type, tempreg);
5291           if (expr1.X_add_number == 0)
5292             {
5293               if (breg != 0)
5294                 {
5295                   /* We're going to put in an addu instruction using
5296                      tempreg, so we may as well insert the nop right
5297                      now.  */
5298                   load_delay_nop ();
5299                 }
5300             }
5301           else if (expr1.X_add_number >= -0x8000
5302                    && expr1.X_add_number < 0x8000)
5303             {
5304               load_delay_nop ();
5305               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5306                            tempreg, tempreg, BFD_RELOC_LO16);
5307             }
5308           else
5309             {
5310               int dreg;
5311
5312               /* If we are going to add in a base register, and the
5313                  target register and the base register are the same,
5314                  then we are using AT as a temporary register.  Since
5315                  we want to load the constant into AT, we add our
5316                  current AT (from the global offset table) and the
5317                  register into the register now, and pretend we were
5318                  not using a base register.  */
5319               if (breg != treg)
5320                 dreg = tempreg;
5321               else
5322                 {
5323                   assert (tempreg == AT);
5324                   load_delay_nop ();
5325                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5326                                treg, AT, breg);
5327                   dreg = treg;
5328                 }
5329
5330               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5331               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5332
5333               used_at = 1;
5334             }
5335           offset_expr.X_add_number =
5336             ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5337           relax_switch ();
5338
5339           if (gpdelay)
5340             {
5341               /* This is needed because this instruction uses $gp, but
5342                  the first instruction on the main stream does not.  */
5343               macro_build (NULL, "nop", "");
5344             }
5345
5346           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5347                        local_reloc_type, mips_gp_register);
5348           if (expr1.X_add_number >= -0x8000
5349               && expr1.X_add_number < 0x8000)
5350             {
5351               load_delay_nop ();
5352               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5353                            tempreg, tempreg, BFD_RELOC_LO16);
5354               /* FIXME: If add_number is 0, and there was no base
5355                  register, the external symbol case ended with a load,
5356                  so if the symbol turns out to not be external, and
5357                  the next instruction uses tempreg, an unnecessary nop
5358                  will be inserted.  */
5359             }
5360           else
5361             {
5362               if (breg == treg)
5363                 {
5364                   /* We must add in the base register now, as in the
5365                      external symbol case.  */
5366                   assert (tempreg == AT);
5367                   load_delay_nop ();
5368                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5369                                treg, AT, breg);
5370                   tempreg = treg;
5371                   /* We set breg to 0 because we have arranged to add
5372                      it in in both cases.  */
5373                   breg = 0;
5374                 }
5375
5376               macro_build_lui (&expr1, AT);
5377               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5378                            AT, AT, BFD_RELOC_LO16);
5379               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5380                            tempreg, tempreg, AT);
5381               used_at = 1;
5382             }
5383           relax_end ();
5384         }
5385       else if (mips_big_got && HAVE_NEWABI)
5386         {
5387           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5388           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5389           int add_breg_early = 0;
5390
5391           /* This is the large GOT case.  If this is a reference to an
5392              external symbol, and there is no constant, we want
5393                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5394                add      $tempreg,$tempreg,$gp
5395                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5396              or for lca or if tempreg is PIC_CALL_REG
5397                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5398                add      $tempreg,$tempreg,$gp
5399                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5400
5401              If we have a small constant, and this is a reference to
5402              an external symbol, we want
5403                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5404                add      $tempreg,$tempreg,$gp
5405                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5406                addi     $tempreg,$tempreg,<constant>
5407
5408              If we have a large constant, and this is a reference to
5409              an external symbol, we want
5410                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5411                addu     $tempreg,$tempreg,$gp
5412                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5413                lui      $at,<hiconstant>
5414                addi     $at,$at,<loconstant>
5415                add      $tempreg,$tempreg,$at
5416
5417              If we have NewABI, and we know it's a local symbol, we want
5418                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
5419                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
5420              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
5421
5422           relax_start (offset_expr.X_add_symbol);
5423
5424           expr1.X_add_number = offset_expr.X_add_number;
5425           offset_expr.X_add_number = 0;
5426
5427           if (expr1.X_add_number == 0 && breg == 0
5428               && (call || tempreg == PIC_CALL_REG))
5429             {
5430               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5431               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5432             }
5433           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5434           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5435                        tempreg, tempreg, mips_gp_register);
5436           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5437                        tempreg, lw_reloc_type, tempreg);
5438
5439           if (expr1.X_add_number == 0)
5440             ;
5441           else if (expr1.X_add_number >= -0x8000
5442                    && expr1.X_add_number < 0x8000)
5443             {
5444               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5445                            tempreg, tempreg, BFD_RELOC_LO16);
5446             }
5447           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5448             {
5449               int dreg;
5450
5451               /* If we are going to add in a base register, and the
5452                  target register and the base register are the same,
5453                  then we are using AT as a temporary register.  Since
5454                  we want to load the constant into AT, we add our
5455                  current AT (from the global offset table) and the
5456                  register into the register now, and pretend we were
5457                  not using a base register.  */
5458               if (breg != treg)
5459                 dreg = tempreg;
5460               else
5461                 {
5462                   assert (tempreg == AT);
5463                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5464                                treg, AT, breg);
5465                   dreg = treg;
5466                   add_breg_early = 1;
5467                 }
5468
5469               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5470               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5471
5472               used_at = 1;
5473             }
5474           else
5475             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5476
5477           relax_switch ();
5478           offset_expr.X_add_number = expr1.X_add_number;
5479           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5480                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5481           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
5482                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
5483           if (add_breg_early)
5484             {
5485               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5486                            treg, tempreg, breg);
5487               breg = 0;
5488               tempreg = treg;
5489             }
5490           relax_end ();
5491         }
5492       else
5493         abort ();
5494
5495       if (breg != 0)
5496         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
5497       break;
5498
5499     case M_J_A:
5500       /* The j instruction may not be used in PIC code, since it
5501          requires an absolute address.  We convert it to a b
5502          instruction.  */
5503       if (mips_pic == NO_PIC)
5504         macro_build (&offset_expr, "j", "a");
5505       else
5506         macro_build (&offset_expr, "b", "p");
5507       break;
5508
5509       /* The jal instructions must be handled as macros because when
5510          generating PIC code they expand to multi-instruction
5511          sequences.  Normally they are simple instructions.  */
5512     case M_JAL_1:
5513       dreg = RA;
5514       /* Fall through.  */
5515     case M_JAL_2:
5516       if (mips_pic == NO_PIC)
5517         macro_build (NULL, "jalr", "d,s", dreg, sreg);
5518       else
5519         {
5520           if (sreg != PIC_CALL_REG)
5521             as_warn (_("MIPS PIC call to register other than $25"));
5522
5523           macro_build (NULL, "jalr", "d,s", dreg, sreg);
5524           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
5525             {
5526               if (mips_cprestore_offset < 0)
5527                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5528               else
5529                 {
5530                   if (! mips_frame_reg_valid)
5531                     {
5532                       as_warn (_("No .frame pseudo-op used in PIC code"));
5533                       /* Quiet this warning.  */
5534                       mips_frame_reg_valid = 1;
5535                     }
5536                   if (! mips_cprestore_valid)
5537                     {
5538                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
5539                       /* Quiet this warning.  */
5540                       mips_cprestore_valid = 1;
5541                     }
5542                   expr1.X_add_number = mips_cprestore_offset;
5543                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5544                                                 mips_gp_register,
5545                                                 mips_frame_reg,
5546                                                 HAVE_64BIT_ADDRESSES);
5547                 }
5548             }
5549         }
5550
5551       break;
5552
5553     case M_JAL_A:
5554       if (mips_pic == NO_PIC)
5555         macro_build (&offset_expr, "jal", "a");
5556       else if (mips_pic == SVR4_PIC)
5557         {
5558           /* If this is a reference to an external symbol, and we are
5559              using a small GOT, we want
5560                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
5561                nop
5562                jalr     $ra,$25
5563                nop
5564                lw       $gp,cprestore($sp)
5565              The cprestore value is set using the .cprestore
5566              pseudo-op.  If we are using a big GOT, we want
5567                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
5568                addu     $25,$25,$gp
5569                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
5570                nop
5571                jalr     $ra,$25
5572                nop
5573                lw       $gp,cprestore($sp)
5574              If the symbol is not external, we want
5575                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
5576                nop
5577                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
5578                jalr     $ra,$25
5579                nop
5580                lw $gp,cprestore($sp)
5581
5582              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
5583              sequences above, minus nops, unless the symbol is local,
5584              which enables us to use GOT_PAGE/GOT_OFST (big got) or
5585              GOT_DISP.  */
5586           if (HAVE_NEWABI)
5587             {
5588               if (! mips_big_got)
5589                 {
5590                   relax_start (offset_expr.X_add_symbol);
5591                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5592                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5593                                mips_gp_register);
5594                   relax_switch ();
5595                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5596                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
5597                                mips_gp_register);
5598                   relax_end ();
5599                 }
5600               else
5601                 {
5602                   relax_start (offset_expr.X_add_symbol);
5603                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5604                                BFD_RELOC_MIPS_CALL_HI16);
5605                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
5606                                PIC_CALL_REG, mips_gp_register);
5607                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5608                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
5609                                PIC_CALL_REG);
5610                   relax_switch ();
5611                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5612                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
5613                                mips_gp_register);
5614                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5615                                PIC_CALL_REG, PIC_CALL_REG,
5616                                BFD_RELOC_MIPS_GOT_OFST);
5617                   relax_end ();
5618                 }
5619
5620               macro_build_jalr (&offset_expr);
5621             }
5622           else
5623             {
5624               relax_start (offset_expr.X_add_symbol);
5625               if (! mips_big_got)
5626                 {
5627                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5628                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5629                                mips_gp_register);
5630                   load_delay_nop ();
5631                   relax_switch ();
5632                 }
5633               else
5634                 {
5635                   int gpdelay;
5636
5637                   gpdelay = reg_needs_delay (mips_gp_register);
5638                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5639                                BFD_RELOC_MIPS_CALL_HI16);
5640                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
5641                                PIC_CALL_REG, mips_gp_register);
5642                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5643                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
5644                                PIC_CALL_REG);
5645                   load_delay_nop ();
5646                   relax_switch ();
5647                   if (gpdelay)
5648                     macro_build (NULL, "nop", "");
5649                 }
5650               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5651                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
5652                            mips_gp_register);
5653               load_delay_nop ();
5654               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5655                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
5656               relax_end ();
5657               macro_build_jalr (&offset_expr);
5658
5659               if (mips_cprestore_offset < 0)
5660                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5661               else
5662                 {
5663                   if (! mips_frame_reg_valid)
5664                     {
5665                       as_warn (_("No .frame pseudo-op used in PIC code"));
5666                       /* Quiet this warning.  */
5667                       mips_frame_reg_valid = 1;
5668                     }
5669                   if (! mips_cprestore_valid)
5670                     {
5671                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
5672                       /* Quiet this warning.  */
5673                       mips_cprestore_valid = 1;
5674                     }
5675                   if (mips_opts.noreorder)
5676                     macro_build (NULL, "nop", "");
5677                   expr1.X_add_number = mips_cprestore_offset;
5678                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5679                                                 mips_gp_register,
5680                                                 mips_frame_reg,
5681                                                 HAVE_64BIT_ADDRESSES);
5682                 }
5683             }
5684         }
5685       else if (mips_pic == VXWORKS_PIC)
5686         as_bad (_("Non-PIC jump used in PIC library"));
5687       else
5688         abort ();
5689
5690       break;
5691
5692     case M_LB_AB:
5693       s = "lb";
5694       goto ld;
5695     case M_LBU_AB:
5696       s = "lbu";
5697       goto ld;
5698     case M_LH_AB:
5699       s = "lh";
5700       goto ld;
5701     case M_LHU_AB:
5702       s = "lhu";
5703       goto ld;
5704     case M_LW_AB:
5705       s = "lw";
5706       goto ld;
5707     case M_LWC0_AB:
5708       s = "lwc0";
5709       /* Itbl support may require additional care here.  */
5710       coproc = 1;
5711       goto ld;
5712     case M_LWC1_AB:
5713       s = "lwc1";
5714       /* Itbl support may require additional care here.  */
5715       coproc = 1;
5716       goto ld;
5717     case M_LWC2_AB:
5718       s = "lwc2";
5719       /* Itbl support may require additional care here.  */
5720       coproc = 1;
5721       goto ld;
5722     case M_LWC3_AB:
5723       s = "lwc3";
5724       /* Itbl support may require additional care here.  */
5725       coproc = 1;
5726       goto ld;
5727     case M_LWL_AB:
5728       s = "lwl";
5729       lr = 1;
5730       goto ld;
5731     case M_LWR_AB:
5732       s = "lwr";
5733       lr = 1;
5734       goto ld;
5735     case M_LDC1_AB:
5736       if (mips_opts.arch == CPU_R4650)
5737         {
5738           as_bad (_("opcode not supported on this processor"));
5739           break;
5740         }
5741       s = "ldc1";
5742       /* Itbl support may require additional care here.  */
5743       coproc = 1;
5744       goto ld;
5745     case M_LDC2_AB:
5746       s = "ldc2";
5747       /* Itbl support may require additional care here.  */
5748       coproc = 1;
5749       goto ld;
5750     case M_LDC3_AB:
5751       s = "ldc3";
5752       /* Itbl support may require additional care here.  */
5753       coproc = 1;
5754       goto ld;
5755     case M_LDL_AB:
5756       s = "ldl";
5757       lr = 1;
5758       goto ld;
5759     case M_LDR_AB:
5760       s = "ldr";
5761       lr = 1;
5762       goto ld;
5763     case M_LL_AB:
5764       s = "ll";
5765       goto ld;
5766     case M_LLD_AB:
5767       s = "lld";
5768       goto ld;
5769     case M_LWU_AB:
5770       s = "lwu";
5771     ld:
5772       if (breg == treg || coproc || lr)
5773         {
5774           tempreg = AT;
5775           used_at = 1;
5776         }
5777       else
5778         {
5779           tempreg = treg;
5780         }
5781       goto ld_st;
5782     case M_SB_AB:
5783       s = "sb";
5784       goto st;
5785     case M_SH_AB:
5786       s = "sh";
5787       goto st;
5788     case M_SW_AB:
5789       s = "sw";
5790       goto st;
5791     case M_SWC0_AB:
5792       s = "swc0";
5793       /* Itbl support may require additional care here.  */
5794       coproc = 1;
5795       goto st;
5796     case M_SWC1_AB:
5797       s = "swc1";
5798       /* Itbl support may require additional care here.  */
5799       coproc = 1;
5800       goto st;
5801     case M_SWC2_AB:
5802       s = "swc2";
5803       /* Itbl support may require additional care here.  */
5804       coproc = 1;
5805       goto st;
5806     case M_SWC3_AB:
5807       s = "swc3";
5808       /* Itbl support may require additional care here.  */
5809       coproc = 1;
5810       goto st;
5811     case M_SWL_AB:
5812       s = "swl";
5813       goto st;
5814     case M_SWR_AB:
5815       s = "swr";
5816       goto st;
5817     case M_SC_AB:
5818       s = "sc";
5819       goto st;
5820     case M_SCD_AB:
5821       s = "scd";
5822       goto st;
5823     case M_SDC1_AB:
5824       if (mips_opts.arch == CPU_R4650)
5825         {
5826           as_bad (_("opcode not supported on this processor"));
5827           break;
5828         }
5829       s = "sdc1";
5830       coproc = 1;
5831       /* Itbl support may require additional care here.  */
5832       goto st;
5833     case M_SDC2_AB:
5834       s = "sdc2";
5835       /* Itbl support may require additional care here.  */
5836       coproc = 1;
5837       goto st;
5838     case M_SDC3_AB:
5839       s = "sdc3";
5840       /* Itbl support may require additional care here.  */
5841       coproc = 1;
5842       goto st;
5843     case M_SDL_AB:
5844       s = "sdl";
5845       goto st;
5846     case M_SDR_AB:
5847       s = "sdr";
5848     st:
5849       tempreg = AT;
5850       used_at = 1;
5851     ld_st:
5852       /* Itbl support may require additional care here.  */
5853       if (mask == M_LWC1_AB
5854           || mask == M_SWC1_AB
5855           || mask == M_LDC1_AB
5856           || mask == M_SDC1_AB
5857           || mask == M_L_DAB
5858           || mask == M_S_DAB)
5859         fmt = "T,o(b)";
5860       else if (coproc)
5861         fmt = "E,o(b)";
5862       else
5863         fmt = "t,o(b)";
5864
5865       if (offset_expr.X_op != O_constant
5866           && offset_expr.X_op != O_symbol)
5867         {
5868           as_bad (_("expression too complex"));
5869           offset_expr.X_op = O_constant;
5870         }
5871
5872       if (HAVE_32BIT_ADDRESSES
5873           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5874         {
5875           char value [32];
5876
5877           sprintf_vma (value, offset_expr.X_add_number);
5878           as_bad (_("Number (0x%s) larger than 32 bits"), value);
5879         }
5880
5881       /* A constant expression in PIC code can be handled just as it
5882          is in non PIC code.  */
5883       if (offset_expr.X_op == O_constant)
5884         {
5885           expr1.X_add_number = ((offset_expr.X_add_number + 0x8000)
5886                                 & ~(bfd_vma) 0xffff);
5887           normalize_address_expr (&expr1);
5888           load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
5889           if (breg != 0)
5890             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5891                          tempreg, tempreg, breg);
5892           macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, tempreg);
5893         }
5894       else if (mips_pic == NO_PIC)
5895         {
5896           /* If this is a reference to a GP relative symbol, and there
5897              is no base register, we want
5898                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
5899              Otherwise, if there is no base register, we want
5900                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5901                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5902              If we have a constant, we need two instructions anyhow,
5903              so we always use the latter form.
5904
5905              If we have a base register, and this is a reference to a
5906              GP relative symbol, we want
5907                addu     $tempreg,$breg,$gp
5908                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
5909              Otherwise we want
5910                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5911                addu     $tempreg,$tempreg,$breg
5912                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5913              With a constant we always use the latter case.
5914
5915              With 64bit address space and no base register and $at usable,
5916              we want
5917                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5918                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5919                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5920                dsll32   $tempreg,0
5921                daddu    $tempreg,$at
5922                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5923              If we have a base register, we want
5924                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5925                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5926                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5927                daddu    $at,$breg
5928                dsll32   $tempreg,0
5929                daddu    $tempreg,$at
5930                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5931
5932              Without $at we can't generate the optimal path for superscalar
5933              processors here since this would require two temporary registers.
5934                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5935                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5936                dsll     $tempreg,16
5937                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5938                dsll     $tempreg,16
5939                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5940              If we have a base register, we want
5941                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5942                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5943                dsll     $tempreg,16
5944                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5945                dsll     $tempreg,16
5946                daddu    $tempreg,$tempreg,$breg
5947                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5948
5949              For GP relative symbols in 64bit address space we can use
5950              the same sequence as in 32bit address space.  */
5951           if (HAVE_64BIT_SYMBOLS)
5952             {
5953               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5954                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5955                 {
5956                   relax_start (offset_expr.X_add_symbol);
5957                   if (breg == 0)
5958                     {
5959                       macro_build (&offset_expr, s, fmt, treg,
5960                                    BFD_RELOC_GPREL16, mips_gp_register);
5961                     }
5962                   else
5963                     {
5964                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5965                                    tempreg, breg, mips_gp_register);
5966                       macro_build (&offset_expr, s, fmt, treg,
5967                                    BFD_RELOC_GPREL16, tempreg);
5968                     }
5969                   relax_switch ();
5970                 }
5971
5972               if (used_at == 0 && !mips_opts.noat)
5973                 {
5974                   macro_build (&offset_expr, "lui", "t,u", tempreg,
5975                                BFD_RELOC_MIPS_HIGHEST);
5976                   macro_build (&offset_expr, "lui", "t,u", AT,
5977                                BFD_RELOC_HI16_S);
5978                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
5979                                tempreg, BFD_RELOC_MIPS_HIGHER);
5980                   if (breg != 0)
5981                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
5982                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5983                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5984                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
5985                                tempreg);
5986                   used_at = 1;
5987                 }
5988               else
5989                 {
5990                   macro_build (&offset_expr, "lui", "t,u", tempreg,
5991                                BFD_RELOC_MIPS_HIGHEST);
5992                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
5993                                tempreg, BFD_RELOC_MIPS_HIGHER);
5994                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5995                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
5996                                tempreg, BFD_RELOC_HI16_S);
5997                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5998                   if (breg != 0)
5999                     macro_build (NULL, "daddu", "d,v,t",
6000                                  tempreg, tempreg, breg);
6001                   macro_build (&offset_expr, s, fmt, treg,
6002                                BFD_RELOC_LO16, tempreg);
6003                 }
6004
6005               if (mips_relax.sequence)
6006                 relax_end ();
6007               break;
6008             }
6009
6010           if (breg == 0)
6011             {
6012               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6013                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6014                 {
6015                   relax_start (offset_expr.X_add_symbol);
6016                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6017                                mips_gp_register);
6018                   relax_switch ();
6019                 }
6020               macro_build_lui (&offset_expr, tempreg);
6021               macro_build (&offset_expr, s, fmt, treg,
6022                            BFD_RELOC_LO16, tempreg);
6023               if (mips_relax.sequence)
6024                 relax_end ();
6025             }
6026           else
6027             {
6028               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6029                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6030                 {
6031                   relax_start (offset_expr.X_add_symbol);
6032                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6033                                tempreg, breg, mips_gp_register);
6034                   macro_build (&offset_expr, s, fmt, treg,
6035                                BFD_RELOC_GPREL16, tempreg);
6036                   relax_switch ();
6037                 }
6038               macro_build_lui (&offset_expr, tempreg);
6039               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6040                            tempreg, tempreg, breg);
6041               macro_build (&offset_expr, s, fmt, treg,
6042                            BFD_RELOC_LO16, tempreg);
6043               if (mips_relax.sequence)
6044                 relax_end ();
6045             }
6046         }
6047       else if (!mips_big_got)
6048         {
6049           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6050
6051           /* If this is a reference to an external symbol, we want
6052                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6053                nop
6054                <op>     $treg,0($tempreg)
6055              Otherwise we want
6056                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6057                nop
6058                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6059                <op>     $treg,0($tempreg)
6060
6061              For NewABI, we want
6062                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6063                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6064
6065              If there is a base register, we add it to $tempreg before
6066              the <op>.  If there is a constant, we stick it in the
6067              <op> instruction.  We don't handle constants larger than
6068              16 bits, because we have no way to load the upper 16 bits
6069              (actually, we could handle them for the subset of cases
6070              in which we are not using $at).  */
6071           assert (offset_expr.X_op == O_symbol);
6072           if (HAVE_NEWABI)
6073             {
6074               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6075                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6076               if (breg != 0)
6077                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6078                              tempreg, tempreg, breg);
6079               macro_build (&offset_expr, s, fmt, treg,
6080                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
6081               break;
6082             }
6083           expr1.X_add_number = offset_expr.X_add_number;
6084           offset_expr.X_add_number = 0;
6085           if (expr1.X_add_number < -0x8000
6086               || expr1.X_add_number >= 0x8000)
6087             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6088           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6089                        lw_reloc_type, mips_gp_register);
6090           load_delay_nop ();
6091           relax_start (offset_expr.X_add_symbol);
6092           relax_switch ();
6093           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6094                        tempreg, BFD_RELOC_LO16);
6095           relax_end ();
6096           if (breg != 0)
6097             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6098                          tempreg, tempreg, breg);
6099           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6100         }
6101       else if (mips_big_got && !HAVE_NEWABI)
6102         {
6103           int gpdelay;
6104
6105           /* If this is a reference to an external symbol, we want
6106                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6107                addu     $tempreg,$tempreg,$gp
6108                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6109                <op>     $treg,0($tempreg)
6110              Otherwise we want
6111                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6112                nop
6113                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6114                <op>     $treg,0($tempreg)
6115              If there is a base register, we add it to $tempreg before
6116              the <op>.  If there is a constant, we stick it in the
6117              <op> instruction.  We don't handle constants larger than
6118              16 bits, because we have no way to load the upper 16 bits
6119              (actually, we could handle them for the subset of cases
6120              in which we are not using $at).  */
6121           assert (offset_expr.X_op == O_symbol);
6122           expr1.X_add_number = offset_expr.X_add_number;
6123           offset_expr.X_add_number = 0;
6124           if (expr1.X_add_number < -0x8000
6125               || expr1.X_add_number >= 0x8000)
6126             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6127           gpdelay = reg_needs_delay (mips_gp_register);
6128           relax_start (offset_expr.X_add_symbol);
6129           macro_build (&offset_expr, "lui", "t,u", tempreg,
6130                        BFD_RELOC_MIPS_GOT_HI16);
6131           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6132                        mips_gp_register);
6133           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6134                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6135           relax_switch ();
6136           if (gpdelay)
6137             macro_build (NULL, "nop", "");
6138           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6139                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6140           load_delay_nop ();
6141           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6142                        tempreg, BFD_RELOC_LO16);
6143           relax_end ();
6144
6145           if (breg != 0)
6146             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6147                          tempreg, tempreg, breg);
6148           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6149         }
6150       else if (mips_big_got && HAVE_NEWABI)
6151         {
6152           /* If this is a reference to an external symbol, we want
6153                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6154                add      $tempreg,$tempreg,$gp
6155                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6156                <op>     $treg,<ofst>($tempreg)
6157              Otherwise, for local symbols, we want:
6158                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6159                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
6160           assert (offset_expr.X_op == O_symbol);
6161           expr1.X_add_number = offset_expr.X_add_number;
6162           offset_expr.X_add_number = 0;
6163           if (expr1.X_add_number < -0x8000
6164               || expr1.X_add_number >= 0x8000)
6165             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6166           relax_start (offset_expr.X_add_symbol);
6167           macro_build (&offset_expr, "lui", "t,u", tempreg,
6168                        BFD_RELOC_MIPS_GOT_HI16);
6169           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6170                        mips_gp_register);
6171           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6172                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6173           if (breg != 0)
6174             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6175                          tempreg, tempreg, breg);
6176           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6177
6178           relax_switch ();
6179           offset_expr.X_add_number = expr1.X_add_number;
6180           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6181                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6182           if (breg != 0)
6183             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6184                          tempreg, tempreg, breg);
6185           macro_build (&offset_expr, s, fmt, treg,
6186                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
6187           relax_end ();
6188         }
6189       else
6190         abort ();
6191
6192       break;
6193
6194     case M_LI:
6195     case M_LI_S:
6196       load_register (treg, &imm_expr, 0);
6197       break;
6198
6199     case M_DLI:
6200       load_register (treg, &imm_expr, 1);
6201       break;
6202
6203     case M_LI_SS:
6204       if (imm_expr.X_op == O_constant)
6205         {
6206           used_at = 1;
6207           load_register (AT, &imm_expr, 0);
6208           macro_build (NULL, "mtc1", "t,G", AT, treg);
6209           break;
6210         }
6211       else
6212         {
6213           assert (offset_expr.X_op == O_symbol
6214                   && strcmp (segment_name (S_GET_SEGMENT
6215                                            (offset_expr.X_add_symbol)),
6216                              ".lit4") == 0
6217                   && offset_expr.X_add_number == 0);
6218           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6219                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6220           break;
6221         }
6222
6223     case M_LI_D:
6224       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6225          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6226          order 32 bits of the value and the low order 32 bits are either
6227          zero or in OFFSET_EXPR.  */
6228       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6229         {
6230           if (HAVE_64BIT_GPRS)
6231             load_register (treg, &imm_expr, 1);
6232           else
6233             {
6234               int hreg, lreg;
6235
6236               if (target_big_endian)
6237                 {
6238                   hreg = treg;
6239                   lreg = treg + 1;
6240                 }
6241               else
6242                 {
6243                   hreg = treg + 1;
6244                   lreg = treg;
6245                 }
6246
6247               if (hreg <= 31)
6248                 load_register (hreg, &imm_expr, 0);
6249               if (lreg <= 31)
6250                 {
6251                   if (offset_expr.X_op == O_absent)
6252                     move_register (lreg, 0);
6253                   else
6254                     {
6255                       assert (offset_expr.X_op == O_constant);
6256                       load_register (lreg, &offset_expr, 0);
6257                     }
6258                 }
6259             }
6260           break;
6261         }
6262
6263       /* We know that sym is in the .rdata section.  First we get the
6264          upper 16 bits of the address.  */
6265       if (mips_pic == NO_PIC)
6266         {
6267           macro_build_lui (&offset_expr, AT);
6268           used_at = 1;
6269         }
6270       else
6271         {
6272           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6273                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6274           used_at = 1;
6275         }
6276
6277       /* Now we load the register(s).  */
6278       if (HAVE_64BIT_GPRS)
6279         {
6280           used_at = 1;
6281           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6282         }
6283       else
6284         {
6285           used_at = 1;
6286           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6287           if (treg != RA)
6288             {
6289               /* FIXME: How in the world do we deal with the possible
6290                  overflow here?  */
6291               offset_expr.X_add_number += 4;
6292               macro_build (&offset_expr, "lw", "t,o(b)",
6293                            treg + 1, BFD_RELOC_LO16, AT);
6294             }
6295         }
6296       break;
6297
6298     case M_LI_DD:
6299       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
6300          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6301          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
6302          the value and the low order 32 bits are either zero or in
6303          OFFSET_EXPR.  */
6304       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6305         {
6306           used_at = 1;
6307           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
6308           if (HAVE_64BIT_FPRS)
6309             {
6310               assert (HAVE_64BIT_GPRS);
6311               macro_build (NULL, "dmtc1", "t,S", AT, treg);
6312             }
6313           else
6314             {
6315               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
6316               if (offset_expr.X_op == O_absent)
6317                 macro_build (NULL, "mtc1", "t,G", 0, treg);
6318               else
6319                 {
6320                   assert (offset_expr.X_op == O_constant);
6321                   load_register (AT, &offset_expr, 0);
6322                   macro_build (NULL, "mtc1", "t,G", AT, treg);
6323                 }
6324             }
6325           break;
6326         }
6327
6328       assert (offset_expr.X_op == O_symbol
6329               && offset_expr.X_add_number == 0);
6330       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6331       if (strcmp (s, ".lit8") == 0)
6332         {
6333           if (mips_opts.isa != ISA_MIPS1)
6334             {
6335               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
6336                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6337               break;
6338             }
6339           breg = mips_gp_register;
6340           r = BFD_RELOC_MIPS_LITERAL;
6341           goto dob;
6342         }
6343       else
6344         {
6345           assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6346           used_at = 1;
6347           if (mips_pic != NO_PIC)
6348             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6349                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
6350           else
6351             {
6352               /* FIXME: This won't work for a 64 bit address.  */
6353               macro_build_lui (&offset_expr, AT);
6354             }
6355
6356           if (mips_opts.isa != ISA_MIPS1)
6357             {
6358               macro_build (&offset_expr, "ldc1", "T,o(b)",
6359                            treg, BFD_RELOC_LO16, AT);
6360               break;
6361             }
6362           breg = AT;
6363           r = BFD_RELOC_LO16;
6364           goto dob;
6365         }
6366
6367     case M_L_DOB:
6368       if (mips_opts.arch == CPU_R4650)
6369         {
6370           as_bad (_("opcode not supported on this processor"));
6371           break;
6372         }
6373       /* Even on a big endian machine $fn comes before $fn+1.  We have
6374          to adjust when loading from memory.  */
6375       r = BFD_RELOC_LO16;
6376     dob:
6377       assert (mips_opts.isa == ISA_MIPS1);
6378       macro_build (&offset_expr, "lwc1", "T,o(b)",
6379                    target_big_endian ? treg + 1 : treg, r, breg);
6380       /* FIXME: A possible overflow which I don't know how to deal
6381          with.  */
6382       offset_expr.X_add_number += 4;
6383       macro_build (&offset_expr, "lwc1", "T,o(b)",
6384                    target_big_endian ? treg : treg + 1, r, breg);
6385       break;
6386
6387     case M_L_DAB:
6388       /*
6389        * The MIPS assembler seems to check for X_add_number not
6390        * being double aligned and generating:
6391        *        lui     at,%hi(foo+1)
6392        *        addu    at,at,v1
6393        *        addiu   at,at,%lo(foo+1)
6394        *        lwc1    f2,0(at)
6395        *        lwc1    f3,4(at)
6396        * But, the resulting address is the same after relocation so why
6397        * generate the extra instruction?
6398        */
6399       if (mips_opts.arch == CPU_R4650)
6400         {
6401           as_bad (_("opcode not supported on this processor"));
6402           break;
6403         }
6404       /* Itbl support may require additional care here.  */
6405       coproc = 1;
6406       if (mips_opts.isa != ISA_MIPS1)
6407         {
6408           s = "ldc1";
6409           goto ld;
6410         }
6411
6412       s = "lwc1";
6413       fmt = "T,o(b)";
6414       goto ldd_std;
6415
6416     case M_S_DAB:
6417       if (mips_opts.arch == CPU_R4650)
6418         {
6419           as_bad (_("opcode not supported on this processor"));
6420           break;
6421         }
6422
6423       if (mips_opts.isa != ISA_MIPS1)
6424         {
6425           s = "sdc1";
6426           goto st;
6427         }
6428
6429       s = "swc1";
6430       fmt = "T,o(b)";
6431       /* Itbl support may require additional care here.  */
6432       coproc = 1;
6433       goto ldd_std;
6434
6435     case M_LD_AB:
6436       if (HAVE_64BIT_GPRS)
6437         {
6438           s = "ld";
6439           goto ld;
6440         }
6441
6442       s = "lw";
6443       fmt = "t,o(b)";
6444       goto ldd_std;
6445
6446     case M_SD_AB:
6447       if (HAVE_64BIT_GPRS)
6448         {
6449           s = "sd";
6450           goto st;
6451         }
6452
6453       s = "sw";
6454       fmt = "t,o(b)";
6455
6456     ldd_std:
6457       if (offset_expr.X_op != O_symbol
6458           && offset_expr.X_op != O_constant)
6459         {
6460           as_bad (_("expression too complex"));
6461           offset_expr.X_op = O_constant;
6462         }
6463
6464       if (HAVE_32BIT_ADDRESSES
6465           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6466         {
6467           char value [32];
6468
6469           sprintf_vma (value, offset_expr.X_add_number);
6470           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6471         }
6472
6473       /* Even on a big endian machine $fn comes before $fn+1.  We have
6474          to adjust when loading from memory.  We set coproc if we must
6475          load $fn+1 first.  */
6476       /* Itbl support may require additional care here.  */
6477       if (! target_big_endian)
6478         coproc = 0;
6479
6480       if (mips_pic == NO_PIC
6481           || offset_expr.X_op == O_constant)
6482         {
6483           /* If this is a reference to a GP relative symbol, we want
6484                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6485                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
6486              If we have a base register, we use this
6487                addu     $at,$breg,$gp
6488                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
6489                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
6490              If this is not a GP relative symbol, we want
6491                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6492                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6493                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6494              If there is a base register, we add it to $at after the
6495              lui instruction.  If there is a constant, we always use
6496              the last case.  */
6497           if (offset_expr.X_op == O_symbol
6498               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6499               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6500             {
6501               relax_start (offset_expr.X_add_symbol);
6502               if (breg == 0)
6503                 {
6504                   tempreg = mips_gp_register;
6505                 }
6506               else
6507                 {
6508                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6509                                AT, breg, mips_gp_register);
6510                   tempreg = AT;
6511                   used_at = 1;
6512                 }
6513
6514               /* Itbl support may require additional care here.  */
6515               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6516                            BFD_RELOC_GPREL16, tempreg);
6517               offset_expr.X_add_number += 4;
6518
6519               /* Set mips_optimize to 2 to avoid inserting an
6520                  undesired nop.  */
6521               hold_mips_optimize = mips_optimize;
6522               mips_optimize = 2;
6523               /* Itbl support may require additional care here.  */
6524               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6525                            BFD_RELOC_GPREL16, tempreg);
6526               mips_optimize = hold_mips_optimize;
6527
6528               relax_switch ();
6529
6530               /* We just generated two relocs.  When tc_gen_reloc
6531                  handles this case, it will skip the first reloc and
6532                  handle the second.  The second reloc already has an
6533                  extra addend of 4, which we added above.  We must
6534                  subtract it out, and then subtract another 4 to make
6535                  the first reloc come out right.  The second reloc
6536                  will come out right because we are going to add 4 to
6537                  offset_expr when we build its instruction below.
6538
6539                  If we have a symbol, then we don't want to include
6540                  the offset, because it will wind up being included
6541                  when we generate the reloc.  */
6542
6543               if (offset_expr.X_op == O_constant)
6544                 offset_expr.X_add_number -= 8;
6545               else
6546                 {
6547                   offset_expr.X_add_number = -4;
6548                   offset_expr.X_op = O_constant;
6549                 }
6550             }
6551           used_at = 1;
6552           macro_build_lui (&offset_expr, AT);
6553           if (breg != 0)
6554             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6555           /* Itbl support may require additional care here.  */
6556           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6557                        BFD_RELOC_LO16, AT);
6558           /* FIXME: How do we handle overflow here?  */
6559           offset_expr.X_add_number += 4;
6560           /* Itbl support may require additional care here.  */
6561           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6562                        BFD_RELOC_LO16, AT);
6563           if (mips_relax.sequence)
6564             relax_end ();
6565         }
6566       else if (!mips_big_got)
6567         {
6568           /* If this is a reference to an external symbol, we want
6569                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6570                nop
6571                <op>     $treg,0($at)
6572                <op>     $treg+1,4($at)
6573              Otherwise we want
6574                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6575                nop
6576                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6577                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6578              If there is a base register we add it to $at before the
6579              lwc1 instructions.  If there is a constant we include it
6580              in the lwc1 instructions.  */
6581           used_at = 1;
6582           expr1.X_add_number = offset_expr.X_add_number;
6583           if (expr1.X_add_number < -0x8000
6584               || expr1.X_add_number >= 0x8000 - 4)
6585             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6586           load_got_offset (AT, &offset_expr);
6587           load_delay_nop ();
6588           if (breg != 0)
6589             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6590
6591           /* Set mips_optimize to 2 to avoid inserting an undesired
6592              nop.  */
6593           hold_mips_optimize = mips_optimize;
6594           mips_optimize = 2;
6595
6596           /* Itbl support may require additional care here.  */
6597           relax_start (offset_expr.X_add_symbol);
6598           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
6599                        BFD_RELOC_LO16, AT);
6600           expr1.X_add_number += 4;
6601           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
6602                        BFD_RELOC_LO16, AT);
6603           relax_switch ();
6604           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6605                        BFD_RELOC_LO16, AT);
6606           offset_expr.X_add_number += 4;
6607           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6608                        BFD_RELOC_LO16, AT);
6609           relax_end ();
6610
6611           mips_optimize = hold_mips_optimize;
6612         }
6613       else if (mips_big_got)
6614         {
6615           int gpdelay;
6616
6617           /* If this is a reference to an external symbol, we want
6618                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
6619                addu     $at,$at,$gp
6620                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
6621                nop
6622                <op>     $treg,0($at)
6623                <op>     $treg+1,4($at)
6624              Otherwise we want
6625                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6626                nop
6627                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6628                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6629              If there is a base register we add it to $at before the
6630              lwc1 instructions.  If there is a constant we include it
6631              in the lwc1 instructions.  */
6632           used_at = 1;
6633           expr1.X_add_number = offset_expr.X_add_number;
6634           offset_expr.X_add_number = 0;
6635           if (expr1.X_add_number < -0x8000
6636               || expr1.X_add_number >= 0x8000 - 4)
6637             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6638           gpdelay = reg_needs_delay (mips_gp_register);
6639           relax_start (offset_expr.X_add_symbol);
6640           macro_build (&offset_expr, "lui", "t,u",
6641                        AT, BFD_RELOC_MIPS_GOT_HI16);
6642           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6643                        AT, AT, mips_gp_register);
6644           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6645                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
6646           load_delay_nop ();
6647           if (breg != 0)
6648             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6649           /* Itbl support may require additional care here.  */
6650           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
6651                        BFD_RELOC_LO16, AT);
6652           expr1.X_add_number += 4;
6653
6654           /* Set mips_optimize to 2 to avoid inserting an undesired
6655              nop.  */
6656           hold_mips_optimize = mips_optimize;
6657           mips_optimize = 2;
6658           /* Itbl support may require additional care here.  */
6659           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
6660                        BFD_RELOC_LO16, AT);
6661           mips_optimize = hold_mips_optimize;
6662           expr1.X_add_number -= 4;
6663
6664           relax_switch ();
6665           offset_expr.X_add_number = expr1.X_add_number;
6666           if (gpdelay)
6667             macro_build (NULL, "nop", "");
6668           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6669                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6670           load_delay_nop ();
6671           if (breg != 0)
6672             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6673           /* Itbl support may require additional care here.  */
6674           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6675                        BFD_RELOC_LO16, AT);
6676           offset_expr.X_add_number += 4;
6677
6678           /* Set mips_optimize to 2 to avoid inserting an undesired
6679              nop.  */
6680           hold_mips_optimize = mips_optimize;
6681           mips_optimize = 2;
6682           /* Itbl support may require additional care here.  */
6683           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6684                        BFD_RELOC_LO16, AT);
6685           mips_optimize = hold_mips_optimize;
6686           relax_end ();
6687         }
6688       else
6689         abort ();
6690
6691       break;
6692
6693     case M_LD_OB:
6694       s = "lw";
6695       goto sd_ob;
6696     case M_SD_OB:
6697       s = "sw";
6698     sd_ob:
6699       assert (HAVE_32BIT_ADDRESSES);
6700       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
6701       offset_expr.X_add_number += 4;
6702       macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
6703       break;
6704
6705    /* New code added to support COPZ instructions.
6706       This code builds table entries out of the macros in mip_opcodes.
6707       R4000 uses interlocks to handle coproc delays.
6708       Other chips (like the R3000) require nops to be inserted for delays.
6709
6710       FIXME: Currently, we require that the user handle delays.
6711       In order to fill delay slots for non-interlocked chips,
6712       we must have a way to specify delays based on the coprocessor.
6713       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
6714       What are the side-effects of the cop instruction?
6715       What cache support might we have and what are its effects?
6716       Both coprocessor & memory require delays. how long???
6717       What registers are read/set/modified?
6718
6719       If an itbl is provided to interpret cop instructions,
6720       this knowledge can be encoded in the itbl spec.  */
6721
6722     case M_COP0:
6723       s = "c0";
6724       goto copz;
6725     case M_COP1:
6726       s = "c1";
6727       goto copz;
6728     case M_COP2:
6729       s = "c2";
6730       goto copz;
6731     case M_COP3:
6732       s = "c3";
6733     copz:
6734       /* For now we just do C (same as Cz).  The parameter will be
6735          stored in insn_opcode by mips_ip.  */
6736       macro_build (NULL, s, "C", ip->insn_opcode);
6737       break;
6738
6739     case M_MOVE:
6740       move_register (dreg, sreg);
6741       break;
6742
6743 #ifdef LOSING_COMPILER
6744     default:
6745       /* Try and see if this is a new itbl instruction.
6746          This code builds table entries out of the macros in mip_opcodes.
6747          FIXME: For now we just assemble the expression and pass it's
6748          value along as a 32-bit immediate.
6749          We may want to have the assembler assemble this value,
6750          so that we gain the assembler's knowledge of delay slots,
6751          symbols, etc.
6752          Would it be more efficient to use mask (id) here? */
6753       if (itbl_have_entries
6754           && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
6755         {
6756           s = ip->insn_mo->name;
6757           s2 = "cop3";
6758           coproc = ITBL_DECODE_PNUM (immed_expr);;
6759           macro_build (&immed_expr, s, "C");
6760           break;
6761         }
6762       macro2 (ip);
6763       break;
6764     }
6765   if (mips_opts.noat && used_at)
6766     as_bad (_("Macro used $at after \".set noat\""));
6767 }
6768
6769 static void
6770 macro2 (struct mips_cl_insn *ip)
6771 {
6772   register int treg, sreg, dreg, breg;
6773   int tempreg;
6774   int mask;
6775   int used_at;
6776   expressionS expr1;
6777   const char *s;
6778   const char *s2;
6779   const char *fmt;
6780   int likely = 0;
6781   int dbl = 0;
6782   int coproc = 0;
6783   int lr = 0;
6784   int imm = 0;
6785   int off;
6786   offsetT maxnum;
6787   bfd_reloc_code_real_type r;
6788
6789   treg = (ip->insn_opcode >> 16) & 0x1f;
6790   dreg = (ip->insn_opcode >> 11) & 0x1f;
6791   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
6792   mask = ip->insn_mo->mask;
6793
6794   expr1.X_op = O_constant;
6795   expr1.X_op_symbol = NULL;
6796   expr1.X_add_symbol = NULL;
6797   expr1.X_add_number = 1;
6798
6799   switch (mask)
6800     {
6801 #endif /* LOSING_COMPILER */
6802
6803     case M_DMUL:
6804       dbl = 1;
6805     case M_MUL:
6806       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
6807       macro_build (NULL, "mflo", "d", dreg);
6808       break;
6809
6810     case M_DMUL_I:
6811       dbl = 1;
6812     case M_MUL_I:
6813       /* The MIPS assembler some times generates shifts and adds.  I'm
6814          not trying to be that fancy. GCC should do this for us
6815          anyway.  */
6816       used_at = 1;
6817       load_register (AT, &imm_expr, dbl);
6818       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
6819       macro_build (NULL, "mflo", "d", dreg);
6820       break;
6821
6822     case M_DMULO_I:
6823       dbl = 1;
6824     case M_MULO_I:
6825       imm = 1;
6826       goto do_mulo;
6827
6828     case M_DMULO:
6829       dbl = 1;
6830     case M_MULO:
6831     do_mulo:
6832       start_noreorder ();
6833       used_at = 1;
6834       if (imm)
6835         load_register (AT, &imm_expr, dbl);
6836       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
6837       macro_build (NULL, "mflo", "d", dreg);
6838       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
6839       macro_build (NULL, "mfhi", "d", AT);
6840       if (mips_trap)
6841         macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
6842       else
6843         {
6844           expr1.X_add_number = 8;
6845           macro_build (&expr1, "beq", "s,t,p", dreg, AT);
6846           macro_build (NULL, "nop", "", 0);
6847           macro_build (NULL, "break", "c", 6);
6848         }
6849       end_noreorder ();
6850       macro_build (NULL, "mflo", "d", dreg);
6851       break;
6852
6853     case M_DMULOU_I:
6854       dbl = 1;
6855     case M_MULOU_I:
6856       imm = 1;
6857       goto do_mulou;
6858
6859     case M_DMULOU:
6860       dbl = 1;
6861     case M_MULOU:
6862     do_mulou:
6863       start_noreorder ();
6864       used_at = 1;
6865       if (imm)
6866         load_register (AT, &imm_expr, dbl);
6867       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
6868                    sreg, imm ? AT : treg);
6869       macro_build (NULL, "mfhi", "d", AT);
6870       macro_build (NULL, "mflo", "d", dreg);
6871       if (mips_trap)
6872         macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
6873       else
6874         {
6875           expr1.X_add_number = 8;
6876           macro_build (&expr1, "beq", "s,t,p", AT, 0);
6877           macro_build (NULL, "nop", "", 0);
6878           macro_build (NULL, "break", "c", 6);
6879         }
6880       end_noreorder ();
6881       break;
6882
6883     case M_DROL:
6884       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
6885         {
6886           if (dreg == sreg)
6887             {
6888               tempreg = AT;
6889               used_at = 1;
6890             }
6891           else
6892             {
6893               tempreg = dreg;
6894             }
6895           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
6896           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
6897           break;
6898         }
6899       used_at = 1;
6900       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
6901       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
6902       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
6903       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
6904       break;
6905
6906     case M_ROL:
6907       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
6908         {
6909           if (dreg == sreg)
6910             {
6911               tempreg = AT;
6912               used_at = 1;
6913             }
6914           else
6915             {
6916               tempreg = dreg;
6917             }
6918           macro_build (NULL, "negu", "d,w", tempreg, treg);
6919           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
6920           break;
6921         }
6922       used_at = 1;
6923       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
6924       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
6925       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
6926       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
6927       break;
6928
6929     case M_DROL_I:
6930       {
6931         unsigned int rot;
6932         char *l, *r;
6933
6934         if (imm_expr.X_op != O_constant)
6935           as_bad (_("Improper rotate count"));
6936         rot = imm_expr.X_add_number & 0x3f;
6937         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
6938           {
6939             rot = (64 - rot) & 0x3f;
6940             if (rot >= 32)
6941               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
6942             else
6943               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
6944             break;
6945           }
6946         if (rot == 0)
6947           {
6948             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
6949             break;
6950           }
6951         l = (rot < 0x20) ? "dsll" : "dsll32";
6952         r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
6953         rot &= 0x1f;
6954         used_at = 1;
6955         macro_build (NULL, l, "d,w,<", AT, sreg, rot);
6956         macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
6957         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
6958       }
6959       break;
6960
6961     case M_ROL_I:
6962       {
6963         unsigned int rot;
6964
6965         if (imm_expr.X_op != O_constant)
6966           as_bad (_("Improper rotate count"));
6967         rot = imm_expr.X_add_number & 0x1f;
6968         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
6969           {
6970             macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
6971             break;
6972           }
6973         if (rot == 0)
6974           {
6975             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
6976             break;
6977           }
6978         used_at = 1;
6979         macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
6980         macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
6981         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
6982       }
6983       break;
6984
6985     case M_DROR:
6986       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
6987         {
6988           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
6989           break;
6990         }
6991       used_at = 1;
6992       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
6993       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
6994       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
6995       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
6996       break;
6997
6998     case M_ROR:
6999       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7000         {
7001           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7002           break;
7003         }
7004       used_at = 1;
7005       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7006       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7007       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7008       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7009       break;
7010
7011     case M_DROR_I:
7012       {
7013         unsigned int rot;
7014         char *l, *r;
7015
7016         if (imm_expr.X_op != O_constant)
7017           as_bad (_("Improper rotate count"));
7018         rot = imm_expr.X_add_number & 0x3f;
7019         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7020           {
7021             if (rot >= 32)
7022               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7023             else
7024               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7025             break;
7026           }
7027         if (rot == 0)
7028           {
7029             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7030             break;
7031           }
7032         r = (rot < 0x20) ? "dsrl" : "dsrl32";
7033         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7034         rot &= 0x1f;
7035         used_at = 1;
7036         macro_build (NULL, r, "d,w,<", AT, sreg, rot);
7037         macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7038         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7039       }
7040       break;
7041
7042     case M_ROR_I:
7043       {
7044         unsigned int rot;
7045
7046         if (imm_expr.X_op != O_constant)
7047           as_bad (_("Improper rotate count"));
7048         rot = imm_expr.X_add_number & 0x1f;
7049         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7050           {
7051             macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7052             break;
7053           }
7054         if (rot == 0)
7055           {
7056             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7057             break;
7058           }
7059         used_at = 1;
7060         macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7061         macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7062         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7063       }
7064       break;
7065
7066     case M_S_DOB:
7067       if (mips_opts.arch == CPU_R4650)
7068         {
7069           as_bad (_("opcode not supported on this processor"));
7070           break;
7071         }
7072       assert (mips_opts.isa == ISA_MIPS1);
7073       /* Even on a big endian machine $fn comes before $fn+1.  We have
7074          to adjust when storing to memory.  */
7075       macro_build (&offset_expr, "swc1", "T,o(b)",
7076                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7077       offset_expr.X_add_number += 4;
7078       macro_build (&offset_expr, "swc1", "T,o(b)",
7079                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7080       break;
7081
7082     case M_SEQ:
7083       if (sreg == 0)
7084         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7085       else if (treg == 0)
7086         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7087       else
7088         {
7089           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7090           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7091         }
7092       break;
7093
7094     case M_SEQ_I:
7095       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7096         {
7097           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7098           break;
7099         }
7100       if (sreg == 0)
7101         {
7102           as_warn (_("Instruction %s: result is always false"),
7103                    ip->insn_mo->name);
7104           move_register (dreg, 0);
7105           break;
7106         }
7107       if (imm_expr.X_op == O_constant
7108           && imm_expr.X_add_number >= 0
7109           && imm_expr.X_add_number < 0x10000)
7110         {
7111           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7112         }
7113       else if (imm_expr.X_op == O_constant
7114                && imm_expr.X_add_number > -0x8000
7115                && imm_expr.X_add_number < 0)
7116         {
7117           imm_expr.X_add_number = -imm_expr.X_add_number;
7118           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7119                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7120         }
7121       else
7122         {
7123           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7124           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7125           used_at = 1;
7126         }
7127       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7128       break;
7129
7130     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7131       s = "slt";
7132       goto sge;
7133     case M_SGEU:
7134       s = "sltu";
7135     sge:
7136       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7137       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7138       break;
7139
7140     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7141     case M_SGEU_I:
7142       if (imm_expr.X_op == O_constant
7143           && imm_expr.X_add_number >= -0x8000
7144           && imm_expr.X_add_number < 0x8000)
7145         {
7146           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7147                        dreg, sreg, BFD_RELOC_LO16);
7148         }
7149       else
7150         {
7151           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7152           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7153                        dreg, sreg, AT);
7154           used_at = 1;
7155         }
7156       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7157       break;
7158
7159     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
7160       s = "slt";
7161       goto sgt;
7162     case M_SGTU:
7163       s = "sltu";
7164     sgt:
7165       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7166       break;
7167
7168     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
7169       s = "slt";
7170       goto sgti;
7171     case M_SGTU_I:
7172       s = "sltu";
7173     sgti:
7174       used_at = 1;
7175       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7176       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7177       break;
7178
7179     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7180       s = "slt";
7181       goto sle;
7182     case M_SLEU:
7183       s = "sltu";
7184     sle:
7185       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7186       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7187       break;
7188
7189     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7190       s = "slt";
7191       goto slei;
7192     case M_SLEU_I:
7193       s = "sltu";
7194     slei:
7195       used_at = 1;
7196       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7197       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7198       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7199       break;
7200
7201     case M_SLT_I:
7202       if (imm_expr.X_op == O_constant
7203           && imm_expr.X_add_number >= -0x8000
7204           && imm_expr.X_add_number < 0x8000)
7205         {
7206           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7207           break;
7208         }
7209       used_at = 1;
7210       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7211       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7212       break;
7213
7214     case M_SLTU_I:
7215       if (imm_expr.X_op == O_constant
7216           && imm_expr.X_add_number >= -0x8000
7217           && imm_expr.X_add_number < 0x8000)
7218         {
7219           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7220                        BFD_RELOC_LO16);
7221           break;
7222         }
7223       used_at = 1;
7224       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7225       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7226       break;
7227
7228     case M_SNE:
7229       if (sreg == 0)
7230         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7231       else if (treg == 0)
7232         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7233       else
7234         {
7235           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7236           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7237         }
7238       break;
7239
7240     case M_SNE_I:
7241       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7242         {
7243           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7244           break;
7245         }
7246       if (sreg == 0)
7247         {
7248           as_warn (_("Instruction %s: result is always true"),
7249                    ip->insn_mo->name);
7250           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7251                        dreg, 0, BFD_RELOC_LO16);
7252           break;
7253         }
7254       if (imm_expr.X_op == O_constant
7255           && imm_expr.X_add_number >= 0
7256           && imm_expr.X_add_number < 0x10000)
7257         {
7258           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7259         }
7260       else if (imm_expr.X_op == O_constant
7261                && imm_expr.X_add_number > -0x8000
7262                && imm_expr.X_add_number < 0)
7263         {
7264           imm_expr.X_add_number = -imm_expr.X_add_number;
7265           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7266                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7267         }
7268       else
7269         {
7270           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7271           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7272           used_at = 1;
7273         }
7274       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7275       break;
7276
7277     case M_DSUB_I:
7278       dbl = 1;
7279     case M_SUB_I:
7280       if (imm_expr.X_op == O_constant
7281           && imm_expr.X_add_number > -0x8000
7282           && imm_expr.X_add_number <= 0x8000)
7283         {
7284           imm_expr.X_add_number = -imm_expr.X_add_number;
7285           macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7286                        dreg, sreg, BFD_RELOC_LO16);
7287           break;
7288         }
7289       used_at = 1;
7290       load_register (AT, &imm_expr, dbl);
7291       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7292       break;
7293
7294     case M_DSUBU_I:
7295       dbl = 1;
7296     case M_SUBU_I:
7297       if (imm_expr.X_op == O_constant
7298           && imm_expr.X_add_number > -0x8000
7299           && imm_expr.X_add_number <= 0x8000)
7300         {
7301           imm_expr.X_add_number = -imm_expr.X_add_number;
7302           macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7303                        dreg, sreg, BFD_RELOC_LO16);
7304           break;
7305         }
7306       used_at = 1;
7307       load_register (AT, &imm_expr, dbl);
7308       macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7309       break;
7310
7311     case M_TEQ_I:
7312       s = "teq";
7313       goto trap;
7314     case M_TGE_I:
7315       s = "tge";
7316       goto trap;
7317     case M_TGEU_I:
7318       s = "tgeu";
7319       goto trap;
7320     case M_TLT_I:
7321       s = "tlt";
7322       goto trap;
7323     case M_TLTU_I:
7324       s = "tltu";
7325       goto trap;
7326     case M_TNE_I:
7327       s = "tne";
7328     trap:
7329       used_at = 1;
7330       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7331       macro_build (NULL, s, "s,t", sreg, AT);
7332       break;
7333
7334     case M_TRUNCWS:
7335     case M_TRUNCWD:
7336       assert (mips_opts.isa == ISA_MIPS1);
7337       used_at = 1;
7338       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
7339       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
7340
7341       /*
7342        * Is the double cfc1 instruction a bug in the mips assembler;
7343        * or is there a reason for it?
7344        */
7345       start_noreorder ();
7346       macro_build (NULL, "cfc1", "t,G", treg, RA);
7347       macro_build (NULL, "cfc1", "t,G", treg, RA);
7348       macro_build (NULL, "nop", "");
7349       expr1.X_add_number = 3;
7350       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7351       expr1.X_add_number = 2;
7352       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7353       macro_build (NULL, "ctc1", "t,G", AT, RA);
7354       macro_build (NULL, "nop", "");
7355       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7356                    dreg, sreg);
7357       macro_build (NULL, "ctc1", "t,G", treg, RA);
7358       macro_build (NULL, "nop", "");
7359       end_noreorder ();
7360       break;
7361
7362     case M_ULH:
7363       s = "lb";
7364       goto ulh;
7365     case M_ULHU:
7366       s = "lbu";
7367     ulh:
7368       used_at = 1;
7369       if (offset_expr.X_add_number >= 0x7fff)
7370         as_bad (_("operand overflow"));
7371       if (! target_big_endian)
7372         ++offset_expr.X_add_number;
7373       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
7374       if (! target_big_endian)
7375         --offset_expr.X_add_number;
7376       else
7377         ++offset_expr.X_add_number;
7378       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7379       macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
7380       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7381       break;
7382
7383     case M_ULD:
7384       s = "ldl";
7385       s2 = "ldr";
7386       off = 7;
7387       goto ulw;
7388     case M_ULW:
7389       s = "lwl";
7390       s2 = "lwr";
7391       off = 3;
7392     ulw:
7393       if (offset_expr.X_add_number >= 0x8000 - off)
7394         as_bad (_("operand overflow"));
7395       if (treg != breg)
7396         tempreg = treg;
7397       else
7398         {
7399           used_at = 1;
7400           tempreg = AT;
7401         }
7402       if (! target_big_endian)
7403         offset_expr.X_add_number += off;
7404       macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7405       if (! target_big_endian)
7406         offset_expr.X_add_number -= off;
7407       else
7408         offset_expr.X_add_number += off;
7409       macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7410
7411       /* If necessary, move the result in tempreg the final destination.  */
7412       if (treg == tempreg)
7413         break;
7414       /* Protect second load's delay slot.  */
7415       load_delay_nop ();
7416       move_register (treg, tempreg);
7417       break;
7418
7419     case M_ULD_A:
7420       s = "ldl";
7421       s2 = "ldr";
7422       off = 7;
7423       goto ulwa;
7424     case M_ULW_A:
7425       s = "lwl";
7426       s2 = "lwr";
7427       off = 3;
7428     ulwa:
7429       used_at = 1;
7430       load_address (AT, &offset_expr, &used_at);
7431       if (breg != 0)
7432         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7433       if (! target_big_endian)
7434         expr1.X_add_number = off;
7435       else
7436         expr1.X_add_number = 0;
7437       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7438       if (! target_big_endian)
7439         expr1.X_add_number = 0;
7440       else
7441         expr1.X_add_number = off;
7442       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7443       break;
7444
7445     case M_ULH_A:
7446     case M_ULHU_A:
7447       used_at = 1;
7448       load_address (AT, &offset_expr, &used_at);
7449       if (breg != 0)
7450         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7451       if (target_big_endian)
7452         expr1.X_add_number = 0;
7453       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
7454                    treg, BFD_RELOC_LO16, AT);
7455       if (target_big_endian)
7456         expr1.X_add_number = 1;
7457       else
7458         expr1.X_add_number = 0;
7459       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7460       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7461       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7462       break;
7463
7464     case M_USH:
7465       used_at = 1;
7466       if (offset_expr.X_add_number >= 0x7fff)
7467         as_bad (_("operand overflow"));
7468       if (target_big_endian)
7469         ++offset_expr.X_add_number;
7470       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7471       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
7472       if (target_big_endian)
7473         --offset_expr.X_add_number;
7474       else
7475         ++offset_expr.X_add_number;
7476       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
7477       break;
7478
7479     case M_USD:
7480       s = "sdl";
7481       s2 = "sdr";
7482       off = 7;
7483       goto usw;
7484     case M_USW:
7485       s = "swl";
7486       s2 = "swr";
7487       off = 3;
7488     usw:
7489       if (offset_expr.X_add_number >= 0x8000 - off)
7490         as_bad (_("operand overflow"));
7491       if (! target_big_endian)
7492         offset_expr.X_add_number += off;
7493       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7494       if (! target_big_endian)
7495         offset_expr.X_add_number -= off;
7496       else
7497         offset_expr.X_add_number += off;
7498       macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7499       break;
7500
7501     case M_USD_A:
7502       s = "sdl";
7503       s2 = "sdr";
7504       off = 7;
7505       goto uswa;
7506     case M_USW_A:
7507       s = "swl";
7508       s2 = "swr";
7509       off = 3;
7510     uswa:
7511       used_at = 1;
7512       load_address (AT, &offset_expr, &used_at);
7513       if (breg != 0)
7514         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7515       if (! target_big_endian)
7516         expr1.X_add_number = off;
7517       else
7518         expr1.X_add_number = 0;
7519       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7520       if (! target_big_endian)
7521         expr1.X_add_number = 0;
7522       else
7523         expr1.X_add_number = off;
7524       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7525       break;
7526
7527     case M_USH_A:
7528       used_at = 1;
7529       load_address (AT, &offset_expr, &used_at);
7530       if (breg != 0)
7531         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7532       if (! target_big_endian)
7533         expr1.X_add_number = 0;
7534       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7535       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
7536       if (! target_big_endian)
7537         expr1.X_add_number = 1;
7538       else
7539         expr1.X_add_number = 0;
7540       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7541       if (! target_big_endian)
7542         expr1.X_add_number = 0;
7543       else
7544         expr1.X_add_number = 1;
7545       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7546       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7547       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7548       break;
7549
7550     default:
7551       /* FIXME: Check if this is one of the itbl macros, since they
7552          are added dynamically.  */
7553       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
7554       break;
7555     }
7556   if (mips_opts.noat && used_at)
7557     as_bad (_("Macro used $at after \".set noat\""));
7558 }
7559
7560 /* Implement macros in mips16 mode.  */
7561
7562 static void
7563 mips16_macro (struct mips_cl_insn *ip)
7564 {
7565   int mask;
7566   int xreg, yreg, zreg, tmp;
7567   expressionS expr1;
7568   int dbl;
7569   const char *s, *s2, *s3;
7570
7571   mask = ip->insn_mo->mask;
7572
7573   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
7574   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
7575   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
7576
7577   expr1.X_op = O_constant;
7578   expr1.X_op_symbol = NULL;
7579   expr1.X_add_symbol = NULL;
7580   expr1.X_add_number = 1;
7581
7582   dbl = 0;
7583
7584   switch (mask)
7585     {
7586     default:
7587       internalError ();
7588
7589     case M_DDIV_3:
7590       dbl = 1;
7591     case M_DIV_3:
7592       s = "mflo";
7593       goto do_div3;
7594     case M_DREM_3:
7595       dbl = 1;
7596     case M_REM_3:
7597       s = "mfhi";
7598     do_div3:
7599       start_noreorder ();
7600       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
7601       expr1.X_add_number = 2;
7602       macro_build (&expr1, "bnez", "x,p", yreg);
7603       macro_build (NULL, "break", "6", 7);
7604
7605       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
7606          since that causes an overflow.  We should do that as well,
7607          but I don't see how to do the comparisons without a temporary
7608          register.  */
7609       end_noreorder ();
7610       macro_build (NULL, s, "x", zreg);
7611       break;
7612
7613     case M_DIVU_3:
7614       s = "divu";
7615       s2 = "mflo";
7616       goto do_divu3;
7617     case M_REMU_3:
7618       s = "divu";
7619       s2 = "mfhi";
7620       goto do_divu3;
7621     case M_DDIVU_3:
7622       s = "ddivu";
7623       s2 = "mflo";
7624       goto do_divu3;
7625     case M_DREMU_3:
7626       s = "ddivu";
7627       s2 = "mfhi";
7628     do_divu3:
7629       start_noreorder ();
7630       macro_build (NULL, s, "0,x,y", xreg, yreg);
7631       expr1.X_add_number = 2;
7632       macro_build (&expr1, "bnez", "x,p", yreg);
7633       macro_build (NULL, "break", "6", 7);
7634       end_noreorder ();
7635       macro_build (NULL, s2, "x", zreg);
7636       break;
7637
7638     case M_DMUL:
7639       dbl = 1;
7640     case M_MUL:
7641       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
7642       macro_build (NULL, "mflo", "x", zreg);
7643       break;
7644
7645     case M_DSUBU_I:
7646       dbl = 1;
7647       goto do_subu;
7648     case M_SUBU_I:
7649     do_subu:
7650       if (imm_expr.X_op != O_constant)
7651         as_bad (_("Unsupported large constant"));
7652       imm_expr.X_add_number = -imm_expr.X_add_number;
7653       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
7654       break;
7655
7656     case M_SUBU_I_2:
7657       if (imm_expr.X_op != O_constant)
7658         as_bad (_("Unsupported large constant"));
7659       imm_expr.X_add_number = -imm_expr.X_add_number;
7660       macro_build (&imm_expr, "addiu", "x,k", xreg);
7661       break;
7662
7663     case M_DSUBU_I_2:
7664       if (imm_expr.X_op != O_constant)
7665         as_bad (_("Unsupported large constant"));
7666       imm_expr.X_add_number = -imm_expr.X_add_number;
7667       macro_build (&imm_expr, "daddiu", "y,j", yreg);
7668       break;
7669
7670     case M_BEQ:
7671       s = "cmp";
7672       s2 = "bteqz";
7673       goto do_branch;
7674     case M_BNE:
7675       s = "cmp";
7676       s2 = "btnez";
7677       goto do_branch;
7678     case M_BLT:
7679       s = "slt";
7680       s2 = "btnez";
7681       goto do_branch;
7682     case M_BLTU:
7683       s = "sltu";
7684       s2 = "btnez";
7685       goto do_branch;
7686     case M_BLE:
7687       s = "slt";
7688       s2 = "bteqz";
7689       goto do_reverse_branch;
7690     case M_BLEU:
7691       s = "sltu";
7692       s2 = "bteqz";
7693       goto do_reverse_branch;
7694     case M_BGE:
7695       s = "slt";
7696       s2 = "bteqz";
7697       goto do_branch;
7698     case M_BGEU:
7699       s = "sltu";
7700       s2 = "bteqz";
7701       goto do_branch;
7702     case M_BGT:
7703       s = "slt";
7704       s2 = "btnez";
7705       goto do_reverse_branch;
7706     case M_BGTU:
7707       s = "sltu";
7708       s2 = "btnez";
7709
7710     do_reverse_branch:
7711       tmp = xreg;
7712       xreg = yreg;
7713       yreg = tmp;
7714
7715     do_branch:
7716       macro_build (NULL, s, "x,y", xreg, yreg);
7717       macro_build (&offset_expr, s2, "p");
7718       break;
7719
7720     case M_BEQ_I:
7721       s = "cmpi";
7722       s2 = "bteqz";
7723       s3 = "x,U";
7724       goto do_branch_i;
7725     case M_BNE_I:
7726       s = "cmpi";
7727       s2 = "btnez";
7728       s3 = "x,U";
7729       goto do_branch_i;
7730     case M_BLT_I:
7731       s = "slti";
7732       s2 = "btnez";
7733       s3 = "x,8";
7734       goto do_branch_i;
7735     case M_BLTU_I:
7736       s = "sltiu";
7737       s2 = "btnez";
7738       s3 = "x,8";
7739       goto do_branch_i;
7740     case M_BLE_I:
7741       s = "slti";
7742       s2 = "btnez";
7743       s3 = "x,8";
7744       goto do_addone_branch_i;
7745     case M_BLEU_I:
7746       s = "sltiu";
7747       s2 = "btnez";
7748       s3 = "x,8";
7749       goto do_addone_branch_i;
7750     case M_BGE_I:
7751       s = "slti";
7752       s2 = "bteqz";
7753       s3 = "x,8";
7754       goto do_branch_i;
7755     case M_BGEU_I:
7756       s = "sltiu";
7757       s2 = "bteqz";
7758       s3 = "x,8";
7759       goto do_branch_i;
7760     case M_BGT_I:
7761       s = "slti";
7762       s2 = "bteqz";
7763       s3 = "x,8";
7764       goto do_addone_branch_i;
7765     case M_BGTU_I:
7766       s = "sltiu";
7767       s2 = "bteqz";
7768       s3 = "x,8";
7769
7770     do_addone_branch_i:
7771       if (imm_expr.X_op != O_constant)
7772         as_bad (_("Unsupported large constant"));
7773       ++imm_expr.X_add_number;
7774
7775     do_branch_i:
7776       macro_build (&imm_expr, s, s3, xreg);
7777       macro_build (&offset_expr, s2, "p");
7778       break;
7779
7780     case M_ABS:
7781       expr1.X_add_number = 0;
7782       macro_build (&expr1, "slti", "x,8", yreg);
7783       if (xreg != yreg)
7784         move_register (xreg, yreg);
7785       expr1.X_add_number = 2;
7786       macro_build (&expr1, "bteqz", "p");
7787       macro_build (NULL, "neg", "x,w", xreg, xreg);
7788     }
7789 }
7790
7791 /* For consistency checking, verify that all bits are specified either
7792    by the match/mask part of the instruction definition, or by the
7793    operand list.  */
7794 static int
7795 validate_mips_insn (const struct mips_opcode *opc)
7796 {
7797   const char *p = opc->args;
7798   char c;
7799   unsigned long used_bits = opc->mask;
7800
7801   if ((used_bits & opc->match) != opc->match)
7802     {
7803       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
7804               opc->name, opc->args);
7805       return 0;
7806     }
7807 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
7808   while (*p)
7809     switch (c = *p++)
7810       {
7811       case ',': break;
7812       case '(': break;
7813       case ')': break;
7814       case '+':
7815         switch (c = *p++)
7816           {
7817           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
7818           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
7819           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
7820           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
7821                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
7822           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
7823           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
7824           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
7825           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
7826           case 'I': break;
7827           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
7828           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
7829                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
7830           default:
7831             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
7832                     c, opc->name, opc->args);
7833             return 0;
7834           }
7835         break;
7836       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
7837       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
7838       case 'A': break;
7839       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
7840       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
7841       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
7842       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
7843       case 'F': break;
7844       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
7845       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
7846       case 'I': break;
7847       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
7848       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
7849       case 'L': break;
7850       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
7851       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
7852       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
7853       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
7854                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
7855       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
7856       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
7857       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
7858       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
7859       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
7860       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
7861       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
7862       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
7863       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
7864       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
7865       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
7866       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
7867       case 'f': break;
7868       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
7869       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
7870       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
7871       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
7872       case 'l': break;
7873       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
7874       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
7875       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
7876       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
7877       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
7878       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
7879       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
7880       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
7881       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
7882       case 'x': break;
7883       case 'z': break;
7884       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
7885       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
7886                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
7887       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
7888       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
7889       case '[': break;
7890       case ']': break;
7891       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
7892       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
7893       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
7894       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
7895       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
7896       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
7897       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
7898       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
7899       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
7900       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
7901       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
7902       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
7903       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
7904       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
7905       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
7906       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
7907       default:
7908         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
7909                 c, opc->name, opc->args);
7910         return 0;
7911       }
7912 #undef USE_BITS
7913   if (used_bits != 0xffffffff)
7914     {
7915       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
7916               ~used_bits & 0xffffffff, opc->name, opc->args);
7917       return 0;
7918     }
7919   return 1;
7920 }
7921
7922 /* This routine assembles an instruction into its binary format.  As a
7923    side effect, it sets one of the global variables imm_reloc or
7924    offset_reloc to the type of relocation to do if one of the operands
7925    is an address expression.  */
7926
7927 static void
7928 mips_ip (char *str, struct mips_cl_insn *ip)
7929 {
7930   char *s;
7931   const char *args;
7932   char c = 0;
7933   struct mips_opcode *insn;
7934   char *argsStart;
7935   unsigned int regno;
7936   unsigned int lastregno = 0;
7937   unsigned int lastpos = 0;
7938   unsigned int limlo, limhi;
7939   char *s_reset;
7940   char save_c = 0;
7941   offsetT min_range, max_range;
7942
7943   insn_error = NULL;
7944
7945   /* If the instruction contains a '.', we first try to match an instruction
7946      including the '.'.  Then we try again without the '.'.  */
7947   insn = NULL;
7948   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
7949     continue;
7950
7951   /* If we stopped on whitespace, then replace the whitespace with null for
7952      the call to hash_find.  Save the character we replaced just in case we
7953      have to re-parse the instruction.  */
7954   if (ISSPACE (*s))
7955     {
7956       save_c = *s;
7957       *s++ = '\0';
7958     }
7959
7960   insn = (struct mips_opcode *) hash_find (op_hash, str);
7961
7962   /* If we didn't find the instruction in the opcode table, try again, but
7963      this time with just the instruction up to, but not including the
7964      first '.'.  */
7965   if (insn == NULL)
7966     {
7967       /* Restore the character we overwrite above (if any).  */
7968       if (save_c)
7969         *(--s) = save_c;
7970
7971       /* Scan up to the first '.' or whitespace.  */
7972       for (s = str;
7973            *s != '\0' && *s != '.' && !ISSPACE (*s);
7974            ++s)
7975         continue;
7976
7977       /* If we did not find a '.', then we can quit now.  */
7978       if (*s != '.')
7979         {
7980           insn_error = "unrecognized opcode";
7981           return;
7982         }
7983
7984       /* Lookup the instruction in the hash table.  */
7985       *s++ = '\0';
7986       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
7987         {
7988           insn_error = "unrecognized opcode";
7989           return;
7990         }
7991     }
7992
7993   argsStart = s;
7994   for (;;)
7995     {
7996       bfd_boolean ok;
7997
7998       assert (strcmp (insn->name, str) == 0);
7999
8000       if (OPCODE_IS_MEMBER (insn,
8001                             (mips_opts.isa
8002                              | (file_ase_mips16 ? INSN_MIPS16 : 0)
8003                              | (mips_opts.ase_mdmx ? INSN_MDMX : 0)
8004                              | (mips_opts.ase_dsp ? INSN_DSP : 0)
8005                              | (mips_opts.ase_mt ? INSN_MT : 0)
8006                              | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)),
8007                             mips_opts.arch))
8008         ok = TRUE;
8009       else
8010         ok = FALSE;
8011
8012       if (insn->pinfo != INSN_MACRO)
8013         {
8014           if (mips_opts.arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
8015             ok = FALSE;
8016         }
8017
8018       if (! ok)
8019         {
8020           if (insn + 1 < &mips_opcodes[NUMOPCODES]
8021               && strcmp (insn->name, insn[1].name) == 0)
8022             {
8023               ++insn;
8024               continue;
8025             }
8026           else
8027             {
8028               if (!insn_error)
8029                 {
8030                   static char buf[100];
8031                   sprintf (buf,
8032                            _("opcode not supported on this processor: %s (%s)"),
8033                            mips_cpu_info_from_arch (mips_opts.arch)->name,
8034                            mips_cpu_info_from_isa (mips_opts.isa)->name);
8035                   insn_error = buf;
8036                 }
8037               if (save_c)
8038                 *(--s) = save_c;
8039               return;
8040             }
8041         }
8042
8043       create_insn (ip, insn);
8044       insn_error = NULL;
8045       for (args = insn->args;; ++args)
8046         {
8047           int is_mdmx;
8048
8049           s += strspn (s, " \t");
8050           is_mdmx = 0;
8051           switch (*args)
8052             {
8053             case '\0':          /* end of args */
8054               if (*s == '\0')
8055                 return;
8056               break;
8057
8058             case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8059               my_getExpression (&imm_expr, s);
8060               check_absolute_expr (ip, &imm_expr);
8061               if (imm_expr.X_add_number & ~OP_MASK_SA3)
8062                 {
8063                   as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8064                            OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8065                   imm_expr.X_add_number &= OP_MASK_SA3;
8066                 }
8067               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_SA3;
8068               imm_expr.X_op = O_absent;
8069               s = expr_end;
8070               continue;
8071
8072             case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8073               my_getExpression (&imm_expr, s);
8074               check_absolute_expr (ip, &imm_expr);
8075               if (imm_expr.X_add_number & ~OP_MASK_SA4)
8076                 {
8077                   as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8078                            OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8079                   imm_expr.X_add_number &= OP_MASK_SA4;
8080                 }
8081               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_SA4;
8082               imm_expr.X_op = O_absent;
8083               s = expr_end;
8084               continue;
8085
8086             case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8087               my_getExpression (&imm_expr, s);
8088               check_absolute_expr (ip, &imm_expr);
8089               if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8090                 {
8091                   as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8092                            OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8093                   imm_expr.X_add_number &= OP_MASK_IMM8;
8094                 }
8095               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_IMM8;
8096               imm_expr.X_op = O_absent;
8097               s = expr_end;
8098               continue;
8099
8100             case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8101               my_getExpression (&imm_expr, s);
8102               check_absolute_expr (ip, &imm_expr);
8103               if (imm_expr.X_add_number & ~OP_MASK_RS)
8104                 {
8105                   as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8106                            OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8107                   imm_expr.X_add_number &= OP_MASK_RS;
8108                 }
8109               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_RS;
8110               imm_expr.X_op = O_absent;
8111               s = expr_end;
8112               continue;
8113
8114             case '7': /* four dsp accumulators in bits 11,12 */ 
8115               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8116                   s[3] >= '0' && s[3] <= '3')
8117                 {
8118                   regno = s[3] - '0';
8119                   s += 4;
8120                   ip->insn_opcode |= regno << OP_SH_DSPACC;
8121                   continue;
8122                 }
8123               else
8124                 as_bad (_("Invalid dsp acc register"));
8125               break;
8126
8127             case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8128               my_getExpression (&imm_expr, s);
8129               check_absolute_expr (ip, &imm_expr);
8130               if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8131                 {
8132                   as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8133                            OP_MASK_WRDSP,
8134                            (unsigned long) imm_expr.X_add_number);
8135                   imm_expr.X_add_number &= OP_MASK_WRDSP;
8136                 }
8137               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_WRDSP;
8138               imm_expr.X_op = O_absent;
8139               s = expr_end;
8140               continue;
8141
8142             case '9': /* four dsp accumulators in bits 21,22 */
8143               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8144                   s[3] >= '0' && s[3] <= '3')
8145                 {
8146                   regno = s[3] - '0';
8147                   s += 4;
8148                   ip->insn_opcode |= regno << OP_SH_DSPACC_S;
8149                   continue;
8150                 }
8151               else
8152                 as_bad (_("Invalid dsp acc register"));
8153               break;
8154
8155             case '0': /* dsp 6-bit signed immediate in bit 20 */
8156               my_getExpression (&imm_expr, s);
8157               check_absolute_expr (ip, &imm_expr);
8158               min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8159               max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8160               if (imm_expr.X_add_number < min_range ||
8161                   imm_expr.X_add_number > max_range)
8162                 {
8163                   as_warn (_("DSP immediate not in range %ld..%ld (%ld)"),
8164                            (long) min_range, (long) max_range,
8165                            (long) imm_expr.X_add_number);
8166                 }
8167               imm_expr.X_add_number &= OP_MASK_DSPSFT;
8168               ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8169                                   << OP_SH_DSPSFT);
8170               imm_expr.X_op = O_absent;
8171               s = expr_end;
8172               continue;
8173
8174             case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8175               my_getExpression (&imm_expr, s);
8176               check_absolute_expr (ip, &imm_expr);
8177               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8178                 {
8179                   as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8180                            OP_MASK_RDDSP,
8181                            (unsigned long) imm_expr.X_add_number);
8182                   imm_expr.X_add_number &= OP_MASK_RDDSP;
8183                 }
8184               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_RDDSP;
8185               imm_expr.X_op = O_absent;
8186               s = expr_end;
8187               continue;
8188
8189             case ':': /* dsp 7-bit signed immediate in bit 19 */
8190               my_getExpression (&imm_expr, s);
8191               check_absolute_expr (ip, &imm_expr);
8192               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8193               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8194               if (imm_expr.X_add_number < min_range ||
8195                   imm_expr.X_add_number > max_range)
8196                 {
8197                   as_warn (_("DSP immediate not in range %ld..%ld (%ld)"),
8198                            (long) min_range, (long) max_range,
8199                            (long) imm_expr.X_add_number);
8200                 }
8201               imm_expr.X_add_number &= OP_MASK_DSPSFT_7;
8202               ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8203                                   << OP_SH_DSPSFT_7);
8204               imm_expr.X_op = O_absent;
8205               s = expr_end;
8206               continue;
8207
8208             case '@': /* dsp 10-bit signed immediate in bit 16 */
8209               my_getExpression (&imm_expr, s);
8210               check_absolute_expr (ip, &imm_expr);
8211               min_range = -((OP_MASK_IMM10 + 1) >> 1);
8212               max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8213               if (imm_expr.X_add_number < min_range ||
8214                   imm_expr.X_add_number > max_range)
8215                 {
8216                   as_warn (_("DSP immediate not in range %ld..%ld (%ld)"),
8217                            (long) min_range, (long) max_range,
8218                            (long) imm_expr.X_add_number);
8219                 }
8220               imm_expr.X_add_number &= OP_MASK_IMM10;
8221               ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8222                                   << OP_SH_IMM10);
8223               imm_expr.X_op = O_absent;
8224               s = expr_end;
8225               continue;
8226
8227             case '!': /* mt 1-bit unsigned immediate in bit 5 */
8228               my_getExpression (&imm_expr, s);
8229               check_absolute_expr (ip, &imm_expr);
8230               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
8231                 {
8232                   as_warn (_("MT immediate not in range 0..%d (%lu)"),
8233                            OP_MASK_MT_U, (unsigned long) imm_expr.X_add_number);
8234                   imm_expr.X_add_number &= OP_MASK_MT_U;
8235                 }
8236               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_MT_U;
8237               imm_expr.X_op = O_absent;
8238               s = expr_end;
8239               continue;
8240
8241             case '$': /* mt 1-bit unsigned immediate in bit 4 */
8242               my_getExpression (&imm_expr, s);
8243               check_absolute_expr (ip, &imm_expr);
8244               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
8245                 {
8246                   as_warn (_("MT immediate not in range 0..%d (%lu)"),
8247                            OP_MASK_MT_H, (unsigned long) imm_expr.X_add_number);
8248                   imm_expr.X_add_number &= OP_MASK_MT_H;
8249                 }
8250               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_MT_H;
8251               imm_expr.X_op = O_absent;
8252               s = expr_end;
8253               continue;
8254
8255             case '*': /* four dsp accumulators in bits 18,19 */ 
8256               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8257                   s[3] >= '0' && s[3] <= '3')
8258                 {
8259                   regno = s[3] - '0';
8260                   s += 4;
8261                   ip->insn_opcode |= regno << OP_SH_MTACC_T;
8262                   continue;
8263                 }
8264               else
8265                 as_bad (_("Invalid dsp/smartmips acc register"));
8266               break;
8267
8268             case '&': /* four dsp accumulators in bits 13,14 */ 
8269               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8270                   s[3] >= '0' && s[3] <= '3')
8271                 {
8272                   regno = s[3] - '0';
8273                   s += 4;
8274                   ip->insn_opcode |= regno << OP_SH_MTACC_D;
8275                   continue;
8276                 }
8277               else
8278                 as_bad (_("Invalid dsp/smartmips acc register"));
8279               break;
8280
8281             case ',':
8282               if (*s++ == *args)
8283                 continue;
8284               s--;
8285               switch (*++args)
8286                 {
8287                 case 'r':
8288                 case 'v':
8289                   INSERT_OPERAND (RS, *ip, lastregno);
8290                   continue;
8291
8292                 case 'w':
8293                   INSERT_OPERAND (RT, *ip, lastregno);
8294                   continue;
8295
8296                 case 'W':
8297                   INSERT_OPERAND (FT, *ip, lastregno);
8298                   continue;
8299
8300                 case 'V':
8301                   INSERT_OPERAND (FS, *ip, lastregno);
8302                   continue;
8303                 }
8304               break;
8305
8306             case '(':
8307               /* Handle optional base register.
8308                  Either the base register is omitted or
8309                  we must have a left paren.  */
8310               /* This is dependent on the next operand specifier
8311                  is a base register specification.  */
8312               assert (args[1] == 'b' || args[1] == '5'
8313                       || args[1] == '-' || args[1] == '4');
8314               if (*s == '\0')
8315                 return;
8316
8317             case ')':           /* these must match exactly */
8318             case '[':
8319             case ']':
8320               if (*s++ == *args)
8321                 continue;
8322               break;
8323
8324             case '+':           /* Opcode extension character.  */
8325               switch (*++args)
8326                 {
8327                 case 'A':               /* ins/ext position, becomes LSB.  */
8328                   limlo = 0;
8329                   limhi = 31;
8330                   goto do_lsb;
8331                 case 'E':
8332                   limlo = 32;
8333                   limhi = 63;
8334                   goto do_lsb;
8335 do_lsb:
8336                   my_getExpression (&imm_expr, s);
8337                   check_absolute_expr (ip, &imm_expr);
8338                   if ((unsigned long) imm_expr.X_add_number < limlo
8339                       || (unsigned long) imm_expr.X_add_number > limhi)
8340                     {
8341                       as_bad (_("Improper position (%lu)"),
8342                               (unsigned long) imm_expr.X_add_number);
8343                       imm_expr.X_add_number = limlo;
8344                     }
8345                   lastpos = imm_expr.X_add_number;
8346                   INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
8347                   imm_expr.X_op = O_absent;
8348                   s = expr_end;
8349                   continue;
8350
8351                 case 'B':               /* ins size, becomes MSB.  */
8352                   limlo = 1;
8353                   limhi = 32;
8354                   goto do_msb;
8355                 case 'F':
8356                   limlo = 33;
8357                   limhi = 64;
8358                   goto do_msb;
8359 do_msb:
8360                   my_getExpression (&imm_expr, s);
8361                   check_absolute_expr (ip, &imm_expr);
8362                   /* Check for negative input so that small negative numbers
8363                      will not succeed incorrectly.  The checks against
8364                      (pos+size) transitively check "size" itself,
8365                      assuming that "pos" is reasonable.  */
8366                   if ((long) imm_expr.X_add_number < 0
8367                       || ((unsigned long) imm_expr.X_add_number
8368                           + lastpos) < limlo
8369                       || ((unsigned long) imm_expr.X_add_number
8370                           + lastpos) > limhi)
8371                     {
8372                       as_bad (_("Improper insert size (%lu, position %lu)"),
8373                               (unsigned long) imm_expr.X_add_number,
8374                               (unsigned long) lastpos);
8375                       imm_expr.X_add_number = limlo - lastpos;
8376                     }
8377                   INSERT_OPERAND (INSMSB, *ip,
8378                                  lastpos + imm_expr.X_add_number - 1);
8379                   imm_expr.X_op = O_absent;
8380                   s = expr_end;
8381                   continue;
8382
8383                 case 'C':               /* ext size, becomes MSBD.  */
8384                   limlo = 1;
8385                   limhi = 32;
8386                   goto do_msbd;
8387                 case 'G':
8388                   limlo = 33;
8389                   limhi = 64;
8390                   goto do_msbd;
8391                 case 'H':
8392                   limlo = 33;
8393                   limhi = 64;
8394                   goto do_msbd;
8395 do_msbd:
8396                   my_getExpression (&imm_expr, s);
8397                   check_absolute_expr (ip, &imm_expr);
8398                   /* Check for negative input so that small negative numbers
8399                      will not succeed incorrectly.  The checks against
8400                      (pos+size) transitively check "size" itself,
8401                      assuming that "pos" is reasonable.  */
8402                   if ((long) imm_expr.X_add_number < 0
8403                       || ((unsigned long) imm_expr.X_add_number
8404                           + lastpos) < limlo
8405                       || ((unsigned long) imm_expr.X_add_number
8406                           + lastpos) > limhi)
8407                     {
8408                       as_bad (_("Improper extract size (%lu, position %lu)"),
8409                               (unsigned long) imm_expr.X_add_number,
8410                               (unsigned long) lastpos);
8411                       imm_expr.X_add_number = limlo - lastpos;
8412                     }
8413                   INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
8414                   imm_expr.X_op = O_absent;
8415                   s = expr_end;
8416                   continue;
8417
8418                 case 'D':
8419                   /* +D is for disassembly only; never match.  */
8420                   break;
8421
8422                 case 'I':
8423                   /* "+I" is like "I", except that imm2_expr is used.  */
8424                   my_getExpression (&imm2_expr, s);
8425                   if (imm2_expr.X_op != O_big
8426                       && imm2_expr.X_op != O_constant)
8427                   insn_error = _("absolute expression required");
8428                   if (HAVE_32BIT_GPRS)
8429                     normalize_constant_expr (&imm2_expr);
8430                   s = expr_end;
8431                   continue;
8432
8433                 case 'T': /* Coprocessor register */
8434                   /* +T is for disassembly only; never match.  */
8435                   break;
8436
8437                 case 't': /* Coprocessor register number */
8438                   if (s[0] == '$' && ISDIGIT (s[1]))
8439                     {
8440                       ++s;
8441                       regno = 0;
8442                       do
8443                         {
8444                           regno *= 10;
8445                           regno += *s - '0';
8446                           ++s;
8447                         }
8448                       while (ISDIGIT (*s));
8449                       if (regno > 31)
8450                         as_bad (_("Invalid register number (%d)"), regno);
8451                       else
8452                         {
8453                           ip->insn_opcode |= regno << OP_SH_RT;
8454                           continue;
8455                         }
8456                     }
8457                   else
8458                     as_bad (_("Invalid coprocessor 0 register number"));
8459                   break;
8460
8461                 default:
8462                   as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8463                     *args, insn->name, insn->args);
8464                   /* Further processing is fruitless.  */
8465                   return;
8466                 }
8467               break;
8468
8469             case '<':           /* must be at least one digit */
8470               /*
8471                * According to the manual, if the shift amount is greater
8472                * than 31 or less than 0, then the shift amount should be
8473                * mod 32.  In reality the mips assembler issues an error.
8474                * We issue a warning and mask out all but the low 5 bits.
8475                */
8476               my_getExpression (&imm_expr, s);
8477               check_absolute_expr (ip, &imm_expr);
8478               if ((unsigned long) imm_expr.X_add_number > 31)
8479                 as_warn (_("Improper shift amount (%lu)"),
8480                          (unsigned long) imm_expr.X_add_number);
8481               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
8482               imm_expr.X_op = O_absent;
8483               s = expr_end;
8484               continue;
8485
8486             case '>':           /* shift amount minus 32 */
8487               my_getExpression (&imm_expr, s);
8488               check_absolute_expr (ip, &imm_expr);
8489               if ((unsigned long) imm_expr.X_add_number < 32
8490                   || (unsigned long) imm_expr.X_add_number > 63)
8491                 break;
8492               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
8493               imm_expr.X_op = O_absent;
8494               s = expr_end;
8495               continue;
8496
8497             case 'k':           /* cache code */
8498             case 'h':           /* prefx code */
8499               my_getExpression (&imm_expr, s);
8500               check_absolute_expr (ip, &imm_expr);
8501               if ((unsigned long) imm_expr.X_add_number > 31)
8502                 as_warn (_("Invalid value for `%s' (%lu)"),
8503                          ip->insn_mo->name,
8504                          (unsigned long) imm_expr.X_add_number);
8505               if (*args == 'k')
8506                 INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
8507               else
8508                 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
8509               imm_expr.X_op = O_absent;
8510               s = expr_end;
8511               continue;
8512
8513             case 'c':           /* break code */
8514               my_getExpression (&imm_expr, s);
8515               check_absolute_expr (ip, &imm_expr);
8516               if ((unsigned long) imm_expr.X_add_number > 1023)
8517                 as_warn (_("Illegal break code (%lu)"),
8518                          (unsigned long) imm_expr.X_add_number);
8519               INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
8520               imm_expr.X_op = O_absent;
8521               s = expr_end;
8522               continue;
8523
8524             case 'q':           /* lower break code */
8525               my_getExpression (&imm_expr, s);
8526               check_absolute_expr (ip, &imm_expr);
8527               if ((unsigned long) imm_expr.X_add_number > 1023)
8528                 as_warn (_("Illegal lower break code (%lu)"),
8529                          (unsigned long) imm_expr.X_add_number);
8530               INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
8531               imm_expr.X_op = O_absent;
8532               s = expr_end;
8533               continue;
8534
8535             case 'B':           /* 20-bit syscall/break code.  */
8536               my_getExpression (&imm_expr, s);
8537               check_absolute_expr (ip, &imm_expr);
8538               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
8539                 as_warn (_("Illegal 20-bit code (%lu)"),
8540                          (unsigned long) imm_expr.X_add_number);
8541               INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
8542               imm_expr.X_op = O_absent;
8543               s = expr_end;
8544               continue;
8545
8546             case 'C':           /* Coprocessor code */
8547               my_getExpression (&imm_expr, s);
8548               check_absolute_expr (ip, &imm_expr);
8549               if ((unsigned long) imm_expr.X_add_number >= (1 << 25))
8550                 {
8551                   as_warn (_("Coproccesor code > 25 bits (%lu)"),
8552                            (unsigned long) imm_expr.X_add_number);
8553                   imm_expr.X_add_number &= ((1 << 25) - 1);
8554                 }
8555               ip->insn_opcode |= imm_expr.X_add_number;
8556               imm_expr.X_op = O_absent;
8557               s = expr_end;
8558               continue;
8559
8560             case 'J':           /* 19-bit wait code.  */
8561               my_getExpression (&imm_expr, s);
8562               check_absolute_expr (ip, &imm_expr);
8563               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
8564                 as_warn (_("Illegal 19-bit code (%lu)"),
8565                          (unsigned long) imm_expr.X_add_number);
8566               INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
8567               imm_expr.X_op = O_absent;
8568               s = expr_end;
8569               continue;
8570
8571             case 'P':           /* Performance register */
8572               my_getExpression (&imm_expr, s);
8573               check_absolute_expr (ip, &imm_expr);
8574               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
8575                 as_warn (_("Invalid performance register (%lu)"),
8576                          (unsigned long) imm_expr.X_add_number);
8577               INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
8578               imm_expr.X_op = O_absent;
8579               s = expr_end;
8580               continue;
8581
8582             case 'b':           /* base register */
8583             case 'd':           /* destination register */
8584             case 's':           /* source register */
8585             case 't':           /* target register */
8586             case 'r':           /* both target and source */
8587             case 'v':           /* both dest and source */
8588             case 'w':           /* both dest and target */
8589             case 'E':           /* coprocessor target register */
8590             case 'G':           /* coprocessor destination register */
8591             case 'K':           /* 'rdhwr' destination register */
8592             case 'x':           /* ignore register name */
8593             case 'z':           /* must be zero register */
8594             case 'U':           /* destination register (clo/clz).  */
8595             case 'g':           /* coprocessor destination register */
8596               s_reset = s;
8597               if (s[0] == '$')
8598                 {
8599                   if (ISDIGIT (s[1]))
8600                     {
8601                       ++s;
8602                       regno = 0;
8603                       do
8604                         {
8605                           regno *= 10;
8606                           regno += *s - '0';
8607                           ++s;
8608                         }
8609                       while (ISDIGIT (*s));
8610                       if (regno > 31)
8611                         as_bad (_("Invalid register number (%d)"), regno);
8612                     }
8613                   else if (*args == 'E' || *args == 'G' || *args == 'K')
8614                     goto notreg;
8615                   else
8616                     {
8617                       if (s[1] == 'r' && s[2] == 'a')
8618                         {
8619                           s += 3;
8620                           regno = RA;
8621                         }
8622                       else if (s[1] == 'f' && s[2] == 'p')
8623                         {
8624                           s += 3;
8625                           regno = FP;
8626                         }
8627                       else if (s[1] == 's' && s[2] == 'p')
8628                         {
8629                           s += 3;
8630                           regno = SP;
8631                         }
8632                       else if (s[1] == 'g' && s[2] == 'p')
8633                         {
8634                           s += 3;
8635                           regno = GP;
8636                         }
8637                       else if (s[1] == 'a' && s[2] == 't')
8638                         {
8639                           s += 3;
8640                           regno = AT;
8641                         }
8642                       else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
8643                         {
8644                           s += 4;
8645                           regno = KT0;
8646                         }
8647                       else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
8648                         {
8649                           s += 4;
8650                           regno = KT1;
8651                         }
8652                       else if (s[1] == 'z' && s[2] == 'e' && s[3] == 'r' && s[4] == 'o')
8653                         {
8654                           s += 5;
8655                           regno = ZERO;
8656                         }
8657                       else if (itbl_have_entries)
8658                         {
8659                           char *p, *n;
8660                           unsigned long r;
8661
8662                           p = s + 1;    /* advance past '$' */
8663                           n = itbl_get_field (&p);  /* n is name */
8664
8665                           /* See if this is a register defined in an
8666                              itbl entry.  */
8667                           if (itbl_get_reg_val (n, &r))
8668                             {
8669                               /* Get_field advances to the start of
8670                                  the next field, so we need to back
8671                                  rack to the end of the last field.  */
8672                               if (p)
8673                                 s = p - 1;
8674                               else
8675                                 s = strchr (s, '\0');
8676                               regno = r;
8677                             }
8678                           else
8679                             goto notreg;
8680                         }
8681                       else
8682                         goto notreg;
8683                     }
8684                   if (regno == AT
8685                       && ! mips_opts.noat
8686                       && *args != 'E'
8687                       && *args != 'G'
8688                       && *args != 'K')
8689                     as_warn (_("Used $at without \".set noat\""));
8690                   c = *args;
8691                   if (*s == ' ')
8692                     ++s;
8693                   if (args[1] != *s)
8694                     {
8695                       if (c == 'r' || c == 'v' || c == 'w')
8696                         {
8697                           regno = lastregno;
8698                           s = s_reset;
8699                           ++args;
8700                         }
8701                     }
8702                   /* 'z' only matches $0.  */
8703                   if (c == 'z' && regno != 0)
8704                     break;
8705
8706         /* Now that we have assembled one operand, we use the args string
8707          * to figure out where it goes in the instruction.  */
8708                   switch (c)
8709                     {
8710                     case 'r':
8711                     case 's':
8712                     case 'v':
8713                     case 'b':
8714                       INSERT_OPERAND (RS, *ip, regno);
8715                       break;
8716                     case 'd':
8717                     case 'G':
8718                     case 'K':
8719                     case 'g':
8720                       INSERT_OPERAND (RD, *ip, regno);
8721                       break;
8722                     case 'U':
8723                       INSERT_OPERAND (RD, *ip, regno);
8724                       INSERT_OPERAND (RT, *ip, regno);
8725                       break;
8726                     case 'w':
8727                     case 't':
8728                     case 'E':
8729                       INSERT_OPERAND (RT, *ip, regno);
8730                       break;
8731                     case 'x':
8732                       /* This case exists because on the r3000 trunc
8733                          expands into a macro which requires a gp
8734                          register.  On the r6000 or r4000 it is
8735                          assembled into a single instruction which
8736                          ignores the register.  Thus the insn version
8737                          is MIPS_ISA2 and uses 'x', and the macro
8738                          version is MIPS_ISA1 and uses 't'.  */
8739                       break;
8740                     case 'z':
8741                       /* This case is for the div instruction, which
8742                          acts differently if the destination argument
8743                          is $0.  This only matches $0, and is checked
8744                          outside the switch.  */
8745                       break;
8746                     case 'D':
8747                       /* Itbl operand; not yet implemented. FIXME ?? */
8748                       break;
8749                       /* What about all other operands like 'i', which
8750                          can be specified in the opcode table? */
8751                     }
8752                   lastregno = regno;
8753                   continue;
8754                 }
8755             notreg:
8756               switch (*args++)
8757                 {
8758                 case 'r':
8759                 case 'v':
8760                   INSERT_OPERAND (RS, *ip, lastregno);
8761                   continue;
8762                 case 'w':
8763                   INSERT_OPERAND (RT, *ip, lastregno);
8764                   continue;
8765                 }
8766               break;
8767
8768             case 'O':           /* MDMX alignment immediate constant.  */
8769               my_getExpression (&imm_expr, s);
8770               check_absolute_expr (ip, &imm_expr);
8771               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
8772                 as_warn ("Improper align amount (%ld), using low bits",
8773                          (long) imm_expr.X_add_number);
8774               INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
8775               imm_expr.X_op = O_absent;
8776               s = expr_end;
8777               continue;
8778
8779             case 'Q':           /* MDMX vector, element sel, or const.  */
8780               if (s[0] != '$')
8781                 {
8782                   /* MDMX Immediate.  */
8783                   my_getExpression (&imm_expr, s);
8784                   check_absolute_expr (ip, &imm_expr);
8785                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
8786                     as_warn (_("Invalid MDMX Immediate (%ld)"),
8787                              (long) imm_expr.X_add_number);
8788                   INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
8789                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
8790                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
8791                   else
8792                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
8793                   imm_expr.X_op = O_absent;
8794                   s = expr_end;
8795                   continue;
8796                 }
8797               /* Not MDMX Immediate.  Fall through.  */
8798             case 'X':           /* MDMX destination register.  */
8799             case 'Y':           /* MDMX source register.  */
8800             case 'Z':           /* MDMX target register.  */
8801               is_mdmx = 1;
8802             case 'D':           /* floating point destination register */
8803             case 'S':           /* floating point source register */
8804             case 'T':           /* floating point target register */
8805             case 'R':           /* floating point source register */
8806             case 'V':
8807             case 'W':
8808               s_reset = s;
8809               /* Accept $fN for FP and MDMX register numbers, and in
8810                  addition accept $vN for MDMX register numbers.  */
8811               if ((s[0] == '$' && s[1] == 'f' && ISDIGIT (s[2]))
8812                   || (is_mdmx != 0 && s[0] == '$' && s[1] == 'v'
8813                       && ISDIGIT (s[2])))
8814                 {
8815                   s += 2;
8816                   regno = 0;
8817                   do
8818                     {
8819                       regno *= 10;
8820                       regno += *s - '0';
8821                       ++s;
8822                     }
8823                   while (ISDIGIT (*s));
8824
8825                   if (regno > 31)
8826                     as_bad (_("Invalid float register number (%d)"), regno);
8827
8828                   if ((regno & 1) != 0
8829                       && HAVE_32BIT_FPRS
8830                       && ! (strcmp (str, "mtc1") == 0
8831                             || strcmp (str, "mfc1") == 0
8832                             || strcmp (str, "lwc1") == 0
8833                             || strcmp (str, "swc1") == 0
8834                             || strcmp (str, "l.s") == 0
8835                             || strcmp (str, "s.s") == 0
8836                             || strcmp (str, "mftc1") == 0
8837                             || strcmp (str, "mfthc1") == 0
8838                             || strcmp (str, "cftc1") == 0
8839                             || strcmp (str, "mttc1") == 0
8840                             || strcmp (str, "mtthc1") == 0
8841                             || strcmp (str, "cttc1") == 0))
8842                     as_warn (_("Float register should be even, was %d"),
8843                              regno);
8844
8845                   c = *args;
8846                   if (*s == ' ')
8847                     ++s;
8848                   if (args[1] != *s)
8849                     {
8850                       if (c == 'V' || c == 'W')
8851                         {
8852                           regno = lastregno;
8853                           s = s_reset;
8854                           ++args;
8855                         }
8856                     }
8857                   switch (c)
8858                     {
8859                     case 'D':
8860                     case 'X':
8861                       INSERT_OPERAND (FD, *ip, regno);
8862                       break;
8863                     case 'V':
8864                     case 'S':
8865                     case 'Y':
8866                       INSERT_OPERAND (FS, *ip, regno);
8867                       break;
8868                     case 'Q':
8869                       /* This is like 'Z', but also needs to fix the MDMX
8870                          vector/scalar select bits.  Note that the
8871                          scalar immediate case is handled above.  */
8872                       if (*s == '[')
8873                         {
8874                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
8875                           int max_el = (is_qh ? 3 : 7);
8876                           s++;
8877                           my_getExpression(&imm_expr, s);
8878                           check_absolute_expr (ip, &imm_expr);
8879                           s = expr_end;
8880                           if (imm_expr.X_add_number > max_el)
8881                             as_bad(_("Bad element selector %ld"),
8882                                    (long) imm_expr.X_add_number);
8883                           imm_expr.X_add_number &= max_el;
8884                           ip->insn_opcode |= (imm_expr.X_add_number
8885                                               << (OP_SH_VSEL +
8886                                                   (is_qh ? 2 : 1)));
8887                           imm_expr.X_op = O_absent;
8888                           if (*s != ']')
8889                             as_warn(_("Expecting ']' found '%s'"), s);
8890                           else
8891                             s++;
8892                         }
8893                       else
8894                         {
8895                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
8896                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
8897                                                 << OP_SH_VSEL);
8898                           else
8899                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
8900                                                 OP_SH_VSEL);
8901                         }
8902                       /* Fall through */
8903                     case 'W':
8904                     case 'T':
8905                     case 'Z':
8906                       INSERT_OPERAND (FT, *ip, regno);
8907                       break;
8908                     case 'R':
8909                       INSERT_OPERAND (FR, *ip, regno);
8910                       break;
8911                     }
8912                   lastregno = regno;
8913                   continue;
8914                 }
8915
8916               switch (*args++)
8917                 {
8918                 case 'V':
8919                   INSERT_OPERAND (FS, *ip, lastregno);
8920                   continue;
8921                 case 'W':
8922                   INSERT_OPERAND (FT, *ip, lastregno);
8923                   continue;
8924                 }
8925               break;
8926
8927             case 'I':
8928               my_getExpression (&imm_expr, s);
8929               if (imm_expr.X_op != O_big
8930                   && imm_expr.X_op != O_constant)
8931                 insn_error = _("absolute expression required");
8932               if (HAVE_32BIT_GPRS)
8933                 normalize_constant_expr (&imm_expr);
8934               s = expr_end;
8935               continue;
8936
8937             case 'A':
8938               my_getExpression (&offset_expr, s);
8939               normalize_address_expr (&offset_expr);
8940               *imm_reloc = BFD_RELOC_32;
8941               s = expr_end;
8942               continue;
8943
8944             case 'F':
8945             case 'L':
8946             case 'f':
8947             case 'l':
8948               {
8949                 int f64;
8950                 int using_gprs;
8951                 char *save_in;
8952                 char *err;
8953                 unsigned char temp[8];
8954                 int len;
8955                 unsigned int length;
8956                 segT seg;
8957                 subsegT subseg;
8958                 char *p;
8959
8960                 /* These only appear as the last operand in an
8961                    instruction, and every instruction that accepts
8962                    them in any variant accepts them in all variants.
8963                    This means we don't have to worry about backing out
8964                    any changes if the instruction does not match.
8965
8966                    The difference between them is the size of the
8967                    floating point constant and where it goes.  For 'F'
8968                    and 'L' the constant is 64 bits; for 'f' and 'l' it
8969                    is 32 bits.  Where the constant is placed is based
8970                    on how the MIPS assembler does things:
8971                     F -- .rdata
8972                     L -- .lit8
8973                     f -- immediate value
8974                     l -- .lit4
8975
8976                     The .lit4 and .lit8 sections are only used if
8977                     permitted by the -G argument.
8978
8979                     The code below needs to know whether the target register
8980                     is 32 or 64 bits wide.  It relies on the fact 'f' and
8981                     'F' are used with GPR-based instructions and 'l' and
8982                     'L' are used with FPR-based instructions.  */
8983
8984                 f64 = *args == 'F' || *args == 'L';
8985                 using_gprs = *args == 'F' || *args == 'f';
8986
8987                 save_in = input_line_pointer;
8988                 input_line_pointer = s;
8989                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
8990                 length = len;
8991                 s = input_line_pointer;
8992                 input_line_pointer = save_in;
8993                 if (err != NULL && *err != '\0')
8994                   {
8995                     as_bad (_("Bad floating point constant: %s"), err);
8996                     memset (temp, '\0', sizeof temp);
8997                     length = f64 ? 8 : 4;
8998                   }
8999
9000                 assert (length == (unsigned) (f64 ? 8 : 4));
9001
9002                 if (*args == 'f'
9003                     || (*args == 'l'
9004                         && (g_switch_value < 4
9005                             || (temp[0] == 0 && temp[1] == 0)
9006                             || (temp[2] == 0 && temp[3] == 0))))
9007                   {
9008                     imm_expr.X_op = O_constant;
9009                     if (! target_big_endian)
9010                       imm_expr.X_add_number = bfd_getl32 (temp);
9011                     else
9012                       imm_expr.X_add_number = bfd_getb32 (temp);
9013                   }
9014                 else if (length > 4
9015                          && ! mips_disable_float_construction
9016                          /* Constants can only be constructed in GPRs and
9017                             copied to FPRs if the GPRs are at least as wide
9018                             as the FPRs.  Force the constant into memory if
9019                             we are using 64-bit FPRs but the GPRs are only
9020                             32 bits wide.  */
9021                          && (using_gprs
9022                              || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9023                          && ((temp[0] == 0 && temp[1] == 0)
9024                              || (temp[2] == 0 && temp[3] == 0))
9025                          && ((temp[4] == 0 && temp[5] == 0)
9026                              || (temp[6] == 0 && temp[7] == 0)))
9027                   {
9028                     /* The value is simple enough to load with a couple of
9029                        instructions.  If using 32-bit registers, set
9030                        imm_expr to the high order 32 bits and offset_expr to
9031                        the low order 32 bits.  Otherwise, set imm_expr to
9032                        the entire 64 bit constant.  */
9033                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9034                       {
9035                         imm_expr.X_op = O_constant;
9036                         offset_expr.X_op = O_constant;
9037                         if (! target_big_endian)
9038                           {
9039                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
9040                             offset_expr.X_add_number = bfd_getl32 (temp);
9041                           }
9042                         else
9043                           {
9044                             imm_expr.X_add_number = bfd_getb32 (temp);
9045                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
9046                           }
9047                         if (offset_expr.X_add_number == 0)
9048                           offset_expr.X_op = O_absent;
9049                       }
9050                     else if (sizeof (imm_expr.X_add_number) > 4)
9051                       {
9052                         imm_expr.X_op = O_constant;
9053                         if (! target_big_endian)
9054                           imm_expr.X_add_number = bfd_getl64 (temp);
9055                         else
9056                           imm_expr.X_add_number = bfd_getb64 (temp);
9057                       }
9058                     else
9059                       {
9060                         imm_expr.X_op = O_big;
9061                         imm_expr.X_add_number = 4;
9062                         if (! target_big_endian)
9063                           {
9064                             generic_bignum[0] = bfd_getl16 (temp);
9065                             generic_bignum[1] = bfd_getl16 (temp + 2);
9066                             generic_bignum[2] = bfd_getl16 (temp + 4);
9067                             generic_bignum[3] = bfd_getl16 (temp + 6);
9068                           }
9069                         else
9070                           {
9071                             generic_bignum[0] = bfd_getb16 (temp + 6);
9072                             generic_bignum[1] = bfd_getb16 (temp + 4);
9073                             generic_bignum[2] = bfd_getb16 (temp + 2);
9074                             generic_bignum[3] = bfd_getb16 (temp);
9075                           }
9076                       }
9077                   }
9078                 else
9079                   {
9080                     const char *newname;
9081                     segT new_seg;
9082
9083                     /* Switch to the right section.  */
9084                     seg = now_seg;
9085                     subseg = now_subseg;
9086                     switch (*args)
9087                       {
9088                       default: /* unused default case avoids warnings.  */
9089                       case 'L':
9090                         newname = RDATA_SECTION_NAME;
9091                         if (g_switch_value >= 8)
9092                           newname = ".lit8";
9093                         break;
9094                       case 'F':
9095                         newname = RDATA_SECTION_NAME;
9096                         break;
9097                       case 'l':
9098                         assert (g_switch_value >= 4);
9099                         newname = ".lit4";
9100                         break;
9101                       }
9102                     new_seg = subseg_new (newname, (subsegT) 0);
9103                     if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
9104                       bfd_set_section_flags (stdoutput, new_seg,
9105                                              (SEC_ALLOC
9106                                               | SEC_LOAD
9107                                               | SEC_READONLY
9108                                               | SEC_DATA));
9109                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
9110                     if (OUTPUT_FLAVOR == bfd_target_elf_flavour
9111                         && strcmp (TARGET_OS, "elf") != 0)
9112                       record_alignment (new_seg, 4);
9113                     else
9114                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
9115                     if (seg == now_seg)
9116                       as_bad (_("Can't use floating point insn in this section"));
9117
9118                     /* Set the argument to the current address in the
9119                        section.  */
9120                     offset_expr.X_op = O_symbol;
9121                     offset_expr.X_add_symbol =
9122                       symbol_new ("L0\001", now_seg,
9123                                   (valueT) frag_now_fix (), frag_now);
9124                     offset_expr.X_add_number = 0;
9125
9126                     /* Put the floating point number into the section.  */
9127                     p = frag_more ((int) length);
9128                     memcpy (p, temp, length);
9129
9130                     /* Switch back to the original section.  */
9131                     subseg_set (seg, subseg);
9132                   }
9133               }
9134               continue;
9135
9136             case 'i':           /* 16 bit unsigned immediate */
9137             case 'j':           /* 16 bit signed immediate */
9138               *imm_reloc = BFD_RELOC_LO16;
9139               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9140                 {
9141                   int more;
9142                   offsetT minval, maxval;
9143
9144                   more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9145                           && strcmp (insn->name, insn[1].name) == 0);
9146
9147                   /* If the expression was written as an unsigned number,
9148                      only treat it as signed if there are no more
9149                      alternatives.  */
9150                   if (more
9151                       && *args == 'j'
9152                       && sizeof (imm_expr.X_add_number) <= 4
9153                       && imm_expr.X_op == O_constant
9154                       && imm_expr.X_add_number < 0
9155                       && imm_expr.X_unsigned
9156                       && HAVE_64BIT_GPRS)
9157                     break;
9158
9159                   /* For compatibility with older assemblers, we accept
9160                      0x8000-0xffff as signed 16-bit numbers when only
9161                      signed numbers are allowed.  */
9162                   if (*args == 'i')
9163                     minval = 0, maxval = 0xffff;
9164                   else if (more)
9165                     minval = -0x8000, maxval = 0x7fff;
9166                   else
9167                     minval = -0x8000, maxval = 0xffff;
9168
9169                   if (imm_expr.X_op != O_constant
9170                       || imm_expr.X_add_number < minval
9171                       || imm_expr.X_add_number > maxval)
9172                     {
9173                       if (more)
9174                         break;
9175                       if (imm_expr.X_op == O_constant
9176                           || imm_expr.X_op == O_big)
9177                         as_bad (_("expression out of range"));
9178                     }
9179                 }
9180               s = expr_end;
9181               continue;
9182
9183             case 'o':           /* 16 bit offset */
9184               /* Check whether there is only a single bracketed expression
9185                  left.  If so, it must be the base register and the
9186                  constant must be zero.  */
9187               if (*s == '(' && strchr (s + 1, '(') == 0)
9188                 {
9189                   offset_expr.X_op = O_constant;
9190                   offset_expr.X_add_number = 0;
9191                   continue;
9192                 }
9193
9194               /* If this value won't fit into a 16 bit offset, then go
9195                  find a macro that will generate the 32 bit offset
9196                  code pattern.  */
9197               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9198                   && (offset_expr.X_op != O_constant
9199                       || offset_expr.X_add_number >= 0x8000
9200                       || offset_expr.X_add_number < -0x8000))
9201                 break;
9202
9203               s = expr_end;
9204               continue;
9205
9206             case 'p':           /* pc relative offset */
9207               *offset_reloc = BFD_RELOC_16_PCREL_S2;
9208               my_getExpression (&offset_expr, s);
9209               s = expr_end;
9210               continue;
9211
9212             case 'u':           /* upper 16 bits */
9213               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9214                   && imm_expr.X_op == O_constant
9215                   && (imm_expr.X_add_number < 0
9216                       || imm_expr.X_add_number >= 0x10000))
9217                 as_bad (_("lui expression not in range 0..65535"));
9218               s = expr_end;
9219               continue;
9220
9221             case 'a':           /* 26 bit address */
9222               my_getExpression (&offset_expr, s);
9223               s = expr_end;
9224               *offset_reloc = BFD_RELOC_MIPS_JMP;
9225               continue;
9226
9227             case 'N':           /* 3 bit branch condition code */
9228             case 'M':           /* 3 bit compare condition code */
9229               if (strncmp (s, "$fcc", 4) != 0)
9230                 break;
9231               s += 4;
9232               regno = 0;
9233               do
9234                 {
9235                   regno *= 10;
9236                   regno += *s - '0';
9237                   ++s;
9238                 }
9239               while (ISDIGIT (*s));
9240               if (regno > 7)
9241                 as_bad (_("Invalid condition code register $fcc%d"), regno);
9242               if ((strcmp(str + strlen(str) - 3, ".ps") == 0
9243                    || strcmp(str + strlen(str) - 5, "any2f") == 0
9244                    || strcmp(str + strlen(str) - 5, "any2t") == 0)
9245                   && (regno & 1) != 0)
9246                 as_warn(_("Condition code register should be even for %s, was %d"),
9247                         str, regno);
9248               if ((strcmp(str + strlen(str) - 5, "any4f") == 0
9249                    || strcmp(str + strlen(str) - 5, "any4t") == 0)
9250                   && (regno & 3) != 0)
9251                 as_warn(_("Condition code register should be 0 or 4 for %s, was %d"),
9252                         str, regno);
9253               if (*args == 'N')
9254                 INSERT_OPERAND (BCC, *ip, regno);
9255               else
9256                 INSERT_OPERAND (CCC, *ip, regno);
9257               continue;
9258
9259             case 'H':
9260               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9261                 s += 2;
9262               if (ISDIGIT (*s))
9263                 {
9264                   c = 0;
9265                   do
9266                     {
9267                       c *= 10;
9268                       c += *s - '0';
9269                       ++s;
9270                     }
9271                   while (ISDIGIT (*s));
9272                 }
9273               else
9274                 c = 8; /* Invalid sel value.  */
9275
9276               if (c > 7)
9277                 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9278               ip->insn_opcode |= c;
9279               continue;
9280
9281             case 'e':
9282               /* Must be at least one digit.  */
9283               my_getExpression (&imm_expr, s);
9284               check_absolute_expr (ip, &imm_expr);
9285
9286               if ((unsigned long) imm_expr.X_add_number
9287                   > (unsigned long) OP_MASK_VECBYTE)
9288                 {
9289                   as_bad (_("bad byte vector index (%ld)"),
9290                            (long) imm_expr.X_add_number);
9291                   imm_expr.X_add_number = 0;
9292                 }
9293
9294               INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
9295               imm_expr.X_op = O_absent;
9296               s = expr_end;
9297               continue;
9298
9299             case '%':
9300               my_getExpression (&imm_expr, s);
9301               check_absolute_expr (ip, &imm_expr);
9302
9303               if ((unsigned long) imm_expr.X_add_number
9304                   > (unsigned long) OP_MASK_VECALIGN)
9305                 {
9306                   as_bad (_("bad byte vector index (%ld)"),
9307                            (long) imm_expr.X_add_number);
9308                   imm_expr.X_add_number = 0;
9309                 }
9310
9311               INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
9312               imm_expr.X_op = O_absent;
9313               s = expr_end;
9314               continue;
9315
9316             default:
9317               as_bad (_("bad char = '%c'\n"), *args);
9318               internalError ();
9319             }
9320           break;
9321         }
9322       /* Args don't match.  */
9323       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
9324           !strcmp (insn->name, insn[1].name))
9325         {
9326           ++insn;
9327           s = argsStart;
9328           insn_error = _("illegal operands");
9329           continue;
9330         }
9331       if (save_c)
9332         *(--s) = save_c;
9333       insn_error = _("illegal operands");
9334       return;
9335     }
9336 }
9337
9338 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
9339
9340 /* This routine assembles an instruction into its binary format when
9341    assembling for the mips16.  As a side effect, it sets one of the
9342    global variables imm_reloc or offset_reloc to the type of
9343    relocation to do if one of the operands is an address expression.
9344    It also sets mips16_small and mips16_ext if the user explicitly
9345    requested a small or extended instruction.  */
9346
9347 static void
9348 mips16_ip (char *str, struct mips_cl_insn *ip)
9349 {
9350   char *s;
9351   const char *args;
9352   struct mips_opcode *insn;
9353   char *argsstart;
9354   unsigned int regno;
9355   unsigned int lastregno = 0;
9356   char *s_reset;
9357   size_t i;
9358
9359   insn_error = NULL;
9360
9361   mips16_small = FALSE;
9362   mips16_ext = FALSE;
9363
9364   for (s = str; ISLOWER (*s); ++s)
9365     ;
9366   switch (*s)
9367     {
9368     case '\0':
9369       break;
9370
9371     case ' ':
9372       *s++ = '\0';
9373       break;
9374
9375     case '.':
9376       if (s[1] == 't' && s[2] == ' ')
9377         {
9378           *s = '\0';
9379           mips16_small = TRUE;
9380           s += 3;
9381           break;
9382         }
9383       else if (s[1] == 'e' && s[2] == ' ')
9384         {
9385           *s = '\0';
9386           mips16_ext = TRUE;
9387           s += 3;
9388           break;
9389         }
9390       /* Fall through.  */
9391     default:
9392       insn_error = _("unknown opcode");
9393       return;
9394     }
9395
9396   if (mips_opts.noautoextend && ! mips16_ext)
9397     mips16_small = TRUE;
9398
9399   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
9400     {
9401       insn_error = _("unrecognized opcode");
9402       return;
9403     }
9404
9405   argsstart = s;
9406   for (;;)
9407     {
9408       assert (strcmp (insn->name, str) == 0);
9409
9410       create_insn (ip, insn);
9411       imm_expr.X_op = O_absent;
9412       imm_reloc[0] = BFD_RELOC_UNUSED;
9413       imm_reloc[1] = BFD_RELOC_UNUSED;
9414       imm_reloc[2] = BFD_RELOC_UNUSED;
9415       imm2_expr.X_op = O_absent;
9416       offset_expr.X_op = O_absent;
9417       offset_reloc[0] = BFD_RELOC_UNUSED;
9418       offset_reloc[1] = BFD_RELOC_UNUSED;
9419       offset_reloc[2] = BFD_RELOC_UNUSED;
9420       for (args = insn->args; 1; ++args)
9421         {
9422           int c;
9423
9424           if (*s == ' ')
9425             ++s;
9426
9427           /* In this switch statement we call break if we did not find
9428              a match, continue if we did find a match, or return if we
9429              are done.  */
9430
9431           c = *args;
9432           switch (c)
9433             {
9434             case '\0':
9435               if (*s == '\0')
9436                 {
9437                   /* Stuff the immediate value in now, if we can.  */
9438                   if (imm_expr.X_op == O_constant
9439                       && *imm_reloc > BFD_RELOC_UNUSED
9440                       && insn->pinfo != INSN_MACRO)
9441                     {
9442                       valueT tmp;
9443
9444                       switch (*offset_reloc)
9445                         {
9446                           case BFD_RELOC_MIPS16_HI16_S:
9447                             tmp = (imm_expr.X_add_number + 0x8000) >> 16;
9448                             break;
9449
9450                           case BFD_RELOC_MIPS16_HI16:
9451                             tmp = imm_expr.X_add_number >> 16;
9452                             break;
9453
9454                           case BFD_RELOC_MIPS16_LO16:
9455                             tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
9456                                   - 0x8000;
9457                             break;
9458
9459                           case BFD_RELOC_UNUSED:
9460                             tmp = imm_expr.X_add_number;
9461                             break;
9462
9463                           default:
9464                             internalError ();
9465                         }
9466                       *offset_reloc = BFD_RELOC_UNUSED;
9467
9468                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
9469                                     tmp, TRUE, mips16_small,
9470                                     mips16_ext, &ip->insn_opcode,
9471                                     &ip->use_extend, &ip->extend);
9472                       imm_expr.X_op = O_absent;
9473                       *imm_reloc = BFD_RELOC_UNUSED;
9474                     }
9475
9476                   return;
9477                 }
9478               break;
9479
9480             case ',':
9481               if (*s++ == c)
9482                 continue;
9483               s--;
9484               switch (*++args)
9485                 {
9486                 case 'v':
9487                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9488                   continue;
9489                 case 'w':
9490                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9491                   continue;
9492                 }
9493               break;
9494
9495             case '(':
9496             case ')':
9497               if (*s++ == c)
9498                 continue;
9499               break;
9500
9501             case 'v':
9502             case 'w':
9503               if (s[0] != '$')
9504                 {
9505                   if (c == 'v')
9506                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9507                   else
9508                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9509                   ++args;
9510                   continue;
9511                 }
9512               /* Fall through.  */
9513             case 'x':
9514             case 'y':
9515             case 'z':
9516             case 'Z':
9517             case '0':
9518             case 'S':
9519             case 'R':
9520             case 'X':
9521             case 'Y':
9522               if (s[0] != '$')
9523                 break;
9524               s_reset = s;
9525               if (ISDIGIT (s[1]))
9526                 {
9527                   ++s;
9528                   regno = 0;
9529                   do
9530                     {
9531                       regno *= 10;
9532                       regno += *s - '0';
9533                       ++s;
9534                     }
9535                   while (ISDIGIT (*s));
9536                   if (regno > 31)
9537                     {
9538                       as_bad (_("invalid register number (%d)"), regno);
9539                       regno = 2;
9540                     }
9541                 }
9542               else
9543                 {
9544                   if (s[1] == 'r' && s[2] == 'a')
9545                     {
9546                       s += 3;
9547                       regno = RA;
9548                     }
9549                   else if (s[1] == 'f' && s[2] == 'p')
9550                     {
9551                       s += 3;
9552                       regno = FP;
9553                     }
9554                   else if (s[1] == 's' && s[2] == 'p')
9555                     {
9556                       s += 3;
9557                       regno = SP;
9558                     }
9559                   else if (s[1] == 'g' && s[2] == 'p')
9560                     {
9561                       s += 3;
9562                       regno = GP;
9563                     }
9564                   else if (s[1] == 'a' && s[2] == 't')
9565                     {
9566                       s += 3;
9567                       regno = AT;
9568                     }
9569                   else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
9570                     {
9571                       s += 4;
9572                       regno = KT0;
9573                     }
9574                   else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
9575                     {
9576                       s += 4;
9577                       regno = KT1;
9578                     }
9579                   else if (s[1] == 'z' && s[2] == 'e' && s[3] == 'r' && s[4] == 'o')
9580                     {
9581                       s += 5;
9582                       regno = ZERO;
9583                     }
9584                   else
9585                     break;
9586                 }
9587
9588               if (*s == ' ')
9589                 ++s;
9590               if (args[1] != *s)
9591                 {
9592                   if (c == 'v' || c == 'w')
9593                     {
9594                       regno = mips16_to_32_reg_map[lastregno];
9595                       s = s_reset;
9596                       ++args;
9597                     }
9598                 }
9599
9600               switch (c)
9601                 {
9602                 case 'x':
9603                 case 'y':
9604                 case 'z':
9605                 case 'v':
9606                 case 'w':
9607                 case 'Z':
9608                   regno = mips32_to_16_reg_map[regno];
9609                   break;
9610
9611                 case '0':
9612                   if (regno != 0)
9613                     regno = ILLEGAL_REG;
9614                   break;
9615
9616                 case 'S':
9617                   if (regno != SP)
9618                     regno = ILLEGAL_REG;
9619                   break;
9620
9621                 case 'R':
9622                   if (regno != RA)
9623                     regno = ILLEGAL_REG;
9624                   break;
9625
9626                 case 'X':
9627                 case 'Y':
9628                   if (regno == AT && ! mips_opts.noat)
9629                     as_warn (_("used $at without \".set noat\""));
9630                   break;
9631
9632                 default:
9633                   internalError ();
9634                 }
9635
9636               if (regno == ILLEGAL_REG)
9637                 break;
9638
9639               switch (c)
9640                 {
9641                 case 'x':
9642                 case 'v':
9643                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
9644                   break;
9645                 case 'y':
9646                 case 'w':
9647                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
9648                   break;
9649                 case 'z':
9650                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
9651                   break;
9652                 case 'Z':
9653                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
9654                 case '0':
9655                 case 'S':
9656                 case 'R':
9657                   break;
9658                 case 'X':
9659                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
9660                   break;
9661                 case 'Y':
9662                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
9663                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
9664                   break;
9665                 default:
9666                   internalError ();
9667                 }
9668
9669               lastregno = regno;
9670               continue;
9671
9672             case 'P':
9673               if (strncmp (s, "$pc", 3) == 0)
9674                 {
9675                   s += 3;
9676                   continue;
9677                 }
9678               break;
9679
9680             case '5':
9681             case 'H':
9682             case 'W':
9683             case 'D':
9684             case 'j':
9685             case 'V':
9686             case 'C':
9687             case 'U':
9688             case 'k':
9689             case 'K':
9690               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
9691               if (i > 0)
9692                 {
9693                   if (imm_expr.X_op != O_constant)
9694                     {
9695                       mips16_ext = TRUE;
9696                       ip->use_extend = TRUE;
9697                       ip->extend = 0;
9698                     }
9699                   else
9700                     {
9701                       /* We need to relax this instruction.  */
9702                       *offset_reloc = *imm_reloc;
9703                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9704                     }
9705                   s = expr_end;
9706                   continue;
9707                 }
9708               *imm_reloc = BFD_RELOC_UNUSED;
9709               /* Fall through.  */
9710             case '<':
9711             case '>':
9712             case '[':
9713             case ']':
9714             case '4':
9715             case '8':
9716               my_getExpression (&imm_expr, s);
9717               if (imm_expr.X_op == O_register)
9718                 {
9719                   /* What we thought was an expression turned out to
9720                      be a register.  */
9721
9722                   if (s[0] == '(' && args[1] == '(')
9723                     {
9724                       /* It looks like the expression was omitted
9725                          before a register indirection, which means
9726                          that the expression is implicitly zero.  We
9727                          still set up imm_expr, so that we handle
9728                          explicit extensions correctly.  */
9729                       imm_expr.X_op = O_constant;
9730                       imm_expr.X_add_number = 0;
9731                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9732                       continue;
9733                     }
9734
9735                   break;
9736                 }
9737
9738               /* We need to relax this instruction.  */
9739               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9740               s = expr_end;
9741               continue;
9742
9743             case 'p':
9744             case 'q':
9745             case 'A':
9746             case 'B':
9747             case 'E':
9748               /* We use offset_reloc rather than imm_reloc for the PC
9749                  relative operands.  This lets macros with both
9750                  immediate and address operands work correctly.  */
9751               my_getExpression (&offset_expr, s);
9752
9753               if (offset_expr.X_op == O_register)
9754                 break;
9755
9756               /* We need to relax this instruction.  */
9757               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
9758               s = expr_end;
9759               continue;
9760
9761             case '6':           /* break code */
9762               my_getExpression (&imm_expr, s);
9763               check_absolute_expr (ip, &imm_expr);
9764               if ((unsigned long) imm_expr.X_add_number > 63)
9765                 as_warn (_("Invalid value for `%s' (%lu)"),
9766                          ip->insn_mo->name,
9767                          (unsigned long) imm_expr.X_add_number);
9768               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
9769               imm_expr.X_op = O_absent;
9770               s = expr_end;
9771               continue;
9772
9773             case 'a':           /* 26 bit address */
9774               my_getExpression (&offset_expr, s);
9775               s = expr_end;
9776               *offset_reloc = BFD_RELOC_MIPS16_JMP;
9777               ip->insn_opcode <<= 16;
9778               continue;
9779
9780             case 'l':           /* register list for entry macro */
9781             case 'L':           /* register list for exit macro */
9782               {
9783                 int mask;
9784
9785                 if (c == 'l')
9786                   mask = 0;
9787                 else
9788                   mask = 7 << 3;
9789                 while (*s != '\0')
9790                   {
9791                     int freg, reg1, reg2;
9792
9793                     while (*s == ' ' || *s == ',')
9794                       ++s;
9795                     if (*s != '$')
9796                       {
9797                         as_bad (_("can't parse register list"));
9798                         break;
9799                       }
9800                     ++s;
9801                     if (*s != 'f')
9802                       freg = 0;
9803                     else
9804                       {
9805                         freg = 1;
9806                         ++s;
9807                       }
9808                     reg1 = 0;
9809                     while (ISDIGIT (*s))
9810                       {
9811                         reg1 *= 10;
9812                         reg1 += *s - '0';
9813                         ++s;
9814                       }
9815                     if (*s == ' ')
9816                       ++s;
9817                     if (*s != '-')
9818                       reg2 = reg1;
9819                     else
9820                       {
9821                         ++s;
9822                         if (*s != '$')
9823                           break;
9824                         ++s;
9825                         if (freg)
9826                           {
9827                             if (*s == 'f')
9828                               ++s;
9829                             else
9830                               {
9831                                 as_bad (_("invalid register list"));
9832                                 break;
9833                               }
9834                           }
9835                         reg2 = 0;
9836                         while (ISDIGIT (*s))
9837                           {
9838                             reg2 *= 10;
9839                             reg2 += *s - '0';
9840                             ++s;
9841                           }
9842                       }
9843                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
9844                       {
9845                         mask &= ~ (7 << 3);
9846                         mask |= 5 << 3;
9847                       }
9848                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
9849                       {
9850                         mask &= ~ (7 << 3);
9851                         mask |= 6 << 3;
9852                       }
9853                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
9854                       mask |= (reg2 - 3) << 3;
9855                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
9856                       mask |= (reg2 - 15) << 1;
9857                     else if (reg1 == RA && reg2 == RA)
9858                       mask |= 1;
9859                     else
9860                       {
9861                         as_bad (_("invalid register list"));
9862                         break;
9863                       }
9864                   }
9865                 /* The mask is filled in in the opcode table for the
9866                    benefit of the disassembler.  We remove it before
9867                    applying the actual mask.  */
9868                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
9869                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
9870               }
9871             continue;
9872
9873             case 'm':           /* Register list for save insn.  */
9874             case 'M':           /* Register list for restore insn.  */
9875               {
9876                 int opcode = 0;
9877                 int framesz = 0, seen_framesz = 0;
9878                 int args = 0, statics = 0, sregs = 0;
9879
9880                 while (*s != '\0')
9881                   {
9882                     unsigned int reg1, reg2;
9883
9884                     SKIP_SPACE_TABS (s);
9885                     while (*s == ',')
9886                       ++s;
9887                     SKIP_SPACE_TABS (s);
9888
9889                     my_getExpression (&imm_expr, s);
9890                     if (imm_expr.X_op == O_constant)
9891                       {
9892                         /* Handle the frame size.  */
9893                         if (seen_framesz)
9894                           {
9895                             as_bad (_("more than one frame size in list"));
9896                             break;
9897                           }
9898                         seen_framesz = 1;
9899                         framesz = imm_expr.X_add_number;
9900                         imm_expr.X_op = O_absent;
9901                         s = expr_end;
9902                         continue;
9903                       }
9904
9905                     if (*s != '$')
9906                       {
9907                         as_bad (_("can't parse register list"));
9908                         break;
9909                       }
9910                     ++s;
9911
9912                     reg1 = 0;
9913                     while (ISDIGIT (*s))
9914                       {
9915                         reg1 *= 10;
9916                         reg1 += *s - '0';
9917                         ++s;
9918                       }
9919                     SKIP_SPACE_TABS (s);
9920                     if (*s != '-')
9921                       reg2 = reg1;
9922                     else
9923                       {
9924                         ++s;
9925                         if (*s != '$')
9926                           {
9927                             as_bad (_("can't parse register list"));
9928                             break;
9929                           }
9930                         ++s;
9931                         reg2 = 0;
9932                         while (ISDIGIT (*s))
9933                           {
9934                             reg2 *= 10;
9935                             reg2 += *s - '0';
9936                             ++s;
9937                           }
9938                       }
9939
9940                     while (reg1 <= reg2)
9941                       {
9942                         if (reg1 >= 4 && reg1 <= 7)
9943                           {
9944                             if (c == 'm' && !seen_framesz)
9945                                 /* args $a0-$a3 */
9946                                 args |= 1 << (reg1 - 4);
9947                             else
9948                                 /* statics $a0-$a3 */
9949                                 statics |= 1 << (reg1 - 4);
9950                           }
9951                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
9952                           {
9953                             /* $s0-$s8 */
9954                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
9955                           }
9956                         else if (reg1 == 31)
9957                           {
9958                             /* Add $ra to insn.  */
9959                             opcode |= 0x40;
9960                           }
9961                         else
9962                           {
9963                             as_bad (_("unexpected register in list"));
9964                             break;
9965                           }
9966                         if (++reg1 == 24)
9967                           reg1 = 30;
9968                       }
9969                   }
9970
9971                 /* Encode args/statics combination.  */
9972                 if (args & statics)
9973                   as_bad (_("arg/static registers overlap"));
9974                 else if (args == 0xf)
9975                   /* All $a0-$a3 are args.  */
9976                   opcode |= MIPS16_ALL_ARGS << 16;
9977                 else if (statics == 0xf)
9978                   /* All $a0-$a3 are statics.  */
9979                   opcode |= MIPS16_ALL_STATICS << 16;
9980                 else 
9981                   {
9982                     int narg = 0, nstat = 0;
9983
9984                     /* Count arg registers.  */
9985                     while (args & 0x1)
9986                       {
9987                         args >>= 1;
9988                         narg++;
9989                       }
9990                     if (args != 0)
9991                       as_bad (_("invalid arg register list"));
9992
9993                     /* Count static registers.  */
9994                     while (statics & 0x8)
9995                       {
9996                         statics = (statics << 1) & 0xf;
9997                         nstat++;
9998                       }
9999                     if (statics != 0) 
10000                       as_bad (_("invalid static register list"));
10001
10002                     /* Encode args/statics.  */
10003                     opcode |= ((narg << 2) | nstat) << 16;
10004                   }
10005
10006                 /* Encode $s0/$s1.  */
10007                 if (sregs & (1 << 0))           /* $s0 */
10008                   opcode |= 0x20;
10009                 if (sregs & (1 << 1))           /* $s1 */
10010                   opcode |= 0x10;
10011                 sregs >>= 2;
10012
10013                 if (sregs != 0)
10014                   {
10015                     /* Count regs $s2-$s8.  */
10016                     int nsreg = 0;
10017                     while (sregs & 1)
10018                       {
10019                         sregs >>= 1;
10020                         nsreg++;
10021                       }
10022                     if (sregs != 0)
10023                       as_bad (_("invalid static register list"));
10024                     /* Encode $s2-$s8. */
10025                     opcode |= nsreg << 24;
10026                   }
10027
10028                 /* Encode frame size.  */
10029                 if (!seen_framesz)
10030                   as_bad (_("missing frame size"));
10031                 else if ((framesz & 7) != 0 || framesz < 0
10032                          || framesz > 0xff * 8)
10033                   as_bad (_("invalid frame size"));
10034                 else if (framesz != 128 || (opcode >> 16) != 0)
10035                   {
10036                     framesz /= 8;
10037                     opcode |= (((framesz & 0xf0) << 16)
10038                              | (framesz & 0x0f));
10039                   }
10040
10041                 /* Finally build the instruction.  */
10042                 if ((opcode >> 16) != 0 || framesz == 0)
10043                   {
10044                     ip->use_extend = TRUE;
10045                     ip->extend = opcode >> 16;
10046                   }
10047                 ip->insn_opcode |= opcode & 0x7f;
10048               }
10049             continue;
10050
10051             case 'e':           /* extend code */
10052               my_getExpression (&imm_expr, s);
10053               check_absolute_expr (ip, &imm_expr);
10054               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10055                 {
10056                   as_warn (_("Invalid value for `%s' (%lu)"),
10057                            ip->insn_mo->name,
10058                            (unsigned long) imm_expr.X_add_number);
10059                   imm_expr.X_add_number &= 0x7ff;
10060                 }
10061               ip->insn_opcode |= imm_expr.X_add_number;
10062               imm_expr.X_op = O_absent;
10063               s = expr_end;
10064               continue;
10065
10066             default:
10067               internalError ();
10068             }
10069           break;
10070         }
10071
10072       /* Args don't match.  */
10073       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10074           strcmp (insn->name, insn[1].name) == 0)
10075         {
10076           ++insn;
10077           s = argsstart;
10078           continue;
10079         }
10080
10081       insn_error = _("illegal operands");
10082
10083       return;
10084     }
10085 }
10086
10087 /* This structure holds information we know about a mips16 immediate
10088    argument type.  */
10089
10090 struct mips16_immed_operand
10091 {
10092   /* The type code used in the argument string in the opcode table.  */
10093   int type;
10094   /* The number of bits in the short form of the opcode.  */
10095   int nbits;
10096   /* The number of bits in the extended form of the opcode.  */
10097   int extbits;
10098   /* The amount by which the short form is shifted when it is used;
10099      for example, the sw instruction has a shift count of 2.  */
10100   int shift;
10101   /* The amount by which the short form is shifted when it is stored
10102      into the instruction code.  */
10103   int op_shift;
10104   /* Non-zero if the short form is unsigned.  */
10105   int unsp;
10106   /* Non-zero if the extended form is unsigned.  */
10107   int extu;
10108   /* Non-zero if the value is PC relative.  */
10109   int pcrel;
10110 };
10111
10112 /* The mips16 immediate operand types.  */
10113
10114 static const struct mips16_immed_operand mips16_immed_operands[] =
10115 {
10116   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10117   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10118   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10119   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10120   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10121   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10122   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10123   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10124   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10125   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10126   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10127   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10128   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10129   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10130   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10131   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10132   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10133   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10134   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10135   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10136   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10137 };
10138
10139 #define MIPS16_NUM_IMMED \
10140   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10141
10142 /* Handle a mips16 instruction with an immediate value.  This or's the
10143    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
10144    whether an extended value is needed; if one is needed, it sets
10145    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
10146    If SMALL is true, an unextended opcode was explicitly requested.
10147    If EXT is true, an extended opcode was explicitly requested.  If
10148    WARN is true, warn if EXT does not match reality.  */
10149
10150 static void
10151 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10152               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10153               unsigned long *insn, bfd_boolean *use_extend,
10154               unsigned short *extend)
10155 {
10156   register const struct mips16_immed_operand *op;
10157   int mintiny, maxtiny;
10158   bfd_boolean needext;
10159
10160   op = mips16_immed_operands;
10161   while (op->type != type)
10162     {
10163       ++op;
10164       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10165     }
10166
10167   if (op->unsp)
10168     {
10169       if (type == '<' || type == '>' || type == '[' || type == ']')
10170         {
10171           mintiny = 1;
10172           maxtiny = 1 << op->nbits;
10173         }
10174       else
10175         {
10176           mintiny = 0;
10177           maxtiny = (1 << op->nbits) - 1;
10178         }
10179     }
10180   else
10181     {
10182       mintiny = - (1 << (op->nbits - 1));
10183       maxtiny = (1 << (op->nbits - 1)) - 1;
10184     }
10185
10186   /* Branch offsets have an implicit 0 in the lowest bit.  */
10187   if (type == 'p' || type == 'q')
10188     val /= 2;
10189
10190   if ((val & ((1 << op->shift) - 1)) != 0
10191       || val < (mintiny << op->shift)
10192       || val > (maxtiny << op->shift))
10193     needext = TRUE;
10194   else
10195     needext = FALSE;
10196
10197   if (warn && ext && ! needext)
10198     as_warn_where (file, line,
10199                    _("extended operand requested but not required"));
10200   if (small && needext)
10201     as_bad_where (file, line, _("invalid unextended operand value"));
10202
10203   if (small || (! ext && ! needext))
10204     {
10205       int insnval;
10206
10207       *use_extend = FALSE;
10208       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10209       insnval <<= op->op_shift;
10210       *insn |= insnval;
10211     }
10212   else
10213     {
10214       long minext, maxext;
10215       int extval;
10216
10217       if (op->extu)
10218         {
10219           minext = 0;
10220           maxext = (1 << op->extbits) - 1;
10221         }
10222       else
10223         {
10224           minext = - (1 << (op->extbits - 1));
10225           maxext = (1 << (op->extbits - 1)) - 1;
10226         }
10227       if (val < minext || val > maxext)
10228         as_bad_where (file, line,
10229                       _("operand value out of range for instruction"));
10230
10231       *use_extend = TRUE;
10232       if (op->extbits == 16)
10233         {
10234           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10235           val &= 0x1f;
10236         }
10237       else if (op->extbits == 15)
10238         {
10239           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10240           val &= 0xf;
10241         }
10242       else
10243         {
10244           extval = ((val & 0x1f) << 6) | (val & 0x20);
10245           val = 0;
10246         }
10247
10248       *extend = (unsigned short) extval;
10249       *insn |= val;
10250     }
10251 }
10252 \f
10253 struct percent_op_match
10254 {
10255   const char *str;
10256   bfd_reloc_code_real_type reloc;
10257 };
10258
10259 static const struct percent_op_match mips_percent_op[] =
10260 {
10261   {"%lo", BFD_RELOC_LO16},
10262 #ifdef OBJ_ELF
10263   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10264   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10265   {"%call16", BFD_RELOC_MIPS_CALL16},
10266   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10267   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10268   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10269   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10270   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10271   {"%got", BFD_RELOC_MIPS_GOT16},
10272   {"%gp_rel", BFD_RELOC_GPREL16},
10273   {"%half", BFD_RELOC_16},
10274   {"%highest", BFD_RELOC_MIPS_HIGHEST},
10275   {"%higher", BFD_RELOC_MIPS_HIGHER},
10276   {"%neg", BFD_RELOC_MIPS_SUB},
10277   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
10278   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
10279   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
10280   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
10281   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
10282   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
10283   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
10284 #endif
10285   {"%hi", BFD_RELOC_HI16_S}
10286 };
10287
10288 static const struct percent_op_match mips16_percent_op[] =
10289 {
10290   {"%lo", BFD_RELOC_MIPS16_LO16},
10291   {"%gprel", BFD_RELOC_MIPS16_GPREL},
10292   {"%hi", BFD_RELOC_MIPS16_HI16_S}
10293 };
10294
10295
10296 /* Return true if *STR points to a relocation operator.  When returning true,
10297    move *STR over the operator and store its relocation code in *RELOC.
10298    Leave both *STR and *RELOC alone when returning false.  */
10299
10300 static bfd_boolean
10301 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
10302 {
10303   const struct percent_op_match *percent_op;
10304   size_t limit, i;
10305
10306   if (mips_opts.mips16)
10307     {
10308       percent_op = mips16_percent_op;
10309       limit = ARRAY_SIZE (mips16_percent_op);
10310     }
10311   else
10312     {
10313       percent_op = mips_percent_op;
10314       limit = ARRAY_SIZE (mips_percent_op);
10315     }
10316
10317   for (i = 0; i < limit; i++)
10318     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
10319       {
10320         int len = strlen (percent_op[i].str);
10321
10322         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
10323           continue;
10324
10325         *str += strlen (percent_op[i].str);
10326         *reloc = percent_op[i].reloc;
10327
10328         /* Check whether the output BFD supports this relocation.
10329            If not, issue an error and fall back on something safe.  */
10330         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
10331           {
10332             as_bad ("relocation %s isn't supported by the current ABI",
10333                     percent_op[i].str);
10334             *reloc = BFD_RELOC_UNUSED;
10335           }
10336         return TRUE;
10337       }
10338   return FALSE;
10339 }
10340
10341
10342 /* Parse string STR as a 16-bit relocatable operand.  Store the
10343    expression in *EP and the relocations in the array starting
10344    at RELOC.  Return the number of relocation operators used.
10345
10346    On exit, EXPR_END points to the first character after the expression.  */
10347
10348 static size_t
10349 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
10350                        char *str)
10351 {
10352   bfd_reloc_code_real_type reversed_reloc[3];
10353   size_t reloc_index, i;
10354   int crux_depth, str_depth;
10355   char *crux;
10356
10357   /* Search for the start of the main expression, recoding relocations
10358      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
10359      of the main expression and with CRUX_DEPTH containing the number
10360      of open brackets at that point.  */
10361   reloc_index = -1;
10362   str_depth = 0;
10363   do
10364     {
10365       reloc_index++;
10366       crux = str;
10367       crux_depth = str_depth;
10368
10369       /* Skip over whitespace and brackets, keeping count of the number
10370          of brackets.  */
10371       while (*str == ' ' || *str == '\t' || *str == '(')
10372         if (*str++ == '(')
10373           str_depth++;
10374     }
10375   while (*str == '%'
10376          && reloc_index < (HAVE_NEWABI ? 3 : 1)
10377          && parse_relocation (&str, &reversed_reloc[reloc_index]));
10378
10379   my_getExpression (ep, crux);
10380   str = expr_end;
10381
10382   /* Match every open bracket.  */
10383   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
10384     if (*str++ == ')')
10385       crux_depth--;
10386
10387   if (crux_depth > 0)
10388     as_bad ("unclosed '('");
10389
10390   expr_end = str;
10391
10392   if (reloc_index != 0)
10393     {
10394       prev_reloc_op_frag = frag_now;
10395       for (i = 0; i < reloc_index; i++)
10396         reloc[i] = reversed_reloc[reloc_index - 1 - i];
10397     }
10398
10399   return reloc_index;
10400 }
10401
10402 static void
10403 my_getExpression (expressionS *ep, char *str)
10404 {
10405   char *save_in;
10406   valueT val;
10407
10408   save_in = input_line_pointer;
10409   input_line_pointer = str;
10410   expression (ep);
10411   expr_end = input_line_pointer;
10412   input_line_pointer = save_in;
10413
10414   /* If we are in mips16 mode, and this is an expression based on `.',
10415      then we bump the value of the symbol by 1 since that is how other
10416      text symbols are handled.  We don't bother to handle complex
10417      expressions, just `.' plus or minus a constant.  */
10418   if (mips_opts.mips16
10419       && ep->X_op == O_symbol
10420       && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
10421       && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
10422       && symbol_get_frag (ep->X_add_symbol) == frag_now
10423       && symbol_constant_p (ep->X_add_symbol)
10424       && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
10425     S_SET_VALUE (ep->X_add_symbol, val + 1);
10426 }
10427
10428 /* Turn a string in input_line_pointer into a floating point constant
10429    of type TYPE, and store the appropriate bytes in *LITP.  The number
10430    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
10431    returned, or NULL on OK.  */
10432
10433 char *
10434 md_atof (int type, char *litP, int *sizeP)
10435 {
10436   int prec;
10437   LITTLENUM_TYPE words[4];
10438   char *t;
10439   int i;
10440
10441   switch (type)
10442     {
10443     case 'f':
10444       prec = 2;
10445       break;
10446
10447     case 'd':
10448       prec = 4;
10449       break;
10450
10451     default:
10452       *sizeP = 0;
10453       return _("bad call to md_atof");
10454     }
10455
10456   t = atof_ieee (input_line_pointer, type, words);
10457   if (t)
10458     input_line_pointer = t;
10459
10460   *sizeP = prec * 2;
10461
10462   if (! target_big_endian)
10463     {
10464       for (i = prec - 1; i >= 0; i--)
10465         {
10466           md_number_to_chars (litP, words[i], 2);
10467           litP += 2;
10468         }
10469     }
10470   else
10471     {
10472       for (i = 0; i < prec; i++)
10473         {
10474           md_number_to_chars (litP, words[i], 2);
10475           litP += 2;
10476         }
10477     }
10478
10479   return NULL;
10480 }
10481
10482 void
10483 md_number_to_chars (char *buf, valueT val, int n)
10484 {
10485   if (target_big_endian)
10486     number_to_chars_bigendian (buf, val, n);
10487   else
10488     number_to_chars_littleendian (buf, val, n);
10489 }
10490 \f
10491 #ifdef OBJ_ELF
10492 static int support_64bit_objects(void)
10493 {
10494   const char **list, **l;
10495   int yes;
10496
10497   list = bfd_target_list ();
10498   for (l = list; *l != NULL; l++)
10499 #ifdef TE_TMIPS
10500     /* This is traditional mips */
10501     if (strcmp (*l, "elf64-tradbigmips") == 0
10502         || strcmp (*l, "elf64-tradlittlemips") == 0)
10503 #else
10504     if (strcmp (*l, "elf64-bigmips") == 0
10505         || strcmp (*l, "elf64-littlemips") == 0)
10506 #endif
10507       break;
10508   yes = (*l != NULL);
10509   free (list);
10510   return yes;
10511 }
10512 #endif /* OBJ_ELF */
10513
10514 const char *md_shortopts = "O::g::G:";
10515
10516 struct option md_longopts[] =
10517 {
10518   /* Options which specify architecture.  */
10519 #define OPTION_ARCH_BASE    (OPTION_MD_BASE)
10520 #define OPTION_MARCH (OPTION_ARCH_BASE + 0)
10521   {"march", required_argument, NULL, OPTION_MARCH},
10522 #define OPTION_MTUNE (OPTION_ARCH_BASE + 1)
10523   {"mtune", required_argument, NULL, OPTION_MTUNE},
10524 #define OPTION_MIPS1 (OPTION_ARCH_BASE + 2)
10525   {"mips0", no_argument, NULL, OPTION_MIPS1},
10526   {"mips1", no_argument, NULL, OPTION_MIPS1},
10527 #define OPTION_MIPS2 (OPTION_ARCH_BASE + 3)
10528   {"mips2", no_argument, NULL, OPTION_MIPS2},
10529 #define OPTION_MIPS3 (OPTION_ARCH_BASE + 4)
10530   {"mips3", no_argument, NULL, OPTION_MIPS3},
10531 #define OPTION_MIPS4 (OPTION_ARCH_BASE + 5)
10532   {"mips4", no_argument, NULL, OPTION_MIPS4},
10533 #define OPTION_MIPS5 (OPTION_ARCH_BASE + 6)
10534   {"mips5", no_argument, NULL, OPTION_MIPS5},
10535 #define OPTION_MIPS32 (OPTION_ARCH_BASE + 7)
10536   {"mips32", no_argument, NULL, OPTION_MIPS32},
10537 #define OPTION_MIPS64 (OPTION_ARCH_BASE + 8)
10538   {"mips64", no_argument, NULL, OPTION_MIPS64},
10539 #define OPTION_MIPS32R2 (OPTION_ARCH_BASE + 9)
10540   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
10541 #define OPTION_MIPS64R2 (OPTION_ARCH_BASE + 10)
10542   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
10543
10544   /* Options which specify Application Specific Extensions (ASEs).  */
10545 #define OPTION_ASE_BASE (OPTION_ARCH_BASE + 11)
10546 #define OPTION_MIPS16 (OPTION_ASE_BASE + 0)
10547   {"mips16", no_argument, NULL, OPTION_MIPS16},
10548 #define OPTION_NO_MIPS16 (OPTION_ASE_BASE + 1)
10549   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
10550 #define OPTION_MIPS3D (OPTION_ASE_BASE + 2)
10551   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
10552 #define OPTION_NO_MIPS3D (OPTION_ASE_BASE + 3)
10553   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
10554 #define OPTION_MDMX (OPTION_ASE_BASE + 4)
10555   {"mdmx", no_argument, NULL, OPTION_MDMX},
10556 #define OPTION_NO_MDMX (OPTION_ASE_BASE + 5)
10557   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
10558 #define OPTION_DSP (OPTION_ASE_BASE + 6)
10559   {"mdsp", no_argument, NULL, OPTION_DSP},
10560 #define OPTION_NO_DSP (OPTION_ASE_BASE + 7)
10561   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
10562 #define OPTION_MT (OPTION_ASE_BASE + 8)
10563   {"mmt", no_argument, NULL, OPTION_MT},
10564 #define OPTION_NO_MT (OPTION_ASE_BASE + 9)
10565   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
10566
10567   /* Old-style architecture options.  Don't add more of these.  */
10568 #define OPTION_COMPAT_ARCH_BASE (OPTION_ASE_BASE + 10)
10569 #define OPTION_M4650 (OPTION_COMPAT_ARCH_BASE + 0)
10570   {"m4650", no_argument, NULL, OPTION_M4650},
10571 #define OPTION_NO_M4650 (OPTION_COMPAT_ARCH_BASE + 1)
10572   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
10573 #define OPTION_M4010 (OPTION_COMPAT_ARCH_BASE + 2)
10574   {"m4010", no_argument, NULL, OPTION_M4010},
10575 #define OPTION_NO_M4010 (OPTION_COMPAT_ARCH_BASE + 3)
10576   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
10577 #define OPTION_M4100 (OPTION_COMPAT_ARCH_BASE + 4)
10578   {"m4100", no_argument, NULL, OPTION_M4100},
10579 #define OPTION_NO_M4100 (OPTION_COMPAT_ARCH_BASE + 5)
10580   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
10581 #define OPTION_M3900 (OPTION_COMPAT_ARCH_BASE + 6)
10582   {"m3900", no_argument, NULL, OPTION_M3900},
10583 #define OPTION_NO_M3900 (OPTION_COMPAT_ARCH_BASE + 7)
10584   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
10585
10586   /* Options which enable bug fixes.  */
10587 #define OPTION_FIX_BASE    (OPTION_COMPAT_ARCH_BASE + 8)
10588 #define OPTION_M7000_HILO_FIX (OPTION_FIX_BASE + 0)
10589   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
10590 #define OPTION_MNO_7000_HILO_FIX (OPTION_FIX_BASE + 1)
10591   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10592   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10593 #define OPTION_FIX_VR4120 (OPTION_FIX_BASE + 2)
10594 #define OPTION_NO_FIX_VR4120 (OPTION_FIX_BASE + 3)
10595   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
10596   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
10597 #define OPTION_FIX_VR4130 (OPTION_FIX_BASE + 4)
10598 #define OPTION_NO_FIX_VR4130 (OPTION_FIX_BASE + 5)
10599   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
10600   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
10601
10602   /* Miscellaneous options.  */
10603 #define OPTION_MISC_BASE (OPTION_FIX_BASE + 6)
10604 #define OPTION_TRAP (OPTION_MISC_BASE + 0)
10605   {"trap", no_argument, NULL, OPTION_TRAP},
10606   {"no-break", no_argument, NULL, OPTION_TRAP},
10607 #define OPTION_BREAK (OPTION_MISC_BASE + 1)
10608   {"break", no_argument, NULL, OPTION_BREAK},
10609   {"no-trap", no_argument, NULL, OPTION_BREAK},
10610 #define OPTION_EB (OPTION_MISC_BASE + 2)
10611   {"EB", no_argument, NULL, OPTION_EB},
10612 #define OPTION_EL (OPTION_MISC_BASE + 3)
10613   {"EL", no_argument, NULL, OPTION_EL},
10614 #define OPTION_FP32 (OPTION_MISC_BASE + 4)
10615   {"mfp32", no_argument, NULL, OPTION_FP32},
10616 #define OPTION_GP32 (OPTION_MISC_BASE + 5)
10617   {"mgp32", no_argument, NULL, OPTION_GP32},
10618 #define OPTION_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 6)
10619   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
10620 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 7)
10621   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
10622 #define OPTION_FP64 (OPTION_MISC_BASE + 8)
10623   {"mfp64", no_argument, NULL, OPTION_FP64},
10624 #define OPTION_GP64 (OPTION_MISC_BASE + 9)
10625   {"mgp64", no_argument, NULL, OPTION_GP64},
10626 #define OPTION_RELAX_BRANCH (OPTION_MISC_BASE + 10)
10627 #define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 11)
10628   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
10629   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
10630 #define OPTION_MSHARED (OPTION_MISC_BASE + 12)
10631 #define OPTION_MNO_SHARED (OPTION_MISC_BASE + 13)
10632   {"mshared", no_argument, NULL, OPTION_MSHARED},
10633   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
10634 #define OPTION_MSYM32 (OPTION_MISC_BASE + 14)
10635 #define OPTION_MNO_SYM32 (OPTION_MISC_BASE + 15)
10636   {"msym32", no_argument, NULL, OPTION_MSYM32},
10637   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
10638
10639   /* ELF-specific options.  */
10640 #ifdef OBJ_ELF
10641 #define OPTION_ELF_BASE    (OPTION_MISC_BASE + 16)
10642 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
10643   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
10644   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
10645 #define OPTION_NON_SHARED  (OPTION_ELF_BASE + 1)
10646   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
10647 #define OPTION_XGOT        (OPTION_ELF_BASE + 2)
10648   {"xgot",        no_argument, NULL, OPTION_XGOT},
10649 #define OPTION_MABI        (OPTION_ELF_BASE + 3)
10650   {"mabi", required_argument, NULL, OPTION_MABI},
10651 #define OPTION_32          (OPTION_ELF_BASE + 4)
10652   {"32",          no_argument, NULL, OPTION_32},
10653 #define OPTION_N32         (OPTION_ELF_BASE + 5)
10654   {"n32",         no_argument, NULL, OPTION_N32},
10655 #define OPTION_64          (OPTION_ELF_BASE + 6)
10656   {"64",          no_argument, NULL, OPTION_64},
10657 #define OPTION_MDEBUG      (OPTION_ELF_BASE + 7)
10658   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
10659 #define OPTION_NO_MDEBUG   (OPTION_ELF_BASE + 8)
10660   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
10661 #define OPTION_PDR         (OPTION_ELF_BASE + 9)
10662   {"mpdr", no_argument, NULL, OPTION_PDR},
10663 #define OPTION_NO_PDR      (OPTION_ELF_BASE + 10)
10664   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
10665 #define OPTION_MVXWORKS_PIC (OPTION_ELF_BASE + 11)
10666   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
10667 #endif /* OBJ_ELF */
10668
10669   {NULL, no_argument, NULL, 0}
10670 };
10671 size_t md_longopts_size = sizeof (md_longopts);
10672
10673 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
10674    NEW_VALUE.  Warn if another value was already specified.  Note:
10675    we have to defer parsing the -march and -mtune arguments in order
10676    to handle 'from-abi' correctly, since the ABI might be specified
10677    in a later argument.  */
10678
10679 static void
10680 mips_set_option_string (const char **string_ptr, const char *new_value)
10681 {
10682   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
10683     as_warn (_("A different %s was already specified, is now %s"),
10684              string_ptr == &mips_arch_string ? "-march" : "-mtune",
10685              new_value);
10686
10687   *string_ptr = new_value;
10688 }
10689
10690 int
10691 md_parse_option (int c, char *arg)
10692 {
10693   switch (c)
10694     {
10695     case OPTION_CONSTRUCT_FLOATS:
10696       mips_disable_float_construction = 0;
10697       break;
10698
10699     case OPTION_NO_CONSTRUCT_FLOATS:
10700       mips_disable_float_construction = 1;
10701       break;
10702
10703     case OPTION_TRAP:
10704       mips_trap = 1;
10705       break;
10706
10707     case OPTION_BREAK:
10708       mips_trap = 0;
10709       break;
10710
10711     case OPTION_EB:
10712       target_big_endian = 1;
10713       break;
10714
10715     case OPTION_EL:
10716       target_big_endian = 0;
10717       break;
10718
10719     case 'O':
10720       if (arg && arg[1] == '0')
10721         mips_optimize = 1;
10722       else
10723         mips_optimize = 2;
10724       break;
10725
10726     case 'g':
10727       if (arg == NULL)
10728         mips_debug = 2;
10729       else
10730         mips_debug = atoi (arg);
10731       /* When the MIPS assembler sees -g or -g2, it does not do
10732          optimizations which limit full symbolic debugging.  We take
10733          that to be equivalent to -O0.  */
10734       if (mips_debug == 2)
10735         mips_optimize = 1;
10736       break;
10737
10738     case OPTION_MIPS1:
10739       file_mips_isa = ISA_MIPS1;
10740       break;
10741
10742     case OPTION_MIPS2:
10743       file_mips_isa = ISA_MIPS2;
10744       break;
10745
10746     case OPTION_MIPS3:
10747       file_mips_isa = ISA_MIPS3;
10748       break;
10749
10750     case OPTION_MIPS4:
10751       file_mips_isa = ISA_MIPS4;
10752       break;
10753
10754     case OPTION_MIPS5:
10755       file_mips_isa = ISA_MIPS5;
10756       break;
10757
10758     case OPTION_MIPS32:
10759       file_mips_isa = ISA_MIPS32;
10760       break;
10761
10762     case OPTION_MIPS32R2:
10763       file_mips_isa = ISA_MIPS32R2;
10764       break;
10765
10766     case OPTION_MIPS64R2:
10767       file_mips_isa = ISA_MIPS64R2;
10768       break;
10769
10770     case OPTION_MIPS64:
10771       file_mips_isa = ISA_MIPS64;
10772       break;
10773
10774     case OPTION_MTUNE:
10775       mips_set_option_string (&mips_tune_string, arg);
10776       break;
10777
10778     case OPTION_MARCH:
10779       mips_set_option_string (&mips_arch_string, arg);
10780       break;
10781
10782     case OPTION_M4650:
10783       mips_set_option_string (&mips_arch_string, "4650");
10784       mips_set_option_string (&mips_tune_string, "4650");
10785       break;
10786
10787     case OPTION_NO_M4650:
10788       break;
10789
10790     case OPTION_M4010:
10791       mips_set_option_string (&mips_arch_string, "4010");
10792       mips_set_option_string (&mips_tune_string, "4010");
10793       break;
10794
10795     case OPTION_NO_M4010:
10796       break;
10797
10798     case OPTION_M4100:
10799       mips_set_option_string (&mips_arch_string, "4100");
10800       mips_set_option_string (&mips_tune_string, "4100");
10801       break;
10802
10803     case OPTION_NO_M4100:
10804       break;
10805
10806     case OPTION_M3900:
10807       mips_set_option_string (&mips_arch_string, "3900");
10808       mips_set_option_string (&mips_tune_string, "3900");
10809       break;
10810
10811     case OPTION_NO_M3900:
10812       break;
10813
10814     case OPTION_MDMX:
10815       mips_opts.ase_mdmx = 1;
10816       break;
10817
10818     case OPTION_NO_MDMX:
10819       mips_opts.ase_mdmx = 0;
10820       break;
10821
10822     case OPTION_DSP:
10823       mips_opts.ase_dsp = 1;
10824       break;
10825
10826     case OPTION_NO_DSP:
10827       mips_opts.ase_dsp = 0;
10828       break;
10829
10830     case OPTION_MT:
10831       mips_opts.ase_mt = 1;
10832       break;
10833
10834     case OPTION_NO_MT:
10835       mips_opts.ase_mt = 0;
10836       break;
10837
10838     case OPTION_MIPS16:
10839       mips_opts.mips16 = 1;
10840       mips_no_prev_insn ();
10841       break;
10842
10843     case OPTION_NO_MIPS16:
10844       mips_opts.mips16 = 0;
10845       mips_no_prev_insn ();
10846       break;
10847
10848     case OPTION_MIPS3D:
10849       mips_opts.ase_mips3d = 1;
10850       break;
10851
10852     case OPTION_NO_MIPS3D:
10853       mips_opts.ase_mips3d = 0;
10854       break;
10855
10856     case OPTION_FIX_VR4120:
10857       mips_fix_vr4120 = 1;
10858       break;
10859
10860     case OPTION_NO_FIX_VR4120:
10861       mips_fix_vr4120 = 0;
10862       break;
10863
10864     case OPTION_FIX_VR4130:
10865       mips_fix_vr4130 = 1;
10866       break;
10867
10868     case OPTION_NO_FIX_VR4130:
10869       mips_fix_vr4130 = 0;
10870       break;
10871
10872     case OPTION_RELAX_BRANCH:
10873       mips_relax_branch = 1;
10874       break;
10875
10876     case OPTION_NO_RELAX_BRANCH:
10877       mips_relax_branch = 0;
10878       break;
10879
10880     case OPTION_MSHARED:
10881       mips_in_shared = TRUE;
10882       break;
10883
10884     case OPTION_MNO_SHARED:
10885       mips_in_shared = FALSE;
10886       break;
10887
10888     case OPTION_MSYM32:
10889       mips_opts.sym32 = TRUE;
10890       break;
10891
10892     case OPTION_MNO_SYM32:
10893       mips_opts.sym32 = FALSE;
10894       break;
10895
10896 #ifdef OBJ_ELF
10897       /* When generating ELF code, we permit -KPIC and -call_shared to
10898          select SVR4_PIC, and -non_shared to select no PIC.  This is
10899          intended to be compatible with Irix 5.  */
10900     case OPTION_CALL_SHARED:
10901       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10902         {
10903           as_bad (_("-call_shared is supported only for ELF format"));
10904           return 0;
10905         }
10906       mips_pic = SVR4_PIC;
10907       mips_abicalls = TRUE;
10908       break;
10909
10910     case OPTION_NON_SHARED:
10911       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10912         {
10913           as_bad (_("-non_shared is supported only for ELF format"));
10914           return 0;
10915         }
10916       mips_pic = NO_PIC;
10917       mips_abicalls = FALSE;
10918       break;
10919
10920       /* The -xgot option tells the assembler to use 32 bit offsets
10921          when accessing the got in SVR4_PIC mode.  It is for Irix
10922          compatibility.  */
10923     case OPTION_XGOT:
10924       mips_big_got = 1;
10925       break;
10926 #endif /* OBJ_ELF */
10927
10928     case 'G':
10929       g_switch_value = atoi (arg);
10930       g_switch_seen = 1;
10931       break;
10932
10933 #ifdef OBJ_ELF
10934       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
10935          and -mabi=64.  */
10936     case OPTION_32:
10937       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10938         {
10939           as_bad (_("-32 is supported for ELF format only"));
10940           return 0;
10941         }
10942       mips_abi = O32_ABI;
10943       break;
10944
10945     case OPTION_N32:
10946       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10947         {
10948           as_bad (_("-n32 is supported for ELF format only"));
10949           return 0;
10950         }
10951       mips_abi = N32_ABI;
10952       break;
10953
10954     case OPTION_64:
10955       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10956         {
10957           as_bad (_("-64 is supported for ELF format only"));
10958           return 0;
10959         }
10960       mips_abi = N64_ABI;
10961       if (! support_64bit_objects())
10962         as_fatal (_("No compiled in support for 64 bit object file format"));
10963       break;
10964 #endif /* OBJ_ELF */
10965
10966     case OPTION_GP32:
10967       file_mips_gp32 = 1;
10968       break;
10969
10970     case OPTION_GP64:
10971       file_mips_gp32 = 0;
10972       break;
10973
10974     case OPTION_FP32:
10975       file_mips_fp32 = 1;
10976       break;
10977
10978     case OPTION_FP64:
10979       file_mips_fp32 = 0;
10980       break;
10981
10982 #ifdef OBJ_ELF
10983     case OPTION_MABI:
10984       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10985         {
10986           as_bad (_("-mabi is supported for ELF format only"));
10987           return 0;
10988         }
10989       if (strcmp (arg, "32") == 0)
10990         mips_abi = O32_ABI;
10991       else if (strcmp (arg, "o64") == 0)
10992         mips_abi = O64_ABI;
10993       else if (strcmp (arg, "n32") == 0)
10994         mips_abi = N32_ABI;
10995       else if (strcmp (arg, "64") == 0)
10996         {
10997           mips_abi = N64_ABI;
10998           if (! support_64bit_objects())
10999             as_fatal (_("No compiled in support for 64 bit object file "
11000                         "format"));
11001         }
11002       else if (strcmp (arg, "eabi") == 0)
11003         mips_abi = EABI_ABI;
11004       else
11005         {
11006           as_fatal (_("invalid abi -mabi=%s"), arg);
11007           return 0;
11008         }
11009       break;
11010 #endif /* OBJ_ELF */
11011
11012     case OPTION_M7000_HILO_FIX:
11013       mips_7000_hilo_fix = TRUE;
11014       break;
11015
11016     case OPTION_MNO_7000_HILO_FIX:
11017       mips_7000_hilo_fix = FALSE;
11018       break;
11019
11020 #ifdef OBJ_ELF
11021     case OPTION_MDEBUG:
11022       mips_flag_mdebug = TRUE;
11023       break;
11024
11025     case OPTION_NO_MDEBUG:
11026       mips_flag_mdebug = FALSE;
11027       break;
11028
11029     case OPTION_PDR:
11030       mips_flag_pdr = TRUE;
11031       break;
11032
11033     case OPTION_NO_PDR:
11034       mips_flag_pdr = FALSE;
11035       break;
11036
11037     case OPTION_MVXWORKS_PIC:
11038       mips_pic = VXWORKS_PIC;
11039       break;
11040 #endif /* OBJ_ELF */
11041
11042     default:
11043       return 0;
11044     }
11045
11046   return 1;
11047 }
11048 \f
11049 /* Set up globals to generate code for the ISA or processor
11050    described by INFO.  */
11051
11052 static void
11053 mips_set_architecture (const struct mips_cpu_info *info)
11054 {
11055   if (info != 0)
11056     {
11057       file_mips_arch = info->cpu;
11058       mips_opts.arch = info->cpu;
11059       mips_opts.isa = info->isa;
11060     }
11061 }
11062
11063
11064 /* Likewise for tuning.  */
11065
11066 static void
11067 mips_set_tune (const struct mips_cpu_info *info)
11068 {
11069   if (info != 0)
11070     mips_tune = info->cpu;
11071 }
11072
11073
11074 void
11075 mips_after_parse_args (void)
11076 {
11077   const struct mips_cpu_info *arch_info = 0;
11078   const struct mips_cpu_info *tune_info = 0;
11079
11080   /* GP relative stuff not working for PE */
11081   if (strncmp (TARGET_OS, "pe", 2) == 0)
11082     {
11083       if (g_switch_seen && g_switch_value != 0)
11084         as_bad (_("-G not supported in this configuration."));
11085       g_switch_value = 0;
11086     }
11087
11088   if (mips_abi == NO_ABI)
11089     mips_abi = MIPS_DEFAULT_ABI;
11090
11091   /* The following code determines the architecture and register size.
11092      Similar code was added to GCC 3.3 (see override_options() in
11093      config/mips/mips.c).  The GAS and GCC code should be kept in sync
11094      as much as possible.  */
11095
11096   if (mips_arch_string != 0)
11097     arch_info = mips_parse_cpu ("-march", mips_arch_string);
11098
11099   if (file_mips_isa != ISA_UNKNOWN)
11100     {
11101       /* Handle -mipsN.  At this point, file_mips_isa contains the
11102          ISA level specified by -mipsN, while arch_info->isa contains
11103          the -march selection (if any).  */
11104       if (arch_info != 0)
11105         {
11106           /* -march takes precedence over -mipsN, since it is more descriptive.
11107              There's no harm in specifying both as long as the ISA levels
11108              are the same.  */
11109           if (file_mips_isa != arch_info->isa)
11110             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11111                     mips_cpu_info_from_isa (file_mips_isa)->name,
11112                     mips_cpu_info_from_isa (arch_info->isa)->name);
11113         }
11114       else
11115         arch_info = mips_cpu_info_from_isa (file_mips_isa);
11116     }
11117
11118   if (arch_info == 0)
11119     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11120
11121   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11122     as_bad ("-march=%s is not compatible with the selected ABI",
11123             arch_info->name);
11124
11125   mips_set_architecture (arch_info);
11126
11127   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
11128   if (mips_tune_string != 0)
11129     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11130
11131   if (tune_info == 0)
11132     mips_set_tune (arch_info);
11133   else
11134     mips_set_tune (tune_info);
11135
11136   if (file_mips_gp32 >= 0)
11137     {
11138       /* The user specified the size of the integer registers.  Make sure
11139          it agrees with the ABI and ISA.  */
11140       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11141         as_bad (_("-mgp64 used with a 32-bit processor"));
11142       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11143         as_bad (_("-mgp32 used with a 64-bit ABI"));
11144       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11145         as_bad (_("-mgp64 used with a 32-bit ABI"));
11146     }
11147   else
11148     {
11149       /* Infer the integer register size from the ABI and processor.
11150          Restrict ourselves to 32-bit registers if that's all the
11151          processor has, or if the ABI cannot handle 64-bit registers.  */
11152       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11153                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
11154     }
11155
11156   /* ??? GAS treats single-float processors as though they had 64-bit
11157      float registers (although it complains when double-precision
11158      instructions are used).  As things stand, saying they have 32-bit
11159      registers would lead to spurious "register must be even" messages.
11160      So here we assume float registers are always the same size as
11161      integer ones, unless the user says otherwise.  */
11162   if (file_mips_fp32 < 0)
11163     file_mips_fp32 = file_mips_gp32;
11164
11165   /* End of GCC-shared inference code.  */
11166
11167   /* This flag is set when we have a 64-bit capable CPU but use only
11168      32-bit wide registers.  Note that EABI does not use it.  */
11169   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
11170       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
11171           || mips_abi == O32_ABI))
11172     mips_32bitmode = 1;
11173
11174   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11175     as_bad (_("trap exception not supported at ISA 1"));
11176
11177   /* If the selected architecture includes support for ASEs, enable
11178      generation of code for them.  */
11179   if (mips_opts.mips16 == -1)
11180     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
11181   if (mips_opts.ase_mips3d == -1)
11182     mips_opts.ase_mips3d = (CPU_HAS_MIPS3D (file_mips_arch)) ? 1 : 0;
11183   if (mips_opts.ase_mdmx == -1)
11184     mips_opts.ase_mdmx = (CPU_HAS_MDMX (file_mips_arch)) ? 1 : 0;
11185   if (mips_opts.ase_dsp == -1)
11186     mips_opts.ase_dsp = (CPU_HAS_DSP (file_mips_arch)) ? 1 : 0;
11187   if (mips_opts.ase_mt == -1)
11188     mips_opts.ase_mt = (CPU_HAS_MT (file_mips_arch)) ? 1 : 0;
11189
11190   file_mips_isa = mips_opts.isa;
11191   file_ase_mips16 = mips_opts.mips16;
11192   file_ase_mips3d = mips_opts.ase_mips3d;
11193   file_ase_mdmx = mips_opts.ase_mdmx;
11194   file_ase_dsp = mips_opts.ase_dsp;
11195   file_ase_mt = mips_opts.ase_mt;
11196   mips_opts.gp32 = file_mips_gp32;
11197   mips_opts.fp32 = file_mips_fp32;
11198
11199   if (mips_flag_mdebug < 0)
11200     {
11201 #ifdef OBJ_MAYBE_ECOFF
11202       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
11203         mips_flag_mdebug = 1;
11204       else
11205 #endif /* OBJ_MAYBE_ECOFF */
11206         mips_flag_mdebug = 0;
11207     }
11208 }
11209 \f
11210 void
11211 mips_init_after_args (void)
11212 {
11213   /* initialize opcodes */
11214   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
11215   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
11216 }
11217
11218 long
11219 md_pcrel_from (fixS *fixP)
11220 {
11221   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
11222   switch (fixP->fx_r_type)
11223     {
11224     case BFD_RELOC_16_PCREL_S2:
11225     case BFD_RELOC_MIPS_JMP:
11226       /* Return the address of the delay slot.  */
11227       return addr + 4;
11228     default:
11229       return addr;
11230     }
11231 }
11232
11233 /* This is called before the symbol table is processed.  In order to
11234    work with gcc when using mips-tfile, we must keep all local labels.
11235    However, in other cases, we want to discard them.  If we were
11236    called with -g, but we didn't see any debugging information, it may
11237    mean that gcc is smuggling debugging information through to
11238    mips-tfile, in which case we must generate all local labels.  */
11239
11240 void
11241 mips_frob_file_before_adjust (void)
11242 {
11243 #ifndef NO_ECOFF_DEBUGGING
11244   if (ECOFF_DEBUGGING
11245       && mips_debug != 0
11246       && ! ecoff_debugging_seen)
11247     flag_keep_locals = 1;
11248 #endif
11249 }
11250
11251 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
11252    the corresponding LO16 reloc.  This is called before md_apply_fix and
11253    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
11254    relocation operators.
11255
11256    For our purposes, a %lo() expression matches a %got() or %hi()
11257    expression if:
11258
11259       (a) it refers to the same symbol; and
11260       (b) the offset applied in the %lo() expression is no lower than
11261           the offset applied in the %got() or %hi().
11262
11263    (b) allows us to cope with code like:
11264
11265         lui     $4,%hi(foo)
11266         lh      $4,%lo(foo+2)($4)
11267
11268    ...which is legal on RELA targets, and has a well-defined behaviour
11269    if the user knows that adding 2 to "foo" will not induce a carry to
11270    the high 16 bits.
11271
11272    When several %lo()s match a particular %got() or %hi(), we use the
11273    following rules to distinguish them:
11274
11275      (1) %lo()s with smaller offsets are a better match than %lo()s with
11276          higher offsets.
11277
11278      (2) %lo()s with no matching %got() or %hi() are better than those
11279          that already have a matching %got() or %hi().
11280
11281      (3) later %lo()s are better than earlier %lo()s.
11282
11283    These rules are applied in order.
11284
11285    (1) means, among other things, that %lo()s with identical offsets are
11286    chosen if they exist.
11287
11288    (2) means that we won't associate several high-part relocations with
11289    the same low-part relocation unless there's no alternative.  Having
11290    several high parts for the same low part is a GNU extension; this rule
11291    allows careful users to avoid it.
11292
11293    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
11294    with the last high-part relocation being at the front of the list.
11295    It therefore makes sense to choose the last matching low-part
11296    relocation, all other things being equal.  It's also easier
11297    to code that way.  */
11298
11299 void
11300 mips_frob_file (void)
11301 {
11302   struct mips_hi_fixup *l;
11303
11304   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
11305     {
11306       segment_info_type *seginfo;
11307       bfd_boolean matched_lo_p;
11308       fixS **hi_pos, **lo_pos, **pos;
11309
11310       assert (reloc_needs_lo_p (l->fixp->fx_r_type));
11311
11312       /* If a GOT16 relocation turns out to be against a global symbol,
11313          there isn't supposed to be a matching LO.  */
11314       if (l->fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
11315           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
11316         continue;
11317
11318       /* Check quickly whether the next fixup happens to be a matching %lo.  */
11319       if (fixup_has_matching_lo_p (l->fixp))
11320         continue;
11321
11322       seginfo = seg_info (l->seg);
11323
11324       /* Set HI_POS to the position of this relocation in the chain.
11325          Set LO_POS to the position of the chosen low-part relocation.
11326          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
11327          relocation that matches an immediately-preceding high-part
11328          relocation.  */
11329       hi_pos = NULL;
11330       lo_pos = NULL;
11331       matched_lo_p = FALSE;
11332       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
11333         {
11334           if (*pos == l->fixp)
11335             hi_pos = pos;
11336
11337           if (((*pos)->fx_r_type == BFD_RELOC_LO16
11338                || (*pos)->fx_r_type == BFD_RELOC_MIPS16_LO16)
11339               && (*pos)->fx_addsy == l->fixp->fx_addsy
11340               && (*pos)->fx_offset >= l->fixp->fx_offset
11341               && (lo_pos == NULL
11342                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
11343                   || (!matched_lo_p
11344                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
11345             lo_pos = pos;
11346
11347           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
11348                           && fixup_has_matching_lo_p (*pos));
11349         }
11350
11351       /* If we found a match, remove the high-part relocation from its
11352          current position and insert it before the low-part relocation.
11353          Make the offsets match so that fixup_has_matching_lo_p()
11354          will return true.
11355
11356          We don't warn about unmatched high-part relocations since some
11357          versions of gcc have been known to emit dead "lui ...%hi(...)"
11358          instructions.  */
11359       if (lo_pos != NULL)
11360         {
11361           l->fixp->fx_offset = (*lo_pos)->fx_offset;
11362           if (l->fixp->fx_next != *lo_pos)
11363             {
11364               *hi_pos = l->fixp->fx_next;
11365               l->fixp->fx_next = *lo_pos;
11366               *lo_pos = l->fixp;
11367             }
11368         }
11369     }
11370 }
11371
11372 /* We may have combined relocations without symbols in the N32/N64 ABI.
11373    We have to prevent gas from dropping them.  */
11374
11375 int
11376 mips_force_relocation (fixS *fixp)
11377 {
11378   if (generic_force_reloc (fixp))
11379     return 1;
11380
11381   if (HAVE_NEWABI
11382       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
11383       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
11384           || fixp->fx_r_type == BFD_RELOC_HI16_S
11385           || fixp->fx_r_type == BFD_RELOC_LO16))
11386     return 1;
11387
11388   return 0;
11389 }
11390
11391 /* Apply a fixup to the object file.  */
11392
11393 void
11394 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
11395 {
11396   bfd_byte *buf;
11397   long insn;
11398   reloc_howto_type *howto;
11399
11400   /* We ignore generic BFD relocations we don't know about.  */
11401   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
11402   if (! howto)
11403     return;
11404
11405   assert (fixP->fx_size == 4
11406           || fixP->fx_r_type == BFD_RELOC_16
11407           || fixP->fx_r_type == BFD_RELOC_64
11408           || fixP->fx_r_type == BFD_RELOC_CTOR
11409           || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11410           || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
11411           || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY);
11412
11413   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
11414
11415   assert (! fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
11416
11417   /* Don't treat parts of a composite relocation as done.  There are two
11418      reasons for this:
11419
11420      (1) The second and third parts will be against 0 (RSS_UNDEF) but
11421          should nevertheless be emitted if the first part is.
11422
11423      (2) In normal usage, composite relocations are never assembly-time
11424          constants.  The easiest way of dealing with the pathological
11425          exceptions is to generate a relocation against STN_UNDEF and
11426          leave everything up to the linker.  */
11427   if (fixP->fx_addsy == NULL && ! fixP->fx_pcrel && fixP->fx_tcbit == 0)
11428     fixP->fx_done = 1;
11429
11430   switch (fixP->fx_r_type)
11431     {
11432     case BFD_RELOC_MIPS_TLS_GD:
11433     case BFD_RELOC_MIPS_TLS_LDM:
11434     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
11435     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
11436     case BFD_RELOC_MIPS_TLS_GOTTPREL:
11437     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
11438     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
11439       S_SET_THREAD_LOCAL (fixP->fx_addsy);
11440       /* fall through */
11441
11442     case BFD_RELOC_MIPS_JMP:
11443     case BFD_RELOC_MIPS_SHIFT5:
11444     case BFD_RELOC_MIPS_SHIFT6:
11445     case BFD_RELOC_MIPS_GOT_DISP:
11446     case BFD_RELOC_MIPS_GOT_PAGE:
11447     case BFD_RELOC_MIPS_GOT_OFST:
11448     case BFD_RELOC_MIPS_SUB:
11449     case BFD_RELOC_MIPS_INSERT_A:
11450     case BFD_RELOC_MIPS_INSERT_B:
11451     case BFD_RELOC_MIPS_DELETE:
11452     case BFD_RELOC_MIPS_HIGHEST:
11453     case BFD_RELOC_MIPS_HIGHER:
11454     case BFD_RELOC_MIPS_SCN_DISP:
11455     case BFD_RELOC_MIPS_REL16:
11456     case BFD_RELOC_MIPS_RELGOT:
11457     case BFD_RELOC_MIPS_JALR:
11458     case BFD_RELOC_HI16:
11459     case BFD_RELOC_HI16_S:
11460     case BFD_RELOC_GPREL16:
11461     case BFD_RELOC_MIPS_LITERAL:
11462     case BFD_RELOC_MIPS_CALL16:
11463     case BFD_RELOC_MIPS_GOT16:
11464     case BFD_RELOC_GPREL32:
11465     case BFD_RELOC_MIPS_GOT_HI16:
11466     case BFD_RELOC_MIPS_GOT_LO16:
11467     case BFD_RELOC_MIPS_CALL_HI16:
11468     case BFD_RELOC_MIPS_CALL_LO16:
11469     case BFD_RELOC_MIPS16_GPREL:
11470     case BFD_RELOC_MIPS16_HI16:
11471     case BFD_RELOC_MIPS16_HI16_S:
11472       /* Nothing needed to do. The value comes from the reloc entry */
11473       break;
11474
11475     case BFD_RELOC_MIPS16_JMP:
11476       /* We currently always generate a reloc against a symbol, which
11477          means that we don't want an addend even if the symbol is
11478          defined.  */
11479       *valP = 0;
11480       break;
11481
11482     case BFD_RELOC_64:
11483       /* This is handled like BFD_RELOC_32, but we output a sign
11484          extended value if we are only 32 bits.  */
11485       if (fixP->fx_done)
11486         {
11487           if (8 <= sizeof (valueT))
11488             md_number_to_chars ((char *) buf, *valP, 8);
11489           else
11490             {
11491               valueT hiv;
11492
11493               if ((*valP & 0x80000000) != 0)
11494                 hiv = 0xffffffff;
11495               else
11496                 hiv = 0;
11497               md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
11498                                   *valP, 4);
11499               md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
11500                                   hiv, 4);
11501             }
11502         }
11503       break;
11504
11505     case BFD_RELOC_RVA:
11506     case BFD_RELOC_32:
11507       /* If we are deleting this reloc entry, we must fill in the
11508          value now.  This can happen if we have a .word which is not
11509          resolved when it appears but is later defined.   */
11510       if (fixP->fx_done)
11511         md_number_to_chars ((char *) buf, *valP, 4);
11512       break;
11513
11514     case BFD_RELOC_16:
11515       /* If we are deleting this reloc entry, we must fill in the
11516          value now.  */
11517       if (fixP->fx_done)
11518         md_number_to_chars ((char *) buf, *valP, 2);
11519       break;
11520
11521     case BFD_RELOC_LO16:
11522     case BFD_RELOC_MIPS16_LO16:
11523       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
11524          may be safe to remove, but if so it's not obvious.  */
11525       /* When handling an embedded PIC switch statement, we can wind
11526          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
11527       if (fixP->fx_done)
11528         {
11529           if (*valP + 0x8000 > 0xffff)
11530             as_bad_where (fixP->fx_file, fixP->fx_line,
11531                           _("relocation overflow"));
11532           if (target_big_endian)
11533             buf += 2;
11534           md_number_to_chars ((char *) buf, *valP, 2);
11535         }
11536       break;
11537
11538     case BFD_RELOC_16_PCREL_S2:
11539       if ((*valP & 0x3) != 0)
11540         as_bad_where (fixP->fx_file, fixP->fx_line,
11541                       _("Branch to misaligned address (%lx)"), (long) *valP);
11542
11543       /*
11544        * We need to save the bits in the instruction since fixup_segment()
11545        * might be deleting the relocation entry (i.e., a branch within
11546        * the current segment).
11547        */
11548       if (! fixP->fx_done)
11549         break;
11550
11551       /* update old instruction data */
11552       if (target_big_endian)
11553         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
11554       else
11555         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
11556
11557       if (*valP + 0x20000 <= 0x3ffff)
11558         {
11559           insn |= (*valP >> 2) & 0xffff;
11560           md_number_to_chars ((char *) buf, insn, 4);
11561         }
11562       else if (mips_pic == NO_PIC
11563                && fixP->fx_done
11564                && fixP->fx_frag->fr_address >= text_section->vma
11565                && (fixP->fx_frag->fr_address
11566                    < text_section->vma + bfd_get_section_size (text_section))
11567                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
11568                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
11569                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
11570         {
11571           /* The branch offset is too large.  If this is an
11572              unconditional branch, and we are not generating PIC code,
11573              we can convert it to an absolute jump instruction.  */
11574           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
11575             insn = 0x0c000000;  /* jal */
11576           else
11577             insn = 0x08000000;  /* j */
11578           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
11579           fixP->fx_done = 0;
11580           fixP->fx_addsy = section_symbol (text_section);
11581           *valP += md_pcrel_from (fixP);
11582           md_number_to_chars ((char *) buf, insn, 4);
11583         }
11584       else
11585         {
11586           /* If we got here, we have branch-relaxation disabled,
11587              and there's nothing we can do to fix this instruction
11588              without turning it into a longer sequence.  */
11589           as_bad_where (fixP->fx_file, fixP->fx_line,
11590                         _("Branch out of range"));
11591         }
11592       break;
11593
11594     case BFD_RELOC_VTABLE_INHERIT:
11595       fixP->fx_done = 0;
11596       if (fixP->fx_addsy
11597           && !S_IS_DEFINED (fixP->fx_addsy)
11598           && !S_IS_WEAK (fixP->fx_addsy))
11599         S_SET_WEAK (fixP->fx_addsy);
11600       break;
11601
11602     case BFD_RELOC_VTABLE_ENTRY:
11603       fixP->fx_done = 0;
11604       break;
11605
11606     default:
11607       internalError ();
11608     }
11609
11610   /* Remember value for tc_gen_reloc.  */
11611   fixP->fx_addnumber = *valP;
11612 }
11613
11614 static symbolS *
11615 get_symbol (void)
11616 {
11617   int c;
11618   char *name;
11619   symbolS *p;
11620
11621   name = input_line_pointer;
11622   c = get_symbol_end ();
11623   p = (symbolS *) symbol_find_or_make (name);
11624   *input_line_pointer = c;
11625   return p;
11626 }
11627
11628 /* Align the current frag to a given power of two.  The MIPS assembler
11629    also automatically adjusts any preceding label.  */
11630
11631 static void
11632 mips_align (int to, int fill, symbolS *label)
11633 {
11634   mips_emit_delays ();
11635   frag_align (to, fill, 0);
11636   record_alignment (now_seg, to);
11637   if (label != NULL)
11638     {
11639       assert (S_GET_SEGMENT (label) == now_seg);
11640       symbol_set_frag (label, frag_now);
11641       S_SET_VALUE (label, (valueT) frag_now_fix ());
11642     }
11643 }
11644
11645 /* Align to a given power of two.  .align 0 turns off the automatic
11646    alignment used by the data creating pseudo-ops.  */
11647
11648 static void
11649 s_align (int x ATTRIBUTE_UNUSED)
11650 {
11651   register int temp;
11652   register long temp_fill;
11653   long max_alignment = 15;
11654
11655   /*
11656
11657     o  Note that the assembler pulls down any immediately preceding label
11658        to the aligned address.
11659     o  It's not documented but auto alignment is reinstated by
11660        a .align pseudo instruction.
11661     o  Note also that after auto alignment is turned off the mips assembler
11662        issues an error on attempt to assemble an improperly aligned data item.
11663        We don't.
11664
11665     */
11666
11667   temp = get_absolute_expression ();
11668   if (temp > max_alignment)
11669     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
11670   else if (temp < 0)
11671     {
11672       as_warn (_("Alignment negative: 0 assumed."));
11673       temp = 0;
11674     }
11675   if (*input_line_pointer == ',')
11676     {
11677       ++input_line_pointer;
11678       temp_fill = get_absolute_expression ();
11679     }
11680   else
11681     temp_fill = 0;
11682   if (temp)
11683     {
11684       auto_align = 1;
11685       mips_align (temp, (int) temp_fill,
11686                   insn_labels != NULL ? insn_labels->label : NULL);
11687     }
11688   else
11689     {
11690       auto_align = 0;
11691     }
11692
11693   demand_empty_rest_of_line ();
11694 }
11695
11696 static void
11697 s_change_sec (int sec)
11698 {
11699   segT seg;
11700
11701 #ifdef OBJ_ELF
11702   /* The ELF backend needs to know that we are changing sections, so
11703      that .previous works correctly.  We could do something like check
11704      for an obj_section_change_hook macro, but that might be confusing
11705      as it would not be appropriate to use it in the section changing
11706      functions in read.c, since obj-elf.c intercepts those.  FIXME:
11707      This should be cleaner, somehow.  */
11708   obj_elf_section_change_hook ();
11709 #endif
11710
11711   mips_emit_delays ();
11712   switch (sec)
11713     {
11714     case 't':
11715       s_text (0);
11716       break;
11717     case 'd':
11718       s_data (0);
11719       break;
11720     case 'b':
11721       subseg_set (bss_section, (subsegT) get_absolute_expression ());
11722       demand_empty_rest_of_line ();
11723       break;
11724
11725     case 'r':
11726       seg = subseg_new (RDATA_SECTION_NAME,
11727                         (subsegT) get_absolute_expression ());
11728       if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11729         {
11730           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
11731                                                   | SEC_READONLY | SEC_RELOC
11732                                                   | SEC_DATA));
11733           if (strcmp (TARGET_OS, "elf") != 0)
11734             record_alignment (seg, 4);
11735         }
11736       demand_empty_rest_of_line ();
11737       break;
11738
11739     case 's':
11740       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
11741       if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11742         {
11743           bfd_set_section_flags (stdoutput, seg,
11744                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
11745           if (strcmp (TARGET_OS, "elf") != 0)
11746             record_alignment (seg, 4);
11747         }
11748       demand_empty_rest_of_line ();
11749       break;
11750     }
11751
11752   auto_align = 1;
11753 }
11754
11755 void
11756 s_change_section (int ignore ATTRIBUTE_UNUSED)
11757 {
11758 #ifdef OBJ_ELF
11759   char *section_name;
11760   char c;
11761   char next_c = 0;
11762   int section_type;
11763   int section_flag;
11764   int section_entry_size;
11765   int section_alignment;
11766
11767   if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11768     return;
11769
11770   section_name = input_line_pointer;
11771   c = get_symbol_end ();
11772   if (c)
11773     next_c = *(input_line_pointer + 1);
11774
11775   /* Do we have .section Name<,"flags">?  */
11776   if (c != ',' || (c == ',' && next_c == '"'))
11777     {
11778       /* just after name is now '\0'.  */
11779       *input_line_pointer = c;
11780       input_line_pointer = section_name;
11781       obj_elf_section (ignore);
11782       return;
11783     }
11784   input_line_pointer++;
11785
11786   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
11787   if (c == ',')
11788     section_type = get_absolute_expression ();
11789   else
11790     section_type = 0;
11791   if (*input_line_pointer++ == ',')
11792     section_flag = get_absolute_expression ();
11793   else
11794     section_flag = 0;
11795   if (*input_line_pointer++ == ',')
11796     section_entry_size = get_absolute_expression ();
11797   else
11798     section_entry_size = 0;
11799   if (*input_line_pointer++ == ',')
11800     section_alignment = get_absolute_expression ();
11801   else
11802     section_alignment = 0;
11803
11804   section_name = xstrdup (section_name);
11805
11806   /* When using the generic form of .section (as implemented by obj-elf.c),
11807      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
11808      traditionally had to fall back on the more common @progbits instead.
11809
11810      There's nothing really harmful in this, since bfd will correct
11811      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
11812      means that, for backwards compatibility, the special_section entries
11813      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
11814
11815      Even so, we shouldn't force users of the MIPS .section syntax to
11816      incorrectly label the sections as SHT_PROGBITS.  The best compromise
11817      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
11818      generic type-checking code.  */
11819   if (section_type == SHT_MIPS_DWARF)
11820     section_type = SHT_PROGBITS;
11821
11822   obj_elf_change_section (section_name, section_type, section_flag,
11823                           section_entry_size, 0, 0, 0);
11824
11825   if (now_seg->name != section_name)
11826     free (section_name);
11827 #endif /* OBJ_ELF */
11828 }
11829
11830 void
11831 mips_enable_auto_align (void)
11832 {
11833   auto_align = 1;
11834 }
11835
11836 static void
11837 s_cons (int log_size)
11838 {
11839   symbolS *label;
11840
11841   label = insn_labels != NULL ? insn_labels->label : NULL;
11842   mips_emit_delays ();
11843   if (log_size > 0 && auto_align)
11844     mips_align (log_size, 0, label);
11845   mips_clear_insn_labels ();
11846   cons (1 << log_size);
11847 }
11848
11849 static void
11850 s_float_cons (int type)
11851 {
11852   symbolS *label;
11853
11854   label = insn_labels != NULL ? insn_labels->label : NULL;
11855
11856   mips_emit_delays ();
11857
11858   if (auto_align)
11859     {
11860       if (type == 'd')
11861         mips_align (3, 0, label);
11862       else
11863         mips_align (2, 0, label);
11864     }
11865
11866   mips_clear_insn_labels ();
11867
11868   float_cons (type);
11869 }
11870
11871 /* Handle .globl.  We need to override it because on Irix 5 you are
11872    permitted to say
11873        .globl foo .text
11874    where foo is an undefined symbol, to mean that foo should be
11875    considered to be the address of a function.  */
11876
11877 static void
11878 s_mips_globl (int x ATTRIBUTE_UNUSED)
11879 {
11880   char *name;
11881   int c;
11882   symbolS *symbolP;
11883   flagword flag;
11884
11885   do
11886     {
11887       name = input_line_pointer;
11888       c = get_symbol_end ();
11889       symbolP = symbol_find_or_make (name);
11890       S_SET_EXTERNAL (symbolP);
11891
11892       *input_line_pointer = c;
11893       SKIP_WHITESPACE ();
11894
11895       /* On Irix 5, every global symbol that is not explicitly labelled as
11896          being a function is apparently labelled as being an object.  */
11897       flag = BSF_OBJECT;
11898
11899       if (!is_end_of_line[(unsigned char) *input_line_pointer]
11900           && (*input_line_pointer != ','))
11901         {
11902           char *secname;
11903           asection *sec;
11904
11905           secname = input_line_pointer;
11906           c = get_symbol_end ();
11907           sec = bfd_get_section_by_name (stdoutput, secname);
11908           if (sec == NULL)
11909             as_bad (_("%s: no such section"), secname);
11910           *input_line_pointer = c;
11911
11912           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
11913             flag = BSF_FUNCTION;
11914         }
11915
11916       symbol_get_bfdsym (symbolP)->flags |= flag;
11917
11918       c = *input_line_pointer;
11919       if (c == ',')
11920         {
11921           input_line_pointer++;
11922           SKIP_WHITESPACE ();
11923           if (is_end_of_line[(unsigned char) *input_line_pointer])
11924             c = '\n';
11925         }
11926     }
11927   while (c == ',');
11928
11929   demand_empty_rest_of_line ();
11930 }
11931
11932 static void
11933 s_option (int x ATTRIBUTE_UNUSED)
11934 {
11935   char *opt;
11936   char c;
11937
11938   opt = input_line_pointer;
11939   c = get_symbol_end ();
11940
11941   if (*opt == 'O')
11942     {
11943       /* FIXME: What does this mean?  */
11944     }
11945   else if (strncmp (opt, "pic", 3) == 0)
11946     {
11947       int i;
11948
11949       i = atoi (opt + 3);
11950       if (i == 0)
11951         mips_pic = NO_PIC;
11952       else if (i == 2)
11953         {
11954         mips_pic = SVR4_PIC;
11955           mips_abicalls = TRUE;
11956         }
11957       else
11958         as_bad (_(".option pic%d not supported"), i);
11959
11960       if (mips_pic == SVR4_PIC)
11961         {
11962           if (g_switch_seen && g_switch_value != 0)
11963             as_warn (_("-G may not be used with SVR4 PIC code"));
11964           g_switch_value = 0;
11965           bfd_set_gp_size (stdoutput, 0);
11966         }
11967     }
11968   else
11969     as_warn (_("Unrecognized option \"%s\""), opt);
11970
11971   *input_line_pointer = c;
11972   demand_empty_rest_of_line ();
11973 }
11974
11975 /* This structure is used to hold a stack of .set values.  */
11976
11977 struct mips_option_stack
11978 {
11979   struct mips_option_stack *next;
11980   struct mips_set_options options;
11981 };
11982
11983 static struct mips_option_stack *mips_opts_stack;
11984
11985 /* Handle the .set pseudo-op.  */
11986
11987 static void
11988 s_mipsset (int x ATTRIBUTE_UNUSED)
11989 {
11990   char *name = input_line_pointer, ch;
11991
11992   while (!is_end_of_line[(unsigned char) *input_line_pointer])
11993     ++input_line_pointer;
11994   ch = *input_line_pointer;
11995   *input_line_pointer = '\0';
11996
11997   if (strcmp (name, "reorder") == 0)
11998     {
11999       if (mips_opts.noreorder)
12000         end_noreorder ();
12001     }
12002   else if (strcmp (name, "noreorder") == 0)
12003     {
12004       if (!mips_opts.noreorder)
12005         start_noreorder ();
12006     }
12007   else if (strcmp (name, "at") == 0)
12008     {
12009       mips_opts.noat = 0;
12010     }
12011   else if (strcmp (name, "noat") == 0)
12012     {
12013       mips_opts.noat = 1;
12014     }
12015   else if (strcmp (name, "macro") == 0)
12016     {
12017       mips_opts.warn_about_macros = 0;
12018     }
12019   else if (strcmp (name, "nomacro") == 0)
12020     {
12021       if (mips_opts.noreorder == 0)
12022         as_bad (_("`noreorder' must be set before `nomacro'"));
12023       mips_opts.warn_about_macros = 1;
12024     }
12025   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12026     {
12027       mips_opts.nomove = 0;
12028     }
12029   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12030     {
12031       mips_opts.nomove = 1;
12032     }
12033   else if (strcmp (name, "bopt") == 0)
12034     {
12035       mips_opts.nobopt = 0;
12036     }
12037   else if (strcmp (name, "nobopt") == 0)
12038     {
12039       mips_opts.nobopt = 1;
12040     }
12041   else if (strcmp (name, "mips16") == 0
12042            || strcmp (name, "MIPS-16") == 0)
12043     mips_opts.mips16 = 1;
12044   else if (strcmp (name, "nomips16") == 0
12045            || strcmp (name, "noMIPS-16") == 0)
12046     mips_opts.mips16 = 0;
12047   else if (strcmp (name, "mips3d") == 0)
12048     mips_opts.ase_mips3d = 1;
12049   else if (strcmp (name, "nomips3d") == 0)
12050     mips_opts.ase_mips3d = 0;
12051   else if (strcmp (name, "mdmx") == 0)
12052     mips_opts.ase_mdmx = 1;
12053   else if (strcmp (name, "nomdmx") == 0)
12054     mips_opts.ase_mdmx = 0;
12055   else if (strcmp (name, "dsp") == 0)
12056     mips_opts.ase_dsp = 1;
12057   else if (strcmp (name, "nodsp") == 0)
12058     mips_opts.ase_dsp = 0;
12059   else if (strcmp (name, "mt") == 0)
12060     mips_opts.ase_mt = 1;
12061   else if (strcmp (name, "nomt") == 0)
12062     mips_opts.ase_mt = 0;
12063   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
12064     {
12065       int reset = 0;
12066
12067       /* Permit the user to change the ISA and architecture on the fly.
12068          Needless to say, misuse can cause serious problems.  */
12069       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
12070         {
12071           reset = 1;
12072           mips_opts.isa = file_mips_isa;
12073           mips_opts.arch = file_mips_arch;
12074         }
12075       else if (strncmp (name, "arch=", 5) == 0)
12076         {
12077           const struct mips_cpu_info *p;
12078
12079           p = mips_parse_cpu("internal use", name + 5);
12080           if (!p)
12081             as_bad (_("unknown architecture %s"), name + 5);
12082           else
12083             {
12084               mips_opts.arch = p->cpu;
12085               mips_opts.isa = p->isa;
12086             }
12087         }
12088       else if (strncmp (name, "mips", 4) == 0)
12089         {
12090           const struct mips_cpu_info *p;
12091
12092           p = mips_parse_cpu("internal use", name);
12093           if (!p)
12094             as_bad (_("unknown ISA level %s"), name + 4);
12095           else
12096             {
12097               mips_opts.arch = p->cpu;
12098               mips_opts.isa = p->isa;
12099             }
12100         }
12101       else
12102         as_bad (_("unknown ISA or architecture %s"), name);
12103
12104       switch (mips_opts.isa)
12105         {
12106         case  0:
12107           break;
12108         case ISA_MIPS1:
12109         case ISA_MIPS2:
12110         case ISA_MIPS32:
12111         case ISA_MIPS32R2:
12112           mips_opts.gp32 = 1;
12113           mips_opts.fp32 = 1;
12114           break;
12115         case ISA_MIPS3:
12116         case ISA_MIPS4:
12117         case ISA_MIPS5:
12118         case ISA_MIPS64:
12119         case ISA_MIPS64R2:
12120           mips_opts.gp32 = 0;
12121           mips_opts.fp32 = 0;
12122           break;
12123         default:
12124           as_bad (_("unknown ISA level %s"), name + 4);
12125           break;
12126         }
12127       if (reset)
12128         {
12129           mips_opts.gp32 = file_mips_gp32;
12130           mips_opts.fp32 = file_mips_fp32;
12131         }
12132     }
12133   else if (strcmp (name, "autoextend") == 0)
12134     mips_opts.noautoextend = 0;
12135   else if (strcmp (name, "noautoextend") == 0)
12136     mips_opts.noautoextend = 1;
12137   else if (strcmp (name, "push") == 0)
12138     {
12139       struct mips_option_stack *s;
12140
12141       s = (struct mips_option_stack *) xmalloc (sizeof *s);
12142       s->next = mips_opts_stack;
12143       s->options = mips_opts;
12144       mips_opts_stack = s;
12145     }
12146   else if (strcmp (name, "pop") == 0)
12147     {
12148       struct mips_option_stack *s;
12149
12150       s = mips_opts_stack;
12151       if (s == NULL)
12152         as_bad (_(".set pop with no .set push"));
12153       else
12154         {
12155           /* If we're changing the reorder mode we need to handle
12156              delay slots correctly.  */
12157           if (s->options.noreorder && ! mips_opts.noreorder)
12158             start_noreorder ();
12159           else if (! s->options.noreorder && mips_opts.noreorder)
12160             end_noreorder ();
12161
12162           mips_opts = s->options;
12163           mips_opts_stack = s->next;
12164           free (s);
12165         }
12166     }
12167   else if (strcmp (name, "sym32") == 0)
12168     mips_opts.sym32 = TRUE;
12169   else if (strcmp (name, "nosym32") == 0)
12170     mips_opts.sym32 = FALSE;
12171   else
12172     {
12173       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
12174     }
12175   *input_line_pointer = ch;
12176   demand_empty_rest_of_line ();
12177 }
12178
12179 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
12180    .option pic2.  It means to generate SVR4 PIC calls.  */
12181
12182 static void
12183 s_abicalls (int ignore ATTRIBUTE_UNUSED)
12184 {
12185   mips_pic = SVR4_PIC;
12186   mips_abicalls = TRUE;
12187
12188   if (g_switch_seen && g_switch_value != 0)
12189     as_warn (_("-G may not be used with SVR4 PIC code"));
12190   g_switch_value = 0;
12191
12192   bfd_set_gp_size (stdoutput, 0);
12193   demand_empty_rest_of_line ();
12194 }
12195
12196 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
12197    PIC code.  It sets the $gp register for the function based on the
12198    function address, which is in the register named in the argument.
12199    This uses a relocation against _gp_disp, which is handled specially
12200    by the linker.  The result is:
12201         lui     $gp,%hi(_gp_disp)
12202         addiu   $gp,$gp,%lo(_gp_disp)
12203         addu    $gp,$gp,.cpload argument
12204    The .cpload argument is normally $25 == $t9.
12205
12206    The -mno-shared option changes this to:
12207         lui     $gp,%hi(__gnu_local_gp)
12208         addiu   $gp,$gp,%lo(__gnu_local_gp)
12209    and the argument is ignored.  This saves an instruction, but the
12210    resulting code is not position independent; it uses an absolute
12211    address for __gnu_local_gp.  Thus code assembled with -mno-shared
12212    can go into an ordinary executable, but not into a shared library.  */
12213
12214 static void
12215 s_cpload (int ignore ATTRIBUTE_UNUSED)
12216 {
12217   expressionS ex;
12218   int reg;
12219   int in_shared;
12220
12221   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12222      .cpload is ignored.  */
12223   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12224     {
12225       s_ignore (0);
12226       return;
12227     }
12228
12229   /* .cpload should be in a .set noreorder section.  */
12230   if (mips_opts.noreorder == 0)
12231     as_warn (_(".cpload not in noreorder section"));
12232
12233   reg = tc_get_register (0);
12234
12235   /* If we need to produce a 64-bit address, we are better off using
12236      the default instruction sequence.  */
12237   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
12238
12239   ex.X_op = O_symbol;
12240   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
12241                                          "__gnu_local_gp");
12242   ex.X_op_symbol = NULL;
12243   ex.X_add_number = 0;
12244
12245   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
12246   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12247
12248   macro_start ();
12249   macro_build_lui (&ex, mips_gp_register);
12250   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
12251                mips_gp_register, BFD_RELOC_LO16);
12252   if (in_shared)
12253     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
12254                  mips_gp_register, reg);
12255   macro_end ();
12256
12257   demand_empty_rest_of_line ();
12258 }
12259
12260 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
12261      .cpsetup $reg1, offset|$reg2, label
12262
12263    If offset is given, this results in:
12264      sd         $gp, offset($sp)
12265      lui        $gp, %hi(%neg(%gp_rel(label)))
12266      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
12267      daddu      $gp, $gp, $reg1
12268
12269    If $reg2 is given, this results in:
12270      daddu      $reg2, $gp, $0
12271      lui        $gp, %hi(%neg(%gp_rel(label)))
12272      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
12273      daddu      $gp, $gp, $reg1
12274    $reg1 is normally $25 == $t9.
12275
12276    The -mno-shared option replaces the last three instructions with
12277         lui     $gp,%hi(_gp)
12278         addiu   $gp,$gp,%lo(_gp)
12279    */
12280
12281 static void
12282 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
12283 {
12284   expressionS ex_off;
12285   expressionS ex_sym;
12286   int reg1;
12287
12288   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
12289      We also need NewABI support.  */
12290   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12291     {
12292       s_ignore (0);
12293       return;
12294     }
12295
12296   reg1 = tc_get_register (0);
12297   SKIP_WHITESPACE ();
12298   if (*input_line_pointer != ',')
12299     {
12300       as_bad (_("missing argument separator ',' for .cpsetup"));
12301       return;
12302     }
12303   else
12304     ++input_line_pointer;
12305   SKIP_WHITESPACE ();
12306   if (*input_line_pointer == '$')
12307     {
12308       mips_cpreturn_register = tc_get_register (0);
12309       mips_cpreturn_offset = -1;
12310     }
12311   else
12312     {
12313       mips_cpreturn_offset = get_absolute_expression ();
12314       mips_cpreturn_register = -1;
12315     }
12316   SKIP_WHITESPACE ();
12317   if (*input_line_pointer != ',')
12318     {
12319       as_bad (_("missing argument separator ',' for .cpsetup"));
12320       return;
12321     }
12322   else
12323     ++input_line_pointer;
12324   SKIP_WHITESPACE ();
12325   expression (&ex_sym);
12326
12327   macro_start ();
12328   if (mips_cpreturn_register == -1)
12329     {
12330       ex_off.X_op = O_constant;
12331       ex_off.X_add_symbol = NULL;
12332       ex_off.X_op_symbol = NULL;
12333       ex_off.X_add_number = mips_cpreturn_offset;
12334
12335       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
12336                    BFD_RELOC_LO16, SP);
12337     }
12338   else
12339     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
12340                  mips_gp_register, 0);
12341
12342   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
12343     {
12344       macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
12345                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
12346                    BFD_RELOC_HI16_S);
12347
12348       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
12349                    mips_gp_register, -1, BFD_RELOC_GPREL16,
12350                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
12351
12352       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
12353                    mips_gp_register, reg1);
12354     }
12355   else
12356     {
12357       expressionS ex;
12358
12359       ex.X_op = O_symbol;
12360       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
12361       ex.X_op_symbol = NULL;
12362       ex.X_add_number = 0;
12363
12364       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
12365       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12366
12367       macro_build_lui (&ex, mips_gp_register);
12368       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
12369                    mips_gp_register, BFD_RELOC_LO16);
12370     }
12371
12372   macro_end ();
12373
12374   demand_empty_rest_of_line ();
12375 }
12376
12377 static void
12378 s_cplocal (int ignore ATTRIBUTE_UNUSED)
12379 {
12380   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
12381    .cplocal is ignored.  */
12382   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12383     {
12384       s_ignore (0);
12385       return;
12386     }
12387
12388   mips_gp_register = tc_get_register (0);
12389   demand_empty_rest_of_line ();
12390 }
12391
12392 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
12393    offset from $sp.  The offset is remembered, and after making a PIC
12394    call $gp is restored from that location.  */
12395
12396 static void
12397 s_cprestore (int ignore ATTRIBUTE_UNUSED)
12398 {
12399   expressionS ex;
12400
12401   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12402      .cprestore is ignored.  */
12403   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12404     {
12405       s_ignore (0);
12406       return;
12407     }
12408
12409   mips_cprestore_offset = get_absolute_expression ();
12410   mips_cprestore_valid = 1;
12411
12412   ex.X_op = O_constant;
12413   ex.X_add_symbol = NULL;
12414   ex.X_op_symbol = NULL;
12415   ex.X_add_number = mips_cprestore_offset;
12416
12417   macro_start ();
12418   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
12419                                 SP, HAVE_64BIT_ADDRESSES);
12420   macro_end ();
12421
12422   demand_empty_rest_of_line ();
12423 }
12424
12425 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
12426    was given in the preceding .cpsetup, it results in:
12427      ld         $gp, offset($sp)
12428
12429    If a register $reg2 was given there, it results in:
12430      daddu      $gp, $reg2, $0
12431  */
12432 static void
12433 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
12434 {
12435   expressionS ex;
12436
12437   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
12438      We also need NewABI support.  */
12439   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12440     {
12441       s_ignore (0);
12442       return;
12443     }
12444
12445   macro_start ();
12446   if (mips_cpreturn_register == -1)
12447     {
12448       ex.X_op = O_constant;
12449       ex.X_add_symbol = NULL;
12450       ex.X_op_symbol = NULL;
12451       ex.X_add_number = mips_cpreturn_offset;
12452
12453       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
12454     }
12455   else
12456     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
12457                  mips_cpreturn_register, 0);
12458   macro_end ();
12459
12460   demand_empty_rest_of_line ();
12461 }
12462
12463 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
12464    code.  It sets the offset to use in gp_rel relocations.  */
12465
12466 static void
12467 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
12468 {
12469   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
12470      We also need NewABI support.  */
12471   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12472     {
12473       s_ignore (0);
12474       return;
12475     }
12476
12477   mips_gprel_offset = get_absolute_expression ();
12478
12479   demand_empty_rest_of_line ();
12480 }
12481
12482 /* Handle the .gpword pseudo-op.  This is used when generating PIC
12483    code.  It generates a 32 bit GP relative reloc.  */
12484
12485 static void
12486 s_gpword (int ignore ATTRIBUTE_UNUSED)
12487 {
12488   symbolS *label;
12489   expressionS ex;
12490   char *p;
12491
12492   /* When not generating PIC code, this is treated as .word.  */
12493   if (mips_pic != SVR4_PIC)
12494     {
12495       s_cons (2);
12496       return;
12497     }
12498
12499   label = insn_labels != NULL ? insn_labels->label : NULL;
12500   mips_emit_delays ();
12501   if (auto_align)
12502     mips_align (2, 0, label);
12503   mips_clear_insn_labels ();
12504
12505   expression (&ex);
12506
12507   if (ex.X_op != O_symbol || ex.X_add_number != 0)
12508     {
12509       as_bad (_("Unsupported use of .gpword"));
12510       ignore_rest_of_line ();
12511     }
12512
12513   p = frag_more (4);
12514   md_number_to_chars (p, 0, 4);
12515   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
12516                BFD_RELOC_GPREL32);
12517
12518   demand_empty_rest_of_line ();
12519 }
12520
12521 static void
12522 s_gpdword (int ignore ATTRIBUTE_UNUSED)
12523 {
12524   symbolS *label;
12525   expressionS ex;
12526   char *p;
12527
12528   /* When not generating PIC code, this is treated as .dword.  */
12529   if (mips_pic != SVR4_PIC)
12530     {
12531       s_cons (3);
12532       return;
12533     }
12534
12535   label = insn_labels != NULL ? insn_labels->label : NULL;
12536   mips_emit_delays ();
12537   if (auto_align)
12538     mips_align (3, 0, label);
12539   mips_clear_insn_labels ();
12540
12541   expression (&ex);
12542
12543   if (ex.X_op != O_symbol || ex.X_add_number != 0)
12544     {
12545       as_bad (_("Unsupported use of .gpdword"));
12546       ignore_rest_of_line ();
12547     }
12548
12549   p = frag_more (8);
12550   md_number_to_chars (p, 0, 8);
12551   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
12552                BFD_RELOC_GPREL32)->fx_tcbit = 1;
12553
12554   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
12555   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
12556            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
12557
12558   demand_empty_rest_of_line ();
12559 }
12560
12561 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
12562    tables in SVR4 PIC code.  */
12563
12564 static void
12565 s_cpadd (int ignore ATTRIBUTE_UNUSED)
12566 {
12567   int reg;
12568
12569   /* This is ignored when not generating SVR4 PIC code.  */
12570   if (mips_pic != SVR4_PIC)
12571     {
12572       s_ignore (0);
12573       return;
12574     }
12575
12576   /* Add $gp to the register named as an argument.  */
12577   macro_start ();
12578   reg = tc_get_register (0);
12579   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
12580   macro_end ();
12581
12582   demand_empty_rest_of_line ();
12583 }
12584
12585 /* Handle the .insn pseudo-op.  This marks instruction labels in
12586    mips16 mode.  This permits the linker to handle them specially,
12587    such as generating jalx instructions when needed.  We also make
12588    them odd for the duration of the assembly, in order to generate the
12589    right sort of code.  We will make them even in the adjust_symtab
12590    routine, while leaving them marked.  This is convenient for the
12591    debugger and the disassembler.  The linker knows to make them odd
12592    again.  */
12593
12594 static void
12595 s_insn (int ignore ATTRIBUTE_UNUSED)
12596 {
12597   mips16_mark_labels ();
12598
12599   demand_empty_rest_of_line ();
12600 }
12601
12602 /* Handle a .stabn directive.  We need these in order to mark a label
12603    as being a mips16 text label correctly.  Sometimes the compiler
12604    will emit a label, followed by a .stabn, and then switch sections.
12605    If the label and .stabn are in mips16 mode, then the label is
12606    really a mips16 text label.  */
12607
12608 static void
12609 s_mips_stab (int type)
12610 {
12611   if (type == 'n')
12612     mips16_mark_labels ();
12613
12614   s_stab (type);
12615 }
12616
12617 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.
12618  */
12619
12620 static void
12621 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
12622 {
12623   char *name;
12624   int c;
12625   symbolS *symbolP;
12626   expressionS exp;
12627
12628   name = input_line_pointer;
12629   c = get_symbol_end ();
12630   symbolP = symbol_find_or_make (name);
12631   S_SET_WEAK (symbolP);
12632   *input_line_pointer = c;
12633
12634   SKIP_WHITESPACE ();
12635
12636   if (! is_end_of_line[(unsigned char) *input_line_pointer])
12637     {
12638       if (S_IS_DEFINED (symbolP))
12639         {
12640           as_bad ("ignoring attempt to redefine symbol %s",
12641                   S_GET_NAME (symbolP));
12642           ignore_rest_of_line ();
12643           return;
12644         }
12645
12646       if (*input_line_pointer == ',')
12647         {
12648           ++input_line_pointer;
12649           SKIP_WHITESPACE ();
12650         }
12651
12652       expression (&exp);
12653       if (exp.X_op != O_symbol)
12654         {
12655           as_bad ("bad .weakext directive");
12656           ignore_rest_of_line ();
12657           return;
12658         }
12659       symbol_set_value_expression (symbolP, &exp);
12660     }
12661
12662   demand_empty_rest_of_line ();
12663 }
12664
12665 /* Parse a register string into a number.  Called from the ECOFF code
12666    to parse .frame.  The argument is non-zero if this is the frame
12667    register, so that we can record it in mips_frame_reg.  */
12668
12669 int
12670 tc_get_register (int frame)
12671 {
12672   int reg;
12673
12674   SKIP_WHITESPACE ();
12675   if (*input_line_pointer++ != '$')
12676     {
12677       as_warn (_("expected `$'"));
12678       reg = ZERO;
12679     }
12680   else if (ISDIGIT (*input_line_pointer))
12681     {
12682       reg = get_absolute_expression ();
12683       if (reg < 0 || reg >= 32)
12684         {
12685           as_warn (_("Bad register number"));
12686           reg = ZERO;
12687         }
12688     }
12689   else
12690     {
12691       if (strncmp (input_line_pointer, "ra", 2) == 0)
12692         {
12693           reg = RA;
12694           input_line_pointer += 2;
12695         }
12696       else if (strncmp (input_line_pointer, "fp", 2) == 0)
12697         {
12698           reg = FP;
12699           input_line_pointer += 2;
12700         }
12701       else if (strncmp (input_line_pointer, "sp", 2) == 0)
12702         {
12703           reg = SP;
12704           input_line_pointer += 2;
12705         }
12706       else if (strncmp (input_line_pointer, "gp", 2) == 0)
12707         {
12708           reg = GP;
12709           input_line_pointer += 2;
12710         }
12711       else if (strncmp (input_line_pointer, "at", 2) == 0)
12712         {
12713           reg = AT;
12714           input_line_pointer += 2;
12715         }
12716       else if (strncmp (input_line_pointer, "kt0", 3) == 0)
12717         {
12718           reg = KT0;
12719           input_line_pointer += 3;
12720         }
12721       else if (strncmp (input_line_pointer, "kt1", 3) == 0)
12722         {
12723           reg = KT1;
12724           input_line_pointer += 3;
12725         }
12726       else if (strncmp (input_line_pointer, "zero", 4) == 0)
12727         {
12728           reg = ZERO;
12729           input_line_pointer += 4;
12730         }
12731       else
12732         {
12733           as_warn (_("Unrecognized register name"));
12734           reg = ZERO;
12735           while (ISALNUM(*input_line_pointer))
12736            input_line_pointer++;
12737         }
12738     }
12739   if (frame)
12740     {
12741       mips_frame_reg = reg != 0 ? reg : SP;
12742       mips_frame_reg_valid = 1;
12743       mips_cprestore_valid = 0;
12744     }
12745   return reg;
12746 }
12747
12748 valueT
12749 md_section_align (asection *seg, valueT addr)
12750 {
12751   int align = bfd_get_section_alignment (stdoutput, seg);
12752
12753 #ifdef OBJ_ELF
12754   /* We don't need to align ELF sections to the full alignment.
12755      However, Irix 5 may prefer that we align them at least to a 16
12756      byte boundary.  We don't bother to align the sections if we are
12757      targeted for an embedded system.  */
12758   if (strcmp (TARGET_OS, "elf") == 0)
12759     return addr;
12760   if (align > 4)
12761     align = 4;
12762 #endif
12763
12764   return ((addr + (1 << align) - 1) & (-1 << align));
12765 }
12766
12767 /* Utility routine, called from above as well.  If called while the
12768    input file is still being read, it's only an approximation.  (For
12769    example, a symbol may later become defined which appeared to be
12770    undefined earlier.)  */
12771
12772 static int
12773 nopic_need_relax (symbolS *sym, int before_relaxing)
12774 {
12775   if (sym == 0)
12776     return 0;
12777
12778   if (g_switch_value > 0)
12779     {
12780       const char *symname;
12781       int change;
12782
12783       /* Find out whether this symbol can be referenced off the $gp
12784          register.  It can be if it is smaller than the -G size or if
12785          it is in the .sdata or .sbss section.  Certain symbols can
12786          not be referenced off the $gp, although it appears as though
12787          they can.  */
12788       symname = S_GET_NAME (sym);
12789       if (symname != (const char *) NULL
12790           && (strcmp (symname, "eprol") == 0
12791               || strcmp (symname, "etext") == 0
12792               || strcmp (symname, "_gp") == 0
12793               || strcmp (symname, "edata") == 0
12794               || strcmp (symname, "_fbss") == 0
12795               || strcmp (symname, "_fdata") == 0
12796               || strcmp (symname, "_ftext") == 0
12797               || strcmp (symname, "end") == 0
12798               || strcmp (symname, "_gp_disp") == 0))
12799         change = 1;
12800       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
12801                && (0
12802 #ifndef NO_ECOFF_DEBUGGING
12803                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
12804                        && (symbol_get_obj (sym)->ecoff_extern_size
12805                            <= g_switch_value))
12806 #endif
12807                    /* We must defer this decision until after the whole
12808                       file has been read, since there might be a .extern
12809                       after the first use of this symbol.  */
12810                    || (before_relaxing
12811 #ifndef NO_ECOFF_DEBUGGING
12812                        && symbol_get_obj (sym)->ecoff_extern_size == 0
12813 #endif
12814                        && S_GET_VALUE (sym) == 0)
12815                    || (S_GET_VALUE (sym) != 0
12816                        && S_GET_VALUE (sym) <= g_switch_value)))
12817         change = 0;
12818       else
12819         {
12820           const char *segname;
12821
12822           segname = segment_name (S_GET_SEGMENT (sym));
12823           assert (strcmp (segname, ".lit8") != 0
12824                   && strcmp (segname, ".lit4") != 0);
12825           change = (strcmp (segname, ".sdata") != 0
12826                     && strcmp (segname, ".sbss") != 0
12827                     && strncmp (segname, ".sdata.", 7) != 0
12828                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
12829         }
12830       return change;
12831     }
12832   else
12833     /* We are not optimizing for the $gp register.  */
12834     return 1;
12835 }
12836
12837
12838 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
12839
12840 static bfd_boolean
12841 pic_need_relax (symbolS *sym, asection *segtype)
12842 {
12843   asection *symsec;
12844   bfd_boolean linkonce;
12845
12846   /* Handle the case of a symbol equated to another symbol.  */
12847   while (symbol_equated_reloc_p (sym))
12848     {
12849       symbolS *n;
12850
12851       /* It's possible to get a loop here in a badly written
12852          program.  */
12853       n = symbol_get_value_expression (sym)->X_add_symbol;
12854       if (n == sym)
12855         break;
12856       sym = n;
12857     }
12858
12859   symsec = S_GET_SEGMENT (sym);
12860
12861   /* duplicate the test for LINK_ONCE sections as in adjust_reloc_syms */
12862   linkonce = FALSE;
12863   if (symsec != segtype && ! S_IS_LOCAL (sym))
12864     {
12865       if ((bfd_get_section_flags (stdoutput, symsec) & SEC_LINK_ONCE)
12866           != 0)
12867         linkonce = TRUE;
12868
12869       /* The GNU toolchain uses an extension for ELF: a section
12870          beginning with the magic string .gnu.linkonce is a linkonce
12871          section.  */
12872       if (strncmp (segment_name (symsec), ".gnu.linkonce",
12873                    sizeof ".gnu.linkonce" - 1) == 0)
12874         linkonce = TRUE;
12875     }
12876
12877   /* This must duplicate the test in adjust_reloc_syms.  */
12878   return (symsec != &bfd_und_section
12879           && symsec != &bfd_abs_section
12880           && ! bfd_is_com_section (symsec)
12881           && !linkonce
12882 #ifdef OBJ_ELF
12883           /* A global or weak symbol is treated as external.  */
12884           && (OUTPUT_FLAVOR != bfd_target_elf_flavour
12885               || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
12886 #endif
12887           );
12888 }
12889
12890
12891 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
12892    extended opcode.  SEC is the section the frag is in.  */
12893
12894 static int
12895 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
12896 {
12897   int type;
12898   register const struct mips16_immed_operand *op;
12899   offsetT val;
12900   int mintiny, maxtiny;
12901   segT symsec;
12902   fragS *sym_frag;
12903
12904   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
12905     return 0;
12906   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
12907     return 1;
12908
12909   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
12910   op = mips16_immed_operands;
12911   while (op->type != type)
12912     {
12913       ++op;
12914       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
12915     }
12916
12917   if (op->unsp)
12918     {
12919       if (type == '<' || type == '>' || type == '[' || type == ']')
12920         {
12921           mintiny = 1;
12922           maxtiny = 1 << op->nbits;
12923         }
12924       else
12925         {
12926           mintiny = 0;
12927           maxtiny = (1 << op->nbits) - 1;
12928         }
12929     }
12930   else
12931     {
12932       mintiny = - (1 << (op->nbits - 1));
12933       maxtiny = (1 << (op->nbits - 1)) - 1;
12934     }
12935
12936   sym_frag = symbol_get_frag (fragp->fr_symbol);
12937   val = S_GET_VALUE (fragp->fr_symbol);
12938   symsec = S_GET_SEGMENT (fragp->fr_symbol);
12939
12940   if (op->pcrel)
12941     {
12942       addressT addr;
12943
12944       /* We won't have the section when we are called from
12945          mips_relax_frag.  However, we will always have been called
12946          from md_estimate_size_before_relax first.  If this is a
12947          branch to a different section, we mark it as such.  If SEC is
12948          NULL, and the frag is not marked, then it must be a branch to
12949          the same section.  */
12950       if (sec == NULL)
12951         {
12952           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
12953             return 1;
12954         }
12955       else
12956         {
12957           /* Must have been called from md_estimate_size_before_relax.  */
12958           if (symsec != sec)
12959             {
12960               fragp->fr_subtype =
12961                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
12962
12963               /* FIXME: We should support this, and let the linker
12964                  catch branches and loads that are out of range.  */
12965               as_bad_where (fragp->fr_file, fragp->fr_line,
12966                             _("unsupported PC relative reference to different section"));
12967
12968               return 1;
12969             }
12970           if (fragp != sym_frag && sym_frag->fr_address == 0)
12971             /* Assume non-extended on the first relaxation pass.
12972                The address we have calculated will be bogus if this is
12973                a forward branch to another frag, as the forward frag
12974                will have fr_address == 0.  */
12975             return 0;
12976         }
12977
12978       /* In this case, we know for sure that the symbol fragment is in
12979          the same section.  If the relax_marker of the symbol fragment
12980          differs from the relax_marker of this fragment, we have not
12981          yet adjusted the symbol fragment fr_address.  We want to add
12982          in STRETCH in order to get a better estimate of the address.
12983          This particularly matters because of the shift bits.  */
12984       if (stretch != 0
12985           && sym_frag->relax_marker != fragp->relax_marker)
12986         {
12987           fragS *f;
12988
12989           /* Adjust stretch for any alignment frag.  Note that if have
12990              been expanding the earlier code, the symbol may be
12991              defined in what appears to be an earlier frag.  FIXME:
12992              This doesn't handle the fr_subtype field, which specifies
12993              a maximum number of bytes to skip when doing an
12994              alignment.  */
12995           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
12996             {
12997               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
12998                 {
12999                   if (stretch < 0)
13000                     stretch = - ((- stretch)
13001                                  & ~ ((1 << (int) f->fr_offset) - 1));
13002                   else
13003                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13004                   if (stretch == 0)
13005                     break;
13006                 }
13007             }
13008           if (f != NULL)
13009             val += stretch;
13010         }
13011
13012       addr = fragp->fr_address + fragp->fr_fix;
13013
13014       /* The base address rules are complicated.  The base address of
13015          a branch is the following instruction.  The base address of a
13016          PC relative load or add is the instruction itself, but if it
13017          is in a delay slot (in which case it can not be extended) use
13018          the address of the instruction whose delay slot it is in.  */
13019       if (type == 'p' || type == 'q')
13020         {
13021           addr += 2;
13022
13023           /* If we are currently assuming that this frag should be
13024              extended, then, the current address is two bytes
13025              higher.  */
13026           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13027             addr += 2;
13028
13029           /* Ignore the low bit in the target, since it will be set
13030              for a text label.  */
13031           if ((val & 1) != 0)
13032             --val;
13033         }
13034       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13035         addr -= 4;
13036       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13037         addr -= 2;
13038
13039       val -= addr & ~ ((1 << op->shift) - 1);
13040
13041       /* Branch offsets have an implicit 0 in the lowest bit.  */
13042       if (type == 'p' || type == 'q')
13043         val /= 2;
13044
13045       /* If any of the shifted bits are set, we must use an extended
13046          opcode.  If the address depends on the size of this
13047          instruction, this can lead to a loop, so we arrange to always
13048          use an extended opcode.  We only check this when we are in
13049          the main relaxation loop, when SEC is NULL.  */
13050       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13051         {
13052           fragp->fr_subtype =
13053             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13054           return 1;
13055         }
13056
13057       /* If we are about to mark a frag as extended because the value
13058          is precisely maxtiny + 1, then there is a chance of an
13059          infinite loop as in the following code:
13060              la $4,foo
13061              .skip      1020
13062              .align     2
13063            foo:
13064          In this case when the la is extended, foo is 0x3fc bytes
13065          away, so the la can be shrunk, but then foo is 0x400 away, so
13066          the la must be extended.  To avoid this loop, we mark the
13067          frag as extended if it was small, and is about to become
13068          extended with a value of maxtiny + 1.  */
13069       if (val == ((maxtiny + 1) << op->shift)
13070           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
13071           && sec == NULL)
13072         {
13073           fragp->fr_subtype =
13074             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13075           return 1;
13076         }
13077     }
13078   else if (symsec != absolute_section && sec != NULL)
13079     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
13080
13081   if ((val & ((1 << op->shift) - 1)) != 0
13082       || val < (mintiny << op->shift)
13083       || val > (maxtiny << op->shift))
13084     return 1;
13085   else
13086     return 0;
13087 }
13088
13089 /* Compute the length of a branch sequence, and adjust the
13090    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
13091    worst-case length is computed, with UPDATE being used to indicate
13092    whether an unconditional (-1), branch-likely (+1) or regular (0)
13093    branch is to be computed.  */
13094 static int
13095 relaxed_branch_length (fragS *fragp, asection *sec, int update)
13096 {
13097   bfd_boolean toofar;
13098   int length;
13099
13100   if (fragp
13101       && S_IS_DEFINED (fragp->fr_symbol)
13102       && sec == S_GET_SEGMENT (fragp->fr_symbol))
13103     {
13104       addressT addr;
13105       offsetT val;
13106
13107       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13108
13109       addr = fragp->fr_address + fragp->fr_fix + 4;
13110
13111       val -= addr;
13112
13113       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13114     }
13115   else if (fragp)
13116     /* If the symbol is not defined or it's in a different segment,
13117        assume the user knows what's going on and emit a short
13118        branch.  */
13119     toofar = FALSE;
13120   else
13121     toofar = TRUE;
13122
13123   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13124     fragp->fr_subtype
13125       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
13126                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
13127                              RELAX_BRANCH_LINK (fragp->fr_subtype),
13128                              toofar);
13129
13130   length = 4;
13131   if (toofar)
13132     {
13133       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
13134         length += 8;
13135
13136       if (mips_pic != NO_PIC)
13137         {
13138           /* Additional space for PIC loading of target address.  */
13139           length += 8;
13140           if (mips_opts.isa == ISA_MIPS1)
13141             /* Additional space for $at-stabilizing nop.  */
13142             length += 4;
13143         }
13144
13145       /* If branch is conditional.  */
13146       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
13147         length += 8;
13148     }
13149
13150   return length;
13151 }
13152
13153 /* Estimate the size of a frag before relaxing.  Unless this is the
13154    mips16, we are not really relaxing here, and the final size is
13155    encoded in the subtype information.  For the mips16, we have to
13156    decide whether we are using an extended opcode or not.  */
13157
13158 int
13159 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
13160 {
13161   int change;
13162
13163   if (RELAX_BRANCH_P (fragp->fr_subtype))
13164     {
13165
13166       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
13167
13168       return fragp->fr_var;
13169     }
13170
13171   if (RELAX_MIPS16_P (fragp->fr_subtype))
13172     /* We don't want to modify the EXTENDED bit here; it might get us
13173        into infinite loops.  We change it only in mips_relax_frag().  */
13174     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
13175
13176   if (mips_pic == NO_PIC)
13177     change = nopic_need_relax (fragp->fr_symbol, 0);
13178   else if (mips_pic == SVR4_PIC)
13179     change = pic_need_relax (fragp->fr_symbol, segtype);
13180   else if (mips_pic == VXWORKS_PIC)
13181     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
13182     change = 0;
13183   else
13184     abort ();
13185
13186   if (change)
13187     {
13188       fragp->fr_subtype |= RELAX_USE_SECOND;
13189       return -RELAX_FIRST (fragp->fr_subtype);
13190     }
13191   else
13192     return -RELAX_SECOND (fragp->fr_subtype);
13193 }
13194
13195 /* This is called to see whether a reloc against a defined symbol
13196    should be converted into a reloc against a section.  */
13197
13198 int
13199 mips_fix_adjustable (fixS *fixp)
13200 {
13201   /* Don't adjust MIPS16 jump relocations, so we don't have to worry
13202      about the format of the offset in the .o file. */
13203   if (fixp->fx_r_type == BFD_RELOC_MIPS16_JMP)
13204     return 0;
13205
13206   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
13207       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13208     return 0;
13209
13210   if (fixp->fx_addsy == NULL)
13211     return 1;
13212
13213   /* If symbol SYM is in a mergeable section, relocations of the form
13214      SYM + 0 can usually be made section-relative.  The mergeable data
13215      is then identified by the section offset rather than by the symbol.
13216
13217      However, if we're generating REL LO16 relocations, the offset is split
13218      between the LO16 and parterning high part relocation.  The linker will
13219      need to recalculate the complete offset in order to correctly identify
13220      the merge data.
13221
13222      The linker has traditionally not looked for the parterning high part
13223      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
13224      placed anywhere.  Rather than break backwards compatibility by changing
13225      this, it seems better not to force the issue, and instead keep the
13226      original symbol.  This will work with either linker behavior.  */
13227   if ((fixp->fx_r_type == BFD_RELOC_LO16
13228        || fixp->fx_r_type == BFD_RELOC_MIPS16_LO16
13229        || reloc_needs_lo_p (fixp->fx_r_type))
13230       && HAVE_IN_PLACE_ADDENDS
13231       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
13232     return 0;
13233
13234 #ifdef OBJ_ELF
13235   /* Don't adjust relocations against mips16 symbols, so that the linker
13236      can find them if it needs to set up a stub.  */
13237   if (OUTPUT_FLAVOR == bfd_target_elf_flavour
13238       && S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
13239       && fixp->fx_subsy == NULL)
13240     return 0;
13241 #endif
13242
13243   return 1;
13244 }
13245
13246 /* Translate internal representation of relocation info to BFD target
13247    format.  */
13248
13249 arelent **
13250 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
13251 {
13252   static arelent *retval[4];
13253   arelent *reloc;
13254   bfd_reloc_code_real_type code;
13255
13256   memset (retval, 0, sizeof(retval));
13257   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
13258   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
13259   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
13260   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
13261
13262   if (fixp->fx_pcrel)
13263     {
13264       assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
13265
13266       /* At this point, fx_addnumber is "symbol offset - pcrel address".
13267          Relocations want only the symbol offset.  */
13268       reloc->addend = fixp->fx_addnumber + reloc->address;
13269       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
13270         {
13271           /* A gruesome hack which is a result of the gruesome gas
13272              reloc handling.  What's worse, for COFF (as opposed to
13273              ECOFF), we might need yet another copy of reloc->address.
13274              See bfd_install_relocation.  */
13275           reloc->addend += reloc->address;
13276         }
13277     }
13278   else
13279     reloc->addend = fixp->fx_addnumber;
13280
13281   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
13282      entry to be used in the relocation's section offset.  */
13283   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13284     {
13285       reloc->address = reloc->addend;
13286       reloc->addend = 0;
13287     }
13288
13289   code = fixp->fx_r_type;
13290
13291   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
13292   if (reloc->howto == NULL)
13293     {
13294       as_bad_where (fixp->fx_file, fixp->fx_line,
13295                     _("Can not represent %s relocation in this object file format"),
13296                     bfd_get_reloc_code_name (code));
13297       retval[0] = NULL;
13298     }
13299
13300   return retval;
13301 }
13302
13303 /* Relax a machine dependent frag.  This returns the amount by which
13304    the current size of the frag should change.  */
13305
13306 int
13307 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
13308 {
13309   if (RELAX_BRANCH_P (fragp->fr_subtype))
13310     {
13311       offsetT old_var = fragp->fr_var;
13312
13313       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
13314
13315       return fragp->fr_var - old_var;
13316     }
13317
13318   if (! RELAX_MIPS16_P (fragp->fr_subtype))
13319     return 0;
13320
13321   if (mips16_extended_frag (fragp, NULL, stretch))
13322     {
13323       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13324         return 0;
13325       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
13326       return 2;
13327     }
13328   else
13329     {
13330       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13331         return 0;
13332       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
13333       return -2;
13334     }
13335
13336   return 0;
13337 }
13338
13339 /* Convert a machine dependent frag.  */
13340
13341 void
13342 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
13343 {
13344   if (RELAX_BRANCH_P (fragp->fr_subtype))
13345     {
13346       bfd_byte *buf;
13347       unsigned long insn;
13348       expressionS exp;
13349       fixS *fixp;
13350
13351       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
13352
13353       if (target_big_endian)
13354         insn = bfd_getb32 (buf);
13355       else
13356         insn = bfd_getl32 (buf);
13357
13358       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13359         {
13360           /* We generate a fixup instead of applying it right now
13361              because, if there are linker relaxations, we're going to
13362              need the relocations.  */
13363           exp.X_op = O_symbol;
13364           exp.X_add_symbol = fragp->fr_symbol;
13365           exp.X_add_number = fragp->fr_offset;
13366
13367           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13368                               4, &exp, 1, BFD_RELOC_16_PCREL_S2);
13369           fixp->fx_file = fragp->fr_file;
13370           fixp->fx_line = fragp->fr_line;
13371
13372           md_number_to_chars ((char *) buf, insn, 4);
13373           buf += 4;
13374         }
13375       else
13376         {
13377           int i;
13378
13379           as_warn_where (fragp->fr_file, fragp->fr_line,
13380                          _("relaxed out-of-range branch into a jump"));
13381
13382           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
13383             goto uncond;
13384
13385           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13386             {
13387               /* Reverse the branch.  */
13388               switch ((insn >> 28) & 0xf)
13389                 {
13390                 case 4:
13391                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
13392                      have the condition reversed by tweaking a single
13393                      bit, and their opcodes all have 0x4???????.  */
13394                   assert ((insn & 0xf1000000) == 0x41000000);
13395                   insn ^= 0x00010000;
13396                   break;
13397
13398                 case 0:
13399                   /* bltz       0x04000000      bgez    0x04010000
13400                      bltzal     0x04100000      bgezal  0x04110000 */
13401                   assert ((insn & 0xfc0e0000) == 0x04000000);
13402                   insn ^= 0x00010000;
13403                   break;
13404
13405                 case 1:
13406                   /* beq        0x10000000      bne     0x14000000
13407                      blez       0x18000000      bgtz    0x1c000000 */
13408                   insn ^= 0x04000000;
13409                   break;
13410
13411                 default:
13412                   abort ();
13413                 }
13414             }
13415
13416           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13417             {
13418               /* Clear the and-link bit.  */
13419               assert ((insn & 0xfc1c0000) == 0x04100000);
13420
13421               /* bltzal 0x04100000      bgezal  0x04110000
13422                 bltzall 0x04120000     bgezall  0x04130000 */
13423               insn &= ~0x00100000;
13424             }
13425
13426           /* Branch over the branch (if the branch was likely) or the
13427              full jump (not likely case).  Compute the offset from the
13428              current instruction to branch to.  */
13429           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13430             i = 16;
13431           else
13432             {
13433               /* How many bytes in instructions we've already emitted?  */
13434               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13435               /* How many bytes in instructions from here to the end?  */
13436               i = fragp->fr_var - i;
13437             }
13438           /* Convert to instruction count.  */
13439           i >>= 2;
13440           /* Branch counts from the next instruction.  */
13441           i--;
13442           insn |= i;
13443           /* Branch over the jump.  */
13444           md_number_to_chars ((char *) buf, insn, 4);
13445           buf += 4;
13446
13447           /* Nop */
13448           md_number_to_chars ((char *) buf, 0, 4);
13449           buf += 4;
13450
13451           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13452             {
13453               /* beql $0, $0, 2f */
13454               insn = 0x50000000;
13455               /* Compute the PC offset from the current instruction to
13456                  the end of the variable frag.  */
13457               /* How many bytes in instructions we've already emitted?  */
13458               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13459               /* How many bytes in instructions from here to the end?  */
13460               i = fragp->fr_var - i;
13461               /* Convert to instruction count.  */
13462               i >>= 2;
13463               /* Don't decrement i, because we want to branch over the
13464                  delay slot.  */
13465
13466               insn |= i;
13467               md_number_to_chars ((char *) buf, insn, 4);
13468               buf += 4;
13469
13470               md_number_to_chars ((char *) buf, 0, 4);
13471               buf += 4;
13472             }
13473
13474         uncond:
13475           if (mips_pic == NO_PIC)
13476             {
13477               /* j or jal.  */
13478               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
13479                       ? 0x0c000000 : 0x08000000);
13480               exp.X_op = O_symbol;
13481               exp.X_add_symbol = fragp->fr_symbol;
13482               exp.X_add_number = fragp->fr_offset;
13483
13484               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13485                                   4, &exp, 0, BFD_RELOC_MIPS_JMP);
13486               fixp->fx_file = fragp->fr_file;
13487               fixp->fx_line = fragp->fr_line;
13488
13489               md_number_to_chars ((char *) buf, insn, 4);
13490               buf += 4;
13491             }
13492           else
13493             {
13494               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
13495               insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
13496               exp.X_op = O_symbol;
13497               exp.X_add_symbol = fragp->fr_symbol;
13498               exp.X_add_number = fragp->fr_offset;
13499
13500               if (fragp->fr_offset)
13501                 {
13502                   exp.X_add_symbol = make_expr_symbol (&exp);
13503                   exp.X_add_number = 0;
13504                 }
13505
13506               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13507                                   4, &exp, 0, BFD_RELOC_MIPS_GOT16);
13508               fixp->fx_file = fragp->fr_file;
13509               fixp->fx_line = fragp->fr_line;
13510
13511               md_number_to_chars ((char *) buf, insn, 4);
13512               buf += 4;
13513
13514               if (mips_opts.isa == ISA_MIPS1)
13515                 {
13516                   /* nop */
13517                   md_number_to_chars ((char *) buf, 0, 4);
13518                   buf += 4;
13519                 }
13520
13521               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
13522               insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
13523
13524               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13525                                   4, &exp, 0, BFD_RELOC_LO16);
13526               fixp->fx_file = fragp->fr_file;
13527               fixp->fx_line = fragp->fr_line;
13528
13529               md_number_to_chars ((char *) buf, insn, 4);
13530               buf += 4;
13531
13532               /* j(al)r $at.  */
13533               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13534                 insn = 0x0020f809;
13535               else
13536                 insn = 0x00200008;
13537
13538               md_number_to_chars ((char *) buf, insn, 4);
13539               buf += 4;
13540             }
13541         }
13542
13543       assert (buf == (bfd_byte *)fragp->fr_literal
13544               + fragp->fr_fix + fragp->fr_var);
13545
13546       fragp->fr_fix += fragp->fr_var;
13547
13548       return;
13549     }
13550
13551   if (RELAX_MIPS16_P (fragp->fr_subtype))
13552     {
13553       int type;
13554       register const struct mips16_immed_operand *op;
13555       bfd_boolean small, ext;
13556       offsetT val;
13557       bfd_byte *buf;
13558       unsigned long insn;
13559       bfd_boolean use_extend;
13560       unsigned short extend;
13561
13562       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13563       op = mips16_immed_operands;
13564       while (op->type != type)
13565         ++op;
13566
13567       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13568         {
13569           small = FALSE;
13570           ext = TRUE;
13571         }
13572       else
13573         {
13574           small = TRUE;
13575           ext = FALSE;
13576         }
13577
13578       resolve_symbol_value (fragp->fr_symbol);
13579       val = S_GET_VALUE (fragp->fr_symbol);
13580       if (op->pcrel)
13581         {
13582           addressT addr;
13583
13584           addr = fragp->fr_address + fragp->fr_fix;
13585
13586           /* The rules for the base address of a PC relative reloc are
13587              complicated; see mips16_extended_frag.  */
13588           if (type == 'p' || type == 'q')
13589             {
13590               addr += 2;
13591               if (ext)
13592                 addr += 2;
13593               /* Ignore the low bit in the target, since it will be
13594                  set for a text label.  */
13595               if ((val & 1) != 0)
13596                 --val;
13597             }
13598           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13599             addr -= 4;
13600           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13601             addr -= 2;
13602
13603           addr &= ~ (addressT) ((1 << op->shift) - 1);
13604           val -= addr;
13605
13606           /* Make sure the section winds up with the alignment we have
13607              assumed.  */
13608           if (op->shift > 0)
13609             record_alignment (asec, op->shift);
13610         }
13611
13612       if (ext
13613           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
13614               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
13615         as_warn_where (fragp->fr_file, fragp->fr_line,
13616                        _("extended instruction in delay slot"));
13617
13618       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
13619
13620       if (target_big_endian)
13621         insn = bfd_getb16 (buf);
13622       else
13623         insn = bfd_getl16 (buf);
13624
13625       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
13626                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
13627                     small, ext, &insn, &use_extend, &extend);
13628
13629       if (use_extend)
13630         {
13631           md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
13632           fragp->fr_fix += 2;
13633           buf += 2;
13634         }
13635
13636       md_number_to_chars ((char *) buf, insn, 2);
13637       fragp->fr_fix += 2;
13638       buf += 2;
13639     }
13640   else
13641     {
13642       int first, second;
13643       fixS *fixp;
13644
13645       first = RELAX_FIRST (fragp->fr_subtype);
13646       second = RELAX_SECOND (fragp->fr_subtype);
13647       fixp = (fixS *) fragp->fr_opcode;
13648
13649       /* Possibly emit a warning if we've chosen the longer option.  */
13650       if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
13651           == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
13652         {
13653           const char *msg = macro_warning (fragp->fr_subtype);
13654           if (msg != 0)
13655             as_warn_where (fragp->fr_file, fragp->fr_line, msg);
13656         }
13657
13658       /* Go through all the fixups for the first sequence.  Disable them
13659          (by marking them as done) if we're going to use the second
13660          sequence instead.  */
13661       while (fixp
13662              && fixp->fx_frag == fragp
13663              && fixp->fx_where < fragp->fr_fix - second)
13664         {
13665           if (fragp->fr_subtype & RELAX_USE_SECOND)
13666             fixp->fx_done = 1;
13667           fixp = fixp->fx_next;
13668         }
13669
13670       /* Go through the fixups for the second sequence.  Disable them if
13671          we're going to use the first sequence, otherwise adjust their
13672          addresses to account for the relaxation.  */
13673       while (fixp && fixp->fx_frag == fragp)
13674         {
13675           if (fragp->fr_subtype & RELAX_USE_SECOND)
13676             fixp->fx_where -= first;
13677           else
13678             fixp->fx_done = 1;
13679           fixp = fixp->fx_next;
13680         }
13681
13682       /* Now modify the frag contents.  */
13683       if (fragp->fr_subtype & RELAX_USE_SECOND)
13684         {
13685           char *start;
13686
13687           start = fragp->fr_literal + fragp->fr_fix - first - second;
13688           memmove (start, start + first, second);
13689           fragp->fr_fix -= first;
13690         }
13691       else
13692         fragp->fr_fix -= second;
13693     }
13694 }
13695
13696 #ifdef OBJ_ELF
13697
13698 /* This function is called after the relocs have been generated.
13699    We've been storing mips16 text labels as odd.  Here we convert them
13700    back to even for the convenience of the debugger.  */
13701
13702 void
13703 mips_frob_file_after_relocs (void)
13704 {
13705   asymbol **syms;
13706   unsigned int count, i;
13707
13708   if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
13709     return;
13710
13711   syms = bfd_get_outsymbols (stdoutput);
13712   count = bfd_get_symcount (stdoutput);
13713   for (i = 0; i < count; i++, syms++)
13714     {
13715       if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
13716           && ((*syms)->value & 1) != 0)
13717         {
13718           (*syms)->value &= ~1;
13719           /* If the symbol has an odd size, it was probably computed
13720              incorrectly, so adjust that as well.  */
13721           if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
13722             ++elf_symbol (*syms)->internal_elf_sym.st_size;
13723         }
13724     }
13725 }
13726
13727 #endif
13728
13729 /* This function is called whenever a label is defined.  It is used
13730    when handling branch delays; if a branch has a label, we assume we
13731    can not move it.  */
13732
13733 void
13734 mips_define_label (symbolS *sym)
13735 {
13736   struct insn_label_list *l;
13737
13738   if (free_insn_labels == NULL)
13739     l = (struct insn_label_list *) xmalloc (sizeof *l);
13740   else
13741     {
13742       l = free_insn_labels;
13743       free_insn_labels = l->next;
13744     }
13745
13746   l->label = sym;
13747   l->next = insn_labels;
13748   insn_labels = l;
13749
13750 #ifdef OBJ_ELF
13751   dwarf2_emit_label (sym);
13752 #endif
13753 }
13754 \f
13755 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13756
13757 /* Some special processing for a MIPS ELF file.  */
13758
13759 void
13760 mips_elf_final_processing (void)
13761 {
13762   /* Write out the register information.  */
13763   if (mips_abi != N64_ABI)
13764     {
13765       Elf32_RegInfo s;
13766
13767       s.ri_gprmask = mips_gprmask;
13768       s.ri_cprmask[0] = mips_cprmask[0];
13769       s.ri_cprmask[1] = mips_cprmask[1];
13770       s.ri_cprmask[2] = mips_cprmask[2];
13771       s.ri_cprmask[3] = mips_cprmask[3];
13772       /* The gp_value field is set by the MIPS ELF backend.  */
13773
13774       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
13775                                        ((Elf32_External_RegInfo *)
13776                                         mips_regmask_frag));
13777     }
13778   else
13779     {
13780       Elf64_Internal_RegInfo s;
13781
13782       s.ri_gprmask = mips_gprmask;
13783       s.ri_pad = 0;
13784       s.ri_cprmask[0] = mips_cprmask[0];
13785       s.ri_cprmask[1] = mips_cprmask[1];
13786       s.ri_cprmask[2] = mips_cprmask[2];
13787       s.ri_cprmask[3] = mips_cprmask[3];
13788       /* The gp_value field is set by the MIPS ELF backend.  */
13789
13790       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
13791                                        ((Elf64_External_RegInfo *)
13792                                         mips_regmask_frag));
13793     }
13794
13795   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
13796      sort of BFD interface for this.  */
13797   if (mips_any_noreorder)
13798     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
13799   if (mips_pic != NO_PIC)
13800     {
13801     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
13802       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
13803     }
13804   if (mips_abicalls)
13805     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
13806
13807   /* Set MIPS ELF flags for ASEs.  */
13808   /* We may need to define a new flag for DSP ASE, and set this flag when
13809      file_ase_dsp is true.  */
13810   /* We may need to define a new flag for MT ASE, and set this flag when
13811      file_ase_mt is true.  */
13812   if (file_ase_mips16)
13813     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
13814 #if 0 /* XXX FIXME */
13815   if (file_ase_mips3d)
13816     elf_elfheader (stdoutput)->e_flags |= ???;
13817 #endif
13818   if (file_ase_mdmx)
13819     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
13820
13821   /* Set the MIPS ELF ABI flags.  */
13822   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
13823     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
13824   else if (mips_abi == O64_ABI)
13825     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
13826   else if (mips_abi == EABI_ABI)
13827     {
13828       if (!file_mips_gp32)
13829         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
13830       else
13831         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
13832     }
13833   else if (mips_abi == N32_ABI)
13834     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
13835
13836   /* Nothing to do for N64_ABI.  */
13837
13838   if (mips_32bitmode)
13839     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
13840 }
13841
13842 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
13843 \f
13844 typedef struct proc {
13845   symbolS *func_sym;
13846   symbolS *func_end_sym;
13847   unsigned long reg_mask;
13848   unsigned long reg_offset;
13849   unsigned long fpreg_mask;
13850   unsigned long fpreg_offset;
13851   unsigned long frame_offset;
13852   unsigned long frame_reg;
13853   unsigned long pc_reg;
13854 } procS;
13855
13856 static procS cur_proc;
13857 static procS *cur_proc_ptr;
13858 static int numprocs;
13859
13860 /* Fill in an rs_align_code fragment.  */
13861
13862 void
13863 mips_handle_align (fragS *fragp)
13864 {
13865   if (fragp->fr_type != rs_align_code)
13866     return;
13867
13868   if (mips_opts.mips16)
13869     {
13870       static const unsigned char be_nop[] = { 0x65, 0x00 };
13871       static const unsigned char le_nop[] = { 0x00, 0x65 };
13872
13873       int bytes;
13874       char *p;
13875
13876       bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
13877       p = fragp->fr_literal + fragp->fr_fix;
13878
13879       if (bytes & 1)
13880         {
13881           *p++ = 0;
13882           fragp->fr_fix++;
13883         }
13884
13885       memcpy (p, (target_big_endian ? be_nop : le_nop), 2);
13886       fragp->fr_var = 2;
13887     }
13888
13889   /* For mips32, a nop is a zero, which we trivially get by doing nothing.  */
13890 }
13891
13892 static void
13893 md_obj_begin (void)
13894 {
13895 }
13896
13897 static void
13898 md_obj_end (void)
13899 {
13900   /* check for premature end, nesting errors, etc */
13901   if (cur_proc_ptr)
13902     as_warn (_("missing .end at end of assembly"));
13903 }
13904
13905 static long
13906 get_number (void)
13907 {
13908   int negative = 0;
13909   long val = 0;
13910
13911   if (*input_line_pointer == '-')
13912     {
13913       ++input_line_pointer;
13914       negative = 1;
13915     }
13916   if (!ISDIGIT (*input_line_pointer))
13917     as_bad (_("expected simple number"));
13918   if (input_line_pointer[0] == '0')
13919     {
13920       if (input_line_pointer[1] == 'x')
13921         {
13922           input_line_pointer += 2;
13923           while (ISXDIGIT (*input_line_pointer))
13924             {
13925               val <<= 4;
13926               val |= hex_value (*input_line_pointer++);
13927             }
13928           return negative ? -val : val;
13929         }
13930       else
13931         {
13932           ++input_line_pointer;
13933           while (ISDIGIT (*input_line_pointer))
13934             {
13935               val <<= 3;
13936               val |= *input_line_pointer++ - '0';
13937             }
13938           return negative ? -val : val;
13939         }
13940     }
13941   if (!ISDIGIT (*input_line_pointer))
13942     {
13943       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
13944               *input_line_pointer, *input_line_pointer);
13945       as_warn (_("invalid number"));
13946       return -1;
13947     }
13948   while (ISDIGIT (*input_line_pointer))
13949     {
13950       val *= 10;
13951       val += *input_line_pointer++ - '0';
13952     }
13953   return negative ? -val : val;
13954 }
13955
13956 /* The .file directive; just like the usual .file directive, but there
13957    is an initial number which is the ECOFF file index.  In the non-ECOFF
13958    case .file implies DWARF-2.  */
13959
13960 static void
13961 s_mips_file (int x ATTRIBUTE_UNUSED)
13962 {
13963   static int first_file_directive = 0;
13964
13965   if (ECOFF_DEBUGGING)
13966     {
13967       get_number ();
13968       s_app_file (0);
13969     }
13970   else
13971     {
13972       char *filename;
13973
13974       filename = dwarf2_directive_file (0);
13975
13976       /* Versions of GCC up to 3.1 start files with a ".file"
13977          directive even for stabs output.  Make sure that this
13978          ".file" is handled.  Note that you need a version of GCC
13979          after 3.1 in order to support DWARF-2 on MIPS.  */
13980       if (filename != NULL && ! first_file_directive)
13981         {
13982           (void) new_logical_line (filename, -1);
13983           s_app_file_string (filename, 0);
13984         }
13985       first_file_directive = 1;
13986     }
13987 }
13988
13989 /* The .loc directive, implying DWARF-2.  */
13990
13991 static void
13992 s_mips_loc (int x ATTRIBUTE_UNUSED)
13993 {
13994   if (!ECOFF_DEBUGGING)
13995     dwarf2_directive_loc (0);
13996 }
13997
13998 /* The .end directive.  */
13999
14000 static void
14001 s_mips_end (int x ATTRIBUTE_UNUSED)
14002 {
14003   symbolS *p;
14004
14005   /* Following functions need their own .frame and .cprestore directives.  */
14006   mips_frame_reg_valid = 0;
14007   mips_cprestore_valid = 0;
14008
14009   if (!is_end_of_line[(unsigned char) *input_line_pointer])
14010     {
14011       p = get_symbol ();
14012       demand_empty_rest_of_line ();
14013     }
14014   else
14015     p = NULL;
14016
14017   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14018     as_warn (_(".end not in text section"));
14019
14020   if (!cur_proc_ptr)
14021     {
14022       as_warn (_(".end directive without a preceding .ent directive."));
14023       demand_empty_rest_of_line ();
14024       return;
14025     }
14026
14027   if (p != NULL)
14028     {
14029       assert (S_GET_NAME (p));
14030       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
14031         as_warn (_(".end symbol does not match .ent symbol."));
14032
14033       if (debug_type == DEBUG_STABS)
14034         stabs_generate_asm_endfunc (S_GET_NAME (p),
14035                                     S_GET_NAME (p));
14036     }
14037   else
14038     as_warn (_(".end directive missing or unknown symbol"));
14039
14040 #ifdef OBJ_ELF
14041   /* Create an expression to calculate the size of the function.  */
14042   if (p && cur_proc_ptr)
14043     {
14044       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
14045       expressionS *exp = xmalloc (sizeof (expressionS));
14046
14047       obj->size = exp;
14048       exp->X_op = O_subtract;
14049       exp->X_add_symbol = symbol_temp_new_now ();
14050       exp->X_op_symbol = p;
14051       exp->X_add_number = 0;
14052
14053       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
14054     }
14055
14056   /* Generate a .pdr section.  */
14057   if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING
14058       && mips_flag_pdr)
14059     {
14060       segT saved_seg = now_seg;
14061       subsegT saved_subseg = now_subseg;
14062       valueT dot;
14063       expressionS exp;
14064       char *fragp;
14065
14066       dot = frag_now_fix ();
14067
14068 #ifdef md_flush_pending_output
14069       md_flush_pending_output ();
14070 #endif
14071
14072       assert (pdr_seg);
14073       subseg_set (pdr_seg, 0);
14074
14075       /* Write the symbol.  */
14076       exp.X_op = O_symbol;
14077       exp.X_add_symbol = p;
14078       exp.X_add_number = 0;
14079       emit_expr (&exp, 4);
14080
14081       fragp = frag_more (7 * 4);
14082
14083       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
14084       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
14085       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
14086       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
14087       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
14088       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
14089       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
14090
14091       subseg_set (saved_seg, saved_subseg);
14092     }
14093 #endif /* OBJ_ELF */
14094
14095   cur_proc_ptr = NULL;
14096 }
14097
14098 /* The .aent and .ent directives.  */
14099
14100 static void
14101 s_mips_ent (int aent)
14102 {
14103   symbolS *symbolP;
14104
14105   symbolP = get_symbol ();
14106   if (*input_line_pointer == ',')
14107     ++input_line_pointer;
14108   SKIP_WHITESPACE ();
14109   if (ISDIGIT (*input_line_pointer)
14110       || *input_line_pointer == '-')
14111     get_number ();
14112
14113   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14114     as_warn (_(".ent or .aent not in text section."));
14115
14116   if (!aent && cur_proc_ptr)
14117     as_warn (_("missing .end"));
14118
14119   if (!aent)
14120     {
14121       /* This function needs its own .frame and .cprestore directives.  */
14122       mips_frame_reg_valid = 0;
14123       mips_cprestore_valid = 0;
14124
14125       cur_proc_ptr = &cur_proc;
14126       memset (cur_proc_ptr, '\0', sizeof (procS));
14127
14128       cur_proc_ptr->func_sym = symbolP;
14129
14130       symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
14131
14132       ++numprocs;
14133
14134       if (debug_type == DEBUG_STABS)
14135         stabs_generate_asm_func (S_GET_NAME (symbolP),
14136                                  S_GET_NAME (symbolP));
14137     }
14138
14139   demand_empty_rest_of_line ();
14140 }
14141
14142 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
14143    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
14144    s_mips_frame is used so that we can set the PDR information correctly.
14145    We can't use the ecoff routines because they make reference to the ecoff
14146    symbol table (in the mdebug section).  */
14147
14148 static void
14149 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
14150 {
14151 #ifdef OBJ_ELF
14152   if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14153     {
14154       long val;
14155
14156       if (cur_proc_ptr == (procS *) NULL)
14157         {
14158           as_warn (_(".frame outside of .ent"));
14159           demand_empty_rest_of_line ();
14160           return;
14161         }
14162
14163       cur_proc_ptr->frame_reg = tc_get_register (1);
14164
14165       SKIP_WHITESPACE ();
14166       if (*input_line_pointer++ != ','
14167           || get_absolute_expression_and_terminator (&val) != ',')
14168         {
14169           as_warn (_("Bad .frame directive"));
14170           --input_line_pointer;
14171           demand_empty_rest_of_line ();
14172           return;
14173         }
14174
14175       cur_proc_ptr->frame_offset = val;
14176       cur_proc_ptr->pc_reg = tc_get_register (0);
14177
14178       demand_empty_rest_of_line ();
14179     }
14180   else
14181 #endif /* OBJ_ELF */
14182     s_ignore (ignore);
14183 }
14184
14185 /* The .fmask and .mask directives. If the mdebug section is present
14186    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
14187    embedded targets, s_mips_mask is used so that we can set the PDR
14188    information correctly. We can't use the ecoff routines because they
14189    make reference to the ecoff symbol table (in the mdebug section).  */
14190
14191 static void
14192 s_mips_mask (int reg_type)
14193 {
14194 #ifdef OBJ_ELF
14195   if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14196     {
14197       long mask, off;
14198
14199       if (cur_proc_ptr == (procS *) NULL)
14200         {
14201           as_warn (_(".mask/.fmask outside of .ent"));
14202           demand_empty_rest_of_line ();
14203           return;
14204         }
14205
14206       if (get_absolute_expression_and_terminator (&mask) != ',')
14207         {
14208           as_warn (_("Bad .mask/.fmask directive"));
14209           --input_line_pointer;
14210           demand_empty_rest_of_line ();
14211           return;
14212         }
14213
14214       off = get_absolute_expression ();
14215
14216       if (reg_type == 'F')
14217         {
14218           cur_proc_ptr->fpreg_mask = mask;
14219           cur_proc_ptr->fpreg_offset = off;
14220         }
14221       else
14222         {
14223           cur_proc_ptr->reg_mask = mask;
14224           cur_proc_ptr->reg_offset = off;
14225         }
14226
14227       demand_empty_rest_of_line ();
14228     }
14229   else
14230 #endif /* OBJ_ELF */
14231     s_ignore (reg_type);
14232 }
14233
14234 /* A table describing all the processors gas knows about.  Names are
14235    matched in the order listed.
14236
14237    To ease comparison, please keep this table in the same order as
14238    gcc's mips_cpu_info_table[].  */
14239 static const struct mips_cpu_info mips_cpu_info_table[] =
14240 {
14241   /* Entries for generic ISAs */
14242   { "mips1",          1,      ISA_MIPS1,      CPU_R3000 },
14243   { "mips2",          1,      ISA_MIPS2,      CPU_R6000 },
14244   { "mips3",          1,      ISA_MIPS3,      CPU_R4000 },
14245   { "mips4",          1,      ISA_MIPS4,      CPU_R8000 },
14246   { "mips5",          1,      ISA_MIPS5,      CPU_MIPS5 },
14247   { "mips32",         1,      ISA_MIPS32,     CPU_MIPS32 },
14248   { "mips32r2",       1,      ISA_MIPS32R2,   CPU_MIPS32R2 },
14249   { "mips64",         1,      ISA_MIPS64,     CPU_MIPS64 },
14250   { "mips64r2",       1,      ISA_MIPS64R2,   CPU_MIPS64R2 },
14251
14252   /* MIPS I */
14253   { "r3000",          0,      ISA_MIPS1,      CPU_R3000 },
14254   { "r2000",          0,      ISA_MIPS1,      CPU_R3000 },
14255   { "r3900",          0,      ISA_MIPS1,      CPU_R3900 },
14256
14257   /* MIPS II */
14258   { "r6000",          0,      ISA_MIPS2,      CPU_R6000 },
14259
14260   /* MIPS III */
14261   { "r4000",          0,      ISA_MIPS3,      CPU_R4000 },
14262   { "r4010",          0,      ISA_MIPS2,      CPU_R4010 },
14263   { "vr4100",         0,      ISA_MIPS3,      CPU_VR4100 },
14264   { "vr4111",         0,      ISA_MIPS3,      CPU_R4111 },
14265   { "vr4120",         0,      ISA_MIPS3,      CPU_VR4120 },
14266   { "vr4130",         0,      ISA_MIPS3,      CPU_VR4120 },
14267   { "vr4181",         0,      ISA_MIPS3,      CPU_R4111 },
14268   { "vr4300",         0,      ISA_MIPS3,      CPU_R4300 },
14269   { "r4400",          0,      ISA_MIPS3,      CPU_R4400 },
14270   { "r4600",          0,      ISA_MIPS3,      CPU_R4600 },
14271   { "orion",          0,      ISA_MIPS3,      CPU_R4600 },
14272   { "r4650",          0,      ISA_MIPS3,      CPU_R4650 },
14273
14274   /* MIPS IV */
14275   { "r8000",          0,      ISA_MIPS4,      CPU_R8000 },
14276   { "r10000",         0,      ISA_MIPS4,      CPU_R10000 },
14277   { "r12000",         0,      ISA_MIPS4,      CPU_R12000 },
14278   { "vr5000",         0,      ISA_MIPS4,      CPU_R5000 },
14279   { "vr5400",         0,      ISA_MIPS4,      CPU_VR5400 },
14280   { "vr5500",         0,      ISA_MIPS4,      CPU_VR5500 },
14281   { "rm5200",         0,      ISA_MIPS4,      CPU_R5000 },
14282   { "rm5230",         0,      ISA_MIPS4,      CPU_R5000 },
14283   { "rm5231",         0,      ISA_MIPS4,      CPU_R5000 },
14284   { "rm5261",         0,      ISA_MIPS4,      CPU_R5000 },
14285   { "rm5721",         0,      ISA_MIPS4,      CPU_R5000 },
14286   { "rm7000",         0,      ISA_MIPS4,      CPU_RM7000 },
14287   { "rm9000",         0,      ISA_MIPS4,      CPU_RM9000 },
14288
14289   /* MIPS 32 */
14290   { "4kc",            0,      ISA_MIPS32,     CPU_MIPS32 },
14291   { "4km",            0,      ISA_MIPS32,     CPU_MIPS32 },
14292   { "4kp",            0,      ISA_MIPS32,     CPU_MIPS32 },
14293
14294   /* MIPS32 Release 2 */
14295   { "m4k",            0,      ISA_MIPS32R2,   CPU_MIPS32R2 },
14296   { "24k",            0,      ISA_MIPS32R2,   CPU_MIPS32R2 },
14297   { "24kc",           0,      ISA_MIPS32R2,   CPU_MIPS32R2 },
14298   { "24kf",           0,      ISA_MIPS32R2,   CPU_MIPS32R2 },
14299   { "24kx",           0,      ISA_MIPS32R2,   CPU_MIPS32R2 },
14300
14301   /* MIPS 64 */
14302   { "5kc",            0,      ISA_MIPS64,     CPU_MIPS64 },
14303   { "5kf",            0,      ISA_MIPS64,     CPU_MIPS64 },
14304   { "20kc",           0,      ISA_MIPS64,     CPU_MIPS64 },
14305
14306   /* Broadcom SB-1 CPU core */
14307   { "sb1",            0,      ISA_MIPS64,     CPU_SB1 },
14308
14309   /* End marker */
14310   { NULL, 0, 0, 0 }
14311 };
14312
14313
14314 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
14315    with a final "000" replaced by "k".  Ignore case.
14316
14317    Note: this function is shared between GCC and GAS.  */
14318
14319 static bfd_boolean
14320 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
14321 {
14322   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
14323     given++, canonical++;
14324
14325   return ((*given == 0 && *canonical == 0)
14326           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
14327 }
14328
14329
14330 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
14331    CPU name.  We've traditionally allowed a lot of variation here.
14332
14333    Note: this function is shared between GCC and GAS.  */
14334
14335 static bfd_boolean
14336 mips_matching_cpu_name_p (const char *canonical, const char *given)
14337 {
14338   /* First see if the name matches exactly, or with a final "000"
14339      turned into "k".  */
14340   if (mips_strict_matching_cpu_name_p (canonical, given))
14341     return TRUE;
14342
14343   /* If not, try comparing based on numerical designation alone.
14344      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
14345   if (TOLOWER (*given) == 'r')
14346     given++;
14347   if (!ISDIGIT (*given))
14348     return FALSE;
14349
14350   /* Skip over some well-known prefixes in the canonical name,
14351      hoping to find a number there too.  */
14352   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
14353     canonical += 2;
14354   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
14355     canonical += 2;
14356   else if (TOLOWER (canonical[0]) == 'r')
14357     canonical += 1;
14358
14359   return mips_strict_matching_cpu_name_p (canonical, given);
14360 }
14361
14362
14363 /* Parse an option that takes the name of a processor as its argument.
14364    OPTION is the name of the option and CPU_STRING is the argument.
14365    Return the corresponding processor enumeration if the CPU_STRING is
14366    recognized, otherwise report an error and return null.
14367
14368    A similar function exists in GCC.  */
14369
14370 static const struct mips_cpu_info *
14371 mips_parse_cpu (const char *option, const char *cpu_string)
14372 {
14373   const struct mips_cpu_info *p;
14374
14375   /* 'from-abi' selects the most compatible architecture for the given
14376      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
14377      EABIs, we have to decide whether we're using the 32-bit or 64-bit
14378      version.  Look first at the -mgp options, if given, otherwise base
14379      the choice on MIPS_DEFAULT_64BIT.
14380
14381      Treat NO_ABI like the EABIs.  One reason to do this is that the
14382      plain 'mips' and 'mips64' configs have 'from-abi' as their default
14383      architecture.  This code picks MIPS I for 'mips' and MIPS III for
14384      'mips64', just as we did in the days before 'from-abi'.  */
14385   if (strcasecmp (cpu_string, "from-abi") == 0)
14386     {
14387       if (ABI_NEEDS_32BIT_REGS (mips_abi))
14388         return mips_cpu_info_from_isa (ISA_MIPS1);
14389
14390       if (ABI_NEEDS_64BIT_REGS (mips_abi))
14391         return mips_cpu_info_from_isa (ISA_MIPS3);
14392
14393       if (file_mips_gp32 >= 0)
14394         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
14395
14396       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
14397                                      ? ISA_MIPS3
14398                                      : ISA_MIPS1);
14399     }
14400
14401   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
14402   if (strcasecmp (cpu_string, "default") == 0)
14403     return 0;
14404
14405   for (p = mips_cpu_info_table; p->name != 0; p++)
14406     if (mips_matching_cpu_name_p (p->name, cpu_string))
14407       return p;
14408
14409   as_bad ("Bad value (%s) for %s", cpu_string, option);
14410   return 0;
14411 }
14412
14413 /* Return the canonical processor information for ISA (a member of the
14414    ISA_MIPS* enumeration).  */
14415
14416 static const struct mips_cpu_info *
14417 mips_cpu_info_from_isa (int isa)
14418 {
14419   int i;
14420
14421   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14422     if (mips_cpu_info_table[i].is_isa
14423         && isa == mips_cpu_info_table[i].isa)
14424       return (&mips_cpu_info_table[i]);
14425
14426   return NULL;
14427 }
14428
14429 static const struct mips_cpu_info *
14430 mips_cpu_info_from_arch (int arch)
14431 {
14432   int i;
14433
14434   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14435     if (arch == mips_cpu_info_table[i].cpu)
14436       return (&mips_cpu_info_table[i]);
14437
14438   return NULL;
14439 }
14440 \f
14441 static void
14442 show (FILE *stream, const char *string, int *col_p, int *first_p)
14443 {
14444   if (*first_p)
14445     {
14446       fprintf (stream, "%24s", "");
14447       *col_p = 24;
14448     }
14449   else
14450     {
14451       fprintf (stream, ", ");
14452       *col_p += 2;
14453     }
14454
14455   if (*col_p + strlen (string) > 72)
14456     {
14457       fprintf (stream, "\n%24s", "");
14458       *col_p = 24;
14459     }
14460
14461   fprintf (stream, "%s", string);
14462   *col_p += strlen (string);
14463
14464   *first_p = 0;
14465 }
14466
14467 void
14468 md_show_usage (FILE *stream)
14469 {
14470   int column, first;
14471   size_t i;
14472
14473   fprintf (stream, _("\
14474 MIPS options:\n\
14475 -EB                     generate big endian output\n\
14476 -EL                     generate little endian output\n\
14477 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
14478 -G NUM                  allow referencing objects up to NUM bytes\n\
14479                         implicitly with the gp register [default 8]\n"));
14480   fprintf (stream, _("\
14481 -mips1                  generate MIPS ISA I instructions\n\
14482 -mips2                  generate MIPS ISA II instructions\n\
14483 -mips3                  generate MIPS ISA III instructions\n\
14484 -mips4                  generate MIPS ISA IV instructions\n\
14485 -mips5                  generate MIPS ISA V instructions\n\
14486 -mips32                 generate MIPS32 ISA instructions\n\
14487 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
14488 -mips64                 generate MIPS64 ISA instructions\n\
14489 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
14490 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
14491
14492   first = 1;
14493
14494   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14495     show (stream, mips_cpu_info_table[i].name, &column, &first);
14496   show (stream, "from-abi", &column, &first);
14497   fputc ('\n', stream);
14498
14499   fprintf (stream, _("\
14500 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
14501 -no-mCPU                don't generate code specific to CPU.\n\
14502                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
14503
14504   first = 1;
14505
14506   show (stream, "3900", &column, &first);
14507   show (stream, "4010", &column, &first);
14508   show (stream, "4100", &column, &first);
14509   show (stream, "4650", &column, &first);
14510   fputc ('\n', stream);
14511
14512   fprintf (stream, _("\
14513 -mips16                 generate mips16 instructions\n\
14514 -no-mips16              do not generate mips16 instructions\n"));
14515   fprintf (stream, _("\
14516 -mdsp                   generate DSP instructions\n\
14517 -mno-dsp                do not generate DSP instructions\n"));
14518   fprintf (stream, _("\
14519 -mmt                    generate MT instructions\n\
14520 -mno-mt                 do not generate MT instructions\n"));
14521   fprintf (stream, _("\
14522 -mfix-vr4120            work around certain VR4120 errata\n\
14523 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
14524 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
14525 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
14526 -mno-shared             optimize output for executables\n\
14527 -msym32                 assume all symbols have 32-bit values\n\
14528 -O0                     remove unneeded NOPs, do not swap branches\n\
14529 -O                      remove unneeded NOPs and swap branches\n\
14530 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
14531 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
14532 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
14533 #ifdef OBJ_ELF
14534   fprintf (stream, _("\
14535 -KPIC, -call_shared     generate SVR4 position independent code\n\
14536 -non_shared             do not generate position independent code\n\
14537 -xgot                   assume a 32 bit GOT\n\
14538 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
14539 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
14540                         non-shared code\n\
14541 -mabi=ABI               create ABI conformant object file for:\n"));
14542
14543   first = 1;
14544
14545   show (stream, "32", &column, &first);
14546   show (stream, "o64", &column, &first);
14547   show (stream, "n32", &column, &first);
14548   show (stream, "64", &column, &first);
14549   show (stream, "eabi", &column, &first);
14550
14551   fputc ('\n', stream);
14552
14553   fprintf (stream, _("\
14554 -32                     create o32 ABI object file (default)\n\
14555 -n32                    create n32 ABI object file\n\
14556 -64                     create 64 ABI object file\n"));
14557 #endif
14558 }
14559
14560 enum dwarf2_format
14561 mips_dwarf2_format (void)
14562 {
14563   if (mips_abi == N64_ABI)
14564     {
14565 #ifdef TE_IRIX
14566       return dwarf2_format_64bit_irix;
14567 #else
14568       return dwarf2_format_64bit;
14569 #endif
14570     }
14571   else
14572     return dwarf2_format_32bit;
14573 }
14574
14575 int
14576 mips_dwarf2_addr_size (void)
14577 {
14578   if (mips_abi == N64_ABI)
14579     return 8;
14580   else
14581     return 4;
14582 }
14583
14584 /* Standard calling conventions leave the CFA at SP on entry.  */
14585 void
14586 mips_cfi_frame_initial_instructions (void)
14587 {
14588   cfi_add_CFA_def_cfa_register (SP);
14589 }
14590